stats.c 53 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345
  1. /*
  2. ** Id: stats.c#1
  3. */
  4. /*! \file stats.c
  5. \brief This file includes statistics support.
  6. */
  7. /*
  8. ** Log: stats.c
  9. *
  10. * 07 17 2014 samp.lin
  11. * NULL
  12. * Initial version.
  13. */
  14. /*******************************************************************************
  15. * C O M P I L E R F L A G S
  16. ********************************************************************************
  17. */
  18. /*******************************************************************************
  19. * E X T E R N A L R E F E R E N C E S
  20. ********************************************************************************
  21. */
  22. #include "precomp.h"
  23. enum EVENT_TYPE {
  24. EVENT_RX,
  25. EVENT_TX,
  26. EVENT_TX_DONE
  27. };
  28. /*******************************************************************************
  29. * C O N S T A N T S
  30. ********************************************************************************
  31. */
  32. /*******************************************************************************
  33. * F U N C T I O N D E C L A R A T I O N S
  34. ********************************************************************************
  35. */
  36. static void statsInfoEnvDisplay(GLUE_INFO_T *prGlueInfo, UINT8 *prInBuf, UINT32 u4InBufLen);
  37. static WLAN_STATUS
  38. statsInfoEnvRequest(ADAPTER_T *prAdapter, VOID *pvSetBuffer, UINT_32 u4SetBufferLen, UINT_32 *pu4SetInfoLen);
  39. /*******************************************************************************
  40. * P U B L I C D A T A
  41. ********************************************************************************
  42. */
  43. UINT_64 u8DrvOwnStart, u8DrvOwnEnd;
  44. UINT32 u4DrvOwnMax = 0;
  45. #define CFG_USER_LOAD 0
  46. static UINT_16 su2TxDoneCfg = CFG_DHCP | CFG_ICMP | CFG_EAPOL;
  47. /*******************************************************************************
  48. * P R I V A T E F U N C T I O N S
  49. ********************************************************************************
  50. */
  51. /*----------------------------------------------------------------------------*/
  52. /*! \brief This routine is called to display all environment log.
  53. *
  54. * \param[in] prGlueInfo Pointer to the Adapter structure
  55. * \param[in] prInBuf A pointer to the command string buffer, from u4EventSubId
  56. * \param[in] u4InBufLen The length of the buffer
  57. * \param[out] None
  58. *
  59. * \retval None
  60. *
  61. */
  62. /*----------------------------------------------------------------------------*/
  63. static void statsInfoEnvDisplay(GLUE_INFO_T *prGlueInfo, UINT8 *prInBuf, UINT32 u4InBufLen)
  64. {
  65. P_ADAPTER_T prAdapter;
  66. STA_RECORD_T *prStaRec;
  67. UINT32 u4NumOfInfo, u4InfoId;
  68. UINT32 u4RxErrBitmap;
  69. STATS_INFO_ENV_T *prInfo;
  70. UINT32 u4Total, u4RateId;
  71. /*
  72. [wlan] statsInfoEnvRequest: (INIT INFO) statsInfoEnvRequest cmd ok.
  73. [wlan] statsEventHandle: (INIT INFO) <stats> statsEventHandle: Rcv a event
  74. [wlan] statsEventHandle: (INIT INFO) <stats> statsEventHandle: Rcv a event: 0
  75. [wlan] statsInfoEnvDisplay: (INIT INFO) <stats> Display stats for [00:0c:43:31:35:97]:
  76. [wlan] statsInfoEnvDisplay: (INIT INFO) <stats> TPAM(0x0) RTS(0 0) BA(0x1 0) OK(9 9 xxx) ERR(0 0 0 0 0 0 0)
  77. TPAM (bit0: enable 40M, bit1: enable 20 short GI, bit2: enable 40 short GI,
  78. bit3: use 40M TX, bit4: use short GI TX, bit5: use no ack)
  79. RTS (1st: current use RTS/CTS, 2nd: ever use RTS/CTS)
  80. BA (1st: TX session BA bitmap for TID0 ~ TID7, 2nd: peer receive maximum agg number)
  81. OK (1st: total number of tx packet from host, 2nd: total number of tx ok, system time last TX OK)
  82. ERR (1st: total number of tx err, 2nd ~ 7st: total number of
  83. WLAN_STATUS_BUFFER_RETAINED, WLAN_STATUS_PACKET_FLUSHED, WLAN_STATUS_PACKET_AGING_TIMEOUT,
  84. WLAN_STATUS_PACKET_MPDU_ERROR, WLAN_STATUS_PACKET_RTS_ERROR, WLAN_STATUS_PACKET_LIFETIME_ERROR)
  85. [wlan] statsInfoEnvDisplay: (INIT INFO) <stats> TRATE (6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) (0 0 0 0 0 0 0 3)
  86. TX rate count (1M 2 5.5 11 NA NA NA NA 48 24 12 6 54 36 18 9) (MCS0 ~ MCS7)
  87. [wlan] statsInfoEnvDisplay: (INIT INFO) <stats> RX(148 1 0) BA(0x1 64) OK(2 2) ERR(0)
  88. RX (1st: latest RCPI, 2nd: chan num)
  89. BA (1st: RX session BA bitmap for TID0 ~ TID7, 2nd: our receive maximum agg number)
  90. OK (number of rx packets without error, number of rx packets to OS)
  91. ERR (number of rx packets with error)
  92. [wlan] statsInfoEnvDisplay: (INIT INFO) <stats> RCCK (0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)
  93. CCK MODE (1 2 5.5 11M)
  94. [wlan] statsInfoEnvDisplay: (INIT INFO) <stats> ROFDM (0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)
  95. OFDM MODE (NA NA NA NA 6 9 12 18 24 36 48 54M)
  96. [wlan] statsInfoEnvDisplay: (INIT INFO) <stats> RHT (0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0)
  97. MIXED MODE (number of rx packets with MCS0 ~ MCS15)
  98. [wlan] statsInfoEnvDisplay: (INIT INFO) <stats> StayIntH2M us (29 29 32) (0 0 0) (0 0 0)
  99. delay from HIF to MAC own bit=1 (min, avg, max for 500B) (min, avg, max for 1000B) (min, avg, max for others)
  100. [wlan] statsInfoEnvDisplay: (INIT INFO) <stats> AirTime us (608 864 4480) (0 0 0) (0 0 0)
  101. delay from MAC start TX to MAC TX done
  102. [wlan] statsInfoEnvDisplay: (INIT INFO) <stats> StayInt us (795 1052 4644_4504) (0 0 0_0) (0 0 0_0)
  103. delay from HIF to MAC TX done (min, avg, max_system time for 500B)
  104. [wlan] statsInfoEnvDisplay: (INIT INFO) <stats> StayIntD2T us (795 1052 4644) (0 0 0) (0 0 0)
  105. delay from driver to MAC TX done (min, avg, max for 500B)
  106. [wlan] statsInfoEnvDisplay: (INIT INFO) <stats> StayIntR_M2H us (37 40 58) (0 0 0) (0 0 0)
  107. delay from MAC to HIF (min, avg, max for 500B)
  108. [wlan] statsInfoEnvDisplay: (INIT INFO) <stats> StayIntR_H2D us (0 0 0) (0 0 0) (0 0 0)
  109. delay from HIF to Driver OS (min, avg, max for 500B)
  110. [wlan] statsInfoEnvDisplay: (INIT INFO) <stats> StayCntD2H unit:10ms (10 0 0 0)
  111. delay count from Driver to HIF (count in 0~10ms, 10~20ms, 20~30ms, others)
  112. [wlan] statsInfoEnvDisplay: (INIT INFO) <stats> StayCnt unit:1ms (6 3 0 1)
  113. delay count from HIF to TX DONE (count in 0~1ms, 1~5ms, 5~10ms, others)
  114. [wlan] statsInfoEnvDisplay: (INIT INFO) <stats> StayCnt (0~1161:7) (1161~2322:2) (2322~3483:0) (3483~4644:0) (4644~:1)
  115. delay count from HIF to TX DONE (count in 0~1161 ticks, 1161~2322, 2322~3483, 3483~4644, others)
  116. [wlan] statsInfoEnvDisplay: (INIT INFO) <stats> OTHER (61877) (0) (38) (0) (0) (0ms)
  117. Channel idle time, scan count, channel change count, empty tx quota count,
  118. power save change count from active to PS, maximum delay from PS to active
  119. */
  120. /* init */
  121. prAdapter = prGlueInfo->prAdapter;
  122. /*prInfo = &rStatsInfoEnv;*/
  123. prInfo = kalMemAlloc(sizeof(STATS_INFO_ENV_T), VIR_MEM_TYPE);
  124. if (prInfo == NULL) {
  125. DBGLOG(RX, INFO, "prInfo alloc fail");
  126. return;
  127. }
  128. kalMemZero(prInfo, sizeof(STATS_INFO_ENV_T));
  129. if (u4InBufLen > sizeof(STATS_INFO_ENV_T))
  130. u4InBufLen = sizeof(STATS_INFO_ENV_T);
  131. /* parse */
  132. u4NumOfInfo = *(UINT32 *) prInBuf;
  133. u4RxErrBitmap = *(UINT32 *) (prInBuf + 4);
  134. /* print */
  135. for (u4InfoId = 0; u4InfoId < u4NumOfInfo; u4InfoId++) {
  136. /*
  137. use u4InBufLen, not sizeof(rStatsInfoEnv)
  138. because the firmware version maybe not equal to driver version
  139. */
  140. kalMemCopy(prInfo, prInBuf + 8, u4InBufLen);
  141. prStaRec = cnmGetStaRecByIndex(prAdapter, prInfo->ucStaRecIdx);
  142. if (prStaRec == NULL)
  143. continue;
  144. DBGLOG(RX, INFO, "<stats> Display stats for [%pM]: %uB\n",
  145. prStaRec->aucMacAddr, (UINT32) sizeof(STATS_INFO_ENV_T));
  146. if (prStaRec->ucStatsGenDisplayCnt++ > 10) {
  147. /* display general statistics information every 10 * (5 or 10s) */
  148. DBGLOG(RX, INFO, "<stats> TBA(0x%x %u) RBA(0x%x %u)\n",
  149. prInfo->ucTxAggBitmap, prInfo->ucTxPeerAggMaxSize,
  150. prInfo->ucRxAggBitmap, prInfo->ucRxAggMaxSize);
  151. prStaRec->ucStatsGenDisplayCnt = 0;
  152. }
  153. if (prInfo->u4TxDataCntErr == 0) {
  154. DBGLOG(RX, INFO, "<stats> TOS(%u) OK(%u %u)\n",
  155. (UINT32) prGlueInfo->rNetDevStats.tx_packets,
  156. prInfo->u4TxDataCntAll, prInfo->u4TxDataCntOK);
  157. } else {
  158. DBGLOG(RX, INFO, "<stats> TOS(%u) OK(%u %u) ERR(%u)\n",
  159. (UINT32) prGlueInfo->rNetDevStats.tx_packets,
  160. prInfo->u4TxDataCntAll, prInfo->u4TxDataCntOK, prInfo->u4TxDataCntErr);
  161. DBGLOG(RX, INFO, "<stats> ERR type(%u %u %u %u %u %u)\n",
  162. prInfo->u4TxDataCntErrType[0], prInfo->u4TxDataCntErrType[1],
  163. prInfo->u4TxDataCntErrType[2], prInfo->u4TxDataCntErrType[3],
  164. prInfo->u4TxDataCntErrType[4], prInfo->u4TxDataCntErrType[5]);
  165. }
  166. for (u4RateId = 1, u4Total = 0; u4RateId < 16; u4RateId++)
  167. u4Total += prInfo->u4TxRateCntNonHT[u4RateId];
  168. if (u4Total > 0) {
  169. DBGLOG(RX, INFO, "<stats> non-HT TRATE (%u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u)\n",
  170. prInfo->u4TxRateCntNonHT[0], prInfo->u4TxRateCntNonHT[1],
  171. prInfo->u4TxRateCntNonHT[2], prInfo->u4TxRateCntNonHT[3],
  172. prInfo->u4TxRateCntNonHT[4], prInfo->u4TxRateCntNonHT[5],
  173. prInfo->u4TxRateCntNonHT[6], prInfo->u4TxRateCntNonHT[7],
  174. prInfo->u4TxRateCntNonHT[8], prInfo->u4TxRateCntNonHT[9],
  175. prInfo->u4TxRateCntNonHT[10], prInfo->u4TxRateCntNonHT[11],
  176. prInfo->u4TxRateCntNonHT[12], prInfo->u4TxRateCntNonHT[13],
  177. prInfo->u4TxRateCntNonHT[14], prInfo->u4TxRateCntNonHT[15]);
  178. }
  179. if (prInfo->u4TxRateCntNonHT[0] > 0) {
  180. DBGLOG(RX, INFO, "<stats> HT TRATE (1M %u) (%u %u %u %u %u %u %u %u)\n",
  181. prInfo->u4TxRateCntNonHT[0],
  182. prInfo->u4TxRateCntHT[0], prInfo->u4TxRateCntHT[1],
  183. prInfo->u4TxRateCntHT[2], prInfo->u4TxRateCntHT[3],
  184. prInfo->u4TxRateCntHT[4], prInfo->u4TxRateCntHT[5],
  185. prInfo->u4TxRateCntHT[6], prInfo->u4TxRateCntHT[7]);
  186. } else {
  187. DBGLOG(RX, INFO, "<stats> HT TRATE (%u %u %u %u %u %u %u %u)\n",
  188. prInfo->u4TxRateCntHT[0], prInfo->u4TxRateCntHT[1],
  189. prInfo->u4TxRateCntHT[2], prInfo->u4TxRateCntHT[3],
  190. prInfo->u4TxRateCntHT[4], prInfo->u4TxRateCntHT[5],
  191. prInfo->u4TxRateCntHT[6], prInfo->u4TxRateCntHT[7]);
  192. }
  193. if ((prStaRec->u4RxReorderFallAheadCnt != 0) ||
  194. (prStaRec->u4RxReorderFallBehindCnt != 0) || (prStaRec->u4RxReorderHoleCnt != 0)) {
  195. DBGLOG(RX, INFO, "<stats> TREORDER (%u %u %u)\n",
  196. prStaRec->u4RxReorderFallAheadCnt,
  197. prStaRec->u4RxReorderFallBehindCnt, prStaRec->u4RxReorderHoleCnt);
  198. }
  199. if (prInfo->u4RxDataCntErr == 0) {
  200. DBGLOG(RX, INFO, "<stats> ROK(%u %u)\n",
  201. prInfo->u4RxDataCntAll, prStaRec->u4StatsRxPassToOsCnt);
  202. } else {
  203. DBGLOG(RX, INFO, "<stats> ROK(%u %u) ERR(%u)\n",
  204. prInfo->u4RxDataCntAll, prStaRec->u4StatsRxPassToOsCnt,
  205. prInfo->u4RxDataCntErr);
  206. }
  207. for (u4RateId = 1, u4Total = 0; u4RateId < 16; u4RateId++)
  208. u4Total += prInfo->u4RxRateCnt[0][u4RateId] + prInfo->u4RxRateRetryCnt[0][u4RateId];
  209. if (u4Total > 0) {
  210. for (u4RateId = 0, u4Total = 0; u4RateId < 16; u4RateId++)
  211. u4Total += prInfo->u4RxRateRetryCnt[0][u4RateId];
  212. if (u4Total > 0) {
  213. DBGLOG(RX, INFO,
  214. "<stats> RCCK (%u %u) (%u %u) (%u %u) (%u %u) (%u %u) (%u %u) (%u %u)\n"
  215. "(%u %u)(%u %u) (%u %u) (%u %u) (%u %u) (%u %u) (%u %u) (%u %u) (%u %u)\n",
  216. prInfo->u4RxRateCnt[0][0], prInfo->u4RxRateRetryCnt[0][0],
  217. prInfo->u4RxRateCnt[0][1], prInfo->u4RxRateRetryCnt[0][1],
  218. prInfo->u4RxRateCnt[0][2], prInfo->u4RxRateRetryCnt[0][2],
  219. prInfo->u4RxRateCnt[0][3], prInfo->u4RxRateRetryCnt[0][3],
  220. prInfo->u4RxRateCnt[0][4], prInfo->u4RxRateRetryCnt[0][4],
  221. prInfo->u4RxRateCnt[0][5], prInfo->u4RxRateRetryCnt[0][5],
  222. prInfo->u4RxRateCnt[0][6], prInfo->u4RxRateRetryCnt[0][6],
  223. prInfo->u4RxRateCnt[0][7], prInfo->u4RxRateRetryCnt[0][7],
  224. prInfo->u4RxRateCnt[0][8], prInfo->u4RxRateRetryCnt[0][8],
  225. prInfo->u4RxRateCnt[0][9], prInfo->u4RxRateRetryCnt[0][9],
  226. prInfo->u4RxRateCnt[0][10], prInfo->u4RxRateRetryCnt[0][10],
  227. prInfo->u4RxRateCnt[0][11], prInfo->u4RxRateRetryCnt[0][11],
  228. prInfo->u4RxRateCnt[0][12], prInfo->u4RxRateRetryCnt[0][12],
  229. prInfo->u4RxRateCnt[0][13], prInfo->u4RxRateRetryCnt[0][13],
  230. prInfo->u4RxRateCnt[0][14], prInfo->u4RxRateRetryCnt[0][14],
  231. prInfo->u4RxRateCnt[0][15], prInfo->u4RxRateRetryCnt[0][15]);
  232. } else {
  233. DBGLOG(RX, INFO, "<stats> RCCK (%u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u)\n",
  234. prInfo->u4RxRateCnt[0][0],
  235. prInfo->u4RxRateCnt[0][1],
  236. prInfo->u4RxRateCnt[0][2],
  237. prInfo->u4RxRateCnt[0][3],
  238. prInfo->u4RxRateCnt[0][4],
  239. prInfo->u4RxRateCnt[0][5],
  240. prInfo->u4RxRateCnt[0][6],
  241. prInfo->u4RxRateCnt[0][7],
  242. prInfo->u4RxRateCnt[0][8],
  243. prInfo->u4RxRateCnt[0][9],
  244. prInfo->u4RxRateCnt[0][10],
  245. prInfo->u4RxRateCnt[0][11],
  246. prInfo->u4RxRateCnt[0][12],
  247. prInfo->u4RxRateCnt[0][13],
  248. prInfo->u4RxRateCnt[0][14], prInfo->u4RxRateCnt[0][15]);
  249. }
  250. } else {
  251. if ((prInfo->u4RxRateCnt[0][0] + prInfo->u4RxRateRetryCnt[0][0]) > 0) {
  252. DBGLOG(RX, INFO, "<stats> RCCK (%u %u)\n",
  253. prInfo->u4RxRateCnt[0][0], prInfo->u4RxRateRetryCnt[0][0]);
  254. }
  255. }
  256. for (u4RateId = 0, u4Total = 0; u4RateId < 16; u4RateId++)
  257. u4Total += prInfo->u4RxRateCnt[1][u4RateId] + prInfo->u4RxRateRetryCnt[1][u4RateId];
  258. if (u4Total > 0) {
  259. for (u4RateId = 0, u4Total = 0; u4RateId < 16; u4RateId++)
  260. u4Total += prInfo->u4RxRateRetryCnt[1][u4RateId];
  261. if (u4Total > 0) {
  262. DBGLOG(RX, INFO,
  263. "<stats> ROFDM (%u %u) (%u %u) (%u %u) (%u %u) (%u %u) (%u %u) (%u %u)\n"
  264. "(%u %u)(%u %u) (%u %u) (%u %u) (%u %u) (%u %u) (%u %u) (%u %u) (%u %u)\n",
  265. prInfo->u4RxRateCnt[1][0], prInfo->u4RxRateRetryCnt[1][0],
  266. prInfo->u4RxRateCnt[1][1], prInfo->u4RxRateRetryCnt[1][1],
  267. prInfo->u4RxRateCnt[1][2], prInfo->u4RxRateRetryCnt[1][2],
  268. prInfo->u4RxRateCnt[1][3], prInfo->u4RxRateRetryCnt[1][3],
  269. prInfo->u4RxRateCnt[1][4], prInfo->u4RxRateRetryCnt[1][4],
  270. prInfo->u4RxRateCnt[1][5], prInfo->u4RxRateRetryCnt[1][5],
  271. prInfo->u4RxRateCnt[1][6], prInfo->u4RxRateRetryCnt[1][6],
  272. prInfo->u4RxRateCnt[1][7], prInfo->u4RxRateRetryCnt[1][7],
  273. prInfo->u4RxRateCnt[1][8], prInfo->u4RxRateRetryCnt[1][8],
  274. prInfo->u4RxRateCnt[1][9], prInfo->u4RxRateRetryCnt[1][9],
  275. prInfo->u4RxRateCnt[1][10], prInfo->u4RxRateRetryCnt[1][10],
  276. prInfo->u4RxRateCnt[1][11], prInfo->u4RxRateRetryCnt[1][11],
  277. prInfo->u4RxRateCnt[1][12], prInfo->u4RxRateRetryCnt[1][12],
  278. prInfo->u4RxRateCnt[1][13], prInfo->u4RxRateRetryCnt[1][13],
  279. prInfo->u4RxRateCnt[1][14], prInfo->u4RxRateRetryCnt[1][14],
  280. prInfo->u4RxRateCnt[1][15], prInfo->u4RxRateRetryCnt[1][15]);
  281. } else {
  282. DBGLOG(RX, INFO, "<stats> ROFDM (%u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u)\n",
  283. prInfo->u4RxRateCnt[1][0],
  284. prInfo->u4RxRateCnt[1][1],
  285. prInfo->u4RxRateCnt[1][2],
  286. prInfo->u4RxRateCnt[1][3],
  287. prInfo->u4RxRateCnt[1][4],
  288. prInfo->u4RxRateCnt[1][5],
  289. prInfo->u4RxRateCnt[1][6],
  290. prInfo->u4RxRateCnt[1][7],
  291. prInfo->u4RxRateCnt[1][8],
  292. prInfo->u4RxRateCnt[1][9],
  293. prInfo->u4RxRateCnt[1][10],
  294. prInfo->u4RxRateCnt[1][11],
  295. prInfo->u4RxRateCnt[1][12],
  296. prInfo->u4RxRateCnt[1][13],
  297. prInfo->u4RxRateCnt[1][14], prInfo->u4RxRateCnt[1][15]);
  298. }
  299. }
  300. for (u4RateId = 0, u4Total = 0; u4RateId < 16; u4RateId++)
  301. u4Total += prInfo->u4RxRateCnt[2][u4RateId] + prInfo->u4RxRateRetryCnt[2][u4RateId];
  302. if (u4Total > 0) {
  303. for (u4RateId = 0, u4Total = 0; u4RateId < 16; u4RateId++)
  304. u4Total += prInfo->u4RxRateRetryCnt[2][u4RateId];
  305. if (u4Total > 0) {
  306. DBGLOG(RX, INFO, "<stats> RHT\n"
  307. "(%u %u) (%u %u) (%u %u) (%u %u) (%u %u) (%u %u) (%u %u) (%u %u)\n",
  308. prInfo->u4RxRateCnt[2][0], prInfo->u4RxRateRetryCnt[2][0],
  309. prInfo->u4RxRateCnt[2][1], prInfo->u4RxRateRetryCnt[2][1],
  310. prInfo->u4RxRateCnt[2][2], prInfo->u4RxRateRetryCnt[2][2],
  311. prInfo->u4RxRateCnt[2][3], prInfo->u4RxRateRetryCnt[2][3],
  312. prInfo->u4RxRateCnt[2][4], prInfo->u4RxRateRetryCnt[2][4],
  313. prInfo->u4RxRateCnt[2][5], prInfo->u4RxRateRetryCnt[2][5],
  314. prInfo->u4RxRateCnt[2][6], prInfo->u4RxRateRetryCnt[2][6],
  315. prInfo->u4RxRateCnt[2][7], prInfo->u4RxRateRetryCnt[2][7]);
  316. } else {
  317. DBGLOG(RX, INFO, "<stats> RHT (%u %u %u %u %u %u %u %u)\n",
  318. prInfo->u4RxRateCnt[2][0],
  319. prInfo->u4RxRateCnt[2][1],
  320. prInfo->u4RxRateCnt[2][2],
  321. prInfo->u4RxRateCnt[2][3],
  322. prInfo->u4RxRateCnt[2][4],
  323. prInfo->u4RxRateCnt[2][5],
  324. prInfo->u4RxRateCnt[2][6], prInfo->u4RxRateCnt[2][7]);
  325. }
  326. }
  327. /* RX drop counts */
  328. for (u4RateId = 0, u4Total = 0; u4RateId < 20; u4RateId++)
  329. u4Total += prInfo->u4NumOfRxDrop[u4RateId];
  330. if (u4Total > 0) {
  331. DBGLOG(RX, INFO, "<stats> RX Drop Count: (%u) (%u) (%u) (%u) (%u) (%u) (%u) (%u)\n"
  332. " (%u) (%u) (%u) (%u) (%u) (%u) (%u) (%u) (%u) (%u) (%u) (%u)\n",
  333. prInfo->u4NumOfRxDrop[0], prInfo->u4NumOfRxDrop[1],
  334. prInfo->u4NumOfRxDrop[2], prInfo->u4NumOfRxDrop[3],
  335. prInfo->u4NumOfRxDrop[4], prInfo->u4NumOfRxDrop[5],
  336. prInfo->u4NumOfRxDrop[6], prInfo->u4NumOfRxDrop[7],
  337. prInfo->u4NumOfRxDrop[8], prInfo->u4NumOfRxDrop[9],
  338. prInfo->u4NumOfRxDrop[10], prInfo->u4NumOfRxDrop[11],
  339. prInfo->u4NumOfRxDrop[12], prInfo->u4NumOfRxDrop[13],
  340. prInfo->u4NumOfRxDrop[14], prInfo->u4NumOfRxDrop[15],
  341. prInfo->u4NumOfRxDrop[16], prInfo->u4NumOfRxDrop[17],
  342. prInfo->u4NumOfRxDrop[18], prInfo->u4NumOfRxDrop[19]);
  343. }
  344. /* delay from HIF RX to HIF RX Done */
  345. if (((prInfo->u4StayIntMinHR2HRD[1] + prInfo->u4StayIntAvgHR2HRD[1] +
  346. prInfo->u4StayIntMaxHR2HRD[1]) > 0) ||
  347. ((prInfo->u4StayIntMinHR2HRD[2] + prInfo->u4StayIntAvgHR2HRD[2] +
  348. prInfo->u4StayIntMaxHR2HRD[2]) > 0)) {
  349. DBGLOG(RX, INFO, "<stats> StayIntR_HR2HRD us (%u %u %u) (%u %u %u) (%u %u %u)\n",
  350. prInfo->u4StayIntMinHR2HRD[0], prInfo->u4StayIntAvgHR2HRD[0],
  351. prInfo->u4StayIntMaxHR2HRD[0],
  352. prInfo->u4StayIntMinHR2HRD[1], prInfo->u4StayIntAvgHR2HRD[1],
  353. prInfo->u4StayIntMaxHR2HRD[1],
  354. prInfo->u4StayIntMinHR2HRD[2], prInfo->u4StayIntAvgHR2HRD[2],
  355. prInfo->u4StayIntMaxHR2HRD[2]);
  356. } else {
  357. DBGLOG(RX, INFO, "<stats> StayIntR_HR2HRD us (%u %u %u)\n",
  358. prInfo->u4StayIntMinHR2HRD[0], prInfo->u4StayIntAvgHR2HRD[0],
  359. prInfo->u4StayIntMaxHR2HRD[0]);
  360. }
  361. /* others */
  362. DBGLOG(RX, INFO, "<stats> OTHER (%u) (%u) (%u) (%x)\n",
  363. prInfo->u4RxFifoFullCnt, prAdapter->ucScanTime,
  364. prInfo->u4NumOfChanChange, prInfo->u4CurrChnlInfo);
  365. #if CFG_SUPPORT_THERMO_THROTTLING
  366. prAdapter->u4AirDelayTotal = (prInfo->u4AirDelayTotal << 5) / 400000;
  367. #endif
  368. /* reset */
  369. kalMemZero(prStaRec->u4StayIntMinRx, sizeof(prStaRec->u4StayIntMinRx));
  370. kalMemZero(prStaRec->u4StayIntAvgRx, sizeof(prStaRec->u4StayIntAvgRx));
  371. kalMemZero(prStaRec->u4StayIntMaxRx, sizeof(prStaRec->u4StayIntMaxRx));
  372. prStaRec->u4StatsRxPassToOsCnt = 0;
  373. prStaRec->u4RxReorderFallAheadCnt = 0;
  374. prStaRec->u4RxReorderFallBehindCnt = 0;
  375. prStaRec->u4RxReorderHoleCnt = 0;
  376. }
  377. STATS_DRIVER_OWN_RESET();
  378. kalMemFree(prInfo, VIR_MEM_TYPE, sizeof(STATS_INFO_ENV_T));
  379. }
  380. #if 0
  381. /*----------------------------------------------------------------------------*/
  382. /*! \brief This routine is called to display all environment log.
  383. *
  384. * \param[in] prGlueInfo Pointer to the Adapter structure
  385. * \param[in] prInBuf A pointer to the command string buffer, from u4EventSubId
  386. * \param[in] u4InBufLen The length of the buffer
  387. * \param[out] None
  388. *
  389. * \retval None
  390. *
  391. */
  392. /*----------------------------------------------------------------------------*/
  393. static void statsInfoEnvDisplay(GLUE_INFO_T *prGlueInfo, UINT8 *prInBuf, UINT32 u4InBufLen)
  394. {
  395. P_ADAPTER_T prAdapter;
  396. STA_RECORD_T *prStaRec;
  397. UINT32 u4NumOfInfo, u4InfoId;
  398. UINT32 u4RxErrBitmap;
  399. STATS_INFO_ENV_T rStatsInfoEnv, *prInfo;
  400. /*
  401. [wlan] statsInfoEnvRequest: (INIT INFO) statsInfoEnvRequest cmd ok.
  402. [wlan] statsEventHandle: (INIT INFO) <stats> statsEventHandle: Rcv a event
  403. [wlan] statsEventHandle: (INIT INFO) <stats> statsEventHandle: Rcv a event: 0
  404. [wlan] statsInfoEnvDisplay: (INIT INFO) <stats> Display stats for [00:0c:43:31:35:97]:
  405. [wlan] statsInfoEnvDisplay: (INIT INFO) <stats> TPAM(0x0) RTS(0 0) BA(0x1 0) OK(9 9 xxx) ERR(0 0 0 0 0 0 0)
  406. TPAM (bit0: enable 40M, bit1: enable 20 short GI, bit2: enable 40 short GI,
  407. bit3: use 40M TX, bit4: use short GI TX, bit5: use no ack)
  408. RTS (1st: current use RTS/CTS, 2nd: ever use RTS/CTS)
  409. BA (1st: TX session BA bitmap for TID0 ~ TID7, 2nd: peer receive maximum agg number)
  410. OK (1st: total number of tx packet from host, 2nd: total number of tx ok, system time last TX OK)
  411. ERR (1st: total number of tx err, 2nd ~ 7st: total number of
  412. WLAN_STATUS_BUFFER_RETAINED, WLAN_STATUS_PACKET_FLUSHED, WLAN_STATUS_PACKET_AGING_TIMEOUT,
  413. WLAN_STATUS_PACKET_MPDU_ERROR, WLAN_STATUS_PACKET_RTS_ERROR, WLAN_STATUS_PACKET_LIFETIME_ERROR)
  414. [wlan] statsInfoEnvDisplay: (INIT INFO) <stats> TRATE (6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) (0 0 0 0 0 0 0 3)
  415. TX rate count (1M 2 5.5 11 NA NA NA NA 48 24 12 6 54 36 18 9) (MCS0 ~ MCS7)
  416. [wlan] statsInfoEnvDisplay: (INIT INFO) <stats> RX(148 1 0) BA(0x1 64) OK(2 2) ERR(0)
  417. RX (1st: latest RCPI, 2nd: chan num)
  418. BA (1st: RX session BA bitmap for TID0 ~ TID7, 2nd: our receive maximum agg number)
  419. OK (number of rx packets without error, number of rx packets to OS)
  420. ERR (number of rx packets with error)
  421. [wlan] statsInfoEnvDisplay: (INIT INFO) <stats> RCCK (0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)
  422. CCK MODE (1 2 5.5 11M)
  423. [wlan] statsInfoEnvDisplay: (INIT INFO) <stats> ROFDM (0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)
  424. OFDM MODE (NA NA NA NA 6 9 12 18 24 36 48 54M)
  425. [wlan] statsInfoEnvDisplay: (INIT INFO) <stats> RHT (0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0)
  426. MIXED MODE (number of rx packets with MCS0 ~ MCS15)
  427. [wlan] statsInfoEnvDisplay: (INIT INFO) <stats> StayIntH2M us (29 29 32) (0 0 0) (0 0 0)
  428. delay from HIF to MAC own bit=1 (min, avg, max for 500B) (min, avg, max for 1000B) (min, avg, max for others)
  429. [wlan] statsInfoEnvDisplay: (INIT INFO) <stats> AirTime us (608 864 4480) (0 0 0) (0 0 0)
  430. delay from MAC start TX to MAC TX done
  431. [wlan] statsInfoEnvDisplay: (INIT INFO) <stats> StayInt us (795 1052 4644_4504) (0 0 0_0) (0 0 0_0)
  432. delay from HIF to MAC TX done (min, avg, max_system time for 500B)
  433. [wlan] statsInfoEnvDisplay: (INIT INFO) <stats> StayIntD2T us (795 1052 4644) (0 0 0) (0 0 0)
  434. delay from driver to MAC TX done (min, avg, max for 500B)
  435. [wlan] statsInfoEnvDisplay: (INIT INFO) <stats> StayIntR_M2H us (37 40 58) (0 0 0) (0 0 0)
  436. delay from MAC to HIF (min, avg, max for 500B)
  437. [wlan] statsInfoEnvDisplay: (INIT INFO) <stats> StayIntR_H2D us (0 0 0) (0 0 0) (0 0 0)
  438. delay from HIF to Driver OS (min, avg, max for 500B)
  439. [wlan] statsInfoEnvDisplay: (INIT INFO) <stats> StayCntD2H unit:10ms (10 0 0 0)
  440. delay count from Driver to HIF (count in 0~10ms, 10~20ms, 20~30ms, others)
  441. [wlan] statsInfoEnvDisplay: (INIT INFO) <stats> StayCnt unit:1ms (6 3 0 1)
  442. delay count from HIF to TX DONE (count in 0~1ms, 1~5ms, 5~10ms, others)
  443. [wlan] statsInfoEnvDisplay: (INIT INFO) <stats> StayCnt (0~1161:7) (1161~2322:2) (2322~3483:0) (3483~4644:0) (4644~:1)
  444. delay count from HIF to TX DONE (count in 0~1161 ticks, 1161~2322, 2322~3483, 3483~4644, others)
  445. [wlan] statsInfoEnvDisplay: (INIT INFO) <stats> OTHER (61877) (0) (38) (0) (0) (0ms)
  446. Channel idle time, scan count, channel change count, empty tx quota count,
  447. power save change count from active to PS, maximum delay from PS to active
  448. */
  449. /* init */
  450. prAdapter = prGlueInfo->prAdapter;
  451. prInfo = &rStatsInfoEnv;
  452. kalMemZero(&rStatsInfoEnv, sizeof(rStatsInfoEnv));
  453. if (u4InBufLen > sizeof(rStatsInfoEnv))
  454. u4InBufLen = sizeof(rStatsInfoEnv);
  455. /* parse */
  456. u4NumOfInfo = *(UINT32 *) prInBuf;
  457. u4RxErrBitmap = *(UINT32 *) (prInBuf + 4);
  458. /* print */
  459. for (u4InfoId = 0; u4InfoId < u4NumOfInfo; u4InfoId++) {
  460. /*
  461. use u4InBufLen, not sizeof(rStatsInfoEnv)
  462. because the firmware version maybe not equal to driver version
  463. */
  464. kalMemCopy(&rStatsInfoEnv, prInBuf + 8, u4InBufLen);
  465. prStaRec = cnmGetStaRecByIndex(prAdapter, rStatsInfoEnv.ucStaRecIdx);
  466. if (prStaRec == NULL)
  467. continue;
  468. DBGLOG(RX, INFO, "<stats> Display stats V%d.%d for [%pM]: %uB %ums\n",
  469. prInfo->ucFwVer[0], prInfo->ucFwVer[1],
  470. (prStaRec->aucMacAddr), (UINT32) sizeof(STATS_INFO_ENV_T),
  471. prInfo->u4ReportSysTime);
  472. DBGLOG(RX, INFO, "<stats>TPAM(0x%x)RTS(%u %u)BA(0x%x %u)OS(%u)OK(%u %u)ERR(%u %u %u %u %u %u %u)\n",
  473. prInfo->ucTxParam,
  474. prInfo->fgTxIsRtsUsed, prInfo->fgTxIsRtsEverUsed,
  475. prInfo->ucTxAggBitmap, prInfo->ucTxPeerAggMaxSize,
  476. (UINT32) prGlueInfo->rNetDevStats.tx_packets,
  477. prInfo->u4TxDataCntAll, prInfo->u4TxDataCntOK,
  478. prInfo->u4TxDataCntErr, prInfo->u4TxDataCntErrType[0],
  479. prInfo->u4TxDataCntErrType[1], prInfo->u4TxDataCntErrType[2],
  480. prInfo->u4TxDataCntErrType[3], prInfo->u4TxDataCntErrType[4],
  481. prInfo->u4TxDataCntErrType[5]));
  482. DBGLOG(RX, INFO, "TRATE(%u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u)\n",
  483. prInfo->u4TxRateCntNonHT[0], prInfo->u4TxRateCntNonHT[1],
  484. prInfo->u4TxRateCntNonHT[2], prInfo->u4TxRateCntNonHT[3],
  485. prInfo->u4TxRateCntNonHT[4], prInfo->u4TxRateCntNonHT[5],
  486. prInfo->u4TxRateCntNonHT[6], prInfo->u4TxRateCntNonHT[7],
  487. prInfo->u4TxRateCntNonHT[8], prInfo->u4TxRateCntNonHT[9],
  488. prInfo->u4TxRateCntNonHT[10], prInfo->u4TxRateCntNonHT[11],
  489. prInfo->u4TxRateCntNonHT[12], prInfo->u4TxRateCntNonHT[13],
  490. prInfo->u4TxRateCntNonHT[14], prInfo->u4TxRateCntNonHT[15],
  491. prInfo->u4TxRateCntHT[0], prInfo->u4TxRateCntHT[1],
  492. prInfo->u4TxRateCntHT[2], prInfo->u4TxRateCntHT[3],
  493. prInfo->u4TxRateCntHT[4], prInfo->u4TxRateCntHT[5],
  494. prInfo->u4TxRateCntHT[6], prInfo->u4TxRateCntHT[7]));
  495. DBGLOG(RX, INFO, "<stats> TREORDER (%u %u %u)\n",
  496. prStaRec->u4RxReorderFallAheadCnt,
  497. prStaRec->u4RxReorderFallBehindCnt, prStaRec->u4RxReorderHoleCnt);
  498. DBGLOG(RX, INFO, "<stats> RX(%u %u %u) BA(0x%x %u) OK(%u %u) ERR(%u)\n",
  499. prInfo->ucRcvRcpi, prInfo->ucHwChanNum, prInfo->fgRxIsShortGI,
  500. prInfo->ucRxAggBitmap, prInfo->ucRxAggMaxSize,
  501. prInfo->u4RxDataCntAll, prStaRec->u4StatsRxPassToOsCnt, prInfo->u4RxDataCntErr);
  502. DBGLOG(RX, INFO, "<stats> RX Free MAC DESC(%u %u %u %u %u %u) Free HIF DESC(%u %u %u %u %u %u)\n",
  503. prInfo->u4RxMacFreeDescCnt[0], prInfo->u4RxMacFreeDescCnt[1],
  504. prInfo->u4RxMacFreeDescCnt[2], prInfo->u4RxMacFreeDescCnt[3],
  505. prInfo->u4RxMacFreeDescCnt[4], prInfo->u4RxMacFreeDescCnt[5],
  506. prInfo->u4RxHifFreeDescCnt[0], prInfo->u4RxHifFreeDescCnt[1],
  507. prInfo->u4RxHifFreeDescCnt[2], prInfo->u4RxHifFreeDescCnt[3],
  508. prInfo->u4RxHifFreeDescCnt[4], prInfo->u4RxHifFreeDescCnt[5]));
  509. DBGLOG(RX, INFO, "<stats> RCCK (%u %u) (%u %u) (%u %u) (%u %u) (%u %u) (%u %u)\n"
  510. "(%u %u) (%u %u) (%u %u) (%u %u) (%u %u) (%u %u) (%u %u) (%u %u) (%u %u) (%u %u)\n",
  511. prInfo->u4RxRateCnt[0][0], prInfo->u4RxRateRetryCnt[0][0],
  512. prInfo->u4RxRateCnt[0][1], prInfo->u4RxRateRetryCnt[0][1],
  513. prInfo->u4RxRateCnt[0][2], prInfo->u4RxRateRetryCnt[0][2],
  514. prInfo->u4RxRateCnt[0][3], prInfo->u4RxRateRetryCnt[0][3],
  515. prInfo->u4RxRateCnt[0][4], prInfo->u4RxRateRetryCnt[0][4],
  516. prInfo->u4RxRateCnt[0][5], prInfo->u4RxRateRetryCnt[0][5],
  517. prInfo->u4RxRateCnt[0][6], prInfo->u4RxRateRetryCnt[0][6],
  518. prInfo->u4RxRateCnt[0][7], prInfo->u4RxRateRetryCnt[0][7],
  519. prInfo->u4RxRateCnt[0][8], prInfo->u4RxRateRetryCnt[0][8],
  520. prInfo->u4RxRateCnt[0][9], prInfo->u4RxRateRetryCnt[0][9],
  521. prInfo->u4RxRateCnt[0][10], prInfo->u4RxRateRetryCnt[0][10],
  522. prInfo->u4RxRateCnt[0][11], prInfo->u4RxRateRetryCnt[0][11],
  523. prInfo->u4RxRateCnt[0][12], prInfo->u4RxRateRetryCnt[0][12],
  524. prInfo->u4RxRateCnt[0][13], prInfo->u4RxRateRetryCnt[0][13],
  525. prInfo->u4RxRateCnt[0][14], prInfo->u4RxRateRetryCnt[0][14],
  526. prInfo->u4RxRateCnt[0][15], prInfo->u4RxRateRetryCnt[0][15]));
  527. DBGLOG(RX, INFO, "<stats> ROFDM (%u %u) (%u %u) (%u %u) (%u %u) (%u %u) (%u %u)\n"
  528. "(%u %u) (%u %u) (%u %u) (%u %u) (%u %u) (%u %u) (%u %u) (%u %u) (%u %u) (%u %u)\n",
  529. prInfo->u4RxRateCnt[1][0], prInfo->u4RxRateRetryCnt[1][0],
  530. prInfo->u4RxRateCnt[1][1], prInfo->u4RxRateRetryCnt[1][1],
  531. prInfo->u4RxRateCnt[1][2], prInfo->u4RxRateRetryCnt[1][2],
  532. prInfo->u4RxRateCnt[1][3], prInfo->u4RxRateRetryCnt[1][3],
  533. prInfo->u4RxRateCnt[1][4], prInfo->u4RxRateRetryCnt[1][4],
  534. prInfo->u4RxRateCnt[1][5], prInfo->u4RxRateRetryCnt[1][5],
  535. prInfo->u4RxRateCnt[1][6], prInfo->u4RxRateRetryCnt[1][6],
  536. prInfo->u4RxRateCnt[1][7], prInfo->u4RxRateRetryCnt[1][7],
  537. prInfo->u4RxRateCnt[1][8], prInfo->u4RxRateRetryCnt[1][8],
  538. prInfo->u4RxRateCnt[1][9], prInfo->u4RxRateRetryCnt[1][9],
  539. prInfo->u4RxRateCnt[1][10], prInfo->u4RxRateRetryCnt[1][10],
  540. prInfo->u4RxRateCnt[1][11], prInfo->u4RxRateRetryCnt[1][11],
  541. prInfo->u4RxRateCnt[1][12], prInfo->u4RxRateRetryCnt[1][12],
  542. prInfo->u4RxRateCnt[1][13], prInfo->u4RxRateRetryCnt[1][13],
  543. prInfo->u4RxRateCnt[1][14], prInfo->u4RxRateRetryCnt[1][14],
  544. prInfo->u4RxRateCnt[1][15], prInfo->u4RxRateRetryCnt[1][15]));
  545. DBGLOG(RX, INFO, "<stats> RHT (%u %u) (%u %u) (%u %u) (%u %u) (%u %u) (%u %u) (%u %u)\n"
  546. "(%u %u) (%u %u) (%u %u) (%u %u) (%u %u) (%u %u) (%u %u) (%u %u) (%u %u)\n",
  547. prInfo->u4RxRateCnt[2][0], prInfo->u4RxRateRetryCnt[2][0],
  548. prInfo->u4RxRateCnt[2][1], prInfo->u4RxRateRetryCnt[2][1],
  549. prInfo->u4RxRateCnt[2][2], prInfo->u4RxRateRetryCnt[2][2],
  550. prInfo->u4RxRateCnt[2][3], prInfo->u4RxRateRetryCnt[2][3],
  551. prInfo->u4RxRateCnt[2][4], prInfo->u4RxRateRetryCnt[2][4],
  552. prInfo->u4RxRateCnt[2][5], prInfo->u4RxRateRetryCnt[2][5],
  553. prInfo->u4RxRateCnt[2][6], prInfo->u4RxRateRetryCnt[2][6],
  554. prInfo->u4RxRateCnt[2][7], prInfo->u4RxRateRetryCnt[2][7],
  555. prInfo->u4RxRateCnt[2][8], prInfo->u4RxRateRetryCnt[2][8],
  556. prInfo->u4RxRateCnt[2][9], prInfo->u4RxRateRetryCnt[2][9],
  557. prInfo->u4RxRateCnt[2][10], prInfo->u4RxRateRetryCnt[2][10],
  558. prInfo->u4RxRateCnt[2][11], prInfo->u4RxRateRetryCnt[2][11],
  559. prInfo->u4RxRateCnt[2][12], prInfo->u4RxRateRetryCnt[2][12],
  560. prInfo->u4RxRateCnt[2][13], prInfo->u4RxRateRetryCnt[2][13],
  561. prInfo->u4RxRateCnt[2][14], prInfo->u4RxRateRetryCnt[2][14],
  562. prInfo->u4RxRateCnt[2][15], prInfo->u4RxRateRetryCnt[2][15]));
  563. /* delay from HIF to MAC */
  564. DBGLOG(RX, INFO, "<stats> StayIntH2M us (%u %u %u) (%u %u %u) (%u %u %u)\n",
  565. prInfo->u4StayIntMinH2M[0], prInfo->u4StayIntAvgH2M[0],
  566. prInfo->u4StayIntMaxH2M[0],
  567. prInfo->u4StayIntMinH2M[1], prInfo->u4StayIntAvgH2M[1],
  568. prInfo->u4StayIntMaxH2M[1],
  569. prInfo->u4StayIntMinH2M[2], prInfo->u4StayIntAvgH2M[2],
  570. prInfo->u4StayIntMaxH2M[2]));
  571. /* delay from MAC to TXDONE */
  572. DBGLOG(RX, INFO, "<stats> AirTime us (%u %u %u) (%u %u %u) (%u %u %u)\n",
  573. prInfo->u4AirDelayMin[0] << 5, prInfo->u4AirDelayAvg[0] << 5,
  574. prInfo->u4AirDelayMax[0] << 5,
  575. prInfo->u4AirDelayMin[1] << 5, prInfo->u4AirDelayAvg[1] << 5,
  576. prInfo->u4AirDelayMax[1] << 5,
  577. prInfo->u4TxDataCntAll, (prInfo->u4AirDelayAvg[2] << 5) / (prInfo->u4TxDataCntAll),
  578. (prInfo->u4AirDelayAvg[2] << 5) / 400000));
  579. prAdapter->u4AirDelayTotal = (prInfo->u4AirDelayTotal << 5) / 400000;
  580. /* delay from HIF to TXDONE */
  581. DBGLOG(RX, INFO, "<stats> StayInt us (%u %u %u_%u) (%u %u %u_%u) (%u %u %u_%u)\n",
  582. prInfo->u4StayIntMin[0], prInfo->u4StayIntAvg[0],
  583. prInfo->u4StayIntMax[0], prInfo->u4StayIntMaxSysTime[0],
  584. prInfo->u4StayIntMin[1], prInfo->u4StayIntAvg[1],
  585. prInfo->u4StayIntMax[1], prInfo->u4StayIntMaxSysTime[1],
  586. prInfo->u4StayIntMin[2], prInfo->u4StayIntAvg[2],
  587. prInfo->u4StayIntMax[2], prInfo->u4StayIntMaxSysTime[2]));
  588. /* delay from Driver to TXDONE */
  589. DBGLOG(RX, INFO, "<stats> StayIntD2T us (%u %u %u) (%u %u %u) (%u %u %u)\n",
  590. prInfo->u4StayIntMinD2T[0], prInfo->u4StayIntAvgD2T[0],
  591. prInfo->u4StayIntMaxD2T[0],
  592. prInfo->u4StayIntMinD2T[1], prInfo->u4StayIntAvgD2T[1],
  593. prInfo->u4StayIntMaxD2T[1],
  594. prInfo->u4StayIntMinD2T[2], prInfo->u4StayIntAvgD2T[2],
  595. prInfo->u4StayIntMaxD2T[2]));
  596. /* delay from RXDONE to HIF */
  597. DBGLOG(RX, INFO, "<stats> StayIntR_M2H us (%u %u %u) (%u %u %u) (%u %u %u)\n",
  598. prInfo->u4StayIntMinRx[0], prInfo->u4StayIntAvgRx[0],
  599. prInfo->u4StayIntMaxRx[0],
  600. prInfo->u4StayIntMinRx[1], prInfo->u4StayIntAvgRx[1],
  601. prInfo->u4StayIntMaxRx[1],
  602. prInfo->u4StayIntMinRx[2], prInfo->u4StayIntAvgRx[2], prInfo->u4StayIntMaxRx[2]));
  603. /* delay from HIF to OS */
  604. DBGLOG(RX, INFO, "<stats> StayIntR_H2D us (%u %u %u) (%u %u %u) (%u %u %u)\n",
  605. prStaRec->u4StayIntMinRx[0], prStaRec->u4StayIntAvgRx[0],
  606. prStaRec->u4StayIntMaxRx[0],
  607. prStaRec->u4StayIntMinRx[1], prStaRec->u4StayIntAvgRx[1],
  608. prStaRec->u4StayIntMaxRx[1],
  609. prStaRec->u4StayIntMinRx[2], prStaRec->u4StayIntAvgRx[2],
  610. prStaRec->u4StayIntMaxRx[2]));
  611. /* count based on delay from OS to HIF */
  612. DBGLOG(RX, INFO, "<stats> StayCntD2H unit:%dms (%d %d %d %d)\n",
  613. STATS_STAY_INT_D2H_CONST,
  614. prInfo->u4StayIntD2HByConst[0], prInfo->u4StayIntD2HByConst[1],
  615. prInfo->u4StayIntD2HByConst[2], prInfo->u4StayIntD2HByConst[3]);
  616. /* count based on different delay from HIF to TX DONE */
  617. DBGLOG(RX, INFO, "<stats> StayCnt unit:%dms (%d %d %d %d)\n",
  618. STATS_STAY_INT_CONST,
  619. prInfo->u4StayIntByConst[0], prInfo->u4StayIntByConst[1],
  620. prInfo->u4StayIntByConst[2], prInfo->u4StayIntByConst[3]);
  621. DBGLOG(RX, INFO, "<stats> StayCnt (%d~%d:%d) (%d~%d:%d) (%d~%d:%d) (%d~%d:%d) (%d~:%d)\n",
  622. 0, prInfo->u4StayIntMaxPast / 4, prInfo->u4StayIntCnt[0],
  623. prInfo->u4StayIntMaxPast / 4, prInfo->u4StayIntMaxPast / 2, prInfo->u4StayIntCnt[1],
  624. prInfo->u4StayIntMaxPast / 2, prInfo->u4StayIntMaxPast * 3 / 4,
  625. prInfo->u4StayIntCnt[2], prInfo->u4StayIntMaxPast * 3 / 4, prInfo->u4StayIntMaxPast,
  626. prInfo->u4StayIntCnt[3], prInfo->u4StayIntMaxPast, prInfo->u4StayIntCnt[4]));
  627. /* channel idle time */
  628. DBGLOG(RX, INFO, "<stats> Idle Time (slot): (%u) (%u) (%u) (%u) (%u) (%u) (%u) (%u) (%u) (%u)\n",
  629. prInfo->au4ChanIdleCnt[0], prInfo->au4ChanIdleCnt[1],
  630. prInfo->au4ChanIdleCnt[2], prInfo->au4ChanIdleCnt[3],
  631. prInfo->au4ChanIdleCnt[4], prInfo->au4ChanIdleCnt[5],
  632. prInfo->au4ChanIdleCnt[6], prInfo->au4ChanIdleCnt[7],
  633. prInfo->au4ChanIdleCnt[8], prInfo->au4ChanIdleCnt[9]));
  634. /* BT coex */
  635. DBGLOG(RX, INFO, "<stats> BT coex (0x%x)\n", prInfo->u4BtContUseTime);
  636. /* others */
  637. DBGLOG(RX, INFO, "<stats> OTHER (%u) (%u) (%u) (%u) (%u) (%ums) (%uus)\n",
  638. prInfo->u4RxFifoFullCnt, prAdapter->ucScanTime,
  639. prInfo->u4NumOfChanChange, prStaRec->u4NumOfNoTxQuota,
  640. prInfo->ucNumOfPsChange, prInfo->u4PsIntMax, u4DrvOwnMax / 1000);
  641. /* reset */
  642. kalMemZero(prStaRec->u4StayIntMinRx, sizeof(prStaRec->u4StayIntMinRx));
  643. kalMemZero(prStaRec->u4StayIntAvgRx, sizeof(prStaRec->u4StayIntAvgRx));
  644. kalMemZero(prStaRec->u4StayIntMaxRx, sizeof(prStaRec->u4StayIntMaxRx));
  645. prStaRec->u4StatsRxPassToOsCnt = 0;
  646. prStaRec->u4RxReorderFallAheadCnt = 0;
  647. prStaRec->u4RxReorderFallBehindCnt = 0;
  648. prStaRec->u4RxReorderHoleCnt = 0;
  649. }
  650. STATS_DRIVER_OWN_RESET();
  651. }
  652. #endif
  653. /*----------------------------------------------------------------------------*/
  654. /*! \brief This routine is called to request firmware to feedback statistics.
  655. *
  656. * \param[in] prAdapter Pointer to the Adapter structure
  657. * \param[in] pvSetBuffer A pointer to the buffer that holds the data to be set
  658. * \param[in] u4SetBufferLen The length of the set buffer
  659. * \param[out] pu4SetInfoLen If the call is successful, returns the number of
  660. * bytes read from the set buffer. If the call failed due to invalid length of
  661. * the set buffer, returns the amount of storage needed.
  662. *
  663. * \retval TDLS_STATUS_xx
  664. *
  665. */
  666. /*----------------------------------------------------------------------------*/
  667. static WLAN_STATUS
  668. statsInfoEnvRequest(ADAPTER_T *prAdapter, VOID *pvSetBuffer, UINT_32 u4SetBufferLen, UINT_32 *pu4SetInfoLen)
  669. {
  670. STATS_CMD_CORE_T *prCmdContent;
  671. WLAN_STATUS rStatus;
  672. /* sanity check */
  673. if (fgIsUnderSuspend == true)
  674. return WLAN_STATUS_SUCCESS; /* do not request stats after early suspend */
  675. /* init command buffer */
  676. prCmdContent = (STATS_CMD_CORE_T *) pvSetBuffer;
  677. prCmdContent->u4Command = STATS_CORE_CMD_ENV_REQUEST;
  678. /* send the command */
  679. rStatus = wlanSendSetQueryCmd(prAdapter, /* prAdapter */
  680. CMD_ID_STATS, /* ucCID */
  681. TRUE, /* fgSetQuery */
  682. FALSE, /* fgNeedResp */
  683. FALSE, /* fgIsOid */
  684. NULL, NULL, /* pfCmdTimeoutHandler */
  685. sizeof(STATS_CMD_CORE_T), /* u4SetQueryInfoLen */
  686. (PUINT_8) prCmdContent, /* pucInfoBuffer */
  687. NULL, /* pvSetQueryBuffer */
  688. 0 /* u4SetQueryBufferLen */
  689. );
  690. if (rStatus != WLAN_STATUS_PENDING) {
  691. DBGLOG(RX, ERROR, "%s wlanSendSetQueryCmd allocation fail!\n", __func__);
  692. return WLAN_STATUS_RESOURCES;
  693. }
  694. DBGLOG(RX, INFO, "%s cmd ok.\n", __func__);
  695. return WLAN_STATUS_SUCCESS;
  696. }
  697. /*******************************************************************************
  698. * P U B L I C F U N C T I O N S
  699. ********************************************************************************
  700. */
  701. /*----------------------------------------------------------------------------*/
  702. /*! \brief This routine is called to handle any statistics event.
  703. *
  704. * \param[in] prGlueInfo Pointer to the Adapter structure
  705. * \param[in] prInBuf A pointer to the command string buffer
  706. * \param[in] u4InBufLen The length of the buffer
  707. * \param[out] None
  708. *
  709. * \retval None
  710. */
  711. /*----------------------------------------------------------------------------*/
  712. VOID statsEventHandle(GLUE_INFO_T *prGlueInfo, UINT8 *prInBuf, UINT32 u4InBufLen)
  713. {
  714. UINT32 u4EventId;
  715. /* sanity check */
  716. /* DBGLOG(RX, INFO, */
  717. /* ("<stats> %s: Rcv a event\n", __FUNCTION__)); */
  718. if ((prGlueInfo == NULL) || (prInBuf == NULL))
  719. return; /* shall not be here */
  720. /* handle */
  721. u4EventId = *(UINT32 *) prInBuf;
  722. u4InBufLen -= 4;
  723. /* DBGLOG(RX, INFO, */
  724. /* ("<stats> %s: Rcv a event: %d\n", __FUNCTION__, u4EventId)); */
  725. switch (u4EventId) {
  726. case STATS_HOST_EVENT_ENV_REPORT:
  727. statsInfoEnvDisplay(prGlueInfo, prInBuf + 4, u4InBufLen);
  728. break;
  729. default:
  730. break;
  731. }
  732. }
  733. /*----------------------------------------------------------------------------*/
  734. /*! \brief This routine is called to detect if we can request firmware to feedback statistics.
  735. *
  736. * \param[in] prGlueInfo Pointer to the Adapter structure
  737. * \param[in] ucStaRecIndex The station index
  738. * \param[out] None
  739. *
  740. * \retval None
  741. */
  742. /*----------------------------------------------------------------------------*/
  743. VOID statsEnvReportDetect(ADAPTER_T *prAdapter, UINT8 ucStaRecIndex)
  744. {
  745. STA_RECORD_T *prStaRec;
  746. OS_SYSTIME rCurTime;
  747. STATS_CMD_CORE_T rCmd;
  748. prStaRec = cnmGetStaRecByIndex(prAdapter, ucStaRecIndex);
  749. if (prStaRec == NULL)
  750. return;
  751. prStaRec->u4StatsEnvTxCnt++;
  752. GET_CURRENT_SYSTIME(&rCurTime);
  753. if (prStaRec->rStatsEnvTxPeriodLastTime == 0) {
  754. prStaRec->rStatsEnvTxLastTime = rCurTime;
  755. prStaRec->rStatsEnvTxPeriodLastTime = rCurTime;
  756. return;
  757. }
  758. if (prStaRec->u4StatsEnvTxCnt > STATS_ENV_TX_CNT_REPORT_TRIGGER) {
  759. if (CHECK_FOR_TIMEOUT(rCurTime, prStaRec->rStatsEnvTxLastTime,
  760. SEC_TO_SYSTIME(STATS_ENV_TX_CNT_REPORT_TRIGGER_SEC))) {
  761. rCmd.ucStaRecIdx = ucStaRecIndex;
  762. statsInfoEnvRequest(prAdapter, &rCmd, 0, NULL);
  763. prStaRec->rStatsEnvTxLastTime = rCurTime;
  764. prStaRec->rStatsEnvTxPeriodLastTime = rCurTime;
  765. prStaRec->u4StatsEnvTxCnt = 0;
  766. return;
  767. }
  768. }
  769. if (CHECK_FOR_TIMEOUT(rCurTime, prStaRec->rStatsEnvTxPeriodLastTime, SEC_TO_SYSTIME(STATS_ENV_TIMEOUT_SEC))) {
  770. rCmd.ucStaRecIdx = ucStaRecIndex;
  771. statsInfoEnvRequest(prAdapter, &rCmd, 0, NULL);
  772. prStaRec->rStatsEnvTxPeriodLastTime = rCurTime;
  773. return;
  774. }
  775. }
  776. /*----------------------------------------------------------------------------*/
  777. /*! \brief This routine is called to handle rx done.
  778. *
  779. * \param[in] prStaRec Pointer to the STA_RECORD_T structure
  780. * \param[in] prSwRfb Pointer to the received packet
  781. * \param[out] None
  782. *
  783. * \retval None
  784. */
  785. /*----------------------------------------------------------------------------*/
  786. VOID StatsEnvRxDone(STA_RECORD_T *prStaRec, SW_RFB_T *prSwRfb)
  787. {
  788. UINT32 u4LenId;
  789. UINT32 u4CurTime, u4DifTime;
  790. /* sanity check */
  791. if (prStaRec == NULL)
  792. return;
  793. /* stats: rx done count */
  794. prStaRec->u4StatsRxPassToOsCnt++;
  795. /* get length partition ID */
  796. u4LenId = 0;
  797. if (prSwRfb->u2PacketLen < STATS_STAY_INT_BYTE_THRESHOLD) {
  798. u4LenId = 0;
  799. } else {
  800. if ((STATS_STAY_INT_BYTE_THRESHOLD <= prSwRfb->u2PacketLen) &&
  801. (prSwRfb->u2PacketLen < (STATS_STAY_INT_BYTE_THRESHOLD << 1))) {
  802. u4LenId = 1;
  803. } else
  804. u4LenId = 2;
  805. }
  806. /* stats: rx delay */
  807. u4CurTime = kalGetTimeTick();
  808. if ((u4CurTime > prSwRfb->rRxTime) && (prSwRfb->rRxTime != 0)) {
  809. u4DifTime = u4CurTime - prSwRfb->rRxTime;
  810. if (prStaRec->u4StayIntMinRx[u4LenId] == 0) /* impossible */
  811. prStaRec->u4StayIntMinRx[u4LenId] = 0xffffffff;
  812. if (u4DifTime > prStaRec->u4StayIntMaxRx[u4LenId])
  813. prStaRec->u4StayIntMaxRx[u4LenId] = u4DifTime;
  814. else if (u4DifTime < prStaRec->u4StayIntMinRx[u4LenId])
  815. prStaRec->u4StayIntMinRx[u4LenId] = u4DifTime;
  816. prStaRec->u4StayIntAvgRx[u4LenId] += u4DifTime;
  817. if (prStaRec->u4StayIntAvgRx[u4LenId] != u4DifTime)
  818. prStaRec->u4StayIntAvgRx[u4LenId] >>= 1;
  819. }
  820. }
  821. /*----------------------------------------------------------------------------*/
  822. /*! \brief This routine is called to handle rx done.
  823. *
  824. * \param[in] prGlueInfo Pointer to the Adapter structure
  825. * \param[in] prInBuf A pointer to the command string buffer
  826. * \param[in] u4InBufLen The length of the buffer
  827. * \param[out] None
  828. *
  829. * \retval None
  830. */
  831. /*----------------------------------------------------------------------------*/
  832. UINT_64 StatsEnvTimeGet(VOID)
  833. {
  834. /* TODO: use better API to get time to save time, jiffies unit is 10ms, too large */
  835. /* struct timeval tv; */
  836. /* do_gettimeofday(&tv); */
  837. /* return tv.tv_usec + tv.tv_sec * (UINT_64)1000000; */
  838. UINT_64 u8Clk;
  839. /* UINT32 *pClk = &u8Clk; */
  840. u8Clk = sched_clock(); /* unit: naro seconds */
  841. /* printk("<stats> sched_clock() = %x %x %u\n", pClk[0], pClk[1], sizeof(jiffies)); */
  842. return (UINT_64) u8Clk; /* sched_clock *//* jiffies size = 4B */
  843. }
  844. /*----------------------------------------------------------------------------*/
  845. /*! \brief This routine is called to handle rx done.
  846. *
  847. * \param[in] prGlueInfo Pointer to the Adapter structure
  848. * \param[in] prInBuf A pointer to the command string buffer
  849. * \param[in] u4InBufLen The length of the buffer
  850. * \param[out] None
  851. *
  852. * \retval None
  853. */
  854. /*----------------------------------------------------------------------------*/
  855. VOID StatsEnvTxTime2Hif(MSDU_INFO_T *prMsduInfo, HIF_TX_HEADER_T *prHwTxHeader)
  856. {
  857. UINT_64 u8SysTime, u8SysTimeIn;
  858. UINT32 u4TimeDiff;
  859. u8SysTime = StatsEnvTimeGet();
  860. u8SysTimeIn = GLUE_GET_PKT_XTIME(prMsduInfo->prPacket);
  861. /* printk("<stats> hif: 0x%x %u %u %u\n", */
  862. /* prMsduInfo->prPacket, StatsEnvTimeGet(), u8SysTime, GLUE_GET_PKT_XTIME(prMsduInfo->prPacket)); */
  863. if ((u8SysTimeIn > 0) && (u8SysTime > u8SysTimeIn)) {
  864. u8SysTime = u8SysTime - u8SysTimeIn;
  865. u4TimeDiff = (UINT32) u8SysTime;
  866. u4TimeDiff = u4TimeDiff / 1000; /* ns to us */
  867. /* pass the delay between OS to us and we to HIF */
  868. if (u4TimeDiff > 0xFFFF)
  869. *(UINT16 *) prHwTxHeader->aucReserved = (UINT16) 0xFFFF; /* 65535 us */
  870. else
  871. *(UINT16 *) prHwTxHeader->aucReserved = (UINT16) u4TimeDiff;
  872. /* printk("<stats> u4TimeDiff: %u\n", u4TimeDiff); */
  873. } else {
  874. prHwTxHeader->aucReserved[0] = 0;
  875. prHwTxHeader->aucReserved[1] = 0;
  876. }
  877. }
  878. static VOID statsParsePktInfo(PUINT_8 pucPkt, UINT_8 status, UINT_8 eventType, P_MSDU_INFO_T prMsduInfo)
  879. {
  880. /* get ethernet protocol */
  881. UINT_16 u2EtherType = (pucPkt[ETH_TYPE_LEN_OFFSET] << 8) | (pucPkt[ETH_TYPE_LEN_OFFSET + 1]);
  882. PUINT_8 pucEthBody = &pucPkt[ETH_HLEN];
  883. switch (u2EtherType) {
  884. case ETH_P_ARP:
  885. {
  886. UINT_16 u2OpCode = (pucEthBody[6] << 8) | pucEthBody[7];
  887. if (eventType == EVENT_TX)
  888. prMsduInfo->fgIsBasicRate = TRUE;
  889. if ((su2TxDoneCfg & CFG_ARP) == 0)
  890. break;
  891. switch (eventType) {
  892. case EVENT_RX:
  893. if (u2OpCode == ARP_PRO_REQ)
  894. DBGLOG(RX, INFO, "<RX> Arp Req From IP: %d.%d.%d.%d\n",
  895. pucEthBody[14], pucEthBody[15], pucEthBody[16], pucEthBody[17]);
  896. else if (u2OpCode == ARP_PRO_RSP)
  897. DBGLOG(RX, INFO, "<RX> Arp Rsp from IP: %d.%d.%d.%d\n",
  898. pucEthBody[14], pucEthBody[15], pucEthBody[16], pucEthBody[17]);
  899. break;
  900. case EVENT_TX:
  901. if (u2OpCode == ARP_PRO_REQ)
  902. DBGLOG(TX, INFO, "<TX> Arp Req to IP: %d.%d.%d.%d\n",
  903. pucEthBody[24], pucEthBody[25], pucEthBody[26], pucEthBody[27]);
  904. else if (u2OpCode == ARP_PRO_RSP)
  905. DBGLOG(TX, INFO, "<TX> Arp Rsp to IP: %d.%d.%d.%d\n",
  906. pucEthBody[24], pucEthBody[25], pucEthBody[26], pucEthBody[27]);
  907. prMsduInfo->fgNeedTxDoneStatus = TRUE;
  908. break;
  909. case EVENT_TX_DONE:
  910. if (u2OpCode == ARP_PRO_REQ)
  911. DBGLOG(TX, INFO, "<TX status:%d> Arp Req to IP: %d.%d.%d.%d\n", status,
  912. pucEthBody[24], pucEthBody[25], pucEthBody[26], pucEthBody[27]);
  913. else if (u2OpCode == ARP_PRO_RSP)
  914. DBGLOG(TX, INFO, "<TX status:%d> Arp Rsp to IP: %d.%d.%d.%d\n", status,
  915. pucEthBody[24], pucEthBody[25], pucEthBody[26], pucEthBody[27]);
  916. break;
  917. }
  918. break;
  919. }
  920. case ETH_P_IP:
  921. {
  922. UINT_8 ucIpProto = pucEthBody[9]; /* IP header without options */
  923. UINT_8 ucIpVersion = (pucEthBody[0] & IPVH_VERSION_MASK) >> IPVH_VERSION_OFFSET;
  924. UINT_16 u2IpId = pucEthBody[4]<<8 | pucEthBody[5];
  925. if (ucIpVersion != IPVERSION)
  926. break;
  927. switch (ucIpProto) {
  928. case IP_PRO_ICMP:
  929. {
  930. /* the number of ICMP packets is seldom so we print log here */
  931. UINT_8 ucIcmpType;
  932. UINT_16 u2IcmpId, u2IcmpSeq;
  933. PUINT_8 pucIcmp = &pucEthBody[20];
  934. ucIcmpType = pucIcmp[0];
  935. /* don't log network unreachable packet */
  936. if (((su2TxDoneCfg & CFG_ICMP) == 0) || ucIcmpType == 3)
  937. break;
  938. u2IcmpId = *(UINT_16 *) &pucIcmp[4];
  939. u2IcmpSeq = *(UINT_16 *) &pucIcmp[6];
  940. switch (eventType) {
  941. case EVENT_RX:
  942. DBGLOG(RX, INFO, "<RX> ICMP: Type %d, Id BE 0x%04x, Seq BE 0x%04x\n",
  943. ucIcmpType, u2IcmpId, u2IcmpSeq);
  944. break;
  945. case EVENT_TX:
  946. DBGLOG(TX, INFO, "<TX> ICMP: Type %d, Id 0x04%x, Seq BE 0x%04x\n",
  947. ucIcmpType, u2IcmpId, u2IcmpSeq);
  948. prMsduInfo->fgNeedTxDoneStatus = TRUE;
  949. break;
  950. case EVENT_TX_DONE:
  951. DBGLOG(TX, INFO, "<TX status:%d> Type %d, Id 0x%04x, Seq 0x%04x\n",
  952. status, ucIcmpType, u2IcmpId, u2IcmpSeq);
  953. break;
  954. }
  955. break;
  956. }
  957. case IP_PRO_UDP:
  958. {
  959. /* the number of DHCP packets is seldom so we print log here */
  960. PUINT_8 pucUdp = &pucEthBody[20];
  961. PUINT_8 pucUdpPayload = &pucUdp[8];
  962. UINT_16 u2UdpDstPort;
  963. UINT_16 u2UdpSrcPort;
  964. u2UdpDstPort = (pucUdp[2] << 8) | pucUdp[3];
  965. u2UdpSrcPort = (pucUdp[0] << 8) | pucUdp[1];
  966. /* dhcp */
  967. if ((u2UdpDstPort == UDP_PORT_DHCPS) || (u2UdpDstPort == UDP_PORT_DHCPC)) {
  968. UINT_32 u4TransID = pucUdpPayload[4]<<24 | pucUdpPayload[5]<<16 |
  969. pucUdpPayload[6]<<8 | pucUdpPayload[7];
  970. switch (eventType) {
  971. case EVENT_RX:
  972. DBGLOG(RX, INFO, "<RX> DHCP: IPID 0x%02x, MsgType 0x%x, TransID 0x%08x\n",
  973. u2IpId, pucUdpPayload[0], u4TransID);
  974. break;
  975. case EVENT_TX:
  976. DBGLOG(TX, INFO, "<TX> DHCP: IPID 0x%02x, MsgType 0x%x, TransID 0x%08x\n",
  977. u2IpId, pucUdpPayload[0], u4TransID);
  978. prMsduInfo->fgNeedTxDoneStatus = TRUE;
  979. prMsduInfo->fgIsBasicRate = TRUE;
  980. break;
  981. case EVENT_TX_DONE:
  982. DBGLOG(TX, INFO,
  983. "<TX status:%d> DHCP: IPID 0x%02x, MsgType 0x%x, TransID 0x%08x\n",
  984. status, u2IpId, pucUdpPayload[0], u4TransID);
  985. break;
  986. }
  987. } else if (u2UdpDstPort == UDP_PORT_DNS) { /* tx dns */
  988. UINT_16 u2TransId = (pucUdpPayload[0] << 8) | pucUdpPayload[1];
  989. if (eventType == EVENT_TX)
  990. prMsduInfo->fgIsBasicRate = TRUE;
  991. if ((su2TxDoneCfg & CFG_DNS) == 0)
  992. break;
  993. if (eventType == EVENT_TX) {
  994. DBGLOG(TX, INFO, "<TX> DNS: IPID 0x%02x, TransID 0x%04x\n", u2IpId, u2TransId);
  995. prMsduInfo->fgNeedTxDoneStatus = TRUE;
  996. } else if (eventType == EVENT_TX_DONE)
  997. DBGLOG(TX, INFO, "<TX status:%d> DNS: IPID 0x%02x, TransID 0x%04x\n",
  998. status, u2IpId, u2TransId);
  999. } else if (u2UdpSrcPort == UDP_PORT_DNS && eventType == EVENT_RX) { /* rx dns */
  1000. UINT_16 u2TransId = (pucUdpPayload[0] << 8) | pucUdpPayload[1];
  1001. if ((su2TxDoneCfg & CFG_DNS) == 0)
  1002. break;
  1003. DBGLOG(RX, INFO, "<RX> DNS: IPID 0x%02x, TransID 0x%04x\n", u2IpId, u2TransId);
  1004. } else if ((su2TxDoneCfg & CFG_UDP) != 0) {
  1005. switch (eventType) {
  1006. case EVENT_RX:
  1007. DBGLOG(RX, INFO, "<RX> UDP: IPID 0x%04x\n", u2IpId);
  1008. break;
  1009. case EVENT_TX:
  1010. DBGLOG(TX, INFO, "<TX> UDP: IPID 0x%04x\n", u2IpId);
  1011. prMsduInfo->fgNeedTxDoneStatus = TRUE;
  1012. break;
  1013. case EVENT_TX_DONE:
  1014. DBGLOG(TX, INFO, "<TX status:%d> UDP: IPID 0x%04x\n", status, u2IpId);
  1015. break;
  1016. }
  1017. }
  1018. break;
  1019. }
  1020. case IP_PRO_TCP:
  1021. if ((su2TxDoneCfg & CFG_TCP) == 0)
  1022. break;
  1023. switch (eventType) {
  1024. case EVENT_RX:
  1025. DBGLOG(RX, INFO, "<RX> TCP: IPID 0x%04x\n", u2IpId);
  1026. break;
  1027. case EVENT_TX:
  1028. DBGLOG(TX, INFO, "<TX> TCP: IPID 0x%04x\n", u2IpId);
  1029. prMsduInfo->fgNeedTxDoneStatus = TRUE;
  1030. break;
  1031. case EVENT_TX_DONE:
  1032. DBGLOG(TX, INFO, "<TX status:%d> TCP: IPID 0x%04x\n", status, u2IpId);
  1033. break;
  1034. }
  1035. break;
  1036. }
  1037. break;
  1038. }
  1039. case ETH_P_PRE_1X:
  1040. DBGLOG(RX, INFO, "pre-1x\n");
  1041. case ETH_P_1X:
  1042. {
  1043. PUINT_8 pucEapol = pucEthBody;
  1044. UINT_8 ucEapolType = pucEapol[1];
  1045. switch (ucEapolType) {
  1046. case 0: /* eap packet */
  1047. switch (eventType) {
  1048. case EVENT_RX:
  1049. DBGLOG(RX, INFO, "<RX> EAP Packet: code %d, id %d, type %d\n",
  1050. pucEapol[4], pucEapol[5], pucEapol[7]);
  1051. break;
  1052. case EVENT_TX:
  1053. DBGLOG(TX, INFO, "<TX> EAP Packet: code %d, id %d, type %d\n",
  1054. pucEapol[4], pucEapol[5], pucEapol[7]);
  1055. break;
  1056. case EVENT_TX_DONE:
  1057. DBGLOG(TX, INFO, "<TX status: %d> EAP Packet: code %d, id %d, type %d\n",
  1058. status, pucEapol[4], pucEapol[5], pucEapol[7]);
  1059. break;
  1060. }
  1061. break;
  1062. case 1: /* eapol start */
  1063. switch (eventType) {
  1064. case EVENT_RX:
  1065. DBGLOG(RX, INFO, "<RX> EAPOL: start\n");
  1066. break;
  1067. case EVENT_TX:
  1068. DBGLOG(TX, INFO, "<RX> EAPOL: start\n");
  1069. break;
  1070. case EVENT_TX_DONE:
  1071. DBGLOG(TX, INFO, "<TX status: %d> EAPOL: start\n", status);
  1072. break;
  1073. }
  1074. break;
  1075. case 3: /* key */
  1076. {
  1077. UINT_16 u2KeyInfo = pucEapol[5]<<8 | pucEapol[6];
  1078. switch (eventType) {
  1079. case EVENT_RX:
  1080. DBGLOG(RX, INFO,
  1081. "<RX> EAPOL: key, KeyInfo 0x%04x, Nonce %02x%02x%02x%02x%02x%02x%02x%02x...\n",
  1082. u2KeyInfo, pucEapol[17], pucEapol[18], pucEapol[19], pucEapol[20],
  1083. pucEapol[21], pucEapol[22], pucEapol[23], pucEapol[24]);
  1084. break;
  1085. case EVENT_TX:
  1086. DBGLOG(TX, INFO,
  1087. "<TX> EAPOL: key, KeyInfo 0x%04x, Nonce %02x%02x%02x%02x%02x%02x%02x%02x...\n",
  1088. u2KeyInfo,
  1089. pucEapol[17], pucEapol[18], pucEapol[19], pucEapol[20],
  1090. pucEapol[21], pucEapol[22], pucEapol[23], pucEapol[24]);
  1091. break;
  1092. case EVENT_TX_DONE:
  1093. DBGLOG(TX, INFO,
  1094. "<TX status: %d> EAPOL: key, KeyInfo 0x%04x, Nonce %02x%02x%02x%02x%02x%02x%02x%02x...\n",
  1095. status, u2KeyInfo, pucEapol[17], pucEapol[18], pucEapol[19],
  1096. pucEapol[20], pucEapol[21], pucEapol[22], pucEapol[23], pucEapol[24]);
  1097. break;
  1098. }
  1099. break;
  1100. }
  1101. }
  1102. break;
  1103. }
  1104. case ETH_WPI_1X:
  1105. {
  1106. UINT_8 ucSubType = pucEthBody[3]; /* sub type filed*/
  1107. UINT_16 u2Length = *(PUINT_16)&pucEthBody[6];
  1108. UINT_16 u2Seq = *(PUINT_16)&pucEthBody[8];
  1109. switch (eventType) {
  1110. case EVENT_RX:
  1111. DBGLOG(RX, INFO, "<RX> WAPI: subType %d, Len %d, Seq %d\n",
  1112. ucSubType, u2Length, u2Seq);
  1113. break;
  1114. case EVENT_TX:
  1115. DBGLOG(TX, INFO, "<TX> WAPI: subType %d, Len %d, Seq %d\n",
  1116. ucSubType, u2Length, u2Seq);
  1117. break;
  1118. case EVENT_TX_DONE:
  1119. DBGLOG(TX, INFO, "<TX status: %d> WAPI: subType %d, Len %d, Seq %d\n",
  1120. status, ucSubType, u2Length, u2Seq);
  1121. break;
  1122. }
  1123. break;
  1124. }
  1125. }
  1126. }
  1127. /*----------------------------------------------------------------------------*/
  1128. /*! \brief This routine is called to display rx packet information.
  1129. *
  1130. * \param[in] pPkt Pointer to the packet
  1131. * \param[out] None
  1132. *
  1133. * \retval None
  1134. */
  1135. /*----------------------------------------------------------------------------*/
  1136. VOID StatsRxPktInfoDisplay(UINT_8 *pPkt)
  1137. {
  1138. statsParsePktInfo(pPkt, 0, EVENT_RX, NULL);
  1139. #if 0 /* carefully! too many ARP */
  1140. if (pucIpHdr[0] == 0x00) { /* ARP */
  1141. UINT_8 *pucDstIp = (UINT_8 *) pucIpHdr;
  1142. if (pucDstIp[7] == ARP_PRO_REQ) {
  1143. DBGLOG(RX, TRACE, "<rx> OS rx a arp req from %d.%d.%d.%d\n",
  1144. pucDstIp[14], pucDstIp[15], pucDstIp[16], pucDstIp[17]);
  1145. } else if (pucDstIp[7] == ARP_PRO_RSP) {
  1146. DBGLOG(RX, TRACE, "<rx> OS rx a arp rsp from %d.%d.%d.%d\n",
  1147. pucDstIp[24], pucDstIp[25], pucDstIp[26], pucDstIp[27]);
  1148. }
  1149. }
  1150. #endif
  1151. }
  1152. /*----------------------------------------------------------------------------*/
  1153. /*! \brief This routine is called to display tx packet information.
  1154. *
  1155. * \param[in] pPkt Pointer to the packet
  1156. * \param[out] None
  1157. *
  1158. * \retval None
  1159. */
  1160. /*----------------------------------------------------------------------------*/
  1161. VOID StatsTxPktCallBack(UINT_8 *pPkt, P_MSDU_INFO_T prMsduInfo)
  1162. {
  1163. UINT_16 u2EtherTypeLen;
  1164. u2EtherTypeLen = (pPkt[ETH_TYPE_LEN_OFFSET] << 8) | (pPkt[ETH_TYPE_LEN_OFFSET + 1]);
  1165. statsParsePktInfo(pPkt, 0, EVENT_TX, prMsduInfo);
  1166. }
  1167. /*----------------------------------------------------------------------------*/
  1168. /*! \brief This routine is called to handle display tx packet tx done information.
  1169. *
  1170. * \param[in] pPkt Pointer to the packet
  1171. * \param[out] None
  1172. *
  1173. * \retval None
  1174. */
  1175. /*----------------------------------------------------------------------------*/
  1176. VOID StatsTxPktDoneInfoDisplay(ADAPTER_T *prAdapter, UINT_8 *pucEvtBuf)
  1177. {
  1178. EVENT_TX_DONE_STATUS_T *prTxDone;
  1179. prTxDone = (EVENT_TX_DONE_STATUS_T *) pucEvtBuf;
  1180. /*
  1181. * Why 65 Bytes:
  1182. * 8B + wlanheader(40B) + hif_tx_header(16B) + 6B + 6B(LLC) - 12B
  1183. */
  1184. statsParsePktInfo(&prTxDone->aucPktBuf[64], prTxDone->ucStatus, EVENT_TX_DONE, NULL);
  1185. }
  1186. VOID StatsSetCfgTxDone(UINT_16 u2Cfg, BOOLEAN fgSet)
  1187. {
  1188. if (fgSet)
  1189. su2TxDoneCfg |= u2Cfg;
  1190. else
  1191. su2TxDoneCfg &= ~u2Cfg;
  1192. }
  1193. UINT_16 StatsGetCfgTxDone(VOID)
  1194. {
  1195. return su2TxDoneCfg;
  1196. }