OSDN Git Service

net: hns3: Adds GRO params to SKB for the stack
authorPeng Li <lipeng321@huawei.com>
Thu, 15 Nov 2018 09:29:25 +0000 (09:29 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 15 Nov 2018 17:44:46 +0000 (09:44 -0800)
When HW GRO enable, protocol stack will not do GRO again,
driver should add gro param to the skb for the protocol
stack..

Signed-off-by: Peng Li <lipeng321@huawei.com>
Signed-off-by: Salil Mehta <salil.mehta@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
drivers/net/ethernet/hisilicon/hns3/hns3_enet.h

index 7776089..22220af 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/vermagic.h>
 #include <net/gre.h>
 #include <net/pkt_cls.h>
+#include <net/tcp.h>
 #include <net/vxlan.h>
 
 #include "hnae3.h"
@@ -2318,6 +2319,12 @@ static void hns3_rx_checksum(struct hns3_enet_ring *ring, struct sk_buff *skb,
        if (!(netdev->features & NETIF_F_RXCSUM))
                return;
 
+       /* We MUST enable hardware checksum before enabling hardware GRO */
+       if (skb_shinfo(skb)->gso_size) {
+               skb->ip_summed = CHECKSUM_UNNECESSARY;
+               return;
+       }
+
        /* check if hardware has done checksum */
        if (!hnae3_get_bit(bd_base_info, HNS3_RXD_L3L4P_B))
                return;
@@ -2511,6 +2518,39 @@ static int hns3_add_frag(struct hns3_enet_ring *ring, struct hns3_desc *desc,
        return 0;
 }
 
+static void hns3_set_gro_param(struct sk_buff *skb, u32 l234info,
+                              u32 bd_base_info)
+{
+       u16 gro_count;
+       u32 l3_type;
+
+       gro_count = hnae3_get_field(l234info, HNS3_RXD_GRO_COUNT_M,
+                                   HNS3_RXD_GRO_COUNT_S);
+       /* if there is no HW GRO, do not set gro params */
+       if (!gro_count)
+               return;
+
+       /* tcp_gro_complete() will copy NAPI_GRO_CB(skb)->count
+        * to skb_shinfo(skb)->gso_segs
+        */
+       NAPI_GRO_CB(skb)->count = gro_count;
+
+       l3_type = hnae3_get_field(l234info, HNS3_RXD_L3ID_M,
+                                 HNS3_RXD_L3ID_S);
+       if (l3_type == HNS3_L3_TYPE_IPV4)
+               skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4;
+       else if (l3_type == HNS3_L3_TYPE_IPV6)
+               skb_shinfo(skb)->gso_type = SKB_GSO_TCPV6;
+       else
+               return;
+
+       skb_shinfo(skb)->gso_size = hnae3_get_field(bd_base_info,
+                                                   HNS3_RXD_GRO_SIZE_M,
+                                                   HNS3_RXD_GRO_SIZE_S);
+       if (skb_shinfo(skb)->gso_size)
+               tcp_gro_complete(skb);
+}
+
 static void hns3_set_rx_skb_rss_type(struct hns3_enet_ring *ring,
                                     struct sk_buff *skb)
 {
@@ -2645,6 +2685,9 @@ static int hns3_handle_rx_bd(struct hns3_enet_ring *ring,
 
        ring->tqp_vector->rx_group.total_bytes += skb->len;
 
+       /* This is needed in order to enable forwarding support */
+       hns3_set_gro_param(skb, l234info, bd_base_info);
+
        hns3_rx_checksum(ring, skb, desc);
        *out_skb = skb;
        hns3_set_rx_skb_rss_type(ring, skb);
index 8e56b7e..3365c95 100644 (file)
@@ -109,6 +109,10 @@ enum hns3_nic_state {
 #define HNS3_RXD_DOI_B                         21
 #define HNS3_RXD_OL3E_B                                22
 #define HNS3_RXD_OL4E_B                                23
+#define HNS3_RXD_GRO_COUNT_S                   24
+#define HNS3_RXD_GRO_COUNT_M                   (0x3f << HNS3_RXD_GRO_COUNT_S)
+#define HNS3_RXD_GRO_FIXID_B                   30
+#define HNS3_RXD_GRO_ECN_B                     31
 
 #define HNS3_RXD_ODMAC_S                       0
 #define HNS3_RXD_ODMAC_M                       (0x3 << HNS3_RXD_ODMAC_S)
@@ -135,9 +139,8 @@ enum hns3_nic_state {
 #define HNS3_RXD_TSIND_S                       12
 #define HNS3_RXD_TSIND_M                       (0x7 << HNS3_RXD_TSIND_S)
 #define HNS3_RXD_LKBK_B                                15
-#define HNS3_RXD_HDL_S                         16
-#define HNS3_RXD_HDL_M                         (0x7ff << HNS3_RXD_HDL_S)
-#define HNS3_RXD_HSIND_B                       31
+#define HNS3_RXD_GRO_SIZE_S                    16
+#define HNS3_RXD_GRO_SIZE_M                    (0x3ff << HNS3_RXD_GRO_SIZE_S)
 
 #define HNS3_TXD_L3T_S                         0
 #define HNS3_TXD_L3T_M                         (0x3 << HNS3_TXD_L3T_S)