aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/tg3.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c
index 088ed9f634e5..ab2fa213b301 100644
--- a/drivers/net/tg3.c
+++ b/drivers/net/tg3.c
@@ -7239,9 +7239,59 @@ static void tg3_get_ethtool_stats (struct net_device *dev,
7239 memcpy(tmp_stats, tg3_get_estats(tp), sizeof(tp->estats)); 7239 memcpy(tmp_stats, tg3_get_estats(tp), sizeof(tp->estats));
7240} 7240}
7241 7241
7242#define NVRAM_TEST_SIZE 0x100
7243
7244static int tg3_test_nvram(struct tg3 *tp)
7245{
7246 u32 *buf, csum;
7247 int i, j, err = 0;
7248
7249 buf = kmalloc(NVRAM_TEST_SIZE, GFP_KERNEL);
7250 if (buf == NULL)
7251 return -ENOMEM;
7252
7253 for (i = 0, j = 0; i < NVRAM_TEST_SIZE; i += 4, j++) {
7254 u32 val;
7255
7256 if ((err = tg3_nvram_read(tp, i, &val)) != 0)
7257 break;
7258 buf[j] = cpu_to_le32(val);
7259 }
7260 if (i < NVRAM_TEST_SIZE)
7261 goto out;
7262
7263 err = -EIO;
7264 if (cpu_to_be32(buf[0]) != TG3_EEPROM_MAGIC)
7265 goto out;
7266
7267 /* Bootstrap checksum at offset 0x10 */
7268 csum = calc_crc((unsigned char *) buf, 0x10);
7269 if(csum != cpu_to_le32(buf[0x10/4]))
7270 goto out;
7271
7272 /* Manufacturing block starts at offset 0x74, checksum at 0xfc */
7273 csum = calc_crc((unsigned char *) &buf[0x74/4], 0x88);
7274 if (csum != cpu_to_le32(buf[0xfc/4]))
7275 goto out;
7276
7277 err = 0;
7278
7279out:
7280 kfree(buf);
7281 return err;
7282}
7283
7242static void tg3_self_test(struct net_device *dev, struct ethtool_test *etest, 7284static void tg3_self_test(struct net_device *dev, struct ethtool_test *etest,
7243 u64 *data) 7285 u64 *data)
7244{ 7286{
7287 struct tg3 *tp = netdev_priv(dev);
7288
7289 memset(data, 0, sizeof(u64) * TG3_NUM_TEST);
7290
7291 if (tg3_test_nvram(tp) != 0) {
7292 etest->flags |= ETH_TEST_FL_FAILED;
7293 data[0] = 1;
7294 }
7245} 7295}
7246 7296
7247static int tg3_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) 7297static int tg3_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)