Status = MmcHost->SendCommand(MMC_CMD13, CmdArg);\r
if (EFI_ERROR(Status)) {\r
DEBUG((EFI_D_ERROR, "MmcGetCardStatus(MMC_CMD13): Error and Status = %r\n", Status));\r
- ASSERT(0);\r
return Status;\r
}\r
\r
\r
if (Timeout == 0) {\r
DEBUG((EFI_D_ERROR, "MmcIdentificationMode(): No Card\n"));\r
- ASSERT(0);\r
return EFI_NO_MEDIA;\r
} else {\r
PrintOCR(Response[0]);\r
Status = MmcHost->SendCommand(MMC_CMD2, 0);\r
if (EFI_ERROR(Status)) {\r
DEBUG((EFI_D_ERROR, "MmcIdentificationMode(MMC_CMD2): Error\n"));\r
- ASSERT(0);\r
return Status;\r
}\r
MmcHost->ReceiveResponse(MMC_RESPONSE_TYPE_CID,Response);\r
return EFI_SUCCESS;\r
}\r
\r
+EFI_STATUS InitializeMmcDevice(\r
+ IN MMC_HOST_INSTANCE *MmcHostInstance\r
+ )\r
+{\r
+ UINT32 Response[4];\r
+ EFI_STATUS Status;\r
+ UINTN CardSize, NumBlocks, BlockSize, CmdArg;\r
+ EFI_MMC_HOST_PROTOCOL *MmcHost;\r
+ UINTN BlockCount = 1;\r
+ \r
+ MmcHost = MmcHostInstance->MmcHost;\r
+\r
+ MmcIdentificationMode (MmcHostInstance);\r
+\r
+ //Send a command to get Card specific data\r
+ CmdArg = MmcHostInstance->CardInfo.RCA << 16;\r
+ Status = MmcHost->SendCommand(MMC_CMD9, CmdArg);\r
+ if (EFI_ERROR(Status)) {\r
+ DEBUG((EFI_D_ERROR, "MmcIdentificationMode(MMC_CMD9): Error, Status=%r\n", Status));\r
+ return Status;\r
+ }\r
+ //Read Response\r
+ MmcHost->ReceiveResponse(MMC_RESPONSE_TYPE_CSD,Response);\r
+ PrintCSD(Response);\r
+\r
+ if (MmcHostInstance->CardInfo.CardType == SD_CARD_2_HIGH) {\r
+ CardSize = HC_MMC_CSD_GET_DEVICESIZE(Response);\r
+ NumBlocks = ((CardSize + 1) * 1024);\r
+ BlockSize = 1 << MMC_CSD_GET_READBLLEN(Response);\r
+ } else {\r
+ CardSize = MMC_CSD_GET_DEVICESIZE(Response);\r
+ NumBlocks = (CardSize + 1) * (1 << (MMC_CSD_GET_DEVICESIZEMULT(Response) + 2));\r
+ BlockSize = 1 << MMC_CSD_GET_READBLLEN(Response);\r
+ }\r
+\r
+ //For >=2G card, BlockSize may be 1K, but the transfer size is 512 bytes.\r
+ if (BlockSize > 512) {\r
+ NumBlocks = MultU64x32(NumBlocks, BlockSize/512);\r
+ BlockSize = 512;\r
+ }\r
+\r
+ MmcHostInstance->BlockIo.Media->LastBlock = (NumBlocks - 1);\r
+ MmcHostInstance->BlockIo.Media->BlockSize = BlockSize;\r
+ MmcHostInstance->BlockIo.Media->ReadOnly = MmcHost->IsReadOnly();\r
+ MmcHostInstance->BlockIo.Media->MediaPresent = TRUE;\r
+ MmcHostInstance->BlockIo.Media->MediaId++;\r
+\r
+ CmdArg = MmcHostInstance->CardInfo.RCA << 16;\r
+ Status = MmcHost->SendCommand(MMC_CMD7, CmdArg);\r
+ if (EFI_ERROR(Status)) {\r
+ DEBUG((EFI_D_ERROR, "MmcIdentificationMode(MMC_CMD7): Error and Status = %r\n", Status));\r
+ return Status;\r
+ }\r
+\r
+ Status = MmcNotifyState (MmcHostInstance, MmcTransferState);\r
+ if (EFI_ERROR(Status)) {\r
+ DEBUG((EFI_D_ERROR, "MmcIdentificationMode() : Error MmcTransferState\n"));\r
+ return Status;\r
+ }\r
+\r
+ // Set Block Length\r
+ Status = MmcHost->SendCommand(MMC_CMD16, MmcHostInstance->BlockIo.Media->BlockSize);\r
+ if (EFI_ERROR(Status)) {\r
+ DEBUG((EFI_D_ERROR, "MmcIdentificationMode(MMC_CMD16): Error MmcHostInstance->BlockIo.Media->BlockSize: %d and Error = %r\n",MmcHostInstance->BlockIo.Media->BlockSize, Status));\r
+ return Status;\r
+ }\r
+\r
+ // Block Count (not used). Could return an error for SD card\r
+ if (MmcHostInstance->CardInfo.CardType == MMC_CARD) {\r
+ MmcHost->SendCommand(MMC_CMD23, BlockCount);\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
EFI_STATUS\r
EFIAPI\r
MmcReset (\r
{\r
UINT32 Response[4];\r
EFI_STATUS Status;\r
- UINTN CardSize, NumBlocks, BlockSize, CmdArg;\r
+ UINTN CmdArg;\r
INTN Timeout;\r
UINTN Cmd;\r
MMC_HOST_INSTANCE *MmcHostInstance;\r
return EFI_NO_MEDIA;\r
}\r
\r
- // If the driver has not been initialized yet then go into Identification Mode\r
- if (MmcHostInstance->State == MmcHwInitializationState) {\r
- MmcIdentificationMode (MmcHostInstance);\r
-\r
- //Send a command to get Card specific data\r
- CmdArg = MmcHostInstance->CardInfo.RCA << 16;\r
- Status = MmcHost->SendCommand(MMC_CMD9, CmdArg);\r
- if (EFI_ERROR(Status)) {\r
- DEBUG((EFI_D_ERROR, "MmcIdentificationMode(MMC_CMD9): Error, Status=%r\n", Status));\r
- ASSERT(0);\r
- return Status;\r
- }\r
- //Read Response\r
- MmcHost->ReceiveResponse(MMC_RESPONSE_TYPE_CSD,Response);\r
- PrintCSD(Response);\r
-\r
- if (MmcHostInstance->CardInfo.CardType == SD_CARD_2_HIGH) {\r
- CardSize = HC_MMC_CSD_GET_DEVICESIZE(Response);\r
- NumBlocks = ((CardSize + 1) * 1024);\r
- BlockSize = 1 << MMC_CSD_GET_READBLLEN(Response);\r
- } else {\r
- CardSize = MMC_CSD_GET_DEVICESIZE(Response);\r
- NumBlocks = (CardSize + 1) * (1 << (MMC_CSD_GET_DEVICESIZEMULT(Response) + 2));\r
- BlockSize = 1 << MMC_CSD_GET_READBLLEN(Response);\r
- }\r
-\r
- //For >=2G card, BlockSize may be 1K, but the transfer size is 512 bytes.\r
- if (BlockSize > 512) {\r
- NumBlocks = MultU64x32(NumBlocks, BlockSize/512);\r
- BlockSize = 512;\r
- }\r
-\r
- MmcHostInstance->BlockIo.Media->LastBlock = (NumBlocks - 1);\r
- MmcHostInstance->BlockIo.Media->BlockSize = BlockSize;\r
- MmcHostInstance->BlockIo.Media->ReadOnly = MmcHost->IsReadOnly();\r
- MmcHostInstance->BlockIo.Media->MediaPresent = TRUE;\r
- MmcHostInstance->BlockIo.Media->MediaId++;\r
-\r
- CmdArg = MmcHostInstance->CardInfo.RCA << 16;\r
- Status = MmcHost->SendCommand(MMC_CMD7, CmdArg);\r
- if (EFI_ERROR(Status)) {\r
- DEBUG((EFI_D_ERROR, "MmcIdentificationMode(MMC_CMD7): Error and Status = %r\n", Status));\r
- ASSERT(0);\r
- return Status;\r
- }\r
-\r
- Status = MmcNotifyState (MmcHostInstance, MmcTransferState);\r
- if (EFI_ERROR(Status)) {\r
- DEBUG((EFI_D_ERROR, "MmcIdentificationMode() : Error MmcTransferState\n"));\r
- return Status;\r
- }\r
-\r
- // Set Block Length\r
- Status = MmcHost->SendCommand(MMC_CMD16, This->Media->BlockSize);\r
- if (EFI_ERROR(Status)) {\r
- DEBUG((EFI_D_ERROR, "MmcIdentificationMode(MMC_CMD16): Error This->Media->BlockSize: %d and Error = %r\n",This->Media->BlockSize, Status));\r
- return Status;\r
- }\r
-\r
- // Block Count (not used). Could return an error for SD card\r
- if (MmcHostInstance->CardInfo.CardType == MMC_CARD) {\r
- MmcHost->SendCommand(MMC_CMD23, BlockCount);\r
- }\r
- } else {\r
- // Maybe test if the card has changed to update gMmcMedia information\r
- if (MmcHostInstance->State == MmcTransferState) {\r
- //DEBUG((EFI_D_ERROR, "MmcIdentificationMode() : MmcTransferState\n"));\r
- } else if (MmcHostInstance->State == MmcStandByState) {\r
- DEBUG((EFI_D_ERROR, "MmcIdentificationMode() : MmcStandByState\n"));\r
- } else {\r
- ASSERT(0);\r
- }\r
- }\r
-\r
// All blocks must be within the device\r
if ((Lba + (BufferSize / This->Media->BlockSize)) > (This->Media->LastBlock + 1)){\r
- ASSERT(0);\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
// The buffer size must not be zero and it must be an exact multiple of the block size\r
if ((BufferSize == 0) || ((BufferSize % This->Media->BlockSize) != 0)) {\r
- ASSERT(0);\r
return EFI_BAD_BUFFER_SIZE;\r
}\r
\r