aboutsummaryrefslogtreecommitdiffstats
path: root/queue-6.12/ethernet-ionic-fix-dma-mapping-tests.patch
diff options
Diffstat (limited to 'queue-6.12/ethernet-ionic-fix-dma-mapping-tests.patch')
-rw-r--r--queue-6.12/ethernet-ionic-fix-dma-mapping-tests.patch89
1 files changed, 89 insertions, 0 deletions
diff --git a/queue-6.12/ethernet-ionic-fix-dma-mapping-tests.patch b/queue-6.12/ethernet-ionic-fix-dma-mapping-tests.patch
new file mode 100644
index 0000000000..2503c376be
--- /dev/null
+++ b/queue-6.12/ethernet-ionic-fix-dma-mapping-tests.patch
@@ -0,0 +1,89 @@
+From 2c0b1d200adb3b455d79afb2d5fa2022a985cb18 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 19 Jun 2025 11:45:30 +0200
+Subject: ethernet: ionic: Fix DMA mapping tests
+
+From: Thomas Fourier <fourier.thomas@gmail.com>
+
+[ Upstream commit d5e3241c5a386a2425823c8c7afb77a465bd040f ]
+
+Change error values of `ionic_tx_map_single()` and `ionic_tx_map_frag()`
+from 0 to `DMA_MAPPING_ERROR` to prevent collision with 0 as a valid
+address.
+
+This also fixes the use of `dma_mapping_error()` to test against 0 in
+`ionic_xdp_post_frame()`
+
+Fixes: 0f3154e6bcb3 ("ionic: Add Tx and Rx handling")
+Fixes: 56e41ee12d2d ("ionic: better dma-map error handling")
+Fixes: ac8813c0ab7d ("ionic: convert Rx queue buffers to use page_pool")
+Signed-off-by: Thomas Fourier <fourier.thomas@gmail.com>
+Reviewed-by: Brett Creeley <brett.creeley@amd.com>
+Link: https://patch.msgid.link/20250619094538.283723-2-fourier.thomas@gmail.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/pensando/ionic/ionic_txrx.c | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+diff --git a/drivers/net/ethernet/pensando/ionic/ionic_txrx.c b/drivers/net/ethernet/pensando/ionic/ionic_txrx.c
+index 0eeda7e502db2..0f5758c273c22 100644
+--- a/drivers/net/ethernet/pensando/ionic/ionic_txrx.c
++++ b/drivers/net/ethernet/pensando/ionic/ionic_txrx.c
+@@ -321,7 +321,7 @@ static int ionic_xdp_post_frame(struct ionic_queue *q, struct xdp_frame *frame,
+ len, DMA_TO_DEVICE);
+ } else /* XDP_REDIRECT */ {
+ dma_addr = ionic_tx_map_single(q, frame->data, len);
+- if (!dma_addr)
++ if (dma_addr == DMA_MAPPING_ERROR)
+ return -EIO;
+ }
+
+@@ -357,7 +357,7 @@ static int ionic_xdp_post_frame(struct ionic_queue *q, struct xdp_frame *frame,
+ } else {
+ dma_addr = ionic_tx_map_frag(q, frag, 0,
+ skb_frag_size(frag));
+- if (dma_mapping_error(q->dev, dma_addr)) {
++ if (dma_addr == DMA_MAPPING_ERROR) {
+ ionic_tx_desc_unmap_bufs(q, desc_info);
+ return -EIO;
+ }
+@@ -1083,7 +1083,7 @@ static dma_addr_t ionic_tx_map_single(struct ionic_queue *q,
+ net_warn_ratelimited("%s: DMA single map failed on %s!\n",
+ dev_name(dev), q->name);
+ q_to_tx_stats(q)->dma_map_err++;
+- return 0;
++ return DMA_MAPPING_ERROR;
+ }
+ return dma_addr;
+ }
+@@ -1100,7 +1100,7 @@ static dma_addr_t ionic_tx_map_frag(struct ionic_queue *q,
+ net_warn_ratelimited("%s: DMA frag map failed on %s!\n",
+ dev_name(dev), q->name);
+ q_to_tx_stats(q)->dma_map_err++;
+- return 0;
++ return DMA_MAPPING_ERROR;
+ }
+ return dma_addr;
+ }
+@@ -1116,7 +1116,7 @@ static int ionic_tx_map_skb(struct ionic_queue *q, struct sk_buff *skb,
+ int frag_idx;
+
+ dma_addr = ionic_tx_map_single(q, skb->data, skb_headlen(skb));
+- if (!dma_addr)
++ if (dma_addr == DMA_MAPPING_ERROR)
+ return -EIO;
+ buf_info->dma_addr = dma_addr;
+ buf_info->len = skb_headlen(skb);
+@@ -1126,7 +1126,7 @@ static int ionic_tx_map_skb(struct ionic_queue *q, struct sk_buff *skb,
+ nfrags = skb_shinfo(skb)->nr_frags;
+ for (frag_idx = 0; frag_idx < nfrags; frag_idx++, frag++) {
+ dma_addr = ionic_tx_map_frag(q, frag, 0, skb_frag_size(frag));
+- if (!dma_addr)
++ if (dma_addr == DMA_MAPPING_ERROR)
+ goto dma_fail;
+ buf_info->dma_addr = dma_addr;
+ buf_info->len = skb_frag_size(frag);
+--
+2.39.5
+