Index: /trunk/src/VBox/Devices/Storage/DevAHCI.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DevAHCI.cpp	(revision 32878)
+++ /trunk/src/VBox/Devices/Storage/DevAHCI.cpp	(revision 32879)
@@ -5928,4 +5928,5 @@
         case ATA_SMART:
         case ATA_NV_CACHE:
+        case ATA_IDLE:
             pAhciPortTaskState->uATARegError = ABRT_ERR;
             pAhciPortTaskState->uATARegStatus = ATA_STAT_READY | ATA_STAT_ERR;
@@ -6069,4 +6070,7 @@
         AssertMsg(fXchg, ("Task is already active\n"));
 #endif
+
+        pAhciPortTaskState->uATARegStatus = 0;
+        pAhciPortTaskState->uATARegError  = 0;
 
         /** Set current command slot */
@@ -6115,62 +6119,64 @@
             }
         }
-
-        enmTxDir = ahciProcessCmd(pAhciPort, pAhciPortTaskState, pAhciPortTaskState->cmdFis);
-
-        if (enmTxDir != AHCITXDIR_NONE)
-        {
-            pAhciPortTaskState->enmTxDir = enmTxDir;
-
-            ahciLog(("%s: Before increment uActTasksActive=%u\n", __FUNCTION__, pAhciPort->uActTasksActive));
-            ASMAtomicIncU32(&pAhciPort->uActTasksActive);
-            ahciLog(("%s: After increment uActTasksActive=%u\n", __FUNCTION__, pAhciPort->uActTasksActive));
-
-            if (enmTxDir != AHCITXDIR_FLUSH)
+        else
+        {
+            enmTxDir = ahciProcessCmd(pAhciPort, pAhciPortTaskState, pAhciPortTaskState->cmdFis);
+
+            if (enmTxDir != AHCITXDIR_NONE)
             {
-                STAM_REL_COUNTER_INC(&pAhciPort->StatDMA);
-
-                rc = ahciScatterGatherListCreate(pAhciPort, pAhciPortTaskState, (enmTxDir == AHCITXDIR_READ) ? false : true);
-                if (RT_FAILURE(rc))
-                    AssertMsgFailed(("%s: Failed to process command %Rrc\n", __FUNCTION__, rc));
-            }
-
-            if (enmTxDir == AHCITXDIR_FLUSH)
-            {
-                rc = pAhciPort->pDrvBlockAsync->pfnStartFlush(pAhciPort->pDrvBlockAsync,
-                                                              pAhciPortTaskState);
-            }
-            else if (enmTxDir == AHCITXDIR_READ)
-            {
-                pAhciPort->Led.Asserted.s.fReading = pAhciPort->Led.Actual.s.fReading = 1;
-                rc = pAhciPort->pDrvBlockAsync->pfnStartRead(pAhciPort->pDrvBlockAsync, pAhciPortTaskState->uOffset,
-                                                             pAhciPortTaskState->pSGListHead, pAhciPortTaskState->cSGListUsed,
-                                                             pAhciPortTaskState->cbTransfer,
-                                                             pAhciPortTaskState);
+                pAhciPortTaskState->enmTxDir = enmTxDir;
+
+                ahciLog(("%s: Before increment uActTasksActive=%u\n", __FUNCTION__, pAhciPort->uActTasksActive));
+                ASMAtomicIncU32(&pAhciPort->uActTasksActive);
+                ahciLog(("%s: After increment uActTasksActive=%u\n", __FUNCTION__, pAhciPort->uActTasksActive));
+
+                if (enmTxDir != AHCITXDIR_FLUSH)
+                {
+                    STAM_REL_COUNTER_INC(&pAhciPort->StatDMA);
+
+                    rc = ahciScatterGatherListCreate(pAhciPort, pAhciPortTaskState, (enmTxDir == AHCITXDIR_READ) ? false : true);
+                    if (RT_FAILURE(rc))
+                        AssertMsgFailed(("%s: Failed to process command %Rrc\n", __FUNCTION__, rc));
+                }
+
+                if (enmTxDir == AHCITXDIR_FLUSH)
+                {
+                    rc = pAhciPort->pDrvBlockAsync->pfnStartFlush(pAhciPort->pDrvBlockAsync,
+                                                                  pAhciPortTaskState);
+                }
+                else if (enmTxDir == AHCITXDIR_READ)
+                {
+                    pAhciPort->Led.Asserted.s.fReading = pAhciPort->Led.Actual.s.fReading = 1;
+                    rc = pAhciPort->pDrvBlockAsync->pfnStartRead(pAhciPort->pDrvBlockAsync, pAhciPortTaskState->uOffset,
+                                                                 pAhciPortTaskState->pSGListHead, pAhciPortTaskState->cSGListUsed,
+                                                                 pAhciPortTaskState->cbTransfer,
+                                                                 pAhciPortTaskState);
+                }
+                else
+                {
+                    pAhciPort->Led.Asserted.s.fWriting = pAhciPort->Led.Actual.s.fWriting = 1;
+                    rc = pAhciPort->pDrvBlockAsync->pfnStartWrite(pAhciPort->pDrvBlockAsync, pAhciPortTaskState->uOffset,
+                                                                  pAhciPortTaskState->pSGListHead, pAhciPortTaskState->cSGListUsed,
+                                                                  pAhciPortTaskState->cbTransfer,
+                                                                  pAhciPortTaskState);
+                }
+                if (rc == VINF_VD_ASYNC_IO_FINISHED)
+                    rc = ahciTransferComplete(pAhciPort, pAhciPortTaskState, VINF_SUCCESS);
+
+                if (RT_FAILURE(rc) && rc != VERR_VD_ASYNC_IO_IN_PROGRESS)
+                    rc = ahciTransferComplete(pAhciPort, pAhciPortTaskState, rc);
             }
             else
             {
-                pAhciPort->Led.Asserted.s.fWriting = pAhciPort->Led.Actual.s.fWriting = 1;
-                rc = pAhciPort->pDrvBlockAsync->pfnStartWrite(pAhciPort->pDrvBlockAsync, pAhciPortTaskState->uOffset,
-                                                              pAhciPortTaskState->pSGListHead, pAhciPortTaskState->cSGListUsed,
-                                                              pAhciPortTaskState->cbTransfer,
-                                                              pAhciPortTaskState);
+#ifdef RT_STRICT
+                fXchg = ASMAtomicCmpXchgBool(&pAhciPortTaskState->fActive, false, true);
+                AssertMsg(fXchg, ("Task is not active\n"));
+#endif
+
+                /* There is nothing left to do. Notify the guest. */
+                ahciSendD2HFis(pAhciPort, pAhciPortTaskState, &pAhciPortTaskState->cmdFis[0], true);
+                /* Add the task to the cache. */
+                pAhciPort->aCachedTasks[pAhciPortTaskState->uTag] = pAhciPortTaskState;
             }
-            if (rc == VINF_VD_ASYNC_IO_FINISHED)
-                rc = ahciTransferComplete(pAhciPort, pAhciPortTaskState, VINF_SUCCESS);
-
-            if (RT_FAILURE(rc) && rc != VERR_VD_ASYNC_IO_IN_PROGRESS)
-                rc = ahciTransferComplete(pAhciPort, pAhciPortTaskState, rc);
-        }
-        else
-        {
-#ifdef RT_STRICT
-            fXchg = ASMAtomicCmpXchgBool(&pAhciPortTaskState->fActive, false, true);
-            AssertMsg(fXchg, ("Task is not active\n"));
-#endif
-
-            /* There is nothing left to do. Notify the guest. */
-            ahciSendD2HFis(pAhciPort, pAhciPortTaskState, &pAhciPortTaskState->cmdFis[0], true);
-            /* Add the task to the cache. */
-            pAhciPort->aCachedTasks[pAhciPortTaskState->uTag] = pAhciPortTaskState;
         }
     }
