On Mon, Sep 23, 2013 at 4:33 PM, <gregkh@xxxxxxxxxxxxxxxxxxx> wrote: > > The patch below does not apply to the 3.10-stable tree. > If someone wants it applied there, or to any other stable or longterm > tree, then please email the backport, including the original git commit > id to <stable@xxxxxxxxxxxxxxx>. This patch and Rafael's recent acpiphp changes fix hotplug issues that have been reported by many people: https://bugzilla.kernel.org/show_bug.cgi?id=16119 jmb38x recognized and works only if a card is plugged in during boot https://bugzilla.kernel.org/show_bug.cgi?id=54981 ExpressCard hotplug fails except with pcie_ports=native https://bugzilla.kernel.org/show_bug.cgi?id=60736 acpiphp and pciehp not working together on Thinkpad X200s I don't know exactly which of Rafael's changes would be required or how big they are, but I definitely support backporting this stuff if it's feasible. > ------------------ original commit in Linus's tree ------------------ > > From 3dc48af310709b85d07c8b0d3aa8f1ead02829d3 Mon Sep 17 00:00:00 2001 > From: Neil Horman <nhorman@xxxxxxxxxxxxx> > Date: Thu, 29 Aug 2013 16:17:05 -0400 > Subject: [PATCH] PCI/ACPI: Fix _OSC ordering to allow PCIe hotplug use when > available > > This fixes the problem of acpiphp claiming slots that should be managed > by pciehp, which may keep ExpressCard slots from working. > > The acpiphp driver claims PCIe slots unless the BIOS has granted us > control of PCIe native hotplug via _OSC. Prior to v3.10, the acpiphp > .add method (add_bridge()) was always called *after* we had requested > native hotplug control with _OSC. > > But after 3b63aaa70e ("PCI: acpiphp: Do not use ACPI PCI subdriver > mechanism"), which appeared in v3.10, acpiphp initialization is done > during the bus scan via the pcibios_add_bus() hook, and this happens > *before* we request native hotplug control. > > Therefore, acpiphp doesn't know yet whether the BIOS will grant control, > and it claims slots that we should be handling with native hotplug. > > This patch requests native hotplug control earlier, so we know whether > the BIOS granted it to us before we initialize acpiphp. > > To avoid reintroducing the ASPM issue fixed by b8178f130e ('Revert > "PCI/ACPI: Request _OSC control before scanning PCI root bus"'), we run > _OSC earlier but defer the actual ASPM calls until after the bus scan is > complete. > > Tested successfully by myself. > > [bhelgaas: changelog, mark for stable] > Reference: https://bugzilla.kernel.org/show_bug.cgi?id=60736 > Signed-off-by: Neil Horman <nhorman@xxxxxxxxxxxxx> > Signed-off-by: Bjorn Helgaas <bhelgaas@xxxxxxxxxx> > Acked-by: Yinghai Lu <yinghai@xxxxxxxxxx> > CC: stable@xxxxxxxxxxxxxxx # v3.10+ > CC: Len Brown <lenb@xxxxxxxxxx> > CC: "Rafael J. Wysocki" <rjw@xxxxxxx> > > diff --git a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c > index 59178393..a67853e3 100644 > --- a/drivers/acpi/pci_root.c > +++ b/drivers/acpi/pci_root.c > @@ -378,6 +378,7 @@ static int acpi_pci_root_add(struct acpi_device *device, > struct acpi_pci_root *root; > u32 flags, base_flags; > acpi_handle handle = device->handle; > + bool no_aspm = false, clear_aspm = false; > > root = kzalloc(sizeof(struct acpi_pci_root), GFP_KERNEL); > if (!root) > @@ -437,27 +438,6 @@ static int acpi_pci_root_add(struct acpi_device *device, > flags = base_flags = OSC_PCI_SEGMENT_GROUPS_SUPPORT; > acpi_pci_osc_support(root, flags); > > - /* > - * TBD: Need PCI interface for enumeration/configuration of roots. > - */ > - > - /* > - * Scan the Root Bridge > - * -------------------- > - * Must do this prior to any attempt to bind the root device, as the > - * PCI namespace does not get created until this call is made (and > - * thus the root bridge's pci_dev does not exist). > - */ > - root->bus = pci_acpi_scan_root(root); > - if (!root->bus) { > - dev_err(&device->dev, > - "Bus %04x:%02x not present in PCI namespace\n", > - root->segment, (unsigned int)root->secondary.start); > - result = -ENODEV; > - goto end; > - } > - > - /* Indicate support for various _OSC capabilities. */ > if (pci_ext_cfg_avail()) > flags |= OSC_EXT_PCI_CONFIG_SUPPORT; > if (pcie_aspm_support_enabled()) { > @@ -471,7 +451,7 @@ static int acpi_pci_root_add(struct acpi_device *device, > if (ACPI_FAILURE(status)) { > dev_info(&device->dev, "ACPI _OSC support " > "notification failed, disabling PCIe ASPM\n"); > - pcie_no_aspm(); > + no_aspm = true; > flags = base_flags; > } > } > @@ -503,7 +483,7 @@ static int acpi_pci_root_add(struct acpi_device *device, > * We have ASPM control, but the FADT indicates > * that it's unsupported. Clear it. > */ > - pcie_clear_aspm(root->bus); > + clear_aspm = true; > } > } else { > dev_info(&device->dev, > @@ -512,7 +492,14 @@ static int acpi_pci_root_add(struct acpi_device *device, > acpi_format_exception(status), flags); > dev_info(&device->dev, > "ACPI _OSC control for PCIe not granted, disabling ASPM\n"); > - pcie_no_aspm(); > + /* > + * We want to disable ASPM here, but aspm_disabled > + * needs to remain in its state from boot so that we > + * properly handle PCIe 1.1 devices. So we set this > + * flag here, to defer the action until after the ACPI > + * root scan. > + */ > + no_aspm = true; > } > } else { > dev_info(&device->dev, > @@ -520,6 +507,33 @@ static int acpi_pci_root_add(struct acpi_device *device, > "(_OSC support mask: 0x%02x)\n", flags); > } > > + /* > + * TBD: Need PCI interface for enumeration/configuration of roots. > + */ > + > + /* > + * Scan the Root Bridge > + * -------------------- > + * Must do this prior to any attempt to bind the root device, as the > + * PCI namespace does not get created until this call is made (and > + * thus the root bridge's pci_dev does not exist). > + */ > + root->bus = pci_acpi_scan_root(root); > + if (!root->bus) { > + dev_err(&device->dev, > + "Bus %04x:%02x not present in PCI namespace\n", > + root->segment, (unsigned int)root->secondary.start); > + result = -ENODEV; > + goto end; > + } > + > + if (clear_aspm) { > + dev_info(&device->dev, "Disabling ASPM (FADT indicates it is unsupported)\n"); > + pcie_clear_aspm(root->bus); > + } > + if (no_aspm) > + pcie_no_aspm(); > + > pci_acpi_add_bus_pm_notifier(device, root->bus); > if (device->wakeup.flags.run_wake) > device_set_run_wake(root->bus->bridge, true); > -- To unsubscribe from this list: send the line "unsubscribe stable" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html