From patchwork Tue Dec 10 23:24:53 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matthew Ruffell X-Patchwork-Id: 1207328 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.ubuntu.com (client-ip=91.189.94.19; helo=huckleberry.canonical.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=canonical.com Received: from huckleberry.canonical.com (huckleberry.canonical.com [91.189.94.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 47Xbkw5sRCz9sPc; Wed, 11 Dec 2019 10:25:12 +1100 (AEDT) Received: from localhost ([127.0.0.1] helo=huckleberry.canonical.com) by huckleberry.canonical.com with esmtp (Exim 4.86_2) (envelope-from ) id 1ieosO-0005vi-Vg; Tue, 10 Dec 2019 23:25:08 +0000 Received: from youngberry.canonical.com ([91.189.89.112]) by huckleberry.canonical.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1ieosN-0005vM-9C for kernel-team@lists.ubuntu.com; Tue, 10 Dec 2019 23:25:07 +0000 Received: from mail-pf1-f200.google.com ([209.85.210.200]) by youngberry.canonical.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1ieosM-00072u-TB for kernel-team@lists.ubuntu.com; Tue, 10 Dec 2019 23:25:07 +0000 Received: by mail-pf1-f200.google.com with SMTP id w127so829546pfb.13 for ; Tue, 10 Dec 2019 15:25:06 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=LTePtEsnN5hT8B/bGYrOvVb/Cst5ufVbVAUpaihEMIo=; b=oONUrrIaI0PzhrKztdKFfID2eJihDD5g9RvhxqqaYoHCXEdNI/f9x+EiIXPR1bUpYB 2X/NwjIVosiI+loLN1/y6BgpLEacsZhzzhz1HBy6PFhbv0GRCxczJDSO6FXlIbxADxCN DMhRT3DAwjwUdE9V2xZ+iWUAnBpXnsHZvkCdbaNd/vZZ9polQskVKTNWw487NsnNtHNe kFoAPszxdZjK0tS6Mzl0XETfclPI/wciw3yQJBCV65XZa/QRrtU7Hfi7Y6YoaRcj8jaA CzUz9OVD8L0gjwEUsGTpFBFMeSUGv+qmp9fRgnGebP/j75TNjNgrg9jCQi9aFmCGd084 UNrg== X-Gm-Message-State: APjAAAXfg2FqeoVznhgFFY/q4T88l1Q/AXI8rcz89LdRPyCPvfzgqxaM xoV9OMSEgSs+jmFBaa4oAKq/zsULBltkGdXJcCpQktnPxSCPcuKRpVqNDdYUCTd+y4qBMV28GLB ePfKSN34lcRDtEpzyEu203GsGPYC6hi0ftVnVlr7X+A== X-Received: by 2002:a17:902:6802:: with SMTP id h2mr37317107plk.135.1576020305348; Tue, 10 Dec 2019 15:25:05 -0800 (PST) X-Google-Smtp-Source: APXvYqweyRkH34Yxl5//0LKdtxyL3EHOtYvvwq1ccLuNbKnczx3DXssJQhMtfshmHpJUlnyadj9RpQ== X-Received: by 2002:a17:902:6802:: with SMTP id h2mr37317036plk.135.1576020304048; Tue, 10 Dec 2019 15:25:04 -0800 (PST) Received: from localhost.localdomain (222-154-99-146-fibre.sparkbb.co.nz. [222.154.99.146]) by smtp.gmail.com with ESMTPSA id h128sm111793pfe.172.2019.12.10.15.25.02 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 10 Dec 2019 15:25:03 -0800 (PST) From: Matthew Ruffell To: kernel-team@lists.ubuntu.com Subject: [SRU][Bionic][PATCH 2/2] net/mlx5e: Rx, Fix checksum calculation for new hardware Date: Wed, 11 Dec 2019 12:24:53 +1300 Message-Id: <20191210232453.19227-3-matthew.ruffell@canonical.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20191210232453.19227-1-matthew.ruffell@canonical.com> References: <20191210232453.19227-1-matthew.ruffell@canonical.com> MIME-Version: 1.0 X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: "kernel-team" From: Saeed Mahameed BugLink: https://bugs.launchpad.net/bugs/1854842 CQE checksum full mode in new HW, provides a full checksum of rx frame. Covering bytes starting from eth protocol up to last byte in the received frame (frame_size - ETH_HLEN), as expected by the stack. Fixing up skb->csum by the driver is not required in such case. This fix is to avoid wrong checksum calculation in drivers which already support the new hardware with the new checksum mode. Fixes: 85327a9c4150 ("net/mlx5: Update the list of the PCI supported devices") Signed-off-by: Saeed Mahameed (backported from commit db849faa9bef993a1379dc510623f750a72fa7ce) [mruffell: minor context adjustments, offset recalculations] Signed-off-by: Matthew Ruffell --- drivers/net/ethernet/mellanox/mlx5/core/en.h | 1 + drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 3 +++ drivers/net/ethernet/mellanox/mlx5/core/en_rx.c | 7 ++++++- include/linux/mlx5/mlx5_ifc.h | 3 ++- 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en.h b/drivers/net/ethernet/mellanox/mlx5/core/en.h index a12903a00da3..c9bd5c0cb90e 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/en.h @@ -296,6 +296,7 @@ enum { MLX5E_RQ_STATE_ENABLED, MLX5E_RQ_STATE_AM, MLX5E_RQ_STATE_NO_CSUM_COMPLETE, + MLX5E_RQ_STATE_CSUM_FULL, /* cqe_csum_full hw bit is set */ }; #define MLX5E_TEST_BIT(state, nr) (state & BIT(nr)) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c index b3c48515c91d..98374a14ed57 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c @@ -925,6 +925,9 @@ static int mlx5e_open_rq(struct mlx5e_channel *c, if (params->rx_am_enabled) c->rq.state |= BIT(MLX5E_RQ_STATE_AM); + if (MLX5_CAP_ETH(c->mdev, cqe_checksum_full)) + __set_bit(MLX5E_RQ_STATE_CSUM_FULL, &c->rq.state); + /* We disable csum_complete when XDP is enabled since * XDP programs might manipulate packets which will render * skb->checksum incorrect. diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c index 5b4e1e7bb873..63ae76c4af92 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c @@ -770,8 +770,14 @@ static inline void mlx5e_handle_csum(struct net_device *netdev, if (unlikely(get_ip_proto(skb, network_depth, proto) == IPPROTO_SCTP)) goto csum_unnecessary; + rq->stats.csum_complete++; skb->ip_summed = CHECKSUM_COMPLETE; skb->csum = csum_unfold((__force __sum16)cqe->check_sum); + + if (test_bit(MLX5E_RQ_STATE_CSUM_FULL, &rq->state)) + return; /* CQE csum covers all received bytes */ + + /* csum might need some fixups ...*/ if (network_depth > ETH_HLEN) /* CQE csum is calculated from the IP header and does * not cover VLAN headers (if present). This will add @@ -781,7 +787,6 @@ static inline void mlx5e_handle_csum(struct net_device *netdev, network_depth - ETH_HLEN, skb->csum); mlx5e_skb_padding_csum(skb, network_depth, proto, &rq->stats); - rq->stats.csum_complete++; return; } diff --git a/include/linux/mlx5/mlx5_ifc.h b/include/linux/mlx5/mlx5_ifc.h index 502f347813ae..fdef4d0193cd 100644 --- a/include/linux/mlx5/mlx5_ifc.h +++ b/include/linux/mlx5/mlx5_ifc.h @@ -614,7 +614,8 @@ struct mlx5_ifc_per_protocol_networking_offload_caps_bits { u8 swp[0x1]; u8 swp_csum[0x1]; u8 swp_lso[0x1]; - u8 reserved_at_23[0x1b]; + u8 cqe_checksum_full[0x1]; + u8 reserved_at_24[0x1a]; u8 max_geneve_opt_len[0x1]; u8 tunnel_stateless_geneve_rx[0x1];