diff options
Diffstat (limited to 'drivers/net/ethernet/intel/e1000e')
-rw-r--r-- | drivers/net/ethernet/intel/e1000e/80003es2lan.c | 1 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/e1000e/82571.c | 4 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/e1000e/e1000.h | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/e1000e/hw.h | 5 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/e1000e/ich8lan.c | 72 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/e1000e/mac.c | 10 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/e1000e/netdev.c | 12 |
7 files changed, 92 insertions, 14 deletions
diff --git a/drivers/net/ethernet/intel/e1000e/80003es2lan.c b/drivers/net/ethernet/intel/e1000e/80003es2lan.c index a212846a6574..66f9877bc4ec 100644 --- a/drivers/net/ethernet/intel/e1000e/80003es2lan.c +++ b/drivers/net/ethernet/intel/e1000e/80003es2lan.c | |||
@@ -1439,6 +1439,7 @@ static const struct e1000_mac_operations es2_mac_ops = { | |||
1439 | /* setup_physical_interface dependent on media type */ | 1439 | /* setup_physical_interface dependent on media type */ |
1440 | .setup_led = e1000e_setup_led_generic, | 1440 | .setup_led = e1000e_setup_led_generic, |
1441 | .config_collision_dist = e1000e_config_collision_dist_generic, | 1441 | .config_collision_dist = e1000e_config_collision_dist_generic, |
1442 | .rar_set = e1000e_rar_set_generic, | ||
1442 | }; | 1443 | }; |
1443 | 1444 | ||
1444 | static const struct e1000_phy_operations es2_phy_ops = { | 1445 | static const struct e1000_phy_operations es2_phy_ops = { |
diff --git a/drivers/net/ethernet/intel/e1000e/82571.c b/drivers/net/ethernet/intel/e1000e/82571.c index d0ea316731fc..7b02e87b0b65 100644 --- a/drivers/net/ethernet/intel/e1000e/82571.c +++ b/drivers/net/ethernet/intel/e1000e/82571.c | |||
@@ -1762,7 +1762,8 @@ void e1000e_set_laa_state_82571(struct e1000_hw *hw, bool state) | |||
1762 | * incoming packets directed to this port are dropped. | 1762 | * incoming packets directed to this port are dropped. |
1763 | * Eventually the LAA will be in RAR[0] and RAR[14]. | 1763 | * Eventually the LAA will be in RAR[0] and RAR[14]. |
1764 | */ | 1764 | */ |
1765 | e1000e_rar_set(hw, hw->mac.addr, hw->mac.rar_entry_count - 1); | 1765 | hw->mac.ops.rar_set(hw, hw->mac.addr, |
1766 | hw->mac.rar_entry_count - 1); | ||
1766 | } | 1767 | } |
1767 | 1768 | ||
1768 | /** | 1769 | /** |
@@ -1926,6 +1927,7 @@ static const struct e1000_mac_operations e82571_mac_ops = { | |||
1926 | .setup_led = e1000e_setup_led_generic, | 1927 | .setup_led = e1000e_setup_led_generic, |
1927 | .config_collision_dist = e1000e_config_collision_dist_generic, | 1928 | .config_collision_dist = e1000e_config_collision_dist_generic, |
1928 | .read_mac_addr = e1000_read_mac_addr_82571, | 1929 | .read_mac_addr = e1000_read_mac_addr_82571, |
1930 | .rar_set = e1000e_rar_set_generic, | ||
1929 | }; | 1931 | }; |
1930 | 1932 | ||
1931 | static const struct e1000_phy_operations e82_phy_ops_igp = { | 1933 | static const struct e1000_phy_operations e82_phy_ops_igp = { |
diff --git a/drivers/net/ethernet/intel/e1000e/e1000.h b/drivers/net/ethernet/intel/e1000e/e1000.h index 1dc2067d3f28..1da9bfacc216 100644 --- a/drivers/net/ethernet/intel/e1000e/e1000.h +++ b/drivers/net/ethernet/intel/e1000e/e1000.h | |||
@@ -576,7 +576,7 @@ extern void e1000e_init_rx_addrs(struct e1000_hw *hw, u16 rar_count); | |||
576 | extern void e1000e_update_mc_addr_list_generic(struct e1000_hw *hw, | 576 | extern void e1000e_update_mc_addr_list_generic(struct e1000_hw *hw, |
577 | u8 *mc_addr_list, | 577 | u8 *mc_addr_list, |
578 | u32 mc_addr_count); | 578 | u32 mc_addr_count); |
579 | extern void e1000e_rar_set(struct e1000_hw *hw, u8 *addr, u32 index); | 579 | extern void e1000e_rar_set_generic(struct e1000_hw *hw, u8 *addr, u32 index); |
580 | extern s32 e1000e_set_fc_watermarks(struct e1000_hw *hw); | 580 | extern s32 e1000e_set_fc_watermarks(struct e1000_hw *hw); |
581 | extern void e1000e_set_pcie_no_snoop(struct e1000_hw *hw, u32 no_snoop); | 581 | extern void e1000e_set_pcie_no_snoop(struct e1000_hw *hw, u32 no_snoop); |
582 | extern s32 e1000e_get_hw_semaphore(struct e1000_hw *hw); | 582 | extern s32 e1000e_get_hw_semaphore(struct e1000_hw *hw); |
diff --git a/drivers/net/ethernet/intel/e1000e/hw.h b/drivers/net/ethernet/intel/e1000e/hw.h index 3a5acb54cd4e..00a0ebb41b8d 100644 --- a/drivers/net/ethernet/intel/e1000e/hw.h +++ b/drivers/net/ethernet/intel/e1000e/hw.h | |||
@@ -200,6 +200,10 @@ enum e1e_registers { | |||
200 | #define E1000_RA (E1000_RAL(0)) | 200 | #define E1000_RA (E1000_RAL(0)) |
201 | E1000_RAH_BASE = 0x05404, /* Receive Address High - RW */ | 201 | E1000_RAH_BASE = 0x05404, /* Receive Address High - RW */ |
202 | #define E1000_RAH(_n) (E1000_RAH_BASE + ((_n) * 8)) | 202 | #define E1000_RAH(_n) (E1000_RAH_BASE + ((_n) * 8)) |
203 | E1000_SHRAL_BASE = 0x05438, /* Shared Receive Address Low - RW */ | ||
204 | #define E1000_SHRAL(_n) (E1000_SHRAL_BASE + ((_n) * 8)) | ||
205 | E1000_SHRAH_BASE = 0x0543C, /* Shared Receive Address High - RW */ | ||
206 | #define E1000_SHRAH(_n) (E1000_SHRAH_BASE + ((_n) * 8)) | ||
203 | E1000_VFTA = 0x05600, /* VLAN Filter Table Array - RW Array */ | 207 | E1000_VFTA = 0x05600, /* VLAN Filter Table Array - RW Array */ |
204 | E1000_WUC = 0x05800, /* Wakeup Control - RW */ | 208 | E1000_WUC = 0x05800, /* Wakeup Control - RW */ |
205 | E1000_WUFC = 0x05808, /* Wakeup Filter Control - RW */ | 209 | E1000_WUFC = 0x05808, /* Wakeup Filter Control - RW */ |
@@ -782,6 +786,7 @@ struct e1000_mac_operations { | |||
782 | s32 (*setup_led)(struct e1000_hw *); | 786 | s32 (*setup_led)(struct e1000_hw *); |
783 | void (*write_vfta)(struct e1000_hw *, u32, u32); | 787 | void (*write_vfta)(struct e1000_hw *, u32, u32); |
784 | void (*config_collision_dist)(struct e1000_hw *); | 788 | void (*config_collision_dist)(struct e1000_hw *); |
789 | void (*rar_set)(struct e1000_hw *, u8 *, u32); | ||
785 | s32 (*read_mac_addr)(struct e1000_hw *); | 790 | s32 (*read_mac_addr)(struct e1000_hw *); |
786 | }; | 791 | }; |
787 | 792 | ||
diff --git a/drivers/net/ethernet/intel/e1000e/ich8lan.c b/drivers/net/ethernet/intel/e1000e/ich8lan.c index 4c8b0fb6534f..ca34ebfeb83e 100644 --- a/drivers/net/ethernet/intel/e1000e/ich8lan.c +++ b/drivers/net/ethernet/intel/e1000e/ich8lan.c | |||
@@ -115,6 +115,7 @@ | |||
115 | #define PCIE_ICH8_SNOOP_ALL PCIE_NO_SNOOP_ALL | 115 | #define PCIE_ICH8_SNOOP_ALL PCIE_NO_SNOOP_ALL |
116 | 116 | ||
117 | #define E1000_ICH_RAR_ENTRIES 7 | 117 | #define E1000_ICH_RAR_ENTRIES 7 |
118 | #define E1000_PCH2_RAR_ENTRIES 5 /* RAR[0], SHRA[0-3] */ | ||
118 | 119 | ||
119 | #define PHY_PAGE_SHIFT 5 | 120 | #define PHY_PAGE_SHIFT 5 |
120 | #define PHY_REG(page, reg) (((page) << PHY_PAGE_SHIFT) | \ | 121 | #define PHY_REG(page, reg) (((page) << PHY_PAGE_SHIFT) | \ |
@@ -259,6 +260,7 @@ static s32 e1000_k1_gig_workaround_hv(struct e1000_hw *hw, bool link); | |||
259 | static s32 e1000_set_mdio_slow_mode_hv(struct e1000_hw *hw); | 260 | static s32 e1000_set_mdio_slow_mode_hv(struct e1000_hw *hw); |
260 | static bool e1000_check_mng_mode_ich8lan(struct e1000_hw *hw); | 261 | static bool e1000_check_mng_mode_ich8lan(struct e1000_hw *hw); |
261 | static bool e1000_check_mng_mode_pchlan(struct e1000_hw *hw); | 262 | static bool e1000_check_mng_mode_pchlan(struct e1000_hw *hw); |
263 | static void e1000_rar_set_pch2lan(struct e1000_hw *hw, u8 *addr, u32 index); | ||
262 | static s32 e1000_k1_workaround_lv(struct e1000_hw *hw); | 264 | static s32 e1000_k1_workaround_lv(struct e1000_hw *hw); |
263 | static void e1000_gate_hw_phy_config_ich8lan(struct e1000_hw *hw, bool gate); | 265 | static void e1000_gate_hw_phy_config_ich8lan(struct e1000_hw *hw, bool gate); |
264 | 266 | ||
@@ -672,8 +674,11 @@ static s32 e1000_init_mac_params_ich8lan(struct e1000_hw *hw) | |||
672 | mac->ops.led_on = e1000_led_on_ich8lan; | 674 | mac->ops.led_on = e1000_led_on_ich8lan; |
673 | mac->ops.led_off = e1000_led_off_ich8lan; | 675 | mac->ops.led_off = e1000_led_off_ich8lan; |
674 | break; | 676 | break; |
675 | case e1000_pchlan: | ||
676 | case e1000_pch2lan: | 677 | case e1000_pch2lan: |
678 | mac->rar_entry_count = E1000_PCH2_RAR_ENTRIES; | ||
679 | mac->ops.rar_set = e1000_rar_set_pch2lan; | ||
680 | /* fall-through */ | ||
681 | case e1000_pchlan: | ||
677 | /* check management mode */ | 682 | /* check management mode */ |
678 | mac->ops.check_mng_mode = e1000_check_mng_mode_pchlan; | 683 | mac->ops.check_mng_mode = e1000_check_mng_mode_pchlan; |
679 | /* ID LED init */ | 684 | /* ID LED init */ |
@@ -1048,6 +1053,70 @@ static bool e1000_check_mng_mode_pchlan(struct e1000_hw *hw) | |||
1048 | } | 1053 | } |
1049 | 1054 | ||
1050 | /** | 1055 | /** |
1056 | * e1000_rar_set_pch2lan - Set receive address register | ||
1057 | * @hw: pointer to the HW structure | ||
1058 | * @addr: pointer to the receive address | ||
1059 | * @index: receive address array register | ||
1060 | * | ||
1061 | * Sets the receive address array register at index to the address passed | ||
1062 | * in by addr. For 82579, RAR[0] is the base address register that is to | ||
1063 | * contain the MAC address but RAR[1-6] are reserved for manageability (ME). | ||
1064 | * Use SHRA[0-3] in place of those reserved for ME. | ||
1065 | **/ | ||
1066 | static void e1000_rar_set_pch2lan(struct e1000_hw *hw, u8 *addr, u32 index) | ||
1067 | { | ||
1068 | u32 rar_low, rar_high; | ||
1069 | |||
1070 | /* | ||
1071 | * HW expects these in little endian so we reverse the byte order | ||
1072 | * from network order (big endian) to little endian | ||
1073 | */ | ||
1074 | rar_low = ((u32)addr[0] | | ||
1075 | ((u32)addr[1] << 8) | | ||
1076 | ((u32)addr[2] << 16) | ((u32)addr[3] << 24)); | ||
1077 | |||
1078 | rar_high = ((u32)addr[4] | ((u32)addr[5] << 8)); | ||
1079 | |||
1080 | /* If MAC address zero, no need to set the AV bit */ | ||
1081 | if (rar_low || rar_high) | ||
1082 | rar_high |= E1000_RAH_AV; | ||
1083 | |||
1084 | if (index == 0) { | ||
1085 | ew32(RAL(index), rar_low); | ||
1086 | e1e_flush(); | ||
1087 | ew32(RAH(index), rar_high); | ||
1088 | e1e_flush(); | ||
1089 | return; | ||
1090 | } | ||
1091 | |||
1092 | if (index < hw->mac.rar_entry_count) { | ||
1093 | s32 ret_val; | ||
1094 | |||
1095 | ret_val = e1000_acquire_swflag_ich8lan(hw); | ||
1096 | if (ret_val) | ||
1097 | goto out; | ||
1098 | |||
1099 | ew32(SHRAL(index - 1), rar_low); | ||
1100 | e1e_flush(); | ||
1101 | ew32(SHRAH(index - 1), rar_high); | ||
1102 | e1e_flush(); | ||
1103 | |||
1104 | e1000_release_swflag_ich8lan(hw); | ||
1105 | |||
1106 | /* verify the register updates */ | ||
1107 | if ((er32(SHRAL(index - 1)) == rar_low) && | ||
1108 | (er32(SHRAH(index - 1)) == rar_high)) | ||
1109 | return; | ||
1110 | |||
1111 | e_dbg("SHRA[%d] might be locked by ME - FWSM=0x%8.8x\n", | ||
1112 | (index - 1), er32(FWSM)); | ||
1113 | } | ||
1114 | |||
1115 | out: | ||
1116 | e_dbg("Failed to write receive address at index %d\n", index); | ||
1117 | } | ||
1118 | |||
1119 | /** | ||
1051 | * e1000_check_reset_block_ich8lan - Check if PHY reset is blocked | 1120 | * e1000_check_reset_block_ich8lan - Check if PHY reset is blocked |
1052 | * @hw: pointer to the HW structure | 1121 | * @hw: pointer to the HW structure |
1053 | * | 1122 | * |
@@ -4100,6 +4169,7 @@ static const struct e1000_mac_operations ich8_mac_ops = { | |||
4100 | .setup_physical_interface= e1000_setup_copper_link_ich8lan, | 4169 | .setup_physical_interface= e1000_setup_copper_link_ich8lan, |
4101 | /* id_led_init dependent on mac type */ | 4170 | /* id_led_init dependent on mac type */ |
4102 | .config_collision_dist = e1000e_config_collision_dist_generic, | 4171 | .config_collision_dist = e1000e_config_collision_dist_generic, |
4172 | .rar_set = e1000e_rar_set_generic, | ||
4103 | }; | 4173 | }; |
4104 | 4174 | ||
4105 | static const struct e1000_phy_operations ich8_phy_ops = { | 4175 | static const struct e1000_phy_operations ich8_phy_ops = { |
diff --git a/drivers/net/ethernet/intel/e1000e/mac.c b/drivers/net/ethernet/intel/e1000e/mac.c index d8327499305f..026e8b3ab52e 100644 --- a/drivers/net/ethernet/intel/e1000e/mac.c +++ b/drivers/net/ethernet/intel/e1000e/mac.c | |||
@@ -143,12 +143,12 @@ void e1000e_init_rx_addrs(struct e1000_hw *hw, u16 rar_count) | |||
143 | /* Setup the receive address */ | 143 | /* Setup the receive address */ |
144 | e_dbg("Programming MAC Address into RAR[0]\n"); | 144 | e_dbg("Programming MAC Address into RAR[0]\n"); |
145 | 145 | ||
146 | e1000e_rar_set(hw, hw->mac.addr, 0); | 146 | hw->mac.ops.rar_set(hw, hw->mac.addr, 0); |
147 | 147 | ||
148 | /* Zero out the other (rar_entry_count - 1) receive addresses */ | 148 | /* Zero out the other (rar_entry_count - 1) receive addresses */ |
149 | e_dbg("Clearing RAR[1-%u]\n", rar_count - 1); | 149 | e_dbg("Clearing RAR[1-%u]\n", rar_count - 1); |
150 | for (i = 1; i < rar_count; i++) | 150 | for (i = 1; i < rar_count; i++) |
151 | e1000e_rar_set(hw, mac_addr, i); | 151 | hw->mac.ops.rar_set(hw, mac_addr, i); |
152 | } | 152 | } |
153 | 153 | ||
154 | /** | 154 | /** |
@@ -215,13 +215,13 @@ s32 e1000_check_alt_mac_addr_generic(struct e1000_hw *hw) | |||
215 | * same as the normal permanent MAC address stored by the HW into the | 215 | * same as the normal permanent MAC address stored by the HW into the |
216 | * RAR. Do this by mapping this address into RAR0. | 216 | * RAR. Do this by mapping this address into RAR0. |
217 | */ | 217 | */ |
218 | e1000e_rar_set(hw, alt_mac_addr, 0); | 218 | hw->mac.ops.rar_set(hw, alt_mac_addr, 0); |
219 | 219 | ||
220 | return 0; | 220 | return 0; |
221 | } | 221 | } |
222 | 222 | ||
223 | /** | 223 | /** |
224 | * e1000e_rar_set - Set receive address register | 224 | * e1000e_rar_set_generic - Set receive address register |
225 | * @hw: pointer to the HW structure | 225 | * @hw: pointer to the HW structure |
226 | * @addr: pointer to the receive address | 226 | * @addr: pointer to the receive address |
227 | * @index: receive address array register | 227 | * @index: receive address array register |
@@ -229,7 +229,7 @@ s32 e1000_check_alt_mac_addr_generic(struct e1000_hw *hw) | |||
229 | * Sets the receive address array register at index to the address passed | 229 | * Sets the receive address array register at index to the address passed |
230 | * in by addr. | 230 | * in by addr. |
231 | **/ | 231 | **/ |
232 | void e1000e_rar_set(struct e1000_hw *hw, u8 *addr, u32 index) | 232 | void e1000e_rar_set_generic(struct e1000_hw *hw, u8 *addr, u32 index) |
233 | { | 233 | { |
234 | u32 rar_low, rar_high; | 234 | u32 rar_low, rar_high; |
235 | 235 | ||
diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c index 140fee14b313..c0e211b500cf 100644 --- a/drivers/net/ethernet/intel/e1000e/netdev.c +++ b/drivers/net/ethernet/intel/e1000e/netdev.c | |||
@@ -3209,7 +3209,7 @@ static int e1000e_write_uc_addr_list(struct net_device *netdev) | |||
3209 | netdev_for_each_uc_addr(ha, netdev) { | 3209 | netdev_for_each_uc_addr(ha, netdev) { |
3210 | if (!rar_entries) | 3210 | if (!rar_entries) |
3211 | break; | 3211 | break; |
3212 | e1000e_rar_set(hw, ha->addr, rar_entries--); | 3212 | hw->mac.ops.rar_set(hw, ha->addr, rar_entries--); |
3213 | count++; | 3213 | count++; |
3214 | } | 3214 | } |
3215 | } | 3215 | } |
@@ -4018,6 +4018,7 @@ static int e1000_close(struct net_device *netdev) | |||
4018 | static int e1000_set_mac(struct net_device *netdev, void *p) | 4018 | static int e1000_set_mac(struct net_device *netdev, void *p) |
4019 | { | 4019 | { |
4020 | struct e1000_adapter *adapter = netdev_priv(netdev); | 4020 | struct e1000_adapter *adapter = netdev_priv(netdev); |
4021 | struct e1000_hw *hw = &adapter->hw; | ||
4021 | struct sockaddr *addr = p; | 4022 | struct sockaddr *addr = p; |
4022 | 4023 | ||
4023 | if (!is_valid_ether_addr(addr->sa_data)) | 4024 | if (!is_valid_ether_addr(addr->sa_data)) |
@@ -4026,7 +4027,7 @@ static int e1000_set_mac(struct net_device *netdev, void *p) | |||
4026 | memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len); | 4027 | memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len); |
4027 | memcpy(adapter->hw.mac.addr, addr->sa_data, netdev->addr_len); | 4028 | memcpy(adapter->hw.mac.addr, addr->sa_data, netdev->addr_len); |
4028 | 4029 | ||
4029 | e1000e_rar_set(&adapter->hw, adapter->hw.mac.addr, 0); | 4030 | hw->mac.ops.rar_set(&adapter->hw, adapter->hw.mac.addr, 0); |
4030 | 4031 | ||
4031 | if (adapter->flags & FLAG_RESET_OVERWRITES_LAA) { | 4032 | if (adapter->flags & FLAG_RESET_OVERWRITES_LAA) { |
4032 | /* activate the work around */ | 4033 | /* activate the work around */ |
@@ -4040,9 +4041,8 @@ static int e1000_set_mac(struct net_device *netdev, void *p) | |||
4040 | * are dropped. Eventually the LAA will be in RAR[0] and | 4041 | * are dropped. Eventually the LAA will be in RAR[0] and |
4041 | * RAR[14] | 4042 | * RAR[14] |
4042 | */ | 4043 | */ |
4043 | e1000e_rar_set(&adapter->hw, | 4044 | hw->mac.ops.rar_set(&adapter->hw, adapter->hw.mac.addr, |
4044 | adapter->hw.mac.addr, | 4045 | adapter->hw.mac.rar_entry_count - 1); |
4045 | adapter->hw.mac.rar_entry_count - 1); | ||
4046 | } | 4046 | } |
4047 | 4047 | ||
4048 | return 0; | 4048 | return 0; |
@@ -4621,7 +4621,7 @@ link_up: | |||
4621 | * reset from the other port. Set the appropriate LAA in RAR[0] | 4621 | * reset from the other port. Set the appropriate LAA in RAR[0] |
4622 | */ | 4622 | */ |
4623 | if (e1000e_get_laa_state_82571(hw)) | 4623 | if (e1000e_get_laa_state_82571(hw)) |
4624 | e1000e_rar_set(hw, adapter->hw.mac.addr, 0); | 4624 | hw->mac.ops.rar_set(hw, adapter->hw.mac.addr, 0); |
4625 | 4625 | ||
4626 | if (adapter->flags2 & FLAG2_CHECK_PHY_HANG) | 4626 | if (adapter->flags2 & FLAG2_CHECK_PHY_HANG) |
4627 | e1000e_check_82574_phy_workaround(adapter); | 4627 | e1000e_check_82574_phy_workaround(adapter); |