[bus,driver] Put bus IRP_MJ_POWER handler in driver
authorShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Thu, 23 Dec 2010 17:15:57 +0000 (12:15 -0500)
committerShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Thu, 23 Dec 2010 17:16:42 +0000 (12:16 -0500)
src/include/bus.h
src/winvblock/bus/bus.c
src/winvblock/driver.c

index be7ed73..901be5d 100644 (file)
@@ -98,5 +98,9 @@ extern winvblock__lib_func NTSTATUS STDCALL WvBusSysCtl(
     IN WV_SP_BUS_T,
     IN PIRP
   );
+extern winvblock__lib_func NTSTATUS STDCALL WvBusPower(
+    IN WV_SP_BUS_T,
+    IN PIRP
+  );
 
 #endif  /* WV_M_BUS_H_ */
index 638b496..a16552f 100644 (file)
@@ -60,7 +60,6 @@ typedef struct WV_BUS_WORK_ITEM_ {
 /* Forward declarations. */
 static WV_F_DEV_FREE WvBusFree_;
 static WV_F_DEV_CREATE_PDO WvBusCreatePdo_;
-static WV_F_DEV_DISPATCH WvBusPower_;
 static WV_F_BUS_THREAD WvBusDefaultThread_;
 static winvblock__bool WvBusAddWorkItem_(
     WV_SP_BUS_T,
@@ -70,7 +69,7 @@ static WV_SP_BUS_WORK_ITEM_ WvBusGetWorkItem_(WV_SP_BUS_T);
 
 /* Globals. */
 WV_S_DEV_IRP_MJ WvBusIrpMj_ = {
-    WvBusPower_,
+    (WV_FP_DEV_DISPATCH) 0,
     (WV_FP_DEV_DISPATCH) 0,
     WvBusDevCtlDispatch,
     (WV_FP_DEV_SCSI) 0,
@@ -173,19 +172,18 @@ winvblock__lib_func NTSTATUS STDCALL WvBusSysCtl(
   }
 
 /* Handle a power IRP. */
-static NTSTATUS STDCALL WvBusPower_(
-    IN WV_SP_DEV_T dev,
-    IN PIRP irp
+winvblock__lib_func NTSTATUS STDCALL WvBusPower(
+    IN WV_SP_BUS_T Bus,
+    IN PIRP Irp
   ) {
-    WV_SP_BUS_T bus = WvBusFromDev(dev);
-    PDEVICE_OBJECT lower = bus->LowerDeviceObject;
+    PDEVICE_OBJECT lower = Bus->LowerDeviceObject;
 
-    PoStartNextPowerIrp(irp);
+    PoStartNextPowerIrp(Irp);
     if (lower) {
-        IoSkipCurrentIrpStackLocation(irp);
-        return PoCallDriver(lower, irp);
+        IoSkipCurrentIrpStackLocation(Irp);
+        return PoCallDriver(lower, Irp);
       }
-    return driver__complete_irp(irp, 0, STATUS_SUCCESS);
+    return driver__complete_irp(Irp, 0, STATUS_SUCCESS);
   }
 
 NTSTATUS STDCALL WvBusGetDevCapabilities(
index 433d89c..d8b9b4c 100644 (file)
@@ -80,6 +80,7 @@ static driver__dispatch_func driver__dispatch_scsi_;
 static driver__dispatch_func driver__dispatch_pnp_;
 static void STDCALL driver__unload_(IN PDRIVER_OBJECT);
 static WV_F_DEV_DISPATCH WvDriverBusSysCtl_;
+static WV_F_DEV_DISPATCH WvDriverBusPower_;
 
 static LPWSTR STDCALL get_opt(IN LPWSTR opt_name) {
     LPWSTR our_opts, the_opt;
@@ -183,6 +184,7 @@ static NTSTATUS STDCALL driver__attach_fdo_(
     WvDriverBus_.Dev.Self = WvDriverBus_.Fdo = fdo;
     WvDriverBus_.Dev.IsBus = TRUE;
     WvDriverBus_.Dev.IrpMj->SysCtl = WvDriverBusSysCtl_;
+    WvDriverBus_.Dev.IrpMj->Power = WvDriverBusPower_;
     WvDriverBus_.PhysicalDeviceObject = PhysicalDeviceObject;
     fdo->Flags |= DO_DIRECT_IO;         /* FIXME? */
     fdo->Flags |= DO_POWER_INRUSH;      /* FIXME? */
@@ -572,3 +574,10 @@ static NTSTATUS STDCALL WvDriverBusSysCtl_(IN WV_SP_DEV_T dev, IN PIRP irp) {
 
     return WvBusSysCtl(bus, irp);
   }
+
+/* Pass a power IRP to the bus. */
+static NTSTATUS STDCALL WvDriverBusPower_(IN WV_SP_DEV_T dev, IN PIRP irp) {
+    WV_SP_BUS_T bus = WvBusFromDev(dev);
+
+    return WvBusPower(bus, irp);
+  }