diff options
Diffstat (limited to 'include/linux/usb.h')
-rw-r--r-- | include/linux/usb.h | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/include/linux/usb.h b/include/linux/usb.h index 14933451d21d..c19297a8779c 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h | |||
@@ -378,6 +378,45 @@ enum usb_device_removable { | |||
378 | USB_DEVICE_FIXED, | 378 | USB_DEVICE_FIXED, |
379 | }; | 379 | }; |
380 | 380 | ||
381 | /* | ||
382 | * USB 3.0 Link Power Management (LPM) parameters. | ||
383 | * | ||
384 | * PEL and SEL are USB 3.0 Link PM latencies for device-initiated LPM exit. | ||
385 | * MEL is the USB 3.0 Link PM latency for host-initiated LPM exit. | ||
386 | * All three are stored in nanoseconds. | ||
387 | */ | ||
388 | struct usb3_lpm_parameters { | ||
389 | /* | ||
390 | * Maximum exit latency (MEL) for the host to send a packet to the | ||
391 | * device (either a Ping for isoc endpoints, or a data packet for | ||
392 | * interrupt endpoints), the hubs to decode the packet, and for all hubs | ||
393 | * in the path to transition the links to U0. | ||
394 | */ | ||
395 | unsigned int mel; | ||
396 | /* | ||
397 | * Maximum exit latency for a device-initiated LPM transition to bring | ||
398 | * all links into U0. Abbreviated as "PEL" in section 9.4.12 of the USB | ||
399 | * 3.0 spec, with no explanation of what "P" stands for. "Path"? | ||
400 | */ | ||
401 | unsigned int pel; | ||
402 | |||
403 | /* | ||
404 | * The System Exit Latency (SEL) includes PEL, and three other | ||
405 | * latencies. After a device initiates a U0 transition, it will take | ||
406 | * some time from when the device sends the ERDY to when it will finally | ||
407 | * receive the data packet. Basically, SEL should be the worse-case | ||
408 | * latency from when a device starts initiating a U0 transition to when | ||
409 | * it will get data. | ||
410 | */ | ||
411 | unsigned int sel; | ||
412 | /* | ||
413 | * The idle timeout value that is currently programmed into the parent | ||
414 | * hub for this device. When the timer counts to zero, the parent hub | ||
415 | * will initiate an LPM transition to either U1 or U2. | ||
416 | */ | ||
417 | int timeout; | ||
418 | }; | ||
419 | |||
381 | /** | 420 | /** |
382 | * struct usb_device - kernel's representation of a USB device | 421 | * struct usb_device - kernel's representation of a USB device |
383 | * @devnum: device number; address on a USB bus | 422 | * @devnum: device number; address on a USB bus |
@@ -435,6 +474,12 @@ enum usb_device_removable { | |||
435 | * specific data for the device. | 474 | * specific data for the device. |
436 | * @slot_id: Slot ID assigned by xHCI | 475 | * @slot_id: Slot ID assigned by xHCI |
437 | * @removable: Device can be physically removed from this port | 476 | * @removable: Device can be physically removed from this port |
477 | * @u1_params: exit latencies for USB3 U1 LPM state, and hub-initiated timeout. | ||
478 | * @u2_params: exit latencies for USB3 U2 LPM state, and hub-initiated timeout. | ||
479 | * @lpm_disable_count: Ref count used by usb_disable_lpm() and usb_enable_lpm() | ||
480 | * to keep track of the number of functions that require USB 3.0 Link Power | ||
481 | * Management to be disabled for this usb_device. This count should only | ||
482 | * be manipulated by those functions, with the bandwidth_mutex is held. | ||
438 | * | 483 | * |
439 | * Notes: | 484 | * Notes: |
440 | * Usbcore drivers should not set usbdev->state directly. Instead use | 485 | * Usbcore drivers should not set usbdev->state directly. Instead use |
@@ -481,6 +526,7 @@ struct usb_device { | |||
481 | unsigned lpm_capable:1; | 526 | unsigned lpm_capable:1; |
482 | unsigned usb2_hw_lpm_capable:1; | 527 | unsigned usb2_hw_lpm_capable:1; |
483 | unsigned usb2_hw_lpm_enabled:1; | 528 | unsigned usb2_hw_lpm_enabled:1; |
529 | unsigned usb3_lpm_enabled:1; | ||
484 | int string_langid; | 530 | int string_langid; |
485 | 531 | ||
486 | /* static strings from the device */ | 532 | /* static strings from the device */ |
@@ -507,6 +553,10 @@ struct usb_device { | |||
507 | struct wusb_dev *wusb_dev; | 553 | struct wusb_dev *wusb_dev; |
508 | int slot_id; | 554 | int slot_id; |
509 | enum usb_device_removable removable; | 555 | enum usb_device_removable removable; |
556 | struct usb3_lpm_parameters u1_params; | ||
557 | struct usb3_lpm_parameters u2_params; | ||
558 | unsigned lpm_disable_count; | ||
559 | unsigned hub_initiated_lpm_disable_count; | ||
510 | }; | 560 | }; |
511 | #define to_usb_device(d) container_of(d, struct usb_device, dev) | 561 | #define to_usb_device(d) container_of(d, struct usb_device, dev) |
512 | 562 | ||
@@ -542,6 +592,12 @@ extern void usb_autopm_put_interface_async(struct usb_interface *intf); | |||
542 | extern void usb_autopm_get_interface_no_resume(struct usb_interface *intf); | 592 | extern void usb_autopm_get_interface_no_resume(struct usb_interface *intf); |
543 | extern void usb_autopm_put_interface_no_suspend(struct usb_interface *intf); | 593 | extern void usb_autopm_put_interface_no_suspend(struct usb_interface *intf); |
544 | 594 | ||
595 | extern int usb_disable_lpm(struct usb_device *udev); | ||
596 | extern void usb_enable_lpm(struct usb_device *udev); | ||
597 | /* Same as above, but these functions lock/unlock the bandwidth_mutex. */ | ||
598 | extern int usb_unlocked_disable_lpm(struct usb_device *udev); | ||
599 | extern void usb_unlocked_enable_lpm(struct usb_device *udev); | ||
600 | |||
545 | static inline void usb_mark_last_busy(struct usb_device *udev) | 601 | static inline void usb_mark_last_busy(struct usb_device *udev) |
546 | { | 602 | { |
547 | pm_runtime_mark_last_busy(&udev->dev); | 603 | pm_runtime_mark_last_busy(&udev->dev); |
@@ -842,6 +898,9 @@ struct usbdrv_wrap { | |||
842 | * for interfaces bound to this driver. | 898 | * for interfaces bound to this driver. |
843 | * @soft_unbind: if set to 1, the USB core will not kill URBs and disable | 899 | * @soft_unbind: if set to 1, the USB core will not kill URBs and disable |
844 | * endpoints before calling the driver's disconnect method. | 900 | * endpoints before calling the driver's disconnect method. |
901 | * @disable_hub_initiated_lpm: if set to 0, the USB core will not allow hubs | ||
902 | * to initiate lower power link state transitions when an idle timeout | ||
903 | * occurs. Device-initiated USB 3.0 link PM will still be allowed. | ||
845 | * | 904 | * |
846 | * USB interface drivers must provide a name, probe() and disconnect() | 905 | * USB interface drivers must provide a name, probe() and disconnect() |
847 | * methods, and an id_table. Other driver fields are optional. | 906 | * methods, and an id_table. Other driver fields are optional. |
@@ -882,6 +941,7 @@ struct usb_driver { | |||
882 | struct usbdrv_wrap drvwrap; | 941 | struct usbdrv_wrap drvwrap; |
883 | unsigned int no_dynamic_id:1; | 942 | unsigned int no_dynamic_id:1; |
884 | unsigned int supports_autosuspend:1; | 943 | unsigned int supports_autosuspend:1; |
944 | unsigned int disable_hub_initiated_lpm:1; | ||
885 | unsigned int soft_unbind:1; | 945 | unsigned int soft_unbind:1; |
886 | }; | 946 | }; |
887 | #define to_usb_driver(d) container_of(d, struct usb_driver, drvwrap.driver) | 947 | #define to_usb_driver(d) container_of(d, struct usb_driver, drvwrap.driver) |