[disk] Introduce UnitNum operation
authorShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Sun, 9 Jan 2011 10:23:27 +0000 (05:23 -0500)
committerShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Sun, 9 Jan 2011 10:23:27 +0000 (05:23 -0500)
To fetch the unit number.  A disk driver should implement it.

src/aoe/driver.c
src/include/disk.h
src/winvblock/disk/disk.c
src/winvblock/filedisk/filedisk.c
src/winvblock/ramdisk/ramdisk.c

index e48f4ae..87f0cc1 100644 (file)
@@ -70,6 +70,7 @@ static WV_F_DISK_IO AoeDiskIo_;
 static WV_F_DISK_MAX_XFER_LEN AoeDiskMaxXferLen_;
 static BOOLEAN STDCALL AoeDiskInit_(struct AOE_DISK_ *);
 static WV_F_DISK_CLOSE AoeDiskClose_;
+static WVL_F_DISK_UNIT_NUM AoeDiskUnitNum_;
 static DRIVER_DISPATCH AoeIrpNotSupported_;
 static __drv_dispatchType(IRP_MJ_POWER) DRIVER_DISPATCH AoeIrpPower_;
 static
@@ -1753,6 +1754,7 @@ static AOE_SP_DISK_ AoeDiskCreatePdo_(void) {
     aoe_disk->disk->disk_ops.Io = AoeDiskIo_;
     aoe_disk->disk->disk_ops.MaxXferLen = AoeDiskMaxXferLen_;
     aoe_disk->disk->disk_ops.Close = AoeDiskClose_;
+    aoe_disk->disk->disk_ops.UnitNum = AoeDiskUnitNum_;
     aoe_disk->disk->ext = aoe_disk;
     aoe_disk->disk->DriverObj = AoeDriverObj_;
 
@@ -1953,3 +1955,14 @@ static NTSTATUS AoeIrpPnp_(
     /* Use the disk routine. */
     return disk_pnp__dispatch(dev, irp, code);
   }
+
+static UCHAR STDCALL AoeDiskUnitNum_(IN WV_SP_DISK_T disk) {
+    AOE_SP_DISK_ aoe_disk = CONTAINING_RECORD(
+        disk,
+        AOE_S_DISK_,
+        disk[0]
+      );
+
+    /* Possible precision loss. */
+    return (UCHAR) WvlBusGetNodeNum(&aoe_disk->disk->Dev->BusNode);
+  }
index b76ba34..1e7c5b5 100644 (file)
@@ -95,11 +95,22 @@ typedef WV_F_DISK_INIT * WV_FP_DISK_INIT;
 typedef VOID STDCALL WV_F_DISK_CLOSE(IN WV_SP_DISK_T);
 typedef WV_F_DISK_CLOSE * WV_FP_DISK_CLOSE;
 
+/**
+ * Fetch disk unit number routine.
+ *
+ * @v disk              The disk whose unit number is fetched.
+ * @ret UCHAR           The disk's unit number.
+ */
+typedef UCHAR STDCALL WVL_F_DISK_UNIT_NUM(IN WV_SP_DISK_T);
+typedef WVL_F_DISK_UNIT_NUM * WVL_FP_DISK_UNIT_NUM;
+extern WVL_M_LIB WVL_F_DISK_UNIT_NUM WvlDiskUnitNum;
+
 typedef struct WV_DISK_OPS {
     WV_FP_DISK_IO Io;
     WV_FP_DISK_MAX_XFER_LEN MaxXferLen;
     WV_FP_DISK_INIT Init;
     WV_FP_DISK_CLOSE Close;
+    WVL_FP_DISK_UNIT_NUM UnitNum;
   } WV_S_DISK_OPS, * WV_SP_DISK_OPS;
 
 struct WV_DISK_T {
index 10aafc9..054f76d 100644 (file)
@@ -65,6 +65,10 @@ static WV_S_DEV_IRP_MJ WvDiskIrpMj_ = {
     disk_pnp__dispatch,
   };
 
+WVL_M_LIB UCHAR STDCALL WvlDiskUnitNum(IN WV_SP_DISK_T disk) {
+    return disk->disk_ops.UnitNum ? disk->disk_ops.UnitNum(disk) : 0;
+  }
+
 static UINT32 WvDiskDefaultMaxXferLen_(IN WV_SP_DISK_T disk) {
     return 1024 * 1024;
   }
index 172976a..c9ede8b 100644 (file)
@@ -284,6 +284,18 @@ static VOID STDCALL WvFilediskClose_(IN WV_SP_DEV_T dev) {
     return;
   }
 
+static WVL_F_DISK_UNIT_NUM WvFilediskUnitNum_;
+static UCHAR STDCALL WvFilediskUnitNum_(IN WV_SP_DISK_T disk) {
+    WV_SP_FILEDISK_T filedisk = CONTAINING_RECORD(
+        disk,
+        WV_S_FILEDISK_T,
+        disk[0]
+      );
+
+    /* Possible precision loss. */
+    return (UCHAR) WvlBusGetNodeNum(&filedisk->disk->Dev->BusNode);
+  }
+
 /**
  * Create a filedisk PDO filled with the given disk parameters.
  *
@@ -330,6 +342,7 @@ WV_SP_FILEDISK_T STDCALL WvFilediskCreatePdo(
     filedisk->disk->Dev->ext = filedisk->disk;
     filedisk->disk->Dev->IrpMj = &irp_mj;
     filedisk->disk->disk_ops.Io = io;
+    filedisk->disk->disk_ops.UnitNum = WvFilediskUnitNum_;
     filedisk->disk->ext = filedisk;
     filedisk->disk->DriverObj = WvDriverObj;
 
index fe6fc74..5779483 100644 (file)
@@ -143,6 +143,18 @@ static UINT32 STDCALL WvRamdiskQueryId_(
       }
   }
 
+static WVL_F_DISK_UNIT_NUM WvRamdiskUnitNum_;
+static UCHAR STDCALL WvRamdiskUnitNum_(IN WV_SP_DISK_T disk) {
+    WV_SP_RAMDISK_T ramdisk = CONTAINING_RECORD(
+        disk,
+        WV_S_RAMDISK_T,
+        disk[0]
+      );
+
+    /* Possible precision loss. */
+    return (UCHAR) WvlBusGetNodeNum(&ramdisk->disk->Dev->BusNode);
+  }
+
 /**
  * Create a RAM disk PDO of the given media type.
  *
@@ -188,6 +200,7 @@ WV_SP_RAMDISK_T STDCALL WvRamdiskCreatePdo(
     ramdisk->disk->Dev->ext = ramdisk->disk;
     ramdisk->disk->Dev->IrpMj = &irp_mj;
     ramdisk->disk->disk_ops.Io = WvRamdiskIo_;
+    ramdisk->disk->disk_ops.UnitNum = WvRamdiskUnitNum_;
     ramdisk->disk->ext = ramdisk;
     ramdisk->disk->DriverObj = WvDriverObj;