From: Greg KH <greg@kroah.com>
To: marcelo@conectiva.com.br
Cc: linux-usb-devel@lists.sourceforge.net
Subject: [PATCH 07 of 14] USB kaweth driver update

Hi,

Here's a patch against 2.4.19-pre2 that updates the USB kaweth driver to
the latest version.  It fixes the following problems:
	- a memory allocation bug,
	- a SMP deadlock,
	- synchronous unlink with a spinlock held,
	- a memory leak without firmware,
	- freeing urbs without unlinking
This patch was done by Oliver Neukum.

thanks,

greg k-h



diff -Nru a/drivers/usb/kaweth.c b/drivers/usb/kaweth.c
--- a/drivers/usb/kaweth.c	Mon Mar  4 08:48:58 2002
+++ b/drivers/usb/kaweth.c	Mon Mar  4 08:48:58 2002
@@ -238,8 +238,7 @@
 		return -EBUSY;
 	}
 
-	dr = kmalloc(sizeof(devrequest), 
-                     in_interrupt() ? GFP_ATOMIC : GFP_KERNEL);
+	dr = kmalloc(sizeof(devrequest), GFP_ATOMIC);
 
 	if(!dr)
 	{
@@ -587,14 +586,10 @@
 {
 	struct kaweth_device *kaweth = urb->context;
 
-	spin_lock(&kaweth->device_lock);
-
 	if (urb->status)
 		kaweth_dbg("%s: TX status %d.", kaweth->net->name, urb->status);
 
 	netif_wake_queue(kaweth->net);
-
-	spin_unlock(&kaweth->device_lock);
 }
 
 /****************************************************************
@@ -722,6 +717,7 @@
 	kaweth->stats.tx_errors++;
 	net->trans_start = jiffies;
 
+	kaweth->tx_urb->transfer_flags |= USB_ASYNC_UNLINK;
 	usb_unlink_urb(kaweth->tx_urb);
 }
 
@@ -825,6 +821,7 @@
 
 		/* Device will now disappear for a moment...  */
 		kaweth_info("Firmware loaded.  I'll be back...");
+		kfree(kaweth);
 		return NULL;
 	}
 
@@ -926,6 +923,9 @@
 		kaweth_warn("unregistering non-existant device");
 		return;
 	}
+
+	usb_unlink_urb(kaweth->rx_urb);
+	usb_unlink_urb(kaweth->tx_urb);
 
 	if(kaweth->net) {
 		if(kaweth->net->flags & IFF_UP) {

