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:
parent
16c7ad7921
commit
d2cb7ea1ff
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue