X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=EmbeddedPkg%2FUniversal%2FMmcDxe%2FMmcBlockIo.c;h=38998c893fcde0bc8f13bdb24636e99daaf40b56;hp=cd04369652faccac3cd2a69a424857fb957b85fb;hb=d8ad4736afb60d282e07530733831015321e547f;hpb=3de99375d289d2945192be9e38fce63224d27b21 diff --git a/EmbeddedPkg/Universal/MmcDxe/MmcBlockIo.c b/EmbeddedPkg/Universal/MmcDxe/MmcBlockIo.c index cd04369652..38998c893f 100644 --- a/EmbeddedPkg/Universal/MmcDxe/MmcBlockIo.c +++ b/EmbeddedPkg/Universal/MmcDxe/MmcBlockIo.c @@ -333,19 +333,21 @@ MmcIdentificationMode ( return Status; } - CmdArg = 0; - CmdRetryCnt = CMD_RETRY_COUNT; - //Keep sending CMD 3 until card enters to Standby mode and Card status is ready - while((MMC_R0_CURRENTSTATE(Response) != MMC_R0_STATE_STDBY) && CmdRetryCnt--) { - Status = MmcHost->SendCommand(MMC_CMD3, CmdArg); - if (EFI_ERROR(Status)) { - DEBUG((EFI_D_ERROR, "MmcIdentificationMode(MMC_CMD3): Error\n")); - return Status; - } - MmcHost->ReceiveResponse(MMC_RESPONSE_TYPE_RCA,Response); - PrintRCA(Response[0]); + // + // Note, SD specifications say that "if the command execution causes a state change, it + // will be visible to the host in the response to the next command" + // The status returned for this CMD3 will be 2 - identification + // + CmdArg = 1; + Status = MmcHost->SendCommand(MMC_CMD3, CmdArg); + if (EFI_ERROR(Status)) { + DEBUG((EFI_D_ERROR, "MmcIdentificationMode(MMC_CMD3): Error\n")); + return Status; } + MmcHost->ReceiveResponse(MMC_RESPONSE_TYPE_RCA,Response); + PrintRCA(Response[0]); + // For MMC card, RCA is assigned by CMD3 while CMD3 dumps the RCA for SD card if (MmcHostInstance->CardInfo.CardType != MMC_CARD) { MmcHostInstance->CardInfo.RCA = Response[0] >> 16; @@ -424,7 +426,7 @@ MmcIoBlocks ( UINT32 Response[4]; EFI_STATUS Status; UINTN CardSize, NumBlocks, BlockSize, CmdArg; - UINTN Timeout; + INTN Timeout; UINTN Cmd; MMC_HOST_INSTANCE *MmcHostInstance; EFI_MMC_HOST_PROTOCOL *MmcHost; @@ -436,7 +438,7 @@ MmcIoBlocks ( MmcHost = MmcHostInstance->MmcHost; ASSERT(MmcHost); - if (MmcHost == 0) { + if ((MmcHost == 0)|| (Buffer == NULL)) { return EFI_INVALID_PARAMETER; } @@ -445,7 +447,7 @@ MmcIoBlocks ( return EFI_NO_MEDIA; } - // If the driver has not been initialized yet then go into Iddentification Mode + // If the driver has not been initialized yet then go into Identification Mode if (MmcHostInstance->State == MmcHwInitializationState) { MmcIdentificationMode (MmcHostInstance); @@ -508,14 +510,24 @@ MmcIoBlocks ( } } - if (Lba > This->Media->LastBlock) { - ASSERT(0); - return EFI_INVALID_PARAMETER; + // All blocks must be within the device + if ((Lba + (BufferSize / This->Media->BlockSize)) > (This->Media->LastBlock + 1)){ + ASSERT(0); + return EFI_INVALID_PARAMETER; } - if ((BufferSize % This->Media->BlockSize) != 0) { - ASSERT(0); - return EFI_BAD_BUFFER_SIZE; + // The buffer size must not be zero and it must be an exact multiple of the block size + if ((BufferSize == 0) || ((BufferSize % This->Media->BlockSize) != 0)) { + ASSERT(0); + return EFI_BAD_BUFFER_SIZE; + } + + if (This->Media->MediaId != MediaId) { + return EFI_MEDIA_CHANGED; + } + + if((Transfer == MMC_IOBLOCKS_WRITE) && (This->Media->ReadOnly == TRUE)) { + return EFI_WRITE_PROTECTED; } BytesRemainingToBeTransfered = BufferSize;