Re: [PATCH] PCI: Add quirk for setting valid class for FSL PCI host bridge

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

 



[+cc Ben, Paul, Minghuan, Kumar, Anton, linuxppc-dev

On Fri, Jul 26, 2013 at 1:23 AM, Chunhe Lan <Chunhe.Lan@xxxxxxxxxxxxx> wrote:
> Freescale platform has class code = 0x0b2000, when it boots. This makes
> kernel PCI bus code to setup these devices resulting into the following
> notice information when trying to enable them:
>
> pci 0000:00:00.0: ignoring class 0x0b2000 (doesn't match header type 01)
>
> This patch adds a ID specific(PCI_VENDOR_ID_FREESCALE & PCI_ANY_ID based)
> 'early' fixup quirk to replace class code with PCI_CLASS_BRIDGE_PCI as
> class. Then the above information disappears.
>
> Signed-off-by: Chunhe Lan <Chunhe.Lan@xxxxxxxxxxxxx>
> Cc: Bjorn Helgaas <bhelgaas@xxxxxxxxxx>
> ---
>  drivers/pci/quirks.c |   10 ++++++++++
>  1 files changed, 10 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
> index e85d230..906a04a3 100644
> --- a/drivers/pci/quirks.c
> +++ b/drivers/pci/quirks.c
> @@ -2772,6 +2772,16 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x342e, vtd_mask_spec_errors);
>  DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x3c28, vtd_mask_spec_errors);
>  #endif
>
> +#ifdef CONFIG_FSL_PCI
> +static void quirk_freescale_class(struct pci_dev *dev)
> +{
> +       dev_info(&dev->dev, "Setting PCI class for FSL PCI host bridge\n");
> +       dev->class = (PCI_CLASS_BRIDGE_PCI << 8) | (dev->class & 0xff);
> +}
> +DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_FREESCALE, PCI_ANY_ID,
> +                       quirk_freescale_class);

1.  This looks an awful lot like quirk_fsl_pcie_head().
quirk_fsl_pcie_head() is currently a HEADER quirk, but that runs
*after* pci_setup_device(), where dev->class is used.  I suspect this
should be an EARLY quirk instead.  But this quirk has a long history
as a HEADER quirk, and I'm sure many people have tested it, so I don't
know what's going on.

2.  I assume the Freescale vendor ID might be used for devices other
than bridges, so I doubt it would be correct to overwrite the class
for *every* Freescale device as you're doing here.

> +#endif
> +
>  static void fixup_ti816x_class(struct pci_dev *dev)
>  {
>         /* TI 816x devices do not have class code set when in PCIe boot mode */
> --
> 1.7.6.5
>
>
--
To unsubscribe from this list: send the line "unsubscribe linux-pci" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [DMA Engine]     [Linux Coverity]     [Linux USB]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Greybus]

  Powered by Linux