Date: Fri, 19 Dec 2008 09:29:27 GMT From: Weongyo Jeong <weongyo@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 154981 for review Message-ID: <200812190929.mBJ9TR1K078461@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=154981 Change 154981 by weongyo@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,
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200812190929.mBJ9TR1K078461>