diff options
Diffstat (limited to 'drivers/net')
| -rw-r--r-- | drivers/net/ethernet/moxa/moxart_ether.c | 12 | 
1 files changed, 5 insertions, 7 deletions
diff --git a/drivers/net/ethernet/moxa/moxart_ether.c b/drivers/net/ethernet/moxa/moxart_ether.c index 983d01949795..2f12c88c66ab 100644 --- a/drivers/net/ethernet/moxa/moxart_ether.c +++ b/drivers/net/ethernet/moxa/moxart_ether.c @@ -206,7 +206,7 @@ static int moxart_rx_poll(struct napi_struct *napi, int budget)  	int rx_head = priv->rx_head;  	int rx = 0; -	while (1) { +	while (rx < budget) {  		desc = priv->rx_desc_base + (RX_REG_DESC_SIZE * rx_head);  		desc0 = readl(desc + RX_REG_OFFSET_DESC0); @@ -218,7 +218,7 @@ static int moxart_rx_poll(struct napi_struct *napi, int budget)  			net_dbg_ratelimited("packet error\n");  			priv->stats.rx_dropped++;  			priv->stats.rx_errors++; -			continue; +			goto rx_next;  		}  		len = desc0 & RX_DESC0_FRAME_LEN_MASK; @@ -235,6 +235,7 @@ static int moxart_rx_poll(struct napi_struct *napi, int budget)  			net_dbg_ratelimited("netdev_alloc_skb_ip_align failed\n");  			priv->stats.rx_dropped++;  			priv->stats.rx_errors++; +			goto rx_next;  		}  		memcpy(skb->data, priv->rx_buf[rx_head], len); @@ -249,18 +250,15 @@ static int moxart_rx_poll(struct napi_struct *napi, int budget)  		if (desc0 & RX_DESC0_MULTICAST)  			priv->stats.multicast++; +rx_next:  		writel(RX_DESC0_DMA_OWN, desc + RX_REG_OFFSET_DESC0);  		rx_head = RX_NEXT(rx_head);  		priv->rx_head = rx_head; - -		if (rx >= budget) -			break;  	}  	if (rx < budget) { -		napi_gro_flush(napi, false); -		__napi_complete(napi); +		napi_complete(napi);  	}  	priv->reg_imr |= RPKT_FINISH_M;  | 

