diff options
author | Patrick Georgi <patrick@georgi-clan.de> | 2012-10-03 08:23:56 +0200 |
---|---|---|
committer | Anton Kochkov <anton.kochkov@gmail.com> | 2012-10-03 09:25:25 +0200 |
commit | d2cb7ea1ff2bef2e4b54d12a295abf2fd76ebd9a (patch) | |
tree | a096f5e3071294227dcb2f3ccd469af114c1b105 | |
parent | 16c7ad79219ae48cae0cae6498c6df6cc1dc8e2b (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.c | 5 |
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); |