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>