[PATCH]: USB: Enable IO watchdog for Intel MPH core to resolve USB stick reconnecting issue.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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


[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux