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
next prev parent reply other threads:[~2026-09-23 7:48 UTC|newest]
Thread overview: 25+ 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-24 5:47 ` Chih Kai Hsu
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-24 7:50 ` Chih Kai Hsu
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
2026-09-24 10:46 ` Chih Kai Hsu
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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.