viostor driver. switch to full-duplex mode.
PATCH 1/1 viostor driver. switch to full-duplex mode.
repository: /home/vadimr/shares/kvm-guest-drivers-windows
branch: master
commit ed4b9ade27b56e9ee37461c2cf72e46d75633e9c
Author: Vadim Rozenfeld<[email protected]> Date: Wed Sep 23 11:28:48 2009 +0300
[PATCH] viostor driver. switch to full-duplex mode.
Signed-off-by Vadim Rozenfeld<[email protected]>
viostor/virtio_stor.c +5 -2
@@ -194,6 +194,7 @@ VirtIoFindAdapter( ConfigInfo->WmiDataProvider = FALSE;#ifdef USE_STORPORT ConfigInfo->MapBuffers =STOR_MAP_NON_READ_WRITE_BUFFERS ; + ConfigInfo->SynchronizationModel = StorSynchronizeFullDuplex;#else ConfigInfo->MapBuffers = TRUE;#endif
@@ -323,6 +324,8 @@ VirtIoFindAdapter(return SP_RETURN_ERROR ; } +InitializeListHead (&adaptExt->list_head); +return SP_RETURN_FOUND ; }
@@ -488,7 +491,7 @@ VirtIoStartIo(case SCSIOP_WRITE : { Srb->SrbStatus =SRB_STATUS_PENDING ;if (!RhelDoReadWrite (DeviceExtension, Srb)) { - Srb->SrbStatus =SRB_STATUS_ABORTED ; + Srb->SrbStatus =SRB_STATUS_BUSY ;CompleteSRB (DeviceExtension, Srb); }return TRUE;
@@ -561,7 +564,7 @@ VirtIoInterrupt( Srb->SrbStatus =SRB_STATUS_ERROR ;break ; } - +RemoveEntryList (&vbr->list_entry);CompleteSRB (DeviceExtension, Srb); } }
viostor/virtio_stor.h +2 -5
@@ -78,12 +78,8 @@ typedef struct virtio_blk_outhdr {u64 sector; }blk_outhdr, *pblk_outhdr; -struct list_head { -struct list_head *next, *prev; -}; - typedef struct virtio_blk_req { - struct list_head list; + LIST_ENTRY list_entry; struct request *req; blk_outhdr out_hdr; u8 status;
@@ -98,6 +94,7 @@ typedef struct _ADAPTER_EXTENSION {blk_config info;ULONG queue_depth;BOOLEAN dump_mode; +LIST_ENTRY list_head; }ADAPTER_EXTENSION , *PADAPTER_EXTENSION ; typedef struct _RHEL_SRB_EXTENSION {
viostor/virtio_stor_hw_helper.c +20 -7
@@ -15,22 +15,33 @@#include "virtio_stor_hw_helper.h" #ifdef USE_STORPORT -BOOLEAN -RhelDoReadWrite (PVOID DeviceExtension, -PSCSI_REQUEST_BLOCK Srb) +BOOLEAN +SynchronizedAccessRoutine ( + IN PVOID DeviceExtension, + IN PVOID Context + ) {PADAPTER_EXTENSION adaptExt = (PADAPTER_EXTENSION )DeviceExtension; +PSCSI_REQUEST_BLOCK Srb = (PSCSI_REQUEST_BLOCK ) Context;PRHEL_SRB_EXTENSION srbExt = (PRHEL_SRB_EXTENSION )Srb->SrbExtension; -if (adaptExt->pci_vq_info.vq->vq_ops->add_buf (adaptExt->pci_vq_info.vq, -&srbExt->vbr.sg[0 ], - srbExt->out, srbExt->in, -&srbExt->vbr) ==0 ) { +&srbExt->vbr.sg[0 ], + srbExt->out, srbExt->in, +&srbExt->vbr) ==0 ){ +InsertTailList (&adaptExt->list_head,&srbExt->vbr.list_entry); adaptExt->pci_vq_info.vq->vq_ops->kick (adaptExt->pci_vq_info.vq);return TRUE; } +StorPortBusy (DeviceExtension,10 );return FALSE; } + +BOOLEAN +RhelDoReadWrite (PVOID DeviceExtension, +PSCSI_REQUEST_BLOCK Srb) +{ +return StorPortSynchronizeAccess (DeviceExtension,SynchronizedAccessRoutine, (PVOID )Srb); +}#else BOOLEAN RhelDoReadWrite(PVOID DeviceExtension,
@@ -83,6 +94,8 @@ RhelDoReadWrite(PVOID DeviceExtension, &srbExt->vbr.sg[0], srbExt->out, srbExt->in, &srbExt->vbr) == 0) { +//FIXME +InsertTailList (&adaptExt->list_head,&srbExt->vbr.list_entry); adaptExt->pci_vq_info.vq->vq_ops->kick (adaptExt->pci_vq_info.vq);return TRUE; }
viostor/virtio_stor.c +5 -2
@@ -194,6 +194,7 @@ VirtIoFindAdapter( ConfigInfo->WmiDataProvider = FALSE;#ifdef USE_STORPORT ConfigInfo->MapBuffers =STOR_MAP_NON_READ_WRITE_BUFFERS ; + ConfigInfo->SynchronizationModel = StorSynchronizeFullDuplex;#else ConfigInfo->MapBuffers = TRUE;#endif
@@ -323,6 +324,8 @@ VirtIoFindAdapter(return SP_RETURN_ERROR ; } +InitializeListHead (&adaptExt->list_head); +return SP_RETURN_FOUND ; }
@@ -488,7 +491,7 @@ VirtIoStartIo(case SCSIOP_WRITE : { Srb->SrbStatus =SRB_STATUS_PENDING ;if (!RhelDoReadWrite (DeviceExtension, Srb)) { - Srb->SrbStatus =SRB_STATUS_ABORTED ; + Srb->SrbStatus =SRB_STATUS_BUSY ;CompleteSRB (DeviceExtension, Srb); }return TRUE;
@@ -561,7 +564,7 @@ VirtIoInterrupt( Srb->SrbStatus =SRB_STATUS_ERROR ;break ; } - +RemoveEntryList (&vbr->list_entry);CompleteSRB (DeviceExtension, Srb); } }
viostor/virtio_stor.h +2 -5
@@ -78,12 +78,8 @@ typedef struct virtio_blk_outhdr {u64 sector; }blk_outhdr, *pblk_outhdr; -struct list_head { -struct list_head *next, *prev; -}; - typedef struct virtio_blk_req { - struct list_head list; + LIST_ENTRY list_entry; struct request *req; blk_outhdr out_hdr; u8 status;
@@ -98,6 +94,7 @@ typedef struct _ADAPTER_EXTENSION {blk_config info;ULONG queue_depth;BOOLEAN dump_mode; +LIST_ENTRY list_head; }ADAPTER_EXTENSION , *PADAPTER_EXTENSION ; typedef struct _RHEL_SRB_EXTENSION {
viostor/virtio_stor_hw_helper.c +20 -7
@@ -15,22 +15,33 @@#include "virtio_stor_hw_helper.h" #ifdef USE_STORPORT -BOOLEAN -RhelDoReadWrite (PVOID DeviceExtension, -PSCSI_REQUEST_BLOCK Srb) +BOOLEAN +SynchronizedAccessRoutine ( + IN PVOID DeviceExtension, + IN PVOID Context + ) {PADAPTER_EXTENSION adaptExt = (PADAPTER_EXTENSION )DeviceExtension; +PSCSI_REQUEST_BLOCK Srb = (PSCSI_REQUEST_BLOCK ) Context;PRHEL_SRB_EXTENSION srbExt = (PRHEL_SRB_EXTENSION )Srb->SrbExtension; -if (adaptExt->pci_vq_info.vq->vq_ops->add_buf (adaptExt->pci_vq_info.vq, - &srbExt->vbr.sg[0 ], - srbExt->out, srbExt->in, - &srbExt->vbr) ==0 ) { + &srbExt->vbr.sg[0 ], + srbExt->out, srbExt->in, + &srbExt->vbr) ==0 ){ +InsertTailList (&adaptExt->list_head, &srbExt->vbr.list_entry); adaptExt->pci_vq_info.vq->vq_ops->kick (adaptExt->pci_vq_info.vq);return TRUE; } +StorPortBusy (DeviceExtension,10 );return FALSE; } + +BOOLEAN +RhelDoReadWrite (PVOID DeviceExtension, +PSCSI_REQUEST_BLOCK Srb) +{ +return StorPortSynchronizeAccess (DeviceExtension,SynchronizedAccessRoutine, (PVOID )Srb); +}#else BOOLEAN RhelDoReadWrite(PVOID DeviceExtension,
@@ -83,6 +94,8 @@ RhelDoReadWrite(PVOID DeviceExtension, &srbExt->vbr.sg[0], srbExt->out, srbExt->in, &srbExt->vbr) == 0) { +//FIXME +InsertTailList (&adaptExt->list_head, &srbExt->vbr.list_entry); adaptExt->pci_vq_info.vq->vq_ops->kick (adaptExt->pci_vq_info.vq);return TRUE; }