Date: Sun, 2 Jun 2013 12:28:30 +0000 (UTC) From: Hans Petter Selasky <hselasky@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r251254 - head/sys/dev/usb/controller Message-ID: <201306021228.r52CSULF061243@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: hselasky Date: Sun Jun 2 12:28:29 2013 New Revision: 251254 URL: http://svnweb.freebsd.org/changeset/base/251254 Log: Correct the TD size computation. npkt should reflect the number of packets remaining after the current TRB has been executed. Refer to section 4.11.2.4 of the XHCI specification for USB. MFC after: 1 week Modified: head/sys/dev/usb/controller/xhci.c Modified: head/sys/dev/usb/controller/xhci.c ============================================================================== --- head/sys/dev/usb/controller/xhci.c Sun Jun 2 12:16:58 2013 (r251253) +++ head/sys/dev/usb/controller/xhci.c Sun Jun 2 12:28:29 2013 (r251254) @@ -1550,6 +1550,7 @@ xhci_setup_generic_chain_sub(struct xhci uint32_t buf_offset; uint32_t average; uint32_t len_old; + uint32_t npkt_off; uint32_t dword; uint8_t shortpkt_old; uint8_t precompute; @@ -1560,6 +1561,7 @@ xhci_setup_generic_chain_sub(struct xhci buf_offset = 0; shortpkt_old = temp->shortpkt; len_old = temp->len; + npkt_off = 0; precompute = 1; restart: @@ -1666,7 +1668,7 @@ restart: /* fill out buffer pointers */ if (average == 0) { - npkt = 1; + npkt = 0; memset(&buf_res, 0, sizeof(buf_res)); } else { usbd_get_page(temp->pc, temp->offset + @@ -1680,8 +1682,10 @@ restart: if (buf_res.length > XHCI_TD_PAGE_SIZE) buf_res.length = XHCI_TD_PAGE_SIZE; + npkt_off += buf_res.length; + /* setup npkt */ - npkt = (average + temp->max_packet_size - 1) / + npkt = (len_old - npkt_off + temp->max_packet_size - 1) / temp->max_packet_size; if (npkt > 31)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201306021228.r52CSULF061243>