Re: spec violation of xHCI?

From: Kohji Okuno <okuno.kohji_at_jp.panasonic.com>
Date: Wed, 11 Dec 2013 20:12:13 +0900 (JST)
> On 12/11/13 11:12, Kohji Okuno wrote:
>> Hi,
>>
>> I think the xHCI host controller driver has a spec violation.
>>
>> Could you refer to
>> ``Table 126: Offset 0Ch – Link TRB Field Definitions''
>> in  xHCI_Specification_for_USB.pdf(Revision 1.0)?
>>
>> The following is an excerpt about the CHAIN ​​BIT.
>>
>>    Chain bit (CH). Set to ‘1’ by software to associate this TRB with
>>    the next TRB on the Ring. A Transfer Descriptor (TD) is defined as
>>    one or more TRBs. The Chain bit is used to identify the TRBs that
>>    comprise a TD. Refer to section 4.11.7 for more information on Link
>>    TRB placement within a TD. On a Command Ring this bit is ignored by
>>    the xHC.
>>
>>
>> I think that we should add XHCI_TRB_3_CHAIN_BIT to line 1895.
>> How do you think?
>>
> 
> Hi Kohji,
> 
> The double word written at line 1895 does not set the "chain bit" because this
> is the end of a transfer descriptor, TD. I'm unsure how hardware interprets
> this bit, if setting the bit on the previous TRB makes the next one connect to
> the previous one, or the other way around. If setting this bit makes the TRB
> connect to the previous one, you are correct. Else the current code is
> correct.

Hi, HPS,

Thank you for your comment.

I think that this (line 1895) is not the end of a transfer descriptor.
When the device driver needs a Zero Length Packet, this is not the
end. And, If xfer has nframes, this is not the end, too.

Regards,
 Kohji Okuno

>>
>> src/sys/dev/usb/controller/xhci.c:
>> 1879	                /* fill out link TRB */
>> 1880	
>> 1881	                if (td_next != NULL) {
>> 1882	                        /* link the current TD with the next one */
>> 1883 td->td_trb[x].qwTrb0 = htole64((uint64_t)td_next->td_self);
>> 1884 DPRINTF("LINK=0x%08llx\n", (long long)td_next->td_self);
>> 1885	                } else {
>> 1886	                        /* this field will get updated later */
>> 1887	                        DPRINTF("NOLINK\n");
>> 1888	                }
>> 1889	
>> 1890	                dword = XHCI_TRB_2_IRQ_SET(0);
>> 1891	
>> 1892	                td->td_trb[x].dwTrb2 = htole32(dword);
>> 1893	
>> 1894	                dword = XHCI_TRB_3_TYPE_SET(XHCI_TRB_TYPE_LINK) |
>> 1895	                    XHCI_TRB_3_CYCLE_BIT | XHCI_TRB_3_IOC_BIT;
>> 1896	
>> 1897	                td->td_trb[x].dwTrb3 = htole32(dword);
>> 1898	
>> 1899	                td->alt_next = td_alt_next;
>>
>> --
>> Best regards,
>>   Kohji Okuno
>>
>> _______________________________________________
>> freebsd-usb_at_freebsd.org mailing list
>> http://lists.freebsd.org/mailman/listinfo/freebsd-usb

>> To unsubscribe, send any mail to "freebsd-usb-unsubscribe_at_freebsd.org"
>>
> 
Received on Wed Dec 11 2013 - 10:12:25 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:40:45 UTC