[edk2-devel] [PATCH v2 15/17] OvmfPkg/PvScsiDxe: Support sending SCSI request and receive response
Laszlo Ersek
lersek at redhat.com
Mon Mar 30 11:23:14 UTC 2020
On 03/28/20 20:18, Liran Alon wrote:
> Sorry for the spam but I think I eventually figured it out.
It's not spam; thank you for the thorough investigation!
> The call-chain in EDK2 looks like this:
> ScsiDiskWriteSectors() (MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDisk.c)
> ScsiDiskWrite16() (MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDisk.c)
> ScsiWrite16Command() (MdePkg/Library/UefiScsiLib/UefiScsiLib.c)
> ScsiExecuteSCSICommand() (MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBus.c)
> ExtScsiPassThru->PassThru()
>
> It can be seen that:
> * ScsiExecuteSCSICommand() just passes Packet to
> ExtScsiPassThru->PassThru() and returns it's return value.
> * ScsiWrite16Command() always updates DataLength with
> Packet->OutTransferLength and returns ScsiExecuteSCSICommand() return
> value.
> * In ScsiDiskWrite16():
> ** If EFI_BAD_BUFFER_SIZE is returned, NeedRetry is set to TRUE and
> EFI_DEVICE_ERROR is returned.
> ** Otherwise, if EFI_SUCCESS is returned but HostAdapterStatus is set
> to EFI_EXT_SCSI_STATUS_HOST_ADAPTER_DATA_OVERRUN_UNDERRUN, then again
> NeedRetry is set to TRUE and EFI_DEVICE_ERROR is returned.
> ** Otherwise, just return EFI_SUCCESS to caller.
> * In ScsiDiskWriteSectors() we finally see the logic we were looking for:
> ** If ScsiDiskWrite16() returned EFI_SUCCESS, then we break out of
> retry loop and indeed take into account ByteCount. (Which was updated
> from Packet->OutTransferLength).
> ** Otherwise, (e.g. EFI_BAD_BUFFER_SIZE was returned), if NeedRetry is
> set to TRUE, then next request retry is updated to be done with
> ByteCount (Which was updated from Packet->OutTransferLength).
>
> So it seems the UEFI-2.8 spec is right and a lot of EDK2 function
> documentation is out-of-date.
On a tangent... Since you mention ScsiDiskWriteSectors(), let me mention commit 5abc2a70da4f ("MdeModulePkg: ScsiDiskDxe: adapt SectorCount when shortening transfers", 2015-09-10), and the related mailing list discussion (this is what I referred to before, when I mentioned that Paolo had looked at the VirtioScsiDxe code twice -- this is the second occasion, from September 2015):
http://mid.mail-archive.com/1441390936-27763-1-git-send-email-lersek@redhat.com
> Therefore, I will update my code accordingly. i.e.:
> 1) Change PvScsi.c PopulateRequest() such that in case TransferLength is
> too big for DMA communication buffer Data field, we update
> TransferLength and return EFI_BAD_BUFFER_SIZE.
Sounds OK.
> But in addition, for completion, we should also set
> HostAdapterStatus to
> EFI_EXT_SCSI_STATUS_HOST_ADAPTER_DATA_OVERRUN_UNDERRUN and TargetStatus
> to EFI_EXT_SCSI_STATUS_TARGET_GOOD
> and SenseDataLength to 0 as done in VirtioScsi.c PopulateRequest()
> in case it returns EFI_BAD_BUFFER_SIZE.
OK, thanks.
> 2) Change PvScsi.c HandleResponse() such that:
> ** If device returned PvScsiBtStatDataUnderrun: Update TransferLength
> with Response->DataLen, set HostAdapterStatus to
> EFI_EXT_SCSI_STATUS_HOST_ADAPTER_DATA_OVERRUN_UNDERRUN and return
> EFI_SUCCESS.
OK.
> ** If device returned PvScsiBtStatDatarun: Just set HostAdapterStatus
> to EFI_EXT_SCSI_STATUS_HOST_ADAPTER_DATA_OVERRUN_UNDERRUN and return
> EFI_SUCCESS.
Again I'm not familiar with PvScsiBtStatDataUnderrun / PvScsiBtStatDatarun (let alone their differences); I'm OK with this too.
Thanks!
Laszlo
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#56623): https://edk2.groups.io/g/devel/message/56623
Mute This Topic: https://groups.io/mt/72544127/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-
More information about the edk2-devel-archive
mailing list