1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | /* |
3 | * usb hub driver head file |
4 | * |
5 | * Copyright (C) 1999 Linus Torvalds |
6 | * Copyright (C) 1999 Johannes Erdfelt |
7 | * Copyright (C) 1999 Gregory P. Smith |
8 | * Copyright (C) 2001 Brad Hards (bhards@bigpond.net.au) |
9 | * Copyright (C) 2012 Intel Corp (tianyu.lan@intel.com) |
10 | * |
11 | * move struct usb_hub to this file. |
12 | */ |
13 | |
14 | #include <linux/usb.h> |
15 | #include <linux/usb/ch11.h> |
16 | #include <linux/usb/hcd.h> |
17 | #include <linux/usb/typec.h> |
18 | #include "usb.h" |
19 | |
20 | struct usb_hub { |
21 | struct device *intfdev; /* the "interface" device */ |
22 | struct usb_device *hdev; |
23 | struct kref kref; |
24 | struct urb *urb; /* for interrupt polling pipe */ |
25 | |
26 | /* buffer for urb ... with extra space in case of babble */ |
27 | u8 (*buffer)[8]; |
28 | union { |
29 | struct usb_hub_status hub; |
30 | struct usb_port_status port; |
31 | } *status; /* buffer for status reports */ |
32 | struct mutex status_mutex; /* for the status buffer */ |
33 | |
34 | int error; /* last reported error */ |
35 | int nerrors; /* track consecutive errors */ |
36 | |
37 | unsigned long event_bits[1]; /* status change bitmask */ |
38 | unsigned long change_bits[1]; /* ports with logical connect |
39 | status change */ |
40 | unsigned long removed_bits[1]; /* ports with a "removed" |
41 | device present */ |
42 | unsigned long wakeup_bits[1]; /* ports that have signaled |
43 | remote wakeup */ |
44 | unsigned long power_bits[1]; /* ports that are powered */ |
45 | unsigned long child_usage_bits[1]; /* ports powered on for |
46 | children */ |
47 | unsigned long warm_reset_bits[1]; /* ports requesting warm |
48 | reset recovery */ |
49 | #if USB_MAXCHILDREN > 31 /* 8*sizeof(unsigned long) - 1 */ |
50 | #error event_bits[] is too short! |
51 | #endif |
52 | |
53 | struct usb_hub_descriptor *descriptor; /* class descriptor */ |
54 | struct usb_tt tt; /* Transaction Translator */ |
55 | |
56 | unsigned mA_per_port; /* current for each child */ |
57 | #ifdef CONFIG_PM |
58 | unsigned wakeup_enabled_descendants; |
59 | #endif |
60 | |
61 | unsigned limited_power:1; |
62 | unsigned quiescing:1; |
63 | unsigned disconnected:1; |
64 | unsigned in_reset:1; |
65 | unsigned quirk_disable_autosuspend:1; |
66 | |
67 | unsigned quirk_check_port_auto_suspend:1; |
68 | |
69 | unsigned has_indicators:1; |
70 | u8 indicator[USB_MAXCHILDREN]; |
71 | struct delayed_work leds; |
72 | struct delayed_work init_work; |
73 | struct work_struct events; |
74 | spinlock_t irq_urb_lock; |
75 | struct timer_list irq_urb_retry; |
76 | struct usb_port **ports; |
77 | struct list_head onboard_hub_devs; |
78 | }; |
79 | |
80 | /** |
81 | * struct usb port - kernel's representation of a usb port |
82 | * @child: usb device attached to the port |
83 | * @dev: generic device interface |
84 | * @port_owner: port's owner |
85 | * @peer: related usb2 and usb3 ports (share the same connector) |
86 | * @connector: USB Type-C connector |
87 | * @req: default pm qos request for hubs without port power control |
88 | * @connect_type: port's connect type |
89 | * @state: device state of the usb device attached to the port |
90 | * @state_kn: kernfs_node of the sysfs attribute that accesses @state |
91 | * @location: opaque representation of platform connector location |
92 | * @status_lock: synchronize port_event() vs usb_port_{suspend|resume} |
93 | * @portnum: port index num based one |
94 | * @is_superspeed cache super-speed status |
95 | * @usb3_lpm_u1_permit: whether USB3 U1 LPM is permitted. |
96 | * @usb3_lpm_u2_permit: whether USB3 U2 LPM is permitted. |
97 | * @early_stop: whether port initialization will be stopped earlier. |
98 | * @ignore_event: whether events of the port are ignored. |
99 | */ |
100 | struct usb_port { |
101 | struct usb_device *child; |
102 | struct device dev; |
103 | struct usb_dev_state *port_owner; |
104 | struct usb_port *peer; |
105 | struct typec_connector *connector; |
106 | struct dev_pm_qos_request *req; |
107 | enum usb_port_connect_type connect_type; |
108 | enum usb_device_state state; |
109 | struct kernfs_node *state_kn; |
110 | usb_port_location_t location; |
111 | struct mutex status_lock; |
112 | u32 over_current_count; |
113 | u8 portnum; |
114 | u32 quirks; |
115 | unsigned int early_stop:1; |
116 | unsigned int ignore_event:1; |
117 | unsigned int is_superspeed:1; |
118 | unsigned int usb3_lpm_u1_permit:1; |
119 | unsigned int usb3_lpm_u2_permit:1; |
120 | }; |
121 | |
122 | #define to_usb_port(_dev) \ |
123 | container_of(_dev, struct usb_port, dev) |
124 | |
125 | extern int usb_hub_create_port_device(struct usb_hub *hub, |
126 | int port1); |
127 | extern void usb_hub_remove_port_device(struct usb_hub *hub, |
128 | int port1); |
129 | extern int usb_hub_set_port_power(struct usb_device *hdev, struct usb_hub *hub, |
130 | int port1, bool set); |
131 | extern struct usb_hub *usb_hub_to_struct_hub(struct usb_device *hdev); |
132 | extern int hub_port_debounce(struct usb_hub *hub, int port1, |
133 | bool must_be_connected); |
134 | extern int usb_clear_port_feature(struct usb_device *hdev, |
135 | int port1, int feature); |
136 | extern int usb_hub_port_status(struct usb_hub *hub, int port1, |
137 | u16 *status, u16 *change); |
138 | extern int usb_port_is_power_on(struct usb_hub *hub, unsigned int portstatus); |
139 | |
140 | static inline bool hub_is_port_power_switchable(struct usb_hub *hub) |
141 | { |
142 | __le16 hcs; |
143 | |
144 | if (!hub) |
145 | return false; |
146 | hcs = hub->descriptor->wHubCharacteristics; |
147 | return (le16_to_cpu(hcs) & HUB_CHAR_LPSM) < HUB_CHAR_NO_LPSM; |
148 | } |
149 | |
150 | static inline int hub_is_superspeed(struct usb_device *hdev) |
151 | { |
152 | return hdev->descriptor.bDeviceProtocol == USB_HUB_PR_SS; |
153 | } |
154 | |
155 | static inline int hub_is_superspeedplus(struct usb_device *hdev) |
156 | { |
157 | return (hdev->descriptor.bDeviceProtocol == USB_HUB_PR_SS && |
158 | le16_to_cpu(hdev->descriptor.bcdUSB) >= 0x0310 && |
159 | hdev->bos && hdev->bos->ssp_cap); |
160 | } |
161 | |
162 | static inline unsigned hub_power_on_good_delay(struct usb_hub *hub) |
163 | { |
164 | unsigned delay = hub->descriptor->bPwrOn2PwrGood * 2; |
165 | |
166 | if (!hub->hdev->parent) /* root hub */ |
167 | return delay; |
168 | else /* Wait at least 100 msec for power to become stable */ |
169 | return max(delay, 100U); |
170 | } |
171 | |
172 | static inline int hub_port_debounce_be_connected(struct usb_hub *hub, |
173 | int port1) |
174 | { |
175 | return hub_port_debounce(hub, port1, must_be_connected: true); |
176 | } |
177 | |
178 | static inline int hub_port_debounce_be_stable(struct usb_hub *hub, |
179 | int port1) |
180 | { |
181 | return hub_port_debounce(hub, port1, must_be_connected: false); |
182 | } |
183 | |