Message ID | 20250120042624.76140-1-dheeraj.linuxdev@gmail.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [v3,net] net: fec: implement TSO descriptor cleanup | expand |
> 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: 79f339125ea3 ("net: fec: Add software TSO support") > Signed-off-by: Dheeraj Reddy Jonnalagadda <dheeraj.linuxdev@gmail.com> > --- > Changelog: > v3 > - Update DMA unmapping logic to skip all TSO headers > - Use proper endianness conversion for DMA unmapping > v2 > - Add DMA unmapping for data descriptors > - Handle extended descriptor (bufdesc_ex) cleanup > - Move variable declarations to function scope > > drivers/net/ethernet/freescale/fec_main.c | 30 ++++++++++++++++++++++- > 1 file changed, 29 insertions(+), 1 deletion(-) > > diff --git a/drivers/net/ethernet/freescale/fec_main.c > b/drivers/net/ethernet/freescale/fec_main.c > index 68725506a095..9ac407d30e85 100644 > --- a/drivers/net/ethernet/freescale/fec_main.c > +++ b/drivers/net/ethernet/freescale/fec_main.c > @@ -840,6 +840,8 @@ static int fec_enet_txq_submit_tso(struct > fec_enet_priv_tx_q *txq, > struct fec_enet_private *fep = netdev_priv(ndev); > int hdr_len, 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; > @@ -913,7 +915,33 @@ 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); Sorry, I didn't catch the nit early. Please add a blank line before return. > return ret; > } > > -- > 2.34.1
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c index 68725506a095..9ac407d30e85 100644 --- a/drivers/net/ethernet/freescale/fec_main.c +++ b/drivers/net/ethernet/freescale/fec_main.c @@ -840,6 +840,8 @@ static int fec_enet_txq_submit_tso(struct fec_enet_priv_tx_q *txq, struct fec_enet_private *fep = netdev_priv(ndev); int hdr_len, 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; @@ -913,7 +915,33 @@ 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; }
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: 79f339125ea3 ("net: fec: Add software TSO support") Signed-off-by: Dheeraj Reddy Jonnalagadda <dheeraj.linuxdev@gmail.com> --- Changelog: v3 - Update DMA unmapping logic to skip all TSO headers - Use proper endianness conversion for DMA unmapping v2 - Add DMA unmapping for data descriptors - Handle extended descriptor (bufdesc_ex) cleanup - Move variable declarations to function scope drivers/net/ethernet/freescale/fec_main.c | 30 ++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-)