mirror of https://github.com/acidanthera/audk.git
MdeModulePkg/UfsPassThruDxe: Refactor UfsExecUicCommand function
https://bugzilla.tianocore.org/show_bug.cgi?id=1343 UfsExecUicCommand function has been refactored to allow the caller to check the command results which is important for commands such as UIC read. Signed-off-by: Mateusz Albecki <mateusz.albecki@intel.com> Reviewed-by: Hao A Wu <hao.a.wu@intel.com>
This commit is contained in:
parent
1bfd58c22e
commit
90952ad733
|
@ -1,6 +1,6 @@
|
|||
/** @file
|
||||
|
||||
Copyright (c) 2014 - 2018, Intel Corporation. All rights reserved.<BR>
|
||||
Copyright (c) 2014 - 2019, Intel Corporation. All rights reserved.<BR>
|
||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
|
||||
**/
|
||||
|
@ -13,6 +13,7 @@
|
|||
#include <Protocol/ScsiPassThruExt.h>
|
||||
#include <Protocol/UfsDeviceConfig.h>
|
||||
#include <Protocol/UfsHostController.h>
|
||||
#include <Protocol/UfsHostControllerPlatform.h>
|
||||
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/UefiDriverEntryPoint.h>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
UfsPassThruDxe driver is used to produce EFI_EXT_SCSI_PASS_THRU protocol interface
|
||||
for upper layer application to execute UFS-supported SCSI cmds.
|
||||
|
||||
Copyright (c) 2014 - 2018, Intel Corporation. All rights reserved.<BR>
|
||||
Copyright (c) 2014 - 2019, Intel Corporation. All rights reserved.<BR>
|
||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
|
||||
**/
|
||||
|
@ -1634,10 +1634,7 @@ Exit1:
|
|||
Send UIC command.
|
||||
|
||||
@param[in] Private The pointer to the UFS_PASS_THRU_PRIVATE_DATA data structure.
|
||||
@param[in] UicOpcode The opcode of the UIC command.
|
||||
@param[in] Arg1 The value for 1st argument of the UIC command.
|
||||
@param[in] Arg2 The value for 2nd argument of the UIC command.
|
||||
@param[in] Arg3 The value for 3rd argument of the UIC command.
|
||||
@param[in, out] UicCommand UIC command descriptor. On exit contains UIC command results.
|
||||
|
||||
@return EFI_SUCCESS Successfully execute this UIC command and detect attached UFS device.
|
||||
@return EFI_DEVICE_ERROR Fail to execute this UIC command and detect attached UFS device.
|
||||
|
@ -1646,10 +1643,7 @@ Exit1:
|
|||
EFI_STATUS
|
||||
UfsExecUicCommands (
|
||||
IN UFS_PASS_THRU_PRIVATE_DATA *Private,
|
||||
IN UINT8 UicOpcode,
|
||||
IN UINT32 Arg1,
|
||||
IN UINT32 Arg2,
|
||||
IN UINT32 Arg3
|
||||
IN OUT EDKII_UIC_COMMAND *UicCommand
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
@ -1675,17 +1669,17 @@ UfsExecUicCommands (
|
|||
// only after all the UIC command argument registers (UICCMDARG1, UICCMDARG2 and UICCMDARG3)
|
||||
// are set.
|
||||
//
|
||||
Status = UfsMmioWrite32 (Private, UFS_HC_UCMD_ARG1_OFFSET, Arg1);
|
||||
Status = UfsMmioWrite32 (Private, UFS_HC_UCMD_ARG1_OFFSET, UicCommand->Arg1);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
Status = UfsMmioWrite32 (Private, UFS_HC_UCMD_ARG2_OFFSET, Arg2);
|
||||
Status = UfsMmioWrite32 (Private, UFS_HC_UCMD_ARG2_OFFSET, UicCommand->Arg2);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
Status = UfsMmioWrite32 (Private, UFS_HC_UCMD_ARG3_OFFSET, Arg3);
|
||||
Status = UfsMmioWrite32 (Private, UFS_HC_UCMD_ARG3_OFFSET, UicCommand->Arg3);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
@ -1698,7 +1692,7 @@ UfsExecUicCommands (
|
|||
return Status;
|
||||
}
|
||||
|
||||
Status = UfsMmioWrite32 (Private, UFS_HC_UIC_CMD_OFFSET, (UINT32)UicOpcode);
|
||||
Status = UfsMmioWrite32 (Private, UFS_HC_UIC_CMD_OFFSET, UicCommand->Opcode);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
@ -1712,14 +1706,18 @@ UfsExecUicCommands (
|
|||
return Status;
|
||||
}
|
||||
|
||||
if (UicOpcode != UfsUicDmeReset) {
|
||||
Status = UfsMmioRead32 (Private, UFS_HC_UCMD_ARG2_OFFSET, &Data);
|
||||
if (UicCommand->Opcode != UfsUicDmeReset) {
|
||||
Status = UfsMmioRead32 (Private, UFS_HC_UCMD_ARG2_OFFSET, &UicCommand->Arg2);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
if ((Data & 0xFF) != 0) {
|
||||
Status = UfsMmioRead32 (Private, UFS_HC_UCMD_ARG3_OFFSET, &UicCommand->Arg3);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
if ((UicCommand->Arg2 & 0xFF) != 0) {
|
||||
DEBUG_CODE_BEGIN();
|
||||
DumpUicCmdExecResult (UicOpcode, (UINT8)(Data & 0xFF));
|
||||
DumpUicCmdExecResult ((UINT8)UicCommand->Opcode, (UINT8)(UicCommand->Arg2 & 0xFF));
|
||||
DEBUG_CODE_END();
|
||||
return EFI_DEVICE_ERROR;
|
||||
}
|
||||
|
@ -1901,13 +1899,18 @@ UfsDeviceDetection (
|
|||
UINTN Retry;
|
||||
EFI_STATUS Status;
|
||||
UINT32 Data;
|
||||
EDKII_UIC_COMMAND LinkStartupCommand;
|
||||
|
||||
//
|
||||
// Start UFS device detection.
|
||||
// Try up to 3 times for establishing data link with device.
|
||||
//
|
||||
for (Retry = 0; Retry < 3; Retry++) {
|
||||
Status = UfsExecUicCommands (Private, UfsUicDmeLinkStartup, 0, 0, 0);
|
||||
LinkStartupCommand.Opcode = UfsUicDmeLinkStartup;
|
||||
LinkStartupCommand.Arg1 = 0;
|
||||
LinkStartupCommand.Arg2 = 0;
|
||||
LinkStartupCommand.Arg3 = 0;
|
||||
Status = UfsExecUicCommands (Private, &LinkStartupCommand);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return EFI_DEVICE_ERROR;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue