Received: by 2002:a05:6a10:f347:0:0:0:0 with SMTP id d7csp1930694pxu; Fri, 27 Nov 2020 20:42:58 -0800 (PST) X-Google-Smtp-Source: ABdhPJwGfHyuO9hfdiXxDu0/38VCsQTxfD9QFf3AUn0lB79sc63A5p1KoQAXS1Lhqd6IYqIPAWg9 X-Received: by 2002:a17:906:8282:: with SMTP id h2mr11057302ejx.50.1606538578394; Fri, 27 Nov 2020 20:42:58 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1606538578; cv=none; d=google.com; s=arc-20160816; b=c/O6Jh0Olu9JDyfFtSWi1Luh9dLwItitFTsmYS6Uh3X8axQppFsMir91lsg/9TCZI7 ekGDqKEtZirrqek3F0UL3joqZrmQQDt4pj4dLzST6bUrnQuJwJoiR6uVUYfvgTcrc+Lb JGNShks11C9k019+E8td+cyk5scJvxXgUvfVWKUQImBqKVfAQNLDZ60HC+vZ95mK9Mx3 5MRJK0x8jTPnrSsVuKPjrgoXqH6tQchJ7YUlZNZljGP42jVUqSlTN88m72syxI0nQiiX a8XL1GD2rsvEP/u5hSaY0FfESK0NjRK5HvoS4nldJWm/qEsHU6BVFolw9u9EkQEujwpV YjvQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:references:in-reply-to:message-id :date:subject:cc:to:from; bh=t/f3uLvh77+zLL5UAXBxWnxLaKPo6MP274NN+RrEPH0=; b=jrNJvcRb5kn6cXE+QEGPzQcBOKiYoQBFxC2al47nj9FU9O7VAQ5UynC8Sl06iS4vFT 5XdR2xzXENRAy/sfaYBGmkHHYPlbu2GhPDMGf7Cn3hzw40yoMB+fPcXOrZtWNNE1vgV2 1NZVXoSGD1XFW1f4ZHSII64jtsUsEjzabEmaFdIFBetTpUKfhF4j2iLmMz1ImqMCPYvw 64BZh9y30a8vc/yrFgtiogzMPs+AlhTK3Jc9Z5UFAg0Z4PoOj6j4QVdEdkbdJmm9ZIYt /JyQ2rd5ziN1gsJZCiI0K0O5JiHsvKbz0RireCp90trewj9NKlZ0hhY1vcRBEglEWBg6 6DyA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id 89si6865074edc.413.2020.11.27.20.42.35; Fri, 27 Nov 2020 20:42:58 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731627AbgK1EXo (ORCPT + 99 others); Fri, 27 Nov 2020 23:23:44 -0500 Received: from szxga06-in.huawei.com ([45.249.212.32]:8457 "EHLO szxga06-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731486AbgK1ENf (ORCPT ); Fri, 27 Nov 2020 23:13:35 -0500 Received: from DGGEMS407-HUB.china.huawei.com (unknown [172.30.72.59]) by szxga06-in.huawei.com (SkyGuard) with ESMTP id 4CjcxS36hJzhhXK; Sat, 28 Nov 2020 11:51:40 +0800 (CST) Received: from localhost.localdomain (10.69.192.56) by DGGEMS407-HUB.china.huawei.com (10.3.19.207) with Microsoft SMTP Server id 14.3.487.0; Sat, 28 Nov 2020 11:51:47 +0800 From: Huazhong Tan To: CC: , , , , , , Huazhong Tan Subject: [PATCH V2 net-next 1/7] net: hns3: add support for RX completion checksum Date: Sat, 28 Nov 2020 11:51:44 +0800 Message-ID: <1606535510-44346-2-git-send-email-tanhuazhong@huawei.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1606535510-44346-1-git-send-email-tanhuazhong@huawei.com> References: <1606535510-44346-1-git-send-email-tanhuazhong@huawei.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.69.192.56] X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In some cases (for example ip fragment), hardware will calculate the checksum of whole packet in RX, and setup the HNS3_RXD_L2_CSUM_B flag in the descriptor, so add support to utilize this checksum. Signed-off-by: Huazhong Tan --- drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | 21 +++++++++++++++++++++ drivers/net/ethernet/hisilicon/hns3/hns3_enet.h | 7 +++++++ drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c | 1 + 3 files changed, 29 insertions(+) diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c index 632ad42..1647877 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c @@ -2798,6 +2798,22 @@ static int hns3_gro_complete(struct sk_buff *skb, u32 l234info) return 0; } +static void hns3_checksum_complete(struct hns3_enet_ring *ring, + struct sk_buff *skb, u32 l234info) +{ + u32 lo, hi; + + u64_stats_update_begin(&ring->syncp); + ring->stats.csum_complete++; + u64_stats_update_end(&ring->syncp); + skb->ip_summed = CHECKSUM_COMPLETE; + lo = hnae3_get_field(l234info, HNS3_RXD_L2_CSUM_L_M, + HNS3_RXD_L2_CSUM_L_S); + hi = hnae3_get_field(l234info, HNS3_RXD_L2_CSUM_H_M, + HNS3_RXD_L2_CSUM_H_S); + skb->csum = csum_unfold((__force __sum16)(lo | hi << 8)); +} + static void hns3_rx_checksum(struct hns3_enet_ring *ring, struct sk_buff *skb, u32 l234info, u32 bd_base_info, u32 ol_info) { @@ -2812,6 +2828,11 @@ static void hns3_rx_checksum(struct hns3_enet_ring *ring, struct sk_buff *skb, if (!(netdev->features & NETIF_F_RXCSUM)) return; + if (l234info & BIT(HNS3_RXD_L2_CSUM_B)) { + hns3_checksum_complete(ring, skb, l234info); + return; + } + /* check if hardware has done checksum */ if (!(bd_base_info & BIT(HNS3_RXD_L3L4P_B))) return; diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h index 8d33652..40681a0 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h +++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h @@ -82,6 +82,12 @@ enum hns3_nic_state { #define HNS3_RXD_STRP_TAGP_S 13 #define HNS3_RXD_STRP_TAGP_M (0x3 << HNS3_RXD_STRP_TAGP_S) +#define HNS3_RXD_L2_CSUM_B 15 +#define HNS3_RXD_L2_CSUM_L_S 4 +#define HNS3_RXD_L2_CSUM_L_M (0xff << HNS3_RXD_L2_CSUM_L_S) +#define HNS3_RXD_L2_CSUM_H_S 24 +#define HNS3_RXD_L2_CSUM_H_M (0xff << HNS3_RXD_L2_CSUM_H_S) + #define HNS3_RXD_L2E_B 16 #define HNS3_RXD_L3E_B 17 #define HNS3_RXD_L4E_B 18 @@ -371,6 +377,7 @@ struct ring_stats { u64 err_bd_num; u64 l2_err; u64 l3l4_csum_err; + u64 csum_complete; u64 rx_multicast; u64 non_reuse_pg; }; diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c index c30d5d3..3cca3c1 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c @@ -55,6 +55,7 @@ static const struct hns3_stats hns3_rxq_stats[] = { HNS3_TQP_STAT("err_bd_num", err_bd_num), HNS3_TQP_STAT("l2_err", l2_err), HNS3_TQP_STAT("l3l4_csum_err", l3l4_csum_err), + HNS3_TQP_STAT("csum_complete", csum_complete), HNS3_TQP_STAT("multicast", rx_multicast), HNS3_TQP_STAT("non_reuse_pg", non_reuse_pg), }; -- 2.7.4