From e993beffc73d42c901f7b51eab6ae6658673afe5 Mon Sep 17 00:00:00 2001 From: jhb Date: Wed, 17 Jul 2013 14:04:18 +0000 Subject: [PATCH] MFC 252576: Don't perform the acpi_DeviceIsPresent() check for PCI-PCI bridges. If we are probing a PCI-PCI bridge it is because we found one by enumerating the devices on a PCI bus, so the bridge is definitely present. A few BIOSes report incorrect status (_STA) for some bridges that claimed they were not present when in fact they were. While here, move this check earlier for Host-PCI bridges so attach fails before doing any work that needs to be torn down. PR: kern/91594 Approved by: re (marius) git-svn-id: svn://svn.freebsd.org/base/stable/9@253426 ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f --- sys/dev/acpica/acpi_pcib.c | 9 --------- sys/dev/acpica/acpi_pcib_acpi.c | 8 +++++++- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/sys/dev/acpica/acpi_pcib.c b/sys/dev/acpica/acpi_pcib.c index 1b26b4f6a..0ba9b7ade 100644 --- a/sys/dev/acpica/acpi_pcib.c +++ b/sys/dev/acpica/acpi_pcib.c @@ -133,15 +133,6 @@ acpi_pcib_attach(device_t dev, ACPI_BUFFER *prt, int busno) ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); - /* - * Don't attach if we're not really there. - * - * XXX: This isn't entirely correct since we may be a PCI bus - * on a hot-plug docking station, etc. - */ - if (!acpi_DeviceIsPresent(dev)) - return_VALUE(ENXIO); - /* * Get the PCI interrupt routing table for this bus. If we can't * get it, this is not an error but may reduce functionality. There diff --git a/sys/dev/acpica/acpi_pcib_acpi.c b/sys/dev/acpica/acpi_pcib_acpi.c index 8e2cfea7c..7636593d6 100644 --- a/sys/dev/acpica/acpi_pcib_acpi.c +++ b/sys/dev/acpica/acpi_pcib_acpi.c @@ -286,6 +286,12 @@ acpi_pcib_acpi_attach(device_t dev) sc->ap_dev = dev; sc->ap_handle = acpi_get_handle(dev); + /* + * Don't attach if we're not really there. + */ + if (!acpi_DeviceIsPresent(dev)) + return (ENXIO); + /* * Get our segment number by evaluating _SEG. * It's OK for this to not exist. @@ -353,7 +359,7 @@ acpi_pcib_acpi_attach(device_t dev) if (status != AE_NOT_FOUND) { device_printf(dev, "could not evaluate _BBN - %s\n", AcpiFormatException(status)); - return_VALUE (ENXIO); + return (ENXIO); } else { /* If it's not found, assume 0. */ sc->ap_bus = 0; -- 2.45.0