*/
 int xhci_halt(struct xhci_hcd *xhci)
 {
+       int ret;
        xhci_dbg(xhci, "// Halt the HC\n");
        xhci_quiesce(xhci);
 
-       return handshake(xhci, &xhci->op_regs->status,
+       ret = handshake(xhci, &xhci->op_regs->status,
                        STS_HALT, STS_HALT, XHCI_MAX_HALT_USEC);
+       if (!ret)
+               xhci->xhc_state |= XHCI_STATE_HALTED;
+       return ret;
 }
 
 /*
                xhci_err(xhci, "Host took too long to start, "
                                "waited %u microseconds.\n",
                                XHCI_MAX_HALT_USEC);
+       if (!ret)
+               xhci->xhc_state &= ~XHCI_STATE_HALTED;
        return ret;
 }
 
        if (ret || !urb->hcpriv)
                goto done;
        temp = xhci_readl(xhci, &xhci->op_regs->status);
-       if (temp == 0xffffffff) {
+       if (temp == 0xffffffff || (xhci->xhc_state & XHCI_STATE_HALTED)) {
                xhci_dbg(xhci, "HW died, freeing TD.\n");
                urb_priv = urb->hcpriv;
 
 
  * There are no reports of xHCI host controllers that display this issue.
  */
 #define XHCI_STATE_DYING       (1 << 0)
+#define XHCI_STATE_HALTED      (1 << 1)
        /* Statistics */
        int                     error_bitmask;
        unsigned int            quirks;