Good to me. Reviewed-by: Feng Tian <feng.t...@intel.com>
-----Original Message----- From: reza.jel...@tuhh.de [mailto:reza.jel...@tuhh.de] Sent: Thursday, August 21, 2014 17:56 To: edk2-devel@lists.sourceforge.net Cc: ag...@suse.de Subject: [edk2] [PATCH v2 1/6] MdeModulePkg: Check D2H register status in AhciPioTransfer From: Reza Jelveh <reza.jel...@tuhh.de> Some AHCI controllers such as the Marvel 9230 controllers do not send PIO Setup FIS when the PIO data-in command is completed. Instead they just send a D2H FIS. To accomodate for this possibility the status code of the D2H FIS is checked. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Reza Jelveh <reza.jel...@tuhh.de> --- MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.c | 14 ++++++++++++-- MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.h | 3 +++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.c b/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.c index 7fc7a28..487f516 100644 --- a/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.c +++ b/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.c @@ -703,6 +703,7 @@ AhciPioTransfer ( EFI_AHCI_COMMAND_LIST CmdList; UINT32 PortTfd; UINT32 PrdCount; + UINT8 D2HStatus; BOOLEAN InfiniteWait; if (Timeout == 0) { @@ -804,8 +805,17 @@ AhciPioTransfer ( 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_OFFSET); + + if ((D2HStatus & EFI_AHCI_D2H_FIS_ERR) != 0) { + Status = EFI_DEVICE_ERROR; + break; + } + + PrdCount = *(volatile UINT32 *) (&(AhciRegisters->AhciCmdList[0].AhciCmdPrdbc)); + if (PrdCount == DataCount) { + break; + } } // diff --git a/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.h b/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.h index 485b647..9fe1fb3 100644 --- a/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.h +++ b/MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AhciMode.h @@ -78,12 +78,15 @@ typedef union { #define EFI_AHCI_FIS_SET_DEVICE_LENGTH 8 #define EFI_AHCI_D2H_FIS_OFFSET 0x40 +#define EFI_AHCI_D2H_FIS_STATUS_OFFSET 0x02 +#define EFI_AHCI_D2H_FIS_ERR BIT0 #define EFI_AHCI_DMA_FIS_OFFSET 0x00 #define EFI_AHCI_PIO_FIS_OFFSET 0x20 #define EFI_AHCI_SDB_FIS_OFFSET 0x58 #define EFI_AHCI_FIS_TYPE_MASK 0xFF #define EFI_AHCI_U_FIS_OFFSET 0x60 + // // Port register // -- 1.9.2 ------------------------------------------------------------------------------ Slashdot TV. Video for Nerds. Stuff that matters. http://tv.slashdot.org/ _______________________________________________ edk2-devel mailing list edk2-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/edk2-devel ------------------------------------------------------------------------------ Slashdot TV. Video for Nerds. Stuff that matters. http://tv.slashdot.org/ _______________________________________________ edk2-devel mailing list edk2-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/edk2-devel