提交 9bcc0893 编写于 作者: H Hao Zheng 提交者: David S. Miller

bnx2x: Update bnx2x to use new vlan accleration.

Make the bnx2x driver use the new vlan accleration model.
Signed-off-by: NHao Zheng <hzheng@nicira.com>
Signed-off-by: NJesse Gross <jesse@nicira.com>
CC: Eilon Greenstein <eilong@broadcom.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 f62bbb5e
...@@ -24,10 +24,6 @@ ...@@ -24,10 +24,6 @@
#define DRV_MODULE_RELDATE "2010/10/19" #define DRV_MODULE_RELDATE "2010/10/19"
#define BNX2X_BC_VER 0x040200 #define BNX2X_BC_VER 0x040200
#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
#define BCM_VLAN 1
#endif
#define BNX2X_MULTI_QUEUE #define BNX2X_MULTI_QUEUE
#define BNX2X_NEW_NAPI #define BNX2X_NEW_NAPI
...@@ -858,10 +854,6 @@ struct bnx2x { ...@@ -858,10 +854,6 @@ struct bnx2x {
int tx_ring_size; int tx_ring_size;
#ifdef BCM_VLAN
struct vlan_group *vlgrp;
#endif
u32 rx_csum; u32 rx_csum;
u32 rx_buf_size; u32 rx_buf_size;
/* L2 header size + 2*VLANs (8 bytes) + LLC SNAP (8 bytes) */ /* L2 header size + 2*VLANs (8 bytes) + LLC SNAP (8 bytes) */
...@@ -925,8 +917,6 @@ struct bnx2x { ...@@ -925,8 +917,6 @@ struct bnx2x {
#define NO_MCP_FLAG 0x100 #define NO_MCP_FLAG 0x100
#define DISABLE_MSI_FLAG 0x200 #define DISABLE_MSI_FLAG 0x200
#define BP_NOMCP(bp) (bp->flags & NO_MCP_FLAG) #define BP_NOMCP(bp) (bp->flags & NO_MCP_FLAG)
#define HW_VLAN_TX_FLAG 0x400
#define HW_VLAN_RX_FLAG 0x800
#define MF_FUNC_DIS 0x1000 #define MF_FUNC_DIS 0x1000
int pf_num; /* absolute PF number */ int pf_num; /* absolute PF number */
......
...@@ -16,16 +16,13 @@ ...@@ -16,16 +16,13 @@
*/ */
#include <linux/etherdevice.h> #include <linux/etherdevice.h>
#include <linux/if_vlan.h>
#include <linux/ip.h> #include <linux/ip.h>
#include <net/ipv6.h> #include <net/ipv6.h>
#include <net/ip6_checksum.h> #include <net/ip6_checksum.h>
#include <linux/firmware.h> #include <linux/firmware.h>
#include "bnx2x_cmn.h" #include "bnx2x_cmn.h"
#ifdef BCM_VLAN
#include <linux/if_vlan.h>
#endif
#include "bnx2x_init.h" #include "bnx2x_init.h"
...@@ -346,13 +343,6 @@ static void bnx2x_tpa_stop(struct bnx2x *bp, struct bnx2x_fastpath *fp, ...@@ -346,13 +343,6 @@ static void bnx2x_tpa_stop(struct bnx2x *bp, struct bnx2x_fastpath *fp,
if (likely(new_skb)) { if (likely(new_skb)) {
/* fix ip xsum and give it to the stack */ /* fix ip xsum and give it to the stack */
/* (no need to map the new skb) */ /* (no need to map the new skb) */
#ifdef BCM_VLAN
int is_vlan_cqe =
(le16_to_cpu(cqe->fast_path_cqe.pars_flags.flags) &
PARSING_FLAGS_VLAN);
int is_not_hwaccel_vlan_cqe =
(is_vlan_cqe && (!(bp->flags & HW_VLAN_RX_FLAG)));
#endif
prefetch(skb); prefetch(skb);
prefetch(((char *)(skb)) + L1_CACHE_BYTES); prefetch(((char *)(skb)) + L1_CACHE_BYTES);
...@@ -377,28 +367,18 @@ static void bnx2x_tpa_stop(struct bnx2x *bp, struct bnx2x_fastpath *fp, ...@@ -377,28 +367,18 @@ static void bnx2x_tpa_stop(struct bnx2x *bp, struct bnx2x_fastpath *fp,
struct iphdr *iph; struct iphdr *iph;
iph = (struct iphdr *)skb->data; iph = (struct iphdr *)skb->data;
#ifdef BCM_VLAN
/* If there is no Rx VLAN offloading -
take VLAN tag into an account */
if (unlikely(is_not_hwaccel_vlan_cqe))
iph = (struct iphdr *)((u8 *)iph + VLAN_HLEN);
#endif
iph->check = 0; iph->check = 0;
iph->check = ip_fast_csum((u8 *)iph, iph->ihl); iph->check = ip_fast_csum((u8 *)iph, iph->ihl);
} }
if (!bnx2x_fill_frag_skb(bp, fp, skb, if (!bnx2x_fill_frag_skb(bp, fp, skb,
&cqe->fast_path_cqe, cqe_idx)) { &cqe->fast_path_cqe, cqe_idx)) {
#ifdef BCM_VLAN if ((le16_to_cpu(cqe->fast_path_cqe.
if ((bp->vlgrp != NULL) && pars_flags.flags) & PARSING_FLAGS_VLAN))
(le16_to_cpu(cqe->fast_path_cqe. __vlan_hwaccel_put_tag(skb,
pars_flags.flags) & PARSING_FLAGS_VLAN))
vlan_gro_receive(&fp->napi, bp->vlgrp,
le16_to_cpu(cqe->fast_path_cqe. le16_to_cpu(cqe->fast_path_cqe.
vlan_tag), skb); vlan_tag));
else napi_gro_receive(&fp->napi, skb);
#endif
napi_gro_receive(&fp->napi, skb);
} else { } else {
DP(NETIF_MSG_RX_STATUS, "Failed to allocate new pages" DP(NETIF_MSG_RX_STATUS, "Failed to allocate new pages"
" - dropping packet!\n"); " - dropping packet!\n");
...@@ -633,15 +613,11 @@ int bnx2x_rx_int(struct bnx2x_fastpath *fp, int budget) ...@@ -633,15 +613,11 @@ int bnx2x_rx_int(struct bnx2x_fastpath *fp, int budget)
skb_record_rx_queue(skb, fp->index); skb_record_rx_queue(skb, fp->index);
#ifdef BCM_VLAN if (le16_to_cpu(cqe->fast_path_cqe.pars_flags.flags) &
if ((bp->vlgrp != NULL) && (bp->flags & HW_VLAN_RX_FLAG) && PARSING_FLAGS_VLAN)
(le16_to_cpu(cqe->fast_path_cqe.pars_flags.flags) & __vlan_hwaccel_put_tag(skb,
PARSING_FLAGS_VLAN)) le16_to_cpu(cqe->fast_path_cqe.vlan_tag));
vlan_gro_receive(&fp->napi, bp->vlgrp, napi_gro_receive(&fp->napi, skb);
le16_to_cpu(cqe->fast_path_cqe.vlan_tag), skb);
else
#endif
napi_gro_receive(&fp->napi, skb);
next_rx: next_rx:
...@@ -2025,14 +2001,12 @@ netdev_tx_t bnx2x_start_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -2025,14 +2001,12 @@ netdev_tx_t bnx2x_start_xmit(struct sk_buff *skb, struct net_device *dev)
"sending pkt %u @%p next_idx %u bd %u @%p\n", "sending pkt %u @%p next_idx %u bd %u @%p\n",
pkt_prod, tx_buf, fp->tx_pkt_prod, bd_prod, tx_start_bd); pkt_prod, tx_buf, fp->tx_pkt_prod, bd_prod, tx_start_bd);
#ifdef BCM_VLAN
if (vlan_tx_tag_present(skb)) { if (vlan_tx_tag_present(skb)) {
tx_start_bd->vlan_or_ethertype = tx_start_bd->vlan_or_ethertype =
cpu_to_le16(vlan_tx_tag_get(skb)); cpu_to_le16(vlan_tx_tag_get(skb));
tx_start_bd->bd_flags.as_bitfield |= tx_start_bd->bd_flags.as_bitfield |=
(X_ETH_OUTBAND_VLAN << ETH_TX_BD_FLAGS_VLAN_MODE_SHIFT); (X_ETH_OUTBAND_VLAN << ETH_TX_BD_FLAGS_VLAN_MODE_SHIFT);
} else } else
#endif
tx_start_bd->vlan_or_ethertype = cpu_to_le16(pkt_prod); tx_start_bd->vlan_or_ethertype = cpu_to_le16(pkt_prod);
/* turn on parsing and get a BD */ /* turn on parsing and get a BD */
...@@ -2317,18 +2291,6 @@ void bnx2x_tx_timeout(struct net_device *dev) ...@@ -2317,18 +2291,6 @@ void bnx2x_tx_timeout(struct net_device *dev)
schedule_delayed_work(&bp->reset_task, 0); schedule_delayed_work(&bp->reset_task, 0);
} }
#ifdef BCM_VLAN
/* called with rtnl_lock */
void bnx2x_vlan_rx_register(struct net_device *dev,
struct vlan_group *vlgrp)
{
struct bnx2x *bp = netdev_priv(dev);
bp->vlgrp = vlgrp;
}
#endif
int bnx2x_suspend(struct pci_dev *pdev, pm_message_t state) int bnx2x_suspend(struct pci_dev *pdev, pm_message_t state)
{ {
struct net_device *dev = pci_get_drvdata(pdev); struct net_device *dev = pci_get_drvdata(pdev);
......
...@@ -1117,35 +1117,34 @@ static int bnx2x_set_flags(struct net_device *dev, u32 data) ...@@ -1117,35 +1117,34 @@ static int bnx2x_set_flags(struct net_device *dev, u32 data)
int changed = 0; int changed = 0;
int rc = 0; int rc = 0;
if (data & ~(ETH_FLAG_LRO | ETH_FLAG_RXHASH))
return -EINVAL;
if (bp->recovery_state != BNX2X_RECOVERY_DONE) { if (bp->recovery_state != BNX2X_RECOVERY_DONE) {
printk(KERN_ERR "Handling parity error recovery. Try again later\n"); printk(KERN_ERR "Handling parity error recovery. Try again later\n");
return -EAGAIN; return -EAGAIN;
} }
if (!(data & ETH_FLAG_RXVLAN))
return -EOPNOTSUPP;
if ((data & ETH_FLAG_LRO) && bp->rx_csum && bp->disable_tpa)
return -EINVAL;
rc = ethtool_op_set_flags(dev, data, ETH_FLAG_LRO | ETH_FLAG_RXVLAN |
ETH_FLAG_TXVLAN | ETH_FLAG_RXHASH);
if (rc)
return rc;
/* TPA requires Rx CSUM offloading */ /* TPA requires Rx CSUM offloading */
if ((data & ETH_FLAG_LRO) && bp->rx_csum) { if ((data & ETH_FLAG_LRO) && bp->rx_csum) {
if (!bp->disable_tpa) { if (!(bp->flags & TPA_ENABLE_FLAG)) {
if (!(dev->features & NETIF_F_LRO)) { bp->flags |= TPA_ENABLE_FLAG;
dev->features |= NETIF_F_LRO; changed = 1;
bp->flags |= TPA_ENABLE_FLAG; }
changed = 1; } else if (bp->flags & TPA_ENABLE_FLAG) {
}
} else
rc = -EINVAL;
} else if (dev->features & NETIF_F_LRO) {
dev->features &= ~NETIF_F_LRO; dev->features &= ~NETIF_F_LRO;
bp->flags &= ~TPA_ENABLE_FLAG; bp->flags &= ~TPA_ENABLE_FLAG;
changed = 1; changed = 1;
} }
if (data & ETH_FLAG_RXHASH)
dev->features |= NETIF_F_RXHASH;
else
dev->features &= ~NETIF_F_RXHASH;
if (changed && netif_running(dev)) { if (changed && netif_running(dev)) {
bnx2x_nic_unload(bp, UNLOAD_NORMAL); bnx2x_nic_unload(bp, UNLOAD_NORMAL);
rc = bnx2x_nic_load(bp, LOAD_NORMAL); rc = bnx2x_nic_load(bp, LOAD_NORMAL);
......
...@@ -2371,10 +2371,8 @@ static inline u16 bnx2x_get_cl_flags(struct bnx2x *bp, ...@@ -2371,10 +2371,8 @@ static inline u16 bnx2x_get_cl_flags(struct bnx2x *bp,
flags |= QUEUE_FLG_HC; flags |= QUEUE_FLG_HC;
flags |= IS_MF(bp) ? QUEUE_FLG_OV : 0; flags |= IS_MF(bp) ? QUEUE_FLG_OV : 0;
#ifdef BCM_VLAN
flags |= QUEUE_FLG_VLAN; flags |= QUEUE_FLG_VLAN;
DP(NETIF_MSG_IFUP, "vlan removal enabled\n"); DP(NETIF_MSG_IFUP, "vlan removal enabled\n");
#endif
if (!fp->disable_tpa) if (!fp->disable_tpa)
flags |= QUEUE_FLG_TPA; flags |= QUEUE_FLG_TPA;
...@@ -8630,9 +8628,6 @@ static const struct net_device_ops bnx2x_netdev_ops = { ...@@ -8630,9 +8628,6 @@ static const struct net_device_ops bnx2x_netdev_ops = {
.ndo_do_ioctl = bnx2x_ioctl, .ndo_do_ioctl = bnx2x_ioctl,
.ndo_change_mtu = bnx2x_change_mtu, .ndo_change_mtu = bnx2x_change_mtu,
.ndo_tx_timeout = bnx2x_tx_timeout, .ndo_tx_timeout = bnx2x_tx_timeout,
#ifdef BCM_VLAN
.ndo_vlan_rx_register = bnx2x_vlan_rx_register,
#endif
#ifdef CONFIG_NET_POLL_CONTROLLER #ifdef CONFIG_NET_POLL_CONTROLLER
.ndo_poll_controller = poll_bnx2x, .ndo_poll_controller = poll_bnx2x,
#endif #endif
...@@ -8764,9 +8759,7 @@ static int __devinit bnx2x_init_dev(struct pci_dev *pdev, ...@@ -8764,9 +8759,7 @@ static int __devinit bnx2x_init_dev(struct pci_dev *pdev,
dev->features |= NETIF_F_HIGHDMA; dev->features |= NETIF_F_HIGHDMA;
dev->features |= (NETIF_F_TSO | NETIF_F_TSO_ECN); dev->features |= (NETIF_F_TSO | NETIF_F_TSO_ECN);
dev->features |= NETIF_F_TSO6; dev->features |= NETIF_F_TSO6;
#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);
bp->flags |= (HW_VLAN_RX_FLAG | HW_VLAN_TX_FLAG);
dev->vlan_features |= NETIF_F_SG; dev->vlan_features |= NETIF_F_SG;
dev->vlan_features |= NETIF_F_HW_CSUM; dev->vlan_features |= NETIF_F_HW_CSUM;
...@@ -8774,7 +8767,6 @@ static int __devinit bnx2x_init_dev(struct pci_dev *pdev, ...@@ -8774,7 +8767,6 @@ static int __devinit bnx2x_init_dev(struct pci_dev *pdev,
dev->vlan_features |= NETIF_F_HIGHDMA; dev->vlan_features |= NETIF_F_HIGHDMA;
dev->vlan_features |= (NETIF_F_TSO | NETIF_F_TSO_ECN); dev->vlan_features |= (NETIF_F_TSO | NETIF_F_TSO_ECN);
dev->vlan_features |= NETIF_F_TSO6; dev->vlan_features |= NETIF_F_TSO6;
#endif
/* get_port_hwinfo() will set prtad and mmds properly */ /* get_port_hwinfo() will set prtad and mmds properly */
bp->mdio.prtad = MDIO_PRTAD_NONE; bp->mdio.prtad = MDIO_PRTAD_NONE;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册