MacBookPro 5,1

Jung-uk Kim jkim at FreeBSD.org
Tue Nov 2 19:29:13 UTC 2010


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
-------------- next part --------------
--- 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);
 }


More information about the freebsd-acpi mailing list