Re: [PATCH] xhci: Disable MSI for Fresco Logic hosts.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Sergey,

I managed to dig up a Fresco Logic add-in card, and I verified both that
the problem with MSI does exist (for me) in Linux 3.0-rc1, and that this
patch fixes it.  I still don't understand why it works for you on 2.6.39
without this patch.  Anyway, thanks for reporting the issue!

Sarah Sharp

On Thu, Jun 02, 2011 at 12:22:53PM -0700, Sarah Sharp wrote:
> Some Fresco Logic hosts, including those found in the AUAU N533V laptop,
> advertise MSI, but fail to actually generate MSI interrupts.  Add a new
> xHCI quirk to skip MSI enabling for the Fresco Logic host controllers.
> I'm waiting on confirmation from Fresco Logic as to what revisions of the
> chip were affected, and unfortunately, the PCI vendor and device ID is the
> same for the chip in the USB-IF PDK FPGA card, and the production chip.
> 
> Completely disable MSI for all Fresco Logic hosts that have the PCI vendor
> ID 0x1b73 and device ID 0x1000.
> 
> Signed-off-by: Sarah Sharp <sarah.a.sharp@xxxxxxxxxxxxxxx>
> ---
> 
> Hi Sergey,
> 
> Can you try 2.6.38 with and without this patch?  I see a lot of reports
> on the Ubuntu forums about this chip, and I'd like to get the Ubuntu
> kernel team to fix it in their distro kernel, even if 2.6.38 isn't a
> supported stable kernel anymore.
> 
> Sarah Sharp
> 
>  drivers/usb/host/xhci-pci.c |   12 ++++++++++--
>  drivers/usb/host/xhci.c     |    7 +++++++
>  drivers/usb/host/xhci.h     |    1 +
>  3 files changed, 18 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c
> index bb668a8..93545ec 100644
> --- a/drivers/usb/host/xhci-pci.c
> +++ b/drivers/usb/host/xhci-pci.c
> @@ -73,12 +73,20 @@ static int xhci_pci_setup(struct usb_hcd *hcd)
>  
>  	/* Look for vendor-specific quirks */
>  	if (pdev->vendor == PCI_VENDOR_ID_FRESCO_LOGIC &&
> -			pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_PDK &&
> -			pdev->revision == 0x0) {
> +			pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_PDK) {
> +		if (pdev->revision == 0x0) {
>  			xhci->quirks |= XHCI_RESET_EP_QUIRK;
>  			xhci_dbg(xhci, "QUIRK: Fresco Logic xHC needs configure"
>  					" endpoint cmd after reset endpoint\n");
> +		} else {
> +			/* Not sure which revisions of the chip are broken. */
> +			xhci->quirks |= XHCI_BROKEN_MSI;
> +			xhci_dbg(xhci, "QUIRK: Fresco Logic revision %u "
> +					"has broken MSI implementation\n",
> +					pdev->revision);
> +		}
>  	}
> +
>  	if (pdev->vendor == PCI_VENDOR_ID_NEC)
>  		xhci->quirks |= XHCI_NEC_HOST;
>  
> diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
> index 150349d..ac09016 100644
> --- a/drivers/usb/host/xhci.c
> +++ b/drivers/usb/host/xhci.c
> @@ -412,12 +412,19 @@ int xhci_run(struct usb_hcd *hcd)
>  		free_irq(hcd->irq, hcd);
>  	hcd->irq = -1;
>  
> +	/* Some Fresco Logic host controllers advertise MSI, but fail to
> +	 * generate interrupts.  Don't even try to enable MSI.
> +	 */
> +	if (xhci->quirks & XHCI_BROKEN_MSI)
> +		goto legacy_irq;
> +
>  	ret = xhci_setup_msix(xhci);
>  	if (ret)
>  		/* fall back to msi*/
>  		ret = xhci_setup_msi(xhci);
>  
>  	if (ret) {
> +legacy_irq:
>  		/* fall back to legacy interrupt*/
>  		ret = request_irq(pdev->irq, &usb_hcd_irq, IRQF_SHARED,
>  					hcd->irq_descr, hcd);
> diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h
> index 19040c5..21470fa 100644
> --- a/drivers/usb/host/xhci.h
> +++ b/drivers/usb/host/xhci.h
> @@ -1259,6 +1259,7 @@ struct xhci_hcd {
>  #define	XHCI_LINK_TRB_QUIRK	(1 << 0)
>  #define XHCI_RESET_EP_QUIRK	(1 << 1)
>  #define XHCI_NEC_HOST		(1 << 2)
> +#define XHCI_BROKEN_MSI		(1 << 6)
>  	u32			port_c_suspend[8];	/* port suspend change*/
>  	u32			suspended_ports[8];	/* which ports are
>  							   suspended */
> -- 
> 1.7.4.1
> 
> --
> 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


[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux