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);
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)))
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;
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
*/
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
/* 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,