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