On Wed, Jun 1, 2011 at 5:42 AM, Matthew Wilcox <willy@xxxxxxxxxxxxxxx> wrote: > > When we have multiple event queues, we'll only want to > handle events on a single queue. > > Signed-off-by: Matthew Wilcox <matthew.r.wilcox@xxxxxxxxx> > --- > drivers/usb/host/xhci-mem.c | 4 ++-- > drivers/usb/host/xhci-ring.c | 32 ++++++++++++++++---------------- > drivers/usb/host/xhci.h | 1 + > 3 files changed, 19 insertions(+), 18 deletions(-) > > diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c > index 2ad7443..d153cef 100644 > --- a/drivers/usb/host/xhci-mem.c > +++ b/drivers/usb/host/xhci-mem.c > @@ -2016,14 +2016,14 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) > xhci->dba = (void __iomem *) xhci->cap_regs + val; > xhci_dbg_regs(xhci); > xhci_print_run_regs(xhci); > - /* Set ir_set to interrupt register set 0 */ > - xhci->erst.ir_set = &xhci->run_regs->ir_set[0]; > > /* > * Event ring setup: Allocate a normal ring, but also setup > * the event ring segment table (ERST). Section 4.9.3. > */ > xhci_dbg(xhci, "// Allocating event ring\n"); > + xhci->erst.hcd = xhci; > + xhci->erst.ir_set = &xhci->run_regs->ir_set[0]; > xhci->erst.ring = xhci_ring_alloc(xhci, ERST_NUM_SEGS, false, flags); > if (!xhci->erst.ring) > goto fail; > diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c > index 92e9b5c..c3c2aec 100644 > --- a/drivers/usb/host/xhci-ring.c > +++ b/drivers/usb/host/xhci-ring.c > @@ -2179,22 +2179,22 @@ cleanup: > * Returns >0 for "possibly more events to process" (caller should call again), > * otherwise 0 if done. In future, <0 returns should indicate error code. > */ > -static int xhci_handle_event(struct xhci_hcd *xhci) > +static int xhci_handle_event(struct xhci_erst *erst) > { > union xhci_trb *event; > int update_ptrs = 1; > int ret; > > - if (!xhci->erst.ring || !xhci->erst.ring->dequeue) { > - xhci->error_bitmask |= 1 << 1; > + if (!erst->ring || !erst->ring->dequeue) { > + erst->hcd->error_bitmask |= 1 << 1; > return 0; > } > > - event = xhci->erst.ring->dequeue; > + event = erst->ring->dequeue; > /* Does the HC or OS own the TRB? */ > if ((le32_to_cpu(event->event_cmd.flags) & TRB_CYCLE) != > - xhci->erst.ring->cycle_state) { > - xhci->error_bitmask |= 1 << 2; > + erst->ring->cycle_state) { > + erst->hcd->error_bitmask |= 1 << 2; > return 0; > } > > @@ -2206,38 +2206,38 @@ static int xhci_handle_event(struct xhci_hcd *xhci) > /* FIXME: Handle more event types. */ > switch ((le32_to_cpu(event->event_cmd.flags) & TRB_TYPE_BITMASK)) { > case TRB_TYPE(TRB_COMPLETION): > - handle_cmd_completion(xhci, &event->event_cmd); > + handle_cmd_completion(erst->hcd, &event->event_cmd); > break; > case TRB_TYPE(TRB_PORT_STATUS): > - handle_port_status(xhci, event); > + handle_port_status(erst->hcd, event); > update_ptrs = 0; > break; > case TRB_TYPE(TRB_TRANSFER): > - ret = handle_tx_event(xhci, &event->trans_event); > + ret = handle_tx_event(erst->hcd, &event->trans_event); > if (ret < 0) > - xhci->error_bitmask |= 1 << 9; > + erst->hcd->error_bitmask |= 1 << 9; > else > update_ptrs = 0; > break; > default: > if ((le32_to_cpu(event->event_cmd.flags) & TRB_TYPE_BITMASK) >= > TRB_TYPE(48)) > - handle_vendor_event(xhci, event); > + handle_vendor_event(erst->hcd, event); > else > - xhci->error_bitmask |= 1 << 3; > + erst->hcd->error_bitmask |= 1 << 3; > } > /* Any of the above functions may drop and re-acquire the lock, so check > * to make sure a watchdog timer didn't mark the host as non-responsive. > */ > - if (xhci->xhc_state & XHCI_STATE_DYING) { > - xhci_dbg(xhci, "xHCI host dying, returning from " > + if (erst->hcd->xhc_state & XHCI_STATE_DYING) { > + xhci_dbg(erst->hcd, "xHCI host dying, returning from " > "event handler.\n"); > return 0; > } > > if (update_ptrs) > /* Update SW event ring dequeue pointer */ > - inc_deq(xhci, xhci->erst.ring, true); > + inc_deq(erst->hcd, erst->ring, true); > > /* Are there more items on the event ring? Caller will call us again to > * check. > @@ -2312,7 +2312,7 @@ hw_died: > /* FIXME this should be a delayed service routine > * that clears the EHB. > */ > - while (xhci_handle_event(xhci) > 0) {} > + while (xhci_handle_event(&xhci->erst) > 0) {} > > temp_64 = xhci_read_64(xhci, &xhci->erst.ir_set->erst_dequeue); > /* If necessary, update the HW's version of the event ring deq ptr. */ > diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h > index db2491b..45fa667 100644 > --- a/drivers/usb/host/xhci.h > +++ b/drivers/usb/host/xhci.h > @@ -1135,6 +1135,7 @@ struct xhci_erst_entry { > }; > > struct xhci_erst { > + struct xhci_hcd *hcd; Hi Matthew, Can you use "struct xhci_hcd *xhci;" here instead? Because in other places of xhci driver, the hcd pointer often refers to a usb_hcd structure. It may cause confusion. Thanks, Andiry > struct xhci_ring *ring; > struct xhci_intr_reg __iomem *ir_set; > struct xhci_erst_entry *entries; > -- > 1.7.4.4 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-usb" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html > -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html