summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Georgi <patrick@georgi-clan.de>2012-10-03 08:23:56 +0200
committerAnton Kochkov <anton.kochkov@gmail.com>2012-10-03 09:25:25 +0200
commitd2cb7ea1ff2bef2e4b54d12a295abf2fd76ebd9a (patch)
treea096f5e3071294227dcb2f3ccd469af114c1b105
parent16c7ad79219ae48cae0cae6498c6df6cc1dc8e2b (diff)
libpayload: UHCI driver contained too much magic
The handling of finalize in uhci_bulk was confusing, and so its behaviour changed. If set, the driver is supposed to add a trailing empty packet iff the last packet is of maximum packet size. This helps the device to decide if the transfer is completed simply by waiting for a packet that isn't full length. Change-Id: I162e8c1e034924d0de6fdcb971c94cf3a5ea31eb Signed-off-by: Patrick Georgi <patrick@georgi-clan.de> Reviewed-on: http://review.coreboot.org/1555 Tested-by: build bot (Jenkins) Reviewed-by: Anton Kochkov <anton.kochkov@gmail.com>
-rw-r--r--payloads/libpayload/drivers/usb/uhci.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/payloads/libpayload/drivers/usb/uhci.c b/payloads/libpayload/drivers/usb/uhci.c
index 6cc6b282a2..764770763a 100644
--- a/payloads/libpayload/drivers/usb/uhci.c
+++ b/payloads/libpayload/drivers/usb/uhci.c
@@ -429,7 +429,10 @@ uhci_bulk (endpoint_t *ep, int size, u8 *data, int finalize)
int maxpsize = ep->maxpacketsize;
if (maxpsize == 0)
fatal("MaxPacketSize == 0!!!");
- int numpackets = (size + maxpsize - 1) / maxpsize + finalize;
+ int numpackets = (size + maxpsize - 1) / maxpsize;
+ if (finalize && ((size % maxpsize) == 0)) {
+ numpackets++;
+ }
if (numpackets == 0)
return 0;
td_t *tds = create_schedule (numpackets);