Skip to content

Commit a6d53b9

Browse files
321lipengdavem330
authored andcommitted
net: hns3: Adds GRO params to SKB for the stack
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 <[email protected]> Signed-off-by: Salil Mehta <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 81ae0e0 commit a6d53b9

File tree

2 files changed

+49
-3
lines changed

2 files changed

+49
-3
lines changed

drivers/net/ethernet/hisilicon/hns3/hns3_enet.c

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include <linux/vermagic.h>
1616
#include <net/gre.h>
1717
#include <net/pkt_cls.h>
18+
#include <net/tcp.h>
1819
#include <net/vxlan.h>
1920

2021
#include "hnae3.h"
@@ -2318,6 +2319,12 @@ static void hns3_rx_checksum(struct hns3_enet_ring *ring, struct sk_buff *skb,
23182319
if (!(netdev->features & NETIF_F_RXCSUM))
23192320
return;
23202321

2322+
/* We MUST enable hardware checksum before enabling hardware GRO */
2323+
if (skb_shinfo(skb)->gso_size) {
2324+
skb->ip_summed = CHECKSUM_UNNECESSARY;
2325+
return;
2326+
}
2327+
23212328
/* check if hardware has done checksum */
23222329
if (!hnae3_get_bit(bd_base_info, HNS3_RXD_L3L4P_B))
23232330
return;
@@ -2511,6 +2518,39 @@ static int hns3_add_frag(struct hns3_enet_ring *ring, struct hns3_desc *desc,
25112518
return 0;
25122519
}
25132520

2521+
static void hns3_set_gro_param(struct sk_buff *skb, u32 l234info,
2522+
u32 bd_base_info)
2523+
{
2524+
u16 gro_count;
2525+
u32 l3_type;
2526+
2527+
gro_count = hnae3_get_field(l234info, HNS3_RXD_GRO_COUNT_M,
2528+
HNS3_RXD_GRO_COUNT_S);
2529+
/* if there is no HW GRO, do not set gro params */
2530+
if (!gro_count)
2531+
return;
2532+
2533+
/* tcp_gro_complete() will copy NAPI_GRO_CB(skb)->count
2534+
* to skb_shinfo(skb)->gso_segs
2535+
*/
2536+
NAPI_GRO_CB(skb)->count = gro_count;
2537+
2538+
l3_type = hnae3_get_field(l234info, HNS3_RXD_L3ID_M,
2539+
HNS3_RXD_L3ID_S);
2540+
if (l3_type == HNS3_L3_TYPE_IPV4)
2541+
skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4;
2542+
else if (l3_type == HNS3_L3_TYPE_IPV6)
2543+
skb_shinfo(skb)->gso_type = SKB_GSO_TCPV6;
2544+
else
2545+
return;
2546+
2547+
skb_shinfo(skb)->gso_size = hnae3_get_field(bd_base_info,
2548+
HNS3_RXD_GRO_SIZE_M,
2549+
HNS3_RXD_GRO_SIZE_S);
2550+
if (skb_shinfo(skb)->gso_size)
2551+
tcp_gro_complete(skb);
2552+
}
2553+
25142554
static void hns3_set_rx_skb_rss_type(struct hns3_enet_ring *ring,
25152555
struct sk_buff *skb)
25162556
{
@@ -2645,6 +2685,9 @@ static int hns3_handle_rx_bd(struct hns3_enet_ring *ring,
26452685

26462686
ring->tqp_vector->rx_group.total_bytes += skb->len;
26472687

2688+
/* This is needed in order to enable forwarding support */
2689+
hns3_set_gro_param(skb, l234info, bd_base_info);
2690+
26482691
hns3_rx_checksum(ring, skb, desc);
26492692
*out_skb = skb;
26502693
hns3_set_rx_skb_rss_type(ring, skb);

drivers/net/ethernet/hisilicon/hns3/hns3_enet.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,10 @@ enum hns3_nic_state {
109109
#define HNS3_RXD_DOI_B 21
110110
#define HNS3_RXD_OL3E_B 22
111111
#define HNS3_RXD_OL4E_B 23
112+
#define HNS3_RXD_GRO_COUNT_S 24
113+
#define HNS3_RXD_GRO_COUNT_M (0x3f << HNS3_RXD_GRO_COUNT_S)
114+
#define HNS3_RXD_GRO_FIXID_B 30
115+
#define HNS3_RXD_GRO_ECN_B 31
112116

113117
#define HNS3_RXD_ODMAC_S 0
114118
#define HNS3_RXD_ODMAC_M (0x3 << HNS3_RXD_ODMAC_S)
@@ -135,9 +139,8 @@ enum hns3_nic_state {
135139
#define HNS3_RXD_TSIND_S 12
136140
#define HNS3_RXD_TSIND_M (0x7 << HNS3_RXD_TSIND_S)
137141
#define HNS3_RXD_LKBK_B 15
138-
#define HNS3_RXD_HDL_S 16
139-
#define HNS3_RXD_HDL_M (0x7ff << HNS3_RXD_HDL_S)
140-
#define HNS3_RXD_HSIND_B 31
142+
#define HNS3_RXD_GRO_SIZE_S 16
143+
#define HNS3_RXD_GRO_SIZE_M (0x3ff << HNS3_RXD_GRO_SIZE_S)
141144

142145
#define HNS3_TXD_L3T_S 0
143146
#define HNS3_TXD_L3T_M (0x3 << HNS3_TXD_L3T_S)

0 commit comments

Comments
 (0)