On Tue, May 19, 2015 at 10:08:38AM -0500, Bjorn Helgaas wrote: > [+cc Michael] > > On Thu, May 07, 2015 at 11:12:52AM +0800, Jiang Liu wrote: > > Once PCI MSI/MSI-X is enabled by the device driver, PCI device won't > > make use of legacy PCI IRQ until PCI MSI/MSI-X is disabled again. > > So optionally free legacy PCI IRQ when enabling MSI/MSI-X and reallocate > > when disabling MSI/MSI-X. > > > > Signed-off-by: Jiang Liu <jiang.liu@xxxxxxxxxxxxxxx> > > --- > > drivers/pci/msi.c | 6 +++++- > > 1 file changed, 5 insertions(+), 1 deletion(-) > > > > diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c > > index c3e7dfcf9ff5..47cf72c669f0 100644 > > --- a/drivers/pci/msi.c > > +++ b/drivers/pci/msi.c > > @@ -686,6 +686,7 @@ static int msi_capability_init(struct pci_dev *dev, int nvec) > > msi_set_enable(dev, 1); > > dev->msi_enabled = 1; > > > > + pcibios_free_irq(dev); > > >From the recent discussion about disabling MSI at shutdown, I seem to > recall that turning off bus mastering also effectively disables MSI and > causes at least some devices to revert to using INTx. > > So with this patch, do we now have a problem in the following scenario? Can't say, I didn't follow the discussion. But I'll address the comment below: > pci_enable_msi(dev); /* now frees INTx IRQ */ > pci_clear_master(dev); > <device interrupts> /* uses INTx since bus mastering disabled */ Not really, this does not use INTx. Disabling bus master shuts down MSI but does not enable INTx, you effectively get no interrupts at all: MSI disabled INTx and bus master disabled MSI. > > dev->irq = entry->irq; > > return 0; > > } > > @@ -813,9 +814,10 @@ static int msix_capability_init(struct pci_dev *dev, > > /* Set MSI-X enabled bits and unmask the function */ > > pci_intx_for_msi(dev, 0); > > dev->msix_enabled = 1; > > - > > msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_MASKALL, 0); > > > > + pcibios_free_irq(dev); > > + > > return 0; > > > > out_avail: > > @@ -930,6 +932,7 @@ void pci_msi_shutdown(struct pci_dev *dev) > > > > /* Restore dev->irq to its default pin-assertion irq */ > > dev->irq = desc->msi_attrib.default_irq; > > + pcibios_alloc_irq(dev); > > } > > > > void pci_disable_msi(struct pci_dev *dev) > > @@ -1030,6 +1033,7 @@ void pci_msix_shutdown(struct pci_dev *dev) > > msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_ENABLE, 0); > > pci_intx_for_msi(dev, 1); > > dev->msix_enabled = 0; > > + pcibios_alloc_irq(dev); > > } > > > > void pci_disable_msix(struct pci_dev *dev) > > -- > > 1.7.10.4 > > -- 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