]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Add a lock to protect the critical region in Service APIs for gEfiBlockIoProtocolGuid...
authorqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 12 Mar 2007 07:47:33 +0000 (07:47 +0000)
committerqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 12 Mar 2007 07:47:33 +0000 (07:47 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2443 6f19259b-4bc3-4df7-8a09-765794883524

EdkModulePkg/Bus/Pci/IdeBus/Dxe/idebus.c
EdkModulePkg/Bus/Scsi/ScsiDisk/Dxe/ScsiDisk.c
EdkModulePkg/Bus/Usb/UsbMassStorage/Dxe/UsbMassStorage.c

index 42d71b5c228fd544bcd33cfcf249de8413320fbd..c1c14052f1826621e14af9a88fb1d9c8f6fb0879 100644 (file)
@@ -1035,6 +1035,9 @@ IDEBlkIoReset (
 {\r
   IDE_BLK_IO_DEV  *IdeBlkIoDevice;\r
   EFI_STATUS      Status;\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
 \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
   //\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
   }\r
 \r
   if (IdeBlkIoDevice->Type == IdeUnknown) {\r
-    return EFI_DEVICE_ERROR;\r
+    Status = EFI_DEVICE_ERROR;\r
+    goto Done;\r
   }\r
   \r
   //\r
   }\r
   \r
   //\r
@@ -1062,6 +1067,8 @@ IDEBlkIoReset (
     Status = AtaSoftReset (IdeBlkIoDevice);\r
   }\r
 \r
     Status = AtaSoftReset (IdeBlkIoDevice);\r
   }\r
 \r
+Done:\r
+  gBS->RestoreTPL (OldTpl);\r
   return Status;\r
 }\r
 \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
 // 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
 \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
   //\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
             IdeBlkIoDevice,\r
             MediaId,\r
             LBA,\r
             BufferSize,\r
             Buffer\r
             );\r
+    goto Done;\r
   }\r
 \r
   if (IdeBlkIoDevice->Type == IdeUnknown) {\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
   }\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
           IdeBlkIoDevice,\r
           MediaId,\r
           LBA,\r
@@ -1126,6 +1139,10 @@ IDEBlkIoReadBlocks (
           Buffer\r
           );\r
 \r
           Buffer\r
           );\r
 \r
+Done:\r
+  gBS->RestoreTPL (OldTpl);\r
+\r
+  return Status;\r
 }\r
 \r
 /**\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
 // 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
 \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
   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
   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
             IdeBlkIoDevice,\r
             MediaId,\r
             LBA,\r
             BufferSize,\r
             Buffer\r
             );\r
+    goto Done;\r
   }\r
 \r
   if (IdeBlkIoDevice->Type == IdeUnknown) {\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
   }\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
           IdeBlkIoDevice,\r
           MediaId,\r
           LBA,\r
           BufferSize,\r
           Buffer\r
           );\r
+  \r
+Done:\r
+  gBS->RestoreTPL (OldTpl);\r
+  return Status;\r
 }\r
 \r
 //\r
 }\r
 \r
 //\r
index a3f4d6a3b6a42d2a41488eba55a58b9a12c945e0..9eac2c474deb944ec5f0727e0c36b98004ad5d79 100644 (file)
@@ -1,6 +1,6 @@
 /*++\r
 \r
 /*++\r
 \r
-Copyright (c) 2006, Intel Corporation                                                         \r
+Copyright (c) 2006 - 2007, Intel Corporation                                                         \r
 All rights reserved. This program and the accompanying materials                          \r
 are licensed and made available under the terms and conditions of the BSD License         \r
 which accompanies this distribution.  The full text of the license may be found at        \r
 All rights reserved. This program and the accompanying materials                          \r
 are licensed and made available under the terms and conditions of the BSD License         \r
 which accompanies this distribution.  The full text of the license may be found at        \r
@@ -332,17 +332,22 @@ Returns:
 {\r
   SCSI_DISK_DEV *ScsiDiskDevice;\r
   EFI_STATUS    Status;\r
 {\r
   SCSI_DISK_DEV *ScsiDiskDevice;\r
   EFI_STATUS    Status;\r
+  EFI_TPL       OldTpl;\r
+\r
+  OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);\r
 \r
   ScsiDiskDevice  = SCSI_DISK_DEV_FROM_THIS (This);\r
 \r
   Status          = ScsiDiskDevice->ScsiIo->ResetDevice (ScsiDiskDevice->ScsiIo);\r
 \r
   if (!ExtendedVerification) {\r
 \r
   ScsiDiskDevice  = SCSI_DISK_DEV_FROM_THIS (This);\r
 \r
   Status          = ScsiDiskDevice->ScsiIo->ResetDevice (ScsiDiskDevice->ScsiIo);\r
 \r
   if (!ExtendedVerification) {\r
-    return Status;\r
+    goto Done;\r
   }\r
 \r
   Status = ScsiDiskDevice->ScsiIo->ResetBus (ScsiDiskDevice->ScsiIo);\r
 \r
   }\r
 \r
   Status = ScsiDiskDevice->ScsiIo->ResetBus (ScsiDiskDevice->ScsiIo);\r
 \r
+Done:\r
+  gBS->RestoreTPL (OldTpl);\r
   return Status;\r
 }\r
 \r
   return Status;\r
 }\r
 \r
@@ -389,6 +394,7 @@ Returns:
   UINTN               BlockSize;\r
   UINTN               NumberOfBlocks;\r
   BOOLEAN             MediaChange;\r
   UINTN               BlockSize;\r
   UINTN               NumberOfBlocks;\r
   BOOLEAN             MediaChange;\r
+  EFI_TPL             OldTpl;\r
 \r
   MediaChange = FALSE;\r
   if (!Buffer) {\r
 \r
   MediaChange = FALSE;\r
   if (!Buffer) {\r
@@ -399,13 +405,16 @@ Returns:
     return EFI_SUCCESS;\r
   }\r
 \r
     return EFI_SUCCESS;\r
   }\r
 \r
+  OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);\r
+\r
   ScsiDiskDevice = SCSI_DISK_DEV_FROM_THIS (This);\r
 \r
   if (!IsDeviceFixed (ScsiDiskDevice)) {\r
 \r
     Status = ScsiDiskDetectMedia (ScsiDiskDevice, FALSE, &MediaChange);\r
     if (EFI_ERROR (Status)) {\r
   ScsiDiskDevice = SCSI_DISK_DEV_FROM_THIS (This);\r
 \r
   if (!IsDeviceFixed (ScsiDiskDevice)) {\r
 \r
     Status = ScsiDiskDetectMedia (ScsiDiskDevice, FALSE, &MediaChange);\r
     if (EFI_ERROR (Status)) {\r
-      return EFI_DEVICE_ERROR;\r
+      Status = EFI_DEVICE_ERROR;\r
+      goto Done;\r
     }\r
 \r
     if (MediaChange) {\r
     }\r
 \r
     if (MediaChange) {\r
@@ -426,27 +435,33 @@ Returns:
   NumberOfBlocks  = BufferSize / BlockSize;\r
 \r
   if (!(Media->MediaPresent)) {\r
   NumberOfBlocks  = BufferSize / BlockSize;\r
 \r
   if (!(Media->MediaPresent)) {\r
-    return EFI_NO_MEDIA;\r
+    Status = EFI_NO_MEDIA;\r
+    goto Done;\r
   }\r
 \r
   if (MediaId != Media->MediaId) {\r
   }\r
 \r
   if (MediaId != Media->MediaId) {\r
-    return EFI_MEDIA_CHANGED;\r
+    Status = EFI_MEDIA_CHANGED;\r
+    goto Done;\r
   }\r
 \r
   if (BufferSize % BlockSize != 0) {\r
   }\r
 \r
   if (BufferSize % BlockSize != 0) {\r
-    return EFI_BAD_BUFFER_SIZE;\r
+    Status = EFI_BAD_BUFFER_SIZE;\r
+    goto Done;\r
   }\r
 \r
   if (LBA > Media->LastBlock) {\r
   }\r
 \r
   if (LBA > Media->LastBlock) {\r
-    return EFI_INVALID_PARAMETER;\r
+    Status = EFI_INVALID_PARAMETER;\r
+    goto Done;\r
   }\r
 \r
   if ((LBA + NumberOfBlocks - 1) > Media->LastBlock) {\r
   }\r
 \r
   if ((LBA + NumberOfBlocks - 1) > Media->LastBlock) {\r
-    return EFI_INVALID_PARAMETER;\r
+    Status = EFI_INVALID_PARAMETER;\r
+    goto Done;\r
   }\r
 \r
   if ((Media->IoAlign > 1) && (((UINTN) Buffer & (Media->IoAlign - 1)) != 0)) {\r
   }\r
 \r
   if ((Media->IoAlign > 1) && (((UINTN) Buffer & (Media->IoAlign - 1)) != 0)) {\r
-    return EFI_INVALID_PARAMETER;\r
+    Status = EFI_INVALID_PARAMETER;\r
+    goto Done;\r
   }\r
   \r
   //\r
   }\r
   \r
   //\r
@@ -455,6 +470,8 @@ Returns:
   //\r
   Status = ScsiDiskReadSectors (ScsiDiskDevice, Buffer, LBA, NumberOfBlocks);\r
 \r
   //\r
   Status = ScsiDiskReadSectors (ScsiDiskDevice, Buffer, LBA, NumberOfBlocks);\r
 \r
+Done:\r
+  gBS->RestoreTPL (OldTpl);\r
   return Status;\r
 }\r
 \r
   return Status;\r
 }\r
 \r
@@ -501,6 +518,7 @@ Returns:
   UINTN               BlockSize;\r
   UINTN               NumberOfBlocks;\r
   BOOLEAN             MediaChange;\r
   UINTN               BlockSize;\r
   UINTN               NumberOfBlocks;\r
   BOOLEAN             MediaChange;\r
+  EFI_TPL             OldTpl;\r
 \r
   MediaChange = FALSE;\r
   if (!Buffer) {\r
 \r
   MediaChange = FALSE;\r
   if (!Buffer) {\r
@@ -511,13 +529,16 @@ Returns:
     return EFI_SUCCESS;\r
   }\r
 \r
     return EFI_SUCCESS;\r
   }\r
 \r
+  OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);\r
+\r
   ScsiDiskDevice = SCSI_DISK_DEV_FROM_THIS (This);\r
 \r
   if (!IsDeviceFixed (ScsiDiskDevice)) {\r
 \r
     Status = ScsiDiskDetectMedia (ScsiDiskDevice, FALSE, &MediaChange);\r
     if (EFI_ERROR (Status)) {\r
   ScsiDiskDevice = SCSI_DISK_DEV_FROM_THIS (This);\r
 \r
   if (!IsDeviceFixed (ScsiDiskDevice)) {\r
 \r
     Status = ScsiDiskDetectMedia (ScsiDiskDevice, FALSE, &MediaChange);\r
     if (EFI_ERROR (Status)) {\r
-      return EFI_DEVICE_ERROR;\r
+      Status = EFI_DEVICE_ERROR;\r
+      goto Done;\r
     }\r
 \r
     if (MediaChange) {\r
     }\r
 \r
     if (MediaChange) {\r
@@ -538,27 +559,33 @@ Returns:
   NumberOfBlocks  = BufferSize / BlockSize;\r
 \r
   if (!(Media->MediaPresent)) {\r
   NumberOfBlocks  = BufferSize / BlockSize;\r
 \r
   if (!(Media->MediaPresent)) {\r
-    return EFI_NO_MEDIA;\r
+    Status = EFI_NO_MEDIA;\r
+    goto Done;\r
   }\r
 \r
   if (MediaId != Media->MediaId) {\r
   }\r
 \r
   if (MediaId != Media->MediaId) {\r
-    return EFI_MEDIA_CHANGED;\r
+    Status = EFI_MEDIA_CHANGED;\r
+    goto Done;\r
   }\r
 \r
   if (BufferSize % BlockSize != 0) {\r
   }\r
 \r
   if (BufferSize % BlockSize != 0) {\r
-    return EFI_BAD_BUFFER_SIZE;\r
+    Status = EFI_BAD_BUFFER_SIZE;\r
+    goto Done;\r
   }\r
 \r
   if (LBA > Media->LastBlock) {\r
   }\r
 \r
   if (LBA > Media->LastBlock) {\r
-    return EFI_INVALID_PARAMETER;\r
+    Status = EFI_INVALID_PARAMETER;\r
+    goto Done;\r
   }\r
 \r
   if ((LBA + NumberOfBlocks - 1) > Media->LastBlock) {\r
   }\r
 \r
   if ((LBA + NumberOfBlocks - 1) > Media->LastBlock) {\r
-    return EFI_INVALID_PARAMETER;\r
+    Status = EFI_INVALID_PARAMETER;\r
+    goto Done;\r
   }\r
 \r
   if ((Media->IoAlign > 1) && (((UINTN) Buffer & (Media->IoAlign - 1)) != 0)) {\r
   }\r
 \r
   if ((Media->IoAlign > 1) && (((UINTN) Buffer & (Media->IoAlign - 1)) != 0)) {\r
-    return EFI_INVALID_PARAMETER;\r
+    Status = EFI_INVALID_PARAMETER;\r
+    goto Done;\r
   }\r
   //\r
   // if all the parameters are valid, then perform read sectors command\r
   }\r
   //\r
   // if all the parameters are valid, then perform read sectors command\r
@@ -566,6 +593,9 @@ Returns:
   //\r
   Status = ScsiDiskWriteSectors (ScsiDiskDevice, Buffer, LBA, NumberOfBlocks);\r
 \r
   //\r
   Status = ScsiDiskWriteSectors (ScsiDiskDevice, Buffer, LBA, NumberOfBlocks);\r
 \r
+Done:\r
+  gBS->RestoreTPL (OldTpl);\r
+  \r
   return Status;\r
 }\r
 \r
   return Status;\r
 }\r
 \r
index 951ab0a186fcae887deee4c0ba17dbdb3c1ee8b4..9caa006715feef8313ab104a531a0a54ed35dd2b 100644 (file)
@@ -1,6 +1,6 @@
 /*++\r
 \r
 /*++\r
 \r
-Copyright (c) 2006, Intel Corporation\r
+Copyright (c) 2006 - 2007, Intel Corporation\r
 All rights reserved. This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
 All rights reserved. This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
@@ -350,6 +350,9 @@ USBFloppyReset (
   USB_FLOPPY_DEV          *UsbFloppyDevice;\r
   EFI_USB_ATAPI_PROTOCOL  *UsbAtapiInterface;\r
   EFI_STATUS              Status;\r
   USB_FLOPPY_DEV          *UsbFloppyDevice;\r
   EFI_USB_ATAPI_PROTOCOL  *UsbAtapiInterface;\r
   EFI_STATUS              Status;\r
+  EFI_TPL                 OldTpl;\r
+\r
+  OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);\r
 \r
   UsbFloppyDevice   = USB_FLOPPY_DEV_FROM_THIS (This);\r
 \r
 \r
   UsbFloppyDevice   = USB_FLOPPY_DEV_FROM_THIS (This);\r
 \r
@@ -360,6 +363,8 @@ USBFloppyReset (
   //\r
   Status = UsbAtapiInterface->UsbAtapiReset (UsbAtapiInterface, ExtendedVerification);\r
 \r
   //\r
   Status = UsbAtapiInterface->UsbAtapiReset (UsbAtapiInterface, ExtendedVerification);\r
 \r
+  gBS->RestoreTPL (OldTpl);\r
+\r
   return Status;\r
 }\r
 \r
   return Status;\r
 }\r
 \r
@@ -404,6 +409,7 @@ USBFloppyReadBlocks (
   UINTN               BlockSize;\r
   UINTN               NumberOfBlocks;\r
   BOOLEAN             MediaChange;\r
   UINTN               BlockSize;\r
   UINTN               NumberOfBlocks;\r
   BOOLEAN             MediaChange;\r
+  EFI_TPL             OldTpl;\r
 \r
   Status          = EFI_SUCCESS;\r
   MediaChange     = FALSE;\r
 \r
   Status          = EFI_SUCCESS;\r
   MediaChange     = FALSE;\r
@@ -412,16 +418,16 @@ USBFloppyReadBlocks (
   //\r
   // Check parameters\r
   //\r
   //\r
   // Check parameters\r
   //\r
-  if (!Buffer) {\r
-    Status = EFI_INVALID_PARAMETER;\r
-    goto Done;\r
+  if (Buffer == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
   }\r
 \r
   if (BufferSize == 0) {\r
   }\r
 \r
   if (BufferSize == 0) {\r
-    Status = EFI_SUCCESS;\r
-    goto Done;\r
+    return EFI_SUCCESS;\r
   }\r
 \r
   }\r
 \r
+  OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);\r
+\r
   UsbFloppyTestUnitReady (UsbFloppyDevice);\r
 \r
   Status = UsbFloppyDetectMedia (UsbFloppyDevice, &MediaChange);\r
   UsbFloppyTestUnitReady (UsbFloppyDevice);\r
 \r
   Status = UsbFloppyDetectMedia (UsbFloppyDevice, &MediaChange);\r
@@ -485,6 +491,7 @@ USBFloppyReadBlocks (
     if (EFI_ERROR (Status)) {\r
       This->Reset (This, TRUE);\r
       Status = EFI_DEVICE_ERROR;\r
     if (EFI_ERROR (Status)) {\r
       This->Reset (This, TRUE);\r
       Status = EFI_DEVICE_ERROR;\r
+      goto Done;\r
     }\r
 \r
     if (NumberOfBlocks > BLOCK_UNIT) {\r
     }\r
 \r
     if (NumberOfBlocks > BLOCK_UNIT) {\r
@@ -499,6 +506,7 @@ USBFloppyReadBlocks (
  }\r
 \r
  Done:\r
  }\r
 \r
  Done:\r
+  gBS->RestoreTPL (OldTpl);\r
   return Status;\r
 }\r
 \r
   return Status;\r
 }\r
 \r
@@ -546,6 +554,7 @@ USBFloppyWriteBlocks (
   UINTN               BlockSize;\r
   UINTN               NumberOfBlocks;\r
   BOOLEAN             MediaChange;\r
   UINTN               BlockSize;\r
   UINTN               NumberOfBlocks;\r
   BOOLEAN             MediaChange;\r
+  EFI_TPL             OldTpl;\r
 \r
   Status          = EFI_SUCCESS;\r
   MediaChange     = FALSE;\r
 \r
   Status          = EFI_SUCCESS;\r
   MediaChange     = FALSE;\r
@@ -555,16 +564,16 @@ USBFloppyWriteBlocks (
   //\r
   // Check parameters\r
   //\r
   //\r
   // Check parameters\r
   //\r
-  if (!Buffer) {\r
-    Status = EFI_INVALID_PARAMETER;\r
-    goto Done;\r
+  if (Buffer == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
   }\r
 \r
   if (BufferSize == 0) {\r
   }\r
 \r
   if (BufferSize == 0) {\r
-    Status = EFI_SUCCESS;\r
-    goto Done;\r
+    return EFI_SUCCESS;\r
   }\r
 \r
   }\r
 \r
+  OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);\r
+\r
   UsbFloppyTestUnitReady (UsbFloppyDevice);\r
 \r
   Status = UsbFloppyDetectMedia (UsbFloppyDevice, &MediaChange);\r
   UsbFloppyTestUnitReady (UsbFloppyDevice);\r
 \r
   Status = UsbFloppyDetectMedia (UsbFloppyDevice, &MediaChange);\r
@@ -633,6 +642,7 @@ USBFloppyWriteBlocks (
     if (EFI_ERROR (Status)) {\r
       This->Reset (This, TRUE);\r
       Status = EFI_DEVICE_ERROR;\r
     if (EFI_ERROR (Status)) {\r
       This->Reset (This, TRUE);\r
       Status = EFI_DEVICE_ERROR;\r
+      goto Done;\r
     }\r
 \r
     if (NumberOfBlocks > BLOCK_UNIT) {\r
     }\r
 \r
     if (NumberOfBlocks > BLOCK_UNIT) {\r
@@ -647,7 +657,7 @@ USBFloppyWriteBlocks (
  }\r
 \r
 Done:\r
  }\r
 \r
 Done:\r
-\r
+  gBS->RestoreTPL (OldTpl);\r
   return Status;\r
 }\r
 \r
   return Status;\r
 }\r
 \r