PERFORCE change 154981 for review
Weongyo Jeong
weongyo at FreeBSD.org
Fri Dec 19 01:29:28 PST 2008
http://perforce.freebsd.org/chv.cgi?CH=154981
Change 154981 by weongyo at weongyo_ws on 2008/12/19 09:28:41
implement basic functions to make the mimic PnP Manager but not sure
it'd be useful.
Affected files ...
.. //depot/projects/ndisusb/sys/compat/ndis/kern_ndis.c#7 edit
.. //depot/projects/ndisusb/sys/compat/ndis/ntoskrnl_var.h#6 edit
.. //depot/projects/ndisusb/sys/compat/ndis/subr_ntoskrnl.c#7 edit
.. //depot/projects/ndisusb/sys/compat/ndis/subr_usbd.c#29 edit
.. //depot/projects/ndisusb/sys/compat/ndis/usbd_var.h#6 edit
.. //depot/projects/ndisusb/sys/dev/if_ndis/if_ndis.c#11 edit
Differences ...
==== //depot/projects/ndisusb/sys/compat/ndis/kern_ndis.c#7 (text+ko) ====
@@ -88,6 +88,10 @@
static void ndis_intrsetup(kdpc *, device_object *,
irp *, struct ndis_softc *);
static void ndis_return(device_object *, void *);
+static int32_t ndis_iodispatch(device_object *, irp *);
+static int32_t ndis_ioinvalid(device_object *, irp *);
+static int32_t ndis_pnp(device_object *, irp *);
+static int32_t ndis_power(device_object *, irp *);
static image_patch_table kernndis_functbl[] = {
IMPORT_SFUNC(ndis_status_func, 4),
@@ -104,6 +108,11 @@
static struct nd_head ndis_devhead;
+static funcptr ndis_iodispatch_wrap;
+static funcptr ndis_ioinvalid_wrap;
+static funcptr ndis_pnp_wrap;
+static funcptr ndis_power_wrap;
+
/*
* This allows us to export our symbols to other modules.
* Note that we call ourselves 'ndisapi' to avoid a namespace
@@ -148,6 +157,15 @@
TAILQ_INIT(&ndis_devhead);
+ windrv_wrap((funcptr)ndis_ioinvalid,
+ (funcptr *)&ndis_ioinvalid_wrap, 2, WINDRV_WRAP_STDCALL);
+ windrv_wrap((funcptr)ndis_iodispatch,
+ (funcptr *)&ndis_iodispatch_wrap, 2, WINDRV_WRAP_STDCALL);
+ windrv_wrap((funcptr)ndis_pnp,
+ (funcptr *)&ndis_pnp_wrap, 2, WINDRV_WRAP_STDCALL);
+ windrv_wrap((funcptr)ndis_power,
+ (funcptr *)&ndis_power_wrap, 2, WINDRV_WRAP_STDCALL);
+
break;
case MOD_SHUTDOWN:
if (TAILQ_FIRST(&ndis_devhead) == NULL) {
@@ -163,6 +181,11 @@
windrv_unwrap(patch->ipt_wrap);
patch++;
}
+
+ windrv_unwrap(ndis_ioinvalid_wrap);
+ windrv_unwrap(ndis_iodispatch_wrap);
+ windrv_unwrap(ndis_pnp_wrap);
+ windrv_unwrap(ndis_power_wrap);
}
break;
case MOD_UNLOAD:
@@ -1370,7 +1393,7 @@
ndis_miniport_block *block;
struct ndis_softc *sc;
uint32_t status;
- int error;
+ int error, i;
sc = device_get_softc(pdo->do_devext);
@@ -1444,9 +1467,96 @@
TAILQ_INSERT_TAIL(&ndis_devhead, block, link);
+ for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
+ drv->dro_dispatch[i] = (driver_dispatch)ndis_ioinvalid_wrap;
+ drv->dro_dispatch[IRP_MJ_INTERNAL_DEVICE_CONTROL] =
+ (driver_dispatch)ndis_iodispatch_wrap;
+ drv->dro_dispatch[IRP_MJ_POWER] = (driver_dispatch)ndis_power_wrap;
+ drv->dro_dispatch[IRP_MJ_PNP] = (driver_dispatch)ndis_pnp_wrap;
+
return (STATUS_SUCCESS);
}
+static int32_t
+ndis_ioinvalid(dobj, ip)
+ device_object *dobj;
+ irp *ip;
+{
+ device_t dev = IRP_NDIS_DEV(ip);
+ struct io_stack_location *irp_sl;
+
+ irp_sl = IoGetCurrentIrpStackLocation(ip);
+ device_printf(dev, "%s: unsupported I/O dispatch %d:%d\n",
+ __func__, irp_sl->isl_major, irp_sl->isl_minor);
+
+ ip->irp_iostat.isb_status = STATUS_FAILURE;
+ ip->irp_iostat.isb_info = 0;
+
+ IoCompleteRequest(ip, IO_NO_INCREMENT);
+
+ return (STATUS_FAILURE);
+}
+
+static int32_t
+ndis_iodispatch(dobj, ip)
+ device_object *dobj;
+ irp *ip;
+{
+ device_t dev = IRP_NDIS_DEV(ip);
+ struct io_stack_location *irp_sl;
+
+ irp_sl = IoGetCurrentIrpStackLocation(ip);
+ device_printf(dev, "%s: unsupported I/O dispatch %d:%d\n",
+ __func__, irp_sl->isl_major, irp_sl->isl_minor);
+
+ ip->irp_iostat.isb_status = STATUS_FAILURE;
+ ip->irp_iostat.isb_info = 0;
+
+ IoCompleteRequest(ip, IO_NO_INCREMENT);
+
+ return (STATUS_FAILURE);
+}
+
+static int32_t
+ndis_power(dobj, ip)
+ device_object *dobj;
+ irp *ip;
+{
+ device_t dev = IRP_NDIS_DEV(ip);
+ struct io_stack_location *irp_sl;
+
+ irp_sl = IoGetCurrentIrpStackLocation(ip);
+ device_printf(dev, "%s: unsupported I/O dispatch %d:%d\n",
+ __func__, irp_sl->isl_major, irp_sl->isl_minor);
+
+ ip->irp_iostat.isb_status = STATUS_FAILURE;
+ ip->irp_iostat.isb_info = 0;
+
+ IoCompleteRequest(ip, IO_NO_INCREMENT);
+
+ return (STATUS_FAILURE);
+}
+
+static int32_t
+ndis_pnp(dobj, ip)
+ device_object *dobj;
+ irp *ip;
+{
+ device_t dev = IRP_NDIS_DEV(ip);
+ struct io_stack_location *irp_sl;
+
+ irp_sl = IoGetCurrentIrpStackLocation(ip);
+ device_printf(dev, "%s: unsupported I/O dispatch %d:%d\n",
+ __func__, irp_sl->isl_major, irp_sl->isl_minor);
+
+ ip->irp_iostat.isb_status = STATUS_FAILURE;
+ ip->irp_iostat.isb_info = 0;
+
+ IoCompleteRequest(ip, IO_NO_INCREMENT);
+
+ return (STATUS_FAILURE);
+}
+
int
ndis_unload_driver(arg)
void *arg;
==== //depot/projects/ndisusb/sys/compat/ndis/ntoskrnl_var.h#6 (text+ko) ====
@@ -924,6 +924,10 @@
void *isl_arg3;
void *isl_arg4;
} isl_others;
+ struct {
+ void *isl_res;
+ void *isl_restran;
+ } isl_startdev;
} isl_parameters __attribute__((packed));
void *isl_devobj;
@@ -1419,6 +1423,8 @@
extern void IoFreeWorkItem(io_workitem *);
extern void IoQueueWorkItem(io_workitem *, io_workitem_func,
uint32_t, void *);
+extern irp *IoBuildSynchronousFsdRequest(uint32_t, device_object *,
+ void *, uint32_t, uint64_t *, nt_kevent *, io_status_block *);
#define IoCallDriver(a, b) IofCallDriver(a, b)
#define IoCompleteRequest(a, b) IofCompleteRequest(a, b)
==== //depot/projects/ndisusb/sys/compat/ndis/subr_ntoskrnl.c#7 (text+ko) ====
@@ -130,8 +130,6 @@
unicode_string *, uint8_t);
static void RtlCopyUnicodeString(unicode_string *,
unicode_string *);
-static irp *IoBuildSynchronousFsdRequest(uint32_t, device_object *,
- void *, uint32_t, uint64_t *, nt_kevent *, io_status_block *);
static irp *IoBuildAsynchronousFsdRequest(uint32_t,
device_object *, void *, uint32_t, uint64_t *, io_status_block *);
static irp *IoBuildDeviceIoControlRequest(uint32_t,
@@ -860,7 +858,7 @@
return (d);
}
-static irp *
+irp *
IoBuildSynchronousFsdRequest(func, dobj, buf, len, off, event, status)
uint32_t func;
device_object *dobj;
==== //depot/projects/ndisusb/sys/compat/ndis/subr_usbd.c#29 (text+ko) ====
@@ -91,6 +91,8 @@
static int32_t usbd_ioinvalid(device_object *, irp *);
static int32_t usbd_pnp(device_object *, irp *);
static int32_t usbd_power(device_object *, irp *);
+static uint32_t usbd_sendirp(device_t, device_object *, uint32_t,
+ uint32_t, io_stack_location *);
static void usbd_irpcancel(device_object *, irp *);
static void usbd_irpcancel_cb(void *);
static void usbd_irpcancel_iin(device_object *, irp *);
@@ -297,6 +299,55 @@
return (STATUS_FAILURE);
}
+static uint32_t
+usbd_sendirp(dev, pdo, major, minor, sl)
+ device_t dev;
+ device_object *pdo;
+ uint32_t major;
+ uint32_t minor;
+ io_stack_location *sl;
+{
+ device_object *top = IoGetAttachedDevice(pdo);
+ io_stack_location *irp_sl;
+ irp *ip;
+ nt_kevent evt;
+ uint32_t status;
+
+ KeInitializeEvent(&evt, EVENT_TYPE_NOTIFY, FALSE);
+ ip = IoBuildSynchronousFsdRequest(IRP_MJ_PNP, top, NULL, 0, NULL, &evt,
+ NULL);
+ if (ip == NULL)
+ return (STATUS_NO_MEMORY);
+ ip->irp_iostat.isb_info = 0;
+ ip->irp_iostat.isb_status = STATUS_NOT_IMPLEMENTED;
+ IRP_NDIS_DEV(ip) = dev;
+ irp_sl = IoGetNextIrpStackLocation(ip);
+ if (sl != NULL)
+ bcopy(sl, irp_sl, sizeof(*sl));
+ irp_sl->isl_major = major;
+ irp_sl->isl_minor = minor;
+ status = IoCallDriver(top, ip);
+ if (status == STATUS_PENDING) {
+ KeWaitForSingleObject(&evt, 0, 0, FALSE, NULL);
+ status = ip->irp_iostat.isb_status;
+ }
+ return (status);
+}
+
+uint32_t
+usbd_pnp_startdev(dev, pdo)
+ device_t dev;
+ device_object *pdo;
+{
+ io_stack_location sl;
+
+ bzero(&sl, sizeof(sl));
+ sl.isl_parameters.isl_startdev.isl_res = NULL;
+ sl.isl_parameters.isl_startdev.isl_restran = NULL;
+
+ return usbd_sendirp(dev, pdo, IRP_MJ_PNP, IRP_MN_START_DEVICE, &sl);
+}
+
/* Convert USBD_STATUS to NTSTATUS */
static int32_t
usbd_urb2nt(status)
==== //depot/projects/ndisusb/sys/compat/ndis/usbd_var.h#6 (text+ko) ====
@@ -217,6 +217,7 @@
__BEGIN_DECLS
extern int usbd_libinit(void);
extern int usbd_libfini(void);
+extern uint32_t usbd_pnp_startdev(device_t, device_object *);
__END_DECLS
#endif /* _USBD_VAR_H_ */
==== //depot/projects/ndisusb/sys/dev/if_ndis/if_ndis.c#11 (text+ko) ====
@@ -83,6 +83,7 @@
#include <compat/ndis/ntoskrnl_var.h>
#include <compat/ndis/hal_var.h>
#include <compat/ndis/ndis_var.h>
+#include <compat/ndis/usbd_var.h>
#include <dev/if_ndis/if_ndisvar.h>
#define NDIS_DEBUG
@@ -582,6 +583,9 @@
goto fail;
}
+ if (sc->ndis_iftype == PNPBus)
+ usbd_pnp_startdev(dev, pdo);
+
/* Tell the user what version of the API the driver is using. */
device_printf(dev, "NDIS API version: %d.%d\n",
sc->ndis_chars->nmc_version_major,
More information about the p4-projects
mailing list