ChangeSet 1.1024, 2003/03/05 14:33:27-08:00, [EMAIL PROTECTED]
[PATCH] USB: call hcd->stop() in task context
This is the 2.4 version of a fix that's been in 2.5 for some
time now: when an HCD dies a premature death, its cleanup
needs to be done in a task context. The most likely case for
that would be physical cardbus eject without driver shutdown.
drivers/usb/hcd.c | 11 ++++++++++-
drivers/usb/hcd.h | 1 +
2 files changed, 11 insertions(+), 1 deletion(-)
diff -Nru a/drivers/usb/hcd.c b/drivers/usb/hcd.c
--- a/drivers/usb/hcd.c Thu Mar 6 14:22:56 2003
+++ b/drivers/usb/hcd.c Thu Mar 6 14:22:56 2003
@@ -935,6 +935,12 @@
/*-------------------------------------------------------------------------*/
+static void hcd_panic (void *_hcd)
+{
+ struct usb_hcd *hcd = _hcd;
+ hcd->driver->stop (hcd);
+}
+
static void hc_died (struct usb_hcd *hcd)
{
struct list_head *devlist, *urblist;
@@ -962,7 +968,10 @@
if (urb)
rh_status_dequeue (hcd, urb);
- hcd->driver->stop (hcd);
+
+ /* hcd->stop() needs a task context */
+ INIT_TQUEUE (&hcd->work, hcd_panic, hcd);
+ (void) schedule_task (&hcd->work);
}
/*-------------------------------------------------------------------------*/
diff -Nru a/drivers/usb/hcd.h b/drivers/usb/hcd.h
--- a/drivers/usb/hcd.h Thu Mar 6 14:22:56 2003
+++ b/drivers/usb/hcd.h Thu Mar 6 14:22:56 2003
@@ -41,6 +41,7 @@
struct timer_list rh_timer; /* drives root hub */
struct list_head dev_list; /* devices on this bus */
+ struct tq_struct work;
/*
* hardware info/state
-------------------------------------------------------
This SF.net email is sponsored by: Etnus, makers of TotalView, The debugger
for complex code. Debugging C/C++ programs can leave you feeling lost and
disoriented. TotalView can help you find your way. Available on major UNIX
and Linux platforms. Try it free. www.etnus.com
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel