⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mvialcommon.c

📁 此为marvell 6081芯片驱动源码
💻 C
📖 第 1 页 / 共 5 页
字号:
			 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,
					   &regVal1, 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,
					   &regVal2 ,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, &regVal, 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, &regVal, 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 + -