📄 mvialcommonutils.c
字号:
/*******************************************************************************
* (c), Copyright 2001, Marvell International Ltd. *
* THIS CODE CONTAINS CONFIDENTIAL INFORMATION OF MARVELL SEMICONDUCTOR, INC. *
* NO RIGHTS ARE GRANTED HEREIN UNDER ANY PATENT, MASK WORK RIGHT OR COPYRIGHT *
* OF MARVELL OR ANY THIRD PARTY. MARVELL RESERVES THE RIGHT AT ITS SOLE *
* DISCRETION TO REQUEST THAT THIS CODE BE IMMEDIATELY RETURNED TO MARVELL. *
* THIS CODE IS PROVIDED "AS IS". MARVELL MAKES NO WARRANTIES, EXPRESSED, *
* IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, COMPLETENESS OR PERFORMANCE. *
********************************************************************************
* mvIALCommon.c
*
* DESCRIPTION:
* C implementation for IAL's common functions.
*
* DEPENDENCIES:
* mvIALCommon.h.
*
*******************************************************************************/
/* includes */
#include "mvOs.h"
#include "mvIALCommonUtils.h"
static MV_BOOLEAN mvConfigSataDisk(MV_SATA_ADAPTER *pSataAdapter,
MV_U8 channelIndex,
MV_U8 PMPort,
ATA_IDENTIFY_INFO *pIdentifyInfo,
MV_U16_PTR identifyBuffer);
static MV_VOID mvAta2HostString(MV_U16 *source, MV_U16 *target,
MV_U32 wordsCount)
{
MV_U32 i;
for (i=0 ; i < wordsCount; i++)
{
/* Big to little*/
target[i] = (source[i] >> 8) | ((source[i] & 0xff) << 8);
/* Little to cpu*/
target[i] = MV_LE16_TO_CPU(target[i]);
}
}
/******************************************************************************
* Name: ParseIdentifyResult
*
* Description: this functions parses the identify command results, checks
* that the connected deives can be accesed by device EDMA,
* and updates the ATA drive parameters stucture accordingly.
*
* Parameters: pSataChannel - pointer to the channel data structure.
* pIdentifyInfo- pointer to the ATA parameters structure.
*
* Returns: MV_TRUE if the ATA drive supported by device.
*
******************************************************************************/
MV_BOOLEAN mvParseIdentifyResult(MV_U16_PTR iden,
ATA_IDENTIFY_INFO *pIdentifyInfo)
{
char temp[80];
MV_U32 version;
MV_BOOLEAN udmaModeEnabled = MV_FALSE;
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "Parse IDENTIFY data:\n");
mvAta2HostString( iden + IDEN_MODEL_OFFSET, (MV_U16_PTR)temp, 24);
temp[25] = '\0';
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "%25s - %s\n","Model", temp);
memcpy(&pIdentifyInfo->model[0], iden + IDEN_MODEL_OFFSET, IDEN_MODEL_SIZE * 2);
memcpy(&pIdentifyInfo->firmware[0], iden + IDEN_FIRMWARE_OFFSET,
IDEN_FIRMWARE_SIZE * 2);
/* ATA version supported*/
if (iden[IDEN_ATA_VERSION] & MV_BIT7)
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "%25s - %d\n", "ATA version supported", 7);
version = 7;
}
else if (iden[IDEN_ATA_VERSION] & MV_BIT6)
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "%25s - %d\n", "ATA version supported", 6);
version = 6;
}
else if (iden[IDEN_ATA_VERSION] & MV_BIT5)
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "%25s - %d\n", "ATA version supported", 5);
version = 5;
}
else if (iden[IDEN_ATA_VERSION] & MV_BIT4)
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "%25s - %d\n", "ATA version supported", 4);
version = 4;
}
else
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, " IDENTIFY info: ATA "
"version(%d) not supported\n", iden[IDEN_ATA_VERSION]);
return MV_FALSE;
}
pIdentifyInfo->version = version;
/*LBA addressing*/
if ((version >= 6) && (!(iden[IDEN_CAPACITY_1_OFFSET] & MV_BIT9)))
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, " IDENTIFY info: LBA not supported\n");
return MV_FALSE;
}
else
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "%25s - %s\n", "Capabilities",
"LBA supported");
}
/* 48 bit address */
if ((version >= 6) && (iden[IDEN_SUPPORTED_COMMANDS2] & MV_BIT10))
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "%25s - %s\n", "LBA48 addressing", "supported");
pIdentifyInfo->LBA48Supported = MV_TRUE;
if ((iden[103]) || (iden[102]))
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, "WARNING Disk size more "
"than 32 bit sectors - setting to 0xffffffff sectors\n");
pIdentifyInfo->ATADiskSize = 0xffffffff;
}
else
{
pIdentifyInfo->ATADiskSize = ((MV_U32)iden[101] << 16) |
((MV_U32)iden[100]);
}
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "%25s - 0x%x%04x%04x%04x sectors\n",
"Number of sectors", iden[103] , iden[102], iden[101],
iden[100]);
}
else
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "%25s - %s\n",
"LBA48 addressing", "Not supported");
pIdentifyInfo->LBA48Supported = MV_FALSE;
pIdentifyInfo->ATADiskSize = ((MV_U32)iden[IDEN_NUM_OF_ADDRESSABLE_SECTORS + 1] << 16) |
((MV_U32)iden[IDEN_NUM_OF_ADDRESSABLE_SECTORS]);
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "%25s - 0x%x sectors\n",
"Number of sectors",
(iden[IDEN_NUM_OF_ADDRESSABLE_SECTORS + 1] << 16) |
((MV_U32)iden[IDEN_NUM_OF_ADDRESSABLE_SECTORS]));
}
/*DMA support*/
if ((version >= 6) && (!(iden[IDEN_CAPACITY_1_OFFSET] & MV_BIT8)))
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, "IDENTIFY info: DMA not "
"supported\n");
return MV_FALSE;
}
else
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "%25s - %s\n", "Capabilities",
"DMA supported");
}
/* PIO */
if ((iden[IDEN_VALID] & MV_BIT1) == 0)
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, " IDENTIFY info: not "
"able to find PIO mode\n");
return MV_FALSE;
}
else if (iden[IDEN_PIO_MODE_SPPORTED] & MV_BIT0)
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "%25s - %s\n", "PIO mode 3",
"supported");
pIdentifyInfo->PIOMode = MV_ATA_TRANSFER_PIO_3;
}
else if (iden[IDEN_PIO_MODE_SPPORTED] & MV_BIT1)
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "%25s - %s\n", "PIO mode 4",
"supported");
pIdentifyInfo->PIOMode = MV_ATA_TRANSFER_PIO_4;
}
else
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, "IDENTIFY info: PIO "
"modes 3 and 4 not supported\n");
pIdentifyInfo->PIOMode = MV_ATA_TRANSFER_PIO_SLOW;
return MV_FALSE;
}
/*UDMA*/
if ((iden[IDEN_VALID] & MV_BIT2) == 0)
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, " IDENTIFY info: not "
"able to find UDMA mode\n");
return MV_FALSE;
}
if ((version >= 7) && (iden[IDEN_UDMA_MODE] & MV_BIT6))
{
pIdentifyInfo->UdmaMode = MV_ATA_TRANSFER_UDMA_6;
if (iden[IDEN_UDMA_MODE] & MV_BIT14)
{
udmaModeEnabled = MV_TRUE;
}
}
else if ((version >= 6) && (iden[IDEN_UDMA_MODE] & MV_BIT5))
{
pIdentifyInfo->UdmaMode = MV_ATA_TRANSFER_UDMA_5;
if (iden[IDEN_UDMA_MODE] & MV_BIT13)
{
udmaModeEnabled = MV_TRUE;
}
}
else if ((version >= 5) && (iden[IDEN_UDMA_MODE] & MV_BIT4))
{
pIdentifyInfo->UdmaMode = MV_ATA_TRANSFER_UDMA_4;
if (iden[IDEN_UDMA_MODE] & MV_BIT12)
{
udmaModeEnabled = MV_TRUE;
}
}
else if ((version >= 4) && (iden[IDEN_UDMA_MODE] & MV_BIT3))
{
pIdentifyInfo->UdmaMode = MV_ATA_TRANSFER_UDMA_3;
if (iden[IDEN_UDMA_MODE] & MV_BIT11)
{
udmaModeEnabled = MV_TRUE;
}
}
else if (iden[IDEN_UDMA_MODE] & MV_BIT2)
{
pIdentifyInfo->UdmaMode = MV_ATA_TRANSFER_UDMA_2;
if (iden[IDEN_UDMA_MODE] & MV_BIT10)
{
udmaModeEnabled = MV_TRUE;
}
}
else
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, "IDENTIFY info: Ultra"
" DMA mode < 2 not supported IDENTIFY[88] 0x%04x\n",
iden[IDEN_UDMA_MODE]);
pIdentifyInfo->UdmaMode = MV_ATA_TRANSFER_UDMA_0;
return MV_FALSE;
}
if (udmaModeEnabled == MV_TRUE)
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "%25s - %s%d%s\n",
"Ultra DMA mode","UDMA mode ",
pIdentifyInfo->UdmaMode - MV_ATA_TRANSFER_UDMA_0,
" supported and enabled");
}
else
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "%25s - %s%d%s\n",
"Ultra DMA mode","UDMA mode ",
pIdentifyInfo->UdmaMode - MV_ATA_TRANSFER_UDMA_0,
" supported but disabled");
}
if ((iden[IDEN_SUPPORTED_COMMANDS1] & MV_BIT13))
{
if (iden[IDEN_ENABLED_COMMANDS1] & MV_BIT13)
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "%25s - %20s\n",
"READ BUFFER", "supported and enabled");
}
else
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "%25s - %20s\n",
"READ BUFFER", "supported and disabled");
}
}
else
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "%25s - %s\n", "READ BUFFER",
" Not supported");
}
if ((iden[IDEN_SUPPORTED_COMMANDS1] & MV_BIT12))
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -