<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">ChangeSet 1.1024, 2003/03/05 14:33:27-08:00, david-b@pacbell.net

[PATCH] USB: call hcd-&gt;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-&gt;driver-&gt;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-&gt;driver-&gt;stop (hcd);
+
+	/* hcd-&gt;stop() needs a task context */
+	INIT_TQUEUE (&amp;hcd-&gt;work, hcd_panic, hcd);
+	(void) schedule_task (&amp;hcd-&gt;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
</pre></body></html>