Skip site navigation (1)Skip section navigation (2)
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>