diff options
author | wpaul <wpaul@FreeBSD.org> | 2004-03-20 23:39:43 +0000 |
---|---|---|
committer | wpaul <wpaul@FreeBSD.org> | 2004-03-20 23:39:43 +0000 |
commit | 8feaa1f4505bcdc10cab48f06ef55675e2d6e324 (patch) | |
tree | 72841d6e419cd16a5a3e5e680e94c78c55240be0 /sys/compat/ndis/ndis_var.h | |
parent | 3d191dfea63a2d293663b5cecc523c8f26014a0e (diff) | |
download | FreeBSD-src-8feaa1f4505bcdc10cab48f06ef55675e2d6e324.zip FreeBSD-src-8feaa1f4505bcdc10cab48f06ef55675e2d6e324.tar.gz |
- Rewrite the timer and event API routines in subr_ndis.c so that they
are actually layered on top of the KeTimer API in subr_ntoskrnl.c, just
as it is in Windows. This reduces code duplication and more closely
imitates the way things are done in Windows.
- Modify ndis_encode_parm() to deal with the case where we have
a registry key expressed as a hex value ("0x1") which is being
read via NdisReadConfiguration() as an int. Previously, we tried
to decode things like "0x1" with strtol() using a base of 10, which
would always yield 0. This is what was causing problems with the
Intel 2200BG Centrino 802.11g driver: the .inf file that comes
with it has a key called RadioEnable with a value of 0x1. We
incorrectly decoded this value to '0' when it was queried, hence
the driver thought we wanted the radio turned off.
- In if_ndis.c, most drivers don't accept NDIS_80211_AUTHMODE_AUTO,
but NDIS_80211_AUTHMODE_SHARED may not be right in some cases,
so for now always use NDIS_80211_AUTHMODE_OPEN.
NOTE: There is still one problem with the Intel 2200BG driver: it
happens that the kernel stack in Windows is larger than the kernel
stack in FreeBSD. The 2200BG driver sometimes eats up more than 2
pages of stack space, which can lead to a double fault panic.
For the moment, I got things to work by adding the following to
my kernel config file:
options KSTACK_PAGES=8
I'm pretty sure 8 is too big; I just picked this value out of a hat
as a test, and it happened to work, so I left it. 4 pages might be
enough. Unfortunately, I don't think you can dynamically give a
thread a larger stack, so I'm not sure how to handle this short of
putting a note in the man page about it and dealing with the flood
of mail from people who never read man pages.
Diffstat (limited to 'sys/compat/ndis/ndis_var.h')
-rw-r--r-- | sys/compat/ndis/ndis_var.h | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/sys/compat/ndis/ndis_var.h b/sys/compat/ndis/ndis_var.h index 4068816..47106d5 100644 --- a/sys/compat/ndis/ndis_var.h +++ b/sys/compat/ndis/ndis_var.h @@ -835,7 +835,7 @@ struct ndis_kevent { }; struct ndis_event { - struct ndis_kevent ne_event; + struct nt_kevent ne_event; }; typedef struct ndis_event ndis_event; @@ -858,8 +858,8 @@ struct ndis_kdpc { }; struct ndis_timer { - struct ndis_ktimer nt_timer; - struct ndis_kdpc nt_dpc; + struct ktimer nt_ktimer; + struct kdpc nt_kdpc; }; typedef struct ndis_timer ndis_timer; @@ -867,10 +867,11 @@ typedef struct ndis_timer ndis_timer; typedef void (*ndis_timer_function)(void *, void *, void *, void *); struct ndis_miniport_timer { - struct ndis_ktimer nmt_ktimer; - struct ndis_kdpc nmt_dpc; + struct ktimer nmt_ktimer; + struct kdpc nmt_kdpc; ndis_timer_function nmt_timerfunc; void *nmt_timerctx; + ndis_miniport_block *nmt_block; struct ndis_miniport_timer *nmt_nexttimer; }; |