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

📄 skgesirq.c

📁 该软件根据网络数据生成NetFlow记录。NetFlow可用于网络规划、负载均衡、安全监控等
💻 C
📖 第 1 页 / 共 5 页
字号:
	}}	/* SkGeHwErr *//****************************************************************************** * *	SkGeSirqIsr() - Special Interrupt Service Routine * * Description: handles all non data transfer specific interrupts (slow path) * * Returns: N/A */void SkGeSirqIsr(SK_AC	*pAC,		/* adapter context */SK_IOC	IoC,		/* IO context */SK_U32	Istatus)	/* Interrupt status word */{	SK_EVPARA	Para;	SK_U32		RegVal32;	/* Read register value */	SK_GEPORT	*pPrt;		/* GIni Port struct pointer */	SK_U16 		PhyInt;	int			i;	if (((Istatus & IS_HW_ERR) & pAC->GIni.GIValIrqMask) != 0) {		/* read the HW Error Interrupt source */		SK_IN32(IoC, B0_HWE_ISRC, &RegVal32);				SkGeHwErr(pAC, IoC, RegVal32);	}	/*	 * Packet Timeout interrupts	 */	/* Check whether MACs are correctly initialized */	if (((Istatus & (IS_PA_TO_RX1 | IS_PA_TO_TX1)) != 0) &&		pAC->GIni.GP[MAC_1].PState == SK_PRT_RESET) {		/* MAC 1 was not initialized but Packet timeout occured */		SK_ERR_LOG(pAC, SK_ERRCL_SW | SK_ERRCL_INIT, SKERR_SIRQ_E004,			SKERR_SIRQ_E004MSG);	}	if (((Istatus & (IS_PA_TO_RX2 | IS_PA_TO_TX2)) != 0) &&	    pAC->GIni.GP[MAC_2].PState == SK_PRT_RESET) {		/* MAC 2 was not initialized but Packet timeout occured */		SK_ERR_LOG(pAC, SK_ERRCL_SW | SK_ERRCL_INIT, SKERR_SIRQ_E005,			SKERR_SIRQ_E005MSG);	}	if ((Istatus & IS_PA_TO_RX1) != 0) {		/* Means network is filling us up */		SK_ERR_LOG(pAC, SK_ERRCL_HW | SK_ERRCL_INIT, SKERR_SIRQ_E002,			SKERR_SIRQ_E002MSG);		SK_OUT16(IoC, B3_PA_CTRL, PA_CLR_TO_RX1);	}	if ((Istatus & IS_PA_TO_RX2) != 0) {		/* Means network is filling us up */		SK_ERR_LOG(pAC, SK_ERRCL_HW | SK_ERRCL_INIT, SKERR_SIRQ_E003,			SKERR_SIRQ_E003MSG);		SK_OUT16(IoC, B3_PA_CTRL, PA_CLR_TO_RX2);	}	if ((Istatus & IS_PA_TO_TX1) != 0) {				pPrt = &pAC->GIni.GP[0];		/* May be a normal situation in a server with a slow network */		SK_OUT16(IoC, B3_PA_CTRL, PA_CLR_TO_TX1);#ifdef GENESIS		if (pAC->GIni.GIGenesis) {			/*			 * workaround: if in half duplex mode, check for Tx hangup.			 * Read number of TX'ed bytes, wait for 10 ms, then compare			 * the number with current value. If nothing changed, we assume			 * that Tx is hanging and do a FIFO flush (see event routine).			 */			if ((pPrt->PLinkModeStatus == SK_LMODE_STAT_HALF ||				pPrt->PLinkModeStatus == SK_LMODE_STAT_AUTOHALF) &&				!pPrt->HalfDupTimerActive) {				/*				 * many more pack. arb. timeouts may come in between,				 * we ignore those				 */				pPrt->HalfDupTimerActive = SK_TRUE;#ifdef XXX				Len = sizeof(SK_U64);				SkPnmiGetVar(pAC, IoC, OID_SKGE_STAT_TX_OCTETS, (char *)&Octets,					&Len, (SK_U32)SK_PNMI_PORT_PHYS2INST(pAC, 0),					pAC->Rlmt.Port[0].Net->NetNumber);								pPrt->LastOctets = Octets;#endif /* XXX */				/* Snap statistic counters */				(void)SkXmUpdateStats(pAC, IoC, 0);				(void)SkXmMacStatistic(pAC, IoC, 0, XM_TXO_OK_HI, &RegVal32);				pPrt->LastOctets = (SK_U64)RegVal32 << 32;								(void)SkXmMacStatistic(pAC, IoC, 0, XM_TXO_OK_LO, &RegVal32);				pPrt->LastOctets += RegVal32;								Para.Para32[0] = 0;				SkTimerStart(pAC, IoC, &pPrt->HalfDupChkTimer, SK_HALFDUP_CHK_TIME,					SKGE_HWAC, SK_HWEV_HALFDUP_CHK, Para);			}		}#endif /* GENESIS */	}	if ((Istatus & IS_PA_TO_TX2) != 0) {				pPrt = &pAC->GIni.GP[1];		/* May be a normal situation in a server with a slow network */		SK_OUT16(IoC, B3_PA_CTRL, PA_CLR_TO_TX2);#ifdef GENESIS		if (pAC->GIni.GIGenesis) {			/* workaround: see above */			if ((pPrt->PLinkModeStatus == SK_LMODE_STAT_HALF ||				 pPrt->PLinkModeStatus == SK_LMODE_STAT_AUTOHALF) &&				!pPrt->HalfDupTimerActive) {				pPrt->HalfDupTimerActive = SK_TRUE;#ifdef XXX				Len = sizeof(SK_U64);				SkPnmiGetVar(pAC, IoC, OID_SKGE_STAT_TX_OCTETS, (char *)&Octets,					&Len, (SK_U32)SK_PNMI_PORT_PHYS2INST(pAC, 1),					pAC->Rlmt.Port[1].Net->NetNumber);								pPrt->LastOctets = Octets;#endif /* XXX */				/* Snap statistic counters */				(void)SkXmUpdateStats(pAC, IoC, 1);				(void)SkXmMacStatistic(pAC, IoC, 1, XM_TXO_OK_HI, &RegVal32);				pPrt->LastOctets = (SK_U64)RegVal32 << 32;								(void)SkXmMacStatistic(pAC, IoC, 1, XM_TXO_OK_LO, &RegVal32);				pPrt->LastOctets += RegVal32;								Para.Para32[0] = 1;				SkTimerStart(pAC, IoC, &pPrt->HalfDupChkTimer, SK_HALFDUP_CHK_TIME,					SKGE_HWAC, SK_HWEV_HALFDUP_CHK, Para);			}		}#endif /* GENESIS */	}	/* Check interrupts of the particular queues */	if ((Istatus & IS_R1_C) != 0) {		/* Clear IRQ */		SK_OUT32(IoC, B0_R1_CSR, CSR_IRQ_CL_C);		SK_ERR_LOG(pAC, SK_ERRCL_SW | SK_ERRCL_INIT, SKERR_SIRQ_E006,			SKERR_SIRQ_E006MSG);		Para.Para64 = MAC_1;		SkEventQueue(pAC, SKGE_DRV, SK_DRV_PORT_FAIL, Para);		Para.Para32[0] = MAC_1;		SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_LINK_DOWN, Para);	}	if ((Istatus & IS_R2_C) != 0) {		/* Clear IRQ */		SK_OUT32(IoC, B0_R2_CSR, CSR_IRQ_CL_C);		SK_ERR_LOG(pAC, SK_ERRCL_SW | SK_ERRCL_INIT, SKERR_SIRQ_E007,			SKERR_SIRQ_E007MSG);		Para.Para64 = MAC_2;		SkEventQueue(pAC, SKGE_DRV, SK_DRV_PORT_FAIL, Para);		Para.Para32[0] = MAC_2;		SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_LINK_DOWN, Para);	}	if ((Istatus & IS_XS1_C) != 0) {		/* Clear IRQ */		SK_OUT32(IoC, B0_XS1_CSR, CSR_IRQ_CL_C);		SK_ERR_LOG(pAC, SK_ERRCL_SW | SK_ERRCL_INIT, SKERR_SIRQ_E008,			SKERR_SIRQ_E008MSG);		Para.Para64 = MAC_1;		SkEventQueue(pAC, SKGE_DRV, SK_DRV_PORT_FAIL, Para);		Para.Para32[0] = MAC_1;		SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_LINK_DOWN, Para);	}	if ((Istatus & IS_XA1_C) != 0) {		/* Clear IRQ */		SK_OUT32(IoC, B0_XA1_CSR, CSR_IRQ_CL_C);		SK_ERR_LOG(pAC, SK_ERRCL_SW | SK_ERRCL_INIT, SKERR_SIRQ_E009,			SKERR_SIRQ_E009MSG);		Para.Para64 = MAC_1;		SkEventQueue(pAC, SKGE_DRV, SK_DRV_PORT_FAIL, Para);		Para.Para32[0] = MAC_1;		SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_LINK_DOWN, Para);	}	if ((Istatus & IS_XS2_C) != 0) {		/* Clear IRQ */		SK_OUT32(IoC, B0_XS2_CSR, CSR_IRQ_CL_C);		SK_ERR_LOG(pAC, SK_ERRCL_SW | SK_ERRCL_INIT, SKERR_SIRQ_E010,			SKERR_SIRQ_E010MSG);		Para.Para64 = MAC_2;		SkEventQueue(pAC, SKGE_DRV, SK_DRV_PORT_FAIL, Para);		Para.Para32[0] = MAC_2;		SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_LINK_DOWN, Para);	}	if ((Istatus & IS_XA2_C) != 0) {		/* Clear IRQ */		SK_OUT32(IoC, B0_XA2_CSR, CSR_IRQ_CL_C);		SK_ERR_LOG(pAC, SK_ERRCL_SW | SK_ERRCL_INIT, SKERR_SIRQ_E011,			SKERR_SIRQ_E011MSG);		Para.Para64 = MAC_2;		SkEventQueue(pAC, SKGE_DRV, SK_DRV_PORT_FAIL, Para);		Para.Para32[0] = MAC_2;		SkEventQueue(pAC, SKGE_RLMT, SK_RLMT_LINK_DOWN, Para);	}	/* External reg interrupt */	if ((Istatus & IS_EXT_REG) != 0) {		/* Test IRQs from PHY */		for (i = 0; i < pAC->GIni.GIMacsFound; i++) {						pPrt = &pAC->GIni.GP[i];						if (pPrt->PState == SK_PRT_RESET) {				continue;			}			#ifdef GENESIS			if (pAC->GIni.GIGenesis) {								switch (pPrt->PhyType) {								case SK_PHY_XMAC:					break;								case SK_PHY_BCOM:					SkXmPhyRead(pAC, IoC, i, PHY_BCOM_INT_STAT, &PhyInt);						if ((PhyInt & ~PHY_B_DEF_MSK) != 0) {						SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ,							("Port %d Bcom Int: 0x%04X\n",							i, PhyInt));						SkPhyIsrBcom(pAC, IoC, i, PhyInt);					}					break;#ifdef OTHER_PHY				case SK_PHY_LONE:					SkXmPhyRead(pAC, IoC, i, PHY_LONE_INT_STAT, &PhyInt);										if ((PhyInt & PHY_L_DEF_MSK) != 0) {						SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ,							("Port %d Lone Int: %x\n",							i, PhyInt));						SkPhyIsrLone(pAC, IoC, i, PhyInt);					}					break;#endif /* OTHER_PHY */				}			}#endif /* GENESIS */	#ifdef YUKON			if (pAC->GIni.GIYukon) {				/* Read PHY Interrupt Status */				SkGmPhyRead(pAC, IoC, i, PHY_MARV_INT_STAT, &PhyInt);				if ((PhyInt & PHY_M_DEF_MSK) != 0) {					SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ,						("Port %d Marv Int: 0x%04X\n",						i, PhyInt));					SkPhyIsrGmac(pAC, IoC, i, PhyInt);				}			}#endif /* YUKON */		}	}	/* I2C Ready interrupt */	if ((Istatus & IS_I2C_READY) != 0) {#ifdef SK_SLIM        SK_OUT32(IoC, B2_I2C_IRQ, I2C_CLR_IRQ);#else				SkI2cIsr(pAC, IoC);#endif			}	/* SW forced interrupt */	if ((Istatus & IS_IRQ_SW) != 0) {		/* clear the software IRQ */		SK_OUT8(IoC, B0_CTST, CS_CL_SW_IRQ);	}	if ((Istatus & IS_LNK_SYNC_M1) != 0) {		/*		 * We do NOT need the Link Sync interrupt, because it shows		 * us only a link going down.		 */		/* clear interrupt */		SK_OUT8(IoC, MR_ADDR(MAC_1, LNK_SYNC_CTRL), LED_CLR_IRQ);	}	/* Check MAC after link sync counter */	if ((Istatus & IS_MAC1) != 0) {		/* IRQ from MAC 1 */		SkMacIrq(pAC, IoC, MAC_1);	}	if ((Istatus & IS_LNK_SYNC_M2) != 0) {		/*		 * We do NOT need the Link Sync interrupt, because it shows		 * us only a link going down.		 */		/* clear interrupt */		SK_OUT8(IoC, MR_ADDR(MAC_2, LNK_SYNC_CTRL), LED_CLR_IRQ);	}	/* Check MAC after link sync counter */	if ((Istatus & IS_MAC2) != 0) {		/* IRQ from MAC 2 */		SkMacIrq(pAC, IoC, MAC_2);	}	/* Timer interrupt (served last) */	if ((Istatus & IS_TIMINT) != 0) {		/* check for HW Errors */		if (((Istatus & IS_HW_ERR) & ~pAC->GIni.GIValIrqMask) != 0) {			/* read the HW Error Interrupt source */			SK_IN32(IoC, B0_HWE_ISRC, &RegVal32);			SkGeHwErr(pAC, IoC, RegVal32);		}		SkHwtIsr(pAC, IoC);	}}	/* SkGeSirqIsr */#ifdef GENESIS/****************************************************************************** * * SkGePortCheckShorts() - Implementing XMAC Workaround Errata # 2 * * return: *	0	o.k. nothing needed *	1	Restart needed on this port */static int SkGePortCheckShorts(SK_AC	*pAC,		/* Adapter Context */SK_IOC	IoC,		/* IO Context */int		Port)		/* Which port should be checked */{	SK_U32		Shorts;			/* Short Event Counter */	SK_U32		CheckShorts;	/* Check value for Short Event Counter */	SK_U64		RxCts;			/* Rx Counter (packets on network) */	SK_U32		RxTmp;			/* Rx temp. Counter */	SK_U32		FcsErrCts;		/* FCS Error Counter */	SK_GEPORT	*pPrt;			/* GIni Port struct pointer */	int			Rtv;			/* Return value */	int			i;	pPrt = &pAC->GIni.GP[Port];	/* Default: no action */	Rtv = SK_HW_PS_NONE;	(void)SkXmUpdateStats(pAC, IoC, Port);	/* Extra precaution: check for short Event counter */	(void)SkXmMacStatistic(pAC, IoC, Port, XM_RXE_SHT_ERR, &Shorts);	/*	 * Read Rx counters (packets seen on the network and not necessarily	 * really received.	 */	RxCts = 0;	for (i = 0; i < sizeof(SkGeRxRegs)/sizeof(SkGeRxRegs[0]); i++) {				(void)SkXmMacStatistic(pAC, IoC, Port, SkGeRxRegs[i], &RxTmp);				RxCts += (SK_U64)RxTmp;	}	/* On default: check shorts against zero */	CheckShorts = 0;	/* Extra precaution on active links */	if (pPrt->PHWLinkUp) {		/* Reset Link Restart counter */		pPrt->PLinkResCt = 0;		pPrt->PAutoNegTOCt = 0;		/* If link is up check for 2 */		CheckShorts = 2;		(void)SkXmMacStatistic(pAC, IoC, Port, XM_RXF_FCS_ERR, &FcsErrCts);				if (pPrt->PLinkModeConf == SK_LMODE_AUTOSENSE &&		    pPrt->PLipaAutoNeg == SK_LIPA_UNKNOWN &&		    (pPrt->PLinkMode == SK_LMODE_HALF ||			 pPrt->PLinkMode == SK_LMODE_FULL)) {			/*			 * This is autosensing and we are in the fallback			 * manual full/half duplex mode.			 */			if (RxCts == pPrt->PPrevRx) {				/* Nothing received, restart link */				pPrt->PPrevFcs = FcsErrCts;				pPrt->PPrevShorts = Shorts;								return(SK_HW_PS_RESTART);			}			else {				pPrt->PLipaAutoNeg = SK_LIPA_MANUAL;			}		}		if (((RxCts - pPrt->PPrevRx) > pPrt->PRxLim) ||		    (!(FcsErrCts - pPrt->PPrevFcs))) {			/*			 * Note: The compare with zero above has to be done the way shown,			 * otherwise the Linux driver will have a problem.			 */			/*			 * We received a bunch of frames or no CRC error occured on the			 * network -> ok.			 */			pPrt->PPrevRx = RxCts;			pPrt->PPrevFcs = FcsErrCts;			pPrt->PPrevShorts = Shorts;			return(SK_HW_PS_NONE);		}		pPrt->PPrevFcs = FcsErrCts;	}	if ((Shorts - pPrt->PPrevShorts) > CheckShorts) {		SK_DBG_MSG(pAC, SK_DBGMOD_HWM, SK_DBGCAT_IRQ,			("Short Event Count Restart Port %d \n", Port));		Rtv = SK_HW_PS_RESTART;	}	pPrt->PPrevShorts = Shorts;	pPrt->PPrevRx = RxCts;	return(Rtv);}	/* SkGePortCheckShorts */#endif /* GENESIS */

⌨️ 快捷键说明

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