lkml.org 
[lkml]   [2018]   [Nov]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH V2 net-next 5/5] net: hns3: Adds GRO params to SKB for the stack
    Date
    From: Peng Li <lipeng321@huawei.com>

    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>
    ---
    .../net/ethernet/hisilicon/hns3/hns3_enet.c | 43 +++++++++++++++++++
    .../net/ethernet/hisilicon/hns3/hns3_enet.h | 9 ++--
    2 files changed, 49 insertions(+), 3 deletions(-)

    diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
    index 7776089b6bc2..22220af92aa9 100644
    --- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
    +++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
    @@ -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);
    diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
    index 8e56b7e44978..3365c9596983 100644
    --- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
    +++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
    @@ -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)
    --
    2.17.1

    \
     
     \ /
      Last update: 2018-11-15 10:32    [W:3.127 / U:1.732 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site