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