aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/freescale/fec_main.c
diff options
context:
space:
mode:
authorUwe Kleine-König <u.kleine-koenig@pengutronix.de>2016-05-03 10:38:53 -0400
committerDavid S. Miller <davem@davemloft.net>2016-05-04 14:08:38 -0400
commit1c021bb717a70aaeaa4b25c91f43c2aeddd922de (patch)
tree2199dabde58723432da3fadf9ac48034f0965a72 /drivers/net/ethernet/freescale/fec_main.c
parent20decb7e486d7eefff3931f58d092d2d7c024a1c (diff)
net: fec: only clear a queue's work bit if the queue was emptied
In the receive path a queue's work bit was cleared unconditionally even if fec_enet_rx_queue only read out a part of the available packets from the hardware. This resulted in not reading any packets in the next napi turn and so packets were delayed or lost. The obvious fix is to only clear a queue's bit when the queue was emptied. Fixes: 4d494cdc92b3 ("net: fec: change data structure to support multiqueue") Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> Reviewed-by: Lucas Stach <l.stach@pengutronix.de> Tested-by: Fugang Duan <fugang.duan@nxp.com> Acked-by: Fugang Duan <fugang.duan@nxp.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/freescale/fec_main.c')
-rw-r--r--drivers/net/ethernet/freescale/fec_main.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
index 08243c2ff4b4..2a03857cca18 100644
--- a/drivers/net/ethernet/freescale/fec_main.c
+++ b/drivers/net/ethernet/freescale/fec_main.c
@@ -1521,9 +1521,15 @@ fec_enet_rx(struct net_device *ndev, int budget)
1521 struct fec_enet_private *fep = netdev_priv(ndev); 1521 struct fec_enet_private *fep = netdev_priv(ndev);
1522 1522
1523 for_each_set_bit(queue_id, &fep->work_rx, FEC_ENET_MAX_RX_QS) { 1523 for_each_set_bit(queue_id, &fep->work_rx, FEC_ENET_MAX_RX_QS) {
1524 clear_bit(queue_id, &fep->work_rx); 1524 int ret;
1525 pkt_received += fec_enet_rx_queue(ndev, 1525
1526 ret = fec_enet_rx_queue(ndev,
1526 budget - pkt_received, queue_id); 1527 budget - pkt_received, queue_id);
1528
1529 if (ret < budget - pkt_received)
1530 clear_bit(queue_id, &fep->work_rx);
1531
1532 pkt_received += ret;
1527 } 1533 }
1528 return pkt_received; 1534 return pkt_received;
1529} 1535}