Skip to content

Commit efa6a7d

Browse files
IoanaCiorneidavem330
authored andcommitted
dpaa2-eth: properly handle buffer size restrictions
Depending on the WRIOP version, the buffer size on the RX path must by a multiple of 64 or 256. Handle this restriction properly by aligning down the buffer size to the necessary value. Also, use the new buffer size dynamically computed instead of the compile time one. Fixes: 27c8748 ("dpaa2-eth: Use a single page per Rx buffer") Signed-off-by: Ioana Ciornei <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 207b584 commit efa6a7d

File tree

2 files changed

+18
-12
lines changed

2 files changed

+18
-12
lines changed

drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ static void free_rx_fd(struct dpaa2_eth_priv *priv,
8686
for (i = 1; i < DPAA2_ETH_MAX_SG_ENTRIES; i++) {
8787
addr = dpaa2_sg_get_addr(&sgt[i]);
8888
sg_vaddr = dpaa2_iova_to_virt(priv->iommu_domain, addr);
89-
dma_unmap_page(dev, addr, DPAA2_ETH_RX_BUF_SIZE,
89+
dma_unmap_page(dev, addr, priv->rx_buf_size,
9090
DMA_BIDIRECTIONAL);
9191

9292
free_pages((unsigned long)sg_vaddr, 0);
@@ -144,7 +144,7 @@ static struct sk_buff *build_frag_skb(struct dpaa2_eth_priv *priv,
144144
/* Get the address and length from the S/G entry */
145145
sg_addr = dpaa2_sg_get_addr(sge);
146146
sg_vaddr = dpaa2_iova_to_virt(priv->iommu_domain, sg_addr);
147-
dma_unmap_page(dev, sg_addr, DPAA2_ETH_RX_BUF_SIZE,
147+
dma_unmap_page(dev, sg_addr, priv->rx_buf_size,
148148
DMA_BIDIRECTIONAL);
149149

150150
sg_length = dpaa2_sg_get_len(sge);
@@ -185,7 +185,7 @@ static struct sk_buff *build_frag_skb(struct dpaa2_eth_priv *priv,
185185
(page_address(page) - page_address(head_page));
186186

187187
skb_add_rx_frag(skb, i - 1, head_page, page_offset,
188-
sg_length, DPAA2_ETH_RX_BUF_SIZE);
188+
sg_length, priv->rx_buf_size);
189189
}
190190

191191
if (dpaa2_sg_is_final(sge))
@@ -211,7 +211,7 @@ static void free_bufs(struct dpaa2_eth_priv *priv, u64 *buf_array, int count)
211211

212212
for (i = 0; i < count; i++) {
213213
vaddr = dpaa2_iova_to_virt(priv->iommu_domain, buf_array[i]);
214-
dma_unmap_page(dev, buf_array[i], DPAA2_ETH_RX_BUF_SIZE,
214+
dma_unmap_page(dev, buf_array[i], priv->rx_buf_size,
215215
DMA_BIDIRECTIONAL);
216216
free_pages((unsigned long)vaddr, 0);
217217
}
@@ -335,7 +335,7 @@ static u32 run_xdp(struct dpaa2_eth_priv *priv,
335335
break;
336336
case XDP_REDIRECT:
337337
dma_unmap_page(priv->net_dev->dev.parent, addr,
338-
DPAA2_ETH_RX_BUF_SIZE, DMA_BIDIRECTIONAL);
338+
priv->rx_buf_size, DMA_BIDIRECTIONAL);
339339
ch->buf_count--;
340340
xdp.data_hard_start = vaddr;
341341
err = xdp_do_redirect(priv->net_dev, &xdp, xdp_prog);
@@ -374,7 +374,7 @@ static void dpaa2_eth_rx(struct dpaa2_eth_priv *priv,
374374
trace_dpaa2_rx_fd(priv->net_dev, fd);
375375

376376
vaddr = dpaa2_iova_to_virt(priv->iommu_domain, addr);
377-
dma_sync_single_for_cpu(dev, addr, DPAA2_ETH_RX_BUF_SIZE,
377+
dma_sync_single_for_cpu(dev, addr, priv->rx_buf_size,
378378
DMA_BIDIRECTIONAL);
379379

380380
fas = dpaa2_get_fas(vaddr, false);
@@ -393,13 +393,13 @@ static void dpaa2_eth_rx(struct dpaa2_eth_priv *priv,
393393
return;
394394
}
395395

396-
dma_unmap_page(dev, addr, DPAA2_ETH_RX_BUF_SIZE,
396+
dma_unmap_page(dev, addr, priv->rx_buf_size,
397397
DMA_BIDIRECTIONAL);
398398
skb = build_linear_skb(ch, fd, vaddr);
399399
} else if (fd_format == dpaa2_fd_sg) {
400400
WARN_ON(priv->xdp_prog);
401401

402-
dma_unmap_page(dev, addr, DPAA2_ETH_RX_BUF_SIZE,
402+
dma_unmap_page(dev, addr, priv->rx_buf_size,
403403
DMA_BIDIRECTIONAL);
404404
skb = build_frag_skb(priv, ch, buf_data);
405405
free_pages((unsigned long)vaddr, 0);
@@ -974,7 +974,7 @@ static int add_bufs(struct dpaa2_eth_priv *priv,
974974
if (!page)
975975
goto err_alloc;
976976

977-
addr = dma_map_page(dev, page, 0, DPAA2_ETH_RX_BUF_SIZE,
977+
addr = dma_map_page(dev, page, 0, priv->rx_buf_size,
978978
DMA_BIDIRECTIONAL);
979979
if (unlikely(dma_mapping_error(dev, addr)))
980980
goto err_map;
@@ -984,7 +984,7 @@ static int add_bufs(struct dpaa2_eth_priv *priv,
984984
/* tracing point */
985985
trace_dpaa2_eth_buf_seed(priv->net_dev,
986986
page, DPAA2_ETH_RX_BUF_RAW_SIZE,
987-
addr, DPAA2_ETH_RX_BUF_SIZE,
987+
addr, priv->rx_buf_size,
988988
bpid);
989989
}
990990

@@ -1720,7 +1720,7 @@ static bool xdp_mtu_valid(struct dpaa2_eth_priv *priv, int mtu)
17201720
int mfl, linear_mfl;
17211721

17221722
mfl = DPAA2_ETH_L2_MAX_FRM(mtu);
1723-
linear_mfl = DPAA2_ETH_RX_BUF_SIZE - DPAA2_ETH_RX_HWA_SIZE -
1723+
linear_mfl = priv->rx_buf_size - DPAA2_ETH_RX_HWA_SIZE -
17241724
dpaa2_eth_rx_head_room(priv) - XDP_PACKET_HEADROOM;
17251725

17261726
if (mfl > linear_mfl) {
@@ -2462,6 +2462,11 @@ static int set_buffer_layout(struct dpaa2_eth_priv *priv)
24622462
else
24632463
rx_buf_align = DPAA2_ETH_RX_BUF_ALIGN;
24642464

2465+
/* We need to ensure that the buffer size seen by WRIOP is a multiple
2466+
* of 64 or 256 bytes depending on the WRIOP version.
2467+
*/
2468+
priv->rx_buf_size = ALIGN_DOWN(DPAA2_ETH_RX_BUF_SIZE, rx_buf_align);
2469+
24652470
/* tx buffer */
24662471
buf_layout.private_data_size = DPAA2_ETH_SWA_SIZE;
24672472
buf_layout.pass_timestamp = true;
@@ -3126,7 +3131,7 @@ static int bind_dpni(struct dpaa2_eth_priv *priv)
31263131
pools_params.num_dpbp = 1;
31273132
pools_params.pools[0].dpbp_id = priv->dpbp_dev->obj_desc.id;
31283133
pools_params.pools[0].backup_pool = 0;
3129-
pools_params.pools[0].buffer_size = DPAA2_ETH_RX_BUF_SIZE;
3134+
pools_params.pools[0].buffer_size = priv->rx_buf_size;
31303135
err = dpni_set_pools(priv->mc_io, 0, priv->mc_token, &pools_params);
31313136
if (err) {
31323137
dev_err(dev, "dpni_set_pools() failed\n");

drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,7 @@ struct dpaa2_eth_priv {
382382
u16 tx_data_offset;
383383

384384
struct fsl_mc_device *dpbp_dev;
385+
u16 rx_buf_size;
385386
u16 bpid;
386387
struct iommu_domain *iommu_domain;
387388

0 commit comments

Comments
 (0)