I tried to apply the patch below to the 3.8-stable tree, but it has conflicts and doesn't apply. So I tried a straight-revert of 8c33f51df406e1a1f7fa4e9b244845b7ebd61fa6, which did work fine, but I noticed that it really doesn't look anything like the patch below. Is this patch a "logical" revert, and not a "literal" one? Anyway, can someone send me a properly backported version so it can be applied to the 3.8-stable tree? thanks, greg k-h On Fri, Apr 05, 2013 at 11:00:22PM -0400, Gregs git-bot wrote: > commit: b8178f130e25c1bdac1c33e0996f1ff6e20ec08e > From: Bjorn Helgaas <bhelgaas@xxxxxxxxxx> > Date: Mon, 1 Apr 2013 15:47:39 -0600 > Subject: Revert "PCI/ACPI: Request _OSC control before scanning PCI root bus" > > This reverts commit 8c33f51df406e1a1f7fa4e9b244845b7ebd61fa6. > > Conflicts: > drivers/acpi/pci_root.c > > This commit broke some pre-1.1 PCIe devices by leaving them with > ASPM enabled. Previously, we had disabled ASPM on these devices > because many of them don't implement it correctly (per 149e1637). > > Requesting _OSC control early means that aspm_disabled may be set > before we scan the PCI bus and configure link ASPM state. But the > ASPM configuration currently skips the check for pre-PCIe 1.1 devices > when aspm_disabled is set, like this: > > acpi_pci_root_add > acpi_pci_osc_support > if (flags != base_flags) > pcie_no_aspm > aspm_disabled = 1 > pci_acpi_scan_root > ... > pcie_aspm_init_link_state > pcie_aspm_sanity_check > if (!aspm_disabled) > /* check for pre-PCIe 1.1 device */ > > Therefore, setting aspm_disabled early means that we leave ASPM enabled > on these pre-PCIe 1.1 devices, which is a regression for some devices. > > The best fix would be to clean up the ASPM init so we can evaluate > _OSC before scanning the bug (that way boot-time and hot-add discovery > will work the same), but that requires significant rework. > > For now, we'll just revert the _OSC change as the lowest-risk fix. > > Reference: https://bugzilla.kernel.org/show_bug.cgi?id=55211 > Signed-off-by: Bjorn Helgaas <bhelgaas@xxxxxxxxxx> > Acked-by: Rafael J. Wysocki <rafael.j.wysocki@xxxxxxxxx> > Acked-by: Yinghai Lu <yinghai@xxxxxxxxxx> > CC: stable@xxxxxxxxxxxxxxx # v3.8+ > --- > drivers/acpi/pci_root.c | 76 +++++++++++++++++++++++------------------------ > 1 file changed, 37 insertions(+), 39 deletions(-) > > diff --git a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c > index 0ac546d..c740364 100644 > --- a/drivers/acpi/pci_root.c > +++ b/drivers/acpi/pci_root.c > @@ -415,7 +415,6 @@ static int acpi_pci_root_add(struct acpi_device *device, > struct acpi_pci_root *root; > struct acpi_pci_driver *driver; > u32 flags, base_flags; > - bool is_osc_granted = false; > > root = kzalloc(sizeof(struct acpi_pci_root), GFP_KERNEL); > if (!root) > @@ -476,6 +475,30 @@ 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. > + */ > + > + mutex_lock(&acpi_pci_root_lock); > + list_add_tail(&root->node, &acpi_pci_roots); > + mutex_unlock(&acpi_pci_root_lock); > + > + /* > + * 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) { > + printk(KERN_ERR PREFIX > + "Bus %04x:%02x not present in PCI namespace\n", > + root->segment, (unsigned int)root->secondary.start); > + result = -ENODEV; > + goto out_del_root; > + } > + > /* Indicate support for various _OSC capabilities. */ > if (pci_ext_cfg_avail()) > flags |= OSC_EXT_PCI_CONFIG_SUPPORT; > @@ -494,6 +517,7 @@ static int acpi_pci_root_add(struct acpi_device *device, > flags = base_flags; > } > } > + > if (!pcie_ports_disabled > && (flags & ACPI_PCIE_REQ_SUPPORT) == ACPI_PCIE_REQ_SUPPORT) { > flags = OSC_PCI_EXPRESS_CAP_STRUCTURE_CONTROL > @@ -514,54 +538,28 @@ static int acpi_pci_root_add(struct acpi_device *device, > status = acpi_pci_osc_control_set(device->handle, &flags, > OSC_PCI_EXPRESS_CAP_STRUCTURE_CONTROL); > if (ACPI_SUCCESS(status)) { > - is_osc_granted = true; > dev_info(&device->dev, > "ACPI _OSC control (0x%02x) granted\n", flags); > + if (acpi_gbl_FADT.boot_flags & ACPI_FADT_NO_ASPM) { > + /* > + * We have ASPM control, but the FADT indicates > + * that it's unsupported. Clear it. > + */ > + pcie_clear_aspm(root->bus); > + } > } else { > - is_osc_granted = false; > dev_info(&device->dev, > "ACPI _OSC request failed (%s), " > "returned control mask: 0x%02x\n", > acpi_format_exception(status), flags); > + pr_info("ACPI _OSC control for PCIe not granted, " > + "disabling ASPM\n"); > + pcie_no_aspm(); > } > } else { > dev_info(&device->dev, > - "Unable to request _OSC control " > - "(_OSC support mask: 0x%02x)\n", flags); > - } > - > - /* > - * TBD: Need PCI interface for enumeration/configuration of roots. > - */ > - > - mutex_lock(&acpi_pci_root_lock); > - list_add_tail(&root->node, &acpi_pci_roots); > - mutex_unlock(&acpi_pci_root_lock); > - > - /* > - * 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) { > - printk(KERN_ERR PREFIX > - "Bus %04x:%02x not present in PCI namespace\n", > - root->segment, (unsigned int)root->secondary.start); > - result = -ENODEV; > - goto out_del_root; > - } > - > - /* ASPM setting */ > - if (is_osc_granted) { > - if (acpi_gbl_FADT.boot_flags & ACPI_FADT_NO_ASPM) > - pcie_clear_aspm(root->bus); > - } else { > - pr_info("ACPI _OSC control for PCIe not granted, " > - "disabling ASPM\n"); > - pcie_no_aspm(); > + "Unable to request _OSC control " > + "(_OSC support mask: 0x%02x)\n", flags); > } > > pci_acpi_add_bus_pm_notifier(device, root->bus); > -- > 1.7.10.4 -- 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