diff options
author | Bruce Allan <bruce.w.allan@intel.com> | 2009-12-01 10:46:43 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-12-02 03:35:51 -0500 |
commit | caaddaf83501c79fe11b183c8972e60d8b7d5d56 (patch) | |
tree | 5ddaf752e1a4622e969dea9d3e8ec76ac655f767 /drivers/net/e1000e/netdev.c | |
parent | ff9c38bba37937adb909cceb2a6521f2e92e17c6 (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.c | 21 |
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 | ||
2041 | static void e1000_vlan_rx_kill_vid(struct net_device *netdev, u16 vid) | 2044 | static 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 | ||
2069 | static void e1000_update_mng_vlan(struct e1000_adapter *adapter) | 2074 | static void e1000_update_mng_vlan(struct e1000_adapter *adapter) |