diff options
| author | John Baldwin <jhb@FreeBSD.org> | 2016-04-27 16:39:05 +0000 |
|---|---|---|
| committer | John Baldwin <jhb@FreeBSD.org> | 2016-04-27 16:39:05 +0000 |
| commit | 67e7d085aea75897f71505d4db2b22eb9e7bb0c6 (patch) | |
| tree | a142f6a2e1963024e2461948295502e9668253cd /sys/dev | |
| parent | c91991a2d8ecb06a7c77d7c673817bea7aae2ece (diff) | |
Notes
Diffstat (limited to 'sys/dev')
| -rw-r--r-- | sys/dev/acpica/acpi_pcib.c | 18 | ||||
| -rw-r--r-- | sys/dev/acpica/acpi_pcib_acpi.c | 8 | ||||
| -rw-r--r-- | sys/dev/acpica/acpi_pcib_pci.c | 4 | ||||
| -rw-r--r-- | sys/dev/acpica/acpi_pcibvar.h | 2 | ||||
| -rw-r--r-- | sys/dev/pci/pci_pci.c | 27 | ||||
| -rw-r--r-- | sys/dev/pci/pcib_private.h | 2 |
6 files changed, 32 insertions, 29 deletions
diff --git a/sys/dev/acpica/acpi_pcib.c b/sys/dev/acpica/acpi_pcib.c index c2c24992f89a..ffcb8cafd90d 100644 --- a/sys/dev/acpica/acpi_pcib.c +++ b/sys/dev/acpica/acpi_pcib.c @@ -126,11 +126,10 @@ prt_attach_devices(ACPI_PCI_ROUTING_TABLE *entry, void *arg) ACPI_ADR_PCI_SLOT(entry->Address), entry->Pin); } -int -acpi_pcib_attach(device_t dev, ACPI_BUFFER *prt, int busno) +void +acpi_pcib_fetch_prt(device_t dev, ACPI_BUFFER *prt) { ACPI_STATUS status; - int error; ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); @@ -148,20 +147,9 @@ acpi_pcib_attach(device_t dev, ACPI_BUFFER *prt, int busno) acpi_name(acpi_get_handle(dev)), AcpiFormatException(status)); /* - * Attach the PCI bus proper. - */ - if (device_add_child(dev, "pci", -1) == NULL) { - device_printf(device_get_parent(dev), "couldn't attach pci bus\n"); - return_VALUE(ENXIO); - } - - /* - * Now go scan the bus. + * Ensure all the link devices are attached. */ prt_walk_table(prt, prt_attach_devices, dev); - - error = bus_generic_attach(dev); - return_VALUE(error); } static void diff --git a/sys/dev/acpica/acpi_pcib_acpi.c b/sys/dev/acpica/acpi_pcib_acpi.c index f31bab7abc69..e9bcbd1f35cf 100644 --- a/sys/dev/acpica/acpi_pcib_acpi.c +++ b/sys/dev/acpica/acpi_pcib_acpi.c @@ -502,7 +502,13 @@ acpi_pcib_acpi_attach(device_t dev) if (sc->ap_segment == 0 && sc->ap_bus == 0) bus0_seen = 1; - return (acpi_pcib_attach(dev, &sc->ap_prt, sc->ap_bus)); + acpi_pcib_fetch_prt(dev, &sc->ap_prt); + + if (device_add_child(dev, "pci", -1) == NULL) { + device_printf(device_get_parent(dev), "couldn't attach pci bus\n"); + return (ENXIO); + } + return (bus_generic_attach(dev)); } /* diff --git a/sys/dev/acpica/acpi_pcib_pci.c b/sys/dev/acpica/acpi_pcib_pci.c index d3f4cbca3b2b..ca94d38c4778 100644 --- a/sys/dev/acpica/acpi_pcib_pci.c +++ b/sys/dev/acpica/acpi_pcib_pci.c @@ -120,7 +120,9 @@ acpi_pcib_pci_attach(device_t dev) pcib_attach_common(dev); sc = device_get_softc(dev); sc->ap_handle = acpi_get_handle(dev); - return (acpi_pcib_attach(dev, &sc->ap_prt, sc->ap_pcibsc.bus.sec)); + acpi_pcib_fetch_prt(dev, &sc->ap_prt); + + return (pcib_attach_child(dev)); } static int diff --git a/sys/dev/acpica/acpi_pcibvar.h b/sys/dev/acpica/acpi_pcibvar.h index 9a4be077f589..f563e77360e0 100644 --- a/sys/dev/acpica/acpi_pcibvar.h +++ b/sys/dev/acpica/acpi_pcibvar.h @@ -35,7 +35,7 @@ void acpi_pci_link_add_reference(device_t dev, int index, device_t pcib, int slot, int pin); int acpi_pci_link_route_interrupt(device_t dev, int index); -int acpi_pcib_attach(device_t bus, ACPI_BUFFER *prt, int busno); +void acpi_pcib_fetch_prt(device_t bus, ACPI_BUFFER *prt); int acpi_pcib_route_interrupt(device_t pcib, device_t dev, int pin, ACPI_BUFFER *prtbuf); int acpi_pcib_power_for_sleep(device_t pcib, device_t dev, diff --git a/sys/dev/pci/pci_pci.c b/sys/dev/pci/pci_pci.c index 112b198f0a66..76643bc8f92e 100644 --- a/sys/dev/pci/pci_pci.c +++ b/sys/dev/pci/pci_pci.c @@ -1075,21 +1075,26 @@ pcib_attach_common(device_t dev) } int +pcib_attach_child(device_t dev) +{ + struct pcib_softc *sc; + + sc = device_get_softc(dev); + if (sc->bus.sec == 0) { + /* no secondary bus; we should have fixed this */ + return(0); + } + + sc->child = device_add_child(dev, "pci", -1); + return (bus_generic_attach(dev)); +} + +int pcib_attach(device_t dev) { - struct pcib_softc *sc; - device_t child; pcib_attach_common(dev); - sc = device_get_softc(dev); - if (sc->bus.sec != 0) { - child = device_add_child(dev, "pci", -1); - if (child != NULL) - return(bus_generic_attach(dev)); - } - - /* no secondary bus; we should have fixed this */ - return(0); + return (pcib_attach_child(dev)); } int diff --git a/sys/dev/pci/pcib_private.h b/sys/dev/pci/pcib_private.h index 417c107925e3..93d9a719c3ae 100644 --- a/sys/dev/pci/pcib_private.h +++ b/sys/dev/pci/pcib_private.h @@ -101,6 +101,7 @@ struct pcib_secbus { struct pcib_softc { device_t dev; + device_t child; uint32_t flags; /* flags */ #define PCIB_SUBTRACTIVE 0x1 #define PCIB_DISABLE_MSI 0x2 @@ -144,6 +145,7 @@ void pcib_setup_secbus(device_t dev, struct pcib_secbus *bus, int min_count); #endif int pcib_attach(device_t dev); +int pcib_attach_child(device_t dev); void pcib_attach_common(device_t dev); void pcib_bridge_init(device_t dev); #ifdef NEW_PCIB |
