mirror of https://github.com/acidanthera/audk.git
MdeModulePkg AtaBusDxe: Fix ATA commands cannot be sent to some devices
If there is no port multiplier (PortMultiplierPort = 0xFFFF), current code in functions TransferAtaDevice() and TrustTransferAtaDevice() will always set the DEV bit of the ATA device register. It causes that ATA commands cannot be sent to some ATA hard drives. Cc: Feng Tian <feng.tian@intel.com> 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>
This commit is contained in:
parent
bd907fb638
commit
4c33f8b190
|
@ -10,7 +10,7 @@
|
||||||
for Security Protocol Specific layout. This implementation uses big endian for
|
for Security Protocol Specific layout. This implementation uses big endian for
|
||||||
Cylinder register.
|
Cylinder register.
|
||||||
|
|
||||||
Copyright (c) 2009 - 2013, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2009 - 2016, Intel Corporation. All rights reserved.<BR>
|
||||||
(C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
|
(C) Copyright 2016 Hewlett Packard Enterprise Development LP<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
|
||||||
|
@ -495,7 +495,7 @@ TransferAtaDevice (
|
||||||
Acb->AtaSectorNumber = (UINT8) StartLba;
|
Acb->AtaSectorNumber = (UINT8) StartLba;
|
||||||
Acb->AtaCylinderLow = (UINT8) RShiftU64 (StartLba, 8);
|
Acb->AtaCylinderLow = (UINT8) RShiftU64 (StartLba, 8);
|
||||||
Acb->AtaCylinderHigh = (UINT8) RShiftU64 (StartLba, 16);
|
Acb->AtaCylinderHigh = (UINT8) RShiftU64 (StartLba, 16);
|
||||||
Acb->AtaDeviceHead = (UINT8) (BIT7 | BIT6 | BIT5 | (AtaDevice->PortMultiplierPort << 4));
|
Acb->AtaDeviceHead = (UINT8) (BIT7 | BIT6 | BIT5 | (AtaDevice->PortMultiplierPort == 0xFFFF ? 0 : (AtaDevice->PortMultiplierPort << 4)));
|
||||||
Acb->AtaSectorCount = (UINT8) TransferLength;
|
Acb->AtaSectorCount = (UINT8) TransferLength;
|
||||||
if (AtaDevice->Lba48Bit) {
|
if (AtaDevice->Lba48Bit) {
|
||||||
Acb->AtaSectorNumberExp = (UINT8) RShiftU64 (StartLba, 24);
|
Acb->AtaSectorNumberExp = (UINT8) RShiftU64 (StartLba, 24);
|
||||||
|
@ -1027,7 +1027,7 @@ TrustTransferAtaDevice (
|
||||||
//
|
//
|
||||||
Acb->AtaCylinderHigh = (UINT8) SecurityProtocolSpecificData;
|
Acb->AtaCylinderHigh = (UINT8) SecurityProtocolSpecificData;
|
||||||
Acb->AtaCylinderLow = (UINT8) (SecurityProtocolSpecificData >> 8);
|
Acb->AtaCylinderLow = (UINT8) (SecurityProtocolSpecificData >> 8);
|
||||||
Acb->AtaDeviceHead = (UINT8) (BIT7 | BIT6 | BIT5 | (AtaDevice->PortMultiplierPort << 4));
|
Acb->AtaDeviceHead = (UINT8) (BIT7 | BIT6 | BIT5 | (AtaDevice->PortMultiplierPort == 0xFFFF ? 0 : (AtaDevice->PortMultiplierPort << 4)));
|
||||||
|
|
||||||
//
|
//
|
||||||
// Prepare for ATA pass through packet.
|
// Prepare for ATA pass through packet.
|
||||||
|
|
Loading…
Reference in New Issue