From d2cb7ea1ff2bef2e4b54d12a295abf2fd76ebd9a Mon Sep 17 00:00:00 2001 From: Patrick Georgi Date: Wed, 3 Oct 2012 08:23:56 +0200 Subject: 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 Reviewed-on: http://review.coreboot.org/1555 Tested-by: build bot (Jenkins) Reviewed-by: Anton Kochkov --- payloads/libpayload/drivers/usb/uhci.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'payloads/libpayload/drivers/usb') 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); -- cgit v1.2.3