debug.c 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. #include "precomp.h"
  2. #include "gl_kal.h"
  3. struct COMMAND {
  4. UINT_8 ucCID;
  5. BOOLEAN fgSetQuery;
  6. BOOLEAN fgNeedResp;
  7. UINT_8 ucCmdSeqNum;
  8. };
  9. struct SECURITY_FRAME {
  10. UINT_16 u2EthType;
  11. UINT_16 u2Reserved;
  12. };
  13. struct MGMT_FRAME {
  14. UINT_16 u2FrameCtl;
  15. UINT_16 u2DurationID;
  16. };
  17. struct TC_RES_RELEASE_ENTRY {
  18. UINT_64 u8RelaseTime;
  19. UINT_32 u4RelCID;
  20. UINT_8 ucTc4RelCnt;
  21. UINT_8 ucAvailableTc4;
  22. };
  23. struct CMD_TRACE_ENTRY {
  24. UINT_64 u8TxTime;
  25. COMMAND_TYPE eCmdType;
  26. union {
  27. struct COMMAND rCmd;
  28. struct SECURITY_FRAME rSecFrame;
  29. struct MGMT_FRAME rMgmtFrame;
  30. } u;
  31. };
  32. typedef struct _COMMAND_ENTRY {
  33. UINT_64 u8TxTime;
  34. UINT_64 u8ReadFwTime;
  35. UINT_32 u4ReadFwValue;
  36. UINT_32 u4RelCID;
  37. UINT_16 u2Counter;
  38. struct COMMAND rCmd;
  39. } COMMAND_ENTRY, *P_COMMAND_ENTRY;
  40. #define TC_RELEASE_TRACE_BUF_MAX_NUM 100
  41. #define TXED_CMD_TRACE_BUF_MAX_NUM 100
  42. #define TXED_COMMAND_BUF_MAX_NUM 10
  43. static struct TC_RES_RELEASE_ENTRY *gprTcReleaseTraceBuffer;
  44. static struct CMD_TRACE_ENTRY *gprCmdTraceEntry;
  45. static P_COMMAND_ENTRY gprCommandEntry;
  46. VOID wlanDebugInit(VOID)
  47. {
  48. /* debug for command/tc4 resource begin */
  49. gprTcReleaseTraceBuffer =
  50. kalMemAlloc(TC_RELEASE_TRACE_BUF_MAX_NUM * sizeof(struct TC_RES_RELEASE_ENTRY), PHY_MEM_TYPE);
  51. kalMemZero(gprTcReleaseTraceBuffer, TC_RELEASE_TRACE_BUF_MAX_NUM * sizeof(struct TC_RES_RELEASE_ENTRY));
  52. gprCmdTraceEntry = kalMemAlloc(TXED_CMD_TRACE_BUF_MAX_NUM * sizeof(struct CMD_TRACE_ENTRY), PHY_MEM_TYPE);
  53. kalMemZero(gprCmdTraceEntry, TXED_CMD_TRACE_BUF_MAX_NUM * sizeof(struct CMD_TRACE_ENTRY));
  54. gprCommandEntry = kalMemAlloc(TXED_COMMAND_BUF_MAX_NUM * sizeof(COMMAND_ENTRY), PHY_MEM_TYPE);
  55. kalMemZero(gprCommandEntry, TXED_COMMAND_BUF_MAX_NUM * sizeof(COMMAND_ENTRY));
  56. /* debug for command/tc4 resource end */
  57. }
  58. VOID wlanDebugUninit(VOID)
  59. {
  60. /* debug for command/tc4 resource begin */
  61. kalMemFree(gprTcReleaseTraceBuffer, PHY_MEM_TYPE,
  62. TC_RELEASE_TRACE_BUF_MAX_NUM * sizeof(struct TC_RES_RELEASE_ENTRY));
  63. kalMemFree(gprCmdTraceEntry, PHY_MEM_TYPE, TXED_CMD_TRACE_BUF_MAX_NUM * sizeof(struct CMD_TRACE_ENTRY));
  64. kalMemFree(gprCommandEntry, PHY_MEM_TYPE, TXED_COMMAND_BUF_MAX_NUM * sizeof(COMMAND_ENTRY));
  65. /* debug for command/tc4 resource end */
  66. }
  67. VOID wlanReadFwStatus(P_ADAPTER_T prAdapter)
  68. {
  69. static UINT_16 u2CurEntryCmd;
  70. P_COMMAND_ENTRY prCurCommand = &gprCommandEntry[u2CurEntryCmd];
  71. prCurCommand->u8ReadFwTime = sched_clock();
  72. HAL_MCR_RD(prAdapter, MCR_D2HRM2R, &prCurCommand->u4ReadFwValue);
  73. u2CurEntryCmd++;
  74. if (u2CurEntryCmd == TXED_COMMAND_BUF_MAX_NUM)
  75. u2CurEntryCmd = 0;
  76. }
  77. VOID wlanTraceTxCmd(P_ADAPTER_T prAdapter, P_CMD_INFO_T prCmd)
  78. {
  79. static UINT_16 u2CurEntry;
  80. static UINT_16 u2CurEntryCmd;
  81. struct CMD_TRACE_ENTRY *prCurCmd = &gprCmdTraceEntry[u2CurEntry];
  82. P_COMMAND_ENTRY prCurCommand = &gprCommandEntry[u2CurEntryCmd];
  83. prCurCmd->u8TxTime = sched_clock();
  84. prCurCommand->u8TxTime = prCurCmd->u8TxTime;
  85. prCurCmd->eCmdType = prCmd->eCmdType;
  86. if (prCmd->eCmdType == COMMAND_TYPE_MANAGEMENT_FRAME) {
  87. P_WLAN_MAC_MGMT_HEADER_T prMgmt = (P_WLAN_MAC_MGMT_HEADER_T)((P_MSDU_INFO_T)prCmd->prPacket)->prPacket;
  88. prCurCmd->u.rMgmtFrame.u2FrameCtl = prMgmt->u2FrameCtrl;
  89. prCurCmd->u.rMgmtFrame.u2DurationID = prMgmt->u2Duration;
  90. } else if (prCmd->eCmdType == COMMAND_TYPE_SECURITY_FRAME) {
  91. PUINT_8 pucPkt = (PUINT_8)((struct sk_buff *)prCmd->prPacket)->data;
  92. prCurCmd->u.rSecFrame.u2EthType =
  93. (pucPkt[ETH_TYPE_LEN_OFFSET] << 8) | (pucPkt[ETH_TYPE_LEN_OFFSET + 1]);
  94. } else {
  95. prCurCmd->u.rCmd.ucCID = prCmd->ucCID;
  96. prCurCmd->u.rCmd.ucCmdSeqNum = prCmd->ucCmdSeqNum;
  97. prCurCmd->u.rCmd.fgNeedResp = prCmd->fgNeedResp;
  98. prCurCmd->u.rCmd.fgSetQuery = prCmd->fgSetQuery;
  99. prCurCommand->rCmd.ucCID = prCmd->ucCID;
  100. prCurCommand->rCmd.ucCmdSeqNum = prCmd->ucCmdSeqNum;
  101. prCurCommand->rCmd.fgNeedResp = prCmd->fgNeedResp;
  102. prCurCommand->rCmd.fgSetQuery = prCmd->fgSetQuery;
  103. prCurCommand->u2Counter = u2CurEntryCmd;
  104. u2CurEntryCmd++;
  105. if (u2CurEntryCmd == TXED_COMMAND_BUF_MAX_NUM)
  106. u2CurEntryCmd = 0;
  107. HAL_MCR_RD(prAdapter, MCR_D2HRM2R, &prCurCommand->u4RelCID);
  108. }
  109. u2CurEntry++;
  110. if (u2CurEntry == TC_RELEASE_TRACE_BUF_MAX_NUM)
  111. u2CurEntry = 0;
  112. }
  113. VOID wlanTraceReleaseTcRes(P_ADAPTER_T prAdapter, PUINT_8 aucTxRlsCnt, UINT_8 ucAvailable)
  114. {
  115. static UINT_16 u2CurEntry;
  116. struct TC_RES_RELEASE_ENTRY *prCurBuf = &gprTcReleaseTraceBuffer[u2CurEntry];
  117. HAL_MCR_RD(prAdapter, MCR_D2HRM2R, &prCurBuf->u4RelCID);
  118. prCurBuf->u8RelaseTime = sched_clock();
  119. prCurBuf->ucTc4RelCnt = aucTxRlsCnt[TC4_INDEX];
  120. prCurBuf->ucAvailableTc4 = ucAvailable;
  121. u2CurEntry++;
  122. if (u2CurEntry == TXED_CMD_TRACE_BUF_MAX_NUM)
  123. u2CurEntry = 0;
  124. }
  125. VOID wlanDumpTcResAndTxedCmd(PUINT_8 pucBuf, UINT_32 maxLen)
  126. {
  127. UINT_16 i = 0;
  128. struct CMD_TRACE_ENTRY *prCmd = gprCmdTraceEntry;
  129. struct TC_RES_RELEASE_ENTRY *prTcRel = gprTcReleaseTraceBuffer;
  130. if (pucBuf) {
  131. int bufLen = 0;
  132. for (; i < TXED_CMD_TRACE_BUF_MAX_NUM/2; i++) {
  133. bufLen = snprintf(pucBuf, maxLen,
  134. "%d: Time %llu, Type %d, Content %08x; %d: Time %llu, Type %d, Content %08x\n",
  135. i*2, prCmd[i*2].u8TxTime, prCmd[i*2].eCmdType, *(PUINT_32)(&prCmd[i*2].u.rCmd.ucCID),
  136. i*2+1, prCmd[i*2+1].u8TxTime, prCmd[i*2+1].eCmdType,
  137. *(PUINT_32)(&prCmd[i*2+1].u.rCmd.ucCID));
  138. if (bufLen <= 0)
  139. break;
  140. pucBuf += bufLen;
  141. maxLen -= bufLen;
  142. }
  143. for (i = 0; i < TC_RELEASE_TRACE_BUF_MAX_NUM/2; i++) {
  144. bufLen = snprintf(pucBuf, maxLen,
  145. "%d: Time %llu, Tc4Cnt %d, Free %d, CID %08x; %d: Time %llu, Tc4Cnt %d, Free %d CID %08x\n",
  146. i*2, prTcRel[i*2].u8RelaseTime, prTcRel[i*2].ucTc4RelCnt, prTcRel[i*2].ucAvailableTc4,
  147. prTcRel[i*2].u4RelCID,
  148. i*2+1, prTcRel[i*2+1].u8RelaseTime, prTcRel[i*2+1].ucTc4RelCnt,
  149. prTcRel[i*2+1].ucAvailableTc4, prTcRel[i*2+1].u4RelCID);
  150. if (bufLen <= 0)
  151. break;
  152. pucBuf += bufLen;
  153. maxLen -= bufLen;
  154. }
  155. return;
  156. }
  157. for (; i < TXED_CMD_TRACE_BUF_MAX_NUM/4; i++) {
  158. LOG_FUNC("%d: Time %llu, Type %d, Content %08x; %d: Time %llu, Type %d, Content %08x; ",
  159. i*4, prCmd[i*4].u8TxTime, prCmd[i*4].eCmdType,
  160. *(PUINT_32)(&prCmd[i*4].u.rCmd.ucCID),
  161. i*4+1, prCmd[i*4+1].u8TxTime, prCmd[i*4+1].eCmdType,
  162. *(PUINT_32)(&prCmd[i*4+1].u.rCmd.ucCID));
  163. LOG_FUNC("%d: Time %llu, Type %d, Content %08x; %d: Time %llu, Type %d, Content %08x\n",
  164. i*4+2, prCmd[i*4+2].u8TxTime, prCmd[i*4+2].eCmdType,
  165. *(PUINT_32)(&prCmd[i*4+2].u.rCmd.ucCID),
  166. i*4+3, prCmd[i*4+3].u8TxTime, prCmd[i*4+3].eCmdType,
  167. *(PUINT_32)(&prCmd[i*4+3].u.rCmd.ucCID));
  168. }
  169. for (i = 0; i < TC_RELEASE_TRACE_BUF_MAX_NUM/4; i++) {
  170. LOG_FUNC(
  171. "%d: Time %llu, Tc4Cnt %d, Free %d, CID %08x; %d: Time %llu, Tc4Cnt %d, Free %d, CID %08x;",
  172. i*4, prTcRel[i*4].u8RelaseTime, prTcRel[i*4].ucTc4RelCnt,
  173. prTcRel[i*4].ucAvailableTc4, prTcRel[i*4].u4RelCID,
  174. i*4+1, prTcRel[i*4+1].u8RelaseTime, prTcRel[i*4+1].ucTc4RelCnt,
  175. prTcRel[i*4+1].ucAvailableTc4, prTcRel[i*4+1].u4RelCID);
  176. LOG_FUNC(
  177. " %d: Time %llu, Tc4Cnt %d, Free %d, CID %08x; %d: Time %llu, Tc4Cnt %d, Free %d, CID %08x\n",
  178. i*4+2, prTcRel[i*4+2].u8RelaseTime, prTcRel[i*4+2].ucTc4RelCnt,
  179. prTcRel[i*4+2].ucAvailableTc4, prTcRel[i*4+2].u4RelCID,
  180. i*4+3, prTcRel[i*4+3].u8RelaseTime, prTcRel[i*4+3].ucTc4RelCnt,
  181. prTcRel[i*4+3].ucAvailableTc4, prTcRel[i*4+3].u4RelCID);
  182. }
  183. }
  184. VOID wlanDumpCommandFwStatus(VOID)
  185. {
  186. UINT_16 i = 0;
  187. P_COMMAND_ENTRY prCmd = gprCommandEntry;
  188. LOG_FUNC("Start\n");
  189. for (; i < TXED_COMMAND_BUF_MAX_NUM; i++) {
  190. LOG_FUNC("%d: Time %llu, Content %08x, Count %x, RelCID %08x, ReadFwValue %08x, ReadFwTime %llu\n",
  191. i, prCmd[i].u8TxTime, *(PUINT_32)(&prCmd[i].rCmd.ucCID),
  192. prCmd[i].u2Counter, prCmd[i].u4RelCID,
  193. prCmd[i].u4ReadFwValue, prCmd[i].u8ReadFwTime);
  194. }
  195. }