summaryrefslogtreecommitdiffstats
path: root/sys/dev/acpica/Osd
diff options
context:
space:
mode:
authormsmith <msmith@FreeBSD.org>2001-06-29 21:21:08 +0000
committermsmith <msmith@FreeBSD.org>2001-06-29 21:21:08 +0000
commit7bf89cea2b689b7bf176393349b2f688faa0f285 (patch)
treeeb76f40dd3fdd83c6c7320948c71626c88b4b6fe /sys/dev/acpica/Osd
parent92a1c67dda98625aca215a53cb7b24237a93ecfa (diff)
downloadFreeBSD-src-7bf89cea2b689b7bf176393349b2f688faa0f285.zip
FreeBSD-src-7bf89cea2b689b7bf176393349b2f688faa0f285.tar.gz
Wrap the interrupt handler so that we can get the ACPI lock.
Diffstat (limited to 'sys/dev/acpica/Osd')
-rw-r--r--sys/dev/acpica/Osd/OsdInterrupt.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/sys/dev/acpica/Osd/OsdInterrupt.c b/sys/dev/acpica/Osd/OsdInterrupt.c
index fd94ad1..e6443ca 100644
--- a/sys/dev/acpica/Osd/OsdInterrupt.c
+++ b/sys/dev/acpica/Osd/OsdInterrupt.c
@@ -43,6 +43,9 @@
#define _COMPONENT ACPI_OS_SERVICES
MODULE_NAME("INTERRUPT")
+static void InterruptWrapper(void *arg);
+static OSD_HANDLER InterruptHandler;
+
/*
* XXX this does not correctly free resources in the case of partically successful
* attachment.
@@ -58,6 +61,11 @@ AcpiOsInstallInterruptHandler(UINT32 InterruptNumber, OSD_HANDLER ServiceRoutine
return_ACPI_STATUS(AE_BAD_PARAMETER);
if (ServiceRoutine == NULL)
return_ACPI_STATUS(AE_BAD_PARAMETER);
+ if (InterruptHandler != NULL) {
+ device_printf(sc->acpi_dev, "can't register more than one ACPI interrupt\n");
+ return_ACPI_STATUS(AE_BAD_PARAMETER);
+ }
+ InterruptHandler = ServiceRoutine;
if ((sc = devclass_get_softc(acpi_devclass, 0)) == NULL)
panic("can't find ACPI device to register interrupt");
@@ -79,8 +87,8 @@ AcpiOsInstallInterruptHandler(UINT32 InterruptNumber, OSD_HANDLER ServiceRoutine
device_printf(sc->acpi_dev, "could not allocate SCI interrupt\n");
return_ACPI_STATUS(AE_EXIST);
}
- if (bus_setup_intr(sc->acpi_dev, sc->acpi_irq, INTR_TYPE_MISC, (driver_intr_t *)ServiceRoutine, Context,
- &sc->acpi_irq_handle)) {
+ if (bus_setup_intr(sc->acpi_dev, sc->acpi_irq, INTR_TYPE_MISC, (driver_intr_t *)InterruptWrapper,
+ Context, &sc->acpi_irq_handle)) {
device_printf(sc->acpi_dev, "could not set up SCI interrupt\n");
return_ACPI_STATUS(AE_EXIST);
}
@@ -115,3 +123,13 @@ AcpiOsRemoveInterruptHandler (UINT32 InterruptNumber, OSD_HANDLER ServiceRoutine
return_ACPI_STATUS(AE_OK);
}
+/*
+ * Interrupt handler wrapper.
+ */
+static void
+InterruptWrapper(void *arg)
+{
+ ACPI_LOCK;
+ InterruptHandler(arg);
+ ACPI_UNLOCK;
+}
OpenPOWER on IntegriCloud