Skip to content

Commit

Permalink
sh_eth: Detach net device when stopping queue to resize DMA rings
Browse files Browse the repository at this point in the history
We must only ever stop TX queues when they are full or the net device
is not 'ready' so far as the net core, and specifically the watchdog,
is concerned.  Otherwise, the watchdog may fire *immediately* if no
packets have been added to the queue in the last 5 seconds.

What's more, sh_eth_tx_timeout() will likely crash if called while
we're resizing the TX ring.

I could easily trigger this by running the loop:

   while ethtool -G eth0 rx 128 && ethtool -G eth0 rx 64; do echo -n .; done

Signed-off-by: Ben Hutchings <ben.hutchings@codethink.co.uk>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Ben Hutchings authored and David S. Miller committed Jan 27, 2015
1 parent eebfb64 commit bd88891
Showing 1 changed file with 2 additions and 1 deletion.
3 changes: 2 additions & 1 deletion drivers/net/ethernet/renesas/sh_eth.c
Original file line number Diff line number Diff line change
Expand Up @@ -1968,6 +1968,7 @@ static int sh_eth_set_ringparam(struct net_device *ndev,
return -EINVAL;

if (netif_running(ndev)) {
netif_device_detach(ndev);
netif_tx_disable(ndev);
/* Disable interrupts by clearing the interrupt mask. */
sh_eth_write(ndev, 0x0000, EESIPR);
Expand Down Expand Up @@ -2001,7 +2002,7 @@ static int sh_eth_set_ringparam(struct net_device *ndev,
sh_eth_write(ndev, mdp->cd->eesipr_value, EESIPR);
/* Setting the Rx mode will start the Rx process. */
sh_eth_write(ndev, EDRRR_R, EDRRR);
netif_wake_queue(ndev);
netif_device_attach(ndev);
}

return 0;
Expand Down

0 comments on commit bd88891

Please sign in to comment.