* [PATCH net-next v2] ch9200: do return USB errors from control_write() @ 2026-09-15 18:58 Sergey Shtylyov 2026-09-15 21:53 ` Andrew Lunn 2026-09-16 7:23 ` netdev-bot+sashiko 0 siblings, 2 replies; 5+ messages in thread From: Sergey Shtylyov @ 2026-09-15 18:58 UTC (permalink / raw) To: Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni, linux-usb, netdev Cc: Sergey Shtylyov, linux-kernel Compared with control_read(), control_write() looks really strange: it ignores any errors returned by usb_control_msg(), always returning 0 instead, despite overriding a positive result of usb_control_msg() (indicating short transfer) to -EINVAL before doing that. Drop that dubious *return* and propagate USB errors to the callers... Signed-off-by: Sergey Shtylyov <s.shtylyov@auroraos.dev> --- Changes in version 2: - dropped the Fixes tag, retargeting the patch to the net-next.git repo; - dropped [RFT] from the subject. drivers/net/usb/ch9200.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/drivers/net/usb/ch9200.c b/drivers/net/usb/ch9200.c index a206ffa76f1b..3a81e9e96fd3 100644 --- a/drivers/net/usb/ch9200.c +++ b/drivers/net/usb/ch9200.c @@ -168,8 +168,6 @@ static int control_write(struct usbnet *dev, unsigned char request, err = -EINVAL; kfree(buf); - return 0; - err_out: return err; } -- 2.55.0 ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH net-next v2] ch9200: do return USB errors from control_write() 2026-09-15 18:58 [PATCH net-next v2] ch9200: do return USB errors from control_write() Sergey Shtylyov @ 2026-09-15 21:53 ` Andrew Lunn 2026-09-16 7:23 ` netdev-bot+sashiko 1 sibling, 0 replies; 5+ messages in thread From: Andrew Lunn @ 2026-09-15 21:53 UTC (permalink / raw) To: Sergey Shtylyov Cc: Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni, linux-usb, netdev, linux-kernel On Tue, Sep 15, 2026 at 09:58:04PM +0300, Sergey Shtylyov wrote: > Compared with control_read(), control_write() looks really strange: > it ignores any errors returned by usb_control_msg(), always returning > 0 instead, despite overriding a positive result of usb_control_msg() > (indicating short transfer) to -EINVAL before doing that. Drop that > dubious *return* and propagate USB errors to the callers... > > Signed-off-by: Sergey Shtylyov <s.shtylyov@auroraos.dev> Reviewed-by: Andrew Lunn <andrew@lunn.ch> Andrew ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH net-next v2] ch9200: do return USB errors from control_write() 2026-09-15 18:58 [PATCH net-next v2] ch9200: do return USB errors from control_write() Sergey Shtylyov 2026-09-15 21:53 ` Andrew Lunn @ 2026-09-16 7:23 ` netdev-bot+sashiko 2026-09-16 16:21 ` Sergey Shtylyov 1 sibling, 1 reply; 5+ messages in thread From: netdev-bot+sashiko @ 2026-09-16 7:23 UTC (permalink / raw) To: s.shtylyov Cc: andrew+netdev, davem, edumazet, kuba, pabeni, linux-usb, netdev, linux-kernel Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider: Critical: 0 · High: 1 · Medium: 0 · Low: 0 - [High] Incomplete fix: after removing `return 0;` from control_write() (drivers/net/usb/ch9200.c:137-171), the helper now returns the… -- ch9200: do return USB errors from control_write() This removes the unconditional "return 0;" at the end of control_write() in drivers/net/usb/ch9200.c so that the function falls through to "return err;" instead. The stated intent is to propagate usb_control_msg() errors to the callers. > diff --git a/drivers/net/usb/ch9200.c b/drivers/net/usb/ch9200.c > index a206ffa76f1b9..3a81e9e96fd33 100644 > --- a/drivers/net/usb/ch9200.c > +++ b/drivers/net/usb/ch9200.c > @@ -168,8 +168,6 @@ static int control_write(struct usbnet *dev, unsigned char request, > err = -EINVAL; > kfree(buf); > > - return 0; > - > err_out: > return err; > } [Severity: High] The commit message says this will "propagate USB errors to the callers", but do any of the callers actually consume the value? There are two in-tree callers. ch9200_mdio_write() is void and calls it as a bare statement: drivers/net/usb/ch9200.c:ch9200_mdio_write() { ... control_write(dev, REQUEST_WRITE, 0, loc * 2, buff, 0x02, CONTROL_TIMEOUT_MS); } ch9200_bind() stores the result six times and overwrites it every time, with the last store clobbered by get_mac_address(): drivers/net/usb/ch9200.c:ch9200_bind() { ... retval = control_write(dev, REQUEST_WRITE, 0, MAC_REG_THRESHOLD, data, 0x02, CONTROL_TIMEOUT_MS); ... retval = control_write(dev, REQUEST_WRITE, 0, MAC_REG_CTRL, data, 0x02, CONTROL_TIMEOUT_MS); retval = get_mac_address(dev, addr); eth_hw_addr_set(dev->net, addr); return retval; } Since usbnet_probe() only aborts on a negative bind() status: drivers/net/usb/usbnet.c:usbnet_probe() { ... status = info->bind(dev, udev); if (status < 0) goto out1; } bind still reports success when every register write failed, for example when a failed MAC_REG_THRESHOLD/MAC_REG_FIFO_DEPTH write is followed by a successful MAC_REG_CTRL = 0x0D5F write that arms DMA/receiver/transmitter with unprogrammed FIFO and flow-control watermarks, or when the MAC_REG_CTRL write itself fails and the netdev is registered with the datapath never enabled. Is the observable behaviour of the driver changed at all by this patch? There is a second point about the resulting contract. On success usb_control_msg() returns the transferred length, so control_write() now returns a positive value (2 for these register writes) rather than 0: err = usb_control_msg(dev->udev, ...); if (err >= 0 && err < size) err = -EINVAL; Would the obvious caller-side follow-up "if (retval) return retval;" then treat every successful 2-byte register write as a failure? Would it be better to normalize success to 0 in control_write(), or to check "retval < 0" in each caller and update the callers in the same patch so the errors being returned are actually acted upon? -- Sashiko AI review · https://netdev-ai.bots.linux.dev/sashiko/#/patchset/20260915185805.38712-1-s.shtylyov%40auroraos.dev ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH net-next v2] ch9200: do return USB errors from control_write() 2026-09-16 7:23 ` netdev-bot+sashiko @ 2026-09-16 16:21 ` Sergey Shtylyov 2026-09-19 1:21 ` Jakub Kicinski 0 siblings, 1 reply; 5+ messages in thread From: Sergey Shtylyov @ 2026-09-16 16:21 UTC (permalink / raw) To: netdev-bot+sashiko Cc: andrew+netdev, davem, edumazet, kuba, pabeni, linux-usb, netdev, linux-kernel On 9/16/26 10:23 AM, netdev-bot+sashiko@kernel.org wrote: > Thank you for your contribution! Sashiko AI review found 1 potential > issue(s) to consider: > > Critical: 0 · High: 1 · Medium: 0 · Low: 0 > > - [High] Incomplete fix: after removing `return 0;` from control_write() > (drivers/net/usb/ch9200.c:137-171), the helper now returns the… > > -- > > ch9200: do return USB errors from control_write() > > This removes the unconditional "return 0;" at the end of control_write() > in drivers/net/usb/ch9200.c so that the function falls through to > "return err;" instead. The stated intent is to propagate usb_control_msg() > errors to the callers. > >> diff --git a/drivers/net/usb/ch9200.c b/drivers/net/usb/ch9200.c >> index a206ffa76f1b9..3a81e9e96fd33 100644 >> --- a/drivers/net/usb/ch9200.c >> +++ b/drivers/net/usb/ch9200.c >> @@ -168,8 +168,6 @@ static int control_write(struct usbnet *dev, unsigned char request, >> err = -EINVAL; >> kfree(buf); >> >> - return 0; >> - >> err_out: >> return err; >> } > > [Severity: High] But why? 8-) > The commit message says this will "propagate USB errors to the callers", > but do any of the callers actually consume the value? Most will -- after another patch: https://lore.kernel.org/all/20260914202503.52920-1-s.shtylyov@auroraos.dev/ [...] > There is a second point about the resulting contract. On success > usb_control_msg() returns the transferred length, so control_write() now > returns a positive value (2 for these register writes) rather than 0: > > err = usb_control_msg(dev->udev, ...); > if (err >= 0 && err < size) > err = -EINVAL; > > Would the obvious caller-side follow-up "if (retval) return retval;" then > treat every successful 2-byte register write as a failure? Would it be > better to normalize success to 0 in control_write(), or to check > "retval < 0" in each caller and update the callers in the same patch so > the errors being returned are actually acted upon? That's what the patch I linked to does... [...] MBR, Sergey ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH net-next v2] ch9200: do return USB errors from control_write() 2026-09-16 16:21 ` Sergey Shtylyov @ 2026-09-19 1:21 ` Jakub Kicinski 0 siblings, 0 replies; 5+ messages in thread From: Jakub Kicinski @ 2026-09-19 1:21 UTC (permalink / raw) To: Sergey Shtylyov Cc: netdev-bot+sashiko, andrew+netdev, davem, edumazet, pabeni, linux-usb, netdev, linux-kernel On Wed, 16 Sep 2026 19:21:04 +0300 Sergey Shtylyov wrote: > > There is a second point about the resulting contract. On success > > usb_control_msg() returns the transferred length, so control_write() now > > returns a positive value (2 for these register writes) rather than 0: > > > > err = usb_control_msg(dev->udev, ...); > > if (err >= 0 && err < size) > > err = -EINVAL; > > > > Would the obvious caller-side follow-up "if (retval) return retval;" then > > treat every successful 2-byte register write as a failure? Would it be > > better to normalize success to 0 in control_write(), or to check > > "retval < 0" in each caller and update the callers in the same patch so > > the errors being returned are actually acted upon? > That's what the patch I linked to does... Please fix the issues in one series or not at all. We have too many patches in flight these days to be chasing people's linked series. Too many LLM-happy "helpers". Please explain how you discovered the issue and how you tested the fix. ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-09-19 1:21 UTC | newest] Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2026-09-15 18:58 [PATCH net-next v2] ch9200: do return USB errors from control_write() Sergey Shtylyov 2026-09-15 21:53 ` Andrew Lunn 2026-09-16 7:23 ` netdev-bot+sashiko 2026-09-16 16:21 ` Sergey Shtylyov 2026-09-19 1:21 ` Jakub Kicinski
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®