diff options
Diffstat (limited to 'drivers/usb/host/xhci.c')
| -rw-r--r-- | drivers/usb/host/xhci.c | 43 | 
1 files changed, 35 insertions, 8 deletions
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index f1f01a834ba..b4aa79d154b 100644 --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c @@ -350,7 +350,7 @@ static int xhci_try_enable_msi(struct usb_hcd *hcd)  	 * generate interrupts.  Don't even try to enable MSI.  	 */  	if (xhci->quirks & XHCI_BROKEN_MSI) -		return 0; +		goto legacy_irq;  	/* unregister the legacy interrupt */  	if (hcd->irq) @@ -371,6 +371,7 @@ static int xhci_try_enable_msi(struct usb_hcd *hcd)  		return -EINVAL;  	} + legacy_irq:  	/* fall back to legacy interrupt*/  	ret = request_irq(pdev->irq, &usb_hcd_irq, IRQF_SHARED,  			hcd->irq_descr, hcd); @@ -416,9 +417,9 @@ static void compliance_mode_recovery(unsigned long arg)  			 * Compliance Mode Detected. Letting USB Core  			 * handle the Warm Reset  			 */ -			xhci_dbg(xhci, "Compliance Mode Detected->Port %d!\n", +			xhci_dbg(xhci, "Compliance mode detected->port %d\n",  					i + 1); -			xhci_dbg(xhci, "Attempting Recovery routine!\n"); +			xhci_dbg(xhci, "Attempting compliance mode recovery\n");  			hcd = xhci->shared_hcd;  			if (hcd->state == HC_STATE_SUSPENDED) @@ -456,7 +457,7 @@ static void compliance_mode_recovery_timer_init(struct xhci_hcd *xhci)  	set_timer_slack(&xhci->comp_mode_recovery_timer,  			msecs_to_jiffies(COMP_MODE_RCVRY_MSECS));  	add_timer(&xhci->comp_mode_recovery_timer); -	xhci_dbg(xhci, "Compliance Mode Recovery Timer Initialized.\n"); +	xhci_dbg(xhci, "Compliance mode recovery timer initialized\n");  }  /* @@ -732,8 +733,11 @@ void xhci_stop(struct usb_hcd *hcd)  	/* Deleting Compliance Mode Recovery Timer */  	if ((xhci->quirks & XHCI_COMP_MODE_QUIRK) && -			(!(xhci_all_ports_seen_u0(xhci)))) +			(!(xhci_all_ports_seen_u0(xhci)))) {  		del_timer_sync(&xhci->comp_mode_recovery_timer); +		xhci_dbg(xhci, "%s: compliance mode recovery timer deleted\n", +				__func__); +	}  	if (xhci->quirks & XHCI_AMD_PLL_FIX)  		usb_amd_dev_put(); @@ -929,7 +933,8 @@ int xhci_suspend(struct xhci_hcd *xhci)  	if ((xhci->quirks & XHCI_COMP_MODE_QUIRK) &&  			(!(xhci_all_ports_seen_u0(xhci)))) {  		del_timer_sync(&xhci->comp_mode_recovery_timer); -		xhci_dbg(xhci, "Compliance Mode Recovery Timer Deleted!\n"); +		xhci_dbg(xhci, "%s: compliance mode recovery timer deleted\n", +				__func__);  	}  	/* step 5: remove core well power */ @@ -3778,7 +3783,29 @@ int xhci_address_device(struct usb_hcd *hcd, struct usb_device *udev)  	return 0;  } -#ifdef CONFIG_USB_SUSPEND +/* + * Transfer the port index into real index in the HW port status + * registers. Caculate offset between the port's PORTSC register + * and port status base. Divide the number of per port register + * to get the real index. The raw port number bases 1. + */ +int xhci_find_raw_port_number(struct usb_hcd *hcd, int port1) +{ +	struct xhci_hcd *xhci = hcd_to_xhci(hcd); +	__le32 __iomem *base_addr = &xhci->op_regs->port_status_base; +	__le32 __iomem *addr; +	int raw_port; + +	if (hcd->speed != HCD_USB3) +		addr = xhci->usb2_ports[port1 - 1]; +	else +		addr = xhci->usb3_ports[port1 - 1]; + +	raw_port = (addr - base_addr)/NUM_PORT_REGS + 1; +	return raw_port; +} + +#ifdef CONFIG_PM_RUNTIME  /* BESL to HIRD Encoding array for USB2 LPM */  static int xhci_besl_encoding[16] = {125, 150, 200, 300, 400, 500, 1000, 2000, @@ -4028,7 +4055,7 @@ int xhci_update_device(struct usb_hcd *hcd, struct usb_device *udev)  	return 0;  } -#endif /* CONFIG_USB_SUSPEND */ +#endif /* CONFIG_PM_RUNTIME */  /*---------------------- USB 3.0 Link PM functions ------------------------*/  |