summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
Diffstat (limited to 'sys')
-rw-r--r--sys/compat/ndis/kern_ndis.c2
-rw-r--r--sys/compat/ndis/kern_windrv.c108
-rw-r--r--sys/compat/ndis/ntoskrnl_var.h13
-rw-r--r--sys/compat/ndis/subr_hal.c2
-rw-r--r--sys/compat/ndis/subr_ndis.c19
-rw-r--r--sys/compat/ndis/subr_ntoskrnl.c5
-rw-r--r--sys/conf/files.amd641
-rw-r--r--sys/conf/files.i3861
-rw-r--r--sys/dev/if_ndis/if_ndis.c30
-rw-r--r--sys/dev/if_ndis/if_ndis_pccard.c91
-rw-r--r--sys/dev/if_ndis/if_ndis_pci.c90
-rw-r--r--sys/dev/if_ndis/if_ndis_usb.c29
-rw-r--r--sys/dev/if_ndis/if_ndisvar.h1
-rw-r--r--sys/modules/Makefile3
-rw-r--r--sys/modules/if_ndis/Makefile3
15 files changed, 209 insertions, 189 deletions
diff --git a/sys/compat/ndis/kern_ndis.c b/sys/compat/ndis/kern_ndis.c
index b7b472a..56832ea 100644
--- a/sys/compat/ndis/kern_ndis.c
+++ b/sys/compat/ndis/kern_ndis.c
@@ -66,11 +66,11 @@ __FBSDID("$FreeBSD$");
#include <net80211/ieee80211_ioctl.h>
#include <compat/ndis/pe_var.h>
+#include <compat/ndis/cfg_var.h>
#include <compat/ndis/resource_var.h>
#include <compat/ndis/ntoskrnl_var.h>
#include <compat/ndis/ndis_var.h>
#include <compat/ndis/hal_var.h>
-#include <compat/ndis/cfg_var.h>
#include <compat/ndis/usbd_var.h>
#include <dev/if_ndis/if_ndisvar.h>
diff --git a/sys/compat/ndis/kern_windrv.c b/sys/compat/ndis/kern_windrv.c
index cd631fd..11a5824 100644
--- a/sys/compat/ndis/kern_windrv.c
+++ b/sys/compat/ndis/kern_windrv.c
@@ -64,22 +64,6 @@ __FBSDID("$FreeBSD$");
#include <compat/ndis/hal_var.h>
#include <compat/ndis/usbd_var.h>
-struct windrv_type {
- uint16_t windrv_vid; /* for PCI or USB */
- uint16_t windrv_did; /* for PCI or USB */
- uint32_t windrv_subsys; /* for PCI */
- char *windrv_vname; /* for pccard */
- char *windrv_dname; /* for pccard */
- char *windrv_name; /* for pccard, PCI or USB */
-};
-
-struct drvdb_ent {
- driver_object *windrv_object;
- struct windrv_type *windrv_devlist;
- ndis_cfg *windrv_regvals;
- STAILQ_ENTRY(drvdb_ent) link;
-};
-
struct mtx drvdb_mtx;
static STAILQ_HEAD(drvdb, drvdb_ent) drvdb_head;
@@ -208,6 +192,29 @@ windrv_lookup(img, name)
return(NULL);
}
+struct drvdb_ent *
+windrv_match(matchfunc, ctx)
+ matchfuncptr matchfunc;
+ void *ctx;
+{
+ struct drvdb_ent *d;
+ int match;
+
+ mtx_lock(&drvdb_mtx);
+ STAILQ_FOREACH(d, &drvdb_head, link) {
+ if (d->windrv_devlist == NULL)
+ continue;
+ match = matchfunc(d->windrv_devlist, ctx);
+ if (match == TRUE) {
+ mtx_unlock(&drvdb_mtx);
+ return(d);
+ }
+ }
+ mtx_unlock(&drvdb_mtx);
+
+ return(NULL);
+}
+
/*
* Remove a driver_object from our datatabase and destroy it. Throw
* away any custom driver extension info that may have been added.
@@ -219,15 +226,52 @@ windrv_unload(mod, img, len)
vm_offset_t img;
int len;
{
- struct drvdb_ent *d, *r = NULL;
+ struct drvdb_ent *db, *r = NULL;
driver_object *drv;
+ device_object *d, *pdo;
+ device_t dev;
list_entry *e, *c;
+ drv = windrv_lookup(img, NULL);
+
+ /*
+ * When we unload a driver image, we need to force a
+ * detach of any devices that might be using it. We
+ * need the PDOs of all attached devices for this.
+ * Getting at them is a little hard. We basically
+ * have to walk the device lists of all our bus
+ * drivers.
+ */
+
mtx_lock(&drvdb_mtx);
- STAILQ_FOREACH(d, &drvdb_head, link) {
- if (d->windrv_object->dro_driverstart == (void *)img) {
- r = d;
- STAILQ_REMOVE(&drvdb_head, d, drvdb_ent, link);
+ STAILQ_FOREACH(db, &drvdb_head, link) {
+ /*
+ * Fake bus drivers have no devlist info.
+ * If this driver has devlist info, it's
+ * a loaded Windows driver and has no PDOs,
+ * so skip it.
+ */
+ if (db->windrv_devlist != NULL)
+ continue;
+ pdo = db->windrv_object->dro_devobj;
+ while (pdo != NULL) {
+ d = pdo->do_attacheddev;
+ if (d->do_drvobj != drv) {
+ pdo = pdo->do_nextdev;
+ continue;
+ }
+ dev = pdo->do_devext;
+ pdo = pdo->do_nextdev;
+ mtx_unlock(&drvdb_mtx);
+ device_detach(dev);
+ mtx_lock(&drvdb_mtx);
+ }
+ }
+
+ STAILQ_FOREACH(db, &drvdb_head, link) {
+ if (db->windrv_object->dro_driverstart == (void *)img) {
+ r = db;
+ STAILQ_REMOVE(&drvdb_head, db, drvdb_ent, link);
break;
}
}
@@ -269,10 +313,13 @@ windrv_unload(mod, img, len)
*/
int
-windrv_load(mod, img, len)
+windrv_load(mod, img, len, bustype, devlist, regvals)
module_t mod;
vm_offset_t img;
int len;
+ interface_type bustype;
+ void *devlist;
+ ndis_cfg *regvals;
{
image_import_descriptor imp_desc;
image_optional_header opt_hdr;
@@ -350,6 +397,9 @@ windrv_load(mod, img, len)
&drv->dro_drivername.us_buf);
new->windrv_object = drv;
+ new->windrv_regvals = regvals;
+ new->windrv_devlist = devlist;
+ new->windrv_bustype = bustype;
/* Now call the DriverEntry() function. */
@@ -433,13 +483,16 @@ windrv_find_pdo(drv, bsddev)
mtx_lock(&drvdb_mtx);
pdo = drv->dro_devobj;
- if (pdo->do_devext != bsddev) {
- mtx_unlock(&drvdb_mtx);
- panic("PDO wasn't first device in list");
+ while (pdo != NULL) {
+ if (pdo->do_devext == bsddev) {
+ mtx_unlock(&drvdb_mtx);
+ return(pdo);
+ }
+ pdo = pdo->do_nextdev;
}
mtx_unlock(&drvdb_mtx);
- return(pdo);
+ return(NULL);
}
/*
@@ -628,9 +681,8 @@ ctxsw_wtou(void)
#ifdef EXTRA_SANITY
if (t->tid_cpu != curthread->td_oncpu)
- panic("ctxswGOT MOVED TO OTHER CPU!");
+ panic("ctxsw GOT MOVED TO OTHER CPU!");
#endif
-
return;
}
diff --git a/sys/compat/ndis/ntoskrnl_var.h b/sys/compat/ndis/ntoskrnl_var.h
index 55e3c1e..2ef6915 100644
--- a/sys/compat/ndis/ntoskrnl_var.h
+++ b/sys/compat/ndis/ntoskrnl_var.h
@@ -1162,14 +1162,25 @@ typedef struct driver_object driver_object;
#define WINDRV_WRAP_CDECL 4
#define WINDRV_WRAP_AMD64 5
+struct drvdb_ent {
+ driver_object *windrv_object;
+ void *windrv_devlist;
+ ndis_cfg *windrv_regvals;
+ interface_type windrv_bustype;
+ STAILQ_ENTRY(drvdb_ent) link;
+};
+
extern image_patch_table ntoskrnl_functbl[];
typedef void (*funcptr)(void);
+typedef int (*matchfuncptr)(void *, void *);
__BEGIN_DECLS
extern int windrv_libinit(void);
extern int windrv_libfini(void);
extern driver_object *windrv_lookup(vm_offset_t, char *);
-extern int windrv_load(module_t, vm_offset_t, int);
+extern struct drvdb_ent *windrv_match(matchfuncptr, void *);
+extern int windrv_load(module_t, vm_offset_t, int, interface_type,
+ void *, ndis_cfg *);
extern int windrv_unload(module_t, vm_offset_t, int);
extern int windrv_create_pdo(driver_object *, device_t);
extern void windrv_destroy_pdo(driver_object *, device_t);
diff --git a/sys/compat/ndis/subr_hal.c b/sys/compat/ndis/subr_hal.c
index b4170f4..c992c7e 100644
--- a/sys/compat/ndis/subr_hal.c
+++ b/sys/compat/ndis/subr_hal.c
@@ -55,6 +55,8 @@ __FBSDID("$FreeBSD$");
#include <sys/rman.h>
#include <compat/ndis/pe_var.h>
+#include <compat/ndis/resource_var.h>
+#include <compat/ndis/cfg_var.h>
#include <compat/ndis/ntoskrnl_var.h>
#include <compat/ndis/hal_var.h>
diff --git a/sys/compat/ndis/subr_ndis.c b/sys/compat/ndis/subr_ndis.c
index 992a539..7c0d4ad 100644
--- a/sys/compat/ndis/subr_ndis.c
+++ b/sys/compat/ndis/subr_ndis.c
@@ -99,11 +99,11 @@ __FBSDID("$FreeBSD$");
#include <dev/pci/pcivar.h>
#include <compat/ndis/pe_var.h>
+#include <compat/ndis/cfg_var.h>
#include <compat/ndis/resource_var.h>
#include <compat/ndis/ntoskrnl_var.h>
#include <compat/ndis/hal_var.h>
#include <compat/ndis/ndis_var.h>
-#include <compat/ndis/cfg_var.h>
#include <dev/if_ndis/if_ndisvar.h>
static char ndis_filepath[MAXPATHLEN];
@@ -1014,7 +1014,7 @@ NdisWriteErrorLogEntry(ndis_handle adapter, ndis_error_code code,
block = (ndis_miniport_block *)adapter;
dev = block->nmb_physdeviceobj->do_devext;
- drv = block->nmb_physdeviceobj->do_drvobj;
+ drv = block->nmb_deviceobj->do_drvobj;
error = pe_get_message((vm_offset_t)drv->dro_driverstart,
code, &str, &i, &flags);
@@ -1262,7 +1262,6 @@ NdisMCancelTimer(timer, cancelled)
uint8_t *cancelled;
{
*cancelled = KeCancelTimer(&timer->nt_ktimer);
-
return;
}
@@ -2346,10 +2345,18 @@ NdisMSleep(usecs)
{
struct timeval tv;
- tv.tv_sec = 0;
- tv.tv_usec = usecs;
+ /*
+ * During system bootstrap, (i.e. cold == 1), we aren't
+ * allowed to msleep(), so calling ndis_thsuspend() here
+ * will return 0, and we won't actually have delayed. This
+ * is a problem because some drivers expect NdisMSleep()
+ * to always wait, and might fail if the expected delay
+ * period does not in fact elapse. As a workaround, if the
+ * attempt to sleep delay fails, we do a hard DELAY() instead.
+ */
- ndis_thsuspend(curthread->td_proc, NULL, tvtohz(&tv));
+ if (ndis_thsuspend(curthread->td_proc, NULL, tvtohz(&tv)) == 0)
+ DELAY(usecs);
return;
}
diff --git a/sys/compat/ndis/subr_ntoskrnl.c b/sys/compat/ndis/subr_ntoskrnl.c
index bdb9c8f..b3b9040 100644
--- a/sys/compat/ndis/subr_ntoskrnl.c
+++ b/sys/compat/ndis/subr_ntoskrnl.c
@@ -68,13 +68,12 @@ __FBSDID("$FreeBSD$");
#include <vm/uma.h>
#include <compat/ndis/pe_var.h>
+#include <compat/ndis/cfg_var.h>
+#include <compat/ndis/resource_var.h>
#include <compat/ndis/ntoskrnl_var.h>
#include <compat/ndis/hal_var.h>
-#include <compat/ndis/resource_var.h>
#include <compat/ndis/ndis_var.h>
-#define __regparm __attribute__((regparm(3)))
-
static uint8_t RtlEqualUnicodeString(ndis_unicode_string *,
ndis_unicode_string *, uint8_t);
static void RtlCopyUnicodeString(ndis_unicode_string *,
diff --git a/sys/conf/files.amd64 b/sys/conf/files.amd64
index 085108f..6de730c 100644
--- a/sys/conf/files.amd64
+++ b/sys/conf/files.amd64
@@ -140,6 +140,7 @@ dev/if_ndis/if_ndis.c optional ndis
dev/if_ndis/if_ndis_pccard.c optional ndis pccard
dev/if_ndis/if_ndis_pci.c optional ndis cardbus
dev/if_ndis/if_ndis_pci.c optional ndis pci
+dev/if_ndis/if_ndis_usb.c optional ndis usb
dev/io/iodev.c optional io
dev/fdc/fdc.c optional fdc
dev/fdc/fdc_acpi.c optional fdc
diff --git a/sys/conf/files.i386 b/sys/conf/files.i386
index 674de01..3554c30 100644
--- a/sys/conf/files.i386
+++ b/sys/conf/files.i386
@@ -178,6 +178,7 @@ dev/if_ndis/if_ndis.c optional ndis
dev/if_ndis/if_ndis_pccard.c optional ndis pccard
dev/if_ndis/if_ndis_pci.c optional ndis cardbus
dev/if_ndis/if_ndis_pci.c optional ndis pci
+dev/if_ndis/if_ndis_usb.c optional ndis usb
dev/io/iodev.c optional io
dev/kbd/atkbd.c optional atkbd
dev/kbd/atkbdc.c optional atkbdc
diff --git a/sys/dev/if_ndis/if_ndis.c b/sys/dev/if_ndis/if_ndis.c
index aa0f5c2..cb9e38c 100644
--- a/sys/dev/if_ndis/if_ndis.c
+++ b/sys/dev/if_ndis/if_ndis.c
@@ -76,17 +76,18 @@ __FBSDID("$FreeBSD$");
#include <dev/pci/pcivar.h>
#include <compat/ndis/pe_var.h>
+#include <compat/ndis/cfg_var.h>
#include <compat/ndis/resource_var.h>
#include <compat/ndis/ntoskrnl_var.h>
#include <compat/ndis/hal_var.h>
#include <compat/ndis/ndis_var.h>
-#include <compat/ndis/cfg_var.h>
#include <dev/if_ndis/if_ndisvar.h>
-#define NDIS_IMAGE
-#define NDIS_REGVALS
+MODULE_DEPEND(ndis, ether, 1, 1, 1);
+MODULE_DEPEND(ndis, wlan, 1, 1, 1);
+MODULE_DEPEND(ndis, ndisapi, 1, 1, 1);
-#include "ndis_driver_data.h"
+MODULE_VERSION(ndis, 1);
int ndis_attach (device_t);
int ndis_detach (device_t);
@@ -158,8 +159,6 @@ ndisdrv_modevent(mod, cmd, arg)
ndisdrv_loaded++;
if (ndisdrv_loaded > 1)
break;
- if (windrv_load(mod, (vm_offset_t)drv_data, 0))
- return(EINVAL);
windrv_wrap((funcptr)ndis_rxeof, &ndis_rxeof_wrap,
3, WINDRV_WRAP_STDCALL);
windrv_wrap((funcptr)ndis_txeof, &ndis_txeof_wrap,
@@ -173,7 +172,6 @@ ndisdrv_modevent(mod, cmd, arg)
ndisdrv_loaded--;
if (ndisdrv_loaded > 0)
break;
- windrv_unload(mod, (vm_offset_t)drv_data, 0);
windrv_unwrap(ndis_rxeof_wrap);
windrv_unwrap(ndis_txeof_wrap);
windrv_unwrap(ndis_linksts_wrap);
@@ -432,11 +430,9 @@ ndis_attach(dev)
{
u_char eaddr[ETHER_ADDR_LEN];
struct ndis_softc *sc;
- driver_object *drv;
driver_object *pdrv;
device_object *pdo;
struct ifnet *ifp = NULL;
- void *img;
int error = 0, len;
int i;
@@ -472,12 +468,10 @@ ndis_attach(dev)
}
}
- sc->ndis_regvals = ndis_regvals;
-
#if __FreeBSD_version < 502113
sysctl_ctx_init(&sc->ndis_ctx);
-
#endif
+
/* Create sysctl registry nodes */
ndis_create_sysctls(sc);
@@ -497,17 +491,7 @@ ndis_attach(dev)
* for this device instance.
*/
- img = drv_data;
-
- drv = windrv_lookup((vm_offset_t)img, NULL);
-
- if (drv == NULL) {
- device_printf(dev, "failed to find driver_object!\n");
- error = ENXIO;
- goto fail;
- }
-
- if (NdisAddDevice(drv, pdo) != STATUS_SUCCESS) {
+ if (NdisAddDevice(sc->ndis_dobj, pdo) != STATUS_SUCCESS) {
device_printf(dev, "failed to create FDO!\n");
error = ENXIO;
goto fail;
diff --git a/sys/dev/if_ndis/if_ndis_pccard.c b/sys/dev/if_ndis/if_ndis_pccard.c
index 918e89c..c67941a 100644
--- a/sys/dev/if_ndis/if_ndis_pccard.c
+++ b/sys/dev/if_ndis/if_ndis_pccard.c
@@ -54,39 +54,22 @@ __FBSDID("$FreeBSD$");
#include <net80211/ieee80211_var.h>
#include <compat/ndis/pe_var.h>
+#include <compat/ndis/cfg_var.h>
#include <compat/ndis/resource_var.h>
#include <compat/ndis/ntoskrnl_var.h>
#include <compat/ndis/ndis_var.h>
-#include <compat/ndis/cfg_var.h>
#include <dev/if_ndis/if_ndisvar.h>
#include <dev/pccard/pccardvar.h>
#include "card_if.h"
-#include "ndis_driver_data.h"
-
-#ifdef NDIS_PCMCIA_DEV_TABLE
-
MODULE_DEPEND(ndis, pccard, 1, 1, 1);
-MODULE_DEPEND(ndis, ether, 1, 1, 1);
-MODULE_DEPEND(ndis, wlan, 1, 1, 1);
-MODULE_DEPEND(ndis, ndisapi, 1, 1, 1);
-
-/*
- * Various supported device vendors/types and their names.
- * These are defined in the ndis_driver_data.h file.
- */
-static struct ndis_pccard_type ndis_devs[] = {
-#ifdef NDIS_PCMCIA_DEV_TABLE
- NDIS_PCMCIA_DEV_TABLE
-#endif
- { NULL, NULL, NULL }
-};
static int ndis_probe_pccard (device_t);
static int ndis_attach_pccard (device_t);
static struct resource_list *ndis_get_resource_list
(device_t, device_t);
+static int ndis_devcompare (struct ndis_pccard_type *, device_t);
extern int ndisdrv_modevent (module_t, int, void *);
extern int ndis_attach (device_t);
extern int ndis_shutdown (device_t);
@@ -118,63 +101,65 @@ static device_method_t ndis_methods[] = {
};
static driver_t ndis_driver = {
-#ifdef NDIS_DEVNAME
- NDIS_DEVNAME,
-#else
"ndis",
-#endif
ndis_methods,
sizeof(struct ndis_softc)
};
static devclass_t ndis_devclass;
-#ifdef NDIS_MODNAME
-#define NDIS_MODNAME_OVERRIDE_PCMCIA(x) \
- DRIVER_MODULE(x, pccard, ndis_driver, ndis_devclass, \
- ndisdrv_modevent, 0)
-NDIS_MODNAME_OVERRIDE_PCMCIA(NDIS_MODNAME);
-#else
DRIVER_MODULE(ndis, pccard, ndis_driver, ndis_devclass, ndisdrv_modevent, 0);
-#endif
-/*
- * 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.
- */
static int
-ndis_probe_pccard(dev)
+ndis_devcompare(t, dev)
+ struct ndis_pccard_type *t;
device_t dev;
{
- struct ndis_pccard_type *t;
const char *prodstr, *vendstr;
int error;
- driver_object *drv;
-
- drv = windrv_lookup(0, "PCCARD Bus");
- if (drv == NULL)
- return(ENXIO);
-
- t = ndis_devs;
error = pccard_get_product_str(dev, &prodstr);
if (error)
- return(error);
+ return(FALSE);
error = pccard_get_vendor_str(dev, &vendstr);
if (error)
- return(error);
+ return(FALSE);
while(t->ndis_name != NULL) {
if (ndis_strcasecmp(vendstr, t->ndis_vid) == 0 &&
ndis_strcasecmp(prodstr, t->ndis_did) == 0) {
device_set_desc(dev, t->ndis_name);
- /* Create PDO for this device instance */
- windrv_create_pdo(drv, dev);
- return(0);
+ return(TRUE);
}
t++;
}
+ return(FALSE);
+}
+
+/*
+ * 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.
+ */
+static int
+ndis_probe_pccard(dev)
+ device_t dev;
+{
+ driver_object *drv;
+ struct drvdb_ent *db;
+
+ drv = windrv_lookup(0, "PCCARD Bus");
+ if (drv == NULL)
+ return(ENXIO);
+
+ db = windrv_match((matchfuncptr)ndis_devcompare, dev);
+
+ if (db != NULL) {
+ /* Create PDO for this device instance */
+ windrv_create_pdo(drv, dev);
+ return(0);
+ }
+
return(ENXIO);
}
@@ -191,10 +176,16 @@ ndis_attach_pccard(dev)
struct ndis_pccard_type *t;
int devidx = 0;
const char *prodstr, *vendstr;
+ struct drvdb_ent *db;
sc = device_get_softc(dev);
unit = device_get_unit(dev);
sc->ndis_dev = dev;
+
+ db = windrv_match((matchfuncptr)ndis_devcompare, dev);
+ if (db == NULL)
+ return (ENXIO);
+
resource_list_init(&sc->ndis_rl);
sc->ndis_io_rid = 0;
@@ -230,7 +221,7 @@ ndis_attach_pccard(dev)
/* Figure out exactly which device we matched. */
- t = ndis_devs;
+ t = db->windrv_devlist;
error = pccard_get_product_str(dev, &prodstr);
if (error)
@@ -266,8 +257,6 @@ ndis_get_resource_list(dev, child)
return (&sc->ndis_rl);
}
-#endif /* NDIS_PCI_DEV_TABLE */
-
#define NDIS_AM_RID 3
int
diff --git a/sys/dev/if_ndis/if_ndis_pci.c b/sys/dev/if_ndis/if_ndis_pci.c
index 08109e6..1c8691b 100644
--- a/sys/dev/if_ndis/if_ndis_pci.c
+++ b/sys/dev/if_ndis/if_ndis_pci.c
@@ -56,36 +56,19 @@ __FBSDID("$FreeBSD$");
#include <dev/pci/pcivar.h>
#include <compat/ndis/pe_var.h>
+#include <compat/ndis/cfg_var.h>
#include <compat/ndis/resource_var.h>
#include <compat/ndis/ntoskrnl_var.h>
#include <compat/ndis/ndis_var.h>
-#include <compat/ndis/cfg_var.h>
#include <dev/if_ndis/if_ndisvar.h>
-#include "ndis_driver_data.h"
-
-#ifdef NDIS_PCI_DEV_TABLE
-
MODULE_DEPEND(ndis, pci, 1, 1, 1);
-MODULE_DEPEND(ndis, ether, 1, 1, 1);
-MODULE_DEPEND(ndis, wlan, 1, 1, 1);
-MODULE_DEPEND(ndis, ndisapi, 1, 1, 1);
-
-/*
- * Various supported device vendors/types and their names.
- * These are defined in the ndis_driver_data.h file.
- */
-static struct ndis_pci_type ndis_devs[] = {
-#ifdef NDIS_PCI_DEV_TABLE
- NDIS_PCI_DEV_TABLE
-#endif
- { 0, 0, 0, NULL }
-};
static int ndis_probe_pci (device_t);
static int ndis_attach_pci (device_t);
static struct resource_list *ndis_get_resource_list
(device_t, device_t);
+static int ndis_devcompare (struct ndis_pci_type *, device_t);
extern int ndisdrv_modevent (module_t, int, void *);
extern int ndis_attach (device_t);
extern int ndis_shutdown (device_t);
@@ -93,8 +76,6 @@ extern int ndis_detach (device_t);
extern int ndis_suspend (device_t);
extern int ndis_resume (device_t);
-extern unsigned char drv_data[];
-
static device_method_t ndis_methods[] = {
/* Device interface */
DEVMETHOD(device_probe, ndis_probe_pci),
@@ -111,29 +92,34 @@ static device_method_t ndis_methods[] = {
};
static driver_t ndis_driver = {
-#ifdef NDIS_DEVNAME
- NDIS_DEVNAME,
-#else
"ndis",
-#endif
ndis_methods,
sizeof(struct ndis_softc)
};
static devclass_t ndis_devclass;
-#ifdef NDIS_MODNAME
-#define NDIS_MODNAME_OVERRIDE_PCI(x) \
- DRIVER_MODULE(x, pci, ndis_driver, ndis_devclass, ndisdrv_modevent, 0)
-#define NDIS_MODNAME_OVERRIDE_CARDBUS(x) \
- DRIVER_MODULE(x, cardbus, ndis_driver, ndis_devclass, \
- ndisdrv_modevent, 0)
-NDIS_MODNAME_OVERRIDE_PCI(NDIS_MODNAME);
-NDIS_MODNAME_OVERRIDE_CARDBUS(NDIS_MODNAME);
-#else
DRIVER_MODULE(ndis, pci, ndis_driver, ndis_devclass, ndisdrv_modevent, 0);
DRIVER_MODULE(ndis, cardbus, ndis_driver, ndis_devclass, ndisdrv_modevent, 0);
-#endif
+
+static int
+ndis_devcompare(t, dev)
+ struct ndis_pci_type *t;
+ device_t dev;
+{
+ while(t->ndis_name != NULL) {
+ if ((pci_get_vendor(dev) == t->ndis_vid) &&
+ (pci_get_device(dev) == t->ndis_did) &&
+ ((pci_read_config(dev, PCIR_SUBVEND_0, 4) ==
+ t->ndis_subsys) || t->ndis_subsys == 0)) {
+ device_set_desc(dev, t->ndis_name);
+ return(TRUE);
+ }
+ t++;
+ }
+
+ return(FALSE);
+}
/*
* Probe for an NDIS device. Check the PCI vendor and device
@@ -143,27 +129,20 @@ static int
ndis_probe_pci(dev)
device_t dev;
{
- struct ndis_pci_type *t;
driver_object *drv;
+ struct drvdb_ent *db;
- t = ndis_devs;
drv = windrv_lookup(0, "PCI Bus");
if (drv == NULL)
return(ENXIO);
- while(t->ndis_name != NULL) {
- if ((pci_get_vendor(dev) == t->ndis_vid) &&
- (pci_get_device(dev) == t->ndis_did) &&
- ((pci_read_config(dev, PCIR_SUBVEND_0, 4) ==
- t->ndis_subsys) || t->ndis_subsys == 0)) {
- device_set_desc(dev, t->ndis_name);
+ db = windrv_match((matchfuncptr)ndis_devcompare, dev);
- /* Create PDO for this device instance */
- windrv_create_pdo(drv, dev);
- return(0);
- }
- t++;
+ if (db != NULL) {
+ /* Create PDO for this device instance */
+ windrv_create_pdo(drv, dev);
+ return(0);
}
return(ENXIO);
@@ -183,11 +162,18 @@ ndis_attach_pci(dev)
int devidx = 0, defidx = 0;
struct resource_list *rl;
struct resource_list_entry *rle;
+ struct drvdb_ent *db;
sc = device_get_softc(dev);
unit = device_get_unit(dev);
sc->ndis_dev = dev;
+ db = windrv_match((matchfuncptr)ndis_devcompare, dev);
+ if (db == NULL)
+ return (ENXIO);
+ sc->ndis_dobj = db->windrv_object;
+ sc->ndis_regvals = db->windrv_regvals;
+
/*
* Map control/status registers.
*/
@@ -213,6 +199,7 @@ ndis_attach_pci(dev)
error = ENXIO;
goto fail;
}
+ pci_enable_io(dev, SYS_RES_IOPORT);
break;
case SYS_RES_MEMORY:
if (sc->ndis_res_altmem != NULL &&
@@ -250,6 +237,7 @@ ndis_attach_pci(dev)
goto fail;
}
}
+ pci_enable_io(dev, SYS_RES_MEMORY);
break;
case SYS_RES_IRQ:
rid = rle->rid;
@@ -312,7 +300,7 @@ ndis_attach_pci(dev)
/* Figure out exactly which device we matched. */
- t = ndis_devs;
+ t = db->windrv_devlist;
while(t->ndis_name != NULL) {
if ((pci_get_vendor(dev) == t->ndis_vid) &&
@@ -329,7 +317,7 @@ ndis_attach_pci(dev)
devidx++;
}
- if (ndis_devs[devidx].ndis_name == NULL)
+ if (t[devidx].ndis_name == NULL)
sc->ndis_devidx = defidx;
else
sc->ndis_devidx = devidx;
@@ -350,5 +338,3 @@ ndis_get_resource_list(dev, child)
sc = device_get_softc(dev);
return (BUS_GET_RESOURCE_LIST(device_get_parent(sc->ndis_dev), dev));
}
-
-#endif /* NDIS_PCI_DEV_TABLE */
diff --git a/sys/dev/if_ndis/if_ndis_usb.c b/sys/dev/if_ndis/if_ndis_usb.c
index 8199534..b5a6943 100644
--- a/sys/dev/if_ndis/if_ndis_usb.c
+++ b/sys/dev/if_ndis/if_ndis_usb.c
@@ -36,7 +36,7 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/sockio.h>
-#include <sys/mbuf.h>
+#include <sys/module.h>
#include <sys/malloc.h>
#include <sys/kernel.h>
#include <sys/socket.h>
@@ -56,26 +56,18 @@ __FBSDID("$FreeBSD$");
#include <dev/usb/usbdi.h>
#include <dev/usb/usbdi_util.h>
#include <dev/usb/usbdivar.h>
-#include <dev/usb/usbdevs.h>
-#include <dev/usb/usb_ethersubr.h>
+#include "usbdevs.h"
#include <net80211/ieee80211_var.h>
#include <compat/ndis/pe_var.h>
+#include <compat/ndis/cfg_var.h>
#include <compat/ndis/resource_var.h>
#include <compat/ndis/ntoskrnl_var.h>
#include <compat/ndis/ndis_var.h>
-#include <compat/ndis/cfg_var.h>
#include <dev/if_ndis/if_ndisvar.h>
MODULE_DEPEND(ndis, usb, 1, 1, 1);
-MODULE_DEPEND(ndis, ether, 1, 1, 1);
-MODULE_DEPEND(ndis, wlan, 1, 1, 1);
-MODULE_DEPEND(ndis, ndisapi, 1, 1, 1);
-
-#include "ndis_driver_data.h"
-
-#ifdef NDIS_USB_DEV_TABLE
Static int ndisusb_match (device_ptr_t);
Static int ndisusb_attach (device_ptr_t);
@@ -107,24 +99,14 @@ Static device_method_t ndis_methods[] = {
};
Static driver_t ndis_driver = {
-#ifdef NDIS_DEVNAME
- NDIS_DEVNAME,
-#else
"ndis",
-#endif
ndis_methods,
sizeof(struct ndis_softc)
};
Static devclass_t ndis_devclass;
-#ifdef NDIS_MODNAME
-#define NDIS_MODNAME_OVERRIDE_USB(x)
- DRIVER_MODULE(x, usb, ndis_driver, ndis_devclass, ndisdrv_modevent, 0)
-NDIS_MODNAME_OVERRIDE_USB(NDIS_MODNAME);
-#else
DRIVER_MODULE(ndis, uhub, ndis_driver, ndis_devclass, ndisdrv_modevent, 0);
-#endif
USB_MATCH(ndisusb)
{
@@ -147,6 +129,9 @@ USB_ATTACH(ndisusb)
sc = (struct ndis_softc *)dummy;
+ if (uaa->device == NULL)
+ USB_ATTACH_ERROR_RETURN;
+
sc->ndis_dev = self;
/* Create PDO for this device instance */
@@ -170,5 +155,3 @@ ndis_get_resource_list(dev, child)
sc = device_get_softc(dev);
return (BUS_GET_RESOURCE_LIST(device_get_parent(sc->ndis_dev), dev));
}
-
-#endif /* NDIS_USB_DEV_TABLE */
diff --git a/sys/dev/if_ndis/if_ndisvar.h b/sys/dev/if_ndis/if_ndisvar.h
index 0936aaf..68f30f9 100644
--- a/sys/dev/if_ndis/if_ndisvar.h
+++ b/sys/dev/if_ndis/if_ndisvar.h
@@ -122,6 +122,7 @@ struct ndis_softc {
#endif
int ndis_devidx;
interface_type ndis_iftype;
+ driver_object *ndis_dobj;
bus_dma_tag_t ndis_parent_tag;
struct ndis_shmem *ndis_shlist;
diff --git a/sys/modules/Makefile b/sys/modules/Makefile
index bfc5438..cc033d9 100644
--- a/sys/modules/Makefile
+++ b/sys/modules/Makefile
@@ -103,6 +103,7 @@ SUBDIR= ${_3dfx} \
if_faith \
if_gif \
if_gre \
+ ${_if_ndis} \
if_ppp \
if_sl \
if_stf \
@@ -333,6 +334,7 @@ _hfa= hfa
_i2c= i2c
_ibcs2= ibcs2
_ie= ie
+_if_ndis= if_ndis
_io= io
_linprocfs= linprocfs
_linux= linux
@@ -426,6 +428,7 @@ _em= em
_ext2fs= ext2fs
_i2c= i2c
_ida= ida
+_if_ndis= if_ndis
_iir= iir
_io= io
_ips= ips
diff --git a/sys/modules/if_ndis/Makefile b/sys/modules/if_ndis/Makefile
index bce7c96..cbc2ed0 100644
--- a/sys/modules/if_ndis/Makefile
+++ b/sys/modules/if_ndis/Makefile
@@ -3,7 +3,8 @@
.PATH: ${.CURDIR}/../../dev/if_ndis
KMOD= if_ndis
-SRCS= if_ndis.c if_ndis_pci.c if_ndis_pccard.c
+SRCS= if_ndis.c if_ndis_pci.c if_ndis_pccard.c if_ndis_usb.c
SRCS+= opt_bdg.h device_if.h bus_if.h pci_if.h card_if.h pccarddevs.h
+SRCS+= opt_usb.h usbdevs.h
.include <bsd.kmod.mk>
OpenPOWER on IntegriCloud