aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/hid/usbhid/hid-core.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c
index af0e0d061b15..11103efebbaa 100644
--- a/drivers/hid/usbhid/hid-core.c
+++ b/drivers/hid/usbhid/hid-core.c
@@ -480,6 +480,7 @@ static void hid_ctrl(struct urb *urb)
480{ 480{
481 struct hid_device *hid = urb->context; 481 struct hid_device *hid = urb->context;
482 struct usbhid_device *usbhid = hid->driver_data; 482 struct usbhid_device *usbhid = hid->driver_data;
483 unsigned long flags;
483 int unplug = 0, status = urb->status; 484 int unplug = 0, status = urb->status;
484 485
485 switch (status) { 486 switch (status) {
@@ -501,7 +502,7 @@ static void hid_ctrl(struct urb *urb)
501 hid_warn(urb->dev, "ctrl urb status %d received\n", status); 502 hid_warn(urb->dev, "ctrl urb status %d received\n", status);
502 } 503 }
503 504
504 spin_lock(&usbhid->lock); 505 spin_lock_irqsave(&usbhid->lock, flags);
505 506
506 if (unplug) { 507 if (unplug) {
507 usbhid->ctrltail = usbhid->ctrlhead; 508 usbhid->ctrltail = usbhid->ctrlhead;
@@ -511,13 +512,13 @@ static void hid_ctrl(struct urb *urb)
511 if (usbhid->ctrlhead != usbhid->ctrltail && 512 if (usbhid->ctrlhead != usbhid->ctrltail &&
512 hid_submit_ctrl(hid) == 0) { 513 hid_submit_ctrl(hid) == 0) {
513 /* Successfully submitted next urb in queue */ 514 /* Successfully submitted next urb in queue */
514 spin_unlock(&usbhid->lock); 515 spin_unlock_irqrestore(&usbhid->lock, flags);
515 return; 516 return;
516 } 517 }
517 } 518 }
518 519
519 clear_bit(HID_CTRL_RUNNING, &usbhid->iofl); 520 clear_bit(HID_CTRL_RUNNING, &usbhid->iofl);
520 spin_unlock(&usbhid->lock); 521 spin_unlock_irqrestore(&usbhid->lock, flags);
521 usb_autopm_put_interface_async(usbhid->intf); 522 usb_autopm_put_interface_async(usbhid->intf);
522 wake_up(&usbhid->wait); 523 wake_up(&usbhid->wait);
523} 524}