aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSuresh Reddy <suresh.reddy@broadcom.com>2017-09-13 11:12:42 -0400
committerDavid S. Miller <davem@davemloft.net>2017-09-13 12:28:18 -0400
commit822f8565c93949fb2d31502d595c8bc45629c9b7 (patch)
treee2888d7957fff4d01afefe8f02e78e854fd632b8
parent854426ef359c52bdf7087bc20c8d9105d075ca29 (diff)
be2net: fix TSO6/GSO issue causing TX-stall on Lancer/BEx
IPv6 TSO requests with extension hdrs are a problem to the Lancer and BEx chips. Workaround is to disable TSO6 feature for such packets. Also in Lancer chips, MSS less than 256 was resulting in TX stall. Fix this by disabling GSO when MSS less than 256. Signed-off-by: Suresh Reddy <suresh.reddy@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/emulex/benet/be.h8
-rw-r--r--drivers/net/ethernet/emulex/benet/be_main.c14
2 files changed, 22 insertions, 0 deletions
diff --git a/drivers/net/ethernet/emulex/benet/be.h b/drivers/net/ethernet/emulex/benet/be.h
index 674cf9d13b98..8984c4938881 100644
--- a/drivers/net/ethernet/emulex/benet/be.h
+++ b/drivers/net/ethernet/emulex/benet/be.h
@@ -930,6 +930,14 @@ static inline bool is_ipv4_pkt(struct sk_buff *skb)
930 return skb->protocol == htons(ETH_P_IP) && ip_hdr(skb)->version == 4; 930 return skb->protocol == htons(ETH_P_IP) && ip_hdr(skb)->version == 4;
931} 931}
932 932
933static inline bool is_ipv6_ext_hdr(struct sk_buff *skb)
934{
935 if (ip_hdr(skb)->version == 6)
936 return ipv6_ext_hdr(ipv6_hdr(skb)->nexthdr);
937 else
938 return false;
939}
940
933#define be_error_recovering(adapter) \ 941#define be_error_recovering(adapter) \
934 (adapter->flags & BE_FLAGS_TRY_RECOVERY) 942 (adapter->flags & BE_FLAGS_TRY_RECOVERY)
935 943
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
index 319eee36649b..0e3d9f39a807 100644
--- a/drivers/net/ethernet/emulex/benet/be_main.c
+++ b/drivers/net/ethernet/emulex/benet/be_main.c
@@ -5089,6 +5089,20 @@ static netdev_features_t be_features_check(struct sk_buff *skb,
5089 struct be_adapter *adapter = netdev_priv(dev); 5089 struct be_adapter *adapter = netdev_priv(dev);
5090 u8 l4_hdr = 0; 5090 u8 l4_hdr = 0;
5091 5091
5092 if (skb_is_gso(skb)) {
5093 /* IPv6 TSO requests with extension hdrs are a problem
5094 * to Lancer and BE3 HW. Disable TSO6 feature.
5095 */
5096 if (!skyhawk_chip(adapter) && is_ipv6_ext_hdr(skb))
5097 features &= ~NETIF_F_TSO6;
5098
5099 /* Lancer cannot handle the packet with MSS less than 256.
5100 * Disable the GSO support in such cases
5101 */
5102 if (lancer_chip(adapter) && skb_shinfo(skb)->gso_size < 256)
5103 features &= ~NETIF_F_GSO_MASK;
5104 }
5105
5092 /* The code below restricts offload features for some tunneled and 5106 /* The code below restricts offload features for some tunneled and
5093 * Q-in-Q packets. 5107 * Q-in-Q packets.
5094 * Offload features for normal (non tunnel) packets are unchanged. 5108 * Offload features for normal (non tunnel) packets are unchanged.