Index: /trunk/src/VBox/Devices/Storage/DevBusLogic.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DevBusLogic.cpp	(revision 24098)
+++ /trunk/src/VBox/Devices/Storage/DevBusLogic.cpp	(revision 24099)
@@ -2261,38 +2261,4 @@
 }
 
-static bool buslogicWaitForAsyncIOFinished(PBUSLOGIC pBusLogic, unsigned cMillies)
-{
-    uint64_t u64Start;
-    bool     fIdle;
-
-    /*
-     * Wait for any pending async operation to finish
-     */
-    u64Start = RTTimeMilliTS();
-    for (;;)
-    {
-        fIdle = true;
-
-        /* Check every port. */
-        for (unsigned i = 0; i < RT_ELEMENTS(pBusLogic->aDeviceStates); i++)
-        {
-            PBUSLOGICDEVICE pBusLogicDevice = &pBusLogic->aDeviceStates[i];
-            if (ASMAtomicReadU32(&pBusLogicDevice->cOutstandingRequests))
-            {
-                fIdle = false;
-                break;
-            }
-        }
-        if (   fIdle
-            || RTTimeMilliTS() - u64Start >= cMillies)
-            break;
-
-        /* Sleep for a bit. */
-        RTThreadSleep(100); /** @todo wait on something which can be woken up. 100ms is too long for teleporting VMs! */
-    }
-
-    return fIdle;
-}
-
 static DECLCALLBACK(int) buslogicLiveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t uPass)
 {
@@ -2304,18 +2270,4 @@
 
     return VINF_SSM_DONT_CALL_AGAIN;
-}
-
-static DECLCALLBACK(int) buslogicSaveLoadPrep(PPDMDEVINS pDevIns, PSSMHANDLE pSSM)
-{
-    PBUSLOGIC pBusLogic = PDMINS_2_DATA(pDevIns, PBUSLOGIC);
-
-    /* Wait that no task is pending on any device. */
-    if (!buslogicWaitForAsyncIOFinished(pBusLogic, 20000))
-    {
-        AssertLogRelMsgFailed(("BusLogic: There are still tasks outstanding\n"));
-        return VERR_TIMEOUT;
-    }
-
-    return VINF_SUCCESS;
 }
 
@@ -2625,13 +2577,4 @@
 }
 
-static DECLCALLBACK(void) buslogicSuspend(PPDMDEVINS pDevIns)
-{
-    PBUSLOGIC pBusLogic = PDMINS_2_DATA(pDevIns, PBUSLOGIC);
-
-    /* Wait that no task is pending on any device. */
-    if (!buslogicWaitForAsyncIOFinished(pBusLogic, 20000))
-        AssertLogRelMsgFailed(("BusLogic: There are still tasks outstanding\n"));
-}
-
 static DECLCALLBACK(void) buslogicRelocate(PPDMDEVINS pDevIns, RTGCINTPTR offDelta)
 {
@@ -2835,8 +2778,6 @@
     }
 
-    rc = PDMDevHlpSSMRegisterEx(pDevIns, BUSLOGIC_SAVED_STATE_MINOR_VERSION, sizeof(*pThis), NULL,
-                                NULL,                 buslogicLiveExec, NULL,
-                                buslogicSaveLoadPrep, buslogicSaveExec, NULL,
-                                buslogicSaveLoadPrep, buslogicLoadExec, NULL);
+    rc = PDMDevHlpSSMRegister3(pDevIns, BUSLOGIC_SAVED_STATE_MINOR_VERSION, sizeof(*pThis),
+                               buslogicLiveExec, buslogicSaveExec, buslogicLoadExec);
     if (RT_FAILURE(rc))
         return PDMDEV_SET_ERROR(pDevIns, rc, N_("BusLogic cannot register save state handlers"));
@@ -2864,7 +2805,5 @@
     "BusLogic BT-958 SCSI host adapter.\n",
     /* fFlags */
-      PDM_DEVREG_FLAGS_DEFAULT_BITS | PDM_DEVREG_FLAGS_RC | PDM_DEVREG_FLAGS_R0
-    | PDM_DEVREG_FLAGS_FIRST_SUSPEND_NOTIFICATION
-    | PDM_DEVREG_FLAGS_FIRST_POWEROFF_NOTIFICATION,
+    PDM_DEVREG_FLAGS_DEFAULT_BITS | PDM_DEVREG_FLAGS_RC | PDM_DEVREG_FLAGS_R0,
     /* fClass */
     PDM_DEVREG_CLASS_STORAGE,
@@ -2886,5 +2825,5 @@
     buslogicReset,
     /* pfnSuspend */
-    buslogicSuspend,
+    NULL,
     /* pfnResume */
     NULL,
Index: /trunk/src/VBox/Devices/Storage/DevLsiLogicSCSI.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DevLsiLogicSCSI.cpp	(revision 24098)
+++ /trunk/src/VBox/Devices/Storage/DevLsiLogicSCSI.cpp	(revision 24099)
@@ -5172,4 +5172,8 @@
  *        in the I/O controllers and reduce the time it takes to suspend a VM a
  *        wee bit...
+ *
+ * DrvSCSI should implement the reset notification, then we could retire this
+ * fun lsilogicWaitForAsyncIOFinished code.  (The drivers are reset before the
+ * device.)  The deadlock trap is still there though.
  */
     bool fIdle = lsilogicWaitForAsyncIOFinished(pLsiLogic, 20000);
@@ -5451,7 +5455,5 @@
     "LSI Logic 53c1030 SCSI controller.\n",
     /* fFlags */
-      PDM_DEVREG_FLAGS_DEFAULT_BITS | PDM_DEVREG_FLAGS_RC | PDM_DEVREG_FLAGS_R0
-    | PDM_DEVREG_FLAGS_FIRST_SUSPEND_NOTIFICATION
-    | PDM_DEVREG_FLAGS_FIRST_POWEROFF_NOTIFICATION,
+    PDM_DEVREG_FLAGS_DEFAULT_BITS | PDM_DEVREG_FLAGS_RC | PDM_DEVREG_FLAGS_R0,
     /* fClass */
     PDM_DEVREG_CLASS_STORAGE,
