MdeModulePkg/AtaAtapiPassThru: unmap DMA buffers after disabling BM DMA

In AtaAtapiPassThruStop(), if the device has been operating in AHCI mode,
we unmap the DMA buffers and then disable the device (including bus master
DMA). The order of these actions is wrong; we shouldn't unmap DMA buffers
until bus master DMA is turned off. Reverse the steps.

Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Cc: Brijesh Singh <brijesh.singh@amd.com>
Cc: Eric Dong <eric.dong@intel.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Star Zeng <star.zeng@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Jiewen Yao <jiewen.yao@intel.com>
Reviewed-by: Star Zeng <star.zeng@intel.com>
Reviewed-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
This commit is contained in:
Laszlo Ersek 2017-09-07 21:04:29 +02:00
parent eed3f71305
commit 509daa658b
1 changed files with 12 additions and 12 deletions

View File

@ -913,12 +913,22 @@ AtaAtapiPassThruStop (
// //
DestroyDeviceInfoList (Instance); DestroyDeviceInfoList (Instance);
PciIo = Instance->PciIo;
//
// Disable this ATA host controller.
//
PciIo->Attributes (
PciIo,
EfiPciIoAttributeOperationDisable,
Instance->EnabledPciAttributes,
NULL
);
// //
// If the current working mode is AHCI mode, then pre-allocated resource // If the current working mode is AHCI mode, then pre-allocated resource
// for AHCI initialization should be released. // for AHCI initialization should be released.
// //
PciIo = Instance->PciIo;
if (Instance->Mode == EfiAtaAhciMode) { if (Instance->Mode == EfiAtaAhciMode) {
AhciRegisters = &Instance->AhciRegisters; AhciRegisters = &Instance->AhciRegisters;
PciIo->Unmap ( PciIo->Unmap (
@ -950,16 +960,6 @@ AtaAtapiPassThruStop (
); );
} }
//
// Disable this ATA host controller.
//
PciIo->Attributes (
PciIo,
EfiPciIoAttributeOperationDisable,
Instance->EnabledPciAttributes,
NULL
);
// //
// Restore original PCI attributes // Restore original PCI attributes
// //