viostor driver. add support for serial number.
PATCH 1/1 viostor driver. add support for serial number.
repository: /home/vadimr/shares/kvm-guest-drivers-windows
branch: master
commit 394ae1879c5818fd0dce4b68b207c8ef6bf5e115
Author: Vadim Rozenfeld<[email protected]> Date: Fri Sep 25 21:15:37 2009 +0300
[PATCH] viostor driver. add support for serial number feature.
Signed-off-by Vadim Rozenfeld<[email protected]>
viostor/virtio_stor.c +15 -2
@@ -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)&&
viostor/virtio_stor.h +8 -0
@@ -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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
viostor/virtio_stor.c +15 -2
@@ -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) &&
viostor/virtio_stor.h +8 -0
@@ -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 {