Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 42199884 authored by Andy Fleming's avatar Andy Fleming Committed by David S. Miller
Browse files

gianfar: Continue polling until both tx and rx are empty



gfar_poll would declare polling done once the rx queue was empty,
but the tx queue could still have packets left.

Stolen mostly from the e1000 driver.

Signed-off-by: default avatarAndy Fleming <afleming@freescale.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 8c7396ae
Loading
Loading
Loading
Loading
+9 −5
Original line number Diff line number Diff line
@@ -1843,7 +1843,8 @@ static int gfar_poll(struct napi_struct *napi, int budget)
{
	struct gfar_private *priv = container_of(napi, struct gfar_private, napi);
	struct net_device *dev = priv->dev;
	int howmany;
	int tx_cleaned = 0;
	int rx_cleaned = 0;
	unsigned long flags;

	/* Clear IEVENT, so interrupts aren't called again
@@ -1852,13 +1853,16 @@ static int gfar_poll(struct napi_struct *napi, int budget)

	/* If we fail to get the lock, don't bother with the TX BDs */
	if (spin_trylock_irqsave(&priv->txlock, flags)) {
		gfar_clean_tx_ring(dev);
		tx_cleaned = gfar_clean_tx_ring(dev);
		spin_unlock_irqrestore(&priv->txlock, flags);
	}

	howmany = gfar_clean_rx_ring(dev, budget);
	rx_cleaned = gfar_clean_rx_ring(dev, budget);

	if (howmany < budget) {
	if (tx_cleaned)
		return budget;

	if (rx_cleaned < budget) {
		netif_rx_complete(dev, napi);

		/* Clear the halt bit in RSTAT */
@@ -1878,7 +1882,7 @@ static int gfar_poll(struct napi_struct *napi, int budget)
		}
	}

	return howmany;
	return rx_cleaned;
}

#ifdef CONFIG_NET_POLL_CONTROLLER