Messages in this thread | | | Date | Sat, 18 Feb 2012 14:28:25 +0800 | From | Andiry Xu <> | Subject | Re: [PATCH] usb: enable pci MSI/MSIX in usb core |
| |
On 02/17/2012 06:15 PM, Clemens Ladisch wrote: > Alex,Shi wrote: >>> The controller driver will need to know which of the multiple MSI-X >>> interrupts has been raised: >>> >>> irqreturn_t (*msix_irq)(struct usb_hcd *hcd, unsigned int nr_or_index); >> >> Actually, hcd has 2 object for msix, msix_count and msix_entries. >> >> Do you mean msix_count maybe smaller than we decide in hcd_setup_msix()? > > No. But when msic_count > 1, we have multiple interrupts. > >> Which situation will make this? > > Assume that an XHCI controller has two rings, and that each one gets its > own MSI-X interrupt. How should the driver decide which of the rings > needs to be handled? > > irqreturn_t xhci_msix_irq(struct usb_hcd *hcd) > { > struct xhci_hcd *xhci = hcd_to_xhci(hcd); > > if (...) > handle(xhci->ring[0]); > else > handle(xhci->ring[1]); > } > > I.e., what should go into the if()? > >
Currently xHCI driver only support one ERST event ring. If we need to support multiple event rings in the future, it's simple: in usb_hcd_request_msi_msix_irqs, change the last parameter of request_irq() to xhci->erst[i], and we can get the corresponding erst[i] in xhci_msi_irq() like this:
irqreturn_t xhci_msi_irq(int irq, void *dev_id) { struct xhci_erst *erst = dev_id; ... /* Handle corresponding event ring pointed by erst */ }
See Matthew Wilcox's patchset below for reference:
www.spinics.net/lists/linux-usb/msg47353.html
Thanks, Andiry Andiry
| |