[3.8.y.z extended stable] Patch "PCI: Enable INTx in pci_reenable_device() only when MSI/MSI-X not" has been added to staging queue

Kamal Mostafa kamal at canonical.com
Tue Mar 25 18:54:11 UTC 2014


This is a note to let you know that I have just added a patch titled

    PCI: Enable INTx in pci_reenable_device() only when MSI/MSI-X not

to the linux-3.8.y-queue branch of the 3.8.y.z extended stable tree 
which can be found at:

 http://kernel.ubuntu.com/git?p=ubuntu/linux.git;a=shortlog;h=refs/heads/linux-3.8.y-queue

This patch is scheduled to be released in version 3.8.13.20.

If you, or anyone else, feels it should not be added to this tree, please 
reply to this email.

For more information about the 3.8.y.z tree, see
https://wiki.ubuntu.com/Kernel/Dev/ExtendedStable

Thanks.
-Kamal

------

>From 80233a8beaf9a36a6dccafe720adb5a3c439a4ca Mon Sep 17 00:00:00 2001
From: Bjorn Helgaas <bhelgaas at google.com>
Date: Tue, 11 Mar 2014 14:22:19 -0600
Subject: PCI: Enable INTx in pci_reenable_device() only when MSI/MSI-X not
 enabled

commit 3cdeb713dc66057b50682048c151eae07b186c42 upstream.

Andreas reported that after 1f42db786b14 ("PCI: Enable INTx if BIOS left
them disabled"), pciehp surprise removal stopped working.

This happens because pci_reenable_device() on the hotplug bridge (used in
the pciehp_configure_device() path) clears the Interrupt Disable bit, which
apparently breaks the bridge's MSI hotplug event reporting.

Previously we cleared the Interrupt Disable bit in do_pci_enable_device(),
which is used by both pci_enable_device() and pci_reenable_device().  But
we use pci_reenable_device() after the driver may have enabled MSI or
MSI-X, and we *set* Interrupt Disable as part of enabling MSI/MSI-X.

This patch clears Interrupt Disable only when MSI/MSI-X has not been
enabled.

Fixes: 1f42db786b14 PCI: Enable INTx if BIOS left them disabled
Link: https://bugzilla.kernel.org/show_bug.cgi?id=71691
Reported-and-tested-by: Andreas Noever <andreas.noever at gmail.com>
Signed-off-by: Bjorn Helgaas <bhelgaas at google.com>
CC: Sarah Sharp <sarah.a.sharp at linux.intel.com>
Signed-off-by: Kamal Mostafa <kamal at canonical.com>
---
 drivers/pci/pci.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index 4235728..ea3ee87 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -1137,6 +1137,9 @@ static int do_pci_enable_device(struct pci_dev *dev, int bars)
 		return err;
 	pci_fixup_device(pci_fixup_enable, dev);

+	if (dev->msi_enabled || dev->msix_enabled)
+		return 0;
+
 	pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin);
 	if (pin) {
 		pci_read_config_word(dev, PCI_COMMAND, &cmd);
--
1.8.3.2





More information about the kernel-team mailing list