Commit 19ecae2c authored by Dimitris Michailidis's avatar Dimitris Michailidis Committed by David S. Miller

cxgb4: update to utilize the newer VLAN infrastructure

Signed-off-by: default avatarDimitris Michailidis <dm@chelsio.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 8f6d9f40
...@@ -281,7 +281,6 @@ struct sge_rspq; ...@@ -281,7 +281,6 @@ struct sge_rspq;
struct port_info { struct port_info {
struct adapter *adapter; struct adapter *adapter;
struct vlan_group *vlan_grp;
u16 viid; u16 viid;
s16 xact_addr_filt; /* index of exact MAC address filter */ s16 xact_addr_filt; /* index of exact MAC address filter */
u16 rss_size; /* size of VI's RSS table slice */ u16 rss_size; /* size of VI's RSS table slice */
......
...@@ -403,7 +403,7 @@ static int link_start(struct net_device *dev) ...@@ -403,7 +403,7 @@ static int link_start(struct net_device *dev)
* that step explicitly. * that step explicitly.
*/ */
ret = t4_set_rxmode(pi->adapter, mb, pi->viid, dev->mtu, -1, -1, -1, ret = t4_set_rxmode(pi->adapter, mb, pi->viid, dev->mtu, -1, -1, -1,
pi->vlan_grp != NULL, true); !!(dev->features & NETIF_F_HW_VLAN_RX), true);
if (ret == 0) { if (ret == 0) {
ret = t4_change_mac(pi->adapter, mb, pi->viid, ret = t4_change_mac(pi->adapter, mb, pi->viid,
pi->xact_addr_filt, dev->dev_addr, true, pi->xact_addr_filt, dev->dev_addr, true,
...@@ -1881,7 +1881,24 @@ static int set_tso(struct net_device *dev, u32 value) ...@@ -1881,7 +1881,24 @@ static int set_tso(struct net_device *dev, u32 value)
static int set_flags(struct net_device *dev, u32 flags) static int set_flags(struct net_device *dev, u32 flags)
{ {
return ethtool_op_set_flags(dev, flags, ETH_FLAG_RXHASH); int err;
unsigned long old_feat = dev->features;
err = ethtool_op_set_flags(dev, flags, ETH_FLAG_RXHASH |
ETH_FLAG_RXVLAN | ETH_FLAG_TXVLAN);
if (err)
return err;
if ((old_feat ^ dev->features) & NETIF_F_HW_VLAN_RX) {
const struct port_info *pi = netdev_priv(dev);
err = t4_set_rxmode(pi->adapter, pi->adapter->fn, pi->viid, -1,
-1, -1, -1, !!(flags & ETH_FLAG_RXVLAN),
true);
if (err)
dev->features = old_feat;
}
return err;
} }
static int get_rss_table(struct net_device *dev, struct ethtool_rxfh_indir *p) static int get_rss_table(struct net_device *dev, struct ethtool_rxfh_indir *p)
...@@ -2842,15 +2859,6 @@ static int cxgb_set_mac_addr(struct net_device *dev, void *p) ...@@ -2842,15 +2859,6 @@ static int cxgb_set_mac_addr(struct net_device *dev, void *p)
return 0; return 0;
} }
static void vlan_rx_register(struct net_device *dev, struct vlan_group *grp)
{
struct port_info *pi = netdev_priv(dev);
pi->vlan_grp = grp;
t4_set_rxmode(pi->adapter, pi->adapter->fn, pi->viid, -1, -1, -1, -1,
grp != NULL, true);
}
#ifdef CONFIG_NET_POLL_CONTROLLER #ifdef CONFIG_NET_POLL_CONTROLLER
static void cxgb_netpoll(struct net_device *dev) static void cxgb_netpoll(struct net_device *dev)
{ {
...@@ -2878,7 +2886,6 @@ static const struct net_device_ops cxgb4_netdev_ops = { ...@@ -2878,7 +2886,6 @@ static const struct net_device_ops cxgb4_netdev_ops = {
.ndo_validate_addr = eth_validate_addr, .ndo_validate_addr = eth_validate_addr,
.ndo_do_ioctl = cxgb_ioctl, .ndo_do_ioctl = cxgb_ioctl,
.ndo_change_mtu = cxgb_change_mtu, .ndo_change_mtu = cxgb_change_mtu,
.ndo_vlan_rx_register = vlan_rx_register,
#ifdef CONFIG_NET_POLL_CONTROLLER #ifdef CONFIG_NET_POLL_CONTROLLER
.ndo_poll_controller = cxgb_netpoll, .ndo_poll_controller = cxgb_netpoll,
#endif #endif
......
...@@ -1530,18 +1530,11 @@ static void do_gro(struct sge_eth_rxq *rxq, const struct pkt_gl *gl, ...@@ -1530,18 +1530,11 @@ static void do_gro(struct sge_eth_rxq *rxq, const struct pkt_gl *gl,
skb->rxhash = (__force u32)pkt->rsshdr.hash_val; skb->rxhash = (__force u32)pkt->rsshdr.hash_val;
if (unlikely(pkt->vlan_ex)) { if (unlikely(pkt->vlan_ex)) {
struct port_info *pi = netdev_priv(rxq->rspq.netdev); __vlan_hwaccel_put_tag(skb, ntohs(pkt->vlan));
struct vlan_group *grp = pi->vlan_grp;
rxq->stats.vlan_ex++; rxq->stats.vlan_ex++;
if (likely(grp)) {
ret = vlan_gro_frags(&rxq->rspq.napi, grp,
ntohs(pkt->vlan));
goto stats;
}
} }
ret = napi_gro_frags(&rxq->rspq.napi); ret = napi_gro_frags(&rxq->rspq.napi);
stats: if (ret == GRO_HELD) if (ret == GRO_HELD)
rxq->stats.lro_pkts++; rxq->stats.lro_pkts++;
else if (ret == GRO_MERGED || ret == GRO_MERGED_FREE) else if (ret == GRO_MERGED || ret == GRO_MERGED_FREE)
rxq->stats.lro_merged++; rxq->stats.lro_merged++;
...@@ -1608,16 +1601,10 @@ int t4_ethrx_handler(struct sge_rspq *q, const __be64 *rsp, ...@@ -1608,16 +1601,10 @@ int t4_ethrx_handler(struct sge_rspq *q, const __be64 *rsp,
skb_checksum_none_assert(skb); skb_checksum_none_assert(skb);
if (unlikely(pkt->vlan_ex)) { if (unlikely(pkt->vlan_ex)) {
struct vlan_group *grp = pi->vlan_grp; __vlan_hwaccel_put_tag(skb, ntohs(pkt->vlan));
rxq->stats.vlan_ex++; rxq->stats.vlan_ex++;
if (likely(grp)) }
vlan_hwaccel_receive_skb(skb, grp, ntohs(pkt->vlan)); netif_receive_skb(skb);
else
dev_kfree_skb_any(skb);
} else
netif_receive_skb(skb);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment