[-cc Dexuan Cui <dexuan.cui@xxxxxxxxx>, matthew@xxxxxx (bounced)] [+to willy@xxxxxxxxxxxxxxx] Might want to clean up MAINTAINERS, Matthew :) On Fri, Jun 19, 2015 at 5:42 PM, Bjorn Helgaas <bhelgaas@xxxxxxxxxx> wrote: > In the generic quirk fixup_rev1_53c810(), added by a5312e28c195 ("[PATCH] > PCI: NCR 53c810 quirk"), we assigned "class = PCI_CLASS_STORAGE_SCSI". But > PCI_CLASS_STORAGE_SCSI is only the two-byte base class/sub-class and needs > to be shifted to make space for the low-order interface byte. > > Furthermore, we had a similar quirk, pci_fixup_ncr53c810(), for arch/x86, > which assigned class correctly. The arch code is linked before the PCI > core, so arch quirks run before generic quirks. Therefore, on x86, the x86 > arch quirk ran first, and the generic quirk did nothing because it saw that > dev->class was already set. But on other arches, the generic quirk set the > wrong class code. > > Fix the generic quirk to set the correct class code and remove the > now-unnecessary x86-specific quirk. > > Signed-off-by: Bjorn Helgaas <bhelgaas@xxxxxxxxxx> > CC: Matthew Wilcox <matthew@xxxxxx> > --- > arch/x86/pci/fixup.c | 13 ------------- > drivers/pci/quirks.c | 14 +++++++++----- > 2 files changed, 9 insertions(+), 18 deletions(-) > > diff --git a/arch/x86/pci/fixup.c b/arch/x86/pci/fixup.c > index 9a2b710..e585655 100644 > --- a/arch/x86/pci/fixup.c > +++ b/arch/x86/pci/fixup.c > @@ -62,19 +62,6 @@ static void pci_fixup_umc_ide(struct pci_dev *d) > } > DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_UMC, PCI_DEVICE_ID_UMC_UM8886BF, pci_fixup_umc_ide); > > -static void pci_fixup_ncr53c810(struct pci_dev *d) > -{ > - /* > - * NCR 53C810 returns class code 0 (at least on some systems). > - * Fix class to be PCI_CLASS_STORAGE_SCSI > - */ > - if (!d->class) { > - dev_warn(&d->dev, "Fixing NCR 53C810 class code\n"); > - d->class = PCI_CLASS_STORAGE_SCSI << 8; > - } > -} > -DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NCR, PCI_DEVICE_ID_NCR_53C810, pci_fixup_ncr53c810); > - > static void pci_fixup_latency(struct pci_dev *d) > { > /* > diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c > index 2dab425..64177a6 100644 > --- a/drivers/pci/quirks.c > +++ b/drivers/pci/quirks.c > @@ -1997,14 +1997,18 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1508, quirk_disable_aspm_l0s); > > static void fixup_rev1_53c810(struct pci_dev *dev) > { > - /* rev 1 ncr53c810 chips don't set the class at all which means > + u32 class = dev->class; > + > + /* > + * rev 1 ncr53c810 chips don't set the class at all which means > * they don't get their resources remapped. Fix that here. > */ > + if (class) > + return; > > - if (dev->class == PCI_CLASS_NOT_DEFINED) { > - dev_info(&dev->dev, "NCR 53c810 rev 1 detected; setting PCI class\n"); > - dev->class = PCI_CLASS_STORAGE_SCSI; > - } > + dev->class = PCI_CLASS_STORAGE_SCSI << 8; > + dev_info(&dev->dev, "NCR 53c810 rev 1 PCI class overridden (%#08x -> %#08x)\n", > + class, dev->class); > } > DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NCR, PCI_DEVICE_ID_NCR_53C810, fixup_rev1_53c810); > > -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in