aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-02-14 17:43:27 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-02-14 17:43:27 -0500
commit03a41f3da42b58a84bf06cc624b60922893a45af (patch)
treea47d1280014303d7cea4232439e66cb2d30537a3 /drivers
parent50e5dfb6c4111c860bfa4d93dfe115bedf6b0fb1 (diff)
parent2839f5bcfcfc61f69a36c262107e3cfd6eee9f53 (diff)
Merge tag 'for-usb-next-2012-02-14' of git://git.kernel.org/pub/scm/linux/kernel/git/sarah/xhci into usb-next
Support for USB 3.0 hub suspend. This patchset adds support for suspending external USB 3.0 hubs, and fixes the USB 3.0 device remote wakeup enabling. Hubs are the only USB 3.0 devices on the market right now that do remote wakeup, and they will only send a remote wakeup if they are placed into suspend, so it's not necessary to backport this patchset to stable kernels.
Diffstat (limited to 'drivers')
-rw-r--r--drivers/usb/core/hub.c162
-rw-r--r--drivers/usb/host/xhci-hub.c41
-rw-r--r--drivers/usb/host/xhci-mem.c11
-rw-r--r--drivers/usb/host/xhci-ring.c74
-rw-r--r--drivers/usb/host/xhci.h1
5 files changed, 229 insertions, 60 deletions
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index 2d773cbe191c..d4f062472796 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -62,6 +62,8 @@ struct usb_hub {
62 resumed */ 62 resumed */
63 unsigned long removed_bits[1]; /* ports with a "removed" 63 unsigned long removed_bits[1]; /* ports with a "removed"
64 device present */ 64 device present */
65 unsigned long wakeup_bits[1]; /* ports that have signaled
66 remote wakeup */
65#if USB_MAXCHILDREN > 31 /* 8*sizeof(unsigned long) - 1 */ 67#if USB_MAXCHILDREN > 31 /* 8*sizeof(unsigned long) - 1 */
66#error event_bits[] is too short! 68#error event_bits[] is too short!
67#endif 69#endif
@@ -411,6 +413,29 @@ void usb_kick_khubd(struct usb_device *hdev)
411 kick_khubd(hub); 413 kick_khubd(hub);
412} 414}
413 415
416/*
417 * Let the USB core know that a USB 3.0 device has sent a Function Wake Device
418 * Notification, which indicates it had initiated remote wakeup.
419 *
420 * USB 3.0 hubs do not report the port link state change from U3 to U0 when the
421 * device initiates resume, so the USB core will not receive notice of the
422 * resume through the normal hub interrupt URB.
423 */
424void usb_wakeup_notification(struct usb_device *hdev,
425 unsigned int portnum)
426{
427 struct usb_hub *hub;
428
429 if (!hdev)
430 return;
431
432 hub = hdev_to_hub(hdev);
433 if (hub) {
434 set_bit(portnum, hub->wakeup_bits);
435 kick_khubd(hub);
436 }
437}
438EXPORT_SYMBOL_GPL(usb_wakeup_notification);
414 439
415/* completion function, fires on port status changes and various faults */ 440/* completion function, fires on port status changes and various faults */
416static void hub_irq(struct urb *urb) 441static void hub_irq(struct urb *urb)
@@ -807,12 +832,6 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type)
807 clear_port_feature(hub->hdev, port1, 832 clear_port_feature(hub->hdev, port1,
808 USB_PORT_FEAT_C_ENABLE); 833 USB_PORT_FEAT_C_ENABLE);
809 } 834 }
810 if (portchange & USB_PORT_STAT_C_LINK_STATE) {
811 need_debounce_delay = true;
812 clear_port_feature(hub->hdev, port1,
813 USB_PORT_FEAT_C_PORT_LINK_STATE);
814 }
815
816 if ((portchange & USB_PORT_STAT_C_BH_RESET) && 835 if ((portchange & USB_PORT_STAT_C_BH_RESET) &&
817 hub_is_superspeed(hub->hdev)) { 836 hub_is_superspeed(hub->hdev)) {
818 need_debounce_delay = true; 837 need_debounce_delay = true;
@@ -834,12 +853,19 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type)
834 set_bit(port1, hub->change_bits); 853 set_bit(port1, hub->change_bits);
835 854
836 } else if (portstatus & USB_PORT_STAT_ENABLE) { 855 } else if (portstatus & USB_PORT_STAT_ENABLE) {
856 bool port_resumed = (portstatus &
857 USB_PORT_STAT_LINK_STATE) ==
858 USB_SS_PORT_LS_U0;
837 /* The power session apparently survived the resume. 859 /* The power session apparently survived the resume.
838 * If there was an overcurrent or suspend change 860 * If there was an overcurrent or suspend change
839 * (i.e., remote wakeup request), have khubd 861 * (i.e., remote wakeup request), have khubd
840 * take care of it. 862 * take care of it. Look at the port link state
863 * for USB 3.0 hubs, since they don't have a suspend
864 * change bit, and they don't set the port link change
865 * bit on device-initiated resume.
841 */ 866 */
842 if (portchange) 867 if (portchange || (hub_is_superspeed(hub->hdev) &&
868 port_resumed))
843 set_bit(port1, hub->change_bits); 869 set_bit(port1, hub->change_bits);
844 870
845 } else if (udev->persist_enabled) { 871 } else if (udev->persist_enabled) {
@@ -1289,14 +1315,8 @@ static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id)
1289 desc = intf->cur_altsetting; 1315 desc = intf->cur_altsetting;
1290 hdev = interface_to_usbdev(intf); 1316 hdev = interface_to_usbdev(intf);
1291 1317
1292 /* Hubs have proper suspend/resume support. USB 3.0 device suspend is 1318 /* Hubs have proper suspend/resume support. */
1293 * different from USB 2.0/1.1 device suspend, and unfortunately we 1319 usb_enable_autosuspend(hdev);
1294 * don't support it yet. So leave autosuspend disabled for USB 3.0
1295 * external hubs for now. Enable autosuspend for USB 3.0 roothubs,
1296 * since that isn't a "real" hub.
1297 */
1298 if (!hub_is_superspeed(hdev) || !hdev->parent)
1299 usb_enable_autosuspend(hdev);
1300 1320
1301 if (hdev->level == MAX_TOPO_LEVEL) { 1321 if (hdev->level == MAX_TOPO_LEVEL) {
1302 dev_err(&intf->dev, 1322 dev_err(&intf->dev,
@@ -2421,11 +2441,27 @@ int usb_port_suspend(struct usb_device *udev, pm_message_t msg)
2421 * we don't explicitly enable it here. 2441 * we don't explicitly enable it here.
2422 */ 2442 */
2423 if (udev->do_remote_wakeup) { 2443 if (udev->do_remote_wakeup) {
2424 status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), 2444 if (!hub_is_superspeed(hub->hdev)) {
2425 USB_REQ_SET_FEATURE, USB_RECIP_DEVICE, 2445 status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
2426 USB_DEVICE_REMOTE_WAKEUP, 0, 2446 USB_REQ_SET_FEATURE, USB_RECIP_DEVICE,
2427 NULL, 0, 2447 USB_DEVICE_REMOTE_WAKEUP, 0,
2428 USB_CTRL_SET_TIMEOUT); 2448 NULL, 0,
2449 USB_CTRL_SET_TIMEOUT);
2450 } else {
2451 /* Assume there's only one function on the USB 3.0
2452 * device and enable remote wake for the first
2453 * interface. FIXME if the interface association
2454 * descriptor shows there's more than one function.
2455 */
2456 status = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
2457 USB_REQ_SET_FEATURE,
2458 USB_RECIP_INTERFACE,
2459 USB_INTRF_FUNC_SUSPEND,
2460 USB_INTRF_FUNC_SUSPEND_RW |
2461 USB_INTRF_FUNC_SUSPEND_LP,
2462 NULL, 0,
2463 USB_CTRL_SET_TIMEOUT);
2464 }
2429 if (status) { 2465 if (status) {
2430 dev_dbg(&udev->dev, "won't remote wakeup, status %d\n", 2466 dev_dbg(&udev->dev, "won't remote wakeup, status %d\n",
2431 status); 2467 status);
@@ -2715,6 +2751,7 @@ static int hub_suspend(struct usb_interface *intf, pm_message_t msg)
2715 struct usb_hub *hub = usb_get_intfdata (intf); 2751 struct usb_hub *hub = usb_get_intfdata (intf);
2716 struct usb_device *hdev = hub->hdev; 2752 struct usb_device *hdev = hub->hdev;
2717 unsigned port1; 2753 unsigned port1;
2754 int status;
2718 2755
2719 /* Warn if children aren't already suspended */ 2756 /* Warn if children aren't already suspended */
2720 for (port1 = 1; port1 <= hdev->maxchild; port1++) { 2757 for (port1 = 1; port1 <= hdev->maxchild; port1++) {
@@ -2727,6 +2764,17 @@ static int hub_suspend(struct usb_interface *intf, pm_message_t msg)
2727 return -EBUSY; 2764 return -EBUSY;
2728 } 2765 }
2729 } 2766 }
2767 if (hub_is_superspeed(hdev) && hdev->do_remote_wakeup) {
2768 /* Enable hub to send remote wakeup for all ports. */
2769 for (port1 = 1; port1 <= hdev->maxchild; port1++) {
2770 status = set_port_feature(hdev,
2771 port1 |
2772 USB_PORT_FEAT_REMOTE_WAKE_CONNECT |
2773 USB_PORT_FEAT_REMOTE_WAKE_DISCONNECT |
2774 USB_PORT_FEAT_REMOTE_WAKE_OVER_CURRENT,
2775 USB_PORT_FEAT_REMOTE_WAKE_MASK);
2776 }
2777 }
2730 2778
2731 dev_dbg(&intf->dev, "%s\n", __func__); 2779 dev_dbg(&intf->dev, "%s\n", __func__);
2732 2780
@@ -3460,6 +3508,46 @@ done:
3460 hcd->driver->relinquish_port(hcd, port1); 3508 hcd->driver->relinquish_port(hcd, port1);
3461} 3509}
3462 3510
3511/* Returns 1 if there was a remote wakeup and a connect status change. */
3512static int hub_handle_remote_wakeup(struct usb_hub *hub, unsigned int port,
3513 u16 portstatus, u16 portchange)
3514{
3515 struct usb_device *hdev;
3516 struct usb_device *udev;
3517 int connect_change = 0;
3518 int ret;
3519
3520 hdev = hub->hdev;
3521 udev = hdev->children[port-1];
3522 if (!hub_is_superspeed(hdev)) {
3523 if (!(portchange & USB_PORT_STAT_C_SUSPEND))
3524 return 0;
3525 clear_port_feature(hdev, port, USB_PORT_FEAT_C_SUSPEND);
3526 } else {
3527 if (!udev || udev->state != USB_STATE_SUSPENDED ||
3528 (portstatus & USB_PORT_STAT_LINK_STATE) !=
3529 USB_SS_PORT_LS_U0)
3530 return 0;
3531 }
3532
3533 if (udev) {
3534 /* TRSMRCY = 10 msec */
3535 msleep(10);
3536
3537 usb_lock_device(udev);
3538 ret = usb_remote_wakeup(udev);
3539 usb_unlock_device(udev);
3540 if (ret < 0)
3541 connect_change = 1;
3542 } else {
3543 ret = -ENODEV;
3544 hub_port_disable(hub, port, 1);
3545 }
3546 dev_dbg(hub->intfdev, "resume on port %d, status %d\n",
3547 port, ret);
3548 return connect_change;
3549}
3550
3463static void hub_events(void) 3551static void hub_events(void)
3464{ 3552{
3465 struct list_head *tmp; 3553 struct list_head *tmp;
@@ -3472,7 +3560,7 @@ static void hub_events(void)
3472 u16 portstatus; 3560 u16 portstatus;
3473 u16 portchange; 3561 u16 portchange;
3474 int i, ret; 3562 int i, ret;
3475 int connect_change; 3563 int connect_change, wakeup_change;
3476 3564
3477 /* 3565 /*
3478 * We restart the list every time to avoid a deadlock with 3566 * We restart the list every time to avoid a deadlock with
@@ -3551,8 +3639,9 @@ static void hub_events(void)
3551 if (test_bit(i, hub->busy_bits)) 3639 if (test_bit(i, hub->busy_bits))
3552 continue; 3640 continue;
3553 connect_change = test_bit(i, hub->change_bits); 3641 connect_change = test_bit(i, hub->change_bits);
3642 wakeup_change = test_and_clear_bit(i, hub->wakeup_bits);
3554 if (!test_and_clear_bit(i, hub->event_bits) && 3643 if (!test_and_clear_bit(i, hub->event_bits) &&
3555 !connect_change) 3644 !connect_change && !wakeup_change)
3556 continue; 3645 continue;
3557 3646
3558 ret = hub_port_status(hub, i, 3647 ret = hub_port_status(hub, i,
@@ -3593,31 +3682,10 @@ static void hub_events(void)
3593 } 3682 }
3594 } 3683 }
3595 3684
3596 if (portchange & USB_PORT_STAT_C_SUSPEND) { 3685 if (hub_handle_remote_wakeup(hub, i,
3597 struct usb_device *udev; 3686 portstatus, portchange))
3687 connect_change = 1;
3598 3688
3599 clear_port_feature(hdev, i,
3600 USB_PORT_FEAT_C_SUSPEND);
3601 udev = hdev->children[i-1];
3602 if (udev) {
3603 /* TRSMRCY = 10 msec */
3604 msleep(10);
3605
3606 usb_lock_device(udev);
3607 ret = usb_remote_wakeup(hdev->
3608 children[i-1]);
3609 usb_unlock_device(udev);
3610 if (ret < 0)
3611 connect_change = 1;
3612 } else {
3613 ret = -ENODEV;
3614 hub_port_disable(hub, i, 1);
3615 }
3616 dev_dbg (hub_dev,
3617 "resume on port %d, status %d\n",
3618 i, ret);
3619 }
3620
3621 if (portchange & USB_PORT_STAT_C_OVERCURRENT) { 3689 if (portchange & USB_PORT_STAT_C_OVERCURRENT) {
3622 u16 status = 0; 3690 u16 status = 0;
3623 u16 unused; 3691 u16 unused;
diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c
index 557b6f32db86..673ad120c43e 100644
--- a/drivers/usb/host/xhci-hub.c
+++ b/drivers/usb/host/xhci-hub.c
@@ -422,6 +422,32 @@ void xhci_set_link_state(struct xhci_hcd *xhci, __le32 __iomem **port_array,
422 xhci_writel(xhci, temp, port_array[port_id]); 422 xhci_writel(xhci, temp, port_array[port_id]);
423} 423}
424 424
425void xhci_set_remote_wake_mask(struct xhci_hcd *xhci,
426 __le32 __iomem **port_array, int port_id, u16 wake_mask)
427{
428 u32 temp;
429
430 temp = xhci_readl(xhci, port_array[port_id]);
431 temp = xhci_port_state_to_neutral(temp);
432
433 if (wake_mask & USB_PORT_FEAT_REMOTE_WAKE_CONNECT)
434 temp |= PORT_WKCONN_E;
435 else
436 temp &= ~PORT_WKCONN_E;
437
438 if (wake_mask & USB_PORT_FEAT_REMOTE_WAKE_DISCONNECT)
439 temp |= PORT_WKDISC_E;
440 else
441 temp &= ~PORT_WKDISC_E;
442
443 if (wake_mask & USB_PORT_FEAT_REMOTE_WAKE_OVER_CURRENT)
444 temp |= PORT_WKOC_E;
445 else
446 temp &= ~PORT_WKOC_E;
447
448 xhci_writel(xhci, temp, port_array[port_id]);
449}
450
425/* Test and clear port RWC bit */ 451/* Test and clear port RWC bit */
426void xhci_test_and_clear_bit(struct xhci_hcd *xhci, __le32 __iomem **port_array, 452void xhci_test_and_clear_bit(struct xhci_hcd *xhci, __le32 __iomem **port_array,
427 int port_id, u32 port_bit) 453 int port_id, u32 port_bit)
@@ -448,6 +474,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
448 int slot_id; 474 int slot_id;
449 struct xhci_bus_state *bus_state; 475 struct xhci_bus_state *bus_state;
450 u16 link_state = 0; 476 u16 link_state = 0;
477 u16 wake_mask = 0;
451 478
452 max_ports = xhci_get_ports(hcd, &port_array); 479 max_ports = xhci_get_ports(hcd, &port_array);
453 bus_state = &xhci->bus_state[hcd_index(hcd)]; 480 bus_state = &xhci->bus_state[hcd_index(hcd)];
@@ -593,6 +620,8 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
593 case SetPortFeature: 620 case SetPortFeature:
594 if (wValue == USB_PORT_FEAT_LINK_STATE) 621 if (wValue == USB_PORT_FEAT_LINK_STATE)
595 link_state = (wIndex & 0xff00) >> 3; 622 link_state = (wIndex & 0xff00) >> 3;
623 if (wValue == USB_PORT_FEAT_REMOTE_WAKE_MASK)
624 wake_mask = wIndex & 0xff00;
596 wIndex &= 0xff; 625 wIndex &= 0xff;
597 if (!wIndex || wIndex > max_ports) 626 if (!wIndex || wIndex > max_ports)
598 goto error; 627 goto error;
@@ -703,6 +732,14 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
703 temp = xhci_readl(xhci, port_array[wIndex]); 732 temp = xhci_readl(xhci, port_array[wIndex]);
704 xhci_dbg(xhci, "set port reset, actual port %d status = 0x%x\n", wIndex, temp); 733 xhci_dbg(xhci, "set port reset, actual port %d status = 0x%x\n", wIndex, temp);
705 break; 734 break;
735 case USB_PORT_FEAT_REMOTE_WAKE_MASK:
736 xhci_set_remote_wake_mask(xhci, port_array,
737 wIndex, wake_mask);
738 temp = xhci_readl(xhci, port_array[wIndex]);
739 xhci_dbg(xhci, "set port remote wake mask, "
740 "actual port %d status = 0x%x\n",
741 wIndex, temp);
742 break;
706 case USB_PORT_FEAT_BH_PORT_RESET: 743 case USB_PORT_FEAT_BH_PORT_RESET:
707 temp |= PORT_WR; 744 temp |= PORT_WR;
708 xhci_writel(xhci, temp, port_array[wIndex]); 745 xhci_writel(xhci, temp, port_array[wIndex]);
@@ -883,6 +920,10 @@ int xhci_bus_suspend(struct usb_hcd *hcd)
883 t2 |= PORT_LINK_STROBE | XDEV_U3; 920 t2 |= PORT_LINK_STROBE | XDEV_U3;
884 set_bit(port_index, &bus_state->bus_suspended); 921 set_bit(port_index, &bus_state->bus_suspended);
885 } 922 }
923 /* USB core sets remote wake mask for USB 3.0 hubs,
924 * including the USB 3.0 roothub, but only if CONFIG_USB_SUSPEND
925 * is enabled, so also enable remote wake here.
926 */
886 if (hcd->self.root_hub->do_remote_wakeup) { 927 if (hcd->self.root_hub->do_remote_wakeup) {
887 if (t1 & PORT_CONNECT) { 928 if (t1 & PORT_CONNECT) {
888 t2 |= PORT_WKOC_E | PORT_WKDISC_E; 929 t2 |= PORT_WKOC_E | PORT_WKDISC_E;
diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c
index 36cbe2226a44..6b70e7fb484c 100644
--- a/drivers/usb/host/xhci-mem.c
+++ b/drivers/usb/host/xhci-mem.c
@@ -2141,7 +2141,7 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags)
2141 unsigned int val, val2; 2141 unsigned int val, val2;
2142 u64 val_64; 2142 u64 val_64;
2143 struct xhci_segment *seg; 2143 struct xhci_segment *seg;
2144 u32 page_size; 2144 u32 page_size, temp;
2145 int i; 2145 int i;
2146 2146
2147 page_size = xhci_readl(xhci, &xhci->op_regs->page_size); 2147 page_size = xhci_readl(xhci, &xhci->op_regs->page_size);
@@ -2324,6 +2324,15 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags)
2324 2324
2325 INIT_LIST_HEAD(&xhci->lpm_failed_devs); 2325 INIT_LIST_HEAD(&xhci->lpm_failed_devs);
2326 2326
2327 /* Enable USB 3.0 device notifications for function remote wake, which
2328 * is necessary for allowing USB 3.0 devices to do remote wakeup from
2329 * U3 (device suspend).
2330 */
2331 temp = xhci_readl(xhci, &xhci->op_regs->dev_notification);
2332 temp &= ~DEV_NOTE_MASK;
2333 temp |= DEV_NOTE_FWAKE;
2334 xhci_writel(xhci, temp, &xhci->op_regs->dev_notification);
2335
2327 return 0; 2336 return 0;
2328 2337
2329fail: 2338fail:
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
index b62037bff688..3a033240ec64 100644
--- a/drivers/usb/host/xhci-ring.c
+++ b/drivers/usb/host/xhci-ring.c
@@ -1237,6 +1237,26 @@ static unsigned int find_faked_portnum_from_hw_portnum(struct usb_hcd *hcd,
1237 return num_similar_speed_ports; 1237 return num_similar_speed_ports;
1238} 1238}
1239 1239
1240static void handle_device_notification(struct xhci_hcd *xhci,
1241 union xhci_trb *event)
1242{
1243 u32 slot_id;
1244 struct usb_device *udev;
1245
1246 slot_id = TRB_TO_SLOT_ID(event->generic.field[3]);
1247 if (!xhci->devs[slot_id]) {
1248 xhci_warn(xhci, "Device Notification event for "
1249 "unused slot %u\n", slot_id);
1250 return;
1251 }
1252
1253 xhci_dbg(xhci, "Device Wake Notification event for slot ID %u\n",
1254 slot_id);
1255 udev = xhci->devs[slot_id]->udev;
1256 if (udev && udev->parent)
1257 usb_wakeup_notification(udev->parent, udev->portnum);
1258}
1259
1240static void handle_port_status(struct xhci_hcd *xhci, 1260static void handle_port_status(struct xhci_hcd *xhci,
1241 union xhci_trb *event) 1261 union xhci_trb *event)
1242{ 1262{
@@ -1321,20 +1341,21 @@ static void handle_port_status(struct xhci_hcd *xhci,
1321 } 1341 }
1322 1342
1323 if (DEV_SUPERSPEED(temp)) { 1343 if (DEV_SUPERSPEED(temp)) {
1324 xhci_dbg(xhci, "resume SS port %d\n", port_id); 1344 xhci_dbg(xhci, "remote wake SS port %d\n", port_id);
1345 /* Set a flag to say the port signaled remote wakeup,
1346 * so we can tell the difference between the end of
1347 * device and host initiated resume.
1348 */
1349 bus_state->port_remote_wakeup |= 1 << faked_port_index;
1350 xhci_test_and_clear_bit(xhci, port_array,
1351 faked_port_index, PORT_PLC);
1325 xhci_set_link_state(xhci, port_array, faked_port_index, 1352 xhci_set_link_state(xhci, port_array, faked_port_index,
1326 XDEV_U0); 1353 XDEV_U0);
1327 slot_id = xhci_find_slot_id_by_port(hcd, xhci, 1354 /* Need to wait until the next link state change
1328 faked_port_index + 1); 1355 * indicates the device is actually in U0.
1329 if (!slot_id) { 1356 */
1330 xhci_dbg(xhci, "slot_id is zero\n"); 1357 bogus_port_status = true;
1331 goto cleanup; 1358 goto cleanup;
1332 }
1333 xhci_ring_device(xhci, slot_id);
1334 xhci_dbg(xhci, "resume SS port %d finished\n", port_id);
1335 /* Clear PORT_PLC */
1336 xhci_test_and_clear_bit(xhci, port_array,
1337 faked_port_index, PORT_PLC);
1338 } else { 1359 } else {
1339 xhci_dbg(xhci, "resume HS port %d\n", port_id); 1360 xhci_dbg(xhci, "resume HS port %d\n", port_id);
1340 bus_state->resume_done[faked_port_index] = jiffies + 1361 bus_state->resume_done[faked_port_index] = jiffies +
@@ -1345,6 +1366,32 @@ static void handle_port_status(struct xhci_hcd *xhci,
1345 } 1366 }
1346 } 1367 }
1347 1368
1369 if ((temp & PORT_PLC) && (temp & PORT_PLS_MASK) == XDEV_U0 &&
1370 DEV_SUPERSPEED(temp)) {
1371 xhci_dbg(xhci, "resume SS port %d finished\n", port_id);
1372 /* We've just brought the device into U0 through either the
1373 * Resume state after a device remote wakeup, or through the
1374 * U3Exit state after a host-initiated resume. If it's a device
1375 * initiated remote wake, don't pass up the link state change,
1376 * so the roothub behavior is consistent with external
1377 * USB 3.0 hub behavior.
1378 */
1379 slot_id = xhci_find_slot_id_by_port(hcd, xhci,
1380 faked_port_index + 1);
1381 if (slot_id && xhci->devs[slot_id])
1382 xhci_ring_device(xhci, slot_id);
1383 if (bus_state->port_remote_wakeup && (1 << faked_port_index)) {
1384 bus_state->port_remote_wakeup &=
1385 ~(1 << faked_port_index);
1386 xhci_test_and_clear_bit(xhci, port_array,
1387 faked_port_index, PORT_PLC);
1388 usb_wakeup_notification(hcd->self.root_hub,
1389 faked_port_index + 1);
1390 bogus_port_status = true;
1391 goto cleanup;
1392 }
1393 }
1394
1348 if (hcd->speed != HCD_USB3) 1395 if (hcd->speed != HCD_USB3)
1349 xhci_test_and_clear_bit(xhci, port_array, faked_port_index, 1396 xhci_test_and_clear_bit(xhci, port_array, faked_port_index,
1350 PORT_PLC); 1397 PORT_PLC);
@@ -2277,6 +2324,9 @@ static int xhci_handle_event(struct xhci_hcd *xhci)
2277 else 2324 else
2278 update_ptrs = 0; 2325 update_ptrs = 0;
2279 break; 2326 break;
2327 case TRB_TYPE(TRB_DEV_NOTE):
2328 handle_device_notification(xhci, event);
2329 break;
2280 default: 2330 default:
2281 if ((le32_to_cpu(event->event_cmd.flags) & TRB_TYPE_BITMASK) >= 2331 if ((le32_to_cpu(event->event_cmd.flags) & TRB_TYPE_BITMASK) >=
2282 TRB_TYPE(48)) 2332 TRB_TYPE(48))
diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h
index fb99c8379142..0f4936956103 100644
--- a/drivers/usb/host/xhci.h
+++ b/drivers/usb/host/xhci.h
@@ -1344,6 +1344,7 @@ struct xhci_bus_state {
1344 /* ports suspend status arrays - max 31 ports for USB2, 15 for USB3 */ 1344 /* ports suspend status arrays - max 31 ports for USB2, 15 for USB3 */
1345 u32 port_c_suspend; 1345 u32 port_c_suspend;
1346 u32 suspended_ports; 1346 u32 suspended_ports;
1347 u32 port_remote_wakeup;
1347 unsigned long resume_done[USB_MAXCHILDREN]; 1348 unsigned long resume_done[USB_MAXCHILDREN];
1348}; 1349};
1349 1350