**/\r
\r
#include <Library/BaseMemoryLib.h>\r
+#include <Library/MemoryAllocationLib.h>\r
#include <Library/TimerLib.h>\r
\r
#include "Mmc.h"\r
}\r
\r
// Fetch ECSD\r
+ MmcHostInstance->CardInfo.ECSDData = AllocatePages (EFI_SIZE_TO_PAGES (sizeof (ECSD)));\r
+ if (MmcHostInstance->CardInfo.ECSDData == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
Status = Host->SendCommand (Host, MMC_CMD8, 0);\r
if (EFI_ERROR (Status)) {\r
DEBUG ((EFI_D_ERROR, "EmmcIdentificationMode(): ECSD fetch error, Status=%r.\n", Status));\r
}\r
\r
- Status = Host->ReadBlockData (Host, 0, 512, (UINT32 *)&(MmcHostInstance->CardInfo.ECSDData));\r
+ Status = Host->ReadBlockData (Host, 0, 512, (UINT32 *)MmcHostInstance->CardInfo.ECSDData);\r
if (EFI_ERROR (Status)) {\r
DEBUG ((EFI_D_ERROR, "EmmcIdentificationMode(): ECSD read error, Status=%r.\n", Status));\r
- return Status;\r
+ goto FreePageExit;\r
}\r
\r
// Make sure device exiting data mode\r
Status = EmmcGetDeviceState (MmcHostInstance, &State);\r
if (EFI_ERROR (Status)) {\r
DEBUG ((EFI_D_ERROR, "EmmcIdentificationMode(): Failed to get device state, Status=%r.\n", Status));\r
- return Status;\r
+ goto FreePageExit;\r
}\r
} while (State == EMMC_DATA_STATE);\r
\r
Media->LogicalBlocksPerPhysicalBlock = 1;\r
Media->IoAlign = 4;\r
// Compute last block using bits [215:212] of the ECSD\r
- Media->LastBlock = MmcHostInstance->CardInfo.ECSDData.SECTOR_COUNT - 1; // eMMC isn't supposed to report this for\r
+ Media->LastBlock = MmcHostInstance->CardInfo.ECSDData->SECTOR_COUNT - 1; // eMMC isn't supposed to report this for\r
// Cards <2GB in size, but the model does.\r
\r
// Setup card type\r
MmcHostInstance->CardInfo.CardType = EMMC_CARD;\r
return EFI_SUCCESS;\r
+\r
+FreePageExit:\r
+ FreePages (MmcHostInstance->CardInfo.ECSDData, EFI_SIZE_TO_PAGES (sizeof (ECSD)));\r
+ return Status;\r
}\r
\r
STATIC\r
UINT32 TimingMode[4] = {EMMCHS52DDR1V2, EMMCHS52DDR1V8, EMMCHS52, EMMCHS26};\r
\r
Host = MmcHostInstance->MmcHost;\r
- ECSDData = &MmcHostInstance->CardInfo.ECSDData;\r
+ ECSDData = MmcHostInstance->CardInfo.ECSDData;\r
if (ECSDData->DEVICE_TYPE == EMMCBACKWARD)\r
return EFI_SUCCESS;\r
\r