Re: [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]

 



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


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

  Powered by Linux