Re: Type-C port on the Asmedia ASM1142

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

 



Hi,

Mathias Nyman <mathias.nyman@xxxxxxxxxxxxxxx> writes:

[snip]

>> Like I said, while I patched my kernel and now my xHCI controllers
>> are recognized as supporting 10 Gb/s, the SSDs with USB-SATA bridges
>> that I have connected are still not recognized as also supporting 10
>> Gb/s. I believe that the problem is caused by other parts of the xHCI
>> specification that are not implemented, but I did not have time yet
>> to identify them.
>>
>
> To sum it up:
>
> Ways to deduce host controller capable speeds:
>
> 1. From SBRN
>      Good: + easy, the current way
>
>      Bad: - unreliable, public spec currently forces value to be 30h
>      (USB 3.0) so many vendors (30h) for 3.1 SSP capable hosts
>
>      Bad: - PCI centric, SBRN is in pci config space, platform devices
>      need their own way to set xhci->sbrn value
>
>      Bad: - assumes host vendors only use 3.1 (30h) for 10Gbps SSP
>      hosts.
>
>      Bad: - assumes a future spec revision always implies new
>      mandatory supported speeds
>
> 2. From xHCI supported protocol capability (extended capability for
> xHCI ports) major and minor revision number
>      Good: + spec is clear on this issue, can't be interpreted in
>      different ways.
>
>      Bad: - assumes host vendors only use 3.1 (30h) for 10Gbps SSP
>      capable hosts. (seems true so far for hosts)
>
>      Bad: - assumes a future spec release always implies new mandatory
>      supported speeds
>
> 3. From xHCI supported protocol capability (extended capability for
> xHCI ports) PSI Dwords
>      Good: +spec is clear on this issue, can't be interpreted in
>      different ways.
>
>      Good: +get actual real numerical value of supported speed, like
>      5830Mb/s
>
>      Bad: -PSI Dwords are optional, many vendors don't have them.

Indeed, they are optional. However if PSIC is 0, then the default
mapping *must* be assumed. Default mapping, on public spec, only species
up to 5Gbps. So this means that SSP hosts *must* have PSIC > 0.

> I already wrote xhci support for parsing PSI Dwords for xHCI and
> create the usb 3.1 root hub descriptor out of it.
>
> If hosts doesnt have PSI Dwords then driver uses the default USB speed
> ID mappings for root hub (xhci 7.2.2.1.)

which only define speeds up to 5Gbps

> To me it looks like first step is to use xHCI supported protocol
> capability major and minor fields to get USB release number, and also
> set initial supported speed.
>
> After this we can check if we a PSI Dwords list exists, and tune the
> supported speed for the host (and root hub)

Actually, I think we should go the other way around:

psic = read_psic_from_register();

if (psic)
	setup_supported_speeds_based_on_psic(xhci, psic);
else
	setup_supported_speeds_using_default_mappings(xhci);

This should be enough to sort everything out (assuming no-quirky HW, of
course). Even if a new spec is released defining a new default mapping
for 10Gbps and/or adding 0x31 to SBRN, we really don't need to rely on
that.

Well, maybe we can rely on SBRN to append a new default
mapping. Something like (also considering possible quirky hosts):

static bool xhci_30_supports_ssp(struct xhci_hcd *xhci)
{
	sbrn = read_sbrn_maybe(xhci);
        if (!sbrn)
        	return false;

	if (sbrn == 0x30 && xhci->quirks & XHCI_SBRN30_SUPPORTS_SSP)
        	return true;

	return false;
}

static void setup_supported_speeds_using_default_mappings(struct xhci_hcd *xhci)
{
	[...]

	sbrn = read_sbrn_maybe(xhci);
	if (!sbrn)
        	return;

	/*
         * xhci revision foo.bar defines a new SBRN of 0x31 for USB3.1
         * hosts.
         *
         * That same spec revision, also defines a new default mapping
         * for 10Gbps. Let's append it.
	 *
	 * Note that there are known quirky hosts which have SBRN equals
	 * to 0x30, but are, indeed, 10Gbps-capable hosts which PSIC
	 * equal to 0. Also handle these cases.
         */
	if (sbrn == 0x31 || xhci_30_supports_ssp(xhci))
        	append_10gbps_default_mapping(xhci);

	[...]
}

> Other things to consider is that we assume PSI IDs 1,2,3,4 always maps
> to Full, Low, High and SuperSpeed.

That's the default mapping. If PSIC > 0 you don't need default
mapping. Or rather, shouldn't need. Imagine the following situation:

Currently xhci always adds default mapping. Now say PSIC is > 0 and ID 3
is, according to PSI Dwords, used for 10Gbps. Now you're gonna have ID 3
being used for 10Gbps and 480Mbps.

IMHO, the first step should be extracting all the current magic (without
changing it in any way) to a separate function. Then you can start
reasoning about how to best parse/decode it.

> I haven't seen those mapped any other way, but I think PSI Dwords
> don't force this mapping.

they don't appear to, no. Only default mapping forces that.

-- 
balbi

Attachment: signature.asc
Description: PGP signature


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

  Powered by Linux