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"

Reply via email to