aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/e1000e/netdev.c
diff options
context:
space:
mode:
authorBruce Allan <bruce.w.allan@intel.com>2009-12-01 10:46:43 -0500
committerDavid S. Miller <davem@davemloft.net>2009-12-02 03:35:51 -0500
commitcaaddaf83501c79fe11b183c8972e60d8b7d5d56 (patch)
tree5ddaf752e1a4622e969dea9d3e8ec76ac655f767 /drivers/net/e1000e/netdev.c
parentff9c38bba37937adb909cceb2a6521f2e92e17c6 (diff)
e1000e: provide family-specific functions to manage VLAN filter arrays
The two MAC-families that have VLAN filter table register arrays manage each a bit differently from one another, so provide family-specific functions for managing the register arrays and function pointers to access the appropriate function. Also make sure attempts to access these register arrays are not done on parts not supporting that feature. Signed-off-by: Bruce Allan <bruce.w.allan@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/e1000e/netdev.c')
-rw-r--r--drivers/net/e1000e/netdev.c21
1 files changed, 13 insertions, 8 deletions
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)