Index: Bus/Ata/AtaAtapiPassThru/AhciMode.c
===================================================================
--- Bus/Ata/AtaAtapiPassThru/AhciMode.c	(revision 15739)
+++ Bus/Ata/AtaAtapiPassThru/AhciMode.c	(working copy)
@@ -704,6 +704,7 @@
   UINT32                        PortTfd;
   UINT32                        PrdCount;
   BOOLEAN                       InfiniteWait;
+  UINT8                         D2hStatus;
 
   if (Timeout == 0) {
     InfiniteWait = TRUE;
@@ -804,8 +805,11 @@
       Offset = FisBaseAddr + EFI_AHCI_D2H_FIS_OFFSET;
       Status = AhciCheckMemSet (Offset, EFI_AHCI_FIS_TYPE_MASK, EFI_AHCI_FIS_REGISTER_D2H, NULL);
       if (!EFI_ERROR (Status)) {
-        Status = EFI_DEVICE_ERROR;
-        break;
+        D2hStatus = *(volatile UINT8 *) (Offset + EFI_AHCI_D2H_FIS_STATUS_REG_OFFSET);        
+        if ((D2hStatus & EFI_AHCI_D2H_FIS_STATUS_ERROR) == EFI_AHCI_D2H_FIS_STATUS_ERROR) {
+          Status = EFI_DEVICE_ERROR;
+          break;
+        }
       }
 
       //
Index: Bus/Ata/AtaAtapiPassThru/AhciMode.h
===================================================================
--- Bus/Ata/AtaAtapiPassThru/AhciMode.h	(revision 15739)
+++ Bus/Ata/AtaAtapiPassThru/AhciMode.h	(working copy)
@@ -78,6 +78,8 @@
 #define   EFI_AHCI_FIS_SET_DEVICE_LENGTH       8
 
 #define EFI_AHCI_D2H_FIS_OFFSET                0x40
+#define   EFI_AHCI_D2H_FIS_STATUS_REG_OFFSET   0x02
+#define   EFI_AHCI_D2H_FIS_STATUS_ERROR        0x01
 #define EFI_AHCI_DMA_FIS_OFFSET                0x00
 #define EFI_AHCI_PIO_FIS_OFFSET                0x20
 #define EFI_AHCI_SDB_FIS_OFFSET                0x58
