Commit 36bdc0e815b4 ("net: usb: asix: ax88772: re-add usbnet_link_change() in phylink callbacks") restored the link-change notification that was lost during the phylink migration, by calling usbnet_link_change() from the phylink mac_link_up() / mac_link_down() callbacks. While this fixed the original symptom (RX URB submission not being initiated after link up), usbnet_link_change() also calls netif_carrier_off() on link-down, which is redundant in a phylink-based driver because phylink manages the carrier state itself. Replace the usbnet_link_change() calls with the minimal operations: - In ax88772_mac_link_up(), schedule dev->bh_work directly via queue_work(system_bh_wq, &dev->bh_work). This is the same mechanism usbnet_open() uses to schedule the bottom-half that submits RX URBs. - In ax88772_mac_link_down(), call usbnet_unlink_rx_urbs() to return any in-flight RX URBs to the host controller. This releases USB bandwidth and avoids keeping unused buffers queued while the link is down. This is the symmetric counterpart to scheduling new RX URBs on link up. Tested with the Apple A1277 USB Ethernet Adapter (05ac:1402, AX88772A based) on a Banana Pro (Allwinner A20). Fixes: 36bdc0e815b4 ("net: usb: asix: ax88772: re-add usbnet_link_change() in phylink callbacks") Assisted-by: Claude:claude-opus-4-7 Signed-off-by: Markus Baier --- Transparency notice: The English formulation of this commit message was prepared with AI assistance. The actual system testing and verification of the issue were performed manually without AI involvement. This is a follow-up to commit 36bdc0e815b4 (just applied to net.git). While that patch correctly restored the missing RX URB submission, I realized during further analysis that usbnet_link_change() carries side effects (notably calling netif_carrier_off() on link-down) that are redundant in a phylink-based driver. After studying how usbnet_open() handles the same task (direct queue_work() call), this minimal approach better matches the existing usbnet patterns. I am sending this now rather than waiting, because the previous patch just landed and I would like the cleanup to be considered before it propagates further into stable kernels via the Fixes: tag. drivers/net/usb/asix_devices.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/drivers/net/usb/asix_devices.c b/drivers/net/usb/asix_devices.c index 293ef80c4e30..4230ff611c4b 100644 --- a/drivers/net/usb/asix_devices.c +++ b/drivers/net/usb/asix_devices.c @@ -756,7 +756,11 @@ static void ax88772_mac_link_down(struct phylink_config *config, struct usbnet *dev = netdev_priv(to_net_dev(config->dev)); asix_write_medium_mode(dev, 0, 0); - usbnet_link_change(dev, false, false); + + /* Phylink will call netif_carrier_off(), but we should explicitly + * stop RX URBs to save USB bandwidth. + */ + usbnet_unlink_rx_urbs(dev); } static void ax88772_mac_link_up(struct phylink_config *config, @@ -787,7 +791,11 @@ static void ax88772_mac_link_up(struct phylink_config *config, m |= AX_MEDIUM_RFC; asix_write_medium_mode(dev, m, 0); - usbnet_link_change(dev, true, false); + + /* Phylink will call netif_carrier_on(), but we need to explicitly + * kick off RX URB submission in usbnet. + */ + queue_work(system_bh_wq, &dev->bh_work); } static const struct phylink_mac_ops ax88772_phylink_mac_ops = { -- 2.52.0