# This is a BitKeeper generated patch for the following project:
# Project Name: Linux kernel tree
# This patch format is intended for GNU patch command version 2.5 or higher.
# This patch includes the following deltas:
# ChangeSet 1.689 -> 1.690
# drivers/usb/kaweth.c 1.15 -> 1.16
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 02/09/26 [EMAIL PROTECTED] 1.690
# [PATCH] USB: fixes for kaweth
#
# this fixes a few SMP locking issues for kaweth.
# --------------------------------------------
#
diff -Nru a/drivers/usb/kaweth.c b/drivers/usb/kaweth.c
--- a/drivers/usb/kaweth.c Mon Sep 30 10:47:01 2002
+++ b/drivers/usb/kaweth.c Mon Sep 30 10:47:01 2002
@@ -495,6 +495,7 @@
static void kaweth_resubmit_rx_urb(struct kaweth_device *kaweth)
{
int result;
+ long flags;
FILL_BULK_URB(kaweth->rx_urb,
kaweth->dev,
@@ -504,13 +505,17 @@
kaweth_usb_receive,
kaweth);
- if((result = usb_submit_urb(kaweth->rx_urb))) {
- if (result == -ENOMEM)
- kaweth->suspend_lowmem = 1;
- kaweth_err("resubmitting rx_urb %d failed", result);
- } else {
- kaweth->suspend_lowmem = 0;
+ spin_lock_irqsave(&kaweth->device_lock, flags);
+ if (!kaweth->removed) { /* no resubmit if disconnecting */
+ if((result = usb_submit_urb(kaweth->rx_urb))) {
+ if (result == -ENOMEM)
+ kaweth->suspend_lowmem = 1;
+ kaweth_err("resubmitting rx_urb %d failed", result);
+ } else {
+ kaweth->suspend_lowmem = 0;
+ }
}
+ spin_unlock_irqrestore(&kaweth->device_lock, flags);
}
static void kaweth_async_set_rx_mode(struct kaweth_device *kaweth);
@@ -625,8 +630,10 @@
struct kaweth_device *kaweth = net->priv;
netif_stop_queue(net);
-
+
+ spin_lock_irq(&kaweth->device_lock);
kaweth->status |= KAWETH_STATUS_CLOSING;
+ spin_unlock_irq(&kaweth->device_lock);
usb_unlink_urb(kaweth->irq_urb);
usb_unlink_urb(kaweth->rx_urb);
@@ -1065,12 +1072,12 @@
usb_unlink_urb(kaweth->rx_urb);
/* we need to wait for the urb to be cancelled, if it is active */
- spin_lock(&kaweth->device_lock);
+ spin_lock_irq(&kaweth->device_lock);
if (usb_unlink_urb(kaweth->tx_urb) == -EINPROGRESS) {
- spin_unlock(&kaweth->device_lock);
+ spin_unlock_irq(&kaweth->device_lock);
wait_event(kaweth->term_wait, kaweth->end);
} else {
- spin_unlock(&kaweth->device_lock);
+ spin_unlock_irq(&kaweth->device_lock);
}
if(kaweth->net) {
-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel