[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <8628FE4E7912BF47A96AE7DD7BAC0AADDDEE42913C@SJEXCHCCR02.corp.ad.broadcom.com>
Date: Thu, 21 Oct 2010 07:50:01 -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: Vladislav Zolotarov
> Sent: Thursday, October 21, 2010 4:03 PM
> To: Vladislav Zolotarov; Jesse Gross; David Miller
> Cc: netdev@...r.kernel.org; Hao Zheng; Eilon Greenstein
> 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 Vladislav Zolotarov
> > Sent: Thursday, October 21, 2010 3:55 PM
> > To: Jesse Gross; David Miller
> > Cc: netdev@...r.kernel.org; Hao Zheng; Eilon Greenstein
> > 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.
>
> When RX VLAN stripping is enabled we hit the BUG() in the
> vlan_hwaccel_do_receive().:
We hit the same BUG() both when VLAN stripping is disabled.
Thanks,
vlad
>
>
>
>
>
> >
> > 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
--
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