From: Ajay Gupta <ajayg@xxxxxxxxxx> Xhci interrupt must be enabled only after controller is initialized and started. Currently interrupt is enabled first in xhci_run() and later hcd state is set to running in xhci_run_finished(). On a slow system (such as FPGA based platform) the time difference between enabling interrupt and setting the hcd state becomes huge enough where interrupt is triggered but controller initialization is not complete yet. Fixing the same by moving the interrupt enable (CMD_EIE) part of code snippet from xhci_run() to xhci_run_finished(). Signed-off-by: Ajay Gupta <ajayg@xxxxxxxxxx> --- drivers/usb/host/xhci.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index dbac0fa9748d..ee2877fe0a58 100644 --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c @@ -604,6 +604,8 @@ static int xhci_init(struct usb_hcd *hcd) static int xhci_run_finished(struct xhci_hcd *xhci) { + u32 temp; + if (xhci_start(xhci)) { xhci_halt(xhci); return -ENODEV; @@ -611,6 +613,13 @@ static int xhci_run_finished(struct xhci_hcd *xhci) xhci->shared_hcd->state = HC_STATE_RUNNING; xhci->cmd_ring_state = CMD_RING_STATE_RUNNING; + /* Set the HCD state before we enable the irqs */ + temp = readl(&xhci->op_regs->command); + temp |= (CMD_EIE); + xhci_dbg_trace(xhci, trace_xhci_dbg_init, + "// Enable interrupts, cmd = 0x%x.", temp); + writel(temp, &xhci->op_regs->command); + if (xhci->quirks & XHCI_NEC_HOST) xhci_ring_cmd_db(xhci); @@ -664,13 +673,6 @@ int xhci_run(struct usb_hcd *hcd) temp |= (xhci->imod_interval / 250) & ER_IRQ_INTERVAL_MASK; writel(temp, &xhci->ir_set->irq_control); - /* Set the HCD state before we enable the irqs */ - temp = readl(&xhci->op_regs->command); - temp |= (CMD_EIE); - xhci_dbg_trace(xhci, trace_xhci_dbg_init, - "// Enable interrupts, cmd = 0x%x.", temp); - writel(temp, &xhci->op_regs->command); - temp = readl(&xhci->ir_set->irq_pending); xhci_dbg_trace(xhci, trace_xhci_dbg_init, "// Enabling event ring interrupter %p by writing 0x%x to irq_pending", -- 2.17.1