blob: 643e087babcadee60169665e54951cc6f7e4a6e5 [file] [log] [blame]
Sarah Sharp0f2a7932009-04-27 19:57:12 -07001/*
2 * xHCI host controller driver
3 *
4 * Copyright (C) 2008 Intel Corp.
5 *
6 * Author: Sarah Sharp
7 * Some code borrowed from the Linux EHCI driver.
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License version 2 as
11 * published by the Free Software Foundation.
12 *
13 * This program is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 * for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software Foundation,
20 * Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 */
22
Jack Pham32788c52013-06-20 13:31:37 -070023#include <linux/gfp.h>
Mathias Nymanddba5cd2014-05-08 19:26:00 +030024#include <linux/slab.h>
Sarah Sharp0f2a7932009-04-27 19:57:12 -070025#include <asm/unaligned.h>
Hemant Kumar74c850d2017-11-28 16:03:07 -080026#include <linux/usb/phy.h>
Sarah Sharp0f2a7932009-04-27 19:57:12 -070027
28#include "xhci.h"
Xenia Ragiadakou4bdfe4c2013-08-06 07:52:45 +030029#include "xhci-trace.h"
Sarah Sharp0f2a7932009-04-27 19:57:12 -070030
Andiry Xu9777e3c2010-10-14 07:23:03 -070031#define PORT_WAKE_BITS (PORT_WKOC_E | PORT_WKDISC_E | PORT_WKCONN_E)
32#define PORT_RWC_BITS (PORT_CSC | PORT_PEC | PORT_WRC | PORT_OCC | \
33 PORT_RC | PORT_PLC | PORT_PE)
34
Mathias Nyman5693e0b2015-10-01 18:40:35 +030035/* USB 3 BOS descriptor and a capability descriptors, combined.
36 * Fields will be adjusted and added later in xhci_create_usb3_bos_desc()
37 */
Sarah Sharp48e82362011-10-06 11:54:23 -070038static u8 usb_bos_descriptor [] = {
39 USB_DT_BOS_SIZE, /* __u8 bLength, 5 bytes */
40 USB_DT_BOS, /* __u8 bDescriptorType */
41 0x0F, 0x00, /* __le16 wTotalLength, 15 bytes */
42 0x1, /* __u8 bNumDeviceCaps */
Mathias Nyman5693e0b2015-10-01 18:40:35 +030043 /* First device capability, SuperSpeed */
Sarah Sharp48e82362011-10-06 11:54:23 -070044 USB_DT_USB_SS_CAP_SIZE, /* __u8 bLength, 10 bytes */
45 USB_DT_DEVICE_CAPABILITY, /* Device Capability */
46 USB_SS_CAP_TYPE, /* bDevCapabilityType, SUPERSPEED_USB */
47 0x00, /* bmAttributes, LTM off by default */
48 USB_5GBPS_OPERATION, 0x00, /* wSpeedsSupported, 5Gbps only */
49 0x03, /* bFunctionalitySupport,
50 USB 3.0 speed only */
51 0x00, /* bU1DevExitLat, set later. */
Mathias Nyman5693e0b2015-10-01 18:40:35 +030052 0x00, 0x00, /* __le16 bU2DevExitLat, set later. */
53 /* Second device capability, SuperSpeedPlus */
Mathias Nyman5da665f2016-01-25 15:30:46 +020054 0x1c, /* bLength 28, will be adjusted later */
Mathias Nyman5693e0b2015-10-01 18:40:35 +030055 USB_DT_DEVICE_CAPABILITY, /* Device Capability */
56 USB_SSP_CAP_TYPE, /* bDevCapabilityType SUPERSPEED_PLUS */
57 0x00, /* bReserved 0 */
Mathias Nyman5da665f2016-01-25 15:30:46 +020058 0x23, 0x00, 0x00, 0x00, /* bmAttributes, SSAC=3 SSIC=1 */
59 0x01, 0x00, /* wFunctionalitySupport */
Mathias Nyman5693e0b2015-10-01 18:40:35 +030060 0x00, 0x00, /* wReserved 0 */
Mathias Nyman5da665f2016-01-25 15:30:46 +020061 /* Default Sublink Speed Attributes, overwrite if custom PSI exists */
62 0x34, 0x00, 0x05, 0x00, /* 5Gbps, symmetric, rx, ID = 4 */
63 0xb4, 0x00, 0x05, 0x00, /* 5Gbps, symmetric, tx, ID = 4 */
64 0x35, 0x40, 0x0a, 0x00, /* 10Gbps, SSP, symmetric, rx, ID = 5 */
65 0xb5, 0x40, 0x0a, 0x00, /* 10Gbps, SSP, symmetric, tx, ID = 5 */
Sarah Sharp48e82362011-10-06 11:54:23 -070066};
67
Mathias Nyman5693e0b2015-10-01 18:40:35 +030068static int xhci_create_usb3_bos_desc(struct xhci_hcd *xhci, char *buf,
69 u16 wLength)
70{
71 int i, ssa_count;
72 u32 temp;
73 u16 desc_size, ssp_cap_size, ssa_size = 0;
74 bool usb3_1 = false;
75
76 desc_size = USB_DT_BOS_SIZE + USB_DT_USB_SS_CAP_SIZE;
77 ssp_cap_size = sizeof(usb_bos_descriptor) - desc_size;
78
79 /* does xhci support USB 3.1 Enhanced SuperSpeed */
Mathias Nyman5da665f2016-01-25 15:30:46 +020080 if (xhci->usb3_rhub.min_rev >= 0x01) {
81 /* does xhci provide a PSI table for SSA speed attributes? */
82 if (xhci->usb3_rhub.psi_count) {
83 /* two SSA entries for each unique PSI ID, RX and TX */
84 ssa_count = xhci->usb3_rhub.psi_uid_count * 2;
85 ssa_size = ssa_count * sizeof(u32);
86 ssp_cap_size -= 16; /* skip copying the default SSA */
87 }
Mathias Nyman5693e0b2015-10-01 18:40:35 +030088 desc_size += ssp_cap_size;
89 usb3_1 = true;
90 }
91 memcpy(buf, &usb_bos_descriptor, min(desc_size, wLength));
92
93 if (usb3_1) {
94 /* modify bos descriptor bNumDeviceCaps and wTotalLength */
95 buf[4] += 1;
96 put_unaligned_le16(desc_size + ssa_size, &buf[2]);
97 }
98
99 if (wLength < USB_DT_BOS_SIZE + USB_DT_USB_SS_CAP_SIZE)
100 return wLength;
101
102 /* Indicate whether the host has LTM support. */
103 temp = readl(&xhci->cap_regs->hcc_params);
104 if (HCC_LTC(temp))
105 buf[8] |= USB_LTM_SUPPORT;
106
107 /* Set the U1 and U2 exit latencies. */
108 if ((xhci->quirks & XHCI_LPM_SUPPORT)) {
109 temp = readl(&xhci->cap_regs->hcs_params3);
110 buf[12] = HCS_U1_LATENCY(temp);
111 put_unaligned_le16(HCS_U2_LATENCY(temp), &buf[13]);
112 }
113
Mathias Nyman5da665f2016-01-25 15:30:46 +0200114 /* If PSI table exists, add the custom speed attributes from it */
115 if (usb3_1 && xhci->usb3_rhub.psi_count) {
Mathias Nymanf77615d2017-09-18 17:39:18 +0300116 u32 ssp_cap_base, bm_attrib, psi, psi_mant, psi_exp;
Mathias Nyman5693e0b2015-10-01 18:40:35 +0300117 int offset;
118
119 ssp_cap_base = USB_DT_BOS_SIZE + USB_DT_USB_SS_CAP_SIZE;
120
121 if (wLength < desc_size)
122 return wLength;
123 buf[ssp_cap_base] = ssp_cap_size + ssa_size;
124
125 /* attribute count SSAC bits 4:0 and ID count SSIC bits 8:5 */
126 bm_attrib = (ssa_count - 1) & 0x1f;
127 bm_attrib |= (xhci->usb3_rhub.psi_uid_count - 1) << 5;
128 put_unaligned_le32(bm_attrib, &buf[ssp_cap_base + 4]);
129
130 if (wLength < desc_size + ssa_size)
131 return wLength;
132 /*
133 * Create the Sublink Speed Attributes (SSA) array.
134 * The xhci PSI field and USB 3.1 SSA fields are very similar,
135 * but link type bits 7:6 differ for values 01b and 10b.
136 * xhci has also only one PSI entry for a symmetric link when
137 * USB 3.1 requires two SSA entries (RX and TX) for every link
138 */
139 offset = desc_size;
140 for (i = 0; i < xhci->usb3_rhub.psi_count; i++) {
141 psi = xhci->usb3_rhub.psi[i];
142 psi &= ~USB_SSP_SUBLINK_SPEED_RSVD;
Mathias Nymanf77615d2017-09-18 17:39:18 +0300143 psi_exp = XHCI_EXT_PORT_PSIE(psi);
144 psi_mant = XHCI_EXT_PORT_PSIM(psi);
145
146 /* Shift to Gbps and set SSP Link BIT(14) if 10Gpbs */
147 for (; psi_exp < 3; psi_exp++)
148 psi_mant /= 1000;
149 if (psi_mant >= 10)
150 psi |= BIT(14);
151
Mathias Nyman5693e0b2015-10-01 18:40:35 +0300152 if ((psi & PLT_MASK) == PLT_SYM) {
153 /* Symmetric, create SSA RX and TX from one PSI entry */
154 put_unaligned_le32(psi, &buf[offset]);
155 psi |= 1 << 7; /* turn entry to TX */
156 offset += 4;
157 if (offset >= desc_size + ssa_size)
158 return desc_size + ssa_size;
159 } else if ((psi & PLT_MASK) == PLT_ASYM_RX) {
160 /* Asymetric RX, flip bits 7:6 for SSA */
161 psi ^= PLT_MASK;
162 }
163 put_unaligned_le32(psi, &buf[offset]);
164 offset += 4;
165 if (offset >= desc_size + ssa_size)
166 return desc_size + ssa_size;
167 }
168 }
169 /* ssa_size is 0 for other than usb 3.1 hosts */
170 return desc_size + ssa_size;
171}
Sarah Sharp48e82362011-10-06 11:54:23 -0700172
Sarah Sharp4bbb0ac2010-11-29 16:14:37 -0800173static void xhci_common_hub_descriptor(struct xhci_hcd *xhci,
174 struct usb_hub_descriptor *desc, int ports)
Sarah Sharp0f2a7932009-04-27 19:57:12 -0700175{
Sarah Sharp0f2a7932009-04-27 19:57:12 -0700176 u16 temp;
177
Sarah Sharp0f2a7932009-04-27 19:57:12 -0700178 desc->bPwrOn2PwrGood = 10; /* xhci section 5.4.9 says 20ms max */
179 desc->bHubContrCurrent = 0;
180
181 desc->bNbrPorts = ports;
Sarah Sharp0f2a7932009-04-27 19:57:12 -0700182 temp = 0;
Aman Deepc8421142011-11-22 19:33:36 +0530183 /* Bits 1:0 - support per-port power switching, or power always on */
Sarah Sharp0f2a7932009-04-27 19:57:12 -0700184 if (HCC_PPC(xhci->hcc_params))
Aman Deepc8421142011-11-22 19:33:36 +0530185 temp |= HUB_CHAR_INDV_PORT_LPSM;
Sarah Sharp0f2a7932009-04-27 19:57:12 -0700186 else
Aman Deepc8421142011-11-22 19:33:36 +0530187 temp |= HUB_CHAR_NO_LPSM;
Sarah Sharp0f2a7932009-04-27 19:57:12 -0700188 /* Bit 2 - root hubs are not part of a compound device */
189 /* Bits 4:3 - individual port over current protection */
Aman Deepc8421142011-11-22 19:33:36 +0530190 temp |= HUB_CHAR_INDV_PORT_OCPM;
Sarah Sharp0f2a7932009-04-27 19:57:12 -0700191 /* Bits 6:5 - no TTs in root ports */
192 /* Bit 7 - no port indicators */
Matt Evans28ccd292011-03-29 13:40:46 +1100193 desc->wHubCharacteristics = cpu_to_le16(temp);
Sarah Sharp0f2a7932009-04-27 19:57:12 -0700194}
195
Sarah Sharp4bbb0ac2010-11-29 16:14:37 -0800196/* Fill in the USB 2.0 roothub descriptor */
197static void xhci_usb2_hub_descriptor(struct usb_hcd *hcd, struct xhci_hcd *xhci,
198 struct usb_hub_descriptor *desc)
199{
200 int ports;
201 u16 temp;
202 __u8 port_removable[(USB_MAXCHILDREN + 1 + 7) / 8];
203 u32 portsc;
204 unsigned int i;
205
206 ports = xhci->num_usb2_ports;
207
208 xhci_common_hub_descriptor(xhci, desc, ports);
Aman Deepc8421142011-11-22 19:33:36 +0530209 desc->bDescriptorType = USB_DT_HUB;
Sarah Sharp4bbb0ac2010-11-29 16:14:37 -0800210 temp = 1 + (ports / 8);
Aman Deepc8421142011-11-22 19:33:36 +0530211 desc->bDescLength = USB_DT_HUB_NONVAR_SIZE + 2 * temp;
Sarah Sharp4bbb0ac2010-11-29 16:14:37 -0800212
213 /* The Device Removable bits are reported on a byte granularity.
214 * If the port doesn't exist within that byte, the bit is set to 0.
215 */
216 memset(port_removable, 0, sizeof(port_removable));
217 for (i = 0; i < ports; i++) {
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +0200218 portsc = readl(xhci->usb2_ports[i]);
Sarah Sharp4bbb0ac2010-11-29 16:14:37 -0800219 /* If a device is removable, PORTSC reports a 0, same as in the
220 * hub descriptor DeviceRemovable bits.
221 */
222 if (portsc & PORT_DEV_REMOVE)
223 /* This math is hairy because bit 0 of DeviceRemovable
224 * is reserved, and bit 1 is for port 1, etc.
225 */
226 port_removable[(i + 1) / 8] |= 1 << ((i + 1) % 8);
227 }
228
229 /* ch11.h defines a hub descriptor that has room for USB_MAXCHILDREN
230 * ports on it. The USB 2.0 specification says that there are two
231 * variable length fields at the end of the hub descriptor:
232 * DeviceRemovable and PortPwrCtrlMask. But since we can have less than
233 * USB_MAXCHILDREN ports, we may need to use the DeviceRemovable array
234 * to set PortPwrCtrlMask bits. PortPwrCtrlMask must always be set to
235 * 0xFF, so we initialize the both arrays (DeviceRemovable and
236 * PortPwrCtrlMask) to 0xFF. Then we set the DeviceRemovable for each
237 * set of ports that actually exist.
238 */
239 memset(desc->u.hs.DeviceRemovable, 0xff,
240 sizeof(desc->u.hs.DeviceRemovable));
241 memset(desc->u.hs.PortPwrCtrlMask, 0xff,
242 sizeof(desc->u.hs.PortPwrCtrlMask));
243
244 for (i = 0; i < (ports + 1 + 7) / 8; i++)
245 memset(&desc->u.hs.DeviceRemovable[i], port_removable[i],
246 sizeof(__u8));
247}
248
249/* Fill in the USB 3.0 roothub descriptor */
250static void xhci_usb3_hub_descriptor(struct usb_hcd *hcd, struct xhci_hcd *xhci,
251 struct usb_hub_descriptor *desc)
252{
253 int ports;
254 u16 port_removable;
255 u32 portsc;
256 unsigned int i;
257
258 ports = xhci->num_usb3_ports;
259 xhci_common_hub_descriptor(xhci, desc, ports);
Aman Deepc8421142011-11-22 19:33:36 +0530260 desc->bDescriptorType = USB_DT_SS_HUB;
261 desc->bDescLength = USB_DT_SS_HUB_SIZE;
Sarah Sharp4bbb0ac2010-11-29 16:14:37 -0800262
263 /* header decode latency should be zero for roothubs,
264 * see section 4.23.5.2.
265 */
266 desc->u.ss.bHubHdrDecLat = 0;
267 desc->u.ss.wHubDelay = 0;
268
269 port_removable = 0;
270 /* bit 0 is reserved, bit 1 is for port 1, etc. */
271 for (i = 0; i < ports; i++) {
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +0200272 portsc = readl(xhci->usb3_ports[i]);
Sarah Sharp4bbb0ac2010-11-29 16:14:37 -0800273 if (portsc & PORT_DEV_REMOVE)
274 port_removable |= 1 << (i + 1);
275 }
Lan Tianyu27c411c2012-10-15 15:38:35 +0800276
277 desc->u.ss.DeviceRemovable = cpu_to_le16(port_removable);
Sarah Sharp4bbb0ac2010-11-29 16:14:37 -0800278}
279
280static void xhci_hub_descriptor(struct usb_hcd *hcd, struct xhci_hcd *xhci,
281 struct usb_hub_descriptor *desc)
282{
283
Mathias Nymanb50107b2015-10-01 18:40:38 +0300284 if (hcd->speed >= HCD_USB3)
Sarah Sharp4bbb0ac2010-11-29 16:14:37 -0800285 xhci_usb3_hub_descriptor(hcd, xhci, desc);
286 else
287 xhci_usb2_hub_descriptor(hcd, xhci, desc);
288
289}
290
Sarah Sharp0f2a7932009-04-27 19:57:12 -0700291static unsigned int xhci_port_speed(unsigned int port_status)
292{
293 if (DEV_LOWSPEED(port_status))
Alan Stern288ead42010-03-04 11:32:30 -0500294 return USB_PORT_STAT_LOW_SPEED;
Sarah Sharp0f2a7932009-04-27 19:57:12 -0700295 if (DEV_HIGHSPEED(port_status))
Alan Stern288ead42010-03-04 11:32:30 -0500296 return USB_PORT_STAT_HIGH_SPEED;
Sarah Sharp0f2a7932009-04-27 19:57:12 -0700297 /*
298 * FIXME: Yes, we should check for full speed, but the core uses that as
299 * a default in portspeed() in usb/core/hub.c (which is the only place
Alan Stern288ead42010-03-04 11:32:30 -0500300 * USB_PORT_STAT_*_SPEED is used).
Sarah Sharp0f2a7932009-04-27 19:57:12 -0700301 */
302 return 0;
303}
304
305/*
306 * These bits are Read Only (RO) and should be saved and written to the
307 * registers: 0, 3, 10:13, 30
308 * connect status, over-current status, port speed, and device removable.
309 * connect status and port speed are also sticky - meaning they're in
310 * the AUX well and they aren't changed by a hot, warm, or cold reset.
311 */
312#define XHCI_PORT_RO ((1<<0) | (1<<3) | (0xf<<10) | (1<<30))
313/*
314 * These bits are RW; writing a 0 clears the bit, writing a 1 sets the bit:
315 * bits 5:8, 9, 14:15, 25:27
316 * link state, port power, port indicator state, "wake on" enable state
317 */
318#define XHCI_PORT_RWS ((0xf<<5) | (1<<9) | (0x3<<14) | (0x7<<25))
319/*
320 * These bits are RW; writing a 1 sets the bit, writing a 0 has no effect:
321 * bit 4 (port reset)
322 */
323#define XHCI_PORT_RW1S ((1<<4))
324/*
325 * These bits are RW; writing a 1 clears the bit, writing a 0 has no effect:
326 * bits 1, 17, 18, 19, 20, 21, 22, 23
327 * port enable/disable, and
328 * change bits: connect, PED, warm port reset changed (reserved zero for USB 2.0 ports),
329 * over-current, reset, link state, and L1 change
330 */
331#define XHCI_PORT_RW1CS ((1<<1) | (0x7f<<17))
332/*
333 * Bit 16 is RW, and writing a '1' to it causes the link state control to be
334 * latched in
335 */
336#define XHCI_PORT_RW ((1<<16))
337/*
338 * These bits are Reserved Zero (RsvdZ) and zero should be written to them:
339 * bits 2, 24, 28:31
340 */
341#define XHCI_PORT_RZ ((1<<2) | (1<<24) | (0xf<<28))
342
343/*
344 * Given a port state, this function returns a value that would result in the
345 * port being in the same state, if the value was written to the port status
346 * control register.
347 * Save Read Only (RO) bits and save read/write bits where
348 * writing a 0 clears the bit and writing a 1 sets the bit (RWS).
349 * For all other types (RW1S, RW1CS, RW, and RZ), writing a '0' has no effect.
350 */
Andiry Xu56192532010-10-14 07:23:00 -0700351u32 xhci_port_state_to_neutral(u32 state)
Sarah Sharp0f2a7932009-04-27 19:57:12 -0700352{
353 /* Save read-only status and port state */
354 return (state & XHCI_PORT_RO) | (state & XHCI_PORT_RWS);
355}
356
Andiry Xube88fe42010-10-14 07:22:57 -0700357/*
358 * find slot id based on port number.
Sarah Sharpf6ff0ac2010-12-16 11:21:10 -0800359 * @port: The one-based port number from one of the two split roothubs.
Andiry Xube88fe42010-10-14 07:22:57 -0700360 */
Sarah Sharp52336302010-12-16 10:49:09 -0800361int xhci_find_slot_id_by_port(struct usb_hcd *hcd, struct xhci_hcd *xhci,
362 u16 port)
Andiry Xube88fe42010-10-14 07:22:57 -0700363{
364 int slot_id;
365 int i;
Sarah Sharpf6ff0ac2010-12-16 11:21:10 -0800366 enum usb_device_speed speed;
Andiry Xube88fe42010-10-14 07:22:57 -0700367
368 slot_id = 0;
369 for (i = 0; i < MAX_HC_SLOTS; i++) {
Hemant Kumara8560702017-11-07 15:41:42 -0800370 if (!xhci->devs[i] || !xhci->devs[i]->udev)
Andiry Xube88fe42010-10-14 07:22:57 -0700371 continue;
Sarah Sharpf6ff0ac2010-12-16 11:21:10 -0800372 speed = xhci->devs[i]->udev->speed;
Mathias Nymanb50107b2015-10-01 18:40:38 +0300373 if (((speed >= USB_SPEED_SUPER) == (hcd->speed >= HCD_USB3))
Sarah Sharpfe301822011-09-02 11:05:41 -0700374 && xhci->devs[i]->fake_port == port) {
Andiry Xube88fe42010-10-14 07:22:57 -0700375 slot_id = i;
376 break;
377 }
378 }
379
380 return slot_id;
381}
382
383/*
384 * Stop device
385 * It issues stop endpoint command for EP 0 to 30. And wait the last command
386 * to complete.
387 * suspend will set to 1, if suspend bit need to set in command.
388 */
389static int xhci_stop_device(struct xhci_hcd *xhci, int slot_id, int suspend)
390{
391 struct xhci_virt_device *virt_dev;
392 struct xhci_command *cmd;
393 unsigned long flags;
Andiry Xube88fe42010-10-14 07:22:57 -0700394 int ret;
395 int i;
396
397 ret = 0;
Andiry Xube88fe42010-10-14 07:22:57 -0700398 cmd = xhci_alloc_command(xhci, false, true, GFP_NOIO);
399 if (!cmd) {
400 xhci_dbg(xhci, "Couldn't allocate command structure.\n");
401 return -ENOMEM;
402 }
403
404 spin_lock_irqsave(&xhci->lock, flags);
Jack Pham5ab4ef32017-06-01 17:57:14 -0700405 virt_dev = xhci->devs[slot_id];
406 if (!virt_dev) {
407 spin_unlock_irqrestore(&xhci->lock, flags);
408 xhci_free_command(xhci, cmd);
409 return -ENODEV;
410 }
411
Andiry Xube88fe42010-10-14 07:22:57 -0700412 for (i = LAST_EP_INDEX; i > 0; i--) {
Mathias Nymanddba5cd2014-05-08 19:26:00 +0300413 if (virt_dev->eps[i].ring && virt_dev->eps[i].ring->dequeue) {
414 struct xhci_command *command;
415 command = xhci_alloc_command(xhci, false, false,
Mathias Nymanbe3de322014-06-10 11:27:41 +0300416 GFP_NOWAIT);
Mathias Nymanddba5cd2014-05-08 19:26:00 +0300417 if (!command) {
418 spin_unlock_irqrestore(&xhci->lock, flags);
Mayank Rana659b04a2017-10-06 17:45:30 +0300419 ret = -ENOMEM;
420 goto cmd_cleanup;
Mathias Nymanddba5cd2014-05-08 19:26:00 +0300421 }
Mayank Ranaf7e7f482016-02-19 15:14:07 -0800422
423 ret = xhci_queue_stop_endpoint(xhci, command, slot_id,
Mayank Rana659b04a2017-10-06 17:45:30 +0300424 i, suspend);
Mayank Ranaf7e7f482016-02-19 15:14:07 -0800425 if (ret) {
426 spin_unlock_irqrestore(&xhci->lock, flags);
Jack Pham1c39fae2017-06-01 19:00:45 -0700427 xhci_free_command(xhci, command);
Mayank Rana659b04a2017-10-06 17:45:30 +0300428 goto cmd_cleanup;
Mayank Ranaf7e7f482016-02-19 15:14:07 -0800429 }
Mathias Nymanddba5cd2014-05-08 19:26:00 +0300430 }
Andiry Xube88fe42010-10-14 07:22:57 -0700431 }
Mayank Ranaf7e7f482016-02-19 15:14:07 -0800432 ret = xhci_queue_stop_endpoint(xhci, cmd, slot_id, 0, suspend);
433 if (ret) {
434 spin_unlock_irqrestore(&xhci->lock, flags);
Mayank Rana659b04a2017-10-06 17:45:30 +0300435 goto cmd_cleanup;
Mayank Ranaf7e7f482016-02-19 15:14:07 -0800436 }
Mayank Rana659b04a2017-10-06 17:45:30 +0300437
Andiry Xube88fe42010-10-14 07:22:57 -0700438 xhci_ring_cmd_db(xhci);
439 spin_unlock_irqrestore(&xhci->lock, flags);
440
441 /* Wait for last stop endpoint command to finish */
Mathias Nymanc311e392014-05-08 19:26:03 +0300442 wait_for_completion(cmd->completion);
443
444 if (cmd->status == COMP_CMD_ABORT || cmd->status == COMP_CMD_STOP) {
445 xhci_warn(xhci, "Timeout while waiting for stop endpoint command\n");
Andiry Xube88fe42010-10-14 07:22:57 -0700446 ret = -ETIME;
Andiry Xube88fe42010-10-14 07:22:57 -0700447 }
Mayank Ranaf7e7f482016-02-19 15:14:07 -0800448
Mayank Rana659b04a2017-10-06 17:45:30 +0300449cmd_cleanup:
Andiry Xube88fe42010-10-14 07:22:57 -0700450 xhci_free_command(xhci, cmd);
451 return ret;
452}
453
454/*
455 * Ring device, it rings the all doorbells unconditionally.
456 */
Andiry Xu56192532010-10-14 07:23:00 -0700457void xhci_ring_device(struct xhci_hcd *xhci, int slot_id)
Andiry Xube88fe42010-10-14 07:22:57 -0700458{
Hans de Goedeb7f96962014-08-20 16:41:56 +0300459 int i, s;
460 struct xhci_virt_ep *ep;
Andiry Xube88fe42010-10-14 07:22:57 -0700461
Hans de Goedeb7f96962014-08-20 16:41:56 +0300462 for (i = 0; i < LAST_EP_INDEX + 1; i++) {
463 ep = &xhci->devs[slot_id]->eps[i];
464
465 if (ep->ep_state & EP_HAS_STREAMS) {
466 for (s = 1; s < ep->stream_info->num_streams; s++)
467 xhci_ring_ep_doorbell(xhci, slot_id, i, s);
468 } else if (ep->ring && ep->ring->dequeue) {
Andiry Xube88fe42010-10-14 07:22:57 -0700469 xhci_ring_ep_doorbell(xhci, slot_id, i, 0);
Hans de Goedeb7f96962014-08-20 16:41:56 +0300470 }
471 }
Andiry Xube88fe42010-10-14 07:22:57 -0700472
473 return;
474}
475
Sarah Sharpf6ff0ac2010-12-16 11:21:10 -0800476static void xhci_disable_port(struct usb_hcd *hcd, struct xhci_hcd *xhci,
Matt Evans28ccd292011-03-29 13:40:46 +1100477 u16 wIndex, __le32 __iomem *addr, u32 port_status)
Sarah Sharp6219c042009-12-09 15:59:11 -0800478{
Sarah Sharp6dd0a3a72010-11-16 15:58:52 -0800479 /* Don't allow the USB core to disable SuperSpeed ports. */
Mathias Nymanb50107b2015-10-01 18:40:38 +0300480 if (hcd->speed >= HCD_USB3) {
Sarah Sharp6dd0a3a72010-11-16 15:58:52 -0800481 xhci_dbg(xhci, "Ignoring request to disable "
482 "SuperSpeed port.\n");
483 return;
484 }
485
Felipe Balbi15159242017-04-04 19:32:24 +0000486 if (xhci->quirks & XHCI_BROKEN_PORT_PED) {
487 xhci_dbg(xhci,
488 "Broken Port Enabled/Disabled, ignoring port disable request.\n");
489 return;
490 }
491
Sarah Sharp6219c042009-12-09 15:59:11 -0800492 /* Write 1 to disable the port */
Xenia Ragiadakou204b7792013-11-15 05:34:07 +0200493 writel(port_status | PORT_PE, addr);
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +0200494 port_status = readl(addr);
Sarah Sharp6219c042009-12-09 15:59:11 -0800495 xhci_dbg(xhci, "disable port, actual port %d status = 0x%x\n",
496 wIndex, port_status);
497}
498
Sarah Sharp34fb5622009-12-09 15:59:08 -0800499static void xhci_clear_port_change_bit(struct xhci_hcd *xhci, u16 wValue,
Matt Evans28ccd292011-03-29 13:40:46 +1100500 u16 wIndex, __le32 __iomem *addr, u32 port_status)
Sarah Sharp34fb5622009-12-09 15:59:08 -0800501{
502 char *port_change_bit;
503 u32 status;
504
505 switch (wValue) {
506 case USB_PORT_FEAT_C_RESET:
507 status = PORT_RC;
508 port_change_bit = "reset";
509 break;
Andiry Xua11496e2011-04-27 18:07:29 +0800510 case USB_PORT_FEAT_C_BH_PORT_RESET:
511 status = PORT_WRC;
512 port_change_bit = "warm(BH) reset";
513 break;
Sarah Sharp34fb5622009-12-09 15:59:08 -0800514 case USB_PORT_FEAT_C_CONNECTION:
515 status = PORT_CSC;
516 port_change_bit = "connect";
517 break;
518 case USB_PORT_FEAT_C_OVER_CURRENT:
519 status = PORT_OCC;
520 port_change_bit = "over-current";
521 break;
Sarah Sharp6219c042009-12-09 15:59:11 -0800522 case USB_PORT_FEAT_C_ENABLE:
523 status = PORT_PEC;
524 port_change_bit = "enable/disable";
525 break;
Andiry Xube88fe42010-10-14 07:22:57 -0700526 case USB_PORT_FEAT_C_SUSPEND:
527 status = PORT_PLC;
528 port_change_bit = "suspend/resume";
529 break;
Andiry Xu85387c02011-04-27 18:07:35 +0800530 case USB_PORT_FEAT_C_PORT_LINK_STATE:
531 status = PORT_PLC;
532 port_change_bit = "link state";
533 break;
Lu Baolu94251832015-03-23 18:27:41 +0200534 case USB_PORT_FEAT_C_PORT_CONFIG_ERROR:
535 status = PORT_CEC;
536 port_change_bit = "config error";
537 break;
Sarah Sharp34fb5622009-12-09 15:59:08 -0800538 default:
539 /* Should never happen */
540 return;
541 }
542 /* Change bits are all write 1 to clear */
Xenia Ragiadakou204b7792013-11-15 05:34:07 +0200543 writel(port_status | status, addr);
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +0200544 port_status = readl(addr);
Sarah Sharp34fb5622009-12-09 15:59:08 -0800545 xhci_dbg(xhci, "clear port %s change, actual port %d status = 0x%x\n",
546 port_change_bit, wIndex, port_status);
547}
548
huajun lia0885922011-05-03 21:11:00 +0800549static int xhci_get_ports(struct usb_hcd *hcd, __le32 __iomem ***port_array)
550{
551 int max_ports;
552 struct xhci_hcd *xhci = hcd_to_xhci(hcd);
553
Mathias Nymanb50107b2015-10-01 18:40:38 +0300554 if (hcd->speed >= HCD_USB3) {
huajun lia0885922011-05-03 21:11:00 +0800555 max_ports = xhci->num_usb3_ports;
556 *port_array = xhci->usb3_ports;
557 } else {
558 max_ports = xhci->num_usb2_ports;
559 *port_array = xhci->usb2_ports;
560 }
561
562 return max_ports;
563}
564
Andiry Xuc9682df2011-09-23 14:19:48 -0700565void xhci_set_link_state(struct xhci_hcd *xhci, __le32 __iomem **port_array,
566 int port_id, u32 link_state)
567{
568 u32 temp;
569
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +0200570 temp = readl(port_array[port_id]);
Andiry Xuc9682df2011-09-23 14:19:48 -0700571 temp = xhci_port_state_to_neutral(temp);
572 temp &= ~PORT_PLS_MASK;
573 temp |= PORT_LINK_STROBE | link_state;
Xenia Ragiadakou204b7792013-11-15 05:34:07 +0200574 writel(temp, port_array[port_id]);
Andiry Xuc9682df2011-09-23 14:19:48 -0700575}
576
Felipe Balbied384bd2012-08-07 14:10:03 +0300577static void xhci_set_remote_wake_mask(struct xhci_hcd *xhci,
Sarah Sharp4296c70a2012-01-06 10:34:31 -0800578 __le32 __iomem **port_array, int port_id, u16 wake_mask)
579{
580 u32 temp;
581
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +0200582 temp = readl(port_array[port_id]);
Sarah Sharp4296c70a2012-01-06 10:34:31 -0800583 temp = xhci_port_state_to_neutral(temp);
584
585 if (wake_mask & USB_PORT_FEAT_REMOTE_WAKE_CONNECT)
586 temp |= PORT_WKCONN_E;
587 else
588 temp &= ~PORT_WKCONN_E;
589
590 if (wake_mask & USB_PORT_FEAT_REMOTE_WAKE_DISCONNECT)
591 temp |= PORT_WKDISC_E;
592 else
593 temp &= ~PORT_WKDISC_E;
594
595 if (wake_mask & USB_PORT_FEAT_REMOTE_WAKE_OVER_CURRENT)
596 temp |= PORT_WKOC_E;
597 else
598 temp &= ~PORT_WKOC_E;
599
Xenia Ragiadakou204b7792013-11-15 05:34:07 +0200600 writel(temp, port_array[port_id]);
Sarah Sharp4296c70a2012-01-06 10:34:31 -0800601}
602
Andiry Xud2f52c92011-09-23 14:19:49 -0700603/* Test and clear port RWC bit */
604void xhci_test_and_clear_bit(struct xhci_hcd *xhci, __le32 __iomem **port_array,
605 int port_id, u32 port_bit)
606{
607 u32 temp;
608
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +0200609 temp = readl(port_array[port_id]);
Andiry Xud2f52c92011-09-23 14:19:49 -0700610 if (temp & port_bit) {
611 temp = xhci_port_state_to_neutral(temp);
612 temp |= port_bit;
Xenia Ragiadakou204b7792013-11-15 05:34:07 +0200613 writel(temp, port_array[port_id]);
Andiry Xud2f52c92011-09-23 14:19:49 -0700614 }
615}
616
Sarah Sharp063ebeb2013-04-02 09:23:42 -0700617/* Updates Link Status for USB 2.1 port */
618static void xhci_hub_report_usb2_link_state(u32 *status, u32 status_reg)
619{
620 if ((status_reg & PORT_PLS_MASK) == XDEV_U2)
621 *status |= USB_PORT_STAT_L1;
622}
623
Stanislaw Ledwon8bea2bd2012-06-18 15:20:00 +0200624/* Updates Link Status for super Speed port */
Felipe Balbi96908582014-08-27 16:38:04 -0500625static void xhci_hub_report_usb3_link_state(struct xhci_hcd *xhci,
626 u32 *status, u32 status_reg)
Stanislaw Ledwon8bea2bd2012-06-18 15:20:00 +0200627{
628 u32 pls = status_reg & PORT_PLS_MASK;
629
630 /* resume state is a xHCI internal state.
Zhuang Jin Can243292a2015-07-21 17:20:29 +0300631 * Do not report it to usb core, instead, pretend to be U3,
632 * thus usb core knows it's not ready for transfer
Stanislaw Ledwon8bea2bd2012-06-18 15:20:00 +0200633 */
Zhuang Jin Can243292a2015-07-21 17:20:29 +0300634 if (pls == XDEV_RESUME) {
635 *status |= USB_SS_PORT_LS_U3;
Stanislaw Ledwon8bea2bd2012-06-18 15:20:00 +0200636 return;
Zhuang Jin Can243292a2015-07-21 17:20:29 +0300637 }
Stanislaw Ledwon8bea2bd2012-06-18 15:20:00 +0200638
639 /* When the CAS bit is set then warm reset
640 * should be performed on port
641 */
642 if (status_reg & PORT_CAS) {
643 /* The CAS bit can be set while the port is
644 * in any link state.
645 * Only roothubs have CAS bit, so we
646 * pretend to be in compliance mode
647 * unless we're already in compliance
648 * or the inactive state.
649 */
650 if (pls != USB_SS_PORT_LS_COMP_MOD &&
651 pls != USB_SS_PORT_LS_SS_INACTIVE) {
652 pls = USB_SS_PORT_LS_COMP_MOD;
653 }
654 /* Return also connection bit -
655 * hub state machine resets port
656 * when this bit is set.
657 */
658 pls |= USB_PORT_STAT_CONNECTION;
Alexis R. Cortes71c731a2012-08-03 14:00:27 -0500659 } else {
660 /*
661 * If CAS bit isn't set but the Port is already at
662 * Compliance Mode, fake a connection so the USB core
663 * notices the Compliance state and resets the port.
664 * This resolves an issue generated by the SN65LVPE502CP
665 * in which sometimes the port enters compliance mode
666 * caused by a delay on the host-device negotiation.
667 */
Felipe Balbi96908582014-08-27 16:38:04 -0500668 if ((xhci->quirks & XHCI_COMP_MODE_QUIRK) &&
669 (pls == USB_SS_PORT_LS_COMP_MOD))
Alexis R. Cortes71c731a2012-08-03 14:00:27 -0500670 pls |= USB_PORT_STAT_CONNECTION;
Stanislaw Ledwon8bea2bd2012-06-18 15:20:00 +0200671 }
Alexis R. Cortes71c731a2012-08-03 14:00:27 -0500672
Stanislaw Ledwon8bea2bd2012-06-18 15:20:00 +0200673 /* update status field */
674 *status |= pls;
675}
676
Alexis R. Cortes71c731a2012-08-03 14:00:27 -0500677/*
678 * Function for Compliance Mode Quirk.
679 *
680 * This Function verifies if all xhc USB3 ports have entered U0, if so,
681 * the compliance mode timer is deleted. A port won't enter
682 * compliance mode if it has previously entered U0.
683 */
Sachin Kamat5f20cf12013-09-16 12:01:34 +0530684static void xhci_del_comp_mod_timer(struct xhci_hcd *xhci, u32 status,
685 u16 wIndex)
Alexis R. Cortes71c731a2012-08-03 14:00:27 -0500686{
687 u32 all_ports_seen_u0 = ((1 << xhci->num_usb3_ports)-1);
688 bool port_in_u0 = ((status & PORT_PLS_MASK) == XDEV_U0);
689
690 if (!(xhci->quirks & XHCI_COMP_MODE_QUIRK))
691 return;
692
693 if ((xhci->port_status_u0 != all_ports_seen_u0) && port_in_u0) {
694 xhci->port_status_u0 |= 1 << wIndex;
695 if (xhci->port_status_u0 == all_ports_seen_u0) {
696 del_timer_sync(&xhci->comp_mode_recovery_timer);
Xenia Ragiadakou4bdfe4c2013-08-06 07:52:45 +0300697 xhci_dbg_trace(xhci, trace_xhci_dbg_quirks,
698 "All USB3 ports have entered U0 already!");
699 xhci_dbg_trace(xhci, trace_xhci_dbg_quirks,
700 "Compliance Mode Recovery Timer Deleted.");
Alexis R. Cortes71c731a2012-08-03 14:00:27 -0500701 }
702 }
703}
704
Mathias Nyman395f5402015-10-01 18:40:39 +0300705static u32 xhci_get_ext_port_status(u32 raw_port_status, u32 port_li)
706{
707 u32 ext_stat = 0;
708 int speed_id;
709
710 /* only support rx and tx lane counts of 1 in usb3.1 spec */
711 speed_id = DEV_PORT_SPEED(raw_port_status);
712 ext_stat |= speed_id; /* bits 3:0, RX speed id */
713 ext_stat |= speed_id << 4; /* bits 7:4, TX speed id */
714
715 ext_stat |= PORT_RX_LANES(port_li) << 8; /* bits 11:8 Rx lane count */
716 ext_stat |= PORT_TX_LANES(port_li) << 12; /* bits 15:12 Tx lane count */
717
718 return ext_stat;
719}
720
Sarah Sharpeae5b172013-04-02 08:42:20 -0700721/*
722 * Converts a raw xHCI port status into the format that external USB 2.0 or USB
723 * 3.0 hubs use.
724 *
725 * Possible side effects:
726 * - Mark a port as being done with device resume,
727 * and ring the endpoint doorbells.
728 * - Stop the Synopsys redriver Compliance Mode polling.
Sarah Sharp8b3d4572013-08-20 08:12:12 -0700729 * - Drop and reacquire the xHCI lock, in order to wait for port resume.
Sarah Sharpeae5b172013-04-02 08:42:20 -0700730 */
731static u32 xhci_get_port_status(struct usb_hcd *hcd,
732 struct xhci_bus_state *bus_state,
733 __le32 __iomem **port_array,
Sarah Sharp8b3d4572013-08-20 08:12:12 -0700734 u16 wIndex, u32 raw_port_status,
735 unsigned long flags)
736 __releases(&xhci->lock)
737 __acquires(&xhci->lock)
Sarah Sharpeae5b172013-04-02 08:42:20 -0700738{
739 struct xhci_hcd *xhci = hcd_to_xhci(hcd);
740 u32 status = 0;
741 int slot_id;
742
743 /* wPortChange bits */
744 if (raw_port_status & PORT_CSC)
745 status |= USB_PORT_STAT_C_CONNECTION << 16;
746 if (raw_port_status & PORT_PEC)
747 status |= USB_PORT_STAT_C_ENABLE << 16;
748 if ((raw_port_status & PORT_OCC))
749 status |= USB_PORT_STAT_C_OVERCURRENT << 16;
750 if ((raw_port_status & PORT_RC))
751 status |= USB_PORT_STAT_C_RESET << 16;
752 /* USB3.0 only */
Mathias Nymanb50107b2015-10-01 18:40:38 +0300753 if (hcd->speed >= HCD_USB3) {
Zhuang Jin Canaca3a042015-07-21 17:20:31 +0300754 /* Port link change with port in resume state should not be
755 * reported to usbcore, as this is an internal state to be
756 * handled by xhci driver. Reporting PLC to usbcore may
757 * cause usbcore clearing PLC first and port change event
758 * irq won't be generated.
759 */
760 if ((raw_port_status & PORT_PLC) &&
761 (raw_port_status & PORT_PLS_MASK) != XDEV_RESUME)
Sarah Sharpeae5b172013-04-02 08:42:20 -0700762 status |= USB_PORT_STAT_C_LINK_STATE << 16;
763 if ((raw_port_status & PORT_WRC))
764 status |= USB_PORT_STAT_C_BH_RESET << 16;
Lu Baolu94251832015-03-23 18:27:41 +0200765 if ((raw_port_status & PORT_CEC))
766 status |= USB_PORT_STAT_C_CONFIG_ERROR << 16;
Sarah Sharpeae5b172013-04-02 08:42:20 -0700767 }
768
Mathias Nymanb50107b2015-10-01 18:40:38 +0300769 if (hcd->speed < HCD_USB3) {
Sarah Sharpeae5b172013-04-02 08:42:20 -0700770 if ((raw_port_status & PORT_PLS_MASK) == XDEV_U3
771 && (raw_port_status & PORT_POWER))
772 status |= USB_PORT_STAT_SUSPEND;
773 }
774 if ((raw_port_status & PORT_PLS_MASK) == XDEV_RESUME &&
Mathias Nyman2338b9e2015-10-01 18:40:36 +0300775 !DEV_SUPERSPEED_ANY(raw_port_status)) {
Sarah Sharpeae5b172013-04-02 08:42:20 -0700776 if ((raw_port_status & PORT_RESET) ||
777 !(raw_port_status & PORT_PE))
778 return 0xffffffff;
Mathias Nymanf69115f2015-12-11 14:38:06 +0200779 /* did port event handler already start resume timing? */
780 if (!bus_state->resume_done[wIndex]) {
781 /* If not, maybe we are in a host initated resume? */
782 if (test_bit(wIndex, &bus_state->resuming_ports)) {
783 /* Host initated resume doesn't time the resume
784 * signalling using resume_done[].
785 * It manually sets RESUME state, sleeps 20ms
786 * and sets U0 state. This should probably be
787 * changed, but not right now.
788 */
789 } else {
790 /* port resume was discovered now and here,
791 * start resume timing
792 */
793 unsigned long timeout = jiffies +
794 msecs_to_jiffies(USB_RESUME_TIMEOUT);
795
796 set_bit(wIndex, &bus_state->resuming_ports);
797 bus_state->resume_done[wIndex] = timeout;
798 mod_timer(&hcd->rh_timer, timeout);
799 }
800 /* Has resume been signalled for USB_RESUME_TIME yet? */
801 } else if (time_after_eq(jiffies,
802 bus_state->resume_done[wIndex])) {
Sarah Sharp8b3d4572013-08-20 08:12:12 -0700803 int time_left;
804
Sarah Sharpeae5b172013-04-02 08:42:20 -0700805 xhci_dbg(xhci, "Resume USB2 port %d\n",
806 wIndex + 1);
807 bus_state->resume_done[wIndex] = 0;
808 clear_bit(wIndex, &bus_state->resuming_ports);
Sarah Sharp8b3d4572013-08-20 08:12:12 -0700809
810 set_bit(wIndex, &bus_state->rexit_ports);
Mathias Nymanbf044082017-07-20 14:48:29 +0300811
812 xhci_test_and_clear_bit(xhci, port_array, wIndex,
813 PORT_PLC);
Sarah Sharpeae5b172013-04-02 08:42:20 -0700814 xhci_set_link_state(xhci, port_array, wIndex,
815 XDEV_U0);
Sarah Sharp8b3d4572013-08-20 08:12:12 -0700816
817 spin_unlock_irqrestore(&xhci->lock, flags);
818 time_left = wait_for_completion_timeout(
819 &bus_state->rexit_done[wIndex],
820 msecs_to_jiffies(
821 XHCI_MAX_REXIT_TIMEOUT));
822 spin_lock_irqsave(&xhci->lock, flags);
823
824 if (time_left) {
825 slot_id = xhci_find_slot_id_by_port(hcd,
826 xhci, wIndex + 1);
827 if (!slot_id) {
828 xhci_dbg(xhci, "slot_id is zero\n");
829 return 0xffffffff;
830 }
831 xhci_ring_device(xhci, slot_id);
832 } else {
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +0200833 int port_status = readl(port_array[wIndex]);
Sarah Sharp8b3d4572013-08-20 08:12:12 -0700834 xhci_warn(xhci, "Port resume took longer than %i msec, port status = 0x%x\n",
835 XHCI_MAX_REXIT_TIMEOUT,
836 port_status);
837 status |= USB_PORT_STAT_SUSPEND;
838 clear_bit(wIndex, &bus_state->rexit_ports);
Sarah Sharpeae5b172013-04-02 08:42:20 -0700839 }
Sarah Sharp8b3d4572013-08-20 08:12:12 -0700840
Sarah Sharpeae5b172013-04-02 08:42:20 -0700841 bus_state->port_c_suspend |= 1 << wIndex;
842 bus_state->suspended_ports &= ~(1 << wIndex);
843 } else {
844 /*
845 * The resume has been signaling for less than
Mathias Nymanf69115f2015-12-11 14:38:06 +0200846 * USB_RESUME_TIME. Report the port status as SUSPEND,
847 * let the usbcore check port status again and clear
848 * resume signaling later.
Sarah Sharpeae5b172013-04-02 08:42:20 -0700849 */
850 status |= USB_PORT_STAT_SUSPEND;
851 }
852 }
Mathias Nymanf69115f2015-12-11 14:38:06 +0200853 /*
854 * Clear stale usb2 resume signalling variables in case port changed
855 * state during resume signalling. For example on error
856 */
857 if ((bus_state->resume_done[wIndex] ||
858 test_bit(wIndex, &bus_state->resuming_ports)) &&
859 (raw_port_status & PORT_PLS_MASK) != XDEV_U3 &&
860 (raw_port_status & PORT_PLS_MASK) != XDEV_RESUME) {
861 bus_state->resume_done[wIndex] = 0;
862 clear_bit(wIndex, &bus_state->resuming_ports);
863 }
864
865
Mathias Nymandad67d52015-11-18 10:48:22 +0200866 if ((raw_port_status & PORT_PLS_MASK) == XDEV_U0 &&
867 (raw_port_status & PORT_POWER)) {
868 if (bus_state->suspended_ports & (1 << wIndex)) {
869 bus_state->suspended_ports &= ~(1 << wIndex);
870 if (hcd->speed < HCD_USB3)
871 bus_state->port_c_suspend |= 1 << wIndex;
872 }
873 bus_state->resume_done[wIndex] = 0;
874 clear_bit(wIndex, &bus_state->resuming_ports);
Sarah Sharpeae5b172013-04-02 08:42:20 -0700875 }
876 if (raw_port_status & PORT_CONNECT) {
877 status |= USB_PORT_STAT_CONNECTION;
878 status |= xhci_port_speed(raw_port_status);
879 }
880 if (raw_port_status & PORT_PE)
881 status |= USB_PORT_STAT_ENABLE;
882 if (raw_port_status & PORT_OC)
883 status |= USB_PORT_STAT_OVERCURRENT;
884 if (raw_port_status & PORT_RESET)
885 status |= USB_PORT_STAT_RESET;
886 if (raw_port_status & PORT_POWER) {
Mathias Nymanb50107b2015-10-01 18:40:38 +0300887 if (hcd->speed >= HCD_USB3)
Sarah Sharpeae5b172013-04-02 08:42:20 -0700888 status |= USB_SS_PORT_STAT_POWER;
889 else
890 status |= USB_PORT_STAT_POWER;
891 }
Sarah Sharp063ebeb2013-04-02 09:23:42 -0700892 /* Update Port Link State */
Mathias Nymanb50107b2015-10-01 18:40:38 +0300893 if (hcd->speed >= HCD_USB3) {
Felipe Balbi96908582014-08-27 16:38:04 -0500894 xhci_hub_report_usb3_link_state(xhci, &status, raw_port_status);
Sarah Sharpeae5b172013-04-02 08:42:20 -0700895 /*
896 * Verify if all USB3 Ports Have entered U0 already.
897 * Delete Compliance Mode Timer if so.
898 */
899 xhci_del_comp_mod_timer(xhci, raw_port_status, wIndex);
Sarah Sharp063ebeb2013-04-02 09:23:42 -0700900 } else {
901 xhci_hub_report_usb2_link_state(&status, raw_port_status);
Sarah Sharpeae5b172013-04-02 08:42:20 -0700902 }
903 if (bus_state->port_c_suspend & (1 << wIndex))
Mathias Nyman5e6389f2015-11-24 13:09:46 +0200904 status |= USB_PORT_STAT_C_SUSPEND << 16;
Sarah Sharpeae5b172013-04-02 08:42:20 -0700905
906 return status;
907}
908
Jack Pham32788c52013-06-20 13:31:37 -0700909static void xhci_single_step_completion(struct urb *urb)
910{
911 struct completion *done = urb->context;
912
913 complete(done);
914}
915
916/*
917 * Allocate a URB and initialize the various fields of it.
918 * This API is used by the single_step_set_feature test of
919 * EHSET where IN packet of the GetDescriptor request is
920 * sent 15secs after the SETUP packet.
921 * Return NULL if failed.
922 */
923static struct urb *xhci_request_single_step_set_feature_urb(
924 struct usb_device *udev,
925 void *dr,
926 void *buf,
927 struct completion *done)
928{
929 struct urb *urb;
930 struct usb_hcd *hcd = bus_to_hcd(udev->bus);
931 struct usb_host_endpoint *ep;
932
933 urb = usb_alloc_urb(0, GFP_KERNEL);
934 if (!urb)
935 return NULL;
936
937 urb->pipe = usb_rcvctrlpipe(udev, 0);
938 ep = udev->ep_in[usb_pipeendpoint(urb->pipe)];
939 if (!ep) {
940 usb_free_urb(urb);
941 return NULL;
942 }
943
944 /*
945 * Initialize the various URB fields as these are used by the HCD
946 * driver to queue it and as well as when completion happens.
947 */
948 urb->ep = ep;
949 urb->dev = udev;
950 urb->setup_packet = dr;
951 urb->transfer_buffer = buf;
952 urb->transfer_buffer_length = USB_DT_DEVICE_SIZE;
953 urb->complete = xhci_single_step_completion;
954 urb->status = -EINPROGRESS;
955 urb->actual_length = 0;
956 urb->transfer_flags = URB_DIR_IN;
957 usb_get_urb(urb);
958 atomic_inc(&urb->use_count);
959 atomic_inc(&urb->dev->urbnum);
960 usb_hcd_map_urb_for_dma(hcd, urb, GFP_KERNEL);
961 urb->context = done;
962 return urb;
963}
964
965/*
966 * This function implements the USB_PORT_FEAT_TEST handling of the
967 * SINGLE_STEP_SET_FEATURE test mode as defined in the Embedded
968 * High-Speed Electrical Test (EHSET) specification. This simply
969 * issues a GetDescriptor control transfer, with an inserted 15-second
970 * delay after the end of the SETUP stage and before the IN token of
971 * the DATA stage is set. The idea is that this gives the test operator
972 * enough time to configure the oscilloscope to perform a measurement
973 * of the response time between the DATA and ACK packets that follow.
974 */
975static int xhci_ehset_single_step_set_feature(struct usb_hcd *hcd, int port)
976{
977 int retval;
978 struct usb_ctrlrequest *dr;
979 struct urb *urb;
980 struct usb_device *udev;
981 struct xhci_hcd *xhci = hcd_to_xhci(hcd);
982 struct usb_device_descriptor *buf;
983 unsigned long flags;
984 DECLARE_COMPLETION_ONSTACK(done);
985
986 /* Obtain udev of the rhub's child port */
987 udev = usb_hub_find_child(hcd->self.root_hub, port);
988 if (!udev) {
989 xhci_err(xhci, "No device attached to the RootHub\n");
990 return -ENODEV;
991 }
992 buf = kmalloc(USB_DT_DEVICE_SIZE, GFP_KERNEL);
993 if (!buf)
994 return -ENOMEM;
995
996 dr = kmalloc(sizeof(struct usb_ctrlrequest), GFP_KERNEL);
997 if (!dr) {
998 kfree(buf);
999 return -ENOMEM;
1000 }
1001
1002 /* Fill Setup packet for GetDescriptor */
1003 dr->bRequestType = USB_DIR_IN;
1004 dr->bRequest = USB_REQ_GET_DESCRIPTOR;
1005 dr->wValue = cpu_to_le16(USB_DT_DEVICE << 8);
1006 dr->wIndex = 0;
1007 dr->wLength = cpu_to_le16(USB_DT_DEVICE_SIZE);
1008 urb = xhci_request_single_step_set_feature_urb(udev, dr, buf, &done);
1009 if (!urb) {
1010 retval = -ENOMEM;
1011 goto cleanup;
1012 }
1013
1014 /* Now complete just the SETUP stage */
1015 spin_lock_irqsave(&xhci->lock, flags);
1016 retval = xhci_submit_single_step_set_feature(hcd, urb, 1);
1017 spin_unlock_irqrestore(&xhci->lock, flags);
1018 if (retval)
1019 goto out1;
1020
1021 if (!wait_for_completion_timeout(&done, msecs_to_jiffies(2000))) {
1022 usb_kill_urb(urb);
1023 retval = -ETIMEDOUT;
1024 xhci_err(xhci, "%s SETUP stage timed out on ep0\n", __func__);
1025 goto out1;
1026 }
1027
1028 /* Sleep for 15 seconds; HC will send SOFs during this period */
1029 msleep(15 * 1000);
1030
1031 /* Complete remaining DATA and status stages. Re-use same URB */
1032 urb->status = -EINPROGRESS;
1033 usb_get_urb(urb);
1034 atomic_inc(&urb->use_count);
1035 atomic_inc(&urb->dev->urbnum);
1036
1037 spin_lock_irqsave(&xhci->lock, flags);
1038 retval = xhci_submit_single_step_set_feature(hcd, urb, 0);
1039 spin_unlock_irqrestore(&xhci->lock, flags);
1040 if (!retval && !wait_for_completion_timeout(&done,
1041 msecs_to_jiffies(2000))) {
1042 usb_kill_urb(urb);
1043 retval = -ETIMEDOUT;
1044 xhci_err(xhci, "%s IN stage timed out on ep0\n", __func__);
1045 }
1046out1:
1047 usb_free_urb(urb);
1048cleanup:
1049 kfree(dr);
1050 kfree(buf);
1051 return retval;
1052}
1053
Sarah Sharp0f2a7932009-04-27 19:57:12 -07001054int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
1055 u16 wIndex, char *buf, u16 wLength)
1056{
1057 struct xhci_hcd *xhci = hcd_to_xhci(hcd);
huajun lia0885922011-05-03 21:11:00 +08001058 int max_ports;
Sarah Sharp0f2a7932009-04-27 19:57:12 -07001059 unsigned long flags;
Andiry Xuc9682df2011-09-23 14:19:48 -07001060 u32 temp, status;
Sarah Sharp0f2a7932009-04-27 19:57:12 -07001061 int retval = 0;
Matt Evans28ccd292011-03-29 13:40:46 +11001062 __le32 __iomem **port_array;
Andiry Xube88fe42010-10-14 07:22:57 -07001063 int slot_id;
Sarah Sharp20b67cf2010-12-15 12:47:14 -08001064 struct xhci_bus_state *bus_state;
Andiry Xu2c441782011-04-27 18:07:39 +08001065 u16 link_state = 0;
Sarah Sharp4296c70a2012-01-06 10:34:31 -08001066 u16 wake_mask = 0;
Sarah Sharp797b0ca2011-11-10 16:02:13 -08001067 u16 timeout = 0;
Mayank Rana7d5e01f2015-07-09 18:28:41 -07001068 u16 test_mode = 0;
Hemant Kumar74c850d2017-11-28 16:03:07 -08001069 enum usb_device_speed s = hcd->self.root_hub->speed;
Sarah Sharp0f2a7932009-04-27 19:57:12 -07001070
huajun lia0885922011-05-03 21:11:00 +08001071 max_ports = xhci_get_ports(hcd, &port_array);
Sarah Sharp20b67cf2010-12-15 12:47:14 -08001072 bus_state = &xhci->bus_state[hcd_index(hcd)];
Sarah Sharp0f2a7932009-04-27 19:57:12 -07001073
1074 spin_lock_irqsave(&xhci->lock, flags);
1075 switch (typeReq) {
1076 case GetHubStatus:
1077 /* No power source, over-current reported per port */
1078 memset(buf, 0, 4);
1079 break;
1080 case GetHubDescriptor:
Sarah Sharp4bbb0ac2010-11-29 16:14:37 -08001081 /* Check to make sure userspace is asking for the USB 3.0 hub
1082 * descriptor for the USB 3.0 roothub. If not, we stall the
1083 * endpoint, like external hubs do.
1084 */
Mathias Nymanb50107b2015-10-01 18:40:38 +03001085 if (hcd->speed >= HCD_USB3 &&
Sarah Sharp4bbb0ac2010-11-29 16:14:37 -08001086 (wLength < USB_DT_SS_HUB_SIZE ||
1087 wValue != (USB_DT_SS_HUB << 8))) {
1088 xhci_dbg(xhci, "Wrong hub descriptor type for "
1089 "USB 3.0 roothub.\n");
1090 goto error;
1091 }
Sarah Sharpf6ff0ac2010-12-16 11:21:10 -08001092 xhci_hub_descriptor(hcd, xhci,
1093 (struct usb_hub_descriptor *) buf);
Sarah Sharp0f2a7932009-04-27 19:57:12 -07001094 break;
Sarah Sharp48e82362011-10-06 11:54:23 -07001095 case DeviceRequest | USB_REQ_GET_DESCRIPTOR:
1096 if ((wValue & 0xff00) != (USB_DT_BOS << 8))
1097 goto error;
1098
Mathias Nyman5693e0b2015-10-01 18:40:35 +03001099 if (hcd->speed < HCD_USB3)
Sarah Sharp48e82362011-10-06 11:54:23 -07001100 goto error;
1101
Mathias Nyman5693e0b2015-10-01 18:40:35 +03001102 retval = xhci_create_usb3_bos_desc(xhci, buf, wLength);
Sarah Sharp48e82362011-10-06 11:54:23 -07001103 spin_unlock_irqrestore(&xhci->lock, flags);
Mathias Nyman5693e0b2015-10-01 18:40:35 +03001104 return retval;
Sarah Sharp0f2a7932009-04-27 19:57:12 -07001105 case GetPortStatus:
huajun lia0885922011-05-03 21:11:00 +08001106 if (!wIndex || wIndex > max_ports)
Sarah Sharp0f2a7932009-04-27 19:57:12 -07001107 goto error;
1108 wIndex--;
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +02001109 temp = readl(port_array[wIndex]);
Sarah Sharpf9de8152010-10-29 14:37:23 -07001110 if (temp == 0xffffffff) {
1111 retval = -ENODEV;
1112 break;
1113 }
Sarah Sharpeae5b172013-04-02 08:42:20 -07001114 status = xhci_get_port_status(hcd, bus_state, port_array,
Sarah Sharp8b3d4572013-08-20 08:12:12 -07001115 wIndex, temp, flags);
Sarah Sharpeae5b172013-04-02 08:42:20 -07001116 if (status == 0xffffffff)
1117 goto error;
Sarah Sharp0f2a7932009-04-27 19:57:12 -07001118
Sarah Sharpeae5b172013-04-02 08:42:20 -07001119 xhci_dbg(xhci, "get port status, actual port %d status = 0x%x\n",
1120 wIndex, temp);
Sarah Sharp0f2a7932009-04-27 19:57:12 -07001121 xhci_dbg(xhci, "Get port status returned 0x%x\n", status);
Sarah Sharpeae5b172013-04-02 08:42:20 -07001122
Sarah Sharp0f2a7932009-04-27 19:57:12 -07001123 put_unaligned(cpu_to_le32(status), (__le32 *) buf);
Mathias Nyman395f5402015-10-01 18:40:39 +03001124 /* if USB 3.1 extended port status return additional 4 bytes */
1125 if (wValue == 0x02) {
1126 u32 port_li;
1127
1128 if (hcd->speed < HCD_USB31 || wLength != 8) {
1129 xhci_err(xhci, "get ext port status invalid parameter\n");
1130 retval = -EINVAL;
1131 break;
1132 }
1133 port_li = readl(port_array[wIndex] + PORTLI);
1134 status = xhci_get_ext_port_status(temp, port_li);
1135 put_unaligned_le32(cpu_to_le32(status), &buf[4]);
1136 }
Sarah Sharp0f2a7932009-04-27 19:57:12 -07001137 break;
1138 case SetPortFeature:
Andiry Xu2c441782011-04-27 18:07:39 +08001139 if (wValue == USB_PORT_FEAT_LINK_STATE)
1140 link_state = (wIndex & 0xff00) >> 3;
Sarah Sharp4296c70a2012-01-06 10:34:31 -08001141 if (wValue == USB_PORT_FEAT_REMOTE_WAKE_MASK)
1142 wake_mask = wIndex & 0xff00;
Mayank Rana7d5e01f2015-07-09 18:28:41 -07001143 /* The MSB of wIndex is the U1/U2 timeout OR TEST mode*/
1144 test_mode = timeout = (wIndex & 0xff00) >> 8;
Sarah Sharp0f2a7932009-04-27 19:57:12 -07001145 wIndex &= 0xff;
huajun lia0885922011-05-03 21:11:00 +08001146 if (!wIndex || wIndex > max_ports)
Sarah Sharp0f2a7932009-04-27 19:57:12 -07001147 goto error;
1148 wIndex--;
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +02001149 temp = readl(port_array[wIndex]);
Sarah Sharpf9de8152010-10-29 14:37:23 -07001150 if (temp == 0xffffffff) {
1151 retval = -ENODEV;
1152 break;
1153 }
Sarah Sharp0f2a7932009-04-27 19:57:12 -07001154 temp = xhci_port_state_to_neutral(temp);
Sarah Sharp4bbb0ac2010-11-29 16:14:37 -08001155 /* FIXME: What new port features do we need to support? */
Sarah Sharp0f2a7932009-04-27 19:57:12 -07001156 switch (wValue) {
Andiry Xube88fe42010-10-14 07:22:57 -07001157 case USB_PORT_FEAT_SUSPEND:
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +02001158 temp = readl(port_array[wIndex]);
Andiry Xu65580b432011-09-23 14:19:52 -07001159 if ((temp & PORT_PLS_MASK) != XDEV_U0) {
1160 /* Resume the port to U0 first */
1161 xhci_set_link_state(xhci, port_array, wIndex,
1162 XDEV_U0);
1163 spin_unlock_irqrestore(&xhci->lock, flags);
1164 msleep(10);
1165 spin_lock_irqsave(&xhci->lock, flags);
1166 }
Andiry Xube88fe42010-10-14 07:22:57 -07001167 /* In spec software should not attempt to suspend
1168 * a port unless the port reports that it is in the
1169 * enabled (PED = ‘1’,PLS < ‘3’) state.
1170 */
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +02001171 temp = readl(port_array[wIndex]);
Andiry Xube88fe42010-10-14 07:22:57 -07001172 if ((temp & PORT_PE) == 0 || (temp & PORT_RESET)
1173 || (temp & PORT_PLS_MASK) >= XDEV_U3) {
1174 xhci_warn(xhci, "USB core suspending device "
1175 "not in U0/U1/U2.\n");
1176 goto error;
1177 }
1178
Sarah Sharp52336302010-12-16 10:49:09 -08001179 slot_id = xhci_find_slot_id_by_port(hcd, xhci,
1180 wIndex + 1);
Andiry Xube88fe42010-10-14 07:22:57 -07001181 if (!slot_id) {
1182 xhci_warn(xhci, "slot_id is zero\n");
1183 goto error;
1184 }
1185 /* unlock to execute stop endpoint commands */
1186 spin_unlock_irqrestore(&xhci->lock, flags);
1187 xhci_stop_device(xhci, slot_id, 1);
1188 spin_lock_irqsave(&xhci->lock, flags);
1189
Andiry Xuc9682df2011-09-23 14:19:48 -07001190 xhci_set_link_state(xhci, port_array, wIndex, XDEV_U3);
Andiry Xube88fe42010-10-14 07:22:57 -07001191
1192 spin_unlock_irqrestore(&xhci->lock, flags);
1193 msleep(10); /* wait device to enter */
1194 spin_lock_irqsave(&xhci->lock, flags);
1195
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +02001196 temp = readl(port_array[wIndex]);
Sarah Sharp20b67cf2010-12-15 12:47:14 -08001197 bus_state->suspended_ports |= 1 << wIndex;
Andiry Xube88fe42010-10-14 07:22:57 -07001198 break;
Andiry Xu2c441782011-04-27 18:07:39 +08001199 case USB_PORT_FEAT_LINK_STATE:
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +02001200 temp = readl(port_array[wIndex]);
Sarah Sharp41e7e052012-11-14 16:42:32 -08001201
1202 /* Disable port */
1203 if (link_state == USB_SS_PORT_LS_SS_DISABLED) {
1204 xhci_dbg(xhci, "Disable port %d\n", wIndex);
1205 temp = xhci_port_state_to_neutral(temp);
1206 /*
1207 * Clear all change bits, so that we get a new
1208 * connection event.
1209 */
1210 temp |= PORT_CSC | PORT_PEC | PORT_WRC |
1211 PORT_OCC | PORT_RC | PORT_PLC |
1212 PORT_CEC;
Xenia Ragiadakou204b7792013-11-15 05:34:07 +02001213 writel(temp | PORT_PE, port_array[wIndex]);
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +02001214 temp = readl(port_array[wIndex]);
Sarah Sharp41e7e052012-11-14 16:42:32 -08001215 break;
1216 }
1217
1218 /* Put link in RxDetect (enable port) */
1219 if (link_state == USB_SS_PORT_LS_RX_DETECT) {
1220 xhci_dbg(xhci, "Enable port %d\n", wIndex);
1221 xhci_set_link_state(xhci, port_array, wIndex,
1222 link_state);
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +02001223 temp = readl(port_array[wIndex]);
Sarah Sharp41e7e052012-11-14 16:42:32 -08001224 break;
1225 }
1226
Jack Phambd446052017-07-27 18:35:28 -07001227 /*
1228 * For xHCI 1.1 according to section 4.19.1.2.4.1 a
1229 * root hub port's transition to compliance mode upon
1230 * detecting LFPS timeout may be controlled by an
1231 * Compliance Transition Enabled (CTE) flag (not
1232 * software visible). This flag is set by writing 0xA
1233 * to PORTSC PLS field which will allow transition to
1234 * compliance mode the next time LFPS timeout is
1235 * encountered. A warm reset will clear it.
1236 *
1237 * The CTE flag is only supported if the HCCPARAMS2 CTC
1238 * flag is set, otherwise, the compliance substate is
1239 * automatically entered as on 1.0 and prior.
1240 */
1241 if (link_state == USB_SS_PORT_LS_COMP_MOD) {
1242 if (!HCC2_CTC(xhci->hcc_params2)) {
1243 xhci_dbg(xhci, "CTC flag is 0, port already supports entering compliance mode\n");
1244 break;
1245 }
1246
1247 if ((temp & PORT_CONNECT)) {
1248 xhci_warn(xhci, "Can't set compliance mode when port is connected\n");
1249 goto error;
1250 }
1251
1252 xhci_dbg(xhci, "Enable compliance mode transition for port %d\n",
1253 wIndex);
1254 xhci_set_link_state(xhci, port_array, wIndex,
1255 link_state);
1256 temp = readl(port_array[wIndex]);
1257 break;
1258 }
1259
Andiry Xu2c441782011-04-27 18:07:39 +08001260 /* Software should not attempt to set
Sarah Sharp41e7e052012-11-14 16:42:32 -08001261 * port link state above '3' (U3) and the port
Andiry Xu2c441782011-04-27 18:07:39 +08001262 * must be enabled.
1263 */
1264 if ((temp & PORT_PE) == 0 ||
Sarah Sharp41e7e052012-11-14 16:42:32 -08001265 (link_state > USB_SS_PORT_LS_U3)) {
Andiry Xu2c441782011-04-27 18:07:39 +08001266 xhci_warn(xhci, "Cannot set link state.\n");
1267 goto error;
1268 }
1269
1270 if (link_state == USB_SS_PORT_LS_U3) {
1271 slot_id = xhci_find_slot_id_by_port(hcd, xhci,
1272 wIndex + 1);
1273 if (slot_id) {
1274 /* unlock to execute stop endpoint
1275 * commands */
1276 spin_unlock_irqrestore(&xhci->lock,
1277 flags);
1278 xhci_stop_device(xhci, slot_id, 1);
1279 spin_lock_irqsave(&xhci->lock, flags);
1280 }
1281 }
1282
Andiry Xuc9682df2011-09-23 14:19:48 -07001283 xhci_set_link_state(xhci, port_array, wIndex,
1284 link_state);
Andiry Xu2c441782011-04-27 18:07:39 +08001285
1286 spin_unlock_irqrestore(&xhci->lock, flags);
1287 msleep(20); /* wait device to enter */
1288 spin_lock_irqsave(&xhci->lock, flags);
1289
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +02001290 temp = readl(port_array[wIndex]);
Andiry Xu2c441782011-04-27 18:07:39 +08001291 if (link_state == USB_SS_PORT_LS_U3)
1292 bus_state->suspended_ports |= 1 << wIndex;
1293 break;
Sarah Sharp0f2a7932009-04-27 19:57:12 -07001294 case USB_PORT_FEAT_POWER:
1295 /*
1296 * Turn on ports, even if there isn't per-port switching.
1297 * HC will report connect events even before this is set.
Petr Mladek37ebb542014-09-19 17:32:23 +02001298 * However, hub_wq will ignore the roothub events until
Sarah Sharp0f2a7932009-04-27 19:57:12 -07001299 * the roothub is registered.
1300 */
Xenia Ragiadakou204b7792013-11-15 05:34:07 +02001301 writel(temp | PORT_POWER, port_array[wIndex]);
Sarah Sharp0f2a7932009-04-27 19:57:12 -07001302
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +02001303 temp = readl(port_array[wIndex]);
Sarah Sharp0f2a7932009-04-27 19:57:12 -07001304 xhci_dbg(xhci, "set port power, actual port %d status = 0x%x\n", wIndex, temp);
Lan Tianyuf7ac7782012-09-05 13:44:36 +08001305
Lan Tianyu170ed802012-10-15 15:38:34 +08001306 spin_unlock_irqrestore(&xhci->lock, flags);
Lan Tianyuf7ac7782012-09-05 13:44:36 +08001307 temp = usb_acpi_power_manageable(hcd->self.root_hub,
1308 wIndex);
1309 if (temp)
1310 usb_acpi_set_power_state(hcd->self.root_hub,
1311 wIndex, true);
Lan Tianyu170ed802012-10-15 15:38:34 +08001312 spin_lock_irqsave(&xhci->lock, flags);
Sarah Sharp0f2a7932009-04-27 19:57:12 -07001313 break;
1314 case USB_PORT_FEAT_RESET:
1315 temp = (temp | PORT_RESET);
Xenia Ragiadakou204b7792013-11-15 05:34:07 +02001316 writel(temp, port_array[wIndex]);
Sarah Sharp0f2a7932009-04-27 19:57:12 -07001317
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +02001318 temp = readl(port_array[wIndex]);
Hemant Kumar74c850d2017-11-28 16:03:07 -08001319
1320 if (s == USB_SPEED_HIGH)
1321 usb_phy_start_port_reset(hcd->usb_phy);
1322
Sarah Sharp0f2a7932009-04-27 19:57:12 -07001323 xhci_dbg(xhci, "set port reset, actual port %d status = 0x%x\n", wIndex, temp);
1324 break;
Sarah Sharp4296c70a2012-01-06 10:34:31 -08001325 case USB_PORT_FEAT_REMOTE_WAKE_MASK:
1326 xhci_set_remote_wake_mask(xhci, port_array,
1327 wIndex, wake_mask);
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +02001328 temp = readl(port_array[wIndex]);
Sarah Sharp4296c70a2012-01-06 10:34:31 -08001329 xhci_dbg(xhci, "set port remote wake mask, "
1330 "actual port %d status = 0x%x\n",
1331 wIndex, temp);
1332 break;
Andiry Xua11496e2011-04-27 18:07:29 +08001333 case USB_PORT_FEAT_BH_PORT_RESET:
1334 temp |= PORT_WR;
Xenia Ragiadakou204b7792013-11-15 05:34:07 +02001335 writel(temp, port_array[wIndex]);
Andiry Xua11496e2011-04-27 18:07:29 +08001336
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +02001337 temp = readl(port_array[wIndex]);
Andiry Xua11496e2011-04-27 18:07:29 +08001338 break;
Sarah Sharp797b0ca2011-11-10 16:02:13 -08001339 case USB_PORT_FEAT_U1_TIMEOUT:
Mathias Nymanb50107b2015-10-01 18:40:38 +03001340 if (hcd->speed < HCD_USB3)
Sarah Sharp797b0ca2011-11-10 16:02:13 -08001341 goto error;
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +02001342 temp = readl(port_array[wIndex] + PORTPMSC);
Sarah Sharp797b0ca2011-11-10 16:02:13 -08001343 temp &= ~PORT_U1_TIMEOUT_MASK;
1344 temp |= PORT_U1_TIMEOUT(timeout);
Xenia Ragiadakou204b7792013-11-15 05:34:07 +02001345 writel(temp, port_array[wIndex] + PORTPMSC);
Sarah Sharp797b0ca2011-11-10 16:02:13 -08001346 break;
1347 case USB_PORT_FEAT_U2_TIMEOUT:
Mathias Nymanb50107b2015-10-01 18:40:38 +03001348 if (hcd->speed < HCD_USB3)
Sarah Sharp797b0ca2011-11-10 16:02:13 -08001349 goto error;
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +02001350 temp = readl(port_array[wIndex] + PORTPMSC);
Sarah Sharp797b0ca2011-11-10 16:02:13 -08001351 temp &= ~PORT_U2_TIMEOUT_MASK;
1352 temp |= PORT_U2_TIMEOUT(timeout);
Xenia Ragiadakou204b7792013-11-15 05:34:07 +02001353 writel(temp, port_array[wIndex] + PORTPMSC);
Sarah Sharp797b0ca2011-11-10 16:02:13 -08001354 break;
Mayank Rana7d5e01f2015-07-09 18:28:41 -07001355 case USB_PORT_FEAT_TEST:
1356 slot_id = xhci_find_slot_id_by_port(hcd, xhci,
1357 wIndex + 1);
1358 if (test_mode && test_mode <= 5) {
1359 /* unlock to execute stop endpoint commands */
1360 spin_unlock_irqrestore(&xhci->lock, flags);
1361 xhci_stop_device(xhci, slot_id, 1);
1362 spin_lock_irqsave(&xhci->lock, flags);
1363 xhci_halt(xhci);
1364
1365 temp = readl_relaxed(port_array[wIndex] +
1366 PORTPMSC);
1367 temp |= test_mode << 28;
1368 writel_relaxed(temp, port_array[wIndex] +
1369 PORTPMSC);
1370 /* to make sure above write goes through */
1371 mb();
Jack Pham32788c52013-06-20 13:31:37 -07001372 } else if (test_mode == 6) {
1373 spin_unlock_irqrestore(&xhci->lock, flags);
1374 retval = xhci_ehset_single_step_set_feature(hcd,
1375 wIndex);
1376 spin_lock_irqsave(&xhci->lock, flags);
Mayank Rana7d5e01f2015-07-09 18:28:41 -07001377 } else {
1378 goto error;
1379 }
1380 break;
Sarah Sharp0f2a7932009-04-27 19:57:12 -07001381 default:
1382 goto error;
1383 }
Sarah Sharp5308a912010-12-01 11:34:59 -08001384 /* unblock any posted writes */
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +02001385 temp = readl(port_array[wIndex]);
Sarah Sharp0f2a7932009-04-27 19:57:12 -07001386 break;
1387 case ClearPortFeature:
huajun lia0885922011-05-03 21:11:00 +08001388 if (!wIndex || wIndex > max_ports)
Sarah Sharp0f2a7932009-04-27 19:57:12 -07001389 goto error;
1390 wIndex--;
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +02001391 temp = readl(port_array[wIndex]);
Sarah Sharpf9de8152010-10-29 14:37:23 -07001392 if (temp == 0xffffffff) {
1393 retval = -ENODEV;
1394 break;
1395 }
Sarah Sharp4bbb0ac2010-11-29 16:14:37 -08001396 /* FIXME: What new port features do we need to support? */
Sarah Sharp0f2a7932009-04-27 19:57:12 -07001397 temp = xhci_port_state_to_neutral(temp);
1398 switch (wValue) {
Andiry Xube88fe42010-10-14 07:22:57 -07001399 case USB_PORT_FEAT_SUSPEND:
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +02001400 temp = readl(port_array[wIndex]);
Andiry Xube88fe42010-10-14 07:22:57 -07001401 xhci_dbg(xhci, "clear USB_PORT_FEAT_SUSPEND\n");
1402 xhci_dbg(xhci, "PORTSC %04x\n", temp);
1403 if (temp & PORT_RESET)
1404 goto error;
Andiry Xu5ac04bf2011-08-03 16:46:48 +08001405 if ((temp & PORT_PLS_MASK) == XDEV_U3) {
Andiry Xube88fe42010-10-14 07:22:57 -07001406 if ((temp & PORT_PE) == 0)
1407 goto error;
Andiry Xube88fe42010-10-14 07:22:57 -07001408
Mathias Nymanf69115f2015-12-11 14:38:06 +02001409 set_bit(wIndex, &bus_state->resuming_ports);
Andiry Xuc9682df2011-09-23 14:19:48 -07001410 xhci_set_link_state(xhci, port_array, wIndex,
1411 XDEV_RESUME);
1412 spin_unlock_irqrestore(&xhci->lock, flags);
Hemant Kumar7ee61092016-11-08 15:46:44 -08001413 usleep_range(21000, 21500);
Andiry Xua7114232011-04-27 18:07:50 +08001414 spin_lock_irqsave(&xhci->lock, flags);
Andiry Xuc9682df2011-09-23 14:19:48 -07001415 xhci_set_link_state(xhci, port_array, wIndex,
1416 XDEV_U0);
Mathias Nymanf69115f2015-12-11 14:38:06 +02001417 clear_bit(wIndex, &bus_state->resuming_ports);
Andiry Xube88fe42010-10-14 07:22:57 -07001418 }
Andiry Xua7114232011-04-27 18:07:50 +08001419 bus_state->port_c_suspend |= 1 << wIndex;
Andiry Xube88fe42010-10-14 07:22:57 -07001420
Sarah Sharp52336302010-12-16 10:49:09 -08001421 slot_id = xhci_find_slot_id_by_port(hcd, xhci,
1422 wIndex + 1);
Andiry Xube88fe42010-10-14 07:22:57 -07001423 if (!slot_id) {
1424 xhci_dbg(xhci, "slot_id is zero\n");
1425 goto error;
1426 }
1427 xhci_ring_device(xhci, slot_id);
1428 break;
1429 case USB_PORT_FEAT_C_SUSPEND:
Sarah Sharp20b67cf2010-12-15 12:47:14 -08001430 bus_state->port_c_suspend &= ~(1 << wIndex);
Sarah Sharp0f2a7932009-04-27 19:57:12 -07001431 case USB_PORT_FEAT_C_RESET:
Andiry Xua11496e2011-04-27 18:07:29 +08001432 case USB_PORT_FEAT_C_BH_PORT_RESET:
Sarah Sharp0f2a7932009-04-27 19:57:12 -07001433 case USB_PORT_FEAT_C_CONNECTION:
Sarah Sharp0f2a7932009-04-27 19:57:12 -07001434 case USB_PORT_FEAT_C_OVER_CURRENT:
Sarah Sharp6219c042009-12-09 15:59:11 -08001435 case USB_PORT_FEAT_C_ENABLE:
Andiry Xu85387c02011-04-27 18:07:35 +08001436 case USB_PORT_FEAT_C_PORT_LINK_STATE:
Lu Baolu94251832015-03-23 18:27:41 +02001437 case USB_PORT_FEAT_C_PORT_CONFIG_ERROR:
Sarah Sharp34fb5622009-12-09 15:59:08 -08001438 xhci_clear_port_change_bit(xhci, wValue, wIndex,
Sarah Sharp5308a912010-12-01 11:34:59 -08001439 port_array[wIndex], temp);
Sarah Sharp0f2a7932009-04-27 19:57:12 -07001440 break;
Sarah Sharp6219c042009-12-09 15:59:11 -08001441 case USB_PORT_FEAT_ENABLE:
Sarah Sharpf6ff0ac2010-12-16 11:21:10 -08001442 xhci_disable_port(hcd, xhci, wIndex,
Sarah Sharp5308a912010-12-01 11:34:59 -08001443 port_array[wIndex], temp);
Sarah Sharp6219c042009-12-09 15:59:11 -08001444 break;
Lan Tianyu693d8eb2012-09-05 13:44:35 +08001445 case USB_PORT_FEAT_POWER:
Xenia Ragiadakou204b7792013-11-15 05:34:07 +02001446 writel(temp & ~PORT_POWER, port_array[wIndex]);
Lan Tianyuf7ac7782012-09-05 13:44:36 +08001447
Lan Tianyu170ed802012-10-15 15:38:34 +08001448 spin_unlock_irqrestore(&xhci->lock, flags);
Lan Tianyuf7ac7782012-09-05 13:44:36 +08001449 temp = usb_acpi_power_manageable(hcd->self.root_hub,
1450 wIndex);
1451 if (temp)
1452 usb_acpi_set_power_state(hcd->self.root_hub,
1453 wIndex, false);
Lan Tianyu170ed802012-10-15 15:38:34 +08001454 spin_lock_irqsave(&xhci->lock, flags);
Lan Tianyu693d8eb2012-09-05 13:44:35 +08001455 break;
Sarah Sharp0f2a7932009-04-27 19:57:12 -07001456 default:
1457 goto error;
1458 }
Sarah Sharp0f2a7932009-04-27 19:57:12 -07001459 break;
1460 default:
1461error:
1462 /* "stall" on error */
1463 retval = -EPIPE;
1464 }
1465 spin_unlock_irqrestore(&xhci->lock, flags);
1466 return retval;
1467}
1468
1469/*
1470 * Returns 0 if the status hasn't changed, or the number of bytes in buf.
1471 * Ports are 0-indexed from the HCD point of view,
1472 * and 1-indexed from the USB core pointer of view.
Sarah Sharp0f2a7932009-04-27 19:57:12 -07001473 *
1474 * Note that the status change bits will be cleared as soon as a port status
1475 * change event is generated, so we use the saved status from that event.
1476 */
1477int xhci_hub_status_data(struct usb_hcd *hcd, char *buf)
1478{
1479 unsigned long flags;
1480 u32 temp, status;
Andiry Xu56192532010-10-14 07:23:00 -07001481 u32 mask;
Sarah Sharp0f2a7932009-04-27 19:57:12 -07001482 int i, retval;
1483 struct xhci_hcd *xhci = hcd_to_xhci(hcd);
huajun lia0885922011-05-03 21:11:00 +08001484 int max_ports;
Matt Evans28ccd292011-03-29 13:40:46 +11001485 __le32 __iomem **port_array;
Sarah Sharp20b67cf2010-12-15 12:47:14 -08001486 struct xhci_bus_state *bus_state;
Sarah Sharpc52804a2012-11-27 12:30:23 -08001487 bool reset_change = false;
Sarah Sharp0f2a7932009-04-27 19:57:12 -07001488
huajun lia0885922011-05-03 21:11:00 +08001489 max_ports = xhci_get_ports(hcd, &port_array);
Sarah Sharp20b67cf2010-12-15 12:47:14 -08001490 bus_state = &xhci->bus_state[hcd_index(hcd)];
Sarah Sharp0f2a7932009-04-27 19:57:12 -07001491
1492 /* Initial status is no changes */
huajun lia0885922011-05-03 21:11:00 +08001493 retval = (max_ports + 8) / 8;
William Gulland419a8e812010-05-12 10:20:34 -07001494 memset(buf, 0, retval);
Andiry Xuf370b992012-04-14 02:54:30 +08001495
1496 /*
1497 * Inform the usbcore about resume-in-progress by returning
1498 * a non-zero value even if there are no status changes.
1499 */
1500 status = bus_state->resuming_ports;
Sarah Sharp0f2a7932009-04-27 19:57:12 -07001501
Lu Baolu94251832015-03-23 18:27:41 +02001502 mask = PORT_CSC | PORT_PEC | PORT_OCC | PORT_PLC | PORT_WRC | PORT_CEC;
Andiry Xu56192532010-10-14 07:23:00 -07001503
Sarah Sharp0f2a7932009-04-27 19:57:12 -07001504 spin_lock_irqsave(&xhci->lock, flags);
1505 /* For each port, did anything change? If so, set that bit in buf. */
huajun lia0885922011-05-03 21:11:00 +08001506 for (i = 0; i < max_ports; i++) {
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +02001507 temp = readl(port_array[i]);
Sarah Sharpf9de8152010-10-29 14:37:23 -07001508 if (temp == 0xffffffff) {
1509 retval = -ENODEV;
1510 break;
1511 }
Andiry Xu56192532010-10-14 07:23:00 -07001512 if ((temp & mask) != 0 ||
Sarah Sharp20b67cf2010-12-15 12:47:14 -08001513 (bus_state->port_c_suspend & 1 << i) ||
1514 (bus_state->resume_done[i] && time_after_eq(
1515 jiffies, bus_state->resume_done[i]))) {
William Gulland419a8e812010-05-12 10:20:34 -07001516 buf[(i + 1) / 8] |= 1 << (i + 1) % 8;
Sarah Sharp0f2a7932009-04-27 19:57:12 -07001517 status = 1;
1518 }
Sarah Sharpc52804a2012-11-27 12:30:23 -08001519 if ((temp & PORT_RC))
1520 reset_change = true;
1521 }
1522 if (!status && !reset_change) {
1523 xhci_dbg(xhci, "%s: stopping port polling.\n", __func__);
1524 clear_bit(HCD_FLAG_POLL_RH, &hcd->flags);
Sarah Sharp0f2a7932009-04-27 19:57:12 -07001525 }
1526 spin_unlock_irqrestore(&xhci->lock, flags);
1527 return status ? retval : 0;
1528}
Andiry Xu9777e3c2010-10-14 07:23:03 -07001529
1530#ifdef CONFIG_PM
1531
1532int xhci_bus_suspend(struct usb_hcd *hcd)
1533{
1534 struct xhci_hcd *xhci = hcd_to_xhci(hcd);
Sarah Sharp518e8482010-12-15 11:56:29 -08001535 int max_ports, port_index;
Matt Evans28ccd292011-03-29 13:40:46 +11001536 __le32 __iomem **port_array;
Sarah Sharp20b67cf2010-12-15 12:47:14 -08001537 struct xhci_bus_state *bus_state;
Andiry Xu9777e3c2010-10-14 07:23:03 -07001538 unsigned long flags;
1539
huajun lia0885922011-05-03 21:11:00 +08001540 max_ports = xhci_get_ports(hcd, &port_array);
Sarah Sharp20b67cf2010-12-15 12:47:14 -08001541 bus_state = &xhci->bus_state[hcd_index(hcd)];
Andiry Xu9777e3c2010-10-14 07:23:03 -07001542
1543 spin_lock_irqsave(&xhci->lock, flags);
1544
1545 if (hcd->self.root_hub->do_remote_wakeup) {
Zhuang Jin Canfac42712015-07-21 17:20:30 +03001546 if (bus_state->resuming_ports || /* USB2 */
1547 bus_state->port_remote_wakeup) { /* USB3 */
Andiry Xuf370b992012-04-14 02:54:30 +08001548 spin_unlock_irqrestore(&xhci->lock, flags);
Zhuang Jin Canfac42712015-07-21 17:20:30 +03001549 xhci_dbg(xhci, "suspend failed because a port is resuming\n");
Andiry Xuf370b992012-04-14 02:54:30 +08001550 return -EBUSY;
Andiry Xu9777e3c2010-10-14 07:23:03 -07001551 }
1552 }
1553
Sarah Sharp518e8482010-12-15 11:56:29 -08001554 port_index = max_ports;
Sarah Sharp20b67cf2010-12-15 12:47:14 -08001555 bus_state->bus_suspended = 0;
Sarah Sharp518e8482010-12-15 11:56:29 -08001556 while (port_index--) {
Andiry Xu9777e3c2010-10-14 07:23:03 -07001557 /* suspend the port if the port is not suspended */
Andiry Xu9777e3c2010-10-14 07:23:03 -07001558 u32 t1, t2;
1559 int slot_id;
1560
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +02001561 t1 = readl(port_array[port_index]);
Andiry Xu9777e3c2010-10-14 07:23:03 -07001562 t2 = xhci_port_state_to_neutral(t1);
1563
1564 if ((t1 & PORT_PE) && !(t1 & PORT_PLS_MASK)) {
Sarah Sharp518e8482010-12-15 11:56:29 -08001565 xhci_dbg(xhci, "port %d not suspended\n", port_index);
Sarah Sharp52336302010-12-16 10:49:09 -08001566 slot_id = xhci_find_slot_id_by_port(hcd, xhci,
Sarah Sharp518e8482010-12-15 11:56:29 -08001567 port_index + 1);
Andiry Xu9777e3c2010-10-14 07:23:03 -07001568 if (slot_id) {
1569 spin_unlock_irqrestore(&xhci->lock, flags);
1570 xhci_stop_device(xhci, slot_id, 1);
1571 spin_lock_irqsave(&xhci->lock, flags);
1572 }
1573 t2 &= ~PORT_PLS_MASK;
1574 t2 |= PORT_LINK_STROBE | XDEV_U3;
Sarah Sharp20b67cf2010-12-15 12:47:14 -08001575 set_bit(port_index, &bus_state->bus_suspended);
Andiry Xu9777e3c2010-10-14 07:23:03 -07001576 }
Sarah Sharp4296c70a2012-01-06 10:34:31 -08001577 /* USB core sets remote wake mask for USB 3.0 hubs,
Rafael J. Wysockiceb6c9c2014-11-29 23:47:05 +01001578 * including the USB 3.0 roothub, but only if CONFIG_PM
Sarah Sharp4296c70a2012-01-06 10:34:31 -08001579 * is enabled, so also enable remote wake here.
1580 */
Lu Baolu9b41ebd2014-11-18 11:27:13 +02001581 if (hcd->self.root_hub->do_remote_wakeup) {
Andiry Xu9777e3c2010-10-14 07:23:03 -07001582 if (t1 & PORT_CONNECT) {
1583 t2 |= PORT_WKOC_E | PORT_WKDISC_E;
1584 t2 &= ~PORT_WKCONN_E;
1585 } else {
1586 t2 |= PORT_WKOC_E | PORT_WKCONN_E;
1587 t2 &= ~PORT_WKDISC_E;
1588 }
1589 } else
1590 t2 &= ~PORT_WAKE_BITS;
1591
1592 t1 = xhci_port_state_to_neutral(t1);
1593 if (t1 != t2)
Xenia Ragiadakou204b7792013-11-15 05:34:07 +02001594 writel(t2, port_array[port_index]);
Andiry Xu9777e3c2010-10-14 07:23:03 -07001595 }
1596 hcd->state = HC_STATE_SUSPENDED;
Sarah Sharp20b67cf2010-12-15 12:47:14 -08001597 bus_state->next_statechange = jiffies + msecs_to_jiffies(10);
Andiry Xu9777e3c2010-10-14 07:23:03 -07001598 spin_unlock_irqrestore(&xhci->lock, flags);
1599 return 0;
1600}
1601
Mathias Nyman346e99732016-10-20 18:09:19 +03001602/*
1603 * Workaround for missing Cold Attach Status (CAS) if device re-plugged in S3.
1604 * warm reset a USB3 device stuck in polling or compliance mode after resume.
1605 * See Intel 100/c230 series PCH specification update Doc #332692-006 Errata #8
1606 */
1607static bool xhci_port_missing_cas_quirk(int port_index,
1608 __le32 __iomem **port_array)
1609{
1610 u32 portsc;
1611
1612 portsc = readl(port_array[port_index]);
1613
1614 /* if any of these are set we are not stuck */
1615 if (portsc & (PORT_CONNECT | PORT_CAS))
1616 return false;
1617
1618 if (((portsc & PORT_PLS_MASK) != XDEV_POLLING) &&
1619 ((portsc & PORT_PLS_MASK) != XDEV_COMP_MODE))
1620 return false;
1621
1622 /* clear wakeup/change bits, and do a warm port reset */
1623 portsc &= ~(PORT_RWC_BITS | PORT_CEC | PORT_WAKE_BITS);
1624 portsc |= PORT_WR;
1625 writel(portsc, port_array[port_index]);
1626 /* flush write */
1627 readl(port_array[port_index]);
1628 return true;
1629}
1630
Andiry Xu9777e3c2010-10-14 07:23:03 -07001631int xhci_bus_resume(struct usb_hcd *hcd)
1632{
1633 struct xhci_hcd *xhci = hcd_to_xhci(hcd);
Sarah Sharp518e8482010-12-15 11:56:29 -08001634 int max_ports, port_index;
Matt Evans28ccd292011-03-29 13:40:46 +11001635 __le32 __iomem **port_array;
Sarah Sharp20b67cf2010-12-15 12:47:14 -08001636 struct xhci_bus_state *bus_state;
Andiry Xu9777e3c2010-10-14 07:23:03 -07001637 u32 temp;
1638 unsigned long flags;
Mathias Nyman41485a92015-05-29 17:01:51 +03001639 unsigned long port_was_suspended = 0;
1640 bool need_usb2_u3_exit = false;
1641 int slot_id;
1642 int sret;
Andiry Xu9777e3c2010-10-14 07:23:03 -07001643
huajun lia0885922011-05-03 21:11:00 +08001644 max_ports = xhci_get_ports(hcd, &port_array);
Sarah Sharp20b67cf2010-12-15 12:47:14 -08001645 bus_state = &xhci->bus_state[hcd_index(hcd)];
Andiry Xu9777e3c2010-10-14 07:23:03 -07001646
Sarah Sharp20b67cf2010-12-15 12:47:14 -08001647 if (time_before(jiffies, bus_state->next_statechange))
Andiry Xu9777e3c2010-10-14 07:23:03 -07001648 msleep(5);
1649
1650 spin_lock_irqsave(&xhci->lock, flags);
1651 if (!HCD_HW_ACCESSIBLE(hcd)) {
1652 spin_unlock_irqrestore(&xhci->lock, flags);
1653 return -ESHUTDOWN;
1654 }
1655
1656 /* delay the irqs */
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +02001657 temp = readl(&xhci->op_regs->command);
Andiry Xu9777e3c2010-10-14 07:23:03 -07001658 temp &= ~CMD_EIE;
Xenia Ragiadakou204b7792013-11-15 05:34:07 +02001659 writel(temp, &xhci->op_regs->command);
Andiry Xu9777e3c2010-10-14 07:23:03 -07001660
Sarah Sharp518e8482010-12-15 11:56:29 -08001661 port_index = max_ports;
1662 while (port_index--) {
Andiry Xu9777e3c2010-10-14 07:23:03 -07001663 /* Check whether need resume ports. If needed
1664 resume port and disable remote wakeup */
Andiry Xu9777e3c2010-10-14 07:23:03 -07001665 u32 temp;
Andiry Xu9777e3c2010-10-14 07:23:03 -07001666
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +02001667 temp = readl(port_array[port_index]);
Mathias Nyman346e99732016-10-20 18:09:19 +03001668
1669 /* warm reset CAS limited ports stuck in polling/compliance */
1670 if ((xhci->quirks & XHCI_MISSING_CAS) &&
1671 (hcd->speed >= HCD_USB3) &&
1672 xhci_port_missing_cas_quirk(port_index, port_array)) {
1673 xhci_dbg(xhci, "reset stuck port %d\n", port_index);
1674 continue;
1675 }
Mathias Nyman2338b9e2015-10-01 18:40:36 +03001676 if (DEV_SUPERSPEED_ANY(temp))
Andiry Xu9777e3c2010-10-14 07:23:03 -07001677 temp &= ~(PORT_RWC_BITS | PORT_CEC | PORT_WAKE_BITS);
1678 else
1679 temp &= ~(PORT_RWC_BITS | PORT_WAKE_BITS);
Sarah Sharp20b67cf2010-12-15 12:47:14 -08001680 if (test_bit(port_index, &bus_state->bus_suspended) &&
Andiry Xu9777e3c2010-10-14 07:23:03 -07001681 (temp & PORT_PLS_MASK)) {
Mathias Nyman41485a92015-05-29 17:01:51 +03001682 set_bit(port_index, &port_was_suspended);
Mathias Nyman2338b9e2015-10-01 18:40:36 +03001683 if (!DEV_SUPERSPEED_ANY(temp)) {
Andiry Xuc9682df2011-09-23 14:19:48 -07001684 xhci_set_link_state(xhci, port_array,
1685 port_index, XDEV_RESUME);
Mathias Nyman41485a92015-05-29 17:01:51 +03001686 need_usb2_u3_exit = true;
Andiry Xu9777e3c2010-10-14 07:23:03 -07001687 }
Andiry Xu9777e3c2010-10-14 07:23:03 -07001688 } else
Xenia Ragiadakou204b7792013-11-15 05:34:07 +02001689 writel(temp, port_array[port_index]);
Andiry Xu9777e3c2010-10-14 07:23:03 -07001690 }
1691
Mathias Nyman41485a92015-05-29 17:01:51 +03001692 if (need_usb2_u3_exit) {
1693 spin_unlock_irqrestore(&xhci->lock, flags);
Hemant Kumar7ee61092016-11-08 15:46:44 -08001694 usleep_range(21000, 21500);
Mathias Nyman41485a92015-05-29 17:01:51 +03001695 spin_lock_irqsave(&xhci->lock, flags);
1696 }
1697
1698 port_index = max_ports;
1699 while (port_index--) {
1700 if (!(port_was_suspended & BIT(port_index)))
1701 continue;
1702 /* Clear PLC to poll it later after XDEV_U0 */
1703 xhci_test_and_clear_bit(xhci, port_array, port_index, PORT_PLC);
1704 xhci_set_link_state(xhci, port_array, port_index, XDEV_U0);
1705 }
1706
1707 port_index = max_ports;
1708 while (port_index--) {
1709 if (!(port_was_suspended & BIT(port_index)))
1710 continue;
1711 /* Poll and Clear PLC */
1712 sret = xhci_handshake(port_array[port_index], PORT_PLC,
1713 PORT_PLC, 10 * 1000);
1714 if (sret)
1715 xhci_warn(xhci, "port %d resume PLC timeout\n",
1716 port_index);
1717 xhci_test_and_clear_bit(xhci, port_array, port_index, PORT_PLC);
1718 slot_id = xhci_find_slot_id_by_port(hcd, xhci, port_index + 1);
1719 if (slot_id)
1720 xhci_ring_device(xhci, slot_id);
1721 }
1722
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +02001723 (void) readl(&xhci->op_regs->command);
Andiry Xu9777e3c2010-10-14 07:23:03 -07001724
Sarah Sharp20b67cf2010-12-15 12:47:14 -08001725 bus_state->next_statechange = jiffies + msecs_to_jiffies(5);
Andiry Xu9777e3c2010-10-14 07:23:03 -07001726 /* re-enable irqs */
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +02001727 temp = readl(&xhci->op_regs->command);
Andiry Xu9777e3c2010-10-14 07:23:03 -07001728 temp |= CMD_EIE;
Xenia Ragiadakou204b7792013-11-15 05:34:07 +02001729 writel(temp, &xhci->op_regs->command);
Xenia Ragiadakoub0ba9722013-11-15 05:34:06 +02001730 temp = readl(&xhci->op_regs->command);
Andiry Xu9777e3c2010-10-14 07:23:03 -07001731
1732 spin_unlock_irqrestore(&xhci->lock, flags);
1733 return 0;
1734}
1735
Sarah Sharp436a3892010-10-15 14:59:15 -07001736#endif /* CONFIG_PM */