All of lore.kernel.org
 help / color / mirror / Atom feed
From: Prashant Sreedharan <prashant@broadcom.com>
To: Vladislav Yasevich <vyasevich@gmail.com>
Cc: <netdev@vger.kernel.org>,
	Vladislav Yasevich <vyasevic@redhat.com>,
	Michael Chan <mchan@broadcom.com>
Subject: Re: [PATCH] tg3: Work around HW/FW limitations with vlan encapsulated frames
Date: Thu, 18 Sep 2014 16:00:21 -0700	[thread overview]
Message-ID: <1411081221.18724.84.camel@prashant> (raw)
In-Reply-To: <1411050677-28147-1-git-send-email-vyasevic@redhat.com>

On Thu, 2014-09-18 at 10:31 -0400, Vladislav Yasevich wrote:
> TG3 appears to have an issue performing TSO and checksum offloading
> correclty when the frame has been vlan encapsulated (non-accelrated).
> In these cases, tcp checksum is not correctly updated.

Yes that is true for inline vlan headers, to clarify was TSO and
checksum offload working for accelerated 802.1ad packets ? 

> This patch attempts to work around this issue.  After the patch,
> 802.1ad vlans start working correctly over tg3 devices.
> 
> CC: Prashant Sreedharan <prashant@broadcom.com>
> CC: Michael Chan <mchan@broadcom.com>
> Signed-off-by: Vladislav Yasevich <vyasevic@redhat.com>
> ---
>  drivers/net/ethernet/broadcom/tg3.c | 20 ++++++++++++++++++--
>  1 file changed, 18 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c
> index cb77ae9..e7d3a62 100644
> --- a/drivers/net/ethernet/broadcom/tg3.c
> +++ b/drivers/net/ethernet/broadcom/tg3.c
> @@ -7914,8 +7914,6 @@ static netdev_tx_t tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
>  
>  	entry = tnapi->tx_prod;
>  	base_flags = 0;
> -	if (skb->ip_summed == CHECKSUM_PARTIAL)
> -		base_flags |= TXD_FLAG_TCPUDP_CSUM;
>  
>  	mss = skb_shinfo(skb)->gso_size;
>  	if (mss) {
> @@ -7929,6 +7927,13 @@ static netdev_tx_t tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
>  
>  		hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb) - ETH_HLEN;
>  
> +		/* HW/FW can not correctly segment packets that have been
> +		 * vlan encapsulated.
> +		 */
> +		if (skb->protocol == htons(ETH_P_8021Q) ||
> +		    skb->protocol == htons(ETH_P_8021AD))
> +			return tg3_tso_bug(tp, tnapi, txq, skb);

I think skb_gso_segment() would return skbs that would still have
checksum offloaded to the chip.
 
> +
>  		if (!skb_is_gso_v6(skb)) {
>  			if (unlikely((ETH_HLEN + hdr_len) > 80) &&
>  			    tg3_flag(tp, TSO_BUG))
> @@ -7979,6 +7984,17 @@ static netdev_tx_t tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
>  				base_flags |= tsflags << 12;
>  			}
>  		}
> +	} else if (skb->ip_summed == CHECKSUM_PARTIAL) {
> +		/* HW/FW can not correctly checksum packets that have been
> +		 * vlan encapsulated.
> +		 */
> +		if (skb->protocol == htons(ETH_P_8021Q) ||
> +		    skb->protocol == htons(ETH_P_8021AD)) {
> +			if (skb_checksum_help(skb))
> +				goto drop;
> +		} else  {
> +			base_flags |= TXD_FLAG_TCPUDP_CSUM;
> +		}
>  	}
>  
>  	if (tg3_flag(tp, USE_JUMBO_BDFLAG) &&

Instead of the above workarounds since the chips supported by tg3 does
not support checksum offload and TSO for inline vlan headers, these
features can be disabled/cleared in dev->vlan_features. Side effect is
accelerated vlan headers will also have TSO and checksum offload
disabled.

Also as part of this review, found a problem with the receive section of
the driver it was not checking for 802.1ad vlan protocol and dropping
802.1ad vlan packets of size > mtu + ETH_HLEN

diff --git a/drivers/net/ethernet/broadcom/tg3.c
b/drivers/net/ethernet/broadcom/tg3.c
index cb77ae9..620887a 100644
--- a/drivers/net/ethernet/broadcom/tg3.c
+++ b/drivers/net/ethernet/broadcom/tg3.c
@@ -6918,7 +6918,8 @@ static int tg3_rx(struct tg3_napi *tnapi, int
budget)
                skb->protocol = eth_type_trans(skb, tp->dev);
 
                if (len > (tp->dev->mtu + ETH_HLEN) &&
-                   skb->protocol != htons(ETH_P_8021Q)) {
+                   skb->protocol != htons(ETH_P_8021Q) &&
+                   skb->protocol != htons(ETH_P_8021AD)) {
                        dev_kfree_skb_any(skb);
                        goto drop_it_no_recycle;
                }

  reply	other threads:[~2014-09-18 23:10 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-09-18 14:31 [PATCH] tg3: Work around HW/FW limitations with vlan encapsulated frames Vladislav Yasevich
2014-09-18 23:00 ` Prashant Sreedharan [this message]
2014-09-19 13:59   ` Vlad Yasevich
2014-09-19 20:54     ` Prashant Sreedharan
2014-09-19 21:33       ` Vlad Yasevich
2014-09-22 18:20 ` David Miller

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1411081221.18724.84.camel@prashant \
    --to=prashant@broadcom.com \
    --cc=mchan@broadcom.com \
    --cc=netdev@vger.kernel.org \
    --cc=vyasevic@redhat.com \
    --cc=vyasevich@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.