mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Chih Kai Hsu <hsu.chih.kai@realtek.com>
To: "netdev-bot+sashiko@kernel.org" <netdev-bot+sashiko@kernel.org>
Cc: "davem@davemloft.net" <davem@davemloft.net>,
	"kuba@kernel.org" <kuba@kernel.org>,
	"netdev@vger.kernel.org" <netdev@vger.kernel.org>,
	nic_swsd <nic_swsd@realtek.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"linux-usb@vger.kernel.org" <linux-usb@vger.kernel.org>,
	"edumazet@google.com" <edumazet@google.com>,
	"bjorn@mork.no" <bjorn@mork.no>,
	"pabeni@redhat.com" <pabeni@redhat.com>,
	"andrew+netdev@lunn.ch" <andrew+netdev@lunn.ch>
Subject: RE: [PATCH net-next v4 1/8] r8152: split r8156_init per chip and add missing init writes
Date: Wed, 23 Sep 2026 07:48:05 +0000	[thread overview]
Message-ID: <e1646fd5f42c4404bff2436613745e3e@realtek.com> (raw)
In-Reply-To: <178997943124.2160803.765103077515705742@kernel.org>

> Thank you for your contribution! Sashiko AI review found 3 potential
> issue(s) to consider.
> 
> Critical: 0 · High: 0 · Medium: 2 (1) · Low: 1
> 
> If you believe none of the issues are legitimate, please reply to each issue of
> Medium severity or higher and explain why the AI is wrong.
> If any of them are legitimate and you plan to respin, please let patchwork
> know by including "pw-bot: cr" as a separate line at the end of your reply
> (one such reply per series is enough).
> 
> - [Medium] Undocumented hardware behaviour change during the split:
>   r8157_init() (installed as ops->init for RTL_VER_16 in rtl_ops_init())…
> - [Medium] Silent reordering of hardware handshakes for RTL8157/RTL8159.
> - [Low] Commit message vs. code: the message names the FC-timer block
>   ("fenced to RTL_VER_12 <= version <= RTL_VER_15") as the example of a…
> 
> Pre-existing issues:
> - [Medium] An RTL8159 backup-restore timeout marks the device
>   inaccessible but cannot report the failure to its caller: r8159_init()…
> 
> --
> 
> r8152: split r8156_init per chip and add missing init writes
> 
> This splits the shared r8156_init() into r8156_init(), r8156b_init(),
> r8157_init() and r8159_init(), factors the AUTOLOAD_DONE polling loops into
> wait_autoload_done(), and adds a number of new OCP writes to the per-chip
> init sequences.  A few observations below.
> 
> First, about the motivation in the changelog:
> 
> > RTL8156, RTL8156B, RTL8157 and RTL8159 shared a single r8156_init(),
> > gated by a dense set of tp->version range checks. That made the init
> > sequence hard to follow, and some checks (e.g. the FC-timer block,
> > which was fenced to "RTL_VER_12 <= version <= RTL_VER_15") silently
> > skipped RTL8156 (VER_10/11) and RTL8157/RTL8159 (VER_16/17)
> altogether
> > even though nothing chip-specific justified the gap.
> 
> [Severity: Low]
> 
> This isn't a bug, but after the split the FC-timer block named here still exists
> only in r8156b_init().  The PLA_RCR SLOT_EN clear, PLA_CPCR
> FLOW_CTRL_EN, USB_FC_TIMER, FLOW_CTRL_PATCH_2 and USB_FW_TASK
> FC_PATCH_TASK writes are absent from r8156_init() (VER_10/11), r8157_init()
> (VER_16) and
> r8159_init() (VER_17), i.e. the exact gap the paragraph complains about is
> unchanged by this patch, and the "While splitting:" list does not claim to close
> it.
> 
> The gap is closed later in the series by "r8152: extract
> rtl_fc_pause_pkt_en() and apply it to RTL8156/8157/8159", which factors the
> block into rtl_fc_pause_pkt_en() with cases for RTL_VER_10/11,
> RTL_VER_12/13/15 and RTL_VER_16/17 and calls it from r8156_init(),
> r8156b_init() and rtl8157_enable().
> 
> Could this paragraph say that the FC-timer gap is addressed by a later patch in
> the series rather than by this one?

Sure. Will do.

> 
> > diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c index
> > af3d7dcb2f141..00b0fda306c30 100644
> > --- a/drivers/net/usb/r8152.c
> > +++ b/drivers/net/usb/r8152.c
> 
> [ ... ]
> 
> > @@ -542,6 +547,7 @@
> >  #define RX_AGG_DISABLE               0x0010
> >  #define RX_ZERO_EN           0x0080
> >  #define RX_DESC_16B          0x0400
> > +#define RX_END_TRANSFER_EN   BIT(11)
> >
> >  /* USB_U2P3_CTRL */
> >  #define U2P3_ENABLE          0x0001
> 
> [ ... ]
> 
> > @@ -8330,90 +8311,132 @@ static void r8157_hw_phy_cfg(struct r8152
> > *tp)
> 
> [ ... ]
> 
> >       switch (tp->version) {
> >       case RTL_VER_13:
> >       case RTL_VER_15:
> > -     case RTL_VER_16:
> > -     case RTL_VER_17:
> >               r8156b_wait_loading_flash(tp);
> >               break;
> >       default:
> >               break;
> >       }
> >
> > -     for (i = 0; i < 500; i++) {
> > -             if (ocp_read_word(tp, MCU_TYPE_PLA, PLA_BOOT_CTRL) &
> > -                 AUTOLOAD_DONE)
> > -                     break;
> > -
> > -             msleep(20);
> > -             if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
> > -                     return;
> > -     }
> > -
> > -     if (tp->version == RTL_VER_17 && r8159_wait_backup_restore(tp)) {
> > -             rtl_set_inaccessible(tp);
> > -             dev_err(&tp->intf->dev, "init failed, backup-restore timed
> out\n");
> > +     if (wait_autoload_done(tp))
> >               return;
> > -     }
> 
> [ ... ]
> 
> > @@ -8421,73 +8444,261 @@ static void r8156_init(struct r8152 *tp)
> 
> [ ... ]
> 
> >       set_bit(GREEN_ETHERNET, &tp->flags);
> >
> > -     /* RX aggregation / 16 bytes RX descriptor
> > -      * BIT(11) is specific to RTL8159, with unknown meaning
> > -      */
> > -     if (tp->version == RTL_VER_17)
> > -             ocp_word_clr_bits(tp, MCU_TYPE_USB, USB_USB_CTRL,
> > -                               RX_AGG_DISABLE | RX_DESC_16B |
> BIT(11));
> > -     else if (tp->version == RTL_VER_16)
> > -             ocp_word_clr_bits(tp, MCU_TYPE_USB, USB_USB_CTRL,
> RX_AGG_DISABLE | RX_DESC_16B);
> > +     ocp_word_clr_bits(tp, MCU_TYPE_USB, USB_USB_CTRL,
> > +                       RX_AGG_DISABLE | RX_ZERO_EN);
> 
> [ ... ]
> 
> > +static void r8157_init(struct r8152 *tp) {
> > +     u16 data;
> > +
> > +     if (test_bit(RTL8152_INACCESSIBLE, &tp->flags))
> > +             return;
> > +
> > +     /* Enable SW reset */
> > +     ocp_byte_set_bits(tp, MCU_TYPE_USB, 0xcffe, BIT(3));
> > +     ocp_byte_clr_bits(tp, MCU_TYPE_USB, 0xd3ca, BIT(0));
> > +
> > +     ocp_byte_clr_bits(tp, MCU_TYPE_USB, USB_ECM_OP,
> EN_ALL_SPEED);
> > +
> > +     ocp_word_set_bits(tp, MCU_TYPE_USB, USB_ECM_OPTION,
> > + BYPASS_MAC_RESET);
> > +
> > +     r8153b_u1u2en(tp, false);
> > +
> > +     if (wait_autoload_done(tp))
> > +             return;
> > +
> > +     r8156b_wait_loading_flash(tp);
> 
> [Severity: Medium]
> 
> Is this reordering deliberate?  In the shared r8156_init() the flash-patch wait
> for VER_16/17 ran right after r8153b_u1u2en(tp, false) and before the
> AUTOLOAD_DONE poll:
> 
>         switch (tp->version) {
>         case RTL_VER_13:
>         case RTL_VER_15:
>         case RTL_VER_16:
>         case RTL_VER_17:
>                 r8156b_wait_loading_flash(tp);
>                 break;
>         ...
>         for (i = 0; i < 500; i++) {
>                 if (ocp_read_word(tp, MCU_TYPE_PLA, PLA_BOOT_CTRL)
> &
>                     AUTOLOAD_DONE)
>                         break;
> 
> r8156b_init() keeps that pre-poll placement for VER_13/15, so only the
> VER_16 and VER_17 paths change order here.
> 
> r8159_init() moves r8156b_wait_loading_flash() after
> r8159_wait_backup_restore() as well.  Both helpers poll USB_GPHY_CTRL
> (GPHY_PATCH_DONE versus BACKUP_RESTRORE), and the backup-restore poll
> has a
> 20 ms budget:
> 
>         return poll_timeout_us(ocp_data = ocp_read_word(tp,
> MCU_TYPE_USB, USB_GPHY_CTRL),
>                                ocp_data & BACKUP_RESTRORE, 200,
> 20000, false);
> 
> while r8156b_wait_loading_flash() allows roughly 100 ms for the patch load.
> If a pending flash load can delay BACKUP_RESTRORE, can this poll now time
> out where it previously could not, given that the flash wait used to complete
> first?  On timeout r8159_init() calls rtl_set_inaccessible() and abandons the
> rest of the bring-up.

The order doesn't matter.

> 
> > +
> > +     data = r8153_phy_status(tp, 0);
> > +     if (data == PHY_STAT_EXT_INIT) {
> > +             ocp_reg_clr_bits(tp, 0xa468, BIT(3) | BIT(1));
> > +             ocp_reg_clr_bits(tp, 0xa466, BIT(0));
> > +     }
> 
> [ ... ]
> 
> > +     set_bit(GREEN_ETHERNET, &tp->flags);
> >
> > +     /* RX aggregation / 16 bytes RX descriptor / Bulk In End transfer */
> > +     ocp_word_clr_bits(tp, MCU_TYPE_USB, USB_USB_CTRL,
> > +                       RX_AGG_DISABLE | RX_DESC_16B |
> > + RX_END_TRANSFER_EN);
> 
> [Severity: Medium]
> 
> Should r8157_init() clear USB_USB_CTRL bit 11?  Before the split that bit
> was restricted to RTL_VER_17, with a comment saying it was RTL8159
> specific:
> 
>         /* RX aggregation / 16 bytes RX descriptor
>          * BIT(11) is specific to RTL8159, with unknown meaning
>          */
>         if (tp->version == RTL_VER_17)
>                 ocp_word_clr_bits(tp, MCU_TYPE_USB, USB_USB_CTRL,
>                                   RX_AGG_DISABLE | RX_DESC_16B |
> BIT(11));
>         else if (tp->version == RTL_VER_16)
>                 ocp_word_clr_bits(tp, MCU_TYPE_USB, USB_USB_CTRL,
> RX_AGG_DISABLE | RX_DESC_16B);
> 
> rtl_ops_init() installs r8157_init() as ops->init for RTL_VER_16, so every
> RTL8157 now has bit 11 (newly named RX_END_TRANSFER_EN) cleared on
> each probe and reset_resume.
> 
> Every other per-version divergence of the old function was reproduced exactly
> in the split (USB_SPEED_OPTION for versions below VER_16, RX_DETECT8 for
> VER_12 to VER_15, PLA_MCU_SPDWN_EN for versions below VER_16,
> ACT_ODMA for versions below VER_12, r8153_u2p3en() versus
> r8157_u2p3en(),
> r8153b_power_cut_en() versus r8157_power_cut_en()), and the changelog
> enumerates each intentionally added write without mentioning this one.
> 
> Can the changelog describe what bit 11 does on RTL8157, or keep the write
> limited to RTL8159 as before?

RTL8157 also needs to clear bit 11. While set, incoming packets are buffered in the RX FIFO and
Bulk-IN transfers are suspended. This bit is NOT self-clearing, so the driver must manually clear it 
to resume Bulk-IN transfers.

I will mention this in the next version.

> 
> [ ... ]
> 
> > +static int r8159_wait_backup_restore(struct r8152 *tp) {
> > +     u32 ocp_data;
> > +
> > +     ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_MISC_0);
> > +     if (!(ocp_data & PCUT_STATUS))
> > +             return 0;
> > +
> > +     return poll_timeout_us(ocp_data = ocp_read_word(tp,
> MCU_TYPE_USB, USB_GPHY_CTRL),
> > +                            ocp_data & BACKUP_RESTRORE, 200,
> 20000,
> > +false); }
> > +
> > +static void r8159_init(struct r8152 *tp) {
> 
> [ ... ]
> 
> > +     if (wait_autoload_done(tp))
> > +             return;
> > +
> > +     if (r8159_wait_backup_restore(tp)) {
> > +             rtl_set_inaccessible(tp);
> > +             dev_err(&tp->intf->dev,
> > +                     "init failed, backup-restore timed out\n");
> > +             return;
> >       }
> 
> [Severity: Medium]
> 
> This is a pre-existing issue and not introduced by this patch, since the same
> abort path was in the shared r8156_init(), but as it is being moved
> here: how does this failure reach the caller?
> 
> rtl_set_inaccessible() only sets one flag:
> 
>         static void rtl_set_inaccessible(struct r8152 *tp)
>         {
>                 set_bit(RTL8152_INACCESSIBLE, &tp->flags);
>                 smp_mb__after_atomic();
>         }
> 
> PROBE_SHOULD_RETRY is set only by r8152_control_msg() on a failed control
> transfer, which a BACKUP_RESTRORE poll timeout is not, and
> rtl8152_probe_once() checks only that flag after calling
> tp->rtl_ops.init(tp):
> 
>         if (test_bit(PROBE_SHOULD_RETRY, &tp->flags))
>                 goto out2;
> 
> So probe continues through register_netdev() and returns success while the
> rest of r8159_init() was skipped and every subsequent
> generic_ocp_read()/generic_ocp_write() short-circuits to -ENODEV, leaving a
> registered netdev that cannot pass traffic until re-plug.  Would it make sense
> for this path to propagate an error or queue a device reset?
> 
> [ ... ]
> 
> --
> Sashiko AI review ·
> https://netdev-ai.bots.linux.dev/sashiko/#/patchset/20260917070637.62827-
> 1-nic_swsd%40realtek.com

Best Regards,
Chih-Kai

  reply	other threads:[~2026-09-23  7:48 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-17  7:06 [PATCH net-next v4 0/8] r8152: refactor and extend RTL8157/8159 support Chih Kai Hsu
2026-09-17  7:06 ` [PATCH net-next v4 1/8] r8152: split r8156_init per chip and add missing init writes Chih Kai Hsu
2026-09-21  8:30   ` netdev-bot+sashiko
2026-09-23  7:48     ` Chih Kai Hsu [this message]
2026-09-17  7:06 ` [PATCH net-next v4 2/8] r8152: split RTL_VER_17 into QFN68 and QFN100 package variants Chih Kai Hsu
2026-09-21  8:30   ` netdev-bot+sashiko
2026-09-23  8:10     ` Chih Kai Hsu
2026-09-17  7:06 ` [PATCH net-next v4 3/8] r8152: split rtl8156_enable/up/down into per-chip-family functions Chih Kai Hsu
2026-09-21  8:30   ` netdev-bot+sashiko
2026-09-23  8:23     ` Chih Kai Hsu
2026-09-17  7:06 ` [PATCH net-next v4 4/8] r8152: split r8157_hw_phy_cfg into RTL8157 and RTL8159 variants Chih Kai Hsu
2026-09-21  8:30   ` netdev-bot+sashiko
2026-09-23  9:51     ` Chih Kai Hsu
2026-09-17  7:06 ` [PATCH net-next v4 5/8] r8152: add rtl8157_unload and rtl8157_change_mtu Chih Kai Hsu
2026-09-21  8:30   ` netdev-bot+sashiko
2026-09-17  7:06 ` [PATCH net-next v4 6/8] r8152: add TGPHY register access for RTL8157 and RTL8159 Chih Kai Hsu
2026-09-21  8:30   ` netdev-bot+sashiko
2026-09-23  5:42     ` Chih Kai Hsu
2026-09-17  7:06 ` [PATCH net-next v4 7/8] r8152: extract rtl_fc_pause_pkt_en() and apply it to RTL8156/8157/8159 Chih Kai Hsu
2026-09-21  8:30   ` netdev-bot+sashiko
2026-09-17  7:06 ` [PATCH net-next v4 8/8] r8152: enable UPS for RTL8157 and RTL8159 QFN68 Chih Kai Hsu
2026-09-21  8:30   ` netdev-bot+sashiko

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=e1646fd5f42c4404bff2436613745e3e@realtek.com \
    --to=hsu.chih.kai@realtek.com \
    --cc=andrew+netdev@lunn.ch \
    --cc=bjorn@mork.no \
    --cc=davem@davemloft.net \
    --cc=edumazet@google.com \
    --cc=kuba@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=netdev-bot+sashiko@kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=nic_swsd@realtek.com \
    --cc=pabeni@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®