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>
This commit is contained in:
Patrick Georgi 2012-10-03 08:23:56 +02:00 committed by Anton Kochkov
parent 16c7ad7921
commit d2cb7ea1ff
1 changed files with 4 additions and 1 deletions

View File

@ -429,7 +429,10 @@ uhci_bulk (endpoint_t *ep, int size, u8 *data, int finalize)
int maxpsize = ep->maxpacketsize; int maxpsize = ep->maxpacketsize;
if (maxpsize == 0) if (maxpsize == 0)
fatal("MaxPacketSize == 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) if (numpackets == 0)
return 0; return 0;
td_t *tds = create_schedule (numpackets); td_t *tds = create_schedule (numpackets);