summaryrefslogtreecommitdiffstats
path: root/sys/compat
diff options
context:
space:
mode:
Diffstat (limited to 'sys/compat')
-rw-r--r--sys/compat/ndis/kern_ndis.c9
-rw-r--r--sys/compat/ndis/ndis_var.h2
-rw-r--r--sys/compat/ndis/subr_hal.c6
-rw-r--r--sys/compat/ndis/subr_ndis.c77
-rw-r--r--sys/compat/ndis/subr_ntoskrnl.c49
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;
}
OpenPOWER on IntegriCloud