Skip to content

Commit 1abfa29

Browse files
Thomas-fourierNipaLocal
authored andcommitted
ethernet: ionic: Fix DMA mapping tests
Removing wrappers around `dma_map_XXX()` to prevent collision between 0 as a valid address and 0 as an error code. Fixes: ac8813c ("ionic: convert Rx queue buffers to use page_pool") Signed-off-by: Thomas Fourier <[email protected]> Signed-off-by: NipaLocal <nipa@local>
1 parent 711c0a6 commit 1abfa29

File tree

1 file changed

+22
-48
lines changed

1 file changed

+22
-48
lines changed

drivers/net/ethernet/pensando/ionic/ionic_txrx.c

Lines changed: 22 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,7 @@
1212
#include "ionic_lif.h"
1313
#include "ionic_txrx.h"
1414

15-
static dma_addr_t ionic_tx_map_single(struct ionic_queue *q,
16-
void *data, size_t len);
1715

18-
static dma_addr_t ionic_tx_map_frag(struct ionic_queue *q,
19-
const skb_frag_t *frag,
20-
size_t offset, size_t len);
2116

2217
static void ionic_tx_desc_unmap_bufs(struct ionic_queue *q,
2318
struct ionic_tx_desc_info *desc_info);
@@ -320,9 +315,9 @@ static int ionic_xdp_post_frame(struct ionic_queue *q, struct xdp_frame *frame,
320315
dma_sync_single_for_device(q->dev, dma_addr,
321316
len, DMA_TO_DEVICE);
322317
} else /* XDP_REDIRECT */ {
323-
dma_addr = ionic_tx_map_single(q, frame->data, len);
324-
if (!dma_addr)
325-
return -EIO;
318+
dma_addr = dma_map_single(q->dev, frame->data, len, DMA_TO_DEVICE);
319+
if (dma_mapping_error(q->dev, dma_addr))
320+
goto dma_err;
326321
}
327322

328323
buf_info->dma_addr = dma_addr;
@@ -355,11 +350,12 @@ static int ionic_xdp_post_frame(struct ionic_queue *q, struct xdp_frame *frame,
355350
skb_frag_size(frag),
356351
DMA_TO_DEVICE);
357352
} else {
358-
dma_addr = ionic_tx_map_frag(q, frag, 0,
359-
skb_frag_size(frag));
353+
dma_addr = skb_frag_dma_map(q->dev, frag, 0,
354+
skb_frag_size(frag),
355+
DMA_TO_DEVICE);
360356
if (dma_mapping_error(q->dev, dma_addr)) {
361357
ionic_tx_desc_unmap_bufs(q, desc_info);
362-
return -EIO;
358+
goto dma_err;
363359
}
364360
}
365361
bi->dma_addr = dma_addr;
@@ -388,6 +384,12 @@ static int ionic_xdp_post_frame(struct ionic_queue *q, struct xdp_frame *frame,
388384
ionic_txq_post(q, ring_doorbell);
389385

390386
return 0;
387+
388+
dma_err:
389+
net_warn_ratelimited("%s: DMA map failed on %s!\n",
390+
dev_name(q->dev), q->name);
391+
q_to_tx_stats(q)->dma_map_err++;
392+
return -EIO;
391393
}
392394

393395
int ionic_xdp_xmit(struct net_device *netdev, int n,
@@ -1072,38 +1074,6 @@ int ionic_txrx_napi(struct napi_struct *napi, int budget)
10721074
return rx_work_done;
10731075
}
10741076

1075-
static dma_addr_t ionic_tx_map_single(struct ionic_queue *q,
1076-
void *data, size_t len)
1077-
{
1078-
struct device *dev = q->dev;
1079-
dma_addr_t dma_addr;
1080-
1081-
dma_addr = dma_map_single(dev, data, len, DMA_TO_DEVICE);
1082-
if (unlikely(dma_mapping_error(dev, dma_addr))) {
1083-
net_warn_ratelimited("%s: DMA single map failed on %s!\n",
1084-
dev_name(dev), q->name);
1085-
q_to_tx_stats(q)->dma_map_err++;
1086-
return 0;
1087-
}
1088-
return dma_addr;
1089-
}
1090-
1091-
static dma_addr_t ionic_tx_map_frag(struct ionic_queue *q,
1092-
const skb_frag_t *frag,
1093-
size_t offset, size_t len)
1094-
{
1095-
struct device *dev = q->dev;
1096-
dma_addr_t dma_addr;
1097-
1098-
dma_addr = skb_frag_dma_map(dev, frag, offset, len, DMA_TO_DEVICE);
1099-
if (unlikely(dma_mapping_error(dev, dma_addr))) {
1100-
net_warn_ratelimited("%s: DMA frag map failed on %s!\n",
1101-
dev_name(dev), q->name);
1102-
q_to_tx_stats(q)->dma_map_err++;
1103-
return 0;
1104-
}
1105-
return dma_addr;
1106-
}
11071077

11081078
static int ionic_tx_map_skb(struct ionic_queue *q, struct sk_buff *skb,
11091079
struct ionic_tx_desc_info *desc_info)
@@ -1115,18 +1085,18 @@ static int ionic_tx_map_skb(struct ionic_queue *q, struct sk_buff *skb,
11151085
skb_frag_t *frag;
11161086
int frag_idx;
11171087

1118-
dma_addr = ionic_tx_map_single(q, skb->data, skb_headlen(skb));
1119-
if (!dma_addr)
1120-
return -EIO;
1088+
dma_addr = dma_map_single(q->dev, skb->data, skb_headlen(skb), DMA_TO_DEVICE);
1089+
if (dma_mapping_error(q->dev, dma_addr))
1090+
goto dma_early_fail;
11211091
buf_info->dma_addr = dma_addr;
11221092
buf_info->len = skb_headlen(skb);
11231093
buf_info++;
11241094

11251095
frag = skb_shinfo(skb)->frags;
11261096
nfrags = skb_shinfo(skb)->nr_frags;
11271097
for (frag_idx = 0; frag_idx < nfrags; frag_idx++, frag++) {
1128-
dma_addr = ionic_tx_map_frag(q, frag, 0, skb_frag_size(frag));
1129-
if (!dma_addr)
1098+
dma_addr = skb_frag_dma_map(q->dev, frag, 0, skb_frag_size(frag), DMA_TO_DEVICE);
1099+
if (dma_mapping_error(q->dev, dma_addr))
11301100
goto dma_fail;
11311101
buf_info->dma_addr = dma_addr;
11321102
buf_info->len = skb_frag_size(frag);
@@ -1147,6 +1117,10 @@ static int ionic_tx_map_skb(struct ionic_queue *q, struct sk_buff *skb,
11471117
}
11481118
dma_unmap_single(dev, desc_info->bufs[0].dma_addr,
11491119
desc_info->bufs[0].len, DMA_TO_DEVICE);
1120+
dma_early_fail:
1121+
net_warn_ratelimited("%s: DMA map failed on %s!\n",
1122+
dev_name(dev), q->name);
1123+
q_to_tx_stats(q)->dma_map_err++;
11501124
return -EIO;
11511125
}
11521126

0 commit comments

Comments
 (0)