From patchwork Tue Aug 30 14:30:46 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michal Schmidt X-Patchwork-Id: 112338 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 17DFEB7199 for ; Wed, 31 Aug 2011 00:31:31 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754594Ab1H3ObZ (ORCPT ); Tue, 30 Aug 2011 10:31:25 -0400 Received: from mx1.redhat.com ([209.132.183.28]:3027 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754580Ab1H3ObW (ORCPT ); Tue, 30 Aug 2011 10:31:22 -0400 Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id p7UEVMD6018286 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 30 Aug 2011 10:31:22 -0400 Received: from dhcp-29-224.brq.redhat.com (dhcp-26-161.brq.redhat.com [10.34.26.161]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id p7UEV0uf023949; Tue, 30 Aug 2011 10:31:20 -0400 From: Michal Schmidt To: netdev@vger.kernel.org Cc: vladz@broadcom.com, dmitry@broadcom.com, eilong@broadcom.com, Michal Schmidt Subject: [PATCH 7/7] bnx2x: expose HW RX VLAN stripping toggle Date: Tue, 30 Aug 2011 16:30:46 +0200 Message-Id: <1314714646-3642-8-git-send-email-mschmidt@redhat.com> In-Reply-To: <1314714646-3642-1-git-send-email-mschmidt@redhat.com> References: <1314714646-3642-1-git-send-email-mschmidt@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Allow disabling of HW RX VLAN stripping with ethtool. [v2: Store the flag in the fp to ensure that pending packets are handled correctly during a switch.] Signed-off-by: Michal Schmidt --- drivers/net/ethernet/broadcom/bnx2x/bnx2x.h | 2 + drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | 29 ++++++++++++++++------ drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | 10 ++++---- 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h index 02fa7a7..e70a208 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h @@ -479,6 +479,7 @@ struct bnx2x_fastpath { u8 igu_sb_id; /* status block number in HW */ u8 flags; #define FP_TPA (1 << 0) /* TPA enabled */ +#define FP_VLAN_STRIP (1 << 1) /* RX VLAN headers stripping */ u16 rx_bd_prod; u16 rx_bd_cons; @@ -1180,6 +1181,7 @@ struct bnx2x { #define NO_MCP_FLAG (1 << 9) #define BP_NOMCP(bp) (bp->flags & NO_MCP_FLAG) +#define RX_VLAN_STRIP_FLAG (1 << 10) #define MF_FUNC_DIS (1 << 11) #define OWN_CNIC_IRQ (1 << 12) #define NO_ISCSI_OOO_FLAG (1 << 13) diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c index d45aaa5..e39ea23 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c @@ -66,6 +66,9 @@ static inline void bnx2x_bz_fp(struct bnx2x *bp, int index) */ if ((bp->flags & TPA_ENABLE_FLAG) && !IS_FCOE_FP(fp)) fp->flags = FP_TPA; + + if (bp->flags & RX_VLAN_STRIP_FLAG) + fp->flags |= FP_VLAN_STRIP; } /** @@ -359,7 +362,7 @@ static void bnx2x_tpa_start(struct bnx2x_fastpath *fp, u16 queue, /** * bnx2x_set_lro_mss - calculate the approximate value of the MSS * - * @bp: driver handle + * @fp: fastpath handle * @parsing_flags: parsing flags from the START CQE * @len_on_bd: total length of the first packet for the * aggregation. @@ -367,8 +370,8 @@ static void bnx2x_tpa_start(struct bnx2x_fastpath *fp, u16 queue, * Approximate value of the MSS for this aggregation calculated using * the first packet of it. */ -static inline u16 bnx2x_set_lro_mss(struct bnx2x *bp, u16 parsing_flags, - u16 len_on_bd) +static u16 bnx2x_set_lro_mss(struct bnx2x_fastpath *fp, u16 parsing_flags, + u16 len_on_bd) { /* * TPA arrgregation won't have either IP options or TCP options @@ -382,6 +385,10 @@ static inline u16 bnx2x_set_lro_mss(struct bnx2x *bp, u16 parsing_flags, else /* IPv4 */ hdrs_len += sizeof(struct iphdr); + /* VLAN header present and not stripped by HW */ + if ((parsing_flags & PARSING_FLAGS_VLAN) && + !(fp->flags & FP_VLAN_STRIP)) + hdrs_len += VLAN_HLEN; /* Check if there was a TCP timestamp, if there is it's will * always be 12 bytes length: nop nop kind length echo val. @@ -409,9 +416,9 @@ static int bnx2x_fill_frag_skb(struct bnx2x *bp, struct bnx2x_fastpath *fp, frag_size = le16_to_cpu(cqe->pkt_len) - len_on_bd; pages = SGE_PAGE_ALIGN(frag_size) >> SGE_PAGE_SHIFT; - /* This is needed in order to enable forwarding support */ + /* Doing LRO, let TCP know the receive MSS */ if (frag_size) - skb_shinfo(skb)->gso_size = bnx2x_set_lro_mss(bp, + skb_shinfo(skb)->gso_size = bnx2x_set_lro_mss(fp, tpa_info->parsing_flags, len_on_bd); #ifdef BNX2X_STOP_ON_ERROR @@ -511,7 +518,8 @@ static void bnx2x_tpa_stop(struct bnx2x *bp, struct bnx2x_fastpath *fp, skb->ip_summed = CHECKSUM_UNNECESSARY; if (!bnx2x_fill_frag_skb(bp, fp, queue, skb, cqe, cqe_idx)) { - if (tpa_info->parsing_flags & PARSING_FLAGS_VLAN) + if ((tpa_info->parsing_flags & PARSING_FLAGS_VLAN) && + (fp->flags & FP_VLAN_STRIP)) __vlan_hwaccel_put_tag(skb, tpa_info->vlan_tag); napi_gro_receive(&fp->napi, skb); } else { @@ -742,8 +750,8 @@ reuse_rx: skb_record_rx_queue(skb, fp->index); - if (le16_to_cpu(cqe_fp->pars_flags.flags) & - PARSING_FLAGS_VLAN) + if ((le16_to_cpu(cqe_fp->pars_flags.flags) & + PARSING_FLAGS_VLAN) && (fp->flags & FP_VLAN_STRIP)) __vlan_hwaccel_put_tag(skb, le16_to_cpu(cqe_fp->vlan_tag)); napi_gro_receive(&fp->napi, skb); @@ -3415,6 +3423,11 @@ int bnx2x_set_features(struct net_device *dev, u32 features) else flags &= ~TPA_ENABLE_FLAG; + if (features & NETIF_F_HW_VLAN_RX) + flags |= RX_VLAN_STRIP_FLAG; + else + flags &= ~RX_VLAN_STRIP_FLAG; + if (features & NETIF_F_LOOPBACK) { if (bp->link_params.loopback_mode != LOOPBACK_BMAC) { bp->link_params.loopback_mode = LOOPBACK_BMAC; diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c index 7bc6944..15624bc 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c @@ -2719,9 +2719,8 @@ static unsigned long bnx2x_get_q_flags(struct bnx2x *bp, __set_bit(BNX2X_Q_FLG_MCAST, &flags); } - /* Always set HW VLAN stripping */ - __set_bit(BNX2X_Q_FLG_VLAN, &flags); - + if (fp->flags & FP_VLAN_STRIP) + __set_bit(BNX2X_Q_FLG_VLAN, &flags); return flags | bnx2x_get_common_flags(bp, fp, true); } @@ -10262,12 +10261,13 @@ static int __devinit bnx2x_init_dev(struct pci_dev *pdev, dev->hw_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | NETIF_F_TSO | NETIF_F_TSO_ECN | NETIF_F_TSO6 | NETIF_F_LRO | - NETIF_F_RXCSUM | NETIF_F_RXHASH | NETIF_F_HW_VLAN_TX; + NETIF_F_RXCSUM | NETIF_F_RXHASH | + NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; dev->vlan_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | NETIF_F_TSO | NETIF_F_TSO_ECN | NETIF_F_TSO6 | NETIF_F_HIGHDMA; - dev->features |= dev->hw_features | NETIF_F_HW_VLAN_RX; + dev->features |= dev->hw_features; if (bp->flags & USING_DAC_FLAG) dev->features |= NETIF_F_HIGHDMA;