diff options
Diffstat (limited to 'drivers/net/ethernet/freescale/fec_main.c')
| -rw-r--r-- | drivers/net/ethernet/freescale/fec_main.c | 40 | 
1 files changed, 12 insertions, 28 deletions
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c index 38e5b5abe067..8fbe47703d47 100644 --- a/drivers/net/ethernet/freescale/fec_main.c +++ b/drivers/net/ethernet/freescale/fec_main.c @@ -1011,24 +1011,6 @@ static void fec_enet_enable_ring(struct net_device *ndev)  	}  } -static void fec_enet_reset_skb(struct net_device *ndev) -{ -	struct fec_enet_private *fep = netdev_priv(ndev); -	struct fec_enet_priv_tx_q *txq; -	int i, j; - -	for (i = 0; i < fep->num_tx_queues; i++) { -		txq = fep->tx_queue[i]; - -		for (j = 0; j < txq->bd.ring_size; j++) { -			if (txq->tx_skbuff[j]) { -				dev_kfree_skb_any(txq->tx_skbuff[j]); -				txq->tx_skbuff[j] = NULL; -			} -		} -	} -} -  /*   * This function is called to start or restart the FEC during a link   * change, transmit timeout, or to reconfigure the FEC.  The network @@ -1071,9 +1053,6 @@ fec_restart(struct net_device *ndev)  	fec_enet_enable_ring(ndev); -	/* Reset tx SKB buffers. */ -	fec_enet_reset_skb(ndev); -  	/* Enable MII mode */  	if (fep->full_duplex == DUPLEX_FULL) {  		/* FD enable */ @@ -2810,6 +2789,7 @@ static void fec_enet_get_xdp_stats(struct fec_enet_private *fep, u64 *data)  static void fec_enet_page_pool_stats(struct fec_enet_private *fep, u64 *data)  { +#ifdef CONFIG_PAGE_POOL_STATS  	struct page_pool_stats stats = {};  	struct fec_enet_priv_rx_q *rxq;  	int i; @@ -2824,6 +2804,7 @@ static void fec_enet_page_pool_stats(struct fec_enet_private *fep, u64 *data)  	}  	page_pool_ethtool_stats_get(data, &stats); +#endif  }  static void fec_enet_get_ethtool_stats(struct net_device *dev, @@ -3791,19 +3772,18 @@ static int fec_enet_txq_xmit_frame(struct fec_enet_private *fep,  				   struct xdp_frame *frame)  {  	unsigned int index, status, estatus; -	struct bufdesc *bdp, *last_bdp; +	struct bufdesc *bdp;  	dma_addr_t dma_addr;  	int entries_free;  	entries_free = fec_enet_get_free_txdesc_num(txq);  	if (entries_free < MAX_SKB_FRAGS + 1) {  		netdev_err(fep->netdev, "NOT enough BD for SG!\n"); -		return NETDEV_TX_BUSY; +		return -EBUSY;  	}  	/* Fill in a Tx ring entry */  	bdp = txq->bd.cur; -	last_bdp = bdp;  	status = fec16_to_cpu(bdp->cbd_sc);  	status &= ~BD_ENET_TX_STATS; @@ -3812,7 +3792,7 @@ static int fec_enet_txq_xmit_frame(struct fec_enet_private *fep,  	dma_addr = dma_map_single(&fep->pdev->dev, frame->data,  				  frame->len, DMA_TO_DEVICE);  	if (dma_mapping_error(&fep->pdev->dev, dma_addr)) -		return FEC_ENET_XDP_CONSUMED; +		return -ENOMEM;  	status |= (BD_ENET_TX_INTR | BD_ENET_TX_LAST);  	if (fep->bufdesc_ex) @@ -3831,7 +3811,6 @@ static int fec_enet_txq_xmit_frame(struct fec_enet_private *fep,  		ebdp->cbd_esc = cpu_to_fec32(estatus);  	} -	index = fec_enet_get_bd_index(last_bdp, &txq->bd);  	txq->tx_skbuff[index] = NULL;  	/* Make sure the updates to rest of the descriptor are performed before @@ -3846,7 +3825,7 @@ static int fec_enet_txq_xmit_frame(struct fec_enet_private *fep,  	bdp->cbd_sc = cpu_to_fec16(status);  	/* If this was the last BD in the ring, start at the beginning again. */ -	bdp = fec_enet_get_nextdesc(last_bdp, &txq->bd); +	bdp = fec_enet_get_nextdesc(bdp, &txq->bd);  	/* Make sure the update to bdp are performed before txq->bd.cur. */  	dma_wmb(); @@ -3879,7 +3858,7 @@ static int fec_enet_xdp_xmit(struct net_device *dev,  	__netif_tx_lock(nq, cpu);  	for (i = 0; i < num_frames; i++) { -		if (fec_enet_txq_xmit_frame(fep, txq, frames[i]) != 0) +		if (fec_enet_txq_xmit_frame(fep, txq, frames[i]) < 0)  			break;  		sent_frames++;  	} @@ -4035,6 +4014,11 @@ static int fec_enet_init(struct net_device *ndev)  	ndev->hw_features = ndev->features; +	if (!(fep->quirks & FEC_QUIRK_SWAP_FRAME)) +		ndev->xdp_features = NETDEV_XDP_ACT_BASIC | +				     NETDEV_XDP_ACT_REDIRECT | +				     NETDEV_XDP_ACT_NDO_XMIT; +  	fec_restart(ndev);  	if (fep->quirks & FEC_QUIRK_MIB_CLEAR)  |