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


_______________________________________________
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "freebsd-current-unsubscr...@freebsd.org"

Reply via email to