diff --git a/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHcDxe.c b/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHcDxe.c index ed6b557347..0be081dad0 100644 --- a/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHcDxe.c +++ b/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHcDxe.c @@ -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); diff --git a/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHci.c b/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHci.c index 8978182f9e..b4ff2af019 100644 --- a/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHci.c +++ b/MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHci.c @@ -1315,7 +1315,7 @@ SdMmcCreateTrb ( } if (Event != NULL) { - OldTpl = gBS->RaiseTPL (TPL_CALLBACK); + OldTpl = gBS->RaiseTPL (TPL_NOTIFY); InsertTailList (&Private->Queue, &Trb->TrbList); gBS->RestoreTPL (OldTpl); } diff --git a/MdeModulePkg/Bus/Sd/EmmcDxe/EmmcBlockIo.c b/MdeModulePkg/Bus/Sd/EmmcDxe/EmmcBlockIo.c index 5fe710dbb5..fc705e17d5 100644 --- a/MdeModulePkg/Bus/Sd/EmmcDxe/EmmcBlockIo.c +++ b/MdeModulePkg/Bus/Sd/EmmcDxe/EmmcBlockIo.c @@ -339,7 +339,7 @@ EmmcSetExtCsd ( } SetExtCsdReq->Signature = EMMC_REQUEST_SIGNATURE; - OldTpl = gBS->RaiseTPL (TPL_CALLBACK); + OldTpl = gBS->RaiseTPL (TPL_NOTIFY); InsertTailList (&Partition->Queue, &SetExtCsdReq->Link); gBS->RestoreTPL (OldTpl); SetExtCsdReq->Packet.SdMmcCmdBlk = &SetExtCsdReq->SdMmcCmdBlk; @@ -361,7 +361,7 @@ EmmcSetExtCsd ( if ((Token != NULL) && (Token->Event != NULL)) { Status = gBS->CreateEvent ( EVT_NOTIFY_SIGNAL, - TPL_CALLBACK, + TPL_NOTIFY, AsyncIoCallback, SetExtCsdReq, &SetExtCsdReq->Event @@ -382,7 +382,7 @@ Error: // The request and event will be freed in asynchronous callback for success case. // if (EFI_ERROR (Status) && (SetExtCsdReq != NULL)) { - OldTpl = gBS->RaiseTPL (TPL_CALLBACK); + OldTpl = gBS->RaiseTPL (TPL_NOTIFY); RemoveEntryList (&SetExtCsdReq->Link); gBS->RestoreTPL (OldTpl); if (SetExtCsdReq->Event != NULL) { @@ -395,7 +395,7 @@ Error: // For synchronous operation, free request whatever the execution result is. // if (SetExtCsdReq != NULL) { - OldTpl = gBS->RaiseTPL (TPL_CALLBACK); + OldTpl = gBS->RaiseTPL (TPL_NOTIFY); RemoveEntryList (&SetExtCsdReq->Link); gBS->RestoreTPL (OldTpl); FreePool (SetExtCsdReq); @@ -445,7 +445,7 @@ EmmcSetBlkCount ( } SetBlkCntReq->Signature = EMMC_REQUEST_SIGNATURE; - OldTpl = gBS->RaiseTPL (TPL_CALLBACK); + OldTpl = gBS->RaiseTPL (TPL_NOTIFY); InsertTailList (&Partition->Queue, &SetBlkCntReq->Link); gBS->RestoreTPL (OldTpl); SetBlkCntReq->Packet.SdMmcCmdBlk = &SetBlkCntReq->SdMmcCmdBlk; @@ -463,7 +463,7 @@ EmmcSetBlkCount ( if ((Token != NULL) && (Token->Event != NULL)) { Status = gBS->CreateEvent ( EVT_NOTIFY_SIGNAL, - TPL_CALLBACK, + TPL_NOTIFY, AsyncIoCallback, SetBlkCntReq, &SetBlkCntReq->Event @@ -484,7 +484,7 @@ Error: // The request and event will be freed in asynchronous callback for success case. // if (EFI_ERROR (Status) && (SetBlkCntReq != NULL)) { - OldTpl = gBS->RaiseTPL (TPL_CALLBACK); + OldTpl = gBS->RaiseTPL (TPL_NOTIFY); RemoveEntryList (&SetBlkCntReq->Link); gBS->RestoreTPL (OldTpl); if (SetBlkCntReq->Event != NULL) { @@ -497,7 +497,7 @@ Error: // For synchronous operation, free request whatever the execution result is. // if (SetBlkCntReq != NULL) { - OldTpl = gBS->RaiseTPL (TPL_CALLBACK); + OldTpl = gBS->RaiseTPL (TPL_NOTIFY); RemoveEntryList (&SetBlkCntReq->Link); gBS->RestoreTPL (OldTpl); FreePool (SetBlkCntReq); @@ -562,7 +562,7 @@ EmmcProtocolInOut ( } ProtocolReq->Signature = EMMC_REQUEST_SIGNATURE; - OldTpl = gBS->RaiseTPL (TPL_CALLBACK); + OldTpl = gBS->RaiseTPL (TPL_NOTIFY); InsertTailList (&Partition->Queue, &ProtocolReq->Link); gBS->RestoreTPL (OldTpl); ProtocolReq->Packet.SdMmcCmdBlk = &ProtocolReq->SdMmcCmdBlk; @@ -596,7 +596,7 @@ EmmcProtocolInOut ( if ((Token != NULL) && (Token->Event != NULL)) { Status = gBS->CreateEvent ( EVT_NOTIFY_SIGNAL, - TPL_CALLBACK, + TPL_NOTIFY, AsyncIoCallback, ProtocolReq, &ProtocolReq->Event @@ -617,7 +617,7 @@ Error: // The request and event will be freed in asynchronous callback for success case. // if (EFI_ERROR (Status) && (ProtocolReq != NULL)) { - OldTpl = gBS->RaiseTPL (TPL_CALLBACK); + OldTpl = gBS->RaiseTPL (TPL_NOTIFY); RemoveEntryList (&ProtocolReq->Link); gBS->RestoreTPL (OldTpl); if (ProtocolReq->Event != NULL) { @@ -630,7 +630,7 @@ Error: // For synchronous operation, free request whatever the execution result is. // if (ProtocolReq != NULL) { - OldTpl = gBS->RaiseTPL (TPL_CALLBACK); + OldTpl = gBS->RaiseTPL (TPL_NOTIFY); RemoveEntryList (&ProtocolReq->Link); gBS->RestoreTPL (OldTpl); FreePool (ProtocolReq); @@ -688,7 +688,7 @@ EmmcRwMultiBlocks ( } RwMultiBlkReq->Signature = EMMC_REQUEST_SIGNATURE; - OldTpl = gBS->RaiseTPL (TPL_CALLBACK); + OldTpl = gBS->RaiseTPL (TPL_NOTIFY); InsertTailList (&Partition->Queue, &RwMultiBlkReq->Link); gBS->RestoreTPL (OldTpl); RwMultiBlkReq->Packet.SdMmcCmdBlk = &RwMultiBlkReq->SdMmcCmdBlk; @@ -730,7 +730,7 @@ EmmcRwMultiBlocks ( if ((Token != NULL) && (Token->Event != NULL)) { Status = gBS->CreateEvent ( EVT_NOTIFY_SIGNAL, - TPL_CALLBACK, + TPL_NOTIFY, AsyncIoCallback, RwMultiBlkReq, &RwMultiBlkReq->Event @@ -751,7 +751,7 @@ Error: // The request and event will be freed in asynchronous callback for success case. // if (EFI_ERROR (Status) && (RwMultiBlkReq != NULL)) { - OldTpl = gBS->RaiseTPL (TPL_CALLBACK); + OldTpl = gBS->RaiseTPL (TPL_NOTIFY); RemoveEntryList (&RwMultiBlkReq->Link); gBS->RestoreTPL (OldTpl); if (RwMultiBlkReq->Event != NULL) { @@ -764,7 +764,7 @@ Error: // For synchronous operation, free request whatever the execution result is. // if (RwMultiBlkReq != NULL) { - OldTpl = gBS->RaiseTPL (TPL_CALLBACK); + OldTpl = gBS->RaiseTPL (TPL_NOTIFY); RemoveEntryList (&RwMultiBlkReq->Link); gBS->RestoreTPL (OldTpl); FreePool (RwMultiBlkReq); @@ -901,7 +901,7 @@ EmmcReadWrite ( if (EFI_ERROR (Status)) { return Status; } - DEBUG ((EFI_D_INFO, "Emmc%a(): Lba 0x%x BlkNo 0x%x Event %p with %r\n", IsRead ? "Read" : "Write", Lba, BlockNum, Token->Event, Status)); + DEBUG ((EFI_D_INFO, "Emmc%a(): Part %d Lba 0x%x BlkNo 0x%x Event %p with %r\n", IsRead ? "Read " : "Write", Partition->PartitionType, Lba, BlockNum, Token ? Token->Event : NULL, Status)); Lba += BlockNum; Buffer = (UINT8*)Buffer + BufferSize; @@ -1069,7 +1069,7 @@ EmmcResetEx ( Partition = EMMC_PARTITION_DATA_FROM_BLKIO2 (This); - OldTpl = gBS->RaiseTPL (TPL_CALLBACK); + OldTpl = gBS->RaiseTPL (TPL_NOTIFY); for (Link = GetFirstNode (&Partition->Queue); !IsNull (&Partition->Queue, Link); Link = NextLink) { @@ -1629,7 +1629,7 @@ EmmcEraseBlockStart ( } EraseBlockStart->Signature = EMMC_REQUEST_SIGNATURE; - OldTpl = gBS->RaiseTPL (TPL_CALLBACK); + OldTpl = gBS->RaiseTPL (TPL_NOTIFY); InsertTailList (&Partition->Queue, &EraseBlockStart->Link); gBS->RestoreTPL (OldTpl); EraseBlockStart->Packet.SdMmcCmdBlk = &EraseBlockStart->SdMmcCmdBlk; @@ -1652,7 +1652,7 @@ EmmcEraseBlockStart ( if ((Token != NULL) && (Token->Event != NULL)) { Status = gBS->CreateEvent ( EVT_NOTIFY_SIGNAL, - TPL_CALLBACK, + TPL_NOTIFY, AsyncIoCallback, EraseBlockStart, &EraseBlockStart->Event @@ -1673,7 +1673,9 @@ Error: // The request and event will be freed in asynchronous callback for success case. // if (EFI_ERROR (Status) && (EraseBlockStart != NULL)) { + OldTpl = gBS->RaiseTPL (TPL_NOTIFY); RemoveEntryList (&EraseBlockStart->Link); + gBS->RestoreTPL (OldTpl); if (EraseBlockStart->Event != NULL) { gBS->CloseEvent (EraseBlockStart->Event); } @@ -1684,7 +1686,9 @@ Error: // For synchronous operation, free request whatever the execution result is. // if (EraseBlockStart != NULL) { + OldTpl = gBS->RaiseTPL (TPL_NOTIFY); RemoveEntryList (&EraseBlockStart->Link); + gBS->RestoreTPL (OldTpl); FreePool (EraseBlockStart); } } @@ -1732,7 +1736,7 @@ EmmcEraseBlockEnd ( } EraseBlockEnd->Signature = EMMC_REQUEST_SIGNATURE; - OldTpl = gBS->RaiseTPL (TPL_CALLBACK); + OldTpl = gBS->RaiseTPL (TPL_NOTIFY); InsertTailList (&Partition->Queue, &EraseBlockEnd->Link); gBS->RestoreTPL (OldTpl); EraseBlockEnd->Packet.SdMmcCmdBlk = &EraseBlockEnd->SdMmcCmdBlk; @@ -1755,7 +1759,7 @@ EmmcEraseBlockEnd ( if ((Token != NULL) && (Token->Event != NULL)) { Status = gBS->CreateEvent ( EVT_NOTIFY_SIGNAL, - TPL_CALLBACK, + TPL_NOTIFY, AsyncIoCallback, EraseBlockEnd, &EraseBlockEnd->Event @@ -1776,7 +1780,9 @@ Error: // The request and event will be freed in asynchronous callback for success case. // if (EFI_ERROR (Status) && (EraseBlockEnd != NULL)) { + OldTpl = gBS->RaiseTPL (TPL_NOTIFY); RemoveEntryList (&EraseBlockEnd->Link); + gBS->RestoreTPL (OldTpl); if (EraseBlockEnd->Event != NULL) { gBS->CloseEvent (EraseBlockEnd->Event); } @@ -1787,7 +1793,9 @@ Error: // For synchronous operation, free request whatever the execution result is. // if (EraseBlockEnd != NULL) { + OldTpl = gBS->RaiseTPL (TPL_NOTIFY); RemoveEntryList (&EraseBlockEnd->Link); + gBS->RestoreTPL (OldTpl); FreePool (EraseBlockEnd); } } @@ -1833,7 +1841,7 @@ EmmcEraseBlock ( } EraseBlock->Signature = EMMC_REQUEST_SIGNATURE; - OldTpl = gBS->RaiseTPL (TPL_CALLBACK); + OldTpl = gBS->RaiseTPL (TPL_NOTIFY); InsertTailList (&Partition->Queue, &EraseBlock->Link); gBS->RestoreTPL (OldTpl); EraseBlock->Packet.SdMmcCmdBlk = &EraseBlock->SdMmcCmdBlk; @@ -1850,7 +1858,7 @@ EmmcEraseBlock ( if ((Token != NULL) && (Token->Event != NULL)) { Status = gBS->CreateEvent ( EVT_NOTIFY_SIGNAL, - TPL_CALLBACK, + TPL_NOTIFY, AsyncIoCallback, EraseBlock, &EraseBlock->Event @@ -1871,7 +1879,9 @@ Error: // The request and event will be freed in asynchronous callback for success case. // if (EFI_ERROR (Status) && (EraseBlock != NULL)) { + OldTpl = gBS->RaiseTPL (TPL_NOTIFY); RemoveEntryList (&EraseBlock->Link); + gBS->RestoreTPL (OldTpl); if (EraseBlock->Event != NULL) { gBS->CloseEvent (EraseBlock->Event); } @@ -1882,7 +1892,9 @@ Error: // For synchronous operation, free request whatever the execution result is. // if (EraseBlock != NULL) { + OldTpl = gBS->RaiseTPL (TPL_NOTIFY); RemoveEntryList (&EraseBlock->Link); + gBS->RestoreTPL (OldTpl); FreePool (EraseBlock); } } diff --git a/MdeModulePkg/Bus/Sd/SdDxe/SdBlockIo.c b/MdeModulePkg/Bus/Sd/SdDxe/SdBlockIo.c index d8b9459c63..516c3e7042 100644 --- a/MdeModulePkg/Bus/Sd/SdDxe/SdBlockIo.c +++ b/MdeModulePkg/Bus/Sd/SdDxe/SdBlockIo.c @@ -340,7 +340,7 @@ SdRwSingleBlock ( } RwSingleBlkReq->Signature = SD_REQUEST_SIGNATURE; - OldTpl = gBS->RaiseTPL (TPL_CALLBACK); + OldTpl = gBS->RaiseTPL (TPL_NOTIFY); InsertTailList (&Device->Queue, &RwSingleBlkReq->Link); gBS->RestoreTPL (OldTpl); RwSingleBlkReq->Packet.SdMmcCmdBlk = &RwSingleBlkReq->SdMmcCmdBlk; @@ -382,7 +382,7 @@ SdRwSingleBlock ( if ((Token != NULL) && (Token->Event != NULL)) { Status = gBS->CreateEvent ( EVT_NOTIFY_SIGNAL, - TPL_CALLBACK, + TPL_NOTIFY, AsyncIoCallback, RwSingleBlkReq, &RwSingleBlkReq->Event @@ -403,7 +403,9 @@ Error: // The request and event will be freed in asynchronous callback for success case. // if (EFI_ERROR (Status) && (RwSingleBlkReq != NULL)) { + OldTpl = gBS->RaiseTPL (TPL_NOTIFY); RemoveEntryList (&RwSingleBlkReq->Link); + gBS->RestoreTPL (OldTpl); if (RwSingleBlkReq->Event != NULL) { gBS->CloseEvent (RwSingleBlkReq->Event); } @@ -414,7 +416,9 @@ Error: // For synchronous operation, free request whatever the execution result is. // if (RwSingleBlkReq != NULL) { + OldTpl = gBS->RaiseTPL (TPL_NOTIFY); RemoveEntryList (&RwSingleBlkReq->Link); + gBS->RestoreTPL (OldTpl); FreePool (RwSingleBlkReq); } } @@ -468,7 +472,7 @@ SdRwMultiBlocks ( } RwMultiBlkReq->Signature = SD_REQUEST_SIGNATURE; - OldTpl = gBS->RaiseTPL (TPL_CALLBACK); + OldTpl = gBS->RaiseTPL (TPL_NOTIFY); InsertTailList (&Device->Queue, &RwMultiBlkReq->Link); gBS->RestoreTPL (OldTpl); RwMultiBlkReq->Packet.SdMmcCmdBlk = &RwMultiBlkReq->SdMmcCmdBlk; @@ -510,7 +514,7 @@ SdRwMultiBlocks ( if ((Token != NULL) && (Token->Event != NULL)) { Status = gBS->CreateEvent ( EVT_NOTIFY_SIGNAL, - TPL_CALLBACK, + TPL_NOTIFY, AsyncIoCallback, RwMultiBlkReq, &RwMultiBlkReq->Event @@ -531,7 +535,9 @@ Error: // The request and event will be freed in asynchronous callback for success case. // if (EFI_ERROR (Status) && (RwMultiBlkReq != NULL)) { + OldTpl = gBS->RaiseTPL (TPL_NOTIFY); RemoveEntryList (&RwMultiBlkReq->Link); + gBS->RestoreTPL (OldTpl); if (RwMultiBlkReq->Event != NULL) { gBS->CloseEvent (RwMultiBlkReq->Event); } @@ -542,7 +548,9 @@ Error: // For synchronous operation, free request whatever the execution result is. // if (RwMultiBlkReq != NULL) { + OldTpl = gBS->RaiseTPL (TPL_NOTIFY); RemoveEntryList (&RwMultiBlkReq->Link); + gBS->RestoreTPL (OldTpl); FreePool (RwMultiBlkReq); } } @@ -830,7 +838,7 @@ SdResetEx ( Device = SD_DEVICE_DATA_FROM_BLKIO2 (This); - OldTpl = gBS->RaiseTPL (TPL_CALLBACK); + OldTpl = gBS->RaiseTPL (TPL_NOTIFY); for (Link = GetFirstNode (&Device->Queue); !IsNull (&Device->Queue, Link); Link = NextLink) { @@ -1007,7 +1015,7 @@ SdEraseBlockStart ( } EraseBlockStart->Signature = SD_REQUEST_SIGNATURE; - OldTpl = gBS->RaiseTPL (TPL_CALLBACK); + OldTpl = gBS->RaiseTPL (TPL_NOTIFY); InsertTailList (&Device->Queue, &EraseBlockStart->Link); gBS->RestoreTPL (OldTpl); EraseBlockStart->Packet.SdMmcCmdBlk = &EraseBlockStart->SdMmcCmdBlk; @@ -1030,7 +1038,7 @@ SdEraseBlockStart ( if ((Token != NULL) && (Token->Event != NULL)) { Status = gBS->CreateEvent ( EVT_NOTIFY_SIGNAL, - TPL_CALLBACK, + TPL_NOTIFY, AsyncIoCallback, EraseBlockStart, &EraseBlockStart->Event @@ -1051,7 +1059,9 @@ Error: // The request and event will be freed in asynchronous callback for success case. // if (EFI_ERROR (Status) && (EraseBlockStart != NULL)) { + OldTpl = gBS->RaiseTPL (TPL_NOTIFY); RemoveEntryList (&EraseBlockStart->Link); + gBS->RestoreTPL (OldTpl); if (EraseBlockStart->Event != NULL) { gBS->CloseEvent (EraseBlockStart->Event); } @@ -1062,7 +1072,9 @@ Error: // For synchronous operation, free request whatever the execution result is. // if (EraseBlockStart != NULL) { + OldTpl = gBS->RaiseTPL (TPL_NOTIFY); RemoveEntryList (&EraseBlockStart->Link); + gBS->RestoreTPL (OldTpl); FreePool (EraseBlockStart); } } @@ -1107,7 +1119,7 @@ SdEraseBlockEnd ( } EraseBlockEnd->Signature = SD_REQUEST_SIGNATURE; - OldTpl = gBS->RaiseTPL (TPL_CALLBACK); + OldTpl = gBS->RaiseTPL (TPL_NOTIFY); InsertTailList (&Device->Queue, &EraseBlockEnd->Link); gBS->RestoreTPL (OldTpl); EraseBlockEnd->Packet.SdMmcCmdBlk = &EraseBlockEnd->SdMmcCmdBlk; @@ -1130,7 +1142,7 @@ SdEraseBlockEnd ( if ((Token != NULL) && (Token->Event != NULL)) { Status = gBS->CreateEvent ( EVT_NOTIFY_SIGNAL, - TPL_CALLBACK, + TPL_NOTIFY, AsyncIoCallback, EraseBlockEnd, &EraseBlockEnd->Event @@ -1151,7 +1163,9 @@ Error: // The request and event will be freed in asynchronous callback for success case. // if (EFI_ERROR (Status) && (EraseBlockEnd != NULL)) { + OldTpl = gBS->RaiseTPL (TPL_NOTIFY); RemoveEntryList (&EraseBlockEnd->Link); + gBS->RestoreTPL (OldTpl); if (EraseBlockEnd->Event != NULL) { gBS->CloseEvent (EraseBlockEnd->Event); } @@ -1162,7 +1176,9 @@ Error: // For synchronous operation, free request whatever the execution result is. // if (EraseBlockEnd != NULL) { + OldTpl = gBS->RaiseTPL (TPL_NOTIFY); RemoveEntryList (&EraseBlockEnd->Link); + gBS->RestoreTPL (OldTpl); FreePool (EraseBlockEnd); } } @@ -1205,7 +1221,7 @@ SdEraseBlock ( } EraseBlock->Signature = SD_REQUEST_SIGNATURE; - OldTpl = gBS->RaiseTPL (TPL_CALLBACK); + OldTpl = gBS->RaiseTPL (TPL_NOTIFY); InsertTailList (&Device->Queue, &EraseBlock->Link); gBS->RestoreTPL (OldTpl); EraseBlock->Packet.SdMmcCmdBlk = &EraseBlock->SdMmcCmdBlk; @@ -1222,7 +1238,7 @@ SdEraseBlock ( if ((Token != NULL) && (Token->Event != NULL)) { Status = gBS->CreateEvent ( EVT_NOTIFY_SIGNAL, - TPL_CALLBACK, + TPL_NOTIFY, AsyncIoCallback, EraseBlock, &EraseBlock->Event @@ -1243,7 +1259,9 @@ Error: // The request and event will be freed in asynchronous callback for success case. // if (EFI_ERROR (Status) && (EraseBlock != NULL)) { + OldTpl = gBS->RaiseTPL (TPL_NOTIFY); RemoveEntryList (&EraseBlock->Link); + gBS->RestoreTPL (OldTpl); if (EraseBlock->Event != NULL) { gBS->CloseEvent (EraseBlock->Event); } @@ -1254,7 +1272,9 @@ Error: // For synchronous operation, free request whatever the execution result is. // if (EraseBlock != NULL) { + OldTpl = gBS->RaiseTPL (TPL_NOTIFY); RemoveEntryList (&EraseBlock->Link); + gBS->RestoreTPL (OldTpl); FreePool (EraseBlock); } } diff --git a/MdeModulePkg/Bus/Sd/SdDxe/SdDxe.c b/MdeModulePkg/Bus/Sd/SdDxe/SdDxe.c index 7c70c60a50..0cf9067701 100644 --- a/MdeModulePkg/Bus/Sd/SdDxe/SdDxe.c +++ b/MdeModulePkg/Bus/Sd/SdDxe/SdDxe.c @@ -800,7 +800,7 @@ SdDxeDriverBindingStop ( // // Free all on-going async tasks. // - OldTpl = gBS->RaiseTPL (TPL_CALLBACK); + OldTpl = gBS->RaiseTPL (TPL_NOTIFY); for (Link = GetFirstNode (&Device->Queue); !IsNull (&Device->Queue, Link); Link = NextLink) {