lkml.org 
[lkml]   [2012]   [Feb]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    SubjectRe: [RFT] USB: Try MSI first before line IRQ for Intel PCIe USB3 HCD
    From
    Date
    On Mon, 2012-02-13 at 16:25 -0800, Sarah Sharp wrote:
    > We have a PCI USB xhci host controller on a new platform. It doesn't
    > have a line IRQ definition in BIOS. The Linux driver refuses to
    > initial this controller, but Windows works well because it only depends
    > on MSI.
    >
    > Actually, Linux also can work for MSI. This patch skips the first line
    > IRQ checking for our HCD in usb-core pci probe, then try to enable MSI
    > firstly. That make this HCD works well under Linux.
    >
    > This patch should be backported to kernels as old as 2.6.32.
    >
    > Signed-off-by: Alex Shi <alex.shi@intel.com>
    > Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com>
    > Cc: stable@vger.kernel.org
    > ---
    >
    > Hi Alex,
    >
    > Please test this on your Panther Point system that doesn't have a BIOS
    > provided IRQ line. I think this is a much simpler solution.

    It is Ok on the platform.
    Thanks!
    >
    > Sarah Sharp
    >
    > drivers/usb/core/hcd-pci.c | 5 ++++-
    > drivers/usb/core/hcd.c | 6 ++++--
    > drivers/usb/host/xhci.c | 5 +++++
    > 3 files changed, 13 insertions(+), 3 deletions(-)
    >
    > diff --git a/drivers/usb/core/hcd-pci.c b/drivers/usb/core/hcd-pci.c
    > index d136b8f..81e2c0d 100644
    > --- a/drivers/usb/core/hcd-pci.c
    > +++ b/drivers/usb/core/hcd-pci.c
    > @@ -187,7 +187,10 @@ int usb_hcd_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
    > return -ENODEV;
    > dev->current_state = PCI_D0;
    >
    > - if (!dev->irq) {
    > + /* The xHCI driver supports MSI and MSI-X,
    > + * so don't fail if the BIOS doesn't provide a legacy IRQ.
    > + */
    > + if (!dev->irq && (driver->flags & HCD_MASK) != HCD_USB3) {
    > dev_err(&dev->dev,
    > "Found HC with no IRQ. Check BIOS/PCI %s setup!\n",
    > pci_name(dev));
    > diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
    > index eb19cba..e128232 100644
    > --- a/drivers/usb/core/hcd.c
    > +++ b/drivers/usb/core/hcd.c
    > @@ -2447,8 +2447,10 @@ int usb_add_hcd(struct usb_hcd *hcd,
    > && device_can_wakeup(&hcd->self.root_hub->dev))
    > dev_dbg(hcd->self.controller, "supports USB remote wakeup\n");
    >
    > - /* enable irqs just before we start the controller */
    > - if (usb_hcd_is_primary_hcd(hcd)) {
    > + /* enable irqs just before we start the controller,
    > + * if the BIOS provides legacy PCI irqs.
    > + */
    > + if (usb_hcd_is_primary_hcd(hcd) && irqnum) {
    > retval = usb_hcd_request_irqs(hcd, irqnum, irqflags);
    > if (retval)
    > goto err_request_irq;
    > diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
    > index 6bbe3c3..c939f5f 100644
    > --- a/drivers/usb/host/xhci.c
    > +++ b/drivers/usb/host/xhci.c
    > @@ -352,6 +352,11 @@ static int xhci_try_enable_msi(struct usb_hcd *hcd)
    > /* hcd->irq is -1, we have MSI */
    > return 0;
    >
    > + if (!pdev->irq) {
    > + xhci_err(xhci, "No msi-x/msi found and no IRQ in BIOS\n");
    > + return -EINVAL;
    > + }
    > +
    > /* fall back to legacy interrupt*/
    > ret = request_irq(pdev->irq, &usb_hcd_irq, IRQF_SHARED,
    > hcd->irq_descr, hcd);




    \
     
     \ /
      Last update: 2012-02-14 05:51    [W:0.032 / U:90.516 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site