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
                 * 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;
                        } 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() */
        if (!io->count)
                complete(&io->complete);
 
-       spin_unlock(&io->lock);
+       spin_unlock_irqrestore(&io->lock, flags);
 }