[driver,bus] Move WvBusAddChild as WvDriverBusAddDev
authorShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Tue, 28 Dec 2010 20:04:35 +0000 (15:04 -0500)
committerShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Tue, 28 Dec 2010 20:04:35 +0000 (15:04 -0500)
Trying to move WV_S_DEV_T usage out of the bus module.

src/aoe/bus.c
src/aoe/driver.c
src/include/bus.h
src/include/device.h
src/include/driver.h
src/winvblock/bus/bus.c
src/winvblock/driver.c
src/winvblock/filedisk/filedisk.c
src/winvblock/filedisk/grub4dos.c
src/winvblock/ramdisk/grub4dos.c
src/winvblock/ramdisk/memdisk.c

index 7b23a43..88d322b 100644 (file)
@@ -118,7 +118,7 @@ winvblock__bool AoeBusCreate(void) {
     /* When the PDO is created, we need to handle PnP ID queries. */
     new_bus->Dev.Ops.PnpId = AoeBusPnpId_;
     /* Add it as a sub-bus to WinVBlock. */
-    if (!WvBusAddChild(driver__bus(), &new_bus->Dev)) {
+    if (!WvDriverBusAddDev(&new_bus->Dev)) {
         DBG("Couldn't add AoE bus to WinVBlock bus!\n");
         goto err_add_child;
       }
index 2dadbee..ce72a7f 100644 (file)
@@ -1586,7 +1586,7 @@ static void AoeProcessAbft_(void) {
     aoe_disk->Timeout = 200000;          /* 20 ms. */
     aoe_disk->disk->BootDrive = TRUE;
     aoe_disk->disk->Media = WvDiskMediaTypeHard;
-    WvBusAddChild(driver__bus(), aoe_disk->disk->Dev);
+    WvDriverBusAddDev(aoe_disk->disk->Dev);
     return;
 
     out_no_abft:
@@ -1761,7 +1761,7 @@ NTSTATUS STDCALL aoe__mount(
     aoe_disk->Timeout = 200000;             /* 20 ms. */
     aoe_disk->disk->BootDrive = FALSE;
     aoe_disk->disk->Media = WvDiskMediaTypeHard;
-    WvBusAddChild(driver__bus(), aoe_disk->disk->Dev);
+    WvDriverBusAddDev(aoe_disk->disk->Dev);
 
     return driver__complete_irp(irp, 0, STATUS_SUCCESS);
   }
index e978a6f..fa92f1a 100644 (file)
@@ -76,10 +76,6 @@ extern NTSTATUS STDCALL WvBusGetDevCapabilities(
   );
 extern winvblock__lib_func void WvBusInit(WV_SP_BUS_T);
 extern winvblock__lib_func WV_SP_BUS_T WvBusCreate(void);
-extern winvblock__lib_func winvblock__bool STDCALL WvBusAddChild(
-    IN OUT WV_SP_BUS_T,
-    IN WV_SP_DEV_T
-  );
 extern winvblock__lib_func WV_SP_BUS_T WvBusFromDev(WV_SP_DEV_T);
 extern winvblock__lib_func void WvBusProcessWorkItems(WV_SP_BUS_T);
 extern winvblock__lib_func void WvBusCancelWorkItems(WV_SP_BUS_T);
index 441b23f..f73ed52 100644 (file)
@@ -38,7 +38,7 @@ typedef enum WV_DEV_STATE {
     WvDevStates
   } WV_E_DEV_STATE, * WV_EP_DEV_STATE;
 
-/* Forward declaration. */
+/* Forward declarations. */
 typedef struct WV_DEV_T WV_S_DEV_T, * WV_SP_DEV_T;
 
 /**
@@ -177,6 +177,8 @@ struct WV_DEV_T {
     WV_E_DEV_STATE State;
     /* Previous state of the device. */
     WV_E_DEV_STATE OldState;
+    /* Support being a node on a bus. */
+    struct WV_BUS_NODE * BusNode;
     /* The next device in the parent bus' devices.  TODO: Don't do this. */
     WV_SP_DEV_T next_sibling_ptr;
     /* The device operations. */
index 4cae244..09ffd3f 100644 (file)
@@ -67,5 +67,8 @@ extern winvblock__lib_func NTSTATUS STDCALL driver__complete_irp(
     IN ULONG_PTR,
     IN NTSTATUS
   );
+extern winvblock__lib_func winvblock__bool STDCALL WvDriverBusAddDev(
+    IN WV_SP_DEV_T
+  );
 
 #endif /* WV_M_DRIVER_H_ */
index 6b7e57f..feb1ae9 100644 (file)
@@ -74,86 +74,6 @@ WV_S_DEV_IRP_MJ WvBusIrpMj_ = {
     (WV_FP_DEV_PNP) 0,
   };
 
-/**
- * Add a child node to the bus.
- *
- * @v Bus               Points to the bus receiving the child.
- * @v Dev               Points to the child device to add.
- * @ret                 TRUE for success, FALSE for failure.
- */
-winvblock__lib_func winvblock__bool STDCALL WvBusAddChild(
-    IN OUT WV_SP_BUS_T Bus,
-    IN OUT WV_SP_DEV_T Dev
-  ) {
-    /* The new node's device object. */
-    PDEVICE_OBJECT dev_obj;
-    /* Walks the child nodes. */
-    WV_SP_DEV_T walker;
-    winvblock__uint32 dev_num;
-
-    DBG("Entry\n");
-    if ((Bus == NULL) || (Dev == NULL)) {
-        DBG("No bus or no device!\n");
-        return FALSE;
-      }
-    /* Create the child device. */
-    dev_obj = WvDevCreatePdo(Dev);
-    if (dev_obj == NULL) {
-        DBG("PDO creation failed!\n");
-        WvDevFree(Dev);
-        return FALSE;
-      }
-
-    Dev->Parent = Bus->Dev.Self;
-    /*
-     * Initialize the device.  For disks, this routine is responsible for
-     * determining the disk's geometry appropriately for AoE/RAM/file disks.
-     */
-    Dev->Ops.Init(Dev);
-    dev_obj->Flags &= ~DO_DEVICE_INITIALIZING;
-    /* Add the new device's extension to the bus' list of children. */
-    dev_num = 0;
-    if (Bus->first_child == NULL) {
-        Bus->first_child = Dev;
-      } else {
-        walker = Bus->first_child;
-        /* If the first child device number isn't 0... */
-        if (walker->DevNum) {
-            /* We insert before. */
-            Dev->next_sibling_ptr = walker;
-            Bus->first_child = Dev;
-          } else {
-            while (walker->next_sibling_ptr != NULL) {
-                /* If there's a gap in the device numbers for the bus... */
-                if (walker->DevNum < walker->next_sibling_ptr->DevNum - 1) {
-                    /* Insert here, instead of at the end. */
-                    dev_num = walker->DevNum + 1;
-                    Dev->next_sibling_ptr = walker->next_sibling_ptr;
-                    walker->next_sibling_ptr = Dev;
-                    break;
-                  }
-                walker = walker->next_sibling_ptr;
-                dev_num = walker->DevNum + 1;
-              }
-            /* If we haven't already inserted the device... */
-            if (!Dev->next_sibling_ptr) {
-                walker->next_sibling_ptr = Dev;
-                dev_num = walker->DevNum + 1;
-              }
-          }
-      }
-    Dev->DevNum = dev_num;
-    Bus->Children++;
-    if (Bus->PhysicalDeviceObject != NULL) {
-        IoInvalidateDeviceRelations(
-            Bus->PhysicalDeviceObject,
-            BusRelations
-          );
-      }
-    DBG("Exit\n");
-    return TRUE;
-  }
-
 /* Handle an IRP_MJ_SYSTEM_CONTROL IRP. */
 winvblock__lib_func NTSTATUS STDCALL WvBusSysCtl(
     IN WV_SP_BUS_T Bus,
@@ -492,17 +412,20 @@ winvblock__lib_func void WvBusProcessWorkItems(WV_SP_BUS_T Bus) {
     PIO_STACK_LOCATION io_stack_loc;
     PDEVICE_OBJECT dev_obj;
     PDRIVER_OBJECT driver_obj;
+    winvblock__bool nodes_changed;
 
     while (work_item = WvBusGetWorkItem_(Bus)) {
         switch (work_item->Cmd) {
             case WvBusWorkItemCmdAddPdo_:
               node = work_item->Context.Node;
               WvBusAddNode_(Bus, node);
+              nodes_changed = TRUE;
               break;
 
             case WvBusWorkItemCmdRemovePdo_:
               node = work_item->Context.Node;
               WvBusRemoveNode_(Bus, node);
+              nodes_changed = TRUE;
               break;
 
             case WvBusWorkItemCmdProcessIrp_:
@@ -521,6 +444,13 @@ winvblock__lib_func void WvBusProcessWorkItems(WV_SP_BUS_T Bus) {
           }
         wv_free(work_item);
       }
+    if (nodes_changed && Bus->PhysicalDeviceObject) {
+        nodes_changed = FALSE;
+        IoInvalidateDeviceRelations(
+            Bus->PhysicalDeviceObject,
+            BusRelations
+          );
+      }
     return;
   }
 
index 71e49ee..d054bb3 100644 (file)
@@ -595,3 +595,48 @@ static NTSTATUS STDCALL WvDriverBusPnp_(
     return WvBusPnp(bus, irp, code);
   }
     
+/**
+ * Add a child node to the bus.
+ *
+ * @v Dev               Points to the child device to add.
+ * @ret                 TRUE for success, FALSE for failure.
+ */
+winvblock__lib_func winvblock__bool STDCALL WvDriverBusAddDev(
+    IN OUT WV_SP_DEV_T Dev
+  ) {
+    /* The new node's device object. */
+    PDEVICE_OBJECT dev_obj;
+
+    DBG("Entry\n");
+    if (!WvDriverBusFdo_ || !Dev) {
+        DBG("No bus or no device!\n");
+        return FALSE;
+      }
+    /* Create the child device. */
+    dev_obj = WvDevCreatePdo(Dev);
+    if (!dev_obj) {
+        DBG("PDO creation failed!\n");
+        return FALSE;
+      }
+    /* Create a node.  TODO: Put the node somewhere better. */
+    Dev->BusNode = wv_malloc(sizeof *(Dev->BusNode));
+    if (!Dev->BusNode) {
+        DBG("Couldn't allocate node storage!\n");
+        IoDeleteDevice(dev_obj);
+        return FALSE;
+      }
+    WvBusInitNode(Dev->BusNode, dev_obj);
+    /* Associate the parent bus. */
+    Dev->Parent = WvDriverBus_.Dev.Self;
+    /*
+     * Initialize the device.  For disks, this routine is responsible for
+     * determining the disk's geometry appropriately for AoE/RAM/file disks.
+     */
+    Dev->Ops.Init(Dev);
+    dev_obj->Flags &= ~DO_DEVICE_INITIALIZING;
+    /* Add the new PDO device to the bus' list of children. */
+    WvBusAddNode(&WvDriverBus_, Dev->BusNode);
+
+    DBG("Exit\n");
+    return TRUE;
+  }
index 965de20..be83860 100644 (file)
@@ -223,7 +223,7 @@ NTSTATUS STDCALL filedisk__attach(IN WV_SP_DEV_T dev, IN PIRP irp) {
       filedisk_ptr->hash += *path_iterator++;
   }
   /* Add the filedisk to the bus. */
-  if (!WvBusAddChild(driver__bus(), filedisk_ptr->disk->Dev)) {
+  if (!WvDriverBusAddDev(filedisk_ptr->disk->Dev)) {
       status = STATUS_UNSUCCESSFUL;
       goto err_add_child;
     }
index 2c2d940..b013973 100644 (file)
@@ -496,7 +496,7 @@ filedisk_grub4dos__find (
          filedisk_ptr->disk->BootDrive = TRUE;
          FoundGrub4DosMapping = TRUE;
          /* Add the filedisk to the bus. */
-         if (!WvBusAddChild(driver__bus(), filedisk_ptr->disk->Dev))
+         if (!WvDriverBusAddDev(filedisk_ptr->disk->Dev))
       WvDevFree(filedisk_ptr->disk->Dev);
        }
       InterruptVector = &SafeMbrHookPtr->PrevHook;
index cb7f90b..ca7075b 100644 (file)
@@ -142,7 +142,7 @@ ramdisk_grub4dos__find (
          ramdisk_ptr->disk->BootDrive = TRUE;
          FoundGrub4DosMapping = TRUE;
          /* Add the ramdisk to the bus. */
-         if (!WvBusAddChild(driver__bus(), ramdisk_ptr->disk->Dev))
+         if (!WvDriverBusAddDev(ramdisk_ptr->disk->Dev))
       WvDevFree(ramdisk_ptr->disk->Dev);
        }
       InterruptVector = &SafeMbrHookPtr->PrevHook;
index 1990ce6..f7abe50 100644 (file)
@@ -100,7 +100,7 @@ static winvblock__bool STDCALL WvMemdiskCheckMbft_(
     ramdisk->disk->BootDrive = TRUE;
 
     /* Add the ramdisk to the bus. */
-    if (!WvBusAddChild(driver__bus(), ramdisk->disk->Dev)) {
+    if (!WvDriverBusAddDev(ramdisk->disk->Dev)) {
         WvDevFree(ramdisk->disk->Dev);
         return FALSE;
       }