From nobody Wed Apr 8 03:09:22 2026 Received: from mail-pl1-f182.google.com (mail-pl1-f182.google.com [209.85.214.182]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8F0003C9EF9 for ; Tue, 10 Mar 2026 21:22:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773177765; cv=none; b=Y9vSmbTPgEBhYWCer+i75/CsNxCaN7HHsdL89GG220bPo1NoxR3wdZPU/nozI22KRlELvk3H9tRGZ3VLMpCK2wSN3unR4dlOhkZZHqtdwEN57k1D34Ta2vYGvJz3jCWv9GTdkxx3mMBV4G2HDuh6qRe/oQwxltAwGH30uP/zHTs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773177765; c=relaxed/simple; bh=zvBLdH4BAnKwNC0mMbvEM7gYtBsX4O90UZ6qJh816nM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=aCrbye5n5pqSKNMLukvTGlXkAVunsmBZAIdHXAE711LImfnEyD+iBdlujACiQlMPn5ouwxLVOoy/JOhMf0not8jtw8p/5LJ1Vef7/JJ/LgcXv2j7KGqsnJZl7sHLO+KxBwU0MrbwOo1B2pmepzzGuk8+ep+Au7aphFnJjgISHKc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to; spf=none smtp.mailfrom=dama.to; dkim=pass (2048-bit key) header.d=dama-to.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b=Dw1lXr6x; arc=none smtp.client-ip=209.85.214.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=dama.to Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=dama-to.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b="Dw1lXr6x" Received: by mail-pl1-f182.google.com with SMTP id d9443c01a7336-2a871daa98fso99619655ad.1 for ; Tue, 10 Mar 2026 14:22:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1773177764; x=1773782564; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=USJsgtHmtoDgSFTSjAgvcXraSNpVggb2xq+PXWw1f2A=; b=Dw1lXr6xR0eAMuodlBAMfTX408+O4jCjFi+hMhQFKdrwqH1jpcQqbfvqTgcAyN494O FLwzXAMNM7BnqBLd/YMjXwFCjy2Tn70GDq4RysN4I2MUCbfJY29AkW/qFUrrxcdW/UPm 5k+kPW/Wf17lcD75tK7QXBEdUpQxUPm0IDcPWrqts736/R1XKBMy22GQUNn7RcaiYYuj i3KOkUGKLYZcDKfoN5Ukoi52gY3iq5PjMUWYBZXZ6Vi/1hB5ad+14XOxnnR29fuAUGBj Pd48v5lnuV4SnGGNsyp+RF3/K58yjm3mPaa1/xcOvV7p84P/YPWn429hm2ePelnR8E1C M3+g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1773177764; x=1773782564; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=USJsgtHmtoDgSFTSjAgvcXraSNpVggb2xq+PXWw1f2A=; b=wIqNU256QYYEP8eNjLy61nGfLLuOq8Ahcy5XChl85UWqm+K9Blv95Cm1bHfoSEGe5U V5qxf6NszQDOymx49Rigfz41qHlUpe/xMihk3tl1PkXPS3jlISGRmZFogaqjp3Ic1rG3 8E6BfcCTM/iNQe4En58QckE6RhzWFnx+I58ITFNR/LmwdHzVvO0cktcns7NLKSeWizjk h02jUWdxWNGxQK9Yphca3fg/eN0e3a0mLL5eM59KXQRHph6zKC6oGvdDK8iaKYEZd1ZO iIPTWKEpkHKqjqK1VUyPS3wwxzuGB962ZhvgD7vllMoX9wY2spvuOANsNAt/BmlCxYYI rekw== X-Forwarded-Encrypted: i=1; AJvYcCUS0EbA+c70L/PBfGrDfB/puRKqhRzRnG1HNC9iE1B1Q8u6RlALa48OAwHeHjlJO7OAwTCVMSP7VRrFrt4=@vger.kernel.org X-Gm-Message-State: AOJu0Yzo7BG3U0vQT+dCmIq5+PnwFQJG2JeX3w5qcUL/grj+GUTBsqr0 7NytSRT3QBD7pKyJBtYh7T6GsLis8MUwDOIJDW/kTPCy+sqO5F6KvfBXD7m0djGdtryQXgAE5q4 JY2cXjy4= X-Gm-Gg: ATEYQzyeFvnqs0O7r+Q3PZLH761KWiduCBFFltZKw7Aar7ZC5UJcIfc4PErqclMf0tc Xv0tc1KR4I7A/wz+OUUvnFatiG9XCYwodmzCGmFrLt01GJiS4KsYBgKvfHMGCNOyxV2uwAZqRHo YsDBJ8nX3PYWqvTyAeS/ATbxYvxWPbX21upyVk6+2IKoz2bijs3fRYiL8JLGCGEAwK3t3rGnskN C0oagHM1SYTE0ZYYB3NvfZsR89FDPj7WPuepVDPrD6ah/YeYlBg/idg+3+TizzC6nbl+BwGtDb4 Qy6t4m3m05aSr8jyS4Zu07SmSOsbvmcAkQMVdhHFfs3C7aQMtVayPyaUySOfUjOcIm6zq6Amtm8 YOnb16JpF/hI4pOvtyqrEvF+HYKs35iXbH+w4uuhDT0nkWEjHTPgcMNbVJ8/ptnz1MqxFc1Vze3 +tpqc= X-Received: by 2002:a17:903:2b0c:b0:2ad:d5ea:4c89 with SMTP id d9443c01a7336-2aeae7c04bcmr2078045ad.22.1773177763969; Tue, 10 Mar 2026 14:22:43 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:1::]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2aeae222dddsm2372365ad.19.2026.03.10.14.22.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 10 Mar 2026 14:22:43 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman Cc: michael.chan@broadcom.com, pavan.chebbi@broadcom.com, linux-kernel@vger.kernel.org, Joe Damato Subject: [RFC net-next 01/10] net: tso: Introduce tso_dma_map Date: Tue, 10 Mar 2026 14:21:49 -0700 Message-ID: <20260310212209.2263939-2-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260310212209.2263939-1-joe@dama.to> References: <20260310212209.2263939-1-joe@dama.to> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add struct tso_dma_map to tso.h for tracking DMA addresses of mapped GSO payload data. The struct combines DMA mapping storage (linear_dma, frags[]) with iterator state (frag_idx, offset), allowing drivers to walk pre-mapped DMA regions linearly. Helpers to initialize and operate on this struct will be added in the next commit. Suggested-by: Jakub Kicinski Signed-off-by: Joe Damato --- include/net/tso.h | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/include/net/tso.h b/include/net/tso.h index e7e157ae0526..9a508e60ee19 100644 --- a/include/net/tso.h +++ b/include/net/tso.h @@ -3,6 +3,7 @@ #define _TSO_H =20 #include +#include #include =20 #define TSO_HEADER_SIZE 256 @@ -28,4 +29,40 @@ void tso_build_hdr(const struct sk_buff *skb, char *hdr,= struct tso_t *tso, void tso_build_data(const struct sk_buff *skb, struct tso_t *tso, int size= ); int tso_start(struct sk_buff *skb, struct tso_t *tso); =20 +/** + * struct tso_dma_map - DMA mapping state for GSO payload + * @dev: device used for DMA mapping + * @skb: the GSO skb being mapped + * @hdr_len: per-segment header length + * @frag_idx: current region (-1 =3D linear, 0..nr_frags-1 =3D frag) + * @offset: byte offset within current region + * @linear_dma: DMA address of the linear payload (after headers) + * @linear_len: length of the linear payload + * @nr_frags: number of frags successfully DMA-mapped + * @frags: per-frag DMA address and length + * + * Struct that DMA-maps the payload regions of a GSO skb + * (linear data + frags) upfront, then provides iteration to yield + * (dma_addr, chunk_len) pairs bounded by region boundaries. + * + * Drivers set dma_unmap_len on the first descriptor touching each DMA + * mapping; the completion path unmaps via per-descriptor dma_unmap_len. + */ +struct tso_dma_map { + struct device *dev; + const struct sk_buff *skb; + unsigned int hdr_len; + /* Iterator state */ + int frag_idx; + unsigned int offset; + /* Pre-mapped regions */ + dma_addr_t linear_dma; + unsigned int linear_len; + unsigned int nr_frags; + struct { + dma_addr_t dma; + unsigned int len; + } frags[MAX_SKB_FRAGS]; +}; + #endif /* _TSO_H */ --=20 2.52.0 From nobody Wed Apr 8 03:09:22 2026 Received: from mail-pj1-f52.google.com (mail-pj1-f52.google.com [209.85.216.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B37E93CC9F0 for ; Tue, 10 Mar 2026 21:22:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773177768; cv=none; b=NwRJZYnq8KSqcowFpuHa4bXLzpHDOEkpv2q9lu+9uvF77vDgcVW5TQ8DTKwXrENbpw7i3HgY8LkHuDgjbc7XlOpQkWlwHrb2njAsz3xg7c2x3lvGyZ51GuvXoKPba+Ydhq0ZuNRAekam3YBJji+pOIKNg0nePeho5wRMicX1H8o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773177768; c=relaxed/simple; bh=KPVuKItZd1MhwLbF0SvCW6nyq/QrT40WF9DJe9SLVVE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=PeJn9EYOoYA/sr0aRaAtYSO7pVzFlimtn7TgpmLZ5R8wC7xoijio0OAgEyuNfYhBwccNY33Ot5zKMQbjWiOEVeY7EfrBah+vzf4KaGo73ilupOGXT90onjpLeFGgKKXvg50NrigOI50tiz12GW1SrI8rD70hhkqsTmDUYGve/XE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to; spf=none smtp.mailfrom=dama.to; dkim=pass (2048-bit key) header.d=dama-to.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b=a1aRl5RA; arc=none smtp.client-ip=209.85.216.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=dama.to Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=dama-to.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b="a1aRl5RA" Received: by mail-pj1-f52.google.com with SMTP id 98e67ed59e1d1-3597fea200dso7386762a91.3 for ; Tue, 10 Mar 2026 14:22:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1773177766; x=1773782566; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=im3H2jdH9CTQLzHqJHTpkhsVYCfPOcqP+VrdKZHbyAg=; b=a1aRl5RAfE8J5vxCEc+8wuXY29QYEcNJvSAXsaY5+ZR1AlWD1aUFlkpUzMX53eNpSt zuO42pGwkzzBi1iHXq+MGEYfMUc1867JImm/ZFy6HU+W+2OdqrAnbpf9Tq5qJEZacrEC CvgMnEIg2CfEfbh7NtLR1ldYo5onZSBf3odvEsPK3fhXQbLuJ6/Tjtqk+d/EPb6RfEQi Nz3DhYCDPfk1GmIXmj18y6kJXBQ9CkDOck+cEyVpN26epXMe9KJOvx0KNRDEBXi4ZSMU nOsLAXtYv7U1UyoSCi61ZPeCBwETx1AoSzC+gtt9cd7Exn40OFny4HPVr2PFh/So59oB 7zSA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1773177766; x=1773782566; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=im3H2jdH9CTQLzHqJHTpkhsVYCfPOcqP+VrdKZHbyAg=; b=Xxwyru5QtleSmhvZJ9Df8yWwZ94oaod7cK9GEY7ndk/Zmu3stKZ/3Iw9rSVLHxpOwH Clx8SzE5WzHvRPD4MEUZYPYfEU/+OaAUEvNbtHMLGXApr+f0TGYyTyM1XPBArYaREKvw a2abkqwPK/4Mpzq4hupcT+rGui6tvKdX7eeSP7Igic06SPij7tF1ZU/RiNo6JYnSGO/g PqZ0Xzz+uQI7PBctY85ICd8EVXayQwSmrRTWxzlJSiRrU1HkIlzHbFacU73oDXQVYF80 LmO4rOLtI18H9Db+V7g9sCCdVcOPzoLO3NwnakPWAm/wvh6vI/SxBEp2cqDXblXMnqaC Vs8g== X-Forwarded-Encrypted: i=1; AJvYcCVBAEYHh2PZvl+Gf6yMSBvGetL+rzG8X4iYUOYlitnnlA3kPAALpaF704B6tBjIEaXVd0OwtP8dMJjMwpo=@vger.kernel.org X-Gm-Message-State: AOJu0YxTxmy37910F53fOaAlhphU0UDQ/y4Io+BW0saZbGwS+7bEs1RY Abp+r0Ev/nVVsAxfpqcbdzE2iC0L5NAnv6cB+R/ApWr/2JrTjmMiUum6W6ks5DA2ELw= X-Gm-Gg: ATEYQzzKFQM2wIpOMkNOm0Wh/fGd1pWf/PuWU+9ydiCOlnLgVAQlYzQK9MQZlk9FI3B 2YxJgzu+KLlgUY0S9xOh6yqOX/AF3bTWkMhiL5h+B6Y26aIFZeGXX+QkrqAt6bnpdoK4gbReapy ovYRqg6FjVzD8I9mdhn2Y9AxPv91zuqS2NaAQDHXX/oriPOm1wNxtaz6jF8k/BzNof552xZ2mKv 9ugOsNZm7VBCBDXZFgxN6b4ICo8b5xBiFL7nc3/iXIXgly7UgiiFfXpBdGJO+BXYo6kSG75uWi3 sVee33Zeui08UCllra0O6xynOF+1HEATvSMmWaNYNrf8PNYoQs+TFp458LpQcKtG0GbZiS3URd4 wZXnkWgqR6Nm+K/PJO7h25mG4DrMFGp77XI7VEHxzqdut45rFDbxTA2q01OKFatOtoZI53ldDcR TBtb8= X-Received: by 2002:a17:90b:380a:b0:359:fd9a:c513 with SMTP id 98e67ed59e1d1-35a012c383emr247308a91.24.1773177765930; Tue, 10 Mar 2026 14:22:45 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:6::]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-35a02474a97sm37744a91.11.2026.03.10.14.22.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 10 Mar 2026 14:22:45 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman Cc: michael.chan@broadcom.com, pavan.chebbi@broadcom.com, linux-kernel@vger.kernel.org, Joe Damato Subject: [RFC net-next 02/10] net: tso: Add tso_dma_map helpers Date: Tue, 10 Mar 2026 14:21:50 -0700 Message-ID: <20260310212209.2263939-3-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260310212209.2263939-1-joe@dama.to> References: <20260310212209.2263939-1-joe@dama.to> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add helpers to initialize, iterate, and clean up a tso_dma_map: tso_dma_map_init(): DMA-maps the linear payload region and all frags upfront into the tso_dma_map struct. Returns 0 on success, cleans up partial mappings on failure. tso_dma_map_cleanup(): unmaps all DMA regions. Used on error paths. tso_dma_map_count(): counts how many descriptors the next N bytes of payload will need, without advancing the iterator. tso_dma_map_next(): yields the next (dma_addr, chunk_len) pair. Indicates when a chunk starts a new DMA mapping so the driver can set dma_unmap_len on that BD for completion-time unmapping. Suggested-by: Jakub Kicinski Signed-off-by: Joe Damato --- include/net/tso.h | 8 +++ net/core/tso.c | 165 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 173 insertions(+) diff --git a/include/net/tso.h b/include/net/tso.h index 9a508e60ee19..dcb93c7fb917 100644 --- a/include/net/tso.h +++ b/include/net/tso.h @@ -65,4 +65,12 @@ struct tso_dma_map { } frags[MAX_SKB_FRAGS]; }; =20 +int tso_dma_map_init(struct tso_dma_map *map, struct device *dev, + const struct sk_buff *skb, unsigned int hdr_len); +void tso_dma_map_cleanup(struct tso_dma_map *map); +unsigned int tso_dma_map_count(const struct tso_dma_map *map, unsigned int= len); +bool tso_dma_map_next(struct tso_dma_map *map, dma_addr_t *addr, + unsigned int *chunk_len, unsigned int *mapping_len, + unsigned int seg_remaining); + #endif /* _TSO_H */ diff --git a/net/core/tso.c b/net/core/tso.c index 6df997b9076e..48348ad94501 100644 --- a/net/core/tso.c +++ b/net/core/tso.c @@ -3,6 +3,7 @@ #include #include #include +#include #include =20 void tso_build_hdr(const struct sk_buff *skb, char *hdr, struct tso_t *tso, @@ -87,3 +88,167 @@ int tso_start(struct sk_buff *skb, struct tso_t *tso) return hdr_len; } EXPORT_SYMBOL(tso_start); + +/** + * tso_dma_map_init - DMA-map GSO payload regions + * @map: map struct to initialize + * @dev: device for DMA mapping + * @skb: the GSO skb + * @hdr_len: per-segment header length in bytes + * + * DMA-maps the linear payload (after headers) and all frags. + * Positions the iterator at byte 0 of the payload. + * + * Returns 0 on success, -ENOMEM on DMA mapping failure (partial mappings + * are cleaned up internally). + */ +int tso_dma_map_init(struct tso_dma_map *map, struct device *dev, + const struct sk_buff *skb, unsigned int hdr_len) +{ + unsigned int linear_len =3D skb_headlen(skb) - hdr_len; + unsigned int nr_frags =3D skb_shinfo(skb)->nr_frags; + int i; + + map->dev =3D dev; + map->skb =3D skb; + map->hdr_len =3D hdr_len; + map->frag_idx =3D -1; + map->offset =3D 0; + map->linear_len =3D 0; + map->nr_frags =3D 0; + + if (linear_len > 0) { + map->linear_dma =3D dma_map_single(dev, skb->data + hdr_len, + linear_len, DMA_TO_DEVICE); + if (dma_mapping_error(dev, map->linear_dma)) + return -ENOMEM; + map->linear_len =3D linear_len; + } + + for (i =3D 0; i < nr_frags; i++) { + skb_frag_t *frag =3D &skb_shinfo(skb)->frags[i]; + + map->frags[i].len =3D skb_frag_size(frag); + map->frags[i].dma =3D skb_frag_dma_map(dev, frag, 0, + map->frags[i].len, + DMA_TO_DEVICE); + if (dma_mapping_error(dev, map->frags[i].dma)) { + tso_dma_map_cleanup(map); + return -ENOMEM; + } + map->nr_frags =3D i + 1; + } + + if (linear_len =3D=3D 0 && nr_frags > 0) + map->frag_idx =3D 0; + + return 0; +} +EXPORT_SYMBOL(tso_dma_map_init); + +/** + * tso_dma_map_cleanup - unmap all DMA regions in a tso_dma_map + * @map: the map to clean up + * + * Unmaps linear payload and all mapped frags. Used on error paths. + * Success paths use the driver's completion path to handle unmapping. + */ +void tso_dma_map_cleanup(struct tso_dma_map *map) +{ + int i; + + if (map->linear_len) + dma_unmap_single(map->dev, map->linear_dma, map->linear_len, + DMA_TO_DEVICE); + + for (i =3D 0; i < map->nr_frags; i++) + dma_unmap_page(map->dev, map->frags[i].dma, map->frags[i].len, + DMA_TO_DEVICE); + + map->linear_len =3D 0; + map->nr_frags =3D 0; +} +EXPORT_SYMBOL(tso_dma_map_cleanup); + +/** + * tso_dma_map_count - count descriptors for a payload range + * @map: the payload map + * @len: number of payload bytes in this segment + * + * Counts how many contiguous DMA region chunks the next @len bytes + * will span, without advancing the iterator. Uses frag sizes from + * the current position. + * + * Returns the number of descriptors needed for @len bytes of payload. + */ +unsigned int tso_dma_map_count(const struct tso_dma_map *map, unsigned int= len) +{ + unsigned int offset =3D map->offset; + int idx =3D map->frag_idx; + unsigned int count =3D 0; + + while (len > 0) { + unsigned int region_len, chunk; + + if (idx =3D=3D -1) + region_len =3D map->linear_len; + else + region_len =3D map->frags[idx].len; + + chunk =3D min(len, region_len - offset); + len -=3D chunk; + count++; + offset =3D 0; + idx++; + } + + return count; +} +EXPORT_SYMBOL(tso_dma_map_count); + +/** + * tso_dma_map_next - yield the next DMA address range + * @map: the payload map + * @addr: output DMA address + * @chunk_len: output chunk length + * @mapping_len: output full mapping length when this is the first BD of + * a DMA mapping (driver should set dma_unmap_len to this), + * or 0 when continuing a previous mapping + * @seg_remaining: bytes left in current segment + * + * Yields the next (dma_addr, chunk_len) pair and advances the iterator. + * + * Returns true if a chunk was yielded, false when @seg_remaining is 0. + */ +bool tso_dma_map_next(struct tso_dma_map *map, dma_addr_t *addr, + unsigned int *chunk_len, unsigned int *mapping_len, + unsigned int seg_remaining) +{ + unsigned int region_len, chunk; + + if (!seg_remaining) + return false; + + if (map->frag_idx =3D=3D -1) { + region_len =3D map->linear_len; + chunk =3D min(seg_remaining, region_len - map->offset); + *addr =3D map->linear_dma + map->offset; + *mapping_len =3D (map->offset =3D=3D 0) ? region_len : 0; + } else { + region_len =3D map->frags[map->frag_idx].len; + chunk =3D min(seg_remaining, region_len - map->offset); + *addr =3D map->frags[map->frag_idx].dma + map->offset; + *mapping_len =3D (map->offset =3D=3D 0) ? region_len : 0; + } + + *chunk_len =3D chunk; + map->offset +=3D chunk; + + if (map->offset >=3D region_len) { + map->frag_idx++; + map->offset =3D 0; + } + + return true; +} +EXPORT_SYMBOL(tso_dma_map_next); --=20 2.52.0 From nobody Wed Apr 8 03:09:22 2026 Received: from mail-pf1-f176.google.com (mail-pf1-f176.google.com [209.85.210.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 84EAC3E92B9 for ; Tue, 10 Mar 2026 21:22:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773177772; cv=none; b=gqshAhXUDhjRISk+60hLv6iDZZACi4YV4pTWlcf9EO5XXzUmH+NorPpihbq2SVye2R8qQV1sk07EFnui5sAAnPvPtrslHlh6nrIgQg6h204ViYiSD8AjZnmbt9ftXFdLngJTOBy5bsCioeH+b0zxvFP0W+HZJqpsdMoVnoGWiR4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773177772; c=relaxed/simple; bh=+GtcV0YFOuvWw7iJiSWBEJ7HxYlIrdtSChqxKZ1x0pA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=CLJ3kWF0lfm/AaJgmSAYPaiteJARe9tvkH+J5QeDYvJ4z9KHNIMqAwTmK6I6PVVkgVZM19ReaDtZOTPDNust/2t7xY9VoIx5BM6LDQge4faTa2SJ9+fRtSZoZfLVZi6Kk5R7zMSozkyr+lt9LcVL5WpwVHik4j+JbChvb1up/zY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to; spf=none smtp.mailfrom=dama.to; dkim=pass (2048-bit key) header.d=dama-to.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b=AXTAF5ek; arc=none smtp.client-ip=209.85.210.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=dama.to Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=dama-to.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b="AXTAF5ek" Received: by mail-pf1-f176.google.com with SMTP id d2e1a72fcca58-829b2019b39so2195617b3a.3 for ; Tue, 10 Mar 2026 14:22:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1773177768; x=1773782568; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=zsp2AL8p7AgDFcNjxBW2R9vCk4D/TpG/eONaogdk/ds=; b=AXTAF5ekhUS0bW96Y7oPMRT5x6jTeFmPX38AwDKCQrYvvP0mhJXsANxgSHZ4zdRRna vHbEj8T0rQt7NBvlVd2p4mJhK9I4FN+YtEoGs1nltBbajCP0OXji6Oe0ngHxHqaGoy6C /uWfQ9a3svLJZ2pBEfVtuCihtq1XaC2zi+ceUFpBCWqobEhv5WKpYc9iRpEepCRBqUOt QoAJ+56CU//pdWUSdfJj+DDai4fDGs6UYLaR4Q/LlAt7bbnQY65Hd5S5DEX88WQHJEP9 BzzQVkgHl2qbmAY1SPwqJYppYLONcc9dmwUV45pIQfxpx755MwnKLkNOng5/1PJhKNKc 69og== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1773177768; x=1773782568; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=zsp2AL8p7AgDFcNjxBW2R9vCk4D/TpG/eONaogdk/ds=; b=ADzduSHCEKEfsYcLscB6+WBF9Eu11tLOaYaxxSIDEj2n9SFusXGJKJvGRW7NZvZVxC Wky9s6hMX5t3HGjSCQmM69nHYBBC4Sku87+La17BBNVH2QHR+DC4J3+Nk8tcM6Fn0WQa eY6k3V/tcbrOkO+qLYzK7DEpjo9fcIs8yj5OFNjuha2G9rbdG/B8nuYccVWjBmGHqmz7 +G/HvQQuWx+EkBE2dtZGXmyiRvLp4nWr4vSANeR1jd00ix3iawV6dvqMZdQ6I6M6zgyG OWk8LsS8obeYkH0j6kON/wYbWuzew1KkeelFutr0nqykqfm5VnjV4IeDa1jz9i7Togt7 rb2Q== X-Gm-Message-State: AOJu0YzHUoT4wxzVdqM1uegOZiZtFHQu32yO4GpvMjj0XcyLQb2d1hWY B0R2TaZ3fRJEnAPzpdHzX8LTFUJtYE5SdAqBYKRy4ZiWJfmn3nZYwxXjVMtYpElAY1s= X-Gm-Gg: ATEYQzxnDltzlPLG0MusLYFk59YJzntcwzjekwURcWiOouqxQ+Ut7h1vcBvZnFAXxS7 0Kpwww7YRipXRPExsptSXpmjyIjqn8Q/Lzl6U/6zEGhHgUnbZOiVQZwY6V5qp9d4dVuODaXjBfv kp75BC9xNhvruc3BTR+pK3/zXT7AU2a7vuqjwjOfrGx43VukDaVJ3skq8ap4nuHlbV3DgRnUoCA rG2baiU8+wJbHjaH22GWsE2mAYdmYKKm78x27q4h1dkWF64dumRn8ywdUOoAQcgkP5hu1lK0EQS zHBNKc0sVvixL5xBpFrZsGn5ZkjyxLFReUYmUAddb1L4isrXaPfJT42DWUkv5y7QWqnsV22NvGj GCyF+ZoUOHQrMsb4jQJzR1ZIT2nzV02xu2OEqTHoq8cq1Mf9hOfsULlBicazG6srsK3OZnKVTWg hOYnw= X-Received: by 2002:a05:6a00:2356:b0:827:3310:fb18 with SMTP id d2e1a72fcca58-829f723de6cmr282496b3a.51.1773177767706; Tue, 10 Mar 2026 14:22:47 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:1::]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-829f6df87bfsm193051b3a.24.2026.03.10.14.22.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 10 Mar 2026 14:22:47 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, Michael Chan , Pavan Chebbi , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: linux-kernel@vger.kernel.org, Joe Damato Subject: [RFC net-next 03/10] net: bnxt: Export bnxt_xmit_get_cfa_action Date: Tue, 10 Mar 2026 14:21:51 -0700 Message-ID: <20260310212209.2263939-4-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260310212209.2263939-1-joe@dama.to> References: <20260310212209.2263939-1-joe@dama.to> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Export bnxt_xmit_get_cfa_action so that it can be used in future commits which add software USO support to bnxt. Suggested-by: Jakub Kicinski Signed-off-by: Joe Damato --- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 2 +- drivers/net/ethernet/broadcom/bnxt/bnxt.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethern= et/broadcom/bnxt/bnxt.c index 84095d09ecf8..5033aab2d3a6 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -445,7 +445,7 @@ const u16 bnxt_lhint_arr[] =3D { TX_BD_FLAGS_LHINT_2048_AND_LARGER, }; =20 -static u16 bnxt_xmit_get_cfa_action(struct sk_buff *skb) +u16 bnxt_xmit_get_cfa_action(struct sk_buff *skb) { struct metadata_dst *md_dst =3D skb_metadata_dst(skb); =20 diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethern= et/broadcom/bnxt/bnxt.h index 663708fd3cbc..48c91cdf1975 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h @@ -2936,6 +2936,7 @@ unsigned int bnxt_get_avail_cp_rings_for_en(struct bn= xt *bp); int bnxt_reserve_rings(struct bnxt *bp, bool irq_re_init); void bnxt_tx_disable(struct bnxt *bp); void bnxt_tx_enable(struct bnxt *bp); +u16 bnxt_xmit_get_cfa_action(struct sk_buff *skb); void bnxt_sched_reset_txr(struct bnxt *bp, struct bnxt_tx_ring_info *txr, u16 curr); void bnxt_report_link(struct bnxt *bp); --=20 2.52.0 From nobody Wed Apr 8 03:09:22 2026 Received: from mail-pl1-f175.google.com (mail-pl1-f175.google.com [209.85.214.175]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 39E1B35AC26 for ; Tue, 10 Mar 2026 21:22:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773177772; cv=none; b=ALkkM0yA4QMwW7uLXe/iNfrO8EIxJjOPGohFuPd3lS6ZT27mvIOLjQbLxJ0l2mAKxLneY4M8HZwKpOhhIDkkLR3U6D5bmjD6byHlTamQCGNHj9pewemdM1XCy2VYr0h2ZTpl0kiCpkQlpC69zqMIxhjYmjmpxJF9smPdLtlweBg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773177772; c=relaxed/simple; bh=IvGII0Yt/19qZKnIYpWtvpz5Dtp/omOYGCRq7UkCRbA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bukJLirWAdo4uMJeJI+DxQs2h4XkdMd5lcKW4vtn4tZiLNrokNE7AqHTwGb67Qwg7QZVMTTjFZrsLuUg/Nk8AItS9RAQMFDwBany5i5rFieHucya9qRBkhnYXkpBL4SUhQue7LokBnrntmdqfgfKVQJBtZ6vVFdeKey50b5gkyE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to; spf=none smtp.mailfrom=dama.to; dkim=pass (2048-bit key) header.d=dama-to.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b=rqK1drnd; arc=none smtp.client-ip=209.85.214.175 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=dama.to Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=dama-to.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b="rqK1drnd" Received: by mail-pl1-f175.google.com with SMTP id d9443c01a7336-2ae5636ab04so100454805ad.3 for ; Tue, 10 Mar 2026 14:22:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1773177769; x=1773782569; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=mgBw4DlbHXB4kGfTTmSAa0HOfHAq4IWmv5ZPrMQMbQQ=; b=rqK1drndQjQBW9XCLRKZ+QwP2OHdoTNisYOZTYA0uDK9yGzsn4jFJ2hf58gmqhOLSL pLRWtLqstqH6poY6i9xb/EI4CGc4ZkeIkGSbkoDz/1c7T0Vr8noVgjhqXafpzgc4Wu91 SSabt37VQgz7xoxgRzosO6Pw+/UG2k7FQM6wEkvdsIIHoJsQV5QU07WxVNfsxQZgqU6Q B5oMrTt9dyRdiDpG0QELYJXd+12bahpEgv7gFAjEUIczPlRfCYRdSb4uqTnDL4oDhCFD 3H1ORrw6tNWfaoq1MnJ6kdxsrWIwe18/cfS49lv0EkGz1EEB1WA/t3v2xR+cUsSTKnrm Kj1g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1773177769; x=1773782569; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=mgBw4DlbHXB4kGfTTmSAa0HOfHAq4IWmv5ZPrMQMbQQ=; b=MV+pk2FjC+NcIbQT6HJRe2S8ppfHlXMbH6wbscwtc026uwalCJ7j+iuxN5ftKMg135 IHRHUJWbhWkbhGafd80aVCDxufoNp9fFnPtlLE11GNk1uScMpjlNsnoVKfIsiqq8884m AsWtWUBWZeQPjqh7xnPqUJZj2diwNYLwU7+ZOqXn/tXrNHgsJaKwHcBad4ZmesBxMu8F vEh4yp6bkGU6xCOnP4T+fd4hFKATCfYBo8Q7WIQxbRjFgL8LjISv17PJnOIyTFszl939 QED4ZypCbRHsEMxBvCje4uOxlhFhtDpj/nqA/1Cphx5pqDPNxouDfEcZaCiZNTQVWRk8 6peA== X-Gm-Message-State: AOJu0Yxl11iUL2UVDYRQ1cX2qfiRjEAQiEaNLbdnJtaP37G8mZiDUnjs K97rQpwMYwQUrnSa6qJEbBTdr90JuSNv9eN44Ske332BhcHcLnMpiudEBmwzvIVB7JA= X-Gm-Gg: ATEYQzwKje8LyoJLI5kBz/tnn2xp3iCoq4twRg+sw3N+dCbnFYCyexOw/boPtHHYlc+ kBvY1aVIpvhKx1OwOIuOoXVfZ0yP1542HtkEZOrtwQzI/VSFLkQ3CusLJVQfS6bFS1AnQfc3rhg o88a6dzj7SZdNfcDSXtWmNrPGHpLnmPYjO4v6CDavnsbb6ELzP6HWlcB1PXesu8GiO5i6d2/bKe hqh4UmePy8+xeTWbPE7pluQUjeFEu31LK3G0Y27dA3yOpyH4t5TK4KRWLZVWW2t6/drTKM2RC4E 8AbiX3AcmyE487/6yz6Mxja9rYTmJD/Km3iea9aYGHLdJSb65gihzGVNEd/xwY9wHPTccXSAml9 5ODo2mGfYq2psBvBGjFsfsztoBva8Xc70W2cYF5F8CSzS5nuXGQyOqWmADQboVncbDfDsmPAjAn IHvcOt X-Received: by 2002:a17:903:41d0:b0:2ae:4a74:abdf with SMTP id d9443c01a7336-2aeae767fa3mr2410195ad.9.1773177769437; Tue, 10 Mar 2026 14:22:49 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:74::]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2aeae34de20sm1774285ad.60.2026.03.10.14.22.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 10 Mar 2026 14:22:49 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, Michael Chan , Pavan Chebbi , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: linux-kernel@vger.kernel.org, Joe Damato Subject: [RFC net-next 04/10] net: bnxt: Add a helper for tx_bd_ext Date: Tue, 10 Mar 2026 14:21:52 -0700 Message-ID: <20260310212209.2263939-5-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260310212209.2263939-1-joe@dama.to> References: <20260310212209.2263939-1-joe@dama.to> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Factor out some code to setup tx_bd_exts into a helper function. This helper will be used by SW USO implementation in the following commits. Suggested-by: Jakub Kicinski Signed-off-by: Joe Damato --- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 9 ++------- drivers/net/ethernet/broadcom/bnxt/bnxt.h | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethern= et/broadcom/bnxt/bnxt.c index 5033aab2d3a6..c52db7135ded 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -664,10 +664,9 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb= , struct net_device *dev) txbd->tx_bd_opaque =3D SET_TX_OPAQUE(bp, txr, prod, 2 + last_frag); =20 prod =3D NEXT_TX(prod); - txbd1 =3D (struct tx_bd_ext *) - &txr->tx_desc_ring[TX_RING(bp, prod)][TX_IDX(prod)]; + txbd1 =3D bnxt_init_ext_bd(bp, txr, prod, lflags, vlan_tag_flags, + cfa_action); =20 - txbd1->tx_bd_hsize_lflags =3D lflags; if (skb_is_gso(skb)) { bool udp_gso =3D !!(skb_shinfo(skb)->gso_type & SKB_GSO_UDP_L4); u32 hdr_len; @@ -694,7 +693,6 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb,= struct net_device *dev) } else if (skb->ip_summed =3D=3D CHECKSUM_PARTIAL) { txbd1->tx_bd_hsize_lflags |=3D cpu_to_le32(TX_BD_FLAGS_TCP_UDP_CHKSUM); - txbd1->tx_bd_mss =3D 0; } =20 length >>=3D 9; @@ -707,9 +705,6 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb,= struct net_device *dev) flags |=3D bnxt_lhint_arr[length]; txbd->tx_bd_len_flags_type =3D cpu_to_le32(flags); =20 - txbd1->tx_bd_cfa_meta =3D cpu_to_le32(vlan_tag_flags); - txbd1->tx_bd_cfa_action =3D - cpu_to_le32(cfa_action << TX_BD_CFA_ACTION_SHIFT); txbd0 =3D txbd; for (i =3D 0; i < last_frag; i++) { frag =3D &skb_shinfo(skb)->frags[i]; diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethern= et/broadcom/bnxt/bnxt.h index 48c91cdf1975..c5dd341e7d95 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h @@ -2820,6 +2820,24 @@ static inline u32 bnxt_tx_avail(struct bnxt *bp, return bp->tx_ring_size - (used & bp->tx_ring_mask); } =20 +static inline struct tx_bd_ext * +bnxt_init_ext_bd(struct bnxt *bp, struct bnxt_tx_ring_info *txr, + u16 prod, __le32 lflags, u32 vlan_tag_flags, + u32 cfa_action) +{ + struct tx_bd_ext *txbd1; + + txbd1 =3D (struct tx_bd_ext *) + &txr->tx_desc_ring[TX_RING(bp, prod)][TX_IDX(prod)]; + txbd1->tx_bd_hsize_lflags =3D lflags; + txbd1->tx_bd_mss =3D 0; + txbd1->tx_bd_cfa_meta =3D cpu_to_le32(vlan_tag_flags); + txbd1->tx_bd_cfa_action =3D + cpu_to_le32(cfa_action << TX_BD_CFA_ACTION_SHIFT); + + return txbd1; +} + static inline void bnxt_writeq(struct bnxt *bp, u64 val, volatile void __iomem *addr) { --=20 2.52.0 From nobody Wed Apr 8 03:09:22 2026 Received: from mail-pf1-f179.google.com (mail-pf1-f179.google.com [209.85.210.179]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D079B3EAC6A for ; Tue, 10 Mar 2026 21:22:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773177775; cv=none; b=VtbiYlPCzdgVQGoqIwxomWQAfquQWx1Mdwx3i5Z2nITSM8dYcQb9GTou3KJ4vCpSTe3sIWA6ThfywfEo9qczyZTeu9ALkb2MXpmOSsVjYs5ahXiKPJMwx6CSW/cEPAXbiLm8gHZYGZogZG9XV35iM9an1xPIySDDsd6YDHOzkSg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773177775; c=relaxed/simple; bh=DcJ0BGCersFrhp9VNVWRnvjOToN0C6ltP0u8NNPqSUU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Ajv4Hy8YNRSw0inIpgZTP3ZnC1bpEnKg2digtrVW4s/S00E1ZTxUO/E9FawtzdQzb9ZAgfw+CQq7OPccHqwSiXD/irswwGUcnkAUsIE1c0SgfJOlCv4xlr/hidsFIE/Cen6WNcBskiJ4MMkV3GaCdmmUtr9K4cypZ/tHBtPsroA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to; spf=none smtp.mailfrom=dama.to; dkim=pass (2048-bit key) header.d=dama-to.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b=eRUilQAn; arc=none smtp.client-ip=209.85.210.179 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=dama.to Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=dama-to.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b="eRUilQAn" Received: by mail-pf1-f179.google.com with SMTP id d2e1a72fcca58-829a568f3ccso2362828b3a.0 for ; Tue, 10 Mar 2026 14:22:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1773177771; x=1773782571; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=MsF+ejVwY/S1YOmLcgZAjHITHgFQNlN9mt3hAKMMsTQ=; b=eRUilQAnd3BT2AfN13wpviVz2IcV+OcnRYfCJSOh15m1Qit80Fp1vUU1hPN2sE48tm TpEe1Ps4lm6PMxAAukD5bKI5/ydurCeP15KhZDJGYkcgMzLy8wlt2drPP/V/dShozV/H rLd0K0s8QBQRagSkMe4p8SgKjdlEqPT22ary5pM6zf7uMZRJzUIj/JA+MoqQYuIuiblu wyrJI/6wenxCZLhZQqLEzelu6NLYFzE3d+emhoeqZ7QotBbtdEUNscgKI66BgSawx7bw mtESwUM+RYbtxjXN2dJn0Bpwnd36AVsmdM8Ow+ma9RWZZWWiGCNsqdJfYg7oeOFd2Qti LJqw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1773177771; x=1773782571; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=MsF+ejVwY/S1YOmLcgZAjHITHgFQNlN9mt3hAKMMsTQ=; b=PrWJiSEsePnaay9Qp4wqvr+8zBkM5NRelQjfbLOlR/UioSPJXXDz1o/iKG3YzQ2RI2 199S6NfNymk3ZUEklPCZiYXkZ8WRmxQVF4driyufheoBYQI39PXth4tP0UYFTkfNOKrL zshuyozY6rYS0PlUxEQlc8s11brdJKPKeAIL0NwnZab0EQ+A0r+5eoM+33qrO8Kd7haw +kUZfsWkjc7kPPH4Kx4GAGMQG52fDEW2Ybw4WCXXgTd7W1SLKZAMijb0p8V1zU5a54A+ HgeN6/6grF26OQxJxVd3+MlhtzUcdH4s9RvT4jPcMkyLX/cGKQM1tvpy2CT1geaDgqwM JNjg== X-Gm-Message-State: AOJu0Yy5M24/qKOikPwNLn17hz1RCN4pGEt9kbYvPL0g4ktlJTlwEqwr jGvv1tPIjpad+RYHNTbzhxU/zxGX8KXndr7IQJoDkfLAuQF6P/cmqAoViXH7f6GdEf8= X-Gm-Gg: ATEYQzyzvyWj6W4CoLgUV6nhlt3rsZ0uTL7Ibj5uzb5dt+rmEyqyiCPj9QIsPtnUKH2 ecPu+JWECXQvPKNfARdSINwk6bPBCASzuFhjLVoMpawjmm7lTukRq6CQKaZa7yY9uyztot4v1u6 Sj2VUtQgkveGgMg+YNsCVWMUpWArmYkEJB3SA7jSub6TgoO6JNb7oi512Xiom8Y6JS66W68h/Ax gOoYoVe1H4g0q1p82z2DRUKVIONgdj69uxkgbj7jaIEPe4yIc7tfu4nicuzyiSsQqMeFytp36nG CXo1OqMPgrE3aaMYOVjgVG+QWA8tgc9bb0RcuhzfbxykReHQzbSjRrr/9DOCO+t1LVPq1InyLRv A7DJxzPLSxCDmd5UlvY89Mu+rOKscaf7zeLPGUeKkP+jgXnu/WpTa7AABvWBZNxRb4u6vDRYU9A fgXgw= X-Received: by 2002:a05:6a20:729e:b0:398:c1d8:f584 with SMTP id adf61e73a8af0-398c616642dmr51010637.62.1773177771100; Tue, 10 Mar 2026 14:22:51 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:9::]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-c73cdf24baasm126350a12.8.2026.03.10.14.22.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 10 Mar 2026 14:22:50 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, Michael Chan , Pavan Chebbi , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: linux-kernel@vger.kernel.org, Joe Damato Subject: [RFC net-next 05/10] net: bnxt: Use dma_unmap_len for TX completion unmapping Date: Tue, 10 Mar 2026 14:21:53 -0700 Message-ID: <20260310212209.2263939-6-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260310212209.2263939-1-joe@dama.to> References: <20260310212209.2263939-1-joe@dama.to> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Store the DMA mapping length in each TX buffer descriptor via dma_unmap_len_set at submit time, and use dma_unmap_len at completion time. This is a no-op for normal packets but prepares for software USO, where header BDs set dma_unmap_len to 0 because the header buffer is unmapped collectively rather than per-segment. Suggested-by: Jakub Kicinski Signed-off-by: Joe Damato --- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 51 ++++++++++++++--------- 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethern= et/broadcom/bnxt/bnxt.c index c52db7135ded..b801daf3f328 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -657,6 +657,7 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb,= struct net_device *dev) goto tx_free; =20 dma_unmap_addr_set(tx_buf, mapping, mapping); + dma_unmap_len_set(tx_buf, len, len); flags =3D (len << TX_BD_LEN_SHIFT) | TX_BD_TYPE_LONG_TX_BD | TX_BD_CNT(last_frag + 2); =20 @@ -721,6 +722,7 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb,= struct net_device *dev) tx_buf =3D &txr->tx_buf_ring[RING_TX(bp, prod)]; netmem_dma_unmap_addr_set(skb_frag_netmem(frag), tx_buf, mapping, mapping); + dma_unmap_len_set(tx_buf, len, len); =20 txbd->tx_bd_haddr =3D cpu_to_le64(mapping); =20 @@ -810,7 +812,8 @@ static bool __bnxt_tx_int(struct bnxt *bp, struct bnxt_= tx_ring_info *txr, u16 hw_cons =3D txr->tx_hw_cons; unsigned int tx_bytes =3D 0; u16 cons =3D txr->tx_cons; - skb_frag_t *frag; + unsigned int dma_len; + dma_addr_t dma_addr; int tx_pkts =3D 0; bool rc =3D false; =20 @@ -845,19 +848,27 @@ static bool __bnxt_tx_int(struct bnxt *bp, struct bnx= t_tx_ring_info *txr, goto next_tx_int; } =20 - dma_unmap_single(&pdev->dev, dma_unmap_addr(tx_buf, mapping), - skb_headlen(skb), DMA_TO_DEVICE); + if (dma_unmap_len(tx_buf, len)) { + dma_addr =3D dma_unmap_addr(tx_buf, mapping); + dma_len =3D dma_unmap_len(tx_buf, len); + + dma_unmap_single(&pdev->dev, dma_addr, dma_len, + DMA_TO_DEVICE); + } + last =3D tx_buf->nr_frags; =20 for (j =3D 0; j < last; j++) { - frag =3D &skb_shinfo(skb)->frags[j]; cons =3D NEXT_TX(cons); tx_buf =3D &txr->tx_buf_ring[RING_TX(bp, cons)]; - netmem_dma_unmap_page_attrs(&pdev->dev, - dma_unmap_addr(tx_buf, - mapping), - skb_frag_size(frag), - DMA_TO_DEVICE, 0); + if (dma_unmap_len(tx_buf, len)) { + dma_addr =3D dma_unmap_addr(tx_buf, mapping); + dma_len =3D dma_unmap_len(tx_buf, len); + + netmem_dma_unmap_page_attrs(&pdev->dev, + dma_addr, dma_len, + DMA_TO_DEVICE, 0); + } } if (unlikely(is_ts_pkt)) { if (BNXT_CHIP_P5(bp)) { @@ -3436,23 +3447,25 @@ static void bnxt_free_one_tx_ring_skbs(struct bnxt = *bp, continue; } =20 - dma_unmap_single(&pdev->dev, - dma_unmap_addr(tx_buf, mapping), - skb_headlen(skb), - DMA_TO_DEVICE); + if (dma_unmap_len(tx_buf, len)) + dma_unmap_single(&pdev->dev, + dma_unmap_addr(tx_buf, mapping), + dma_unmap_len(tx_buf, len), + DMA_TO_DEVICE); =20 last =3D tx_buf->nr_frags; i +=3D 2; for (j =3D 0; j < last; j++, i++) { int ring_idx =3D i & bp->tx_ring_mask; - skb_frag_t *frag =3D &skb_shinfo(skb)->frags[j]; =20 tx_buf =3D &txr->tx_buf_ring[ring_idx]; - netmem_dma_unmap_page_attrs(&pdev->dev, - dma_unmap_addr(tx_buf, - mapping), - skb_frag_size(frag), - DMA_TO_DEVICE, 0); + if (dma_unmap_len(tx_buf, len)) + netmem_dma_unmap_page_attrs(&pdev->dev, + dma_unmap_addr(tx_buf, + mapping), + dma_unmap_len(tx_buf, + len), + DMA_TO_DEVICE, 0); } dev_kfree_skb(skb); } --=20 2.52.0 From nobody Wed Apr 8 03:09:22 2026 Received: from mail-pl1-f176.google.com (mail-pl1-f176.google.com [209.85.214.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B847E3EBF39 for ; Tue, 10 Mar 2026 21:22:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773177778; cv=none; b=EkKObmHw8Z4DzqlK3eiETgwAMwZXJ6YQ9HS73D1CNud5K4nXCJC7cDr0oRjfjaJE4LQqlQBz7Lmryo8UCWQvLXW01Xch3bTsl3S2Xcv4xQMrm0nGJSmbqwN0kl5OUHqmQgpvNIakL88Clpn7MLk2OlAlShKg78hqJk04wuG00qo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773177778; c=relaxed/simple; bh=7zhwd/yH+NbmLERZKdu4eKpm0EQlFIvQsCyvSDX/uHE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=B03RnigpjQDujDHzgYkW2qhyTWDn3v9PW0POG8vewIX9AC7Dpl+sH4AX5Qgji9ys+R5CPilbJ28ag3hm61j0dddXJHa/CVMSqLHeR/UTKABWaW9aLsb+lodJHLMbjM1pDos8VCnEmcPXxSuidd5YhkWi2+g7GcIth2AhmbjtNQs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to; spf=none smtp.mailfrom=dama.to; dkim=pass (2048-bit key) header.d=dama-to.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b=mQK48bf2; arc=none smtp.client-ip=209.85.214.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=dama.to Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=dama-to.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b="mQK48bf2" Received: by mail-pl1-f176.google.com with SMTP id d9443c01a7336-2adbfab4501so60144685ad.2 for ; Tue, 10 Mar 2026 14:22:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1773177773; x=1773782573; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=K99iY/zLnMAtTJc6rl7mUQQjo8+bfTAMRl6zpUzhIbc=; b=mQK48bf2MBf++K7llVtWhlZ8eTToYmilq9O18Q+bEm5bbUjh2FXFrUL9LdJ++uVT6F csXDVEyTiXnZAaMN+0tYX51ulUST1Q4jjApumCmnN8Tn9BcbUNlU0PVBFQdAeXyvIt1J frZNgfXDVwODZFVOOnzp75E8oaku5Bt0I6y8mmwEOhyojlFMYTkhnoqdrwfuIOP0zN4J CqVVsoFZwp632IJoei5GLby9WT/WYYmOBuo8n3K/77/BV9h0/nHprLmm/FAQjYGPcoFs ldtuX2VigIWJt+hmYSxlfXBWkTjJZfydW1GVP6wiB4CU86RLo7pq8cuVb0Y3u9DOQDbu 6ZUg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1773177773; x=1773782573; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=K99iY/zLnMAtTJc6rl7mUQQjo8+bfTAMRl6zpUzhIbc=; b=n89Io+WsoA882y8yiL6O1zphGQTfqxt/OV0Yxcdc27KmvOKdxq7lijEqonOUf5jHxv XKYPuUG9OMC/NiHyJ0dCMnMjHpNqJc5s72aSYLZ/Ds0D4pHQAYzQQ+sP+08ix5fMjYYI viiAWjpIk7vFv8eIer6dB4JgXj9x18MwMFiEV7axYdTybXJtBf9vbSSN0RR54shZT9l7 FaR3IDbvmp5LUC7qmAuJRkX/1A6jJh3f5nnF1tnwpi+cnylBJlNyBkt06/QuyZ1cUkhp rV3g79DBZurwXxz/TD5JdteiY5LvJiYw3ILPBabZcdSFx/CszsAqCQCa9sOAcWgKAW15 ePmA== X-Gm-Message-State: AOJu0YyAEpPBx9VrAZGDFfk7Olhmo46KkyW941ynj8iILEK6CTi/Qs+S DFRNmn1SvQGKee85aeqDrmhN4FjnCE8zIts3TZEAzM4lCdcgkf2m4vtj1ga8JkmfW/s= X-Gm-Gg: ATEYQzzgR5OMNbUKiiMmcap1esyPtzqyqBuT9vx1QzBfJQuMPJVKpd2NCNiRu2nbk9U baJJOjUnbUoWuwUT3FtO5IwK/luicnAcktTxMh9/bcE8ZHG2AuspB8ip8gODyvXXmbbkj3xrzK0 BlzVnzwMpOGVccihqz743lD28KnVPcH3ou7+vcv3EQVTa8l0ihgFpayl7sKUf5rWmBbwYUon4gl dH2xcPuKSIBADlptIABQXlvRsqsYqF6J3v4bDc98+Mjfjklq236q2LPpwncKHir6ecfePsbcwL+ mPs1rp+jJDibtJP54xIqEl693bqKeoKUpXMM/tHzxxoUJ5uj9qQTN4BpBE4IuiHqxC7LFK8zDPT gHbs/YsbEHLdbcLqtcxIKM1BrfyXd+UIuq1B9Z0SRJeWO6BZlFC7JJT62YkjSAN1+CjqFN8WJHY 9k X-Received: by 2002:a17:902:ce89:b0:2ae:a928:f544 with SMTP id d9443c01a7336-2aeae8f0001mr2199725ad.45.1773177772920; Tue, 10 Mar 2026 14:22:52 -0700 (PDT) Received: from localhost ([2a03:2880:2ff::]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2aeae34de20sm1774915ad.60.2026.03.10.14.22.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 10 Mar 2026 14:22:52 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, Michael Chan , Pavan Chebbi , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: linux-kernel@vger.kernel.org, Joe Damato Subject: [RFC net-next 06/10] net: bnxt: Add TX inline buffer infrastructure Date: Tue, 10 Mar 2026 14:21:54 -0700 Message-ID: <20260310212209.2263939-7-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260310212209.2263939-1-joe@dama.to> References: <20260310212209.2263939-1-joe@dama.to> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add per-ring pre-allocated inline buffer fields (tx_inline_buf, tx_inline_dma, tx_inline_size) to bnxt_tx_ring_info and helpers to allocate and free them. The inline buffer will be used by the SW USO path for pre-allocated, pre-DMA-mapped per-segment header copies. In the future, this could be extended to support TX copybreak. Allocation helper is marked __maybe_unused in this commit because it will be wired in later. Suggested-by: Jakub Kicinski Signed-off-by: Joe Damato --- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 35 +++++++++++++++++++++++ drivers/net/ethernet/broadcom/bnxt/bnxt.h | 4 +++ 2 files changed, 39 insertions(+) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethern= et/broadcom/bnxt/bnxt.c index b801daf3f328..906e842d9c53 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -3962,6 +3962,39 @@ static int bnxt_alloc_rx_rings(struct bnxt *bp) return rc; } =20 +static void bnxt_free_tx_inline_buf(struct bnxt_tx_ring_info *txr, + struct pci_dev *pdev) +{ + if (!txr->tx_inline_buf) + return; + + dma_unmap_single(&pdev->dev, txr->tx_inline_dma, + txr->tx_inline_size, DMA_TO_DEVICE); + kfree(txr->tx_inline_buf); + txr->tx_inline_buf =3D NULL; + txr->tx_inline_size =3D 0; +} + +static int __maybe_unused bnxt_alloc_tx_inline_buf(struct bnxt_tx_ring_inf= o *txr, + struct pci_dev *pdev, + unsigned int size) +{ + txr->tx_inline_buf =3D kmalloc(size, GFP_KERNEL); + if (!txr->tx_inline_buf) + return -ENOMEM; + + txr->tx_inline_dma =3D dma_map_single(&pdev->dev, txr->tx_inline_buf, + size, DMA_TO_DEVICE); + if (dma_mapping_error(&pdev->dev, txr->tx_inline_dma)) { + kfree(txr->tx_inline_buf); + txr->tx_inline_buf =3D NULL; + return -ENOMEM; + } + txr->tx_inline_size =3D size; + + return 0; +} + static void bnxt_free_tx_rings(struct bnxt *bp) { int i; @@ -3980,6 +4013,8 @@ static void bnxt_free_tx_rings(struct bnxt *bp) txr->tx_push =3D NULL; } =20 + bnxt_free_tx_inline_buf(txr, pdev); + ring =3D &txr->tx_ring_struct; =20 bnxt_free_ring(bp, &ring->ring_mem); diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethern= et/broadcom/bnxt/bnxt.h index c5dd341e7d95..41d933a4c282 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h @@ -992,6 +992,10 @@ struct bnxt_tx_ring_info { dma_addr_t tx_push_mapping; __le64 data_mapping; =20 + void *tx_inline_buf; + dma_addr_t tx_inline_dma; + unsigned int tx_inline_size; + #define BNXT_DEV_STATE_CLOSING 0x1 u32 dev_state; =20 --=20 2.52.0 From nobody Wed Apr 8 03:09:22 2026 Received: from mail-pl1-f174.google.com (mail-pl1-f174.google.com [209.85.214.174]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2471F3EC2E0 for ; Tue, 10 Mar 2026 21:22:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773177782; cv=none; b=VMQbV/KyP2OHdLIGGfLHYdcmE9IRM3OSW3MUKt3x3CNxll4i1CKXQY2+8uOTBpMUuzW9nKv+O9VHEbCVfEdKkJ4UYkkMWoH1wzsrCGJ+tIhAP+KnSXmIfov93sJyAIYcfa9QLl/y11KNQd3YtobD3oUtW7NMaZf7pEiszzL5ICM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773177782; c=relaxed/simple; bh=1cSenaADeYpz69y+fz8kGgIfSyE1YZ/fkoMWAV5wOF8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=cC4mfie2BegShsZFx+sb256e3kZ9weySeSi+iWB3xIZhQPhviMxgV6oYR8/e3/MbBnpjkp7Vxg1hRfdlviS30mgbPGRmLSGt83w2eurm1oPYAeRQISKdbKwHq2eYCfCMXLa1Gm5VmqTa4pJu0qCxd+GiS671Yn28Yb+W+pUjLI8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to; spf=none smtp.mailfrom=dama.to; dkim=pass (2048-bit key) header.d=dama-to.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b=0zp2CYzS; arc=none smtp.client-ip=209.85.214.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=dama.to Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=dama-to.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b="0zp2CYzS" Received: by mail-pl1-f174.google.com with SMTP id d9443c01a7336-2ae3a2f6007so77570015ad.2 for ; Tue, 10 Mar 2026 14:22:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1773177775; x=1773782575; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ISfec1K3jJo2AiWUBgbx3JM6HbVDacr1Hr+xolgCOdc=; b=0zp2CYzS2lwnfkEZrNLLH6la9soJi22sQXk/kpy9H3/1w7ODf6CR30ZjC0g73X5/gs NqSKNHUomU5qcSniqcnrBCviuqT1LhYsfIoZ4P5jQ82rXqy+QlBIqAGFIuZ/8Wh1/Gv0 +OerGvjQ6HrPRe9tafWar4NGeY1HpTkTGH0/901nCAeOf9MNmxve0kOlgkL0J/SxDvq8 m55FasPP8g5ExZH8xh26nq5ik0eXDCbMv/CjMt/LJ84T2XNQucZ4rtEHji6sDeiRk7hA oqnKfaBDFed+cP5XWpfVK8/QhY8giqL4DuGxjQg8hDaxnLsJE9fUX91ozKsW2qEADCdF vQFg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1773177775; x=1773782575; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=ISfec1K3jJo2AiWUBgbx3JM6HbVDacr1Hr+xolgCOdc=; b=SYHSq9jsb41f7ees+7/6Roopw8l7s0rIkbZ7Lj5BzpNEsMmiyKBwPKNM5i2lxqM61D 1L+kmj7KevLgXiroF+3BCymYcifXoJsztArAAqUlZzHAyffbtDh313wHnIzSgpAyIUWd u4E09bWnq3O4Q0/Mw0OfGsNkg0te3Ygf9lM51O5Hcgs96ZrhjKxjFdMqVjKlSyVzHJEj AlXUXD2+EgTdK3In2i+hxJnI80acKho++frnOyUrMCM39rMoO+yXotPAUcoWhkpc+sCb 9LD8Fwg+q+FYPiYtw/NoUUjqdXpMnTtpW7i0JsAA19fsra18Liy5ps8rZep+Z4jhctlI 5Ytw== X-Gm-Message-State: AOJu0YzVBBvwoh/2WAkWgkQOX13qraDmCOWg1SQq3LDFSL6LWi45e6Ar VamkjUrgtTDHOROcXV8s4I801MDWwV+knkLwUDI0rUI9+vCy6zpekPuUlfBiN/ingjk= X-Gm-Gg: ATEYQzxYEGpeXKnm+gPSWCMeVZ4JVNovqFiKd8sj2aILpdgI9dC1JiM0H898tWpdvky rC0j5fIMNxbe2cZ11iXWEXU5ZOZJ0cuTNionRRpC2Bak16F7CgaXrAZyotNMfzG0VxTq3Z3Yv/C FTAtLQMibbrROCuRK6v8KkRsWxiHIdtzZJ5tgxJrDkWzjej2/4Ub3RIdc9DsboZB17jbOqgQtsL vA6zdwWnIvVpLrsImHhpf8zW82PmiZQlj+BqdcJzchVZYFzWEcRfqK3IxetSn/PBMrdqAImF6kl UrDY3jIpHdKTPZPpKig5bVTc20Urb4k9qKdB4xFiabp4DgNOf2I0KorZNNUfQyiQ4fSmfYgmq2M c8PU1/bzGPkZlsKZEGayIKjPibuseQ9dXAni9kCZVGP/+ns+UZ5ngmNp099Fjdvr2GLVLMtnv+D YvF2UhYHz3PNDb3jk= X-Received: by 2002:a17:902:cec1:b0:2ae:483f:b239 with SMTP id d9443c01a7336-2aeae876363mr1855375ad.30.1773177775172; Tue, 10 Mar 2026 14:22:55 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:72::]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2aeae222ab6sm2417595ad.10.2026.03.10.14.22.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 10 Mar 2026 14:22:54 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, Michael Chan , Pavan Chebbi , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Richard Cochran , Alexei Starovoitov , Daniel Borkmann , Jesper Dangaard Brouer , John Fastabend , Stanislav Fomichev Cc: linux-kernel@vger.kernel.org, Joe Damato , bpf@vger.kernel.org Subject: [RFC net-next 07/10] net: bnxt: Add boilerplate GSO code Date: Tue, 10 Mar 2026 14:21:55 -0700 Message-ID: <20260310212209.2263939-8-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260310212209.2263939-1-joe@dama.to> References: <20260310212209.2263939-1-joe@dama.to> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add bnxt_gso.c and bnxt_gso.h with a stub bnxt_sw_udp_gso_xmit() function, SW USO constants (BNXT_SW_USO_MAX_SEGS, BNXT_SW_USO_MAX_DESCS), and the is_sw_gso field in bnxt_sw_tx_bd with BNXT_SW_GSO_MID/LAST markers. The full SW USO implementation will be added in a future commit. Suggested-by: Jakub Kicinski Signed-off-by: Joe Damato --- drivers/net/ethernet/broadcom/bnxt/Makefile | 2 +- drivers/net/ethernet/broadcom/bnxt/bnxt.h | 4 +++ drivers/net/ethernet/broadcom/bnxt/bnxt_gso.c | 30 ++++++++++++++++++ drivers/net/ethernet/broadcom/bnxt/bnxt_gso.h | 31 +++++++++++++++++++ 4 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 drivers/net/ethernet/broadcom/bnxt/bnxt_gso.c create mode 100644 drivers/net/ethernet/broadcom/bnxt/bnxt_gso.h diff --git a/drivers/net/ethernet/broadcom/bnxt/Makefile b/drivers/net/ethe= rnet/broadcom/bnxt/Makefile index ba6c239d52fa..debef78c8b6d 100644 --- a/drivers/net/ethernet/broadcom/bnxt/Makefile +++ b/drivers/net/ethernet/broadcom/bnxt/Makefile @@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0-only obj-$(CONFIG_BNXT) +=3D bnxt_en.o =20 -bnxt_en-y :=3D bnxt.o bnxt_hwrm.o bnxt_sriov.o bnxt_ethtool.o bnxt_dcb.o b= nxt_ulp.o bnxt_xdp.o bnxt_ptp.o bnxt_vfr.o bnxt_devlink.o bnxt_dim.o bnxt_c= oredump.o +bnxt_en-y :=3D bnxt.o bnxt_hwrm.o bnxt_sriov.o bnxt_ethtool.o bnxt_dcb.o b= nxt_ulp.o bnxt_xdp.o bnxt_ptp.o bnxt_vfr.o bnxt_devlink.o bnxt_dim.o bnxt_c= oredump.o bnxt_gso.o bnxt_en-$(CONFIG_BNXT_FLOWER_OFFLOAD) +=3D bnxt_tc.o bnxt_en-$(CONFIG_DEBUG_FS) +=3D bnxt_debugfs.o bnxt_en-$(CONFIG_BNXT_HWMON) +=3D bnxt_hwmon.o diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethern= et/broadcom/bnxt/bnxt.h index 41d933a4c282..99c625b954d5 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h @@ -889,6 +889,7 @@ struct bnxt_sw_tx_bd { u8 is_ts_pkt; u8 is_push; u8 action; + u8 is_sw_gso; unsigned short nr_frags; union { u16 rx_prod; @@ -896,6 +897,9 @@ struct bnxt_sw_tx_bd { }; }; =20 +#define BNXT_SW_GSO_MID 1 +#define BNXT_SW_GSO_LAST 2 + struct bnxt_sw_rx_bd { void *data; u8 *data_ptr; diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_gso.c b/drivers/net/et= hernet/broadcom/bnxt/bnxt_gso.c new file mode 100644 index 000000000000..b296769ee4fe --- /dev/null +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_gso.c @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* Broadcom NetXtreme-C/E network driver. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "bnxt.h" +#include "bnxt_gso.h" + +netdev_tx_t bnxt_sw_udp_gso_xmit(struct bnxt *bp, + struct bnxt_tx_ring_info *txr, + struct netdev_queue *txq, + struct sk_buff *skb) +{ + dev_kfree_skb_any(skb); + dev_core_stats_tx_dropped_inc(bp->dev); + return NETDEV_TX_OK; +} diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_gso.h b/drivers/net/et= hernet/broadcom/bnxt/bnxt_gso.h new file mode 100644 index 000000000000..f01e8102dcd7 --- /dev/null +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_gso.h @@ -0,0 +1,31 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Broadcom NetXtreme-C/E network driver. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation. + */ + +#ifndef BNXT_GSO_H +#define BNXT_GSO_H + +/* Maximum segments the stack may send in a single SW USO skb. + * This caps gso_max_segs for NICs without HW USO support. + */ +#define BNXT_SW_USO_MAX_SEGS 64 + +/* Worst-case TX descriptors consumed by one SW USO packet: + * Each segment: 1 long BD + 1 ext BD + payload BDs. + * Total payload BDs across all segs <=3D num_segs + nr_frags (each frag + * boundary crossing adds at most 1 extra BD). + * So: 3 * max_segs + MAX_SKB_FRAGS + 1 =3D 3 * 64 + 17 + 1 =3D 210. + */ +#define BNXT_SW_USO_MAX_DESCS (3 * BNXT_SW_USO_MAX_SEGS + MAX_SKB_FRAGS + = 1) + +netdev_tx_t bnxt_sw_udp_gso_xmit(struct bnxt *bp, + struct bnxt_tx_ring_info *txr, + struct netdev_queue *txq, + struct sk_buff *skb); + +#endif --=20 2.52.0 From nobody Wed Apr 8 03:09:22 2026 Received: from mail-pf1-f173.google.com (mail-pf1-f173.google.com [209.85.210.173]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CB81E3EB80D for ; Tue, 10 Mar 2026 21:22:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773177783; cv=none; b=qeqp/PTMve7J39zcviqbeX75MSeU50KQurnXaXmwsZgwWVxQsYuyxUk4gSm+DO3RzXzUfJsLl7tclpECzkBon1Djk05b34XR+p/wmalzMu6Jai0FQ7f4voK6r01iaYXBKkBlk+J1dQM04aNCmUAawveSQYz13wMw+PAGFvspzlM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773177783; c=relaxed/simple; bh=BaUtoEWMQpk5ovKqSSc1aGuA065Nrd2hnKz65PUI5t4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=XEMur5d4xt6hTO61JGmn3D/Sax9ACsn3AqQweWzzPx/0cY9+7X5LhRyeXpqXNxklCdr9L/hMcQ/XY1Q5nyt/keEWWrtp50LoWYgl/CVgmCv4LApH+xg04S5CnLQIHOA9VYoVLhaIqOsU/iXnP20htDQaQpckdYwoq0bcXq4nLro= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to; spf=none smtp.mailfrom=dama.to; dkim=pass (2048-bit key) header.d=dama-to.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b=Wk0QDSrD; arc=none smtp.client-ip=209.85.210.173 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=dama.to Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=dama-to.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b="Wk0QDSrD" Received: by mail-pf1-f173.google.com with SMTP id d2e1a72fcca58-82989744ee0so5026998b3a.2 for ; Tue, 10 Mar 2026 14:22:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1773177777; x=1773782577; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=FVckl09vUBwvyljY3VB64ywIjSrbX81UmflTIAeRTvw=; b=Wk0QDSrDV3z4V5XGC5cMc1BoMgAAuStbRkziAyjrU1GwKKjexjAh4kfDuY7GlplNTk r6XPbVc8P7Uv8thgqtefF1AWEU8nzfZ+o9vk0B+5uRVgk0dllni5o/dQZ4Lias1PpsmJ NPsTJhECdoc9k9hbIRi9O9YqZDOpKbDG7yWiNHAB0UuFdp+qHo2DDbZXBLGX5iiobaxS +4OHjVJW4ctVmHvcWCpxjeDJ88WhtT2QmAg+YahD9cf4exbiFZuNu8g8e85qhiC/bOJF YAlUf4fP2L7X1/ttFV1IjvxMp61n/Y+lSlWKUg/uVhtPNhb+Z87ejEnYSeplkmeGIkJU K4mw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1773177777; x=1773782577; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=FVckl09vUBwvyljY3VB64ywIjSrbX81UmflTIAeRTvw=; b=wU55iAQ4+vTT3KbC1/oq4q01Uak/WEPTZMGroARdf5J4HDEpmti6w8fdzMjvxXXrQ6 Pew2uYwxGQO6O3jG1sD+zFRcp3kmWR1YyP9JbdI8OAdAjXf/UAAxng7w8hyhjbn7GpKO 0DUTKX+OmAJT4MEp1CeQA3HpIIkqBQDlHnfGQmhehbEq50Q3NckKH2TlAJAh4E71p7MK 4W5zpjHaQUw/HoeF8pNJxO9G5S7ySt7RLninmfpUV8PvubUY4KCB/2+1aEt050o/0MfD sGSCxLl62h8nSmBdKV/FT1ruhVstUkmTZkPirHMyThg6BkuDnP44JliT7t3Dw0Kuq4Nm 84Ag== X-Gm-Message-State: AOJu0YwEaRSj04zt+peWr7W6a75vmURYHQFkYiMlCzcqFqs0GhR4aD8+ Iz7S7/LF5JDDXJdTMFKa7jIhNBoooP8eZk4fu3R7NJZIWKdKuT6avXRIu/yIkPzvLDA= X-Gm-Gg: ATEYQzzcfefP1OnLRjK1ivGswdp1/vll2HBGGoJ+zCozdCeBDzI8WyGNC93GvkNbHNj iwQXOvbgty9l2SR6SzAq+yUPAgBUQb9ZT1tUrTjPLGiEu2a8qGKOEa9nD1q5Eh5UYyHsAIvoRA0 ykbFKEbTksRZ0UuaoC1bpuCZcGLXdwW2t5Lgp0i+uQ4fLkwzmNvD669iCPOY8452WtDCSmgxKmL NnESuGURuTBYYOxj/+owrcrwsKUIIjMGDYl/dUrRKG8he+1XsTxtretH1R4J7+HD8cn8IbXlpWF Ah0speMPGo6UbypnxMPODhfT2R/f3VfHrow7S9u8pzTKis6sTjaIBh3V0XhhRhn0K8aLH9EeL8Y NGygqZ2kTwtPPn3R71NvTT1ryvGEmGQSz5DujzAQuTTwss1NaFWCiKfBsFBYD/ZMPDJ7UWadHXO DVfJsT X-Received: by 2002:a05:6a00:4298:b0:824:4a22:ec16 with SMTP id d2e1a72fcca58-829f708a071mr296499b3a.34.1773177776857; Tue, 10 Mar 2026 14:22:56 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:73::]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-829f6df3b14sm200136b3a.20.2026.03.10.14.22.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 10 Mar 2026 14:22:56 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, Michael Chan , Pavan Chebbi , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: linux-kernel@vger.kernel.org, Joe Damato Subject: [RFC net-next 08/10] net: bnxt: Implement software USO Date: Tue, 10 Mar 2026 14:21:56 -0700 Message-ID: <20260310212209.2263939-9-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260310212209.2263939-1-joe@dama.to> References: <20260310212209.2263939-1-joe@dama.to> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Implement bnxt_sw_udp_gso_xmit() using the core tso_dma_map API and the pre-allocated TX inline buffer for per-segment headers. The xmit path: 1. Calls tso_start() to initialize TSO state 2. Stack-allocates a tso_dma_map and calls tso_dma_map_init() to DMA-map the linear payload and all frags upfront. 3. For each segment: - Copies and patches headers via tso_build_hdr() into the pre-allocated tx_inline_buf (DMA-synced per segment) - Counts payload BDs via tso_dma_map_count() - Emits long BD (header) + ext BD + payload BDs - Payload BDs use tso_dma_map_next() which yields (dma_addr, chunk_len, mapping_len) tuples; mapping_len is set as dma_unmap_len on the first BD of each DMA mapping so the completion path can unmap per-BD Header BDs set dma_unmap_len=3D0 since the inline buffer is pre-allocated and unmapped only at ring teardown. Suggested-by: Jakub Kicinski Signed-off-by: Joe Damato --- drivers/net/ethernet/broadcom/bnxt/bnxt_gso.c | 158 ++++++++++++++++++ 1 file changed, 158 insertions(+) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_gso.c b/drivers/net/et= hernet/broadcom/bnxt/bnxt_gso.c index b296769ee4fe..fe1f791681e1 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_gso.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_gso.c @@ -19,11 +19,169 @@ #include "bnxt.h" #include "bnxt_gso.h" =20 +static u32 bnxt_sw_gso_lhint(unsigned int len) +{ + if (len <=3D 512) + return TX_BD_FLAGS_LHINT_512_AND_SMALLER; + else if (len <=3D 1023) + return TX_BD_FLAGS_LHINT_512_TO_1023; + else if (len <=3D 2047) + return TX_BD_FLAGS_LHINT_1024_TO_2047; + else + return TX_BD_FLAGS_LHINT_2048_AND_LARGER; +} + netdev_tx_t bnxt_sw_udp_gso_xmit(struct bnxt *bp, struct bnxt_tx_ring_info *txr, struct netdev_queue *txq, struct sk_buff *skb) { + unsigned int hdr_len, mss, num_segs; + struct pci_dev *pdev =3D bp->pdev; + unsigned int total_payload; + struct tso_dma_map map; + u32 vlan_tag_flags =3D 0; + int i, bds_needed; + struct tso_t tso; + u16 cfa_action; + u16 prod; + + hdr_len =3D tso_start(skb, &tso); + mss =3D skb_shinfo(skb)->gso_size; + total_payload =3D skb->len - hdr_len; + num_segs =3D DIV_ROUND_UP(total_payload, mss); + + /* Zero the csum fields so tso_build_hdr will propagate zeroes into + * every segment header. HW csum offload will recompute from scratch. + */ + udp_hdr(skb)->check =3D 0; + if (!tso.ipv6) + ip_hdr(skb)->check =3D 0; + + if (unlikely(num_segs <=3D 1)) + return NETDEV_TX_OK; + + /* Upper bound on the number of descriptors needed. + * + * Each segment uses 1 long BD + 1 ext BD + payload BDs, which is + * at most num_segs + nr_frags (each frag boundary crossing adds at + * most 1 extra BD). + */ + bds_needed =3D 3 * num_segs + skb_shinfo(skb)->nr_frags + 1; + + if (unlikely(bnxt_tx_avail(bp, txr) < bds_needed)) { + netif_txq_try_stop(txq, bnxt_tx_avail(bp, txr), + bp->tx_wake_thresh); + return NETDEV_TX_BUSY; + } + + if (unlikely(tso_dma_map_init(&map, &pdev->dev, skb, hdr_len))) + goto drop; + + cfa_action =3D bnxt_xmit_get_cfa_action(skb); + if (skb_vlan_tag_present(skb)) { + vlan_tag_flags =3D TX_BD_CFA_META_KEY_VLAN | + skb_vlan_tag_get(skb); + if (skb->vlan_proto =3D=3D htons(ETH_P_8021Q)) + vlan_tag_flags |=3D 1 << TX_BD_CFA_META_TPID_SHIFT; + } + + prod =3D txr->tx_prod; + + for (i =3D 0; i < num_segs; i++) { + unsigned int seg_payload =3D min_t(unsigned int, mss, + total_payload - i * mss); + dma_addr_t this_hdr_dma =3D txr->tx_inline_dma + i * hdr_len; + void *this_hdr =3D txr->tx_inline_buf + i * hdr_len; + struct bnxt_sw_tx_bd *tx_buf; + unsigned int mapping_len; + unsigned int chunk_len; + dma_addr_t dma_addr; + struct tx_bd *txbd; + int bd_count; + __le32 csum; + bool last; + u32 flags; + + last =3D (i =3D=3D num_segs - 1); + + tso_build_hdr(skb, this_hdr, &tso, seg_payload, last); + + dma_sync_single_for_device(&pdev->dev, this_hdr_dma, + hdr_len, DMA_TO_DEVICE); + + bd_count =3D tso_dma_map_count(&map, seg_payload); + + tx_buf =3D &txr->tx_buf_ring[RING_TX(bp, prod)]; + txbd =3D &txr->tx_desc_ring[TX_RING(bp, prod)][TX_IDX(prod)]; + + tx_buf->skb =3D skb; + tx_buf->nr_frags =3D bd_count; + tx_buf->is_push =3D 0; + tx_buf->is_ts_pkt =3D 0; + + dma_unmap_addr_set(tx_buf, mapping, this_hdr_dma); + dma_unmap_len_set(tx_buf, len, 0); + + tx_buf->is_sw_gso =3D last ? BNXT_SW_GSO_LAST : BNXT_SW_GSO_MID; + + flags =3D (hdr_len << TX_BD_LEN_SHIFT) | + TX_BD_TYPE_LONG_TX_BD | + TX_BD_CNT(2 + bd_count); + + flags |=3D bnxt_sw_gso_lhint(hdr_len + seg_payload); + + txbd->tx_bd_len_flags_type =3D cpu_to_le32(flags); + txbd->tx_bd_haddr =3D cpu_to_le64(this_hdr_dma); + txbd->tx_bd_opaque =3D SET_TX_OPAQUE(bp, txr, prod, + 2 + bd_count); + + csum =3D cpu_to_le32(TX_BD_FLAGS_TCP_UDP_CHKSUM | + TX_BD_FLAGS_IP_CKSUM); + + prod =3D NEXT_TX(prod); + bnxt_init_ext_bd(bp, txr, prod, csum, + vlan_tag_flags, cfa_action); + + while (tso_dma_map_next(&map, &dma_addr, &chunk_len, + &mapping_len, seg_payload)) { + prod =3D NEXT_TX(prod); + txbd =3D &txr->tx_desc_ring[TX_RING(bp, prod)][TX_IDX(prod)]; + tx_buf =3D &txr->tx_buf_ring[RING_TX(bp, prod)]; + + txbd->tx_bd_haddr =3D cpu_to_le64(dma_addr); + dma_unmap_addr_set(tx_buf, mapping, dma_addr); + dma_unmap_len_set(tx_buf, len, mapping_len); + tx_buf->skb =3D NULL; + tx_buf->is_sw_gso =3D 0; + + flags =3D chunk_len << TX_BD_LEN_SHIFT; + txbd->tx_bd_len_flags_type =3D cpu_to_le32(flags); + txbd->tx_bd_opaque =3D 0; + + seg_payload -=3D chunk_len; + } + + txbd->tx_bd_len_flags_type |=3D + cpu_to_le32(TX_BD_FLAGS_PACKET_END); + + prod =3D NEXT_TX(prod); + } + + netdev_tx_sent_queue(txq, skb->len); + + WRITE_ONCE(txr->tx_prod, prod); + /* Sync BDs before doorbell */ + wmb(); + bnxt_db_write(bp, &txr->tx_db, prod); + + if (unlikely(bnxt_tx_avail(bp, txr) <=3D bp->tx_wake_thresh)) + netif_txq_try_stop(txq, bnxt_tx_avail(bp, txr), + bp->tx_wake_thresh); + + return NETDEV_TX_OK; + +drop: dev_kfree_skb_any(skb); dev_core_stats_tx_dropped_inc(bp->dev); return NETDEV_TX_OK; --=20 2.52.0 From nobody Wed Apr 8 03:09:22 2026 Received: from mail-pf1-f172.google.com (mail-pf1-f172.google.com [209.85.210.172]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8040C3E9F9E for ; Tue, 10 Mar 2026 21:22:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773177788; cv=none; b=SgvcZXJ7HOPQNXnrwuEOIX9kxjC7QLeUZVrgGdtCa2DXnXuK7fbKeDvWmuD1F56Uj9qUzTURC738UZVHNUCr4P1QPZqtb8N0eqErbHsxfPj7pENdNRozzWy+yaZEO6aSgTn6ph+GpiqLindXxG3eSQVzYfFU6670VWiJqPDr5ew= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773177788; c=relaxed/simple; bh=khy8AVx3doiUMrd9qJur7EVK1fQ0F9HwWkPOOL6vd9Q=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=OZLMllrNUV+EWYi6vCHsoWm0YKGat6Sk0NGLSyLZDM02ZbLmQgI2n5azy3+Q/jgwG4ueHcO5WOdgoy4/wi43H3UBU5lVoWZnLrJ/jqMf+CA0Wwq/g25a2jpuV0x3q8ZlJD1Vto1dJYH5EE1XYTRfQLuNozaMdYk/T3VNv3jYf1Q= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to; spf=none smtp.mailfrom=dama.to; dkim=pass (2048-bit key) header.d=dama-to.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b=KMPOSGOK; arc=none smtp.client-ip=209.85.210.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=dama.to Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=dama-to.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b="KMPOSGOK" Received: by mail-pf1-f172.google.com with SMTP id d2e1a72fcca58-8299c75f730so175384b3a.0 for ; Tue, 10 Mar 2026 14:22:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1773177778; x=1773782578; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=2067E4shQM8NlUtqVs4AWG5HTqwBiaYCbw4afwwP34A=; b=KMPOSGOKIjMuS0any7LWP5fdhK5hbbN8yfdiravbYdtLH+KecrG4pDEoFulnnzylgv i4Kq0XfEcVd8MIeU0JftPRYIKAZM+lthzcXbdXTS5704GNVOaSXIRez9MvjefnvHCeQL qjz4rAemZHrlKVap/vvLS5QjmwcNATJDGEAa2pRCz0+wjyLiunYgkYxeB7No71xq4Ie+ TdS8EpI4p8yK9AbuSsb47OdVOqd30+3VY2cggT0GWXiffxXyXBgZE4QsB6BVpnHddhgu 78yFGRdT78AtwNet+92rdkyqA9EaxSc/wsdQ/M3Z0aIibc+k8pIYVxhq4bsOe9biaqGu Mthg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1773177778; x=1773782578; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=2067E4shQM8NlUtqVs4AWG5HTqwBiaYCbw4afwwP34A=; b=j09Vhwe59ZJS3Fbe2ra6zH+sTlu97i2hw38nfbg86qHhpVImsSJ1t56Xjt+880BuY6 buvdY72Qt9s/XfA6Z/DG2YjXlQeyWdMcCKtb5VeGMxKaoPk4ujLvcKzVMjM5ao+eiu2G 9n992nZdVbJR3hNvPIhQupbrB07NbZCIbJn5e81zK0SaXO2Ex8u0s4/9Um2ggiv8vile Op3NcmhyR1pEfir1jIdnTwu9fSn3HunW+4INRcVJdu8OqEbr091/BLorsApusR//lPiy Hnre3MPAAF1sgoCNHVirV4mhOPTFwyGhjQOliGaDyTcaMIWuH2C290ZloTHw0RMvxSh5 SfVg== X-Gm-Message-State: AOJu0Yx/en4V43s52VnzbMuc9b6XCAKWPWmJjlzAU11uvGDxNP7zNq9p C3YoNWDCc4nXCGduKzW6nzmaX5/wG1xSg3R8I1O1JTgzYfjBbaUwvNyFmVutlyL8GvM= X-Gm-Gg: ATEYQzz/WGnO31quFyvLVjDfLy3YSfifAdrVQwqVApP35u2675hBPktNrDHfGBCYDvr 0rVz7qZPf8dcYdlKQsiarzq9jdrStW0Tv2SWx0TZqvAbpdrSwkppta8gTLpFU9t8IsjELC9yvni Ln4HKiiMZ/eInIMBtXxq0RnQDOz8MtHdOUVaCxHUsTHJ4GkOyyVXGVFfEX4ix0r5kEsZJoi8qXr hEZhJ38neF5sf7BS11RBYJT0b2jTHDfBzhpvIdfLBTNHgHjokxPelmfN3Y4I9MKHEeNlz0NySjF S5tOh5HyJdGwQ4YTQHZQoW8kOEimfEYTdBiLmoZ2Hj0+YpW5rafr1r03WwdvssSIHHsOJc1cSSI wXWmbCkX9ckYjBYjo6mpwnOsLH5IMEnXhBmFyjucu2EXBxvWnHzsVgXdbGIU6dqm1GEZdft75Gm H7nERJ X-Received: by 2002:a05:6a00:1826:b0:818:1e8c:a513 with SMTP id d2e1a72fcca58-829f7ab62c1mr127271b3a.17.1773177778635; Tue, 10 Mar 2026 14:22:58 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:74::]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-829f703a7casm184936b3a.59.2026.03.10.14.22.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 10 Mar 2026 14:22:58 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, Michael Chan , Pavan Chebbi , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: linux-kernel@vger.kernel.org, Joe Damato Subject: [RFC net-next 09/10] net: bnxt: Add SW GSO completion and teardown support Date: Tue, 10 Mar 2026 14:21:57 -0700 Message-ID: <20260310212209.2263939-10-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260310212209.2263939-1-joe@dama.to> References: <20260310212209.2263939-1-joe@dama.to> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Update __bnxt_tx_int and bnxt_free_one_tx_ring_skbs to handle SW GSO segments: - MID segments: adjust tx_pkts/tx_bytes accounting and skip skb free (the skb is shared across all segments and freed only once) - LAST segments: no special cleanup needed -- payload DMA unmapping is handled by the existing per-BD dma_unmap_len walk, and the header inline buffer is pre-allocated per-ring (freed at ring teardown) sw_gso is initialized to zero, so the new code paths are not run. Suggested-by: Jakub Kicinski Signed-off-by: Joe Damato --- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 63 ++++++++++++++++--- .../net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 19 +++++- 2 files changed, 72 insertions(+), 10 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethern= et/broadcom/bnxt/bnxt.c index 906e842d9c53..47dc98479066 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -74,6 +74,8 @@ #include "bnxt_debugfs.h" #include "bnxt_coredump.h" #include "bnxt_hwmon.h" +#include "bnxt_gso.h" +#include =20 #define BNXT_TX_TIMEOUT (5 * HZ) #define BNXT_DEF_MSG_ENABLE (NETIF_MSG_DRV | NETIF_MSG_HW | \ @@ -818,12 +820,13 @@ static bool __bnxt_tx_int(struct bnxt *bp, struct bnx= t_tx_ring_info *txr, bool rc =3D false; =20 while (RING_TX(bp, cons) !=3D hw_cons) { - struct bnxt_sw_tx_bd *tx_buf; + struct bnxt_sw_tx_bd *tx_buf, *head_buf; struct sk_buff *skb; bool is_ts_pkt; int j, last; =20 tx_buf =3D &txr->tx_buf_ring[RING_TX(bp, cons)]; + head_buf =3D tx_buf; skb =3D tx_buf->skb; =20 if (unlikely(!skb)) { @@ -870,6 +873,14 @@ static bool __bnxt_tx_int(struct bnxt *bp, struct bnxt= _tx_ring_info *txr, DMA_TO_DEVICE, 0); } } + if (unlikely(head_buf->is_sw_gso)) { + if (head_buf->is_sw_gso =3D=3D BNXT_SW_GSO_MID) { + tx_pkts--; + tx_bytes -=3D skb->len; + skb =3D NULL; + } + head_buf->is_sw_gso =3D 0; + } if (unlikely(is_ts_pkt)) { if (BNXT_CHIP_P5(bp)) { /* PTP worker takes ownership of the skb */ @@ -3417,6 +3428,7 @@ static void bnxt_free_one_tx_ring_skbs(struct bnxt *b= p, =20 for (i =3D 0; i < max_idx;) { struct bnxt_sw_tx_bd *tx_buf =3D &txr->tx_buf_ring[i]; + struct bnxt_sw_tx_bd *head_buf =3D tx_buf; struct sk_buff *skb; int j, last; =20 @@ -3467,7 +3479,10 @@ static void bnxt_free_one_tx_ring_skbs(struct bnxt *= bp, len), DMA_TO_DEVICE, 0); } - dev_kfree_skb(skb); + if (head_buf->is_sw_gso =3D=3D BNXT_SW_GSO_MID) + skb =3D NULL; + if (skb) + dev_kfree_skb(skb); } netdev_tx_reset_queue(netdev_get_tx_queue(bp->dev, idx)); } @@ -3975,9 +3990,9 @@ static void bnxt_free_tx_inline_buf(struct bnxt_tx_ri= ng_info *txr, txr->tx_inline_size =3D 0; } =20 -static int __maybe_unused bnxt_alloc_tx_inline_buf(struct bnxt_tx_ring_inf= o *txr, - struct pci_dev *pdev, - unsigned int size) +static int bnxt_alloc_tx_inline_buf(struct bnxt_tx_ring_info *txr, + struct pci_dev *pdev, + unsigned int size) { txr->tx_inline_buf =3D kmalloc(size, GFP_KERNEL); if (!txr->tx_inline_buf) @@ -4080,6 +4095,14 @@ static int bnxt_alloc_tx_rings(struct bnxt *bp) sizeof(struct tx_push_bd); txr->data_mapping =3D cpu_to_le64(mapping); } + if (!(bp->flags & BNXT_FLAG_UDP_GSO_CAP) && + (bp->dev->features & NETIF_F_GSO_UDP_L4)) { + rc =3D bnxt_alloc_tx_inline_buf(txr, pdev, + BNXT_SW_USO_MAX_SEGS * + TSO_HEADER_SIZE); + if (rc) + return rc; + } qidx =3D bp->tc_to_qidx[j]; ring->queue_id =3D bp->q_info[qidx].queue_id; spin_lock_init(&txr->xdp_tx_lock); @@ -4611,6 +4634,10 @@ static int bnxt_init_tx_rings(struct bnxt *bp) =20 bp->tx_wake_thresh =3D max_t(int, bp->tx_ring_size / 2, BNXT_MIN_TX_DESC_CNT); + if (!(bp->flags & BNXT_FLAG_UDP_GSO_CAP) && + (bp->dev->features & NETIF_F_GSO_UDP_L4)) + bp->tx_wake_thresh =3D max_t(int, bp->tx_wake_thresh, + BNXT_SW_USO_MAX_DESCS); =20 for (i =3D 0; i < bp->tx_nr_rings; i++) { struct bnxt_tx_ring_info *txr =3D &bp->tx_ring[i]; @@ -13778,6 +13805,11 @@ static netdev_features_t bnxt_fix_features(struct = net_device *dev, if ((features & NETIF_F_NTUPLE) && !bnxt_rfs_capable(bp, false)) features &=3D ~NETIF_F_NTUPLE; =20 + if ((features & NETIF_F_GSO_UDP_L4) && + !(bp->flags & BNXT_FLAG_UDP_GSO_CAP) && + bp->tx_ring_size < 2 * BNXT_SW_USO_MAX_DESCS) + features &=3D ~NETIF_F_GSO_UDP_L4; + if ((bp->flags & BNXT_FLAG_NO_AGG_RINGS) || bp->xdp_prog) features &=3D ~(NETIF_F_LRO | NETIF_F_GRO_HW); =20 @@ -13823,6 +13855,15 @@ static int bnxt_set_features(struct net_device *de= v, netdev_features_t features) int rc =3D 0; bool re_init =3D false; =20 + if (!(bp->flags & BNXT_FLAG_UDP_GSO_CAP)) { + if (features & NETIF_F_GSO_UDP_L4) + bp->tx_wake_thresh =3D max_t(int, bp->tx_wake_thresh, + BNXT_SW_USO_MAX_DESCS); + else + bp->tx_wake_thresh =3D max_t(int, bp->tx_ring_size / 2, + BNXT_MIN_TX_DESC_CNT); + } + flags &=3D ~BNXT_FLAG_ALL_CONFIG_FEATS; if (features & NETIF_F_GRO_HW) flags |=3D BNXT_FLAG_GRO; @@ -16803,8 +16844,7 @@ static int bnxt_init_one(struct pci_dev *pdev, cons= t struct pci_device_id *ent) NETIF_F_GSO_UDP_TUNNEL_CSUM | NETIF_F_GSO_GRE_CSUM | NETIF_F_GSO_PARTIAL | NETIF_F_RXHASH | NETIF_F_RXCSUM | NETIF_F_GRO; - if (bp->flags & BNXT_FLAG_UDP_GSO_CAP) - dev->hw_features |=3D NETIF_F_GSO_UDP_L4; + dev->hw_features |=3D NETIF_F_GSO_UDP_L4; =20 if (BNXT_SUPPORTS_TPA(bp)) dev->hw_features |=3D NETIF_F_LRO; @@ -16837,8 +16877,15 @@ static int bnxt_init_one(struct pci_dev *pdev, con= st struct pci_device_id *ent) dev->priv_flags |=3D IFF_UNICAST_FLT; =20 netif_set_tso_max_size(dev, GSO_MAX_SIZE); - if (bp->tso_max_segs) + if (!(bp->flags & BNXT_FLAG_UDP_GSO_CAP)) { + u16 max_segs =3D BNXT_SW_USO_MAX_SEGS; + + if (bp->tso_max_segs) + max_segs =3D min_t(u16, max_segs, bp->tso_max_segs); + netif_set_tso_max_segs(dev, max_segs); + } else if (bp->tso_max_segs) { netif_set_tso_max_segs(dev, bp->tso_max_segs); + } =20 dev->xdp_features =3D NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT | NETDEV_XDP_ACT_RX_SG; diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c b/drivers/ne= t/ethernet/broadcom/bnxt/bnxt_ethtool.c index 3ce092bc8bba..50a4736f512a 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c @@ -33,6 +33,7 @@ #include "bnxt_xdp.h" #include "bnxt_ptp.h" #include "bnxt_ethtool.h" +#include "bnxt_gso.h" #include "bnxt_nvm_defs.h" /* NVRAM content constant and structure defs */ #include "bnxt_fw_hdr.h" /* Firmware hdr constant and structure defs */ #include "bnxt_coredump.h" @@ -846,12 +847,18 @@ static int bnxt_set_ringparam(struct net_device *dev, u8 tcp_data_split =3D kernel_ering->tcp_data_split; struct bnxt *bp =3D netdev_priv(dev); u8 hds_config_mod; + int rc; =20 if ((ering->rx_pending > BNXT_MAX_RX_DESC_CNT) || (ering->tx_pending > BNXT_MAX_TX_DESC_CNT) || (ering->tx_pending < BNXT_MIN_TX_DESC_CNT)) return -EINVAL; =20 + if ((dev->features & NETIF_F_GSO_UDP_L4) && + !(bp->flags & BNXT_FLAG_UDP_GSO_CAP) && + ering->tx_pending < 2 * BNXT_SW_USO_MAX_DESCS) + return -EINVAL; + hds_config_mod =3D tcp_data_split !=3D dev->cfg->hds_config; if (tcp_data_split =3D=3D ETHTOOL_TCP_DATA_SPLIT_DISABLED && hds_config_m= od) return -EINVAL; @@ -876,9 +883,17 @@ static int bnxt_set_ringparam(struct net_device *dev, bp->tx_ring_size =3D ering->tx_pending; bnxt_set_ring_params(bp); =20 - if (netif_running(dev)) - return bnxt_open_nic(bp, false, false); + if (netif_running(dev)) { + rc =3D bnxt_open_nic(bp, false, false); + if (rc) + return rc; + } =20 + /* ring size changes may affect features (SW USO requires a minimum + * ring size), so recalculate features to ensure the correct features + * are blocked/available. + */ + netdev_update_features(dev); return 0; } =20 --=20 2.52.0 From nobody Wed Apr 8 03:09:22 2026 Received: from mail-pf1-f178.google.com (mail-pf1-f178.google.com [209.85.210.178]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0A4973EC2DA for ; Tue, 10 Mar 2026 21:23:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773177787; cv=none; b=sXusqGHI4Fh7QMp4fubZERd1kphQwWpmX7E3q30LUEH3l8diYUZ0JimQgau9+Mhu0ChAVETaTrxgd3Z9St3i/+md6LlQlpirTEtYJOA52UO3zfVN/vzeO38pn9WrsnMq1rsx6jgotJBAUHZa95Bkz+eHL8sU0Jni3y18bHTOhsg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773177787; c=relaxed/simple; bh=4pl2X834Ki+65pFAak8gvu/02cfVhH7h28ap53FwqVw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ORowAWpyrfZPXPsnNmMlR9Vh13rPHmd1qWRDRyBXyI0n/ScWde1THHj6MldhpZF17cWIIx8QTn6Pvmo0HcBzkHdf/I3mG61o2P+RUA1DSL0Ws3BZwk3NzfI65gp4qcE0dmLdJfM28uZT0wggZEPiHqjvBoj488Qe20l/9wUZq2w= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to; spf=none smtp.mailfrom=dama.to; dkim=pass (2048-bit key) header.d=dama-to.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b=1G1Sma4f; arc=none smtp.client-ip=209.85.210.178 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=dama.to Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=dama-to.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b="1G1Sma4f" Received: by mail-pf1-f178.google.com with SMTP id d2e1a72fcca58-824c9da9928so7469372b3a.3 for ; Tue, 10 Mar 2026 14:23:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1773177780; x=1773782580; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ABX/dNXYvjh7NZFYOV2OPz3Z8fQKAQKA9c431nqYi7A=; b=1G1Sma4fBugbOU7gtRT1OwIb1ji303o7ELRpHy3UVZugKGEfOnOh5Aq89CawZNpQMw diQWKa2L9nirnbCO0POM9z3WB/+Z6hjn6oA0m+Ns0sYucSURMZ7W/cly7rdUXRWmKl50 QqZTeOw1lN5/hQIzAsx6xNLcjITra+a9S+SPSE74rK6DQ7BN55EoZiaOBpZc+KU1mjGP Nz438uavmlSJhNPe+yoUpA+HWlKM0S7X5rBG5g4vOuBSu4H07lOEsMIUSsF3T4U1QHsi Lnm2IFYoi/mDyfpQ1rOvsNSRDNZql+Ek9jlmRDzWX2eSz9KpAo+BYbc8oFdvmSWQjLvl 1TlQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1773177780; x=1773782580; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=ABX/dNXYvjh7NZFYOV2OPz3Z8fQKAQKA9c431nqYi7A=; b=U+8xKK/AMNJmHb06rS1JR6+4DevdaCbEc9u0SW0MHUwCcK8ssuvdmKkYRY7rbdZhey mD1LbIlgP24Q0q3bfSVjncjBIIJGabr6yiv2zLAFg8TxEbHOIv0t2HtkfyOkUHovyZ4e LPPFi0QkgYsJgP5uUjogf0fWeCuITMCfr8j59Uc3klsMmjSQPFYbhM6M+VfIuiC7zdud kXWWqIZcWHZhKQczwD0HoSbvTABYQlCYIUCBQEFaBZbj1HSGm/8MHJxXq1QAXRPa1UUz X94qj247995X6bTyH65iJvexvxgMUeXgFJ0ImLmkNtzOzXQvanQbn/LQV0u/V0CGCWpS lCdw== X-Gm-Message-State: AOJu0YyC4et6GlzJxFm/bbLBhU5zfFlPa2SMhFWTHkwmdpl3R7qoFqvN dADanFzZpjW6KWOrTf9MwL8Mi0dSH1XT/zrkG1bq1SVtK14/FEdBYxg/qyEmbHsB4vc= X-Gm-Gg: ATEYQzwGpEkeG89QD0lM4zzKnxwzFqWmlbxe/USuWN8EJY9+mj50nWICF8Hl/bFeXHg +31YqIxInw2iPSCgpMs3tx7Uvk3MI+hISCMOVUBXErvzGLE22cqiV2zfy4KaIgg3lTu4HQsjpRv f9AbXmj424Gw1PvBkPNLBk48Sa6LmK6J3cHU99iz7Ma/tZkcvXXrbZ6/XIa1us4ikHGWSRziZ5I 9/ELDJ9IGZ8H6Oct7gkoTbv0jI+dVhyx3G+Bf2w/rXb/WBTQ27vKSb6R6s1m/iIi1zkjHTeIgZ+ p24Int+FpbP5IwBRdnGAzi1olnqGE7xgQRKDhTAX5WoQV65FHGbgPFAloHvjsgQUnKOf26vsfHE GXO+ABFDxEbVB6EpZIpd2eTxdKJt/rJeuLi7+9WVeTlimjn4MMm5x0tXeyfdJGRq+1PWUdhSijZ hWRcJm X-Received: by 2002:a05:6a20:748f:b0:398:6ea8:21d2 with SMTP id adf61e73a8af0-398c5f3e353mr65122637.19.1773177780185; Tue, 10 Mar 2026 14:23:00 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:72::]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-c73cdf9f4e8sm123145a12.24.2026.03.10.14.22.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 10 Mar 2026 14:22:59 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, Michael Chan , Pavan Chebbi , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: linux-kernel@vger.kernel.org, Joe Damato Subject: [RFC net-next 10/10] net: bnxt: Dispatch to SW USO Date: Tue, 10 Mar 2026 14:21:58 -0700 Message-ID: <20260310212209.2263939-11-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260310212209.2263939-1-joe@dama.to> References: <20260310212209.2263939-1-joe@dama.to> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Wire in the SW USO path added in preceding commits when hardware USO is not possible. When a GSO skb with SKB_GSO_UDP_L4 arrives and the NIC lacks HW USO capability, redirect to bnxt_sw_udp_gso_xmit() which handles software segmentation into individual UDP frames submitted directly to the TX ring. Suggested-by: Jakub Kicinski Signed-off-by: Joe Damato --- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethern= et/broadcom/bnxt/bnxt.c index 47dc98479066..72d66043096a 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -506,6 +506,11 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb= , struct net_device *dev) } } #endif + if (skb_is_gso(skb) && + (skb_shinfo(skb)->gso_type & SKB_GSO_UDP_L4) && + !(bp->flags & BNXT_FLAG_UDP_GSO_CAP)) + return bnxt_sw_udp_gso_xmit(bp, txr, txq, skb); + free_size =3D bnxt_tx_avail(bp, txr); if (unlikely(free_size < skb_shinfo(skb)->nr_frags + 2)) { /* We must have raced with NAPI cleanup */ --=20 2.52.0