📄 sky2le.h
字号:
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 + -