Re: about possible port reset when disconnect

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

 



On Thu, 3 Apr 2014, vichy wrote:

> hi all:
> I list my environment as below:
> 1. Arm platform with ehci support
> 2. plug in NTFS USB HD and play movie
> 3. plug out device suddenly.
> 
> I found there will be possibly that driver will reset port even there
> is no device connected.
> I purposely add  below code in ehci-hub.c when we try to do port reset
> @@ -1173,7 +1173,12 @@ static int ehci_hub_control (
>                         ehci_writel(ehci, temp, status_reg);
> +                       dbg_port (ehci, "in port reset sequence,
> GetStatus", wIndex + 1, temp);
> +
>                         break;
> 
> and I found driver will reset even device is disconnected like below log:
> (I also attach full log in the mail)
> tntfs info: NTFS volume version 3.1 (cluster_size 4096, PAGE_CACHE_SIZE 4096).
> Platform-ehci Platform-ehci.0: detected XactErr len 19456/20480 retry 1
> hub 4-0:1.0: state 7 ports 1 chg 0000 evt 0002
> hub 4-0:1.0: port 1, status 0000, change 0001, 12 Mb/s
> Platform-ehci Platform-ehci.0: port 1 reset
> Platform-ehci Platform-ehci.0: in port reset sequence, GetStatus
> port:1 status 000100 0  ACK sig=se0 RESET
> usb 4-1: USB disconnect, device number 20
> Platform-ehci Platform-ehci.0: port 1 reset error -110
> Platform-ehci Platform-ehci.0: port 1 reset error -110
> Platform-ehci Platform-ehci.0: port 1 reset error -110
> Platform-ehci Platform-ehci.0: port 1 reset error -110
> Platform-ehci Platform-ehci.0: port 1 reset error -110
> hub 4-0:1.0: hub_port_status failed (err = -32)
> hub 4-0:1.0: port_wait_reset: err = -32
> hub 4-0:1.0: port 1 not enabled, trying reset again...
> ....................
> 
> 
> My questions are:
> 1. from the log the reason why port reset shows is
>    test_bit(US_FLIDX_DISCONNECTING, &us->dflags) failed in usb_stor_port_reset
> (in the log, I purposely dump_stack in usb_reset_and_verify_device)
> Why even "USB disconnect" show, the "US_FLIDX_DISCONNECTING" is not
> set up in time?

Your log contains the explanation:

> Platform-ehci Platform-ehci.0: port 1 reset

This is where the reset starts.

> Platform-ehci Platform-ehci.0: in port reset sequence, GetStatus
> port:1 status 000100 0  ACK sig=se0 RESET
> usb 4-1: USB disconnect, device number 20

And this is where US_FLIDX_DISCONNECTING gets set -- after the reset
has already begun.

> 2. shall we add below determination before port reset?
> --- a/linux-3.8.2/drivers/usb/host/ehci-hub.c
> ++ b/linux-3.8.2/drivers/usb/host/ehci-hub.c
> @@ -1139,6 +1139,9 @@ static int ehci_hub_control (
>                 case USB_PORT_FEAT_RESET:
>                         if (temp & PORT_RESUME)
>                                 goto error;
> +
> +                       if (!(temp & PORT_CONNECT))
> +                               goto disconnect;
>                         /* line status bits may report this as low speed,
>                          * which can be fine if this root hub has a
>                          * transaction translator built in.

We could add this, but it's not a big deal.  The real question is why 
did this happen:

> hub 4-0:1.0: hub_port_status failed (err = -32)

hub_port_status should not return an error.  It should have returned
valid data, and the port status should have shown that the device was
disconnected.  Can you figure out why hub_port_status didn't work?

Alan Stern

--
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