Add a lock to protect the critical region in Service APIs for gEfiBlockIoProtocolGuid Protocol to prevent re-entrance of the same API from from different TPL level.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2443 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
@@ -1035,6 +1035,9 @@ IDEBlkIoReset (
|
|||||||
{
|
{
|
||||||
IDE_BLK_IO_DEV *IdeBlkIoDevice;
|
IDE_BLK_IO_DEV *IdeBlkIoDevice;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
|
OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);
|
||||||
|
|
||||||
IdeBlkIoDevice = IDE_BLOCK_IO_DEV_FROM_THIS (This);
|
IdeBlkIoDevice = IDE_BLOCK_IO_DEV_FROM_THIS (This);
|
||||||
//
|
//
|
||||||
@@ -1047,11 +1050,13 @@ IDEBlkIoReset (
|
|||||||
//
|
//
|
||||||
if (IdeBlkIoDevice->Type == IdeHardDisk ||
|
if (IdeBlkIoDevice->Type == IdeHardDisk ||
|
||||||
IdeBlkIoDevice->Type == Ide48bitAddressingHardDisk) {
|
IdeBlkIoDevice->Type == Ide48bitAddressingHardDisk) {
|
||||||
return AtaSoftReset (IdeBlkIoDevice);
|
Status = AtaSoftReset (IdeBlkIoDevice);
|
||||||
|
goto Done;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IdeBlkIoDevice->Type == IdeUnknown) {
|
if (IdeBlkIoDevice->Type == IdeUnknown) {
|
||||||
return EFI_DEVICE_ERROR;
|
Status = EFI_DEVICE_ERROR;
|
||||||
|
goto Done;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -1062,6 +1067,8 @@ IDEBlkIoReset (
|
|||||||
Status = AtaSoftReset (IdeBlkIoDevice);
|
Status = AtaSoftReset (IdeBlkIoDevice);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Done:
|
||||||
|
gBS->RestoreTPL (OldTpl);
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1089,6 +1096,10 @@ IDEBlkIoReadBlocks (
|
|||||||
// TODO: EFI_DEVICE_ERROR - add return value to function comment
|
// TODO: EFI_DEVICE_ERROR - add return value to function comment
|
||||||
{
|
{
|
||||||
IDE_BLK_IO_DEV *IdeBlkIoDevice;
|
IDE_BLK_IO_DEV *IdeBlkIoDevice;
|
||||||
|
EFI_STATUS Status;
|
||||||
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
|
OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);
|
||||||
|
|
||||||
IdeBlkIoDevice = IDE_BLOCK_IO_DEV_FROM_THIS (This);
|
IdeBlkIoDevice = IDE_BLOCK_IO_DEV_FROM_THIS (This);
|
||||||
|
|
||||||
@@ -1102,23 +1113,25 @@ IDEBlkIoReadBlocks (
|
|||||||
//
|
//
|
||||||
if (IdeBlkIoDevice->Type == IdeHardDisk ||
|
if (IdeBlkIoDevice->Type == IdeHardDisk ||
|
||||||
IdeBlkIoDevice->Type == Ide48bitAddressingHardDisk) {
|
IdeBlkIoDevice->Type == Ide48bitAddressingHardDisk) {
|
||||||
return AtaBlkIoReadBlocks (
|
Status = AtaBlkIoReadBlocks (
|
||||||
IdeBlkIoDevice,
|
IdeBlkIoDevice,
|
||||||
MediaId,
|
MediaId,
|
||||||
LBA,
|
LBA,
|
||||||
BufferSize,
|
BufferSize,
|
||||||
Buffer
|
Buffer
|
||||||
);
|
);
|
||||||
|
goto Done;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IdeBlkIoDevice->Type == IdeUnknown) {
|
if (IdeBlkIoDevice->Type == IdeUnknown) {
|
||||||
return EFI_DEVICE_ERROR;
|
Status = EFI_DEVICE_ERROR;
|
||||||
|
goto Done;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// for ATAPI device, using ATAPI read block's mechanism
|
// for ATAPI device, using ATAPI read block's mechanism
|
||||||
//
|
//
|
||||||
return AtapiBlkIoReadBlocks (
|
Status = AtapiBlkIoReadBlocks (
|
||||||
IdeBlkIoDevice,
|
IdeBlkIoDevice,
|
||||||
MediaId,
|
MediaId,
|
||||||
LBA,
|
LBA,
|
||||||
@@ -1126,6 +1139,10 @@ IDEBlkIoReadBlocks (
|
|||||||
Buffer
|
Buffer
|
||||||
);
|
);
|
||||||
|
|
||||||
|
Done:
|
||||||
|
gBS->RestoreTPL (OldTpl);
|
||||||
|
|
||||||
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1152,7 +1169,11 @@ IDEBlkIoWriteBlocks (
|
|||||||
// TODO: EFI_DEVICE_ERROR - add return value to function comment
|
// TODO: EFI_DEVICE_ERROR - add return value to function comment
|
||||||
{
|
{
|
||||||
IDE_BLK_IO_DEV *IdeBlkIoDevice;
|
IDE_BLK_IO_DEV *IdeBlkIoDevice;
|
||||||
|
EFI_STATUS Status;
|
||||||
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
|
OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);
|
||||||
|
|
||||||
IdeBlkIoDevice = IDE_BLOCK_IO_DEV_FROM_THIS (This);
|
IdeBlkIoDevice = IDE_BLOCK_IO_DEV_FROM_THIS (This);
|
||||||
//
|
//
|
||||||
// Requery IDE IO resources in case of the switch of native and legacy modes
|
// Requery IDE IO resources in case of the switch of native and legacy modes
|
||||||
@@ -1165,29 +1186,35 @@ IDEBlkIoWriteBlocks (
|
|||||||
if (IdeBlkIoDevice->Type == IdeHardDisk ||
|
if (IdeBlkIoDevice->Type == IdeHardDisk ||
|
||||||
IdeBlkIoDevice->Type == Ide48bitAddressingHardDisk) {
|
IdeBlkIoDevice->Type == Ide48bitAddressingHardDisk) {
|
||||||
|
|
||||||
return AtaBlkIoWriteBlocks (
|
Status = AtaBlkIoWriteBlocks (
|
||||||
IdeBlkIoDevice,
|
IdeBlkIoDevice,
|
||||||
MediaId,
|
MediaId,
|
||||||
LBA,
|
LBA,
|
||||||
BufferSize,
|
BufferSize,
|
||||||
Buffer
|
Buffer
|
||||||
);
|
);
|
||||||
|
goto Done;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IdeBlkIoDevice->Type == IdeUnknown) {
|
if (IdeBlkIoDevice->Type == IdeUnknown) {
|
||||||
return EFI_DEVICE_ERROR;
|
Status = EFI_DEVICE_ERROR;
|
||||||
|
goto Done;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// for ATAPI device, using ATAPI write block's mechanism
|
// for ATAPI device, using ATAPI write block's mechanism
|
||||||
//
|
//
|
||||||
return AtapiBlkIoWriteBlocks (
|
Status = AtapiBlkIoWriteBlocks (
|
||||||
IdeBlkIoDevice,
|
IdeBlkIoDevice,
|
||||||
MediaId,
|
MediaId,
|
||||||
LBA,
|
LBA,
|
||||||
BufferSize,
|
BufferSize,
|
||||||
Buffer
|
Buffer
|
||||||
);
|
);
|
||||||
|
|
||||||
|
Done:
|
||||||
|
gBS->RestoreTPL (OldTpl);
|
||||||
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
/*++
|
/*++
|
||||||
|
|
||||||
Copyright (c) 2006, Intel Corporation
|
Copyright (c) 2006 - 2007, Intel Corporation
|
||||||
All rights reserved. This program and the accompanying materials
|
All rights reserved. This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
are licensed and made available under the terms and conditions of the BSD License
|
||||||
which accompanies this distribution. The full text of the license may be found at
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
@@ -332,17 +332,22 @@ Returns:
|
|||||||
{
|
{
|
||||||
SCSI_DISK_DEV *ScsiDiskDevice;
|
SCSI_DISK_DEV *ScsiDiskDevice;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
|
OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);
|
||||||
|
|
||||||
ScsiDiskDevice = SCSI_DISK_DEV_FROM_THIS (This);
|
ScsiDiskDevice = SCSI_DISK_DEV_FROM_THIS (This);
|
||||||
|
|
||||||
Status = ScsiDiskDevice->ScsiIo->ResetDevice (ScsiDiskDevice->ScsiIo);
|
Status = ScsiDiskDevice->ScsiIo->ResetDevice (ScsiDiskDevice->ScsiIo);
|
||||||
|
|
||||||
if (!ExtendedVerification) {
|
if (!ExtendedVerification) {
|
||||||
return Status;
|
goto Done;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = ScsiDiskDevice->ScsiIo->ResetBus (ScsiDiskDevice->ScsiIo);
|
Status = ScsiDiskDevice->ScsiIo->ResetBus (ScsiDiskDevice->ScsiIo);
|
||||||
|
|
||||||
|
Done:
|
||||||
|
gBS->RestoreTPL (OldTpl);
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -389,6 +394,7 @@ Returns:
|
|||||||
UINTN BlockSize;
|
UINTN BlockSize;
|
||||||
UINTN NumberOfBlocks;
|
UINTN NumberOfBlocks;
|
||||||
BOOLEAN MediaChange;
|
BOOLEAN MediaChange;
|
||||||
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
MediaChange = FALSE;
|
MediaChange = FALSE;
|
||||||
if (!Buffer) {
|
if (!Buffer) {
|
||||||
@@ -399,13 +405,16 @@ Returns:
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);
|
||||||
|
|
||||||
ScsiDiskDevice = SCSI_DISK_DEV_FROM_THIS (This);
|
ScsiDiskDevice = SCSI_DISK_DEV_FROM_THIS (This);
|
||||||
|
|
||||||
if (!IsDeviceFixed (ScsiDiskDevice)) {
|
if (!IsDeviceFixed (ScsiDiskDevice)) {
|
||||||
|
|
||||||
Status = ScsiDiskDetectMedia (ScsiDiskDevice, FALSE, &MediaChange);
|
Status = ScsiDiskDetectMedia (ScsiDiskDevice, FALSE, &MediaChange);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return EFI_DEVICE_ERROR;
|
Status = EFI_DEVICE_ERROR;
|
||||||
|
goto Done;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (MediaChange) {
|
if (MediaChange) {
|
||||||
@@ -426,27 +435,33 @@ Returns:
|
|||||||
NumberOfBlocks = BufferSize / BlockSize;
|
NumberOfBlocks = BufferSize / BlockSize;
|
||||||
|
|
||||||
if (!(Media->MediaPresent)) {
|
if (!(Media->MediaPresent)) {
|
||||||
return EFI_NO_MEDIA;
|
Status = EFI_NO_MEDIA;
|
||||||
|
goto Done;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (MediaId != Media->MediaId) {
|
if (MediaId != Media->MediaId) {
|
||||||
return EFI_MEDIA_CHANGED;
|
Status = EFI_MEDIA_CHANGED;
|
||||||
|
goto Done;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (BufferSize % BlockSize != 0) {
|
if (BufferSize % BlockSize != 0) {
|
||||||
return EFI_BAD_BUFFER_SIZE;
|
Status = EFI_BAD_BUFFER_SIZE;
|
||||||
|
goto Done;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (LBA > Media->LastBlock) {
|
if (LBA > Media->LastBlock) {
|
||||||
return EFI_INVALID_PARAMETER;
|
Status = EFI_INVALID_PARAMETER;
|
||||||
|
goto Done;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((LBA + NumberOfBlocks - 1) > Media->LastBlock) {
|
if ((LBA + NumberOfBlocks - 1) > Media->LastBlock) {
|
||||||
return EFI_INVALID_PARAMETER;
|
Status = EFI_INVALID_PARAMETER;
|
||||||
|
goto Done;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((Media->IoAlign > 1) && (((UINTN) Buffer & (Media->IoAlign - 1)) != 0)) {
|
if ((Media->IoAlign > 1) && (((UINTN) Buffer & (Media->IoAlign - 1)) != 0)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
Status = EFI_INVALID_PARAMETER;
|
||||||
|
goto Done;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -455,6 +470,8 @@ Returns:
|
|||||||
//
|
//
|
||||||
Status = ScsiDiskReadSectors (ScsiDiskDevice, Buffer, LBA, NumberOfBlocks);
|
Status = ScsiDiskReadSectors (ScsiDiskDevice, Buffer, LBA, NumberOfBlocks);
|
||||||
|
|
||||||
|
Done:
|
||||||
|
gBS->RestoreTPL (OldTpl);
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -501,6 +518,7 @@ Returns:
|
|||||||
UINTN BlockSize;
|
UINTN BlockSize;
|
||||||
UINTN NumberOfBlocks;
|
UINTN NumberOfBlocks;
|
||||||
BOOLEAN MediaChange;
|
BOOLEAN MediaChange;
|
||||||
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
MediaChange = FALSE;
|
MediaChange = FALSE;
|
||||||
if (!Buffer) {
|
if (!Buffer) {
|
||||||
@@ -511,13 +529,16 @@ Returns:
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);
|
||||||
|
|
||||||
ScsiDiskDevice = SCSI_DISK_DEV_FROM_THIS (This);
|
ScsiDiskDevice = SCSI_DISK_DEV_FROM_THIS (This);
|
||||||
|
|
||||||
if (!IsDeviceFixed (ScsiDiskDevice)) {
|
if (!IsDeviceFixed (ScsiDiskDevice)) {
|
||||||
|
|
||||||
Status = ScsiDiskDetectMedia (ScsiDiskDevice, FALSE, &MediaChange);
|
Status = ScsiDiskDetectMedia (ScsiDiskDevice, FALSE, &MediaChange);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return EFI_DEVICE_ERROR;
|
Status = EFI_DEVICE_ERROR;
|
||||||
|
goto Done;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (MediaChange) {
|
if (MediaChange) {
|
||||||
@@ -538,27 +559,33 @@ Returns:
|
|||||||
NumberOfBlocks = BufferSize / BlockSize;
|
NumberOfBlocks = BufferSize / BlockSize;
|
||||||
|
|
||||||
if (!(Media->MediaPresent)) {
|
if (!(Media->MediaPresent)) {
|
||||||
return EFI_NO_MEDIA;
|
Status = EFI_NO_MEDIA;
|
||||||
|
goto Done;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (MediaId != Media->MediaId) {
|
if (MediaId != Media->MediaId) {
|
||||||
return EFI_MEDIA_CHANGED;
|
Status = EFI_MEDIA_CHANGED;
|
||||||
|
goto Done;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (BufferSize % BlockSize != 0) {
|
if (BufferSize % BlockSize != 0) {
|
||||||
return EFI_BAD_BUFFER_SIZE;
|
Status = EFI_BAD_BUFFER_SIZE;
|
||||||
|
goto Done;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (LBA > Media->LastBlock) {
|
if (LBA > Media->LastBlock) {
|
||||||
return EFI_INVALID_PARAMETER;
|
Status = EFI_INVALID_PARAMETER;
|
||||||
|
goto Done;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((LBA + NumberOfBlocks - 1) > Media->LastBlock) {
|
if ((LBA + NumberOfBlocks - 1) > Media->LastBlock) {
|
||||||
return EFI_INVALID_PARAMETER;
|
Status = EFI_INVALID_PARAMETER;
|
||||||
|
goto Done;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((Media->IoAlign > 1) && (((UINTN) Buffer & (Media->IoAlign - 1)) != 0)) {
|
if ((Media->IoAlign > 1) && (((UINTN) Buffer & (Media->IoAlign - 1)) != 0)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
Status = EFI_INVALID_PARAMETER;
|
||||||
|
goto Done;
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
// if all the parameters are valid, then perform read sectors command
|
// if all the parameters are valid, then perform read sectors command
|
||||||
@@ -566,6 +593,9 @@ Returns:
|
|||||||
//
|
//
|
||||||
Status = ScsiDiskWriteSectors (ScsiDiskDevice, Buffer, LBA, NumberOfBlocks);
|
Status = ScsiDiskWriteSectors (ScsiDiskDevice, Buffer, LBA, NumberOfBlocks);
|
||||||
|
|
||||||
|
Done:
|
||||||
|
gBS->RestoreTPL (OldTpl);
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
/*++
|
/*++
|
||||||
|
|
||||||
Copyright (c) 2006, Intel Corporation
|
Copyright (c) 2006 - 2007, Intel Corporation
|
||||||
All rights reserved. This program and the accompanying materials
|
All rights reserved. This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
are licensed and made available under the terms and conditions of the BSD License
|
||||||
which accompanies this distribution. The full text of the license may be found at
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
@@ -350,6 +350,9 @@ USBFloppyReset (
|
|||||||
USB_FLOPPY_DEV *UsbFloppyDevice;
|
USB_FLOPPY_DEV *UsbFloppyDevice;
|
||||||
EFI_USB_ATAPI_PROTOCOL *UsbAtapiInterface;
|
EFI_USB_ATAPI_PROTOCOL *UsbAtapiInterface;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
|
OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);
|
||||||
|
|
||||||
UsbFloppyDevice = USB_FLOPPY_DEV_FROM_THIS (This);
|
UsbFloppyDevice = USB_FLOPPY_DEV_FROM_THIS (This);
|
||||||
|
|
||||||
@@ -360,6 +363,8 @@ USBFloppyReset (
|
|||||||
//
|
//
|
||||||
Status = UsbAtapiInterface->UsbAtapiReset (UsbAtapiInterface, ExtendedVerification);
|
Status = UsbAtapiInterface->UsbAtapiReset (UsbAtapiInterface, ExtendedVerification);
|
||||||
|
|
||||||
|
gBS->RestoreTPL (OldTpl);
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -404,6 +409,7 @@ USBFloppyReadBlocks (
|
|||||||
UINTN BlockSize;
|
UINTN BlockSize;
|
||||||
UINTN NumberOfBlocks;
|
UINTN NumberOfBlocks;
|
||||||
BOOLEAN MediaChange;
|
BOOLEAN MediaChange;
|
||||||
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
MediaChange = FALSE;
|
MediaChange = FALSE;
|
||||||
@@ -412,16 +418,16 @@ USBFloppyReadBlocks (
|
|||||||
//
|
//
|
||||||
// Check parameters
|
// Check parameters
|
||||||
//
|
//
|
||||||
if (!Buffer) {
|
if (Buffer == NULL) {
|
||||||
Status = EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
goto Done;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (BufferSize == 0) {
|
if (BufferSize == 0) {
|
||||||
Status = EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
goto Done;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);
|
||||||
|
|
||||||
UsbFloppyTestUnitReady (UsbFloppyDevice);
|
UsbFloppyTestUnitReady (UsbFloppyDevice);
|
||||||
|
|
||||||
Status = UsbFloppyDetectMedia (UsbFloppyDevice, &MediaChange);
|
Status = UsbFloppyDetectMedia (UsbFloppyDevice, &MediaChange);
|
||||||
@@ -485,6 +491,7 @@ USBFloppyReadBlocks (
|
|||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
This->Reset (This, TRUE);
|
This->Reset (This, TRUE);
|
||||||
Status = EFI_DEVICE_ERROR;
|
Status = EFI_DEVICE_ERROR;
|
||||||
|
goto Done;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (NumberOfBlocks > BLOCK_UNIT) {
|
if (NumberOfBlocks > BLOCK_UNIT) {
|
||||||
@@ -499,6 +506,7 @@ USBFloppyReadBlocks (
|
|||||||
}
|
}
|
||||||
|
|
||||||
Done:
|
Done:
|
||||||
|
gBS->RestoreTPL (OldTpl);
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -546,6 +554,7 @@ USBFloppyWriteBlocks (
|
|||||||
UINTN BlockSize;
|
UINTN BlockSize;
|
||||||
UINTN NumberOfBlocks;
|
UINTN NumberOfBlocks;
|
||||||
BOOLEAN MediaChange;
|
BOOLEAN MediaChange;
|
||||||
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
MediaChange = FALSE;
|
MediaChange = FALSE;
|
||||||
@@ -555,16 +564,16 @@ USBFloppyWriteBlocks (
|
|||||||
//
|
//
|
||||||
// Check parameters
|
// Check parameters
|
||||||
//
|
//
|
||||||
if (!Buffer) {
|
if (Buffer == NULL) {
|
||||||
Status = EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
goto Done;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (BufferSize == 0) {
|
if (BufferSize == 0) {
|
||||||
Status = EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
goto Done;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
OldTpl = gBS->RaiseTPL (EFI_TPL_CALLBACK);
|
||||||
|
|
||||||
UsbFloppyTestUnitReady (UsbFloppyDevice);
|
UsbFloppyTestUnitReady (UsbFloppyDevice);
|
||||||
|
|
||||||
Status = UsbFloppyDetectMedia (UsbFloppyDevice, &MediaChange);
|
Status = UsbFloppyDetectMedia (UsbFloppyDevice, &MediaChange);
|
||||||
@@ -633,6 +642,7 @@ USBFloppyWriteBlocks (
|
|||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
This->Reset (This, TRUE);
|
This->Reset (This, TRUE);
|
||||||
Status = EFI_DEVICE_ERROR;
|
Status = EFI_DEVICE_ERROR;
|
||||||
|
goto Done;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (NumberOfBlocks > BLOCK_UNIT) {
|
if (NumberOfBlocks > BLOCK_UNIT) {
|
||||||
@@ -647,7 +657,7 @@ USBFloppyWriteBlocks (
|
|||||||
}
|
}
|
||||||
|
|
||||||
Done:
|
Done:
|
||||||
|
gBS->RestoreTPL (OldTpl);
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user