Add a lock to protect the critical region in Service APIs for gEfiBlockIoProtocolGuid...
[mirror_edk2.git] / EdkModulePkg / Bus / Pci / IdeBus / Dxe / idebus.c
index 42d71b5..c1c1405 100644 (file)
@@ -1035,6 +1035,9 @@ IDEBlkIoReset (
 {\r
   IDE_BLK_IO_DEV  *IdeBlkIoDevice;\r
   EFI_STATUS      Status;\r
+  EFI_TPL         OldTpl;\r
+\r
+  OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);\r
 \r
   IdeBlkIoDevice = IDE_BLOCK_IO_DEV_FROM_THIS (This);\r
   //\r
@@ -1047,11 +1050,13 @@ IDEBlkIoReset (
   //\r
   if (IdeBlkIoDevice->Type == IdeHardDisk ||\r
       IdeBlkIoDevice->Type == Ide48bitAddressingHardDisk) {\r
-    return AtaSoftReset (IdeBlkIoDevice);\r
+    Status = AtaSoftReset (IdeBlkIoDevice);\r
+    goto Done;\r
   }\r
 \r
   if (IdeBlkIoDevice->Type == IdeUnknown) {\r
-    return EFI_DEVICE_ERROR;\r
+    Status = EFI_DEVICE_ERROR;\r
+    goto Done;\r
   }\r
   \r
   //\r
@@ -1062,6 +1067,8 @@ IDEBlkIoReset (
     Status = AtaSoftReset (IdeBlkIoDevice);\r
   }\r
 \r
+Done:\r
+  gBS->RestoreTPL (OldTpl);\r
   return Status;\r
 }\r
 \r
@@ -1089,6 +1096,10 @@ IDEBlkIoReadBlocks (
 // TODO:    EFI_DEVICE_ERROR - add return value to function comment\r
 {\r
   IDE_BLK_IO_DEV  *IdeBlkIoDevice;\r
+  EFI_STATUS      Status;\r
+  EFI_TPL         OldTpl;\r
+\r
+  OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);\r
 \r
   IdeBlkIoDevice = IDE_BLOCK_IO_DEV_FROM_THIS (This);\r
 \r
@@ -1102,23 +1113,25 @@ IDEBlkIoReadBlocks (
   //\r
   if (IdeBlkIoDevice->Type == IdeHardDisk ||\r
       IdeBlkIoDevice->Type == Ide48bitAddressingHardDisk) {\r
-    return AtaBlkIoReadBlocks (\r
+    Status = AtaBlkIoReadBlocks (\r
             IdeBlkIoDevice,\r
             MediaId,\r
             LBA,\r
             BufferSize,\r
             Buffer\r
             );\r
+    goto Done;\r
   }\r
 \r
   if (IdeBlkIoDevice->Type == IdeUnknown) {\r
-    return EFI_DEVICE_ERROR;\r
+    Status = EFI_DEVICE_ERROR;\r
+    goto Done;\r
   }\r
   \r
   //\r
   // for ATAPI device, using ATAPI read block's mechanism\r
   //\r
-  return AtapiBlkIoReadBlocks (\r
+  Status = AtapiBlkIoReadBlocks (\r
           IdeBlkIoDevice,\r
           MediaId,\r
           LBA,\r
@@ -1126,6 +1139,10 @@ IDEBlkIoReadBlocks (
           Buffer\r
           );\r
 \r
+Done:\r
+  gBS->RestoreTPL (OldTpl);\r
+\r
+  return Status;\r
 }\r
 \r
 /**\r
@@ -1152,7 +1169,11 @@ IDEBlkIoWriteBlocks (
 // TODO:    EFI_DEVICE_ERROR - add return value to function comment\r
 {\r
   IDE_BLK_IO_DEV  *IdeBlkIoDevice;\r
+  EFI_STATUS      Status;\r
+  EFI_TPL         OldTpl;\r
 \r
+  OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);\r
+  \r
   IdeBlkIoDevice = IDE_BLOCK_IO_DEV_FROM_THIS (This);\r
   //\r
   // Requery IDE IO resources in case of the switch of native and legacy modes\r
@@ -1165,29 +1186,35 @@ IDEBlkIoWriteBlocks (
   if (IdeBlkIoDevice->Type == IdeHardDisk ||\r
       IdeBlkIoDevice->Type == Ide48bitAddressingHardDisk) {        \r
 \r
-    return AtaBlkIoWriteBlocks (\r
+    Status = AtaBlkIoWriteBlocks (\r
             IdeBlkIoDevice,\r
             MediaId,\r
             LBA,\r
             BufferSize,\r
             Buffer\r
             );\r
+    goto Done;\r
   }\r
 \r
   if (IdeBlkIoDevice->Type == IdeUnknown) {\r
-    return EFI_DEVICE_ERROR;\r
+    Status = EFI_DEVICE_ERROR;\r
+    goto Done;\r
   }\r
   \r
   //\r
   // for ATAPI device, using ATAPI write block's mechanism\r
   //\r
-  return AtapiBlkIoWriteBlocks (\r
+  Status = AtapiBlkIoWriteBlocks (\r
           IdeBlkIoDevice,\r
           MediaId,\r
           LBA,\r
           BufferSize,\r
           Buffer\r
           );\r
+  \r
+Done:\r
+  gBS->RestoreTPL (OldTpl);\r
+  return Status;\r
 }\r
 \r
 //\r