Updated to the latest NDIS code. I added commented out lines in the files
arch/i386/conf/GENERIC, arch/i386/conf/files.i386 and dev/pci/files.pci which can simply be uncommented to compile NDIS into the kernel. I'll write some documentation on this soon. Note that NDIS is still somewhat experimental. It is currently tested and functions relatively well on on two cards: 1. Dell (Broadcom) TrueMobile 1400 Dual Band WLAN Mini-PCI 2. Intel EtherExpress Pro/100
This commit is contained in:
parent
6f0360f3e9
commit
ace2baad8b
@ -1,4 +1,4 @@
|
|||||||
# $NetBSD: GENERIC,v 1.737 2006/03/28 20:58:40 pavel Exp $
|
# $NetBSD: GENERIC,v 1.738 2006/03/31 00:03:57 rittera Exp $
|
||||||
#
|
#
|
||||||
# GENERIC machine description file
|
# GENERIC machine description file
|
||||||
#
|
#
|
||||||
@ -22,7 +22,7 @@ include "arch/i386/conf/std.i386"
|
|||||||
|
|
||||||
options INCLUDE_CONFIG_FILE # embed config file in kernel binary
|
options INCLUDE_CONFIG_FILE # embed config file in kernel binary
|
||||||
|
|
||||||
#ident "GENERIC-$Revision: 1.737 $"
|
#ident "GENERIC-$Revision: 1.738 $"
|
||||||
|
|
||||||
maxusers 32 # estimated number of users
|
maxusers 32 # estimated number of users
|
||||||
|
|
||||||
@ -146,6 +146,8 @@ options COMPAT_FREEBSD # binary compatibility with FreeBSD
|
|||||||
#options COMPAT_MACH # binary compatibility with Mach binaries
|
#options COMPAT_MACH # binary compatibility with Mach binaries
|
||||||
#options COMPAT_DARWIN # binary compatibility with Darwin binaries
|
#options COMPAT_DARWIN # binary compatibility with Darwin binaries
|
||||||
#options EXEC_MACHO # exec MACH-O binaries
|
#options EXEC_MACHO # exec MACH-O binaries
|
||||||
|
#options COMPAT_NDIS # NDIS network driver
|
||||||
|
#makeoptions CFLAGS+="-DNDIS_DRV_DATA=\"ndis_data\""
|
||||||
#options COMPAT_PECOFF # kernel support to run Win32 apps
|
#options COMPAT_PECOFF # kernel support to run Win32 apps
|
||||||
options COMPAT_BSDPTY # /dev/[pt]ty?? ptys.
|
options COMPAT_BSDPTY # /dev/[pt]ty?? ptys.
|
||||||
|
|
||||||
@ -820,6 +822,7 @@ iwi* at pci? dev ? function ? # Intel PRO/Wireless 2200BG
|
|||||||
le* at pci? dev ? function ? # PCnet-PCI Ethernet
|
le* at pci? dev ? function ? # PCnet-PCI Ethernet
|
||||||
lmc* at pci? dev ? function ? # Lan Media Corp SSI/HSSI/DS3
|
lmc* at pci? dev ? function ? # Lan Media Corp SSI/HSSI/DS3
|
||||||
mtd* at pci? dev ? function ? # Myson MTD803 3-in-1 Ethernet
|
mtd* at pci? dev ? function ? # Myson MTD803 3-in-1 Ethernet
|
||||||
|
#ndis* at pci? dev ? function ? # Experimental - NDIS Network Driver
|
||||||
ne* at pci? dev ? function ? # NE2000-compatible Ethernet
|
ne* at pci? dev ? function ? # NE2000-compatible Ethernet
|
||||||
nfe* at pci? dev ? function ? # NVIDIA nForce Ethernet
|
nfe* at pci? dev ? function ? # NVIDIA nForce Ethernet
|
||||||
ntwoc* at pci? dev ? function ? # Riscom/N2 PCI Sync Serial
|
ntwoc* at pci? dev ? function ? # Riscom/N2 PCI Sync Serial
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# $NetBSD: files.i386,v 1.283 2006/03/17 12:19:49 jmcneill Exp $
|
# $NetBSD: files.i386,v 1.284 2006/03/31 00:03:57 rittera Exp $
|
||||||
#
|
#
|
||||||
# new style config file for i386 architecture
|
# new style config file for i386 architecture
|
||||||
#
|
#
|
||||||
@ -383,6 +383,9 @@ file arch/i386/i386/freebsd_machdep.c compat_freebsd
|
|||||||
file arch/i386/i386/freebsd_sigcode.S compat_freebsd
|
file arch/i386/i386/freebsd_sigcode.S compat_freebsd
|
||||||
file arch/i386/i386/freebsd_syscall.c compat_freebsd
|
file arch/i386/i386/freebsd_syscall.c compat_freebsd
|
||||||
|
|
||||||
|
# NDIS compatibilty (COMPAT_NDIS)
|
||||||
|
# include "compat/ndis/files.ndis"
|
||||||
|
|
||||||
# Win32 binary compatibility (COMPAT_PECOFF)
|
# Win32 binary compatibility (COMPAT_PECOFF)
|
||||||
include "compat/pecoff/files.pecoff"
|
include "compat/pecoff/files.pecoff"
|
||||||
|
|
||||||
|
@ -36,8 +36,8 @@
|
|||||||
#define _CFG_VAR_H_
|
#define _CFG_VAR_H_
|
||||||
|
|
||||||
struct ndis_cfg {
|
struct ndis_cfg {
|
||||||
char *nc_cfgkey;
|
const char *nc_cfgkey;
|
||||||
char *nc_cfgdesc;
|
const char *nc_cfgdesc;
|
||||||
char nc_val[256];
|
char nc_val[256];
|
||||||
int nc_idx;
|
int nc_idx;
|
||||||
};
|
};
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -31,7 +31,12 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
|
#ifdef __FreeBSD__
|
||||||
__FBSDID("$FreeBSD: src/sys/compat/ndis/kern_windrv.c,v 1.3.2.2 2005/03/31 04:24:35 wpaul Exp $");
|
__FBSDID("$FreeBSD: src/sys/compat/ndis/kern_windrv.c,v 1.3.2.2 2005/03/31 04:24:35 wpaul Exp $");
|
||||||
|
#endif
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
__KERNEL_RCSID(0, "$NetBSD: kern_windrv.c,v 1.2 2006/03/31 00:03:57 rittera Exp $");
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <sys/systm.h>
|
#include <sys/systm.h>
|
||||||
@ -41,11 +46,15 @@ __FBSDID("$FreeBSD: src/sys/compat/ndis/kern_windrv.c,v 1.3.2.2 2005/03/31 04:24
|
|||||||
#include <sys/kernel.h>
|
#include <sys/kernel.h>
|
||||||
#include <sys/malloc.h>
|
#include <sys/malloc.h>
|
||||||
#include <sys/lock.h>
|
#include <sys/lock.h>
|
||||||
|
#ifdef __FreeBSD__
|
||||||
#include <sys/mutex.h>
|
#include <sys/mutex.h>
|
||||||
#include <sys/module.h>
|
#include <sys/module.h>
|
||||||
|
#endif /* __FreeBSD__ */
|
||||||
#include <sys/conf.h>
|
#include <sys/conf.h>
|
||||||
#include <sys/mbuf.h>
|
#include <sys/mbuf.h>
|
||||||
|
#ifdef __FreeBSD__
|
||||||
#include <sys/bus.h>
|
#include <sys/bus.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <sys/queue.h>
|
#include <sys/queue.h>
|
||||||
|
|
||||||
@ -133,11 +142,14 @@ windrv_libfini(void)
|
|||||||
driver_object *
|
driver_object *
|
||||||
windrv_lookup(img, name)
|
windrv_lookup(img, name)
|
||||||
vm_offset_t img;
|
vm_offset_t img;
|
||||||
char *name;
|
const char *name;
|
||||||
{
|
{
|
||||||
struct drvdb_ent *d;
|
struct drvdb_ent *d;
|
||||||
unicode_string us;
|
unicode_string us;
|
||||||
|
|
||||||
|
printf("In windrv_lookup():\n");
|
||||||
|
printf("name = %s\n", name);
|
||||||
|
|
||||||
/* Damn unicode. */
|
/* Damn unicode. */
|
||||||
|
|
||||||
if (name != NULL) {
|
if (name != NULL) {
|
||||||
@ -145,14 +157,25 @@ windrv_lookup(img, name)
|
|||||||
us.us_maxlen = strlen(name) * 2;
|
us.us_maxlen = strlen(name) * 2;
|
||||||
us.us_buf = NULL;
|
us.us_buf = NULL;
|
||||||
ndis_ascii_to_unicode(name, &us.us_buf);
|
ndis_ascii_to_unicode(name, &us.us_buf);
|
||||||
|
} else {
|
||||||
|
us.us_len = 0;
|
||||||
|
us.us_maxlen = 0;
|
||||||
|
us.us_buf = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
mtx_lock(&drvdb_mtx);
|
mtx_lock(&drvdb_mtx);
|
||||||
STAILQ_FOREACH(d, &drvdb_head, link) {
|
STAILQ_FOREACH(d, &drvdb_head, link) {
|
||||||
if (d->windrv_object->dro_driverstart == (void *)img ||
|
#ifdef NDIS_LKM
|
||||||
bcmp((char *)d->windrv_object->dro_drivername.us_buf,
|
printf("d->windrv_object->dro_driverstart = %x\n", d->windrv_object->dro_driverstart);
|
||||||
(char *)us.us_buf, us.us_len) == 0) {
|
#endif
|
||||||
mtx_unlock(&drvdb_mtx);
|
if (d->windrv_object->dro_driverstart == (void *)img ||
|
||||||
|
(bcmp((char *)d->windrv_object->dro_drivername.us_buf,
|
||||||
|
(char *)us.us_buf, us.us_len) == 0 && us.us_len > 0)) {
|
||||||
|
mtx_unlock(&drvdb_mtx);
|
||||||
|
printf("found driver object!\n");
|
||||||
|
#ifdef NDIS_LKM
|
||||||
|
printf("returning %x\n", d->windrv_object);
|
||||||
|
#endif
|
||||||
return(d->windrv_object);
|
return(d->windrv_object);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -161,6 +184,7 @@ windrv_lookup(img, name)
|
|||||||
if (name != NULL)
|
if (name != NULL)
|
||||||
ExFreePool(us.us_buf);
|
ExFreePool(us.us_buf);
|
||||||
|
|
||||||
|
printf("no driver object\n");
|
||||||
return(NULL);
|
return(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -237,34 +261,48 @@ windrv_load(mod, img, len)
|
|||||||
struct driver_object *drv;
|
struct driver_object *drv;
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
|
#ifdef NDIS_LKM
|
||||||
|
printf("in windrv_load\n");
|
||||||
|
printf("img = %x\n", img);
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* First step: try to relocate and dynalink the executable
|
* First step: try to relocate and dynalink the executable
|
||||||
* driver image.
|
* driver image.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Perform text relocation */
|
/* Perform text relocation */
|
||||||
if (pe_relocate(img))
|
if (pe_relocate(img)) {
|
||||||
return(ENOEXEC);
|
return(ENOEXEC);
|
||||||
|
}
|
||||||
|
|
||||||
/* Dynamically link the NDIS.SYS routines -- required. */
|
/* Dynamically link the NDIS.SYS routines -- required. */
|
||||||
if (pe_patch_imports(img, "NDIS", ndis_functbl))
|
if (pe_patch_imports(img, "NDIS", ndis_functbl)) {
|
||||||
return(ENOEXEC);
|
return(ENOEXEC);
|
||||||
|
}
|
||||||
|
|
||||||
/* Dynamically link the HAL.dll routines -- also required. */
|
/* Dynamically link the HAL.dll routines -- also required. */
|
||||||
if (pe_patch_imports(img, "HAL", hal_functbl))
|
if (pe_patch_imports(img, "HAL", hal_functbl)) {
|
||||||
return(ENOEXEC);
|
return(ENOEXEC);
|
||||||
|
}
|
||||||
|
|
||||||
/* Dynamically link ntoskrnl.exe -- optional. */
|
/* Dynamically link ntoskrnl.exe -- optional. */
|
||||||
if (pe_get_import_descriptor(img, &imp_desc, "ntoskrnl") == 0) {
|
if (pe_get_import_descriptor(img, &imp_desc, "ntoskrnl") == 0) {
|
||||||
if (pe_patch_imports(img, "ntoskrnl", ntoskrnl_functbl))
|
if (pe_patch_imports(img, "ntoskrnl", ntoskrnl_functbl))
|
||||||
return(ENOEXEC);
|
return(ENOEXEC);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Dynamically link USBD.SYS -- optional */
|
/* Dynamically link USBD.SYS -- optional */
|
||||||
if (pe_get_import_descriptor(img, &imp_desc, "USBD") == 0) {
|
if (pe_get_import_descriptor(img, &imp_desc, "USBD") == 0) {
|
||||||
if (pe_patch_imports(img, "USBD", usbd_functbl))
|
#if ubsimplemented
|
||||||
|
if (pe_patch_imports(img, "USBD", usbd_functbl)) {
|
||||||
return(ENOEXEC);
|
return(ENOEXEC);
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
//printf("windrv_load: pe_get_import_descriptor USBD failed");
|
||||||
|
return(ENOEXEC);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
/* Next step: find the driver entry point. */
|
/* Next step: find the driver entry point. */
|
||||||
|
|
||||||
@ -386,7 +424,12 @@ windrv_find_pdo(drv, bsddev)
|
|||||||
device_t bsddev;
|
device_t bsddev;
|
||||||
{
|
{
|
||||||
device_object *pdo;
|
device_object *pdo;
|
||||||
|
#ifdef NDIS_LKM
|
||||||
|
printf("In windrv_find_pdo: \ndrv = %x", drv);
|
||||||
|
printf("\nbsddev = %x", bsddev);
|
||||||
|
printf("\npdo = %x", drv->dro_devobj);
|
||||||
|
printf("\npdo->do_devext = %x\n", drv->dro_devobj->do_devext);
|
||||||
|
#endif
|
||||||
mtx_lock(&drvdb_mtx);
|
mtx_lock(&drvdb_mtx);
|
||||||
pdo = drv->dro_devobj;
|
pdo = drv->dro_devobj;
|
||||||
if (pdo->do_devext != bsddev) {
|
if (pdo->do_devext != bsddev) {
|
||||||
@ -406,7 +449,7 @@ windrv_find_pdo(drv, bsddev)
|
|||||||
int
|
int
|
||||||
windrv_bus_attach(drv, name)
|
windrv_bus_attach(drv, name)
|
||||||
driver_object *drv;
|
driver_object *drv;
|
||||||
char *name;
|
const char *name;
|
||||||
{
|
{
|
||||||
struct drvdb_ent *new;
|
struct drvdb_ent *new;
|
||||||
|
|
||||||
@ -418,6 +461,14 @@ windrv_bus_attach(drv, name)
|
|||||||
drv->dro_drivername.us_maxlen = strlen(name) * 2;
|
drv->dro_drivername.us_maxlen = strlen(name) * 2;
|
||||||
drv->dro_drivername.us_buf = NULL;
|
drv->dro_drivername.us_buf = NULL;
|
||||||
ndis_ascii_to_unicode(name, &drv->dro_drivername.us_buf);
|
ndis_ascii_to_unicode(name, &drv->dro_drivername.us_buf);
|
||||||
|
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
/* I added this because windrv_lookup was getting
|
||||||
|
* fake_pccard_driver and fake_pci_driver mixed up.
|
||||||
|
* I'm not sure if it will mess anything else up.
|
||||||
|
*/
|
||||||
|
drv->dro_driverstart = drv;
|
||||||
|
#endif
|
||||||
|
|
||||||
new->windrv_object = drv;
|
new->windrv_object = drv;
|
||||||
new->windrv_devlist = NULL;
|
new->windrv_devlist = NULL;
|
||||||
|
@ -1557,7 +1557,7 @@ extern image_patch_table ndis_functbl[];
|
|||||||
__BEGIN_DECLS
|
__BEGIN_DECLS
|
||||||
extern int ndis_libinit(void);
|
extern int ndis_libinit(void);
|
||||||
extern int ndis_libfini(void);
|
extern int ndis_libfini(void);
|
||||||
extern int ndis_ascii_to_unicode(char *, uint16_t **);
|
extern int ndis_ascii_to_unicode(const char *, uint16_t **);
|
||||||
extern int ndis_unicode_to_ascii(uint16_t *, int, char **);
|
extern int ndis_unicode_to_ascii(uint16_t *, int, char **);
|
||||||
extern int ndis_load_driver(vm_offset_t, void *);
|
extern int ndis_load_driver(vm_offset_t, void *);
|
||||||
extern int ndis_unload_driver(void *);
|
extern int ndis_unload_driver(void *);
|
||||||
@ -1578,17 +1578,25 @@ extern int ndis_halt_nic(void *);
|
|||||||
extern int ndis_shutdown_nic(void *);
|
extern int ndis_shutdown_nic(void *);
|
||||||
extern int ndis_init_nic(void *);
|
extern int ndis_init_nic(void *);
|
||||||
extern int ndis_isr(void *, int *, int *);
|
extern int ndis_isr(void *, int *, int *);
|
||||||
|
#ifdef __FreeBSD__
|
||||||
extern void ndis_return_packet(void *, void *);
|
extern void ndis_return_packet(void *, void *);
|
||||||
|
#else
|
||||||
|
extern void ndis_return_packet(struct mbuf *, caddr_t, size_t, void *);
|
||||||
|
#endif
|
||||||
extern void ndis_enable_intr(void *);
|
extern void ndis_enable_intr(void *);
|
||||||
extern void ndis_disable_intr(void *);
|
extern void ndis_disable_intr(void *);
|
||||||
extern int ndis_init_dma(void *);
|
extern int ndis_init_dma(void *);
|
||||||
extern int ndis_destroy_dma(void *);
|
extern int ndis_destroy_dma(void *);
|
||||||
extern int ndis_create_sysctls(void *);
|
extern int ndis_create_sysctls(void *);
|
||||||
extern int ndis_add_sysctl(void *, char *, char *, char *, int);
|
extern int ndis_add_sysctl(void *, const char *, const char *, const char *, int);
|
||||||
extern int ndis_flush_sysctls(void *);
|
extern int ndis_flush_sysctls(void *);
|
||||||
extern int ndis_sched(void (*)(void *), void *, int);
|
extern int ndis_sched(void (*)(void *), void *, int);
|
||||||
extern int ndis_unsched(void (*)(void *), void *, int);
|
extern int ndis_unsched(void (*)(void *), void *, int);
|
||||||
|
#ifdef __FreeBSD__
|
||||||
extern int ndis_thsuspend(struct proc *, struct mtx *, int);
|
extern int ndis_thsuspend(struct proc *, struct mtx *, int);
|
||||||
|
#else /* __NetBSD__ */
|
||||||
|
extern int ndis_thsuspend(struct proc *, struct simplelock *, int);
|
||||||
|
#endif
|
||||||
extern void ndis_thresume(struct proc *);
|
extern void ndis_thresume(struct proc *);
|
||||||
extern int ndis_strcasecmp(const char *, const char *);
|
extern int ndis_strcasecmp(const char *, const char *);
|
||||||
extern int ndis_strncasecmp(const char *, const char *, size_t);
|
extern int ndis_strncasecmp(const char *, const char *, size_t);
|
||||||
|
@ -299,8 +299,20 @@ typedef struct nt_dispatch_header nt_dispatch_header;
|
|||||||
#define AT_DISPATCH_LEVEL(td) \
|
#define AT_DISPATCH_LEVEL(td) \
|
||||||
((td)->td_base_pri == PI_REALTIME)
|
((td)->td_base_pri == PI_REALTIME)
|
||||||
#else
|
#else
|
||||||
|
|
||||||
|
/* TODO: What is the best way to do this? */
|
||||||
|
|
||||||
|
int win_irql;
|
||||||
|
#define AT_DISPATCH_LEVEL(useless) \
|
||||||
|
(win_irql == DISPATCH_LEVEL)
|
||||||
|
|
||||||
|
/*
|
||||||
#define AT_DISPATCH_LEVEL(useless) \
|
#define AT_DISPATCH_LEVEL(useless) \
|
||||||
curlwp->l_priority == 0
|
curlwp->l_priority > IPL_NONE
|
||||||
|
|
||||||
|
#define AT_DISPATCH_LEVEL(useless) \
|
||||||
|
TRUE
|
||||||
|
*/
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define AT_DIRQL_LEVEL(td) \
|
#define AT_DIRQL_LEVEL(td) \
|
||||||
@ -342,8 +354,8 @@ struct ktimer {
|
|||||||
list_entry k_timerlistentry;
|
list_entry k_timerlistentry;
|
||||||
#ifdef __FreeBSD__
|
#ifdef __FreeBSD__
|
||||||
struct callout_handle k_handle;
|
struct callout_handle k_handle;
|
||||||
#else
|
#else /* __NetBSD__ */
|
||||||
struct callout k_handle;
|
struct callout *k_handle;
|
||||||
#endif
|
#endif
|
||||||
} u;
|
} u;
|
||||||
void *k_dpc;
|
void *k_dpc;
|
||||||
@ -581,6 +593,10 @@ struct device_object {
|
|||||||
uint16_t do_spare1;
|
uint16_t do_spare1;
|
||||||
struct devobj_extension *do_devobj_ext;
|
struct devobj_extension *do_devobj_ext;
|
||||||
void *do_rsvd;
|
void *do_rsvd;
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
struct ndis_softc *fdo_sc;
|
||||||
|
struct ndis_softc *pdo_sc;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct device_object device_object;
|
typedef struct device_object device_object;
|
||||||
@ -1164,6 +1180,7 @@ typedef struct driver_object driver_object;
|
|||||||
* Windows stack is larger, so we need to give our threads more
|
* Windows stack is larger, so we need to give our threads more
|
||||||
* stack pages. 4 should be enough, we use 8 just to extra safe.
|
* stack pages. 4 should be enough, we use 8 just to extra safe.
|
||||||
*/
|
*/
|
||||||
|
/* This is also defined in nbcompat.c */
|
||||||
#define NDIS_KSTACK_PAGES 8
|
#define NDIS_KSTACK_PAGES 8
|
||||||
|
|
||||||
extern image_patch_table ntoskrnl_functbl[];
|
extern image_patch_table ntoskrnl_functbl[];
|
||||||
@ -1172,13 +1189,13 @@ typedef void (*funcptr)(void);
|
|||||||
__BEGIN_DECLS
|
__BEGIN_DECLS
|
||||||
extern int windrv_libinit(void);
|
extern int windrv_libinit(void);
|
||||||
extern int windrv_libfini(void);
|
extern int windrv_libfini(void);
|
||||||
extern driver_object *windrv_lookup(vm_offset_t, char *);
|
extern driver_object *windrv_lookup(vm_offset_t, const char *);
|
||||||
extern int windrv_load(module_t, vm_offset_t, int);
|
extern int windrv_load(module_t, vm_offset_t, int);
|
||||||
extern int windrv_unload(module_t, vm_offset_t, int);
|
extern int windrv_unload(module_t, vm_offset_t, int);
|
||||||
extern int windrv_create_pdo(driver_object *, device_t);
|
extern int windrv_create_pdo(driver_object *, device_t);
|
||||||
extern void windrv_destroy_pdo(driver_object *, device_t);
|
extern void windrv_destroy_pdo(driver_object *, device_t);
|
||||||
extern device_object *windrv_find_pdo(driver_object *, device_t);
|
extern device_object *windrv_find_pdo(driver_object *, device_t);
|
||||||
extern int windrv_bus_attach(driver_object *, char *);
|
extern int windrv_bus_attach(driver_object *, const char *);
|
||||||
extern int windrv_wrap(funcptr, funcptr *);
|
extern int windrv_wrap(funcptr, funcptr *);
|
||||||
extern int windrv_unwrap(funcptr);
|
extern int windrv_unwrap(funcptr);
|
||||||
|
|
||||||
|
@ -408,9 +408,9 @@ typedef struct message_resource_entry message_resource_entry;
|
|||||||
#define MESSAGE_RESOURCE_UNICODE 0x0001
|
#define MESSAGE_RESOURCE_UNICODE 0x0001
|
||||||
|
|
||||||
struct image_patch_table {
|
struct image_patch_table {
|
||||||
char *ipt_name;
|
const char *ipt_name;
|
||||||
void (*ipt_func)(void);
|
void (*ipt_func)(void);
|
||||||
void (*ipt_wrap)(void);
|
void (*ipt_wrap)(void);
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct image_patch_table image_patch_table;
|
typedef struct image_patch_table image_patch_table;
|
||||||
@ -568,8 +568,8 @@ extern vm_offset_t pe_directory_offset(vm_offset_t, uint32_t);
|
|||||||
extern vm_offset_t pe_translate_addr (vm_offset_t, vm_offset_t);
|
extern vm_offset_t pe_translate_addr (vm_offset_t, vm_offset_t);
|
||||||
extern int pe_get_section(vm_offset_t, image_section_header *, const char *);
|
extern int pe_get_section(vm_offset_t, image_section_header *, const char *);
|
||||||
extern int pe_relocate(vm_offset_t);
|
extern int pe_relocate(vm_offset_t);
|
||||||
extern int pe_get_import_descriptor(vm_offset_t, image_import_descriptor *, char *);
|
extern int pe_get_import_descriptor(vm_offset_t, image_import_descriptor *, const char *);
|
||||||
extern int pe_patch_imports(vm_offset_t, char *, image_patch_table *);
|
extern int pe_patch_imports(vm_offset_t, const char *, image_patch_table *);
|
||||||
extern int pe_get_messagetable(vm_offset_t, message_resource_data **);
|
extern int pe_get_messagetable(vm_offset_t, message_resource_data **);
|
||||||
extern int pe_get_message(vm_offset_t, uint32_t, char **, int *, uint16_t *);
|
extern int pe_get_message(vm_offset_t, uint32_t, char **, int *, uint16_t *);
|
||||||
__END_DECLS
|
__END_DECLS
|
||||||
|
@ -35,7 +35,7 @@
|
|||||||
__FBSDID("$FreeBSD: src/sys/compat/ndis/subr_hal.c,v 1.13.2.3 2005/03/31 04:24:35 wpaul Exp $");
|
__FBSDID("$FreeBSD: src/sys/compat/ndis/subr_hal.c,v 1.13.2.3 2005/03/31 04:24:35 wpaul Exp $");
|
||||||
#endif
|
#endif
|
||||||
#ifdef __NetBSD__
|
#ifdef __NetBSD__
|
||||||
__KERNEL_RCSID(0, "$NetBSD: subr_hal.c,v 1.2 2006/03/30 23:06:56 rittera Exp $");
|
__KERNEL_RCSID(0, "$NetBSD: subr_hal.c,v 1.3 2006/03/31 00:03:57 rittera Exp $");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
@ -344,13 +344,17 @@ KeQueryPerformanceCounter(freq)
|
|||||||
return((uint64_t)ticks);
|
return((uint64_t)ticks);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int old_ipl;
|
||||||
|
static int ipl_raised = FALSE;
|
||||||
|
|
||||||
__fastcall uint8_t
|
__fastcall uint8_t
|
||||||
KfRaiseIrql(REGARGS1(uint8_t irql))
|
KfRaiseIrql(REGARGS1(uint8_t irql))
|
||||||
{
|
{
|
||||||
uint8_t oldirql;
|
uint8_t oldirql = 0;
|
||||||
#ifdef __NetBSD__
|
//#ifdef __NetBSD__
|
||||||
uint8_t s;
|
// uint8_t s;
|
||||||
#endif
|
//#endif
|
||||||
|
|
||||||
if (irql < KeGetCurrentIrql())
|
if (irql < KeGetCurrentIrql())
|
||||||
panic("IRQL_NOT_LESS_THAN");
|
panic("IRQL_NOT_LESS_THAN");
|
||||||
@ -358,10 +362,13 @@ KfRaiseIrql(REGARGS1(uint8_t irql))
|
|||||||
if (KeGetCurrentIrql() == DISPATCH_LEVEL)
|
if (KeGetCurrentIrql() == DISPATCH_LEVEL)
|
||||||
return(DISPATCH_LEVEL);
|
return(DISPATCH_LEVEL);
|
||||||
#ifdef __NetBSD__
|
#ifdef __NetBSD__
|
||||||
SCHED_LOCK(s);
|
if(irql >= DISPATCH_LEVEL && !ipl_raised) {
|
||||||
oldirql = curlwp->l_priority;
|
old_ipl = splsoftclock();
|
||||||
SCHED_UNLOCK(s);
|
ipl_raised = TRUE;
|
||||||
#else
|
oldirql = win_irql;
|
||||||
|
win_irql = irql;
|
||||||
|
}
|
||||||
|
#else /* __FreeBSD__ */
|
||||||
mtx_lock_spin(&sched_lock);
|
mtx_lock_spin(&sched_lock);
|
||||||
oldirql = curthread->td_base_pri;
|
oldirql = curthread->td_base_pri;
|
||||||
sched_prio(curthread, PI_REALTIME);
|
sched_prio(curthread, PI_REALTIME);
|
||||||
@ -369,7 +376,7 @@ KfRaiseIrql(REGARGS1(uint8_t irql))
|
|||||||
curthread->td_base_pri = PI_REALTIME;
|
curthread->td_base_pri = PI_REALTIME;
|
||||||
#endif
|
#endif
|
||||||
mtx_unlock_spin(&sched_lock);
|
mtx_unlock_spin(&sched_lock);
|
||||||
#endif /* __NetBSD__ */
|
#endif /* __FreeBSD__ */
|
||||||
|
|
||||||
return(oldirql);
|
return(oldirql);
|
||||||
}
|
}
|
||||||
@ -377,20 +384,27 @@ KfRaiseIrql(REGARGS1(uint8_t irql))
|
|||||||
__fastcall void
|
__fastcall void
|
||||||
KfLowerIrql(REGARGS1(uint8_t oldirql))
|
KfLowerIrql(REGARGS1(uint8_t oldirql))
|
||||||
{
|
{
|
||||||
#ifdef __NetBSD__
|
//#ifdef __NetBSD__
|
||||||
uint8_t s;
|
// uint8_t s;
|
||||||
#endif
|
//#endif
|
||||||
|
|
||||||
if (oldirql == DISPATCH_LEVEL)
|
if (oldirql == DISPATCH_LEVEL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
#ifdef __FreeBSD__
|
||||||
if (KeGetCurrentIrql() != DISPATCH_LEVEL)
|
if (KeGetCurrentIrql() != DISPATCH_LEVEL)
|
||||||
panic("IRQL_NOT_GREATER_THAN");
|
panic("IRQL_NOT_GREATER_THAN");
|
||||||
|
#else /* __NetBSD__ */
|
||||||
|
if (KeGetCurrentIrql() < oldirql)
|
||||||
|
panic("IRQL_NOT_GREATER_THAN");
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __NetBSD__
|
#ifdef __NetBSD__
|
||||||
SCHED_LOCK(s);
|
if(oldirql < DISPATCH_LEVEL && ipl_raised) {
|
||||||
curlwp->l_priority = oldirql;
|
splx(old_ipl);
|
||||||
SCHED_UNLOCK(s);
|
ipl_raised = FALSE;
|
||||||
|
win_irql = oldirql;
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
mtx_lock_spin(&sched_lock);
|
mtx_lock_spin(&sched_lock);
|
||||||
#if __FreeBSD_version < 600000
|
#if __FreeBSD_version < 600000
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -35,7 +35,7 @@
|
|||||||
__FBSDID("$FreeBSD: src/sys/compat/ndis/subr_ntoskrnl.c,v 1.43.2.5 2005/03/31 04:24:36 wpaul Exp $");
|
__FBSDID("$FreeBSD: src/sys/compat/ndis/subr_ntoskrnl.c,v 1.43.2.5 2005/03/31 04:24:36 wpaul Exp $");
|
||||||
#endif
|
#endif
|
||||||
#ifdef __NetBSD__
|
#ifdef __NetBSD__
|
||||||
__KERNEL_RCSID(0, "$NetBSD: subr_ntoskrnl.c,v 1.2 2006/03/30 23:06:56 rittera Exp $");
|
__KERNEL_RCSID(0, "$NetBSD: subr_ntoskrnl.c,v 1.3 2006/03/31 00:03:57 rittera Exp $");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __FreeBSD__
|
#ifdef __FreeBSD__
|
||||||
@ -63,6 +63,7 @@ __KERNEL_RCSID(0, "$NetBSD: subr_ntoskrnl.c,v 1.2 2006/03/30 23:06:56 rittera Ex
|
|||||||
#include <sys/module.h>
|
#include <sys/module.h>
|
||||||
#else
|
#else
|
||||||
#include <sys/lkm.h>
|
#include <sys/lkm.h>
|
||||||
|
#include <sys/callout.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <machine/atomic.h>
|
#include <machine/atomic.h>
|
||||||
@ -97,9 +98,17 @@ __KERNEL_RCSID(0, "$NetBSD: subr_ntoskrnl.c,v 1.2 2006/03/30 23:06:56 rittera Ex
|
|||||||
#include <compat/ndis/hal_var.h>
|
#include <compat/ndis/hal_var.h>
|
||||||
#include <compat/ndis/resource_var.h>
|
#include <compat/ndis/resource_var.h>
|
||||||
#include <compat/ndis/ndis_var.h>
|
#include <compat/ndis/ndis_var.h>
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
#include <compat/ndis/nbcompat.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#define __regparm __attribute__((regparm(3)))
|
#define __regparm __attribute__((regparm(3)))
|
||||||
|
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
/* Turn on DbgPrint() from Windows Driver*/
|
||||||
|
#define boothowto AB_VERBOSE
|
||||||
|
#endif
|
||||||
|
|
||||||
__stdcall static uint8_t RtlEqualUnicodeString(ndis_unicode_string *,
|
__stdcall static uint8_t RtlEqualUnicodeString(ndis_unicode_string *,
|
||||||
ndis_unicode_string *, uint8_t);
|
ndis_unicode_string *, uint8_t);
|
||||||
__stdcall static void RtlCopyUnicodeString(ndis_unicode_string *,
|
__stdcall static void RtlCopyUnicodeString(ndis_unicode_string *,
|
||||||
@ -210,7 +219,14 @@ static uint32_t DbgPrint(char *, ...);
|
|||||||
__stdcall static void DbgBreakPoint(void);
|
__stdcall static void DbgBreakPoint(void);
|
||||||
__stdcall static void dummy(void);
|
__stdcall static void dummy(void);
|
||||||
|
|
||||||
|
#ifdef __FreeBSD__
|
||||||
static struct mtx ntoskrnl_dispatchlock;
|
static struct mtx ntoskrnl_dispatchlock;
|
||||||
|
#else /* __NetBSD__ */
|
||||||
|
static struct simplelock ntoskrnl_dispatchlock;
|
||||||
|
#define DISPATCH_LOCK() do {s = splnet(); simple_lock(&ntoskrnl_dispatchlock);} while(0)
|
||||||
|
#define DISPATCH_UNLOCK() do {simple_unlock(&ntoskrnl_dispatchlock); splx(s);} while(0)
|
||||||
|
#endif
|
||||||
|
|
||||||
static kspin_lock ntoskrnl_global;
|
static kspin_lock ntoskrnl_global;
|
||||||
static kspin_lock ntoskrnl_cancellock;
|
static kspin_lock ntoskrnl_cancellock;
|
||||||
static int ntoskrnl_kth = 0;
|
static int ntoskrnl_kth = 0;
|
||||||
@ -225,9 +241,12 @@ int
|
|||||||
ntoskrnl_libinit()
|
ntoskrnl_libinit()
|
||||||
{
|
{
|
||||||
image_patch_table *patch;
|
image_patch_table *patch;
|
||||||
|
#ifdef __FreeBSD__
|
||||||
mtx_init(&ntoskrnl_dispatchlock,
|
mtx_init(&ntoskrnl_dispatchlock,
|
||||||
"ntoskrnl dispatch lock", MTX_NDIS_LOCK, MTX_DEF);
|
"ntoskrnl dispatch lock", MTX_NDIS_LOCK, MTX_DEF);
|
||||||
|
#else /* __NetBSD__ */
|
||||||
|
simple_lock_init(&ntoskrnl_dispatchlock);
|
||||||
|
#endif
|
||||||
KeInitializeSpinLock(&ntoskrnl_global);
|
KeInitializeSpinLock(&ntoskrnl_global);
|
||||||
KeInitializeSpinLock(&ntoskrnl_cancellock);
|
KeInitializeSpinLock(&ntoskrnl_cancellock);
|
||||||
TAILQ_INIT(&ntoskrnl_reflist);
|
TAILQ_INIT(&ntoskrnl_reflist);
|
||||||
@ -440,14 +459,17 @@ IoGetDriverObjectExtension(drv, clid)
|
|||||||
list_entry *e;
|
list_entry *e;
|
||||||
custom_extension *ce;
|
custom_extension *ce;
|
||||||
|
|
||||||
|
printf("in IoGetDriverObjectExtension\n");
|
||||||
|
|
||||||
e = drv->dro_driverext->dre_usrext.nle_flink;
|
e = drv->dro_driverext->dre_usrext.nle_flink;
|
||||||
while (e != &drv->dro_driverext->dre_usrext) {
|
while (e != &drv->dro_driverext->dre_usrext) {
|
||||||
ce = (custom_extension *)e;
|
ce = (custom_extension *)e;
|
||||||
if (ce->ce_clid == clid)
|
if (ce->ce_clid == clid)
|
||||||
|
printf("found\n");
|
||||||
return((void *)(ce + 1));
|
return((void *)(ce + 1));
|
||||||
e = e->nle_flink;
|
e = e->nle_flink;
|
||||||
}
|
}
|
||||||
|
printf("not found\n");
|
||||||
return(NULL);
|
return(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -463,8 +485,15 @@ IoCreateDevice(drv, devextlen, devname, devtype, devchars, exclusive, newdev)
|
|||||||
device_object **newdev;
|
device_object **newdev;
|
||||||
{
|
{
|
||||||
device_object *dev;
|
device_object *dev;
|
||||||
|
|
||||||
|
#ifdef NDIS_LKM
|
||||||
|
printf("In IoCreateDevice: drv = %x, devextlen = %x\n", drv, devextlen);
|
||||||
|
#endif
|
||||||
|
|
||||||
dev = ExAllocatePoolWithTag(NonPagedPool, sizeof(device_object), 0);
|
dev = ExAllocatePoolWithTag(NonPagedPool, sizeof(device_object), 0);
|
||||||
|
#ifdef NDIS_LKM
|
||||||
|
printf("dev = %x\n", dev);
|
||||||
|
#endif
|
||||||
if (dev == NULL)
|
if (dev == NULL)
|
||||||
return(STATUS_INSUFFICIENT_RESOURCES);
|
return(STATUS_INSUFFICIENT_RESOURCES);
|
||||||
|
|
||||||
@ -795,17 +824,30 @@ IoMakeAssociatedIrp(ip, stsize)
|
|||||||
uint8_t stsize;
|
uint8_t stsize;
|
||||||
{
|
{
|
||||||
irp *associrp;
|
irp *associrp;
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
int s;
|
||||||
|
#endif
|
||||||
|
|
||||||
associrp = IoAllocateIrp(stsize, FALSE);
|
associrp = IoAllocateIrp(stsize, FALSE);
|
||||||
if (associrp == NULL)
|
if (associrp == NULL)
|
||||||
return(NULL);
|
return(NULL);
|
||||||
|
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
DISPATCH_LOCK();
|
||||||
|
#else
|
||||||
mtx_lock(&ntoskrnl_dispatchlock);
|
mtx_lock(&ntoskrnl_dispatchlock);
|
||||||
|
#endif
|
||||||
|
|
||||||
associrp->irp_flags |= IRP_ASSOCIATED_IRP;
|
associrp->irp_flags |= IRP_ASSOCIATED_IRP;
|
||||||
associrp->irp_tail.irp_overlay.irp_thread =
|
associrp->irp_tail.irp_overlay.irp_thread =
|
||||||
ip->irp_tail.irp_overlay.irp_thread;
|
ip->irp_tail.irp_overlay.irp_thread;
|
||||||
associrp->irp_assoc.irp_master = ip;
|
associrp->irp_assoc.irp_master = ip;
|
||||||
|
|
||||||
|
#ifdef __FreeBSD__
|
||||||
mtx_unlock(&ntoskrnl_dispatchlock);
|
mtx_unlock(&ntoskrnl_dispatchlock);
|
||||||
|
#else /* __NetBSD__ */
|
||||||
|
DISPATCH_UNLOCK();
|
||||||
|
#endif
|
||||||
|
|
||||||
return(associrp);
|
return(associrp);
|
||||||
}
|
}
|
||||||
@ -988,13 +1030,26 @@ IoAttachDeviceToDeviceStack(src, dst)
|
|||||||
device_object *dst;
|
device_object *dst;
|
||||||
{
|
{
|
||||||
device_object *attached;
|
device_object *attached;
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
int s;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
DISPATCH_LOCK();
|
||||||
|
#else
|
||||||
mtx_lock(&ntoskrnl_dispatchlock);
|
mtx_lock(&ntoskrnl_dispatchlock);
|
||||||
|
#endif
|
||||||
|
|
||||||
attached = IoGetAttachedDevice(dst);
|
attached = IoGetAttachedDevice(dst);
|
||||||
attached->do_attacheddev = src;
|
attached->do_attacheddev = src;
|
||||||
src->do_attacheddev = NULL;
|
src->do_attacheddev = NULL;
|
||||||
src->do_stacksize = attached->do_stacksize + 1;
|
src->do_stacksize = attached->do_stacksize + 1;
|
||||||
|
|
||||||
|
#ifdef __FreeBSD__
|
||||||
mtx_unlock(&ntoskrnl_dispatchlock);
|
mtx_unlock(&ntoskrnl_dispatchlock);
|
||||||
|
#else /* __NetBSD__ */
|
||||||
|
DISPATCH_UNLOCK();
|
||||||
|
#endif
|
||||||
|
|
||||||
return(attached);
|
return(attached);
|
||||||
}
|
}
|
||||||
@ -1004,13 +1059,24 @@ IoDetachDevice(topdev)
|
|||||||
device_object *topdev;
|
device_object *topdev;
|
||||||
{
|
{
|
||||||
device_object *tail;
|
device_object *tail;
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
int s;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
DISPATCH_LOCK();
|
||||||
|
#else
|
||||||
mtx_lock(&ntoskrnl_dispatchlock);
|
mtx_lock(&ntoskrnl_dispatchlock);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* First, break the chain. */
|
/* First, break the chain. */
|
||||||
tail = topdev->do_attacheddev;
|
tail = topdev->do_attacheddev;
|
||||||
if (tail == NULL) {
|
if (tail == NULL) {
|
||||||
|
#ifdef __FreeBSD__
|
||||||
mtx_unlock(&ntoskrnl_dispatchlock);
|
mtx_unlock(&ntoskrnl_dispatchlock);
|
||||||
|
#else /* __NetBSD__ */
|
||||||
|
DISPATCH_UNLOCK();
|
||||||
|
#endif
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
topdev->do_attacheddev = tail->do_attacheddev;
|
topdev->do_attacheddev = tail->do_attacheddev;
|
||||||
@ -1024,7 +1090,11 @@ IoDetachDevice(topdev)
|
|||||||
tail = tail->do_attacheddev;
|
tail = tail->do_attacheddev;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __FreeBSD__
|
||||||
mtx_unlock(&ntoskrnl_dispatchlock);
|
mtx_unlock(&ntoskrnl_dispatchlock);
|
||||||
|
#else /* __NetBSD__ */
|
||||||
|
DISPATCH_UNLOCK();
|
||||||
|
#endif
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1047,6 +1117,7 @@ ntoskrnl_wakeup(arg)
|
|||||||
e = obj->dh_waitlisthead.nle_flink;
|
e = obj->dh_waitlisthead.nle_flink;
|
||||||
while (e != &obj->dh_waitlisthead) {
|
while (e != &obj->dh_waitlisthead) {
|
||||||
w = (wait_block *)e;
|
w = (wait_block *)e;
|
||||||
|
/* TODO: is this correct? */
|
||||||
#ifdef __FreeBSD__
|
#ifdef __FreeBSD__
|
||||||
td = w->wb_kthread;
|
td = w->wb_kthread;
|
||||||
ndis_thresume(td->td_proc);
|
ndis_thresume(td->td_proc);
|
||||||
@ -1070,8 +1141,14 @@ ntoskrnl_time(tval)
|
|||||||
uint64_t *tval;
|
uint64_t *tval;
|
||||||
{
|
{
|
||||||
struct timespec ts;
|
struct timespec ts;
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
struct timeval tv;
|
||||||
|
microtime(&tv);
|
||||||
|
TIMEVAL_TO_TIMESPEC(&tv,&ts);
|
||||||
|
#else
|
||||||
|
nanotime(&ts);
|
||||||
|
#endif
|
||||||
|
|
||||||
nanotime(&ts);
|
|
||||||
*tval = (uint64_t)ts.tv_nsec / 100 + (uint64_t)ts.tv_sec * 10000000 +
|
*tval = (uint64_t)ts.tv_nsec / 100 + (uint64_t)ts.tv_sec * 10000000 +
|
||||||
(uint64_t)11644473600ULL;
|
(uint64_t)11644473600ULL;
|
||||||
|
|
||||||
@ -1146,11 +1223,18 @@ KeWaitForSingleObject(obj, reason, mode, alertable, duetime)
|
|||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
int error = 0;
|
int error = 0;
|
||||||
uint64_t curtime;
|
uint64_t curtime;
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
int s;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (obj == NULL)
|
if (obj == NULL)
|
||||||
return(STATUS_INVALID_PARAMETER);
|
return(STATUS_INVALID_PARAMETER);
|
||||||
|
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
DISPATCH_LOCK();
|
||||||
|
#else
|
||||||
mtx_lock(&ntoskrnl_dispatchlock);
|
mtx_lock(&ntoskrnl_dispatchlock);
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* See if the object is a mutex. If so, and we already own
|
* See if the object is a mutex. If so, and we already own
|
||||||
@ -1177,13 +1261,23 @@ KeWaitForSingleObject(obj, reason, mode, alertable, duetime)
|
|||||||
#else
|
#else
|
||||||
km->km_ownerthread = curproc;
|
km->km_ownerthread = curproc;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef __FreeBSD__
|
||||||
mtx_unlock(&ntoskrnl_dispatchlock);
|
mtx_unlock(&ntoskrnl_dispatchlock);
|
||||||
|
#else /* __NetBSD__ */
|
||||||
|
DISPATCH_UNLOCK();
|
||||||
|
#endif
|
||||||
return (STATUS_SUCCESS);
|
return (STATUS_SUCCESS);
|
||||||
}
|
}
|
||||||
} else if (obj->dh_sigstate == TRUE) {
|
} else if (obj->dh_sigstate == TRUE) {
|
||||||
if (obj->dh_type == EVENT_TYPE_SYNC)
|
if (obj->dh_type == EVENT_TYPE_SYNC)
|
||||||
obj->dh_sigstate = FALSE;
|
obj->dh_sigstate = FALSE;
|
||||||
|
|
||||||
|
#ifdef __FreeBSD__
|
||||||
mtx_unlock(&ntoskrnl_dispatchlock);
|
mtx_unlock(&ntoskrnl_dispatchlock);
|
||||||
|
#else /* __NetBSD__ */
|
||||||
|
DISPATCH_UNLOCK();
|
||||||
|
#endif
|
||||||
return (STATUS_SUCCESS);
|
return (STATUS_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1232,7 +1326,11 @@ KeWaitForSingleObject(obj, reason, mode, alertable, duetime)
|
|||||||
|
|
||||||
if (error == EWOULDBLOCK) {
|
if (error == EWOULDBLOCK) {
|
||||||
REMOVE_LIST_ENTRY((&w.wb_waitlist));
|
REMOVE_LIST_ENTRY((&w.wb_waitlist));
|
||||||
|
#ifdef __FreeBSD__
|
||||||
mtx_unlock(&ntoskrnl_dispatchlock);
|
mtx_unlock(&ntoskrnl_dispatchlock);
|
||||||
|
#else /* __NetBSD__ */
|
||||||
|
DISPATCH_UNLOCK();
|
||||||
|
#endif
|
||||||
return(STATUS_TIMEOUT);
|
return(STATUS_TIMEOUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1258,8 +1356,12 @@ KeWaitForSingleObject(obj, reason, mode, alertable, duetime)
|
|||||||
if (obj->dh_type == EVENT_TYPE_SYNC)
|
if (obj->dh_type == EVENT_TYPE_SYNC)
|
||||||
obj->dh_sigstate = FALSE;
|
obj->dh_sigstate = FALSE;
|
||||||
REMOVE_LIST_ENTRY((&w.wb_waitlist));
|
REMOVE_LIST_ENTRY((&w.wb_waitlist));
|
||||||
|
|
||||||
|
#ifdef __FreeBSD__
|
||||||
mtx_unlock(&ntoskrnl_dispatchlock);
|
mtx_unlock(&ntoskrnl_dispatchlock);
|
||||||
|
#else /* __NetBSD__ */
|
||||||
|
DISPATCH_UNLOCK();
|
||||||
|
#endif
|
||||||
|
|
||||||
return(STATUS_SUCCESS);
|
return(STATUS_SUCCESS);
|
||||||
}
|
}
|
||||||
@ -1286,13 +1388,22 @@ KeWaitForMultipleObjects(cnt, obj, wtype, reason, mode,
|
|||||||
int i, wcnt = 0, widx = 0, error = 0;
|
int i, wcnt = 0, widx = 0, error = 0;
|
||||||
uint64_t curtime;
|
uint64_t curtime;
|
||||||
struct timespec t1, t2;
|
struct timespec t1, t2;
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
struct timeval tv1,tv2;
|
||||||
|
int s;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
if (cnt > MAX_WAIT_OBJECTS)
|
if (cnt > MAX_WAIT_OBJECTS)
|
||||||
return(STATUS_INVALID_PARAMETER);
|
return(STATUS_INVALID_PARAMETER);
|
||||||
if (cnt > THREAD_WAIT_OBJECTS && wb_array == NULL)
|
if (cnt > THREAD_WAIT_OBJECTS && wb_array == NULL)
|
||||||
return(STATUS_INVALID_PARAMETER);
|
return(STATUS_INVALID_PARAMETER);
|
||||||
|
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
DISPATCH_LOCK();
|
||||||
|
#else
|
||||||
mtx_lock(&ntoskrnl_dispatchlock);
|
mtx_lock(&ntoskrnl_dispatchlock);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (wb_array == NULL)
|
if (wb_array == NULL)
|
||||||
w = &_wb_array[0];
|
w = &_wb_array[0];
|
||||||
@ -1318,7 +1429,11 @@ KeWaitForMultipleObjects(cnt, obj, wtype, reason, mode,
|
|||||||
km->km_ownerthread = curproc;
|
km->km_ownerthread = curproc;
|
||||||
#endif
|
#endif
|
||||||
if (wtype == WAITTYPE_ANY) {
|
if (wtype == WAITTYPE_ANY) {
|
||||||
|
#ifdef __FreeBSD__
|
||||||
mtx_unlock(&ntoskrnl_dispatchlock);
|
mtx_unlock(&ntoskrnl_dispatchlock);
|
||||||
|
#else /* __NetBSD__ */
|
||||||
|
DISPATCH_UNLOCK();
|
||||||
|
#endif
|
||||||
return (STATUS_WAIT_0 + i);
|
return (STATUS_WAIT_0 + i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1326,7 +1441,11 @@ KeWaitForMultipleObjects(cnt, obj, wtype, reason, mode,
|
|||||||
if (obj[i]->dh_type == EVENT_TYPE_SYNC)
|
if (obj[i]->dh_type == EVENT_TYPE_SYNC)
|
||||||
obj[i]->dh_sigstate = FALSE;
|
obj[i]->dh_sigstate = FALSE;
|
||||||
if (wtype == WAITTYPE_ANY) {
|
if (wtype == WAITTYPE_ANY) {
|
||||||
|
#ifdef __FreeBSD__
|
||||||
mtx_unlock(&ntoskrnl_dispatchlock);
|
mtx_unlock(&ntoskrnl_dispatchlock);
|
||||||
|
#else /* __NetBSD__ */
|
||||||
|
DISPATCH_UNLOCK();
|
||||||
|
#endif
|
||||||
return (STATUS_WAIT_0 + i);
|
return (STATUS_WAIT_0 + i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1367,7 +1486,12 @@ KeWaitForMultipleObjects(cnt, obj, wtype, reason, mode,
|
|||||||
}
|
}
|
||||||
|
|
||||||
while (wcnt) {
|
while (wcnt) {
|
||||||
nanotime(&t1);
|
#ifdef __FreeBSD__
|
||||||
|
nanotime(&t1);
|
||||||
|
#else
|
||||||
|
microtime(&tv1);
|
||||||
|
TIMEVAL_TO_TIMESPEC(&tv1,&t1);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __FreeBSD__
|
#ifdef __FreeBSD__
|
||||||
error = ndis_thsuspend(td->td_proc, &ntoskrnl_dispatchlock,
|
error = ndis_thsuspend(td->td_proc, &ntoskrnl_dispatchlock,
|
||||||
@ -1376,7 +1500,12 @@ KeWaitForMultipleObjects(cnt, obj, wtype, reason, mode,
|
|||||||
error = ndis_thsuspend(curproc, &ntoskrnl_dispatchlock,
|
error = ndis_thsuspend(curproc, &ntoskrnl_dispatchlock,
|
||||||
duetime == NULL ? 0 : tvtohz(&tv));
|
duetime == NULL ? 0 : tvtohz(&tv));
|
||||||
#endif
|
#endif
|
||||||
nanotime(&t2);
|
#ifdef __FreeBSD__
|
||||||
|
nanotime(&t2);
|
||||||
|
#else
|
||||||
|
microtime(&tv2);
|
||||||
|
TIMEVAL_TO_TIMESPEC(&tv2,&t2);
|
||||||
|
#endif
|
||||||
|
|
||||||
for (i = 0; i < cnt; i++) {
|
for (i = 0; i < cnt; i++) {
|
||||||
if (obj[i]->dh_size == OTYPE_MUTEX) {
|
if (obj[i]->dh_size == OTYPE_MUTEX) {
|
||||||
@ -1415,16 +1544,28 @@ KeWaitForMultipleObjects(cnt, obj, wtype, reason, mode,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (error == EWOULDBLOCK) {
|
if (error == EWOULDBLOCK) {
|
||||||
|
#ifdef __FreeBSD__
|
||||||
mtx_unlock(&ntoskrnl_dispatchlock);
|
mtx_unlock(&ntoskrnl_dispatchlock);
|
||||||
|
#else /* __NetBSD__ */
|
||||||
|
DISPATCH_UNLOCK();
|
||||||
|
#endif
|
||||||
return(STATUS_TIMEOUT);
|
return(STATUS_TIMEOUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wtype == WAITTYPE_ANY && wcnt) {
|
if (wtype == WAITTYPE_ANY && wcnt) {
|
||||||
|
#ifdef __FreeBSD__
|
||||||
mtx_unlock(&ntoskrnl_dispatchlock);
|
mtx_unlock(&ntoskrnl_dispatchlock);
|
||||||
|
#else /* __NetBSD__ */
|
||||||
|
DISPATCH_UNLOCK();
|
||||||
|
#endif
|
||||||
return(STATUS_WAIT_0 + widx);
|
return(STATUS_WAIT_0 + widx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __FreeBSD__
|
||||||
mtx_unlock(&ntoskrnl_dispatchlock);
|
mtx_unlock(&ntoskrnl_dispatchlock);
|
||||||
|
#else /* __NetBSD__ */
|
||||||
|
DISPATCH_UNLOCK();
|
||||||
|
#endif
|
||||||
|
|
||||||
return(STATUS_SUCCESS);
|
return(STATUS_SUCCESS);
|
||||||
}
|
}
|
||||||
@ -1797,6 +1938,11 @@ ExQueryDepthSList(head)
|
|||||||
return(depth);
|
return(depth);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* TODO: Make sure that LOCKDEBUG isn't defined otherwise a "struct simplelock" will
|
||||||
|
* TODO: be more than 4 bytes. I'm using a kspin_lock as a simplelock, and the
|
||||||
|
* TODO: kspin lock is 4 bytes, so this is OK as long as LOCKDEBUG isn't defined.
|
||||||
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The KeInitializeSpinLock(), KefAcquireSpinLockAtDpcLevel()
|
* The KeInitializeSpinLock(), KefAcquireSpinLockAtDpcLevel()
|
||||||
* and KefReleaseSpinLockFromDpcLevel() appear to be analagous
|
* and KefReleaseSpinLockFromDpcLevel() appear to be analagous
|
||||||
@ -1808,7 +1954,11 @@ __stdcall void
|
|||||||
KeInitializeSpinLock(lock)
|
KeInitializeSpinLock(lock)
|
||||||
kspin_lock *lock;
|
kspin_lock *lock;
|
||||||
{
|
{
|
||||||
|
#ifdef __FreeBSD__
|
||||||
*lock = 0;
|
*lock = 0;
|
||||||
|
#else /* __NetBSD__ */
|
||||||
|
simple_lock_init((struct simplelock *)lock);
|
||||||
|
#endif
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1817,8 +1967,12 @@ KeInitializeSpinLock(lock)
|
|||||||
__fastcall void
|
__fastcall void
|
||||||
KefAcquireSpinLockAtDpcLevel(REGARGS1(kspin_lock *lock))
|
KefAcquireSpinLockAtDpcLevel(REGARGS1(kspin_lock *lock))
|
||||||
{
|
{
|
||||||
|
#ifdef __FreeBSD__
|
||||||
while (atomic_cmpset_acq_int((volatile u_int *)lock, 0, 1) == 0)
|
while (atomic_cmpset_acq_int((volatile u_int *)lock, 0, 1) == 0)
|
||||||
/* sit and spin */;
|
/* sit and spin */;
|
||||||
|
#else /* __NetBSD__ */
|
||||||
|
simple_lock((struct simplelock *)lock);
|
||||||
|
#endif
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1826,8 +1980,11 @@ KefAcquireSpinLockAtDpcLevel(REGARGS1(kspin_lock *lock))
|
|||||||
__fastcall void
|
__fastcall void
|
||||||
KefReleaseSpinLockFromDpcLevel(REGARGS1(kspin_lock *lock))
|
KefReleaseSpinLockFromDpcLevel(REGARGS1(kspin_lock *lock))
|
||||||
{
|
{
|
||||||
|
#ifdef __FreeBSD__
|
||||||
atomic_store_rel_int((volatile u_int *)lock, 0);
|
atomic_store_rel_int((volatile u_int *)lock, 0);
|
||||||
|
#else /* __NetBSD__ */
|
||||||
|
simple_unlock((struct simplelock *)lock);
|
||||||
|
#endif
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2195,16 +2352,45 @@ static int
|
|||||||
atoi(str)
|
atoi(str)
|
||||||
const char *str;
|
const char *str;
|
||||||
{
|
{
|
||||||
|
#ifdef __FreeBSD__
|
||||||
return (int)strtol(str, (char **)NULL, 10);
|
return (int)strtol(str, (char **)NULL, 10);
|
||||||
|
#else
|
||||||
|
int n;
|
||||||
|
|
||||||
|
for (n = 0; *str && *str >= '0' && *str <= '9'; str++)
|
||||||
|
n = n * 10 + *str - '0';
|
||||||
|
return n;
|
||||||
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static long
|
static long
|
||||||
atol(str)
|
atol(str)
|
||||||
const char *str;
|
const char *str;
|
||||||
{
|
{
|
||||||
|
#ifdef __FreeBSD__
|
||||||
return strtol(str, (char **)NULL, 10);
|
return strtol(str, (char **)NULL, 10);
|
||||||
|
#else
|
||||||
|
long n;
|
||||||
|
|
||||||
|
for (n = 0; *str && *str >= '0' && *str <= '9'; str++)
|
||||||
|
n = n * 10 + *str - '0';
|
||||||
|
return n;
|
||||||
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* stolen from ./netipsec/key.c
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
void srandom(int arg);
|
||||||
|
void srandom(int arg) {return;}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
rand(void)
|
rand(void)
|
||||||
{
|
{
|
||||||
@ -2281,13 +2467,26 @@ KeReleaseMutex(kmutex, kwait)
|
|||||||
kmutant *kmutex;
|
kmutant *kmutex;
|
||||||
uint8_t kwait;
|
uint8_t kwait;
|
||||||
{
|
{
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
int s;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
DISPATCH_LOCK();
|
||||||
|
#else
|
||||||
mtx_lock(&ntoskrnl_dispatchlock);
|
mtx_lock(&ntoskrnl_dispatchlock);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __FreeBSD__
|
#ifdef __FreeBSD__
|
||||||
if (kmutex->km_ownerthread != curthread->td_proc) {
|
if (kmutex->km_ownerthread != curthread->td_proc) {
|
||||||
#else
|
#else
|
||||||
if (kmutex->km_ownerthread != curproc) {
|
if (kmutex->km_ownerthread != curproc) {
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef __FreeBSD__
|
||||||
mtx_unlock(&ntoskrnl_dispatchlock);
|
mtx_unlock(&ntoskrnl_dispatchlock);
|
||||||
|
#else /* __NetBSD__ */
|
||||||
|
DISPATCH_UNLOCK();
|
||||||
|
#endif
|
||||||
return(STATUS_MUTANT_NOT_OWNED);
|
return(STATUS_MUTANT_NOT_OWNED);
|
||||||
}
|
}
|
||||||
kmutex->km_acquirecnt--;
|
kmutex->km_acquirecnt--;
|
||||||
@ -2295,7 +2494,12 @@ KeReleaseMutex(kmutex, kwait)
|
|||||||
kmutex->km_ownerthread = NULL;
|
kmutex->km_ownerthread = NULL;
|
||||||
ntoskrnl_wakeup(&kmutex->km_header);
|
ntoskrnl_wakeup(&kmutex->km_header);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __FreeBSD__
|
||||||
mtx_unlock(&ntoskrnl_dispatchlock);
|
mtx_unlock(&ntoskrnl_dispatchlock);
|
||||||
|
#else /* __NetBSD__ */
|
||||||
|
DISPATCH_UNLOCK();
|
||||||
|
#endif
|
||||||
|
|
||||||
return(kmutex->km_acquirecnt);
|
return(kmutex->km_acquirecnt);
|
||||||
}
|
}
|
||||||
@ -2325,11 +2529,24 @@ KeResetEvent(kevent)
|
|||||||
nt_kevent *kevent;
|
nt_kevent *kevent;
|
||||||
{
|
{
|
||||||
uint32_t prevstate;
|
uint32_t prevstate;
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
int s;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
DISPATCH_LOCK();
|
||||||
|
#else
|
||||||
mtx_lock(&ntoskrnl_dispatchlock);
|
mtx_lock(&ntoskrnl_dispatchlock);
|
||||||
|
#endif
|
||||||
|
|
||||||
prevstate = kevent->k_header.dh_sigstate;
|
prevstate = kevent->k_header.dh_sigstate;
|
||||||
kevent->k_header.dh_sigstate = FALSE;
|
kevent->k_header.dh_sigstate = FALSE;
|
||||||
|
|
||||||
|
#ifdef __FreeBSD__
|
||||||
mtx_unlock(&ntoskrnl_dispatchlock);
|
mtx_unlock(&ntoskrnl_dispatchlock);
|
||||||
|
#else /* __NetBSD__ */
|
||||||
|
DISPATCH_UNLOCK();
|
||||||
|
#endif
|
||||||
|
|
||||||
return(prevstate);
|
return(prevstate);
|
||||||
}
|
}
|
||||||
@ -2341,11 +2558,24 @@ KeSetEvent(kevent, increment, kwait)
|
|||||||
uint8_t kwait;
|
uint8_t kwait;
|
||||||
{
|
{
|
||||||
uint32_t prevstate;
|
uint32_t prevstate;
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
int s;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
DISPATCH_LOCK();
|
||||||
|
#else
|
||||||
mtx_lock(&ntoskrnl_dispatchlock);
|
mtx_lock(&ntoskrnl_dispatchlock);
|
||||||
|
#endif
|
||||||
|
|
||||||
prevstate = kevent->k_header.dh_sigstate;
|
prevstate = kevent->k_header.dh_sigstate;
|
||||||
ntoskrnl_wakeup(&kevent->k_header);
|
ntoskrnl_wakeup(&kevent->k_header);
|
||||||
|
|
||||||
|
#ifdef __FreeBSD__
|
||||||
mtx_unlock(&ntoskrnl_dispatchlock);
|
mtx_unlock(&ntoskrnl_dispatchlock);
|
||||||
|
#else /* __NetBSD__ */
|
||||||
|
DISPATCH_UNLOCK();
|
||||||
|
#endif
|
||||||
|
|
||||||
return(prevstate);
|
return(prevstate);
|
||||||
}
|
}
|
||||||
@ -2461,7 +2691,8 @@ PsCreateSystemThread(handle, reqaccess, objattrs, phandle,
|
|||||||
error = kthread_create(ntoskrnl_thrfunc, tc, &p,
|
error = kthread_create(ntoskrnl_thrfunc, tc, &p,
|
||||||
RFHIGHPID, NDIS_KSTACK_PAGES, tname);
|
RFHIGHPID, NDIS_KSTACK_PAGES, tname);
|
||||||
#else
|
#else
|
||||||
error = kthread_create1(ntoskrnl_thrfunc, tc, &p, tname);
|
/* TODO: Provide a larger stack for these threads (NDIS_KSTACK_PAGES) */
|
||||||
|
error = ndis_kthread_create(ntoskrnl_thrfunc, tc, &p, NULL, 0, tname);
|
||||||
#endif
|
#endif
|
||||||
*handle = p;
|
*handle = p;
|
||||||
|
|
||||||
@ -2483,8 +2714,16 @@ PsTerminateSystemThread(status)
|
|||||||
ndis_status status;
|
ndis_status status;
|
||||||
{
|
{
|
||||||
struct nt_objref *nr;
|
struct nt_objref *nr;
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
int s;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
DISPATCH_LOCK();
|
||||||
|
#else
|
||||||
mtx_lock(&ntoskrnl_dispatchlock);
|
mtx_lock(&ntoskrnl_dispatchlock);
|
||||||
|
#endif
|
||||||
|
|
||||||
TAILQ_FOREACH(nr, &ntoskrnl_reflist, link) {
|
TAILQ_FOREACH(nr, &ntoskrnl_reflist, link) {
|
||||||
#ifdef __FreeBSD__
|
#ifdef __FreeBSD__
|
||||||
if (nr->no_obj != curthread->td_proc)
|
if (nr->no_obj != curthread->td_proc)
|
||||||
@ -2495,7 +2734,12 @@ PsTerminateSystemThread(status)
|
|||||||
ntoskrnl_wakeup(&nr->no_dh);
|
ntoskrnl_wakeup(&nr->no_dh);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __FreeBSD__
|
||||||
mtx_unlock(&ntoskrnl_dispatchlock);
|
mtx_unlock(&ntoskrnl_dispatchlock);
|
||||||
|
#else /* __NetBSD__ */
|
||||||
|
DISPATCH_UNLOCK();
|
||||||
|
#endif
|
||||||
|
|
||||||
ntoskrnl_kth--;
|
ntoskrnl_kth--;
|
||||||
|
|
||||||
@ -2511,11 +2755,11 @@ PsTerminateSystemThread(status)
|
|||||||
static uint32_t
|
static uint32_t
|
||||||
DbgPrint(char *fmt, ...)
|
DbgPrint(char *fmt, ...)
|
||||||
{
|
{
|
||||||
va_list ap;
|
//va_list ap;
|
||||||
|
|
||||||
if (bootverbose) {
|
if (bootverbose) {
|
||||||
va_start(ap, fmt);
|
//va_start(ap, fmt);
|
||||||
vprintf(fmt, ap);
|
//vprintf(fmt, ap);
|
||||||
}
|
}
|
||||||
|
|
||||||
return(STATUS_SUCCESS);
|
return(STATUS_SUCCESS);
|
||||||
@ -2524,11 +2768,12 @@ DbgPrint(char *fmt, ...)
|
|||||||
__stdcall static void
|
__stdcall static void
|
||||||
DbgBreakPoint(void)
|
DbgBreakPoint(void)
|
||||||
{
|
{
|
||||||
|
#if defined(__FreeBSD__) && __FreeBSD_version < 502113
|
||||||
#if __FreeBSD_version < 502113
|
|
||||||
Debugger("DbgBreakPoint(): breakpoint");
|
Debugger("DbgBreakPoint(): breakpoint");
|
||||||
#else
|
#elif defined(__FreeBSD__) && __FreeBSD_version >= 502113
|
||||||
kdb_enter("DbgBreakPoint(): breakpoint");
|
kdb_enter("DbgBreakPoint(): breakpoint");
|
||||||
|
#else /* Netbsd case */
|
||||||
|
; /* TODO Search how to go into debugger without panic */
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2538,12 +2783,19 @@ ntoskrnl_timercall(arg)
|
|||||||
{
|
{
|
||||||
ktimer *timer;
|
ktimer *timer;
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
int s;
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __FreeBSD__
|
#ifdef __FreeBSD__
|
||||||
mtx_unlock(&Giant);
|
mtx_unlock(&Giant);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
DISPATCH_LOCK();
|
||||||
|
#else
|
||||||
mtx_lock(&ntoskrnl_dispatchlock);
|
mtx_lock(&ntoskrnl_dispatchlock);
|
||||||
|
#endif
|
||||||
|
|
||||||
timer = arg;
|
timer = arg;
|
||||||
|
|
||||||
@ -2565,16 +2817,21 @@ ntoskrnl_timercall(arg)
|
|||||||
#ifdef __FreeBSD__
|
#ifdef __FreeBSD__
|
||||||
timer->k_handle = timeout(ntoskrnl_timercall,
|
timer->k_handle = timeout(ntoskrnl_timercall,
|
||||||
timer, tvtohz(&tv));
|
timer, tvtohz(&tv));
|
||||||
#else
|
#else /* __NetBSD__ */
|
||||||
timeout(ntoskrnl_timercall, timer, tvtohz(&tv));
|
callout_reset(timer->k_handle, tvtohz(&tv), ntoskrnl_timercall, timer);
|
||||||
#endif
|
#endif /* __NetBSD__ */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (timer->k_dpc != NULL)
|
if (timer->k_dpc != NULL)
|
||||||
KeInsertQueueDpc(timer->k_dpc, NULL, NULL);
|
KeInsertQueueDpc(timer->k_dpc, NULL, NULL);
|
||||||
|
|
||||||
ntoskrnl_wakeup(&timer->k_header);
|
ntoskrnl_wakeup(&timer->k_header);
|
||||||
|
|
||||||
|
#ifdef __FreeBSD__
|
||||||
mtx_unlock(&ntoskrnl_dispatchlock);
|
mtx_unlock(&ntoskrnl_dispatchlock);
|
||||||
|
#else /* __NetBSD__ */
|
||||||
|
DISPATCH_UNLOCK();
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __FreeBSD__
|
#ifdef __FreeBSD__
|
||||||
mtx_lock(&Giant);
|
mtx_lock(&Giant);
|
||||||
@ -2611,7 +2868,7 @@ KeInitializeTimerEx(timer, type)
|
|||||||
#ifdef __FreeBSD__
|
#ifdef __FreeBSD__
|
||||||
callout_handle_init(&timer->k_handle);
|
callout_handle_init(&timer->k_handle);
|
||||||
#else
|
#else
|
||||||
callout_init(&timer->k_handle);
|
callout_init(timer->k_handle);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return;
|
return;
|
||||||
@ -2692,14 +2949,25 @@ KeSetTimerEx(timer, duetime, period, dpc)
|
|||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
uint64_t curtime;
|
uint64_t curtime;
|
||||||
uint8_t pending;
|
uint8_t pending;
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
int s;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (timer == NULL)
|
if (timer == NULL)
|
||||||
return(FALSE);
|
return(FALSE);
|
||||||
|
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
DISPATCH_LOCK();
|
||||||
|
#else
|
||||||
mtx_lock(&ntoskrnl_dispatchlock);
|
mtx_lock(&ntoskrnl_dispatchlock);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (timer->k_header.dh_inserted == TRUE) {
|
if (timer->k_header.dh_inserted == TRUE) {
|
||||||
|
#ifdef __FreeBSD__
|
||||||
untimeout(ntoskrnl_timercall, timer, timer->k_handle);
|
untimeout(ntoskrnl_timercall, timer, timer->k_handle);
|
||||||
|
#else /* __NetBSD__ */
|
||||||
|
callout_stop(timer->k_handle);
|
||||||
|
#endif
|
||||||
timer->k_header.dh_inserted = FALSE;
|
timer->k_header.dh_inserted = FALSE;
|
||||||
pending = TRUE;
|
pending = TRUE;
|
||||||
} else
|
} else
|
||||||
@ -2729,10 +2997,14 @@ KeSetTimerEx(timer, duetime, period, dpc)
|
|||||||
#ifdef __FreeBSD__
|
#ifdef __FreeBSD__
|
||||||
timer->k_handle = timeout(ntoskrnl_timercall, timer, tvtohz(&tv));
|
timer->k_handle = timeout(ntoskrnl_timercall, timer, tvtohz(&tv));
|
||||||
#else
|
#else
|
||||||
timeout(ntoskrnl_timercall, timer, tvtohz(&tv));
|
callout_reset(timer->k_handle, tvtohz(&tv), ntoskrnl_timercall, timer);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef __FreeBSD__
|
||||||
mtx_unlock(&ntoskrnl_dispatchlock);
|
mtx_unlock(&ntoskrnl_dispatchlock);
|
||||||
|
#else /* __NetBSD__ */
|
||||||
|
DISPATCH_UNLOCK();
|
||||||
|
#endif
|
||||||
|
|
||||||
return(pending);
|
return(pending);
|
||||||
}
|
}
|
||||||
@ -2751,19 +3023,34 @@ KeCancelTimer(timer)
|
|||||||
ktimer *timer;
|
ktimer *timer;
|
||||||
{
|
{
|
||||||
uint8_t pending;
|
uint8_t pending;
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
int s;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (timer == NULL)
|
if (timer == NULL)
|
||||||
return(FALSE);
|
return(FALSE);
|
||||||
|
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
DISPATCH_LOCK();
|
||||||
|
#else
|
||||||
mtx_lock(&ntoskrnl_dispatchlock);
|
mtx_lock(&ntoskrnl_dispatchlock);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (timer->k_header.dh_inserted == TRUE) {
|
if (timer->k_header.dh_inserted == TRUE) {
|
||||||
|
#ifdef __FreeBSD__
|
||||||
untimeout(ntoskrnl_timercall, timer, timer->k_handle);
|
untimeout(ntoskrnl_timercall, timer, timer->k_handle);
|
||||||
|
#else /* __NetBSD__ */
|
||||||
|
callout_stop(timer->k_handle);
|
||||||
|
#endif
|
||||||
pending = TRUE;
|
pending = TRUE;
|
||||||
} else
|
} else
|
||||||
pending = KeRemoveQueueDpc(timer->k_dpc);
|
pending = KeRemoveQueueDpc(timer->k_dpc);
|
||||||
|
|
||||||
|
#ifdef __FreeBSD__
|
||||||
mtx_unlock(&ntoskrnl_dispatchlock);
|
mtx_unlock(&ntoskrnl_dispatchlock);
|
||||||
|
#else /* __NetBSD__ */
|
||||||
|
DISPATCH_UNLOCK();
|
||||||
|
#endif
|
||||||
|
|
||||||
return(pending);
|
return(pending);
|
||||||
}
|
}
|
||||||
|
@ -35,7 +35,7 @@
|
|||||||
__FBSDID("$FreeBSD: src/sys/compat/ndis/subr_pe.c,v 1.7.2.3 2005/03/31 04:24:36 wpaul Exp $");
|
__FBSDID("$FreeBSD: src/sys/compat/ndis/subr_pe.c,v 1.7.2.3 2005/03/31 04:24:36 wpaul Exp $");
|
||||||
#endif
|
#endif
|
||||||
#ifdef __NetBSD__
|
#ifdef __NetBSD__
|
||||||
__KERNEL_RCSID(0, "$NetBSD: subr_pe.c,v 1.2 2006/03/30 23:06:56 rittera Exp $");
|
__KERNEL_RCSID(0, "$NetBSD: subr_pe.c,v 1.3 2006/03/31 00:03:57 rittera Exp $");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@ -57,6 +57,7 @@ __KERNEL_RCSID(0, "$NetBSD: subr_pe.c,v 1.2 2006/03/30 23:06:56 rittera Exp $");
|
|||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/errno.h>
|
#include <sys/errno.h>
|
||||||
|
#include <sys/lock.h>
|
||||||
#ifdef _KERNEL
|
#ifdef _KERNEL
|
||||||
#include <sys/systm.h>
|
#include <sys/systm.h>
|
||||||
extern int ndis_strncasecmp(const char *, const char *, size_t);
|
extern int ndis_strncasecmp(const char *, const char *, size_t);
|
||||||
@ -447,7 +448,7 @@ int
|
|||||||
pe_get_import_descriptor(imgbase, desc, module)
|
pe_get_import_descriptor(imgbase, desc, module)
|
||||||
vm_offset_t imgbase;
|
vm_offset_t imgbase;
|
||||||
image_import_descriptor *desc;
|
image_import_descriptor *desc;
|
||||||
char *module;
|
const char *module;
|
||||||
{
|
{
|
||||||
vm_offset_t offset;
|
vm_offset_t offset;
|
||||||
image_import_descriptor *imp_desc;
|
image_import_descriptor *imp_desc;
|
||||||
@ -608,7 +609,7 @@ pe_functbl_match(functbl, name)
|
|||||||
int
|
int
|
||||||
pe_patch_imports(imgbase, module, functbl)
|
pe_patch_imports(imgbase, module, functbl)
|
||||||
vm_offset_t imgbase;
|
vm_offset_t imgbase;
|
||||||
char *module;
|
const char *module;
|
||||||
image_patch_table *functbl;
|
image_patch_table *functbl;
|
||||||
{
|
{
|
||||||
image_import_descriptor imp_desc;
|
image_import_descriptor imp_desc;
|
||||||
|
@ -31,7 +31,12 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
|
#ifdef __FreeBSD__
|
||||||
__FBSDID("$FreeBSD: src/sys/compat/ndis/subr_usbd.c,v 1.1.2.1 2005/03/31 04:24:36 wpaul Exp $");
|
__FBSDID("$FreeBSD: src/sys/compat/ndis/subr_usbd.c,v 1.1.2.1 2005/03/31 04:24:36 wpaul Exp $");
|
||||||
|
#endif
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
__KERNEL_RCSID(0, "$NetBSD");
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <sys/systm.h>
|
#include <sys/systm.h>
|
||||||
@ -41,11 +46,15 @@ __FBSDID("$FreeBSD: src/sys/compat/ndis/subr_usbd.c,v 1.1.2.1 2005/03/31 04:24:3
|
|||||||
#include <sys/kernel.h>
|
#include <sys/kernel.h>
|
||||||
#include <sys/malloc.h>
|
#include <sys/malloc.h>
|
||||||
#include <sys/lock.h>
|
#include <sys/lock.h>
|
||||||
|
#ifdef __FreeBSD__
|
||||||
#include <sys/mutex.h>
|
#include <sys/mutex.h>
|
||||||
#include <sys/module.h>
|
#include <sys/module.h>
|
||||||
|
#endif
|
||||||
#include <sys/conf.h>
|
#include <sys/conf.h>
|
||||||
#include <sys/mbuf.h>
|
#include <sys/mbuf.h>
|
||||||
|
#ifdef __FreeBSD__
|
||||||
#include <sys/bus.h>
|
#include <sys/bus.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <sys/queue.h>
|
#include <sys/queue.h>
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -36,7 +36,11 @@ __FBSDID("$FreeBSD: src/sys/dev/if_ndis/if_ndis_pci.c,v 1.8.2.3 2005/03/31 04:24
|
|||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <sys/systm.h>
|
#include <sys/systm.h>
|
||||||
#include <sys/kernel.h>
|
#include <sys/kernel.h>
|
||||||
|
#ifdef __FreeBSD__
|
||||||
#include <sys/module.h>
|
#include <sys/module.h>
|
||||||
|
#else
|
||||||
|
#include <sys/lkm.h>
|
||||||
|
#endif
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <sys/queue.h>
|
#include <sys/queue.h>
|
||||||
#include <sys/sysctl.h>
|
#include <sys/sysctl.h>
|
||||||
@ -46,9 +50,16 @@ __FBSDID("$FreeBSD: src/sys/dev/if_ndis/if_ndis_pci.c,v 1.8.2.3 2005/03/31 04:24
|
|||||||
#include <net/if_media.h>
|
#include <net/if_media.h>
|
||||||
|
|
||||||
#include <machine/bus.h>
|
#include <machine/bus.h>
|
||||||
|
#ifdef __FreeBSD__
|
||||||
#include <machine/resource.h>
|
#include <machine/resource.h>
|
||||||
#include <sys/bus.h>
|
#include <sys/bus.h>
|
||||||
#include <sys/rman.h>
|
#include <sys/rman.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
#include <sys/kthread.h>
|
||||||
|
#include <net/if_ether.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <net80211/ieee80211_var.h>
|
#include <net80211/ieee80211_var.h>
|
||||||
|
|
||||||
@ -62,14 +73,26 @@ __FBSDID("$FreeBSD: src/sys/dev/if_ndis/if_ndis_pci.c,v 1.8.2.3 2005/03/31 04:24
|
|||||||
#include <compat/ndis/cfg_var.h>
|
#include <compat/ndis/cfg_var.h>
|
||||||
#include <dev/if_ndis/if_ndisvar.h>
|
#include <dev/if_ndis/if_ndisvar.h>
|
||||||
|
|
||||||
|
#ifdef NDIS_LKM
|
||||||
#include "ndis_driver_data.h"
|
#include "ndis_driver_data.h"
|
||||||
|
#else
|
||||||
|
#include <modules/if_ndis/ndis_driver_data.h>
|
||||||
|
#endif /* NDIS_LKM */
|
||||||
|
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
#ifndef NDIS_LKM
|
||||||
|
#include <compat/ndis/hal_var.h>
|
||||||
|
#endif
|
||||||
|
#endif /* __NetBSD__ */
|
||||||
|
|
||||||
#ifdef NDIS_PCI_DEV_TABLE
|
#ifdef NDIS_PCI_DEV_TABLE
|
||||||
|
|
||||||
|
#ifdef __FreeBSD
|
||||||
MODULE_DEPEND(ndis, pci, 1, 1, 1);
|
MODULE_DEPEND(ndis, pci, 1, 1, 1);
|
||||||
MODULE_DEPEND(ndis, ether, 1, 1, 1);
|
MODULE_DEPEND(ndis, ether, 1, 1, 1);
|
||||||
MODULE_DEPEND(ndis, wlan, 1, 1, 1);
|
MODULE_DEPEND(ndis, wlan, 1, 1, 1);
|
||||||
MODULE_DEPEND(ndis, ndisapi, 1, 1, 1);
|
MODULE_DEPEND(ndis, ndisapi, 1, 1, 1);
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Various supported device vendors/types and their names.
|
* Various supported device vendors/types and their names.
|
||||||
@ -82,19 +105,51 @@ static struct ndis_pci_type ndis_devs[] = {
|
|||||||
{ 0, 0, 0, NULL }
|
{ 0, 0, 0, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef __FreeBSD__
|
||||||
static int ndis_probe_pci (device_t);
|
static int ndis_probe_pci (device_t);
|
||||||
static int ndis_attach_pci (device_t);
|
static int ndis_attach_pci (device_t);
|
||||||
|
#else /* __NetBSD__ */
|
||||||
|
/*static*/ int ndis_probe_pci(struct device *parent,
|
||||||
|
struct cfdata *match,
|
||||||
|
void *aux);
|
||||||
|
/*static*/ void ndis_attach_pci(struct device *parent,
|
||||||
|
struct device *self,
|
||||||
|
void *aux);
|
||||||
|
#endif
|
||||||
|
#ifdef __FreeBSD__
|
||||||
static struct resource_list *ndis_get_resource_list
|
static struct resource_list *ndis_get_resource_list
|
||||||
(device_t, device_t);
|
(device_t, device_t);
|
||||||
extern int ndisdrv_modevent (module_t, int, void *);
|
extern int ndisdrv_modevent (module_t, int, void *);
|
||||||
|
#endif
|
||||||
|
#ifdef __FreeBSD__
|
||||||
extern int ndis_attach (device_t);
|
extern int ndis_attach (device_t);
|
||||||
|
#else /* __NetBSD__ */
|
||||||
|
extern void ndis_attach (void *);
|
||||||
|
#endif
|
||||||
extern int ndis_shutdown (device_t);
|
extern int ndis_shutdown (device_t);
|
||||||
|
#ifdef __FreeBSD__
|
||||||
extern int ndis_detach (device_t);
|
extern int ndis_detach (device_t);
|
||||||
|
#else /* __NetBSD__ */
|
||||||
|
extern int ndis_detach (device_t, int);
|
||||||
|
#endif
|
||||||
extern int ndis_suspend (device_t);
|
extern int ndis_suspend (device_t);
|
||||||
extern int ndis_resume (device_t);
|
extern int ndis_resume (device_t);
|
||||||
|
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
extern void device_printf(device_t, const char *fmt, ...);
|
||||||
|
extern int ndis_intr(void *);
|
||||||
|
#endif
|
||||||
|
|
||||||
extern unsigned char drv_data[];
|
extern unsigned char drv_data[];
|
||||||
|
|
||||||
|
#ifndef NDIS_LKM
|
||||||
|
//static funcptr ndis_txeof_wrap;
|
||||||
|
//static funcptr ndis_rxeof_wrap;
|
||||||
|
//static funcptr ndis_linksts_wrap;
|
||||||
|
//static funcptr ndis_linksts_done_wrap;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __FreeBSD__
|
||||||
static device_method_t ndis_methods[] = {
|
static device_method_t ndis_methods[] = {
|
||||||
/* Device interface */
|
/* Device interface */
|
||||||
DEVMETHOD(device_probe, ndis_probe_pci),
|
DEVMETHOD(device_probe, ndis_probe_pci),
|
||||||
@ -135,6 +190,24 @@ DRIVER_MODULE(ndis, pci, ndis_driver, ndis_devclass, ndisdrv_modevent, 0);
|
|||||||
DRIVER_MODULE(ndis, cardbus, ndis_driver, ndis_devclass, ndisdrv_modevent, 0);
|
DRIVER_MODULE(ndis, cardbus, ndis_driver, ndis_devclass, ndisdrv_modevent, 0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#endif /* __FreeBSD__ */
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
|
||||||
|
CFATTACH_DECL(
|
||||||
|
#ifdef NDIS_DEVNAME
|
||||||
|
NDIS_DEVNAME,
|
||||||
|
#else
|
||||||
|
ndis,
|
||||||
|
#endif
|
||||||
|
sizeof(struct ndis_softc),
|
||||||
|
ndis_probe_pci,
|
||||||
|
ndis_attach_pci,
|
||||||
|
ndis_detach,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
#endif /* __NetBSD__ */
|
||||||
|
|
||||||
|
#ifdef __FreeBSD__
|
||||||
/*
|
/*
|
||||||
* Probe for an NDIS device. Check the PCI vendor and device
|
* Probe for an NDIS device. Check the PCI vendor and device
|
||||||
* IDs against our list and return a device name if we find a match.
|
* IDs against our list and return a device name if we find a match.
|
||||||
@ -168,7 +241,68 @@ ndis_probe_pci(dev)
|
|||||||
|
|
||||||
return(ENXIO);
|
return(ENXIO);
|
||||||
}
|
}
|
||||||
|
#endif /* __FreeBSD__ */
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
|
||||||
|
extern int
|
||||||
|
ndis_lkm_handle(struct lkm_table *lkmtp, int cmd);
|
||||||
|
extern int
|
||||||
|
ndisdrv_modevent(module_t mod, int cmd);
|
||||||
|
|
||||||
|
/* These are just for the in-kernel version, to delay calling
|
||||||
|
* these functions untill enough context is built up.
|
||||||
|
*/
|
||||||
|
void load_ndisapi(void *);
|
||||||
|
void load_ndisdrv(void *);
|
||||||
|
|
||||||
|
void load_ndisapi(void *arg)
|
||||||
|
{
|
||||||
|
ndis_lkm_handle(NULL, MOD_LOAD);
|
||||||
|
}
|
||||||
|
void load_ndisdrv(void *arg)
|
||||||
|
{
|
||||||
|
ndisdrv_modevent(NULL, MOD_LOAD);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*static*/ int
|
||||||
|
ndis_probe_pci(struct device *parent, struct cfdata *match, void *aux)
|
||||||
|
{
|
||||||
|
struct pci_attach_args *pa = aux;
|
||||||
|
int vendor = PCI_VENDOR(pa->pa_id);
|
||||||
|
int product = PCI_PRODUCT(pa->pa_id);
|
||||||
|
|
||||||
|
struct ndis_pci_type *t = ndis_devs;
|
||||||
|
driver_object *drv = NULL; /* = windrv_lookup(0, "PCI Bus");**/
|
||||||
|
|
||||||
|
printf("in ndis_probe_pci\n");
|
||||||
|
printf("vendor = %x, product = %x\n", vendor, product);
|
||||||
|
|
||||||
|
while(t->ndis_name != NULL) {
|
||||||
|
#ifdef NDIS_LKM
|
||||||
|
printf("t->ndis_vid = %x, t->ndis_did = %x\n",
|
||||||
|
t->ndis_vid, t->ndis_did);
|
||||||
|
#endif
|
||||||
|
if((vendor == t->ndis_vid) && (product == t->ndis_did)) {
|
||||||
|
#ifndef NDIS_LKM
|
||||||
|
ndis_lkm_handle(NULL, LKM_E_LOAD);
|
||||||
|
//kthread_create(load_ndisapi, NULL);
|
||||||
|
#endif /* NDIS_LKM */
|
||||||
|
ndisdrv_modevent(NULL, MOD_LOAD);
|
||||||
|
//kthread_create(load_ndisdrv, NULL);
|
||||||
|
|
||||||
|
drv = windrv_lookup(0, "PCI Bus");
|
||||||
|
printf("Matching vendor: %x, product: %x, name: %s\n", vendor, product, t->ndis_name);
|
||||||
|
windrv_create_pdo(drv, parent);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
t++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0; /* dosen't match */
|
||||||
|
}
|
||||||
|
#endif /* __NetBSD__ */
|
||||||
|
|
||||||
|
#ifdef __FreeBSD__
|
||||||
/*
|
/*
|
||||||
* Attach the interface. Allocate softc structures, do ifmedia
|
* Attach the interface. Allocate softc structures, do ifmedia
|
||||||
* setup and ethernet/BPF attach.
|
* setup and ethernet/BPF attach.
|
||||||
@ -335,7 +469,234 @@ ndis_attach_pci(dev)
|
|||||||
fail:
|
fail:
|
||||||
return(error);
|
return(error);
|
||||||
}
|
}
|
||||||
|
#endif /* __FreeBSD__ */
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
/* 6 BADR's + 1 IRQ (so far) */
|
||||||
|
#define MAX_RESOURCES 7
|
||||||
|
|
||||||
|
/*static*/
|
||||||
|
void ndis_attach_pci(struct device *parent, struct device *self, void *aux)
|
||||||
|
{
|
||||||
|
struct ndis_softc *sc = (struct ndis_softc*)self;
|
||||||
|
struct pci_attach_args *pa = aux;
|
||||||
|
char devinfo[256];
|
||||||
|
pci_intr_handle_t ih;
|
||||||
|
pcireg_t type;
|
||||||
|
bus_addr_t base;
|
||||||
|
bus_size_t size;
|
||||||
|
int flags;
|
||||||
|
ndis_resource_list *rl = NULL;
|
||||||
|
struct cm_partial_resource_desc *prd = NULL;
|
||||||
|
struct pci_conf_state conf_state;
|
||||||
|
int revision, i, bar;
|
||||||
|
|
||||||
|
printf("in ndis_attach_pci()\n");
|
||||||
|
|
||||||
|
/* initalize the softc */
|
||||||
|
//sc->ndis_hardware_type = NDIS_PCI;
|
||||||
|
sc->ndis_dev = self;
|
||||||
|
sc->ndis_iftype = PCIBus;
|
||||||
|
sc->ndis_res_pc = pa->pa_pc;
|
||||||
|
sc->ndis_res_pctag = pa->pa_tag;
|
||||||
|
/* TODO: is this correct? All are just pa->pa_dmat? */
|
||||||
|
sc->ndis_mtag = pa->pa_dmat;
|
||||||
|
sc->ndis_ttag = pa->pa_dmat;
|
||||||
|
sc->ndis_parent_tag = pa->pa_dmat;
|
||||||
|
sc->ndis_res_io = NULL;
|
||||||
|
sc->ndis_res_mem = NULL;
|
||||||
|
sc->ndis_res_altmem = NULL;
|
||||||
|
sc->ndis_block = NULL;
|
||||||
|
sc->ndis_shlist = NULL;
|
||||||
|
|
||||||
|
ndis_in_isr = FALSE;
|
||||||
|
|
||||||
|
printf("sc->ndis_mtag = %x\n", (unsigned int)sc->ndis_mtag);
|
||||||
|
|
||||||
|
rl = malloc(sizeof(ndis_resource_list) +
|
||||||
|
(sizeof(cm_partial_resource_desc) * (MAX_RESOURCES-1)),
|
||||||
|
M_DEVBUF, M_NOWAIT|M_ZERO);
|
||||||
|
|
||||||
|
if(rl == NULL) {
|
||||||
|
sc->error = ENOMEM;
|
||||||
|
//printf("error: out of memory\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
rl->cprl_version = 5;
|
||||||
|
rl->cprl_version = 1;
|
||||||
|
rl->cprl_count = 0;
|
||||||
|
prd = rl->cprl_partial_descs;
|
||||||
|
|
||||||
|
pci_devinfo(pa->pa_id, pa->pa_class, 0, devinfo, sizeof devinfo);
|
||||||
|
revision = PCI_REVISION(pa->pa_class);
|
||||||
|
//printf(": %s (rev. 0x%02x)\n", devinfo, revision);
|
||||||
|
|
||||||
|
pci_conf_print(sc->ndis_res_pc, sc->ndis_res_pctag, NULL);
|
||||||
|
|
||||||
|
pci_conf_capture(sc->ndis_res_pc, sc->ndis_res_pctag, &conf_state);
|
||||||
|
for(i=0; i<16; i++) {
|
||||||
|
//printf("conf_state.reg[%d] = %x\n", i, conf_state.reg[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* just do the conversion work in attach instead of calling ndis_convert_res() */
|
||||||
|
for(bar = 0x10; bar <= 0x24; bar += 0x04) {
|
||||||
|
type = pci_mapreg_type(sc->ndis_res_pc, sc->ndis_res_pctag, bar);
|
||||||
|
if(pci_mapreg_info(sc->ndis_res_pc, sc->ndis_res_pctag, bar, type, &base,
|
||||||
|
&size, &flags)) {
|
||||||
|
printf("pci_mapreg_info() failed on BAR 0x%x!\n", bar);
|
||||||
|
} else {
|
||||||
|
switch(type) {
|
||||||
|
case PCI_MAPREG_TYPE_IO:
|
||||||
|
prd->cprd_type = CmResourceTypePort;
|
||||||
|
prd->cprd_flags = CM_RESOURCE_PORT_IO;
|
||||||
|
prd->u.cprd_port.cprd_start.np_quad = (uint64_t)base;
|
||||||
|
prd->u.cprd_port.cprd_len = (uint32_t)size;
|
||||||
|
//printf("BAR 0x%x: type = PCI_MAPREG_TYPE_IO, base = %x, size = %x, flags = %x\n",
|
||||||
|
// bar, base, size, flags);
|
||||||
|
if((sc->ndis_res_io =
|
||||||
|
malloc(sizeof(struct ndis_resource), M_DEVBUF, M_NOWAIT | M_ZERO)) == NULL) {
|
||||||
|
//printf("error: out of memory\n");
|
||||||
|
sc->error = ENOMEM;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
sc->ndis_res_io->res_base = base;
|
||||||
|
sc->ndis_res_io->res_size = size;
|
||||||
|
sc->ndis_res_io->res_tag = X86_BUS_SPACE_IO;
|
||||||
|
/* TODO: is this correct to just map the register here? */
|
||||||
|
|
||||||
|
bus_space_map(sc->ndis_res_io->res_tag,
|
||||||
|
sc->ndis_res_io->res_base,
|
||||||
|
sc->ndis_res_io->res_size,
|
||||||
|
flags,
|
||||||
|
&sc->ndis_res_io->res_handle);
|
||||||
|
|
||||||
|
/*if(pci_mapreg_map(pa, bar, type, flags,
|
||||||
|
&sc->ndis_res_io->res_tag,
|
||||||
|
&sc->ndis_res_io->res_handle,
|
||||||
|
&sc->ndis_res_io->res_base,
|
||||||
|
&sc->ndis_res_io->res_size)) {
|
||||||
|
printf("pci_mapreg_map() failed\n");
|
||||||
|
}*/
|
||||||
|
break;
|
||||||
|
case PCI_MAPREG_TYPE_MEM:
|
||||||
|
prd->cprd_type = CmResourceTypeMemory;
|
||||||
|
prd->cprd_flags = CM_RESOURCE_MEMORY_READ_WRITE;
|
||||||
|
prd->u.cprd_mem.cprd_start.np_quad = (uint64_t)base;
|
||||||
|
prd->u.cprd_mem.cprd_len = (uint32_t)size;
|
||||||
|
|
||||||
|
if(sc->ndis_res_mem != NULL &&
|
||||||
|
sc->ndis_res_altmem != NULL) {
|
||||||
|
printf("too many resources\n");
|
||||||
|
sc->error = ENXIO;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(sc->ndis_res_mem) {
|
||||||
|
if((sc->ndis_res_altmem =
|
||||||
|
malloc(sizeof(struct ndis_resource), M_DEVBUF, M_NOWAIT | M_ZERO)) == NULL) {
|
||||||
|
//printf("error: out of memory\n");
|
||||||
|
sc->error = ENOMEM;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
sc->ndis_res_altmem->res_base = base;
|
||||||
|
sc->ndis_res_altmem->res_size = size;
|
||||||
|
sc->ndis_res_altmem->res_tag = X86_BUS_SPACE_MEM;
|
||||||
|
|
||||||
|
|
||||||
|
if(bus_space_map(sc->ndis_res_altmem->res_tag,
|
||||||
|
sc->ndis_res_altmem->res_base,
|
||||||
|
sc->ndis_res_altmem->res_size,
|
||||||
|
flags|BUS_SPACE_MAP_LINEAR,
|
||||||
|
&sc->ndis_res_altmem->res_handle)) {
|
||||||
|
printf("bus_space_map failed\n");
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
if(pci_mapreg_map(pa, bar, type, flags|BUS_SPACE_MAP_LINEAR,
|
||||||
|
&sc->ndis_res_altmem->res_tag,
|
||||||
|
&sc->ndis_res_altmem->res_handle,
|
||||||
|
&sc->ndis_res_altmem->res_base,
|
||||||
|
&sc->ndis_res_altmem->res_size)) {
|
||||||
|
printf("pci_mapreg_map() failed\n");
|
||||||
|
}*/
|
||||||
|
} else {
|
||||||
|
if((sc->ndis_res_mem =
|
||||||
|
malloc(sizeof(struct ndis_resource), M_DEVBUF, M_NOWAIT | M_ZERO)) == NULL) {
|
||||||
|
//printf("error: out of memory\n");
|
||||||
|
sc->error = ENOMEM;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* TODO: is this correct to just map the register here? */
|
||||||
|
sc->ndis_res_mem->res_base = base;
|
||||||
|
sc->ndis_res_mem->res_size = size;
|
||||||
|
sc->ndis_res_mem->res_tag = X86_BUS_SPACE_MEM;
|
||||||
|
|
||||||
|
if(bus_space_map(sc->ndis_res_mem->res_tag,
|
||||||
|
sc->ndis_res_mem->res_base,
|
||||||
|
sc->ndis_res_mem->res_size,
|
||||||
|
flags|BUS_SPACE_MAP_LINEAR,
|
||||||
|
&sc->ndis_res_mem->res_handle)) {
|
||||||
|
printf("bus_space_map failed\n");
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
if(pci_mapreg_map(pa, bar, type, flags|BUS_SPACE_MAP_LINEAR,
|
||||||
|
&sc->ndis_res_mem->res_tag,
|
||||||
|
&sc->ndis_res_mem->res_handle,
|
||||||
|
&sc->ndis_res_mem->res_base,
|
||||||
|
&sc->ndis_res_mem->res_size)) {
|
||||||
|
printf("pci_mapreg_map() failed\n");
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
printf("unknown type\n");
|
||||||
|
}
|
||||||
|
prd->cprd_sharedisp = CmResourceShareDeviceExclusive;
|
||||||
|
|
||||||
|
rl->cprl_count++;
|
||||||
|
prd++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* add the interrupt to the list */
|
||||||
|
prd->cprd_type = CmResourceTypeInterrupt;
|
||||||
|
prd->cprd_flags = 0;
|
||||||
|
/* TODO: is this all we need to save for the interrupt? */
|
||||||
|
prd->u.cprd_intr.cprd_level = pa->pa_intrline;
|
||||||
|
prd->u.cprd_intr.cprd_vector = pa->pa_intrline;
|
||||||
|
prd->u.cprd_intr.cprd_affinity = 0;
|
||||||
|
rl->cprl_count++;
|
||||||
|
|
||||||
|
pci_intr_map(pa, &ih);
|
||||||
|
sc->ndis_intrhand = pci_intr_establish(pa->pa_pc, ih, IPL_NET /*| PCATCH*/, ndis_intr, sc);
|
||||||
|
sc->ndis_irq = (void *)sc->ndis_intrhand;
|
||||||
|
|
||||||
|
printf("pci interrupt: %s\n", pci_intr_string(pa->pa_pc, ih));
|
||||||
|
|
||||||
|
/*
|
||||||
|
realloc(rl, sizeof(ndis_resource_list) +
|
||||||
|
(sizeof(cm_partial_resource_desc) * (rl->cprl_count / *- 1* /)),
|
||||||
|
M_DEVBUF, M_NOWAIT|M_ZERO);
|
||||||
|
*/
|
||||||
|
|
||||||
|
if(rl == NULL) {
|
||||||
|
sc->error = ENOMEM;
|
||||||
|
//printf("error: out of memory\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* save resource list in the softc */
|
||||||
|
//sc->ndis_rl = *rl;
|
||||||
|
sc->ndis_rl = rl;
|
||||||
|
sc->ndis_rescnt = rl->cprl_count;
|
||||||
|
|
||||||
|
/*
|
||||||
|
sc->error = ndis_attach((device_t)sc);
|
||||||
|
*/
|
||||||
|
kthread_create(ndis_attach, (void *)sc);
|
||||||
|
}
|
||||||
|
#endif /* __NetBSD__ */
|
||||||
|
|
||||||
|
#ifdef __FreeBSD__
|
||||||
static struct resource_list *
|
static struct resource_list *
|
||||||
ndis_get_resource_list(dev, child)
|
ndis_get_resource_list(dev, child)
|
||||||
device_t dev;
|
device_t dev;
|
||||||
@ -346,5 +707,6 @@ ndis_get_resource_list(dev, child)
|
|||||||
sc = device_get_softc(dev);
|
sc = device_get_softc(dev);
|
||||||
return (BUS_GET_RESOURCE_LIST(device_get_parent(sc->ndis_dev), dev));
|
return (BUS_GET_RESOURCE_LIST(device_get_parent(sc->ndis_dev), dev));
|
||||||
}
|
}
|
||||||
|
#endif /* __FreeBSD__ */
|
||||||
|
|
||||||
#endif /* NDIS_PCI_DEV_TABLE */
|
#endif /* NDIS_PCI_DEV_TABLE */
|
||||||
|
@ -30,16 +30,29 @@
|
|||||||
* THE POSSIBILITY OF SUCH DAMAGE.
|
* THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
* $FreeBSD: src/sys/dev/if_ndis/if_ndisvar.h,v 1.15.2.2 2005/02/18 16:30:10 wpaul Exp $
|
* $FreeBSD: src/sys/dev/if_ndis/if_ndisvar.h,v 1.15.2.2 2005/02/18 16:30:10 wpaul Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define NDIS_DEFAULT_NODENAME "FreeBSD NDIS node"
|
#define NDIS_DEFAULT_NODENAME "FreeBSD NDIS node"
|
||||||
#define NDIS_NODENAME_LEN 32
|
#define NDIS_NODENAME_LEN 32
|
||||||
|
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
#include <dev/pci/pcivar.h>
|
||||||
|
#include <dev/pci/pcireg.h>
|
||||||
|
#include <dev/pci/pcidevs.h>
|
||||||
|
|
||||||
|
#include <dev/pcmcia/pcmciareg.h>
|
||||||
|
#include <dev/pcmcia/pcmciavar.h>
|
||||||
|
#include <dev/pcmcia/pcmciadevs.h>
|
||||||
|
|
||||||
|
#include <dev/cardbus/cardbusvar.h>
|
||||||
|
#include <dev/cardbus/cardbusreg.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
struct ndis_pci_type {
|
struct ndis_pci_type {
|
||||||
uint16_t ndis_vid;
|
const uint16_t ndis_vid;
|
||||||
uint16_t ndis_did;
|
const uint16_t ndis_did;
|
||||||
uint32_t ndis_subsys;
|
const uint32_t ndis_subsys;
|
||||||
char *ndis_name;
|
const char *ndis_name;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ndis_pccard_type {
|
struct ndis_pccard_type {
|
||||||
@ -65,14 +78,43 @@ TAILQ_HEAD(nch, ndis_cfglist);
|
|||||||
#define NDIS_INITIALIZED(sc) (sc->ndis_block->nmb_miniportadapterctx != NULL)
|
#define NDIS_INITIALIZED(sc) (sc->ndis_block->nmb_miniportadapterctx != NULL)
|
||||||
|
|
||||||
#define NDIS_INC(x) \
|
#define NDIS_INC(x) \
|
||||||
(x)->ndis_txidx = ((x)->ndis_txidx + 1) % (x)->ndis_maxpkts
|
(x)->ndis_txidx = ((x)->ndis_txidx + 1) % (x)->ndis_maxpkts
|
||||||
|
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
/* linked list of resources */
|
||||||
|
struct resource {
|
||||||
|
SLIST_ENTRY(resource) link;
|
||||||
|
cm_partial_resource_desc win_res;
|
||||||
|
};
|
||||||
|
SLIST_HEAD(resource_list, resource);
|
||||||
|
#endif /* __NetBSD__ */
|
||||||
|
|
||||||
#ifdef __FreeBSD__
|
#ifdef __FreeBSD__
|
||||||
#define arpcom ic.ic_ac
|
#define arpcom ic.ic_ac
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
struct ndis_resource {
|
||||||
|
bus_space_handle_t res_handle;
|
||||||
|
bus_space_tag_t res_tag;
|
||||||
|
bus_addr_t res_base;
|
||||||
|
bus_size_t res_size;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __NetBSD__
|
||||||
|
int ndis_in_isr;
|
||||||
|
#endif
|
||||||
|
|
||||||
struct ndis_softc {
|
struct ndis_softc {
|
||||||
#ifndef __FreeBSD__
|
#ifdef __NetBSD__
|
||||||
|
/* TODO: It seems like in the attach function the ndis "struct device" object
|
||||||
|
* TODO: and the softc are the same thing, so I added a "struct device" to the
|
||||||
|
* TODO: front of the softc, to make sure the arpcom field wasn't getting
|
||||||
|
* TODO: messed up. However, I'm not sure if the arpcom field is supposed
|
||||||
|
* TODO: to be first for some other reason.
|
||||||
|
*/
|
||||||
|
struct device dev;
|
||||||
struct ethercom arpcom;
|
struct ethercom arpcom;
|
||||||
#endif
|
#endif
|
||||||
struct ieee80211com ic; /* interface info */
|
struct ieee80211com ic; /* interface info */
|
||||||
@ -86,6 +128,7 @@ struct ndis_softc {
|
|||||||
bus_space_handle_t ndis_bhandle;
|
bus_space_handle_t ndis_bhandle;
|
||||||
bus_space_tag_t ndis_btag;
|
bus_space_tag_t ndis_btag;
|
||||||
void *ndis_intrhand;
|
void *ndis_intrhand;
|
||||||
|
#ifdef __FreeBSD__
|
||||||
struct resource *ndis_irq;
|
struct resource *ndis_irq;
|
||||||
struct resource *ndis_res;
|
struct resource *ndis_res;
|
||||||
struct resource *ndis_res_io;
|
struct resource *ndis_res_io;
|
||||||
@ -97,12 +140,47 @@ struct ndis_softc {
|
|||||||
struct resource *ndis_res_am; /* attribute mem (pccard) */
|
struct resource *ndis_res_am; /* attribute mem (pccard) */
|
||||||
int ndis_am_rid;
|
int ndis_am_rid;
|
||||||
struct resource *ndis_res_cm; /* common mem (pccard) */
|
struct resource *ndis_res_cm; /* common mem (pccard) */
|
||||||
#ifdef __FreeBSD__
|
|
||||||
struct resource_list ndis_rl;
|
struct resource_list ndis_rl;
|
||||||
#endif
|
#else /* __NetBSD__ */
|
||||||
|
int ndis_sysctl_mib;
|
||||||
|
struct sysctllog *sysctllog;
|
||||||
|
|
||||||
|
//ndis_resource_list ndis_rl;
|
||||||
|
ndis_resource_list *ndis_rl;
|
||||||
|
int error;
|
||||||
|
/* TODO: Is the ndis_irq set up right? */
|
||||||
|
void *ndis_irq;
|
||||||
|
|
||||||
|
/* for both pci and cardbus ? */
|
||||||
|
struct ndis_resource *ndis_res_io;
|
||||||
|
int ndis_io_rid; /* not actuially used, just for bus_release_resource() */
|
||||||
|
struct ndis_resource *ndis_res_mem;
|
||||||
|
struct ndis_resource *ndis_res_altmem;
|
||||||
|
int ndis_mem_rid; /* not actuially used, just for bus_release_resource() */
|
||||||
|
|
||||||
|
/* pci specific */
|
||||||
|
pci_chipset_tag_t ndis_res_pc; /* pci chipset */
|
||||||
|
pcitag_t ndis_res_pctag; /* pci tag */
|
||||||
|
pci_intr_handle_t pci_ih; /* interrupt handle */
|
||||||
|
|
||||||
|
/* pcmcia specific */
|
||||||
|
struct pcmcia_io_handle ndis_res_pcioh; /* specific i/o for pcmcia */
|
||||||
|
struct pcmcia_mem_handle ndis_res_pcmem; /* specific mem for pcmcia */
|
||||||
|
int sc_io_windows; /* i/o window */
|
||||||
|
struct pcmcia_function * ndis_res_pcfunc; /* pcmcia function */
|
||||||
|
|
||||||
|
/* cardbus specific */
|
||||||
|
cardbus_devfunc_t ndis_res_ct; /* cardbus devfuncs */
|
||||||
|
cardbustag_t ndis_res_ctag; /* carbus tag */
|
||||||
|
bus_size_t ndis_res_mapsize; /* size of mapped bus space region */
|
||||||
|
#endif /* end __NetBSD__ section */
|
||||||
int ndis_rescnt;
|
int ndis_rescnt;
|
||||||
|
#ifdef __FreeBSD__
|
||||||
struct mtx ndis_mtx;
|
struct mtx ndis_mtx;
|
||||||
device_t ndis_dev;
|
#else /* __NetBSD__ */
|
||||||
|
struct simplelock ndis_mtx;
|
||||||
|
#endif
|
||||||
|
device_t ndis_dev;
|
||||||
int ndis_unit;
|
int ndis_unit;
|
||||||
ndis_miniport_block *ndis_block;
|
ndis_miniport_block *ndis_block;
|
||||||
ndis_miniport_characteristics *ndis_chars;
|
ndis_miniport_characteristics *ndis_chars;
|
||||||
@ -120,7 +198,9 @@ struct ndis_softc {
|
|||||||
ndis_packet **ndis_txarray;
|
ndis_packet **ndis_txarray;
|
||||||
ndis_handle ndis_txpool;
|
ndis_handle ndis_txpool;
|
||||||
int ndis_sc;
|
int ndis_sc;
|
||||||
|
//#ifdef __FreeBSD__
|
||||||
ndis_cfg *ndis_regvals;
|
ndis_cfg *ndis_regvals;
|
||||||
|
//#endif
|
||||||
struct nch ndis_cfglist_head;
|
struct nch ndis_cfglist_head;
|
||||||
int ndis_80211;
|
int ndis_80211;
|
||||||
int ndis_link;
|
int ndis_link;
|
||||||
@ -128,7 +208,9 @@ struct ndis_softc {
|
|||||||
int ndis_if_flags;
|
int ndis_if_flags;
|
||||||
int ndis_skip;
|
int ndis_skip;
|
||||||
|
|
||||||
|
#ifdef __FreeBSD__
|
||||||
struct sysctl_ctx_list ndis_ctx;
|
struct sysctl_ctx_list ndis_ctx;
|
||||||
|
#endif
|
||||||
#if __FreeBSD__ && __FreeBSD_version < 502113
|
#if __FreeBSD__ && __FreeBSD_version < 502113
|
||||||
struct sysctl_oid *ndis_tree;
|
struct sysctl_oid *ndis_tree;
|
||||||
#endif
|
#endif
|
||||||
@ -144,5 +226,28 @@ struct ndis_softc {
|
|||||||
int ndis_mmapcnt;
|
int ndis_mmapcnt;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef __FreeBSD__
|
||||||
#define NDIS_LOCK(_sc) mtx_lock(&(_sc)->ndis_mtx)
|
#define NDIS_LOCK(_sc) mtx_lock(&(_sc)->ndis_mtx)
|
||||||
#define NDIS_UNLOCK(_sc) mtx_unlock(&(_sc)->ndis_mtx)
|
#define NDIS_UNLOCK(_sc) mtx_unlock(&(_sc)->ndis_mtx)
|
||||||
|
#else /* __NetBSD__ */
|
||||||
|
/*
|
||||||
|
int ndis_spl;
|
||||||
|
#define NDIS_LOCK(_sc) ndis_spl = splnet(); \
|
||||||
|
simple_lock(&(_sc)->ndis_mtx)
|
||||||
|
#define NDIS_UNLOCK(_sc) simple_unlock(&(_sc)->ndis_mtx); \
|
||||||
|
splx(ndis_spl)
|
||||||
|
*/
|
||||||
|
//#define NDIS_LOCK(_sc) lockmgr(&(_sc)->ndis_mtx, LK_EXCLUSIVE, NULL);
|
||||||
|
//#define NDIS_UNLOCK(_sc) lockmgr(&(_sc)->ndis_mtx, LK_RELEASE, NULL);
|
||||||
|
#define NDIS_LOCK(_sc) do {s = spl_sc(); simple_lock(&(_sc)->ndis_mtx);} while(0)
|
||||||
|
#define NDIS_UNLOCK(_sc) do {simple_unlock(&(_sc)->ndis_mtx); splx(s);} while(0)
|
||||||
|
#define spl_sc() splnet()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*static*/ __stdcall void ndis_txeof (ndis_handle,
|
||||||
|
ndis_packet *, ndis_status);
|
||||||
|
/*static*/ __stdcall void ndis_rxeof (ndis_handle,
|
||||||
|
ndis_packet **, uint32_t);
|
||||||
|
/*static*/ __stdcall void ndis_linksts (ndis_handle,
|
||||||
|
ndis_status, void *, uint32_t);
|
||||||
|
/*static*/ __stdcall void ndis_linksts_done (ndis_handle);
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# $NetBSD: files.pci,v 1.245 2006/03/21 20:42:14 he Exp $
|
# $NetBSD: files.pci,v 1.246 2006/03/31 00:03:57 rittera Exp $
|
||||||
#
|
#
|
||||||
# Config file and device description for machine-independent PCI code.
|
# Config file and device description for machine-independent PCI code.
|
||||||
# Included by ports that need it. Requires that the SCSI files be
|
# Included by ports that need it. Requires that the SCSI files be
|
||||||
@ -761,6 +761,12 @@ file dev/pci/if_dge.c dge
|
|||||||
attach re at pci with re_pci
|
attach re at pci with re_pci
|
||||||
file dev/pci/if_re_pci.c re_pci
|
file dev/pci/if_re_pci.c re_pci
|
||||||
|
|
||||||
|
# Windows NDIS drivers (Experimental)
|
||||||
|
#device ndis
|
||||||
|
#attach ndis at pci
|
||||||
|
#file dev/if_ndis/if_ndis.c
|
||||||
|
#file dev/if_ndis/if_ndis_pci.c
|
||||||
|
|
||||||
# Intel PRO/Wireless 2100
|
# Intel PRO/Wireless 2100
|
||||||
device ipw: ifnet, arp, wlan
|
device ipw: ifnet, arp, wlan
|
||||||
attach ipw at pci
|
attach ipw at pci
|
||||||
|
Loading…
x
Reference in New Issue
Block a user