Module Name: src Committed By: rmind Date: Sat May 14 12:44:16 UTC 2011
Modified Files: src/sys/compat/ndis: kern_ndis.c nbcompat.c nbcompat.h ndis_var.h subr_ndis.c subr_ntoskrnl.c src/sys/dev/if_ndis: if_ndis.c if_ndisvar.h Log Message: Replace simple_lock(9) with mutex(9), clean up. To generate a diff of this commit: cvs rdiff -u -r1.21 -r1.22 src/sys/compat/ndis/kern_ndis.c cvs rdiff -u -r1.10 -r1.11 src/sys/compat/ndis/nbcompat.c cvs rdiff -u -r1.14 -r1.15 src/sys/compat/ndis/nbcompat.h cvs rdiff -u -r1.5 -r1.6 src/sys/compat/ndis/ndis_var.h cvs rdiff -u -r1.23 -r1.24 src/sys/compat/ndis/subr_ndis.c cvs rdiff -u -r1.18 -r1.19 src/sys/compat/ndis/subr_ntoskrnl.c cvs rdiff -u -r1.31 -r1.32 src/sys/dev/if_ndis/if_ndis.c cvs rdiff -u -r1.6 -r1.7 src/sys/dev/if_ndis/if_ndisvar.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/compat/ndis/kern_ndis.c diff -u src/sys/compat/ndis/kern_ndis.c:1.21 src/sys/compat/ndis/kern_ndis.c:1.22 --- src/sys/compat/ndis/kern_ndis.c:1.21 Mon May 11 21:31:29 2009 +++ src/sys/compat/ndis/kern_ndis.c Sat May 14 12:44:16 2011 @@ -1,3 +1,5 @@ +/* $NetBSD: kern_ndis.c,v 1.22 2011/05/14 12:44:16 rmind Exp $ */ + /*- * Copyright (c) 2003 * Bill Paul <wp...@windriver.com>. All rights reserved. @@ -35,7 +37,7 @@ __FBSDID("$FreeBSD: src/sys/compat/ndis/kern_ndis.c,v 1.60.2.5 2005/04/01 17:14:20 wpaul Exp $"); #endif #ifdef __NetBSD__ -__KERNEL_RCSID(0, "$NetBSD: kern_ndis.c,v 1.21 2009/05/11 21:31:29 cegger Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_ndis.c,v 1.22 2011/05/14 12:44:16 rmind Exp $"); #endif #include <sys/param.h> @@ -50,9 +52,7 @@ #include <sys/proc.h> #include <sys/malloc.h> #include <sys/lock.h> -#ifdef __FreeBSD__ #include <sys/mutex.h> -#endif #include <sys/conf.h> #include <sys/kernel.h> @@ -134,9 +134,6 @@ struct proc *np_p; int np_state; uint8_t np_stack[PAGE_SIZE*NDIS_KSTACK_PAGES]; -#ifdef __NetBSD__ - int np_needs_wakeup; -#endif }; static void ndis_return(void *); @@ -152,9 +149,7 @@ #ifdef __FreeBSD__ static struct mtx ndis_thr_mtx; #else /* __NetBSD__ */ -static struct simplelock ndis_thr_mtx; -#define THR_LOCK() do {old_ipl = splnet(); simple_lock(&ndis_thr_mtx);} while(0) -#define THR_UNLOCK() do {simple_unlock(&ndis_thr_mtx); splx(old_ipl);} while(0) +static kmutex_t ndis_thr_mtx; #endif static struct mtx ndis_req_mtx; @@ -338,44 +333,18 @@ { struct ndis_req *r = NULL, *die = NULL; struct ndisproc *p; -#ifdef __NetBSD__ - int old_ipl; -#endif p = arg; - while (1) { + for (;;) { + mtx_lock_spin(&ndis_thr_mtx); + ndis_thsuspend(p->np_p, &ndis_thr_mtx, 0); - /* Protect against interrupts between checking if the queue is empty, and going to sleep - * to avoid a wakeup before sleep. - */ - old_ipl = splnet(); - /* Sleep, but preserve our original priority. */ - if(STAILQ_EMPTY(p->np_q)) { - /* TODO: If we get an interrupt between checking if the queue is empty, - * TODO: and sleeping, then in the interrupt, an item could be placed - * TODO: on the queue, and we could be woken up before we sleep. - * - */ - ndis_thsuspend(p->np_p, NULL, 0); - } - splx(old_ipl); - -#ifdef __NetBSD__ - p->np_needs_wakeup = FALSE; -#endif - /* Look for any jobs on the work queue. */ -#ifdef __FreeBSD__ - mtx_lock_spin(&ndis_thr_mtx); -#else /* __NetBSD__ */ - THR_LOCK(); -#endif - p->np_state = NDIS_PSTATE_RUNNING; - while(!STAILQ_EMPTY(p->np_q)/*STAILQ_FIRST(p->np_q) != NULL*/) { + while (!STAILQ_EMPTY(p->np_q)) { r = STAILQ_FIRST(p->np_q); - STAILQ_REMOVE_HEAD(p->np_q, link); + STAILQ_REMOVE_HEAD(p->np_q, link); /* for debugging */ @@ -388,11 +357,8 @@ _ndis_swi_req = r; r->area = 2; } -#ifdef __FreeBSD__ mtx_unlock_spin(&ndis_thr_mtx); -#else /* __NetBSD__ */ - THR_UNLOCK(); -#endif + /* Just for debugging */ if(p == &ndis_tproc) { @@ -412,11 +378,7 @@ calling_in_swi = FALSE; } -#ifdef __FreeBSD__ mtx_lock_spin(&ndis_thr_mtx); -#else /* __NetBSD__ */ - THR_LOCK(); -#endif /* Zeroing out the ndis_req is just for debugging */ //memset(r, 0, sizeof(struct ndis_req)); @@ -428,11 +390,7 @@ } p->np_state = NDIS_PSTATE_SLEEPING; -#ifdef __FreeBSD__ mtx_unlock_spin(&ndis_thr_mtx); -#else /* __NetBSD__ */ - THR_UNLOCK(); -#endif /* Bail if we were told to shut down. */ @@ -441,18 +399,9 @@ } wakeup(die); -#ifdef __FreeBSD__ -#if __FreeBSD_version < 502113 - mtx_lock(&Giant); -#endif -#endif - if(p == &ndis_tproc) { - printf("taskqueue thread exiting!\n"); - } else if(p == &ndis_iproc) { - printf("swi thread exiting!\n"); - } + kthread_exit(0); - return; /* notreached */ + /* NOTREACHED */ } /*static*/ int @@ -466,9 +415,8 @@ #ifdef __FreeBSD__ mtx_init(&ndis_thr_mtx, "NDIS thread lock", NULL, MTX_SPIN); #else /* __NetBSD__ */ - simple_lock_init(&ndis_thr_mtx); - //lockinit(&ndis_thr_mtx, PWAIT, "NDIS thread lock", 0, 0); -#endif + mutex_init(&ndis_thr_mtx, MUTEX_DEFAULT, IPL_NET); +#endif mtx_init(&ndis_req_mtx, "NDIS request lock", MTX_NDIS_LOCK, MTX_DEF); STAILQ_INIT(&ndis_ttodo); @@ -539,9 +487,7 @@ } mtx_destroy(&ndis_req_mtx); -#ifndef __NetBSD__ mtx_destroy(&ndis_thr_mtx); -#endif return; } @@ -552,9 +498,6 @@ struct ndis_req *r; struct ndisqhead *q; struct proc *p; -#ifdef __NetBSD__ - int old_ipl; -#endif if (t == NDIS_TASKQUEUE) { q = &ndis_ttodo; @@ -566,11 +509,8 @@ /* Create and post a special 'exit' job. */ -#ifdef __FreeBSD__ mtx_lock_spin(&ndis_thr_mtx); -#else /* __NetBSD__ */ - THR_LOCK(); -#endif + r = STAILQ_FIRST(&ndis_free); STAILQ_REMOVE_HEAD(&ndis_free, link); r->nr_func = NULL; @@ -578,40 +518,20 @@ r->nr_exit = TRUE; r->area = 3; STAILQ_INSERT_TAIL(q, r, link); -#ifdef __FreeBSD__ mtx_unlock_spin(&ndis_thr_mtx); -#else /* __NetBSD__ */ - THR_UNLOCK(); -#endif ndis_thresume(p); - /* wait for thread exit */ - -#ifdef __FreeBSD__ - tsleep(r, curthread->td_priority|PCATCH, "ndisthexit", hz * 60); -#else - tsleep(r, curlwp->l_priority|PCATCH, "ndisthexit", hz * 60); -#endif + /* Wait for thread exit */ + tsleep(r, PZERO | PCATCH, "ndisthexit", hz * 60); /* Now empty the job list. */ -#ifdef __FreeBSD__ mtx_lock_spin(&ndis_thr_mtx); -#else /* __NetBSD__ */ - THR_LOCK(); -#endif while ((r = STAILQ_FIRST(q)) != NULL) { STAILQ_REMOVE_HEAD(q, link); STAILQ_INSERT_HEAD(&ndis_free, r, link); } - -#ifdef __FreeBSD__ mtx_unlock_spin(&ndis_thr_mtx); -#else /* __NetBSD__ */ - THR_UNLOCK(); -#endif - - return; } static int @@ -619,26 +539,16 @@ { struct ndis_req *r; int i; -#ifdef __NetBSD__ - int old_ipl; -#endif for (i = 0; i < cnt; i++) { r = malloc(sizeof(struct ndis_req), M_DEVBUF, M_WAITOK); if (r == NULL) return(ENOMEM); -#ifdef __FreeBSD__ + mtx_lock_spin(&ndis_thr_mtx); -#else /* __NetBSD__ */ - THR_LOCK(); -#endif STAILQ_INSERT_HEAD(&ndis_free, r, link); ndis_jobs++; -#ifdef __FreeBSD__ mtx_unlock_spin(&ndis_thr_mtx); -#else /* __NetBSD__ */ - THR_UNLOCK(); -#endif } return(0); @@ -649,33 +559,17 @@ { struct ndis_req *r; int i; -#ifdef __NetBSD__ - int old_ipl; -#endif for (i = 0; i < cnt; i++) { -#ifdef __FreeBSD__ mtx_lock_spin(&ndis_thr_mtx); -#else /* __NetBSD__ */ - THR_LOCK(); -#endif r = STAILQ_FIRST(&ndis_free); if (r == NULL) { -#ifdef __FreeBSD__ mtx_unlock_spin(&ndis_thr_mtx); -#else /* __NetBSD__ */ - THR_UNLOCK(); -#endif return(ENOMEM); } STAILQ_REMOVE_HEAD(&ndis_free, link); ndis_jobs--; -#ifdef __FreeBSD__ mtx_unlock_spin(&ndis_thr_mtx); -#else /* __NetBSD__ */ - THR_UNLOCK(); -#endif - free(r, M_DEVBUF); } @@ -688,9 +582,6 @@ struct ndis_req *r; struct ndisqhead *q; struct proc *p; -#ifdef __NetBSD__ - int old_ipl; -#endif if (t == NDIS_TASKQUEUE) { q = &ndis_ttodo; @@ -700,29 +591,18 @@ p = ndis_iproc.np_p; } -#ifdef __FreeBSD__ mtx_lock_spin(&ndis_thr_mtx); -#else /* __NetBSD__ */ - THR_LOCK(); -#endif STAILQ_FOREACH(r, q, link) { if (r->nr_func == func && r->nr_arg == arg) { r->area = 4; STAILQ_REMOVE(q, r, ndis_req, link); STAILQ_INSERT_HEAD(&ndis_free, r, link); -#ifdef __FreeBSD__ mtx_unlock_spin(&ndis_thr_mtx); -#else /* __NetBSD__ */ - THR_UNLOCK(); -#endif return(0); } } -#ifdef __FreeBSD__ mtx_unlock_spin(&ndis_thr_mtx); -#else /* __NetBSD__ */ - THR_UNLOCK(); -#endif + return(ENOENT); } @@ -738,7 +618,6 @@ struct proc *p; int s; #ifdef __NetBSD__ - int old_ipl; /* just for debugging */ struct ndis_req **ls; //struct lwp *l = curlwp; @@ -754,12 +633,8 @@ p = ndis_iproc.np_p; } -#ifdef __FreeBSD__ mtx_lock_spin(&ndis_thr_mtx); -#else /* __NetBSD__ */ - THR_LOCK(); -#endif - + /* * Check to see if an instance of this job is already * pending. If so, don't bother queuing it again. @@ -772,11 +647,7 @@ else s = ndis_iproc.np_state; #endif -#ifdef __FreeBSD__ mtx_unlock_spin(&ndis_thr_mtx); -#else /* __NetBSD__ */ - THR_UNLOCK(); -#endif #ifdef __NetBSD__ /* The swi thread seemed to be going to sleep, and not waking up * again, so I thought I'd try this out... @@ -789,11 +660,7 @@ } r = STAILQ_FIRST(&ndis_free); if (r == NULL) { -#ifdef __FreeBSD__ mtx_unlock_spin(&ndis_thr_mtx); -#else /* __NetBSD__ */ - THR_UNLOCK(); -#endif return(EAGAIN); } STAILQ_REMOVE_HEAD(&ndis_free, link); @@ -808,21 +675,10 @@ STAILQ_INSERT_TAIL(q, r, link); if (t == NDIS_TASKQUEUE) { s = ndis_tproc.np_state; -#ifdef __NetBSD__ - ndis_tproc.np_needs_wakeup = TRUE; -#endif } else { s = ndis_iproc.np_state; -#ifdef __NetBSD__ - ndis_iproc.np_needs_wakeup = TRUE; -#endif } - -#ifdef __FreeBSD__ mtx_unlock_spin(&ndis_thr_mtx); -#else /* __NetBSD__ */ - THR_UNLOCK(); -#endif /* * Post the job, but only if the thread is actually blocked @@ -862,52 +718,17 @@ */ int -ndis_thsuspend(p, m, timo) - struct proc *p; -#ifdef __FreeBSD__ - struct mtx *m; -#else /* __NetBSD__*/ - struct simplelock *m; -#endif - int timo; +ndis_thsuspend(proc_t *p, kmutex_t *m, int timo) { - int error; - -#ifdef __FreeBSD__ - if (m != NULL) { - error = msleep(&p->p_siglist, m, - curthread->td_priority, "ndissp", timo); - } else { - PROC_LOCK(p); - error = msleep(&p->p_siglist, &p->p_mtx, - curthread->td_priority|PDROP, "ndissp", timo); - } -#else -/* TODO: Why do they wait on &p->p_siglist? I noticed that in FreeBSD's - * src/sys/sys/proc.h there is some mention of p_siglist having to do with - * M:N threading. - */ - if (m != NULL) { - //mtx_unlock(m); - error = ltsleep(&p->p_sigpend.sp_set, curlwp->l_priority, - "ndissp", timo, m); - //mtx_lock(m); - } else { - error = ltsleep(&p->p_sigpend.sp_set, curlwp->l_priority/*|PNORELOCK*/, - "ndissp", timo, 0 /*&p->p_lock*/); - } -#endif - - return(error); + return mtsleep(&p->p_sigpend.sp_set, PZERO, "ndissp", timo, m); } void ndis_thresume(struct proc *p) { + wakeup(&p->p_sigpend.sp_set); - - return; } __stdcall static void @@ -1667,9 +1488,6 @@ uint32_t byteswritten = 0, bytesneeded = 0; int error; uint8_t irql = 0; /* XXX: gcc */ -#ifdef __NetBSD__ - int s; -#endif /* * According to the NDIS spec, MiniportQueryInformation() @@ -1711,23 +1529,12 @@ if (rval == NDIS_STATUS_PENDING) { mtx_lock(&ndis_req_mtx); -#ifdef __FreeBSD__ - error = msleep(&sc->ndis_block->nmb_setstat, - &ndis_req_mtx, - curthread->td_priority|PDROP, - "ndisset", 5 * hz); -#else - error = ltsleep(&sc->ndis_block->nmb_setstat, - curlwp->l_priority|PNORELOCK, - "ndisset", 5 * hz, 0); -#endif + error = mtsleep(&sc->ndis_block->nmb_setstat, + PZERO | PNORELOCK, + "ndisset", 5 * hz, &ndis_req_mtx); rval = sc->ndis_block->nmb_setstat; -#ifdef __NetBSD__ - mtx_unlock(&ndis_req_mtx); -#endif } - if (byteswritten) *buflen = byteswritten; if (bytesneeded) @@ -1929,13 +1736,7 @@ KeReleaseSpinLock(&sc->ndis_block->nmb_lock, irql); if (rval == NDIS_STATUS_PENDING) { - mtx_lock(&ndis_req_mtx); -#ifdef __FreeBSD__ - msleep(sc, &ndis_req_mtx, - curthread->td_priority|PDROP, "ndisrst", 0); -#else - ltsleep(sc, curlwp->l_priority|PNORELOCK, "ndisrst", 0, 0); -#endif + mtsleep(sc, PZERO | PNORELOCK, "ndisrst", 0, &ndis_req_mtx); } return(0); @@ -1948,9 +1749,6 @@ ndis_handle adapter; __stdcall ndis_halt_handler haltfunc; struct ifnet *ifp; -#ifdef __NetBSD__ - int s; -#endif sc = arg; #ifdef __FreeBSD__ @@ -1994,9 +1792,6 @@ struct ndis_softc *sc; ndis_handle adapter; __stdcall ndis_shutdown_handler shutdownfunc; -#ifdef __NetBSD__ - int s; -#endif sc = arg; @@ -2030,9 +1825,6 @@ ndis_status status, openstatus = 0; ndis_medium mediumarray[NdisMediumMax]; uint32_t chosenmedium, i; -#ifdef __NetBSD__ - int s; -#endif if (arg == NULL) return(EINVAL); @@ -2209,15 +2001,8 @@ if (rval == NDIS_STATUS_PENDING) { mtx_lock(&ndis_req_mtx); -#ifdef __FreeBSD__ - error = msleep(&sc->ndis_block->nmb_getstat, - &ndis_req_mtx, - curthread->td_priority|PDROP, - "ndisget", 5 * hz); -#else - ltsleep(&sc->ndis_block->nmb_getstat, - curlwp->l_priority|PNORELOCK, "ndisget", 5 * hz, 0); -#endif + mtsleep(&sc->ndis_block->nmb_getstat, PZERO | PNORELOCK, + "ndisget", 5 * hz, &ndis_req_mtx); rval = sc->ndis_block->nmb_getstat; } Index: src/sys/compat/ndis/nbcompat.c diff -u src/sys/compat/ndis/nbcompat.c:1.10 src/sys/compat/ndis/nbcompat.c:1.11 --- src/sys/compat/ndis/nbcompat.c:1.10 Tue Jan 8 07:59:23 2008 +++ src/sys/compat/ndis/nbcompat.c Sat May 14 12:44:16 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: nbcompat.c,v 1.10 2008/01/08 07:59:23 he Exp $ */ +/* $NetBSD: nbcompat.c,v 1.11 2011/05/14 12:44:16 rmind Exp $ */ /* nbcompat.c * Implementations of some FreeBSD functions on NetBSD to make things @@ -6,7 +6,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: nbcompat.c,v 1.10 2008/01/08 07:59:23 he Exp $"); +__KERNEL_RCSID(0, "$NetBSD: nbcompat.c,v 1.11 2011/05/14 12:44:16 rmind Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -54,20 +54,6 @@ return 0; } -void -mtx_lock(struct mtx *mutex) -{ - /* XXXSMP needs doing - */ - //mutex_enter(mutex); -} - -void -mtx_unlock(struct mtx *mutex) -{ - //mutex_exit(mutex); -} - int device_is_attached(device_t dev) { Index: src/sys/compat/ndis/nbcompat.h diff -u src/sys/compat/ndis/nbcompat.h:1.14 src/sys/compat/ndis/nbcompat.h:1.15 --- src/sys/compat/ndis/nbcompat.h:1.14 Sat Jan 22 12:06:51 2011 +++ src/sys/compat/ndis/nbcompat.h Sat May 14 12:44:16 2011 @@ -12,10 +12,12 @@ #define mtx kmutex #define mtx_init(mtx, desc, type, opts) mutex_init(mtx, MUTEX_DEFAULT, IPL_NONE) -/* -#define mtx_lock(mtx) ndis_mtx_ipl = splnet() mutex_enter(mtx) -#define mtx_unlock(mtx) splx(ndis_mtx_ipl) mutex_exit(mtx) -*/ + +#define mtx_lock(mtx) mutex_enter(mtx) +#define mtx_unlock(mtx) mutex_exit(mtx) + +#define mtx_lock_spin(mtx) mutex_spin_enter(mtx); +#define mtx_unlock_spin(mtx) mutex_spin_exit(mtx); void mtx_lock(struct mtx *mutex); void mtx_unlock(struct mtx *mutex); Index: src/sys/compat/ndis/ndis_var.h diff -u src/sys/compat/ndis/ndis_var.h:1.5 src/sys/compat/ndis/ndis_var.h:1.6 --- src/sys/compat/ndis/ndis_var.h:1.5 Fri Jan 4 21:17:46 2008 +++ src/sys/compat/ndis/ndis_var.h Sat May 14 12:44:16 2011 @@ -1,3 +1,5 @@ +/* $NetBSD: ndis_var.h,v 1.6 2011/05/14 12:44:16 rmind Exp $ */ + /*- * Copyright (c) 2003 * Bill Paul <wp...@windriver.com>. All rights reserved. @@ -35,7 +37,7 @@ #ifndef _NDIS_VAR_H_ #define _NDIS_VAR_H_ -#include <sys/simplelock.h> +#include <sys/lock.h> /* Forward declarations */ struct ndis_miniport_block; @@ -1600,7 +1602,7 @@ #ifdef __FreeBSD__ extern int ndis_thsuspend(struct proc *, struct mtx *, int); #else /* __NetBSD__ */ -extern int ndis_thsuspend(struct proc *, struct simplelock *, int); +extern int ndis_thsuspend(struct proc *, kmutex_t *, int); #endif extern void ndis_thresume(struct proc *); extern int ndis_strcasecmp(const char *, const char *); Index: src/sys/compat/ndis/subr_ndis.c diff -u src/sys/compat/ndis/subr_ndis.c:1.23 src/sys/compat/ndis/subr_ndis.c:1.24 --- src/sys/compat/ndis/subr_ndis.c:1.23 Mon Jul 26 22:33:23 2010 +++ src/sys/compat/ndis/subr_ndis.c Sat May 14 12:44:16 2011 @@ -1,3 +1,5 @@ +/* $NetBSD: subr_ndis.c,v 1.24 2011/05/14 12:44:16 rmind Exp $ */ + /*- * Copyright (c) 2003 * Bill Paul <wp...@windriver.com>. All rights reserved. @@ -35,7 +37,7 @@ __FBSDID("$FreeBSD: src/sys/compat/ndis/subr_ndis.c,v 1.67.2.7 2005/03/31 21:50:11 wpaul Exp $"); #endif #ifdef __NetBSD__ -__KERNEL_RCSID(0, "$NetBSD: subr_ndis.c,v 1.23 2010/07/26 22:33:23 jym Exp $"); +__KERNEL_RCSID(0, "$NetBSD: subr_ndis.c,v 1.24 2011/05/14 12:44:16 rmind Exp $"); #endif /* @@ -2710,13 +2712,7 @@ tv.tv_sec = 0; tv.tv_usec = usecs; -#ifdef __FreeBSD__ - ndis_thsuspend(curthread->td_proc, NULL, tvtohz(&tv)); -#else ndis_thsuspend(curproc, NULL, tvtohz(&tv)); -#endif - - return; } __stdcall static uint32_t Index: src/sys/compat/ndis/subr_ntoskrnl.c diff -u src/sys/compat/ndis/subr_ntoskrnl.c:1.18 src/sys/compat/ndis/subr_ntoskrnl.c:1.19 --- src/sys/compat/ndis/subr_ntoskrnl.c:1.18 Wed Mar 18 17:06:48 2009 +++ src/sys/compat/ndis/subr_ntoskrnl.c Sat May 14 12:44:16 2011 @@ -1,3 +1,5 @@ +/* $NetBSD: subr_ntoskrnl.c,v 1.19 2011/05/14 12:44:16 rmind Exp $ */ + /*- * Copyright (c) 2003 * Bill Paul <wp...@windriver.com>. All rights reserved. @@ -35,7 +37,7 @@ __FBSDID("$FreeBSD: src/sys/compat/ndis/subr_ntoskrnl.c,v 1.43.2.5 2005/03/31 04:24:36 wpaul Exp $"); #endif #ifdef __NetBSD__ -__KERNEL_RCSID(0, "$NetBSD: subr_ntoskrnl.c,v 1.18 2009/03/18 17:06:48 cegger Exp $"); +__KERNEL_RCSID(0, "$NetBSD: subr_ntoskrnl.c,v 1.19 2011/05/14 12:44:16 rmind Exp $"); #endif #ifdef __FreeBSD__ @@ -47,10 +49,7 @@ #include <sys/errno.h> #include <sys/systm.h> #include <sys/malloc.h> -#include <sys/lock.h> -#ifdef __FreeBSD__ #include <sys/mutex.h> -#endif #include <sys/callout.h> #if __FreeBSD_version > 502113 @@ -216,9 +215,7 @@ #ifdef __FreeBSD__ static struct mtx ntoskrnl_dispatchlock; #else /* __NetBSD__ */ -static struct simplelock ntoskrnl_dispatchlock; -#define DISPATCH_LOCK() do {s = splnet(); simple_lock(&ntoskrnl_dispatchlock);} while(0) -#define DISPATCH_UNLOCK() do {simple_unlock(&ntoskrnl_dispatchlock); splx(s);} while(0) +static kmutex_t ntoskrnl_dispatchlock; #endif static kspin_lock ntoskrnl_global; @@ -239,7 +236,7 @@ mtx_init(&ntoskrnl_dispatchlock, "ntoskrnl dispatch lock", MTX_NDIS_LOCK, MTX_DEF); #else /* __NetBSD__ */ - simple_lock_init(&ntoskrnl_dispatchlock); + mutex_init(&ntoskrnl_dispatchlock, MUTEX_DEFAULT, IPL_NET); #endif KeInitializeSpinLock(&ntoskrnl_global); KeInitializeSpinLock(&ntoskrnl_cancellock); @@ -289,11 +286,10 @@ #ifdef __FreeBSD__ uma_zdestroy(mdl_zone); - mtx_destroy(&ntoskrnl_dispatchlock); #else pool_destroy(&mdl_pool); - /* XXX destroy lock */ #endif + mtx_destroy(&ntoskrnl_dispatchlock); return(0); } @@ -781,30 +777,17 @@ IoMakeAssociatedIrp(irp *ip, uint8_t stsize) { irp *associrp; -#ifdef __NetBSD__ - int s; -#endif associrp = IoAllocateIrp(stsize, FALSE); if (associrp == NULL) return(NULL); -#ifdef __NetBSD__ - DISPATCH_LOCK(); -#else mtx_lock(&ntoskrnl_dispatchlock); -#endif - associrp->irp_flags |= IRP_ASSOCIATED_IRP; associrp->irp_tail.irp_overlay.irp_thread = ip->irp_tail.irp_overlay.irp_thread; associrp->irp_assoc.irp_master = ip; - -#ifdef __FreeBSD__ mtx_unlock(&ntoskrnl_dispatchlock); -#else /* __NetBSD__ */ - DISPATCH_UNLOCK(); -#endif return(associrp); } @@ -977,26 +960,13 @@ IoAttachDeviceToDeviceStack(device_object *src, device_object *dst) { device_object *attached; -#ifdef __NetBSD__ - int s; -#endif -#ifdef __NetBSD__ - DISPATCH_LOCK(); -#else mtx_lock(&ntoskrnl_dispatchlock); -#endif - attached = IoGetAttachedDevice(dst); attached->do_attacheddev = src; src->do_attacheddev = NULL; src->do_stacksize = attached->do_stacksize + 1; - -#ifdef __FreeBSD__ mtx_unlock(&ntoskrnl_dispatchlock); -#else /* __NetBSD__ */ - DISPATCH_UNLOCK(); -#endif return(attached); } @@ -1005,24 +975,13 @@ IoDetachDevice(device_object *topdev) { device_object *tail; -#ifdef __NetBSD__ - int s; -#endif -#ifdef __NetBSD__ - DISPATCH_LOCK(); -#else mtx_lock(&ntoskrnl_dispatchlock); -#endif /* First, break the chain. */ tail = topdev->do_attacheddev; if (tail == NULL) { -#ifdef __FreeBSD__ mtx_unlock(&ntoskrnl_dispatchlock); -#else /* __NetBSD__ */ - DISPATCH_UNLOCK(); -#endif return; } topdev->do_attacheddev = tail->do_attacheddev; @@ -1035,14 +994,7 @@ tail->do_stacksize--; tail = tail->do_attacheddev; } - -#ifdef __FreeBSD__ mtx_unlock(&ntoskrnl_dispatchlock); -#else /* __NetBSD__ */ - DISPATCH_UNLOCK(); -#endif - - return; } /* Always called with dispatcher lock held. */ @@ -1167,18 +1119,11 @@ struct timeval tv; int error = 0; uint64_t curtime; -#ifdef __NetBSD__ - int s; -#endif if (obj == NULL) return(STATUS_INVALID_PARAMETER); -#ifdef __NetBSD__ - DISPATCH_LOCK(); -#else mtx_lock(&ntoskrnl_dispatchlock); -#endif /* * See if the object is a mutex. If so, and we already own @@ -1205,23 +1150,13 @@ #else km->km_ownerthread = curproc; #endif - -#ifdef __FreeBSD__ mtx_unlock(&ntoskrnl_dispatchlock); -#else /* __NetBSD__ */ - DISPATCH_UNLOCK(); -#endif return (STATUS_SUCCESS); } } else if (obj->dh_sigstate == TRUE) { if (obj->dh_type == EVENT_TYPE_SYNC) obj->dh_sigstate = FALSE; - -#ifdef __FreeBSD__ mtx_unlock(&ntoskrnl_dispatchlock); -#else /* __NetBSD__ */ - DISPATCH_UNLOCK(); -#endif return (STATUS_SUCCESS); } @@ -1258,23 +1193,14 @@ } } -#ifdef __FreeBSD__ - error = ndis_thsuspend(td->td_proc, &ntoskrnl_dispatchlock, - duetime == NULL ? 0 : tvtohz(&tv)); -#else error = ndis_thsuspend(curproc, &ntoskrnl_dispatchlock, duetime == NULL ? 0 : tvtohz(&tv)); -#endif /* We timed out. Leave the object alone and return status. */ if (error == EWOULDBLOCK) { REMOVE_LIST_ENTRY((&w.wb_waitlist)); -#ifdef __FreeBSD__ mtx_unlock(&ntoskrnl_dispatchlock); -#else /* __NetBSD__ */ - DISPATCH_UNLOCK(); -#endif return(STATUS_TIMEOUT); } @@ -1300,12 +1226,8 @@ if (obj->dh_type == EVENT_TYPE_SYNC) obj->dh_sigstate = FALSE; REMOVE_LIST_ENTRY((&w.wb_waitlist)); - -#ifdef __FreeBSD__ + mtx_unlock(&ntoskrnl_dispatchlock); -#else /* __NetBSD__ */ - DISPATCH_UNLOCK(); -#endif return(STATUS_SUCCESS); } @@ -1333,21 +1255,14 @@ struct timespec t1, t2; #ifdef __NetBSD__ struct timeval tv1,tv2; - int s; #endif - if (cnt > MAX_WAIT_OBJECTS) return(STATUS_INVALID_PARAMETER); if (cnt > THREAD_WAIT_OBJECTS && wb_array == NULL) return(STATUS_INVALID_PARAMETER); -#ifdef __NetBSD__ - DISPATCH_LOCK(); -#else mtx_lock(&ntoskrnl_dispatchlock); -#endif - if (wb_array == NULL) w = &_wb_array[0]; else @@ -1372,11 +1287,7 @@ km->km_ownerthread = curproc; #endif if (wtype == WAITTYPE_ANY) { -#ifdef __FreeBSD__ mtx_unlock(&ntoskrnl_dispatchlock); -#else /* __NetBSD__ */ - DISPATCH_UNLOCK(); -#endif return (STATUS_WAIT_0 + i); } } @@ -1384,11 +1295,7 @@ if (obj[i]->dh_type == EVENT_TYPE_SYNC) obj[i]->dh_sigstate = FALSE; if (wtype == WAITTYPE_ANY) { -#ifdef __FreeBSD__ mtx_unlock(&ntoskrnl_dispatchlock); -#else /* __NetBSD__ */ - DISPATCH_UNLOCK(); -#endif return (STATUS_WAIT_0 + i); } } @@ -1436,13 +1343,9 @@ TIMEVAL_TO_TIMESPEC(&tv1,&t1); #endif -#ifdef __FreeBSD__ - error = ndis_thsuspend(td->td_proc, &ntoskrnl_dispatchlock, - duetime == NULL ? 0 : tvtohz(&tv)); -#else - error = ndis_thsuspend(curproc, &ntoskrnl_dispatchlock, - duetime == NULL ? 0 : tvtohz(&tv)); -#endif + error = ndis_thsuspend(curproc, &ntoskrnl_dispatchlock, + duetime == NULL ? 0 : tvtohz(&tv)); + #ifdef __FreeBSD__ nanotime(&t2); #else @@ -1487,28 +1390,15 @@ } if (error == EWOULDBLOCK) { -#ifdef __FreeBSD__ mtx_unlock(&ntoskrnl_dispatchlock); -#else /* __NetBSD__ */ - DISPATCH_UNLOCK(); -#endif return(STATUS_TIMEOUT); } if (wtype == WAITTYPE_ANY && wcnt) { -#ifdef __FreeBSD__ mtx_unlock(&ntoskrnl_dispatchlock); -#else /* __NetBSD__ */ - DISPATCH_UNLOCK(); -#endif return(STATUS_WAIT_0 + widx); } - -#ifdef __FreeBSD__ mtx_unlock(&ntoskrnl_dispatchlock); -#else /* __NetBSD__ */ - DISPATCH_UNLOCK(); -#endif return(STATUS_SUCCESS); } @@ -1843,11 +1733,6 @@ return(depth); } -/* TODO: Make sure that LOCKDEBUG isn't defined otherwise a "struct simplelock" will - * TODO: be more than 4 bytes. I'm using a kspin_lock as a simplelock, and the - * TODO: kspin lock is 4 bytes, so this is OK as long as LOCKDEBUG isn't defined. - */ - /* * The KeInitializeSpinLock(), KefAcquireSpinLockAtDpcLevel() * and KefReleaseSpinLockFromDpcLevel() appear to be analagous @@ -1858,38 +1743,23 @@ __stdcall void KeInitializeSpinLock(kspin_lock *lock) { -#ifdef __FreeBSD__ - *lock = 0; -#else /* __NetBSD__ */ - simple_lock_init((struct simplelock *)lock); -#endif - return; + __cpu_simple_lock_init((__cpu_simple_lock_t *)lock); } #ifdef __i386__ __fastcall void KefAcquireSpinLockAtDpcLevel(REGARGS1(kspin_lock *lock)) { -#ifdef __FreeBSD__ - while (atomic_cmpset_acq_int((volatile u_int *)lock, 0, 1) == 0) - /* sit and spin */; -#else /* __NetBSD__ */ - simple_lock((struct simplelock *)lock); -#endif - return; + __cpu_simple_lock((__cpu_simple_lock_t *)lock); } __fastcall void KefReleaseSpinLockFromDpcLevel(REGARGS1(kspin_lock *lock)) { -#ifdef __FreeBSD__ - atomic_store_rel_int((volatile u_int *)lock, 0); -#else /* __NetBSD__ */ - simple_unlock((struct simplelock *)lock); -#endif - return; + + __cpu_simple_unlock((__cpu_simple_lock_t *)lock); } __stdcall uint8_t @@ -2349,26 +2219,15 @@ kmutant *kmutex, uint8_t kwait) { -#ifdef __NetBSD__ - int s; -#endif -#ifdef __NetBSD__ - DISPATCH_LOCK(); -#else mtx_lock(&ntoskrnl_dispatchlock); -#endif - + #ifdef __FreeBSD__ if (kmutex->km_ownerthread != curthread->td_proc) { #else if (kmutex->km_ownerthread != curproc) { #endif -#ifdef __FreeBSD__ mtx_unlock(&ntoskrnl_dispatchlock); -#else /* __NetBSD__ */ - DISPATCH_UNLOCK(); -#endif return(STATUS_MUTANT_NOT_OWNED); } kmutex->km_acquirecnt--; @@ -2376,12 +2235,7 @@ kmutex->km_ownerthread = NULL; ntoskrnl_wakeup(&kmutex->km_header); } - -#ifdef __FreeBSD__ mtx_unlock(&ntoskrnl_dispatchlock); -#else /* __NetBSD__ */ - DISPATCH_UNLOCK(); -#endif return(kmutex->km_acquirecnt); } @@ -2406,24 +2260,11 @@ KeResetEvent(nt_kevent *kevent) { uint32_t prevstate; -#ifdef __NetBSD__ - int s; -#endif -#ifdef __NetBSD__ - DISPATCH_LOCK(); -#else mtx_lock(&ntoskrnl_dispatchlock); -#endif - prevstate = kevent->k_header.dh_sigstate; kevent->k_header.dh_sigstate = FALSE; - -#ifdef __FreeBSD__ mtx_unlock(&ntoskrnl_dispatchlock); -#else /* __NetBSD__ */ - DISPATCH_UNLOCK(); -#endif return(prevstate); } @@ -2435,24 +2276,11 @@ uint8_t kwait) { uint32_t prevstate; -#ifdef __NetBSD__ - int s; -#endif -#ifdef __NetBSD__ - DISPATCH_LOCK(); -#else mtx_lock(&ntoskrnl_dispatchlock); -#endif - prevstate = kevent->k_header.dh_sigstate; ntoskrnl_wakeup(&kevent->k_header); - -#ifdef __FreeBSD__ mtx_unlock(&ntoskrnl_dispatchlock); -#else /* __NetBSD__ */ - DISPATCH_UNLOCK(); -#endif return(prevstate); } @@ -2584,16 +2412,8 @@ PsTerminateSystemThread(ndis_status status) { struct nt_objref *nr; -#ifdef __NetBSD__ - int s; -#endif -#ifdef __NetBSD__ - DISPATCH_LOCK(); -#else mtx_lock(&ntoskrnl_dispatchlock); -#endif - TAILQ_FOREACH(nr, &ntoskrnl_reflist, link) { #ifdef __FreeBSD__ if (nr->no_obj != curthread->td_proc) @@ -2604,22 +2424,11 @@ ntoskrnl_wakeup(&nr->no_dh); break; } - -#ifdef __FreeBSD__ - mtx_unlock(&ntoskrnl_dispatchlock); -#else /* __NetBSD__ */ - DISPATCH_UNLOCK(); -#endif - ntoskrnl_kth--; + mtx_unlock(&ntoskrnl_dispatchlock); -#ifdef __FreeBSD__ -#if __FreeBSD_version < 502113 - mtx_lock(&Giant); -#endif -#endif /* __FreeBSD__ */ kthread_exit(0); - return(0); /* notreached */ + /* NOTREACHED */ } static uint32_t @@ -2652,19 +2461,8 @@ { ktimer *timer; struct timeval tv; -#ifdef __NetBSD__ - int s; -#endif -#ifdef __FreeBSD__ - mtx_unlock(&Giant); -#endif - -#ifdef __NetBSD__ - DISPATCH_LOCK(); -#else mtx_lock(&ntoskrnl_dispatchlock); -#endif timer = arg; @@ -2695,18 +2493,7 @@ KeInsertQueueDpc(timer->k_dpc, NULL, NULL); ntoskrnl_wakeup(&timer->k_header); - -#ifdef __FreeBSD__ mtx_unlock(&ntoskrnl_dispatchlock); -#else /* __NetBSD__ */ - DISPATCH_UNLOCK(); -#endif - -#ifdef __FreeBSD__ - mtx_lock(&Giant); -#endif - - return; } __stdcall void @@ -2803,19 +2590,11 @@ struct timeval tv; uint64_t curtime; uint8_t pending; -#ifdef __NetBSD__ - int s; -#endif if (timer == NULL) return(FALSE); -#ifdef __NetBSD__ - DISPATCH_LOCK(); -#else mtx_lock(&ntoskrnl_dispatchlock); -#endif - if (timer->k_header.dh_inserted == TRUE) { #ifdef __FreeBSD__ untimeout(ntoskrnl_timercall, timer, timer->k_handle); @@ -2853,12 +2632,7 @@ #else callout_reset(timer->k_handle, tvtohz(&tv), ntoskrnl_timercall, timer); #endif - -#ifdef __FreeBSD__ mtx_unlock(&ntoskrnl_dispatchlock); -#else /* __NetBSD__ */ - DISPATCH_UNLOCK(); -#endif return(pending); } @@ -2873,18 +2647,11 @@ KeCancelTimer(ktimer *timer) { uint8_t pending; -#ifdef __NetBSD__ - int s; -#endif if (timer == NULL) return(FALSE); -#ifdef __NetBSD__ - DISPATCH_LOCK(); -#else mtx_lock(&ntoskrnl_dispatchlock); -#endif if (timer->k_header.dh_inserted == TRUE) { #ifdef __FreeBSD__ @@ -2896,11 +2663,7 @@ } else pending = KeRemoveQueueDpc(timer->k_dpc); -#ifdef __FreeBSD__ mtx_unlock(&ntoskrnl_dispatchlock); -#else /* __NetBSD__ */ - DISPATCH_UNLOCK(); -#endif return(pending); } Index: src/sys/dev/if_ndis/if_ndis.c diff -u src/sys/dev/if_ndis/if_ndis.c:1.31 src/sys/dev/if_ndis/if_ndis.c:1.32 --- src/sys/dev/if_ndis/if_ndis.c:1.31 Mon Apr 5 07:20:24 2010 +++ src/sys/dev/if_ndis/if_ndis.c Sat May 14 12:44:15 2011 @@ -1,3 +1,5 @@ +/* $NetBSD: if_ndis.c,v 1.32 2011/05/14 12:44:15 rmind Exp $ */ + /*- * Copyright (c) 2003 * Bill Paul <wp...@windriver.com>. All rights reserved. @@ -35,7 +37,7 @@ __FBSDID("$FreeBSD: src/sys/dev/if_ndis/if_ndis.c,v 1.69.2.6 2005/03/31 04:24:36 wpaul Exp $"); #endif #ifdef __NetBSD__ -__KERNEL_RCSID(0, "$NetBSD: if_ndis.c,v 1.31 2010/04/05 07:20:24 joerg Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_ndis.c,v 1.32 2011/05/14 12:44:15 rmind Exp $"); #endif @@ -497,8 +499,8 @@ /* start out at dispatch level */ win_irql = DISPATCH_LEVEL; - simple_lock_init(&sc->ndis_mtx); - + mutex_init(&sc->ndis_mtx, MUTEX_DEFAULT, IPL_NET); + /* * Hook interrupt early, since calling the driver's * init routine may trigger an interrupt. Note that @@ -942,9 +944,11 @@ if (drv == NULL) panic("couldn't find driver object"); windrv_destroy_pdo(drv, dev); + /* * TODO: Unmap dma for NetBSD */ + mutex_destroy(&sc->ndis_mtx); return(0); } Index: src/sys/dev/if_ndis/if_ndisvar.h diff -u src/sys/dev/if_ndis/if_ndisvar.h:1.6 src/sys/dev/if_ndis/if_ndisvar.h:1.7 --- src/sys/dev/if_ndis/if_ndisvar.h:1.6 Wed Feb 24 18:16:50 2010 +++ src/sys/dev/if_ndis/if_ndisvar.h Sat May 14 12:44:16 2011 @@ -1,3 +1,5 @@ +/* $NetBSD: if_ndisvar.h,v 1.7 2011/05/14 12:44:16 rmind Exp $ */ + /*- * Copyright (c) 2003 * Bill Paul <wp...@windriver.com>. All rights reserved. @@ -182,7 +184,7 @@ #ifdef __FreeBSD__ struct mtx ndis_mtx; #else /* __NetBSD__ */ - struct simplelock ndis_mtx; + kmutex_t ndis_mtx; #endif device_t ndis_dev; int ndis_unit; @@ -228,19 +230,9 @@ int ndis_mmapcnt; }; -#ifdef __FreeBSD__ - #define NDIS_LOCK(_sc) mtx_lock(&(_sc)->ndis_mtx) #define NDIS_UNLOCK(_sc) mtx_unlock(&(_sc)->ndis_mtx) -#else /* __NetBSD__ */ - -#define NDIS_LOCK(_sc) do {s = spl_sc(); simple_lock(&(_sc)->ndis_mtx);} while(0) -#define NDIS_UNLOCK(_sc) do {simple_unlock(&(_sc)->ndis_mtx); splx(s);} while(0) -#define spl_sc() splnet() - -#endif - /*static*/ __stdcall void ndis_txeof (ndis_handle, ndis_packet *, ndis_status); /*static*/ __stdcall void ndis_rxeof (ndis_handle, ndis_packet **, uint32_t); /*static*/ __stdcall void ndis_linksts (ndis_handle, ndis_status, void *, uint32_t);