aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/igbvf
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/igbvf')
-rw-r--r--drivers/net/igbvf/igbvf.h4
-rw-r--r--drivers/net/igbvf/netdev.c44
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
111static inline void igbvf_rx_checksum_adv(struct igbvf_adapter *adapter, 111static 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 */
1168static void igbvf_set_rlpml(struct igbvf_adapter *adapter) 1168static 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
1188static void igbvf_vlan_rx_kill_vid(struct net_device *netdev, u16 vid) 1188static 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);
1204static 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
1212static void igbvf_restore_vlan(struct igbvf_adapter *adapter) 1205static 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