Re: about possible port reset when disconnect

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

 



hi Alan:

2014-04-03 20:52 GMT+08:00 Alan Stern <stern@xxxxxxxxxxxxxxxxxxx>:
> 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?

1. Platform-ehci Platform-ehci.0: port 1 reset error -110
         retval = handshake(ehci, status_reg,
                    PORT_RESET, 0, 1000);
         if (retval != 0) {
                ehci_err (ehci, "port %d reset error %d\n",
                    wIndex + 1, retval);
                goto error;
            }

2. hub 4-0:1.0: hub_port_status failed (err = -32)
    the -32 is due to below error label we set retval = -EPIPE
    error:
        /* "stall" on error */
        retval = -EPIPE;



thanks for your kind reply ^^
--
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