4.5-stable review patch.  If anyone has any objections, please let me know.

------------------

From: Yoshihiro Shimoda <yoshihiro.shimoda...@renesas.com>

commit 0a380be8233dbf8dd20795b801c5d5d5ef3992f7 upstream.

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, in this case, this driver should
call dma_set_coherent_mask(dev, DMA_BIT_MASK(32)) in xhci_gen_setup().
Otherwise, the xHCI controller will be died after a usb device is
connected if it runs on above 4GB physical memory environment.

So, this patch adds a new quirk XHCI_NO_64BIT_SUPPORT to resolve
such an issue.

Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda...@renesas.com>
Reviewed-by: Felipe Balbi <felipe.ba...@linux.intel.com>
Signed-off-by: Mathias Nyman <mathias.ny...@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gre...@linuxfoundation.org>
Signed-off-by: Greg Kroah-Hartman <gre...@linuxfoundation.org>

---
 drivers/usb/host/xhci.c |   10 ++++++++++
 drivers/usb/host/xhci.h |    1 +
 2 files changed, 11 insertions(+)

--- a/drivers/usb/host/xhci.c
+++ b/drivers/usb/host/xhci.c
@@ -4944,6 +4944,16 @@ int xhci_gen_setup(struct usb_hcd *hcd,
                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) &&
--- a/drivers/usb/host/xhci.h
+++ b/drivers/usb/host/xhci.h
@@ -1632,6 +1632,7 @@ struct xhci_hcd {
 #define XHCI_PME_STUCK_QUIRK   (1 << 20)
 #define XHCI_MTK_HOST          (1 << 21)
 #define XHCI_SSIC_PORT_UNUSED  (1 << 22)
+#define XHCI_NO_64BIT_SUPPORT  (1 << 23)
        unsigned int            num_active_eps;
        unsigned int            limit_active_eps;
        /* There are two roothubs to keep track of bus suspend info for */


Reply via email to