On Tuesday 02 November 2010 11:29 am, Andriy Gapon wrote: > on 29/10/2010 08:51 Andriy Gapon said the following: > > I guess that a general problem here is that it is incorrect to > > merely use memcpy/bcopy to create a copy of a resource if the > > resource has ACPI_RESOURCE_SOURCE field in it. > > Hans, > > could you please test the following patch? > > diff --git a/sys/dev/acpica/acpi_pci_link.c > b/sys/dev/acpica/acpi_pci_link.c index dcf101d..e842635 100644 > --- a/sys/dev/acpica/acpi_pci_link.c > +++ b/sys/dev/acpica/acpi_pci_link.c > @@ -767,6 +767,8 @@ acpi_pci_link_srs_from_crs > link->l_irq; > else > resptr->Data.ExtendedIrq.Interrupts[0] = 0; > + memset(&resptr->Data.ExtendedIrq.ResourceSource, 0, > + sizeof(ACPI_RESOURCE_SOURCE)); > link++; > i++; > break;
Hmm... Very interesting. Can you please try this, too? Thanks, Jung-uk Kim
--- sys/dev/acpica/acpi_pci_link.c 2010-03-05 15:07:53.000000000 -0500 +++ sys/dev/acpica/acpi_pci_link.c 2010-11-02 14:57:50.000000000 -0400 @@ -268,6 +268,7 @@ static ACPI_STATUS link_add_prs(ACPI_RESOURCE *res, void *context) { + ACPI_RESOURCE_EXTENDED_IRQ *ext; struct link_res_request *req; struct link *link; UINT8 *irqs = NULL; @@ -323,6 +324,13 @@ */ bcopy(res, &link->l_prs_template, sizeof(ACPI_RESOURCE)); if (is_ext_irq) { + ext = &link->l_prs_template.Data.ExtendedIrq; + ext->ResourceSource.StringPtr = malloc( + ext->ResourceSource.StringLength + 1, + M_PCI_LINK, M_WAITOK); + strncpy(ext->ResourceSource.StringPtr, + res->Data.ExtendedIrq.ResourceSource.StringPtr, + ext->ResourceSource.StringLength + 1); link->l_num_irqs = res->Data.ExtendedIrq.InterruptCount; ext_irqs = res->Data.ExtendedIrq.Interrupts; @@ -422,9 +430,10 @@ static int acpi_pci_link_attach(device_t dev) { - struct acpi_pci_link_softc *sc; struct link_count_request creq; struct link_res_request rreq; + ACPI_RESOURCE_EXTENDED_IRQ *ext; + struct acpi_pci_link_softc *sc; ACPI_STATUS status; int i; @@ -540,9 +549,15 @@ return (0); fail: ACPI_SERIAL_END(pci_link); - for (i = 0; i < sc->pl_num_links; i++) + for (i = 0; i < sc->pl_num_links; i++) { + if (sc->pl_links[i].l_prs_template.Type == + ACPI_RESOURCE_TYPE_EXTENDED_IRQ) { + ext = &sc->pl_links[i].l_prs_template.Data.ExtendedIrq; + free(ext->ResourceSource.StringPtr, M_PCI_LINK); + } if (sc->pl_links[i].l_irqs != NULL) free(sc->pl_links[i].l_irqs, M_PCI_LINK); + } free(sc->pl_links, M_PCI_LINK); return (ENXIO); }
_______________________________________________ freebsd-acpi@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-acpi To unsubscribe, send any mail to "freebsd-acpi-unsubscr...@freebsd.org"