Hi.

Only compile tested. Any feedback welcome.

--- c/drivers/usb/serial/whiteheat.c    2004-02-04 10:06:59.000000000 +0100
+++ a/drivers/usb/serial/whiteheat.c    2004-03-21 02:09:15.000000000 +0100
@@ -1132,6 +1132,7 @@ static int firm_send_command (struct usb
        __u8 *transfer_buffer;
        int retval = 0;
        unsigned long flags;
+       DECLARE_WAITQUEUE(wait, current);
 
        dbg("%s - command %d", __FUNCTION__, command);
 
@@ -1146,7 +1147,6 @@ static int firm_send_command (struct usb
        command_port->write_urb->transfer_buffer_length = datasize + 1;
        command_port->write_urb->dev = port->serial->dev;
        retval = usb_submit_urb (command_port->write_urb, GFP_KERNEL);
-       spin_unlock_irqrestore(&command_info->lock, flags);
        if (retval) {
                dbg("%s - submit urb failed", __FUNCTION__);
                goto exit;
@@ -1154,11 +1154,23 @@ static int firm_send_command (struct usb
 
        /* wait for the command to complete */
        timeout = COMMAND_TIMEOUT;
-       while (timeout && (command_info->command_finished == FALSE)) {
-               timeout = interruptible_sleep_on_timeout (&command_info->wait_command, 
timeout);
+       add_wait_queue(&command_info->wait_command, &wait);
+       for (;;) {
+               set_task_state(current, TASK_INTERRUPTIBLE);
+               if (command_info->command_finished != FALSE)
+                       break;
+               spin_unlock_irqrestore(&command_info->lock, flags);
+               timeout = schedule_timeout(timeout);
+               if (signal_pending(current)) {
+                       remove_wait_queue(&command_info->wait_command, &wait);
+                       return -EINTR;
+               }
+               spin_lock_irqsave(&command_info->lock, flags);
+               if (!timeout)
+                       break;
        }
-
-       spin_lock_irqsave(&command_info->lock, flags);
+       set_task_state(current, TASK_RUNNING);
+       remove_wait_queue(&command_info->wait_command, &wait);
 
        if (command_info->command_finished == FALSE) {
                dbg("%s - command timed out.", __FUNCTION__);


-------------------------------------------------------
This SF.Net email is sponsored by: IBM Linux Tutorials
Free Linux tutorial presented by Daniel Robbins, President and CEO of
GenToo technologies. Learn everything from fundamentals to system
administration.http://ads.osdn.com/?ad_id=1470&alloc_id=3638&op=click
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to