diff options
author | Jiri Pirko <jpirko@redhat.com> | 2011-07-21 02:30:00 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-07-21 16:47:55 -0400 |
commit | a0f1d603ee4186081fda0ad48ccf6163c2009f10 (patch) | |
tree | 78210e5e208d6f909e93a5c70d8ce857a8d7c925 /drivers/net/igbvf | |
parent | 87c288c6e9aa31720b72e2bc2d665e24e1653c3e (diff) |
igbvf: do vlan cleanup
- unify vlan and nonvlan rx path
- kill adapter->vlgrp and igbvf_vlan_rx_register
Signed-off-by: Jiri Pirko <jpirko@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/igbvf')
-rw-r--r-- | drivers/net/igbvf/igbvf.h | 4 | ||||
-rw-r--r-- | drivers/net/igbvf/netdev.c | 44 |
2 files changed, 16 insertions, 32 deletions
diff --git a/drivers/net/igbvf/igbvf.h b/drivers/net/igbvf/igbvf.h index d5dad5d607d6..fd4a7b780fdd 100644 --- a/drivers/net/igbvf/igbvf.h +++ b/drivers/net/igbvf/igbvf.h | |||
@@ -34,7 +34,7 @@ | |||
34 | #include <linux/timer.h> | 34 | #include <linux/timer.h> |
35 | #include <linux/io.h> | 35 | #include <linux/io.h> |
36 | #include <linux/netdevice.h> | 36 | #include <linux/netdevice.h> |
37 | 37 | #include <linux/if_vlan.h> | |
38 | 38 | ||
39 | #include "vf.h" | 39 | #include "vf.h" |
40 | 40 | ||
@@ -173,7 +173,7 @@ struct igbvf_adapter { | |||
173 | 173 | ||
174 | const struct igbvf_info *ei; | 174 | const struct igbvf_info *ei; |
175 | 175 | ||
176 | struct vlan_group *vlgrp; | 176 | unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)]; |
177 | u32 bd_number; | 177 | u32 bd_number; |
178 | u32 rx_buffer_len; | 178 | u32 rx_buffer_len; |
179 | u32 polling_interval; | 179 | u32 polling_interval; |
diff --git a/drivers/net/igbvf/netdev.c b/drivers/net/igbvf/netdev.c index 64b47bf01e17..1330c8e932da 100644 --- a/drivers/net/igbvf/netdev.c +++ b/drivers/net/igbvf/netdev.c | |||
@@ -100,12 +100,12 @@ static void igbvf_receive_skb(struct igbvf_adapter *adapter, | |||
100 | struct sk_buff *skb, | 100 | struct sk_buff *skb, |
101 | u32 status, u16 vlan) | 101 | u32 status, u16 vlan) |
102 | { | 102 | { |
103 | if (adapter->vlgrp && (status & E1000_RXD_STAT_VP)) | 103 | if (status & E1000_RXD_STAT_VP) { |
104 | vlan_hwaccel_receive_skb(skb, adapter->vlgrp, | 104 | u16 vid = le16_to_cpu(vlan) & E1000_RXD_SPC_VLAN_MASK; |
105 | le16_to_cpu(vlan) & | 105 | |
106 | E1000_RXD_SPC_VLAN_MASK); | 106 | __vlan_hwaccel_put_tag(skb, vid); |
107 | else | 107 | } |
108 | netif_receive_skb(skb); | 108 | netif_receive_skb(skb); |
109 | } | 109 | } |
110 | 110 | ||
111 | static inline void igbvf_rx_checksum_adv(struct igbvf_adapter *adapter, | 111 | static inline void igbvf_rx_checksum_adv(struct igbvf_adapter *adapter, |
@@ -1167,12 +1167,10 @@ static int igbvf_poll(struct napi_struct *napi, int budget) | |||
1167 | */ | 1167 | */ |
1168 | static void igbvf_set_rlpml(struct igbvf_adapter *adapter) | 1168 | static void igbvf_set_rlpml(struct igbvf_adapter *adapter) |
1169 | { | 1169 | { |
1170 | int max_frame_size = adapter->max_frame_size; | 1170 | int max_frame_size; |
1171 | struct e1000_hw *hw = &adapter->hw; | 1171 | struct e1000_hw *hw = &adapter->hw; |
1172 | 1172 | ||
1173 | if (adapter->vlgrp) | 1173 | max_frame_size = adapter->max_frame_size + VLAN_TAG_SIZE; |
1174 | max_frame_size += VLAN_TAG_SIZE; | ||
1175 | |||
1176 | e1000_rlpml_set_vf(hw, max_frame_size); | 1174 | e1000_rlpml_set_vf(hw, max_frame_size); |
1177 | } | 1175 | } |
1178 | 1176 | ||
@@ -1183,6 +1181,8 @@ static void igbvf_vlan_rx_add_vid(struct net_device *netdev, u16 vid) | |||
1183 | 1181 | ||
1184 | if (hw->mac.ops.set_vfta(hw, vid, true)) | 1182 | if (hw->mac.ops.set_vfta(hw, vid, true)) |
1185 | dev_err(&adapter->pdev->dev, "Failed to add vlan id %d\n", vid); | 1183 | dev_err(&adapter->pdev->dev, "Failed to add vlan id %d\n", vid); |
1184 | else | ||
1185 | set_bit(vid, adapter->active_vlans); | ||
1186 | } | 1186 | } |
1187 | 1187 | ||
1188 | static void igbvf_vlan_rx_kill_vid(struct net_device *netdev, u16 vid) | 1188 | static void igbvf_vlan_rx_kill_vid(struct net_device *netdev, u16 vid) |
@@ -1191,7 +1191,6 @@ static void igbvf_vlan_rx_kill_vid(struct net_device *netdev, u16 vid) | |||
1191 | struct e1000_hw *hw = &adapter->hw; | 1191 | struct e1000_hw *hw = &adapter->hw; |
1192 | 1192 | ||
1193 | igbvf_irq_disable(adapter); | 1193 | igbvf_irq_disable(adapter); |
1194 | vlan_group_set_device(adapter->vlgrp, vid, NULL); | ||
1195 | 1194 | ||
1196 | if (!test_bit(__IGBVF_DOWN, &adapter->state)) | 1195 | if (!test_bit(__IGBVF_DOWN, &adapter->state)) |
1197 | igbvf_irq_enable(adapter); | 1196 | igbvf_irq_enable(adapter); |
@@ -1199,30 +1198,16 @@ static void igbvf_vlan_rx_kill_vid(struct net_device *netdev, u16 vid) | |||
1199 | if (hw->mac.ops.set_vfta(hw, vid, false)) | 1198 | if (hw->mac.ops.set_vfta(hw, vid, false)) |
1200 | dev_err(&adapter->pdev->dev, | 1199 | dev_err(&adapter->pdev->dev, |
1201 | "Failed to remove vlan id %d\n", vid); | 1200 | "Failed to remove vlan id %d\n", vid); |
1202 | } | 1201 | else |
1203 | 1202 | clear_bit(vid, adapter->active_vlans); | |
1204 | static void igbvf_vlan_rx_register(struct net_device *netdev, | ||
1205 | struct vlan_group *grp) | ||
1206 | { | ||
1207 | struct igbvf_adapter *adapter = netdev_priv(netdev); | ||
1208 | |||
1209 | adapter->vlgrp = grp; | ||
1210 | } | 1203 | } |
1211 | 1204 | ||
1212 | static void igbvf_restore_vlan(struct igbvf_adapter *adapter) | 1205 | static void igbvf_restore_vlan(struct igbvf_adapter *adapter) |
1213 | { | 1206 | { |
1214 | u16 vid; | 1207 | u16 vid; |
1215 | 1208 | ||
1216 | if (!adapter->vlgrp) | 1209 | for_each_set_bit(vid, adapter->active_vlans, VLAN_N_VID) |
1217 | return; | ||
1218 | |||
1219 | for (vid = 0; vid < VLAN_N_VID; vid++) { | ||
1220 | if (!vlan_group_get_device(adapter->vlgrp, vid)) | ||
1221 | continue; | ||
1222 | igbvf_vlan_rx_add_vid(adapter->netdev, vid); | 1210 | igbvf_vlan_rx_add_vid(adapter->netdev, vid); |
1223 | } | ||
1224 | |||
1225 | igbvf_set_rlpml(adapter); | ||
1226 | } | 1211 | } |
1227 | 1212 | ||
1228 | /** | 1213 | /** |
@@ -2203,7 +2188,7 @@ static netdev_tx_t igbvf_xmit_frame_ring_adv(struct sk_buff *skb, | |||
2203 | return NETDEV_TX_BUSY; | 2188 | return NETDEV_TX_BUSY; |
2204 | } | 2189 | } |
2205 | 2190 | ||
2206 | if (adapter->vlgrp && vlan_tx_tag_present(skb)) { | 2191 | if (vlan_tx_tag_present(skb)) { |
2207 | tx_flags |= IGBVF_TX_FLAGS_VLAN; | 2192 | tx_flags |= IGBVF_TX_FLAGS_VLAN; |
2208 | tx_flags |= (vlan_tx_tag_get(skb) << IGBVF_TX_FLAGS_VLAN_SHIFT); | 2193 | tx_flags |= (vlan_tx_tag_get(skb) << IGBVF_TX_FLAGS_VLAN_SHIFT); |
2209 | } | 2194 | } |
@@ -2556,7 +2541,6 @@ static const struct net_device_ops igbvf_netdev_ops = { | |||
2556 | .ndo_change_mtu = igbvf_change_mtu, | 2541 | .ndo_change_mtu = igbvf_change_mtu, |
2557 | .ndo_do_ioctl = igbvf_ioctl, | 2542 | .ndo_do_ioctl = igbvf_ioctl, |
2558 | .ndo_tx_timeout = igbvf_tx_timeout, | 2543 | .ndo_tx_timeout = igbvf_tx_timeout, |
2559 | .ndo_vlan_rx_register = igbvf_vlan_rx_register, | ||
2560 | .ndo_vlan_rx_add_vid = igbvf_vlan_rx_add_vid, | 2544 | .ndo_vlan_rx_add_vid = igbvf_vlan_rx_add_vid, |
2561 | .ndo_vlan_rx_kill_vid = igbvf_vlan_rx_kill_vid, | 2545 | .ndo_vlan_rx_kill_vid = igbvf_vlan_rx_kill_vid, |
2562 | #ifdef CONFIG_NET_POLL_CONTROLLER | 2546 | #ifdef CONFIG_NET_POLL_CONTROLLER |