mirror of https://github.com/acidanthera/audk.git
MdeModulePkg ScsiBusDxe: Fix caller event may nerver be signaled
For function ScsiExecuteSCSICommand(), when the 'Event' parameter is not NULL but the target SCSI device does not support non-blocking I/O, it will execute a blocking I/O operation instead. However, after the SCSI operation is done, the 'Event' is not signaled to inform the caller. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Hao Wu <hao.a.wu@intel.com> Reviewed-by: Feng Tian <feng.tian@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@19217 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
0350b57cf7
commit
0d12e6a003
|
@ -2,7 +2,7 @@
|
|||
SCSI Bus driver that layers on every SCSI Pass Thru and
|
||||
Extended SCSI Pass Thru protocol in the system.
|
||||
|
||||
Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
|
||||
Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
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
|
||||
|
@ -986,13 +986,34 @@ ScsiExecuteSCSICommand (
|
|||
|
||||
if (ScsiIoDevice->ExtScsiSupport) {
|
||||
ExtRequestPacket = (EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *) Packet;
|
||||
Status = ScsiIoDevice->ExtScsiPassThru->PassThru (
|
||||
ScsiIoDevice->ExtScsiPassThru,
|
||||
Target,
|
||||
ScsiIoDevice->Lun,
|
||||
ExtRequestPacket,
|
||||
Event
|
||||
);
|
||||
|
||||
if (((ScsiIoDevice->ExtScsiPassThru->Mode->Attributes & EFI_SCSI_PASS_THRU_ATTRIBUTES_NONBLOCKIO) != 0) && (Event != NULL)) {
|
||||
Status = ScsiIoDevice->ExtScsiPassThru->PassThru (
|
||||
ScsiIoDevice->ExtScsiPassThru,
|
||||
Target,
|
||||
ScsiIoDevice->Lun,
|
||||
ExtRequestPacket,
|
||||
Event
|
||||
);
|
||||
} else {
|
||||
//
|
||||
// If there's no event or the SCSI Device doesn't support NON-BLOCKING,
|
||||
// let the 'Event' parameter for PassThru() be NULL.
|
||||
//
|
||||
Status = ScsiIoDevice->ExtScsiPassThru->PassThru (
|
||||
ScsiIoDevice->ExtScsiPassThru,
|
||||
Target,
|
||||
ScsiIoDevice->Lun,
|
||||
ExtRequestPacket,
|
||||
NULL
|
||||
);
|
||||
if (Event != NULL) {
|
||||
//
|
||||
// Signal Event to tell caller to pick up the SCSI IO Packet.
|
||||
//
|
||||
gBS->SignalEvent (Event);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
||||
mWorkingBuffer = AllocatePool (sizeof(EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET));
|
||||
|
@ -1052,7 +1073,7 @@ ScsiExecuteSCSICommand (
|
|||
ScsiIoDevice->Pun.ScsiId.Scsi,
|
||||
ScsiIoDevice->Lun,
|
||||
mWorkingBuffer,
|
||||
Event
|
||||
NULL
|
||||
);
|
||||
if (EFI_ERROR(Status)) {
|
||||
FreePool(mWorkingBuffer);
|
||||
|
@ -1065,6 +1086,13 @@ ScsiExecuteSCSICommand (
|
|||
// free mWorkingBuffer.
|
||||
//
|
||||
FreePool(mWorkingBuffer);
|
||||
|
||||
//
|
||||
// Signal Event to tell caller to pick up the SCSI IO Packet.
|
||||
//
|
||||
if (Event != NULL) {
|
||||
gBS->SignalEvent (Event);
|
||||
}
|
||||
}
|
||||
}
|
||||
return Status;
|
||||
|
|
Loading…
Reference in New Issue