| From foo@baz Mon Jul 23 08:24:46 CEST 2018 |
| From: Alexander Couzens <lynxis@fe80.eu> |
| Date: Tue, 17 Jul 2018 13:17:09 +0200 |
| Subject: net: usb: asix: replace mii_nway_restart in resume path |
| |
| From: Alexander Couzens <lynxis@fe80.eu> |
| |
| [ Upstream commit 5c968f48021a9b3faa61ac2543cfab32461c0e05 ] |
| |
| mii_nway_restart is not pm aware which results in a rtnl deadlock. |
| Implement mii_nway_restart manual by setting BMCR_ANRESTART if |
| BMCR_ANENABLE is set. |
| |
| To reproduce: |
| * plug an asix based usb network interface |
| * wait until the device enters PM (~5 sec) |
| * `ip link set eth1 up` will never return |
| |
| Fixes: d9fe64e51114 ("net: asix: Add in_pm parameter") |
| Signed-off-by: Alexander Couzens <lynxis@fe80.eu> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/net/usb/asix_devices.c | 4 +++- |
| 1 file changed, 3 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/net/usb/asix_devices.c |
| +++ b/drivers/net/usb/asix_devices.c |
| @@ -640,10 +640,12 @@ static void ax88772_restore_phy(struct u |
| priv->presvd_phy_advertise); |
| |
| /* Restore BMCR */ |
| + if (priv->presvd_phy_bmcr & BMCR_ANENABLE) |
| + priv->presvd_phy_bmcr |= BMCR_ANRESTART; |
| + |
| asix_mdio_write_nopm(dev->net, dev->mii.phy_id, MII_BMCR, |
| priv->presvd_phy_bmcr); |
| |
| - mii_nway_restart(&dev->mii); |
| priv->presvd_phy_advertise = 0; |
| priv->presvd_phy_bmcr = 0; |
| } |