diff options
Diffstat (limited to 'drivers/usb/host/xhci-hub.c')
| -rw-r--r-- | drivers/usb/host/xhci-hub.c | 25 | 
1 files changed, 16 insertions, 9 deletions
diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c index 46d5e08f05f1..72ebbc908e19 100644 --- a/drivers/usb/host/xhci-hub.c +++ b/drivers/usb/host/xhci-hub.c @@ -1224,17 +1224,17 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,  				temp = readl(port_array[wIndex]);  				break;  			} - -			/* Software should not attempt to set -			 * port link state above '3' (U3) and the port -			 * must be enabled. -			 */ -			if ((temp & PORT_PE) == 0 || -				(link_state > USB_SS_PORT_LS_U3)) { -				xhci_warn(xhci, "Cannot set link state.\n"); +			/* Port must be enabled */ +			if (!(temp & PORT_PE)) { +				retval = -ENODEV; +				break; +			} +			/* Can't set port link state above '3' (U3) */ +			if (link_state > USB_SS_PORT_LS_U3) { +				xhci_warn(xhci, "Cannot set port %d link state %d\n", +					 wIndex, link_state);  				goto error;  			} -  			if (link_state == USB_SS_PORT_LS_U3) {  				slot_id = xhci_find_slot_id_by_port(hcd, xhci,  						wIndex + 1); @@ -1522,6 +1522,13 @@ int xhci_bus_suspend(struct usb_hcd *hcd)  				t2 |= PORT_WKOC_E | PORT_WKCONN_E;  				t2 &= ~PORT_WKDISC_E;  			} + +			if ((xhci->quirks & XHCI_U2_DISABLE_WAKE) && +			    (hcd->speed < HCD_USB3)) { +				if (usb_amd_pt_check_port(hcd->self.controller, +							  port_index)) +					t2 &= ~PORT_WAKE_BITS; +			}  		} else  			t2 &= ~PORT_WAKE_BITS;  | 
