📄 mvialcommon.c
字号:
pSataAdapter->adapterId, channelIndex, regVal);
/*Set N & X bits reflection in PM GSCR*/
if (mvPMDevWriteReg(pSataAdapter, channelIndex,
MV_SATA_PM_CONTROL_PORT,
MV_SATA_GSCR_ERROR_ENABLE_REG_NUM,
regVal, NULL) == MV_FALSE)
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, "[%d %d]: Failed to set "
"PortMultiplier Features Enable register\n",
pSataAdapter->adapterId, channelIndex);
return MV_FALSE;
}
return MV_TRUE;
}
static MV_BOOLEAN mvPMEnableAsyncNotify(MV_IAL_COMMON_ADAPTER_EXTENSION *ialExt,
MV_U8 channelIndex)
{
MV_U32 regVal1, regVal2;
MV_SATA_ADAPTER *pSataAdapter = ialExt->pSataAdapter;
/*Features register*/
if (mvPMDevReadReg(pSataAdapter, channelIndex, MV_SATA_PM_CONTROL_PORT,
MV_SATA_GSCR_FEATURES_REG_NUM,
®Val1, NULL) == MV_FALSE)
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, "[%d %d]: Failed to get Port Multiplier Features"
" supported register\n",
pSataAdapter->adapterId, channelIndex);
return MV_FALSE;
}
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "[%d %d]: Port Multiplier features supported: 0x%X\n",
pSataAdapter->adapterId, channelIndex, regVal1);
/*PM asynchronous notification supported*/
if (mvPMDevReadReg(pSataAdapter, channelIndex, MV_SATA_PM_CONTROL_PORT,
MV_SATA_GSCR_FEATURES_ENABLE_REG_NUM,
®Val2 ,NULL) == MV_FALSE)
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, "[%d %d]: Failed to get Port Multiplier Features"
" register\n",
pSataAdapter->adapterId, channelIndex);
return MV_FALSE;
}
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "[%d %d]: Port Multiplier features enabled "
"register: 0x%X\n",
pSataAdapter->adapterId, channelIndex, regVal2);
if (regVal1 & MV_BIT3)
{
regVal2 |= MV_BIT3;
if (mvPMDevWriteReg(pSataAdapter, channelIndex, MV_SATA_PM_CONTROL_PORT,
MV_SATA_GSCR_FEATURES_ENABLE_REG_NUM,
regVal2 ,NULL) == MV_FALSE)
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, "[%d %d]: Failed to set "
"PortMultiplier Features Enable register\n",
pSataAdapter->adapterId, channelIndex);
return MV_FALSE;
}
ialExt->IALChannelExt[channelIndex].pmAsyncNotifyEnabled = MV_TRUE;
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "[%d %d]: PM asynchronous notification is "
"enabled.\n", pSataAdapter->adapterId, channelIndex);
}
else
{
regVal2 &= ~MV_BIT3;
if (mvPMDevWriteReg(pSataAdapter, channelIndex, MV_SATA_PM_CONTROL_PORT,
MV_SATA_GSCR_FEATURES_ENABLE_REG_NUM,
regVal2 ,NULL) == MV_FALSE)
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, "[%d %d]: Failed to set "
"PortMultiplier Features Enable register\n",
pSataAdapter->adapterId, channelIndex);
return MV_FALSE;
}
ialExt->IALChannelExt[channelIndex].pmAsyncNotifyEnabled = MV_FALSE;
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "[%d %d]: PM asynchronous notification is "
"disabled.\n", pSataAdapter->adapterId, channelIndex);
}
return MV_TRUE;
}
static MV_BOOLEAN mvConfigurePMDevice(
MV_IAL_COMMON_ADAPTER_EXTENSION *ialExt,
MV_U8 channelIndex)
{
MV_SATA_PM_DEVICE_INFO PMInfo;
ialExt->IALChannelExt[channelIndex].pmAsyncNotifyEnabled = MV_FALSE;
if (mvGetPMDeviceInfo(ialExt->pSataAdapter, channelIndex, &PMInfo)
== MV_FALSE)
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, "[%d %d]: Failed to get PortMultiplier Info\n",
ialExt->pSataAdapter->adapterId, channelIndex);
return MV_FALSE;
}
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "[%d %d]: PM of %d ports found\n",
ialExt->pSataAdapter->adapterId, channelIndex,
PMInfo.numberOfPorts);
ialExt->IALChannelExt[channelIndex].PMnumberOfPorts = PMInfo.numberOfPorts;
#ifdef DISABLE_PM_SCC
if (PMInfo.vendorId == 0x11AB)
{
if (mvPMDisableSSC(ialExt->pSataAdapter, channelIndex) == MV_FALSE)
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, "[%d %d]: cannot disable SSC for PM.\n"
"unknown vendor.\n",
ialExt->pSataAdapter->adapterId, channelIndex);
}
}
else
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, "[%d %d]: cannot disable SSC for PM - "
"unknown vendor.\n",
ialExt->pSataAdapter->adapterId, channelIndex);
}
#endif
if (mvPMEnableCommStatusChangeBits(ialExt,
channelIndex,
MV_FALSE) != MV_TRUE)
{
return MV_FALSE;
}
if (mvPMEnableAsyncNotify(ialExt, channelIndex) == MV_FALSE)
{
return MV_FALSE;
}
return MV_TRUE;
}
static MV_BOOLEAN mvPMEstablishSataComm(
MV_IAL_COMMON_ADAPTER_EXTENSION *ialExt,
MV_U8 channelIndex)
{
MV_SATA_ADAPTER *pSataAdapter = ialExt->pSataAdapter;
MV_IAL_COMMON_CHANNEL_EXTENSION* channelExt =
&ialExt->IALChannelExt[channelIndex];
if (mvConfigurePMDevice(ialExt, channelIndex) == MV_FALSE)
{
return MV_FALSE;
}
if (mvPMDevEnableStaggeredSpinUpAll(pSataAdapter,
channelIndex,
channelExt->PMnumberOfPorts,
&channelExt->PMdevsToInit) == MV_FALSE)
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, "[%d %d]: PM Enable Staggered Spin-Up Failed\n",
pSataAdapter->adapterId, channelIndex);
channelExt->PMdevsToInit = 0;
return MV_FALSE;
}
return MV_TRUE;
}
static MV_BOOLEAN mvPMCheckForConnectedDevices(
MV_IAL_COMMON_ADAPTER_EXTENSION *ialExt,
MV_U8 channelIndex,
MV_BOOLEAN* bIsChannelReady)
{
MV_U8 PMPort;
MV_U32 SStatus;
MV_SATA_ADAPTER *pSataAdapter = ialExt->pSataAdapter;
MV_IAL_COMMON_CHANNEL_EXTENSION* channelExt =
&ialExt->IALChannelExt[channelIndex];
*bIsChannelReady = MV_FALSE;
channelExt->devInSRST = MV_SATA_PM_CONTROL_PORT+1;
for (PMPort = 0; PMPort < channelExt->PMnumberOfPorts; PMPort++)
{
if (!(channelExt->PMdevsToInit & (1 << PMPort)))
{
continue;
}
channelExt->PMdevsToInit &= ~(1 << PMPort);
if (mvPMDevReadReg(pSataAdapter, channelIndex, PMPort,
MV_SATA_PSCR_SSTATUS_REG_NUM, &SStatus, NULL) ==
MV_FALSE)
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, "[%d %d %d]: mvPMDevReadReg Failed\n",
pSataAdapter->adapterId, channelIndex, PMPort);
if (mvStorageDevATASoftResetDevice(pSataAdapter, channelIndex,
MV_SATA_PM_CONTROL_PORT, NULL) == MV_FALSE)
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, "[%d %d]:failed to Soft Reset PM control "
"port\n",
pSataAdapter->adapterId, channelIndex);
return MV_FALSE;
}
continue;
}
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "[%d %d %d]: S-Status: 0x%x\n",
pSataAdapter->adapterId,
channelIndex, PMPort, SStatus);
if ((SStatus & 0xf) != 3)
{
if (mvPMDevWriteReg(pSataAdapter, channelIndex, PMPort,
MV_SATA_PSCR_SERROR_REG_NUM, 0xffffffff, NULL) ==
MV_FALSE)
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR,
"[%d %d %d]: PM Write SERROR Failed\n",
pSataAdapter->adapterId, channelIndex, PMPort);
}
continue;
}
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "[%d %d %d]: Start reset PM connected device.\n",
pSataAdapter->adapterId, channelIndex, PMPort);
/*Set first connected PM port for further SRST*/
channelExt->PMdevsToInit |= (1 << PMPort);
if (channelExt->devInSRST == MV_SATA_PM_CONTROL_PORT+1)
{
channelExt->devInSRST = PMPort;
}
}
/*PM is connected but no device is present*/
if (!channelExt->PMdevsToInit)
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG, "[%d %d]: "
"No more devices connected to PM.\n",
pSataAdapter->adapterId, channelIndex);
if (mvPMEnableCommStatusChangeBits(ialExt,
channelIndex,
MV_TRUE) != MV_TRUE)
{
return MV_FALSE;
}
*bIsChannelReady = MV_TRUE;
return MV_TRUE;
}
for (PMPort = channelExt->devInSRST;
PMPort < channelExt->PMnumberOfPorts;
PMPort++)
{
if (channelExt->PMdevsToInit & (1 << PMPort))
{
channelExt->devInSRST = PMPort;
/*Clear SError on PM port*/
if (mvPMDevWriteReg(pSataAdapter, channelIndex, PMPort,
MV_SATA_PSCR_SERROR_REG_NUM, 0xFFFFFFFF, NULL) ==
MV_FALSE)
{
if (mvStorageDevATASoftResetDevice(pSataAdapter, channelIndex,
MV_SATA_PM_CONTROL_PORT, NULL) == MV_FALSE)
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, "[%d %d]: "
"failed to Soft Reset PM control port\n",
pSataAdapter->adapterId, channelIndex);
return MV_FALSE;
}
}
if (mvStorageDevATAStartSoftResetDevice(pSataAdapter,
channelIndex,
channelExt->devInSRST)
== MV_FALSE)
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR, "[%d %d %d]: "
"failed to Soft Reset PM device port.\n",
pSataAdapter->adapterId, channelIndex, PMPort);
channelExt->PMdevsToInit &= ~(1 << PMPort);
}
else
{
break;
}
}
}
if (PMPort == channelExt->PMnumberOfPorts)
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG,"[%d %d]: "
"SRST failed for all PM connected devices.\n",
pSataAdapter->adapterId, channelIndex);
if (mvPMEnableCommStatusChangeBits(ialExt,
channelIndex,
MV_TRUE) != MV_TRUE)
{
return MV_FALSE;
}
*bIsChannelReady = MV_TRUE;
}
return MV_TRUE;
}
static MV_BOOLEAN hasSataLinkStatusChanged(MV_SATA_ADAPTER *pSataAdapter,
MV_U8 channelIndex,
MV_U8 PMPort,
MV_U32 *connectStatus)
{
MV_U32 regVal;
/*No change in sttatus*/
*connectStatus = 0;
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG,"[%d %d %d]: "
"Before sending PIO to drive: "
"looking for any change in port status.\n",
pSataAdapter->adapterId,
channelIndex,
PMPort);
if (mvPMDevReadReg(pSataAdapter, channelIndex, PMPort,
MV_SATA_PSCR_SERROR_REG_NUM, ®Val, NULL)
== MV_FALSE)
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR,"[%d %d %d]: "
"mvPMDevReadReg SCR-ERROR Failed",
pSataAdapter->adapterId, channelIndex, PMPort);
if (mvStorageDevATASoftResetDevice(pSataAdapter, channelIndex,
MV_SATA_PM_CONTROL_PORT,
NULL) == MV_FALSE)
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR,"[%d %d]: failed to Soft Reset PM "
"control port\n",
pSataAdapter->adapterId, channelIndex);
}
return MV_FALSE;
}
/*clear X bit and N bitin S-Error*/
if ((regVal != 0) && mvPMDevWriteReg(pSataAdapter, channelIndex, PMPort,
MV_SATA_PSCR_SERROR_REG_NUM, 0xFFFFFFFF, NULL)
== MV_FALSE)
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR,"[%d %d %d]: "
"mvStorageDevPMWriteReg SCR-ERROR Failed",
pSataAdapter->adapterId, channelIndex, PMPort);
if (mvStorageDevATASoftResetDevice(pSataAdapter, channelIndex,
MV_SATA_PM_CONTROL_PORT,
NULL) == MV_FALSE)
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR,"[%d %d]: failed to Soft Reset PM "
"control port\n",
pSataAdapter->adapterId, channelIndex);
}
return MV_FALSE;
}
if (!(regVal & MV_BIT16))
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG,"[%d %d %d]: "
"N Bit is zero in SError register - no change in status "
"of PM ports.\n",
pSataAdapter->adapterId,
channelIndex,
PMPort);
}
else
{
/*Disconnected*/
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR,"[%d %d %d]: "
"Unexpected device disconnect.\n",
pSataAdapter->adapterId,
channelIndex,
PMPort);
*connectStatus = 1;
}
if (!(regVal & MV_BIT26))
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG,"[%d %d %d]: X Bit is zero in SError register\n",
pSataAdapter->adapterId,
channelIndex,
PMPort);
}
else
{
/*Reconnected*/
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR,"[%d %d %d]: "
"Device reconnected while before SRST status was probed\n",
pSataAdapter->adapterId,
channelIndex,
PMPort);
*connectStatus = 2;
}
if (*connectStatus < 2)
{
return MV_TRUE;
}
if (mvPMDevReadReg(pSataAdapter, channelIndex, PMPort,
MV_SATA_PSCR_SSTATUS_REG_NUM, ®Val, NULL) ==
MV_FALSE)
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR,"[%d %d %d]: mvPMDevReadReg SStatus "
"Failed\n",
pSataAdapter->adapterId, channelIndex, PMPort);
if (mvStorageDevATASoftResetDevice(pSataAdapter,
channelIndex,
MV_SATA_PM_CONTROL_PORT,
NULL) == MV_FALSE)
{
mvLogMsg(MV_IAL_COMMON_LOG_ID, MV_DEBUG_ERROR,"[%d %d]: failed to Soft Reset PM "
"control port\n",
pSataAdapter->adapterId, channelIndex);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -