Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 2 Nov 2010 15:29:01 -0400
From:      Jung-uk Kim <jkim@FreeBSD.org>
To:        Andriy Gapon <avg@freebsd.org>
Cc:        freebsd-acpi@freebsd.org, "Moore, Robert" <robert.moore@intel.com>, Lin Ming <ming.m.lin@intel.com>
Subject:   Re: MacBookPro 5,1
Message-ID:  <201011021529.05977.jkim@FreeBSD.org>
In-Reply-To: <4CD02E6D.1070106@freebsd.org>
References:  <201010121209.06397.hselasky@c2i.net> <4CCA60C9.7040600@icyb.net.ua> <4CD02E6D.1070106@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help

--Boundary-00=_BaG0MdvZBXSNuzs
Content-Type: text/plain;
  charset="iso-8859-1"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

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

--Boundary-00=_BaG0MdvZBXSNuzs
Content-Type: text/plain;
  charset="iso-8859-1";
  name="acpi_pci_link.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
	filename="acpi_pci_link.diff"

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

--Boundary-00=_BaG0MdvZBXSNuzs--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201011021529.05977.jkim>