📄 mvialcommonutils.c
字号:
* None.
*
*******************************************************************************/
MV_BOOLEAN mvConfigSataDisk(MV_SATA_ADAPTER *pSataAdapter, MV_U8 channelIndex,
MV_U8 PMPort, ATA_IDENTIFY_INFO *pIdentifyInfo,
MV_U16_PTR identifyBuffer)
{
MV_STORAGE_DEVICE_REGISTERS inATARegs;
MV_STORAGE_DEVICE_REGISTERS outATARegs;
/* identify device*/
memset(&inATARegs, 0, sizeof(inATARegs));
inATARegs.commandRegister = MV_ATA_COMMAND_IDENTIFY;
if (mvStorageDevATAIdentifyDevice(pSataAdapter, channelIndex, PMPort,
identifyBuffer)
== MV_FALSE)
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR,"[%d %d %d]: failed "
"to perform ATA Identify command\n", pSataAdapter->adapterId,
channelIndex, PMPort);
return MV_FALSE;
}
#ifdef MV_LOG_DEBUG
mvLogMsg(MV_RAW_MSG_ID, 0, "Drive [%d,%d,%d] Identify Buffer:\n",
pSataAdapter->adapterId, channelIndex, PMPort);
printIdentifyBuffer(identifyBuffer);
#endif
if (mvParseIdentifyResult(identifyBuffer, pIdentifyInfo) == MV_FALSE)
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR,"[%d %d %d]: in "
"parsing ATA Identify Data\n", pSataAdapter->adapterId,
channelIndex, PMPort);
return MV_FALSE;
}
if ((pIdentifyInfo->writeCacheSupported == MV_TRUE) &&
(pIdentifyInfo->writeCacheEnabled == MV_FALSE))
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG,"[%d %d %d]: Write Cache "
"supported but disabled\n", pSataAdapter->adapterId,
channelIndex, PMPort);
memset(&inATARegs, 0, sizeof(inATARegs));
inATARegs.commandRegister = MV_ATA_COMMAND_SET_FEATURES;
inATARegs.featuresRegister = MV_ATA_SET_FEATURES_ENABLE_WCACHE;
if (mvStorageDevExecutePIO(pSataAdapter, channelIndex, PMPort,
MV_NON_UDMA_PROTOCOL_NON_DATA,
MV_FALSE, NULL,0, &inATARegs, &outATARegs)
== MV_FALSE)
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR,"[%d %d %d]: "
"Set Features failed(ENABLE WCACHE)\n",
pSataAdapter->adapterId, channelIndex, PMPort);
return MV_FALSE;
}
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "[%d %d %d]: Write Cache "
"enabled\n", pSataAdapter->adapterId, channelIndex, PMPort);
}
if ((pIdentifyInfo->readAheadSupported == MV_TRUE) &&
(pIdentifyInfo->readAheadEnabled == MV_FALSE))
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "[%d %d %d]: Read Look "
"Ahead supported but disabled\n", pSataAdapter->adapterId,
channelIndex, PMPort);
memset(&inATARegs, 0, sizeof(inATARegs));
inATARegs.commandRegister = MV_ATA_COMMAND_SET_FEATURES;
inATARegs.featuresRegister = MV_ATA_SET_FEATURES_ENABLE_RLA;
if (mvStorageDevExecutePIO(pSataAdapter, channelIndex, PMPort,
MV_NON_UDMA_PROTOCOL_NON_DATA,
MV_FALSE, NULL,0, &inATARegs, &outATARegs)
== MV_FALSE)
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR,"[%d %d %d]: "
"Set Features failed(ENABLE RLA)\n",
pSataAdapter->adapterId, channelIndex, PMPort);
return MV_FALSE;
}
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "[%d %d %d]: Read Look "
"Ahead enabled\n", pSataAdapter->adapterId, channelIndex,
PMPort);
}
/* mvStorageDevATASetFeatures */
/* Set transfer mode */
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "[%d %d %d]: Set transfer mode "
"XFER_PIO_SLOW\n", pSataAdapter->adapterId, channelIndex, PMPort);
memset(&inATARegs, 0, sizeof(inATARegs));
inATARegs.commandRegister = MV_ATA_COMMAND_SET_FEATURES;
inATARegs.featuresRegister = MV_ATA_SET_FEATURES_TRANSFER;
inATARegs.sectorCountRegister = MV_ATA_TRANSFER_PIO_SLOW;
if (mvStorageDevExecutePIO(pSataAdapter, channelIndex, PMPort,
MV_NON_UDMA_PROTOCOL_NON_DATA,
MV_FALSE, NULL,0, &inATARegs, &outATARegs) ==
MV_FALSE)
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, "[%d %d %d]: "
"Set Features failed to set XFER PIO SLOW\n",
pSataAdapter->adapterId, channelIndex, PMPort);
return MV_FALSE;
}
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "[%d %d %d]: Set transfer mode "
"XFER_PIO_%d\n", pSataAdapter->adapterId, channelIndex, PMPort,
pIdentifyInfo->PIOMode - MV_ATA_TRANSFER_PIO_0);
memset(&inATARegs, 0, sizeof(inATARegs));
inATARegs.commandRegister = MV_ATA_COMMAND_SET_FEATURES;
inATARegs.featuresRegister = MV_ATA_SET_FEATURES_TRANSFER;
inATARegs.sectorCountRegister = pIdentifyInfo->PIOMode;
if (mvStorageDevExecutePIO(pSataAdapter, channelIndex, PMPort,
MV_NON_UDMA_PROTOCOL_NON_DATA,
MV_FALSE, NULL,0, &inATARegs, &outATARegs) ==
MV_FALSE)
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, "[%d %d %d]: "
"Set Features failed to set XFER PIO %d\n",
pSataAdapter->adapterId, channelIndex, PMPort,
pIdentifyInfo->PIOMode - MV_ATA_TRANSFER_PIO_0);
return MV_FALSE;
}
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "[%d %d %d]: Set transfer mode"
" XFER_UDMA_%d\n", pSataAdapter->adapterId, channelIndex, PMPort,
pIdentifyInfo->UdmaMode & 0xf);
memset(&inATARegs, 0, sizeof(inATARegs));
inATARegs.commandRegister = MV_ATA_COMMAND_SET_FEATURES;
inATARegs.featuresRegister = MV_ATA_SET_FEATURES_TRANSFER;
inATARegs.sectorCountRegister = pIdentifyInfo->UdmaMode;
if (mvStorageDevExecutePIO(pSataAdapter, channelIndex, PMPort,
MV_NON_UDMA_PROTOCOL_NON_DATA,
MV_FALSE, NULL,0, &inATARegs, &outATARegs) ==
MV_FALSE)
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, "[%d %d %d]: "
"Set Features failed to set XFER UDMA %d\n",
pSataAdapter->adapterId, channelIndex, PMPort,
pIdentifyInfo->UdmaMode & 0xf);
return MV_FALSE;
}
return MV_TRUE;
}
/*******************************************************************************
* mvInitSataDisk - short description
*
* DESCRIPTION:
* None.
*
* INPUT:
* None.
*
* OUTPUT:
* None.
*
* RETURN:
* None.
*
*******************************************************************************/
MV_BOOLEAN mvInitSataDisk(MV_SATA_ADAPTER *pSataAdapter, MV_U8 channelIndex,
MV_U8 PMPort, ATA_IDENTIFY_INFO *pIdentifyInfo,
MV_U16_PTR identifyBuffer
)
{
#if 0
MV_STORAGE_DEVICE_REGISTERS mvStorageDevRegisters;
MV_SATA_DEVICE_TYPE deviceType;
/* Software reset channel */
if (mvStorageDevATASoftResetDevice(pSataAdapter, channelIndex, PMPort,
&mvStorageDevRegisters)== MV_FALSE)
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, "[%d %d %d]: Software reset "
"failed\n", pSataAdapter->adapterId, channelIndex, PMPort);
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR," ATA Drive Registers:\n");
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR,"%20s : %04x\n","Error", mvStorageDevRegisters.errorRegister);
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR,"%20s : %04x\n","SectorCount", mvStorageDevRegisters.sectorCountRegister);
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR,"%20s : %04x\n","LBA Low", mvStorageDevRegisters.lbaLowRegister);
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR,"%20s : %04x\n","LBA Mid", mvStorageDevRegisters.lbaMidRegister);
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR,"%20s : %04x\n","LBA High", mvStorageDevRegisters.lbaHighRegister);
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR,"%20s : %04x\n","Device", mvStorageDevRegisters.deviceRegister);
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR,"%20s : %04x\n","Status", mvStorageDevRegisters.statusRegister);
/* Software reset PM */
mvStorageDevATASoftResetDevice(pSataAdapter, channelIndex,
MV_SATA_PM_CONTROL_PORT, NULL);
/*if sw reset of the drive didn't finished, estabisl sama comm */
/*again and don't clear s-error so D2H Fis will be blocked */
mvPMDevEnableStaggeredSpinUp(pSataAdapter,channelIndex , PMPort);
return MV_FALSE;
}
if (mvStorageDevRegisters.errorRegister != 1)
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, "[%d %d %d]: Device Diagnostics "
"failed\n", pSataAdapter->adapterId, channelIndex, PMPort);
return MV_FALSE;
}
deviceType = mvGetSataDeviceType(&mvStorageDevRegisters);
if (deviceType != MV_SATA_DEVICE_TYPE_ATA_DISK)
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, "[%d %d %d]: Bad Device"
" Type (%d) failed\n", pSataAdapter->adapterId, channelIndex,
PMPort, deviceType);
return MV_FALSE;
}
#endif
if (mvConfigSataDisk(pSataAdapter, channelIndex, PMPort, pIdentifyInfo,
identifyBuffer) == MV_FALSE)
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, "[%d %d %d]: Failed to"
" Config Device\n", pSataAdapter->adapterId, channelIndex,
PMPort);
if (mvStorageDevATASoftResetDevice(pSataAdapter, channelIndex, PMPort,
NULL)== MV_FALSE)
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, "[%d %d %d]: "
"Software reset failed\n", pSataAdapter->adapterId,
channelIndex, PMPort);
/* Software reset PM */
mvStorageDevATASoftResetDevice(pSataAdapter, channelIndex,
MV_SATA_PM_CONTROL_PORT, NULL);
}
return MV_FALSE;
}
return MV_TRUE;
}
MV_BOOLEAN mvGetPMDeviceInfo(MV_SATA_ADAPTER *pSataAdapter,
MV_U8 channelIndex,
MV_SATA_PM_DEVICE_INFO *pPMDeviceInfo)
{
MV_U32 regVal;
if (mvPMDevReadReg(pSataAdapter, channelIndex, MV_SATA_PM_CONTROL_PORT,
MV_SATA_GSCR_ID_REG_NUM, ®Val, NULL) == MV_FALSE)
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, "[%d %d]: "
"mvGetPMDeviceInfo Failed", pSataAdapter->adapterId,
channelIndex);
return MV_FALSE;
}
pPMDeviceInfo->vendorId = (MV_U16)(regVal & 0xffff);
pPMDeviceInfo->deviceId = (MV_U16)((regVal & 0xffff0000) >> 16);
if (mvPMDevReadReg(pSataAdapter, channelIndex, MV_SATA_PM_CONTROL_PORT,
MV_SATA_GSCR_REVISION_REG_NUM, ®Val, NULL)== MV_FALSE)
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, "[%d %d]: "
"mvGetPMDeviceInfo Failed", pSataAdapter->adapterId,
channelIndex);
return MV_FALSE;
}
pPMDeviceInfo->PMSpecRevision = (MV_U8)(regVal & 0xff);
pPMDeviceInfo->productRevision = (MV_U8)((regVal & 0xff00) >> 8);
if (mvPMDevReadReg(pSataAdapter, channelIndex, MV_SATA_PM_CONTROL_PORT,
MV_SATA_GSCR_INFO_REG_NUM, ®Val, NULL)== MV_FALSE)
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, "[%d %d]: "
"mvGetPMDeviceInfo Failed", pSataAdapter->adapterId,
channelIndex);
return MV_FALSE;
}
pPMDeviceInfo->numberOfPorts = CT_MAX_PMPort; //修改 —— 将(MV_U8)(regVal & 0xf);改为CT_MAX_PMPort即4;
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "[%d %d]: PM Information:\n",
pSataAdapter->adapterId,channelIndex);
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "%25s - %04x\n", "Vendor Id", pPMDeviceInfo->vendorId);
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "%25s - %04x\n", "Device Id", pPMDeviceInfo->deviceId);
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "%25s - %02x\n", "Product Revision", pPMDeviceInfo->productRevision);
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "%25s - %02x\n", "Spec Revision", pPMDeviceInfo->PMSpecRevision);
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "%25s - %02x\n", "Fan-out ports", pPMDeviceInfo->numberOfPorts);
return MV_TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -