aboutsummaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
Diffstat (limited to 'sys')
-rw-r--r--sys/compat/ndis/kern_ndis.c34
-rw-r--r--sys/compat/ndis/ndis_var.h2
-rw-r--r--sys/compat/ndis/subr_ndis.c3
-rw-r--r--sys/dev/if_ndis/if_ndis.c73
4 files changed, 58 insertions, 54 deletions
diff --git a/sys/compat/ndis/kern_ndis.c b/sys/compat/ndis/kern_ndis.c
index eb62ed85edc5..34b7b9619da5 100644
--- a/sys/compat/ndis/kern_ndis.c
+++ b/sys/compat/ndis/kern_ndis.c
@@ -316,7 +316,6 @@ ndis_stop_thread(t)
int t;
{
struct ndis_req *r;
- struct timeval tv;
struct ndisqhead *q;
struct proc *p;
@@ -343,9 +342,7 @@ ndis_stop_thread(t)
/* wait for thread exit */
- tv.tv_sec = 60;
- tv.tv_usec = 0;
- tsleep(r, PPAUSE|PCATCH, "ndisthrexit", tvtohz(&tv));
+ tsleep(r, PPAUSE|PCATCH, "ndisthrexit", hz * 60);
/* Now empty the job list. */
@@ -565,6 +562,7 @@ ndis_resetdone_func(adapter, status, addressingreset)
if (block->nmb_ifp->if_flags & IFF_DEBUG)
device_printf (block->nmb_dev, "reset done...\n");
+ wakeup(block->nmb_ifp);
return;
}
@@ -1035,7 +1033,6 @@ 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;
@@ -1051,10 +1048,10 @@ ndis_set_info(arg, 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, "ndisset", tvtohz(&tv));
+ PROC_LOCK(curthread->td_proc);
+ error = msleep(&sc->ndis_block.nmb_wkupdpctimer,
+ &curthread->td_proc->p_mtx, PPAUSE|PDROP,
+ "ndisset", 5 * hz);
rval = sc->ndis_block.nmb_setstat;
}
@@ -1211,6 +1208,7 @@ ndis_reset_nic(arg)
__stdcall ndis_reset_handler resetfunc;
uint8_t addressing_reset;
struct ifnet *ifp;
+ int rval;
sc = arg;
ifp = &sc->arpcom.ac_if;
@@ -1221,7 +1219,12 @@ ndis_reset_nic(arg)
if (adapter == NULL || resetfunc == NULL)
return(EIO);
- resetfunc(&addressing_reset, adapter);
+ rval = resetfunc(&addressing_reset, adapter);
+ if (rval == NDIS_STATUS_PENDING) {
+ PROC_LOCK(curthread->td_proc);
+ msleep(sc, &curthread->td_proc->p_mtx,
+ PPAUSE|PDROP, "ndisrst", 0);
+ }
return(0);
}
@@ -1438,7 +1441,6 @@ 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;
@@ -1456,10 +1458,10 @@ ndis_get_info(arg, oid, buf, buflen)
/* 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, "ndisget", tvtohz(&tv));
+ PROC_LOCK(curthread->td_proc);
+ error = msleep(&sc->ndis_block.nmb_wkupdpctimer,
+ &curthread->td_proc->p_mtx, PPAUSE|PDROP,
+ "ndisget", 5 * hz);
rval = sc->ndis_block.nmb_getstat;
}
@@ -1503,7 +1505,7 @@ ndis_unload_driver(arg)
return(0);
}
-#define NDIS_LOADED 0x42534F44
+#define NDIS_LOADED htonl(0x42534F44)
int
ndis_load_driver(img, arg)
diff --git a/sys/compat/ndis/ndis_var.h b/sys/compat/ndis/ndis_var.h
index 3c3de043e90f..cd4d82b92627 100644
--- a/sys/compat/ndis/ndis_var.h
+++ b/sys/compat/ndis/ndis_var.h
@@ -1459,7 +1459,7 @@ typedef ndis_status (*ndis_sendmulti_handler)(ndis_handle,
ndis_packet **, uint32_t);
typedef void (*ndis_isr_handler)(uint8_t *, uint8_t *, ndis_handle);
typedef void (*ndis_interrupt_handler)(ndis_handle);
-typedef void (*ndis_reset_handler)(uint8_t *, ndis_handle);
+typedef int (*ndis_reset_handler)(uint8_t *, ndis_handle);
typedef void (*ndis_halt_handler)(ndis_handle);
typedef void (*ndis_return_handler)(ndis_handle, ndis_packet *);
typedef void (*ndis_enable_interrupts_handler)(ndis_handle);
diff --git a/sys/compat/ndis/subr_ndis.c b/sys/compat/ndis/subr_ndis.c
index ba6f285b267c..38bc6b8b5ea0 100644
--- a/sys/compat/ndis/subr_ndis.c
+++ b/sys/compat/ndis/subr_ndis.c
@@ -1037,7 +1037,7 @@ ndis_query_resources(status, adapter, list, buflen)
return;
}
- bcopy((char *)block->nmb_rlist, (char *)list, *buflen);
+ bcopy((char *)block->nmb_rlist, (char *)list, rsclen);
*status = NDIS_STATUS_SUCCESS;
return;
}
@@ -2483,6 +2483,7 @@ ndis_open_file(status, filehandle, filelength, filename, highestaddr)
mtx_unlock(&Giant);
*status = NDIS_STATUS_FILE_NOT_FOUND;
free(fh, M_TEMP);
+ printf("NDIS: open file %s failed: %d\n", path, error);
return;
}
diff --git a/sys/dev/if_ndis/if_ndis.c b/sys/dev/if_ndis/if_ndis.c
index ddb7c50cae68..901b3134b6a0 100644
--- a/sys/dev/if_ndis/if_ndis.c
+++ b/sys/dev/if_ndis/if_ndis.c
@@ -425,9 +425,6 @@ ndis_attach(dev)
if (!(sc->ndis_block.nmb_flags & NDIS_ATTRIBUTE_DESERIALIZE))
sc->ndis_block.nmb_pktind_func = ndis_rxeof_serial;
- /* Reset the adapter. */
- ndis_reset_nic(sc);
-
/*
* Get station address from the driver.
*/
@@ -496,7 +493,7 @@ ndis_attach(dev)
if (sc->ndis_80211) {
struct ieee80211com *ic = (void *)ifp;
ndis_80211_config config;
- ndis_80211_rates rates;
+ ndis_80211_rates_ex rates;
struct ndis_80211_nettype_list *ntl;
uint32_t arg;
int r;
@@ -550,6 +547,20 @@ nonettypes:
* if this is not 802.11b we're just going to be faking it
* all up to heck.
*/
+
+#define TESTSETRATE(x, y) \
+ do { \
+ int i; \
+ for (i = 0; i < ic->ic_sup_rates[x].rs_nrates; i++) { \
+ if (ic->ic_sup_rates[x].rs_rates[i] == (y)) \
+ break; \
+ } \
+ if (i == ic->ic_sup_rates[x].rs_nrates) { \
+ ic->ic_sup_rates[x].rs_rates[i] = (y); \
+ ic->ic_sup_rates[x].rs_nrates++; \
+ } \
+ } while (0)
+
#define SETRATE(x, y) \
ic->ic_sup_rates[x].rs_rates[ic->ic_sup_rates[x].rs_nrates] = (y)
#define INCRATE(x) \
@@ -601,24 +612,16 @@ nonettypes:
* we detect turbo modes, though?
*/
if (ic->ic_modecaps & (1<<IEEE80211_MODE_11G)) {
- SETRATE(IEEE80211_MODE_11G, 47);
- INCRATE(IEEE80211_MODE_11G);
- SETRATE(IEEE80211_MODE_11G, 72);
- INCRATE(IEEE80211_MODE_11G);
- SETRATE(IEEE80211_MODE_11G, 96);
- INCRATE(IEEE80211_MODE_11G);
- SETRATE(IEEE80211_MODE_11G, 108);
- INCRATE(IEEE80211_MODE_11G);
+ TESTSETRATE(IEEE80211_MODE_11G, 47);
+ TESTSETRATE(IEEE80211_MODE_11G, 72);
+ TESTSETRATE(IEEE80211_MODE_11G, 96);
+ TESTSETRATE(IEEE80211_MODE_11G, 108);
}
if (ic->ic_modecaps & (1<<IEEE80211_MODE_11A)) {
- SETRATE(IEEE80211_MODE_11A, 47);
- INCRATE(IEEE80211_MODE_11A);
- SETRATE(IEEE80211_MODE_11A, 72);
- INCRATE(IEEE80211_MODE_11A);
- SETRATE(IEEE80211_MODE_11A, 96);
- INCRATE(IEEE80211_MODE_11A);
- SETRATE(IEEE80211_MODE_11A, 108);
- INCRATE(IEEE80211_MODE_11A);
+ TESTSETRATE(IEEE80211_MODE_11A, 47);
+ TESTSETRATE(IEEE80211_MODE_11A, 72);
+ TESTSETRATE(IEEE80211_MODE_11A, 96);
+ TESTSETRATE(IEEE80211_MODE_11A, 108);
}
#undef SETRATE
#undef INCRATE
@@ -648,6 +651,7 @@ nonettypes:
if (r == 0)
ic->ic_caps |= IEEE80211_C_PMGT;
i = sizeof(config);
+ bzero((char *)&config, sizeof(config));
config.nc_length = i;
config.nc_fhconfig.ncf_length = sizeof(ndis_80211_config_fh);
r = ndis_get_info(sc, OID_802_11_CONFIGURATION, &config, &i);
@@ -687,12 +691,9 @@ nonettypes:
fail:
if (error)
ndis_detach(dev);
- else {
+ else
/* We're done talking to the NIC for now; halt it. */
- ifp->if_flags |= IFF_UP;
ndis_halt_nic(sc);
- ifp->if_flags &= ~IFF_UP;
- }
return(error);
}
@@ -1114,8 +1115,7 @@ ndis_intr(arg)
sc = arg;
ifp = &sc->arpcom.ac_if;
- if (!(ifp->if_flags & IFF_UP) ||
- sc->ndis_block.nmb_miniportadapterctx == NULL)
+ if (sc->ndis_block.nmb_miniportadapterctx == NULL)
return;
mtx_pool_lock(ndis_mtxpool, sc->ndis_intrmtx);
@@ -1127,7 +1127,7 @@ ndis_intr(arg)
}
mtx_pool_unlock(ndis_mtxpool, sc->ndis_intrmtx);
- if ((is_our_intr || call_isr) && (ifp->if_flags & IFF_UP))
+ if ((is_our_intr || call_isr))
ndis_sched(ndis_intrtask, ifp, NDIS_SWI);
return;
@@ -1158,6 +1158,16 @@ ndis_ticktask(xsc)
sc = xsc;
+ hangfunc = sc->ndis_chars.nmc_checkhang_func;
+
+ if (hangfunc != NULL) {
+ rval = hangfunc(sc->ndis_block.nmb_miniportadapterctx);
+ if (rval == TRUE) {
+ ndis_reset_nic(sc);
+ return;
+ }
+ }
+
len = sizeof(linkstate);
error = ndis_get_info(sc, OID_GEN_MEDIA_CONNECT_STATUS,
(void *)&linkstate, &len);
@@ -1180,14 +1190,6 @@ ndis_ticktask(xsc)
NDIS_UNLOCK(sc);
- hangfunc = sc->ndis_chars.nmc_checkhang_func;
-
- if (hangfunc != NULL) {
- rval = hangfunc(sc->ndis_block.nmb_miniportadapterctx);
- if (rval == TRUE)
- ndis_reset_nic(sc);
- }
-
return;
}
@@ -1378,7 +1380,6 @@ ndis_init(xsc)
/*
* Cancel pending I/O and free all RX/TX buffers.
*/
- ndis_reset_nic(sc);
ndis_stop(sc);
if (ndis_init_nic(sc))
return;