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

📄 sky2le.h

📁 这是Marvell Technology Group Ltd. 4355 (rev 12)网卡在linux下的驱动程序源代码
💻 H
📖 第 1 页 / 共 3 页
字号:
		SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT,					\			("\tVLAN Id: 0x%x\n", STLE_GET_VLAN(pLE)));					\	}																	\	if ((Opcode & OP_RXTIMESTAMP) == OP_RXTIMESTAMP) {					\		SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT,					\			("\tTimestamp: 0x%x\n", STLE_GET_TIST(pLE)));				\	}																	\	if ((Opcode & OP_RXCHKS) == OP_RXCHKS) {							\		SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT,					\			("\tTCP: 0x%x 0x%x\n", STLE_GET_TCP1(pLE),					\			STLE_GET_TCP2(pLE)));										\	}																	\	if (Opcode == OP_TXINDEXLE) {										\		STLE_GET_DONE_IDX(pLE, LowVal, HighVal);						\		SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT,					\			("\tTx Index TxA1: 0x%x\n",									\			STLE_GET_DONE_IDX_TXA1(LowVal,HighVal)));					\		SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT,					\			("\tTx Index TxS1: 0x%x\n",									\			STLE_GET_DONE_IDX_TXS1(LowVal,HighVal)));					\		SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT,					\			("\tTx Index TxA2: 0x%x\n",									\			STLE_GET_DONE_IDX_TXA2(LowVal,HighVal)));					\		SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT,					\			("\tTx Index TxS2: 0x%x\n",									\			STLE_GET_DONE_IDX_TXS2(LowVal,HighVal)));					\	}																	\	if ((Opcode & OP_MACSEC) == OP_MACSEC) {							\		SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT,					\			("\tMACSec Status Field\n", STLE_GET_MX_STAT(pLE)));		\	}																	\	SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT,						\		("=====================\n"));									\}#ifdef USE_POLLING_UNIT#define SK_DBG_DUMP_PO_LE(pLE)	{										\	SK_U8	Opcode;														\	SK_U16	Idx;														\	SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT,						\		("=== PO_LIST_ELEMENT @addr: %p cont: %02x %02x %02x %02x %02x %02x %02x %02x\n",	\		pLE, ((SK_U8 *) pLE)[0], ((SK_U8 *) pLE)[1], ((SK_U8 *) pLE)[2],\		((SK_U8 *) pLE)[3], ((SK_U8 *) pLE)[4], ((SK_U8 *) pLE)[5],		\		((SK_U8 *) pLE)[6], ((SK_U8 *) pLE)[7]));						\	SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT,						\		("\t (16bit) %04x %04x %04x %04x\n",							\		((SK_U16 *) pLE)[0], ((SK_U16 *) pLE)[1], ((SK_U16 *) pLE)[2],	\		((SK_U16 *) pLE)[3])); 											\	SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT,						\		("\t (32bit) %08x %08x\n",										\		((SK_U32 *) pLE)[0], ((SK_U32 *) pLE)[1]));						\	Opcode = POLE_GET_OPC(pLE);											\	SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT,						\		 ("\tOwn belongs to %s\n", ((Opcode & HW_OWNER) == HW_OWNER) ?	\		  "Hardware" : "Software"));									\	SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT,						\		 ("\tOpc: 0x%x ",Opcode));										\	if ((Opcode & ~HW_OWNER) == OP_PUTIDX) {							\		SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT,					\			("\tOP_PUTIDX\n"));											\	}																	\	else {																\		SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT,					\			("\tunknown Opcode!!!\n"));									\	}																	\	SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT,						\		("\tPort %c\n", 'A' + POLE_GET_LINK(pLE)));						\	Idx = POLE_GET_TXAIDX(pLE);											\	SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT,						\		("\tTxA Index is 0x%X and %svalid\n", Idx,						\		(Idx & PU_PUTIDX_VALID) ? "" : "not "));						\	Idx = POLE_GET_TXSIDX(pLE);											\	SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT,						\		("\tTxS Index is 0x%X and %svalid\n", Idx,						\		(Idx & PU_PUTIDX_VALID) ? "" : "not "));						\	Idx = POLE_GET_RXIDX(pLE);											\	SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT,						\		("\tRx Index is 0x%X and %svalid\n", Idx,						\		(Idx & PU_PUTIDX_VALID) ? "" : "not "));						\	SK_DBG_MSG(pAc, SK_DBGMOD_HWM, SK_DBGCAT_INIT,						\		("=====================\n"));									\}#endif /* USE_POLLING_UNIT */#else	/* !DEBUG */#define SK_DBG_DUMP_RX_LE(pLE)#define SK_DBG_DUMP_TX_LE(pLE)#define SK_DBG_DUMP_ST_LE(pLE)#define SK_DBG_DUMP_PO_LE(pLE)#endif	/* !DEBUG *//****************************************************************************** * * Macros for list element tables * */#define LE_SIZE sizeof(SK_HWLE)#define LE_TAB_SIZE(NumElements)	((NumElements) * LE_SIZE)		/* total number of list elements in table */#define NUM_LE_IN_TABLE(pTable)		((pTable)->Num)/* Number of unused list elements in table * this macro always returns the number of free listelements - 1 * this way we want to guarantee that always one LE remains unused */#define NUM_FREE_LE_IN_TABLE(pTable)								\	( ((pTable)->Put >= (pTable)->Done) ?							\	(NUM_LE_IN_TABLE(pTable) - (pTable)->Put + (pTable)->Done - 1) :\	((pTable)->Done - (pTable)->Put - 1) )/* get next unused Rx list element */#define GET_RX_LE(pLE, pTable) {									\	pLE = &(pTable)->pLETab[(pTable)->Put];							\	(pTable)->Put = ((pTable)->Put + 1) & (NUM_LE_IN_TABLE(pTable) - 1);\}/* get next unused Tx list element */#define GET_TX_LE(pLE, pTable)	GET_RX_LE(pLE, pTable)/* get next status list element expected to be finished by hw */#define GET_ST_LE(pLE, pTable) {									\	pLE = &(pTable)->pLETab[(pTable)->Done];						\	(pTable)->Done = ((pTable)->Done +1) & (NUM_LE_IN_TABLE(pTable) - 1);\}#ifdef USE_POLLING_UNIT/* get next polling unit list element for port */#define GET_PO_LE(pLE, pTable, Port)	(pLE = &(pTable)->pLETab[(Port)])}#endif /* USE_POLLING_UNIT */#define GET_PUT_IDX(pTable)			((pTable)->Put)#define UPDATE_HWPUT_IDX(pTable)	((pTable)->HwPut = (pTable)->Put)/* * get own bit of next status LE * if the result is != 0 there has been at least one status LE finished */#define OWN_OF_FIRST_LE(pTable)									\	(STLE_GET_OPC(&(pTable)->pLETab[(pTable)->Done]) & HW_OWNER)#define SET_DONE_INDEX(pTable, Idx)	(pTable)->Done = (Idx)#define GET_DONE_INDEX(pTable)	((pTable)->Done)#ifdef SAFE_BUT_SLOW/* check own bit of LE before current done idx */#define CHECK_STLE_OVERFLOW(pTable, IsOk) {						\		unsigned i;												\		if ((i = (pTable)->Done) == 0) {						\			i = NUM_LE_IN_TABLE(pTable);						\		}														\		else {													\			i = i - 1;											\		}														\		if (STLE_GET_OPC(&(pTable)->pLETab[i]) == HW_OWNER) {	\			(IsOk) = SK_TRUE;									\		}														\		else {													\			(IsOk) = SK_FALSE;									\		}														\	}/* * for Yukon-2 the hardware is not polling the list elements, so it * is not necessary to change the own-bit of Rx or Tx LEs before * reusing them * but it might make debugging easier if one simply can see whether * a LE has been worked on */#define CLEAR_LE_OWN(pTable, Idx)								\	STLE_SET_OPC(&(pTable)->pLETab[(Idx)], SW_OWNER)/* * clear all own bits starting from old done index up to the LE before * the new done index */#define CLEAR_LE_OWN_FROM_DONE_TO(pTable, To) {					\		int i;													\		i = (pTable)->Done;										\		while (i != To) {										\			CLEAR_LE_OWN(pTable, i);							\			i = (i + 1) & (NUM_LE_IN_TABLE(pTable) - 1);		\		}														\	}#else	/* !SAFE_BUT_SLOW */#define CHECK_STLE_OVERFLOW(pTable, IsOk)#define CLEAR_LE_OWN(pTable, Idx)#define CLEAR_LE_OWN_FROM_DONE_TO(pTable, To)#endif	/* !SAFE_BUT_SLOW *//* typedefs *******************************************************************/typedef struct s_LetRxTx {	SK_U16	VlanId;			/* VLAN Id given down last time */	SK_U16	TcpWp;			/* TCP Checksum Write Position */	SK_U16	TcpSp1;			/* TCP Checksum Calculation Start Position 1 */	SK_U16	TcpSp2;			/* TCP Checksum Calculation Start Position 2 */	SK_U16	MssValue;		/* Maximum Segment Size */	SK_U16	Reserved1;		/* reserved word for furture extensions */	SK_U16	Reserved2;		/* reserved word for furture extensions */	SK_U16	Reserved3;		/* reserved word for furture extensions */} SK_LET_RX_TX;typedef struct s_LetStat {	SK_U32	RxTimeStamp;	/* Receive Timestamp */	SK_U32	RssHashValue;	/* RSS Hash Value */	SK_BOOL	RssIsIpV6;		/* RSS Hash Value: IPv6 packet detected */	SK_BOOL	RssIsIp;		/* RSS Hash Value: IP packet detected */	SK_BOOL	RssIsTcp;		/* RSS Hash Value: IP+TCP packet detected */	SK_BOOL	CalcHashIpV4;	/* RSS is computed over source IPv4 address */							/* and destination IPv4 address */	SK_BOOL	CalcHashTCPIPv4;/* RSS is computed over source IPv4 address, */							/* destination IPv4 address, source TCP port and */							/* destination TCP port */	SK_BOOL	CalcHashIPv6;	/* RSS is computed over source IPv6 address */							/* and destination IPv6 address */	SK_BOOL	CalcHashTCPIPv6;/* RSS is computed over source IPv6 address, */							/* destination IPv6 address, source TCP port and */							/* destination TCP port */	SK_BOOL	CalcHashIPv6Ex;	/* RSS is computed over home address (if not present,*/							/* source IPv6 address is used) and routing header	*/							/* type 2 (if not present, destination IPv6 address*/							/* is used) */	SK_BOOL	CalcHashTCPIPv6Ex;	/* RS is computed over home address (if not */							/* present, source IPv6 address is used) and routing */							/* header type 2 (if not present, destination IPv6 */							/* address is used), source TCP port and destiantion*/							/* TCP port */	SK_U16	VlanId;			/* VLAN Id given received by Status BMU */	SK_U16	TcpSum1;		/* TCP checksum 1 (status BMU) */	SK_U16	TcpSum2;		/* TCP checksum 2 (status BMU) */	SK_U32	MacSecStatus;	/* MAC Security status for packet */} SK_LET_STAT;typedef union s_LetBmuSpec {	SK_LET_RX_TX	RxTx;	/* Rx/Tx BMU specific variables */	SK_LET_STAT		Stat;	/* Status BMU specific variables */} SK_LET_BMU_S;typedef	struct s_le_table {	/* all LE's between Done and HWPut are owned by the hardware */	/* all LE's between Put and Done can be used from software */	/* all LE's between HWPut and Put are currently processed in DriverSend */	unsigned Done;			/* done index - consumed from HW and available */	unsigned Put;			/* put index - to be given to hardware */	unsigned HwPut;			/* put index actually given to hardware */	unsigned Num;			/* total number of list elements */	SK_HWLE *pLETab;		/* virtual address of list element table */	SK_U32	pPhyLETABLow;	/* physical address of list element table */	SK_U32	pPhyLETABHigh;	/* physical address of list element table */	/* values to remember in order to save some LEs */	SK_U32	BufHighAddr;	/* high address given down last time */	SK_LET_BMU_S Bmu;		/* contains BMU specific information */	SK_U32	Private;		/* driver private variable free usable */	SK_U16	TcpInitCsum;	/* init checksum */#if defined(SK_LSO_V2) && defined(SK_EXTREME)	unsigned DoneCorrection;	/* number of LSOv2 LEs send modulo Num */	unsigned BadDone;			/* real done index from HW - in Done is a corrected value */#endif} SK_LE_TABLE;/* function prototypes ********************************************************/#ifndef	SK_KR_PROTO/* * public functions in sky2le.c */extern void SkGeY2SetPutIndex(	SK_AC	*pAC,	SK_IOC	IoC,	unsigned int StartAddrPrefUnit,	SK_LE_TABLE *pLETab);extern void SkGeY2InitPrefetchUnit(	SK_AC	*pAC,	SK_IOC	IoC,	unsigned int Queue,	SK_LE_TABLE *pLETab);extern void SkGeY2InitStatBmu(	SK_AC	*pAC,	SK_IOC	IoC,	SK_LE_TABLE *pLETab);extern void SkGeY2InitPollUnit(	SK_AC	*pAC,	SK_IOC	IoC,	SK_LE_TABLE *pLETab);extern void SkGeY2InitSingleLETable(	SK_AC	*pAC,	SK_LE_TABLE *pLETab,	unsigned int NumLE,	void	*pVMem,	SK_U32	PMemLowAddr,	SK_U32	PMemHighAddr);#else	/* SK_KR_PROTO */extern void SkGeY2SetPutIndex();extern void SkGeY2InitPrefetchUnit();extern void SkGeY2InitStatBmu();extern void SkGeY2InitPollUnit();extern void SkGeY2InitSingleLETable();#endif	/* SK_KR_PROTO */#ifdef __cplusplus}#endif	/* __cplusplus */#endif	/* __INC_SKY2LE_H */

⌨️ 快捷键说明

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