OvmfPkg/VirtioScsiDxe: add helper to create a fake host adapter error

When virtio request fails we return EFI_DEVICE_ERROR, as per the spec
EFI_EXT_SCSI_PASS_THRU_PROTOCOL.PassThru() member function is required
to implement elaborated error reporting.

The patch refactors out entire block of the code that creates the host
adapter error into a separate helper function (ReportHostAdapterError).

Suggested-by: Laszlo Ersek <lersek@redhat.com>
Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Cc: Jordan Justen <jordan.l.justen@intel.com>
Cc: Tom Lendacky <thomas.lendacky@amd.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Brijesh Singh <brijesh.singh@amd.com>
[lersek@redhat.com: fix style & typo in ReportHostAdapterError() comment]
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Regression-tested-by: Laszlo Ersek <lersek@redhat.com>
Tested-by: Laszlo Ersek <lersek@redhat.com>
This commit is contained in:
Brijesh Singh 2017-08-31 10:25:27 -04:00 committed by Laszlo Ersek
parent fc2168feb2
commit 1b15eb06c7
1 changed files with 33 additions and 7 deletions

View File

@ -97,7 +97,7 @@
// set some fields in the EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET in/out // set some fields in the EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET in/out
// parameter on return. The following is a full list of those fields, for // parameter on return. The following is a full list of those fields, for
// easier validation of PopulateRequest(), ParseResponse(), and // easier validation of PopulateRequest(), ParseResponse(), and
// VirtioScsiPassThru() below. // ReportHostAdapterError() below.
// //
// - InTransferLength // - InTransferLength
// - OutTransferLength // - OutTransferLength
@ -388,6 +388,37 @@ ParseResponse (
} }
/**
The function can be used to create a fake host adapter error.
When VirtioScsiPassThru() is failed due to some reasons then this function
can be called to construct a host adapter error.
@param[out] Packet The Extended SCSI Pass Thru Protocol packet that the host
adapter error shall be placed in.
@retval EFI_DEVICE_ERROR The function returns this status code
unconditionally, to be propagated by
VirtioScsiPassThru().
**/
STATIC
EFI_STATUS
ReportHostAdapterError (
OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet
)
{
Packet->InTransferLength = 0;
Packet->OutTransferLength = 0;
Packet->HostAdapterStatus = EFI_EXT_SCSI_STATUS_HOST_ADAPTER_OTHER;
Packet->TargetStatus = EFI_EXT_SCSI_STATUS_TARGET_GOOD;
Packet->SenseDataLength = 0;
return EFI_DEVICE_ERROR;
}
// //
// The next seven functions implement EFI_EXT_SCSI_PASS_THRU_PROTOCOL // The next seven functions implement EFI_EXT_SCSI_PASS_THRU_PROTOCOL
// for the virtio-scsi HBA. Refer to UEFI Spec 2.3.1 + Errata C, sections // for the virtio-scsi HBA. Refer to UEFI Spec 2.3.1 + Errata C, sections
@ -472,12 +503,7 @@ VirtioScsiPassThru (
// //
if (VirtioFlush (Dev->VirtIo, VIRTIO_SCSI_REQUEST_QUEUE, &Dev->Ring, if (VirtioFlush (Dev->VirtIo, VIRTIO_SCSI_REQUEST_QUEUE, &Dev->Ring,
&Indices, NULL) != EFI_SUCCESS) { &Indices, NULL) != EFI_SUCCESS) {
Packet->InTransferLength = 0; return ReportHostAdapterError (Packet);
Packet->OutTransferLength = 0;
Packet->HostAdapterStatus = EFI_EXT_SCSI_STATUS_HOST_ADAPTER_OTHER;
Packet->TargetStatus = EFI_EXT_SCSI_STATUS_TARGET_GOOD;
Packet->SenseDataLength = 0;
return EFI_DEVICE_ERROR;
} }
return ParseResponse (Packet, &Response); return ParseResponse (Packet, &Response);