]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Bus/Sd/SdDxe/SdBlockIo.c
MdeModulePkg/SdMmc: update TPL to notify to fix UEFI SCT hang
[mirror_edk2.git] / MdeModulePkg / Bus / Sd / SdDxe / SdBlockIo.c
index d8b9459c63c343bc02492146333948d1129b985c..516c3e7042887b48e09ac437d1fa221f9e0f246c 100644 (file)
@@ -340,7 +340,7 @@ SdRwSingleBlock (
   }\r
 \r
   RwSingleBlkReq->Signature = SD_REQUEST_SIGNATURE;\r
-  OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
+  OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
   InsertTailList (&Device->Queue, &RwSingleBlkReq->Link);\r
   gBS->RestoreTPL (OldTpl);\r
   RwSingleBlkReq->Packet.SdMmcCmdBlk    = &RwSingleBlkReq->SdMmcCmdBlk;\r
@@ -382,7 +382,7 @@ SdRwSingleBlock (
   if ((Token != NULL) && (Token->Event != NULL)) {\r
     Status = gBS->CreateEvent (\r
                     EVT_NOTIFY_SIGNAL,\r
-                    TPL_CALLBACK,\r
+                    TPL_NOTIFY,\r
                     AsyncIoCallback,\r
                     RwSingleBlkReq,\r
                     &RwSingleBlkReq->Event\r
@@ -403,7 +403,9 @@ Error:
     // The request and event will be freed in asynchronous callback for success case.\r
     //\r
     if (EFI_ERROR (Status) && (RwSingleBlkReq != NULL)) {\r
+      OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
       RemoveEntryList (&RwSingleBlkReq->Link);\r
+      gBS->RestoreTPL (OldTpl);\r
       if (RwSingleBlkReq->Event != NULL) {\r
         gBS->CloseEvent (RwSingleBlkReq->Event);\r
       }\r
@@ -414,7 +416,9 @@ Error:
     // For synchronous operation, free request whatever the execution result is.\r
     //\r
     if (RwSingleBlkReq != NULL) {\r
+      OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
       RemoveEntryList (&RwSingleBlkReq->Link);\r
+      gBS->RestoreTPL (OldTpl);\r
       FreePool (RwSingleBlkReq);\r
     }\r
   }\r
@@ -468,7 +472,7 @@ SdRwMultiBlocks (
   }\r
 \r
   RwMultiBlkReq->Signature = SD_REQUEST_SIGNATURE;\r
-  OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
+  OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
   InsertTailList (&Device->Queue, &RwMultiBlkReq->Link);\r
   gBS->RestoreTPL (OldTpl);\r
   RwMultiBlkReq->Packet.SdMmcCmdBlk    = &RwMultiBlkReq->SdMmcCmdBlk;\r
@@ -510,7 +514,7 @@ SdRwMultiBlocks (
   if ((Token != NULL) && (Token->Event != NULL)) {\r
     Status = gBS->CreateEvent (\r
                     EVT_NOTIFY_SIGNAL,\r
-                    TPL_CALLBACK,\r
+                    TPL_NOTIFY,\r
                     AsyncIoCallback,\r
                     RwMultiBlkReq,\r
                     &RwMultiBlkReq->Event\r
@@ -531,7 +535,9 @@ Error:
     // The request and event will be freed in asynchronous callback for success case.\r
     //\r
     if (EFI_ERROR (Status) && (RwMultiBlkReq != NULL)) {\r
+      OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
       RemoveEntryList (&RwMultiBlkReq->Link);\r
+      gBS->RestoreTPL (OldTpl);\r
       if (RwMultiBlkReq->Event != NULL) {\r
         gBS->CloseEvent (RwMultiBlkReq->Event);\r
       }\r
@@ -542,7 +548,9 @@ Error:
     // For synchronous operation, free request whatever the execution result is.\r
     //\r
     if (RwMultiBlkReq != NULL) {\r
+      OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
       RemoveEntryList (&RwMultiBlkReq->Link);\r
+      gBS->RestoreTPL (OldTpl);\r
       FreePool (RwMultiBlkReq);\r
     }\r
   }\r
@@ -830,7 +838,7 @@ SdResetEx (
 \r
   Device = SD_DEVICE_DATA_FROM_BLKIO2 (This);\r
 \r
-  OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
+  OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
   for (Link = GetFirstNode (&Device->Queue);\r
        !IsNull (&Device->Queue, Link);\r
        Link = NextLink) {\r
@@ -1007,7 +1015,7 @@ SdEraseBlockStart (
   }\r
 \r
   EraseBlockStart->Signature = SD_REQUEST_SIGNATURE;\r
-  OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
+  OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
   InsertTailList (&Device->Queue, &EraseBlockStart->Link);\r
   gBS->RestoreTPL (OldTpl);\r
   EraseBlockStart->Packet.SdMmcCmdBlk    = &EraseBlockStart->SdMmcCmdBlk;\r
@@ -1030,7 +1038,7 @@ SdEraseBlockStart (
   if ((Token != NULL) && (Token->Event != NULL)) {\r
     Status = gBS->CreateEvent (\r
                     EVT_NOTIFY_SIGNAL,\r
-                    TPL_CALLBACK,\r
+                    TPL_NOTIFY,\r
                     AsyncIoCallback,\r
                     EraseBlockStart,\r
                     &EraseBlockStart->Event\r
@@ -1051,7 +1059,9 @@ Error:
     // The request and event will be freed in asynchronous callback for success case.\r
     //\r
     if (EFI_ERROR (Status) && (EraseBlockStart != NULL)) {\r
+      OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
       RemoveEntryList (&EraseBlockStart->Link);\r
+      gBS->RestoreTPL (OldTpl);\r
       if (EraseBlockStart->Event != NULL) {\r
         gBS->CloseEvent (EraseBlockStart->Event);\r
       }\r
@@ -1062,7 +1072,9 @@ Error:
     // For synchronous operation, free request whatever the execution result is.\r
     //\r
     if (EraseBlockStart != NULL) {\r
+      OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
       RemoveEntryList (&EraseBlockStart->Link);\r
+      gBS->RestoreTPL (OldTpl);\r
       FreePool (EraseBlockStart);\r
     }\r
   }\r
@@ -1107,7 +1119,7 @@ SdEraseBlockEnd (
   }\r
 \r
   EraseBlockEnd->Signature = SD_REQUEST_SIGNATURE;\r
-  OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
+  OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
   InsertTailList (&Device->Queue, &EraseBlockEnd->Link);\r
   gBS->RestoreTPL (OldTpl);\r
   EraseBlockEnd->Packet.SdMmcCmdBlk    = &EraseBlockEnd->SdMmcCmdBlk;\r
@@ -1130,7 +1142,7 @@ SdEraseBlockEnd (
   if ((Token != NULL) && (Token->Event != NULL)) {\r
     Status = gBS->CreateEvent (\r
                     EVT_NOTIFY_SIGNAL,\r
-                    TPL_CALLBACK,\r
+                    TPL_NOTIFY,\r
                     AsyncIoCallback,\r
                     EraseBlockEnd,\r
                     &EraseBlockEnd->Event\r
@@ -1151,7 +1163,9 @@ Error:
     // The request and event will be freed in asynchronous callback for success case.\r
     //\r
     if (EFI_ERROR (Status) && (EraseBlockEnd != NULL)) {\r
+      OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
       RemoveEntryList (&EraseBlockEnd->Link);\r
+      gBS->RestoreTPL (OldTpl);\r
       if (EraseBlockEnd->Event != NULL) {\r
         gBS->CloseEvent (EraseBlockEnd->Event);\r
       }\r
@@ -1162,7 +1176,9 @@ Error:
     // For synchronous operation, free request whatever the execution result is.\r
     //\r
     if (EraseBlockEnd != NULL) {\r
+      OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
       RemoveEntryList (&EraseBlockEnd->Link);\r
+      gBS->RestoreTPL (OldTpl);\r
       FreePool (EraseBlockEnd);\r
     }\r
   }\r
@@ -1205,7 +1221,7 @@ SdEraseBlock (
   }\r
 \r
   EraseBlock->Signature = SD_REQUEST_SIGNATURE;\r
-  OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
+  OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
   InsertTailList (&Device->Queue, &EraseBlock->Link);\r
   gBS->RestoreTPL (OldTpl);\r
   EraseBlock->Packet.SdMmcCmdBlk    = &EraseBlock->SdMmcCmdBlk;\r
@@ -1222,7 +1238,7 @@ SdEraseBlock (
   if ((Token != NULL) && (Token->Event != NULL)) {\r
     Status = gBS->CreateEvent (\r
                     EVT_NOTIFY_SIGNAL,\r
-                    TPL_CALLBACK,\r
+                    TPL_NOTIFY,\r
                     AsyncIoCallback,\r
                     EraseBlock,\r
                     &EraseBlock->Event\r
@@ -1243,7 +1259,9 @@ Error:
     // The request and event will be freed in asynchronous callback for success case.\r
     //\r
     if (EFI_ERROR (Status) && (EraseBlock != NULL)) {\r
+      OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
       RemoveEntryList (&EraseBlock->Link);\r
+      gBS->RestoreTPL (OldTpl);\r
       if (EraseBlock->Event != NULL) {\r
         gBS->CloseEvent (EraseBlock->Event);\r
       }\r
@@ -1254,7 +1272,9 @@ Error:
     // For synchronous operation, free request whatever the execution result is.\r
     //\r
     if (EraseBlock != NULL) {\r
+      OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
       RemoveEntryList (&EraseBlock->Link);\r
+      gBS->RestoreTPL (OldTpl);\r
       FreePool (EraseBlock);\r
     }\r
   }\r