diff options
-rw-r--r-- | drivers/usb/host/xhci-hcd.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/drivers/usb/host/xhci-hcd.c b/drivers/usb/host/xhci-hcd.c index 8c3a074a95cd..008326d5bc52 100644 --- a/drivers/usb/host/xhci-hcd.c +++ b/drivers/usb/host/xhci-hcd.c | |||
@@ -277,6 +277,9 @@ irqreturn_t xhci_irq(struct usb_hcd *hcd) | |||
277 | /* Check if the xHC generated the interrupt, or the irq is shared */ | 277 | /* Check if the xHC generated the interrupt, or the irq is shared */ |
278 | temp = xhci_readl(xhci, &xhci->op_regs->status); | 278 | temp = xhci_readl(xhci, &xhci->op_regs->status); |
279 | temp2 = xhci_readl(xhci, &xhci->ir_set->irq_pending); | 279 | temp2 = xhci_readl(xhci, &xhci->ir_set->irq_pending); |
280 | if (temp == 0xffffffff && temp2 == 0xffffffff) | ||
281 | goto hw_died; | ||
282 | |||
280 | if (!(temp & STS_EINT) && !ER_IRQ_PENDING(temp2)) { | 283 | if (!(temp & STS_EINT) && !ER_IRQ_PENDING(temp2)) { |
281 | spin_unlock(&xhci->lock); | 284 | spin_unlock(&xhci->lock); |
282 | return IRQ_NONE; | 285 | return IRQ_NONE; |
@@ -294,6 +297,7 @@ irqreturn_t xhci_irq(struct usb_hcd *hcd) | |||
294 | if (temp & STS_FATAL) { | 297 | if (temp & STS_FATAL) { |
295 | xhci_warn(xhci, "WARNING: Host System Error\n"); | 298 | xhci_warn(xhci, "WARNING: Host System Error\n"); |
296 | xhci_halt(xhci); | 299 | xhci_halt(xhci); |
300 | hw_died: | ||
297 | xhci_to_hcd(xhci)->state = HC_STATE_HALT; | 301 | xhci_to_hcd(xhci)->state = HC_STATE_HALT; |
298 | spin_unlock(&xhci->lock); | 302 | spin_unlock(&xhci->lock); |
299 | return -ESHUTDOWN; | 303 | return -ESHUTDOWN; |