提交 ad106f29 编写于 作者: A Andiry Xu 提交者: Sarah Sharp

xHCI 1.0: Block Interrupts for Isoch transfer

Currently an isoc URB is divided into multiple TDs, and every TD will
trigger an interrupt when it's processed. However, software can schedule
multiple TDs at a time, and it only needs an interrupt every URB.

xHCI 1.0 introduces the Block Event Interrupt(BEI) flag which allows Normal
and Isoch Transfer TRBs to place an Event TRB on an Event Ring but not
assert an intrrupt to the host, and the interrupt rate is significantly
reduced and the system performance is improved.
Signed-off-by: NAndiry Xu <andiry.xu@amd.com>
Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
上级 7b1fc2ea
...@@ -3293,6 +3293,11 @@ static int xhci_queue_isoc_tx(struct xhci_hcd *xhci, gfp_t mem_flags, ...@@ -3293,6 +3293,11 @@ static int xhci_queue_isoc_tx(struct xhci_hcd *xhci, gfp_t mem_flags,
} else { } else {
td->last_trb = ep_ring->enqueue; td->last_trb = ep_ring->enqueue;
field |= TRB_IOC; field |= TRB_IOC;
if (xhci->hci_version == 0x100) {
/* Set BEI bit except for the last td */
if (i < num_tds - 1)
field |= TRB_BEI;
}
more_trbs_coming = false; more_trbs_coming = false;
} }
......
...@@ -964,6 +964,8 @@ struct xhci_event_cmd { ...@@ -964,6 +964,8 @@ struct xhci_event_cmd {
/* The buffer pointer contains immediate data */ /* The buffer pointer contains immediate data */
#define TRB_IDT (1<<6) #define TRB_IDT (1<<6)
/* Block Event Interrupt */
#define TRB_BEI (1<<9)
/* Control transfer TRB specific fields */ /* Control transfer TRB specific fields */
#define TRB_DIR_IN (1<<16) #define TRB_DIR_IN (1<<16)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册