Acidanthera UEFI Development Kit based on EDK II edk2-stable202311
Go to file
Laszlo Ersek 0368497524 MdeModulePkg/.../IdeMode: report early finish of packet read as success
SVN r19611 (git commit 7cac240163), "MdeModulePkg/Ide: return correct
status when DRQ is not ready for ATAPI", changed the behavior of
AtaPacketReadWrite(), when DRQReady2() reported an error. The previous
logic had been to:

(a) terminate the transfer loop,
(b) check the status register with CheckStatusRegister(), and determine
    AtaPacketReadWrite()'s return code directly from that.

Action (a) had been correct, but action (b) had masked genuine errors.

For example, when DRQReady2() reported EFI_TIMEOUT -- because the BSY bit
had not been cleared within the allotted time --, CheckStatusRegister()
would report EFI_SUCCESS, simply *because* BSY was still set, and the rest
of the status bits could not be evaluated.

SVN r19611 (git commit 7cac240163) intended to fix action (b) by directly
propagating the error code of DRQReady2() from AtaPacketReadWrite(),
eliminating the CheckStatusRegister() call. This was the right thing for
most of the errors reported by DRQReady2() -- timeout, command abort,
other device error --, but there was one exception: the "read" sub-case of
EFI_NOT_READY, which stands for "'read' complete, with less data available
than the requested amount".

Regarding the "write" sub-case of EFI_NOT_READY: the
AtaPacketCommandExecute() function programs the full transfer length into
the IDE device before it calls AtaPacketReadWrite(), and
AtaPacketReadWrite() only uses CylinderLsb and CylinderMsb for "chunking"
(as requested by the device). Therefore the device cannot justifiedly
clear DRQ earlier than seeing the entire data, when writing.

However, when reading from the device, a "short read" is a successful
operation. (The actual read length will be decoded by the higher level
protocols.) And "short reads" had been handled correctly by the logic
before git 7cac240163. Namely, when DRQReady2() returns EFI_NOT_READY, the
BSY bit is already clear, and we can call CheckStatusRegister() to
investigate all the other bits it cares about.

Therefore restore the logic from before git 7cac240163, but only for the
"read" sub-case of EFI_NOT_READY.

This problem was encountered with OVMF running on QEMU's i440fx IDE
emulation. Many thanks to John Snow for analyzing QEMU's behavior, and
pointing out that it adhered to the relevant specs.

Cc: Feng Tian <feng.tian@intel.com>
Cc: Star Zeng <star.zeng@intel.com>
Cc: John Snow <jsnow@redhat.com>
Reference: https://github.com/tianocore/edk2/issues/43
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Feng Tian <feng.tian@intel.com>

git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@19685 6f19259b-4bc3-4df7-8a09-765794883524
2016-01-19 10:46:39 +00:00
AppPkg AppPkg/.../Python: Clean up and document how to escape the -# option. 2016-01-06 01:00:19 +00:00
ArmPkg ArmPkg/ArmSoftfloatLib: add missing entry points for RVCT 2015-12-17 16:29:23 +00:00
ArmPlatformPkg ArmVExpressPkg/ArmVExpress-FVP-AArch64: run GICv3 in v3 mode 2015-12-15 13:08:56 +00:00
ArmVirtPkg ArmVirtPkg/ArmVirtXen: add ARM support 2015-12-17 17:11:33 +00:00
BaseTools BaseTools: VPD Tool to allocate VPD region be aligned based on value type 2016-01-18 01:47:50 +00:00
BeagleBoardPkg BeagleBoardPkg: remove ArmPlatformGlobalVariableLib resolution 2015-11-27 17:05:24 +00:00
Conf EDK II: Add .gitignore 2014-10-14 16:08:15 +00:00
CorebootModulePkg CorebootModulePkg:Removing EFI_RESOURCE_ATTRIBUTE_TESTED 2015-08-18 16:08:22 +00:00
CorebootPayloadPkg CorebootPayloadPkg PlatformHookLib: Fix GCC build failure 2015-11-30 21:11:29 +00:00
CryptoPkg CryptoPkg: Add NOOPT target in CryptoPkg.dsc 2016-01-19 04:04:54 +00:00
DuetPkg DuetPkg: Fix GCC error to avoid the duplicated global variable in SmbiosGenDxe 2015-12-18 02:29:12 +00:00
EdkCompatibilityPkg EdkCompatibilityPkg: Fix wrong guid value of gEfiManagedNetworkProtocolGuid 2016-01-18 03:03:19 +00:00
EdkShellBinPkg */Contributions.txt: Update example email address 2015-02-03 17:29:14 +00:00
EdkShellPkg */Contributions.txt: Update example email address 2015-02-03 17:29:14 +00:00
EmbeddedPkg EmbeddedPkg: Convert all .uni files to utf-8 2015-12-15 04:51:40 +00:00
EmulatorPkg EmulatorPkg: Convert all .uni files to utf-8 2015-12-15 04:51:49 +00:00
FatBinPkg FatBinPkg: Update EBC/IA32/X64/IPF binaries 2015-08-28 03:14:25 +00:00
IntelFrameworkModulePkg IntelFrameworkModulePkg: Add NOOPT target in IntelFrameworkModulePkg.dsc 2016-01-19 04:05:12 +00:00
IntelFrameworkPkg IntelFrameworkPkg: Add NOOPT target in IntelFrameworkPkg.dsc 2016-01-19 04:05:29 +00:00
IntelFspPkg Handle extra module patchable PCD variable in Linux map. 2015-09-06 22:36:43 +00:00
IntelFspWrapperPkg Fix >4G issue on IDT not restored correctly. 2015-12-15 04:27:00 +00:00
MdeModulePkg MdeModulePkg/.../IdeMode: report early finish of packet read as success 2016-01-19 10:46:39 +00:00
MdePkg MdePkg: Add NOOPT target in MdePkg.dsc 2016-01-19 04:06:07 +00:00
NetworkPkg NetworkPkg: Add NOOPT target in NetworkPkg.dsc 2016-01-19 04:06:24 +00:00
Nt32Pkg Nt32Pkg:Modify the dsc file because of the rename action 2016-01-19 03:31:34 +00:00
Omap35xxPkg Omap35xxPkg SerialPortLib: Implement Get(Set)Control/SetAttributes 2015-11-26 08:49:53 +00:00
OptionRomPkg OptionRomPkg: Remove redundant included header file defintion in Ax88772.h and Ax88772b.h files 2015-07-08 02:56:54 +00:00
OvmfPkg OvmfPkg: execute option ROM images regardless of Secure Boot 2016-01-07 18:48:17 +00:00
PcAtChipsetPkg PcAtChipsetPkg: Add NOOPT target in PcAtChipsetPkg.dsc 2016-01-19 04:06:42 +00:00
PerformancePkg PerformancePkg Dp_App: Use Image->FilePath to get name for SMM drivers 2016-01-19 09:19:28 +00:00
QuarkPlatformPkg QuarkPlatformPkg/PlatformSecureLib: Remove redundant GPIO expander config 2016-01-07 22:43:31 +00:00
QuarkSocPkg QuarkSocPkg: Remove X64 from SUPPORTED_ARCHITECTURES 2016-01-07 21:52:53 +00:00
SecurityPkg SecurityPkg: Add NOOPT target in SecurityPkg.dsc 2016-01-19 04:07:17 +00:00
ShellBinPkg ShellBinPkg: Ia32/X64 Shell binary update. 2015-12-25 04:20:28 +00:00
ShellPkg ShellPkg UefiDpLib: Use Image->FilePath to get name for SMM drivers 2016-01-19 09:19:37 +00:00
SourceLevelDebugPkg SourceLevelDebugPkg: Add NOOPT target in SourceLevelDebugPkg.dsc 2016-01-19 04:07:52 +00:00
StdLib StdLib: Fix compilation errors caused by previous commit of daConsole.c 2016-01-10 21:23:51 +00:00
StdLibPrivateInternalFiles StdLib: Clarify and improve comments. 2016-01-06 00:31:42 +00:00
UefiCpuPkg UefiCpuPkg: Add NOOPT target in UefiCpuPkg.dsc 2016-01-19 04:08:09 +00:00
UnixPkg UnixPkg: Remove UnixPkg files (It is replaced by EmulatorPkg) 2013-07-29 21:09:55 +00:00
Vlv2DeviceRefCodePkg Vlv2TbltDevicePkg/Vlv2DeviceRefCodePkg: 2015-11-10 07:47:29 +00:00
Vlv2TbltDevicePkg Vlv2TbltDevicePkg: Convert all .uni files to utf-8 2015-12-15 04:59:37 +00:00
.gitignore EDK II: Add .gitignore 2014-10-14 16:08:15 +00:00
BuildNotes2.txt Update to new SVN URL in readme.txt 2013-06-08 05:26:39 +00:00
Edk2Setup.bat BaseTools: Update Edk2Setup.bat to support multiple workspaces 2015-10-08 09:29:36 +00:00
Maintainers.txt Maintainers.txt: Update maintainers for Quark*Pkg 2015-12-17 07:33:33 +00:00
edksetup.bat BaseTools: Add VS2015 tool chain in tools_def.template 2015-12-03 03:19:01 +00:00
edksetup.sh BaseTools: Update edksetup.sh to support multiple workspaces 2015-10-08 09:29:56 +00:00