summaryrefslogtreecommitdiffstats
path: root/sys/dev/acpica/Osd
diff options
context:
space:
mode:
authorjkim <jkim@FreeBSD.org>2011-01-11 19:20:01 +0000
committerjkim <jkim@FreeBSD.org>2011-01-11 19:20:01 +0000
commitd062de36dcecfa41d7a62b3d0271225405fbe72c (patch)
tree2985a871a85edf7fb10fe6707b1867283af27a13 /sys/dev/acpica/Osd
parent5873a063bb516f27d9253b4dfd873e2d984bde94 (diff)
downloadFreeBSD-src-d062de36dcecfa41d7a62b3d0271225405fbe72c.zip
FreeBSD-src-d062de36dcecfa41d7a62b3d0271225405fbe72c.tar.gz
Fix a witness(4) warning introduced in r217238.
Diffstat (limited to 'sys/dev/acpica/Osd')
-rw-r--r--sys/dev/acpica/Osd/OsdInterrupt.c31
1 files changed, 18 insertions, 13 deletions
diff --git a/sys/dev/acpica/Osd/OsdInterrupt.c b/sys/dev/acpica/Osd/OsdInterrupt.c
index 095ef2a..0ca2b55 100644
--- a/sys/dev/acpica/Osd/OsdInterrupt.c
+++ b/sys/dev/acpica/Osd/OsdInterrupt.c
@@ -91,6 +91,18 @@ acpi_intr_handler(void *arg)
return (FILTER_STRAY);
}
+static void
+acpi_intr_destroy(device_t dev, struct acpi_intr *ai)
+{
+
+ if (ai->ai_handle != NULL)
+ bus_teardown_intr(dev, ai->ai_irq, ai->ai_handle);
+ if (ai->ai_irq != NULL)
+ bus_release_resource(dev, SYS_RES_IRQ, ai->ai_rid, ai->ai_irq);
+ bus_delete_resource(dev, SYS_RES_IRQ, ai->ai_rid);
+ free(ai, M_ACPIINTR);
+}
+
ACPI_STATUS
AcpiOsInstallInterruptHandler(UINT32 InterruptNumber,
ACPI_OSD_HANDLER ServiceRoutine, void *Context)
@@ -123,6 +135,8 @@ AcpiOsInstallInterruptHandler(UINT32 InterruptNumber,
ai->ai_number = InterruptNumber;
ai->ai_handler = ServiceRoutine;
ai->ai_context = Context;
+ SLIST_INSERT_HEAD(&acpi_intr_list, ai, ai_link);
+ mtx_unlock(&acpi_intr_lock);
/*
* If the MADT contained an interrupt override directive for the SCI,
@@ -151,19 +165,13 @@ AcpiOsInstallInterruptHandler(UINT32 InterruptNumber,
device_printf(sc->acpi_dev, "could not set up interrupt\n");
goto error;
}
- SLIST_INSERT_HEAD(&acpi_intr_list, ai, ai_link);
- mtx_unlock(&acpi_intr_lock);
return_ACPI_STATUS (AE_OK);
error:
+ mtx_lock(&acpi_intr_lock);
+ SLIST_REMOVE(&acpi_intr_list, ai, acpi_intr, ai_link);
mtx_unlock(&acpi_intr_lock);
- if (ai->ai_handle != NULL)
- bus_teardown_intr(sc->acpi_dev, ai->ai_irq, ai->ai_handle);
- if (ai->ai_irq != NULL)
- bus_release_resource(sc->acpi_dev, SYS_RES_IRQ, ai->ai_rid,
- ai->ai_irq);
- bus_delete_resource(sc->acpi_dev, SYS_RES_IRQ, ai->ai_rid);
- free(ai, M_ACPIINTR);
+ acpi_intr_destroy(sc->acpi_dev, ai);
return_ACPI_STATUS (AE_ALREADY_EXISTS);
}
@@ -195,10 +203,7 @@ AcpiOsRemoveInterruptHandler(UINT32 InterruptNumber,
mtx_unlock(&acpi_intr_lock);
if (ai == NULL)
return_ACPI_STATUS (AE_NOT_EXIST);
- bus_teardown_intr(sc->acpi_dev, ai->ai_irq, ai->ai_handle);
- bus_release_resource(sc->acpi_dev, SYS_RES_IRQ, ai->ai_rid, ai->ai_irq);
- bus_delete_resource(sc->acpi_dev, SYS_RES_IRQ, ai->ai_rid);
- free(ai, M_ACPIINTR);
+ acpi_intr_destroy(sc->acpi_dev, ai);
return_ACPI_STATUS (AE_OK);
}
OpenPOWER on IntegriCloud