Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 11 Dec 2013 11:56:22 +0100
From:      Hans Petter Selasky <hps@bitfrost.no>
To:        Kohji Okuno <okuno.kohji@jp.panasonic.com>,  freebsd-current@FreeBSD.org, freebsd-usb@freebsd.org
Subject:   Re: spec violation of xHCI?
Message-ID:  <52A844D6.7050203@bitfrost.no>
In-Reply-To: <20131211.191212.1888965979017331164.okuno.kohji@jp.panasonic.com>
References:  <20131211.191212.1888965979017331164.okuno.kohji@jp.panasonic.com>

next in thread | previous in thread | raw e-mail | index | archive | help
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.

Thank you!

--HPS

>
> 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@freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-usb
> To unsubscribe, send any mail to "freebsd-usb-unsubscribe@freebsd.org"
>




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?52A844D6.7050203>