ChangeSet 1.1760.26.23, 2004/06/29 09:49:30-07:00, herbert@gondor.apana.org.au

[PATCH] USB: Fix pegasus_set_multicast lockup in drivers/usb/net/pegasus.c

I strongly recommend that this patch be applied.

Without this patch, running tcpdump on an SMP machine with the
pegasus adapter locks up 9 times out of 10.  This is what happens:

CPU0				CPU1
pegasus_start_xmit
	netif_stop_queue
				pegasus_set_multicast
					netif_stop_queue
					netif_wake_queue

Which crashes if another packet is sent to pegasus_start_xmit before
the first one is finished.

If there are other drivers doing this, please fix them too.

PS I submitted this to Petkan years ago but he probably lost it.



Signed-off-by: Greg Kroah-Hartman <greg@kroah.com>


 drivers/usb/net/pegasus.c |    4 ----
 1 files changed, 4 deletions(-)


diff -Nru a/drivers/usb/net/pegasus.c b/drivers/usb/net/pegasus.c
--- a/drivers/usb/net/pegasus.c	2004-06-29 16:24:54 -07:00
+++ b/drivers/usb/net/pegasus.c	2004-06-29 16:24:54 -07:00
@@ -1137,8 +1137,6 @@
 {
 	pegasus_t *pegasus = net->priv;
 
-	netif_stop_queue(net);
-
 	if (net->flags & IFF_PROMISC) {
 		pegasus->eth_regs[EthCtrl2] |= RX_PROMISCUOUS;
 		info("%s: Promiscuous mode enabled", net->name);
@@ -1154,8 +1152,6 @@
 
 	pegasus->flags |= ETH_REGS_CHANGE;
 	ctrl_callback(pegasus->ctrl_urb, NULL);
-
-	netif_wake_queue(net);
 }
 
 static __u8 mii_phy_probe(pegasus_t * pegasus)
