repository: C:/dev/kvm-guest-drivers-windows
branch: master
commit c8a200effa3a9082319ae0130073186ede86cdd4
Author: Yan Vugenfirer <[email protected]>
Date:   Sun Oct 25 16:02:24 2009 +0200

    [WIN-GUEST-DRIVERS] viostor driver. Complete SRBs at DPC level. Fixing 
previous commit.
    
             Signed-off-by: Vadim Rozenfeld<[email protected]>

diff --git a/viostor/virtio_stor.c b/viostor/virtio_stor.c
index f1c8099..b515dd9 100644
--- a/viostor/virtio_stor.c
+++ b/viostor/virtio_stor.c
@@ -30,6 +30,14 @@ VirtIoBuildIo(
     IN PVOID DeviceExtension,
     IN PSCSI_REQUEST_BLOCK Srb
     );
+
+VOID
+CompleteDpcRoutine(
+    IN PSTOR_DPC  Dpc,
+    IN PVOID Context,
+    IN PVOID SystemArgument1,
+    IN PVOID SystemArgument2
+    ) ;
 #endif
 
 BOOLEAN
@@ -91,6 +99,13 @@ CompleteSRB(
     IN PSCSI_REQUEST_BLOCK Srb
     );
 
+VOID
+FORCEINLINE
+CompleteDPC(
+    IN PVOID DeviceExtension,
+    IN pblk_req vbr
+    );
+
 ULONG
 DriverEntry(
     IN PVOID  DriverObject,
@@ -325,10 +340,28 @@ VirtIoFindAdapter(
     }
 
     InitializeListHead(&adaptExt->list_head);
+    InitializeListHead(&adaptExt->complete_list);
 
     return SP_RETURN_FOUND;
 }
 
+#ifdef USE_STORPORT
+BOOLEAN
+VirtIoPassiveInitializeRoutine (
+    IN PVOID DeviceExtension
+    )
+{
+    PADAPTER_EXTENSION adaptExt = (PADAPTER_EXTENSION)DeviceExtension;
+
+    StorPortInitializeDpc(DeviceExtension,
+                    &adaptExt->completion_dpc,
+                    CompleteDpcRoutine);
+
+    return TRUE;
+}
+#endif
+
+
 BOOLEAN
 VirtIoHwInitialize(
     IN PVOID DeviceExtension
@@ -400,7 +433,14 @@ VirtIoHwInitialize(
     ScsiPortMoveMemory(&adaptExt->inquiry_data.ProductRevisionLevel, "0001", 
sizeof("0001"));
     ScsiPortMoveMemory(&adaptExt->inquiry_data.VendorSpecific, "0001", 
sizeof("0001"));
 
-    return TRUE; 
+#ifdef USE_STORPORT
+    if(!adaptExt->dump_mode)
+    {
+        return StorPortEnablePassiveInitialization(DeviceExtension, 
VirtIoPassiveInitializeRoutine);
+    }
+#endif
+
+    return TRUE;
 }
 
 BOOLEAN
@@ -564,8 +604,7 @@ VirtIoInterrupt(
                 Srb->SrbStatus = SRB_STATUS_ERROR;
                 break;
            }
-           RemoveEntryList(&vbr->list_entry);
-           CompleteSRB(DeviceExtension, Srb);
+           CompleteDPC(DeviceExtension, vbr);
         }
     }
     RhelDbgPrint(TRACE_LEVEL_VERBOSE, ("%s isInterruptServiced = %d\n", 
__FUNCTION__, isInterruptServiced));
@@ -974,3 +1013,63 @@ CompleteSRB(
                          Srb->Lun);
 #endif
 }
+
+VOID
+FORCEINLINE
+CompleteDPC(
+    IN PVOID DeviceExtension,
+    IN pblk_req vbr
+    )
+{
+    PSCSI_REQUEST_BLOCK Srb = (PSCSI_REQUEST_BLOCK)vbr->req;
+    PADAPTER_EXTENSION adaptExt = (PADAPTER_EXTENSION)DeviceExtension;
+
+    RemoveEntryList(&vbr->list_entry);
+
+#ifdef USE_STORPORT
+    if(!adaptExt->dump_mode) {
+        InsertTailList(&adaptExt->complete_list, &vbr->list_entry);
+        StorPortIssueDpc(DeviceExtension,
+                         &adaptExt->completion_dpc,
+                         NULL,
+                         NULL);
+        return;
+    }
+#endif
+    CompleteSRB(DeviceExtension, Srb);
+}
+
+
+VOID
+CompleteDpcRoutine(
+    IN PSTOR_DPC  Dpc,
+    IN PVOID Context,
+    IN PVOID SystemArgument1,
+    IN PVOID SystemArgument2
+    )
+{
+    STOR_LOCK_HANDLE  LockHandle;
+    PADAPTER_EXTENSION adaptExt = (PADAPTER_EXTENSION)Context;
+
+    StorPortAcquireSpinLock ( Context, InterruptLock , NULL, &LockHandle);
+
+    while (!IsListEmpty(&adaptExt->complete_list)) {
+        PSCSI_REQUEST_BLOCK Srb;
+        pblk_req vbr;
+        vbr  = (pblk_req) RemoveHeadList(&adaptExt->complete_list);
+        Srb = (PSCSI_REQUEST_BLOCK)vbr->req;
+
+        StorPortReleaseSpinLock (Context, &LockHandle);
+
+        ScsiPortNotification(RequestComplete,
+                         Context,
+                         Srb);
+
+        StorPortAcquireSpinLock ( Context, InterruptLock , NULL, &LockHandle);
+
+    }
+
+    StorPortReleaseSpinLock (Context, &LockHandle);
+
+    return;
+}
diff --git a/viostor/virtio_stor.h b/viostor/virtio_stor.h
index 2d98738..2533148 100644
--- a/viostor/virtio_stor.h
+++ b/viostor/virtio_stor.h
@@ -95,6 +95,8 @@ typedef struct _ADAPTER_EXTENSION {
     ULONG                 queue_depth;
     BOOLEAN               dump_mode;
     LIST_ENTRY            list_head;
+    LIST_ENTRY            complete_list;
+    STOR_DPC              completion_dpc;
 }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

Reply via email to