diff options
-rw-r--r-- | drivers/net/tg3.c | 50 |
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 | |||
7244 | static 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 | |||
7279 | out: | ||
7280 | kfree(buf); | ||
7281 | return err; | ||
7282 | } | ||
7283 | |||
7242 | static void tg3_self_test(struct net_device *dev, struct ethtool_test *etest, | 7284 | static 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 | ||
7247 | static int tg3_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) | 7297 | static int tg3_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) |