#include "precomp.h" #include "gl_kal.h" struct COMMAND { UINT_8 ucCID; BOOLEAN fgSetQuery; BOOLEAN fgNeedResp; UINT_8 ucCmdSeqNum; }; struct SECURITY_FRAME { UINT_16 u2EthType; UINT_16 u2Reserved; }; struct MGMT_FRAME { UINT_16 u2FrameCtl; UINT_16 u2DurationID; }; struct TC_RES_RELEASE_ENTRY { UINT_64 u8RelaseTime; UINT_32 u4RelCID; UINT_8 ucTc4RelCnt; UINT_8 ucAvailableTc4; }; struct CMD_TRACE_ENTRY { UINT_64 u8TxTime; COMMAND_TYPE eCmdType; union { struct COMMAND rCmd; struct SECURITY_FRAME rSecFrame; struct MGMT_FRAME rMgmtFrame; } u; }; typedef struct _COMMAND_ENTRY { UINT_64 u8TxTime; UINT_64 u8ReadFwTime; UINT_32 u4ReadFwValue; UINT_32 u4RelCID; UINT_16 u2Counter; struct COMMAND rCmd; } COMMAND_ENTRY, *P_COMMAND_ENTRY; #define TC_RELEASE_TRACE_BUF_MAX_NUM 100 #define TXED_CMD_TRACE_BUF_MAX_NUM 100 #define TXED_COMMAND_BUF_MAX_NUM 10 static struct TC_RES_RELEASE_ENTRY *gprTcReleaseTraceBuffer; static struct CMD_TRACE_ENTRY *gprCmdTraceEntry; static P_COMMAND_ENTRY gprCommandEntry; VOID wlanDebugInit(VOID) { /* debug for command/tc4 resource begin */ gprTcReleaseTraceBuffer = kalMemAlloc(TC_RELEASE_TRACE_BUF_MAX_NUM * sizeof(struct TC_RES_RELEASE_ENTRY), PHY_MEM_TYPE); kalMemZero(gprTcReleaseTraceBuffer, TC_RELEASE_TRACE_BUF_MAX_NUM * sizeof(struct TC_RES_RELEASE_ENTRY)); gprCmdTraceEntry = kalMemAlloc(TXED_CMD_TRACE_BUF_MAX_NUM * sizeof(struct CMD_TRACE_ENTRY), PHY_MEM_TYPE); kalMemZero(gprCmdTraceEntry, TXED_CMD_TRACE_BUF_MAX_NUM * sizeof(struct CMD_TRACE_ENTRY)); gprCommandEntry = kalMemAlloc(TXED_COMMAND_BUF_MAX_NUM * sizeof(COMMAND_ENTRY), PHY_MEM_TYPE); kalMemZero(gprCommandEntry, TXED_COMMAND_BUF_MAX_NUM * sizeof(COMMAND_ENTRY)); /* debug for command/tc4 resource end */ } VOID wlanDebugUninit(VOID) { /* debug for command/tc4 resource begin */ kalMemFree(gprTcReleaseTraceBuffer, PHY_MEM_TYPE, TC_RELEASE_TRACE_BUF_MAX_NUM * sizeof(struct TC_RES_RELEASE_ENTRY)); kalMemFree(gprCmdTraceEntry, PHY_MEM_TYPE, TXED_CMD_TRACE_BUF_MAX_NUM * sizeof(struct CMD_TRACE_ENTRY)); kalMemFree(gprCommandEntry, PHY_MEM_TYPE, TXED_COMMAND_BUF_MAX_NUM * sizeof(COMMAND_ENTRY)); /* debug for command/tc4 resource end */ } VOID wlanReadFwStatus(P_ADAPTER_T prAdapter) { static UINT_16 u2CurEntryCmd; P_COMMAND_ENTRY prCurCommand = &gprCommandEntry[u2CurEntryCmd]; prCurCommand->u8ReadFwTime = sched_clock(); HAL_MCR_RD(prAdapter, MCR_D2HRM2R, &prCurCommand->u4ReadFwValue); u2CurEntryCmd++; if (u2CurEntryCmd == TXED_COMMAND_BUF_MAX_NUM) u2CurEntryCmd = 0; } VOID wlanTraceTxCmd(P_ADAPTER_T prAdapter, P_CMD_INFO_T prCmd) { static UINT_16 u2CurEntry; static UINT_16 u2CurEntryCmd; struct CMD_TRACE_ENTRY *prCurCmd = &gprCmdTraceEntry[u2CurEntry]; P_COMMAND_ENTRY prCurCommand = &gprCommandEntry[u2CurEntryCmd]; prCurCmd->u8TxTime = sched_clock(); prCurCommand->u8TxTime = prCurCmd->u8TxTime; prCurCmd->eCmdType = prCmd->eCmdType; if (prCmd->eCmdType == COMMAND_TYPE_MANAGEMENT_FRAME) { P_WLAN_MAC_MGMT_HEADER_T prMgmt = (P_WLAN_MAC_MGMT_HEADER_T)((P_MSDU_INFO_T)prCmd->prPacket)->prPacket; prCurCmd->u.rMgmtFrame.u2FrameCtl = prMgmt->u2FrameCtrl; prCurCmd->u.rMgmtFrame.u2DurationID = prMgmt->u2Duration; } else if (prCmd->eCmdType == COMMAND_TYPE_SECURITY_FRAME) { PUINT_8 pucPkt = (PUINT_8)((struct sk_buff *)prCmd->prPacket)->data; prCurCmd->u.rSecFrame.u2EthType = (pucPkt[ETH_TYPE_LEN_OFFSET] << 8) | (pucPkt[ETH_TYPE_LEN_OFFSET + 1]); } else { prCurCmd->u.rCmd.ucCID = prCmd->ucCID; prCurCmd->u.rCmd.ucCmdSeqNum = prCmd->ucCmdSeqNum; prCurCmd->u.rCmd.fgNeedResp = prCmd->fgNeedResp; prCurCmd->u.rCmd.fgSetQuery = prCmd->fgSetQuery; prCurCommand->rCmd.ucCID = prCmd->ucCID; prCurCommand->rCmd.ucCmdSeqNum = prCmd->ucCmdSeqNum; prCurCommand->rCmd.fgNeedResp = prCmd->fgNeedResp; prCurCommand->rCmd.fgSetQuery = prCmd->fgSetQuery; prCurCommand->u2Counter = u2CurEntryCmd; u2CurEntryCmd++; if (u2CurEntryCmd == TXED_COMMAND_BUF_MAX_NUM) u2CurEntryCmd = 0; HAL_MCR_RD(prAdapter, MCR_D2HRM2R, &prCurCommand->u4RelCID); } u2CurEntry++; if (u2CurEntry == TC_RELEASE_TRACE_BUF_MAX_NUM) u2CurEntry = 0; } VOID wlanTraceReleaseTcRes(P_ADAPTER_T prAdapter, PUINT_8 aucTxRlsCnt, UINT_8 ucAvailable) { static UINT_16 u2CurEntry; struct TC_RES_RELEASE_ENTRY *prCurBuf = &gprTcReleaseTraceBuffer[u2CurEntry]; HAL_MCR_RD(prAdapter, MCR_D2HRM2R, &prCurBuf->u4RelCID); prCurBuf->u8RelaseTime = sched_clock(); prCurBuf->ucTc4RelCnt = aucTxRlsCnt[TC4_INDEX]; prCurBuf->ucAvailableTc4 = ucAvailable; u2CurEntry++; if (u2CurEntry == TXED_CMD_TRACE_BUF_MAX_NUM) u2CurEntry = 0; } VOID wlanDumpTcResAndTxedCmd(PUINT_8 pucBuf, UINT_32 maxLen) { UINT_16 i = 0; struct CMD_TRACE_ENTRY *prCmd = gprCmdTraceEntry; struct TC_RES_RELEASE_ENTRY *prTcRel = gprTcReleaseTraceBuffer; if (pucBuf) { int bufLen = 0; for (; i < TXED_CMD_TRACE_BUF_MAX_NUM/2; i++) { bufLen = snprintf(pucBuf, maxLen, "%d: Time %llu, Type %d, Content %08x; %d: Time %llu, Type %d, Content %08x\n", i*2, prCmd[i*2].u8TxTime, prCmd[i*2].eCmdType, *(PUINT_32)(&prCmd[i*2].u.rCmd.ucCID), i*2+1, prCmd[i*2+1].u8TxTime, prCmd[i*2+1].eCmdType, *(PUINT_32)(&prCmd[i*2+1].u.rCmd.ucCID)); if (bufLen <= 0) break; pucBuf += bufLen; maxLen -= bufLen; } for (i = 0; i < TC_RELEASE_TRACE_BUF_MAX_NUM/2; i++) { bufLen = snprintf(pucBuf, maxLen, "%d: Time %llu, Tc4Cnt %d, Free %d, CID %08x; %d: Time %llu, Tc4Cnt %d, Free %d CID %08x\n", i*2, prTcRel[i*2].u8RelaseTime, prTcRel[i*2].ucTc4RelCnt, prTcRel[i*2].ucAvailableTc4, prTcRel[i*2].u4RelCID, i*2+1, prTcRel[i*2+1].u8RelaseTime, prTcRel[i*2+1].ucTc4RelCnt, prTcRel[i*2+1].ucAvailableTc4, prTcRel[i*2+1].u4RelCID); if (bufLen <= 0) break; pucBuf += bufLen; maxLen -= bufLen; } return; } for (; i < TXED_CMD_TRACE_BUF_MAX_NUM/4; i++) { LOG_FUNC("%d: Time %llu, Type %d, Content %08x; %d: Time %llu, Type %d, Content %08x; ", i*4, prCmd[i*4].u8TxTime, prCmd[i*4].eCmdType, *(PUINT_32)(&prCmd[i*4].u.rCmd.ucCID), i*4+1, prCmd[i*4+1].u8TxTime, prCmd[i*4+1].eCmdType, *(PUINT_32)(&prCmd[i*4+1].u.rCmd.ucCID)); LOG_FUNC("%d: Time %llu, Type %d, Content %08x; %d: Time %llu, Type %d, Content %08x\n", i*4+2, prCmd[i*4+2].u8TxTime, prCmd[i*4+2].eCmdType, *(PUINT_32)(&prCmd[i*4+2].u.rCmd.ucCID), i*4+3, prCmd[i*4+3].u8TxTime, prCmd[i*4+3].eCmdType, *(PUINT_32)(&prCmd[i*4+3].u.rCmd.ucCID)); } for (i = 0; i < TC_RELEASE_TRACE_BUF_MAX_NUM/4; i++) { LOG_FUNC( "%d: Time %llu, Tc4Cnt %d, Free %d, CID %08x; %d: Time %llu, Tc4Cnt %d, Free %d, CID %08x;", i*4, prTcRel[i*4].u8RelaseTime, prTcRel[i*4].ucTc4RelCnt, prTcRel[i*4].ucAvailableTc4, prTcRel[i*4].u4RelCID, i*4+1, prTcRel[i*4+1].u8RelaseTime, prTcRel[i*4+1].ucTc4RelCnt, prTcRel[i*4+1].ucAvailableTc4, prTcRel[i*4+1].u4RelCID); LOG_FUNC( " %d: Time %llu, Tc4Cnt %d, Free %d, CID %08x; %d: Time %llu, Tc4Cnt %d, Free %d, CID %08x\n", i*4+2, prTcRel[i*4+2].u8RelaseTime, prTcRel[i*4+2].ucTc4RelCnt, prTcRel[i*4+2].ucAvailableTc4, prTcRel[i*4+2].u4RelCID, i*4+3, prTcRel[i*4+3].u8RelaseTime, prTcRel[i*4+3].ucTc4RelCnt, prTcRel[i*4+3].ucAvailableTc4, prTcRel[i*4+3].u4RelCID); } } VOID wlanDumpCommandFwStatus(VOID) { UINT_16 i = 0; P_COMMAND_ENTRY prCmd = gprCommandEntry; LOG_FUNC("Start\n"); for (; i < TXED_COMMAND_BUF_MAX_NUM; i++) { LOG_FUNC("%d: Time %llu, Content %08x, Count %x, RelCID %08x, ReadFwValue %08x, ReadFwTime %llu\n", i, prCmd[i].u8TxTime, *(PUINT_32)(&prCmd[i].rCmd.ucCID), prCmd[i].u2Counter, prCmd[i].u4RelCID, prCmd[i].u4ReadFwValue, prCmd[i].u8ReadFwTime); } }