pktlog_internal.c 41 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406
  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\n",
  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\n");
  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\n", __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\n", __func__);
  428. return A_ERROR;
  429. }
  430. qdf_assert(pl_dev);
  431. qdf_assert(data);
  432. fw_data = (struct ol_fw_data *)data;
  433. len = fw_data->len;
  434. if (len < (sizeof(uint32_t) *
  435. (ATH_PKTLOG_HDR_FLAGS_OFFSET + 1)) ||
  436. len < (sizeof(uint32_t) *
  437. (ATH_PKTLOG_HDR_MISSED_CNT_OFFSET + 1)) ||
  438. len < (sizeof(uint32_t) *
  439. (ATH_PKTLOG_HDR_LOG_TYPE_OFFSET + 1)) ||
  440. len < (sizeof(uint32_t) *
  441. (ATH_PKTLOG_HDR_SIZE_OFFSET + 1)) ||
  442. len < (sizeof(uint32_t) *
  443. (ATH_PKTLOG_HDR_TYPE_SPECIFIC_DATA_OFFSET + 1))) {
  444. qdf_print("Invalid msdu len in %s\n", __func__);
  445. qdf_assert(0);
  446. return A_ERROR;
  447. }
  448. pl_tgt_hdr = (uint32_t *)fw_data->data;
  449. /*
  450. * Makes the short words (16 bits) portable b/w little endian
  451. * and big endian
  452. */
  453. pl_hdr.flags = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_FLAGS_OFFSET) &
  454. ATH_PKTLOG_HDR_FLAGS_MASK) >>
  455. ATH_PKTLOG_HDR_FLAGS_SHIFT;
  456. pl_hdr.missed_cnt = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MISSED_CNT_OFFSET) &
  457. ATH_PKTLOG_HDR_MISSED_CNT_MASK) >>
  458. ATH_PKTLOG_HDR_MISSED_CNT_SHIFT;
  459. pl_hdr.log_type = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_LOG_TYPE_OFFSET) &
  460. ATH_PKTLOG_HDR_LOG_TYPE_MASK) >>
  461. ATH_PKTLOG_HDR_LOG_TYPE_SHIFT;
  462. pl_hdr.size = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_SIZE_OFFSET) &
  463. ATH_PKTLOG_HDR_SIZE_MASK) >> ATH_PKTLOG_HDR_SIZE_SHIFT;
  464. pl_hdr.timestamp = *(pl_tgt_hdr + ATH_PKTLOG_HDR_TIMESTAMP_OFFSET);
  465. pl_info = pl_dev->pl_info;
  466. if (pl_hdr.log_type == PKTLOG_TYPE_TX_FRM_HDR) {
  467. /* Valid only for the TX CTL */
  468. process_ieee_hdr(fw_data->data + sizeof(pl_hdr));
  469. }
  470. if (pl_hdr.log_type == PKTLOG_TYPE_TX_VIRT_ADDR) {
  471. uint32_t desc_id = (uint32_t) *((uint32_t *)(fw_data->data +
  472. sizeof(pl_hdr)));
  473. uint32_t vdev_id = desc_id;
  474. /* if the pkt log msg is for the bcn frame the vdev id
  475. * is piggybacked in desc_id and the MSB of the desc ID
  476. * would be set to FF
  477. */
  478. #define BCN_DESC_ID 0xFF
  479. if ((desc_id >> 24) == BCN_DESC_ID) {
  480. void *data;
  481. uint32_t buf_size;
  482. vdev_id &= 0x00FFFFFF;
  483. /* TODO: MCL specific API */
  484. data = wma_get_beacon_buffer_by_vdev_id(vdev_id,
  485. &buf_size);
  486. if (data) {
  487. /* TODO: platform specific API */
  488. process_ieee_hdr(data);
  489. qdf_mem_free(data);
  490. }
  491. } else {
  492. /*
  493. * TODO: get the hdr content for mgmt frames from
  494. * Tx mgmt desc pool
  495. */
  496. }
  497. }
  498. if (pl_hdr.log_type == PKTLOG_TYPE_TX_CTRL) {
  499. struct ath_pktlog_txctl txctl_log;
  500. size_t log_size = sizeof(txctl_log.priv);
  501. txctl_log.txdesc_hdr_ctl = (void *)pktlog_getbuf(pl_dev,
  502. pl_info,
  503. log_size,
  504. &pl_hdr);
  505. if (!txctl_log.txdesc_hdr_ctl) {
  506. printk
  507. ("failed to get buf for txctl_log.txdesc_hdr_ctl\n");
  508. return A_ERROR;
  509. }
  510. /*
  511. * frm hdr is currently Valid only for local frames
  512. * Add capability to include the fmr hdr for remote frames
  513. */
  514. txctl_log.priv.frm_hdr = frm_hdr;
  515. qdf_assert(txctl_log.priv.txdesc_ctl);
  516. qdf_assert(pl_hdr.size < sizeof(txctl_log.priv.txdesc_ctl));
  517. pl_hdr.size = (pl_hdr.size > sizeof(txctl_log.priv.txdesc_ctl))
  518. ? sizeof(txctl_log.priv.txdesc_ctl) :
  519. pl_hdr.size;
  520. if (sizeof(struct ath_pktlog_hdr) + pl_hdr.size > len) {
  521. qdf_assert(0);
  522. return A_ERROR;
  523. }
  524. qdf_mem_copy((void *)&txctl_log.priv.txdesc_ctl,
  525. ((void *)fw_data->data +
  526. sizeof(struct ath_pktlog_hdr)),
  527. pl_hdr.size);
  528. qdf_assert(txctl_log.txdesc_hdr_ctl);
  529. qdf_mem_copy(txctl_log.txdesc_hdr_ctl, &txctl_log.priv,
  530. sizeof(txctl_log.priv));
  531. pl_hdr.size = log_size;
  532. cds_pkt_stats_to_logger_thread(&pl_hdr, NULL,
  533. txctl_log.txdesc_hdr_ctl);
  534. /* Add Protocol information and HT specific information */
  535. }
  536. if (pl_hdr.log_type == PKTLOG_TYPE_TX_STAT) {
  537. struct ath_pktlog_tx_status txstat_log;
  538. size_t log_size = pl_hdr.size;
  539. txstat_log.ds_status = (void *)
  540. pktlog_getbuf(pl_dev, pl_info, log_size, &pl_hdr);
  541. qdf_assert(txstat_log.ds_status);
  542. qdf_mem_copy(txstat_log.ds_status,
  543. ((void *)fw_data->data +
  544. sizeof(struct ath_pktlog_hdr)),
  545. pl_hdr.size);
  546. cds_pkt_stats_to_logger_thread(&pl_hdr, NULL,
  547. txstat_log.ds_status);
  548. }
  549. if (pl_hdr.log_type == PKTLOG_TYPE_TX_MSDU_ID) {
  550. struct ath_pktlog_msdu_info pl_msdu_info;
  551. size_t log_size;
  552. qdf_mem_set(&pl_msdu_info, sizeof(pl_msdu_info), 0);
  553. log_size = sizeof(pl_msdu_info.priv);
  554. if (pl_dev->mt_pktlog_enabled == false)
  555. fill_ieee80211_hdr_data(txrx_pdev,
  556. &pl_msdu_info, fw_data->data);
  557. pl_msdu_info.ath_msdu_info = pktlog_getbuf(pl_dev, pl_info,
  558. log_size, &pl_hdr);
  559. qdf_mem_copy((void *)&pl_msdu_info.priv.msdu_id_info,
  560. ((void *)fw_data->data +
  561. sizeof(struct ath_pktlog_hdr)),
  562. sizeof(pl_msdu_info.priv.msdu_id_info));
  563. qdf_mem_copy(pl_msdu_info.ath_msdu_info, &pl_msdu_info.priv,
  564. sizeof(pl_msdu_info.priv));
  565. cds_pkt_stats_to_logger_thread(&pl_hdr, NULL,
  566. pl_msdu_info.ath_msdu_info);
  567. }
  568. return A_OK;
  569. }
  570. #endif
  571. /* TODO: hardware dependent function */
  572. A_STATUS process_rx_info_remote(void *pdev, void *data)
  573. {
  574. struct pktlog_dev_t *pl_dev = get_pktlog_handle();
  575. struct ath_pktlog_info *pl_info;
  576. struct htt_host_rx_desc_base *rx_desc;
  577. struct ath_pktlog_hdr pl_hdr;
  578. struct ath_pktlog_rx_info rxstat_log;
  579. size_t log_size;
  580. struct ol_rx_remote_data *r_data = (struct ol_rx_remote_data *)data;
  581. qdf_nbuf_t msdu;
  582. if (!pdev || !r_data || !pl_dev) {
  583. qdf_print("%s: Invalid handle", __func__);
  584. return A_ERROR;
  585. }
  586. pl_info = pl_dev->pl_info;
  587. msdu = r_data->msdu;
  588. while (msdu) {
  589. rx_desc =
  590. (struct htt_host_rx_desc_base *)(qdf_nbuf_data(msdu)) - 1;
  591. log_size =
  592. sizeof(*rx_desc) - sizeof(struct htt_host_fw_desc_base);
  593. /*
  594. * Construct the pktlog header pl_hdr
  595. * Because desc is DMA'd to the host memory
  596. */
  597. pl_hdr.flags = (1 << PKTLOG_FLG_FRM_TYPE_REMOTE_S);
  598. pl_hdr.missed_cnt = 0;
  599. #if defined(HELIUMPLUS)
  600. pl_hdr.macId = r_data->mac_id;
  601. pl_hdr.log_type = PKTLOG_TYPE_RX_STAT;
  602. pl_hdr.flags |= PKTLOG_HDR_SIZE_16;
  603. #else
  604. pl_hdr.log_type = PKTLOG_TYPE_RX_STAT;
  605. #endif
  606. pl_hdr.size = sizeof(*rx_desc) -
  607. sizeof(struct htt_host_fw_desc_base);
  608. #if defined(HELIUMPLUS)
  609. pl_hdr.timestamp =
  610. rx_desc->ppdu_end.rx_pkt_end.phy_timestamp_1_lower_32;
  611. pl_hdr.type_specific_data = 0xDEADAA;
  612. #else
  613. pl_hdr.timestamp = rx_desc->ppdu_end.tsf_timestamp;
  614. #endif /* !defined(HELIUMPLUS) */
  615. rxstat_log.rx_desc = (void *)pktlog_getbuf(pl_dev, pl_info,
  616. log_size, &pl_hdr);
  617. qdf_mem_copy(rxstat_log.rx_desc, (void *)rx_desc +
  618. sizeof(struct htt_host_fw_desc_base), pl_hdr.size);
  619. cds_pkt_stats_to_logger_thread(&pl_hdr, NULL,
  620. rxstat_log.rx_desc);
  621. msdu = qdf_nbuf_next(msdu);
  622. }
  623. return A_OK;
  624. }
  625. #ifdef HELIUMPLUS
  626. A_STATUS process_rx_info(void *pdev, void *data)
  627. {
  628. struct pktlog_dev_t *pl_dev = get_pktlog_handle();
  629. struct ath_pktlog_info *pl_info;
  630. struct ath_pktlog_rx_info rxstat_log;
  631. struct ath_pktlog_hdr pl_hdr;
  632. size_t log_size;
  633. uint32_t *pl_tgt_hdr;
  634. struct ol_fw_data *fw_data;
  635. uint32_t len;
  636. if (!pdev) {
  637. printk("Invalid pdev in %s", __func__);
  638. return A_ERROR;
  639. }
  640. pl_dev = ((struct ol_txrx_pdev_t *)pdev)->pl_dev;
  641. if (!pl_dev) {
  642. printk("Invalid pl_dev in %s", __func__);
  643. return A_ERROR;
  644. }
  645. fw_data = (struct ol_fw_data *)data;
  646. len = fw_data->len;
  647. if (len < (sizeof(uint32_t) *
  648. (ATH_PKTLOG_HDR_FLAGS_OFFSET + 1)) ||
  649. len < (sizeof(uint32_t) *
  650. (ATH_PKTLOG_HDR_MISSED_CNT_OFFSET + 1)) ||
  651. len < (sizeof(uint32_t) *
  652. (ATH_PKTLOG_HDR_LOG_TYPE_OFFSET + 1)) ||
  653. len < (sizeof(uint32_t) *
  654. (ATH_PKTLOG_HDR_MAC_ID_OFFSET + 1)) ||
  655. len < (sizeof(uint32_t) *
  656. (ATH_PKTLOG_HDR_SIZE_OFFSET + 1)) ||
  657. len < (sizeof(uint32_t) *
  658. (ATH_PKTLOG_HDR_TYPE_SPECIFIC_DATA_OFFSET + 1))) {
  659. qdf_print("Invalid msdu len in %s\n", __func__);
  660. qdf_assert(0);
  661. return A_ERROR;
  662. }
  663. pl_info = pl_dev->pl_info;
  664. pl_tgt_hdr = (uint32_t *)fw_data->data;
  665. qdf_mem_set(&pl_hdr, sizeof(pl_hdr), 0);
  666. pl_hdr.flags = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_FLAGS_OFFSET) &
  667. ATH_PKTLOG_HDR_FLAGS_MASK) >>
  668. ATH_PKTLOG_HDR_FLAGS_SHIFT;
  669. pl_hdr.missed_cnt = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MISSED_CNT_OFFSET) &
  670. ATH_PKTLOG_HDR_MISSED_CNT_MASK) >>
  671. ATH_PKTLOG_HDR_MISSED_CNT_SHIFT;
  672. pl_hdr.log_type = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_LOG_TYPE_OFFSET) &
  673. ATH_PKTLOG_HDR_LOG_TYPE_MASK) >>
  674. ATH_PKTLOG_HDR_LOG_TYPE_SHIFT;
  675. pl_hdr.macId = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MAC_ID_OFFSET) &
  676. ATH_PKTLOG_HDR_MAC_ID_MASK) >>
  677. ATH_PKTLOG_HDR_MAC_ID_SHIFT;
  678. pl_hdr.flags |= PKTLOG_HDR_SIZE_16;
  679. pl_hdr.size = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_SIZE_OFFSET) &
  680. ATH_PKTLOG_HDR_SIZE_MASK) >> ATH_PKTLOG_HDR_SIZE_SHIFT;
  681. pl_hdr.timestamp = *(pl_tgt_hdr + ATH_PKTLOG_HDR_TIMESTAMP_OFFSET);
  682. if (sizeof(struct ath_pktlog_hdr) + pl_hdr.size > len) {
  683. qdf_assert(0);
  684. return A_ERROR;
  685. }
  686. log_size = pl_hdr.size;
  687. rxstat_log.rx_desc = (void *)pktlog_getbuf(pl_dev, pl_info,
  688. log_size, &pl_hdr);
  689. qdf_mem_copy(rxstat_log.rx_desc,
  690. (void *)fw_data->data + sizeof(struct ath_pktlog_hdr),
  691. pl_hdr.size);
  692. cds_pkt_stats_to_logger_thread(&pl_hdr, NULL, rxstat_log.rx_desc);
  693. return A_OK;
  694. }
  695. #else
  696. A_STATUS process_rx_info(void *pdev, void *data)
  697. {
  698. struct pktlog_dev_t *pl_dev = get_pktlog_handle();
  699. struct ath_pktlog_info *pl_info;
  700. struct ath_pktlog_rx_info rxstat_log;
  701. struct ath_pktlog_hdr pl_hdr;
  702. size_t log_size;
  703. uint32_t *pl_tgt_hdr;
  704. struct ol_fw_data *fw_data;
  705. uint32_t len;
  706. if (!pdev) {
  707. printk("Invalid pdev in %s", __func__);
  708. return A_ERROR;
  709. }
  710. pl_dev = ((struct ol_txrx_pdev_t *)pdev)->pl_dev;
  711. if (!pl_dev) {
  712. printk("Invalid pl_dev in %s", __func__);
  713. return A_ERROR;
  714. }
  715. fw_data = (struct ol_fw_data *)data;
  716. len = fw_data->len;
  717. if (len < (sizeof(uint32_t) *
  718. (ATH_PKTLOG_HDR_FLAGS_OFFSET + 1)) ||
  719. len < (sizeof(uint32_t) *
  720. (ATH_PKTLOG_HDR_MISSED_CNT_OFFSET + 1)) ||
  721. len < (sizeof(uint32_t) *
  722. (ATH_PKTLOG_HDR_LOG_TYPE_OFFSET + 1)) ||
  723. len < (sizeof(uint32_t) *
  724. (ATH_PKTLOG_HDR_SIZE_OFFSET + 1)) ||
  725. len < (sizeof(uint32_t) *
  726. (ATH_PKTLOG_HDR_TYPE_SPECIFIC_DATA_OFFSET + 1))) {
  727. qdf_print("Invalid msdu len in %s\n", __func__);
  728. qdf_assert(0);
  729. return A_ERROR;
  730. }
  731. pl_info = pl_dev->pl_info;
  732. pl_tgt_hdr = (uint32_t *)fw_data->data;
  733. qdf_mem_set(&pl_hdr, sizeof(pl_hdr), 0);
  734. pl_hdr.flags = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_FLAGS_OFFSET) &
  735. ATH_PKTLOG_HDR_FLAGS_MASK) >>
  736. ATH_PKTLOG_HDR_FLAGS_SHIFT;
  737. pl_hdr.missed_cnt = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MISSED_CNT_OFFSET) &
  738. ATH_PKTLOG_HDR_MISSED_CNT_MASK) >>
  739. ATH_PKTLOG_HDR_MISSED_CNT_SHIFT;
  740. pl_hdr.log_type = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_LOG_TYPE_OFFSET) &
  741. ATH_PKTLOG_HDR_LOG_TYPE_MASK) >>
  742. ATH_PKTLOG_HDR_LOG_TYPE_SHIFT;
  743. pl_hdr.size = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_SIZE_OFFSET) &
  744. ATH_PKTLOG_HDR_SIZE_MASK) >> ATH_PKTLOG_HDR_SIZE_SHIFT;
  745. pl_hdr.timestamp = *(pl_tgt_hdr + ATH_PKTLOG_HDR_TIMESTAMP_OFFSET);
  746. if (sizeof(struct ath_pktlog_hdr) + pl_hdr.size > len) {
  747. qdf_assert(0);
  748. return A_ERROR;
  749. }
  750. log_size = pl_hdr.size;
  751. rxstat_log.rx_desc = (void *)pktlog_getbuf(pl_dev, pl_info,
  752. log_size, &pl_hdr);
  753. qdf_mem_copy(rxstat_log.rx_desc,
  754. (void *)fw_data->data + sizeof(struct ath_pktlog_hdr),
  755. pl_hdr.size);
  756. cds_pkt_stats_to_logger_thread(&pl_hdr, NULL, rxstat_log.rx_desc);
  757. return A_OK;
  758. }
  759. #endif
  760. #ifdef HELIUMPLUS
  761. A_STATUS process_rate_find(void *pdev, void *data)
  762. {
  763. struct pktlog_dev_t *pl_dev = get_pktlog_handle();
  764. struct ath_pktlog_hdr pl_hdr;
  765. struct ath_pktlog_info *pl_info;
  766. size_t log_size;
  767. uint32_t len;
  768. struct ol_fw_data *fw_data;
  769. /*
  770. * Will be uncommented when the rate control find
  771. * for pktlog is implemented in the firmware.
  772. * Currently derived from the TX PPDU status
  773. */
  774. struct ath_pktlog_rc_find rcf_log;
  775. uint32_t *pl_tgt_hdr;
  776. if (!pdev || !data || !pl_dev) {
  777. qdf_print("%s: Invalid handle", __func__);
  778. return A_ERROR;
  779. }
  780. fw_data = (struct ol_fw_data *)data;
  781. len = fw_data->len;
  782. if (len < (sizeof(uint32_t) *
  783. (ATH_PKTLOG_HDR_FLAGS_OFFSET + 1)) ||
  784. len < (sizeof(uint32_t) *
  785. (ATH_PKTLOG_HDR_MISSED_CNT_OFFSET + 1)) ||
  786. len < (sizeof(uint32_t) *
  787. (ATH_PKTLOG_HDR_LOG_TYPE_OFFSET + 1)) ||
  788. len < (sizeof(uint32_t) *
  789. (ATH_PKTLOG_HDR_MAC_ID_OFFSET + 1)) ||
  790. len < (sizeof(uint32_t) *
  791. (ATH_PKTLOG_HDR_SIZE_OFFSET + 1)) ||
  792. len < (sizeof(uint32_t) *
  793. (ATH_PKTLOG_HDR_TYPE_SPECIFIC_DATA_OFFSET + 1))) {
  794. qdf_print("Invalid msdu len in %s\n", __func__);
  795. qdf_assert(0);
  796. return A_ERROR;
  797. }
  798. pl_tgt_hdr = (uint32_t *)fw_data->data;
  799. /*
  800. * Makes the short words (16 bits) portable b/w little endian
  801. * and big endian
  802. */
  803. qdf_mem_set(&pl_hdr, sizeof(pl_hdr), 0);
  804. pl_hdr.flags = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_FLAGS_OFFSET) &
  805. ATH_PKTLOG_HDR_FLAGS_MASK) >>
  806. ATH_PKTLOG_HDR_FLAGS_SHIFT;
  807. pl_hdr.missed_cnt = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MISSED_CNT_OFFSET) &
  808. ATH_PKTLOG_HDR_MISSED_CNT_MASK) >>
  809. ATH_PKTLOG_HDR_MISSED_CNT_SHIFT;
  810. pl_hdr.log_type = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_LOG_TYPE_OFFSET) &
  811. ATH_PKTLOG_HDR_LOG_TYPE_MASK) >>
  812. ATH_PKTLOG_HDR_LOG_TYPE_SHIFT;
  813. pl_hdr.macId = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MAC_ID_OFFSET) &
  814. ATH_PKTLOG_HDR_MAC_ID_MASK) >>
  815. ATH_PKTLOG_HDR_MAC_ID_SHIFT;
  816. pl_hdr.flags |= PKTLOG_HDR_SIZE_16;
  817. pl_hdr.size = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_SIZE_OFFSET) &
  818. ATH_PKTLOG_HDR_SIZE_MASK) >> ATH_PKTLOG_HDR_SIZE_SHIFT;
  819. pl_hdr.timestamp = *(pl_tgt_hdr + ATH_PKTLOG_HDR_TIMESTAMP_OFFSET);
  820. pl_info = pl_dev->pl_info;
  821. log_size = pl_hdr.size;
  822. rcf_log.rcFind = (void *)pktlog_getbuf(pl_dev, pl_info,
  823. log_size, &pl_hdr);
  824. if (sizeof(struct ath_pktlog_hdr) + pl_hdr.size > len) {
  825. qdf_assert(0);
  826. return A_ERROR;
  827. }
  828. qdf_mem_copy(rcf_log.rcFind,
  829. ((char *)fw_data->data + sizeof(struct ath_pktlog_hdr)),
  830. pl_hdr.size);
  831. cds_pkt_stats_to_logger_thread(&pl_hdr, NULL, rcf_log.rcFind);
  832. return A_OK;
  833. }
  834. #else
  835. A_STATUS process_rate_find(void *pdev, void *data)
  836. {
  837. struct pktlog_dev_t *pl_dev = get_pktlog_handle();
  838. struct ath_pktlog_hdr pl_hdr;
  839. struct ath_pktlog_info *pl_info;
  840. size_t log_size;
  841. uint32_t len;
  842. struct ol_fw_data *fw_data;
  843. /*
  844. * Will be uncommented when the rate control find
  845. * for pktlog is implemented in the firmware.
  846. * Currently derived from the TX PPDU status
  847. */
  848. struct ath_pktlog_rc_find rcf_log;
  849. uint32_t *pl_tgt_hdr;
  850. if (!pdev || !data || !pl_dev) {
  851. qdf_print("%s: Invalid handle", __func__);
  852. return A_ERROR;
  853. }
  854. fw_data = (struct ol_fw_data *)data;
  855. len = fw_data->len;
  856. if (len < (sizeof(uint32_t) *
  857. (ATH_PKTLOG_HDR_FLAGS_OFFSET + 1)) ||
  858. len < (sizeof(uint32_t) *
  859. (ATH_PKTLOG_HDR_MISSED_CNT_OFFSET + 1)) ||
  860. len < (sizeof(uint32_t) *
  861. (ATH_PKTLOG_HDR_LOG_TYPE_OFFSET + 1)) ||
  862. len < (sizeof(uint32_t) *
  863. (ATH_PKTLOG_HDR_SIZE_OFFSET + 1)) ||
  864. len < (sizeof(uint32_t) *
  865. (ATH_PKTLOG_HDR_TYPE_SPECIFIC_DATA_OFFSET + 1))) {
  866. qdf_print("Invalid msdu len in %s\n", __func__);
  867. qdf_assert(0);
  868. return A_ERROR;
  869. }
  870. pl_tgt_hdr = (uint32_t *)fw_data->data;
  871. /*
  872. * Makes the short words (16 bits) portable b/w little endian
  873. * and big endian
  874. */
  875. qdf_mem_set(&pl_hdr, sizeof(pl_hdr), 0);
  876. pl_hdr.flags = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_FLAGS_OFFSET) &
  877. ATH_PKTLOG_HDR_FLAGS_MASK) >>
  878. ATH_PKTLOG_HDR_FLAGS_SHIFT;
  879. pl_hdr.missed_cnt = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MISSED_CNT_OFFSET) &
  880. ATH_PKTLOG_HDR_MISSED_CNT_MASK) >>
  881. ATH_PKTLOG_HDR_MISSED_CNT_SHIFT;
  882. pl_hdr.log_type = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_LOG_TYPE_OFFSET) &
  883. ATH_PKTLOG_HDR_LOG_TYPE_MASK) >>
  884. ATH_PKTLOG_HDR_LOG_TYPE_SHIFT;
  885. pl_hdr.size = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_SIZE_OFFSET) &
  886. ATH_PKTLOG_HDR_SIZE_MASK) >> ATH_PKTLOG_HDR_SIZE_SHIFT;
  887. pl_hdr.timestamp = *(pl_tgt_hdr + ATH_PKTLOG_HDR_TIMESTAMP_OFFSET);
  888. pl_info = pl_dev->pl_info;
  889. log_size = pl_hdr.size;
  890. rcf_log.rcFind = (void *)pktlog_getbuf(pl_dev, pl_info,
  891. log_size, &pl_hdr);
  892. if (sizeof(struct ath_pktlog_hdr) + pl_hdr.size > len) {
  893. qdf_assert(0);
  894. return A_ERROR;
  895. }
  896. qdf_mem_copy(rcf_log.rcFind,
  897. ((char *)fw_data->data + sizeof(struct ath_pktlog_hdr)),
  898. pl_hdr.size);
  899. cds_pkt_stats_to_logger_thread(&pl_hdr, NULL, rcf_log.rcFind);
  900. return A_OK;
  901. }
  902. #endif
  903. #ifdef HELIUMPLUS
  904. A_STATUS process_sw_event(void *pdev, void *data)
  905. {
  906. struct pktlog_dev_t *pl_dev = get_pktlog_handle();
  907. struct ath_pktlog_hdr pl_hdr;
  908. struct ath_pktlog_info *pl_info;
  909. size_t log_size;
  910. uint32_t len;
  911. struct ol_fw_data *fw_data;
  912. /*
  913. * Will be uncommented when the rate control find
  914. * for pktlog is implemented in the firmware.
  915. * Currently derived from the TX PPDU status
  916. */
  917. struct ath_pktlog_sw_event sw_event;
  918. uint32_t *pl_tgt_hdr;
  919. if (!pdev) {
  920. qdf_print("Invalid pdev in %s\n", __func__);
  921. return A_ERROR;
  922. }
  923. if (!data) {
  924. qdf_print("Invalid data in %s\n", __func__);
  925. return A_ERROR;
  926. }
  927. if (!pl_dev) {
  928. qdf_print("Invalid pl_dev in %s", __func__);
  929. return A_ERROR;
  930. }
  931. fw_data = (struct ol_fw_data *)data;
  932. len = fw_data->len;
  933. if (len < (sizeof(uint32_t) *
  934. (ATH_PKTLOG_HDR_FLAGS_OFFSET + 1)) ||
  935. len < (sizeof(uint32_t) *
  936. (ATH_PKTLOG_HDR_MISSED_CNT_OFFSET + 1)) ||
  937. len < (sizeof(uint32_t) *
  938. (ATH_PKTLOG_HDR_LOG_TYPE_OFFSET + 1)) ||
  939. len < (sizeof(uint32_t) *
  940. (ATH_PKTLOG_HDR_MAC_ID_OFFSET + 1)) ||
  941. len < (sizeof(uint32_t) *
  942. (ATH_PKTLOG_HDR_SIZE_OFFSET + 1)) ||
  943. len < (sizeof(uint32_t) *
  944. (ATH_PKTLOG_HDR_TYPE_SPECIFIC_DATA_OFFSET + 1))) {
  945. qdf_print("Invalid msdu len in %s\n", __func__);
  946. qdf_assert(0);
  947. return A_ERROR;
  948. }
  949. pl_tgt_hdr = (uint32_t *)fw_data->data;
  950. /*
  951. * Makes the short words (16 bits) portable b/w little endian
  952. * and big endian
  953. */
  954. pl_hdr.flags = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_FLAGS_OFFSET) &
  955. ATH_PKTLOG_HDR_FLAGS_MASK) >>
  956. ATH_PKTLOG_HDR_FLAGS_SHIFT;
  957. pl_hdr.missed_cnt = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MISSED_CNT_OFFSET) &
  958. ATH_PKTLOG_HDR_MISSED_CNT_MASK) >>
  959. ATH_PKTLOG_HDR_MISSED_CNT_SHIFT;
  960. pl_hdr.log_type = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_LOG_TYPE_OFFSET) &
  961. ATH_PKTLOG_HDR_LOG_TYPE_MASK) >>
  962. ATH_PKTLOG_HDR_LOG_TYPE_SHIFT;
  963. pl_hdr.macId = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MAC_ID_OFFSET) &
  964. ATH_PKTLOG_HDR_MAC_ID_MASK) >>
  965. ATH_PKTLOG_HDR_MAC_ID_SHIFT;
  966. pl_hdr.size = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_SIZE_OFFSET) &
  967. ATH_PKTLOG_HDR_SIZE_MASK) >> ATH_PKTLOG_HDR_SIZE_SHIFT;
  968. pl_hdr.timestamp = *(pl_tgt_hdr + ATH_PKTLOG_HDR_TIMESTAMP_OFFSET);
  969. pl_hdr.type_specific_data =
  970. *(pl_tgt_hdr + ATH_PKTLOG_HDR_TYPE_SPECIFIC_DATA_OFFSET);
  971. pl_info = pl_dev->pl_info;
  972. log_size = pl_hdr.size;
  973. sw_event.sw_event = (void *)pktlog_getbuf(pl_dev, pl_info,
  974. log_size, &pl_hdr);
  975. if (sizeof(struct ath_pktlog_hdr) + pl_hdr.size > len) {
  976. qdf_assert(0);
  977. return A_ERROR;
  978. }
  979. qdf_mem_copy(sw_event.sw_event,
  980. ((char *)fw_data->data + sizeof(struct ath_pktlog_hdr)),
  981. pl_hdr.size);
  982. return A_OK;
  983. }
  984. #else
  985. A_STATUS process_sw_event(void *pdev, void *data)
  986. {
  987. struct pktlog_dev_t *pl_dev = get_pktlog_handle();
  988. struct ath_pktlog_hdr pl_hdr;
  989. struct ath_pktlog_info *pl_info;
  990. size_t log_size;
  991. uint32_t len;
  992. struct ol_fw_data *fw_data;
  993. /*
  994. * Will be uncommented when the rate control find
  995. * for pktlog is implemented in the firmware.
  996. * Currently derived from the TX PPDU status
  997. */
  998. struct ath_pktlog_sw_event sw_event;
  999. uint32_t *pl_tgt_hdr;
  1000. if (!pdev) {
  1001. qdf_print("Invalid pdev in %s\n", __func__);
  1002. return A_ERROR;
  1003. }
  1004. if (!data) {
  1005. qdf_print("Invalid data in %s\n", __func__);
  1006. return A_ERROR;
  1007. }
  1008. if (!pl_dev) {
  1009. qdf_print("Invalid pl_dev in %s", __func__);
  1010. return A_ERROR;
  1011. }
  1012. fw_data = (struct ol_fw_data *)data;
  1013. len = fw_data->len;
  1014. if (len < (sizeof(uint32_t) *
  1015. (ATH_PKTLOG_HDR_FLAGS_OFFSET + 1)) ||
  1016. len < (sizeof(uint32_t) *
  1017. (ATH_PKTLOG_HDR_MISSED_CNT_OFFSET + 1)) ||
  1018. len < (sizeof(uint32_t) *
  1019. (ATH_PKTLOG_HDR_LOG_TYPE_OFFSET + 1)) ||
  1020. len < (sizeof(uint32_t) *
  1021. (ATH_PKTLOG_HDR_SIZE_OFFSET + 1)) ||
  1022. len < (sizeof(uint32_t) *
  1023. (ATH_PKTLOG_HDR_TYPE_SPECIFIC_DATA_OFFSET + 1))) {
  1024. qdf_print("Invalid msdu len in %s\n", __func__);
  1025. qdf_assert(0);
  1026. return A_ERROR;
  1027. }
  1028. pl_tgt_hdr = (uint32_t *)fw_data->data;
  1029. /*
  1030. * Makes the short words (16 bits) portable b/w little endian
  1031. * and big endian
  1032. */
  1033. pl_hdr.flags = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_FLAGS_OFFSET) &
  1034. ATH_PKTLOG_HDR_FLAGS_MASK) >>
  1035. ATH_PKTLOG_HDR_FLAGS_SHIFT;
  1036. pl_hdr.missed_cnt = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MISSED_CNT_OFFSET) &
  1037. ATH_PKTLOG_HDR_MISSED_CNT_MASK) >>
  1038. ATH_PKTLOG_HDR_MISSED_CNT_SHIFT;
  1039. pl_hdr.log_type = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_LOG_TYPE_OFFSET) &
  1040. ATH_PKTLOG_HDR_LOG_TYPE_MASK) >>
  1041. ATH_PKTLOG_HDR_LOG_TYPE_SHIFT;
  1042. pl_hdr.size = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_SIZE_OFFSET) &
  1043. ATH_PKTLOG_HDR_SIZE_MASK) >> ATH_PKTLOG_HDR_SIZE_SHIFT;
  1044. pl_hdr.timestamp = *(pl_tgt_hdr + ATH_PKTLOG_HDR_TIMESTAMP_OFFSET);
  1045. pl_info = pl_dev->pl_info;
  1046. log_size = pl_hdr.size;
  1047. sw_event.sw_event = (void *)pktlog_getbuf(pl_dev, pl_info,
  1048. log_size, &pl_hdr);
  1049. if (sizeof(struct ath_pktlog_hdr) + pl_hdr.size > len) {
  1050. qdf_assert(0);
  1051. return A_ERROR;
  1052. }
  1053. qdf_mem_copy(sw_event.sw_event,
  1054. ((char *)fw_data->data + sizeof(struct ath_pktlog_hdr)),
  1055. pl_hdr.size);
  1056. return A_OK;
  1057. }
  1058. #endif
  1059. #ifdef HELIUMPLUS
  1060. A_STATUS process_rate_update(void *pdev, void *data)
  1061. {
  1062. struct pktlog_dev_t *pl_dev = get_pktlog_handle();
  1063. struct ath_pktlog_hdr pl_hdr;
  1064. size_t log_size;
  1065. struct ath_pktlog_info *pl_info;
  1066. struct ath_pktlog_rc_update rcu_log;
  1067. uint32_t *pl_tgt_hdr;
  1068. struct ol_fw_data *fw_data;
  1069. uint32_t len;
  1070. if (!pdev || !data || !pl_dev) {
  1071. qdf_print("%s: Invalid handle", __func__);
  1072. return A_ERROR;
  1073. }
  1074. fw_data = (struct ol_fw_data *)data;
  1075. len = fw_data->len;
  1076. if (len < (sizeof(uint32_t) *
  1077. (ATH_PKTLOG_HDR_FLAGS_OFFSET + 1)) ||
  1078. len < (sizeof(uint32_t) *
  1079. (ATH_PKTLOG_HDR_MISSED_CNT_OFFSET + 1)) ||
  1080. len < (sizeof(uint32_t) *
  1081. (ATH_PKTLOG_HDR_LOG_TYPE_OFFSET + 1)) ||
  1082. len < (sizeof(uint32_t) *
  1083. (ATH_PKTLOG_HDR_MAC_ID_OFFSET + 1)) ||
  1084. len < (sizeof(uint32_t) *
  1085. (ATH_PKTLOG_HDR_SIZE_OFFSET + 1)) ||
  1086. len < (sizeof(uint32_t) *
  1087. (ATH_PKTLOG_HDR_TYPE_SPECIFIC_DATA_OFFSET + 1))) {
  1088. qdf_print("Invalid msdu len in %s\n", __func__);
  1089. qdf_assert(0);
  1090. return A_ERROR;
  1091. }
  1092. pl_tgt_hdr = (uint32_t *)fw_data->data;
  1093. /*
  1094. * Makes the short words (16 bits) portable b/w little endian
  1095. * and big endian
  1096. */
  1097. qdf_mem_set(&pl_hdr, sizeof(pl_hdr), 0);
  1098. pl_hdr.flags = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_FLAGS_OFFSET) &
  1099. ATH_PKTLOG_HDR_FLAGS_MASK) >>
  1100. ATH_PKTLOG_HDR_FLAGS_SHIFT;
  1101. pl_hdr.missed_cnt = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MISSED_CNT_OFFSET) &
  1102. ATH_PKTLOG_HDR_MISSED_CNT_MASK) >>
  1103. ATH_PKTLOG_HDR_MISSED_CNT_SHIFT;
  1104. pl_hdr.log_type = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_LOG_TYPE_OFFSET) &
  1105. ATH_PKTLOG_HDR_LOG_TYPE_MASK) >>
  1106. ATH_PKTLOG_HDR_LOG_TYPE_SHIFT;
  1107. pl_hdr.macId = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MAC_ID_OFFSET) &
  1108. ATH_PKTLOG_HDR_MAC_ID_MASK) >>
  1109. ATH_PKTLOG_HDR_MAC_ID_SHIFT;
  1110. pl_hdr.flags |= PKTLOG_HDR_SIZE_16;
  1111. pl_hdr.size = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_SIZE_OFFSET) &
  1112. ATH_PKTLOG_HDR_SIZE_MASK) >> ATH_PKTLOG_HDR_SIZE_SHIFT;
  1113. pl_hdr.timestamp = *(pl_tgt_hdr + ATH_PKTLOG_HDR_TIMESTAMP_OFFSET);
  1114. log_size = pl_hdr.size;
  1115. pl_info = pl_dev->pl_info;
  1116. /*
  1117. * Will be uncommented when the rate control update
  1118. * for pktlog is implemented in the firmware.
  1119. * Currently derived from the TX PPDU status
  1120. */
  1121. rcu_log.txRateCtrl = (void *)pktlog_getbuf(pl_dev, pl_info,
  1122. log_size, &pl_hdr);
  1123. if (sizeof(struct ath_pktlog_hdr) + pl_hdr.size > len) {
  1124. qdf_assert(0);
  1125. return A_ERROR;
  1126. }
  1127. qdf_mem_copy(rcu_log.txRateCtrl,
  1128. ((char *)fw_data->data +
  1129. sizeof(struct ath_pktlog_hdr)),
  1130. pl_hdr.size);
  1131. cds_pkt_stats_to_logger_thread(&pl_hdr, NULL, rcu_log.txRateCtrl);
  1132. return A_OK;
  1133. }
  1134. #else
  1135. A_STATUS process_rate_update(void *pdev, void *data)
  1136. {
  1137. struct pktlog_dev_t *pl_dev = get_pktlog_handle();
  1138. struct ath_pktlog_hdr pl_hdr;
  1139. size_t log_size;
  1140. struct ath_pktlog_info *pl_info;
  1141. struct ath_pktlog_rc_update rcu_log;
  1142. uint32_t *pl_tgt_hdr;
  1143. struct ol_fw_data *fw_data;
  1144. uint32_t len;
  1145. if (!pdev || !data || !pl_dev) {
  1146. qdf_print("%s: Invalid handle", __func__);
  1147. return A_ERROR;
  1148. }
  1149. fw_data = (struct ol_fw_data *)data;
  1150. len = fw_data->len;
  1151. if (len < (sizeof(uint32_t) *
  1152. (ATH_PKTLOG_HDR_FLAGS_OFFSET + 1)) ||
  1153. len < (sizeof(uint32_t) *
  1154. (ATH_PKTLOG_HDR_MISSED_CNT_OFFSET + 1)) ||
  1155. len < (sizeof(uint32_t) *
  1156. (ATH_PKTLOG_HDR_LOG_TYPE_OFFSET + 1)) ||
  1157. len < (sizeof(uint32_t) *
  1158. (ATH_PKTLOG_HDR_SIZE_OFFSET + 1)) ||
  1159. len < (sizeof(uint32_t) *
  1160. (ATH_PKTLOG_HDR_TYPE_SPECIFIC_DATA_OFFSET + 1))) {
  1161. qdf_print("Invalid msdu len in %s\n", __func__);
  1162. qdf_assert(0);
  1163. return A_ERROR;
  1164. }
  1165. pl_tgt_hdr = (uint32_t *)fw_data->data;
  1166. /*
  1167. * Makes the short words (16 bits) portable b/w little endian
  1168. * and big endian
  1169. */
  1170. qdf_mem_set(&pl_hdr, sizeof(pl_hdr), 0);
  1171. pl_hdr.flags = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_FLAGS_OFFSET) &
  1172. ATH_PKTLOG_HDR_FLAGS_MASK) >>
  1173. ATH_PKTLOG_HDR_FLAGS_SHIFT;
  1174. pl_hdr.missed_cnt = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MISSED_CNT_OFFSET) &
  1175. ATH_PKTLOG_HDR_MISSED_CNT_MASK) >>
  1176. ATH_PKTLOG_HDR_MISSED_CNT_SHIFT;
  1177. pl_hdr.log_type = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_LOG_TYPE_OFFSET) &
  1178. ATH_PKTLOG_HDR_LOG_TYPE_MASK) >>
  1179. ATH_PKTLOG_HDR_LOG_TYPE_SHIFT;
  1180. pl_hdr.size = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_SIZE_OFFSET) &
  1181. ATH_PKTLOG_HDR_SIZE_MASK) >> ATH_PKTLOG_HDR_SIZE_SHIFT;
  1182. pl_hdr.timestamp = *(pl_tgt_hdr + ATH_PKTLOG_HDR_TIMESTAMP_OFFSET);
  1183. log_size = pl_hdr.size;
  1184. pl_info = pl_dev->pl_info;
  1185. /*
  1186. * Will be uncommented when the rate control update
  1187. * for pktlog is implemented in the firmware.
  1188. * Currently derived from the TX PPDU status
  1189. */
  1190. rcu_log.txRateCtrl = (void *)pktlog_getbuf(pl_dev, pl_info,
  1191. log_size, &pl_hdr);
  1192. if (sizeof(struct ath_pktlog_hdr) + pl_hdr.size > len) {
  1193. qdf_assert(0);
  1194. return A_ERROR;
  1195. }
  1196. qdf_mem_copy(rcu_log.txRateCtrl,
  1197. ((char *)fw_data->data +
  1198. sizeof(struct ath_pktlog_hdr)),
  1199. pl_hdr.size);
  1200. cds_pkt_stats_to_logger_thread(&pl_hdr, NULL, rcu_log.txRateCtrl);
  1201. return A_OK;
  1202. }
  1203. #endif
  1204. #ifdef QCA_WIFI_QCA6290
  1205. int process_rx_desc_remote(void *pdev, void *data)
  1206. {
  1207. struct pktlog_dev_t *pl_dev = get_pktlog_handle();
  1208. struct ath_pktlog_hdr pl_hdr;
  1209. struct ath_pktlog_rx_info rxstat_log;
  1210. size_t log_size;
  1211. struct ath_pktlog_info *pl_info;
  1212. qdf_nbuf_t log_nbuf = (qdf_nbuf_t)data;
  1213. pl_info = pl_dev->pl_info;
  1214. qdf_mem_set(&pl_hdr, sizeof(pl_hdr), 0);
  1215. pl_hdr.flags = (1 << PKTLOG_FLG_FRM_TYPE_REMOTE_S);
  1216. pl_hdr.missed_cnt = 0;
  1217. pl_hdr.log_type = 22; /*PKTLOG_TYPE_RX_STATBUF*/
  1218. pl_hdr.size = qdf_nbuf_len(log_nbuf);
  1219. pl_hdr.timestamp = 0;
  1220. log_size = pl_hdr.size;
  1221. rxstat_log.rx_desc = (void *)pktlog_getbuf(pl_dev, pl_info,
  1222. log_size, &pl_hdr);
  1223. if (rxstat_log.rx_desc == NULL) {
  1224. QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_DEBUG,
  1225. "%s: Rx descriptor is NULL", __func__);
  1226. return -EFAULT;
  1227. }
  1228. qdf_mem_copy(rxstat_log.rx_desc, qdf_nbuf_data(log_nbuf), pl_hdr.size);
  1229. cds_pkt_stats_to_logger_thread(&pl_hdr, NULL,
  1230. rxstat_log.rx_desc);
  1231. return 0;
  1232. }
  1233. int
  1234. process_pktlog_lite(void *context, void *log_data, uint16_t log_type)
  1235. {
  1236. struct pktlog_dev_t *pl_dev = get_pktlog_handle();
  1237. struct ath_pktlog_info *pl_info;
  1238. struct ath_pktlog_hdr pl_hdr;
  1239. struct ath_pktlog_rx_info rxstat_log;
  1240. size_t log_size;
  1241. qdf_nbuf_t log_nbuf = (qdf_nbuf_t)log_data;
  1242. pl_info = pl_dev->pl_info;
  1243. qdf_mem_set(&pl_hdr, sizeof(pl_hdr), 0);
  1244. pl_hdr.flags = (1 << PKTLOG_FLG_FRM_TYPE_REMOTE_S);
  1245. pl_hdr.missed_cnt = 0;
  1246. pl_hdr.log_type = log_type;
  1247. pl_hdr.size = qdf_nbuf_len(log_nbuf);
  1248. pl_hdr.timestamp = 0;
  1249. log_size = pl_hdr.size;
  1250. rxstat_log.rx_desc = (void *)pktlog_getbuf(pl_dev, pl_info,
  1251. log_size, &pl_hdr);
  1252. if (rxstat_log.rx_desc == NULL) {
  1253. QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_DEBUG,
  1254. "%s: Rx descriptor is NULL", __func__);
  1255. return -EFAULT;
  1256. }
  1257. qdf_mem_copy(rxstat_log.rx_desc, qdf_nbuf_data(log_nbuf), pl_hdr.size);
  1258. cds_pkt_stats_to_logger_thread(&pl_hdr, NULL, rxstat_log.rx_desc);
  1259. return 0;
  1260. }
  1261. #else
  1262. int process_rx_desc_remote(void *pdev, void *data)
  1263. {
  1264. return 0;
  1265. }
  1266. int
  1267. process_pktlog_lite(void *context, void *log_data, uint16_t log_type)
  1268. {
  1269. return 0;
  1270. }
  1271. #endif
  1272. #endif /*REMOVE_PKT_LOG */