diff options
Diffstat (limited to 'drivers/net/ethernet/freescale')
| -rw-r--r-- | drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c | 3 | ||||
| -rw-r--r-- | drivers/net/ethernet/freescale/enetc/enetc.c | 25 | ||||
| -rw-r--r-- | drivers/net/ethernet/freescale/enetc/enetc.h | 2 | 
3 files changed, 23 insertions, 7 deletions
diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c index c96d1d6ba8fe..18d86badd6ea 100644 --- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c +++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c @@ -1077,8 +1077,7 @@ static int dpaa2_eth_build_single_fd(struct dpaa2_eth_priv *priv,  	dma_addr_t addr;  	buffer_start = skb->data - dpaa2_eth_needed_headroom(skb); -	aligned_start = PTR_ALIGN(buffer_start - DPAA2_ETH_TX_BUF_ALIGN, -				  DPAA2_ETH_TX_BUF_ALIGN); +	aligned_start = PTR_ALIGN(buffer_start, DPAA2_ETH_TX_BUF_ALIGN);  	if (aligned_start >= skb->head)  		buffer_start = aligned_start;  	else diff --git a/drivers/net/ethernet/freescale/enetc/enetc.c b/drivers/net/ethernet/freescale/enetc/enetc.c index aae462a0cf5a..0535e92404e3 100644 --- a/drivers/net/ethernet/freescale/enetc/enetc.c +++ b/drivers/net/ethernet/freescale/enetc/enetc.c @@ -1595,6 +1595,8 @@ static int enetc_clean_rx_ring(struct enetc_bdr *rx_ring,  	/* next descriptor to process */  	i = rx_ring->next_to_clean; +	enetc_lock_mdio(); +  	while (likely(rx_frm_cnt < work_limit)) {  		union enetc_rx_bd *rxbd;  		struct sk_buff *skb; @@ -1630,7 +1632,9 @@ static int enetc_clean_rx_ring(struct enetc_bdr *rx_ring,  		rx_byte_cnt += skb->len + ETH_HLEN;  		rx_frm_cnt++; +		enetc_unlock_mdio();  		napi_gro_receive(napi, skb); +		enetc_lock_mdio();  	}  	rx_ring->next_to_clean = i; @@ -1638,6 +1642,8 @@ static int enetc_clean_rx_ring(struct enetc_bdr *rx_ring,  	rx_ring->stats.packets += rx_frm_cnt;  	rx_ring->stats.bytes += rx_byte_cnt; +	enetc_unlock_mdio(); +  	return rx_frm_cnt;  } @@ -1947,6 +1953,8 @@ static int enetc_clean_rx_ring_xdp(struct enetc_bdr *rx_ring,  	/* next descriptor to process */  	i = rx_ring->next_to_clean; +	enetc_lock_mdio(); +  	while (likely(rx_frm_cnt < work_limit)) {  		union enetc_rx_bd *rxbd, *orig_rxbd;  		struct xdp_buff xdp_buff; @@ -2010,7 +2018,9 @@ static int enetc_clean_rx_ring_xdp(struct enetc_bdr *rx_ring,  			 */  			enetc_bulk_flip_buff(rx_ring, orig_i, i); +			enetc_unlock_mdio();  			napi_gro_receive(napi, skb); +			enetc_lock_mdio();  			break;  		case XDP_TX:  			tx_ring = priv->xdp_tx_ring[rx_ring->index]; @@ -2045,7 +2055,9 @@ static int enetc_clean_rx_ring_xdp(struct enetc_bdr *rx_ring,  			}  			break;  		case XDP_REDIRECT: +			enetc_unlock_mdio();  			err = xdp_do_redirect(rx_ring->ndev, &xdp_buff, prog); +			enetc_lock_mdio();  			if (unlikely(err)) {  				enetc_xdp_drop(rx_ring, orig_i, i);  				rx_ring->stats.xdp_redirect_failures++; @@ -2065,8 +2077,11 @@ out:  	rx_ring->stats.packets += rx_frm_cnt;  	rx_ring->stats.bytes += rx_byte_cnt; -	if (xdp_redirect_frm_cnt) +	if (xdp_redirect_frm_cnt) { +		enetc_unlock_mdio();  		xdp_do_flush(); +		enetc_lock_mdio(); +	}  	if (xdp_tx_frm_cnt)  		enetc_update_tx_ring_tail(tx_ring); @@ -2075,6 +2090,8 @@ out:  		enetc_refill_rx_ring(rx_ring, enetc_bd_unused(rx_ring) -  				     rx_ring->xdp.xdp_tx_in_flight); +	enetc_unlock_mdio(); +  	return rx_frm_cnt;  } @@ -2093,6 +2110,7 @@ static int enetc_poll(struct napi_struct *napi, int budget)  	for (i = 0; i < v->count_tx_rings; i++)  		if (!enetc_clean_tx_ring(&v->tx_ring[i], budget))  			complete = false; +	enetc_unlock_mdio();  	prog = rx_ring->xdp.prog;  	if (prog) @@ -2104,10 +2122,8 @@ static int enetc_poll(struct napi_struct *napi, int budget)  	if (work_done)  		v->rx_napi_work = true; -	if (!complete) { -		enetc_unlock_mdio(); +	if (!complete)  		return budget; -	}  	napi_complete_done(napi, work_done); @@ -2116,6 +2132,7 @@ static int enetc_poll(struct napi_struct *napi, int budget)  	v->rx_napi_work = false; +	enetc_lock_mdio();  	/* enable interrupts */  	enetc_wr_reg_hot(v->rbier, ENETC_RBIER_RXTIE); diff --git a/drivers/net/ethernet/freescale/enetc/enetc.h b/drivers/net/ethernet/freescale/enetc/enetc.h index 0ec010a7d640..f279fa597991 100644 --- a/drivers/net/ethernet/freescale/enetc/enetc.h +++ b/drivers/net/ethernet/freescale/enetc/enetc.h @@ -76,7 +76,7 @@ struct enetc_lso_t {  #define ENETC_LSO_MAX_DATA_LEN		SZ_256K  #define ENETC_RX_MAXFRM_SIZE	ENETC_MAC_MAXFRM_SIZE -#define ENETC_RXB_TRUESIZE	2048 /* PAGE_SIZE >> 1 */ +#define ENETC_RXB_TRUESIZE	(PAGE_SIZE >> 1)  #define ENETC_RXB_PAD		NET_SKB_PAD /* add extra space if needed */  #define ENETC_RXB_DMA_SIZE	\  	(SKB_WITH_OVERHEAD(ENETC_RXB_TRUESIZE) - ENETC_RXB_PAD)  | 
