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