Commit 7d0fd211 authored by Jesse Gross's avatar Jesse Gross Committed by David S. Miller

bnx2: Update bnx2 to use new vlan accleration.

Make the bnx2 driver use the new vlan accleration model.
Signed-off-by: default avatarJesse Gross <jesse@nicira.com>
CC: Michael Chan <mchan@broadcom.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 361ff8a6
...@@ -37,9 +37,6 @@ ...@@ -37,9 +37,6 @@
#include <linux/ethtool.h> #include <linux/ethtool.h>
#include <linux/mii.h> #include <linux/mii.h>
#include <linux/if_vlan.h> #include <linux/if_vlan.h>
#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
#define BCM_VLAN 1
#endif
#include <net/ip.h> #include <net/ip.h>
#include <net/tcp.h> #include <net/tcp.h>
#include <net/checksum.h> #include <net/checksum.h>
...@@ -3087,8 +3084,6 @@ bnx2_rx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget) ...@@ -3087,8 +3084,6 @@ bnx2_rx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget)
struct sw_bd *rx_buf, *next_rx_buf; struct sw_bd *rx_buf, *next_rx_buf;
struct sk_buff *skb; struct sk_buff *skb;
dma_addr_t dma_addr; dma_addr_t dma_addr;
u16 vtag = 0;
int hw_vlan __maybe_unused = 0;
sw_ring_cons = RX_RING_IDX(sw_cons); sw_ring_cons = RX_RING_IDX(sw_cons);
sw_ring_prod = RX_RING_IDX(sw_prod); sw_ring_prod = RX_RING_IDX(sw_prod);
...@@ -3168,23 +3163,8 @@ bnx2_rx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget) ...@@ -3168,23 +3163,8 @@ bnx2_rx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget)
goto next_rx; goto next_rx;
if ((status & L2_FHDR_STATUS_L2_VLAN_TAG) && if ((status & L2_FHDR_STATUS_L2_VLAN_TAG) &&
!(bp->rx_mode & BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG)) { !(bp->rx_mode & BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG))
vtag = rx_hdr->l2_fhdr_vlan_tag; __vlan_hwaccel_put_tag(skb, rx_hdr->l2_fhdr_vlan_tag);
#ifdef BCM_VLAN
if (bp->vlgrp)
hw_vlan = 1;
else
#endif
{
struct vlan_ethhdr *ve = (struct vlan_ethhdr *)
__skb_push(skb, 4);
memmove(ve, skb->data + 4, ETH_ALEN * 2);
ve->h_vlan_proto = htons(ETH_P_8021Q);
ve->h_vlan_TCI = htons(vtag);
len += 4;
}
}
skb->protocol = eth_type_trans(skb, bp->dev); skb->protocol = eth_type_trans(skb, bp->dev);
...@@ -3211,14 +3191,7 @@ bnx2_rx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget) ...@@ -3211,14 +3191,7 @@ bnx2_rx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget)
skb->rxhash = rx_hdr->l2_fhdr_hash; skb->rxhash = rx_hdr->l2_fhdr_hash;
skb_record_rx_queue(skb, bnapi - &bp->bnx2_napi[0]); skb_record_rx_queue(skb, bnapi - &bp->bnx2_napi[0]);
napi_gro_receive(&bnapi->napi, skb);
#ifdef BCM_VLAN
if (hw_vlan)
vlan_gro_receive(&bnapi->napi, bp->vlgrp, vtag, skb);
else
#endif
napi_gro_receive(&bnapi->napi, skb);
rx_pkt++; rx_pkt++;
next_rx: next_rx:
...@@ -3533,13 +3506,9 @@ bnx2_set_rx_mode(struct net_device *dev) ...@@ -3533,13 +3506,9 @@ bnx2_set_rx_mode(struct net_device *dev)
rx_mode = bp->rx_mode & ~(BNX2_EMAC_RX_MODE_PROMISCUOUS | rx_mode = bp->rx_mode & ~(BNX2_EMAC_RX_MODE_PROMISCUOUS |
BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG); BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG);
sort_mode = 1 | BNX2_RPM_SORT_USER0_BC_EN; sort_mode = 1 | BNX2_RPM_SORT_USER0_BC_EN;
#ifdef BCM_VLAN if (!(dev->features & NETIF_F_HW_VLAN_RX) &&
if (!bp->vlgrp && (bp->flags & BNX2_FLAG_CAN_KEEP_VLAN)) (bp->flags & BNX2_FLAG_CAN_KEEP_VLAN))
rx_mode |= BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG; rx_mode |= BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG;
#else
if (bp->flags & BNX2_FLAG_CAN_KEEP_VLAN)
rx_mode |= BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG;
#endif
if (dev->flags & IFF_PROMISC) { if (dev->flags & IFF_PROMISC) {
/* Promiscuous mode. */ /* Promiscuous mode. */
rx_mode |= BNX2_EMAC_RX_MODE_PROMISCUOUS; rx_mode |= BNX2_EMAC_RX_MODE_PROMISCUOUS;
...@@ -6365,29 +6334,6 @@ bnx2_tx_timeout(struct net_device *dev) ...@@ -6365,29 +6334,6 @@ bnx2_tx_timeout(struct net_device *dev)
schedule_work(&bp->reset_task); schedule_work(&bp->reset_task);
} }
#ifdef BCM_VLAN
/* Called with rtnl_lock */
static void
bnx2_vlan_rx_register(struct net_device *dev, struct vlan_group *vlgrp)
{
struct bnx2 *bp = netdev_priv(dev);
if (netif_running(dev))
bnx2_netif_stop(bp, false);
bp->vlgrp = vlgrp;
if (!netif_running(dev))
return;
bnx2_set_rx_mode(dev);
if (bp->flags & BNX2_FLAG_CAN_KEEP_VLAN)
bnx2_fw_sync(bp, BNX2_DRV_MSG_CODE_KEEP_VLAN_UPDATE, 0, 1);
bnx2_netif_start(bp, false);
}
#endif
/* Called with netif_tx_lock. /* Called with netif_tx_lock.
* bnx2_tx_int() runs without netif_tx_lock unless it needs to call * bnx2_tx_int() runs without netif_tx_lock unless it needs to call
* netif_wake_queue(). * netif_wake_queue().
...@@ -6428,12 +6374,11 @@ bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -6428,12 +6374,11 @@ bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev)
vlan_tag_flags |= TX_BD_FLAGS_TCP_UDP_CKSUM; vlan_tag_flags |= TX_BD_FLAGS_TCP_UDP_CKSUM;
} }
#ifdef BCM_VLAN
if (vlan_tx_tag_present(skb)) { if (vlan_tx_tag_present(skb)) {
vlan_tag_flags |= vlan_tag_flags |=
(TX_BD_FLAGS_VLAN_TAG | (vlan_tx_tag_get(skb) << 16)); (TX_BD_FLAGS_VLAN_TAG | (vlan_tx_tag_get(skb) << 16));
} }
#endif
if ((mss = skb_shinfo(skb)->gso_size)) { if ((mss = skb_shinfo(skb)->gso_size)) {
u32 tcp_opt_len; u32 tcp_opt_len;
struct iphdr *iph; struct iphdr *iph;
...@@ -7578,7 +7523,28 @@ bnx2_set_tx_csum(struct net_device *dev, u32 data) ...@@ -7578,7 +7523,28 @@ bnx2_set_tx_csum(struct net_device *dev, u32 data)
static int static int
bnx2_set_flags(struct net_device *dev, u32 data) bnx2_set_flags(struct net_device *dev, u32 data)
{ {
return ethtool_op_set_flags(dev, data, ETH_FLAG_RXHASH); struct bnx2 *bp = netdev_priv(dev);
int rc;
if (!(bp->flags & BNX2_FLAG_CAN_KEEP_VLAN) &&
!(data & ETH_FLAG_RXVLAN))
return -EOPNOTSUPP;
rc = ethtool_op_set_flags(dev, data, ETH_FLAG_RXHASH | ETH_FLAG_RXVLAN |
ETH_FLAG_TXVLAN);
if (rc)
return rc;
if ((!!(data & ETH_FLAG_RXVLAN) !=
!!(bp->rx_mode & BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG)) &&
netif_running(dev)) {
bnx2_netif_stop(bp, false);
bnx2_set_rx_mode(dev);
bnx2_fw_sync(bp, BNX2_DRV_MSG_CODE_KEEP_VLAN_UPDATE, 0, 1);
bnx2_netif_start(bp, false);
}
return 0;
} }
static const struct ethtool_ops bnx2_ethtool_ops = { static const struct ethtool_ops bnx2_ethtool_ops = {
...@@ -8318,9 +8284,6 @@ static const struct net_device_ops bnx2_netdev_ops = { ...@@ -8318,9 +8284,6 @@ static const struct net_device_ops bnx2_netdev_ops = {
.ndo_set_mac_address = bnx2_change_mac_addr, .ndo_set_mac_address = bnx2_change_mac_addr,
.ndo_change_mtu = bnx2_change_mtu, .ndo_change_mtu = bnx2_change_mtu,
.ndo_tx_timeout = bnx2_tx_timeout, .ndo_tx_timeout = bnx2_tx_timeout,
#ifdef BCM_VLAN
.ndo_vlan_rx_register = bnx2_vlan_rx_register,
#endif
#ifdef CONFIG_NET_POLL_CONTROLLER #ifdef CONFIG_NET_POLL_CONTROLLER
.ndo_poll_controller = poll_bnx2, .ndo_poll_controller = poll_bnx2,
#endif #endif
...@@ -8328,9 +8291,7 @@ static const struct net_device_ops bnx2_netdev_ops = { ...@@ -8328,9 +8291,7 @@ static const struct net_device_ops bnx2_netdev_ops = {
static void inline vlan_features_add(struct net_device *dev, unsigned long flags) static void inline vlan_features_add(struct net_device *dev, unsigned long flags)
{ {
#ifdef BCM_VLAN
dev->vlan_features |= flags; dev->vlan_features |= flags;
#endif
} }
static int __devinit static int __devinit
...@@ -8379,9 +8340,7 @@ bnx2_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -8379,9 +8340,7 @@ bnx2_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
dev->features |= NETIF_F_IPV6_CSUM; dev->features |= NETIF_F_IPV6_CSUM;
vlan_features_add(dev, NETIF_F_IPV6_CSUM); vlan_features_add(dev, NETIF_F_IPV6_CSUM);
} }
#ifdef BCM_VLAN
dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
#endif
dev->features |= NETIF_F_TSO | NETIF_F_TSO_ECN; dev->features |= NETIF_F_TSO | NETIF_F_TSO_ECN;
vlan_features_add(dev, NETIF_F_TSO | NETIF_F_TSO_ECN); vlan_features_add(dev, NETIF_F_TSO | NETIF_F_TSO_ECN);
if (CHIP_NUM(bp) == CHIP_NUM_5709) { if (CHIP_NUM(bp) == CHIP_NUM_5709) {
......
...@@ -6742,10 +6742,6 @@ struct bnx2 { ...@@ -6742,10 +6742,6 @@ struct bnx2 {
struct bnx2_napi bnx2_napi[BNX2_MAX_MSIX_VEC]; struct bnx2_napi bnx2_napi[BNX2_MAX_MSIX_VEC];
#ifdef BCM_VLAN
struct vlan_group *vlgrp;
#endif
u32 rx_buf_use_size; /* useable size */ u32 rx_buf_use_size; /* useable size */
u32 rx_buf_size; /* with alignment */ u32 rx_buf_size; /* with alignment */
u32 rx_copy_thresh; u32 rx_copy_thresh;
......
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