[TG3]: Add link test
authorMichael Chan <mchan@broadcom.com>
Sun, 29 May 2005 21:57:23 +0000 (14:57 -0700)
committerDavid S. Miller <davem@davemloft.net>
Sun, 29 May 2005 21:57:23 +0000 (14:57 -0700)
Signed-off-by: Michael Chan <mchan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/tg3.c

index ab2fa213b301609f8b661a37da8242c0596f585f..30349c5fd73c1d95007c04d6293f2e897ac59666 100644 (file)
@@ -7281,6 +7281,32 @@ out:
        return err;
 }
 
+#define TG3_SERDES_TIMEOUT_SEC 2
+#define TG3_COPPER_TIMEOUT_SEC 6
+
+static int tg3_test_link(struct tg3 *tp)
+{
+       int i, max;
+
+       if (!netif_running(tp->dev))
+               return -ENODEV;
+
+       if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES)
+               max = TG3_SERDES_TIMEOUT_SEC;
+       else
+               max = TG3_COPPER_TIMEOUT_SEC;
+
+       for (i = 0; i < max; i++) {
+               if (netif_carrier_ok(tp->dev))
+                       return 0;
+
+               if (msleep_interruptible(1000))
+                       break;
+       }
+
+       return -EIO;
+}
+
 static void tg3_self_test(struct net_device *dev, struct ethtool_test *etest,
                          u64 *data)
 {
@@ -7292,6 +7318,10 @@ static void tg3_self_test(struct net_device *dev, struct ethtool_test *etest,
                etest->flags |= ETH_TEST_FL_FAILED;
                data[0] = 1;
        }
+       if (tg3_test_link(tp) != 0) {
+               etest->flags |= ETH_TEST_FL_FAILED;
+               data[1] = 1;
+       }
 }
 
 static int tg3_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)