diff options
Diffstat (limited to 'drivers/net/ethernet/intel/e1000e/ethtool.c')
-rw-r--r-- | drivers/net/ethernet/intel/e1000e/ethtool.c | 240 |
1 files changed, 111 insertions, 129 deletions
diff --git a/drivers/net/ethernet/intel/e1000e/ethtool.c b/drivers/net/ethernet/intel/e1000e/ethtool.c index f91a8f3f9d48..7c8ca658d553 100644 --- a/drivers/net/ethernet/intel/e1000e/ethtool.c +++ b/drivers/net/ethernet/intel/e1000e/ethtool.c | |||
@@ -35,12 +35,11 @@ | |||
35 | #include <linux/slab.h> | 35 | #include <linux/slab.h> |
36 | #include <linux/delay.h> | 36 | #include <linux/delay.h> |
37 | #include <linux/vmalloc.h> | 37 | #include <linux/vmalloc.h> |
38 | #include <linux/mdio.h> | ||
39 | #include <linux/pm_runtime.h> | 38 | #include <linux/pm_runtime.h> |
40 | 39 | ||
41 | #include "e1000.h" | 40 | #include "e1000.h" |
42 | 41 | ||
43 | enum {NETDEV_STATS, E1000_STATS}; | 42 | enum { NETDEV_STATS, E1000_STATS }; |
44 | 43 | ||
45 | struct e1000_stats { | 44 | struct e1000_stats { |
46 | char stat_string[ETH_GSTRING_LEN]; | 45 | char stat_string[ETH_GSTRING_LEN]; |
@@ -121,6 +120,7 @@ static const char e1000_gstrings_test[][ETH_GSTRING_LEN] = { | |||
121 | "Interrupt test (offline)", "Loopback test (offline)", | 120 | "Interrupt test (offline)", "Loopback test (offline)", |
122 | "Link test (on/offline)" | 121 | "Link test (on/offline)" |
123 | }; | 122 | }; |
123 | |||
124 | #define E1000_TEST_LEN ARRAY_SIZE(e1000_gstrings_test) | 124 | #define E1000_TEST_LEN ARRAY_SIZE(e1000_gstrings_test) |
125 | 125 | ||
126 | static int e1000_get_settings(struct net_device *netdev, | 126 | static int e1000_get_settings(struct net_device *netdev, |
@@ -197,8 +197,7 @@ static int e1000_get_settings(struct net_device *netdev, | |||
197 | /* MDI-X => 2; MDI =>1; Invalid =>0 */ | 197 | /* MDI-X => 2; MDI =>1; Invalid =>0 */ |
198 | if ((hw->phy.media_type == e1000_media_type_copper) && | 198 | if ((hw->phy.media_type == e1000_media_type_copper) && |
199 | netif_carrier_ok(netdev)) | 199 | netif_carrier_ok(netdev)) |
200 | ecmd->eth_tp_mdix = hw->phy.is_mdix ? ETH_TP_MDI_X : | 200 | ecmd->eth_tp_mdix = hw->phy.is_mdix ? ETH_TP_MDI_X : ETH_TP_MDI; |
201 | ETH_TP_MDI; | ||
202 | else | 201 | else |
203 | ecmd->eth_tp_mdix = ETH_TP_MDI_INVALID; | 202 | ecmd->eth_tp_mdix = ETH_TP_MDI_INVALID; |
204 | 203 | ||
@@ -224,8 +223,7 @@ static int e1000_set_spd_dplx(struct e1000_adapter *adapter, u32 spd, u8 dplx) | |||
224 | 223 | ||
225 | /* Fiber NICs only allow 1000 gbps Full duplex */ | 224 | /* Fiber NICs only allow 1000 gbps Full duplex */ |
226 | if ((adapter->hw.phy.media_type == e1000_media_type_fiber) && | 225 | if ((adapter->hw.phy.media_type == e1000_media_type_fiber) && |
227 | spd != SPEED_1000 && | 226 | (spd != SPEED_1000) && (dplx != DUPLEX_FULL)) { |
228 | dplx != DUPLEX_FULL) { | ||
229 | goto err_inval; | 227 | goto err_inval; |
230 | } | 228 | } |
231 | 229 | ||
@@ -298,12 +296,10 @@ static int e1000_set_settings(struct net_device *netdev, | |||
298 | hw->mac.autoneg = 1; | 296 | hw->mac.autoneg = 1; |
299 | if (hw->phy.media_type == e1000_media_type_fiber) | 297 | if (hw->phy.media_type == e1000_media_type_fiber) |
300 | hw->phy.autoneg_advertised = ADVERTISED_1000baseT_Full | | 298 | hw->phy.autoneg_advertised = ADVERTISED_1000baseT_Full | |
301 | ADVERTISED_FIBRE | | 299 | ADVERTISED_FIBRE | ADVERTISED_Autoneg; |
302 | ADVERTISED_Autoneg; | ||
303 | else | 300 | else |
304 | hw->phy.autoneg_advertised = ecmd->advertising | | 301 | hw->phy.autoneg_advertised = ecmd->advertising | |
305 | ADVERTISED_TP | | 302 | ADVERTISED_TP | ADVERTISED_Autoneg; |
306 | ADVERTISED_Autoneg; | ||
307 | ecmd->advertising = hw->phy.autoneg_advertised; | 303 | ecmd->advertising = hw->phy.autoneg_advertised; |
308 | if (adapter->fc_autoneg) | 304 | if (adapter->fc_autoneg) |
309 | hw->fc.requested_mode = e1000_fc_default; | 305 | hw->fc.requested_mode = e1000_fc_default; |
@@ -346,7 +342,7 @@ static void e1000_get_pauseparam(struct net_device *netdev, | |||
346 | struct e1000_hw *hw = &adapter->hw; | 342 | struct e1000_hw *hw = &adapter->hw; |
347 | 343 | ||
348 | pause->autoneg = | 344 | pause->autoneg = |
349 | (adapter->fc_autoneg ? AUTONEG_ENABLE : AUTONEG_DISABLE); | 345 | (adapter->fc_autoneg ? AUTONEG_ENABLE : AUTONEG_DISABLE); |
350 | 346 | ||
351 | if (hw->fc.current_mode == e1000_fc_rx_pause) { | 347 | if (hw->fc.current_mode == e1000_fc_rx_pause) { |
352 | pause->rx_pause = 1; | 348 | pause->rx_pause = 1; |
@@ -435,7 +431,7 @@ static void e1000_get_regs(struct net_device *netdev, | |||
435 | memset(p, 0, E1000_REGS_LEN * sizeof(u32)); | 431 | memset(p, 0, E1000_REGS_LEN * sizeof(u32)); |
436 | 432 | ||
437 | regs->version = (1 << 24) | (adapter->pdev->revision << 16) | | 433 | regs->version = (1 << 24) | (adapter->pdev->revision << 16) | |
438 | adapter->pdev->device; | 434 | adapter->pdev->device; |
439 | 435 | ||
440 | regs_buff[0] = er32(CTRL); | 436 | regs_buff[0] = er32(CTRL); |
441 | regs_buff[1] = er32(STATUS); | 437 | regs_buff[1] = er32(STATUS); |
@@ -503,8 +499,8 @@ static int e1000_get_eeprom(struct net_device *netdev, | |||
503 | first_word = eeprom->offset >> 1; | 499 | first_word = eeprom->offset >> 1; |
504 | last_word = (eeprom->offset + eeprom->len - 1) >> 1; | 500 | last_word = (eeprom->offset + eeprom->len - 1) >> 1; |
505 | 501 | ||
506 | eeprom_buff = kmalloc(sizeof(u16) * | 502 | eeprom_buff = kmalloc(sizeof(u16) * (last_word - first_word + 1), |
507 | (last_word - first_word + 1), GFP_KERNEL); | 503 | GFP_KERNEL); |
508 | if (!eeprom_buff) | 504 | if (!eeprom_buff) |
509 | return -ENOMEM; | 505 | return -ENOMEM; |
510 | 506 | ||
@@ -515,7 +511,7 @@ static int e1000_get_eeprom(struct net_device *netdev, | |||
515 | } else { | 511 | } else { |
516 | for (i = 0; i < last_word - first_word + 1; i++) { | 512 | for (i = 0; i < last_word - first_word + 1; i++) { |
517 | ret_val = e1000_read_nvm(hw, first_word + i, 1, | 513 | ret_val = e1000_read_nvm(hw, first_word + i, 1, |
518 | &eeprom_buff[i]); | 514 | &eeprom_buff[i]); |
519 | if (ret_val) | 515 | if (ret_val) |
520 | break; | 516 | break; |
521 | } | 517 | } |
@@ -553,7 +549,8 @@ static int e1000_set_eeprom(struct net_device *netdev, | |||
553 | if (eeprom->len == 0) | 549 | if (eeprom->len == 0) |
554 | return -EOPNOTSUPP; | 550 | return -EOPNOTSUPP; |
555 | 551 | ||
556 | if (eeprom->magic != (adapter->pdev->vendor | (adapter->pdev->device << 16))) | 552 | if (eeprom->magic != |
553 | (adapter->pdev->vendor | (adapter->pdev->device << 16))) | ||
557 | return -EFAULT; | 554 | return -EFAULT; |
558 | 555 | ||
559 | if (adapter->flags & FLAG_READ_ONLY_NVM) | 556 | if (adapter->flags & FLAG_READ_ONLY_NVM) |
@@ -579,7 +576,7 @@ static int e1000_set_eeprom(struct net_device *netdev, | |||
579 | /* need read/modify/write of last changed EEPROM word */ | 576 | /* need read/modify/write of last changed EEPROM word */ |
580 | /* only the first byte of the word is being modified */ | 577 | /* only the first byte of the word is being modified */ |
581 | ret_val = e1000_read_nvm(hw, last_word, 1, | 578 | ret_val = e1000_read_nvm(hw, last_word, 1, |
582 | &eeprom_buff[last_word - first_word]); | 579 | &eeprom_buff[last_word - first_word]); |
583 | 580 | ||
584 | if (ret_val) | 581 | if (ret_val) |
585 | goto out; | 582 | goto out; |
@@ -618,8 +615,7 @@ static void e1000_get_drvinfo(struct net_device *netdev, | |||
618 | { | 615 | { |
619 | struct e1000_adapter *adapter = netdev_priv(netdev); | 616 | struct e1000_adapter *adapter = netdev_priv(netdev); |
620 | 617 | ||
621 | strlcpy(drvinfo->driver, e1000e_driver_name, | 618 | strlcpy(drvinfo->driver, e1000e_driver_name, sizeof(drvinfo->driver)); |
622 | sizeof(drvinfo->driver)); | ||
623 | strlcpy(drvinfo->version, e1000e_driver_version, | 619 | strlcpy(drvinfo->version, e1000e_driver_version, |
624 | sizeof(drvinfo->version)); | 620 | sizeof(drvinfo->version)); |
625 | 621 | ||
@@ -627,10 +623,10 @@ static void e1000_get_drvinfo(struct net_device *netdev, | |||
627 | * PCI-E controllers | 623 | * PCI-E controllers |
628 | */ | 624 | */ |
629 | snprintf(drvinfo->fw_version, sizeof(drvinfo->fw_version), | 625 | snprintf(drvinfo->fw_version, sizeof(drvinfo->fw_version), |
630 | "%d.%d-%d", | 626 | "%d.%d-%d", |
631 | (adapter->eeprom_vers & 0xF000) >> 12, | 627 | (adapter->eeprom_vers & 0xF000) >> 12, |
632 | (adapter->eeprom_vers & 0x0FF0) >> 4, | 628 | (adapter->eeprom_vers & 0x0FF0) >> 4, |
633 | (adapter->eeprom_vers & 0x000F)); | 629 | (adapter->eeprom_vers & 0x000F)); |
634 | 630 | ||
635 | strlcpy(drvinfo->bus_info, pci_name(adapter->pdev), | 631 | strlcpy(drvinfo->bus_info, pci_name(adapter->pdev), |
636 | sizeof(drvinfo->bus_info)); | 632 | sizeof(drvinfo->bus_info)); |
@@ -756,7 +752,8 @@ static bool reg_pattern_test(struct e1000_adapter *adapter, u64 *data, | |||
756 | { | 752 | { |
757 | u32 pat, val; | 753 | u32 pat, val; |
758 | static const u32 test[] = { | 754 | static const u32 test[] = { |
759 | 0x5A5A5A5A, 0xA5A5A5A5, 0x00000000, 0xFFFFFFFF}; | 755 | 0x5A5A5A5A, 0xA5A5A5A5, 0x00000000, 0xFFFFFFFF |
756 | }; | ||
760 | for (pat = 0; pat < ARRAY_SIZE(test); pat++) { | 757 | for (pat = 0; pat < ARRAY_SIZE(test); pat++) { |
761 | E1000_WRITE_REG_ARRAY(&adapter->hw, reg, offset, | 758 | E1000_WRITE_REG_ARRAY(&adapter->hw, reg, offset, |
762 | (test[pat] & write)); | 759 | (test[pat] & write)); |
@@ -786,6 +783,7 @@ static bool reg_set_and_check(struct e1000_adapter *adapter, u64 *data, | |||
786 | } | 783 | } |
787 | return 0; | 784 | return 0; |
788 | } | 785 | } |
786 | |||
789 | #define REG_PATTERN_TEST_ARRAY(reg, offset, mask, write) \ | 787 | #define REG_PATTERN_TEST_ARRAY(reg, offset, mask, write) \ |
790 | do { \ | 788 | do { \ |
791 | if (reg_pattern_test(adapter, data, reg, offset, mask, write)) \ | 789 | if (reg_pattern_test(adapter, data, reg, offset, mask, write)) \ |
@@ -813,16 +811,16 @@ static int e1000_reg_test(struct e1000_adapter *adapter, u64 *data) | |||
813 | u32 wlock_mac = 0; | 811 | u32 wlock_mac = 0; |
814 | 812 | ||
815 | /* The status register is Read Only, so a write should fail. | 813 | /* The status register is Read Only, so a write should fail. |
816 | * Some bits that get toggled are ignored. | 814 | * Some bits that get toggled are ignored. There are several bits |
815 | * on newer hardware that are r/w. | ||
817 | */ | 816 | */ |
818 | switch (mac->type) { | 817 | switch (mac->type) { |
819 | /* there are several bits on newer hardware that are r/w */ | ||
820 | case e1000_82571: | 818 | case e1000_82571: |
821 | case e1000_82572: | 819 | case e1000_82572: |
822 | case e1000_80003es2lan: | 820 | case e1000_80003es2lan: |
823 | toggle = 0x7FFFF3FF; | 821 | toggle = 0x7FFFF3FF; |
824 | break; | 822 | break; |
825 | default: | 823 | default: |
826 | toggle = 0x7FFFF033; | 824 | toggle = 0x7FFFF033; |
827 | break; | 825 | break; |
828 | } | 826 | } |
@@ -928,7 +926,7 @@ static int e1000_eeprom_test(struct e1000_adapter *adapter, u64 *data) | |||
928 | } | 926 | } |
929 | 927 | ||
930 | /* If Checksum is not Correct return error else test passed */ | 928 | /* If Checksum is not Correct return error else test passed */ |
931 | if ((checksum != (u16) NVM_SUM) && !(*data)) | 929 | if ((checksum != (u16)NVM_SUM) && !(*data)) |
932 | *data = 2; | 930 | *data = 2; |
933 | 931 | ||
934 | return *data; | 932 | return *data; |
@@ -936,7 +934,7 @@ static int e1000_eeprom_test(struct e1000_adapter *adapter, u64 *data) | |||
936 | 934 | ||
937 | static irqreturn_t e1000_test_intr(int __always_unused irq, void *data) | 935 | static irqreturn_t e1000_test_intr(int __always_unused irq, void *data) |
938 | { | 936 | { |
939 | struct net_device *netdev = (struct net_device *) data; | 937 | struct net_device *netdev = (struct net_device *)data; |
940 | struct e1000_adapter *adapter = netdev_priv(netdev); | 938 | struct e1000_adapter *adapter = netdev_priv(netdev); |
941 | struct e1000_hw *hw = &adapter->hw; | 939 | struct e1000_hw *hw = &adapter->hw; |
942 | 940 | ||
@@ -969,8 +967,8 @@ static int e1000_intr_test(struct e1000_adapter *adapter, u64 *data) | |||
969 | if (!request_irq(irq, e1000_test_intr, IRQF_PROBE_SHARED, netdev->name, | 967 | if (!request_irq(irq, e1000_test_intr, IRQF_PROBE_SHARED, netdev->name, |
970 | netdev)) { | 968 | netdev)) { |
971 | shared_int = 0; | 969 | shared_int = 0; |
972 | } else if (request_irq(irq, e1000_test_intr, IRQF_SHARED, | 970 | } else if (request_irq(irq, e1000_test_intr, IRQF_SHARED, netdev->name, |
973 | netdev->name, netdev)) { | 971 | netdev)) { |
974 | *data = 1; | 972 | *data = 1; |
975 | ret_val = -1; | 973 | ret_val = -1; |
976 | goto out; | 974 | goto out; |
@@ -1080,28 +1078,33 @@ static void e1000_free_desc_rings(struct e1000_adapter *adapter) | |||
1080 | struct e1000_ring *tx_ring = &adapter->test_tx_ring; | 1078 | struct e1000_ring *tx_ring = &adapter->test_tx_ring; |
1081 | struct e1000_ring *rx_ring = &adapter->test_rx_ring; | 1079 | struct e1000_ring *rx_ring = &adapter->test_rx_ring; |
1082 | struct pci_dev *pdev = adapter->pdev; | 1080 | struct pci_dev *pdev = adapter->pdev; |
1081 | struct e1000_buffer *buffer_info; | ||
1083 | int i; | 1082 | int i; |
1084 | 1083 | ||
1085 | if (tx_ring->desc && tx_ring->buffer_info) { | 1084 | if (tx_ring->desc && tx_ring->buffer_info) { |
1086 | for (i = 0; i < tx_ring->count; i++) { | 1085 | for (i = 0; i < tx_ring->count; i++) { |
1087 | if (tx_ring->buffer_info[i].dma) | 1086 | buffer_info = &tx_ring->buffer_info[i]; |
1087 | |||
1088 | if (buffer_info->dma) | ||
1088 | dma_unmap_single(&pdev->dev, | 1089 | dma_unmap_single(&pdev->dev, |
1089 | tx_ring->buffer_info[i].dma, | 1090 | buffer_info->dma, |
1090 | tx_ring->buffer_info[i].length, | 1091 | buffer_info->length, |
1091 | DMA_TO_DEVICE); | 1092 | DMA_TO_DEVICE); |
1092 | if (tx_ring->buffer_info[i].skb) | 1093 | if (buffer_info->skb) |
1093 | dev_kfree_skb(tx_ring->buffer_info[i].skb); | 1094 | dev_kfree_skb(buffer_info->skb); |
1094 | } | 1095 | } |
1095 | } | 1096 | } |
1096 | 1097 | ||
1097 | if (rx_ring->desc && rx_ring->buffer_info) { | 1098 | if (rx_ring->desc && rx_ring->buffer_info) { |
1098 | for (i = 0; i < rx_ring->count; i++) { | 1099 | for (i = 0; i < rx_ring->count; i++) { |
1099 | if (rx_ring->buffer_info[i].dma) | 1100 | buffer_info = &rx_ring->buffer_info[i]; |
1101 | |||
1102 | if (buffer_info->dma) | ||
1100 | dma_unmap_single(&pdev->dev, | 1103 | dma_unmap_single(&pdev->dev, |
1101 | rx_ring->buffer_info[i].dma, | 1104 | buffer_info->dma, |
1102 | 2048, DMA_FROM_DEVICE); | 1105 | 2048, DMA_FROM_DEVICE); |
1103 | if (rx_ring->buffer_info[i].skb) | 1106 | if (buffer_info->skb) |
1104 | dev_kfree_skb(rx_ring->buffer_info[i].skb); | 1107 | dev_kfree_skb(buffer_info->skb); |
1105 | } | 1108 | } |
1106 | } | 1109 | } |
1107 | 1110 | ||
@@ -1138,8 +1141,7 @@ static int e1000_setup_desc_rings(struct e1000_adapter *adapter) | |||
1138 | tx_ring->count = E1000_DEFAULT_TXD; | 1141 | tx_ring->count = E1000_DEFAULT_TXD; |
1139 | 1142 | ||
1140 | tx_ring->buffer_info = kcalloc(tx_ring->count, | 1143 | tx_ring->buffer_info = kcalloc(tx_ring->count, |
1141 | sizeof(struct e1000_buffer), | 1144 | sizeof(struct e1000_buffer), GFP_KERNEL); |
1142 | GFP_KERNEL); | ||
1143 | if (!tx_ring->buffer_info) { | 1145 | if (!tx_ring->buffer_info) { |
1144 | ret_val = 1; | 1146 | ret_val = 1; |
1145 | goto err_nomem; | 1147 | goto err_nomem; |
@@ -1156,8 +1158,8 @@ static int e1000_setup_desc_rings(struct e1000_adapter *adapter) | |||
1156 | tx_ring->next_to_use = 0; | 1158 | tx_ring->next_to_use = 0; |
1157 | tx_ring->next_to_clean = 0; | 1159 | tx_ring->next_to_clean = 0; |
1158 | 1160 | ||
1159 | ew32(TDBAL(0), ((u64) tx_ring->dma & 0x00000000FFFFFFFF)); | 1161 | ew32(TDBAL(0), ((u64)tx_ring->dma & 0x00000000FFFFFFFF)); |
1160 | ew32(TDBAH(0), ((u64) tx_ring->dma >> 32)); | 1162 | ew32(TDBAH(0), ((u64)tx_ring->dma >> 32)); |
1161 | ew32(TDLEN(0), tx_ring->count * sizeof(struct e1000_tx_desc)); | 1163 | ew32(TDLEN(0), tx_ring->count * sizeof(struct e1000_tx_desc)); |
1162 | ew32(TDH(0), 0); | 1164 | ew32(TDH(0), 0); |
1163 | ew32(TDT(0), 0); | 1165 | ew32(TDT(0), 0); |
@@ -1179,8 +1181,8 @@ static int e1000_setup_desc_rings(struct e1000_adapter *adapter) | |||
1179 | tx_ring->buffer_info[i].skb = skb; | 1181 | tx_ring->buffer_info[i].skb = skb; |
1180 | tx_ring->buffer_info[i].length = skb->len; | 1182 | tx_ring->buffer_info[i].length = skb->len; |
1181 | tx_ring->buffer_info[i].dma = | 1183 | tx_ring->buffer_info[i].dma = |
1182 | dma_map_single(&pdev->dev, skb->data, skb->len, | 1184 | dma_map_single(&pdev->dev, skb->data, skb->len, |
1183 | DMA_TO_DEVICE); | 1185 | DMA_TO_DEVICE); |
1184 | if (dma_mapping_error(&pdev->dev, | 1186 | if (dma_mapping_error(&pdev->dev, |
1185 | tx_ring->buffer_info[i].dma)) { | 1187 | tx_ring->buffer_info[i].dma)) { |
1186 | ret_val = 4; | 1188 | ret_val = 4; |
@@ -1200,8 +1202,7 @@ static int e1000_setup_desc_rings(struct e1000_adapter *adapter) | |||
1200 | rx_ring->count = E1000_DEFAULT_RXD; | 1202 | rx_ring->count = E1000_DEFAULT_RXD; |
1201 | 1203 | ||
1202 | rx_ring->buffer_info = kcalloc(rx_ring->count, | 1204 | rx_ring->buffer_info = kcalloc(rx_ring->count, |
1203 | sizeof(struct e1000_buffer), | 1205 | sizeof(struct e1000_buffer), GFP_KERNEL); |
1204 | GFP_KERNEL); | ||
1205 | if (!rx_ring->buffer_info) { | 1206 | if (!rx_ring->buffer_info) { |
1206 | ret_val = 5; | 1207 | ret_val = 5; |
1207 | goto err_nomem; | 1208 | goto err_nomem; |
@@ -1220,16 +1221,16 @@ static int e1000_setup_desc_rings(struct e1000_adapter *adapter) | |||
1220 | rctl = er32(RCTL); | 1221 | rctl = er32(RCTL); |
1221 | if (!(adapter->flags2 & FLAG2_NO_DISABLE_RX)) | 1222 | if (!(adapter->flags2 & FLAG2_NO_DISABLE_RX)) |
1222 | ew32(RCTL, rctl & ~E1000_RCTL_EN); | 1223 | ew32(RCTL, rctl & ~E1000_RCTL_EN); |
1223 | ew32(RDBAL(0), ((u64) rx_ring->dma & 0xFFFFFFFF)); | 1224 | ew32(RDBAL(0), ((u64)rx_ring->dma & 0xFFFFFFFF)); |
1224 | ew32(RDBAH(0), ((u64) rx_ring->dma >> 32)); | 1225 | ew32(RDBAH(0), ((u64)rx_ring->dma >> 32)); |
1225 | ew32(RDLEN(0), rx_ring->size); | 1226 | ew32(RDLEN(0), rx_ring->size); |
1226 | ew32(RDH(0), 0); | 1227 | ew32(RDH(0), 0); |
1227 | ew32(RDT(0), 0); | 1228 | ew32(RDT(0), 0); |
1228 | rctl = E1000_RCTL_EN | E1000_RCTL_BAM | E1000_RCTL_SZ_2048 | | 1229 | rctl = E1000_RCTL_EN | E1000_RCTL_BAM | E1000_RCTL_SZ_2048 | |
1229 | E1000_RCTL_UPE | E1000_RCTL_MPE | E1000_RCTL_LPE | | 1230 | E1000_RCTL_UPE | E1000_RCTL_MPE | E1000_RCTL_LPE | |
1230 | E1000_RCTL_SBP | E1000_RCTL_SECRC | | 1231 | E1000_RCTL_SBP | E1000_RCTL_SECRC | |
1231 | E1000_RCTL_LBM_NO | E1000_RCTL_RDMTS_HALF | | 1232 | E1000_RCTL_LBM_NO | E1000_RCTL_RDMTS_HALF | |
1232 | (adapter->hw.mac.mc_filter_type << E1000_RCTL_MO_SHIFT); | 1233 | (adapter->hw.mac.mc_filter_type << E1000_RCTL_MO_SHIFT); |
1233 | ew32(RCTL, rctl); | 1234 | ew32(RCTL, rctl); |
1234 | 1235 | ||
1235 | for (i = 0; i < rx_ring->count; i++) { | 1236 | for (i = 0; i < rx_ring->count; i++) { |
@@ -1244,8 +1245,8 @@ static int e1000_setup_desc_rings(struct e1000_adapter *adapter) | |||
1244 | skb_reserve(skb, NET_IP_ALIGN); | 1245 | skb_reserve(skb, NET_IP_ALIGN); |
1245 | rx_ring->buffer_info[i].skb = skb; | 1246 | rx_ring->buffer_info[i].skb = skb; |
1246 | rx_ring->buffer_info[i].dma = | 1247 | rx_ring->buffer_info[i].dma = |
1247 | dma_map_single(&pdev->dev, skb->data, 2048, | 1248 | dma_map_single(&pdev->dev, skb->data, 2048, |
1248 | DMA_FROM_DEVICE); | 1249 | DMA_FROM_DEVICE); |
1249 | if (dma_mapping_error(&pdev->dev, | 1250 | if (dma_mapping_error(&pdev->dev, |
1250 | rx_ring->buffer_info[i].dma)) { | 1251 | rx_ring->buffer_info[i].dma)) { |
1251 | ret_val = 8; | 1252 | ret_val = 8; |
@@ -1296,7 +1297,7 @@ static int e1000_integrated_phy_loopback(struct e1000_adapter *adapter) | |||
1296 | 1297 | ||
1297 | ew32(CTRL, ctrl_reg); | 1298 | ew32(CTRL, ctrl_reg); |
1298 | e1e_flush(); | 1299 | e1e_flush(); |
1299 | udelay(500); | 1300 | usleep_range(500, 1000); |
1300 | 1301 | ||
1301 | return 0; | 1302 | return 0; |
1302 | } | 1303 | } |
@@ -1322,7 +1323,7 @@ static int e1000_integrated_phy_loopback(struct e1000_adapter *adapter) | |||
1322 | e1e_wphy(hw, PHY_REG(2, 21), phy_reg); | 1323 | e1e_wphy(hw, PHY_REG(2, 21), phy_reg); |
1323 | /* Assert SW reset for above settings to take effect */ | 1324 | /* Assert SW reset for above settings to take effect */ |
1324 | hw->phy.ops.commit(hw); | 1325 | hw->phy.ops.commit(hw); |
1325 | mdelay(1); | 1326 | usleep_range(1000, 2000); |
1326 | /* Force Full Duplex */ | 1327 | /* Force Full Duplex */ |
1327 | e1e_rphy(hw, PHY_REG(769, 16), &phy_reg); | 1328 | e1e_rphy(hw, PHY_REG(769, 16), &phy_reg); |
1328 | e1e_wphy(hw, PHY_REG(769, 16), phy_reg | 0x000C); | 1329 | e1e_wphy(hw, PHY_REG(769, 16), phy_reg | 0x000C); |
@@ -1363,7 +1364,7 @@ static int e1000_integrated_phy_loopback(struct e1000_adapter *adapter) | |||
1363 | 1364 | ||
1364 | /* force 1000, set loopback */ | 1365 | /* force 1000, set loopback */ |
1365 | e1e_wphy(hw, MII_BMCR, 0x4140); | 1366 | e1e_wphy(hw, MII_BMCR, 0x4140); |
1366 | mdelay(250); | 1367 | msleep(250); |
1367 | 1368 | ||
1368 | /* Now set up the MAC to the same speed/duplex as the PHY. */ | 1369 | /* Now set up the MAC to the same speed/duplex as the PHY. */ |
1369 | ctrl_reg = er32(CTRL); | 1370 | ctrl_reg = er32(CTRL); |
@@ -1395,7 +1396,7 @@ static int e1000_integrated_phy_loopback(struct e1000_adapter *adapter) | |||
1395 | if (hw->phy.type == e1000_phy_m88) | 1396 | if (hw->phy.type == e1000_phy_m88) |
1396 | e1000_phy_disable_receiver(adapter); | 1397 | e1000_phy_disable_receiver(adapter); |
1397 | 1398 | ||
1398 | udelay(500); | 1399 | usleep_range(500, 1000); |
1399 | 1400 | ||
1400 | return 0; | 1401 | return 0; |
1401 | } | 1402 | } |
@@ -1431,8 +1432,7 @@ static int e1000_set_82571_fiber_loopback(struct e1000_adapter *adapter) | |||
1431 | /* special write to serdes control register to enable SerDes analog | 1432 | /* special write to serdes control register to enable SerDes analog |
1432 | * loopback | 1433 | * loopback |
1433 | */ | 1434 | */ |
1434 | #define E1000_SERDES_LB_ON 0x410 | 1435 | ew32(SCTL, E1000_SCTL_ENABLE_SERDES_LOOPBACK); |
1435 | ew32(SCTL, E1000_SERDES_LB_ON); | ||
1436 | e1e_flush(); | 1436 | e1e_flush(); |
1437 | usleep_range(10000, 20000); | 1437 | usleep_range(10000, 20000); |
1438 | 1438 | ||
@@ -1526,8 +1526,7 @@ static void e1000_loopback_cleanup(struct e1000_adapter *adapter) | |||
1526 | case e1000_82572: | 1526 | case e1000_82572: |
1527 | if (hw->phy.media_type == e1000_media_type_fiber || | 1527 | if (hw->phy.media_type == e1000_media_type_fiber || |
1528 | hw->phy.media_type == e1000_media_type_internal_serdes) { | 1528 | hw->phy.media_type == e1000_media_type_internal_serdes) { |
1529 | #define E1000_SERDES_LB_OFF 0x400 | 1529 | ew32(SCTL, E1000_SCTL_DISABLE_SERDES_LOOPBACK); |
1530 | ew32(SCTL, E1000_SERDES_LB_OFF); | ||
1531 | e1e_flush(); | 1530 | e1e_flush(); |
1532 | usleep_range(10000, 20000); | 1531 | usleep_range(10000, 20000); |
1533 | break; | 1532 | break; |
@@ -1564,7 +1563,7 @@ static int e1000_check_lbtest_frame(struct sk_buff *skb, | |||
1564 | frame_size &= ~1; | 1563 | frame_size &= ~1; |
1565 | if (*(skb->data + 3) == 0xFF) | 1564 | if (*(skb->data + 3) == 0xFF) |
1566 | if ((*(skb->data + frame_size / 2 + 10) == 0xBE) && | 1565 | if ((*(skb->data + frame_size / 2 + 10) == 0xBE) && |
1567 | (*(skb->data + frame_size / 2 + 12) == 0xAF)) | 1566 | (*(skb->data + frame_size / 2 + 12) == 0xAF)) |
1568 | return 0; | 1567 | return 0; |
1569 | return 13; | 1568 | return 13; |
1570 | } | 1569 | } |
@@ -1575,6 +1574,7 @@ static int e1000_run_loopback_test(struct e1000_adapter *adapter) | |||
1575 | struct e1000_ring *rx_ring = &adapter->test_rx_ring; | 1574 | struct e1000_ring *rx_ring = &adapter->test_rx_ring; |
1576 | struct pci_dev *pdev = adapter->pdev; | 1575 | struct pci_dev *pdev = adapter->pdev; |
1577 | struct e1000_hw *hw = &adapter->hw; | 1576 | struct e1000_hw *hw = &adapter->hw; |
1577 | struct e1000_buffer *buffer_info; | ||
1578 | int i, j, k, l; | 1578 | int i, j, k, l; |
1579 | int lc; | 1579 | int lc; |
1580 | int good_cnt; | 1580 | int good_cnt; |
@@ -1595,14 +1595,17 @@ static int e1000_run_loopback_test(struct e1000_adapter *adapter) | |||
1595 | 1595 | ||
1596 | k = 0; | 1596 | k = 0; |
1597 | l = 0; | 1597 | l = 0; |
1598 | for (j = 0; j <= lc; j++) { /* loop count loop */ | 1598 | /* loop count loop */ |
1599 | for (i = 0; i < 64; i++) { /* send the packets */ | 1599 | for (j = 0; j <= lc; j++) { |
1600 | e1000_create_lbtest_frame(tx_ring->buffer_info[k].skb, | 1600 | /* send the packets */ |
1601 | 1024); | 1601 | for (i = 0; i < 64; i++) { |
1602 | buffer_info = &tx_ring->buffer_info[k]; | ||
1603 | |||
1604 | e1000_create_lbtest_frame(buffer_info->skb, 1024); | ||
1602 | dma_sync_single_for_device(&pdev->dev, | 1605 | dma_sync_single_for_device(&pdev->dev, |
1603 | tx_ring->buffer_info[k].dma, | 1606 | buffer_info->dma, |
1604 | tx_ring->buffer_info[k].length, | 1607 | buffer_info->length, |
1605 | DMA_TO_DEVICE); | 1608 | DMA_TO_DEVICE); |
1606 | k++; | 1609 | k++; |
1607 | if (k == tx_ring->count) | 1610 | if (k == tx_ring->count) |
1608 | k = 0; | 1611 | k = 0; |
@@ -1612,13 +1615,16 @@ static int e1000_run_loopback_test(struct e1000_adapter *adapter) | |||
1612 | msleep(200); | 1615 | msleep(200); |
1613 | time = jiffies; /* set the start time for the receive */ | 1616 | time = jiffies; /* set the start time for the receive */ |
1614 | good_cnt = 0; | 1617 | good_cnt = 0; |
1615 | do { /* receive the sent packets */ | 1618 | /* receive the sent packets */ |
1619 | do { | ||
1620 | buffer_info = &rx_ring->buffer_info[l]; | ||
1621 | |||
1616 | dma_sync_single_for_cpu(&pdev->dev, | 1622 | dma_sync_single_for_cpu(&pdev->dev, |
1617 | rx_ring->buffer_info[l].dma, 2048, | 1623 | buffer_info->dma, 2048, |
1618 | DMA_FROM_DEVICE); | 1624 | DMA_FROM_DEVICE); |
1619 | 1625 | ||
1620 | ret_val = e1000_check_lbtest_frame( | 1626 | ret_val = e1000_check_lbtest_frame(buffer_info->skb, |
1621 | rx_ring->buffer_info[l].skb, 1024); | 1627 | 1024); |
1622 | if (!ret_val) | 1628 | if (!ret_val) |
1623 | good_cnt++; | 1629 | good_cnt++; |
1624 | l++; | 1630 | l++; |
@@ -1637,7 +1643,7 @@ static int e1000_run_loopback_test(struct e1000_adapter *adapter) | |||
1637 | ret_val = 14; /* error code for time out error */ | 1643 | ret_val = 14; /* error code for time out error */ |
1638 | break; | 1644 | break; |
1639 | } | 1645 | } |
1640 | } /* end loop count loop */ | 1646 | } |
1641 | return ret_val; | 1647 | return ret_val; |
1642 | } | 1648 | } |
1643 | 1649 | ||
@@ -1696,7 +1702,7 @@ static int e1000_link_test(struct e1000_adapter *adapter, u64 *data) | |||
1696 | /* On some Phy/switch combinations, link establishment | 1702 | /* On some Phy/switch combinations, link establishment |
1697 | * can take a few seconds more than expected. | 1703 | * can take a few seconds more than expected. |
1698 | */ | 1704 | */ |
1699 | msleep(5000); | 1705 | msleep_interruptible(5000); |
1700 | 1706 | ||
1701 | if (!(er32(STATUS) & E1000_STATUS_LU)) | 1707 | if (!(er32(STATUS) & E1000_STATUS_LU)) |
1702 | *data = 1; | 1708 | *data = 1; |
@@ -1980,12 +1986,12 @@ static void e1000_get_ethtool_stats(struct net_device *netdev, | |||
1980 | for (i = 0; i < E1000_GLOBAL_STATS_LEN; i++) { | 1986 | for (i = 0; i < E1000_GLOBAL_STATS_LEN; i++) { |
1981 | switch (e1000_gstrings_stats[i].type) { | 1987 | switch (e1000_gstrings_stats[i].type) { |
1982 | case NETDEV_STATS: | 1988 | case NETDEV_STATS: |
1983 | p = (char *) &net_stats + | 1989 | p = (char *)&net_stats + |
1984 | e1000_gstrings_stats[i].stat_offset; | 1990 | e1000_gstrings_stats[i].stat_offset; |
1985 | break; | 1991 | break; |
1986 | case E1000_STATS: | 1992 | case E1000_STATS: |
1987 | p = (char *) adapter + | 1993 | p = (char *)adapter + |
1988 | e1000_gstrings_stats[i].stat_offset; | 1994 | e1000_gstrings_stats[i].stat_offset; |
1989 | break; | 1995 | break; |
1990 | default: | 1996 | default: |
1991 | data[i] = 0; | 1997 | data[i] = 0; |
@@ -1993,7 +1999,7 @@ static void e1000_get_ethtool_stats(struct net_device *netdev, | |||
1993 | } | 1999 | } |
1994 | 2000 | ||
1995 | data[i] = (e1000_gstrings_stats[i].sizeof_stat == | 2001 | data[i] = (e1000_gstrings_stats[i].sizeof_stat == |
1996 | sizeof(u64)) ? *(u64 *)p : *(u32 *)p; | 2002 | sizeof(u64)) ? *(u64 *)p : *(u32 *)p; |
1997 | } | 2003 | } |
1998 | } | 2004 | } |
1999 | 2005 | ||
@@ -2069,23 +2075,20 @@ static int e1000e_get_eee(struct net_device *netdev, struct ethtool_eee *edata) | |||
2069 | { | 2075 | { |
2070 | struct e1000_adapter *adapter = netdev_priv(netdev); | 2076 | struct e1000_adapter *adapter = netdev_priv(netdev); |
2071 | struct e1000_hw *hw = &adapter->hw; | 2077 | struct e1000_hw *hw = &adapter->hw; |
2072 | u16 cap_addr, adv_addr, lpa_addr, pcs_stat_addr, phy_data, lpi_ctrl; | 2078 | u16 cap_addr, lpa_addr, pcs_stat_addr, phy_data; |
2073 | u32 status, ret_val; | 2079 | u32 ret_val; |
2074 | 2080 | ||
2075 | if (!(adapter->flags & FLAG_IS_ICH) || | 2081 | if (!(adapter->flags2 & FLAG2_HAS_EEE)) |
2076 | !(adapter->flags2 & FLAG2_HAS_EEE)) | ||
2077 | return -EOPNOTSUPP; | 2082 | return -EOPNOTSUPP; |
2078 | 2083 | ||
2079 | switch (hw->phy.type) { | 2084 | switch (hw->phy.type) { |
2080 | case e1000_phy_82579: | 2085 | case e1000_phy_82579: |
2081 | cap_addr = I82579_EEE_CAPABILITY; | 2086 | cap_addr = I82579_EEE_CAPABILITY; |
2082 | adv_addr = I82579_EEE_ADVERTISEMENT; | ||
2083 | lpa_addr = I82579_EEE_LP_ABILITY; | 2087 | lpa_addr = I82579_EEE_LP_ABILITY; |
2084 | pcs_stat_addr = I82579_EEE_PCS_STATUS; | 2088 | pcs_stat_addr = I82579_EEE_PCS_STATUS; |
2085 | break; | 2089 | break; |
2086 | case e1000_phy_i217: | 2090 | case e1000_phy_i217: |
2087 | cap_addr = I217_EEE_CAPABILITY; | 2091 | cap_addr = I217_EEE_CAPABILITY; |
2088 | adv_addr = I217_EEE_ADVERTISEMENT; | ||
2089 | lpa_addr = I217_EEE_LP_ABILITY; | 2092 | lpa_addr = I217_EEE_LP_ABILITY; |
2090 | pcs_stat_addr = I217_EEE_PCS_STATUS; | 2093 | pcs_stat_addr = I217_EEE_PCS_STATUS; |
2091 | break; | 2094 | break; |
@@ -2104,10 +2107,7 @@ static int e1000e_get_eee(struct net_device *netdev, struct ethtool_eee *edata) | |||
2104 | edata->supported = mmd_eee_cap_to_ethtool_sup_t(phy_data); | 2107 | edata->supported = mmd_eee_cap_to_ethtool_sup_t(phy_data); |
2105 | 2108 | ||
2106 | /* EEE Advertised */ | 2109 | /* EEE Advertised */ |
2107 | ret_val = e1000_read_emi_reg_locked(hw, adv_addr, &phy_data); | 2110 | edata->advertised = mmd_eee_adv_to_ethtool_adv_t(adapter->eee_advert); |
2108 | if (ret_val) | ||
2109 | goto release; | ||
2110 | edata->advertised = mmd_eee_adv_to_ethtool_adv_t(phy_data); | ||
2111 | 2111 | ||
2112 | /* EEE Link Partner Advertised */ | 2112 | /* EEE Link Partner Advertised */ |
2113 | ret_val = e1000_read_emi_reg_locked(hw, lpa_addr, &phy_data); | 2113 | ret_val = e1000_read_emi_reg_locked(hw, lpa_addr, &phy_data); |
@@ -2125,25 +2125,11 @@ release: | |||
2125 | if (ret_val) | 2125 | if (ret_val) |
2126 | return -ENODATA; | 2126 | return -ENODATA; |
2127 | 2127 | ||
2128 | e1e_rphy(hw, I82579_LPI_CTRL, &lpi_ctrl); | ||
2129 | status = er32(STATUS); | ||
2130 | |||
2131 | /* Result of the EEE auto negotiation - there is no register that | 2128 | /* Result of the EEE auto negotiation - there is no register that |
2132 | * has the status of the EEE negotiation so do a best-guess based | 2129 | * has the status of the EEE negotiation so do a best-guess based |
2133 | * on whether both Tx and Rx LPI indications have been received or | 2130 | * on whether Tx or Rx LPI indications have been received. |
2134 | * base it on the link speed, the EEE advertised speeds on both ends | ||
2135 | * and the speeds on which EEE is enabled locally. | ||
2136 | */ | 2131 | */ |
2137 | if (((phy_data & E1000_EEE_TX_LPI_RCVD) && | 2132 | if (phy_data & (E1000_EEE_TX_LPI_RCVD | E1000_EEE_RX_LPI_RCVD)) |
2138 | (phy_data & E1000_EEE_RX_LPI_RCVD)) || | ||
2139 | ((status & E1000_STATUS_SPEED_100) && | ||
2140 | (edata->advertised & ADVERTISED_100baseT_Full) && | ||
2141 | (edata->lp_advertised & ADVERTISED_100baseT_Full) && | ||
2142 | (lpi_ctrl & I82579_LPI_CTRL_100_ENABLE)) || | ||
2143 | ((status & E1000_STATUS_SPEED_1000) && | ||
2144 | (edata->advertised & ADVERTISED_1000baseT_Full) && | ||
2145 | (edata->lp_advertised & ADVERTISED_1000baseT_Full) && | ||
2146 | (lpi_ctrl & I82579_LPI_CTRL_1000_ENABLE))) | ||
2147 | edata->eee_active = true; | 2133 | edata->eee_active = true; |
2148 | 2134 | ||
2149 | edata->eee_enabled = !hw->dev_spec.ich8lan.eee_disable; | 2135 | edata->eee_enabled = !hw->dev_spec.ich8lan.eee_disable; |
@@ -2160,19 +2146,10 @@ static int e1000e_set_eee(struct net_device *netdev, struct ethtool_eee *edata) | |||
2160 | struct ethtool_eee eee_curr; | 2146 | struct ethtool_eee eee_curr; |
2161 | s32 ret_val; | 2147 | s32 ret_val; |
2162 | 2148 | ||
2163 | if (!(adapter->flags & FLAG_IS_ICH) || | ||
2164 | !(adapter->flags2 & FLAG2_HAS_EEE)) | ||
2165 | return -EOPNOTSUPP; | ||
2166 | |||
2167 | ret_val = e1000e_get_eee(netdev, &eee_curr); | 2149 | ret_val = e1000e_get_eee(netdev, &eee_curr); |
2168 | if (ret_val) | 2150 | if (ret_val) |
2169 | return ret_val; | 2151 | return ret_val; |
2170 | 2152 | ||
2171 | if (eee_curr.advertised != edata->advertised) { | ||
2172 | e_err("Setting EEE advertisement is not supported\n"); | ||
2173 | return -EINVAL; | ||
2174 | } | ||
2175 | |||
2176 | if (eee_curr.tx_lpi_enabled != edata->tx_lpi_enabled) { | 2153 | if (eee_curr.tx_lpi_enabled != edata->tx_lpi_enabled) { |
2177 | e_err("Setting EEE tx-lpi is not supported\n"); | 2154 | e_err("Setting EEE tx-lpi is not supported\n"); |
2178 | return -EINVAL; | 2155 | return -EINVAL; |
@@ -2183,16 +2160,21 @@ static int e1000e_set_eee(struct net_device *netdev, struct ethtool_eee *edata) | |||
2183 | return -EINVAL; | 2160 | return -EINVAL; |
2184 | } | 2161 | } |
2185 | 2162 | ||
2186 | if (hw->dev_spec.ich8lan.eee_disable != !edata->eee_enabled) { | 2163 | if (edata->advertised & ~(ADVERTISE_100_FULL | ADVERTISE_1000_FULL)) { |
2187 | hw->dev_spec.ich8lan.eee_disable = !edata->eee_enabled; | 2164 | e_err("EEE advertisement supports only 100TX and/or 1000T full-duplex\n"); |
2188 | 2165 | return -EINVAL; | |
2189 | /* reset the link */ | ||
2190 | if (netif_running(netdev)) | ||
2191 | e1000e_reinit_locked(adapter); | ||
2192 | else | ||
2193 | e1000e_reset(adapter); | ||
2194 | } | 2166 | } |
2195 | 2167 | ||
2168 | adapter->eee_advert = ethtool_adv_to_mmd_eee_adv_t(edata->advertised); | ||
2169 | |||
2170 | hw->dev_spec.ich8lan.eee_disable = !edata->eee_enabled; | ||
2171 | |||
2172 | /* reset the link */ | ||
2173 | if (netif_running(netdev)) | ||
2174 | e1000e_reinit_locked(adapter); | ||
2175 | else | ||
2176 | e1000e_reset(adapter); | ||
2177 | |||
2196 | return 0; | 2178 | return 0; |
2197 | } | 2179 | } |
2198 | 2180 | ||