diff options
-rw-r--r-- | payloads/libpayload/drivers/usb/xhci.c | 2 | ||||
-rw-r--r-- | payloads/libpayload/drivers/usb/xhci_private.h | 2 |
2 files changed, 3 insertions, 1 deletions
diff --git a/payloads/libpayload/drivers/usb/xhci.c b/payloads/libpayload/drivers/usb/xhci.c index 5fdc68e266..714c9ceaa6 100644 --- a/payloads/libpayload/drivers/usb/xhci.c +++ b/payloads/libpayload/drivers/usb/xhci.c @@ -541,7 +541,7 @@ xhci_enqueue_td(transfer_ring_t *const tr, const int ep, const size_t mps, xhci_clear_trb(trb, tr->pcs); trb->ptr_low = virt_to_phys(cur_start); TRB_SET(TL, trb, cur_length); - TRB_SET(TDS, trb, packets); + TRB_SET(TDS, trb, MIN(TRB_MAX_TD_SIZE, packets)); TRB_SET(CH, trb, 1); /* Check for first, data stage TRB */ diff --git a/payloads/libpayload/drivers/usb/xhci_private.h b/payloads/libpayload/drivers/usb/xhci_private.h index 09312ba3fd..43800d8d49 100644 --- a/payloads/libpayload/drivers/usb/xhci_private.h +++ b/payloads/libpayload/drivers/usb/xhci_private.h @@ -139,6 +139,8 @@ typedef volatile struct trb { u32 control; } trb_t; +#define TRB_MAX_TD_SIZE 0x1F /* bits 21:17 of TD Size in TRB */ + #define EVENT_RING_SIZE 64 typedef struct { trb_t *ring; |