[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <8628FE4E7912BF47A96AE7DD7BAC0AADDDEE429135@SJEXCHCCR02.corp.ad.broadcom.com>
Date: Thu, 21 Oct 2010 06:54:39 -0700
From: "Vladislav Zolotarov" <vladz@...adcom.com>
To: "Jesse Gross" <jesse@...ira.com>,
"David Miller" <davem@...emloft.net>
cc: "netdev@...r.kernel.org" <netdev@...r.kernel.org>,
"Hao Zheng" <hzheng@...ira.com>,
"Eilon Greenstein" <eilong@...adcom.com>
Subject: RE: [PATCH v2 11/14] bnx2x: Update bnx2x to use new vlan
accleration.
> -----Original Message-----
> From: netdev-owner@...r.kernel.org [mailto:netdev-
> owner@...r.kernel.org] On Behalf Of Jesse Gross
> Sent: Thursday, October 21, 2010 1:56 AM
> To: David Miller
> Cc: netdev@...r.kernel.org; Hao Zheng; Eilon Greenstein
> Subject: [PATCH v2 11/14] bnx2x: Update bnx2x to use new vlan
> accleration.
>
> From: Hao Zheng <hzheng@...ira.com>
>
> Make the bnx2x driver use the new vlan accleration model.
>
> Signed-off-by: Hao Zheng <hzheng@...ira.com>
> Signed-off-by: Jesse Gross <jesse@...ira.com>
> CC: Eilon Greenstein <eilong@...adcom.com>
> ---
> drivers/net/bnx2x/bnx2x.h | 10 ------
> drivers/net/bnx2x/bnx2x_cmn.c | 60 +++++++----------------------
> --------
> drivers/net/bnx2x/bnx2x_ethtool.c | 33 ++++++++++----------
> drivers/net/bnx2x/bnx2x_main.c | 8 -----
> 4 files changed, 27 insertions(+), 84 deletions(-)
>
> diff --git a/drivers/net/bnx2x/bnx2x.h b/drivers/net/bnx2x/bnx2x.h
> index 3bf236b..9571ecf 100644
> --- a/drivers/net/bnx2x/bnx2x.h
> +++ b/drivers/net/bnx2x/bnx2x.h
> @@ -24,10 +24,6 @@
> #define DRV_MODULE_RELDATE "2010/10/19"
> #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_NEW_NAPI
> @@ -858,10 +854,6 @@ struct bnx2x {
>
> int tx_ring_size;
>
> -#ifdef BCM_VLAN
> - struct vlan_group *vlgrp;
> -#endif
> -
> u32 rx_csum;
> u32 rx_buf_size;
> /* L2 header size + 2*VLANs (8 bytes) + LLC SNAP (8 bytes) */
> @@ -925,8 +917,6 @@ struct bnx2x {
> #define NO_MCP_FLAG 0x100
> #define DISABLE_MSI_FLAG 0x200
> #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
>
> int pf_num; /* absolute PF number */
> diff --git a/drivers/net/bnx2x/bnx2x_cmn.c
> b/drivers/net/bnx2x/bnx2x_cmn.c
> index 6905b2e..bc58375 100644
> --- a/drivers/net/bnx2x/bnx2x_cmn.c
> +++ b/drivers/net/bnx2x/bnx2x_cmn.c
> @@ -16,16 +16,13 @@
> */
>
> #include <linux/etherdevice.h>
> +#include <linux/if_vlan.h>
> #include <linux/ip.h>
> #include <net/ipv6.h>
> #include <net/ip6_checksum.h>
> #include <linux/firmware.h>
> #include "bnx2x_cmn.h"
>
> -#ifdef BCM_VLAN
> -#include <linux/if_vlan.h>
> -#endif
> -
> #include "bnx2x_init.h"
>
>
> @@ -346,13 +343,6 @@ static void bnx2x_tpa_stop(struct bnx2x *bp,
> struct bnx2x_fastpath *fp,
> if (likely(new_skb)) {
> /* fix ip xsum and give it to the stack */
> /* (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(((char *)(skb)) + L1_CACHE_BYTES);
> @@ -377,28 +367,18 @@ static void bnx2x_tpa_stop(struct bnx2x *bp,
> struct bnx2x_fastpath *fp,
> struct iphdr *iph;
>
> 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 = ip_fast_csum((u8 *)iph, iph->ihl);
> }
>
> if (!bnx2x_fill_frag_skb(bp, fp, skb,
> &cqe->fast_path_cqe, cqe_idx)) {
> -#ifdef BCM_VLAN
> - if ((bp->vlgrp != NULL) &&
> - (le16_to_cpu(cqe->fast_path_cqe.
> - pars_flags.flags) & PARSING_FLAGS_VLAN))
> - vlan_gro_receive(&fp->napi, bp->vlgrp,
> + if ((le16_to_cpu(cqe->fast_path_cqe.
> + pars_flags.flags) & PARSING_FLAGS_VLAN))
> + __vlan_hwaccel_put_tag(skb,
> le16_to_cpu(cqe->fast_path_cqe.
> - vlan_tag), skb);
> - else
> -#endif
> - napi_gro_receive(&fp->napi, skb);
> + vlan_tag));
> + napi_gro_receive(&fp->napi, skb);
> } else {
> DP(NETIF_MSG_RX_STATUS, "Failed to allocate new
> pages"
> " - dropping packet!\n");
> @@ -633,15 +613,11 @@ reuse_rx:
>
> skb_record_rx_queue(skb, fp->index);
>
> -#ifdef BCM_VLAN
> - if ((bp->vlgrp != NULL) && (bp->flags & HW_VLAN_RX_FLAG) &&
> - (le16_to_cpu(cqe->fast_path_cqe.pars_flags.flags) &
> - PARSING_FLAGS_VLAN))
> - vlan_gro_receive(&fp->napi, bp->vlgrp,
> - le16_to_cpu(cqe->fast_path_cqe.vlan_tag), skb);
> - else
> -#endif
> - napi_gro_receive(&fp->napi, skb);
> + if (le16_to_cpu(cqe->fast_path_cqe.pars_flags.flags) &
> + PARSING_FLAGS_VLAN)
> + __vlan_hwaccel_put_tag(skb,
> + le16_to_cpu(cqe->fast_path_cqe.vlan_tag));
> + napi_gro_receive(&fp->napi, skb);
>
>
> next_rx:
> @@ -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",
> pkt_prod, tx_buf, fp->tx_pkt_prod, bd_prod, tx_start_bd);
>
> -#ifdef BCM_VLAN
> if (vlan_tx_tag_present(skb)) {
> tx_start_bd->vlan_or_ethertype =
> cpu_to_le16(vlan_tx_tag_get(skb));
> tx_start_bd->bd_flags.as_bitfield |=
> (X_ETH_OUTBAND_VLAN <<
> ETH_TX_BD_FLAGS_VLAN_MODE_SHIFT);
> } else
> -#endif
> tx_start_bd->vlan_or_ethertype = cpu_to_le16(pkt_prod);
>
> /* turn on parsing and get a BD */
> @@ -2317,18 +2291,6 @@ void bnx2x_tx_timeout(struct net_device *dev)
> 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)
> {
> struct net_device *dev = pci_get_drvdata(pdev);
> diff --git a/drivers/net/bnx2x/bnx2x_ethtool.c
> b/drivers/net/bnx2x/bnx2x_ethtool.c
> index 54fe061..daefef6 100644
> --- a/drivers/net/bnx2x/bnx2x_ethtool.c
> +++ b/drivers/net/bnx2x/bnx2x_ethtool.c
> @@ -1117,35 +1117,34 @@ static int bnx2x_set_flags(struct net_device
> *dev, u32 data)
> int changed = 0;
> int rc = 0;
>
> - if (data & ~(ETH_FLAG_LRO | ETH_FLAG_RXHASH))
> - return -EINVAL;
> -
> if (bp->recovery_state != BNX2X_RECOVERY_DONE) {
> printk(KERN_ERR "Handling parity error recovery. Try again
> later\n");
> 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 */
> if ((data & ETH_FLAG_LRO) && bp->rx_csum) {
> - if (!bp->disable_tpa) {
> - if (!(dev->features & NETIF_F_LRO)) {
> - dev->features |= NETIF_F_LRO;
> - bp->flags |= TPA_ENABLE_FLAG;
> - changed = 1;
> - }
> - } else
> - rc = -EINVAL;
> - } else if (dev->features & NETIF_F_LRO) {
> + if (!(bp->flags & TPA_ENABLE_FLAG)) {
> + bp->flags |= TPA_ENABLE_FLAG;
> + changed = 1;
> + }
> + } else if (bp->flags & TPA_ENABLE_FLAG) {
> dev->features &= ~NETIF_F_LRO;
> bp->flags &= ~TPA_ENABLE_FLAG;
> changed = 1;
> }
>
> - if (data & ETH_FLAG_RXHASH)
> - dev->features |= NETIF_F_RXHASH;
> - else
> - dev->features &= ~NETIF_F_RXHASH;
> -
> if (changed && netif_running(dev)) {
> bnx2x_nic_unload(bp, UNLOAD_NORMAL);
> rc = bnx2x_nic_load(bp, LOAD_NORMAL);
> diff --git a/drivers/net/bnx2x/bnx2x_main.c
> b/drivers/net/bnx2x/bnx2x_main.c
> index f22e283..ff99a2f 100644
> --- a/drivers/net/bnx2x/bnx2x_main.c
> +++ b/drivers/net/bnx2x/bnx2x_main.c
> @@ -2371,10 +2371,8 @@ static inline u16 bnx2x_get_cl_flags(struct
> bnx2x *bp,
> flags |= QUEUE_FLG_HC;
> flags |= IS_MF(bp) ? QUEUE_FLG_OV : 0;
>
> -#ifdef BCM_VLAN
> flags |= QUEUE_FLG_VLAN;
> DP(NETIF_MSG_IFUP, "vlan removal enabled\n");
> -#endif
>
> if (!fp->disable_tpa)
> flags |= QUEUE_FLG_TPA;
> @@ -8630,9 +8628,6 @@ static const struct net_device_ops
> bnx2x_netdev_ops = {
> .ndo_do_ioctl = bnx2x_ioctl,
> .ndo_change_mtu = bnx2x_change_mtu,
> .ndo_tx_timeout = bnx2x_tx_timeout,
> -#ifdef BCM_VLAN
> - .ndo_vlan_rx_register = bnx2x_vlan_rx_register,
> -#endif
> #ifdef CONFIG_NET_POLL_CONTROLLER
> .ndo_poll_controller = poll_bnx2x,
> #endif
> @@ -8764,9 +8759,7 @@ static int __devinit bnx2x_init_dev(struct
> pci_dev *pdev,
> dev->features |= NETIF_F_HIGHDMA;
> dev->features |= (NETIF_F_TSO | NETIF_F_TSO_ECN);
> dev->features |= NETIF_F_TSO6;
> -#ifdef BCM_VLAN
> 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_HW_CSUM;
> @@ -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_TSO | NETIF_F_TSO_ECN);
> dev->vlan_features |= NETIF_F_TSO6;
> -#endif
>
> /* get_port_hwinfo() will set prtad and mmds properly */
> bp->mdio.prtad = MDIO_PRTAD_NONE;
> --
> 1.7.1
Guys, when I compiled the kernel with these patches without VLAN
support (CONFIG_VLAN_8021Q is not set) and tried to send VLAN tagged
frames from the remote side to the bnx2x interface the kernel panicked.
The stack trace got cut with the __netif_receive_skb() on top by the
IPKVM and I'll have to connect a serial to get it all. But until I
did that maybe somebody will have any ideas anyway...
It happens regardless there is HW RX VLAN stripping enabled or not.
Thanks,
vlad
>
> --
> To unsubscribe from this list: send the line "unsubscribe netdev" in
> the body of a message to majordomo@...r.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists