diff options
Diffstat (limited to 'drivers/net/e1000e')
-rw-r--r-- | drivers/net/e1000e/82571.c | 273 | ||||
-rw-r--r-- | drivers/net/e1000e/defines.h | 1 | ||||
-rw-r--r-- | drivers/net/e1000e/e1000.h | 4 | ||||
-rw-r--r-- | drivers/net/e1000e/ethtool.c | 3 | ||||
-rw-r--r-- | drivers/net/e1000e/hw.h | 10 | ||||
-rw-r--r-- | drivers/net/e1000e/ich8lan.c | 17 | ||||
-rw-r--r-- | drivers/net/e1000e/lib.c | 4 | ||||
-rw-r--r-- | drivers/net/e1000e/netdev.c | 225 |
8 files changed, 369 insertions, 168 deletions
diff --git a/drivers/net/e1000e/82571.c b/drivers/net/e1000e/82571.c index 0890162953e9..6c01a2072c87 100644 --- a/drivers/net/e1000e/82571.c +++ b/drivers/net/e1000e/82571.c | |||
@@ -40,6 +40,7 @@ | |||
40 | * 82573E Gigabit Ethernet Controller (Copper) | 40 | * 82573E Gigabit Ethernet Controller (Copper) |
41 | * 82573L Gigabit Ethernet Controller | 41 | * 82573L Gigabit Ethernet Controller |
42 | * 82574L Gigabit Network Connection | 42 | * 82574L Gigabit Network Connection |
43 | * 82583V Gigabit Network Connection | ||
43 | */ | 44 | */ |
44 | 45 | ||
45 | #include <linux/netdevice.h> | 46 | #include <linux/netdevice.h> |
@@ -61,6 +62,7 @@ | |||
61 | static s32 e1000_get_phy_id_82571(struct e1000_hw *hw); | 62 | static s32 e1000_get_phy_id_82571(struct e1000_hw *hw); |
62 | static s32 e1000_setup_copper_link_82571(struct e1000_hw *hw); | 63 | static s32 e1000_setup_copper_link_82571(struct e1000_hw *hw); |
63 | static s32 e1000_setup_fiber_serdes_link_82571(struct e1000_hw *hw); | 64 | static s32 e1000_setup_fiber_serdes_link_82571(struct e1000_hw *hw); |
65 | static s32 e1000_check_for_serdes_link_82571(struct e1000_hw *hw); | ||
64 | static s32 e1000_write_nvm_eewr_82571(struct e1000_hw *hw, u16 offset, | 66 | static s32 e1000_write_nvm_eewr_82571(struct e1000_hw *hw, u16 offset, |
65 | u16 words, u16 *data); | 67 | u16 words, u16 *data); |
66 | static s32 e1000_fix_nvm_checksum_82571(struct e1000_hw *hw); | 68 | static s32 e1000_fix_nvm_checksum_82571(struct e1000_hw *hw); |
@@ -99,6 +101,7 @@ static s32 e1000_init_phy_params_82571(struct e1000_hw *hw) | |||
99 | phy->type = e1000_phy_m88; | 101 | phy->type = e1000_phy_m88; |
100 | break; | 102 | break; |
101 | case e1000_82574: | 103 | case e1000_82574: |
104 | case e1000_82583: | ||
102 | phy->type = e1000_phy_bm; | 105 | phy->type = e1000_phy_bm; |
103 | break; | 106 | break; |
104 | default: | 107 | default: |
@@ -121,6 +124,7 @@ static s32 e1000_init_phy_params_82571(struct e1000_hw *hw) | |||
121 | return -E1000_ERR_PHY; | 124 | return -E1000_ERR_PHY; |
122 | break; | 125 | break; |
123 | case e1000_82574: | 126 | case e1000_82574: |
127 | case e1000_82583: | ||
124 | if (phy->id != BME1000_E_PHY_ID_R2) | 128 | if (phy->id != BME1000_E_PHY_ID_R2) |
125 | return -E1000_ERR_PHY; | 129 | return -E1000_ERR_PHY; |
126 | break; | 130 | break; |
@@ -164,6 +168,7 @@ static s32 e1000_init_nvm_params_82571(struct e1000_hw *hw) | |||
164 | switch (hw->mac.type) { | 168 | switch (hw->mac.type) { |
165 | case e1000_82573: | 169 | case e1000_82573: |
166 | case e1000_82574: | 170 | case e1000_82574: |
171 | case e1000_82583: | ||
167 | if (((eecd >> 15) & 0x3) == 0x3) { | 172 | if (((eecd >> 15) & 0x3) == 0x3) { |
168 | nvm->type = e1000_nvm_flash_hw; | 173 | nvm->type = e1000_nvm_flash_hw; |
169 | nvm->word_size = 2048; | 174 | nvm->word_size = 2048; |
@@ -250,7 +255,7 @@ static s32 e1000_init_mac_params_82571(struct e1000_adapter *adapter) | |||
250 | case e1000_media_type_internal_serdes: | 255 | case e1000_media_type_internal_serdes: |
251 | func->setup_physical_interface = | 256 | func->setup_physical_interface = |
252 | e1000_setup_fiber_serdes_link_82571; | 257 | e1000_setup_fiber_serdes_link_82571; |
253 | func->check_for_link = e1000e_check_for_serdes_link; | 258 | func->check_for_link = e1000_check_for_serdes_link_82571; |
254 | func->get_link_up_info = | 259 | func->get_link_up_info = |
255 | e1000e_get_speed_and_duplex_fiber_serdes; | 260 | e1000e_get_speed_and_duplex_fiber_serdes; |
256 | break; | 261 | break; |
@@ -261,6 +266,7 @@ static s32 e1000_init_mac_params_82571(struct e1000_adapter *adapter) | |||
261 | 266 | ||
262 | switch (hw->mac.type) { | 267 | switch (hw->mac.type) { |
263 | case e1000_82574: | 268 | case e1000_82574: |
269 | case e1000_82583: | ||
264 | func->check_mng_mode = e1000_check_mng_mode_82574; | 270 | func->check_mng_mode = e1000_check_mng_mode_82574; |
265 | func->led_on = e1000_led_on_82574; | 271 | func->led_on = e1000_led_on_82574; |
266 | break; | 272 | break; |
@@ -374,6 +380,7 @@ static s32 e1000_get_phy_id_82571(struct e1000_hw *hw) | |||
374 | return e1000e_get_phy_id(hw); | 380 | return e1000e_get_phy_id(hw); |
375 | break; | 381 | break; |
376 | case e1000_82574: | 382 | case e1000_82574: |
383 | case e1000_82583: | ||
377 | ret_val = e1e_rphy(hw, PHY_ID1, &phy_id); | 384 | ret_val = e1e_rphy(hw, PHY_ID1, &phy_id); |
378 | if (ret_val) | 385 | if (ret_val) |
379 | return ret_val; | 386 | return ret_val; |
@@ -463,8 +470,15 @@ static s32 e1000_acquire_nvm_82571(struct e1000_hw *hw) | |||
463 | if (ret_val) | 470 | if (ret_val) |
464 | return ret_val; | 471 | return ret_val; |
465 | 472 | ||
466 | if (hw->mac.type != e1000_82573 && hw->mac.type != e1000_82574) | 473 | switch (hw->mac.type) { |
474 | case e1000_82573: | ||
475 | case e1000_82574: | ||
476 | case e1000_82583: | ||
477 | break; | ||
478 | default: | ||
467 | ret_val = e1000e_acquire_nvm(hw); | 479 | ret_val = e1000e_acquire_nvm(hw); |
480 | break; | ||
481 | } | ||
468 | 482 | ||
469 | if (ret_val) | 483 | if (ret_val) |
470 | e1000_put_hw_semaphore_82571(hw); | 484 | e1000_put_hw_semaphore_82571(hw); |
@@ -504,6 +518,7 @@ static s32 e1000_write_nvm_82571(struct e1000_hw *hw, u16 offset, u16 words, | |||
504 | switch (hw->mac.type) { | 518 | switch (hw->mac.type) { |
505 | case e1000_82573: | 519 | case e1000_82573: |
506 | case e1000_82574: | 520 | case e1000_82574: |
521 | case e1000_82583: | ||
507 | ret_val = e1000_write_nvm_eewr_82571(hw, offset, words, data); | 522 | ret_val = e1000_write_nvm_eewr_82571(hw, offset, words, data); |
508 | break; | 523 | break; |
509 | case e1000_82571: | 524 | case e1000_82571: |
@@ -778,7 +793,10 @@ static s32 e1000_reset_hw_82571(struct e1000_hw *hw) | |||
778 | * Must acquire the MDIO ownership before MAC reset. | 793 | * Must acquire the MDIO ownership before MAC reset. |
779 | * Ownership defaults to firmware after a reset. | 794 | * Ownership defaults to firmware after a reset. |
780 | */ | 795 | */ |
781 | if (hw->mac.type == e1000_82573 || hw->mac.type == e1000_82574) { | 796 | switch (hw->mac.type) { |
797 | case e1000_82573: | ||
798 | case e1000_82574: | ||
799 | case e1000_82583: | ||
782 | extcnf_ctrl = er32(EXTCNF_CTRL); | 800 | extcnf_ctrl = er32(EXTCNF_CTRL); |
783 | extcnf_ctrl |= E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP; | 801 | extcnf_ctrl |= E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP; |
784 | 802 | ||
@@ -794,6 +812,9 @@ static s32 e1000_reset_hw_82571(struct e1000_hw *hw) | |||
794 | msleep(2); | 812 | msleep(2); |
795 | i++; | 813 | i++; |
796 | } while (i < MDIO_OWNERSHIP_TIMEOUT); | 814 | } while (i < MDIO_OWNERSHIP_TIMEOUT); |
815 | break; | ||
816 | default: | ||
817 | break; | ||
797 | } | 818 | } |
798 | 819 | ||
799 | ctrl = er32(CTRL); | 820 | ctrl = er32(CTRL); |
@@ -819,8 +840,16 @@ static s32 e1000_reset_hw_82571(struct e1000_hw *hw) | |||
819 | * Need to wait for Phy configuration completion before accessing | 840 | * Need to wait for Phy configuration completion before accessing |
820 | * NVM and Phy. | 841 | * NVM and Phy. |
821 | */ | 842 | */ |
822 | if (hw->mac.type == e1000_82573 || hw->mac.type == e1000_82574) | 843 | |
844 | switch (hw->mac.type) { | ||
845 | case e1000_82573: | ||
846 | case e1000_82574: | ||
847 | case e1000_82583: | ||
823 | msleep(25); | 848 | msleep(25); |
849 | break; | ||
850 | default: | ||
851 | break; | ||
852 | } | ||
824 | 853 | ||
825 | /* Clear any pending interrupt events. */ | 854 | /* Clear any pending interrupt events. */ |
826 | ew32(IMC, 0xffffffff); | 855 | ew32(IMC, 0xffffffff); |
@@ -830,6 +859,10 @@ static s32 e1000_reset_hw_82571(struct e1000_hw *hw) | |||
830 | hw->dev_spec.e82571.alt_mac_addr_is_present) | 859 | hw->dev_spec.e82571.alt_mac_addr_is_present) |
831 | e1000e_set_laa_state_82571(hw, true); | 860 | e1000e_set_laa_state_82571(hw, true); |
832 | 861 | ||
862 | /* Reinitialize the 82571 serdes link state machine */ | ||
863 | if (hw->phy.media_type == e1000_media_type_internal_serdes) | ||
864 | hw->mac.serdes_link_state = e1000_serdes_link_down; | ||
865 | |||
833 | return 0; | 866 | return 0; |
834 | } | 867 | } |
835 | 868 | ||
@@ -886,17 +919,22 @@ static s32 e1000_init_hw_82571(struct e1000_hw *hw) | |||
886 | ew32(TXDCTL(0), reg_data); | 919 | ew32(TXDCTL(0), reg_data); |
887 | 920 | ||
888 | /* ...for both queues. */ | 921 | /* ...for both queues. */ |
889 | if (mac->type != e1000_82573 && mac->type != e1000_82574) { | 922 | switch (mac->type) { |
923 | case e1000_82573: | ||
924 | case e1000_82574: | ||
925 | case e1000_82583: | ||
926 | e1000e_enable_tx_pkt_filtering(hw); | ||
927 | reg_data = er32(GCR); | ||
928 | reg_data |= E1000_GCR_L1_ACT_WITHOUT_L0S_RX; | ||
929 | ew32(GCR, reg_data); | ||
930 | break; | ||
931 | default: | ||
890 | reg_data = er32(TXDCTL(1)); | 932 | reg_data = er32(TXDCTL(1)); |
891 | reg_data = (reg_data & ~E1000_TXDCTL_WTHRESH) | | 933 | reg_data = (reg_data & ~E1000_TXDCTL_WTHRESH) | |
892 | E1000_TXDCTL_FULL_TX_DESC_WB | | 934 | E1000_TXDCTL_FULL_TX_DESC_WB | |
893 | E1000_TXDCTL_COUNT_DESC; | 935 | E1000_TXDCTL_COUNT_DESC; |
894 | ew32(TXDCTL(1), reg_data); | 936 | ew32(TXDCTL(1), reg_data); |
895 | } else { | 937 | break; |
896 | e1000e_enable_tx_pkt_filtering(hw); | ||
897 | reg_data = er32(GCR); | ||
898 | reg_data |= E1000_GCR_L1_ACT_WITHOUT_L0S_RX; | ||
899 | ew32(GCR, reg_data); | ||
900 | } | 938 | } |
901 | 939 | ||
902 | /* | 940 | /* |
@@ -961,18 +999,30 @@ static void e1000_initialize_hw_bits_82571(struct e1000_hw *hw) | |||
961 | } | 999 | } |
962 | 1000 | ||
963 | /* Device Control */ | 1001 | /* Device Control */ |
964 | if (hw->mac.type == e1000_82573 || hw->mac.type == e1000_82574) { | 1002 | switch (hw->mac.type) { |
1003 | case e1000_82573: | ||
1004 | case e1000_82574: | ||
1005 | case e1000_82583: | ||
965 | reg = er32(CTRL); | 1006 | reg = er32(CTRL); |
966 | reg &= ~(1 << 29); | 1007 | reg &= ~(1 << 29); |
967 | ew32(CTRL, reg); | 1008 | ew32(CTRL, reg); |
1009 | break; | ||
1010 | default: | ||
1011 | break; | ||
968 | } | 1012 | } |
969 | 1013 | ||
970 | /* Extended Device Control */ | 1014 | /* Extended Device Control */ |
971 | if (hw->mac.type == e1000_82573 || hw->mac.type == e1000_82574) { | 1015 | switch (hw->mac.type) { |
1016 | case e1000_82573: | ||
1017 | case e1000_82574: | ||
1018 | case e1000_82583: | ||
972 | reg = er32(CTRL_EXT); | 1019 | reg = er32(CTRL_EXT); |
973 | reg &= ~(1 << 23); | 1020 | reg &= ~(1 << 23); |
974 | reg |= (1 << 22); | 1021 | reg |= (1 << 22); |
975 | ew32(CTRL_EXT, reg); | 1022 | ew32(CTRL_EXT, reg); |
1023 | break; | ||
1024 | default: | ||
1025 | break; | ||
976 | } | 1026 | } |
977 | 1027 | ||
978 | if (hw->mac.type == e1000_82571) { | 1028 | if (hw->mac.type == e1000_82571) { |
@@ -980,9 +1030,23 @@ static void e1000_initialize_hw_bits_82571(struct e1000_hw *hw) | |||
980 | reg |= E1000_PBA_ECC_CORR_EN; | 1030 | reg |= E1000_PBA_ECC_CORR_EN; |
981 | ew32(PBA_ECC, reg); | 1031 | ew32(PBA_ECC, reg); |
982 | } | 1032 | } |
1033 | /* | ||
1034 | * Workaround for hardware errata. | ||
1035 | * Ensure that DMA Dynamic Clock gating is disabled on 82571 and 82572 | ||
1036 | */ | ||
1037 | |||
1038 | if ((hw->mac.type == e1000_82571) || | ||
1039 | (hw->mac.type == e1000_82572)) { | ||
1040 | reg = er32(CTRL_EXT); | ||
1041 | reg &= ~E1000_CTRL_EXT_DMA_DYN_CLK_EN; | ||
1042 | ew32(CTRL_EXT, reg); | ||
1043 | } | ||
1044 | |||
983 | 1045 | ||
984 | /* PCI-Ex Control Registers */ | 1046 | /* PCI-Ex Control Registers */ |
985 | if (hw->mac.type == e1000_82574) { | 1047 | switch (hw->mac.type) { |
1048 | case e1000_82574: | ||
1049 | case e1000_82583: | ||
986 | reg = er32(GCR); | 1050 | reg = er32(GCR); |
987 | reg |= (1 << 22); | 1051 | reg |= (1 << 22); |
988 | ew32(GCR, reg); | 1052 | ew32(GCR, reg); |
@@ -990,6 +1054,9 @@ static void e1000_initialize_hw_bits_82571(struct e1000_hw *hw) | |||
990 | reg = er32(GCR2); | 1054 | reg = er32(GCR2); |
991 | reg |= 1; | 1055 | reg |= 1; |
992 | ew32(GCR2, reg); | 1056 | ew32(GCR2, reg); |
1057 | break; | ||
1058 | default: | ||
1059 | break; | ||
993 | } | 1060 | } |
994 | 1061 | ||
995 | return; | 1062 | return; |
@@ -1009,7 +1076,10 @@ void e1000e_clear_vfta(struct e1000_hw *hw) | |||
1009 | u32 vfta_offset = 0; | 1076 | u32 vfta_offset = 0; |
1010 | u32 vfta_bit_in_reg = 0; | 1077 | u32 vfta_bit_in_reg = 0; |
1011 | 1078 | ||
1012 | if (hw->mac.type == e1000_82573 || hw->mac.type == e1000_82574) { | 1079 | switch (hw->mac.type) { |
1080 | case e1000_82573: | ||
1081 | case e1000_82574: | ||
1082 | case e1000_82583: | ||
1013 | if (hw->mng_cookie.vlan_id != 0) { | 1083 | if (hw->mng_cookie.vlan_id != 0) { |
1014 | /* | 1084 | /* |
1015 | * The VFTA is a 4096b bit-field, each identifying | 1085 | * The VFTA is a 4096b bit-field, each identifying |
@@ -1024,6 +1094,9 @@ void e1000e_clear_vfta(struct e1000_hw *hw) | |||
1024 | vfta_bit_in_reg = 1 << (hw->mng_cookie.vlan_id & | 1094 | vfta_bit_in_reg = 1 << (hw->mng_cookie.vlan_id & |
1025 | E1000_VFTA_ENTRY_BIT_SHIFT_MASK); | 1095 | E1000_VFTA_ENTRY_BIT_SHIFT_MASK); |
1026 | } | 1096 | } |
1097 | break; | ||
1098 | default: | ||
1099 | break; | ||
1027 | } | 1100 | } |
1028 | for (offset = 0; offset < E1000_VLAN_FILTER_TBL_SIZE; offset++) { | 1101 | for (offset = 0; offset < E1000_VLAN_FILTER_TBL_SIZE; offset++) { |
1029 | /* | 1102 | /* |
@@ -1122,9 +1195,16 @@ static s32 e1000_setup_link_82571(struct e1000_hw *hw) | |||
1122 | * the default flow control setting, so we explicitly | 1195 | * the default flow control setting, so we explicitly |
1123 | * set it to full. | 1196 | * set it to full. |
1124 | */ | 1197 | */ |
1125 | if ((hw->mac.type == e1000_82573 || hw->mac.type == e1000_82574) && | 1198 | switch (hw->mac.type) { |
1126 | hw->fc.requested_mode == e1000_fc_default) | 1199 | case e1000_82573: |
1127 | hw->fc.requested_mode = e1000_fc_full; | 1200 | case e1000_82574: |
1201 | case e1000_82583: | ||
1202 | if (hw->fc.requested_mode == e1000_fc_default) | ||
1203 | hw->fc.requested_mode = e1000_fc_full; | ||
1204 | break; | ||
1205 | default: | ||
1206 | break; | ||
1207 | } | ||
1128 | 1208 | ||
1129 | return e1000e_setup_link(hw); | 1209 | return e1000e_setup_link(hw); |
1130 | } | 1210 | } |
@@ -1203,6 +1283,131 @@ static s32 e1000_setup_fiber_serdes_link_82571(struct e1000_hw *hw) | |||
1203 | } | 1283 | } |
1204 | 1284 | ||
1205 | /** | 1285 | /** |
1286 | * e1000_check_for_serdes_link_82571 - Check for link (Serdes) | ||
1287 | * @hw: pointer to the HW structure | ||
1288 | * | ||
1289 | * Checks for link up on the hardware. If link is not up and we have | ||
1290 | * a signal, then we need to force link up. | ||
1291 | **/ | ||
1292 | static s32 e1000_check_for_serdes_link_82571(struct e1000_hw *hw) | ||
1293 | { | ||
1294 | struct e1000_mac_info *mac = &hw->mac; | ||
1295 | u32 rxcw; | ||
1296 | u32 ctrl; | ||
1297 | u32 status; | ||
1298 | s32 ret_val = 0; | ||
1299 | |||
1300 | ctrl = er32(CTRL); | ||
1301 | status = er32(STATUS); | ||
1302 | rxcw = er32(RXCW); | ||
1303 | |||
1304 | if ((rxcw & E1000_RXCW_SYNCH) && !(rxcw & E1000_RXCW_IV)) { | ||
1305 | |||
1306 | /* Receiver is synchronized with no invalid bits. */ | ||
1307 | switch (mac->serdes_link_state) { | ||
1308 | case e1000_serdes_link_autoneg_complete: | ||
1309 | if (!(status & E1000_STATUS_LU)) { | ||
1310 | /* | ||
1311 | * We have lost link, retry autoneg before | ||
1312 | * reporting link failure | ||
1313 | */ | ||
1314 | mac->serdes_link_state = | ||
1315 | e1000_serdes_link_autoneg_progress; | ||
1316 | hw_dbg(hw, "AN_UP -> AN_PROG\n"); | ||
1317 | } | ||
1318 | break; | ||
1319 | |||
1320 | case e1000_serdes_link_forced_up: | ||
1321 | /* | ||
1322 | * If we are receiving /C/ ordered sets, re-enable | ||
1323 | * auto-negotiation in the TXCW register and disable | ||
1324 | * forced link in the Device Control register in an | ||
1325 | * attempt to auto-negotiate with our link partner. | ||
1326 | */ | ||
1327 | if (rxcw & E1000_RXCW_C) { | ||
1328 | /* Enable autoneg, and unforce link up */ | ||
1329 | ew32(TXCW, mac->txcw); | ||
1330 | ew32(CTRL, | ||
1331 | (ctrl & ~E1000_CTRL_SLU)); | ||
1332 | mac->serdes_link_state = | ||
1333 | e1000_serdes_link_autoneg_progress; | ||
1334 | hw_dbg(hw, "FORCED_UP -> AN_PROG\n"); | ||
1335 | } | ||
1336 | break; | ||
1337 | |||
1338 | case e1000_serdes_link_autoneg_progress: | ||
1339 | /* | ||
1340 | * If the LU bit is set in the STATUS register, | ||
1341 | * autoneg has completed sucessfully. If not, | ||
1342 | * try foring the link because the far end may be | ||
1343 | * available but not capable of autonegotiation. | ||
1344 | */ | ||
1345 | if (status & E1000_STATUS_LU) { | ||
1346 | mac->serdes_link_state = | ||
1347 | e1000_serdes_link_autoneg_complete; | ||
1348 | hw_dbg(hw, "AN_PROG -> AN_UP\n"); | ||
1349 | } else { | ||
1350 | /* | ||
1351 | * Disable autoneg, force link up and | ||
1352 | * full duplex, and change state to forced | ||
1353 | */ | ||
1354 | ew32(TXCW, | ||
1355 | (mac->txcw & ~E1000_TXCW_ANE)); | ||
1356 | ctrl |= (E1000_CTRL_SLU | E1000_CTRL_FD); | ||
1357 | ew32(CTRL, ctrl); | ||
1358 | |||
1359 | /* Configure Flow Control after link up. */ | ||
1360 | ret_val = | ||
1361 | e1000e_config_fc_after_link_up(hw); | ||
1362 | if (ret_val) { | ||
1363 | hw_dbg(hw, "Error config flow control\n"); | ||
1364 | break; | ||
1365 | } | ||
1366 | mac->serdes_link_state = | ||
1367 | e1000_serdes_link_forced_up; | ||
1368 | hw_dbg(hw, "AN_PROG -> FORCED_UP\n"); | ||
1369 | } | ||
1370 | mac->serdes_has_link = true; | ||
1371 | break; | ||
1372 | |||
1373 | case e1000_serdes_link_down: | ||
1374 | default: | ||
1375 | /* The link was down but the receiver has now gained | ||
1376 | * valid sync, so lets see if we can bring the link | ||
1377 | * up. */ | ||
1378 | ew32(TXCW, mac->txcw); | ||
1379 | ew32(CTRL, | ||
1380 | (ctrl & ~E1000_CTRL_SLU)); | ||
1381 | mac->serdes_link_state = | ||
1382 | e1000_serdes_link_autoneg_progress; | ||
1383 | hw_dbg(hw, "DOWN -> AN_PROG\n"); | ||
1384 | break; | ||
1385 | } | ||
1386 | } else { | ||
1387 | if (!(rxcw & E1000_RXCW_SYNCH)) { | ||
1388 | mac->serdes_has_link = false; | ||
1389 | mac->serdes_link_state = e1000_serdes_link_down; | ||
1390 | hw_dbg(hw, "ANYSTATE -> DOWN\n"); | ||
1391 | } else { | ||
1392 | /* | ||
1393 | * We have sync, and can tolerate one | ||
1394 | * invalid (IV) codeword before declaring | ||
1395 | * link down, so reread to look again | ||
1396 | */ | ||
1397 | udelay(10); | ||
1398 | rxcw = er32(RXCW); | ||
1399 | if (rxcw & E1000_RXCW_IV) { | ||
1400 | mac->serdes_link_state = e1000_serdes_link_down; | ||
1401 | mac->serdes_has_link = false; | ||
1402 | hw_dbg(hw, "ANYSTATE -> DOWN\n"); | ||
1403 | } | ||
1404 | } | ||
1405 | } | ||
1406 | |||
1407 | return ret_val; | ||
1408 | } | ||
1409 | |||
1410 | /** | ||
1206 | * e1000_valid_led_default_82571 - Verify a valid default LED config | 1411 | * e1000_valid_led_default_82571 - Verify a valid default LED config |
1207 | * @hw: pointer to the HW structure | 1412 | * @hw: pointer to the HW structure |
1208 | * @data: pointer to the NVM (EEPROM) | 1413 | * @data: pointer to the NVM (EEPROM) |
@@ -1220,11 +1425,19 @@ static s32 e1000_valid_led_default_82571(struct e1000_hw *hw, u16 *data) | |||
1220 | return ret_val; | 1425 | return ret_val; |
1221 | } | 1426 | } |
1222 | 1427 | ||
1223 | if ((hw->mac.type == e1000_82573 || hw->mac.type == e1000_82574) && | 1428 | switch (hw->mac.type) { |
1224 | *data == ID_LED_RESERVED_F746) | 1429 | case e1000_82573: |
1225 | *data = ID_LED_DEFAULT_82573; | 1430 | case e1000_82574: |
1226 | else if (*data == ID_LED_RESERVED_0000 || *data == ID_LED_RESERVED_FFFF) | 1431 | case e1000_82583: |
1227 | *data = ID_LED_DEFAULT; | 1432 | if (*data == ID_LED_RESERVED_F746) |
1433 | *data = ID_LED_DEFAULT_82573; | ||
1434 | break; | ||
1435 | default: | ||
1436 | if (*data == ID_LED_RESERVED_0000 || | ||
1437 | *data == ID_LED_RESERVED_FFFF) | ||
1438 | *data = ID_LED_DEFAULT; | ||
1439 | break; | ||
1440 | } | ||
1228 | 1441 | ||
1229 | return 0; | 1442 | return 0; |
1230 | } | 1443 | } |
@@ -1517,3 +1730,19 @@ struct e1000_info e1000_82574_info = { | |||
1517 | .nvm_ops = &e82571_nvm_ops, | 1730 | .nvm_ops = &e82571_nvm_ops, |
1518 | }; | 1731 | }; |
1519 | 1732 | ||
1733 | struct e1000_info e1000_82583_info = { | ||
1734 | .mac = e1000_82583, | ||
1735 | .flags = FLAG_HAS_HW_VLAN_FILTER | ||
1736 | | FLAG_HAS_WOL | ||
1737 | | FLAG_APME_IN_CTRL3 | ||
1738 | | FLAG_RX_CSUM_ENABLED | ||
1739 | | FLAG_HAS_SMART_POWER_DOWN | ||
1740 | | FLAG_HAS_AMT | ||
1741 | | FLAG_HAS_CTRLEXT_ON_LOAD, | ||
1742 | .pba = 20, | ||
1743 | .get_variants = e1000_get_variants_82571, | ||
1744 | .mac_ops = &e82571_mac_ops, | ||
1745 | .phy_ops = &e82_phy_ops_bm, | ||
1746 | .nvm_ops = &e82571_nvm_ops, | ||
1747 | }; | ||
1748 | |||
diff --git a/drivers/net/e1000e/defines.h b/drivers/net/e1000e/defines.h index e6caf29d4252..243aa499fe90 100644 --- a/drivers/net/e1000e/defines.h +++ b/drivers/net/e1000e/defines.h | |||
@@ -69,6 +69,7 @@ | |||
69 | #define E1000_CTRL_EXT_SDP7_DATA 0x00000080 /* Value of SW Definable Pin 7 */ | 69 | #define E1000_CTRL_EXT_SDP7_DATA 0x00000080 /* Value of SW Definable Pin 7 */ |
70 | #define E1000_CTRL_EXT_EE_RST 0x00002000 /* Reinitialize from EEPROM */ | 70 | #define E1000_CTRL_EXT_EE_RST 0x00002000 /* Reinitialize from EEPROM */ |
71 | #define E1000_CTRL_EXT_RO_DIS 0x00020000 /* Relaxed Ordering disable */ | 71 | #define E1000_CTRL_EXT_RO_DIS 0x00020000 /* Relaxed Ordering disable */ |
72 | #define E1000_CTRL_EXT_DMA_DYN_CLK_EN 0x00080000 /* DMA Dynamic Clock Gating */ | ||
72 | #define E1000_CTRL_EXT_LINK_MODE_MASK 0x00C00000 | 73 | #define E1000_CTRL_EXT_LINK_MODE_MASK 0x00C00000 |
73 | #define E1000_CTRL_EXT_LINK_MODE_PCIE_SERDES 0x00C00000 | 74 | #define E1000_CTRL_EXT_LINK_MODE_PCIE_SERDES 0x00C00000 |
74 | #define E1000_CTRL_EXT_EIAME 0x01000000 | 75 | #define E1000_CTRL_EXT_EIAME 0x01000000 |
diff --git a/drivers/net/e1000e/e1000.h b/drivers/net/e1000e/e1000.h index 37bcb190eef8..f37360aa12a8 100644 --- a/drivers/net/e1000e/e1000.h +++ b/drivers/net/e1000e/e1000.h | |||
@@ -101,6 +101,7 @@ enum e1000_boards { | |||
101 | board_82572, | 101 | board_82572, |
102 | board_82573, | 102 | board_82573, |
103 | board_82574, | 103 | board_82574, |
104 | board_82583, | ||
104 | board_80003es2lan, | 105 | board_80003es2lan, |
105 | board_ich8lan, | 106 | board_ich8lan, |
106 | board_ich9lan, | 107 | board_ich9lan, |
@@ -195,8 +196,6 @@ struct e1000_adapter { | |||
195 | u16 link_duplex; | 196 | u16 link_duplex; |
196 | u16 eeprom_vers; | 197 | u16 eeprom_vers; |
197 | 198 | ||
198 | spinlock_t tx_queue_lock; /* prevent concurrent tail updates */ | ||
199 | |||
200 | /* track device up/down/testing state */ | 199 | /* track device up/down/testing state */ |
201 | unsigned long state; | 200 | unsigned long state; |
202 | 201 | ||
@@ -401,6 +400,7 @@ extern struct e1000_info e1000_82571_info; | |||
401 | extern struct e1000_info e1000_82572_info; | 400 | extern struct e1000_info e1000_82572_info; |
402 | extern struct e1000_info e1000_82573_info; | 401 | extern struct e1000_info e1000_82573_info; |
403 | extern struct e1000_info e1000_82574_info; | 402 | extern struct e1000_info e1000_82574_info; |
403 | extern struct e1000_info e1000_82583_info; | ||
404 | extern struct e1000_info e1000_ich8_info; | 404 | extern struct e1000_info e1000_ich8_info; |
405 | extern struct e1000_info e1000_ich9_info; | 405 | extern struct e1000_info e1000_ich9_info; |
406 | extern struct e1000_info e1000_ich10_info; | 406 | extern struct e1000_info e1000_ich10_info; |
diff --git a/drivers/net/e1000e/ethtool.c b/drivers/net/e1000e/ethtool.c index e48956d924b0..4d25ede88369 100644 --- a/drivers/net/e1000e/ethtool.c +++ b/drivers/net/e1000e/ethtool.c | |||
@@ -790,6 +790,7 @@ static int e1000_reg_test(struct e1000_adapter *adapter, u64 *data) | |||
790 | break; | 790 | break; |
791 | case e1000_82573: | 791 | case e1000_82573: |
792 | case e1000_82574: | 792 | case e1000_82574: |
793 | case e1000_82583: | ||
793 | case e1000_ich8lan: | 794 | case e1000_ich8lan: |
794 | case e1000_ich9lan: | 795 | case e1000_ich9lan: |
795 | case e1000_ich10lan: | 796 | case e1000_ich10lan: |
@@ -1589,7 +1590,7 @@ static int e1000_link_test(struct e1000_adapter *adapter, u64 *data) | |||
1589 | *data = 0; | 1590 | *data = 0; |
1590 | if (hw->phy.media_type == e1000_media_type_internal_serdes) { | 1591 | if (hw->phy.media_type == e1000_media_type_internal_serdes) { |
1591 | int i = 0; | 1592 | int i = 0; |
1592 | hw->mac.serdes_has_link = 0; | 1593 | hw->mac.serdes_has_link = false; |
1593 | 1594 | ||
1594 | /* | 1595 | /* |
1595 | * On some blade server designs, link establishment | 1596 | * On some blade server designs, link establishment |
diff --git a/drivers/net/e1000e/hw.h b/drivers/net/e1000e/hw.h index 2d4ce0492df0..11a2f203a01c 100644 --- a/drivers/net/e1000e/hw.h +++ b/drivers/net/e1000e/hw.h | |||
@@ -339,6 +339,7 @@ enum e1e_registers { | |||
339 | #define E1000_DEV_ID_82573E_IAMT 0x108C | 339 | #define E1000_DEV_ID_82573E_IAMT 0x108C |
340 | #define E1000_DEV_ID_82573L 0x109A | 340 | #define E1000_DEV_ID_82573L 0x109A |
341 | #define E1000_DEV_ID_82574L 0x10D3 | 341 | #define E1000_DEV_ID_82574L 0x10D3 |
342 | #define E1000_DEV_ID_82583V 0x150C | ||
342 | 343 | ||
343 | #define E1000_DEV_ID_80003ES2LAN_COPPER_DPT 0x1096 | 344 | #define E1000_DEV_ID_80003ES2LAN_COPPER_DPT 0x1096 |
344 | #define E1000_DEV_ID_80003ES2LAN_SERDES_DPT 0x1098 | 345 | #define E1000_DEV_ID_80003ES2LAN_SERDES_DPT 0x1098 |
@@ -376,6 +377,7 @@ enum e1000_mac_type { | |||
376 | e1000_82572, | 377 | e1000_82572, |
377 | e1000_82573, | 378 | e1000_82573, |
378 | e1000_82574, | 379 | e1000_82574, |
380 | e1000_82583, | ||
379 | e1000_80003es2lan, | 381 | e1000_80003es2lan, |
380 | e1000_ich8lan, | 382 | e1000_ich8lan, |
381 | e1000_ich9lan, | 383 | e1000_ich9lan, |
@@ -459,6 +461,13 @@ enum e1000_smart_speed { | |||
459 | e1000_smart_speed_off | 461 | e1000_smart_speed_off |
460 | }; | 462 | }; |
461 | 463 | ||
464 | enum e1000_serdes_link_state { | ||
465 | e1000_serdes_link_down = 0, | ||
466 | e1000_serdes_link_autoneg_progress, | ||
467 | e1000_serdes_link_autoneg_complete, | ||
468 | e1000_serdes_link_forced_up | ||
469 | }; | ||
470 | |||
462 | /* Receive Descriptor */ | 471 | /* Receive Descriptor */ |
463 | struct e1000_rx_desc { | 472 | struct e1000_rx_desc { |
464 | __le64 buffer_addr; /* Address of the descriptor's data buffer */ | 473 | __le64 buffer_addr; /* Address of the descriptor's data buffer */ |
@@ -787,6 +796,7 @@ struct e1000_mac_info { | |||
787 | bool in_ifs_mode; | 796 | bool in_ifs_mode; |
788 | bool serdes_has_link; | 797 | bool serdes_has_link; |
789 | bool tx_pkt_filtering; | 798 | bool tx_pkt_filtering; |
799 | enum e1000_serdes_link_state serdes_link_state; | ||
790 | }; | 800 | }; |
791 | 801 | ||
792 | struct e1000_phy_info { | 802 | struct e1000_phy_info { |
diff --git a/drivers/net/e1000e/ich8lan.c b/drivers/net/e1000e/ich8lan.c index e415e81ecd3e..6d1aab6316ba 100644 --- a/drivers/net/e1000e/ich8lan.c +++ b/drivers/net/e1000e/ich8lan.c | |||
@@ -390,8 +390,6 @@ static s32 e1000_get_variants_ich8lan(struct e1000_adapter *adapter) | |||
390 | } | 390 | } |
391 | 391 | ||
392 | static DEFINE_MUTEX(nvm_mutex); | 392 | static DEFINE_MUTEX(nvm_mutex); |
393 | static pid_t nvm_owner_pid = -1; | ||
394 | static char nvm_owner_name[TASK_COMM_LEN] = ""; | ||
395 | 393 | ||
396 | /** | 394 | /** |
397 | * e1000_acquire_swflag_ich8lan - Acquire software control flag | 395 | * e1000_acquire_swflag_ich8lan - Acquire software control flag |
@@ -408,16 +406,7 @@ static s32 e1000_acquire_swflag_ich8lan(struct e1000_hw *hw) | |||
408 | 406 | ||
409 | might_sleep(); | 407 | might_sleep(); |
410 | 408 | ||
411 | if (!mutex_trylock(&nvm_mutex)) { | 409 | mutex_lock(&nvm_mutex); |
412 | WARN(1, KERN_ERR "e1000e mutex contention. Owned by process " | ||
413 | "%s (pid %d), required by process %s (pid %d)\n", | ||
414 | nvm_owner_name, nvm_owner_pid, | ||
415 | current->comm, current->pid); | ||
416 | |||
417 | mutex_lock(&nvm_mutex); | ||
418 | } | ||
419 | nvm_owner_pid = current->pid; | ||
420 | strncpy(nvm_owner_name, current->comm, TASK_COMM_LEN); | ||
421 | 410 | ||
422 | while (timeout) { | 411 | while (timeout) { |
423 | extcnf_ctrl = er32(EXTCNF_CTRL); | 412 | extcnf_ctrl = er32(EXTCNF_CTRL); |
@@ -435,8 +424,6 @@ static s32 e1000_acquire_swflag_ich8lan(struct e1000_hw *hw) | |||
435 | hw_dbg(hw, "FW or HW has locked the resource for too long.\n"); | 424 | hw_dbg(hw, "FW or HW has locked the resource for too long.\n"); |
436 | extcnf_ctrl &= ~E1000_EXTCNF_CTRL_SWFLAG; | 425 | extcnf_ctrl &= ~E1000_EXTCNF_CTRL_SWFLAG; |
437 | ew32(EXTCNF_CTRL, extcnf_ctrl); | 426 | ew32(EXTCNF_CTRL, extcnf_ctrl); |
438 | nvm_owner_pid = -1; | ||
439 | strcpy(nvm_owner_name, ""); | ||
440 | mutex_unlock(&nvm_mutex); | 427 | mutex_unlock(&nvm_mutex); |
441 | return -E1000_ERR_CONFIG; | 428 | return -E1000_ERR_CONFIG; |
442 | } | 429 | } |
@@ -460,8 +447,6 @@ static void e1000_release_swflag_ich8lan(struct e1000_hw *hw) | |||
460 | extcnf_ctrl &= ~E1000_EXTCNF_CTRL_SWFLAG; | 447 | extcnf_ctrl &= ~E1000_EXTCNF_CTRL_SWFLAG; |
461 | ew32(EXTCNF_CTRL, extcnf_ctrl); | 448 | ew32(EXTCNF_CTRL, extcnf_ctrl); |
462 | 449 | ||
463 | nvm_owner_pid = -1; | ||
464 | strcpy(nvm_owner_name, ""); | ||
465 | mutex_unlock(&nvm_mutex); | 450 | mutex_unlock(&nvm_mutex); |
466 | } | 451 | } |
467 | 452 | ||
diff --git a/drivers/net/e1000e/lib.c b/drivers/net/e1000e/lib.c index 66741104ffd1..ac2f34e1836d 100644 --- a/drivers/net/e1000e/lib.c +++ b/drivers/net/e1000e/lib.c | |||
@@ -501,7 +501,7 @@ s32 e1000e_check_for_fiber_link(struct e1000_hw *hw) | |||
501 | ew32(TXCW, mac->txcw); | 501 | ew32(TXCW, mac->txcw); |
502 | ew32(CTRL, (ctrl & ~E1000_CTRL_SLU)); | 502 | ew32(CTRL, (ctrl & ~E1000_CTRL_SLU)); |
503 | 503 | ||
504 | mac->serdes_has_link = 1; | 504 | mac->serdes_has_link = true; |
505 | } | 505 | } |
506 | 506 | ||
507 | return 0; | 507 | return 0; |
@@ -566,7 +566,7 @@ s32 e1000e_check_for_serdes_link(struct e1000_hw *hw) | |||
566 | ew32(TXCW, mac->txcw); | 566 | ew32(TXCW, mac->txcw); |
567 | ew32(CTRL, (ctrl & ~E1000_CTRL_SLU)); | 567 | ew32(CTRL, (ctrl & ~E1000_CTRL_SLU)); |
568 | 568 | ||
569 | mac->serdes_has_link = 1; | 569 | mac->serdes_has_link = true; |
570 | } else if (!(E1000_TXCW_ANE & er32(TXCW))) { | 570 | } else if (!(E1000_TXCW_ANE & er32(TXCW))) { |
571 | /* | 571 | /* |
572 | * If we force link for non-auto-negotiation switch, check | 572 | * If we force link for non-auto-negotiation switch, check |
diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c index 91817d0afcaf..d092eafde9bf 100644 --- a/drivers/net/e1000e/netdev.c +++ b/drivers/net/e1000e/netdev.c | |||
@@ -44,10 +44,11 @@ | |||
44 | #include <linux/cpu.h> | 44 | #include <linux/cpu.h> |
45 | #include <linux/smp.h> | 45 | #include <linux/smp.h> |
46 | #include <linux/pm_qos_params.h> | 46 | #include <linux/pm_qos_params.h> |
47 | #include <linux/aer.h> | ||
47 | 48 | ||
48 | #include "e1000.h" | 49 | #include "e1000.h" |
49 | 50 | ||
50 | #define DRV_VERSION "0.3.3.3-k6" | 51 | #define DRV_VERSION "0.3.3.4-k2" |
51 | char e1000e_driver_name[] = "e1000e"; | 52 | char e1000e_driver_name[] = "e1000e"; |
52 | const char e1000e_driver_version[] = DRV_VERSION; | 53 | const char e1000e_driver_version[] = DRV_VERSION; |
53 | 54 | ||
@@ -56,6 +57,7 @@ static const struct e1000_info *e1000_info_tbl[] = { | |||
56 | [board_82572] = &e1000_82572_info, | 57 | [board_82572] = &e1000_82572_info, |
57 | [board_82573] = &e1000_82573_info, | 58 | [board_82573] = &e1000_82573_info, |
58 | [board_82574] = &e1000_82574_info, | 59 | [board_82574] = &e1000_82574_info, |
60 | [board_82583] = &e1000_82583_info, | ||
59 | [board_80003es2lan] = &e1000_es2_info, | 61 | [board_80003es2lan] = &e1000_es2_info, |
60 | [board_ich8lan] = &e1000_ich8_info, | 62 | [board_ich8lan] = &e1000_ich8_info, |
61 | [board_ich9lan] = &e1000_ich9_info, | 63 | [board_ich9lan] = &e1000_ich9_info, |
@@ -99,8 +101,8 @@ static void e1000_receive_skb(struct e1000_adapter *adapter, | |||
99 | skb->protocol = eth_type_trans(skb, netdev); | 101 | skb->protocol = eth_type_trans(skb, netdev); |
100 | 102 | ||
101 | if (adapter->vlgrp && (status & E1000_RXD_STAT_VP)) | 103 | if (adapter->vlgrp && (status & E1000_RXD_STAT_VP)) |
102 | vlan_hwaccel_receive_skb(skb, adapter->vlgrp, | 104 | vlan_gro_receive(&adapter->napi, adapter->vlgrp, |
103 | le16_to_cpu(vlan)); | 105 | le16_to_cpu(vlan), skb); |
104 | else | 106 | else |
105 | napi_gro_receive(&adapter->napi, skb); | 107 | napi_gro_receive(&adapter->napi, skb); |
106 | } | 108 | } |
@@ -565,15 +567,14 @@ next_desc: | |||
565 | static void e1000_put_txbuf(struct e1000_adapter *adapter, | 567 | static void e1000_put_txbuf(struct e1000_adapter *adapter, |
566 | struct e1000_buffer *buffer_info) | 568 | struct e1000_buffer *buffer_info) |
567 | { | 569 | { |
568 | if (buffer_info->dma) { | 570 | buffer_info->dma = 0; |
569 | pci_unmap_page(adapter->pdev, buffer_info->dma, | ||
570 | buffer_info->length, PCI_DMA_TODEVICE); | ||
571 | buffer_info->dma = 0; | ||
572 | } | ||
573 | if (buffer_info->skb) { | 571 | if (buffer_info->skb) { |
572 | skb_dma_unmap(&adapter->pdev->dev, buffer_info->skb, | ||
573 | DMA_TO_DEVICE); | ||
574 | dev_kfree_skb_any(buffer_info->skb); | 574 | dev_kfree_skb_any(buffer_info->skb); |
575 | buffer_info->skb = NULL; | 575 | buffer_info->skb = NULL; |
576 | } | 576 | } |
577 | buffer_info->time_stamp = 0; | ||
577 | } | 578 | } |
578 | 579 | ||
579 | static void e1000_print_tx_hang(struct e1000_adapter *adapter) | 580 | static void e1000_print_tx_hang(struct e1000_adapter *adapter) |
@@ -678,12 +679,10 @@ static bool e1000_clean_tx_irq(struct e1000_adapter *adapter) | |||
678 | } | 679 | } |
679 | 680 | ||
680 | if (adapter->detect_tx_hung) { | 681 | if (adapter->detect_tx_hung) { |
681 | /* | 682 | /* Detect a transmit hang in hardware, this serializes the |
682 | * Detect a transmit hang in hardware, this serializes the | 683 | * check with the clearing of time_stamp and movement of i */ |
683 | * check with the clearing of time_stamp and movement of i | ||
684 | */ | ||
685 | adapter->detect_tx_hung = 0; | 684 | adapter->detect_tx_hung = 0; |
686 | if (tx_ring->buffer_info[eop].dma && | 685 | if (tx_ring->buffer_info[eop].time_stamp && |
687 | time_after(jiffies, tx_ring->buffer_info[eop].time_stamp | 686 | time_after(jiffies, tx_ring->buffer_info[eop].time_stamp |
688 | + (adapter->tx_timeout_factor * HZ)) | 687 | + (adapter->tx_timeout_factor * HZ)) |
689 | && !(er32(STATUS) & E1000_STATUS_TXOFF)) { | 688 | && !(er32(STATUS) & E1000_STATUS_TXOFF)) { |
@@ -1152,7 +1151,7 @@ static irqreturn_t e1000_intr_msi(int irq, void *data) | |||
1152 | * read ICR disables interrupts using IAM | 1151 | * read ICR disables interrupts using IAM |
1153 | */ | 1152 | */ |
1154 | 1153 | ||
1155 | if (icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC)) { | 1154 | if (icr & E1000_ICR_LSC) { |
1156 | hw->mac.get_link_status = 1; | 1155 | hw->mac.get_link_status = 1; |
1157 | /* | 1156 | /* |
1158 | * ICH8 workaround-- Call gig speed drop workaround on cable | 1157 | * ICH8 workaround-- Call gig speed drop workaround on cable |
@@ -1179,12 +1178,12 @@ static irqreturn_t e1000_intr_msi(int irq, void *data) | |||
1179 | mod_timer(&adapter->watchdog_timer, jiffies + 1); | 1178 | mod_timer(&adapter->watchdog_timer, jiffies + 1); |
1180 | } | 1179 | } |
1181 | 1180 | ||
1182 | if (netif_rx_schedule_prep(&adapter->napi)) { | 1181 | if (napi_schedule_prep(&adapter->napi)) { |
1183 | adapter->total_tx_bytes = 0; | 1182 | adapter->total_tx_bytes = 0; |
1184 | adapter->total_tx_packets = 0; | 1183 | adapter->total_tx_packets = 0; |
1185 | adapter->total_rx_bytes = 0; | 1184 | adapter->total_rx_bytes = 0; |
1186 | adapter->total_rx_packets = 0; | 1185 | adapter->total_rx_packets = 0; |
1187 | __netif_rx_schedule(&adapter->napi); | 1186 | __napi_schedule(&adapter->napi); |
1188 | } | 1187 | } |
1189 | 1188 | ||
1190 | return IRQ_HANDLED; | 1189 | return IRQ_HANDLED; |
@@ -1218,7 +1217,7 @@ static irqreturn_t e1000_intr(int irq, void *data) | |||
1218 | * IMC write | 1217 | * IMC write |
1219 | */ | 1218 | */ |
1220 | 1219 | ||
1221 | if (icr & (E1000_ICR_RXSEQ | E1000_ICR_LSC)) { | 1220 | if (icr & E1000_ICR_LSC) { |
1222 | hw->mac.get_link_status = 1; | 1221 | hw->mac.get_link_status = 1; |
1223 | /* | 1222 | /* |
1224 | * ICH8 workaround-- Call gig speed drop workaround on cable | 1223 | * ICH8 workaround-- Call gig speed drop workaround on cable |
@@ -1246,12 +1245,12 @@ static irqreturn_t e1000_intr(int irq, void *data) | |||
1246 | mod_timer(&adapter->watchdog_timer, jiffies + 1); | 1245 | mod_timer(&adapter->watchdog_timer, jiffies + 1); |
1247 | } | 1246 | } |
1248 | 1247 | ||
1249 | if (netif_rx_schedule_prep(&adapter->napi)) { | 1248 | if (napi_schedule_prep(&adapter->napi)) { |
1250 | adapter->total_tx_bytes = 0; | 1249 | adapter->total_tx_bytes = 0; |
1251 | adapter->total_tx_packets = 0; | 1250 | adapter->total_tx_packets = 0; |
1252 | adapter->total_rx_bytes = 0; | 1251 | adapter->total_rx_bytes = 0; |
1253 | adapter->total_rx_packets = 0; | 1252 | adapter->total_rx_packets = 0; |
1254 | __netif_rx_schedule(&adapter->napi); | 1253 | __napi_schedule(&adapter->napi); |
1255 | } | 1254 | } |
1256 | 1255 | ||
1257 | return IRQ_HANDLED; | 1256 | return IRQ_HANDLED; |
@@ -1320,10 +1319,10 @@ static irqreturn_t e1000_intr_msix_rx(int irq, void *data) | |||
1320 | adapter->rx_ring->set_itr = 0; | 1319 | adapter->rx_ring->set_itr = 0; |
1321 | } | 1320 | } |
1322 | 1321 | ||
1323 | if (netif_rx_schedule_prep(&adapter->napi)) { | 1322 | if (napi_schedule_prep(&adapter->napi)) { |
1324 | adapter->total_rx_bytes = 0; | 1323 | adapter->total_rx_bytes = 0; |
1325 | adapter->total_rx_packets = 0; | 1324 | adapter->total_rx_packets = 0; |
1326 | __netif_rx_schedule(&adapter->napi); | 1325 | __napi_schedule(&adapter->napi); |
1327 | } | 1326 | } |
1328 | return IRQ_HANDLED; | 1327 | return IRQ_HANDLED; |
1329 | } | 1328 | } |
@@ -1698,7 +1697,6 @@ int e1000e_setup_tx_resources(struct e1000_adapter *adapter) | |||
1698 | 1697 | ||
1699 | tx_ring->next_to_use = 0; | 1698 | tx_ring->next_to_use = 0; |
1700 | tx_ring->next_to_clean = 0; | 1699 | tx_ring->next_to_clean = 0; |
1701 | spin_lock_init(&adapter->tx_queue_lock); | ||
1702 | 1700 | ||
1703 | return 0; | 1701 | return 0; |
1704 | err: | 1702 | err: |
@@ -2007,16 +2005,7 @@ static int e1000_clean(struct napi_struct *napi, int budget) | |||
2007 | !(adapter->rx_ring->ims_val & adapter->tx_ring->ims_val)) | 2005 | !(adapter->rx_ring->ims_val & adapter->tx_ring->ims_val)) |
2008 | goto clean_rx; | 2006 | goto clean_rx; |
2009 | 2007 | ||
2010 | /* | 2008 | tx_cleaned = e1000_clean_tx_irq(adapter); |
2011 | * e1000_clean is called per-cpu. This lock protects | ||
2012 | * tx_ring from being cleaned by multiple cpus | ||
2013 | * simultaneously. A failure obtaining the lock means | ||
2014 | * tx_ring is currently being cleaned anyway. | ||
2015 | */ | ||
2016 | if (spin_trylock(&adapter->tx_queue_lock)) { | ||
2017 | tx_cleaned = e1000_clean_tx_irq(adapter); | ||
2018 | spin_unlock(&adapter->tx_queue_lock); | ||
2019 | } | ||
2020 | 2009 | ||
2021 | clean_rx: | 2010 | clean_rx: |
2022 | adapter->clean_rx(adapter, &work_done, budget); | 2011 | adapter->clean_rx(adapter, &work_done, budget); |
@@ -2028,7 +2017,7 @@ clean_rx: | |||
2028 | if (work_done < budget) { | 2017 | if (work_done < budget) { |
2029 | if (adapter->itr_setting & 3) | 2018 | if (adapter->itr_setting & 3) |
2030 | e1000_set_itr(adapter); | 2019 | e1000_set_itr(adapter); |
2031 | netif_rx_complete(napi); | 2020 | napi_complete(napi); |
2032 | if (adapter->msix_entries) | 2021 | if (adapter->msix_entries) |
2033 | ew32(IMS, adapter->rx_ring->ims_val); | 2022 | ew32(IMS, adapter->rx_ring->ims_val); |
2034 | else | 2023 | else |
@@ -2922,8 +2911,6 @@ static int __devinit e1000_sw_init(struct e1000_adapter *adapter) | |||
2922 | if (e1000_alloc_queues(adapter)) | 2911 | if (e1000_alloc_queues(adapter)) |
2923 | return -ENOMEM; | 2912 | return -ENOMEM; |
2924 | 2913 | ||
2925 | spin_lock_init(&adapter->tx_queue_lock); | ||
2926 | |||
2927 | /* Explicitly disable IRQ since the NIC can be in any state. */ | 2914 | /* Explicitly disable IRQ since the NIC can be in any state. */ |
2928 | e1000_irq_disable(adapter); | 2915 | e1000_irq_disable(adapter); |
2929 | 2916 | ||
@@ -3320,7 +3307,7 @@ void e1000e_update_stats(struct e1000_adapter *adapter) | |||
3320 | 3307 | ||
3321 | adapter->stats.algnerrc += er32(ALGNERRC); | 3308 | adapter->stats.algnerrc += er32(ALGNERRC); |
3322 | adapter->stats.rxerrc += er32(RXERRC); | 3309 | adapter->stats.rxerrc += er32(RXERRC); |
3323 | if (hw->mac.type != e1000_82574) | 3310 | if ((hw->mac.type != e1000_82574) && (hw->mac.type != e1000_82583)) |
3324 | adapter->stats.tncrs += er32(TNCRS); | 3311 | adapter->stats.tncrs += er32(TNCRS); |
3325 | adapter->stats.cexterr += er32(CEXTERR); | 3312 | adapter->stats.cexterr += er32(CEXTERR); |
3326 | adapter->stats.tsctc += er32(TSCTC); | 3313 | adapter->stats.tsctc += er32(TSCTC); |
@@ -3777,23 +3764,30 @@ static bool e1000_tx_csum(struct e1000_adapter *adapter, struct sk_buff *skb) | |||
3777 | unsigned int i; | 3764 | unsigned int i; |
3778 | u8 css; | 3765 | u8 css; |
3779 | u32 cmd_len = E1000_TXD_CMD_DEXT; | 3766 | u32 cmd_len = E1000_TXD_CMD_DEXT; |
3767 | __be16 protocol; | ||
3780 | 3768 | ||
3781 | if (skb->ip_summed != CHECKSUM_PARTIAL) | 3769 | if (skb->ip_summed != CHECKSUM_PARTIAL) |
3782 | return 0; | 3770 | return 0; |
3783 | 3771 | ||
3772 | if (skb->protocol == cpu_to_be16(ETH_P_8021Q)) | ||
3773 | protocol = vlan_eth_hdr(skb)->h_vlan_encapsulated_proto; | ||
3774 | else | ||
3775 | protocol = skb->protocol; | ||
3776 | |||
3784 | switch (skb->protocol) { | 3777 | switch (skb->protocol) { |
3785 | case __constant_htons(ETH_P_IP): | 3778 | case cpu_to_be16(ETH_P_IP): |
3786 | if (ip_hdr(skb)->protocol == IPPROTO_TCP) | 3779 | if (ip_hdr(skb)->protocol == IPPROTO_TCP) |
3787 | cmd_len |= E1000_TXD_CMD_TCP; | 3780 | cmd_len |= E1000_TXD_CMD_TCP; |
3788 | break; | 3781 | break; |
3789 | case __constant_htons(ETH_P_IPV6): | 3782 | case cpu_to_be16(ETH_P_IPV6): |
3790 | /* XXX not handling all IPV6 headers */ | 3783 | /* XXX not handling all IPV6 headers */ |
3791 | if (ipv6_hdr(skb)->nexthdr == IPPROTO_TCP) | 3784 | if (ipv6_hdr(skb)->nexthdr == IPPROTO_TCP) |
3792 | cmd_len |= E1000_TXD_CMD_TCP; | 3785 | cmd_len |= E1000_TXD_CMD_TCP; |
3793 | break; | 3786 | break; |
3794 | default: | 3787 | default: |
3795 | if (unlikely(net_ratelimit())) | 3788 | if (unlikely(net_ratelimit())) |
3796 | e_warn("checksum_partial proto=%x!\n", skb->protocol); | 3789 | e_warn("checksum_partial proto=%x!\n", |
3790 | be16_to_cpu(protocol)); | ||
3797 | break; | 3791 | break; |
3798 | } | 3792 | } |
3799 | 3793 | ||
@@ -3832,42 +3826,40 @@ static int e1000_tx_map(struct e1000_adapter *adapter, | |||
3832 | { | 3826 | { |
3833 | struct e1000_ring *tx_ring = adapter->tx_ring; | 3827 | struct e1000_ring *tx_ring = adapter->tx_ring; |
3834 | struct e1000_buffer *buffer_info; | 3828 | struct e1000_buffer *buffer_info; |
3835 | unsigned int len = skb->len - skb->data_len; | 3829 | unsigned int len = skb_headlen(skb); |
3836 | unsigned int offset = 0, size, count = 0, i; | 3830 | unsigned int offset, size, count = 0, i; |
3837 | unsigned int f; | 3831 | unsigned int f; |
3832 | dma_addr_t *map; | ||
3838 | 3833 | ||
3839 | i = tx_ring->next_to_use; | 3834 | i = tx_ring->next_to_use; |
3840 | 3835 | ||
3836 | if (skb_dma_map(&adapter->pdev->dev, skb, DMA_TO_DEVICE)) { | ||
3837 | dev_err(&adapter->pdev->dev, "TX DMA map failed\n"); | ||
3838 | adapter->tx_dma_failed++; | ||
3839 | return 0; | ||
3840 | } | ||
3841 | |||
3842 | map = skb_shinfo(skb)->dma_maps; | ||
3843 | offset = 0; | ||
3844 | |||
3841 | while (len) { | 3845 | while (len) { |
3842 | buffer_info = &tx_ring->buffer_info[i]; | 3846 | buffer_info = &tx_ring->buffer_info[i]; |
3843 | size = min(len, max_per_txd); | 3847 | size = min(len, max_per_txd); |
3844 | 3848 | ||
3845 | /* Workaround for premature desc write-backs | ||
3846 | * in TSO mode. Append 4-byte sentinel desc */ | ||
3847 | if (mss && !nr_frags && size == len && size > 8) | ||
3848 | size -= 4; | ||
3849 | |||
3850 | buffer_info->length = size; | 3849 | buffer_info->length = size; |
3851 | /* set time_stamp *before* dma to help avoid a possible race */ | ||
3852 | buffer_info->time_stamp = jiffies; | 3850 | buffer_info->time_stamp = jiffies; |
3853 | buffer_info->dma = | ||
3854 | pci_map_single(adapter->pdev, | ||
3855 | skb->data + offset, | ||
3856 | size, | ||
3857 | PCI_DMA_TODEVICE); | ||
3858 | if (pci_dma_mapping_error(adapter->pdev, buffer_info->dma)) { | ||
3859 | dev_err(&adapter->pdev->dev, "TX DMA map failed\n"); | ||
3860 | adapter->tx_dma_failed++; | ||
3861 | return -1; | ||
3862 | } | ||
3863 | buffer_info->next_to_watch = i; | 3851 | buffer_info->next_to_watch = i; |
3852 | buffer_info->dma = map[0] + offset; | ||
3853 | count++; | ||
3864 | 3854 | ||
3865 | len -= size; | 3855 | len -= size; |
3866 | offset += size; | 3856 | offset += size; |
3867 | count++; | 3857 | |
3868 | i++; | 3858 | if (len) { |
3869 | if (i == tx_ring->count) | 3859 | i++; |
3870 | i = 0; | 3860 | if (i == tx_ring->count) |
3861 | i = 0; | ||
3862 | } | ||
3871 | } | 3863 | } |
3872 | 3864 | ||
3873 | for (f = 0; f < nr_frags; f++) { | 3865 | for (f = 0; f < nr_frags; f++) { |
@@ -3875,49 +3867,27 @@ static int e1000_tx_map(struct e1000_adapter *adapter, | |||
3875 | 3867 | ||
3876 | frag = &skb_shinfo(skb)->frags[f]; | 3868 | frag = &skb_shinfo(skb)->frags[f]; |
3877 | len = frag->size; | 3869 | len = frag->size; |
3878 | offset = frag->page_offset; | 3870 | offset = 0; |
3879 | 3871 | ||
3880 | while (len) { | 3872 | while (len) { |
3873 | i++; | ||
3874 | if (i == tx_ring->count) | ||
3875 | i = 0; | ||
3876 | |||
3881 | buffer_info = &tx_ring->buffer_info[i]; | 3877 | buffer_info = &tx_ring->buffer_info[i]; |
3882 | size = min(len, max_per_txd); | 3878 | size = min(len, max_per_txd); |
3883 | /* Workaround for premature desc write-backs | ||
3884 | * in TSO mode. Append 4-byte sentinel desc */ | ||
3885 | if (mss && f == (nr_frags-1) && size == len && size > 8) | ||
3886 | size -= 4; | ||
3887 | 3879 | ||
3888 | buffer_info->length = size; | 3880 | buffer_info->length = size; |
3889 | buffer_info->time_stamp = jiffies; | 3881 | buffer_info->time_stamp = jiffies; |
3890 | buffer_info->dma = | ||
3891 | pci_map_page(adapter->pdev, | ||
3892 | frag->page, | ||
3893 | offset, | ||
3894 | size, | ||
3895 | PCI_DMA_TODEVICE); | ||
3896 | if (pci_dma_mapping_error(adapter->pdev, | ||
3897 | buffer_info->dma)) { | ||
3898 | dev_err(&adapter->pdev->dev, | ||
3899 | "TX DMA page map failed\n"); | ||
3900 | adapter->tx_dma_failed++; | ||
3901 | return -1; | ||
3902 | } | ||
3903 | |||
3904 | buffer_info->next_to_watch = i; | 3882 | buffer_info->next_to_watch = i; |
3883 | buffer_info->dma = map[f + 1] + offset; | ||
3905 | 3884 | ||
3906 | len -= size; | 3885 | len -= size; |
3907 | offset += size; | 3886 | offset += size; |
3908 | count++; | 3887 | count++; |
3909 | |||
3910 | i++; | ||
3911 | if (i == tx_ring->count) | ||
3912 | i = 0; | ||
3913 | } | 3888 | } |
3914 | } | 3889 | } |
3915 | 3890 | ||
3916 | if (i == 0) | ||
3917 | i = tx_ring->count - 1; | ||
3918 | else | ||
3919 | i--; | ||
3920 | |||
3921 | tx_ring->buffer_info[i].skb = skb; | 3891 | tx_ring->buffer_info[i].skb = skb; |
3922 | tx_ring->buffer_info[first].next_to_watch = i; | 3892 | tx_ring->buffer_info[first].next_to_watch = i; |
3923 | 3893 | ||
@@ -4069,7 +4039,6 @@ static int e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
4069 | unsigned int max_txd_pwr = E1000_MAX_TXD_PWR; | 4039 | unsigned int max_txd_pwr = E1000_MAX_TXD_PWR; |
4070 | unsigned int tx_flags = 0; | 4040 | unsigned int tx_flags = 0; |
4071 | unsigned int len = skb->len - skb->data_len; | 4041 | unsigned int len = skb->len - skb->data_len; |
4072 | unsigned long irq_flags; | ||
4073 | unsigned int nr_frags; | 4042 | unsigned int nr_frags; |
4074 | unsigned int mss; | 4043 | unsigned int mss; |
4075 | int count = 0; | 4044 | int count = 0; |
@@ -4138,18 +4107,12 @@ static int e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
4138 | if (adapter->hw.mac.tx_pkt_filtering) | 4107 | if (adapter->hw.mac.tx_pkt_filtering) |
4139 | e1000_transfer_dhcp_info(adapter, skb); | 4108 | e1000_transfer_dhcp_info(adapter, skb); |
4140 | 4109 | ||
4141 | if (!spin_trylock_irqsave(&adapter->tx_queue_lock, irq_flags)) | ||
4142 | /* Collision - tell upper layer to requeue */ | ||
4143 | return NETDEV_TX_LOCKED; | ||
4144 | |||
4145 | /* | 4110 | /* |
4146 | * need: count + 2 desc gap to keep tail from touching | 4111 | * need: count + 2 desc gap to keep tail from touching |
4147 | * head, otherwise try next time | 4112 | * head, otherwise try next time |
4148 | */ | 4113 | */ |
4149 | if (e1000_maybe_stop_tx(netdev, count + 2)) { | 4114 | if (e1000_maybe_stop_tx(netdev, count + 2)) |
4150 | spin_unlock_irqrestore(&adapter->tx_queue_lock, irq_flags); | ||
4151 | return NETDEV_TX_BUSY; | 4115 | return NETDEV_TX_BUSY; |
4152 | } | ||
4153 | 4116 | ||
4154 | if (adapter->vlgrp && vlan_tx_tag_present(skb)) { | 4117 | if (adapter->vlgrp && vlan_tx_tag_present(skb)) { |
4155 | tx_flags |= E1000_TX_FLAGS_VLAN; | 4118 | tx_flags |= E1000_TX_FLAGS_VLAN; |
@@ -4161,7 +4124,6 @@ static int e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
4161 | tso = e1000_tso(adapter, skb); | 4124 | tso = e1000_tso(adapter, skb); |
4162 | if (tso < 0) { | 4125 | if (tso < 0) { |
4163 | dev_kfree_skb_any(skb); | 4126 | dev_kfree_skb_any(skb); |
4164 | spin_unlock_irqrestore(&adapter->tx_queue_lock, irq_flags); | ||
4165 | return NETDEV_TX_OK; | 4127 | return NETDEV_TX_OK; |
4166 | } | 4128 | } |
4167 | 4129 | ||
@@ -4178,22 +4140,20 @@ static int e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
4178 | if (skb->protocol == htons(ETH_P_IP)) | 4140 | if (skb->protocol == htons(ETH_P_IP)) |
4179 | tx_flags |= E1000_TX_FLAGS_IPV4; | 4141 | tx_flags |= E1000_TX_FLAGS_IPV4; |
4180 | 4142 | ||
4143 | /* if count is 0 then mapping error has occured */ | ||
4181 | count = e1000_tx_map(adapter, skb, first, max_per_txd, nr_frags, mss); | 4144 | count = e1000_tx_map(adapter, skb, first, max_per_txd, nr_frags, mss); |
4182 | if (count < 0) { | 4145 | if (count) { |
4183 | /* handle pci_map_single() error in e1000_tx_map */ | 4146 | e1000_tx_queue(adapter, tx_flags, count); |
4147 | netdev->trans_start = jiffies; | ||
4148 | /* Make sure there is space in the ring for the next send. */ | ||
4149 | e1000_maybe_stop_tx(netdev, MAX_SKB_FRAGS + 2); | ||
4150 | |||
4151 | } else { | ||
4184 | dev_kfree_skb_any(skb); | 4152 | dev_kfree_skb_any(skb); |
4185 | spin_unlock_irqrestore(&adapter->tx_queue_lock, irq_flags); | 4153 | tx_ring->buffer_info[first].time_stamp = 0; |
4186 | return NETDEV_TX_OK; | 4154 | tx_ring->next_to_use = first; |
4187 | } | 4155 | } |
4188 | 4156 | ||
4189 | e1000_tx_queue(adapter, tx_flags, count); | ||
4190 | |||
4191 | netdev->trans_start = jiffies; | ||
4192 | |||
4193 | /* Make sure there is space in the ring for the next send. */ | ||
4194 | e1000_maybe_stop_tx(netdev, MAX_SKB_FRAGS + 2); | ||
4195 | |||
4196 | spin_unlock_irqrestore(&adapter->tx_queue_lock, irq_flags); | ||
4197 | return NETDEV_TX_OK; | 4157 | return NETDEV_TX_OK; |
4198 | } | 4158 | } |
4199 | 4159 | ||
@@ -4543,6 +4503,14 @@ static int e1000_resume(struct pci_dev *pdev) | |||
4543 | return err; | 4503 | return err; |
4544 | } | 4504 | } |
4545 | 4505 | ||
4506 | /* AER (Advanced Error Reporting) hooks */ | ||
4507 | err = pci_enable_pcie_error_reporting(pdev); | ||
4508 | if (err) { | ||
4509 | dev_err(&pdev->dev, "pci_enable_pcie_error_reporting failed " | ||
4510 | "0x%x\n", err); | ||
4511 | /* non-fatal, continue */ | ||
4512 | } | ||
4513 | |||
4546 | pci_set_master(pdev); | 4514 | pci_set_master(pdev); |
4547 | 4515 | ||
4548 | pci_enable_wake(pdev, PCI_D3hot, 0); | 4516 | pci_enable_wake(pdev, PCI_D3hot, 0); |
@@ -4637,24 +4605,29 @@ static pci_ers_result_t e1000_io_slot_reset(struct pci_dev *pdev) | |||
4637 | struct e1000_adapter *adapter = netdev_priv(netdev); | 4605 | struct e1000_adapter *adapter = netdev_priv(netdev); |
4638 | struct e1000_hw *hw = &adapter->hw; | 4606 | struct e1000_hw *hw = &adapter->hw; |
4639 | int err; | 4607 | int err; |
4608 | pci_ers_result_t result; | ||
4640 | 4609 | ||
4641 | e1000e_disable_l1aspm(pdev); | 4610 | e1000e_disable_l1aspm(pdev); |
4642 | err = pci_enable_device_mem(pdev); | 4611 | err = pci_enable_device_mem(pdev); |
4643 | if (err) { | 4612 | if (err) { |
4644 | dev_err(&pdev->dev, | 4613 | dev_err(&pdev->dev, |
4645 | "Cannot re-enable PCI device after reset.\n"); | 4614 | "Cannot re-enable PCI device after reset.\n"); |
4646 | return PCI_ERS_RESULT_DISCONNECT; | 4615 | result = PCI_ERS_RESULT_DISCONNECT; |
4647 | } | 4616 | } else { |
4648 | pci_set_master(pdev); | 4617 | pci_set_master(pdev); |
4649 | pci_restore_state(pdev); | 4618 | pci_restore_state(pdev); |
4650 | 4619 | ||
4651 | pci_enable_wake(pdev, PCI_D3hot, 0); | 4620 | pci_enable_wake(pdev, PCI_D3hot, 0); |
4652 | pci_enable_wake(pdev, PCI_D3cold, 0); | 4621 | pci_enable_wake(pdev, PCI_D3cold, 0); |
4653 | 4622 | ||
4654 | e1000e_reset(adapter); | 4623 | e1000e_reset(adapter); |
4655 | ew32(WUS, ~0); | 4624 | ew32(WUS, ~0); |
4625 | result = PCI_ERS_RESULT_RECOVERED; | ||
4626 | } | ||
4656 | 4627 | ||
4657 | return PCI_ERS_RESULT_RECOVERED; | 4628 | pci_cleanup_aer_uncorrect_error_status(pdev); |
4629 | |||
4630 | return result; | ||
4658 | } | 4631 | } |
4659 | 4632 | ||
4660 | /** | 4633 | /** |
@@ -4922,12 +4895,6 @@ static int __devinit e1000_probe(struct pci_dev *pdev, | |||
4922 | if (pci_using_dac) | 4895 | if (pci_using_dac) |
4923 | netdev->features |= NETIF_F_HIGHDMA; | 4896 | netdev->features |= NETIF_F_HIGHDMA; |
4924 | 4897 | ||
4925 | /* | ||
4926 | * We should not be using LLTX anymore, but we are still Tx faster with | ||
4927 | * it. | ||
4928 | */ | ||
4929 | netdev->features |= NETIF_F_LLTX; | ||
4930 | |||
4931 | if (e1000e_enable_mng_pass_thru(&adapter->hw)) | 4898 | if (e1000e_enable_mng_pass_thru(&adapter->hw)) |
4932 | adapter->flags |= FLAG_MNG_PT_ENABLED; | 4899 | adapter->flags |= FLAG_MNG_PT_ENABLED; |
4933 | 4900 | ||
@@ -5091,6 +5058,7 @@ static void __devexit e1000_remove(struct pci_dev *pdev) | |||
5091 | { | 5058 | { |
5092 | struct net_device *netdev = pci_get_drvdata(pdev); | 5059 | struct net_device *netdev = pci_get_drvdata(pdev); |
5093 | struct e1000_adapter *adapter = netdev_priv(netdev); | 5060 | struct e1000_adapter *adapter = netdev_priv(netdev); |
5061 | int err; | ||
5094 | 5062 | ||
5095 | /* | 5063 | /* |
5096 | * flush_scheduled work may reschedule our watchdog task, so | 5064 | * flush_scheduled work may reschedule our watchdog task, so |
@@ -5125,6 +5093,12 @@ static void __devexit e1000_remove(struct pci_dev *pdev) | |||
5125 | 5093 | ||
5126 | free_netdev(netdev); | 5094 | free_netdev(netdev); |
5127 | 5095 | ||
5096 | /* AER disable */ | ||
5097 | err = pci_disable_pcie_error_reporting(pdev); | ||
5098 | if (err) | ||
5099 | dev_err(&pdev->dev, | ||
5100 | "pci_disable_pcie_error_reporting failed 0x%x\n", err); | ||
5101 | |||
5128 | pci_disable_device(pdev); | 5102 | pci_disable_device(pdev); |
5129 | } | 5103 | } |
5130 | 5104 | ||
@@ -5156,6 +5130,7 @@ static struct pci_device_id e1000_pci_tbl[] = { | |||
5156 | { PCI_VDEVICE(INTEL, E1000_DEV_ID_82573L), board_82573 }, | 5130 | { PCI_VDEVICE(INTEL, E1000_DEV_ID_82573L), board_82573 }, |
5157 | 5131 | ||
5158 | { PCI_VDEVICE(INTEL, E1000_DEV_ID_82574L), board_82574 }, | 5132 | { PCI_VDEVICE(INTEL, E1000_DEV_ID_82574L), board_82574 }, |
5133 | { PCI_VDEVICE(INTEL, E1000_DEV_ID_82583V), board_82583 }, | ||
5159 | 5134 | ||
5160 | { PCI_VDEVICE(INTEL, E1000_DEV_ID_80003ES2LAN_COPPER_DPT), | 5135 | { PCI_VDEVICE(INTEL, E1000_DEV_ID_80003ES2LAN_COPPER_DPT), |
5161 | board_80003es2lan }, | 5136 | board_80003es2lan }, |