repository: /home/vadimr/shares/kvm-guest-drivers-windows branch: master commit 394ae1879c5818fd0dce4b68b207c8ef6bf5e115 Author: Vadim Rozenfeld<vrozenfe@xxxxxxxxxx> Date: Fri Sep 25 21:15:37 2009 +0300 [PATCH] viostor driver. add support for serial number feature. Signed-off-by: Vadim Rozenfeld<vrozenfe@xxxxxxxxxx> diff --git a/viostor/virtio_stor.c b/viostor/virtio_stor.c index 375021b..b972dd2 100644 --- a/viostor/virtio_stor.c +++ b/viostor/virtio_stor.c @@ -416,6 +416,14 @@ VirtIoHwInitialize( RhelDbgPrint(TRACE_LEVEL_INFORMATION, ("VIRTIO_BLK_F_GEOMETRY. cylinders = %d heads = %d sectors = %d\n", adaptExt->info.geometry.cylinders, adaptExt->info.geometry.heads, adaptExt->info.geometry.sectors)); } + if (VirtIODeviceGetHostFeature(DeviceExtension, VIRTIO_BLK_F_IDENTIFY)) { + VirtIODeviceGet(DeviceExtension, FIELD_OFFSET(blk_config, identify), +&adaptExt->info.identify, VIRTIO_BLK_ID_LEN); + adaptExt->has_sn = TRUE; + RhelDbgPrint(TRACE_LEVEL_INFORMATION, ("VIRTIO_BLK_F_IDENTIFY. \n")); + } + + VirtIODeviceGet( DeviceExtension, FIELD_OFFSET(blk_config, capacity), &cap, sizeof(cap)); adaptExt->info.capacity = cap; @@ -801,8 +809,13 @@ RhelScsiGetInquiryData( PVPD_SERIAL_NUMBER_PAGE SerialPage; SerialPage = (PVPD_SERIAL_NUMBER_PAGE)Srb->DataBuffer; SerialPage->PageCode = VPD_SERIAL_NUMBER; - SerialPage->PageLength = 1; - SerialPage->SerialNumber[0] = '0'; + if(adaptExt->has_sn) { + SerialPage->PageLength = VIRTIO_BLK_ID_SN_BYTES; + ScsiPortMoveMemory(&SerialPage->SerialNumber[0],&adaptExt->info.identify[VIRTIO_BLK_ID_SN], VIRTIO_BLK_ID_SN_BYTES); + } else { + SerialPage->PageLength = 1; + SerialPage->SerialNumber[0] = '0'; + } Srb->DataTransferLength = sizeof(VPD_SERIAL_NUMBER_PAGE) + SerialPage->PageLength; } else if ((cdb->CDB6INQUIRY3.PageCode == VPD_DEVICE_IDENTIFIERS)&& diff --git a/viostor/virtio_stor.h b/viostor/virtio_stor.h index 2533148..dd4728e 100644 --- a/viostor/virtio_stor.h +++ b/viostor/virtio_stor.h @@ -36,6 +36,12 @@ typedef struct VirtIOBufferDescriptor VIO_SG, *PVIO_SG; #define VIRTIO_BLK_F_GEOMETRY 4 /* Legacy geometry available */ #define VIRTIO_BLK_F_RO 5 /* Disk is read-only */ #define VIRTIO_BLK_F_BLK_SIZE 6 /* Block size of disk is available*/ +#define VIRTIO_BLK_F_SCSI 7 /* Supports scsi command passthru */ +#define VIRTIO_BLK_F_IDENTIFY 8 /* ATA IDENTIFY supported */ + +#define VIRTIO_BLK_ID_LEN 256 /* length of identify u16 array */ +#define VIRTIO_BLK_ID_SN 10 /* start of char * serial# */ +#define VIRTIO_BLK_ID_SN_BYTES 20 /* length in bytes of serial# */ /* These two define direction. */ #define VIRTIO_BLK_T_IN 0 @@ -66,6 +72,7 @@ typedef struct virtio_blk_config { } geometry; /* block size of device (if VIRTIO_BLK_F_BLK_SIZE) */ u32 blk_size; + u16 identify[VIRTIO_BLK_ID_LEN]; }blk_config, *pblk_config; #pragma pack() @@ -97,6 +104,7 @@ typedef struct _ADAPTER_EXTENSION { LIST_ENTRY list_head; LIST_ENTRY complete_list; STOR_DPC completion_dpc; + BOOLEAN has_sn; }ADAPTER_EXTENSION, *PADAPTER_EXTENSION; typedef struct _RHEL_SRB_EXTENSION { -- To unsubscribe from this list: send the line "unsubscribe kvm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/viostor/virtio_stor.c b/viostor/virtio_stor.c index 375021b..b972dd2 100644 --- a/viostor/virtio_stor.c +++ b/viostor/virtio_stor.c @@ -416,6 +416,14 @@ VirtIoHwInitialize( RhelDbgPrint(TRACE_LEVEL_INFORMATION, ("VIRTIO_BLK_F_GEOMETRY. cylinders = %d heads = %d sectors = %d\n", adaptExt->info.geometry.cylinders, adaptExt->info.geometry.heads, adaptExt->info.geometry.sectors)); } + if (VirtIODeviceGetHostFeature(DeviceExtension, VIRTIO_BLK_F_IDENTIFY)) { + VirtIODeviceGet(DeviceExtension, FIELD_OFFSET(blk_config, identify), + &adaptExt->info.identify, VIRTIO_BLK_ID_LEN); + adaptExt->has_sn = TRUE; + RhelDbgPrint(TRACE_LEVEL_INFORMATION, ("VIRTIO_BLK_F_IDENTIFY. \n")); + } + + VirtIODeviceGet( DeviceExtension, FIELD_OFFSET(blk_config, capacity), &cap, sizeof(cap)); adaptExt->info.capacity = cap; @@ -801,8 +809,13 @@ RhelScsiGetInquiryData( PVPD_SERIAL_NUMBER_PAGE SerialPage; SerialPage = (PVPD_SERIAL_NUMBER_PAGE)Srb->DataBuffer; SerialPage->PageCode = VPD_SERIAL_NUMBER; - SerialPage->PageLength = 1; - SerialPage->SerialNumber[0] = '0'; + if(adaptExt->has_sn) { + SerialPage->PageLength = VIRTIO_BLK_ID_SN_BYTES; + ScsiPortMoveMemory(&SerialPage->SerialNumber[0], &adaptExt->info.identify[VIRTIO_BLK_ID_SN], VIRTIO_BLK_ID_SN_BYTES); + } else { + SerialPage->PageLength = 1; + SerialPage->SerialNumber[0] = '0'; + } Srb->DataTransferLength = sizeof(VPD_SERIAL_NUMBER_PAGE) + SerialPage->PageLength; } else if ((cdb->CDB6INQUIRY3.PageCode == VPD_DEVICE_IDENTIFIERS) && diff --git a/viostor/virtio_stor.h b/viostor/virtio_stor.h index 2533148..dd4728e 100644 --- a/viostor/virtio_stor.h +++ b/viostor/virtio_stor.h @@ -36,6 +36,12 @@ typedef struct VirtIOBufferDescriptor VIO_SG, *PVIO_SG; #define VIRTIO_BLK_F_GEOMETRY 4 /* Legacy geometry available */ #define VIRTIO_BLK_F_RO 5 /* Disk is read-only */ #define VIRTIO_BLK_F_BLK_SIZE 6 /* Block size of disk is available*/ +#define VIRTIO_BLK_F_SCSI 7 /* Supports scsi command passthru */ +#define VIRTIO_BLK_F_IDENTIFY 8 /* ATA IDENTIFY supported */ + +#define VIRTIO_BLK_ID_LEN 256 /* length of identify u16 array */ +#define VIRTIO_BLK_ID_SN 10 /* start of char * serial# */ +#define VIRTIO_BLK_ID_SN_BYTES 20 /* length in bytes of serial# */ /* These two define direction. */ #define VIRTIO_BLK_T_IN 0 @@ -66,6 +72,7 @@ typedef struct virtio_blk_config { } geometry; /* block size of device (if VIRTIO_BLK_F_BLK_SIZE) */ u32 blk_size; + u16 identify[VIRTIO_BLK_ID_LEN]; }blk_config, *pblk_config; #pragma pack() @@ -97,6 +104,7 @@ typedef struct _ADAPTER_EXTENSION { LIST_ENTRY list_head; LIST_ENTRY complete_list; STOR_DPC completion_dpc; + BOOLEAN has_sn; }ADAPTER_EXTENSION, *PADAPTER_EXTENSION; typedef struct _RHEL_SRB_EXTENSION {