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>
index | next in thread | previous in thread | raw e-mail
[-- Attachment #1 --]
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
[-- Attachment #2 --]
--- 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);
}
home |
help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201011021529.05977.jkim>
