On Tue, 2007-10-23 at 19:53 -0700, David Miller wrote: > A reasonably common problem with some devices is that they will > disable MSI generation when the INTX_DISABLE bit is set in the > PCI_COMMAND register. > > Quirk this explicitly, guarding the pci_intx() calls in msi.c with > this quirk indication. > > The first entries for this quirk are for 5714 and 5780 Tigon3 chips, > and thus we can remove the workaround code from the tg3.c driver. > > Signed-off-by: David S. Miller <davem@xxxxxxxxxxxxx> > diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c > index 87e0161..a8dd18c 100644 > --- a/drivers/pci/msi.c > +++ b/drivers/pci/msi.c > @@ -237,7 +237,8 @@ static void __pci_restore_msi_state(struct pci_dev *dev) > entry = get_irq_msi(dev->irq); > pos = entry->msi_attrib.pos; > > - pci_intx(dev, 0); /* disable intx */ > + if (!(dev->dev_flags & PCI_DEV_FLAGS_MSI_INTX_DISABLE_BUG)) > + pci_intx(dev, 0); /* disable intx */ > msi_set_enable(dev, 0); > write_msi_msg(dev->irq, &entry->msg); > if (entry->msi_attrib.maskbit) > @@ -260,7 +261,8 @@ static void __pci_restore_msix_state(struct pci_dev *dev) > return; > > /* route the table */ > - pci_intx(dev, 0); /* disable intx */ > + if (!(dev->dev_flags & PCI_DEV_FLAGS_MSI_INTX_DISABLE_BUG)) > + pci_intx(dev, 0); /* disable intx */ > msix_set_enable(dev, 0); > > list_for_each_entry(entry, &dev->msi_list, list) { > @@ -343,7 +345,8 @@ static int msi_capability_init(struct pci_dev *dev) > } > > /* Set MSI enabled bits */ > - pci_intx(dev, 0); /* disable intx */ > + if (!(dev->dev_flags & PCI_DEV_FLAGS_MSI_INTX_DISABLE_BUG)) > + pci_intx(dev, 0); /* disable intx */ > msi_set_enable(dev, 1); > dev->msi_enabled = 1; > > @@ -433,7 +436,8 @@ static int msix_capability_init(struct pci_dev *dev, > i++; > } > /* Set MSI-X enabled bits */ > - pci_intx(dev, 0); /* disable intx */ > + if (!(dev->dev_flags & PCI_DEV_FLAGS_MSI_INTX_DISABLE_BUG)) > + pci_intx(dev, 0); /* disable intx */ > msix_set_enable(dev, 1); > dev->msix_enabled = 1; > > @@ -528,7 +532,8 @@ void pci_disable_msi(struct pci_dev* dev) > return; > > msi_set_enable(dev, 0); > - pci_intx(dev, 1); /* enable intx */ > + if (!(dev->dev_flags & PCI_DEV_FLAGS_MSI_INTX_DISABLE_BUG)) > + pci_intx(dev, 1); /* enable intx */ > dev->msi_enabled = 0; > > BUG_ON(list_empty(&dev->msi_list)); > @@ -640,7 +645,8 @@ void pci_disable_msix(struct pci_dev* dev) > return; > > msix_set_enable(dev, 0); > - pci_intx(dev, 1); /* enable intx */ > + if (!(dev->dev_flags & PCI_DEV_FLAGS_MSI_INTX_DISABLE_BUG)) > + pci_intx(dev, 1); /* enable intx */ > dev->msix_enabled = 0; > > msix_free_all_irqs(dev); That looks like 6 hunks doing exactly the same thing? What about creating a pci_intx_quirked() (or something) that checks the flag and then does/or does not call pci_intx(). cheers -- Michael Ellerman OzLabs, IBM Australia Development Lab wwweb: http://michael.ellerman.id.au phone: +61 2 6212 1183 (tie line 70 21183) We do not inherit the earth from our ancestors, we borrow it from our children. - S.M.A.R.T Person
Attachment:
signature.asc
Description: This is a digitally signed message part