mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-31 01:24:12 +02:00
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:
parent
e1f3583409
commit
3b1d8241d0
@ -238,6 +238,7 @@ SdMmcPciHcEnumerateDevice (
|
|||||||
LIST_ENTRY *Link;
|
LIST_ENTRY *Link;
|
||||||
LIST_ENTRY *NextLink;
|
LIST_ENTRY *NextLink;
|
||||||
SD_MMC_HC_TRB *Trb;
|
SD_MMC_HC_TRB *Trb;
|
||||||
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
Private = (SD_MMC_HC_PRIVATE_DATA*)Context;
|
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.
|
// Signal all async task events at the slot with EFI_NO_MEDIA status.
|
||||||
//
|
//
|
||||||
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
for (Link = GetFirstNode (&Private->Queue);
|
for (Link = GetFirstNode (&Private->Queue);
|
||||||
!IsNull (&Private->Queue, Link);
|
!IsNull (&Private->Queue, Link);
|
||||||
Link = NextLink) {
|
Link = NextLink) {
|
||||||
@ -263,6 +265,7 @@ SdMmcPciHcEnumerateDevice (
|
|||||||
SdMmcFreeTrb (Trb);
|
SdMmcFreeTrb (Trb);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
gBS->RestoreTPL (OldTpl);
|
||||||
//
|
//
|
||||||
// Notify the upper layer the connect state change through ReinstallProtocolInterface.
|
// Notify the upper layer the connect state change through ReinstallProtocolInterface.
|
||||||
//
|
//
|
||||||
@ -665,7 +668,7 @@ SdMmcPciHcDriverBindingStart (
|
|||||||
//
|
//
|
||||||
Status = gBS->CreateEvent (
|
Status = gBS->CreateEvent (
|
||||||
EVT_TIMER | EVT_NOTIFY_SIGNAL,
|
EVT_TIMER | EVT_NOTIFY_SIGNAL,
|
||||||
TPL_CALLBACK,
|
TPL_NOTIFY,
|
||||||
ProcessAsyncTaskList,
|
ProcessAsyncTaskList,
|
||||||
Private,
|
Private,
|
||||||
&Private->TimerEvent
|
&Private->TimerEvent
|
||||||
@ -961,7 +964,7 @@ SdMmcPassThruPassThru (
|
|||||||
// Wait async I/O list is empty before execute sync I/O operation.
|
// Wait async I/O list is empty before execute sync I/O operation.
|
||||||
//
|
//
|
||||||
while (TRUE) {
|
while (TRUE) {
|
||||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
if (IsListEmpty (&Private->Queue)) {
|
if (IsListEmpty (&Private->Queue)) {
|
||||||
gBS->RestoreTPL (OldTpl);
|
gBS->RestoreTPL (OldTpl);
|
||||||
break;
|
break;
|
||||||
@ -1273,7 +1276,7 @@ SdMmcPassThruResetDevice (
|
|||||||
//
|
//
|
||||||
// Free all async I/O requests in the queue
|
// Free all async I/O requests in the queue
|
||||||
//
|
//
|
||||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
|
|
||||||
for (Link = GetFirstNode (&Private->Queue);
|
for (Link = GetFirstNode (&Private->Queue);
|
||||||
!IsNull (&Private->Queue, Link);
|
!IsNull (&Private->Queue, Link);
|
||||||
|
@ -1315,7 +1315,7 @@ SdMmcCreateTrb (
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (Event != NULL) {
|
if (Event != NULL) {
|
||||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
InsertTailList (&Private->Queue, &Trb->TrbList);
|
InsertTailList (&Private->Queue, &Trb->TrbList);
|
||||||
gBS->RestoreTPL (OldTpl);
|
gBS->RestoreTPL (OldTpl);
|
||||||
}
|
}
|
||||||
|
@ -339,7 +339,7 @@ EmmcSetExtCsd (
|
|||||||
}
|
}
|
||||||
|
|
||||||
SetExtCsdReq->Signature = EMMC_REQUEST_SIGNATURE;
|
SetExtCsdReq->Signature = EMMC_REQUEST_SIGNATURE;
|
||||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
InsertTailList (&Partition->Queue, &SetExtCsdReq->Link);
|
InsertTailList (&Partition->Queue, &SetExtCsdReq->Link);
|
||||||
gBS->RestoreTPL (OldTpl);
|
gBS->RestoreTPL (OldTpl);
|
||||||
SetExtCsdReq->Packet.SdMmcCmdBlk = &SetExtCsdReq->SdMmcCmdBlk;
|
SetExtCsdReq->Packet.SdMmcCmdBlk = &SetExtCsdReq->SdMmcCmdBlk;
|
||||||
@ -361,7 +361,7 @@ EmmcSetExtCsd (
|
|||||||
if ((Token != NULL) && (Token->Event != NULL)) {
|
if ((Token != NULL) && (Token->Event != NULL)) {
|
||||||
Status = gBS->CreateEvent (
|
Status = gBS->CreateEvent (
|
||||||
EVT_NOTIFY_SIGNAL,
|
EVT_NOTIFY_SIGNAL,
|
||||||
TPL_CALLBACK,
|
TPL_NOTIFY,
|
||||||
AsyncIoCallback,
|
AsyncIoCallback,
|
||||||
SetExtCsdReq,
|
SetExtCsdReq,
|
||||||
&SetExtCsdReq->Event
|
&SetExtCsdReq->Event
|
||||||
@ -382,7 +382,7 @@ Error:
|
|||||||
// The request and event will be freed in asynchronous callback for success case.
|
// The request and event will be freed in asynchronous callback for success case.
|
||||||
//
|
//
|
||||||
if (EFI_ERROR (Status) && (SetExtCsdReq != NULL)) {
|
if (EFI_ERROR (Status) && (SetExtCsdReq != NULL)) {
|
||||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
RemoveEntryList (&SetExtCsdReq->Link);
|
RemoveEntryList (&SetExtCsdReq->Link);
|
||||||
gBS->RestoreTPL (OldTpl);
|
gBS->RestoreTPL (OldTpl);
|
||||||
if (SetExtCsdReq->Event != NULL) {
|
if (SetExtCsdReq->Event != NULL) {
|
||||||
@ -395,7 +395,7 @@ Error:
|
|||||||
// For synchronous operation, free request whatever the execution result is.
|
// For synchronous operation, free request whatever the execution result is.
|
||||||
//
|
//
|
||||||
if (SetExtCsdReq != NULL) {
|
if (SetExtCsdReq != NULL) {
|
||||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
RemoveEntryList (&SetExtCsdReq->Link);
|
RemoveEntryList (&SetExtCsdReq->Link);
|
||||||
gBS->RestoreTPL (OldTpl);
|
gBS->RestoreTPL (OldTpl);
|
||||||
FreePool (SetExtCsdReq);
|
FreePool (SetExtCsdReq);
|
||||||
@ -445,7 +445,7 @@ EmmcSetBlkCount (
|
|||||||
}
|
}
|
||||||
|
|
||||||
SetBlkCntReq->Signature = EMMC_REQUEST_SIGNATURE;
|
SetBlkCntReq->Signature = EMMC_REQUEST_SIGNATURE;
|
||||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
InsertTailList (&Partition->Queue, &SetBlkCntReq->Link);
|
InsertTailList (&Partition->Queue, &SetBlkCntReq->Link);
|
||||||
gBS->RestoreTPL (OldTpl);
|
gBS->RestoreTPL (OldTpl);
|
||||||
SetBlkCntReq->Packet.SdMmcCmdBlk = &SetBlkCntReq->SdMmcCmdBlk;
|
SetBlkCntReq->Packet.SdMmcCmdBlk = &SetBlkCntReq->SdMmcCmdBlk;
|
||||||
@ -463,7 +463,7 @@ EmmcSetBlkCount (
|
|||||||
if ((Token != NULL) && (Token->Event != NULL)) {
|
if ((Token != NULL) && (Token->Event != NULL)) {
|
||||||
Status = gBS->CreateEvent (
|
Status = gBS->CreateEvent (
|
||||||
EVT_NOTIFY_SIGNAL,
|
EVT_NOTIFY_SIGNAL,
|
||||||
TPL_CALLBACK,
|
TPL_NOTIFY,
|
||||||
AsyncIoCallback,
|
AsyncIoCallback,
|
||||||
SetBlkCntReq,
|
SetBlkCntReq,
|
||||||
&SetBlkCntReq->Event
|
&SetBlkCntReq->Event
|
||||||
@ -484,7 +484,7 @@ Error:
|
|||||||
// The request and event will be freed in asynchronous callback for success case.
|
// The request and event will be freed in asynchronous callback for success case.
|
||||||
//
|
//
|
||||||
if (EFI_ERROR (Status) && (SetBlkCntReq != NULL)) {
|
if (EFI_ERROR (Status) && (SetBlkCntReq != NULL)) {
|
||||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
RemoveEntryList (&SetBlkCntReq->Link);
|
RemoveEntryList (&SetBlkCntReq->Link);
|
||||||
gBS->RestoreTPL (OldTpl);
|
gBS->RestoreTPL (OldTpl);
|
||||||
if (SetBlkCntReq->Event != NULL) {
|
if (SetBlkCntReq->Event != NULL) {
|
||||||
@ -497,7 +497,7 @@ Error:
|
|||||||
// For synchronous operation, free request whatever the execution result is.
|
// For synchronous operation, free request whatever the execution result is.
|
||||||
//
|
//
|
||||||
if (SetBlkCntReq != NULL) {
|
if (SetBlkCntReq != NULL) {
|
||||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
RemoveEntryList (&SetBlkCntReq->Link);
|
RemoveEntryList (&SetBlkCntReq->Link);
|
||||||
gBS->RestoreTPL (OldTpl);
|
gBS->RestoreTPL (OldTpl);
|
||||||
FreePool (SetBlkCntReq);
|
FreePool (SetBlkCntReq);
|
||||||
@ -562,7 +562,7 @@ EmmcProtocolInOut (
|
|||||||
}
|
}
|
||||||
|
|
||||||
ProtocolReq->Signature = EMMC_REQUEST_SIGNATURE;
|
ProtocolReq->Signature = EMMC_REQUEST_SIGNATURE;
|
||||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
InsertTailList (&Partition->Queue, &ProtocolReq->Link);
|
InsertTailList (&Partition->Queue, &ProtocolReq->Link);
|
||||||
gBS->RestoreTPL (OldTpl);
|
gBS->RestoreTPL (OldTpl);
|
||||||
ProtocolReq->Packet.SdMmcCmdBlk = &ProtocolReq->SdMmcCmdBlk;
|
ProtocolReq->Packet.SdMmcCmdBlk = &ProtocolReq->SdMmcCmdBlk;
|
||||||
@ -596,7 +596,7 @@ EmmcProtocolInOut (
|
|||||||
if ((Token != NULL) && (Token->Event != NULL)) {
|
if ((Token != NULL) && (Token->Event != NULL)) {
|
||||||
Status = gBS->CreateEvent (
|
Status = gBS->CreateEvent (
|
||||||
EVT_NOTIFY_SIGNAL,
|
EVT_NOTIFY_SIGNAL,
|
||||||
TPL_CALLBACK,
|
TPL_NOTIFY,
|
||||||
AsyncIoCallback,
|
AsyncIoCallback,
|
||||||
ProtocolReq,
|
ProtocolReq,
|
||||||
&ProtocolReq->Event
|
&ProtocolReq->Event
|
||||||
@ -617,7 +617,7 @@ Error:
|
|||||||
// The request and event will be freed in asynchronous callback for success case.
|
// The request and event will be freed in asynchronous callback for success case.
|
||||||
//
|
//
|
||||||
if (EFI_ERROR (Status) && (ProtocolReq != NULL)) {
|
if (EFI_ERROR (Status) && (ProtocolReq != NULL)) {
|
||||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
RemoveEntryList (&ProtocolReq->Link);
|
RemoveEntryList (&ProtocolReq->Link);
|
||||||
gBS->RestoreTPL (OldTpl);
|
gBS->RestoreTPL (OldTpl);
|
||||||
if (ProtocolReq->Event != NULL) {
|
if (ProtocolReq->Event != NULL) {
|
||||||
@ -630,7 +630,7 @@ Error:
|
|||||||
// For synchronous operation, free request whatever the execution result is.
|
// For synchronous operation, free request whatever the execution result is.
|
||||||
//
|
//
|
||||||
if (ProtocolReq != NULL) {
|
if (ProtocolReq != NULL) {
|
||||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
RemoveEntryList (&ProtocolReq->Link);
|
RemoveEntryList (&ProtocolReq->Link);
|
||||||
gBS->RestoreTPL (OldTpl);
|
gBS->RestoreTPL (OldTpl);
|
||||||
FreePool (ProtocolReq);
|
FreePool (ProtocolReq);
|
||||||
@ -688,7 +688,7 @@ EmmcRwMultiBlocks (
|
|||||||
}
|
}
|
||||||
|
|
||||||
RwMultiBlkReq->Signature = EMMC_REQUEST_SIGNATURE;
|
RwMultiBlkReq->Signature = EMMC_REQUEST_SIGNATURE;
|
||||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
InsertTailList (&Partition->Queue, &RwMultiBlkReq->Link);
|
InsertTailList (&Partition->Queue, &RwMultiBlkReq->Link);
|
||||||
gBS->RestoreTPL (OldTpl);
|
gBS->RestoreTPL (OldTpl);
|
||||||
RwMultiBlkReq->Packet.SdMmcCmdBlk = &RwMultiBlkReq->SdMmcCmdBlk;
|
RwMultiBlkReq->Packet.SdMmcCmdBlk = &RwMultiBlkReq->SdMmcCmdBlk;
|
||||||
@ -730,7 +730,7 @@ EmmcRwMultiBlocks (
|
|||||||
if ((Token != NULL) && (Token->Event != NULL)) {
|
if ((Token != NULL) && (Token->Event != NULL)) {
|
||||||
Status = gBS->CreateEvent (
|
Status = gBS->CreateEvent (
|
||||||
EVT_NOTIFY_SIGNAL,
|
EVT_NOTIFY_SIGNAL,
|
||||||
TPL_CALLBACK,
|
TPL_NOTIFY,
|
||||||
AsyncIoCallback,
|
AsyncIoCallback,
|
||||||
RwMultiBlkReq,
|
RwMultiBlkReq,
|
||||||
&RwMultiBlkReq->Event
|
&RwMultiBlkReq->Event
|
||||||
@ -751,7 +751,7 @@ Error:
|
|||||||
// The request and event will be freed in asynchronous callback for success case.
|
// The request and event will be freed in asynchronous callback for success case.
|
||||||
//
|
//
|
||||||
if (EFI_ERROR (Status) && (RwMultiBlkReq != NULL)) {
|
if (EFI_ERROR (Status) && (RwMultiBlkReq != NULL)) {
|
||||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
RemoveEntryList (&RwMultiBlkReq->Link);
|
RemoveEntryList (&RwMultiBlkReq->Link);
|
||||||
gBS->RestoreTPL (OldTpl);
|
gBS->RestoreTPL (OldTpl);
|
||||||
if (RwMultiBlkReq->Event != NULL) {
|
if (RwMultiBlkReq->Event != NULL) {
|
||||||
@ -764,7 +764,7 @@ Error:
|
|||||||
// For synchronous operation, free request whatever the execution result is.
|
// For synchronous operation, free request whatever the execution result is.
|
||||||
//
|
//
|
||||||
if (RwMultiBlkReq != NULL) {
|
if (RwMultiBlkReq != NULL) {
|
||||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
RemoveEntryList (&RwMultiBlkReq->Link);
|
RemoveEntryList (&RwMultiBlkReq->Link);
|
||||||
gBS->RestoreTPL (OldTpl);
|
gBS->RestoreTPL (OldTpl);
|
||||||
FreePool (RwMultiBlkReq);
|
FreePool (RwMultiBlkReq);
|
||||||
@ -901,7 +901,7 @@ EmmcReadWrite (
|
|||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return 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;
|
Lba += BlockNum;
|
||||||
Buffer = (UINT8*)Buffer + BufferSize;
|
Buffer = (UINT8*)Buffer + BufferSize;
|
||||||
@ -1069,7 +1069,7 @@ EmmcResetEx (
|
|||||||
|
|
||||||
Partition = EMMC_PARTITION_DATA_FROM_BLKIO2 (This);
|
Partition = EMMC_PARTITION_DATA_FROM_BLKIO2 (This);
|
||||||
|
|
||||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
for (Link = GetFirstNode (&Partition->Queue);
|
for (Link = GetFirstNode (&Partition->Queue);
|
||||||
!IsNull (&Partition->Queue, Link);
|
!IsNull (&Partition->Queue, Link);
|
||||||
Link = NextLink) {
|
Link = NextLink) {
|
||||||
@ -1629,7 +1629,7 @@ EmmcEraseBlockStart (
|
|||||||
}
|
}
|
||||||
|
|
||||||
EraseBlockStart->Signature = EMMC_REQUEST_SIGNATURE;
|
EraseBlockStart->Signature = EMMC_REQUEST_SIGNATURE;
|
||||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
InsertTailList (&Partition->Queue, &EraseBlockStart->Link);
|
InsertTailList (&Partition->Queue, &EraseBlockStart->Link);
|
||||||
gBS->RestoreTPL (OldTpl);
|
gBS->RestoreTPL (OldTpl);
|
||||||
EraseBlockStart->Packet.SdMmcCmdBlk = &EraseBlockStart->SdMmcCmdBlk;
|
EraseBlockStart->Packet.SdMmcCmdBlk = &EraseBlockStart->SdMmcCmdBlk;
|
||||||
@ -1652,7 +1652,7 @@ EmmcEraseBlockStart (
|
|||||||
if ((Token != NULL) && (Token->Event != NULL)) {
|
if ((Token != NULL) && (Token->Event != NULL)) {
|
||||||
Status = gBS->CreateEvent (
|
Status = gBS->CreateEvent (
|
||||||
EVT_NOTIFY_SIGNAL,
|
EVT_NOTIFY_SIGNAL,
|
||||||
TPL_CALLBACK,
|
TPL_NOTIFY,
|
||||||
AsyncIoCallback,
|
AsyncIoCallback,
|
||||||
EraseBlockStart,
|
EraseBlockStart,
|
||||||
&EraseBlockStart->Event
|
&EraseBlockStart->Event
|
||||||
@ -1673,7 +1673,9 @@ Error:
|
|||||||
// The request and event will be freed in asynchronous callback for success case.
|
// The request and event will be freed in asynchronous callback for success case.
|
||||||
//
|
//
|
||||||
if (EFI_ERROR (Status) && (EraseBlockStart != NULL)) {
|
if (EFI_ERROR (Status) && (EraseBlockStart != NULL)) {
|
||||||
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
RemoveEntryList (&EraseBlockStart->Link);
|
RemoveEntryList (&EraseBlockStart->Link);
|
||||||
|
gBS->RestoreTPL (OldTpl);
|
||||||
if (EraseBlockStart->Event != NULL) {
|
if (EraseBlockStart->Event != NULL) {
|
||||||
gBS->CloseEvent (EraseBlockStart->Event);
|
gBS->CloseEvent (EraseBlockStart->Event);
|
||||||
}
|
}
|
||||||
@ -1684,7 +1686,9 @@ Error:
|
|||||||
// For synchronous operation, free request whatever the execution result is.
|
// For synchronous operation, free request whatever the execution result is.
|
||||||
//
|
//
|
||||||
if (EraseBlockStart != NULL) {
|
if (EraseBlockStart != NULL) {
|
||||||
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
RemoveEntryList (&EraseBlockStart->Link);
|
RemoveEntryList (&EraseBlockStart->Link);
|
||||||
|
gBS->RestoreTPL (OldTpl);
|
||||||
FreePool (EraseBlockStart);
|
FreePool (EraseBlockStart);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1732,7 +1736,7 @@ EmmcEraseBlockEnd (
|
|||||||
}
|
}
|
||||||
|
|
||||||
EraseBlockEnd->Signature = EMMC_REQUEST_SIGNATURE;
|
EraseBlockEnd->Signature = EMMC_REQUEST_SIGNATURE;
|
||||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
InsertTailList (&Partition->Queue, &EraseBlockEnd->Link);
|
InsertTailList (&Partition->Queue, &EraseBlockEnd->Link);
|
||||||
gBS->RestoreTPL (OldTpl);
|
gBS->RestoreTPL (OldTpl);
|
||||||
EraseBlockEnd->Packet.SdMmcCmdBlk = &EraseBlockEnd->SdMmcCmdBlk;
|
EraseBlockEnd->Packet.SdMmcCmdBlk = &EraseBlockEnd->SdMmcCmdBlk;
|
||||||
@ -1755,7 +1759,7 @@ EmmcEraseBlockEnd (
|
|||||||
if ((Token != NULL) && (Token->Event != NULL)) {
|
if ((Token != NULL) && (Token->Event != NULL)) {
|
||||||
Status = gBS->CreateEvent (
|
Status = gBS->CreateEvent (
|
||||||
EVT_NOTIFY_SIGNAL,
|
EVT_NOTIFY_SIGNAL,
|
||||||
TPL_CALLBACK,
|
TPL_NOTIFY,
|
||||||
AsyncIoCallback,
|
AsyncIoCallback,
|
||||||
EraseBlockEnd,
|
EraseBlockEnd,
|
||||||
&EraseBlockEnd->Event
|
&EraseBlockEnd->Event
|
||||||
@ -1776,7 +1780,9 @@ Error:
|
|||||||
// The request and event will be freed in asynchronous callback for success case.
|
// The request and event will be freed in asynchronous callback for success case.
|
||||||
//
|
//
|
||||||
if (EFI_ERROR (Status) && (EraseBlockEnd != NULL)) {
|
if (EFI_ERROR (Status) && (EraseBlockEnd != NULL)) {
|
||||||
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
RemoveEntryList (&EraseBlockEnd->Link);
|
RemoveEntryList (&EraseBlockEnd->Link);
|
||||||
|
gBS->RestoreTPL (OldTpl);
|
||||||
if (EraseBlockEnd->Event != NULL) {
|
if (EraseBlockEnd->Event != NULL) {
|
||||||
gBS->CloseEvent (EraseBlockEnd->Event);
|
gBS->CloseEvent (EraseBlockEnd->Event);
|
||||||
}
|
}
|
||||||
@ -1787,7 +1793,9 @@ Error:
|
|||||||
// For synchronous operation, free request whatever the execution result is.
|
// For synchronous operation, free request whatever the execution result is.
|
||||||
//
|
//
|
||||||
if (EraseBlockEnd != NULL) {
|
if (EraseBlockEnd != NULL) {
|
||||||
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
RemoveEntryList (&EraseBlockEnd->Link);
|
RemoveEntryList (&EraseBlockEnd->Link);
|
||||||
|
gBS->RestoreTPL (OldTpl);
|
||||||
FreePool (EraseBlockEnd);
|
FreePool (EraseBlockEnd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1833,7 +1841,7 @@ EmmcEraseBlock (
|
|||||||
}
|
}
|
||||||
|
|
||||||
EraseBlock->Signature = EMMC_REQUEST_SIGNATURE;
|
EraseBlock->Signature = EMMC_REQUEST_SIGNATURE;
|
||||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
InsertTailList (&Partition->Queue, &EraseBlock->Link);
|
InsertTailList (&Partition->Queue, &EraseBlock->Link);
|
||||||
gBS->RestoreTPL (OldTpl);
|
gBS->RestoreTPL (OldTpl);
|
||||||
EraseBlock->Packet.SdMmcCmdBlk = &EraseBlock->SdMmcCmdBlk;
|
EraseBlock->Packet.SdMmcCmdBlk = &EraseBlock->SdMmcCmdBlk;
|
||||||
@ -1850,7 +1858,7 @@ EmmcEraseBlock (
|
|||||||
if ((Token != NULL) && (Token->Event != NULL)) {
|
if ((Token != NULL) && (Token->Event != NULL)) {
|
||||||
Status = gBS->CreateEvent (
|
Status = gBS->CreateEvent (
|
||||||
EVT_NOTIFY_SIGNAL,
|
EVT_NOTIFY_SIGNAL,
|
||||||
TPL_CALLBACK,
|
TPL_NOTIFY,
|
||||||
AsyncIoCallback,
|
AsyncIoCallback,
|
||||||
EraseBlock,
|
EraseBlock,
|
||||||
&EraseBlock->Event
|
&EraseBlock->Event
|
||||||
@ -1871,7 +1879,9 @@ Error:
|
|||||||
// The request and event will be freed in asynchronous callback for success case.
|
// The request and event will be freed in asynchronous callback for success case.
|
||||||
//
|
//
|
||||||
if (EFI_ERROR (Status) && (EraseBlock != NULL)) {
|
if (EFI_ERROR (Status) && (EraseBlock != NULL)) {
|
||||||
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
RemoveEntryList (&EraseBlock->Link);
|
RemoveEntryList (&EraseBlock->Link);
|
||||||
|
gBS->RestoreTPL (OldTpl);
|
||||||
if (EraseBlock->Event != NULL) {
|
if (EraseBlock->Event != NULL) {
|
||||||
gBS->CloseEvent (EraseBlock->Event);
|
gBS->CloseEvent (EraseBlock->Event);
|
||||||
}
|
}
|
||||||
@ -1882,7 +1892,9 @@ Error:
|
|||||||
// For synchronous operation, free request whatever the execution result is.
|
// For synchronous operation, free request whatever the execution result is.
|
||||||
//
|
//
|
||||||
if (EraseBlock != NULL) {
|
if (EraseBlock != NULL) {
|
||||||
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
RemoveEntryList (&EraseBlock->Link);
|
RemoveEntryList (&EraseBlock->Link);
|
||||||
|
gBS->RestoreTPL (OldTpl);
|
||||||
FreePool (EraseBlock);
|
FreePool (EraseBlock);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -340,7 +340,7 @@ SdRwSingleBlock (
|
|||||||
}
|
}
|
||||||
|
|
||||||
RwSingleBlkReq->Signature = SD_REQUEST_SIGNATURE;
|
RwSingleBlkReq->Signature = SD_REQUEST_SIGNATURE;
|
||||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
InsertTailList (&Device->Queue, &RwSingleBlkReq->Link);
|
InsertTailList (&Device->Queue, &RwSingleBlkReq->Link);
|
||||||
gBS->RestoreTPL (OldTpl);
|
gBS->RestoreTPL (OldTpl);
|
||||||
RwSingleBlkReq->Packet.SdMmcCmdBlk = &RwSingleBlkReq->SdMmcCmdBlk;
|
RwSingleBlkReq->Packet.SdMmcCmdBlk = &RwSingleBlkReq->SdMmcCmdBlk;
|
||||||
@ -382,7 +382,7 @@ SdRwSingleBlock (
|
|||||||
if ((Token != NULL) && (Token->Event != NULL)) {
|
if ((Token != NULL) && (Token->Event != NULL)) {
|
||||||
Status = gBS->CreateEvent (
|
Status = gBS->CreateEvent (
|
||||||
EVT_NOTIFY_SIGNAL,
|
EVT_NOTIFY_SIGNAL,
|
||||||
TPL_CALLBACK,
|
TPL_NOTIFY,
|
||||||
AsyncIoCallback,
|
AsyncIoCallback,
|
||||||
RwSingleBlkReq,
|
RwSingleBlkReq,
|
||||||
&RwSingleBlkReq->Event
|
&RwSingleBlkReq->Event
|
||||||
@ -403,7 +403,9 @@ Error:
|
|||||||
// The request and event will be freed in asynchronous callback for success case.
|
// The request and event will be freed in asynchronous callback for success case.
|
||||||
//
|
//
|
||||||
if (EFI_ERROR (Status) && (RwSingleBlkReq != NULL)) {
|
if (EFI_ERROR (Status) && (RwSingleBlkReq != NULL)) {
|
||||||
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
RemoveEntryList (&RwSingleBlkReq->Link);
|
RemoveEntryList (&RwSingleBlkReq->Link);
|
||||||
|
gBS->RestoreTPL (OldTpl);
|
||||||
if (RwSingleBlkReq->Event != NULL) {
|
if (RwSingleBlkReq->Event != NULL) {
|
||||||
gBS->CloseEvent (RwSingleBlkReq->Event);
|
gBS->CloseEvent (RwSingleBlkReq->Event);
|
||||||
}
|
}
|
||||||
@ -414,7 +416,9 @@ Error:
|
|||||||
// For synchronous operation, free request whatever the execution result is.
|
// For synchronous operation, free request whatever the execution result is.
|
||||||
//
|
//
|
||||||
if (RwSingleBlkReq != NULL) {
|
if (RwSingleBlkReq != NULL) {
|
||||||
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
RemoveEntryList (&RwSingleBlkReq->Link);
|
RemoveEntryList (&RwSingleBlkReq->Link);
|
||||||
|
gBS->RestoreTPL (OldTpl);
|
||||||
FreePool (RwSingleBlkReq);
|
FreePool (RwSingleBlkReq);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -468,7 +472,7 @@ SdRwMultiBlocks (
|
|||||||
}
|
}
|
||||||
|
|
||||||
RwMultiBlkReq->Signature = SD_REQUEST_SIGNATURE;
|
RwMultiBlkReq->Signature = SD_REQUEST_SIGNATURE;
|
||||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
InsertTailList (&Device->Queue, &RwMultiBlkReq->Link);
|
InsertTailList (&Device->Queue, &RwMultiBlkReq->Link);
|
||||||
gBS->RestoreTPL (OldTpl);
|
gBS->RestoreTPL (OldTpl);
|
||||||
RwMultiBlkReq->Packet.SdMmcCmdBlk = &RwMultiBlkReq->SdMmcCmdBlk;
|
RwMultiBlkReq->Packet.SdMmcCmdBlk = &RwMultiBlkReq->SdMmcCmdBlk;
|
||||||
@ -510,7 +514,7 @@ SdRwMultiBlocks (
|
|||||||
if ((Token != NULL) && (Token->Event != NULL)) {
|
if ((Token != NULL) && (Token->Event != NULL)) {
|
||||||
Status = gBS->CreateEvent (
|
Status = gBS->CreateEvent (
|
||||||
EVT_NOTIFY_SIGNAL,
|
EVT_NOTIFY_SIGNAL,
|
||||||
TPL_CALLBACK,
|
TPL_NOTIFY,
|
||||||
AsyncIoCallback,
|
AsyncIoCallback,
|
||||||
RwMultiBlkReq,
|
RwMultiBlkReq,
|
||||||
&RwMultiBlkReq->Event
|
&RwMultiBlkReq->Event
|
||||||
@ -531,7 +535,9 @@ Error:
|
|||||||
// The request and event will be freed in asynchronous callback for success case.
|
// The request and event will be freed in asynchronous callback for success case.
|
||||||
//
|
//
|
||||||
if (EFI_ERROR (Status) && (RwMultiBlkReq != NULL)) {
|
if (EFI_ERROR (Status) && (RwMultiBlkReq != NULL)) {
|
||||||
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
RemoveEntryList (&RwMultiBlkReq->Link);
|
RemoveEntryList (&RwMultiBlkReq->Link);
|
||||||
|
gBS->RestoreTPL (OldTpl);
|
||||||
if (RwMultiBlkReq->Event != NULL) {
|
if (RwMultiBlkReq->Event != NULL) {
|
||||||
gBS->CloseEvent (RwMultiBlkReq->Event);
|
gBS->CloseEvent (RwMultiBlkReq->Event);
|
||||||
}
|
}
|
||||||
@ -542,7 +548,9 @@ Error:
|
|||||||
// For synchronous operation, free request whatever the execution result is.
|
// For synchronous operation, free request whatever the execution result is.
|
||||||
//
|
//
|
||||||
if (RwMultiBlkReq != NULL) {
|
if (RwMultiBlkReq != NULL) {
|
||||||
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
RemoveEntryList (&RwMultiBlkReq->Link);
|
RemoveEntryList (&RwMultiBlkReq->Link);
|
||||||
|
gBS->RestoreTPL (OldTpl);
|
||||||
FreePool (RwMultiBlkReq);
|
FreePool (RwMultiBlkReq);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -830,7 +838,7 @@ SdResetEx (
|
|||||||
|
|
||||||
Device = SD_DEVICE_DATA_FROM_BLKIO2 (This);
|
Device = SD_DEVICE_DATA_FROM_BLKIO2 (This);
|
||||||
|
|
||||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
for (Link = GetFirstNode (&Device->Queue);
|
for (Link = GetFirstNode (&Device->Queue);
|
||||||
!IsNull (&Device->Queue, Link);
|
!IsNull (&Device->Queue, Link);
|
||||||
Link = NextLink) {
|
Link = NextLink) {
|
||||||
@ -1007,7 +1015,7 @@ SdEraseBlockStart (
|
|||||||
}
|
}
|
||||||
|
|
||||||
EraseBlockStart->Signature = SD_REQUEST_SIGNATURE;
|
EraseBlockStart->Signature = SD_REQUEST_SIGNATURE;
|
||||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
InsertTailList (&Device->Queue, &EraseBlockStart->Link);
|
InsertTailList (&Device->Queue, &EraseBlockStart->Link);
|
||||||
gBS->RestoreTPL (OldTpl);
|
gBS->RestoreTPL (OldTpl);
|
||||||
EraseBlockStart->Packet.SdMmcCmdBlk = &EraseBlockStart->SdMmcCmdBlk;
|
EraseBlockStart->Packet.SdMmcCmdBlk = &EraseBlockStart->SdMmcCmdBlk;
|
||||||
@ -1030,7 +1038,7 @@ SdEraseBlockStart (
|
|||||||
if ((Token != NULL) && (Token->Event != NULL)) {
|
if ((Token != NULL) && (Token->Event != NULL)) {
|
||||||
Status = gBS->CreateEvent (
|
Status = gBS->CreateEvent (
|
||||||
EVT_NOTIFY_SIGNAL,
|
EVT_NOTIFY_SIGNAL,
|
||||||
TPL_CALLBACK,
|
TPL_NOTIFY,
|
||||||
AsyncIoCallback,
|
AsyncIoCallback,
|
||||||
EraseBlockStart,
|
EraseBlockStart,
|
||||||
&EraseBlockStart->Event
|
&EraseBlockStart->Event
|
||||||
@ -1051,7 +1059,9 @@ Error:
|
|||||||
// The request and event will be freed in asynchronous callback for success case.
|
// The request and event will be freed in asynchronous callback for success case.
|
||||||
//
|
//
|
||||||
if (EFI_ERROR (Status) && (EraseBlockStart != NULL)) {
|
if (EFI_ERROR (Status) && (EraseBlockStart != NULL)) {
|
||||||
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
RemoveEntryList (&EraseBlockStart->Link);
|
RemoveEntryList (&EraseBlockStart->Link);
|
||||||
|
gBS->RestoreTPL (OldTpl);
|
||||||
if (EraseBlockStart->Event != NULL) {
|
if (EraseBlockStart->Event != NULL) {
|
||||||
gBS->CloseEvent (EraseBlockStart->Event);
|
gBS->CloseEvent (EraseBlockStart->Event);
|
||||||
}
|
}
|
||||||
@ -1062,7 +1072,9 @@ Error:
|
|||||||
// For synchronous operation, free request whatever the execution result is.
|
// For synchronous operation, free request whatever the execution result is.
|
||||||
//
|
//
|
||||||
if (EraseBlockStart != NULL) {
|
if (EraseBlockStart != NULL) {
|
||||||
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
RemoveEntryList (&EraseBlockStart->Link);
|
RemoveEntryList (&EraseBlockStart->Link);
|
||||||
|
gBS->RestoreTPL (OldTpl);
|
||||||
FreePool (EraseBlockStart);
|
FreePool (EraseBlockStart);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1107,7 +1119,7 @@ SdEraseBlockEnd (
|
|||||||
}
|
}
|
||||||
|
|
||||||
EraseBlockEnd->Signature = SD_REQUEST_SIGNATURE;
|
EraseBlockEnd->Signature = SD_REQUEST_SIGNATURE;
|
||||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
InsertTailList (&Device->Queue, &EraseBlockEnd->Link);
|
InsertTailList (&Device->Queue, &EraseBlockEnd->Link);
|
||||||
gBS->RestoreTPL (OldTpl);
|
gBS->RestoreTPL (OldTpl);
|
||||||
EraseBlockEnd->Packet.SdMmcCmdBlk = &EraseBlockEnd->SdMmcCmdBlk;
|
EraseBlockEnd->Packet.SdMmcCmdBlk = &EraseBlockEnd->SdMmcCmdBlk;
|
||||||
@ -1130,7 +1142,7 @@ SdEraseBlockEnd (
|
|||||||
if ((Token != NULL) && (Token->Event != NULL)) {
|
if ((Token != NULL) && (Token->Event != NULL)) {
|
||||||
Status = gBS->CreateEvent (
|
Status = gBS->CreateEvent (
|
||||||
EVT_NOTIFY_SIGNAL,
|
EVT_NOTIFY_SIGNAL,
|
||||||
TPL_CALLBACK,
|
TPL_NOTIFY,
|
||||||
AsyncIoCallback,
|
AsyncIoCallback,
|
||||||
EraseBlockEnd,
|
EraseBlockEnd,
|
||||||
&EraseBlockEnd->Event
|
&EraseBlockEnd->Event
|
||||||
@ -1151,7 +1163,9 @@ Error:
|
|||||||
// The request and event will be freed in asynchronous callback for success case.
|
// The request and event will be freed in asynchronous callback for success case.
|
||||||
//
|
//
|
||||||
if (EFI_ERROR (Status) && (EraseBlockEnd != NULL)) {
|
if (EFI_ERROR (Status) && (EraseBlockEnd != NULL)) {
|
||||||
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
RemoveEntryList (&EraseBlockEnd->Link);
|
RemoveEntryList (&EraseBlockEnd->Link);
|
||||||
|
gBS->RestoreTPL (OldTpl);
|
||||||
if (EraseBlockEnd->Event != NULL) {
|
if (EraseBlockEnd->Event != NULL) {
|
||||||
gBS->CloseEvent (EraseBlockEnd->Event);
|
gBS->CloseEvent (EraseBlockEnd->Event);
|
||||||
}
|
}
|
||||||
@ -1162,7 +1176,9 @@ Error:
|
|||||||
// For synchronous operation, free request whatever the execution result is.
|
// For synchronous operation, free request whatever the execution result is.
|
||||||
//
|
//
|
||||||
if (EraseBlockEnd != NULL) {
|
if (EraseBlockEnd != NULL) {
|
||||||
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
RemoveEntryList (&EraseBlockEnd->Link);
|
RemoveEntryList (&EraseBlockEnd->Link);
|
||||||
|
gBS->RestoreTPL (OldTpl);
|
||||||
FreePool (EraseBlockEnd);
|
FreePool (EraseBlockEnd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1205,7 +1221,7 @@ SdEraseBlock (
|
|||||||
}
|
}
|
||||||
|
|
||||||
EraseBlock->Signature = SD_REQUEST_SIGNATURE;
|
EraseBlock->Signature = SD_REQUEST_SIGNATURE;
|
||||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
InsertTailList (&Device->Queue, &EraseBlock->Link);
|
InsertTailList (&Device->Queue, &EraseBlock->Link);
|
||||||
gBS->RestoreTPL (OldTpl);
|
gBS->RestoreTPL (OldTpl);
|
||||||
EraseBlock->Packet.SdMmcCmdBlk = &EraseBlock->SdMmcCmdBlk;
|
EraseBlock->Packet.SdMmcCmdBlk = &EraseBlock->SdMmcCmdBlk;
|
||||||
@ -1222,7 +1238,7 @@ SdEraseBlock (
|
|||||||
if ((Token != NULL) && (Token->Event != NULL)) {
|
if ((Token != NULL) && (Token->Event != NULL)) {
|
||||||
Status = gBS->CreateEvent (
|
Status = gBS->CreateEvent (
|
||||||
EVT_NOTIFY_SIGNAL,
|
EVT_NOTIFY_SIGNAL,
|
||||||
TPL_CALLBACK,
|
TPL_NOTIFY,
|
||||||
AsyncIoCallback,
|
AsyncIoCallback,
|
||||||
EraseBlock,
|
EraseBlock,
|
||||||
&EraseBlock->Event
|
&EraseBlock->Event
|
||||||
@ -1243,7 +1259,9 @@ Error:
|
|||||||
// The request and event will be freed in asynchronous callback for success case.
|
// The request and event will be freed in asynchronous callback for success case.
|
||||||
//
|
//
|
||||||
if (EFI_ERROR (Status) && (EraseBlock != NULL)) {
|
if (EFI_ERROR (Status) && (EraseBlock != NULL)) {
|
||||||
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
RemoveEntryList (&EraseBlock->Link);
|
RemoveEntryList (&EraseBlock->Link);
|
||||||
|
gBS->RestoreTPL (OldTpl);
|
||||||
if (EraseBlock->Event != NULL) {
|
if (EraseBlock->Event != NULL) {
|
||||||
gBS->CloseEvent (EraseBlock->Event);
|
gBS->CloseEvent (EraseBlock->Event);
|
||||||
}
|
}
|
||||||
@ -1254,7 +1272,9 @@ Error:
|
|||||||
// For synchronous operation, free request whatever the execution result is.
|
// For synchronous operation, free request whatever the execution result is.
|
||||||
//
|
//
|
||||||
if (EraseBlock != NULL) {
|
if (EraseBlock != NULL) {
|
||||||
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
RemoveEntryList (&EraseBlock->Link);
|
RemoveEntryList (&EraseBlock->Link);
|
||||||
|
gBS->RestoreTPL (OldTpl);
|
||||||
FreePool (EraseBlock);
|
FreePool (EraseBlock);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -800,7 +800,7 @@ SdDxeDriverBindingStop (
|
|||||||
//
|
//
|
||||||
// Free all on-going async tasks.
|
// Free all on-going async tasks.
|
||||||
//
|
//
|
||||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||||
for (Link = GetFirstNode (&Device->Queue);
|
for (Link = GetFirstNode (&Device->Queue);
|
||||||
!IsNull (&Device->Queue, Link);
|
!IsNull (&Device->Queue, Link);
|
||||||
Link = NextLink) {
|
Link = NextLink) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user