diff options
Diffstat (limited to 'drivers/net/e1000/e1000_ethtool.c')
| -rw-r--r-- | drivers/net/e1000/e1000_ethtool.c | 131 |
1 files changed, 86 insertions, 45 deletions
diff --git a/drivers/net/e1000/e1000_ethtool.c b/drivers/net/e1000/e1000_ethtool.c index 237247f74df4..f133ff0b0b94 100644 --- a/drivers/net/e1000/e1000_ethtool.c +++ b/drivers/net/e1000/e1000_ethtool.c | |||
| @@ -105,7 +105,7 @@ static const char e1000_gstrings_test[][ETH_GSTRING_LEN] = { | |||
| 105 | static int | 105 | static int |
| 106 | e1000_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd) | 106 | e1000_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd) |
| 107 | { | 107 | { |
| 108 | struct e1000_adapter *adapter = netdev->priv; | 108 | struct e1000_adapter *adapter = netdev_priv(netdev); |
| 109 | struct e1000_hw *hw = &adapter->hw; | 109 | struct e1000_hw *hw = &adapter->hw; |
| 110 | 110 | ||
| 111 | if(hw->media_type == e1000_media_type_copper) { | 111 | if(hw->media_type == e1000_media_type_copper) { |
| @@ -141,9 +141,9 @@ e1000_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd) | |||
| 141 | SUPPORTED_FIBRE | | 141 | SUPPORTED_FIBRE | |
| 142 | SUPPORTED_Autoneg); | 142 | SUPPORTED_Autoneg); |
| 143 | 143 | ||
| 144 | ecmd->advertising = (SUPPORTED_1000baseT_Full | | 144 | ecmd->advertising = (ADVERTISED_1000baseT_Full | |
| 145 | SUPPORTED_FIBRE | | 145 | ADVERTISED_FIBRE | |
| 146 | SUPPORTED_Autoneg); | 146 | ADVERTISED_Autoneg); |
| 147 | 147 | ||
| 148 | ecmd->port = PORT_FIBRE; | 148 | ecmd->port = PORT_FIBRE; |
| 149 | 149 | ||
| @@ -179,13 +179,24 @@ e1000_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd) | |||
| 179 | static int | 179 | static int |
| 180 | e1000_set_settings(struct net_device *netdev, struct ethtool_cmd *ecmd) | 180 | e1000_set_settings(struct net_device *netdev, struct ethtool_cmd *ecmd) |
| 181 | { | 181 | { |
| 182 | struct e1000_adapter *adapter = netdev->priv; | 182 | struct e1000_adapter *adapter = netdev_priv(netdev); |
| 183 | struct e1000_hw *hw = &adapter->hw; | 183 | struct e1000_hw *hw = &adapter->hw; |
| 184 | 184 | ||
| 185 | if(ecmd->autoneg == AUTONEG_ENABLE) { | 185 | if(ecmd->autoneg == AUTONEG_ENABLE) { |
| 186 | hw->autoneg = 1; | 186 | hw->autoneg = 1; |
| 187 | hw->autoneg_advertised = 0x002F; | 187 | if(hw->media_type == e1000_media_type_fiber) |
| 188 | ecmd->advertising = 0x002F; | 188 | hw->autoneg_advertised = ADVERTISED_1000baseT_Full | |
| 189 | ADVERTISED_FIBRE | | ||
| 190 | ADVERTISED_Autoneg; | ||
| 191 | else | ||
| 192 | hw->autoneg_advertised = ADVERTISED_10baseT_Half | | ||
| 193 | ADVERTISED_10baseT_Full | | ||
| 194 | ADVERTISED_100baseT_Half | | ||
| 195 | ADVERTISED_100baseT_Full | | ||
| 196 | ADVERTISED_1000baseT_Full| | ||
| 197 | ADVERTISED_Autoneg | | ||
| 198 | ADVERTISED_TP; | ||
| 199 | ecmd->advertising = hw->autoneg_advertised; | ||
| 189 | } else | 200 | } else |
| 190 | if(e1000_set_spd_dplx(adapter, ecmd->speed + ecmd->duplex)) | 201 | if(e1000_set_spd_dplx(adapter, ecmd->speed + ecmd->duplex)) |
| 191 | return -EINVAL; | 202 | return -EINVAL; |
| @@ -206,7 +217,7 @@ static void | |||
| 206 | e1000_get_pauseparam(struct net_device *netdev, | 217 | e1000_get_pauseparam(struct net_device *netdev, |
| 207 | struct ethtool_pauseparam *pause) | 218 | struct ethtool_pauseparam *pause) |
| 208 | { | 219 | { |
| 209 | struct e1000_adapter *adapter = netdev->priv; | 220 | struct e1000_adapter *adapter = netdev_priv(netdev); |
| 210 | struct e1000_hw *hw = &adapter->hw; | 221 | struct e1000_hw *hw = &adapter->hw; |
| 211 | 222 | ||
| 212 | pause->autoneg = | 223 | pause->autoneg = |
| @@ -226,7 +237,7 @@ static int | |||
| 226 | e1000_set_pauseparam(struct net_device *netdev, | 237 | e1000_set_pauseparam(struct net_device *netdev, |
| 227 | struct ethtool_pauseparam *pause) | 238 | struct ethtool_pauseparam *pause) |
| 228 | { | 239 | { |
| 229 | struct e1000_adapter *adapter = netdev->priv; | 240 | struct e1000_adapter *adapter = netdev_priv(netdev); |
| 230 | struct e1000_hw *hw = &adapter->hw; | 241 | struct e1000_hw *hw = &adapter->hw; |
| 231 | 242 | ||
| 232 | adapter->fc_autoneg = pause->autoneg; | 243 | adapter->fc_autoneg = pause->autoneg; |
| @@ -259,14 +270,14 @@ e1000_set_pauseparam(struct net_device *netdev, | |||
| 259 | static uint32_t | 270 | static uint32_t |
| 260 | e1000_get_rx_csum(struct net_device *netdev) | 271 | e1000_get_rx_csum(struct net_device *netdev) |
| 261 | { | 272 | { |
| 262 | struct e1000_adapter *adapter = netdev->priv; | 273 | struct e1000_adapter *adapter = netdev_priv(netdev); |
| 263 | return adapter->rx_csum; | 274 | return adapter->rx_csum; |
| 264 | } | 275 | } |
| 265 | 276 | ||
| 266 | static int | 277 | static int |
| 267 | e1000_set_rx_csum(struct net_device *netdev, uint32_t data) | 278 | e1000_set_rx_csum(struct net_device *netdev, uint32_t data) |
| 268 | { | 279 | { |
| 269 | struct e1000_adapter *adapter = netdev->priv; | 280 | struct e1000_adapter *adapter = netdev_priv(netdev); |
| 270 | adapter->rx_csum = data; | 281 | adapter->rx_csum = data; |
| 271 | 282 | ||
| 272 | if(netif_running(netdev)) { | 283 | if(netif_running(netdev)) { |
| @@ -286,7 +297,7 @@ e1000_get_tx_csum(struct net_device *netdev) | |||
| 286 | static int | 297 | static int |
| 287 | e1000_set_tx_csum(struct net_device *netdev, uint32_t data) | 298 | e1000_set_tx_csum(struct net_device *netdev, uint32_t data) |
| 288 | { | 299 | { |
| 289 | struct e1000_adapter *adapter = netdev->priv; | 300 | struct e1000_adapter *adapter = netdev_priv(netdev); |
| 290 | 301 | ||
| 291 | if(adapter->hw.mac_type < e1000_82543) { | 302 | if(adapter->hw.mac_type < e1000_82543) { |
| 292 | if (!data) | 303 | if (!data) |
| @@ -306,8 +317,8 @@ e1000_set_tx_csum(struct net_device *netdev, uint32_t data) | |||
| 306 | static int | 317 | static int |
| 307 | e1000_set_tso(struct net_device *netdev, uint32_t data) | 318 | e1000_set_tso(struct net_device *netdev, uint32_t data) |
| 308 | { | 319 | { |
| 309 | struct e1000_adapter *adapter = netdev->priv; | 320 | struct e1000_adapter *adapter = netdev_priv(netdev); |
| 310 | if ((adapter->hw.mac_type < e1000_82544) || | 321 | if((adapter->hw.mac_type < e1000_82544) || |
| 311 | (adapter->hw.mac_type == e1000_82547)) | 322 | (adapter->hw.mac_type == e1000_82547)) |
| 312 | return data ? -EINVAL : 0; | 323 | return data ? -EINVAL : 0; |
| 313 | 324 | ||
| @@ -322,14 +333,14 @@ e1000_set_tso(struct net_device *netdev, uint32_t data) | |||
| 322 | static uint32_t | 333 | static uint32_t |
| 323 | e1000_get_msglevel(struct net_device *netdev) | 334 | e1000_get_msglevel(struct net_device *netdev) |
| 324 | { | 335 | { |
| 325 | struct e1000_adapter *adapter = netdev->priv; | 336 | struct e1000_adapter *adapter = netdev_priv(netdev); |
| 326 | return adapter->msg_enable; | 337 | return adapter->msg_enable; |
| 327 | } | 338 | } |
| 328 | 339 | ||
| 329 | static void | 340 | static void |
| 330 | e1000_set_msglevel(struct net_device *netdev, uint32_t data) | 341 | e1000_set_msglevel(struct net_device *netdev, uint32_t data) |
| 331 | { | 342 | { |
| 332 | struct e1000_adapter *adapter = netdev->priv; | 343 | struct e1000_adapter *adapter = netdev_priv(netdev); |
| 333 | adapter->msg_enable = data; | 344 | adapter->msg_enable = data; |
| 334 | } | 345 | } |
| 335 | 346 | ||
| @@ -344,7 +355,7 @@ static void | |||
| 344 | e1000_get_regs(struct net_device *netdev, | 355 | e1000_get_regs(struct net_device *netdev, |
| 345 | struct ethtool_regs *regs, void *p) | 356 | struct ethtool_regs *regs, void *p) |
| 346 | { | 357 | { |
| 347 | struct e1000_adapter *adapter = netdev->priv; | 358 | struct e1000_adapter *adapter = netdev_priv(netdev); |
| 348 | struct e1000_hw *hw = &adapter->hw; | 359 | struct e1000_hw *hw = &adapter->hw; |
| 349 | uint32_t *regs_buff = p; | 360 | uint32_t *regs_buff = p; |
| 350 | uint16_t phy_data; | 361 | uint16_t phy_data; |
| @@ -432,7 +443,7 @@ e1000_get_regs(struct net_device *netdev, | |||
| 432 | static int | 443 | static int |
| 433 | e1000_get_eeprom_len(struct net_device *netdev) | 444 | e1000_get_eeprom_len(struct net_device *netdev) |
| 434 | { | 445 | { |
| 435 | struct e1000_adapter *adapter = netdev->priv; | 446 | struct e1000_adapter *adapter = netdev_priv(netdev); |
| 436 | return adapter->hw.eeprom.word_size * 2; | 447 | return adapter->hw.eeprom.word_size * 2; |
| 437 | } | 448 | } |
| 438 | 449 | ||
| @@ -440,7 +451,7 @@ static int | |||
| 440 | e1000_get_eeprom(struct net_device *netdev, | 451 | e1000_get_eeprom(struct net_device *netdev, |
| 441 | struct ethtool_eeprom *eeprom, uint8_t *bytes) | 452 | struct ethtool_eeprom *eeprom, uint8_t *bytes) |
| 442 | { | 453 | { |
| 443 | struct e1000_adapter *adapter = netdev->priv; | 454 | struct e1000_adapter *adapter = netdev_priv(netdev); |
| 444 | struct e1000_hw *hw = &adapter->hw; | 455 | struct e1000_hw *hw = &adapter->hw; |
| 445 | uint16_t *eeprom_buff; | 456 | uint16_t *eeprom_buff; |
| 446 | int first_word, last_word; | 457 | int first_word, last_word; |
| @@ -486,7 +497,7 @@ static int | |||
| 486 | e1000_set_eeprom(struct net_device *netdev, | 497 | e1000_set_eeprom(struct net_device *netdev, |
| 487 | struct ethtool_eeprom *eeprom, uint8_t *bytes) | 498 | struct ethtool_eeprom *eeprom, uint8_t *bytes) |
| 488 | { | 499 | { |
| 489 | struct e1000_adapter *adapter = netdev->priv; | 500 | struct e1000_adapter *adapter = netdev_priv(netdev); |
| 490 | struct e1000_hw *hw = &adapter->hw; | 501 | struct e1000_hw *hw = &adapter->hw; |
| 491 | uint16_t *eeprom_buff; | 502 | uint16_t *eeprom_buff; |
| 492 | void *ptr; | 503 | void *ptr; |
| @@ -547,7 +558,7 @@ static void | |||
| 547 | e1000_get_drvinfo(struct net_device *netdev, | 558 | e1000_get_drvinfo(struct net_device *netdev, |
| 548 | struct ethtool_drvinfo *drvinfo) | 559 | struct ethtool_drvinfo *drvinfo) |
| 549 | { | 560 | { |
| 550 | struct e1000_adapter *adapter = netdev->priv; | 561 | struct e1000_adapter *adapter = netdev_priv(netdev); |
| 551 | 562 | ||
| 552 | strncpy(drvinfo->driver, e1000_driver_name, 32); | 563 | strncpy(drvinfo->driver, e1000_driver_name, 32); |
| 553 | strncpy(drvinfo->version, e1000_driver_version, 32); | 564 | strncpy(drvinfo->version, e1000_driver_version, 32); |
| @@ -563,7 +574,7 @@ static void | |||
| 563 | e1000_get_ringparam(struct net_device *netdev, | 574 | e1000_get_ringparam(struct net_device *netdev, |
| 564 | struct ethtool_ringparam *ring) | 575 | struct ethtool_ringparam *ring) |
| 565 | { | 576 | { |
| 566 | struct e1000_adapter *adapter = netdev->priv; | 577 | struct e1000_adapter *adapter = netdev_priv(netdev); |
| 567 | e1000_mac_type mac_type = adapter->hw.mac_type; | 578 | e1000_mac_type mac_type = adapter->hw.mac_type; |
| 568 | struct e1000_desc_ring *txdr = &adapter->tx_ring; | 579 | struct e1000_desc_ring *txdr = &adapter->tx_ring; |
| 569 | struct e1000_desc_ring *rxdr = &adapter->rx_ring; | 580 | struct e1000_desc_ring *rxdr = &adapter->rx_ring; |
| @@ -584,7 +595,7 @@ static int | |||
| 584 | e1000_set_ringparam(struct net_device *netdev, | 595 | e1000_set_ringparam(struct net_device *netdev, |
| 585 | struct ethtool_ringparam *ring) | 596 | struct ethtool_ringparam *ring) |
| 586 | { | 597 | { |
| 587 | struct e1000_adapter *adapter = netdev->priv; | 598 | struct e1000_adapter *adapter = netdev_priv(netdev); |
| 588 | e1000_mac_type mac_type = adapter->hw.mac_type; | 599 | e1000_mac_type mac_type = adapter->hw.mac_type; |
| 589 | struct e1000_desc_ring *txdr = &adapter->tx_ring; | 600 | struct e1000_desc_ring *txdr = &adapter->tx_ring; |
| 590 | struct e1000_desc_ring *rxdr = &adapter->rx_ring; | 601 | struct e1000_desc_ring *rxdr = &adapter->rx_ring; |
| @@ -651,6 +662,9 @@ err_setup_rx: | |||
| 651 | E1000_WRITE_REG(&adapter->hw, R, (test[pat] & W)); \ | 662 | E1000_WRITE_REG(&adapter->hw, R, (test[pat] & W)); \ |
| 652 | value = E1000_READ_REG(&adapter->hw, R); \ | 663 | value = E1000_READ_REG(&adapter->hw, R); \ |
| 653 | if(value != (test[pat] & W & M)) { \ | 664 | if(value != (test[pat] & W & M)) { \ |
| 665 | DPRINTK(DRV, ERR, "pattern test reg %04X failed: got " \ | ||
| 666 | "0x%08X expected 0x%08X\n", \ | ||
| 667 | E1000_##R, value, (test[pat] & W & M)); \ | ||
| 654 | *data = (adapter->hw.mac_type < e1000_82543) ? \ | 668 | *data = (adapter->hw.mac_type < e1000_82543) ? \ |
| 655 | E1000_82542_##R : E1000_##R; \ | 669 | E1000_82542_##R : E1000_##R; \ |
| 656 | return 1; \ | 670 | return 1; \ |
| @@ -663,7 +677,9 @@ err_setup_rx: | |||
| 663 | uint32_t value; \ | 677 | uint32_t value; \ |
| 664 | E1000_WRITE_REG(&adapter->hw, R, W & M); \ | 678 | E1000_WRITE_REG(&adapter->hw, R, W & M); \ |
| 665 | value = E1000_READ_REG(&adapter->hw, R); \ | 679 | value = E1000_READ_REG(&adapter->hw, R); \ |
| 666 | if ((W & M) != (value & M)) { \ | 680 | if((W & M) != (value & M)) { \ |
| 681 | DPRINTK(DRV, ERR, "set/check reg %04X test failed: got 0x%08X "\ | ||
| 682 | "expected 0x%08X\n", E1000_##R, (value & M), (W & M)); \ | ||
| 667 | *data = (adapter->hw.mac_type < e1000_82543) ? \ | 683 | *data = (adapter->hw.mac_type < e1000_82543) ? \ |
| 668 | E1000_82542_##R : E1000_##R; \ | 684 | E1000_82542_##R : E1000_##R; \ |
| 669 | return 1; \ | 685 | return 1; \ |
| @@ -673,18 +689,33 @@ err_setup_rx: | |||
| 673 | static int | 689 | static int |
| 674 | e1000_reg_test(struct e1000_adapter *adapter, uint64_t *data) | 690 | e1000_reg_test(struct e1000_adapter *adapter, uint64_t *data) |
| 675 | { | 691 | { |
| 676 | uint32_t value; | 692 | uint32_t value, before, after; |
| 677 | uint32_t i; | 693 | uint32_t i, toggle; |
| 678 | 694 | ||
| 679 | /* The status register is Read Only, so a write should fail. | 695 | /* The status register is Read Only, so a write should fail. |
| 680 | * Some bits that get toggled are ignored. | 696 | * Some bits that get toggled are ignored. |
| 681 | */ | 697 | */ |
| 682 | value = (E1000_READ_REG(&adapter->hw, STATUS) & (0xFFFFF833)); | 698 | switch (adapter->hw.mac_type) { |
| 683 | E1000_WRITE_REG(&adapter->hw, STATUS, (0xFFFFFFFF)); | 699 | case e1000_82573: |
| 684 | if(value != (E1000_READ_REG(&adapter->hw, STATUS) & (0xFFFFF833))) { | 700 | toggle = 0x7FFFF033; |
| 701 | break; | ||
| 702 | default: | ||
| 703 | toggle = 0xFFFFF833; | ||
| 704 | break; | ||
| 705 | } | ||
| 706 | |||
| 707 | before = E1000_READ_REG(&adapter->hw, STATUS); | ||
| 708 | value = (E1000_READ_REG(&adapter->hw, STATUS) & toggle); | ||
| 709 | E1000_WRITE_REG(&adapter->hw, STATUS, toggle); | ||
| 710 | after = E1000_READ_REG(&adapter->hw, STATUS) & toggle; | ||
| 711 | if(value != after) { | ||
| 712 | DPRINTK(DRV, ERR, "failed STATUS register test got: " | ||
| 713 | "0x%08X expected: 0x%08X\n", after, value); | ||
| 685 | *data = 1; | 714 | *data = 1; |
| 686 | return 1; | 715 | return 1; |
| 687 | } | 716 | } |
| 717 | /* restore previous status */ | ||
| 718 | E1000_WRITE_REG(&adapter->hw, STATUS, before); | ||
| 688 | 719 | ||
| 689 | REG_PATTERN_TEST(FCAL, 0xFFFFFFFF, 0xFFFFFFFF); | 720 | REG_PATTERN_TEST(FCAL, 0xFFFFFFFF, 0xFFFFFFFF); |
| 690 | REG_PATTERN_TEST(FCAH, 0x0000FFFF, 0xFFFFFFFF); | 721 | REG_PATTERN_TEST(FCAH, 0x0000FFFF, 0xFFFFFFFF); |
| @@ -766,7 +797,7 @@ e1000_test_intr(int irq, | |||
| 766 | struct pt_regs *regs) | 797 | struct pt_regs *regs) |
| 767 | { | 798 | { |
| 768 | struct net_device *netdev = (struct net_device *) data; | 799 | struct net_device *netdev = (struct net_device *) data; |
| 769 | struct e1000_adapter *adapter = netdev->priv; | 800 | struct e1000_adapter *adapter = netdev_priv(netdev); |
| 770 | 801 | ||
| 771 | adapter->test_icr |= E1000_READ_REG(&adapter->hw, ICR); | 802 | adapter->test_icr |= E1000_READ_REG(&adapter->hw, ICR); |
| 772 | 803 | ||
| @@ -1214,6 +1245,7 @@ e1000_set_phy_loopback(struct e1000_adapter *adapter) | |||
| 1214 | case e1000_82541_rev_2: | 1245 | case e1000_82541_rev_2: |
| 1215 | case e1000_82547: | 1246 | case e1000_82547: |
| 1216 | case e1000_82547_rev_2: | 1247 | case e1000_82547_rev_2: |
| 1248 | case e1000_82573: | ||
| 1217 | return e1000_integrated_phy_loopback(adapter); | 1249 | return e1000_integrated_phy_loopback(adapter); |
| 1218 | break; | 1250 | break; |
| 1219 | 1251 | ||
| @@ -1422,7 +1454,7 @@ static void | |||
| 1422 | e1000_diag_test(struct net_device *netdev, | 1454 | e1000_diag_test(struct net_device *netdev, |
| 1423 | struct ethtool_test *eth_test, uint64_t *data) | 1455 | struct ethtool_test *eth_test, uint64_t *data) |
| 1424 | { | 1456 | { |
| 1425 | struct e1000_adapter *adapter = netdev->priv; | 1457 | struct e1000_adapter *adapter = netdev_priv(netdev); |
| 1426 | boolean_t if_running = netif_running(netdev); | 1458 | boolean_t if_running = netif_running(netdev); |
| 1427 | 1459 | ||
| 1428 | if(eth_test->flags == ETH_TEST_FL_OFFLINE) { | 1460 | if(eth_test->flags == ETH_TEST_FL_OFFLINE) { |
| @@ -1482,7 +1514,7 @@ e1000_diag_test(struct net_device *netdev, | |||
| 1482 | static void | 1514 | static void |
| 1483 | e1000_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol) | 1515 | e1000_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol) |
| 1484 | { | 1516 | { |
| 1485 | struct e1000_adapter *adapter = netdev->priv; | 1517 | struct e1000_adapter *adapter = netdev_priv(netdev); |
| 1486 | struct e1000_hw *hw = &adapter->hw; | 1518 | struct e1000_hw *hw = &adapter->hw; |
| 1487 | 1519 | ||
| 1488 | switch(adapter->hw.device_id) { | 1520 | switch(adapter->hw.device_id) { |
| @@ -1527,7 +1559,7 @@ e1000_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol) | |||
| 1527 | static int | 1559 | static int |
| 1528 | e1000_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol) | 1560 | e1000_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol) |
| 1529 | { | 1561 | { |
| 1530 | struct e1000_adapter *adapter = netdev->priv; | 1562 | struct e1000_adapter *adapter = netdev_priv(netdev); |
| 1531 | struct e1000_hw *hw = &adapter->hw; | 1563 | struct e1000_hw *hw = &adapter->hw; |
| 1532 | 1564 | ||
| 1533 | switch(adapter->hw.device_id) { | 1565 | switch(adapter->hw.device_id) { |
| @@ -1588,22 +1620,31 @@ e1000_led_blink_callback(unsigned long data) | |||
| 1588 | static int | 1620 | static int |
| 1589 | e1000_phys_id(struct net_device *netdev, uint32_t data) | 1621 | e1000_phys_id(struct net_device *netdev, uint32_t data) |
| 1590 | { | 1622 | { |
| 1591 | struct e1000_adapter *adapter = netdev->priv; | 1623 | struct e1000_adapter *adapter = netdev_priv(netdev); |
| 1592 | 1624 | ||
| 1593 | if(!data || data > (uint32_t)(MAX_SCHEDULE_TIMEOUT / HZ)) | 1625 | if(!data || data > (uint32_t)(MAX_SCHEDULE_TIMEOUT / HZ)) |
| 1594 | data = (uint32_t)(MAX_SCHEDULE_TIMEOUT / HZ); | 1626 | data = (uint32_t)(MAX_SCHEDULE_TIMEOUT / HZ); |
| 1595 | 1627 | ||
| 1596 | if(!adapter->blink_timer.function) { | 1628 | if(adapter->hw.mac_type < e1000_82573) { |
| 1597 | init_timer(&adapter->blink_timer); | 1629 | if(!adapter->blink_timer.function) { |
| 1598 | adapter->blink_timer.function = e1000_led_blink_callback; | 1630 | init_timer(&adapter->blink_timer); |
| 1599 | adapter->blink_timer.data = (unsigned long) adapter; | 1631 | adapter->blink_timer.function = e1000_led_blink_callback; |
| 1632 | adapter->blink_timer.data = (unsigned long) adapter; | ||
| 1633 | } | ||
| 1634 | e1000_setup_led(&adapter->hw); | ||
| 1635 | mod_timer(&adapter->blink_timer, jiffies); | ||
| 1636 | msleep_interruptible(data * 1000); | ||
| 1637 | del_timer_sync(&adapter->blink_timer); | ||
| 1638 | } | ||
| 1639 | else { | ||
| 1640 | E1000_WRITE_REG(&adapter->hw, LEDCTL, (E1000_LEDCTL_LED2_BLINK_RATE | | ||
| 1641 | E1000_LEDCTL_LED1_BLINK | E1000_LEDCTL_LED2_BLINK | | ||
| 1642 | (E1000_LEDCTL_MODE_LED_ON << E1000_LEDCTL_LED2_MODE_SHIFT) | | ||
| 1643 | (E1000_LEDCTL_MODE_LINK_ACTIVITY << E1000_LEDCTL_LED1_MODE_SHIFT) | | ||
| 1644 | (E1000_LEDCTL_MODE_LED_OFF << E1000_LEDCTL_LED0_MODE_SHIFT))); | ||
| 1645 | msleep_interruptible(data * 1000); | ||
| 1600 | } | 1646 | } |
| 1601 | 1647 | ||
| 1602 | e1000_setup_led(&adapter->hw); | ||
| 1603 | mod_timer(&adapter->blink_timer, jiffies); | ||
| 1604 | |||
| 1605 | msleep_interruptible(data * 1000); | ||
| 1606 | del_timer_sync(&adapter->blink_timer); | ||
| 1607 | e1000_led_off(&adapter->hw); | 1648 | e1000_led_off(&adapter->hw); |
| 1608 | clear_bit(E1000_LED_ON, &adapter->led_status); | 1649 | clear_bit(E1000_LED_ON, &adapter->led_status); |
| 1609 | e1000_cleanup_led(&adapter->hw); | 1650 | e1000_cleanup_led(&adapter->hw); |
| @@ -1614,7 +1655,7 @@ e1000_phys_id(struct net_device *netdev, uint32_t data) | |||
| 1614 | static int | 1655 | static int |
| 1615 | e1000_nway_reset(struct net_device *netdev) | 1656 | e1000_nway_reset(struct net_device *netdev) |
| 1616 | { | 1657 | { |
| 1617 | struct e1000_adapter *adapter = netdev->priv; | 1658 | struct e1000_adapter *adapter = netdev_priv(netdev); |
| 1618 | if(netif_running(netdev)) { | 1659 | if(netif_running(netdev)) { |
| 1619 | e1000_down(adapter); | 1660 | e1000_down(adapter); |
| 1620 | e1000_up(adapter); | 1661 | e1000_up(adapter); |
| @@ -1632,7 +1673,7 @@ static void | |||
| 1632 | e1000_get_ethtool_stats(struct net_device *netdev, | 1673 | e1000_get_ethtool_stats(struct net_device *netdev, |
| 1633 | struct ethtool_stats *stats, uint64_t *data) | 1674 | struct ethtool_stats *stats, uint64_t *data) |
| 1634 | { | 1675 | { |
| 1635 | struct e1000_adapter *adapter = netdev->priv; | 1676 | struct e1000_adapter *adapter = netdev_priv(netdev); |
| 1636 | int i; | 1677 | int i; |
| 1637 | 1678 | ||
| 1638 | e1000_update_stats(adapter); | 1679 | e1000_update_stats(adapter); |
