aboutsummaryrefslogtreecommitdiff
path: root/payloads/libpayload/drivers/usb/xhci_events.c
diff options
context:
space:
mode:
Diffstat (limited to 'payloads/libpayload/drivers/usb/xhci_events.c')
-rw-r--r--payloads/libpayload/drivers/usb/xhci_events.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/payloads/libpayload/drivers/usb/xhci_events.c b/payloads/libpayload/drivers/usb/xhci_events.c
index b04ecda267..ab90c59fe3 100644
--- a/payloads/libpayload/drivers/usb/xhci_events.c
+++ b/payloads/libpayload/drivers/usb/xhci_events.c
@@ -308,7 +308,7 @@ xhci_wait_for_command_done(xhci_t *const xhci,
return cc;
}
-/* returns cc of transfer for given slot/endpoint pair */
+/* returns amount of bytes transferred on success, negative CC on error */
int
xhci_wait_for_transfer(xhci_t *const xhci, const int slot_id, const int ep_id)
{
@@ -319,7 +319,9 @@ xhci_wait_for_transfer(xhci_t *const xhci, const int slot_id, const int ep_id)
while (xhci_wait_for_event_type(xhci, TRB_EV_TRANSFER, &timeout_us)) {
if (TRB_GET(ID, xhci->er.cur) == slot_id &&
TRB_GET(EP, xhci->er.cur) == ep_id) {
- cc = TRB_GET(CC, xhci->er.cur);
+ cc = -TRB_GET(CC, xhci->er.cur);
+ if (cc == -CC_SUCCESS || cc == -CC_SHORT_PACKET)
+ cc = TRB_GET(EVTL, xhci->er.cur);
xhci_advance_event_ring(xhci);
break;
}