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

📄 skgesirq.c

📁 该软件根据网络数据生成NetFlow记录。NetFlow可用于网络规划、负载均衡、安全监控等
💻 C
📖 第 1 页 / 共 5 页
字号:
/****************************************************************************** * * SkGePortCheckUp() - Check if the link is up * * return: *	0	o.k. nothing needed *	1	Restart needed on this port *	2	Link came up */static int SkGePortCheckUp(SK_AC	*pAC,		/* Adapter Context */SK_IOC	IoC,		/* IO Context */int		Port)		/* Which port should be checked */{	SK_GEPORT	*pPrt;		/* GIni Port struct pointer */	SK_BOOL		AutoNeg;	/* Is Auto-negotiation used ? */	int			Rtv;		/* Return value */	Rtv = SK_HW_PS_NONE;		pPrt = &pAC->GIni.GP[Port];	if (pPrt->PLinkMode == SK_LMODE_HALF || pPrt->PLinkMode == SK_LMODE_FULL) {		AutoNeg = SK_FALSE;	}	else {		AutoNeg = SK_TRUE;	}#ifdef GENESIS	if (pAC->GIni.GIGenesis) {		switch (pPrt->PhyType) {				case SK_PHY_XMAC:			Rtv = SkGePortCheckUpXmac(pAC, IoC, Port, AutoNeg);			break;		case SK_PHY_BCOM:			Rtv = SkGePortCheckUpBcom(pAC, IoC, Port, AutoNeg);			break;#ifdef OTHER_PHY		case SK_PHY_LONE:			Rtv = SkGePortCheckUpLone(pAC, IoC, Port, AutoNeg);			break;		case SK_PHY_NAT:			Rtv = SkGePortCheckUpNat(pAC, IoC, Port, AutoNeg);			break;#endif /* OTHER_PHY */		}	}#endif /* GENESIS */	#ifdef YUKON	if (pAC->GIni.GIYukon) {				Rtv = SkGePortCheckUpGmac(pAC, IoC, Port, AutoNeg);	}#endif /* YUKON */	return(Rtv);	}	/* SkGePortCheckUp */#ifdef GENESIS/****************************************************************************** * * SkGePortCheckUpXmac() - Implementing of the Workaround Errata # 2 * * return: *	0	o.k. nothing needed *	1	Restart needed on this port *	2	Link came up */static int SkGePortCheckUpXmac(SK_AC	*pAC,		/* Adapter Context */SK_IOC	IoC,		/* IO Context */int		Port,		/* Which port should be checked */SK_BOOL	AutoNeg)	/* Is Auto-negotiation used ? */{	SK_U32		Shorts;		/* Short Event Counter */	SK_GEPORT	*pPrt;		/* GIni Port struct pointer */	int			Done;	SK_U32		GpReg;		/* General Purpose register value */	SK_U16		Isrc;		/* Interrupt source register */	SK_U16		IsrcSum;	/* Interrupt source register sum */	SK_U16		LpAb;		/* Link Partner Ability */	SK_U16		ResAb;		/* Resolved Ability */	SK_U16		ExtStat;	/* Extended Status Register */	SK_U8		NextMode;	/* Next AutoSensing Mode */	pPrt = &pAC->GIni.GP[Port];	if (pPrt->PHWLinkUp) {		if (pPrt->PhyType != SK_PHY_XMAC) {			return(SK_HW_PS_NONE);		}		else {			return(SkGePortCheckShorts(pAC, IoC, Port));		}	}	IsrcSum = pPrt->PIsave;	pPrt->PIsave = 0;	/* Now wait for each port's link */	if (pPrt->PLinkBroken) {		/* Link was broken */		XM_IN32(IoC, Port, XM_GP_PORT, &GpReg);		if ((GpReg & XM_GP_INP_ASS) == 0) {			/* The Link is in sync */			XM_IN16(IoC, Port, XM_ISRC, &Isrc);			IsrcSum |= Isrc;			SkXmAutoNegLipaXmac(pAC, IoC, Port, IsrcSum);						if ((Isrc & XM_IS_INP_ASS) == 0) {				/* It has been in sync since last time */				/* Restart the PORT */				SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ,					("Link in sync Restart Port %d\n", Port));				(void)SkXmUpdateStats(pAC, IoC, Port);				/* We now need to reinitialize the PrevShorts counter */				(void)SkXmMacStatistic(pAC, IoC, Port, XM_RXE_SHT_ERR, &Shorts);				pPrt->PPrevShorts = Shorts;				pPrt->PLinkBroken = SK_FALSE;				/*				 * Link Restart Workaround:				 *  it may be possible that the other Link side				 *  restarts its link as well an we detect				 *  another LinkBroken. To prevent this				 *  happening we check for a maximum number				 *  of consecutive restart. If those happens,				 *  we do NOT restart the active link and				 *  check whether the link is now o.k.				 */				pPrt->PLinkResCt++;								pPrt->PAutoNegTimeOut = 0;				if (pPrt->PLinkResCt < SK_MAX_LRESTART) {					return(SK_HW_PS_RESTART);				}				pPrt->PLinkResCt = 0;								SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,					("Do NOT restart on Port %d %x %x\n", Port, Isrc, IsrcSum));			}			else {				pPrt->PIsave = (SK_U16)(IsrcSum & XM_IS_AND);								SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,					("Save Sync/nosync Port %d %x %x\n", Port, Isrc, IsrcSum));				/* Do nothing more if link is broken */				return(SK_HW_PS_NONE);			}		}		else {			/* Do nothing more if link is broken */			return(SK_HW_PS_NONE);		}	}	else {		/* Link was not broken, check if it is */		XM_IN16(IoC, Port, XM_ISRC, &Isrc);		IsrcSum |= Isrc;		if ((Isrc & XM_IS_INP_ASS) != 0) {			XM_IN16(IoC, Port, XM_ISRC, &Isrc);			IsrcSum |= Isrc;			if ((Isrc & XM_IS_INP_ASS) != 0) {				XM_IN16(IoC, Port, XM_ISRC, &Isrc);				IsrcSum |= Isrc;				if ((Isrc & XM_IS_INP_ASS) != 0) {					pPrt->PLinkBroken = SK_TRUE;					/* Re-Init Link partner Autoneg flag */					pPrt->PLipaAutoNeg = SK_LIPA_UNKNOWN;					SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ,						("Link broken Port %d\n", Port));					/* Cable removed-> reinit sense mode */					SkHWInitDefSense(pAC, IoC, Port);					return(SK_HW_PS_RESTART);				}			}		}		else {			SkXmAutoNegLipaXmac(pAC, IoC, Port, Isrc);						if (SkGePortCheckShorts(pAC, IoC, Port) == SK_HW_PS_RESTART) {				return(SK_HW_PS_RESTART);			}		}	}	/*	 * here we usually can check whether the link is in sync and	 * auto-negotiation is done.	 */	XM_IN32(IoC, Port, XM_GP_PORT, &GpReg);	XM_IN16(IoC, Port, XM_ISRC, &Isrc);	IsrcSum |= Isrc;	SkXmAutoNegLipaXmac(pAC, IoC, Port, IsrcSum);		if ((GpReg & XM_GP_INP_ASS) != 0 || (IsrcSum & XM_IS_INP_ASS) != 0) {		if ((GpReg & XM_GP_INP_ASS) == 0) {			/* Save Auto-negotiation Done interrupt only if link is in sync */			pPrt->PIsave = (SK_U16)(IsrcSum & XM_IS_AND);		}#ifdef DEBUG		if ((pPrt->PIsave & XM_IS_AND) != 0) {			SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,				("AutoNeg done rescheduled Port %d\n", Port));		}#endif /* DEBUG */		return(SK_HW_PS_NONE);	}	if (AutoNeg) {		if ((IsrcSum & XM_IS_AND) != 0) {			SkHWLinkUp(pAC, IoC, Port);			Done = SkMacAutoNegDone(pAC, IoC, Port);			if (Done != SK_AND_OK) {				/* Get PHY parameters, for debugging only */				SkXmPhyRead(pAC, IoC, Port, PHY_XMAC_AUNE_LP, &LpAb);				SkXmPhyRead(pAC, IoC, Port, PHY_XMAC_RES_ABI, &ResAb);				SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,					("AutoNeg FAIL Port %d (LpAb %x, ResAb %x)\n",					 Port, LpAb, ResAb));									/* Try next possible mode */				NextMode = SkHWSenseGetNext(pAC, IoC, Port);				SkHWLinkDown(pAC, IoC, Port);				if (Done == SK_AND_DUP_CAP) {					/* GoTo next mode */					SkHWSenseSetNext(pAC, IoC, Port, NextMode);				}				return(SK_HW_PS_RESTART);			}			/*			 * Dummy Read extended status to prevent extra link down/ups			 * (clear Page Received bit if set)			 */			SkXmPhyRead(pAC, IoC, Port, PHY_XMAC_AUNE_EXP, &ExtStat);			SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,				("AutoNeg done Port %d\n", Port));			return(SK_HW_PS_LINK);		}				/* AutoNeg not done, but HW link is up. Check for timeouts */		pPrt->PAutoNegTimeOut++;		if (pPrt->PAutoNegTimeOut >= SK_AND_MAX_TO) {			/* Increase the Timeout counter */			pPrt->PAutoNegTOCt++;			/* Timeout occured */			SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ,				("AutoNeg timeout Port %d\n", Port));			if (pPrt->PLinkModeConf == SK_LMODE_AUTOSENSE &&				pPrt->PLipaAutoNeg != SK_LIPA_AUTO) {				/* Set Link manually up */				SkHWSenseSetNext(pAC, IoC, Port, SK_LMODE_FULL);				SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ,					("Set manual full duplex Port %d\n", Port));			}			if (pPrt->PLinkModeConf == SK_LMODE_AUTOSENSE &&				pPrt->PLipaAutoNeg == SK_LIPA_AUTO &&				pPrt->PAutoNegTOCt >= SK_MAX_ANEG_TO) {				/*				 * This is rather complicated.				 * we need to check here whether the LIPA_AUTO				 * we saw before is false alert. We saw at one				 * switch ( SR8800) that on boot time it sends				 * just one auto-neg packet and does no further				 * auto-negotiation.				 * Solution: we restart the autosensing after				 * a few timeouts.				 */				pPrt->PAutoNegTOCt = 0;				pPrt->PLipaAutoNeg = SK_LIPA_UNKNOWN;				SkHWInitDefSense(pAC, IoC, Port);			}			/* Do the restart */			return(SK_HW_PS_RESTART);		}	}	else {		/* Link is up and we don't need more */#ifdef DEBUG		if (pPrt->PLipaAutoNeg == SK_LIPA_AUTO) {			SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,				("ERROR: Lipa auto detected on port %d\n", Port));		}#endif /* DEBUG */		SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ,			("Link sync(GP), Port %d\n", Port));		SkHWLinkUp(pAC, IoC, Port);				/*		 * Link sync (GP) and so assume a good connection. But if not received		 * a bunch of frames received in a time slot (maybe broken tx cable)		 * the port is restart.		 */		return(SK_HW_PS_LINK);	}	return(SK_HW_PS_NONE);}	/* SkGePortCheckUpXmac *//****************************************************************************** * * SkGePortCheckUpBcom() - Check if the link is up on Bcom PHY * * return: *	0	o.k. nothing needed *	1	Restart needed on this port *	2	Link came up */static int SkGePortCheckUpBcom(SK_AC	*pAC,		/* Adapter Context */SK_IOC	IoC,		/* IO Context */int		Port,		/* Which port should be checked */SK_BOOL	AutoNeg)	/* Is Auto-negotiation used ? */{	SK_GEPORT	*pPrt;		/* GIni Port struct pointer */	int			Done;	SK_U16		Isrc;		/* Interrupt source register */	SK_U16		PhyStat;	/* Phy Status Register */	SK_U16		ResAb;		/* Master/Slave resolution */	SK_U16		Ctrl;		/* Broadcom control flags */#ifdef DEBUG	SK_U16		LpAb;	SK_U16		ExtStat;#endif /* DEBUG */	pPrt = &pAC->GIni.GP[Port];	/* Check for No HCD Link events (#10523) */	SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_INT_STAT, &Isrc);#ifdef xDEBUG	if ((Isrc & ~(PHY_B_IS_HCT | PHY_B_IS_LCT) ==		(PHY_B_IS_SCR_S_ER | PHY_B_IS_RRS_CHANGE | PHY_B_IS_LRS_CHANGE)) {		SK_U32	Stat1, Stat2, Stat3;		Stat1 = 0;		SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_INT_MASK, &Stat1);		CMSMPrintString(			pAC->pConfigTable,			MSG_TYPE_RUNTIME_INFO,			"CheckUp1 - Stat: %x, Mask: %x",			(void *)Isrc,			(void *)Stat1);		Stat1 = 0;		SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_CTRL, &Stat1);		Stat2 = 0;		SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_STAT, &Stat2);		Stat1 = Stat1 << 16 | Stat2;		Stat2 = 0;		SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_AUNE_ADV, &Stat2);		Stat3 = 0;		SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_AUNE_LP, &Stat3);		Stat2 = Stat2 << 16 | Stat3;		CMSMPrintString(			pAC->pConfigTable,			MSG_TYPE_RUNTIME_INFO,			"Ctrl/Stat: %x, AN Adv/LP: %x",			(void *)Stat1,			(void *)Stat2);		Stat1 = 0;		SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_AUNE_EXP, &Stat1);		Stat2 = 0;		SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_EXT_STAT, &Stat2);		Stat1 = Stat1 << 16 | Stat2;		Stat2 = 0;		SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_1000T_CTRL, &Stat2);		Stat3 = 0;		SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_1000T_STAT, &Stat3);		Stat2 = Stat2 << 16 | Stat3;		CMSMPrintString(			pAC->pConfigTable,			MSG_TYPE_RUNTIME_INFO,			"AN Exp/IEEE Ext: %x, 1000T Ctrl/Stat: %x",			(void *)Stat1,			(void *)Stat2);		Stat1 = 0;		SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_P_EXT_CTRL, &Stat1);		Stat2 = 0;		SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_P_EXT_STAT, &Stat2);		Stat1 = Stat1 << 16 | Stat2;		Stat2 = 0;		SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_AUX_CTRL, &Stat2);		Stat3 = 0;		SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_AUX_STAT, &Stat3);		Stat2 = Stat2 << 16 | Stat3;		CMSMPrintString(			pAC->pConfigTable,			MSG_TYPE_RUNTIME_INFO,			"PHY Ext Ctrl/Stat: %x, Aux Ctrl/Stat: %x",			(void *)Stat1,			(void *)Stat2);	}#endif /* DEBUG */	if ((Isrc & (PHY_B_IS_NO_HDCL /* | PHY_B_IS_NO_HDC */)) != 0) {		/*		 * Workaround BCom Errata:		 *	enable and disable loopback mode if "NO HCD" occurs.		 */		SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_CTRL, &Ctrl);		SkXmPhyWrite(pAC, IoC, Port, PHY_BCOM_CTRL,			(SK_U16)(Ctrl | PHY_CT_LOOP));		SkXmPhyWrite(pAC, IoC, Port, PHY_BCOM_CTRL,			(SK_U16)(Ctrl & ~PHY_CT_LOOP));		SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_CTRL,			("No HCD Link event, Port %d\n", Port));#ifdef xDEBUG		CMSMPrintString(			pAC->pConfigTable,			MSG_TYPE_RUNTIME_INFO,			"No HCD link event, port %d.",			(void *)Port,			(void *)NULL);#endif /* DEBUG */	}	/* Not obsolete: link status bit is latched to 0 and autoclearing! */	SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_STAT, &PhyStat);	if (pPrt->PHWLinkUp) {		return(SK_HW_PS_NONE);	}#ifdef xDEBUG	{		SK_U32	Stat1, Stat2, Stat3;		Stat1 = 0;		SkXmPhyRead(pAC, IoC, Port, PHY_BCOM_INT_MASK, &Stat1);		CMSMPrintString(			pAC->pConfigTable,			MSG_TYPE_RUNTIME_INFO,

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -