mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-27 07:34:06 +02:00
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
|
SCSI Bus driver that layers on every SCSI Pass Thru and
|
||||||
Extended SCSI Pass Thru protocol in the system.
|
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
|
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
|
||||||
@ -986,13 +986,34 @@ ScsiExecuteSCSICommand (
|
|||||||
|
|
||||||
if (ScsiIoDevice->ExtScsiSupport) {
|
if (ScsiIoDevice->ExtScsiSupport) {
|
||||||
ExtRequestPacket = (EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *) Packet;
|
ExtRequestPacket = (EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *) Packet;
|
||||||
Status = ScsiIoDevice->ExtScsiPassThru->PassThru (
|
|
||||||
ScsiIoDevice->ExtScsiPassThru,
|
if (((ScsiIoDevice->ExtScsiPassThru->Mode->Attributes & EFI_SCSI_PASS_THRU_ATTRIBUTES_NONBLOCKIO) != 0) && (Event != NULL)) {
|
||||||
Target,
|
Status = ScsiIoDevice->ExtScsiPassThru->PassThru (
|
||||||
ScsiIoDevice->Lun,
|
ScsiIoDevice->ExtScsiPassThru,
|
||||||
ExtRequestPacket,
|
Target,
|
||||||
Event
|
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 {
|
} else {
|
||||||
|
|
||||||
mWorkingBuffer = AllocatePool (sizeof(EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET));
|
mWorkingBuffer = AllocatePool (sizeof(EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET));
|
||||||
@ -1052,7 +1073,7 @@ ScsiExecuteSCSICommand (
|
|||||||
ScsiIoDevice->Pun.ScsiId.Scsi,
|
ScsiIoDevice->Pun.ScsiId.Scsi,
|
||||||
ScsiIoDevice->Lun,
|
ScsiIoDevice->Lun,
|
||||||
mWorkingBuffer,
|
mWorkingBuffer,
|
||||||
Event
|
NULL
|
||||||
);
|
);
|
||||||
if (EFI_ERROR(Status)) {
|
if (EFI_ERROR(Status)) {
|
||||||
FreePool(mWorkingBuffer);
|
FreePool(mWorkingBuffer);
|
||||||
@ -1065,6 +1086,13 @@ ScsiExecuteSCSICommand (
|
|||||||
// free mWorkingBuffer.
|
// free mWorkingBuffer.
|
||||||
//
|
//
|
||||||
FreePool(mWorkingBuffer);
|
FreePool(mWorkingBuffer);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Signal Event to tell caller to pick up the SCSI IO Packet.
|
||||||
|
//
|
||||||
|
if (Event != NULL) {
|
||||||
|
gBS->SignalEvent (Event);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return Status;
|
return Status;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user