aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hid/usbhid
diff options
context:
space:
mode:
authorMing Lei <ming.lei@canonical.com>2013-03-15 00:08:55 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-03-25 13:55:46 -0400
commit37093b7017a281b85dc523fdcf99418a564e1cd4 (patch)
treeebf6b391efb1e7f8c83a01d6e2b4dcce76a04ba1 /drivers/hid/usbhid
parent93e4f47f4d1a3483f009202e8a66a3a08de5c4b6 (diff)
USBHID: don't recover device if suspend fails in system sleep
If suspend callback fails in system sleep context, usb core will ignore the failure and let the system sleep go ahead further, so this patch doesn't recover device under this situation, otherwise may cause resume() confused. Acked-by: Jiri Kosina <jkosina@suse.cz> Signed-off-by: Ming Lei <ming.lei@canonical.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/hid/usbhid')
-rw-r--r--drivers/hid/usbhid/hid-core.c14
1 files changed, 5 insertions, 9 deletions
diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c
index 8e0c4bf94ebc..1f9e56bfeaa0 100644
--- a/drivers/hid/usbhid/hid-core.c
+++ b/drivers/hid/usbhid/hid-core.c
@@ -1493,7 +1493,7 @@ static int hid_suspend(struct usb_interface *intf, pm_message_t message)
1493{ 1493{
1494 struct hid_device *hid = usb_get_intfdata(intf); 1494 struct hid_device *hid = usb_get_intfdata(intf);
1495 struct usbhid_device *usbhid = hid->driver_data; 1495 struct usbhid_device *usbhid = hid->driver_data;
1496 int status; 1496 int status = 0;
1497 bool driver_suspended = false; 1497 bool driver_suspended = false;
1498 1498
1499 if (PMSG_IS_AUTO(message)) { 1499 if (PMSG_IS_AUTO(message)) {
@@ -1520,19 +1520,15 @@ static int hid_suspend(struct usb_interface *intf, pm_message_t message)
1520 } 1520 }
1521 1521
1522 } else { 1522 } else {
1523 if (hid->driver && hid->driver->suspend) { 1523 /* TODO: resume() might need to handle suspend failure */
1524 if (hid->driver && hid->driver->suspend)
1524 status = hid->driver->suspend(hid, message); 1525 status = hid->driver->suspend(hid, message);
1525 if (status < 0)
1526 return status;
1527 }
1528 driver_suspended = true; 1526 driver_suspended = true;
1529 spin_lock_irq(&usbhid->lock); 1527 spin_lock_irq(&usbhid->lock);
1530 set_bit(HID_SUSPENDED, &usbhid->iofl); 1528 set_bit(HID_SUSPENDED, &usbhid->iofl);
1531 spin_unlock_irq(&usbhid->lock); 1529 spin_unlock_irq(&usbhid->lock);
1532 if (usbhid_wait_io(hid) < 0) { 1530 if (usbhid_wait_io(hid) < 0)
1533 status = -EIO; 1531 status = -EIO;
1534 goto failed;
1535 }
1536 } 1532 }
1537 1533
1538 hid_cancel_delayed_stuff(usbhid); 1534 hid_cancel_delayed_stuff(usbhid);
@@ -1544,7 +1540,7 @@ static int hid_suspend(struct usb_interface *intf, pm_message_t message)
1544 goto failed; 1540 goto failed;
1545 } 1541 }
1546 dev_dbg(&intf->dev, "suspend\n"); 1542 dev_dbg(&intf->dev, "suspend\n");
1547 return 0; 1543 return status;
1548 1544
1549 failed: 1545 failed:
1550 hid_resume_common(hid, driver_suspended); 1546 hid_resume_common(hid, driver_suspended);