aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndiry Xu <andiry.xu@amd.com>2011-05-05 06:14:02 -0400
committerSarah Sharp <sarah.a.sharp@linux.intel.com>2011-05-09 12:34:47 -0400
commitad106f292369d753d5c75751cb9e760726e3cd00 (patch)
tree0d612a1b3a09f03103eb33a012dbb3264137e170
parent7b1fc2ea8a5fbf9487d83865456cff77d0249ea9 (diff)
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: Andiry Xu <andiry.xu@amd.com> Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com>
-rw-r--r--drivers/usb/host/xhci-ring.c5
-rw-r--r--drivers/usb/host/xhci.h2
2 files changed, 7 insertions, 0 deletions
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
index 3e759af049b7..c35058b94de6 100644
--- a/drivers/usb/host/xhci-ring.c
+++ b/drivers/usb/host/xhci-ring.c
@@ -3293,6 +3293,11 @@ static int xhci_queue_isoc_tx(struct xhci_hcd *xhci, gfp_t mem_flags,
3293 } else { 3293 } else {
3294 td->last_trb = ep_ring->enqueue; 3294 td->last_trb = ep_ring->enqueue;
3295 field |= TRB_IOC; 3295 field |= TRB_IOC;
3296 if (xhci->hci_version == 0x100) {
3297 /* Set BEI bit except for the last td */
3298 if (i < num_tds - 1)
3299 field |= TRB_BEI;
3300 }
3296 more_trbs_coming = false; 3301 more_trbs_coming = false;
3297 } 3302 }
3298 3303
diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h
index af8b66f2fd00..33a49d5d6c22 100644
--- a/drivers/usb/host/xhci.h
+++ b/drivers/usb/host/xhci.h
@@ -964,6 +964,8 @@ struct xhci_event_cmd {
964/* The buffer pointer contains immediate data */ 964/* The buffer pointer contains immediate data */
965#define TRB_IDT (1<<6) 965#define TRB_IDT (1<<6)
966 966
967/* Block Event Interrupt */
968#define TRB_BEI (1<<9)
967 969
968/* Control transfer TRB specific fields */ 970/* Control transfer TRB specific fields */
969#define TRB_DIR_IN (1<<16) 971#define TRB_DIR_IN (1<<16)