On Wed, 17 Aug 2011, River Wang wrote: > 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; Signed-off-by: Alan Stern <stern@xxxxxxxxxxxxxxxxxxx> -- 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