|
@@ -269,10 +269,11 @@ static void sg_clean(struct usb_sg_request *io)
|
|
|
|
|
|
static void sg_complete(struct urb *urb)
|
|
|
{
|
|
|
+ unsigned long flags;
|
|
|
struct usb_sg_request *io = urb->context;
|
|
|
int status = urb->status;
|
|
|
|
|
|
- spin_lock(&io->lock);
|
|
|
+ spin_lock_irqsave(&io->lock, flags);
|
|
|
|
|
|
/* In 2.5 we require hcds' endpoint queues not to progress after fault
|
|
|
* reports, until the completion callback (this!) returns. That lets
|
|
@@ -306,7 +307,7 @@ static void sg_complete(struct urb *urb)
|
|
|
* unlink pending urbs so they won't rx/tx bad data.
|
|
|
* careful: unlink can sometimes be synchronous...
|
|
|
*/
|
|
|
- spin_unlock(&io->lock);
|
|
|
+ spin_unlock_irqrestore(&io->lock, flags);
|
|
|
for (i = 0, found = 0; i < io->entries; i++) {
|
|
|
if (!io->urbs[i])
|
|
|
continue;
|
|
@@ -323,7 +324,7 @@ static void sg_complete(struct urb *urb)
|
|
|
} else if (urb == io->urbs[i])
|
|
|
found = 1;
|
|
|
}
|
|
|
- spin_lock(&io->lock);
|
|
|
+ spin_lock_irqsave(&io->lock, flags);
|
|
|
}
|
|
|
|
|
|
/* on the last completion, signal usb_sg_wait() */
|
|
@@ -332,7 +333,7 @@ static void sg_complete(struct urb *urb)
|
|
|
if (!io->count)
|
|
|
complete(&io->complete);
|
|
|
|
|
|
- spin_unlock(&io->lock);
|
|
|
+ spin_unlock_irqrestore(&io->lock, flags);
|
|
|
}
|
|
|
|
|
|
|