On Mon, Oct 7, 2013 at 12:41 PM, Alan Stern <st...@rowland.harvard.edu> wrote:
> On Mon, 7 Oct 2013, Dan Williams wrote:
>
>> Change the default enumeration scheme for xhci attached USB < 3 devices
>> from:
>
> Careful about the distinction between USB-3 and SuperSpeed.  They
> aren't synonymous.

Ok, my mistake, that should read "xhci attached non-SuperSpeed USB
devices", which is what the code does.

>
>>    Reset
>>    SetAddress [xhci address-device BSR = 0]
>>    GetDescriptor(8)
>>    GetDescriptor(18)
>>
>> ...to:
>>
>>    Reset
>>    [xhci address-device BSR = 1]
>>    GetDescriptor(64)
>>    Reset
>>    SetAddress [xhci address-device BSR = 0]
>>    GetDescriptor(8)
>>    GetDescriptor(18)
>
> This description isn't right.  The "new" scheme skips the
> Get-Descriptor(8) step entirely.  It goes directly from the second
> reset to Get-Descriptor(18).

Yes, copy paste error when I added the BSR annotations, had it right in v1

>
>> ...as some devices misbehave when encountering a SetAddress command
>> prior to GetDescriptor.  There are known legacy devices that require
>> this scheme, but testing has found at least one USB3 device that fails
>> enumeration when presented with this ordering.  For now, follow the ehci
>> case and enable 'new scheme' by default for USB < 3 devices.

Follows that this should be "non-SuperSpeed devices" as well.

>>
>> To support this enumeration scheme on xhci the AddressDevice operation
>> needs to be performed twice.  The first instance of the command enables
>> the HC's device and slot context info for the device, but omits sending
>> the device a SetAddress command (BSR == block set address request).
>> Then, after GetDescriptor completes, follow up with the full
>> AddressDevice+SetAddress operation.
>>
>> As mentioned before, this ordering of events with USB3 devices causes an

SuperSpeed.

>> extra state transition to be exposed to xhci.  Previously USB3 devices
>> would transition directly from 'enabled' to 'addressed' and never need
>> to underrun responses to 'get descriptor'. We do see the 64-byte
>> descriptor fetch the correct data, but the following 8-byte descriptor
>> read after the reset gets:
>
> Are you sure you don't mean 18-byte instead of 8-byte?

Yes, 18.

>
>> bLength            = 0
>> bDescriptorType    = 0
>> bcdUSB             = 0
>> bDeviceClass       = 0
>> bDeviceSubClass    = 0
>> bDeviceProtocol    = 0
>> bMaxPacketSize0    = 9
>>
>> instead of:
>>
>> bLength            = 12
>> bDescriptorType    = 1
>> bcdUSB             = 300
>> bDeviceClass       = 0
>> bDeviceSubClass    = 0
>> bDeviceProtocol    = 0
>> bMaxPacketSize0    = 9
>>
>> which results in the discovery process looping until falling back to
>> 'old scheme' enumeration.
>
> In any case, I agree that sticking with the "old" scheme for SuperSpeed
> devices is a good idea, because that's most likely to be what other
> OS's use (since it is what the hardware supports most directly).

Thanks for that.

--
Dan
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to