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 <lipeng321@huawei.com> Signed-off-by: Salil Mehta <salil.mehta@huawei.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
81ae0e0491
Коммит
a6d53b97a2
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
|
|
Загрузка…
Ссылка в новой задаче