pktlog_internal.c 41 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411
  1. /*
  2. * Copyright (c) 2013-2018 The Linux Foundation. All rights reserved.
  3. *
  4. * Permission to use, copy, modify, and/or distribute this software for
  5. * any purpose with or without fee is hereby granted, provided that the
  6. * above copyright notice and this permission notice appear in all
  7. * copies.
  8. *
  9. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
  10. * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
  11. * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
  12. * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
  13. * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
  14. * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
  15. * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  16. * PERFORMANCE OF THIS SOFTWARE.
  17. */
  18. /*
  19. *
  20. * Permission to use, copy, modify, and/or distribute this software for any
  21. * purpose with or without fee is hereby granted, provided that the above
  22. * copyright notice and this permission notice appear in all copies.
  23. *
  24. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  25. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  26. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  27. * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  28. * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  29. * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  30. * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  31. */
  32. #ifndef REMOVE_PKT_LOG
  33. #include "ol_txrx_types.h"
  34. #include "ol_htt_tx_api.h"
  35. #include "ol_tx_desc.h"
  36. #include "qdf_mem.h"
  37. #include "htt.h"
  38. #include "htt_internal.h"
  39. #include "pktlog_ac_i.h"
  40. #include "wma_api.h"
  41. #include "wlan_logging_sock_svc.h"
  42. #define TX_DESC_ID_LOW_MASK 0xffff
  43. #define TX_DESC_ID_LOW_SHIFT 0
  44. #define TX_DESC_ID_HIGH_MASK 0xffff0000
  45. #define TX_DESC_ID_HIGH_SHIFT 16
  46. void pktlog_getbuf_intsafe(struct ath_pktlog_arg *plarg)
  47. {
  48. struct ath_pktlog_buf *log_buf;
  49. int32_t buf_size;
  50. struct ath_pktlog_hdr *log_hdr;
  51. int32_t cur_wr_offset;
  52. char *log_ptr;
  53. struct ath_pktlog_info *pl_info;
  54. uint16_t log_type;
  55. size_t log_size;
  56. uint32_t flags;
  57. #ifdef HELIUMPLUS
  58. uint8_t mac_id;
  59. #endif
  60. if (!plarg) {
  61. printk("Invalid parg in %s\n", __func__);
  62. return;
  63. }
  64. pl_info = plarg->pl_info;
  65. #ifdef HELIUMPLUS
  66. mac_id = plarg->macId;
  67. log_type = plarg->log_type;
  68. #else
  69. log_type = plarg->log_type;
  70. #endif
  71. log_size = plarg->log_size;
  72. log_buf = pl_info->buf;
  73. flags = plarg->flags;
  74. if (!log_buf) {
  75. printk("Invalid log_buf in %s\n", __func__);
  76. return;
  77. }
  78. buf_size = pl_info->buf_size;
  79. cur_wr_offset = log_buf->wr_offset;
  80. /* Move read offset to the next entry if there is a buffer overlap */
  81. if (log_buf->rd_offset >= 0) {
  82. if ((cur_wr_offset <= log_buf->rd_offset)
  83. && (cur_wr_offset + sizeof(struct ath_pktlog_hdr)) >
  84. log_buf->rd_offset) {
  85. PKTLOG_MOV_RD_IDX(log_buf->rd_offset, log_buf,
  86. buf_size);
  87. }
  88. } else {
  89. log_buf->rd_offset = cur_wr_offset;
  90. }
  91. log_hdr = (struct ath_pktlog_hdr *)(log_buf->log_data + cur_wr_offset);
  92. log_hdr->flags = flags;
  93. #ifdef HELIUMPLUS
  94. log_hdr->macId = mac_id;
  95. log_hdr->log_type = log_type;
  96. #else
  97. log_hdr->log_type = log_type;
  98. #endif
  99. log_hdr->size = (uint16_t) log_size;
  100. log_hdr->missed_cnt = plarg->missed_cnt;
  101. log_hdr->timestamp = plarg->timestamp;
  102. #ifdef HELIUMPLUS
  103. log_hdr->type_specific_data = plarg->type_specific_data;
  104. #endif
  105. cur_wr_offset += sizeof(*log_hdr);
  106. if ((buf_size - cur_wr_offset) < log_size) {
  107. while ((cur_wr_offset <= log_buf->rd_offset)
  108. && (log_buf->rd_offset < buf_size)) {
  109. PKTLOG_MOV_RD_IDX(log_buf->rd_offset, log_buf,
  110. buf_size);
  111. }
  112. cur_wr_offset = 0;
  113. }
  114. while ((cur_wr_offset <= log_buf->rd_offset)
  115. && (cur_wr_offset + log_size) > log_buf->rd_offset) {
  116. PKTLOG_MOV_RD_IDX(log_buf->rd_offset, log_buf, buf_size);
  117. }
  118. log_ptr = &(log_buf->log_data[cur_wr_offset]);
  119. cur_wr_offset += log_hdr->size;
  120. log_buf->wr_offset = ((buf_size - cur_wr_offset) >=
  121. sizeof(struct ath_pktlog_hdr)) ? cur_wr_offset :
  122. 0;
  123. plarg->buf = log_ptr;
  124. }
  125. char *pktlog_getbuf(struct pktlog_dev_t *pl_dev,
  126. struct ath_pktlog_info *pl_info,
  127. size_t log_size, struct ath_pktlog_hdr *pl_hdr)
  128. {
  129. struct ath_pktlog_arg plarg = { 0, };
  130. uint8_t flags = 0;
  131. plarg.pl_info = pl_info;
  132. #ifdef HELIUMPLUS
  133. plarg.macId = pl_hdr->macId;
  134. plarg.log_type = pl_hdr->log_type;
  135. #else
  136. plarg.log_type = pl_hdr->log_type;
  137. #endif
  138. plarg.log_size = log_size;
  139. plarg.flags = pl_hdr->flags;
  140. plarg.missed_cnt = pl_hdr->missed_cnt;
  141. plarg.timestamp = pl_hdr->timestamp;
  142. #ifdef HELIUMPLUS
  143. plarg.type_specific_data = pl_hdr->type_specific_data;
  144. #endif
  145. if (flags & PHFLAGS_INTERRUPT_CONTEXT) {
  146. /*
  147. * We are already in interrupt context, no need to make it
  148. * intsafe. call the function directly.
  149. */
  150. pktlog_getbuf_intsafe(&plarg);
  151. } else {
  152. PKTLOG_LOCK(pl_info);
  153. pktlog_getbuf_intsafe(&plarg);
  154. PKTLOG_UNLOCK(pl_info);
  155. }
  156. return plarg.buf;
  157. }
  158. static struct txctl_frm_hdr frm_hdr;
  159. #ifndef HELIUMPLUS
  160. static void process_ieee_hdr(void *data)
  161. {
  162. uint8_t dir;
  163. struct ieee80211_frame *wh = (struct ieee80211_frame *)(data);
  164. frm_hdr.framectrl = *(uint16_t *) (wh->i_fc);
  165. frm_hdr.seqctrl = *(uint16_t *) (wh->i_seq);
  166. dir = (wh->i_fc[1] & IEEE80211_FC1_DIR_MASK);
  167. if (dir == IEEE80211_FC1_DIR_TODS) {
  168. frm_hdr.bssid_tail =
  169. (wh->i_addr1[IEEE80211_ADDR_LEN - 2] << 8) | (wh->
  170. i_addr1
  171. [IEEE80211_ADDR_LEN
  172. - 1]);
  173. frm_hdr.sa_tail =
  174. (wh->i_addr2[IEEE80211_ADDR_LEN - 2] << 8) | (wh->
  175. i_addr2
  176. [IEEE80211_ADDR_LEN
  177. - 1]);
  178. frm_hdr.da_tail =
  179. (wh->i_addr3[IEEE80211_ADDR_LEN - 2] << 8) | (wh->
  180. i_addr3
  181. [IEEE80211_ADDR_LEN
  182. - 1]);
  183. } else if (dir == IEEE80211_FC1_DIR_FROMDS) {
  184. frm_hdr.bssid_tail =
  185. (wh->i_addr2[IEEE80211_ADDR_LEN - 2] << 8) | (wh->
  186. i_addr2
  187. [IEEE80211_ADDR_LEN
  188. - 1]);
  189. frm_hdr.sa_tail =
  190. (wh->i_addr3[IEEE80211_ADDR_LEN - 2] << 8) | (wh->
  191. i_addr3
  192. [IEEE80211_ADDR_LEN
  193. - 1]);
  194. frm_hdr.da_tail =
  195. (wh->i_addr1[IEEE80211_ADDR_LEN - 2] << 8) | (wh->
  196. i_addr1
  197. [IEEE80211_ADDR_LEN
  198. - 1]);
  199. } else {
  200. frm_hdr.bssid_tail =
  201. (wh->i_addr3[IEEE80211_ADDR_LEN - 2] << 8) | (wh->
  202. i_addr3
  203. [IEEE80211_ADDR_LEN
  204. - 1]);
  205. frm_hdr.sa_tail =
  206. (wh->i_addr2[IEEE80211_ADDR_LEN - 2] << 8) | (wh->
  207. i_addr2
  208. [IEEE80211_ADDR_LEN
  209. - 1]);
  210. frm_hdr.da_tail =
  211. (wh->i_addr1[IEEE80211_ADDR_LEN - 2] << 8) | (wh->
  212. i_addr1
  213. [IEEE80211_ADDR_LEN
  214. - 1]);
  215. }
  216. }
  217. /**
  218. * fill_ieee80211_hdr_data() - fill ieee802.11 data header
  219. * @txrx_pdev: txrx pdev
  220. * @pl_msdu_info: msdu info
  221. * @data: data received from event
  222. *
  223. * Return: none
  224. */
  225. /* TODO: Platform specific function */
  226. static void
  227. fill_ieee80211_hdr_data(struct cdp_pdev *pdev,
  228. struct ath_pktlog_msdu_info *pl_msdu_info, void *data)
  229. {
  230. uint32_t i;
  231. uint32_t *htt_tx_desc;
  232. struct ol_tx_desc_t *tx_desc;
  233. uint8_t msdu_id_offset = MSDU_ID_INFO_ID_OFFSET;
  234. uint16_t tx_desc_id;
  235. uint32_t *msdu_id_info = (uint32_t *)
  236. ((void *)data + sizeof(struct ath_pktlog_hdr));
  237. uint32_t *msdu_id = (uint32_t *) ((char *)msdu_id_info +
  238. msdu_id_offset);
  239. uint8_t *addr, *vap_addr;
  240. uint8_t vdev_id;
  241. qdf_nbuf_t netbuf;
  242. uint32_t len;
  243. struct ol_txrx_pdev_t *txrx_pdev = (struct ol_txrx_pdev_t *)pdev;
  244. pl_msdu_info->num_msdu = *msdu_id_info;
  245. pl_msdu_info->priv_size = sizeof(uint32_t) *
  246. pl_msdu_info->num_msdu + sizeof(uint32_t);
  247. if (pl_msdu_info->num_msdu > MAX_PKT_INFO_MSDU_ID) {
  248. QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
  249. "%s: Invalid num_msdu count",
  250. __func__);
  251. qdf_assert(0);
  252. return;
  253. }
  254. for (i = 0; i < pl_msdu_info->num_msdu; i++) {
  255. /*
  256. * Handle big endianness
  257. * Increment msdu_id once after retrieving
  258. * lower 16 bits and uppper 16 bits
  259. */
  260. if (!(i % 2)) {
  261. tx_desc_id = ((*msdu_id & TX_DESC_ID_LOW_MASK)
  262. >> TX_DESC_ID_LOW_SHIFT);
  263. } else {
  264. tx_desc_id = ((*msdu_id & TX_DESC_ID_HIGH_MASK)
  265. >> TX_DESC_ID_HIGH_SHIFT);
  266. msdu_id += 1;
  267. }
  268. if (tx_desc_id >= txrx_pdev->tx_desc.pool_size) {
  269. QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG,
  270. "%s: drop due to invalid msdu id = %x",
  271. __func__, tx_desc_id);
  272. return;
  273. }
  274. tx_desc = ol_tx_desc_find(txrx_pdev, tx_desc_id);
  275. qdf_assert(tx_desc);
  276. netbuf = tx_desc->netbuf;
  277. htt_tx_desc = (uint32_t *) tx_desc->htt_tx_desc;
  278. qdf_assert(htt_tx_desc);
  279. qdf_nbuf_peek_header(netbuf, &addr, &len);
  280. if (len < (2 * IEEE80211_ADDR_LEN)) {
  281. qdf_print("TX frame does not have a valid address");
  282. return;
  283. }
  284. /* Adding header information for the TX data frames */
  285. vdev_id = (uint8_t) (*(htt_tx_desc +
  286. HTT_TX_VDEV_ID_WORD) >>
  287. HTT_TX_VDEV_ID_SHIFT) &
  288. HTT_TX_VDEV_ID_MASK;
  289. vap_addr = wma_get_vdev_address_by_vdev_id(vdev_id);
  290. frm_hdr.da_tail = (addr[IEEE80211_ADDR_LEN - 2] << 8) |
  291. (addr[IEEE80211_ADDR_LEN - 1]);
  292. frm_hdr.sa_tail =
  293. (addr[2 * IEEE80211_ADDR_LEN - 2] << 8) |
  294. (addr[2 * IEEE80211_ADDR_LEN - 1]);
  295. if (vap_addr) {
  296. frm_hdr.bssid_tail =
  297. (vap_addr[IEEE80211_ADDR_LEN - 2] << 8) |
  298. (vap_addr[IEEE80211_ADDR_LEN - 1]);
  299. } else {
  300. frm_hdr.bssid_tail = 0x0000;
  301. }
  302. pl_msdu_info->priv.msdu_len[i] = *(htt_tx_desc +
  303. HTT_TX_MSDU_LEN_DWORD)
  304. & HTT_TX_MSDU_LEN_MASK;
  305. /*
  306. * Add more information per MSDU
  307. * e.g., protocol information
  308. */
  309. }
  310. }
  311. #endif
  312. #ifdef HELIUMPLUS
  313. A_STATUS process_tx_info(struct cdp_pdev *txrx_pdev, void *data)
  314. {
  315. /*
  316. * Must include to process different types
  317. * TX_CTL, TX_STATUS, TX_MSDU_ID, TX_FRM_HDR
  318. */
  319. struct pktlog_dev_t *pl_dev = get_pktlog_handle();
  320. struct ath_pktlog_hdr pl_hdr;
  321. struct ath_pktlog_info *pl_info;
  322. uint32_t *pl_tgt_hdr;
  323. struct ol_fw_data *fw_data;
  324. uint32_t len;
  325. if (!txrx_pdev) {
  326. printk("Invalid pdev in %s\n", __func__);
  327. return A_ERROR;
  328. }
  329. if (!pl_dev) {
  330. pr_err("Invalid pktlog handle in %s\n", __func__);
  331. qdf_assert(pl_dev);
  332. return A_ERROR;
  333. }
  334. qdf_assert(data);
  335. fw_data = (struct ol_fw_data *)data;
  336. len = fw_data->len;
  337. if (len < (sizeof(uint32_t) *
  338. (ATH_PKTLOG_HDR_FLAGS_OFFSET + 1)) ||
  339. len < (sizeof(uint32_t) *
  340. (ATH_PKTLOG_HDR_MISSED_CNT_OFFSET + 1)) ||
  341. len < (sizeof(uint32_t) *
  342. (ATH_PKTLOG_HDR_LOG_TYPE_OFFSET + 1)) ||
  343. len < (sizeof(uint32_t) *
  344. (ATH_PKTLOG_HDR_MAC_ID_OFFSET + 1)) ||
  345. len < (sizeof(uint32_t) *
  346. (ATH_PKTLOG_HDR_SIZE_OFFSET + 1)) ||
  347. len < (sizeof(uint32_t) *
  348. (ATH_PKTLOG_HDR_TYPE_SPECIFIC_DATA_OFFSET + 1))) {
  349. qdf_print("Invalid msdu len in %s", __func__);
  350. qdf_assert(0);
  351. return A_ERROR;
  352. }
  353. pl_tgt_hdr = (uint32_t *)fw_data->data;
  354. /*
  355. * Makes the short words (16 bits) portable b/w little endian
  356. * and big endian
  357. */
  358. pl_hdr.flags = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_FLAGS_OFFSET) &
  359. ATH_PKTLOG_HDR_FLAGS_MASK) >>
  360. ATH_PKTLOG_HDR_FLAGS_SHIFT;
  361. pl_hdr.flags |= PKTLOG_HDR_SIZE_16;
  362. pl_hdr.missed_cnt = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MISSED_CNT_OFFSET) &
  363. ATH_PKTLOG_HDR_MISSED_CNT_MASK) >>
  364. ATH_PKTLOG_HDR_MISSED_CNT_SHIFT;
  365. pl_hdr.log_type = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_LOG_TYPE_OFFSET) &
  366. ATH_PKTLOG_HDR_LOG_TYPE_MASK) >>
  367. ATH_PKTLOG_HDR_LOG_TYPE_SHIFT;
  368. pl_hdr.macId = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MAC_ID_OFFSET) &
  369. ATH_PKTLOG_HDR_MAC_ID_MASK) >>
  370. ATH_PKTLOG_HDR_MAC_ID_SHIFT;
  371. pl_hdr.size = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_SIZE_OFFSET) &
  372. ATH_PKTLOG_HDR_SIZE_MASK) >> ATH_PKTLOG_HDR_SIZE_SHIFT;
  373. pl_hdr.timestamp = *(pl_tgt_hdr + ATH_PKTLOG_HDR_TIMESTAMP_OFFSET);
  374. pl_hdr.type_specific_data =
  375. *(pl_tgt_hdr + ATH_PKTLOG_HDR_TYPE_SPECIFIC_DATA_OFFSET);
  376. pl_info = pl_dev->pl_info;
  377. if (sizeof(struct ath_pktlog_hdr) + pl_hdr.size > len) {
  378. qdf_assert(0);
  379. return A_ERROR;
  380. }
  381. if (pl_hdr.log_type == PKTLOG_TYPE_TX_CTRL) {
  382. size_t log_size = sizeof(frm_hdr) + pl_hdr.size;
  383. void *txdesc_hdr_ctl = (void *)
  384. pktlog_getbuf(pl_dev, pl_info, log_size, &pl_hdr);
  385. qdf_assert(txdesc_hdr_ctl);
  386. qdf_assert(pl_hdr.size < (370 * sizeof(u_int32_t)));
  387. qdf_mem_copy(txdesc_hdr_ctl, &frm_hdr, sizeof(frm_hdr));
  388. qdf_mem_copy((char *)txdesc_hdr_ctl + sizeof(frm_hdr),
  389. ((void *)fw_data->data +
  390. sizeof(struct ath_pktlog_hdr)),
  391. pl_hdr.size);
  392. pl_hdr.size = log_size;
  393. cds_pkt_stats_to_logger_thread(&pl_hdr, NULL,
  394. txdesc_hdr_ctl);
  395. }
  396. if (pl_hdr.log_type == PKTLOG_TYPE_TX_STAT) {
  397. struct ath_pktlog_tx_status txstat_log;
  398. size_t log_size = pl_hdr.size;
  399. txstat_log.ds_status = (void *)
  400. pktlog_getbuf(pl_dev, pl_info,
  401. log_size, &pl_hdr);
  402. qdf_assert(txstat_log.ds_status);
  403. qdf_mem_copy(txstat_log.ds_status,
  404. ((void *)fw_data->data +
  405. sizeof(struct ath_pktlog_hdr)),
  406. pl_hdr.size);
  407. /* TODO: MCL specific API */
  408. cds_pkt_stats_to_logger_thread(&pl_hdr, NULL,
  409. txstat_log.ds_status);
  410. }
  411. return A_OK;
  412. }
  413. #else
  414. A_STATUS process_tx_info(struct cdp_pdev *txrx_pdev, void *data)
  415. {
  416. /*
  417. * Must include to process different types
  418. * TX_CTL, TX_STATUS, TX_MSDU_ID, TX_FRM_HDR
  419. */
  420. struct pktlog_dev_t *pl_dev = get_pktlog_handle();
  421. struct ath_pktlog_hdr pl_hdr;
  422. struct ath_pktlog_info *pl_info;
  423. uint32_t *pl_tgt_hdr;
  424. struct ol_fw_data *fw_data;
  425. uint32_t len;
  426. if (!txrx_pdev) {
  427. qdf_print("Invalid pdev in %s", __func__);
  428. return A_ERROR;
  429. }
  430. if (!pl_dev) {
  431. pr_err("Invalid pktlog handle in %s\n", __func__);
  432. qdf_assert(pl_dev);
  433. return A_ERROR;
  434. }
  435. qdf_assert(data);
  436. fw_data = (struct ol_fw_data *)data;
  437. len = fw_data->len;
  438. if (len < (sizeof(uint32_t) *
  439. (ATH_PKTLOG_HDR_FLAGS_OFFSET + 1)) ||
  440. len < (sizeof(uint32_t) *
  441. (ATH_PKTLOG_HDR_MISSED_CNT_OFFSET + 1)) ||
  442. len < (sizeof(uint32_t) *
  443. (ATH_PKTLOG_HDR_LOG_TYPE_OFFSET + 1)) ||
  444. len < (sizeof(uint32_t) *
  445. (ATH_PKTLOG_HDR_SIZE_OFFSET + 1)) ||
  446. len < (sizeof(uint32_t) *
  447. (ATH_PKTLOG_HDR_TYPE_SPECIFIC_DATA_OFFSET + 1))) {
  448. qdf_print("Invalid msdu len in %s", __func__);
  449. qdf_assert(0);
  450. return A_ERROR;
  451. }
  452. pl_tgt_hdr = (uint32_t *)fw_data->data;
  453. /*
  454. * Makes the short words (16 bits) portable b/w little endian
  455. * and big endian
  456. */
  457. pl_hdr.flags = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_FLAGS_OFFSET) &
  458. ATH_PKTLOG_HDR_FLAGS_MASK) >>
  459. ATH_PKTLOG_HDR_FLAGS_SHIFT;
  460. pl_hdr.missed_cnt = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MISSED_CNT_OFFSET) &
  461. ATH_PKTLOG_HDR_MISSED_CNT_MASK) >>
  462. ATH_PKTLOG_HDR_MISSED_CNT_SHIFT;
  463. pl_hdr.log_type = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_LOG_TYPE_OFFSET) &
  464. ATH_PKTLOG_HDR_LOG_TYPE_MASK) >>
  465. ATH_PKTLOG_HDR_LOG_TYPE_SHIFT;
  466. pl_hdr.size = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_SIZE_OFFSET) &
  467. ATH_PKTLOG_HDR_SIZE_MASK) >> ATH_PKTLOG_HDR_SIZE_SHIFT;
  468. pl_hdr.timestamp = *(pl_tgt_hdr + ATH_PKTLOG_HDR_TIMESTAMP_OFFSET);
  469. pl_info = pl_dev->pl_info;
  470. if (pl_hdr.log_type == PKTLOG_TYPE_TX_FRM_HDR) {
  471. /* Valid only for the TX CTL */
  472. process_ieee_hdr(fw_data->data + sizeof(pl_hdr));
  473. }
  474. if (pl_hdr.log_type == PKTLOG_TYPE_TX_VIRT_ADDR) {
  475. uint32_t desc_id = (uint32_t) *((uint32_t *)(fw_data->data +
  476. sizeof(pl_hdr)));
  477. uint32_t vdev_id = desc_id;
  478. /* if the pkt log msg is for the bcn frame the vdev id
  479. * is piggybacked in desc_id and the MSB of the desc ID
  480. * would be set to FF
  481. */
  482. #define BCN_DESC_ID 0xFF
  483. if ((desc_id >> 24) == BCN_DESC_ID) {
  484. void *data;
  485. uint32_t buf_size;
  486. vdev_id &= 0x00FFFFFF;
  487. /* TODO: MCL specific API */
  488. data = wma_get_beacon_buffer_by_vdev_id(vdev_id,
  489. &buf_size);
  490. if (data) {
  491. /* TODO: platform specific API */
  492. process_ieee_hdr(data);
  493. qdf_mem_free(data);
  494. }
  495. } else {
  496. /*
  497. * TODO: get the hdr content for mgmt frames from
  498. * Tx mgmt desc pool
  499. */
  500. }
  501. }
  502. if (pl_hdr.log_type == PKTLOG_TYPE_TX_CTRL) {
  503. struct ath_pktlog_txctl txctl_log;
  504. size_t log_size = sizeof(txctl_log.priv);
  505. txctl_log.txdesc_hdr_ctl = (void *)pktlog_getbuf(pl_dev,
  506. pl_info,
  507. log_size,
  508. &pl_hdr);
  509. if (!txctl_log.txdesc_hdr_ctl) {
  510. printk
  511. ("failed to get buf for txctl_log.txdesc_hdr_ctl\n");
  512. return A_ERROR;
  513. }
  514. /*
  515. * frm hdr is currently Valid only for local frames
  516. * Add capability to include the fmr hdr for remote frames
  517. */
  518. txctl_log.priv.frm_hdr = frm_hdr;
  519. qdf_assert(txctl_log.priv.txdesc_ctl);
  520. qdf_assert(pl_hdr.size < sizeof(txctl_log.priv.txdesc_ctl));
  521. pl_hdr.size = (pl_hdr.size > sizeof(txctl_log.priv.txdesc_ctl))
  522. ? sizeof(txctl_log.priv.txdesc_ctl) :
  523. pl_hdr.size;
  524. if (sizeof(struct ath_pktlog_hdr) + pl_hdr.size > len) {
  525. qdf_assert(0);
  526. return A_ERROR;
  527. }
  528. qdf_mem_copy((void *)&txctl_log.priv.txdesc_ctl,
  529. ((void *)fw_data->data +
  530. sizeof(struct ath_pktlog_hdr)),
  531. pl_hdr.size);
  532. qdf_assert(txctl_log.txdesc_hdr_ctl);
  533. qdf_mem_copy(txctl_log.txdesc_hdr_ctl, &txctl_log.priv,
  534. sizeof(txctl_log.priv));
  535. pl_hdr.size = log_size;
  536. cds_pkt_stats_to_logger_thread(&pl_hdr, NULL,
  537. txctl_log.txdesc_hdr_ctl);
  538. /* Add Protocol information and HT specific information */
  539. }
  540. if (pl_hdr.log_type == PKTLOG_TYPE_TX_STAT) {
  541. struct ath_pktlog_tx_status txstat_log;
  542. size_t log_size = pl_hdr.size;
  543. txstat_log.ds_status = (void *)
  544. pktlog_getbuf(pl_dev, pl_info, log_size, &pl_hdr);
  545. qdf_assert(txstat_log.ds_status);
  546. qdf_mem_copy(txstat_log.ds_status,
  547. ((void *)fw_data->data +
  548. sizeof(struct ath_pktlog_hdr)),
  549. pl_hdr.size);
  550. cds_pkt_stats_to_logger_thread(&pl_hdr, NULL,
  551. txstat_log.ds_status);
  552. }
  553. if (pl_hdr.log_type == PKTLOG_TYPE_TX_MSDU_ID) {
  554. struct ath_pktlog_msdu_info pl_msdu_info;
  555. size_t log_size;
  556. qdf_mem_set(&pl_msdu_info, sizeof(pl_msdu_info), 0);
  557. log_size = sizeof(pl_msdu_info.priv);
  558. if (pl_dev->mt_pktlog_enabled == false)
  559. fill_ieee80211_hdr_data(txrx_pdev,
  560. &pl_msdu_info, fw_data->data);
  561. pl_msdu_info.ath_msdu_info = pktlog_getbuf(pl_dev, pl_info,
  562. log_size, &pl_hdr);
  563. qdf_mem_copy((void *)&pl_msdu_info.priv.msdu_id_info,
  564. ((void *)fw_data->data +
  565. sizeof(struct ath_pktlog_hdr)),
  566. sizeof(pl_msdu_info.priv.msdu_id_info));
  567. qdf_mem_copy(pl_msdu_info.ath_msdu_info, &pl_msdu_info.priv,
  568. sizeof(pl_msdu_info.priv));
  569. cds_pkt_stats_to_logger_thread(&pl_hdr, NULL,
  570. pl_msdu_info.ath_msdu_info);
  571. }
  572. return A_OK;
  573. }
  574. #endif
  575. /* TODO: hardware dependent function */
  576. A_STATUS process_rx_info_remote(void *pdev, void *data)
  577. {
  578. struct pktlog_dev_t *pl_dev = get_pktlog_handle();
  579. struct ath_pktlog_info *pl_info;
  580. struct htt_host_rx_desc_base *rx_desc;
  581. struct ath_pktlog_hdr pl_hdr;
  582. struct ath_pktlog_rx_info rxstat_log;
  583. size_t log_size;
  584. struct ol_rx_remote_data *r_data = (struct ol_rx_remote_data *)data;
  585. qdf_nbuf_t msdu;
  586. if (!pdev || !r_data || !pl_dev) {
  587. qdf_print("%s: Invalid handle", __func__);
  588. return A_ERROR;
  589. }
  590. pl_info = pl_dev->pl_info;
  591. msdu = r_data->msdu;
  592. while (msdu) {
  593. rx_desc =
  594. (struct htt_host_rx_desc_base *)(qdf_nbuf_data(msdu)) - 1;
  595. log_size =
  596. sizeof(*rx_desc) - sizeof(struct htt_host_fw_desc_base);
  597. /*
  598. * Construct the pktlog header pl_hdr
  599. * Because desc is DMA'd to the host memory
  600. */
  601. pl_hdr.flags = (1 << PKTLOG_FLG_FRM_TYPE_REMOTE_S);
  602. pl_hdr.missed_cnt = 0;
  603. #if defined(HELIUMPLUS)
  604. pl_hdr.macId = r_data->mac_id;
  605. pl_hdr.log_type = PKTLOG_TYPE_RX_STAT;
  606. pl_hdr.flags |= PKTLOG_HDR_SIZE_16;
  607. #else
  608. pl_hdr.log_type = PKTLOG_TYPE_RX_STAT;
  609. #endif
  610. pl_hdr.size = sizeof(*rx_desc) -
  611. sizeof(struct htt_host_fw_desc_base);
  612. #if defined(HELIUMPLUS)
  613. pl_hdr.timestamp =
  614. rx_desc->ppdu_end.rx_pkt_end.phy_timestamp_1_lower_32;
  615. pl_hdr.type_specific_data = 0xDEADAA;
  616. #else
  617. pl_hdr.timestamp = rx_desc->ppdu_end.tsf_timestamp;
  618. #endif /* !defined(HELIUMPLUS) */
  619. rxstat_log.rx_desc = (void *)pktlog_getbuf(pl_dev, pl_info,
  620. log_size, &pl_hdr);
  621. qdf_mem_copy(rxstat_log.rx_desc, (void *)rx_desc +
  622. sizeof(struct htt_host_fw_desc_base), pl_hdr.size);
  623. cds_pkt_stats_to_logger_thread(&pl_hdr, NULL,
  624. rxstat_log.rx_desc);
  625. msdu = qdf_nbuf_next(msdu);
  626. }
  627. return A_OK;
  628. }
  629. #ifdef HELIUMPLUS
  630. A_STATUS process_rx_info(void *pdev, void *data)
  631. {
  632. struct pktlog_dev_t *pl_dev = get_pktlog_handle();
  633. struct ath_pktlog_info *pl_info;
  634. struct ath_pktlog_rx_info rxstat_log;
  635. struct ath_pktlog_hdr pl_hdr;
  636. size_t log_size;
  637. uint32_t *pl_tgt_hdr;
  638. struct ol_fw_data *fw_data;
  639. uint32_t len;
  640. if (!pdev) {
  641. printk("Invalid pdev in %s", __func__);
  642. return A_ERROR;
  643. }
  644. pl_dev = ((struct ol_txrx_pdev_t *)pdev)->pl_dev;
  645. if (!pl_dev) {
  646. printk("Invalid pl_dev in %s", __func__);
  647. return A_ERROR;
  648. }
  649. fw_data = (struct ol_fw_data *)data;
  650. len = fw_data->len;
  651. if (len < (sizeof(uint32_t) *
  652. (ATH_PKTLOG_HDR_FLAGS_OFFSET + 1)) ||
  653. len < (sizeof(uint32_t) *
  654. (ATH_PKTLOG_HDR_MISSED_CNT_OFFSET + 1)) ||
  655. len < (sizeof(uint32_t) *
  656. (ATH_PKTLOG_HDR_LOG_TYPE_OFFSET + 1)) ||
  657. len < (sizeof(uint32_t) *
  658. (ATH_PKTLOG_HDR_MAC_ID_OFFSET + 1)) ||
  659. len < (sizeof(uint32_t) *
  660. (ATH_PKTLOG_HDR_SIZE_OFFSET + 1)) ||
  661. len < (sizeof(uint32_t) *
  662. (ATH_PKTLOG_HDR_TYPE_SPECIFIC_DATA_OFFSET + 1))) {
  663. qdf_print("Invalid msdu len in %s", __func__);
  664. qdf_assert(0);
  665. return A_ERROR;
  666. }
  667. pl_info = pl_dev->pl_info;
  668. pl_tgt_hdr = (uint32_t *)fw_data->data;
  669. qdf_mem_set(&pl_hdr, sizeof(pl_hdr), 0);
  670. pl_hdr.flags = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_FLAGS_OFFSET) &
  671. ATH_PKTLOG_HDR_FLAGS_MASK) >>
  672. ATH_PKTLOG_HDR_FLAGS_SHIFT;
  673. pl_hdr.missed_cnt = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MISSED_CNT_OFFSET) &
  674. ATH_PKTLOG_HDR_MISSED_CNT_MASK) >>
  675. ATH_PKTLOG_HDR_MISSED_CNT_SHIFT;
  676. pl_hdr.log_type = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_LOG_TYPE_OFFSET) &
  677. ATH_PKTLOG_HDR_LOG_TYPE_MASK) >>
  678. ATH_PKTLOG_HDR_LOG_TYPE_SHIFT;
  679. pl_hdr.macId = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MAC_ID_OFFSET) &
  680. ATH_PKTLOG_HDR_MAC_ID_MASK) >>
  681. ATH_PKTLOG_HDR_MAC_ID_SHIFT;
  682. pl_hdr.flags |= PKTLOG_HDR_SIZE_16;
  683. pl_hdr.size = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_SIZE_OFFSET) &
  684. ATH_PKTLOG_HDR_SIZE_MASK) >> ATH_PKTLOG_HDR_SIZE_SHIFT;
  685. pl_hdr.timestamp = *(pl_tgt_hdr + ATH_PKTLOG_HDR_TIMESTAMP_OFFSET);
  686. if (sizeof(struct ath_pktlog_hdr) + pl_hdr.size > len) {
  687. qdf_assert(0);
  688. return A_ERROR;
  689. }
  690. log_size = pl_hdr.size;
  691. rxstat_log.rx_desc = (void *)pktlog_getbuf(pl_dev, pl_info,
  692. log_size, &pl_hdr);
  693. qdf_mem_copy(rxstat_log.rx_desc,
  694. (void *)fw_data->data + sizeof(struct ath_pktlog_hdr),
  695. pl_hdr.size);
  696. cds_pkt_stats_to_logger_thread(&pl_hdr, NULL, rxstat_log.rx_desc);
  697. return A_OK;
  698. }
  699. #else
  700. A_STATUS process_rx_info(void *pdev, void *data)
  701. {
  702. struct pktlog_dev_t *pl_dev = get_pktlog_handle();
  703. struct ath_pktlog_info *pl_info;
  704. struct ath_pktlog_rx_info rxstat_log;
  705. struct ath_pktlog_hdr pl_hdr;
  706. size_t log_size;
  707. uint32_t *pl_tgt_hdr;
  708. struct ol_fw_data *fw_data;
  709. uint32_t len;
  710. if (!pdev) {
  711. printk("Invalid pdev in %s", __func__);
  712. return A_ERROR;
  713. }
  714. pl_dev = ((struct ol_txrx_pdev_t *)pdev)->pl_dev;
  715. if (!pl_dev) {
  716. printk("Invalid pl_dev in %s", __func__);
  717. return A_ERROR;
  718. }
  719. fw_data = (struct ol_fw_data *)data;
  720. len = fw_data->len;
  721. if (len < (sizeof(uint32_t) *
  722. (ATH_PKTLOG_HDR_FLAGS_OFFSET + 1)) ||
  723. len < (sizeof(uint32_t) *
  724. (ATH_PKTLOG_HDR_MISSED_CNT_OFFSET + 1)) ||
  725. len < (sizeof(uint32_t) *
  726. (ATH_PKTLOG_HDR_LOG_TYPE_OFFSET + 1)) ||
  727. len < (sizeof(uint32_t) *
  728. (ATH_PKTLOG_HDR_SIZE_OFFSET + 1)) ||
  729. len < (sizeof(uint32_t) *
  730. (ATH_PKTLOG_HDR_TYPE_SPECIFIC_DATA_OFFSET + 1))) {
  731. qdf_print("Invalid msdu len in %s", __func__);
  732. qdf_assert(0);
  733. return A_ERROR;
  734. }
  735. pl_info = pl_dev->pl_info;
  736. pl_tgt_hdr = (uint32_t *)fw_data->data;
  737. qdf_mem_set(&pl_hdr, sizeof(pl_hdr), 0);
  738. pl_hdr.flags = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_FLAGS_OFFSET) &
  739. ATH_PKTLOG_HDR_FLAGS_MASK) >>
  740. ATH_PKTLOG_HDR_FLAGS_SHIFT;
  741. pl_hdr.missed_cnt = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MISSED_CNT_OFFSET) &
  742. ATH_PKTLOG_HDR_MISSED_CNT_MASK) >>
  743. ATH_PKTLOG_HDR_MISSED_CNT_SHIFT;
  744. pl_hdr.log_type = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_LOG_TYPE_OFFSET) &
  745. ATH_PKTLOG_HDR_LOG_TYPE_MASK) >>
  746. ATH_PKTLOG_HDR_LOG_TYPE_SHIFT;
  747. pl_hdr.size = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_SIZE_OFFSET) &
  748. ATH_PKTLOG_HDR_SIZE_MASK) >> ATH_PKTLOG_HDR_SIZE_SHIFT;
  749. pl_hdr.timestamp = *(pl_tgt_hdr + ATH_PKTLOG_HDR_TIMESTAMP_OFFSET);
  750. if (sizeof(struct ath_pktlog_hdr) + pl_hdr.size > len) {
  751. qdf_assert(0);
  752. return A_ERROR;
  753. }
  754. log_size = pl_hdr.size;
  755. rxstat_log.rx_desc = (void *)pktlog_getbuf(pl_dev, pl_info,
  756. log_size, &pl_hdr);
  757. qdf_mem_copy(rxstat_log.rx_desc,
  758. (void *)fw_data->data + sizeof(struct ath_pktlog_hdr),
  759. pl_hdr.size);
  760. cds_pkt_stats_to_logger_thread(&pl_hdr, NULL, rxstat_log.rx_desc);
  761. return A_OK;
  762. }
  763. #endif
  764. #ifdef HELIUMPLUS
  765. A_STATUS process_rate_find(void *pdev, void *data)
  766. {
  767. struct pktlog_dev_t *pl_dev = get_pktlog_handle();
  768. struct ath_pktlog_hdr pl_hdr;
  769. struct ath_pktlog_info *pl_info;
  770. size_t log_size;
  771. uint32_t len;
  772. struct ol_fw_data *fw_data;
  773. /*
  774. * Will be uncommented when the rate control find
  775. * for pktlog is implemented in the firmware.
  776. * Currently derived from the TX PPDU status
  777. */
  778. struct ath_pktlog_rc_find rcf_log;
  779. uint32_t *pl_tgt_hdr;
  780. if (!pdev || !data || !pl_dev) {
  781. qdf_print("%s: Invalid handle", __func__);
  782. return A_ERROR;
  783. }
  784. fw_data = (struct ol_fw_data *)data;
  785. len = fw_data->len;
  786. if (len < (sizeof(uint32_t) *
  787. (ATH_PKTLOG_HDR_FLAGS_OFFSET + 1)) ||
  788. len < (sizeof(uint32_t) *
  789. (ATH_PKTLOG_HDR_MISSED_CNT_OFFSET + 1)) ||
  790. len < (sizeof(uint32_t) *
  791. (ATH_PKTLOG_HDR_LOG_TYPE_OFFSET + 1)) ||
  792. len < (sizeof(uint32_t) *
  793. (ATH_PKTLOG_HDR_MAC_ID_OFFSET + 1)) ||
  794. len < (sizeof(uint32_t) *
  795. (ATH_PKTLOG_HDR_SIZE_OFFSET + 1)) ||
  796. len < (sizeof(uint32_t) *
  797. (ATH_PKTLOG_HDR_TYPE_SPECIFIC_DATA_OFFSET + 1))) {
  798. qdf_print("Invalid msdu len in %s", __func__);
  799. qdf_assert(0);
  800. return A_ERROR;
  801. }
  802. pl_tgt_hdr = (uint32_t *)fw_data->data;
  803. /*
  804. * Makes the short words (16 bits) portable b/w little endian
  805. * and big endian
  806. */
  807. qdf_mem_set(&pl_hdr, sizeof(pl_hdr), 0);
  808. pl_hdr.flags = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_FLAGS_OFFSET) &
  809. ATH_PKTLOG_HDR_FLAGS_MASK) >>
  810. ATH_PKTLOG_HDR_FLAGS_SHIFT;
  811. pl_hdr.missed_cnt = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MISSED_CNT_OFFSET) &
  812. ATH_PKTLOG_HDR_MISSED_CNT_MASK) >>
  813. ATH_PKTLOG_HDR_MISSED_CNT_SHIFT;
  814. pl_hdr.log_type = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_LOG_TYPE_OFFSET) &
  815. ATH_PKTLOG_HDR_LOG_TYPE_MASK) >>
  816. ATH_PKTLOG_HDR_LOG_TYPE_SHIFT;
  817. pl_hdr.macId = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MAC_ID_OFFSET) &
  818. ATH_PKTLOG_HDR_MAC_ID_MASK) >>
  819. ATH_PKTLOG_HDR_MAC_ID_SHIFT;
  820. pl_hdr.flags |= PKTLOG_HDR_SIZE_16;
  821. pl_hdr.size = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_SIZE_OFFSET) &
  822. ATH_PKTLOG_HDR_SIZE_MASK) >> ATH_PKTLOG_HDR_SIZE_SHIFT;
  823. pl_hdr.timestamp = *(pl_tgt_hdr + ATH_PKTLOG_HDR_TIMESTAMP_OFFSET);
  824. pl_info = pl_dev->pl_info;
  825. log_size = pl_hdr.size;
  826. rcf_log.rcFind = (void *)pktlog_getbuf(pl_dev, pl_info,
  827. log_size, &pl_hdr);
  828. if (sizeof(struct ath_pktlog_hdr) + pl_hdr.size > len) {
  829. qdf_assert(0);
  830. return A_ERROR;
  831. }
  832. qdf_mem_copy(rcf_log.rcFind,
  833. ((char *)fw_data->data + sizeof(struct ath_pktlog_hdr)),
  834. pl_hdr.size);
  835. cds_pkt_stats_to_logger_thread(&pl_hdr, NULL, rcf_log.rcFind);
  836. return A_OK;
  837. }
  838. #else
  839. A_STATUS process_rate_find(void *pdev, void *data)
  840. {
  841. struct pktlog_dev_t *pl_dev = get_pktlog_handle();
  842. struct ath_pktlog_hdr pl_hdr;
  843. struct ath_pktlog_info *pl_info;
  844. size_t log_size;
  845. uint32_t len;
  846. struct ol_fw_data *fw_data;
  847. /*
  848. * Will be uncommented when the rate control find
  849. * for pktlog is implemented in the firmware.
  850. * Currently derived from the TX PPDU status
  851. */
  852. struct ath_pktlog_rc_find rcf_log;
  853. uint32_t *pl_tgt_hdr;
  854. if (!pdev || !data || !pl_dev) {
  855. qdf_print("%s: Invalid handle", __func__);
  856. return A_ERROR;
  857. }
  858. fw_data = (struct ol_fw_data *)data;
  859. len = fw_data->len;
  860. if (len < (sizeof(uint32_t) *
  861. (ATH_PKTLOG_HDR_FLAGS_OFFSET + 1)) ||
  862. len < (sizeof(uint32_t) *
  863. (ATH_PKTLOG_HDR_MISSED_CNT_OFFSET + 1)) ||
  864. len < (sizeof(uint32_t) *
  865. (ATH_PKTLOG_HDR_LOG_TYPE_OFFSET + 1)) ||
  866. len < (sizeof(uint32_t) *
  867. (ATH_PKTLOG_HDR_SIZE_OFFSET + 1)) ||
  868. len < (sizeof(uint32_t) *
  869. (ATH_PKTLOG_HDR_TYPE_SPECIFIC_DATA_OFFSET + 1))) {
  870. qdf_print("Invalid msdu len in %s", __func__);
  871. qdf_assert(0);
  872. return A_ERROR;
  873. }
  874. pl_tgt_hdr = (uint32_t *)fw_data->data;
  875. /*
  876. * Makes the short words (16 bits) portable b/w little endian
  877. * and big endian
  878. */
  879. qdf_mem_set(&pl_hdr, sizeof(pl_hdr), 0);
  880. pl_hdr.flags = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_FLAGS_OFFSET) &
  881. ATH_PKTLOG_HDR_FLAGS_MASK) >>
  882. ATH_PKTLOG_HDR_FLAGS_SHIFT;
  883. pl_hdr.missed_cnt = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MISSED_CNT_OFFSET) &
  884. ATH_PKTLOG_HDR_MISSED_CNT_MASK) >>
  885. ATH_PKTLOG_HDR_MISSED_CNT_SHIFT;
  886. pl_hdr.log_type = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_LOG_TYPE_OFFSET) &
  887. ATH_PKTLOG_HDR_LOG_TYPE_MASK) >>
  888. ATH_PKTLOG_HDR_LOG_TYPE_SHIFT;
  889. pl_hdr.size = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_SIZE_OFFSET) &
  890. ATH_PKTLOG_HDR_SIZE_MASK) >> ATH_PKTLOG_HDR_SIZE_SHIFT;
  891. pl_hdr.timestamp = *(pl_tgt_hdr + ATH_PKTLOG_HDR_TIMESTAMP_OFFSET);
  892. pl_info = pl_dev->pl_info;
  893. log_size = pl_hdr.size;
  894. rcf_log.rcFind = (void *)pktlog_getbuf(pl_dev, pl_info,
  895. log_size, &pl_hdr);
  896. if (sizeof(struct ath_pktlog_hdr) + pl_hdr.size > len) {
  897. qdf_assert(0);
  898. return A_ERROR;
  899. }
  900. qdf_mem_copy(rcf_log.rcFind,
  901. ((char *)fw_data->data + sizeof(struct ath_pktlog_hdr)),
  902. pl_hdr.size);
  903. cds_pkt_stats_to_logger_thread(&pl_hdr, NULL, rcf_log.rcFind);
  904. return A_OK;
  905. }
  906. #endif
  907. #ifdef HELIUMPLUS
  908. A_STATUS process_sw_event(void *pdev, void *data)
  909. {
  910. struct pktlog_dev_t *pl_dev = get_pktlog_handle();
  911. struct ath_pktlog_hdr pl_hdr;
  912. struct ath_pktlog_info *pl_info;
  913. size_t log_size;
  914. uint32_t len;
  915. struct ol_fw_data *fw_data;
  916. /*
  917. * Will be uncommented when the rate control find
  918. * for pktlog is implemented in the firmware.
  919. * Currently derived from the TX PPDU status
  920. */
  921. struct ath_pktlog_sw_event sw_event;
  922. uint32_t *pl_tgt_hdr;
  923. if (!pdev) {
  924. qdf_print("Invalid pdev in %s", __func__);
  925. return A_ERROR;
  926. }
  927. if (!data) {
  928. qdf_print("Invalid data in %s", __func__);
  929. return A_ERROR;
  930. }
  931. if (!pl_dev) {
  932. qdf_print("Invalid pl_dev in %s", __func__);
  933. return A_ERROR;
  934. }
  935. fw_data = (struct ol_fw_data *)data;
  936. len = fw_data->len;
  937. if (len < (sizeof(uint32_t) *
  938. (ATH_PKTLOG_HDR_FLAGS_OFFSET + 1)) ||
  939. len < (sizeof(uint32_t) *
  940. (ATH_PKTLOG_HDR_MISSED_CNT_OFFSET + 1)) ||
  941. len < (sizeof(uint32_t) *
  942. (ATH_PKTLOG_HDR_LOG_TYPE_OFFSET + 1)) ||
  943. len < (sizeof(uint32_t) *
  944. (ATH_PKTLOG_HDR_MAC_ID_OFFSET + 1)) ||
  945. len < (sizeof(uint32_t) *
  946. (ATH_PKTLOG_HDR_SIZE_OFFSET + 1)) ||
  947. len < (sizeof(uint32_t) *
  948. (ATH_PKTLOG_HDR_TYPE_SPECIFIC_DATA_OFFSET + 1))) {
  949. qdf_print("Invalid msdu len in %s", __func__);
  950. qdf_assert(0);
  951. return A_ERROR;
  952. }
  953. pl_tgt_hdr = (uint32_t *)fw_data->data;
  954. /*
  955. * Makes the short words (16 bits) portable b/w little endian
  956. * and big endian
  957. */
  958. pl_hdr.flags = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_FLAGS_OFFSET) &
  959. ATH_PKTLOG_HDR_FLAGS_MASK) >>
  960. ATH_PKTLOG_HDR_FLAGS_SHIFT;
  961. pl_hdr.missed_cnt = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MISSED_CNT_OFFSET) &
  962. ATH_PKTLOG_HDR_MISSED_CNT_MASK) >>
  963. ATH_PKTLOG_HDR_MISSED_CNT_SHIFT;
  964. pl_hdr.log_type = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_LOG_TYPE_OFFSET) &
  965. ATH_PKTLOG_HDR_LOG_TYPE_MASK) >>
  966. ATH_PKTLOG_HDR_LOG_TYPE_SHIFT;
  967. pl_hdr.macId = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MAC_ID_OFFSET) &
  968. ATH_PKTLOG_HDR_MAC_ID_MASK) >>
  969. ATH_PKTLOG_HDR_MAC_ID_SHIFT;
  970. pl_hdr.size = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_SIZE_OFFSET) &
  971. ATH_PKTLOG_HDR_SIZE_MASK) >> ATH_PKTLOG_HDR_SIZE_SHIFT;
  972. pl_hdr.timestamp = *(pl_tgt_hdr + ATH_PKTLOG_HDR_TIMESTAMP_OFFSET);
  973. pl_hdr.type_specific_data =
  974. *(pl_tgt_hdr + ATH_PKTLOG_HDR_TYPE_SPECIFIC_DATA_OFFSET);
  975. pl_info = pl_dev->pl_info;
  976. log_size = pl_hdr.size;
  977. sw_event.sw_event = (void *)pktlog_getbuf(pl_dev, pl_info,
  978. log_size, &pl_hdr);
  979. if (sizeof(struct ath_pktlog_hdr) + pl_hdr.size > len) {
  980. qdf_assert(0);
  981. return A_ERROR;
  982. }
  983. qdf_mem_copy(sw_event.sw_event,
  984. ((char *)fw_data->data + sizeof(struct ath_pktlog_hdr)),
  985. pl_hdr.size);
  986. return A_OK;
  987. }
  988. #else
  989. A_STATUS process_sw_event(void *pdev, void *data)
  990. {
  991. struct pktlog_dev_t *pl_dev = get_pktlog_handle();
  992. struct ath_pktlog_hdr pl_hdr;
  993. struct ath_pktlog_info *pl_info;
  994. size_t log_size;
  995. uint32_t len;
  996. struct ol_fw_data *fw_data;
  997. /*
  998. * Will be uncommented when the rate control find
  999. * for pktlog is implemented in the firmware.
  1000. * Currently derived from the TX PPDU status
  1001. */
  1002. struct ath_pktlog_sw_event sw_event;
  1003. uint32_t *pl_tgt_hdr;
  1004. if (!pdev) {
  1005. qdf_print("Invalid pdev in %s", __func__);
  1006. return A_ERROR;
  1007. }
  1008. if (!data) {
  1009. qdf_print("Invalid data in %s", __func__);
  1010. return A_ERROR;
  1011. }
  1012. if (!pl_dev) {
  1013. qdf_print("Invalid pl_dev in %s", __func__);
  1014. return A_ERROR;
  1015. }
  1016. fw_data = (struct ol_fw_data *)data;
  1017. len = fw_data->len;
  1018. if (len < (sizeof(uint32_t) *
  1019. (ATH_PKTLOG_HDR_FLAGS_OFFSET + 1)) ||
  1020. len < (sizeof(uint32_t) *
  1021. (ATH_PKTLOG_HDR_MISSED_CNT_OFFSET + 1)) ||
  1022. len < (sizeof(uint32_t) *
  1023. (ATH_PKTLOG_HDR_LOG_TYPE_OFFSET + 1)) ||
  1024. len < (sizeof(uint32_t) *
  1025. (ATH_PKTLOG_HDR_SIZE_OFFSET + 1)) ||
  1026. len < (sizeof(uint32_t) *
  1027. (ATH_PKTLOG_HDR_TYPE_SPECIFIC_DATA_OFFSET + 1))) {
  1028. qdf_print("Invalid msdu len in %s", __func__);
  1029. qdf_assert(0);
  1030. return A_ERROR;
  1031. }
  1032. pl_tgt_hdr = (uint32_t *)fw_data->data;
  1033. /*
  1034. * Makes the short words (16 bits) portable b/w little endian
  1035. * and big endian
  1036. */
  1037. pl_hdr.flags = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_FLAGS_OFFSET) &
  1038. ATH_PKTLOG_HDR_FLAGS_MASK) >>
  1039. ATH_PKTLOG_HDR_FLAGS_SHIFT;
  1040. pl_hdr.missed_cnt = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MISSED_CNT_OFFSET) &
  1041. ATH_PKTLOG_HDR_MISSED_CNT_MASK) >>
  1042. ATH_PKTLOG_HDR_MISSED_CNT_SHIFT;
  1043. pl_hdr.log_type = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_LOG_TYPE_OFFSET) &
  1044. ATH_PKTLOG_HDR_LOG_TYPE_MASK) >>
  1045. ATH_PKTLOG_HDR_LOG_TYPE_SHIFT;
  1046. pl_hdr.size = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_SIZE_OFFSET) &
  1047. ATH_PKTLOG_HDR_SIZE_MASK) >> ATH_PKTLOG_HDR_SIZE_SHIFT;
  1048. pl_hdr.timestamp = *(pl_tgt_hdr + ATH_PKTLOG_HDR_TIMESTAMP_OFFSET);
  1049. pl_info = pl_dev->pl_info;
  1050. log_size = pl_hdr.size;
  1051. sw_event.sw_event = (void *)pktlog_getbuf(pl_dev, pl_info,
  1052. log_size, &pl_hdr);
  1053. if (sizeof(struct ath_pktlog_hdr) + pl_hdr.size > len) {
  1054. qdf_assert(0);
  1055. return A_ERROR;
  1056. }
  1057. qdf_mem_copy(sw_event.sw_event,
  1058. ((char *)fw_data->data + sizeof(struct ath_pktlog_hdr)),
  1059. pl_hdr.size);
  1060. return A_OK;
  1061. }
  1062. #endif
  1063. #ifdef HELIUMPLUS
  1064. A_STATUS process_rate_update(void *pdev, void *data)
  1065. {
  1066. struct pktlog_dev_t *pl_dev = get_pktlog_handle();
  1067. struct ath_pktlog_hdr pl_hdr;
  1068. size_t log_size;
  1069. struct ath_pktlog_info *pl_info;
  1070. struct ath_pktlog_rc_update rcu_log;
  1071. uint32_t *pl_tgt_hdr;
  1072. struct ol_fw_data *fw_data;
  1073. uint32_t len;
  1074. if (!pdev || !data || !pl_dev) {
  1075. qdf_print("%s: Invalid handle", __func__);
  1076. return A_ERROR;
  1077. }
  1078. fw_data = (struct ol_fw_data *)data;
  1079. len = fw_data->len;
  1080. if (len < (sizeof(uint32_t) *
  1081. (ATH_PKTLOG_HDR_FLAGS_OFFSET + 1)) ||
  1082. len < (sizeof(uint32_t) *
  1083. (ATH_PKTLOG_HDR_MISSED_CNT_OFFSET + 1)) ||
  1084. len < (sizeof(uint32_t) *
  1085. (ATH_PKTLOG_HDR_LOG_TYPE_OFFSET + 1)) ||
  1086. len < (sizeof(uint32_t) *
  1087. (ATH_PKTLOG_HDR_MAC_ID_OFFSET + 1)) ||
  1088. len < (sizeof(uint32_t) *
  1089. (ATH_PKTLOG_HDR_SIZE_OFFSET + 1)) ||
  1090. len < (sizeof(uint32_t) *
  1091. (ATH_PKTLOG_HDR_TYPE_SPECIFIC_DATA_OFFSET + 1))) {
  1092. qdf_print("Invalid msdu len in %s", __func__);
  1093. qdf_assert(0);
  1094. return A_ERROR;
  1095. }
  1096. pl_tgt_hdr = (uint32_t *)fw_data->data;
  1097. /*
  1098. * Makes the short words (16 bits) portable b/w little endian
  1099. * and big endian
  1100. */
  1101. qdf_mem_set(&pl_hdr, sizeof(pl_hdr), 0);
  1102. pl_hdr.flags = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_FLAGS_OFFSET) &
  1103. ATH_PKTLOG_HDR_FLAGS_MASK) >>
  1104. ATH_PKTLOG_HDR_FLAGS_SHIFT;
  1105. pl_hdr.missed_cnt = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MISSED_CNT_OFFSET) &
  1106. ATH_PKTLOG_HDR_MISSED_CNT_MASK) >>
  1107. ATH_PKTLOG_HDR_MISSED_CNT_SHIFT;
  1108. pl_hdr.log_type = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_LOG_TYPE_OFFSET) &
  1109. ATH_PKTLOG_HDR_LOG_TYPE_MASK) >>
  1110. ATH_PKTLOG_HDR_LOG_TYPE_SHIFT;
  1111. pl_hdr.macId = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MAC_ID_OFFSET) &
  1112. ATH_PKTLOG_HDR_MAC_ID_MASK) >>
  1113. ATH_PKTLOG_HDR_MAC_ID_SHIFT;
  1114. pl_hdr.flags |= PKTLOG_HDR_SIZE_16;
  1115. pl_hdr.size = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_SIZE_OFFSET) &
  1116. ATH_PKTLOG_HDR_SIZE_MASK) >> ATH_PKTLOG_HDR_SIZE_SHIFT;
  1117. pl_hdr.timestamp = *(pl_tgt_hdr + ATH_PKTLOG_HDR_TIMESTAMP_OFFSET);
  1118. log_size = pl_hdr.size;
  1119. pl_info = pl_dev->pl_info;
  1120. /*
  1121. * Will be uncommented when the rate control update
  1122. * for pktlog is implemented in the firmware.
  1123. * Currently derived from the TX PPDU status
  1124. */
  1125. rcu_log.txRateCtrl = (void *)pktlog_getbuf(pl_dev, pl_info,
  1126. log_size, &pl_hdr);
  1127. if (sizeof(struct ath_pktlog_hdr) + pl_hdr.size > len) {
  1128. qdf_assert(0);
  1129. return A_ERROR;
  1130. }
  1131. qdf_mem_copy(rcu_log.txRateCtrl,
  1132. ((char *)fw_data->data +
  1133. sizeof(struct ath_pktlog_hdr)),
  1134. pl_hdr.size);
  1135. cds_pkt_stats_to_logger_thread(&pl_hdr, NULL, rcu_log.txRateCtrl);
  1136. return A_OK;
  1137. }
  1138. #else
  1139. A_STATUS process_rate_update(void *pdev, void *data)
  1140. {
  1141. struct pktlog_dev_t *pl_dev = get_pktlog_handle();
  1142. struct ath_pktlog_hdr pl_hdr;
  1143. size_t log_size;
  1144. struct ath_pktlog_info *pl_info;
  1145. struct ath_pktlog_rc_update rcu_log;
  1146. uint32_t *pl_tgt_hdr;
  1147. struct ol_fw_data *fw_data;
  1148. uint32_t len;
  1149. if (!pdev || !data || !pl_dev) {
  1150. qdf_print("%s: Invalid handle", __func__);
  1151. return A_ERROR;
  1152. }
  1153. fw_data = (struct ol_fw_data *)data;
  1154. len = fw_data->len;
  1155. if (len < (sizeof(uint32_t) *
  1156. (ATH_PKTLOG_HDR_FLAGS_OFFSET + 1)) ||
  1157. len < (sizeof(uint32_t) *
  1158. (ATH_PKTLOG_HDR_MISSED_CNT_OFFSET + 1)) ||
  1159. len < (sizeof(uint32_t) *
  1160. (ATH_PKTLOG_HDR_LOG_TYPE_OFFSET + 1)) ||
  1161. len < (sizeof(uint32_t) *
  1162. (ATH_PKTLOG_HDR_SIZE_OFFSET + 1)) ||
  1163. len < (sizeof(uint32_t) *
  1164. (ATH_PKTLOG_HDR_TYPE_SPECIFIC_DATA_OFFSET + 1))) {
  1165. qdf_print("Invalid msdu len in %s", __func__);
  1166. qdf_assert(0);
  1167. return A_ERROR;
  1168. }
  1169. pl_tgt_hdr = (uint32_t *)fw_data->data;
  1170. /*
  1171. * Makes the short words (16 bits) portable b/w little endian
  1172. * and big endian
  1173. */
  1174. qdf_mem_set(&pl_hdr, sizeof(pl_hdr), 0);
  1175. pl_hdr.flags = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_FLAGS_OFFSET) &
  1176. ATH_PKTLOG_HDR_FLAGS_MASK) >>
  1177. ATH_PKTLOG_HDR_FLAGS_SHIFT;
  1178. pl_hdr.missed_cnt = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MISSED_CNT_OFFSET) &
  1179. ATH_PKTLOG_HDR_MISSED_CNT_MASK) >>
  1180. ATH_PKTLOG_HDR_MISSED_CNT_SHIFT;
  1181. pl_hdr.log_type = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_LOG_TYPE_OFFSET) &
  1182. ATH_PKTLOG_HDR_LOG_TYPE_MASK) >>
  1183. ATH_PKTLOG_HDR_LOG_TYPE_SHIFT;
  1184. pl_hdr.size = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_SIZE_OFFSET) &
  1185. ATH_PKTLOG_HDR_SIZE_MASK) >> ATH_PKTLOG_HDR_SIZE_SHIFT;
  1186. pl_hdr.timestamp = *(pl_tgt_hdr + ATH_PKTLOG_HDR_TIMESTAMP_OFFSET);
  1187. log_size = pl_hdr.size;
  1188. pl_info = pl_dev->pl_info;
  1189. /*
  1190. * Will be uncommented when the rate control update
  1191. * for pktlog is implemented in the firmware.
  1192. * Currently derived from the TX PPDU status
  1193. */
  1194. rcu_log.txRateCtrl = (void *)pktlog_getbuf(pl_dev, pl_info,
  1195. log_size, &pl_hdr);
  1196. if (sizeof(struct ath_pktlog_hdr) + pl_hdr.size > len) {
  1197. qdf_assert(0);
  1198. return A_ERROR;
  1199. }
  1200. qdf_mem_copy(rcu_log.txRateCtrl,
  1201. ((char *)fw_data->data +
  1202. sizeof(struct ath_pktlog_hdr)),
  1203. pl_hdr.size);
  1204. cds_pkt_stats_to_logger_thread(&pl_hdr, NULL, rcu_log.txRateCtrl);
  1205. return A_OK;
  1206. }
  1207. #endif
  1208. #ifdef QCA_WIFI_QCA6290
  1209. int process_rx_desc_remote(void *pdev, void *data)
  1210. {
  1211. struct pktlog_dev_t *pl_dev = get_pktlog_handle();
  1212. struct ath_pktlog_hdr pl_hdr;
  1213. struct ath_pktlog_rx_info rxstat_log;
  1214. size_t log_size;
  1215. struct ath_pktlog_info *pl_info;
  1216. qdf_nbuf_t log_nbuf = (qdf_nbuf_t)data;
  1217. pl_info = pl_dev->pl_info;
  1218. qdf_mem_set(&pl_hdr, sizeof(pl_hdr), 0);
  1219. pl_hdr.flags = (1 << PKTLOG_FLG_FRM_TYPE_REMOTE_S);
  1220. pl_hdr.missed_cnt = 0;
  1221. pl_hdr.log_type = 22; /*PKTLOG_TYPE_RX_STATBUF*/
  1222. pl_hdr.size = qdf_nbuf_len(log_nbuf);
  1223. pl_hdr.timestamp = 0;
  1224. log_size = pl_hdr.size;
  1225. rxstat_log.rx_desc = (void *)pktlog_getbuf(pl_dev, pl_info,
  1226. log_size, &pl_hdr);
  1227. if (rxstat_log.rx_desc == NULL) {
  1228. QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_DEBUG,
  1229. "%s: Rx descriptor is NULL", __func__);
  1230. return -EFAULT;
  1231. }
  1232. qdf_mem_copy(rxstat_log.rx_desc, qdf_nbuf_data(log_nbuf), pl_hdr.size);
  1233. cds_pkt_stats_to_logger_thread(&pl_hdr, NULL,
  1234. rxstat_log.rx_desc);
  1235. return 0;
  1236. }
  1237. int
  1238. process_pktlog_lite(void *context, void *log_data, uint16_t log_type)
  1239. {
  1240. struct pktlog_dev_t *pl_dev = get_pktlog_handle();
  1241. struct ath_pktlog_info *pl_info;
  1242. struct ath_pktlog_hdr pl_hdr;
  1243. struct ath_pktlog_rx_info rxstat_log;
  1244. size_t log_size;
  1245. qdf_nbuf_t log_nbuf = (qdf_nbuf_t)log_data;
  1246. pl_info = pl_dev->pl_info;
  1247. qdf_mem_set(&pl_hdr, sizeof(pl_hdr), 0);
  1248. pl_hdr.flags = (1 << PKTLOG_FLG_FRM_TYPE_REMOTE_S);
  1249. pl_hdr.missed_cnt = 0;
  1250. pl_hdr.log_type = log_type;
  1251. pl_hdr.size = qdf_nbuf_len(log_nbuf);
  1252. pl_hdr.timestamp = 0;
  1253. log_size = pl_hdr.size;
  1254. rxstat_log.rx_desc = (void *)pktlog_getbuf(pl_dev, pl_info,
  1255. log_size, &pl_hdr);
  1256. if (rxstat_log.rx_desc == NULL) {
  1257. QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_DEBUG,
  1258. "%s: Rx descriptor is NULL", __func__);
  1259. return -EFAULT;
  1260. }
  1261. qdf_mem_copy(rxstat_log.rx_desc, qdf_nbuf_data(log_nbuf), pl_hdr.size);
  1262. cds_pkt_stats_to_logger_thread(&pl_hdr, NULL, rxstat_log.rx_desc);
  1263. return 0;
  1264. }
  1265. #else
  1266. int process_rx_desc_remote(void *pdev, void *data)
  1267. {
  1268. return 0;
  1269. }
  1270. int
  1271. process_pktlog_lite(void *context, void *log_data, uint16_t log_type)
  1272. {
  1273. return 0;
  1274. }
  1275. #endif
  1276. #endif /*REMOVE_PKT_LOG */