cxgb4: update to utilize the newer VLAN infrastructure
Signed-off-by: Dimitris Michailidis <dm@chelsio.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
8f6d9f4047
commit
19ecae2c8f
@@ -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)
|
|||||||
* 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)
|
|||||||
|
|
||||||
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)
|
|||||||
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 = {
|
|||||||
.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,
|
|||||||
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,
|
|||||||
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));
|
|
||||||
else
|
|
||||||
dev_kfree_skb_any(skb);
|
|
||||||
} else
|
|
||||||
netif_receive_skb(skb);
|
netif_receive_skb(skb);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user