diff --git a/sys/dev/acpica/Osd/OsdSynch.c b/sys/dev/acpica/Osd/OsdSynch.c index d27346784818..9c80485c7aeb 100644 --- a/sys/dev/acpica/Osd/OsdSynch.c +++ b/sys/dev/acpica/Osd/OsdSynch.c @@ -35,22 +35,37 @@ #include "opt_acpi.h" #include -#include #include -#include #include +#if __FreeBSD_version >= 500000 +#include +#include +#endif #define _COMPONENT ACPI_OS_SERVICES ACPI_MODULE_NAME("SYNCH") static MALLOC_DEFINE(M_ACPISEM, "acpisem", "ACPI semaphore"); +#if __FreeBSD_version < 500000 +# define AS_LOCK(as) s = splhigh() +# define AS_UNLOCK(as) splx(s) +# define AS_LOCK_DECL int s +# define msleep(a, b, c, d, e) tsleep(a, c, d, e) +#else +# define AS_LOCK(as) mtx_lock(&(as)->as_mtx) +# define AS_UNLOCK(as) mtx_unlock(&(as)->as_mtx) +# define AS_LOCK_DECL +#endif + /* * Simple counting semaphore implemented using a mutex. (Subsequently used * in the OSI code to implement a mutex. Go figure.) */ struct acpi_semaphore { +#if __FreeBSD_version >= 500000 struct mtx as_mtx; +#endif UINT32 as_units; UINT32 as_maxunits; UINT32 as_pendings; @@ -85,7 +100,9 @@ AcpiOsCreateSemaphore(UINT32 MaxUnits, UINT32 InitialUnits, ACPI_HANDLE *OutHand return_ACPI_STATUS(AE_NO_MEMORY); bzero(as, sizeof(*as)); +#if __FreeBSD_version >= 500000 mtx_init(&as->as_mtx, "ACPI semaphore", NULL, MTX_DEF); +#endif as->as_units = InitialUnits; as->as_maxunits = MaxUnits; as->as_pendings = as->as_resetting = as->as_timeouts = 0; @@ -111,7 +128,9 @@ AcpiOsDeleteSemaphore (ACPI_HANDLE Handle) ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, "destroyed semaphore %p\n", as)); +#if __FreeBSD_version >= 500000 mtx_destroy(&as->as_mtx); +#endif free(Handle, M_ACPISEM); return_ACPI_STATUS(AE_OK); #else @@ -132,6 +151,7 @@ AcpiOsWaitSemaphore(ACPI_HANDLE Handle, UINT32 Units, UINT32 Timeout) ACPI_STATUS result; int rv, tmo; struct timeval timeouttv, currenttv, timelefttv; + AS_LOCK_DECL; ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); @@ -144,13 +164,13 @@ AcpiOsWaitSemaphore(ACPI_HANDLE Handle, UINT32 Units, UINT32 Timeout) #if 0 if (as->as_units < Units && as->as_timeouts > 10) { printf("%s: semaphore %p too many timeouts, resetting\n", __func__, as); - mtx_lock(&as->as_mtx); + AS_LOCK(as); as->as_units = as->as_maxunits; if (as->as_pendings) as->as_resetting = 1; as->as_timeouts = 0; wakeup(as); - mtx_unlock(&as->as_mtx); + AS_UNLOCK(as); return_ACPI_STATUS(AE_TIME); } @@ -177,7 +197,7 @@ AcpiOsWaitSemaphore(ACPI_HANDLE Handle, UINT32 Units, UINT32 Timeout) getmicrotime(¤ttv); timevaladd(&timeouttv, ¤ttv); - mtx_lock(&as->as_mtx); + AS_LOCK(as); ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, "get %d units from semaphore %p (has %d), timeout %d\n", Units, as, as->as_units, Timeout)); @@ -204,9 +224,11 @@ AcpiOsWaitSemaphore(ACPI_HANDLE Handle, UINT32 Units, UINT32 Timeout) break; } +#if __FreeBSD_version >= 500000 ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, "semaphore blocked, calling msleep(%p, %p, %d, \"acsem\", %d)\n", as, &as->as_mtx, PCATCH, tmo)); +#endif as->as_pendings++; @@ -274,7 +296,7 @@ AcpiOsWaitSemaphore(ACPI_HANDLE Handle, UINT32 Units, UINT32 Timeout) as->as_timeouts = 0; } - mtx_unlock(&as->as_mtx); + AS_UNLOCK(as); return_ACPI_STATUS(result); #else @@ -287,13 +309,14 @@ AcpiOsSignalSemaphore(ACPI_HANDLE Handle, UINT32 Units) { #ifndef ACPI_NO_SEMAPHORES struct acpi_semaphore *as = (struct acpi_semaphore *)Handle; + AS_LOCK_DECL; ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__); if (as == NULL) return_ACPI_STATUS(AE_BAD_PARAMETER); - mtx_lock(&as->as_mtx); + AS_LOCK(as); ACPI_DEBUG_PRINT((ACPI_DB_MUTEX, "return %d units to semaphore %p (has %d)\n", Units, as, as->as_units)); @@ -309,7 +332,7 @@ AcpiOsSignalSemaphore(ACPI_HANDLE Handle, UINT32 Units) } wakeup(as); - mtx_unlock(&as->as_mtx); + AS_UNLOCK(as); return_ACPI_STATUS(AE_OK); #else return(AE_OK);