It would expose EFI_SD_MMC_PASS_THRU_PROTOCOL for upper layer use.\r
\r
Copyright (c) 2018-2019, NVIDIA CORPORATION. All rights reserved.\r
- Copyright (c) 2015 - 2019, Intel Corporation. All rights reserved.<BR>\r
+ Copyright (c) 2015 - 2020, Intel Corporation. All rights reserved.<BR>\r
SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
return Status;\r
}\r
\r
+/**\r
+ Execute TRB synchronously.\r
+\r
+ @param[in] Private Pointer to driver private data.\r
+ @param[in] Trb Pointer to TRB to execute.\r
+\r
+ @retval EFI_SUCCESS TRB executed successfully.\r
+ @retval Other TRB failed.\r
+**/\r
+EFI_STATUS\r
+SdMmcPassThruExecSyncTrb (\r
+ IN SD_MMC_HC_PRIVATE_DATA *Private,\r
+ IN SD_MMC_HC_TRB *Trb\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_TPL OldTpl;\r
+\r
+ //\r
+ // Wait async I/O list is empty before execute sync I/O operation.\r
+ //\r
+ while (TRUE) {\r
+ OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
+ if (IsListEmpty (&Private->Queue)) {\r
+ gBS->RestoreTPL (OldTpl);\r
+ break;\r
+ }\r
+ gBS->RestoreTPL (OldTpl);\r
+ }\r
+\r
+ while (Trb->Retries) {\r
+ Status = SdMmcWaitTrbEnv (Private, Trb);\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
+ Status = SdMmcExecTrb (Private, Trb);\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
+ Status = SdMmcWaitTrbResult (Private, Trb);\r
+ if (Status == EFI_CRC_ERROR) {\r
+ Trb->Retries--;\r
+ } else {\r
+ return Status;\r
+ }\r
+ }\r
+\r
+ return Status;\r
+}\r
+\r
/**\r
Sends SD command to an SD card that is attached to the SD controller.\r
\r
EFI_STATUS Status;\r
SD_MMC_HC_PRIVATE_DATA *Private;\r
SD_MMC_HC_TRB *Trb;\r
- EFI_TPL OldTpl;\r
\r
if ((This == NULL) || (Packet == NULL)) {\r
return EFI_INVALID_PARAMETER;\r
return EFI_SUCCESS;\r
}\r
\r
- //\r
- // Wait async I/O list is empty before execute sync I/O operation.\r
- //\r
- while (TRUE) {\r
- OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
- if (IsListEmpty (&Private->Queue)) {\r
- gBS->RestoreTPL (OldTpl);\r
- break;\r
- }\r
- gBS->RestoreTPL (OldTpl);\r
- }\r
-\r
- Status = SdMmcWaitTrbEnv (Private, Trb);\r
- if (EFI_ERROR (Status)) {\r
- goto Done;\r
- }\r
-\r
- Status = SdMmcExecTrb (Private, Trb);\r
- if (EFI_ERROR (Status)) {\r
- goto Done;\r
- }\r
+ Status = SdMmcPassThruExecSyncTrb (Private, Trb);\r
\r
- Status = SdMmcWaitTrbResult (Private, Trb);\r
- if (EFI_ERROR (Status)) {\r
- goto Done;\r
- }\r
-\r
-Done:\r
SdMmcFreeTrb (Trb);\r
\r
return Status;\r
Provides some data structure definitions used by the SD/MMC host controller driver.\r
\r
Copyright (c) 2018-2019, NVIDIA CORPORATION. All rights reserved.\r
-Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2015 - 2020, Intel Corporation. All rights reserved.<BR>\r
SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
#define SD_MMC_HC_TRB_SIG SIGNATURE_32 ('T', 'R', 'B', 'T')\r
\r
+#define SD_MMC_TRB_RETRIES 5\r
+\r
//\r
// TRB (Transfer Request Block) contains information for the cmd request.\r
//\r
EFI_EVENT Event;\r
BOOLEAN Started;\r
UINT64 Timeout;\r
+ UINT32 Retries;\r
\r
SD_MMC_HC_ADMA_32_DESC_LINE *Adma32Desc;\r
SD_MMC_HC_ADMA_64_V3_DESC_LINE *Adma64V3Desc;\r