]> git.hungrycats.org Git - linux/commitdiff
dwc_otg: make channel halts with unknown state less damaging
authorP33M <P33M@github.com>
Tue, 23 Jul 2013 13:15:32 +0000 (14:15 +0100)
committerP33M <P33M@github.com>
Tue, 23 Jul 2013 13:15:32 +0000 (14:15 +0100)
If the IRQ received a channel halt interrupt through the FIQ
with no other bits set, the IRQ would not release the host
channel and never complete the URB.

Add catchall handling to treat as a transaction error and retry.

drivers/usb/host/dwc_otg/dwc_otg_hcd_intr.c

index 1037a96667e6b9c236a75803fe903e16df91f10a..78e52ca6b4c179fb43948cc9866f66927a1636f1 100644 (file)
@@ -2578,12 +2578,24 @@ static void handle_hc_chhltd_intr_dma(dwc_otg_hcd_t * hcd,
                                     DWC_READ_REG32(&hcd->
                                                    core_if->core_global_regs->
                                                    gintsts));
+                               /* Failthrough: use 3-strikes rule */
+                               qtd->error_count++;
+                               dwc_otg_hcd_save_data_toggle(hc, hc_regs, qtd);
+                               update_urb_state_xfer_intr(hc, hc_regs,
+                                          qtd->urb, qtd, DWC_OTG_HC_XFER_XACT_ERR);
+                               halt_channel(hcd, hc, qtd, DWC_OTG_HC_XFER_XACT_ERR);
                        }
 
                }
        } else {
                DWC_PRINTF("NYET/NAK/ACK/other in non-error case, 0x%08x\n",
                           hcint.d32);
+               /* Failthrough: use 3-strikes rule */
+               qtd->error_count++;
+               dwc_otg_hcd_save_data_toggle(hc, hc_regs, qtd);
+               update_urb_state_xfer_intr(hc, hc_regs,
+                          qtd->urb, qtd, DWC_OTG_HC_XFER_XACT_ERR);
+               halt_channel(hcd, hc, qtd, DWC_OTG_HC_XFER_XACT_ERR);
        }
 }