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:
Hao Wu 2015-12-11 01:59:09 +00:00 committed by hwu1225
parent 0350b57cf7
commit 0d12e6a003
1 changed files with 37 additions and 9 deletions

View File

@ -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,6 +986,8 @@ ScsiExecuteSCSICommand (
if (ScsiIoDevice->ExtScsiSupport) {
ExtRequestPacket = (EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *) Packet;
if (((ScsiIoDevice->ExtScsiPassThru->Mode->Attributes & EFI_SCSI_PASS_THRU_ATTRIBUTES_NONBLOCKIO) != 0) && (Event != NULL)) {
Status = ScsiIoDevice->ExtScsiPassThru->PassThru (
ScsiIoDevice->ExtScsiPassThru,
Target,
@ -994,6 +996,25 @@ ScsiExecuteSCSICommand (
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;