aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/core/hub.h
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2014-06-08 14:31:16 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2014-06-08 14:31:16 -0400
commit3f17ea6dea8ba5668873afa54628a91aaa3fb1c0 (patch)
treeafbeb2accd4c2199ddd705ae943995b143a0af02 /drivers/usb/core/hub.h
parent1860e379875dfe7271c649058aeddffe5afd9d0d (diff)
parent1a5700bc2d10cd379a795fd2bb377a190af5acd4 (diff)
Merge branch 'next' (accumulated 3.16 merge window patches) into master
Now that 3.15 is released, this merges the 'next' branch into 'master', bringing us to the normal situation where my 'master' branch is the merge window. * accumulated work in next: (6809 commits) ufs: sb mutex merge + mutex_destroy powerpc: update comments for generic idle conversion cris: update comments for generic idle conversion idle: remove cpu_idle() forward declarations nbd: zero from and len fields in NBD_CMD_DISCONNECT. mm: convert some level-less printks to pr_* MAINTAINERS: adi-buildroot-devel is moderated MAINTAINERS: add linux-api for review of API/ABI changes mm/kmemleak-test.c: use pr_fmt for logging fs/dlm/debug_fs.c: replace seq_printf by seq_puts fs/dlm/lockspace.c: convert simple_str to kstr fs/dlm/config.c: convert simple_str to kstr mm: mark remap_file_pages() syscall as deprecated mm: memcontrol: remove unnecessary memcg argument from soft limit functions mm: memcontrol: clean up memcg zoneinfo lookup mm/memblock.c: call kmemleak directly from memblock_(alloc|free) mm/mempool.c: update the kmemleak stack trace for mempool allocations lib/radix-tree.c: update the kmemleak stack trace for radix tree allocations mm: introduce kmemleak_update_trace() mm/kmemleak.c: use %u to print ->checksum ...
Diffstat (limited to 'drivers/usb/core/hub.h')
-rw-r--r--drivers/usb/core/hub.h41
1 files changed, 35 insertions, 6 deletions
diff --git a/drivers/usb/core/hub.h b/drivers/usb/core/hub.h
index 33bcb2c6f90a..0a7cdc0ef0a9 100644
--- a/drivers/usb/core/hub.h
+++ b/drivers/usb/core/hub.h
@@ -45,12 +45,13 @@ struct usb_hub {
45 unsigned long event_bits[1]; /* status change bitmask */ 45 unsigned long event_bits[1]; /* status change bitmask */
46 unsigned long change_bits[1]; /* ports with logical connect 46 unsigned long change_bits[1]; /* ports with logical connect
47 status change */ 47 status change */
48 unsigned long busy_bits[1]; /* ports being reset or
49 resumed */
50 unsigned long removed_bits[1]; /* ports with a "removed" 48 unsigned long removed_bits[1]; /* ports with a "removed"
51 device present */ 49 device present */
52 unsigned long wakeup_bits[1]; /* ports that have signaled 50 unsigned long wakeup_bits[1]; /* ports that have signaled
53 remote wakeup */ 51 remote wakeup */
52 unsigned long power_bits[1]; /* ports that are powered */
53 unsigned long child_usage_bits[1]; /* ports powered on for
54 children */
54#if USB_MAXCHILDREN > 31 /* 8*sizeof(unsigned long) - 1 */ 55#if USB_MAXCHILDREN > 31 /* 8*sizeof(unsigned long) - 1 */
55#error event_bits[] is too short! 56#error event_bits[] is too short!
56#endif 57#endif
@@ -66,6 +67,7 @@ struct usb_hub {
66 unsigned limited_power:1; 67 unsigned limited_power:1;
67 unsigned quiescing:1; 68 unsigned quiescing:1;
68 unsigned disconnected:1; 69 unsigned disconnected:1;
70 unsigned in_reset:1;
69 71
70 unsigned quirk_check_port_auto_suspend:1; 72 unsigned quirk_check_port_auto_suspend:1;
71 73
@@ -81,19 +83,23 @@ struct usb_hub {
81 * @child: usb device attached to the port 83 * @child: usb device attached to the port
82 * @dev: generic device interface 84 * @dev: generic device interface
83 * @port_owner: port's owner 85 * @port_owner: port's owner
86 * @peer: related usb2 and usb3 ports (share the same connector)
84 * @connect_type: port's connect type 87 * @connect_type: port's connect type
88 * @location: opaque representation of platform connector location
89 * @status_lock: synchronize port_event() vs usb_port_{suspend|resume}
85 * @portnum: port index num based one 90 * @portnum: port index num based one
86 * @power_is_on: port's power state 91 * @is_superspeed cache super-speed status
87 * @did_runtime_put: port has done pm_runtime_put().
88 */ 92 */
89struct usb_port { 93struct usb_port {
90 struct usb_device *child; 94 struct usb_device *child;
91 struct device dev; 95 struct device dev;
92 struct usb_dev_state *port_owner; 96 struct usb_dev_state *port_owner;
97 struct usb_port *peer;
93 enum usb_port_connect_type connect_type; 98 enum usb_port_connect_type connect_type;
99 usb_port_location_t location;
100 struct mutex status_lock;
94 u8 portnum; 101 u8 portnum;
95 unsigned power_is_on:1; 102 unsigned int is_superspeed:1;
96 unsigned did_runtime_put:1;
97}; 103};
98 104
99#define to_usb_port(_dev) \ 105#define to_usb_port(_dev) \
@@ -111,6 +117,29 @@ extern int hub_port_debounce(struct usb_hub *hub, int port1,
111extern int usb_clear_port_feature(struct usb_device *hdev, 117extern int usb_clear_port_feature(struct usb_device *hdev,
112 int port1, int feature); 118 int port1, int feature);
113 119
120static inline bool hub_is_port_power_switchable(struct usb_hub *hub)
121{
122 __le16 hcs;
123
124 if (!hub)
125 return false;
126 hcs = hub->descriptor->wHubCharacteristics;
127 return (le16_to_cpu(hcs) & HUB_CHAR_LPSM) < HUB_CHAR_NO_LPSM;
128}
129
130static inline int hub_is_superspeed(struct usb_device *hdev)
131{
132 return hdev->descriptor.bDeviceProtocol == USB_HUB_PR_SS;
133}
134
135static inline unsigned hub_power_on_good_delay(struct usb_hub *hub)
136{
137 unsigned delay = hub->descriptor->bPwrOn2PwrGood * 2;
138
139 /* Wait at least 100 msec for power to become stable */
140 return max(delay, 100U);
141}
142
114static inline int hub_port_debounce_be_connected(struct usb_hub *hub, 143static inline int hub_port_debounce_be_connected(struct usb_hub *hub,
115 int port1) 144 int port1)
116{ 145{