summaryrefslogtreecommitdiffstats
path: root/sys/compat/ndis/subr_hal.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/compat/ndis/subr_hal.c')
-rw-r--r--sys/compat/ndis/subr_hal.c56
1 files changed, 14 insertions, 42 deletions
diff --git a/sys/compat/ndis/subr_hal.c b/sys/compat/ndis/subr_hal.c
index beae7c1..9111cb2 100644
--- a/sys/compat/ndis/subr_hal.c
+++ b/sys/compat/ndis/subr_hal.c
@@ -266,6 +266,7 @@ hal_lock(/*lock*/void)
oldirql = FASTCALL1(hal_raise_irql, DISPATCH_LEVEL);
FASTCALL1(ntoskrnl_lock_dpc, lock);
+
return(oldirql);
}
@@ -288,10 +289,6 @@ hal_irql(void)
{
if (AT_DISPATCH_LEVEL(curthread))
return(DISPATCH_LEVEL);
- if (AT_DIRQL_LEVEL(curthread))
- return(DEVICE_LEVEL);
- if (AT_HIGH_LEVEL(curthread))
- return(HIGH_LEVEL);
return(PASSIVE_LEVEL);
}
@@ -313,27 +310,13 @@ hal_raise_irql(/*irql*/ void)
__asm__ __volatile__ ("" : "=c" (irql));
- switch(irql) {
- case HIGH_LEVEL:
- oldirql = hal_irql();
- critical_enter();
- break;
- case DEVICE_LEVEL:
- mtx_lock_spin(&sched_lock);
- oldirql = curthread->td_priority;
- sched_prio(curthread, PI_REALTIME);
- mtx_unlock_spin(&sched_lock);
- break;
- case DISPATCH_LEVEL:
- mtx_lock_spin(&sched_lock);
- oldirql = curthread->td_priority;
- sched_prio(curthread, PI_SOFT);
- mtx_unlock_spin(&sched_lock);
- break;
- default:
- panic("can't raise IRQL to unknown level %d", irql);
- break;
- }
+ if (irql < hal_irql())
+ panic("IRQL_NOT_LESS_THAN");
+
+ mtx_lock_spin(&sched_lock);
+ oldirql = curthread->td_priority;
+ sched_prio(curthread, PI_REALTIME);
+ mtx_unlock_spin(&sched_lock);
return(oldirql);
}
@@ -342,26 +325,15 @@ __stdcall void
hal_lower_irql(/*oldirql*/ void)
{
uint8_t oldirql;
- uint8_t irql;
__asm__ __volatile__ ("" : "=c" (oldirql));
- irql = hal_irql();
-
- switch (irql) {
- case HIGH_LEVEL:
- critical_exit();
- break;
- case DEVICE_LEVEL:
- case DISPATCH_LEVEL:
- mtx_lock_spin(&sched_lock);
- sched_prio(curthread, oldirql);
- mtx_unlock_spin(&sched_lock);
- break;
- default:
- panic("can't lower IRQL to unknown level %d", irql);
- break;
- }
+ if (hal_irql() != DISPATCH_LEVEL)
+ panic("IRQL_NOT_GREATER_THAN");
+
+ mtx_lock_spin(&sched_lock);
+ sched_prio(curthread, oldirql);
+ mtx_unlock_spin(&sched_lock);
return;
}
OpenPOWER on IntegriCloud