From: Wang Zhi <zhi.wang@xxxxxxxxxxxxx> Date: Wed, 17 Aug 2011 03:35:43 -0700 Subject: [PATCH]: USB: Enable IO watchdog for Intel MPH core to resolve USB stick reconnecting issue. On Intel Oaktrail platform, the USBSTS.USBINT interrupt may come too early before data is really ready especially when USB mass storage device is doing busy IO transactions: USBINT comes, but ehci_work()->scan_async() doesn't complete any urb from QHs. This will cause USB reconnecting issue on some SanDisk and SSK card reader.So we enable IO watchdog to kick this. Here is the log: [ 95.454965] scan_async() - 1262: Scan. qh: 0xf4ad2448. [ 95.455018] ehci_hcd 0000:0c:16.0: submit_async 1.4.4 urb f479f5e8 ep1in len 122880, qtd f4b6a060 [qh f53da2e8] [ 95.460048] scan_async() - 1262: Scan. qh: 0xf4ad2448. [ 95.460063] start_unlink_async() - 1246: S CMD_IAAD, qh: 0xf4ad2448. /* Interrupt comes too early. */ [ 95.460131] ehci_hcd 0000:0c:16.0: irq status 7c0a9 PPCE Async Periodic IAA FLR INT [ 95.460141] end_unlink_async() - 1187: qh: 0xf4ad2448. /* but scan_async doesn't complete any urb, so we really HANG here.*/ [ 95.460148] scan_async() - 1262: Scan. qh: 0xf53da2e8. /* ehci_dbg_timer() is used to monitor registers when interrupt doesn't come. */ [ 96.912107] ehci_dbg_timer() - 146: USBCMD: 0x00018005, USBSTS: 0x00000088. [ 98.904196] ehci_dbg_timer() - 146: USBCMD: 0x00018035, USBSTS: 0x0007c088. [ 98.916117] ehci_dbg_timer() - 146: USBCMD: 0x00018005, USBSTS: 0x00000088. [ 100.908183] ehci_dbg_timer() - 146: USBCMD: 0x00018035, USBSTS: 0x0007c088. [ 100.920114] ehci_dbg_timer() - 146: USBCMD: 0x00018005, USBSTS: 0x00000088. [ 102.912182] ehci_dbg_timer() - 146: USBCMD: 0x00018035, USBSTS: 0x0007c088. [ 102.924114] ehci_dbg_timer() - 146: USBCMD: 0x00018005, USBSTS: 0x00000088. [ 104.916150] ehci_dbg_timer() - 146: USBCMD: 0x00018035, USBSTS: 0x0007c088. [ 104.928110] ehci_dbg_timer() - 146: USBCMD: 0x00018005, USBSTS: 0x00000088. [ 106.920167] ehci_dbg_timer() - 146: USBCMD: 0x00018035, USBSTS: 0x0007c088. [ 106.932112] ehci_dbg_timer() - 146: USBCMD: 0x00018005, USBSTS: 0x00000088. [ 108.924161] ehci_dbg_timer() - 146: USBCMD: 0x00018035, USBSTS: 0x0007e088. [ 108.936113] ehci_dbg_timer() - 146: USBCMD: 0x00018005, USBSTS: 0x00000088. /* I type a key on my USB keyboard. Interrupt comes again. 2 urb is completed. We are alive again.*/ [ 109.279368] ehci_hcd 0000:0c:16.0: irq status 7c089 PPCE Async Periodic FLR INT [ 109.279393] scan_async() - 1262: Scan. qh: 0xf53da2e8. /* This is the urb comes late. */ [ 109.279423] ehci_hcd 0000:0c:16.0: ehci_urb_done 1.4.4 urb f479f5e8 ep1in status 0 len 122880/122880 [ 109.279499] scan_async() - 1262: Scan. qh: 0xf53da2e8. /* This is the interrupt urb from keyboard. */ [ 109.279534] ehci_hcd 0000:0c:16.0: ehci_urb_done 1.4.1 urb f46924b8 ep1in status 0 len 8/8 Signed-off-by: Wang Zhi <zhi.wang@xxxxxxxxxxxxx> --- ehci-pci.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c index 1102ce6..a96b13c 100644 --- a/drivers/usb/host/ehci-pci.c +++ b/drivers/usb/host/ehci-pci.c @@ -139,6 +139,20 @@ static int ehci_pci_setup(struct usb_hcd *hcd) || pdev->device == 0x0829) { ehci_info(ehci, "disable lpm for langwell/penwell\n"); ehci->has_lpm = 0; + + /* On Intel Oaktrail platform, the USBSTS.USBINT + * interrupt may come too early before data is + * ready especially when USB mass storage device + * is doing busy IO transactions: USBINT comes, + * but ehci_work()->scan_async() doesn't complete + * any urb from QHs. This will cause USB reconnecting + * issue on some SanDisk stick and SSK card reader. + * + * So we enable IO watchdog to kick this. */ + + ehci_info(ehci, "enable IO watchdog for " + "langwell/penwell\n"); + ehci->need_io_watchdog = 1; } if (pdev->device == PCI_DEVICE_ID_INTEL_CE4100_USB) { hcd->has_tt = 1; -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html