diff options
Diffstat (limited to 'sys/compat')
-rw-r--r-- | sys/compat/ndis/kern_ndis.c | 43 | ||||
-rw-r--r-- | sys/compat/ndis/ndis_var.h | 2 | ||||
-rw-r--r-- | sys/compat/ndis/subr_ndis.c | 5 |
3 files changed, 41 insertions, 9 deletions
diff --git a/sys/compat/ndis/kern_ndis.c b/sys/compat/ndis/kern_ndis.c index 94e340e..29eb774 100644 --- a/sys/compat/ndis/kern_ndis.c +++ b/sys/compat/ndis/kern_ndis.c @@ -58,6 +58,9 @@ __FBSDID("$FreeBSD$"); #include <net/if_dl.h> #include <net/if_media.h> +#include <net80211/ieee80211_var.h> +#include <net80211/ieee80211_ioctl.h> + #include <dev/pccard/pccardvar.h> #include "card_if.h" @@ -118,7 +121,11 @@ ndis_setdone_func(adapter, status) ndis_handle adapter; ndis_status status; { - printf ("Setup done... %x\n", status); + ndis_miniport_block *block; + block = adapter; + + block->nmb_setstat = status; + wakeup(&block->nmb_wkupdpctimer); return; } @@ -127,7 +134,11 @@ ndis_getdone_func(adapter, status) ndis_handle adapter; ndis_status status; { - printf ("Query done... %x\n", status); + ndis_miniport_block *block; + block = adapter; + + block->nmb_getstat = status; + wakeup(&block->nmb_wkupdpctimer); return; } @@ -603,6 +614,8 @@ ndis_set_info(arg, oid, buf, buflen) ndis_handle adapter; __stdcall ndis_setinfo_handler setfunc; uint32_t byteswritten = 0, bytesneeded = 0; + struct timeval tv; + int error; sc = arg; setfunc = sc->ndis_chars.nmc_setinfo_func; @@ -611,6 +624,14 @@ ndis_set_info(arg, oid, buf, buflen) rval = setfunc(adapter, oid, buf, *buflen, &byteswritten, &bytesneeded); + if (rval == NDIS_STATUS_PENDING) { + tv.tv_sec = 60; + tv.tv_usec = 0; + error = tsleep(&sc->ndis_block.nmb_wkupdpctimer, + PPAUSE|PCATCH, "ndis", tvtohz(&tv)); + rval = sc->ndis_block.nmb_setstat; + } + if (byteswritten) *buflen = byteswritten; if (bytesneeded) @@ -626,9 +647,6 @@ ndis_set_info(arg, oid, buf, buflen) rval == NDIS_STATUS_NOT_ACCEPTED) return(ENOTSUP); - if (rval == NDIS_STATUS_PENDING) - return(EAGAIN); - return(0); } @@ -922,6 +940,8 @@ ndis_get_info(arg, oid, buf, buflen) ndis_handle adapter; __stdcall ndis_queryinfo_handler queryfunc; uint32_t byteswritten = 0, bytesneeded = 0; + struct timeval tv; + int error; sc = arg; queryfunc = sc->ndis_chars.nmc_queryinfo_func; @@ -930,6 +950,16 @@ ndis_get_info(arg, oid, buf, buflen) rval = queryfunc(adapter, oid, buf, *buflen, &byteswritten, &bytesneeded); + /* Wait for requests that block. */ + + if (rval == NDIS_STATUS_PENDING) { + tv.tv_sec = 60; + tv.tv_usec = 0; + error = tsleep(&sc->ndis_block.nmb_wkupdpctimer, + PPAUSE|PCATCH, "ndis", tvtohz(&tv)); + rval = sc->ndis_block.nmb_getstat; + } + if (byteswritten) *buflen = byteswritten; if (bytesneeded) @@ -946,9 +976,6 @@ ndis_get_info(arg, oid, buf, buflen) rval == NDIS_STATUS_NOT_ACCEPTED) return(ENOTSUP); - if (rval == NDIS_STATUS_PENDING) - return(EAGAIN); - return(0); } diff --git a/sys/compat/ndis/ndis_var.h b/sys/compat/ndis/ndis_var.h index df6d3ce..c52ef46 100644 --- a/sys/compat/ndis/ndis_var.h +++ b/sys/compat/ndis/ndis_var.h @@ -1114,6 +1114,8 @@ struct ndis_miniport_block { int nmb_pciidx; device_t nmb_dev; ndis_resource_list *nmb_rlist; + ndis_status nmb_getstat; + ndis_status nmb_setstat; }; typedef ndis_status (*ndis_init_handler)(ndis_status *, uint32_t *, diff --git a/sys/compat/ndis/subr_ndis.c b/sys/compat/ndis/subr_ndis.c index 78d58c4..6a91ce7 100644 --- a/sys/compat/ndis/subr_ndis.c +++ b/sys/compat/ndis/subr_ndis.c @@ -79,6 +79,9 @@ __FBSDID("$FreeBSD$"); #include <machine/stdarg.h> +#include <net80211/ieee80211_var.h> +#include <net80211/ieee80211_ioctl.h> + #include <dev/pci/pcireg.h> #include <dev/pci/pcivar.h> @@ -647,7 +650,7 @@ ndis_create_lock(lock) mtx = malloc(sizeof(struct mtx), M_DEVBUF, M_NOWAIT|M_ZERO); if (mtx == NULL) return; - mtx_init(mtx, "ndislock", MTX_NETWORK_LOCK, + mtx_init(mtx, "ndislock", "ndis spin lock", MTX_DEF | MTX_RECURSE | MTX_DUPOK); lock->nsl_spinlock = (ndis_kspin_lock)mtx; |