diff options
Diffstat (limited to 'drivers/usb/host/xhci.c')
| -rw-r--r-- | drivers/usb/host/xhci.c | 24 | 
1 files changed, 18 insertions, 6 deletions
| diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index d51ee0c3cf9f..9e71c96ad74a 100644 --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c @@ -147,7 +147,8 @@ static int xhci_start(struct xhci_hcd *xhci)  				"waited %u microseconds.\n",  				XHCI_MAX_HALT_USEC);  	if (!ret) -		xhci->xhc_state &= ~(XHCI_STATE_HALTED | XHCI_STATE_DYING); +		/* clear state flags. Including dying, halted or removing */ +		xhci->xhc_state = 0;  	return ret;  } @@ -1108,8 +1109,8 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)  		/* Resume root hubs only when have pending events. */  		status = readl(&xhci->op_regs->status);  		if (status & STS_EINT) { -			usb_hcd_resume_root_hub(hcd);  			usb_hcd_resume_root_hub(xhci->shared_hcd); +			usb_hcd_resume_root_hub(hcd);  		}  	} @@ -1124,10 +1125,10 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)  	/* Re-enable port polling. */  	xhci_dbg(xhci, "%s: starting port polling.\n", __func__); -	set_bit(HCD_FLAG_POLL_RH, &hcd->flags); -	usb_hcd_poll_rh_status(hcd);  	set_bit(HCD_FLAG_POLL_RH, &xhci->shared_hcd->flags);  	usb_hcd_poll_rh_status(xhci->shared_hcd); +	set_bit(HCD_FLAG_POLL_RH, &hcd->flags); +	usb_hcd_poll_rh_status(hcd);  	return retval;  } @@ -2773,7 +2774,8 @@ int xhci_check_bandwidth(struct usb_hcd *hcd, struct usb_device *udev)  	if (ret <= 0)  		return ret;  	xhci = hcd_to_xhci(hcd); -	if (xhci->xhc_state & XHCI_STATE_DYING) +	if ((xhci->xhc_state & XHCI_STATE_DYING) || +		(xhci->xhc_state & XHCI_STATE_REMOVING))  		return -ENODEV;  	xhci_dbg(xhci, "%s called for udev %p\n", __func__, udev); @@ -3820,7 +3822,7 @@ static int xhci_setup_device(struct usb_hcd *hcd, struct usb_device *udev,  	mutex_lock(&xhci->mutex); -	if (xhci->xhc_state)	/* dying or halted */ +	if (xhci->xhc_state)	/* dying, removing or halted */  		goto out;  	if (!udev->slot_id) { @@ -4948,6 +4950,16 @@ int xhci_gen_setup(struct usb_hcd *hcd, xhci_get_quirks_t get_quirks)  		return retval;  	xhci_dbg(xhci, "Reset complete\n"); +	/* +	 * On some xHCI controllers (e.g. R-Car SoCs), the AC64 bit (bit 0) +	 * of HCCPARAMS1 is set to 1. However, the xHCs don't support 64-bit +	 * address memory pointers actually. So, this driver clears the AC64 +	 * bit of xhci->hcc_params to call dma_set_coherent_mask(dev, +	 * DMA_BIT_MASK(32)) in this xhci_gen_setup(). +	 */ +	if (xhci->quirks & XHCI_NO_64BIT_SUPPORT) +		xhci->hcc_params &= ~BIT(0); +  	/* Set dma_mask and coherent_dma_mask to 64-bits,  	 * if xHC supports 64-bit addressing */  	if (HCC_64BIT_ADDR(xhci->hcc_params) && | 
