struct usb_ctrlrequest  *reqp;
        struct subcase          *subcase;
        int                     status = urb->status;
+       unsigned long           flags;
 
        reqp = (struct usb_ctrlrequest *)urb->setup_packet;
        subcase = container_of(reqp, struct subcase, setup);
 
-       spin_lock(&ctx->lock);
+       spin_lock_irqsave(&ctx->lock, flags);
        ctx->count--;
        ctx->pending--;
 
        /* signal completion when nothing's queued */
        if (ctx->pending == 0)
                complete(&ctx->complete);
-       spin_unlock(&ctx->lock);
+       spin_unlock_irqrestore(&ctx->lock, flags);
 }
 
 static int
 static void complicated_callback(struct urb *urb)
 {
        struct transfer_context *ctx = urb->context;
+       unsigned long flags;
 
-       spin_lock(&ctx->lock);
+       spin_lock_irqsave(&ctx->lock, flags);
        ctx->count--;
 
        ctx->packet_count += urb->number_of_packets;
                complete(&ctx->done);
        }
 done:
-       spin_unlock(&ctx->lock);
+       spin_unlock_irqrestore(&ctx->lock, flags);
 }
 
 static struct urb *iso_alloc_urb(