/** @file\r
- Copyright (c) 2006 - 2007 Intel Corporation. <BR>\r
+ Copyright (c) 2006 - 2008, Intel Corporation.<BR>\r
All rights reserved. This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
which accompanies this distribution. The full text of the license may be found at\r
\r
**/\r
\r
-#include "idebus.h"\r
+#include "IdeBus.h"\r
\r
/**\r
Sends out an ATA Identify Command to the specified device.\r
// the ATA Identify command\r
//\r
AtaIdentifyPointer = (EFI_IDENTIFY_DATA *) AllocateZeroPool (sizeof (EFI_IDENTIFY_DATA));\r
+ if (AtaIdentifyPointer == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
\r
//\r
// use ATA PIO Data In protocol to send ATA Identify command\r
//\r
if (!EFI_ERROR (Status)) {\r
\r
- IdeDev->pIdData = AtaIdentifyPointer;\r
+ IdeDev->IdData = AtaIdentifyPointer;\r
\r
//\r
// Print ATA Module Name\r
//\r
// Make sure the pIdData will not be freed again.\r
//\r
- IdeDev->pIdData = NULL;\r
+ IdeDev->IdData = NULL;\r
\r
return EFI_DEVICE_ERROR;\r
}\r
EFI_LBA Capacity;\r
EFI_IDENTIFY_DATA *Atapi6IdentifyStruct;\r
\r
- if (IdeDev->pIdData == NULL) {\r
+ if (IdeDev->IdData == NULL) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- Atapi6IdentifyStruct = IdeDev->pIdData;\r
+ Atapi6IdentifyStruct = IdeDev->IdData;\r
\r
if ((Atapi6IdentifyStruct->AtapiData.cmd_set_support_83 & (BIT15 | BIT14)) != 0x4000) {\r
//\r
IN IDE_BLK_IO_DEV *IdeDev\r
)\r
{\r
- if (IdeDev->pIdData == NULL) {\r
+ if (IdeDev->IdData == NULL) {\r
return ;\r
}\r
\r
- SwapStringChars (IdeDev->ModelName, IdeDev->pIdData->AtaData.ModelName, 40);\r
+ SwapStringChars (IdeDev->ModelName, IdeDev->IdData->AtaData.ModelName, 40);\r
IdeDev->ModelName[40] = 0x00;\r
}\r
\r
\r
DEBUG_CODE_BEGIN ();\r
\r
- if (StatusRegister & ATA_STSREG_DWF) {\r
+ if ((StatusRegister & ATA_STSREG_DWF) != 0) {\r
DEBUG (\r
(EFI_D_BLKIO,\r
"CheckErrorStatus()-- %02x : Error : Write Fault\n",\r
);\r
}\r
\r
- if (StatusRegister & ATA_STSREG_CORR) {\r
+ if ((StatusRegister & ATA_STSREG_CORR) != 0) {\r
DEBUG (\r
(EFI_D_BLKIO,\r
"CheckErrorStatus()-- %02x : Error : Corrected Data\n",\r
);\r
}\r
\r
- if (StatusRegister & ATA_STSREG_ERR) {\r
+ if ((StatusRegister & ATA_STSREG_ERR) != 0) {\r
ErrorRegister = IDEReadPortB (IdeDev->PciIo, IdeDev->IoPort->Reg1.Error);\r
\r
- if (ErrorRegister & ATA_ERRREG_BBK) {\r
+ if ((ErrorRegister & ATA_ERRREG_BBK) != 0) {\r
DEBUG (\r
(EFI_D_BLKIO,\r
"CheckErrorStatus()-- %02x : Error : Bad Block Detected\n",\r
);\r
}\r
\r
- if (ErrorRegister & ATA_ERRREG_UNC) {\r
+ if ((ErrorRegister & ATA_ERRREG_UNC) != 0) {\r
DEBUG (\r
(EFI_D_BLKIO,\r
"CheckErrorStatus()-- %02x : Error : Uncorrectable Data\n",\r
);\r
}\r
\r
- if (ErrorRegister & ATA_ERRREG_MC) {\r
+ if ((ErrorRegister & ATA_ERRREG_MC) != 0) {\r
DEBUG (\r
(EFI_D_BLKIO,\r
"CheckErrorStatus()-- %02x : Error : Media Change\n",\r
);\r
}\r
\r
- if (ErrorRegister & ATA_ERRREG_ABRT) {\r
+ if ((ErrorRegister & ATA_ERRREG_ABRT) != 0) {\r
DEBUG (\r
(EFI_D_BLKIO,\r
"CheckErrorStatus()-- %02x : Error : Abort\n",\r
);\r
}\r
\r
- if (ErrorRegister & ATA_ERRREG_TK0NF) {\r
+ if ((ErrorRegister & ATA_ERRREG_TK0NF) != 0) {\r
DEBUG (\r
(EFI_D_BLKIO,\r
"CheckErrorStatus()-- %02x : Error : Track 0 Not Found\n",\r
);\r
}\r
\r
- if (ErrorRegister & ATA_ERRREG_AMNF) {\r
+ if ((ErrorRegister & ATA_ERRREG_AMNF) != 0) {\r
DEBUG (\r
(EFI_D_BLKIO,\r
"CheckErrorStatus()-- %02x : Error : Address Mark Not Found\n",\r
@param[in] *DataBuffer\r
A pointer to the source buffer for the data.\r
\r
- @param[in] Lba\r
+ @param[in] StartLba\r
The starting logical block address to write onto\r
the device media.\r
\r
@param[in] *IdeDev pointer pointing to IDE_BLK_IO_DEV data structure, used\r
to record all the information of the IDE device.\r
\r
- @param[in,out] *Buffer buffer contained data transferred from device to host.\r
+ @param[in, out] *Buffer buffer contained data transferred from device to host.\r
@param[in] ByteCount data size in byte unit of the buffer.\r
@param[in] AtaCommand value of the Command Register\r
@param[in] StartLba the start LBA of this transaction\r
//\r
// Detect if the device supports S.M.A.R.T.\r
//\r
- if ((IdeDev->pIdData->AtaData.command_set_supported_83 & 0xc000) != 0x4000) {\r
+ if ((IdeDev->IdData->AtaData.command_set_supported_83 & 0xc000) != 0x4000) {\r
//\r
// Data in word 82 is not valid (bit15 shall be zero and bit14 shall be to one)\r
//\r
return ;\r
} else {\r
- if ((IdeDev->pIdData->AtaData.command_set_supported_82 & 0x0001) != 0x0001) {\r
+ if ((IdeDev->IdData->AtaData.command_set_supported_82 & 0x0001) != 0x0001) {\r
//\r
// S.M.A.R.T is not supported by the device\r
//\r
// Detect if this feature is enabled\r
//\r
TmpAtaIdentifyPointer = (EFI_IDENTIFY_DATA *) AllocateZeroPool (sizeof (EFI_IDENTIFY_DATA));\r
+ if (TmpAtaIdentifyPointer == NULL) {\r
+ return;\r
+ }\r
\r
DeviceSelect = (UINT8) ((IdeDev->Device) << 4);\r
Status = AtaPioDataIn (\r
return ;\r
}\r
\r
+/**\r
+ Enable Long Physical Sector Feature for ATA device.\r
+\r
+ @param IdeDev The IDE device data\r
+\r
+ @retval EFI_SUCCESS The ATA device supports Long Physical Sector feature\r
+ and corresponding fields in BlockIo structure is updated.\r
+ @retval EFI_UNSUPPORTED The device is not ATA device or Long Physical Sector\r
+ feature is not supported.\r
+**/\r
+EFI_STATUS\r
+AtaEnableLongPhysicalSector (\r
+ IN IDE_BLK_IO_DEV *IdeDev\r
+ )\r
+{\r
+ EFI_ATA_IDENTIFY_DATA *AtaIdentifyData;\r
+ UINT16 PhyLogicSectorSupport;\r
+\r
+ ASSERT (IdeDev->IdData != NULL);\r
+ //\r
+ // Only valid for ATA device\r
+ //\r
+ AtaIdentifyData = (EFI_ATA_IDENTIFY_DATA *) &IdeDev->IdData->AtaData;\r
+ if ((AtaIdentifyData->config & 0x8000) != 0) {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+ PhyLogicSectorSupport = AtaIdentifyData->phy_logic_sector_support;\r
+ //\r
+ // Check whether Long Physical Sector Feature is supported\r
+ //\r
+ if ((PhyLogicSectorSupport & 0xc000) == 0x4000) {\r
+ IdeDev->BlkIo.Media->LogicalBlocksPerPhysicalBlock = 1;\r
+ IdeDev->BlkIo.Media->LowestAlignedLba = 0;\r
+ //\r
+ // Check whether one physical block contains multiple physical blocks\r
+ //\r
+ if ((PhyLogicSectorSupport & 0x2000) != 0) {\r
+ IdeDev->BlkIo.Media->LogicalBlocksPerPhysicalBlock =\r
+ (UINT32) (1 << (PhyLogicSectorSupport & 0x000f));\r
+ //\r
+ // Check lowest alignment of logical blocks within physical block\r
+ //\r
+ if ((AtaIdentifyData->alignment_logic_in_phy_blocks & 0xc000) == 0x4000) {\r
+ IdeDev->BlkIo.Media->LowestAlignedLba =\r
+ (EFI_LBA) (AtaIdentifyData->alignment_logic_in_phy_blocks & 0x3fff);\r
+ }\r
+ }\r
+ //\r
+ // Check logical block size\r
+ //\r
+ IdeDev->BlkIo.Media->BlockSize = 0x200;\r
+ if ((PhyLogicSectorSupport & 0x1000) != 0) {\r
+ IdeDev->BlkIo.Media->BlockSize = (UINT32) (\r
+ ((AtaIdentifyData->logic_sector_size_hi << 16) |\r
+ AtaIdentifyData->logic_sector_size_lo) * sizeof (UINT16)\r
+ );\r
+ }\r
+ return EFI_SUCCESS;\r
+ } else {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+}\r
+\r
+\r
/**\r
Send ATA Ext command into device with NON_DATA protocol\r
\r
@param LbaAddress The LBA address in 48-bit mode\r
\r
@retval EFI_SUCCESS Reading succeed\r
- @retval EFI_DEVICE_ERROR Error executing commands on this device\r
+ @retval EFI_DEVICE_ERROR Error executing commands on this device.\r
\r
**/\r
EFI_STATUS\r
@param LbaAddress The LBA address in 48-bit mode\r
\r
@retval EFI_SUCCESS Reading succeed\r
- @retval EFI_DEVICE_ERROR Error executing commands on this device\r
+ @retval EFI_DEVICE_ERROR Error executing commands on this device.\r
\r
**/\r
EFI_STATUS\r
);\r
\r
if (UdmaOp == AtaUdmaReadExtOp || UdmaOp == AtaUdmaReadOp) {\r
- RegisterValue |= BMIC_nREAD;\r
+ RegisterValue |= BMIC_NREAD;\r
} else {\r
- RegisterValue &= ~((UINT8) BMIC_nREAD);\r
+ RegisterValue &= ~((UINT8) BMIC_NREAD);\r
}\r
\r
IdeDev->PciIo->Io.Write (\r
1,\r
&RegisterValue\r
);\r
- if ((RegisterValue & (BMIS_INTERRUPT | BMIS_ERROR)) || (Count == 0)) {\r
- if ((RegisterValue & BMIS_ERROR) || (Count == 0)) {\r
+ if (((RegisterValue & (BMIS_INTERRUPT | BMIS_ERROR)) != 0) || (Count == 0)) {\r
+ if (((RegisterValue & BMIS_ERROR) != 0) || (Count == 0)) {\r
Status = EFI_DEVICE_ERROR;\r
break;\r
}\r
&RegisterValue\r
);\r
\r
- if (RegisterValue & BMIS_ERROR) {\r
+ if ((RegisterValue & BMIS_ERROR) != 0) {\r
return EFI_DEVICE_ERROR;\r
}\r
\r