[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <aWpN2uglFxlJgoVV@lizhi-Precision-Tower-5810>
Date: Fri, 16 Jan 2026 09:40:26 -0500
From: Frank Li <Frank.li@....com>
To: Wei Fang <wei.fang@....com>
Cc: shenwei.wang@....com, xiaoning.wang@....com, andrew+netdev@...n.ch,
davem@...emloft.net, edumazet@...gle.com, kuba@...nel.org,
pabeni@...hat.com, ast@...nel.org, daniel@...earbox.net,
hawk@...nel.org, john.fastabend@...il.com, sdf@...ichev.me,
netdev@...r.kernel.org, linux-kernel@...r.kernel.org,
imx@...ts.linux.dev, bpf@...r.kernel.org
Subject: Re: [PATCH v2 net-next 13/14] net: fec: improve fec_enet_tx_queue()
On Fri, Jan 16, 2026 at 03:40:26PM +0800, Wei Fang wrote:
> To support AF_XDP zero-copy mode in the subsequent patch, the following
> adjustments have been made to fec_tx_queue().
>
> 1. Change the parameters of fec_tx_queue().
> 2. Some variables are initialized at the time of declaration, and the
> order of local variables is updated to follow the reverse xmas tree
> style.
> 3. Remove the variable xdpf and add the variable tx_buf.
>
> Signed-off-by: Wei Fang <wei.fang@....com>
> ---
Reviewed-by: Frank Li <Frank.Li@....com>
> drivers/net/ethernet/freescale/fec_main.c | 43 +++++++++--------------
> 1 file changed, 17 insertions(+), 26 deletions(-)
>
> diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
> index 68aa94dd9487..7b5fe7da7210 100644
> --- a/drivers/net/ethernet/freescale/fec_main.c
> +++ b/drivers/net/ethernet/freescale/fec_main.c
> @@ -1467,27 +1467,18 @@ fec_enet_hwtstamp(struct fec_enet_private *fep, unsigned ts,
> hwtstamps->hwtstamp = ns_to_ktime(ns);
> }
>
> -static void
> -fec_enet_tx_queue(struct net_device *ndev, u16 queue_id, int budget)
> +static void fec_enet_tx_queue(struct fec_enet_private *fep,
> + u16 queue, int budget)
> {
> - struct fec_enet_private *fep;
> - struct xdp_frame *xdpf;
> - struct bufdesc *bdp;
> + struct netdev_queue *nq = netdev_get_tx_queue(fep->netdev, queue);
> + struct fec_enet_priv_tx_q *txq = fep->tx_queue[queue];
> + struct net_device *ndev = fep->netdev;
> + struct bufdesc *bdp = txq->dirty_tx;
> + int index, frame_len, entries_free;
> + struct fec_tx_buffer *tx_buf;
> unsigned short status;
> - struct sk_buff *skb;
> - struct fec_enet_priv_tx_q *txq;
> - struct netdev_queue *nq;
> - int index = 0;
> - int entries_free;
> + struct sk_buff *skb;
> struct page *page;
> - int frame_len;
> -
> - fep = netdev_priv(ndev);
> -
> - txq = fep->tx_queue[queue_id];
> - /* get next bdp of dirty_tx */
> - nq = netdev_get_tx_queue(ndev, queue_id);
> - bdp = txq->dirty_tx;
>
> /* get next bdp of dirty_tx */
> bdp = fec_enet_get_nextdesc(bdp, &txq->bd);
> @@ -1500,9 +1491,10 @@ fec_enet_tx_queue(struct net_device *ndev, u16 queue_id, int budget)
> break;
>
> index = fec_enet_get_bd_index(bdp, &txq->bd);
> + tx_buf = &txq->tx_buf[index];
> frame_len = fec16_to_cpu(bdp->cbd_datlen);
>
> - switch (txq->tx_buf[index].type) {
> + switch (tx_buf->type) {
> case FEC_TXBUF_T_SKB:
> if (bdp->cbd_bufaddr &&
> !IS_TSO_HEADER(txq, fec32_to_cpu(bdp->cbd_bufaddr)))
> @@ -1511,7 +1503,7 @@ fec_enet_tx_queue(struct net_device *ndev, u16 queue_id, int budget)
> frame_len, DMA_TO_DEVICE);
>
> bdp->cbd_bufaddr = cpu_to_fec32(0);
> - skb = txq->tx_buf[index].buf_p;
> + skb = tx_buf->buf_p;
> if (!skb)
> goto tx_buf_done;
>
> @@ -1542,19 +1534,18 @@ fec_enet_tx_queue(struct net_device *ndev, u16 queue_id, int budget)
> if (unlikely(!budget))
> goto out;
>
> - xdpf = txq->tx_buf[index].buf_p;
> dma_unmap_single(&fep->pdev->dev,
> fec32_to_cpu(bdp->cbd_bufaddr),
> frame_len, DMA_TO_DEVICE);
> bdp->cbd_bufaddr = cpu_to_fec32(0);
> - xdp_return_frame_rx_napi(xdpf);
> + xdp_return_frame_rx_napi(tx_buf->buf_p);
> break;
> case FEC_TXBUF_T_XDP_TX:
> if (unlikely(!budget))
> goto out;
>
> bdp->cbd_bufaddr = cpu_to_fec32(0);
> - page = txq->tx_buf[index].buf_p;
> + page = tx_buf->buf_p;
> /* The dma_sync_size = 0 as XDP_TX has already synced
> * DMA for_device
> */
> @@ -1591,9 +1582,9 @@ fec_enet_tx_queue(struct net_device *ndev, u16 queue_id, int budget)
> if (status & BD_ENET_TX_DEF)
> ndev->stats.collisions++;
>
> - txq->tx_buf[index].buf_p = NULL;
> + tx_buf->buf_p = NULL;
> /* restore default tx buffer type: FEC_TXBUF_T_SKB */
> - txq->tx_buf[index].type = FEC_TXBUF_T_SKB;
> + tx_buf->type = FEC_TXBUF_T_SKB;
>
> tx_buf_done:
> /* Make sure the update to bdp and tx_buf are performed
> @@ -1629,7 +1620,7 @@ static void fec_enet_tx(struct net_device *ndev, int budget)
>
> /* Make sure that AVB queues are processed first. */
> for (i = fep->num_tx_queues - 1; i >= 0; i--)
> - fec_enet_tx_queue(ndev, i, budget);
> + fec_enet_tx_queue(fep, i, budget);
> }
>
> static int fec_enet_update_cbd(struct fec_enet_priv_rx_q *rxq,
> --
> 2.34.1
>
Powered by blists - more mailing lists