diff options
Diffstat (limited to 'sys/compat')
-rw-r--r-- | sys/compat/ndis/kern_ndis.c | 9 | ||||
-rw-r--r-- | sys/compat/ndis/ndis_var.h | 2 | ||||
-rw-r--r-- | sys/compat/ndis/subr_hal.c | 6 | ||||
-rw-r--r-- | sys/compat/ndis/subr_ndis.c | 77 | ||||
-rw-r--r-- | sys/compat/ndis/subr_ntoskrnl.c | 49 |
5 files changed, 47 insertions, 96 deletions
diff --git a/sys/compat/ndis/kern_ndis.c b/sys/compat/ndis/kern_ndis.c index f138439..39a8be4 100644 --- a/sys/compat/ndis/kern_ndis.c +++ b/sys/compat/ndis/kern_ndis.c @@ -151,7 +151,8 @@ ndis_status_func(adapter, status, sbuf, slen) ndis_miniport_block *block; block = adapter; - device_printf (block->nmb_dev, "status: %x\n", status); + if (block->nmb_ifp->if_flags & IFF_DEBUG) + device_printf (block->nmb_dev, "status: %x\n", status); return; } @@ -162,7 +163,8 @@ ndis_statusdone_func(adapter) ndis_miniport_block *block; block = adapter; - device_printf (block->nmb_dev, "status complete\n"); + if (block->nmb_ifp->if_flags & IFF_DEBUG) + device_printf (block->nmb_dev, "status complete\n"); return; } @@ -201,7 +203,8 @@ ndis_resetdone_func(adapter, status, addressingreset) ndis_miniport_block *block; block = adapter; - device_printf (block->nmb_dev, "reset done...\n"); + if (block->nmb_ifp->if_flags & IFF_DEBUG) + device_printf (block->nmb_dev, "reset done...\n"); return; } diff --git a/sys/compat/ndis/ndis_var.h b/sys/compat/ndis/ndis_var.h index a0bb5d0..48432c0 100644 --- a/sys/compat/ndis/ndis_var.h +++ b/sys/compat/ndis/ndis_var.h @@ -443,7 +443,7 @@ typedef struct ndis_wlan_bssid_ex ndis_wlan_bssid_ex; struct ndis_80211_bssid_list_ex { uint32_t nblx_items; - ndis_wlan_bssid nblx_bssid[1]; + ndis_wlan_bssid_ex nblx_bssid[1]; }; typedef struct ndis_80211_bssid_list_ex ndis_80211_bssid_list_ex; diff --git a/sys/compat/ndis/subr_hal.c b/sys/compat/ndis/subr_hal.c index cc51c0a..6d9e0c0 100644 --- a/sys/compat/ndis/subr_hal.c +++ b/sys/compat/ndis/subr_hal.c @@ -82,6 +82,8 @@ __stdcall static void hal_unlock(/*kspin_lock *, uint8_t*/void); __stdcall static uint8_t hal_irql(void); __stdcall static void dummy (void); +extern struct mtx_pool *ndis_mtxpool; + __stdcall static void hal_stall_exec_cpu(usecs) uint32_t usecs; @@ -211,7 +213,7 @@ hal_lock(/*lock*/void) __asm__ __volatile__ ("" : "=c" (lock)); - mtx_lock((struct mtx *)*lock); + mtx_pool_lock(ndis_mtxpool, (struct mtx *)*lock); return(0); } @@ -223,7 +225,7 @@ hal_unlock(/*lock, newirql*/void) __asm__ __volatile__ ("" : "=c" (lock), "=d" (newiqrl)); - mtx_unlock((struct mtx *)*lock); + mtx_pool_unlock(ndis_mtxpool, (struct mtx *)*lock); return; } diff --git a/sys/compat/ndis/subr_ndis.c b/sys/compat/ndis/subr_ndis.c index 4dca682..429be6f 100644 --- a/sys/compat/ndis/subr_ndis.c +++ b/sys/compat/ndis/subr_ndis.c @@ -103,8 +103,9 @@ __FBSDID("$FreeBSD$"); #define __stdcall __attribute__((__stdcall__)) #define FUNC void(*)(void) -static struct mtx ndis_interlock; +static struct mtx *ndis_interlock; static char ndis_filepath[MAXPATHLEN]; +struct mtx_pool *ndis_mtxpool; SYSCTL_STRING(_hw, OID_AUTO, ndis_filepath, CTLFLAG_RW, ndis_filepath, MAXPATHLEN, "Path used by NdisOpenFile() to search for files"); @@ -278,17 +279,17 @@ __stdcall static void dummy(void); int ndis_libinit() { - mtx_init(&ndis_interlock, "ndislock", MTX_NETWORK_LOCK, - MTX_DEF | MTX_RECURSE | MTX_DUPOK); strcpy(ndis_filepath, "/compat/ndis"); - + ndis_mtxpool = mtx_pool_create("ndis mutex pool", + 1024, MTX_DEF | MTX_RECURSE | MTX_DUPOK);; + ndis_interlock = mtx_pool_alloc(ndis_mtxpool); return(0); } int ndis_libfini() { - mtx_destroy(&ndis_interlock); + mtx_pool_destroy(&ndis_mtxpool); return(0); } @@ -678,15 +679,7 @@ __stdcall static void ndis_create_lock(lock) ndis_spin_lock *lock; { - struct mtx *mtx; - - mtx = malloc(sizeof(struct mtx), M_DEVBUF, M_NOWAIT|M_ZERO); - if (mtx == NULL) - return; - mtx_init(mtx, "ndislock", "ndis spin lock", - MTX_DEF | MTX_RECURSE | MTX_DUPOK); - lock->nsl_spinlock = (ndis_kspin_lock)mtx; - + lock->nsl_spinlock = (ndis_kspin_lock)mtx_pool_alloc(ndis_mtxpool); return; } @@ -694,13 +687,7 @@ __stdcall static void ndis_destroy_lock(lock) ndis_spin_lock *lock; { - struct mtx *ndis_mtx; - - ndis_mtx = (struct mtx *)lock->nsl_spinlock; - mtx_destroy(ndis_mtx); - free(ndis_mtx, M_DEVBUF); - lock->nsl_spinlock = 0xdeadf00d; /* XXX */ - + /* We use a mutex pool, so this is a no-op. */ return; } @@ -708,32 +695,7 @@ __stdcall static void ndis_lock(lock) ndis_spin_lock *lock; { - if (lock == NULL) - return; - /* - * Workaround for certain broken NDIS drivers. I have - * encountered one case where a driver creates a spinlock - * within its DriverEntry() routine, which is then destroyed - * in its MiniportHalt() routine. This is a bug, because - * MiniportHalt() is meant to only destroy what MiniportInit() - * creates. This leads to the following problem: - * DriverEntry() <- spinlock created - * MiniportInit() <- NIC initialized - * MiniportHalt() <- NIC halted, spinlock destroyed - * MiniportInit() <- NIC initialized, spinlock not recreated - * NdisAcquireSpinLock(boguslock) <- panic - * To work around this, we poison the spinlock on destroy, and - * if we try to re-acquire the poison pill^Wspinlock, we init - * it again so subsequent calls will work. - * - * Drivers that behave in this way are likely not officially - * certified by Microsoft, since their I would expect the - * Microsoft NDIS test tool to catch mistakes like this. - */ - if (lock->nsl_spinlock == 0xdeadf00d) - ndis_create_lock(lock); - mtx_lock((struct mtx *)lock->nsl_spinlock); - + mtx_pool_lock(ndis_mtxpool, (struct mtx *)lock->nsl_spinlock); return; } @@ -741,10 +703,7 @@ __stdcall static void ndis_unlock(lock) ndis_spin_lock *lock; { - if (lock == NULL) - return; - mtx_unlock((struct mtx *)lock->nsl_spinlock); - + mtx_pool_unlock(ndis_mtxpool, (struct mtx *)lock->nsl_spinlock); return; } @@ -2102,13 +2061,13 @@ ndis_insert_head(head, entry, lock) { ndis_list_entry *flink; - mtx_lock((struct mtx *)lock->nsl_spinlock); + mtx_pool_lock(ndis_mtxpool, (struct mtx *)lock->nsl_spinlock); flink = head->nle_flink; entry->nle_flink = flink; entry->nle_blink = head; flink->nle_blink = entry; head->nle_flink = entry; - mtx_unlock((struct mtx *)lock->nsl_spinlock); + mtx_pool_unlock(ndis_mtxpool, (struct mtx *)lock->nsl_spinlock); return(flink); } @@ -2121,12 +2080,12 @@ ndis_remove_head(head, lock) ndis_list_entry *flink; ndis_list_entry *entry; - mtx_lock((struct mtx *)lock->nsl_spinlock); + mtx_pool_lock(ndis_mtxpool, (struct mtx *)lock->nsl_spinlock); entry = head->nle_flink; flink = entry->nle_flink; head->nle_flink = flink; flink->nle_blink = head; - mtx_unlock((struct mtx *)lock->nsl_spinlock); + mtx_pool_unlock(ndis_mtxpool, (struct mtx *)lock->nsl_spinlock); return(entry); } @@ -2139,13 +2098,13 @@ ndis_insert_tail(head, entry, lock) { ndis_list_entry *blink; - mtx_lock((struct mtx *)lock->nsl_spinlock); + mtx_pool_lock(ndis_mtxpool, (struct mtx *)lock->nsl_spinlock); blink = head->nle_blink; entry->nle_flink = head; entry->nle_blink = blink; blink->nle_flink = entry; head->nle_blink = entry; - mtx_unlock((struct mtx *)lock->nsl_spinlock); + mtx_pool_unlock(ndis_mtxpool, (struct mtx *)lock->nsl_spinlock); return(blink); } @@ -2165,9 +2124,9 @@ ndis_sync_with_intr(intr, syncfunc, syncctx) sc = (struct ndis_softc *)intr->ni_block->nmb_ifp; sync = syncfunc; - mtx_lock(&sc->ndis_intrmtx); + mtx_pool_lock(ndis_mtxpool, sc->ndis_intrmtx); rval = sync(syncctx); - mtx_unlock(&sc->ndis_intrmtx); + mtx_pool_unlock(ndis_mtxpool, sc->ndis_intrmtx); return(rval); } diff --git a/sys/compat/ndis/subr_ntoskrnl.c b/sys/compat/ndis/subr_ntoskrnl.c index 2c73d55..14a446b 100644 --- a/sys/compat/ndis/subr_ntoskrnl.c +++ b/sys/compat/ndis/subr_ntoskrnl.c @@ -122,22 +122,19 @@ __stdcall static void ntoskrnl_init_lock(kspin_lock *); __stdcall static void dummy(void); __stdcall static size_t ntoskrnl_memcmp(const void *, const void *, size_t); -static struct mtx ntoskrnl_interlock; +static struct mtx *ntoskrnl_interlock; +extern struct mtx_pool *ndis_mtxpool; int ntoskrnl_libinit() { - mtx_init(&ntoskrnl_interlock, "ntoskrnllock", "ntoskrnl interlock", - MTX_DEF | MTX_RECURSE); - + ntoskrnl_interlock = mtx_pool_alloc(ndis_mtxpool); return(0); } int ntoskrnl_libfini() { - mtx_destroy(&ntoskrnl_interlock); - return(0); } @@ -412,11 +409,7 @@ ntoskrnl_init_lookaside(lookaside, allocfunc, freefunc, else lookaside->nll_l.gl_freefunc = freefunc; - mtx = malloc(sizeof(struct mtx), M_DEVBUF, M_NOWAIT|M_ZERO); - if (mtx == NULL) - return; - mtx_init(mtx, "ndisnplook", "ndis lookaside lock", - MTX_DEF | MTX_RECURSE | MTX_DUPOK); + mtx = mtx_pool_alloc(ndis_mtxpool); lookaside->nll_obsoletelock = (kspin_lock)mtx; return; @@ -426,8 +419,6 @@ __stdcall static void ntoskrnl_delete_lookaside(lookaside) paged_lookaside_list *lookaside; { - mtx_destroy((struct mtx *)lookaside->nll_obsoletelock); - free((struct mtx *)lookaside->nll_obsoletelock, M_DEVBUF); return; } @@ -456,11 +447,7 @@ ntoskrnl_init_nplookaside(lookaside, allocfunc, freefunc, else lookaside->nll_l.gl_freefunc = freefunc; - mtx = malloc(sizeof(struct mtx), M_DEVBUF, M_NOWAIT|M_ZERO); - if (mtx == NULL) - return; - mtx_init(mtx, "ndisnplook", "ndis lookaside lock", - MTX_DEF | MTX_RECURSE | MTX_DUPOK); + mtx = mtx_pool_alloc(ndis_mtxpool); lookaside->nll_obsoletelock = (kspin_lock)mtx; return; @@ -470,8 +457,6 @@ __stdcall static void ntoskrnl_delete_nplookaside(lookaside) npaged_lookaside_list *lookaside; { - mtx_destroy((struct mtx *)lookaside->nll_obsoletelock); - free((struct mtx *)lookaside->nll_obsoletelock, M_DEVBUF); return; } @@ -492,11 +477,11 @@ ntoskrnl_push_slist(/*head, entry*/ void) __asm__ __volatile__ ("" : "=c" (head), "=d" (entry)); - mtx_lock(&ntoskrnl_interlock); + mtx_pool_lock(ndis_mtxpool, ntoskrnl_interlock); oldhead = head->slh_list.slh_next; entry->sl_next = head->slh_list.slh_next; head->slh_list.slh_next = entry; - mtx_unlock(&ntoskrnl_interlock); + mtx_pool_unlock(ndis_mtxpool, ntoskrnl_interlock); return(oldhead); } @@ -508,11 +493,11 @@ ntoskrnl_pop_slist(/*head*/ void) __asm__ __volatile__ ("" : "=c" (head)); - mtx_lock(&ntoskrnl_interlock); + mtx_pool_lock(ndis_mtxpool, ntoskrnl_interlock); first = head->slh_list.slh_next; if (first != NULL) head->slh_list.slh_next = first->sl_next; - mtx_unlock(&ntoskrnl_interlock); + mtx_pool_unlock(ndis_mtxpool, ntoskrnl_interlock); return(first); } @@ -526,11 +511,11 @@ ntoskrnl_push_slist_ex(/*head, entry,*/ lock) __asm__ __volatile__ ("" : "=c" (head), "=d" (entry)); - mtx_lock((struct mtx *)*lock); + mtx_pool_lock(ndis_mtxpool, (struct mtx *)*lock); oldhead = head->slh_list.slh_next; entry->sl_next = head->slh_list.slh_next; head->slh_list.slh_next = entry; - mtx_unlock((struct mtx *)*lock); + mtx_pool_unlock(ndis_mtxpool, (struct mtx *)*lock); return(oldhead); } @@ -543,11 +528,11 @@ ntoskrnl_pop_slist_ex(/*head, lock*/ void) __asm__ __volatile__ ("" : "=c" (head), "=d" (lock)); - mtx_lock((struct mtx *)*lock); + mtx_pool_lock(ndis_mtxpool, (struct mtx *)*lock); first = head->slh_list.slh_next; if (first != NULL) head->slh_list.slh_next = first->sl_next; - mtx_unlock((struct mtx *)*lock); + mtx_pool_unlock(ndis_mtxpool, (struct mtx *)*lock); return(first); } @@ -558,7 +543,8 @@ ntoskrnl_lock_dpc(/*lock*/ void) __asm__ __volatile__ ("" : "=c" (lock)); - mtx_lock((struct mtx *)*lock); + mtx_pool_lock(ndis_mtxpool, (struct mtx *)*lock); + return; } @@ -569,7 +555,8 @@ ntoskrnl_unlock_dpc(/*lock*/ void) __asm__ __volatile__ ("" : "=c" (lock)); - mtx_unlock((struct mtx *)*lock); + mtx_pool_unlock(ndis_mtxpool, (struct mtx *)*lock); + return; } @@ -635,7 +622,7 @@ __stdcall static void ntoskrnl_init_lock(lock) kspin_lock *lock; { - *lock = (kspin_lock)&ntoskrnl_interlock; + *lock = (kspin_lock)mtx_pool_alloc(ndis_mtxpool); return; } |