OSDN Git Service

tlan: Add PHY reset timeout
authorOndrej Zary <linux@rainbow-software.org>
Mon, 30 Jun 2014 16:38:34 +0000 (18:38 +0200)
committerDavid S. Miller <davem@davemloft.net>
Tue, 8 Jul 2014 00:06:52 +0000 (17:06 -0700)
Add a timeout to prevent infinite loop waiting for PHY to reset.

Signed-off-by: Ondrej Zary <linux@rainbow-software.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/ti/tlan.c

index c4021de..8278150 100644 (file)
@@ -2568,6 +2568,7 @@ static void tlan_phy_reset(struct net_device *dev)
        struct tlan_priv        *priv = netdev_priv(dev);
        u16             phy;
        u16             value;
+       unsigned long timeout = jiffies + HZ;
 
        phy = priv->phy[priv->phy_num];
 
@@ -2575,9 +2576,13 @@ static void tlan_phy_reset(struct net_device *dev)
        tlan_mii_sync(dev->base_addr);
        value = MII_GC_LOOPBK | MII_GC_RESET;
        tlan_mii_write_reg(dev, phy, MII_GEN_CTL, value);
-       tlan_mii_read_reg(dev, phy, MII_GEN_CTL, &value);
-       while (value & MII_GC_RESET)
+       do {
                tlan_mii_read_reg(dev, phy, MII_GEN_CTL, &value);
+               if (time_after(jiffies, timeout)) {
+                       netdev_err(dev, "PHY reset timeout\n");
+                       return;
+               }
+       } while (value & MII_GC_RESET);
 
        /* Wait for 500 ms and initialize.
         * I don't remember why I wait this long.