MdeModulePkg/SdMmcPciHcDxe: break cmd exec if the card isn't identified

Check if the card is identified/initialized correctly. if not, break
the following cmd execution through PassThru()/ResetDevice().

Cc: Wu, Hao A <hao.a.wu@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Feng Tian <feng.tian@intel.com>
This commit is contained in:
Feng Tian 2016-04-29 14:31:36 +08:00
parent 36fbc6973c
commit c25ddd0134
2 changed files with 29 additions and 5 deletions

View File

@ -51,8 +51,8 @@ SD_MMC_HC_PRIVATE_DATA gSdMmcPciHcTemplate = {
// Queue
INITIALIZE_LIST_HEAD_VARIABLE (gSdMmcPciHcTemplate.Queue),
{ // Slot
{0, UnknownSlot, 0, 0}, {0, UnknownSlot, 0, 0}, {0, UnknownSlot, 0, 0},
{0, UnknownSlot, 0, 0}, {0, UnknownSlot, 0, 0}, {0, UnknownSlot, 0, 0}
{0, UnknownSlot, 0, 0, 0}, {0, UnknownSlot, 0, 0, 0}, {0, UnknownSlot, 0, 0, 0},
{0, UnknownSlot, 0, 0, 0}, {0, UnknownSlot, 0, 0, 0}, {0, UnknownSlot, 0, 0, 0}
},
{ // Capability
{0},
@ -247,6 +247,7 @@ SdMmcPciHcEnumerateDevice (
if ((Status == EFI_MEDIA_CHANGED) && !MediaPresent) {
DEBUG ((EFI_D_INFO, "SdMmcPciHcEnumerateDevice: device disconnected at slot %d of pci %p\n", Slot, Private->PciIo));
Private->Slot[Slot].MediaPresent = FALSE;
Private->Slot[Slot].Initialized = FALSE;
//
// Signal all async task events at the slot with EFI_NO_MEDIA status.
//
@ -290,6 +291,7 @@ SdMmcPciHcEnumerateDevice (
}
Private->Slot[Slot].MediaPresent = TRUE;
Private->Slot[Slot].Initialized = TRUE;
RoutineNum = sizeof (mCardTypeDetectRoutineTable) / sizeof (CARD_TYPE_DETECT_ROUTINE);
for (Index = 0; Index < RoutineNum; Index++) {
Routine = &mCardTypeDetectRoutineTable[Index];
@ -300,6 +302,12 @@ SdMmcPciHcEnumerateDevice (
}
}
}
//
// This card doesn't get initialized correctly.
//
if (Index == RoutineNum) {
Private->Slot[Slot].Initialized = FALSE;
}
//
// Notify the upper layer the connect state change through ReinstallProtocolInterface.
@ -633,6 +641,7 @@ SdMmcPciHcDriverBindingStart (
}
Private->Slot[Slot].MediaPresent = TRUE;
Private->Slot[Slot].Initialized = TRUE;
RoutineNum = sizeof (mCardTypeDetectRoutineTable) / sizeof (CARD_TYPE_DETECT_ROUTINE);
for (Index = 0; Index < RoutineNum; Index++) {
Routine = &mCardTypeDetectRoutineTable[Index];
@ -643,6 +652,12 @@ SdMmcPciHcDriverBindingStart (
}
}
}
//
// This card doesn't get initialized correctly.
//
if (Index == RoutineNum) {
Private->Slot[Slot].Initialized = FALSE;
}
}
//
@ -927,6 +942,10 @@ SdMmcPassThruPassThru (
return EFI_NO_MEDIA;
}
if (!Private->Slot[Slot].Initialized) {
return EFI_DEVICE_ERROR;
}
Trb = SdMmcCreateTrb (Private, Slot, Packet, Event);
if (Trb == NULL) {
return EFI_OUT_OF_RESOURCES;
@ -1247,6 +1266,10 @@ SdMmcPassThruResetDevice (
if (!Private->Slot[Slot].MediaPresent) {
return EFI_NO_MEDIA;
}
if (!Private->Slot[Slot].Initialized) {
return EFI_DEVICE_ERROR;
}
//
// Free all async I/O requests in the queue
//

View File

@ -83,6 +83,7 @@ typedef struct {
BOOLEAN Enable;
EFI_SD_MMC_SLOT_TYPE SlotType;
BOOLEAN MediaPresent;
BOOLEAN Initialized;
SD_MMC_CARD_TYPE CardType;
} SD_MMC_HC_SLOT;