[ofw] [PATCH] add missing PNP event handlers to reduce debug confusion
Smith, Stan
stan.smith at intel.com
Wed Jun 29 10:12:53 PDT 2011
Hello,
In the function cl_pnp_po.c::cl_pnp() there is no handler for the following PNP minor functions:
IRP_MN_QUERY_LEGACY_BUS_INFORMATION
IRP_MN_DEVICE_ENUMERATED (new for win7)
Which at first discovery (DEBUG only with CL_DBG_PNP) appears to be a problem as they are output as 'Unknown IRP minor function 0x%x'.
This patch does not change the behavior of how these IRP minor functions are handled, the difference is in actual case statements for the minor functions and DEBUG output.
Case statements show someone has investigated the missing support and leaves a framework should IBAL need to handle these minor functions in the future.
Also repair short lines split by pretty-print, combine back into a single line of code for readability.
Split long lines inserted after pretty print was run.
Signed-off-by: stan smith <stan.smith at intel.com>
--- core/complib/kernel/cl_pnp_po.c Tue Jun 28 14:01:37 2011
+++ core/complib/kernel/cl_pnp_po.c Mon Jun 27 13:22:09 2011
@@ -194,8 +194,8 @@
CL_TRACE_EXIT( CL_DBG_ERROR, p_ext->dbg_lvl,
("IoAcquireRemoveLock returned %08x.\n", status) );
p_io_stack = IoGetCurrentIrpStackLocation( p_irp );
- CL_TRACE( CL_DBG_PNP, p_ext->dbg_lvl,
- ("Minor function %x for %s\n", p_io_stack->MinorFunction, p_ext->vfptr_pnp_po->identity) );
+ CL_TRACE( CL_DBG_PNP, p_ext->dbg_lvl, ("Minor function %x for %s\n",
+ p_io_stack->MinorFunction, p_ext->vfptr_pnp_po->identity) );
p_irp->IoStatus.Status = status;
IoCompleteRequest( p_irp, IO_NO_INCREMENT );
return status;
@@ -260,8 +260,7 @@
CL_TRACE( CL_DBG_PNP, p_ext->dbg_lvl,
("IRP_MN_QUERY_CAPABILITIES for %s\n",
p_ext->vfptr_pnp_po->identity) );
- status = p_ext->vfptr_pnp_po->pfn_query_capabilities(
- p_dev_obj, p_irp, &action );
+ status = p_ext->vfptr_pnp_po->pfn_query_capabilities( p_dev_obj, p_irp, &action );
break;
case IRP_MN_QUERY_PNP_DEVICE_STATE:
@@ -275,8 +274,7 @@
CL_TRACE( CL_DBG_PNP, p_ext->dbg_lvl,
("IRP_MN_FILTER_RESOURCE_REQUIREMENTS for %s\n",
p_ext->vfptr_pnp_po->identity) );
- status = p_ext->vfptr_pnp_po->pfn_filter_res_req(
- p_dev_obj, p_irp, &action );
+ status = p_ext->vfptr_pnp_po->pfn_filter_res_req( p_dev_obj, p_irp, &action );
break;
case IRP_MN_DEVICE_USAGE_NOTIFICATION:
@@ -296,16 +294,14 @@
case IRP_MN_QUERY_RESOURCES:
CL_TRACE( CL_DBG_PNP, p_ext->dbg_lvl, ("IRP_MN_QUERY_RESOURCES for %s\n",
p_ext->vfptr_pnp_po->identity) );
- status = p_ext->vfptr_pnp_po->pfn_query_resources(
- p_dev_obj, p_irp, &action );
+ status = p_ext->vfptr_pnp_po->pfn_query_resources( p_dev_obj, p_irp, &action );
break;
case IRP_MN_QUERY_RESOURCE_REQUIREMENTS:
CL_TRACE( CL_DBG_PNP, p_ext->dbg_lvl,
("IRP_MN_QUERY_RESOURCE_REQUIREMENTS for %s\n",
p_ext->vfptr_pnp_po->identity) );
- status = p_ext->vfptr_pnp_po->pfn_query_res_req(
- p_dev_obj, p_irp, &action );
+ status = p_ext->vfptr_pnp_po->pfn_query_res_req( p_dev_obj, p_irp, &action );
break;
case IRP_MN_QUERY_ID:
@@ -346,30 +342,52 @@
case IRP_MN_WRITE_CONFIG:
CL_TRACE( CL_DBG_PNP, p_ext->dbg_lvl,
("IRP_MN_WRITE_CONFIG for %s\n", p_ext->vfptr_pnp_po->identity) );
- status = p_ext->vfptr_pnp_po->pfn_write_config(
- p_dev_obj, p_irp, &action );
+ status = p_ext->vfptr_pnp_po->pfn_write_config( p_dev_obj, p_irp, &action );
break;
case IRP_MN_EJECT:
CL_TRACE( CL_DBG_PNP, p_ext->dbg_lvl,
("IRP_MN_EJECT for %s\n", p_ext->vfptr_pnp_po->identity) );
- status = p_ext->vfptr_pnp_po->pfn_eject(
- p_dev_obj, p_irp, &action );
+ status = p_ext->vfptr_pnp_po->pfn_eject( p_dev_obj, p_irp, &action );
break;
case IRP_MN_SET_LOCK:
CL_TRACE( CL_DBG_PNP, p_ext->dbg_lvl,
("IRP_MN_SET_LOCK for %s\n", p_ext->vfptr_pnp_po->identity) );
- status = p_ext->vfptr_pnp_po->pfn_set_lock(
- p_dev_obj, p_irp, &action );
+ status = p_ext->vfptr_pnp_po->pfn_set_lock( p_dev_obj, p_irp, &action );
+ break;
+
+ case IRP_MN_QUERY_LEGACY_BUS_INFORMATION:
+ /* See WinDDK\*\inc\ddk\wdm.h */
+ CL_TRACE( CL_DBG_PNP, p_ext->dbg_lvl,
+ ("Unsupported IRP_MN_QUERY_LEGACY_BUS_INFORMATION for %s\n",
+ p_ext->vfptr_pnp_po->identity) );
+ status = p_ext->vfptr_pnp_po->pfn_unknown( p_dev_obj, p_irp, &action );
+ break;
+
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+ case IRP_MN_DEVICE_ENUMERATED:
+ /* sent to the bus driver's pdo to tell the bus driver that the pdo is a
+ * real/valid pdo. In between the pdo being created and reported in
+ * busrelations and this minor code, the pdo is not a valid pdo (eg. if
+ * you passed this PDO to an Ioxxx api which requires a pdo you will
+ * bugcheck), so once this minor code is received, the PDO is 'valid'
+ * and will not bugcheck.
+ * The good news is IBAL does not use the PDO prior to this call so the
+ * bugcheck is not an issue [6-21-111].
+ */
+ CL_TRACE( CL_DBG_PNP, p_ext->dbg_lvl,
+ ("Unsupported IRP_MN_DEVICE_ENUMERATED for %s\n",
+ p_ext->vfptr_pnp_po->identity) );
+ status = p_ext->vfptr_pnp_po->pfn_unknown( p_dev_obj, p_irp, &action );
break;
+#endif
default:
CL_TRACE( CL_DBG_PNP, p_ext->dbg_lvl,
("Unknown IRP minor function 0x%x for %s\n",
- p_io_stack->MinorFunction, p_ext->vfptr_pnp_po->identity) );
- status = p_ext->vfptr_pnp_po->pfn_unknown(
- p_dev_obj, p_irp, &action );
+ p_io_stack->MinorFunction, p_ext->vfptr_pnp_po->identity) );
+ status = p_ext->vfptr_pnp_po->pfn_unknown( p_dev_obj, p_irp, &action );
break;
}
@@ -377,8 +395,9 @@
{
case IrpPassDown:
p_irp->IoStatus.Status = status;
- CL_TRACE( CL_DBG_PNP, p_ext->dbg_lvl, ("IrpPassDown: passing down to PDO %p, ext %p, status %#x\n",
- p_ext->p_next_do, p_ext, p_irp->IoStatus.Status) );
+ CL_TRACE( CL_DBG_PNP, p_ext->dbg_lvl,
+ ("IrpPassDown: passing down to PDO %p, ext %p, status %#x\n",
+ p_ext->p_next_do, p_ext, p_irp->IoStatus.Status) );
IoCopyCurrentIrpStackLocationToNext( p_irp );
status = IoCallDriver( p_ext->p_next_do, p_irp );
break;
@@ -387,8 +406,9 @@
p_irp->IoStatus.Status = status;
case IrpIgnore:
- CL_TRACE( CL_DBG_PNP, p_ext->dbg_lvl, ("IrpSkip/IrpIgnore: skipping down to PDO %p, ext %p, status %#x\n",
- p_ext->p_next_do, p_ext, p_irp->IoStatus.Status) );
+ CL_TRACE( CL_DBG_PNP, p_ext->dbg_lvl,
+ ("IrpSkip/IrpIgnore: skipping down to PDO %p, ext %p, status %#x\n",
+ p_ext->p_next_do, p_ext, p_irp->IoStatus.Status) );
IoSkipCurrentIrpStackLocation( p_irp );
status = IoCallDriver( p_ext->p_next_do, p_irp );
break;
@@ -405,8 +425,9 @@
break;
}
- CL_TRACE_EXIT( CL_DBG_PNP, p_ext->dbg_lvl, ("returned with status %#x, p_irp->IoStatus.Status %#x\n",
- status, p_irp->IoStatus.Status ) );
+ CL_TRACE_EXIT( CL_DBG_PNP, p_ext->dbg_lvl,
+ ("returned with status %#x, p_irp->IoStatus.Status %#x\n",
+ status, p_irp->IoStatus.Status ) );
if( action != IrpDoNothing )
IoReleaseRemoveLock( &p_ext->remove_lock, p_irp );
More information about the ofw
mailing list