mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-06 03:45:24 -04:00
net: fec: implement TSO descriptor cleanup
[ Upstream commit 61dc1fd9205bc9d9918aa933a847b08e80b4dc20 ]
Implement cleanup of descriptors in the TSO error path of
fec_enet_txq_submit_tso(). The cleanup
- Unmaps DMA buffers for data descriptors skipping TSO header
- Clears all buffer descriptors
- Handles extended descriptors by clearing cbd_esc when enabled
Fixes: 79f339125e ("net: fec: Add software TSO support")
Signed-off-by: Dheeraj Reddy Jonnalagadda <dheeraj.linuxdev@gmail.com>
Reviewed-by: Wei Fang <wei.fang@nxp.com>
Link: https://patch.msgid.link/20250120085430.99318-1-dheeraj.linuxdev@gmail.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
428aff8f7c
commit
6ffa190852
1 changed files with 30 additions and 1 deletions
|
|
@ -732,6 +732,8 @@ static int fec_enet_txq_submit_tso(struct fec_enet_priv_tx_q *txq,
|
|||
int hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb);
|
||||
int total_len, data_left;
|
||||
struct bufdesc *bdp = txq->bd.cur;
|
||||
struct bufdesc *tmp_bdp;
|
||||
struct bufdesc_ex *ebdp;
|
||||
struct tso_t tso;
|
||||
unsigned int index = 0;
|
||||
int ret;
|
||||
|
|
@ -805,7 +807,34 @@ static int fec_enet_txq_submit_tso(struct fec_enet_priv_tx_q *txq,
|
|||
return 0;
|
||||
|
||||
err_release:
|
||||
/* TODO: Release all used data descriptors for TSO */
|
||||
/* Release all used data descriptors for TSO */
|
||||
tmp_bdp = txq->bd.cur;
|
||||
|
||||
while (tmp_bdp != bdp) {
|
||||
/* Unmap data buffers */
|
||||
if (tmp_bdp->cbd_bufaddr &&
|
||||
!IS_TSO_HEADER(txq, fec32_to_cpu(tmp_bdp->cbd_bufaddr)))
|
||||
dma_unmap_single(&fep->pdev->dev,
|
||||
fec32_to_cpu(tmp_bdp->cbd_bufaddr),
|
||||
fec16_to_cpu(tmp_bdp->cbd_datlen),
|
||||
DMA_TO_DEVICE);
|
||||
|
||||
/* Clear standard buffer descriptor fields */
|
||||
tmp_bdp->cbd_sc = 0;
|
||||
tmp_bdp->cbd_datlen = 0;
|
||||
tmp_bdp->cbd_bufaddr = 0;
|
||||
|
||||
/* Handle extended descriptor if enabled */
|
||||
if (fep->bufdesc_ex) {
|
||||
ebdp = (struct bufdesc_ex *)tmp_bdp;
|
||||
ebdp->cbd_esc = 0;
|
||||
}
|
||||
|
||||
tmp_bdp = fec_enet_get_nextdesc(tmp_bdp, &txq->bd);
|
||||
}
|
||||
|
||||
dev_kfree_skb_any(skb);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue