Commit b91fd4d5 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'pci-v3.10-fixes-2' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci

Pull PCI updates from Bjorn Helgaas:
 "Here are some more fixes for v3.10.  The Moorestown update broke Intel
  Medfield devices, so I reverted it.  The acpiphp change fixes a
  regression: we broke hotplug notifications to host bridges when we
  split acpiphp into the host-bridge related part and the
  endpoint-related part.

  Moorestown
      Revert "x86/pci/mrst: Use configuration mechanism 1 for 00:00.0, 00:02.0, 00:03.0"
  Hotplug
      PCI: acpiphp: Re-enumerate devices when host bridge receives Bus Check"

* tag 'pci-v3.10-fixes-2' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci:
  Revert "x86/pci/mrst: Use configuration mechanism 1 for 00:00.0, 00:02.0, 00:03.0"
  PCI: acpiphp: Re-enumerate devices when host bridge receives Bus Check
parents 4c0eec03 f3f01175
...@@ -141,11 +141,6 @@ static int pci_device_update_fixed(struct pci_bus *bus, unsigned int devfn, ...@@ -141,11 +141,6 @@ static int pci_device_update_fixed(struct pci_bus *bus, unsigned int devfn,
*/ */
static bool type1_access_ok(unsigned int bus, unsigned int devfn, int reg) static bool type1_access_ok(unsigned int bus, unsigned int devfn, int reg)
{ {
if (bus == 0 && (devfn == PCI_DEVFN(2, 0)
|| devfn == PCI_DEVFN(0, 0)
|| devfn == PCI_DEVFN(3, 0)))
return 1;
/* This is a workaround for A0 LNC bug where PCI status register does /* This is a workaround for A0 LNC bug where PCI status register does
* not have new CAP bit set. can not be written by SW either. * not have new CAP bit set. can not be written by SW either.
* *
...@@ -155,7 +150,10 @@ static bool type1_access_ok(unsigned int bus, unsigned int devfn, int reg) ...@@ -155,7 +150,10 @@ static bool type1_access_ok(unsigned int bus, unsigned int devfn, int reg)
*/ */
if (reg >= 0x100 || reg == PCI_STATUS || reg == PCI_HEADER_TYPE) if (reg >= 0x100 || reg == PCI_STATUS || reg == PCI_HEADER_TYPE)
return 0; return 0;
if (bus == 0 && (devfn == PCI_DEVFN(2, 0)
|| devfn == PCI_DEVFN(0, 0)
|| devfn == PCI_DEVFN(3, 0)))
return 1;
return 0; /* langwell on others */ return 0; /* langwell on others */
} }
......
...@@ -641,7 +641,9 @@ static void _handle_hotplug_event_root(struct work_struct *work) ...@@ -641,7 +641,9 @@ static void _handle_hotplug_event_root(struct work_struct *work)
/* bus enumerate */ /* bus enumerate */
printk(KERN_DEBUG "%s: Bus check notify on %s\n", __func__, printk(KERN_DEBUG "%s: Bus check notify on %s\n", __func__,
(char *)buffer.pointer); (char *)buffer.pointer);
if (!root) if (root)
acpiphp_check_host_bridge(handle);
else
handle_root_bridge_insertion(handle); handle_root_bridge_insertion(handle);
break; break;
......
...@@ -950,6 +950,20 @@ check_sub_bridges(acpi_handle handle, u32 lvl, void *context, void **rv) ...@@ -950,6 +950,20 @@ check_sub_bridges(acpi_handle handle, u32 lvl, void *context, void **rv)
return AE_OK ; return AE_OK ;
} }
void acpiphp_check_host_bridge(acpi_handle handle)
{
struct acpiphp_bridge *bridge;
bridge = acpiphp_handle_to_bridge(handle);
if (bridge) {
acpiphp_check_bridge(bridge);
put_bridge(bridge);
}
acpi_walk_namespace(ACPI_TYPE_DEVICE, handle,
ACPI_UINT32_MAX, check_sub_bridges, NULL, NULL, NULL);
}
static void _handle_hotplug_event_bridge(struct work_struct *work) static void _handle_hotplug_event_bridge(struct work_struct *work)
{ {
struct acpiphp_bridge *bridge; struct acpiphp_bridge *bridge;
......
...@@ -60,11 +60,13 @@ static inline void acpi_pci_slot_remove(struct pci_bus *bus) { } ...@@ -60,11 +60,13 @@ static inline void acpi_pci_slot_remove(struct pci_bus *bus) { }
void acpiphp_init(void); void acpiphp_init(void);
void acpiphp_enumerate_slots(struct pci_bus *bus, acpi_handle handle); void acpiphp_enumerate_slots(struct pci_bus *bus, acpi_handle handle);
void acpiphp_remove_slots(struct pci_bus *bus); void acpiphp_remove_slots(struct pci_bus *bus);
void acpiphp_check_host_bridge(acpi_handle handle);
#else #else
static inline void acpiphp_init(void) { } static inline void acpiphp_init(void) { }
static inline void acpiphp_enumerate_slots(struct pci_bus *bus, static inline void acpiphp_enumerate_slots(struct pci_bus *bus,
acpi_handle handle) { } acpi_handle handle) { }
static inline void acpiphp_remove_slots(struct pci_bus *bus) { } static inline void acpiphp_remove_slots(struct pci_bus *bus) { }
static inline void acpiphp_check_host_bridge(acpi_handle handle) { }
#endif #endif
#else /* CONFIG_ACPI */ #else /* CONFIG_ACPI */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment