Index: acpi_pci_link.c =================================================================== RCS file: /private/FreeBSD/src/sys/dev/acpica/acpi_pci_link.c,v retrieving revision 1.43 diff -u -p -r1.43 acpi_pci_link.c --- acpi_pci_link.c 27 Dec 2004 05:42:32 -0000 1.43 +++ acpi_pci_link.c 11 Jan 2005 20:19:38 -0000 @@ -406,10 +406,14 @@ acpi_pci_link_attach(device_t dev) creq.count = 0; status = AcpiWalkResources(acpi_get_handle(dev), "_CRS", acpi_count_irq_resources, &creq); - if (ACPI_FAILURE(status)) + if (ACPI_FAILURE(status)) { + ACPI_SERIAL_END(pci_link); return (ENXIO); - if (creq.count == 0) + } + if (creq.count == 0) { + ACPI_SERIAL_END(pci_link); return (0); + } sc->pl_num_links = creq.count; sc->pl_links = malloc(sizeof(struct link) * sc->pl_num_links, M_PCI_LINK, M_WAITOK | M_ZERO); @@ -538,6 +542,8 @@ acpi_pci_link_lookup(device_t dev, int s ACPI_SERIAL_ASSERT(pci_link); sc = device_get_softc(dev); + if (sc == NULL) + return (NULL); for (i = 0; i < sc->pl_num_links; i++) if (sc->pl_links[i].l_res_index == source_index) return (&sc->pl_links[i]); @@ -554,8 +560,10 @@ acpi_pci_link_add_reference(device_t dev /* Bump the reference count. */ ACPI_SERIAL_BEGIN(pci_link); link = acpi_pci_link_lookup(dev, index); - if (link == NULL) - panic("%s: apparently invalid index %d", __func__, index); + if (link == NULL) { + ACPI_SERIAL_END(pci_link); + return; + } link->l_references++; if (link->l_routed) pci_link_interrupt_weights[link->l_irq]++; @@ -852,8 +860,11 @@ acpi_pci_link_route_interrupt(device_t d ACPI_SERIAL_BEGIN(pci_link); link = acpi_pci_link_lookup(dev, index); - if (link == NULL) - panic("%s: apparently invalid index %d", __func__, index); + if (link == NULL) { + ACPI_SERIAL_END(pci_link); + return (PCI_INVALID_IRQ); + } + /* * If this link device is already routed to an interrupt, just return