mirror of https://github.com/acidanthera/audk.git
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:
parent
36fbc6973c
commit
c25ddd0134
|
@ -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
|
||||
//
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in New Issue