MdeModulePkg/SdMmc: update TPL to notify to fix UEFI SCT hang
We have to upgrade the TPL level used by SdMmc stack because the following flow: DiskIo2ReadWriteDisk() in logical partition -> PartitionReadBlocksEx() in logical partition at TPL callback level -> ProbeMediaStatusEx() with sync request -> DiskIo2ReadWriteDisk() in physical partition -> waiting for async task completion. if the low layer driver doesn't run at TPL_NOTIFY level, it will have no time to trigger async task and cause system hang. Cc: Hao Wu <hao.a.wu@intel.com> Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Feng Tian <feng.tian@intel.com> Reviewed-by: Hao Wu <hao.a.wu@intel.com>
This commit is contained in:
@@ -238,6 +238,7 @@ SdMmcPciHcEnumerateDevice (
|
||||
LIST_ENTRY *Link;
|
||||
LIST_ENTRY *NextLink;
|
||||
SD_MMC_HC_TRB *Trb;
|
||||
EFI_TPL OldTpl;
|
||||
|
||||
Private = (SD_MMC_HC_PRIVATE_DATA*)Context;
|
||||
|
||||
@@ -251,6 +252,7 @@ SdMmcPciHcEnumerateDevice (
|
||||
//
|
||||
// Signal all async task events at the slot with EFI_NO_MEDIA status.
|
||||
//
|
||||
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||
for (Link = GetFirstNode (&Private->Queue);
|
||||
!IsNull (&Private->Queue, Link);
|
||||
Link = NextLink) {
|
||||
@@ -263,6 +265,7 @@ SdMmcPciHcEnumerateDevice (
|
||||
SdMmcFreeTrb (Trb);
|
||||
}
|
||||
}
|
||||
gBS->RestoreTPL (OldTpl);
|
||||
//
|
||||
// Notify the upper layer the connect state change through ReinstallProtocolInterface.
|
||||
//
|
||||
@@ -665,7 +668,7 @@ SdMmcPciHcDriverBindingStart (
|
||||
//
|
||||
Status = gBS->CreateEvent (
|
||||
EVT_TIMER | EVT_NOTIFY_SIGNAL,
|
||||
TPL_CALLBACK,
|
||||
TPL_NOTIFY,
|
||||
ProcessAsyncTaskList,
|
||||
Private,
|
||||
&Private->TimerEvent
|
||||
@@ -961,7 +964,7 @@ SdMmcPassThruPassThru (
|
||||
// Wait async I/O list is empty before execute sync I/O operation.
|
||||
//
|
||||
while (TRUE) {
|
||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
||||
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||
if (IsListEmpty (&Private->Queue)) {
|
||||
gBS->RestoreTPL (OldTpl);
|
||||
break;
|
||||
@@ -1273,7 +1276,7 @@ SdMmcPassThruResetDevice (
|
||||
//
|
||||
// Free all async I/O requests in the queue
|
||||
//
|
||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
||||
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||
|
||||
for (Link = GetFirstNode (&Private->Queue);
|
||||
!IsNull (&Private->Queue, Link);
|
||||
|
Reference in New Issue
Block a user