Message ID | 1548308929-7727-1-git-send-email-zhang.run@zte.com.cn (mailing list archive) |
---|---|
State | Mainlined |
Commit | 6eea3527e68acc22483f4763c8682f223eb90029 |
Headers | show |
Series | net: usb: asix: ax88772_bind return error when hw_reset fail | expand |
On Thu, 2019-01-24 at 13:48 +0800, Zhang Run wrote: > The ax88772_bind() should return error code immediately when the PHY > was not reset properly through ax88772a_hw_reset(). > Otherwise, The asix_get_phyid() will block when get the PHY > Identifier from the PHYSID1 MII registers through asix_mdio_read() > due to the PHY isn't ready. Furthermore, it will produce a lot of > error message cause system crash.As follows: > asix 1-1:1.0 (unnamed net_device) (uninitialized): Failed to write > reg index 0x0000: -71 > asix 1-1:1.0 (unnamed net_device) (uninitialized): Failed to send > software reset: ffffffb9 > asix 1-1:1.0 (unnamed net_device) (uninitialized): Failed to write > reg index 0x0000: -71 > asix 1-1:1.0 (unnamed net_device) (uninitialized): Failed to enable > software MII access > asix 1-1:1.0 (unnamed net_device) (uninitialized): Failed to read > reg index 0x0000: -71 > asix 1-1:1.0 (unnamed net_device) (uninitialized): Failed to write > reg index 0x0000: -71 > asix 1-1:1.0 (unnamed net_device) (uninitialized): Failed to enable > software MII access > asix 1-1:1.0 (unnamed net_device) (uninitialized): Failed to read > reg index 0x0000: -71 > ... > > Signed-off-by: Zhang Run <zhang.run@zte.com.cn> > Reviewed-by: Yang Wei <yang.wei9@zte.com.cn> Tested-by: Marcel Ziswiler <marcel.ziswiler@toradex.com> > --- > drivers/net/usb/asix_devices.c | 9 +++++++-- > 1 file changed, 7 insertions(+), 2 deletions(-) > > diff --git a/drivers/net/usb/asix_devices.c > b/drivers/net/usb/asix_devices.c > index b654f05..3d93993 100644 > --- a/drivers/net/usb/asix_devices.c > +++ b/drivers/net/usb/asix_devices.c > @@ -739,8 +739,13 @@ static int ax88772_bind(struct usbnet *dev, > struct usb_interface *intf) > asix_read_cmd(dev, AX_CMD_STATMNGSTS_REG, 0, 0, 1, &chipcode, > 0); > chipcode &= AX_CHIPCODE_MASK; > > - (chipcode == AX_AX88772_CHIPCODE) ? ax88772_hw_reset(dev, 0) : > - ax88772a_hw_reset(dev, 0); > + ret = (chipcode == AX_AX88772_CHIPCODE) ? ax88772_hw_reset(dev, > 0) : > + ax88772a_hw_reset(dev > , 0); > + > + if (ret < 0) { > + netdev_dbg(dev->net, "Failed to reset AX88772: %d\n", > ret); > + return ret; > + } > > /* Read PHYID register *AFTER* the PHY was reset properly */ > phyid = asix_get_phyid(dev);
From: Zhang Run <zhang.run@zte.com.cn> Date: Thu, 24 Jan 2019 13:48:49 +0800 > The ax88772_bind() should return error code immediately when the PHY > was not reset properly through ax88772a_hw_reset(). > Otherwise, The asix_get_phyid() will block when get the PHY > Identifier from the PHYSID1 MII registers through asix_mdio_read() > due to the PHY isn't ready. Furthermore, it will produce a lot of > error message cause system crash.As follows: > asix 1-1:1.0 (unnamed net_device) (uninitialized): Failed to write > reg index 0x0000: -71 > asix 1-1:1.0 (unnamed net_device) (uninitialized): Failed to send > software reset: ffffffb9 > asix 1-1:1.0 (unnamed net_device) (uninitialized): Failed to write > reg index 0x0000: -71 > asix 1-1:1.0 (unnamed net_device) (uninitialized): Failed to enable > software MII access > asix 1-1:1.0 (unnamed net_device) (uninitialized): Failed to read > reg index 0x0000: -71 > asix 1-1:1.0 (unnamed net_device) (uninitialized): Failed to write > reg index 0x0000: -71 > asix 1-1:1.0 (unnamed net_device) (uninitialized): Failed to enable > software MII access > asix 1-1:1.0 (unnamed net_device) (uninitialized): Failed to read > reg index 0x0000: -71 > ... > > Signed-off-by: Zhang Run <zhang.run@zte.com.cn> > Reviewed-by: Yang Wei <yang.wei9@zte.com.cn> Applied.
diff --git a/drivers/net/usb/asix_devices.c b/drivers/net/usb/asix_devices.c index b654f05..3d93993 100644 --- a/drivers/net/usb/asix_devices.c +++ b/drivers/net/usb/asix_devices.c @@ -739,8 +739,13 @@ static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf) asix_read_cmd(dev, AX_CMD_STATMNGSTS_REG, 0, 0, 1, &chipcode, 0); chipcode &= AX_CHIPCODE_MASK; - (chipcode == AX_AX88772_CHIPCODE) ? ax88772_hw_reset(dev, 0) : - ax88772a_hw_reset(dev, 0); + ret = (chipcode == AX_AX88772_CHIPCODE) ? ax88772_hw_reset(dev, 0) : + ax88772a_hw_reset(dev, 0); + + if (ret < 0) { + netdev_dbg(dev->net, "Failed to reset AX88772: %d\n", ret); + return ret; + } /* Read PHYID register *AFTER* the PHY was reset properly */ phyid = asix_get_phyid(dev);