]> git.neil.brown.name Git - history.git/commitdiff
[PATCH] usb: remove some sleep_on's
authorArjan van de Ven <arjanv@redhat.com>
Mon, 26 Jan 2004 08:46:29 +0000 (00:46 -0800)
committerGreg Kroah-Hartman <greg@kroah.com>
Mon, 26 Jan 2004 08:46:29 +0000 (00:46 -0800)
sleep_on must die.... and it fixes a few races too ;)

drivers/usb/media/dabusb.c
drivers/usb/misc/auerswald.c
drivers/usb/misc/tiglusb.c

index cce0dbb55b7d1dde4f840f0109baf7b0eb273f66..4510ace39d2a4f9306e0c0fbd4a3b9b2c74fcff2 100644 (file)
@@ -781,17 +781,25 @@ static int dabusb_probe (struct usb_interface *intf,
 
 static void dabusb_disconnect (struct usb_interface *intf)
 {
+       wait_queue_t __wait;
        pdabusb_t s = usb_get_intfdata (intf);
 
        dbg("dabusb_disconnect");
-
+       
+       init_waitqueue_entry(&__wait, current);
+       
        usb_set_intfdata (intf, NULL);
        if (s) {
                usb_deregister_dev (intf, &dabusb_class);
                s->remove_pending = 1;
                wake_up (&s->wait);
+               add_wait_queue(&s->remove_ok, &__wait);
+               set_current_state(TASK_UNINTERRUPTIBLE);
                if (s->state == _started)
-                       sleep_on (&s->remove_ok);
+                       schedule();
+               current->state = TASK_RUNNING;
+               remove_wait_queue(&s->remove_ok, &__wait);
+               
                s->usbdev = NULL;
                s->overruns = 0;
        }
index a8f581e58df576cf300debbc44cf77bfe01de8f7..b137da951670e9e2b3791b3ca2bb8b9199f6eede 100644 (file)
@@ -1927,7 +1927,6 @@ static int auerswald_probe (struct usb_interface *intf,
 {
        struct usb_device *usbdev = interface_to_usbdev(intf);
        pauerswald_t cp = NULL;
-       DECLARE_WAIT_QUEUE_HEAD (wqh);
        unsigned int u = 0;
        char *pbuf;
        int ret;
@@ -1975,7 +1974,8 @@ static int auerswald_probe (struct usb_interface *intf,
        dbg ("Version is %X", cp->version);
 
        /* allow some time to settle the device */
-       sleep_on_timeout (&wqh, HZ / 3 );
+       set_current_state(TASK_UNINTERRUPTIBLE);
+       schedule_timeout(HZ/3);
 
        /* Try to get a suitable textual description of the device */
        /* Device name:*/
index 2ebf65f4130fb5bde3d30542968adde09376d4c0..85c32711e768d36a9a22cbb3e3752bc52d833942 100644 (file)
@@ -397,7 +397,11 @@ tiglusb_probe (struct usb_interface *intf,
 static void
 tiglusb_disconnect (struct usb_interface *intf)
 {
+       wait_queue_t __wait;
        ptiglusb_t s = usb_get_intfdata (intf);
+       
+       init_waitqueue_entry(&__wait, current);
+       
 
        usb_set_intfdata (intf, NULL);
        if (!s || !s->dev) {
@@ -407,8 +411,12 @@ tiglusb_disconnect (struct usb_interface *intf)
 
        s->remove_pending = 1;
        wake_up (&s->wait);
+       add_wait_queue(&s->wait, &__wait);
+       set_current_state(TASK_UNINTERRUPTIBLE);
        if (s->state == _started)
-               sleep_on (&s->remove_ok);
+               schedule();
+       current->state = TASK_RUNNING;
+       remove_wait_queue(&s->wait, &__wait);
        down (&s->mutex);
        s->dev = NULL;
        s->opened = 0;