aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/e1000e/82571.c9
-rw-r--r--drivers/net/e1000e/e1000.h4
-rw-r--r--drivers/net/e1000e/es2lan.c4
-rw-r--r--drivers/net/e1000e/hw.h2
-rw-r--r--drivers/net/e1000e/lib.c21
-rw-r--r--drivers/net/e1000e/netdev.c21
6 files changed, 45 insertions, 16 deletions
diff --git a/drivers/net/e1000e/82571.c b/drivers/net/e1000e/82571.c
index 62bbc6e0a76a..8ea3ed7e5364 100644
--- a/drivers/net/e1000e/82571.c
+++ b/drivers/net/e1000e/82571.c
@@ -65,6 +65,7 @@ static s32 e1000_fix_nvm_checksum_82571(struct e1000_hw *hw);
65static void e1000_initialize_hw_bits_82571(struct e1000_hw *hw); 65static void e1000_initialize_hw_bits_82571(struct e1000_hw *hw);
66static s32 e1000_setup_link_82571(struct e1000_hw *hw); 66static s32 e1000_setup_link_82571(struct e1000_hw *hw);
67static void e1000_clear_hw_cntrs_82571(struct e1000_hw *hw); 67static void e1000_clear_hw_cntrs_82571(struct e1000_hw *hw);
68static void e1000_clear_vfta_82571(struct e1000_hw *hw);
68static bool e1000_check_mng_mode_82574(struct e1000_hw *hw); 69static bool e1000_check_mng_mode_82574(struct e1000_hw *hw);
69static s32 e1000_led_on_82574(struct e1000_hw *hw); 70static s32 e1000_led_on_82574(struct e1000_hw *hw);
70static void e1000_put_hw_semaphore_82571(struct e1000_hw *hw); 71static void e1000_put_hw_semaphore_82571(struct e1000_hw *hw);
@@ -949,7 +950,7 @@ static s32 e1000_init_hw_82571(struct e1000_hw *hw)
949 950
950 /* Disabling VLAN filtering */ 951 /* Disabling VLAN filtering */
951 e_dbg("Initializing the IEEE VLAN\n"); 952 e_dbg("Initializing the IEEE VLAN\n");
952 e1000e_clear_vfta(hw); 953 mac->ops.clear_vfta(hw);
953 954
954 /* Setup the receive address. */ 955 /* Setup the receive address. */
955 /* 956 /*
@@ -1128,13 +1129,13 @@ static void e1000_initialize_hw_bits_82571(struct e1000_hw *hw)
1128} 1129}
1129 1130
1130/** 1131/**
1131 * e1000e_clear_vfta - Clear VLAN filter table 1132 * e1000_clear_vfta_82571 - Clear VLAN filter table
1132 * @hw: pointer to the HW structure 1133 * @hw: pointer to the HW structure
1133 * 1134 *
1134 * Clears the register array which contains the VLAN filter table by 1135 * Clears the register array which contains the VLAN filter table by
1135 * setting all the values to 0. 1136 * setting all the values to 0.
1136 **/ 1137 **/
1137void e1000e_clear_vfta(struct e1000_hw *hw) 1138static void e1000_clear_vfta_82571(struct e1000_hw *hw)
1138{ 1139{
1139 u32 offset; 1140 u32 offset;
1140 u32 vfta_value = 0; 1141 u32 vfta_value = 0;
@@ -1656,6 +1657,8 @@ static struct e1000_mac_operations e82571_mac_ops = {
1656 /* .led_on: mac type dependent */ 1657 /* .led_on: mac type dependent */
1657 .led_off = e1000e_led_off_generic, 1658 .led_off = e1000e_led_off_generic,
1658 .update_mc_addr_list = e1000_update_mc_addr_list_82571, 1659 .update_mc_addr_list = e1000_update_mc_addr_list_82571,
1660 .write_vfta = e1000_write_vfta_generic,
1661 .clear_vfta = e1000_clear_vfta_82571,
1659 .reset_hw = e1000_reset_hw_82571, 1662 .reset_hw = e1000_reset_hw_82571,
1660 .init_hw = e1000_init_hw_82571, 1663 .init_hw = e1000_init_hw_82571,
1661 .setup_link = e1000_setup_link_82571, 1664 .setup_link = e1000_setup_link_82571,
diff --git a/drivers/net/e1000e/e1000.h b/drivers/net/e1000e/e1000.h
index 3102d738cfd1..4c08752b824d 100644
--- a/drivers/net/e1000e/e1000.h
+++ b/drivers/net/e1000e/e1000.h
@@ -509,7 +509,7 @@ extern s32 e1000e_setup_fiber_serdes_link(struct e1000_hw *hw);
509extern s32 e1000e_copper_link_setup_m88(struct e1000_hw *hw); 509extern s32 e1000e_copper_link_setup_m88(struct e1000_hw *hw);
510extern s32 e1000e_copper_link_setup_igp(struct e1000_hw *hw); 510extern s32 e1000e_copper_link_setup_igp(struct e1000_hw *hw);
511extern s32 e1000e_setup_link(struct e1000_hw *hw); 511extern s32 e1000e_setup_link(struct e1000_hw *hw);
512extern void e1000e_clear_vfta(struct e1000_hw *hw); 512extern void e1000_clear_vfta_generic(struct e1000_hw *hw);
513extern void e1000e_init_rx_addrs(struct e1000_hw *hw, u16 rar_count); 513extern void e1000e_init_rx_addrs(struct e1000_hw *hw, u16 rar_count);
514extern void e1000e_update_mc_addr_list_generic(struct e1000_hw *hw, 514extern void e1000e_update_mc_addr_list_generic(struct e1000_hw *hw,
515 u8 *mc_addr_list, 515 u8 *mc_addr_list,
@@ -525,7 +525,7 @@ extern void e1000e_config_collision_dist(struct e1000_hw *hw);
525extern s32 e1000e_config_fc_after_link_up(struct e1000_hw *hw); 525extern s32 e1000e_config_fc_after_link_up(struct e1000_hw *hw);
526extern s32 e1000e_force_mac_fc(struct e1000_hw *hw); 526extern s32 e1000e_force_mac_fc(struct e1000_hw *hw);
527extern s32 e1000e_blink_led(struct e1000_hw *hw); 527extern s32 e1000e_blink_led(struct e1000_hw *hw);
528extern void e1000e_write_vfta(struct e1000_hw *hw, u32 offset, u32 value); 528extern void e1000_write_vfta_generic(struct e1000_hw *hw, u32 offset, u32 value);
529extern void e1000e_reset_adaptive(struct e1000_hw *hw); 529extern void e1000e_reset_adaptive(struct e1000_hw *hw);
530extern void e1000e_update_adaptive(struct e1000_hw *hw); 530extern void e1000e_update_adaptive(struct e1000_hw *hw);
531 531
diff --git a/drivers/net/e1000e/es2lan.c b/drivers/net/e1000e/es2lan.c
index e50579859e06..3ff932f02f29 100644
--- a/drivers/net/e1000e/es2lan.c
+++ b/drivers/net/e1000e/es2lan.c
@@ -807,7 +807,7 @@ static s32 e1000_init_hw_80003es2lan(struct e1000_hw *hw)
807 807
808 /* Disabling VLAN filtering */ 808 /* Disabling VLAN filtering */
809 e_dbg("Initializing the IEEE VLAN\n"); 809 e_dbg("Initializing the IEEE VLAN\n");
810 e1000e_clear_vfta(hw); 810 mac->ops.clear_vfta(hw);
811 811
812 /* Setup the receive address. */ 812 /* Setup the receive address. */
813 e1000e_init_rx_addrs(hw, mac->rar_entry_count); 813 e1000e_init_rx_addrs(hw, mac->rar_entry_count);
@@ -1350,6 +1350,8 @@ static struct e1000_mac_operations es2_mac_ops = {
1350 .led_on = e1000e_led_on_generic, 1350 .led_on = e1000e_led_on_generic,
1351 .led_off = e1000e_led_off_generic, 1351 .led_off = e1000e_led_off_generic,
1352 .update_mc_addr_list = e1000e_update_mc_addr_list_generic, 1352 .update_mc_addr_list = e1000e_update_mc_addr_list_generic,
1353 .write_vfta = e1000_write_vfta_generic,
1354 .clear_vfta = e1000_clear_vfta_generic,
1353 .reset_hw = e1000_reset_hw_80003es2lan, 1355 .reset_hw = e1000_reset_hw_80003es2lan,
1354 .init_hw = e1000_init_hw_80003es2lan, 1356 .init_hw = e1000_init_hw_80003es2lan,
1355 .setup_link = e1000e_setup_link, 1357 .setup_link = e1000e_setup_link,
diff --git a/drivers/net/e1000e/hw.h b/drivers/net/e1000e/hw.h
index 426155c15cef..6c3d55fc7753 100644
--- a/drivers/net/e1000e/hw.h
+++ b/drivers/net/e1000e/hw.h
@@ -741,6 +741,7 @@ struct e1000_mac_operations {
741 s32 (*check_for_link)(struct e1000_hw *); 741 s32 (*check_for_link)(struct e1000_hw *);
742 s32 (*cleanup_led)(struct e1000_hw *); 742 s32 (*cleanup_led)(struct e1000_hw *);
743 void (*clear_hw_cntrs)(struct e1000_hw *); 743 void (*clear_hw_cntrs)(struct e1000_hw *);
744 void (*clear_vfta)(struct e1000_hw *);
744 s32 (*get_bus_info)(struct e1000_hw *); 745 s32 (*get_bus_info)(struct e1000_hw *);
745 s32 (*get_link_up_info)(struct e1000_hw *, u16 *, u16 *); 746 s32 (*get_link_up_info)(struct e1000_hw *, u16 *, u16 *);
746 s32 (*led_on)(struct e1000_hw *); 747 s32 (*led_on)(struct e1000_hw *);
@@ -751,6 +752,7 @@ struct e1000_mac_operations {
751 s32 (*setup_link)(struct e1000_hw *); 752 s32 (*setup_link)(struct e1000_hw *);
752 s32 (*setup_physical_interface)(struct e1000_hw *); 753 s32 (*setup_physical_interface)(struct e1000_hw *);
753 s32 (*setup_led)(struct e1000_hw *); 754 s32 (*setup_led)(struct e1000_hw *);
755 void (*write_vfta)(struct e1000_hw *, u32, u32);
754}; 756};
755 757
756/* Function pointers for the PHY. */ 758/* Function pointers for the PHY. */
diff --git a/drivers/net/e1000e/lib.c b/drivers/net/e1000e/lib.c
index f690a1055b41..e3976ea668d0 100644
--- a/drivers/net/e1000e/lib.c
+++ b/drivers/net/e1000e/lib.c
@@ -82,7 +82,24 @@ s32 e1000e_get_bus_info_pcie(struct e1000_hw *hw)
82} 82}
83 83
84/** 84/**
85 * e1000e_write_vfta - Write value to VLAN filter table 85 * e1000_clear_vfta_generic - Clear VLAN filter table
86 * @hw: pointer to the HW structure
87 *
88 * Clears the register array which contains the VLAN filter table by
89 * setting all the values to 0.
90 **/
91void e1000_clear_vfta_generic(struct e1000_hw *hw)
92{
93 u32 offset;
94
95 for (offset = 0; offset < E1000_VLAN_FILTER_TBL_SIZE; offset++) {
96 E1000_WRITE_REG_ARRAY(hw, E1000_VFTA, offset, 0);
97 e1e_flush();
98 }
99}
100
101/**
102 * e1000_write_vfta_generic - Write value to VLAN filter table
86 * @hw: pointer to the HW structure 103 * @hw: pointer to the HW structure
87 * @offset: register offset in VLAN filter table 104 * @offset: register offset in VLAN filter table
88 * @value: register value written to VLAN filter table 105 * @value: register value written to VLAN filter table
@@ -90,7 +107,7 @@ s32 e1000e_get_bus_info_pcie(struct e1000_hw *hw)
90 * Writes value at the given offset in the register array which stores 107 * Writes value at the given offset in the register array which stores
91 * the VLAN filter table. 108 * the VLAN filter table.
92 **/ 109 **/
93void e1000e_write_vfta(struct e1000_hw *hw, u32 offset, u32 value) 110void e1000_write_vfta_generic(struct e1000_hw *hw, u32 offset, u32 value)
94{ 111{
95 E1000_WRITE_REG_ARRAY(hw, E1000_VFTA, offset, value); 112 E1000_WRITE_REG_ARRAY(hw, E1000_VFTA, offset, value);
96 e1e_flush(); 113 e1e_flush();
diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c
index e546b4ebf155..2381cb76f17c 100644
--- a/drivers/net/e1000e/netdev.c
+++ b/drivers/net/e1000e/netdev.c
@@ -2031,11 +2031,14 @@ static void e1000_vlan_rx_add_vid(struct net_device *netdev, u16 vid)
2031 E1000_MNG_DHCP_COOKIE_STATUS_VLAN) && 2031 E1000_MNG_DHCP_COOKIE_STATUS_VLAN) &&
2032 (vid == adapter->mng_vlan_id)) 2032 (vid == adapter->mng_vlan_id))
2033 return; 2033 return;
2034
2034 /* add VID to filter table */ 2035 /* add VID to filter table */
2035 index = (vid >> 5) & 0x7F; 2036 if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER) {
2036 vfta = E1000_READ_REG_ARRAY(hw, E1000_VFTA, index); 2037 index = (vid >> 5) & 0x7F;
2037 vfta |= (1 << (vid & 0x1F)); 2038 vfta = E1000_READ_REG_ARRAY(hw, E1000_VFTA, index);
2038 e1000e_write_vfta(hw, index, vfta); 2039 vfta |= (1 << (vid & 0x1F));
2040 hw->mac.ops.write_vfta(hw, index, vfta);
2041 }
2039} 2042}
2040 2043
2041static void e1000_vlan_rx_kill_vid(struct net_device *netdev, u16 vid) 2044static void e1000_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
@@ -2060,10 +2063,12 @@ static void e1000_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
2060 } 2063 }
2061 2064
2062 /* remove VID from filter table */ 2065 /* remove VID from filter table */
2063 index = (vid >> 5) & 0x7F; 2066 if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER) {
2064 vfta = E1000_READ_REG_ARRAY(hw, E1000_VFTA, index); 2067 index = (vid >> 5) & 0x7F;
2065 vfta &= ~(1 << (vid & 0x1F)); 2068 vfta = E1000_READ_REG_ARRAY(hw, E1000_VFTA, index);
2066 e1000e_write_vfta(hw, index, vfta); 2069 vfta &= ~(1 << (vid & 0x1F));
2070 hw->mac.ops.write_vfta(hw, index, vfta);
2071 }
2067} 2072}
2068 2073
2069static void e1000_update_mng_vlan(struct e1000_adapter *adapter) 2074static void e1000_update_mng_vlan(struct e1000_adapter *adapter)