diff --git a/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdDevice.c b/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdDevice.c index f5a3607e47..8bf452e9d0 100644 --- a/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdDevice.c +++ b/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdDevice.c @@ -1074,6 +1074,7 @@ SdGetTargetBusMode ( @param[in] Slot The slot number of the SD card to send the command to. @param[in] Rca The relative device address to be assigned. @param[in] S18A The boolean to show if it's a UHS-I SD card. + @param[in] SdVersion1 The boolean to show if it's a Version 1 SD card. @retval EFI_SUCCESS The operation is done correctly. @retval Others The operation fails. @@ -1085,7 +1086,8 @@ SdCardSetBusMode ( IN EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru, IN UINT8 Slot, IN UINT16 Rca, - IN BOOLEAN S18A + IN BOOLEAN S18A, + IN BOOLEAN SdVersion1 ) { EFI_STATUS Status; @@ -1095,6 +1097,8 @@ SdCardSetBusMode ( SD_MMC_HC_PRIVATE_DATA *Private; SD_MMC_BUS_SETTINGS BusMode; + ZeroMem (SwitchResp, 64 * sizeof (UINT8)); + Private = SD_MMC_HC_PRIVATE_FROM_THIS (PassThru); Capability = &Private->Capability[Slot]; @@ -1117,10 +1121,13 @@ SdCardSetBusMode ( // // Get the supported bus speed from SWITCH cmd return data group #1. + // SdVersion1 don't support the SWITCH cmd // - Status = SdCardSwitch (PassThru, Slot, 0xFF, 0xF, SdDriverStrengthIgnore, 0xF, FALSE, SwitchResp); - if (EFI_ERROR (Status)) { - return Status; + if (!SdVersion1) { + Status = SdCardSwitch (PassThru, Slot, 0xFF, 0xF, SdDriverStrengthIgnore, 0xF, FALSE, SwitchResp); + if (EFI_ERROR (Status)) { + return Status; + } } SdGetTargetBusMode (Private, Slot, SwitchResp, S18A, &BusMode); @@ -1141,9 +1148,14 @@ SdCardSetBusMode ( } } - Status = SdCardSwitch (PassThru, Slot, BusMode.BusTiming, 0xF, BusMode.DriverStrength.Sd, 0xF, TRUE, SwitchResp); - if (EFI_ERROR (Status)) { - return Status; + // + // SdVersion1 don't support the SWITCH cmd + // + if (!SdVersion1) { + Status = SdCardSwitch (PassThru, Slot, BusMode.BusTiming, 0xF, BusMode.DriverStrength.Sd, 0xF, TRUE, SwitchResp); + if (EFI_ERROR (Status)) { + return Status; + } } Status = SdMmcSetDriverStrength (Private->PciIo, Slot, BusMode.DriverStrength.Sd); @@ -1214,8 +1226,10 @@ SdCardIdentification ( UINT8 HostCtrl2; UINTN Retry; BOOLEAN ForceVoltage33; + BOOLEAN SdVersion1; ForceVoltage33 = FALSE; + SdVersion1 = FALSE; PciIo = Private->PciIo; PassThru = &Private->PassThru; @@ -1231,12 +1245,12 @@ Voltage33Retry: } // - // 2. Send Cmd8 to the device + // 2. Send Cmd8 to the device, the command will fail for SdVersion1 // Status = SdCardVoltageCheck (PassThru, Slot, 0x1, 0xFF); if (EFI_ERROR (Status)) { + SdVersion1 = TRUE; DEBUG ((DEBUG_INFO, "SdCardIdentification: Executing Cmd8 fails with %r\n", Status)); - return Status; } // @@ -1426,7 +1440,7 @@ Voltage33Retry: DEBUG ((DEBUG_INFO, "SdCardIdentification: Found a SD device at slot [%d]\n", Slot)); Private->Slot[Slot].CardType = SdCardType; - Status = SdCardSetBusMode (PciIo, PassThru, Slot, Rca, ((Ocr & BIT24) != 0)); + Status = SdCardSetBusMode (PciIo, PassThru, Slot, Rca, ((Ocr & BIT24) != 0), SdVersion1); return Status;