blob: 4ee3a902ed70eea0d00b9d46b3d3b8ce0fdf0de9 [file] [log] [blame]
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001/*
Anurag Chouhan6d760662016-02-20 16:05:43 +05302 * Copyright (c) 2013-2016 The Linux Foundation. All rights reserved.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003 *
4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5 *
6 *
7 * Permission to use, copy, modify, and/or distribute this software for
8 * any purpose with or without fee is hereby granted, provided that the
9 * above copyright notice and this permission notice appear in all
10 * copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 * PERFORMANCE OF THIS SOFTWARE.
20 */
21
22/*
23 * This file was originally distributed by Qualcomm Atheros, Inc.
24 * under proprietary terms before Copyright ownership was assigned
25 * to the Linux Foundation.
26 */
27
28/*
29 *
30 * Permission to use, copy, modify, and/or distribute this software for any
31 * purpose with or without fee is hereby granted, provided that the above
32 * copyright notice and this permission notice appear in all copies.
33 *
34 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
35 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
36 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
37 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
38 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
39 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
40 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
41 */
42
43#ifndef REMOVE_PKT_LOG
44#include "ol_txrx_types.h"
45#include "ol_htt_tx_api.h"
46#include "ol_tx_desc.h"
Anurag Chouhan600c3a02016-03-01 10:33:54 +053047#include "qdf_mem.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080048#include "htt.h"
49#include "htt_internal.h"
50#include "pktlog_ac_i.h"
51#include "wma_api.h"
52#include "wlan_logging_sock_svc.h"
53
54#define TX_DESC_ID_LOW_MASK 0xffff
55#define TX_DESC_ID_LOW_SHIFT 0
56#define TX_DESC_ID_HIGH_MASK 0xffff0000
57#define TX_DESC_ID_HIGH_SHIFT 16
58
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080059void pktlog_getbuf_intsafe(struct ath_pktlog_arg *plarg)
60{
61 struct ath_pktlog_buf *log_buf;
62 int32_t buf_size;
63 struct ath_pktlog_hdr *log_hdr;
64 int32_t cur_wr_offset;
65 char *log_ptr;
66 struct ath_pktlog_info *pl_info;
67 uint16_t log_type;
68 size_t log_size;
69 uint32_t flags;
Nirav Shahc657ef52016-07-26 14:22:38 +053070#ifdef HELIUMPLUS
71 uint8_t mac_id;
72#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080073
74 if (!plarg) {
75 printk("Invalid parg in %s\n", __func__);
76 return;
77 }
78
79 pl_info = plarg->pl_info;
Nirav Shahc657ef52016-07-26 14:22:38 +053080#ifdef HELIUMPLUS
81 mac_id = plarg->macId;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080082 log_type = plarg->log_type;
Nirav Shahc657ef52016-07-26 14:22:38 +053083#else
84 log_type = plarg->log_type;
85#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080086 log_size = plarg->log_size;
87 log_buf = pl_info->buf;
88 flags = plarg->flags;
89
90 if (!log_buf) {
91 printk("Invalid log_buf in %s\n", __func__);
92 return;
93 }
94 buf_size = pl_info->buf_size;
95 cur_wr_offset = log_buf->wr_offset;
96 /* Move read offset to the next entry if there is a buffer overlap */
97 if (log_buf->rd_offset >= 0) {
98 if ((cur_wr_offset <= log_buf->rd_offset)
99 && (cur_wr_offset + sizeof(struct ath_pktlog_hdr)) >
100 log_buf->rd_offset) {
101 PKTLOG_MOV_RD_IDX(log_buf->rd_offset, log_buf,
102 buf_size);
103 }
104 } else {
105 log_buf->rd_offset = cur_wr_offset;
106 }
107
108 log_hdr = (struct ath_pktlog_hdr *)(log_buf->log_data + cur_wr_offset);
Nirav Shahc657ef52016-07-26 14:22:38 +0530109
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800110 log_hdr->flags = flags;
Nirav Shahc657ef52016-07-26 14:22:38 +0530111#ifdef HELIUMPLUS
112 log_hdr->macId = mac_id;
113 log_hdr->log_type = log_type;
114#else
115 log_hdr->log_type = log_type;
116#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800117 log_hdr->size = (uint16_t) log_size;
118 log_hdr->missed_cnt = plarg->missed_cnt;
119 log_hdr->timestamp = plarg->timestamp;
120#ifdef HELIUMPLUS
121 log_hdr->type_specific_data = plarg->type_specific_data;
122#endif
123 cur_wr_offset += sizeof(*log_hdr);
124
125 if ((buf_size - cur_wr_offset) < log_size) {
126 while ((cur_wr_offset <= log_buf->rd_offset)
127 && (log_buf->rd_offset < buf_size)) {
128 PKTLOG_MOV_RD_IDX(log_buf->rd_offset, log_buf,
129 buf_size);
130 }
131 cur_wr_offset = 0;
132 }
133
134 while ((cur_wr_offset <= log_buf->rd_offset)
135 && (cur_wr_offset + log_size) > log_buf->rd_offset) {
136 PKTLOG_MOV_RD_IDX(log_buf->rd_offset, log_buf, buf_size);
137 }
138
139 log_ptr = &(log_buf->log_data[cur_wr_offset]);
140 cur_wr_offset += log_hdr->size;
141
142 log_buf->wr_offset = ((buf_size - cur_wr_offset) >=
143 sizeof(struct ath_pktlog_hdr)) ? cur_wr_offset :
144 0;
145
146 plarg->buf = log_ptr;
147}
148
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800149char *pktlog_getbuf(struct ol_pktlog_dev_t *pl_dev,
150 struct ath_pktlog_info *pl_info,
151 size_t log_size, struct ath_pktlog_hdr *pl_hdr)
152{
153 struct ath_pktlog_arg plarg = { 0, };
154 uint8_t flags = 0;
155
156 plarg.pl_info = pl_info;
Nirav Shahc657ef52016-07-26 14:22:38 +0530157#ifdef HELIUMPLUS
158 plarg.macId = pl_hdr->macId;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800159 plarg.log_type = pl_hdr->log_type;
Nirav Shahc657ef52016-07-26 14:22:38 +0530160#else
161 plarg.log_type = pl_hdr->log_type;
162#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800163 plarg.log_size = log_size;
164 plarg.flags = pl_hdr->flags;
165 plarg.missed_cnt = pl_hdr->missed_cnt;
166 plarg.timestamp = pl_hdr->timestamp;
167#ifdef HELIUMPLUS
168 plarg.type_specific_data = pl_hdr->type_specific_data;
169#endif
170 if (flags & PHFLAGS_INTERRUPT_CONTEXT) {
171 /*
172 * We are already in interupt context, no need to make it
173 * intsafe. call the function directly.
174 */
175 pktlog_getbuf_intsafe(&plarg);
176 } else {
177 PKTLOG_LOCK(pl_info);
178 pktlog_getbuf_intsafe(&plarg);
179 PKTLOG_UNLOCK(pl_info);
180 }
181
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800182 return plarg.buf;
183}
184
185static struct txctl_frm_hdr frm_hdr;
186
Poddar, Siddarth53858122016-09-06 19:00:09 +0530187#ifndef HELIUMPLUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800188static void process_ieee_hdr(void *data)
189{
190 uint8_t dir;
191 struct ieee80211_frame *wh = (struct ieee80211_frame *)(data);
192
193 frm_hdr.framectrl = *(uint16_t *) (wh->i_fc);
194 frm_hdr.seqctrl = *(uint16_t *) (wh->i_seq);
195 dir = (wh->i_fc[1] & IEEE80211_FC1_DIR_MASK);
196
197 if (dir == IEEE80211_FC1_DIR_TODS) {
198 frm_hdr.bssid_tail =
199 (wh->i_addr1[IEEE80211_ADDR_LEN - 2] << 8) | (wh->
200 i_addr1
201 [IEEE80211_ADDR_LEN
202 - 1]);
203 frm_hdr.sa_tail =
204 (wh->i_addr2[IEEE80211_ADDR_LEN - 2] << 8) | (wh->
205 i_addr2
206 [IEEE80211_ADDR_LEN
207 - 1]);
208 frm_hdr.da_tail =
209 (wh->i_addr3[IEEE80211_ADDR_LEN - 2] << 8) | (wh->
210 i_addr3
211 [IEEE80211_ADDR_LEN
212 - 1]);
213 } else if (dir == IEEE80211_FC1_DIR_FROMDS) {
214 frm_hdr.bssid_tail =
215 (wh->i_addr2[IEEE80211_ADDR_LEN - 2] << 8) | (wh->
216 i_addr2
217 [IEEE80211_ADDR_LEN
218 - 1]);
219 frm_hdr.sa_tail =
220 (wh->i_addr3[IEEE80211_ADDR_LEN - 2] << 8) | (wh->
221 i_addr3
222 [IEEE80211_ADDR_LEN
223 - 1]);
224 frm_hdr.da_tail =
225 (wh->i_addr1[IEEE80211_ADDR_LEN - 2] << 8) | (wh->
226 i_addr1
227 [IEEE80211_ADDR_LEN
228 - 1]);
229 } else {
230 frm_hdr.bssid_tail =
231 (wh->i_addr3[IEEE80211_ADDR_LEN - 2] << 8) | (wh->
232 i_addr3
233 [IEEE80211_ADDR_LEN
234 - 1]);
235 frm_hdr.sa_tail =
236 (wh->i_addr2[IEEE80211_ADDR_LEN - 2] << 8) | (wh->
237 i_addr2
238 [IEEE80211_ADDR_LEN
239 - 1]);
240 frm_hdr.da_tail =
241 (wh->i_addr1[IEEE80211_ADDR_LEN - 2] << 8) | (wh->
242 i_addr1
243 [IEEE80211_ADDR_LEN
244 - 1]);
245 }
246}
247
Nirav Shah7f337db2016-05-25 10:49:02 +0530248/**
249 * fill_ieee80211_hdr_data() - fill ieee802.11 data header
250 * @txrx_pdev: txrx pdev
251 * @pl_msdu_info: msdu info
252 * @data: data received from event
253 *
254 * Return: none
255 */
Jeff Johnson3320c7f2016-11-22 16:00:45 -0800256static void
Nirav Shah7f337db2016-05-25 10:49:02 +0530257fill_ieee80211_hdr_data(struct ol_txrx_pdev_t *txrx_pdev,
258 struct ath_pktlog_msdu_info *pl_msdu_info, void *data)
259{
260 uint32_t i;
261 uint32_t *htt_tx_desc;
262 struct ol_tx_desc_t *tx_desc;
263 uint8_t msdu_id_offset = MSDU_ID_INFO_ID_OFFSET;
264 uint16_t tx_desc_id;
265 uint32_t *msdu_id_info = (uint32_t *)
266 ((void *)data + sizeof(struct ath_pktlog_hdr));
267 uint32_t *msdu_id = (uint32_t *) ((char *)msdu_id_info +
268 msdu_id_offset);
269 uint8_t *addr, *vap_addr;
270 uint8_t vdev_id;
271 qdf_nbuf_t netbuf;
272 uint32_t len;
273
274
275 pl_msdu_info->num_msdu = *msdu_id_info;
276 pl_msdu_info->priv_size = sizeof(uint32_t) *
277 pl_msdu_info->num_msdu + sizeof(uint32_t);
278
279 for (i = 0; i < pl_msdu_info->num_msdu; i++) {
280 /*
281 * Handle big endianness
282 * Increment msdu_id once after retrieving
283 * lower 16 bits and uppper 16 bits
284 */
285 if (!(i % 2)) {
286 tx_desc_id = ((*msdu_id & TX_DESC_ID_LOW_MASK)
287 >> TX_DESC_ID_LOW_SHIFT);
288 } else {
289 tx_desc_id = ((*msdu_id & TX_DESC_ID_HIGH_MASK)
290 >> TX_DESC_ID_HIGH_SHIFT);
291 msdu_id += 1;
292 }
293 tx_desc = ol_tx_desc_find(txrx_pdev, tx_desc_id);
294 qdf_assert(tx_desc);
295 netbuf = tx_desc->netbuf;
296 htt_tx_desc = (uint32_t *) tx_desc->htt_tx_desc;
297 qdf_assert(htt_tx_desc);
298
299 qdf_nbuf_peek_header(netbuf, &addr, &len);
300
301 if (len < (2 * IEEE80211_ADDR_LEN)) {
302 qdf_print("TX frame does not have a valid address\n");
303 return;
304 }
305 /* Adding header information for the TX data frames */
306 vdev_id = (uint8_t) (*(htt_tx_desc +
307 HTT_TX_VDEV_ID_WORD) >>
308 HTT_TX_VDEV_ID_SHIFT) &
309 HTT_TX_VDEV_ID_MASK;
310
311 vap_addr = wma_get_vdev_address_by_vdev_id(vdev_id);
312
313 frm_hdr.da_tail = (addr[IEEE80211_ADDR_LEN - 2] << 8) |
314 (addr[IEEE80211_ADDR_LEN - 1]);
315 frm_hdr.sa_tail =
316 (addr[2 * IEEE80211_ADDR_LEN - 2] << 8) |
317 (addr[2 * IEEE80211_ADDR_LEN - 1]);
318 if (vap_addr) {
319 frm_hdr.bssid_tail =
320 (vap_addr[IEEE80211_ADDR_LEN - 2] << 8) |
321 (vap_addr[IEEE80211_ADDR_LEN - 1]);
322 } else {
323 frm_hdr.bssid_tail = 0x0000;
324 }
325 pl_msdu_info->priv.msdu_len[i] = *(htt_tx_desc +
326 HTT_TX_MSDU_LEN_DWORD)
327 & HTT_TX_MSDU_LEN_MASK;
328 /*
329 * Add more information per MSDU
330 * e.g., protocol information
331 */
332 }
333
334}
Poddar, Siddarth53858122016-09-06 19:00:09 +0530335#endif
Nirav Shah7f337db2016-05-25 10:49:02 +0530336
Poddar, Siddarth53858122016-09-06 19:00:09 +0530337#ifdef HELIUMPLUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800338A_STATUS process_tx_info(struct ol_txrx_pdev_t *txrx_pdev, void *data)
339{
340 /*
341 * Must include to process different types
342 * TX_CTL, TX_STATUS, TX_MSDU_ID, TX_FRM_HDR
343 */
344 struct ol_pktlog_dev_t *pl_dev;
345 struct ath_pktlog_hdr pl_hdr;
346 struct ath_pktlog_info *pl_info;
347 uint32_t *pl_tgt_hdr;
348
349 if (!txrx_pdev) {
350 printk("Invalid pdev in %s\n", __func__);
351 return A_ERROR;
352 }
Anurag Chouhanc5548422016-02-24 18:33:27 +0530353 qdf_assert(txrx_pdev->pl_dev);
354 qdf_assert(data);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800355 pl_dev = txrx_pdev->pl_dev;
356
357 pl_tgt_hdr = (uint32_t *) data;
358 /*
359 * Makes the short words (16 bits) portable b/w little endian
360 * and big endian
361 */
362 pl_hdr.flags = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_FLAGS_OFFSET) &
363 ATH_PKTLOG_HDR_FLAGS_MASK) >>
364 ATH_PKTLOG_HDR_FLAGS_SHIFT;
Himanshu Agarwal6e224f62016-12-05 18:27:35 +0530365 pl_hdr.flags |= PKTLOG_HDR_SIZE_16;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800366 pl_hdr.missed_cnt = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MISSED_CNT_OFFSET) &
367 ATH_PKTLOG_HDR_MISSED_CNT_MASK) >>
368 ATH_PKTLOG_HDR_MISSED_CNT_SHIFT;
Nirav Shahc657ef52016-07-26 14:22:38 +0530369 pl_hdr.log_type = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_LOG_TYPE_OFFSET) &
370 ATH_PKTLOG_HDR_LOG_TYPE_MASK) >>
371 ATH_PKTLOG_HDR_LOG_TYPE_SHIFT;
372 pl_hdr.macId = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MAC_ID_OFFSET) &
373 ATH_PKTLOG_HDR_MAC_ID_MASK) >>
374 ATH_PKTLOG_HDR_MAC_ID_SHIFT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800375 pl_hdr.size = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_SIZE_OFFSET) &
376 ATH_PKTLOG_HDR_SIZE_MASK) >> ATH_PKTLOG_HDR_SIZE_SHIFT;
377 pl_hdr.timestamp = *(pl_tgt_hdr + ATH_PKTLOG_HDR_TIMESTAMP_OFFSET);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800378 pl_hdr.type_specific_data =
379 *(pl_tgt_hdr + ATH_PKTLOG_HDR_TYPE_SPECIFIC_DATA_OFFSET);
Poddar, Siddarth53858122016-09-06 19:00:09 +0530380 pl_info = pl_dev->pl_info;
381
382 if (pl_hdr.log_type == PKTLOG_TYPE_TX_CTRL) {
383 size_t log_size = sizeof(frm_hdr) + pl_hdr.size;
384 void *txdesc_hdr_ctl = (void *)
385 pktlog_getbuf(pl_dev, pl_info, log_size, &pl_hdr);
386 qdf_assert(txdesc_hdr_ctl);
387 qdf_assert(pl_hdr.size < (370 * sizeof(u_int32_t)));
388
389 qdf_mem_copy(txdesc_hdr_ctl, &frm_hdr, sizeof(frm_hdr));
390 qdf_mem_copy((char *)txdesc_hdr_ctl + sizeof(frm_hdr),
391 ((void *)data +
392 sizeof(struct ath_pktlog_hdr)),
393 pl_hdr.size);
Himanshu Agarwal46956a52016-07-26 19:46:25 +0530394 pl_hdr.size = log_size;
395 cds_pkt_stats_to_logger_thread(&pl_hdr, NULL,
396 txdesc_hdr_ctl);
Poddar, Siddarth53858122016-09-06 19:00:09 +0530397 }
398
399 if (pl_hdr.log_type == PKTLOG_TYPE_TX_STAT) {
400 struct ath_pktlog_tx_status txstat_log;
401 size_t log_size = pl_hdr.size;
402
403 txstat_log.ds_status = (void *)
404 pktlog_getbuf(pl_dev, pl_info,
405 log_size, &pl_hdr);
406 qdf_assert(txstat_log.ds_status);
407 qdf_mem_copy(txstat_log.ds_status,
408 ((void *)data + sizeof(struct ath_pktlog_hdr)),
409 pl_hdr.size);
Himanshu Agarwal46956a52016-07-26 19:46:25 +0530410 cds_pkt_stats_to_logger_thread(&pl_hdr, NULL,
411 txstat_log.ds_status);
Poddar, Siddarth53858122016-09-06 19:00:09 +0530412 }
413 return A_OK;
414}
415
416#else
417A_STATUS process_tx_info(struct ol_txrx_pdev_t *txrx_pdev, void *data)
418{
419 /*
420 * Must include to process different types
421 * TX_CTL, TX_STATUS, TX_MSDU_ID, TX_FRM_HDR
422 */
423 struct ol_pktlog_dev_t *pl_dev;
424 struct ath_pktlog_hdr pl_hdr;
425 struct ath_pktlog_info *pl_info;
426 uint32_t *pl_tgt_hdr;
427
428 if (!txrx_pdev) {
429 qdf_print("Invalid pdev in %s\n", __func__);
430 return A_ERROR;
431 }
432 qdf_assert(txrx_pdev->pl_dev);
433 qdf_assert(data);
434 pl_dev = txrx_pdev->pl_dev;
435
436 pl_tgt_hdr = (uint32_t *) data;
437 /*
438 * Makes the short words (16 bits) portable b/w little endian
439 * and big endian
440 */
441 pl_hdr.flags = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_FLAGS_OFFSET) &
442 ATH_PKTLOG_HDR_FLAGS_MASK) >>
443 ATH_PKTLOG_HDR_FLAGS_SHIFT;
444 pl_hdr.missed_cnt = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MISSED_CNT_OFFSET) &
445 ATH_PKTLOG_HDR_MISSED_CNT_MASK) >>
446 ATH_PKTLOG_HDR_MISSED_CNT_SHIFT;
447 pl_hdr.log_type = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_LOG_TYPE_OFFSET) &
448 ATH_PKTLOG_HDR_LOG_TYPE_MASK) >>
449 ATH_PKTLOG_HDR_LOG_TYPE_SHIFT;
450 pl_hdr.size = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_SIZE_OFFSET) &
451 ATH_PKTLOG_HDR_SIZE_MASK) >> ATH_PKTLOG_HDR_SIZE_SHIFT;
452 pl_hdr.timestamp = *(pl_tgt_hdr + ATH_PKTLOG_HDR_TIMESTAMP_OFFSET);
453
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800454 pl_info = pl_dev->pl_info;
455
456 if (pl_hdr.log_type == PKTLOG_TYPE_TX_FRM_HDR) {
457 /* Valid only for the TX CTL */
458 process_ieee_hdr(data + sizeof(pl_hdr));
459 }
460
461 if (pl_hdr.log_type == PKTLOG_TYPE_TX_VIRT_ADDR) {
462 A_UINT32 desc_id = (A_UINT32)
463 *((A_UINT32 *) (data + sizeof(pl_hdr)));
464 A_UINT32 vdev_id = desc_id;
465
466 /* if the pkt log msg is for the bcn frame the vdev id
467 * is piggybacked in desc_id and the MSB of the desc ID
468 * would be set to FF
469 */
470#define BCN_DESC_ID 0xFF
471 if ((desc_id >> 24) == BCN_DESC_ID) {
472 void *data;
473 A_UINT32 buf_size;
474
475 vdev_id &= 0x00FFFFFF;
476 data = wma_get_beacon_buffer_by_vdev_id(vdev_id,
477 &buf_size);
478 if (data) {
479 process_ieee_hdr(data);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530480 qdf_mem_free(data);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800481 }
482 } else {
483 /*
484 * TODO: get the hdr content for mgmt frames from
485 * Tx mgmt desc pool
486 */
487 }
488 }
489
490 if (pl_hdr.log_type == PKTLOG_TYPE_TX_CTRL) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800491 struct ath_pktlog_txctl txctl_log;
492 size_t log_size = sizeof(txctl_log.priv);
493
494 txctl_log.txdesc_hdr_ctl = (void *)pktlog_getbuf(pl_dev,
495 pl_info,
496 log_size,
497 &pl_hdr);
498
499 if (!txctl_log.txdesc_hdr_ctl) {
500 printk
501 ("failed to get buf for txctl_log.txdesc_hdr_ctl\n");
502 return A_ERROR;
503 }
504
505 /*
506 * frm hdr is currently Valid only for local frames
507 * Add capability to include the fmr hdr for remote frames
508 */
509 txctl_log.priv.frm_hdr = frm_hdr;
Anurag Chouhanc5548422016-02-24 18:33:27 +0530510 qdf_assert(txctl_log.priv.txdesc_ctl);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530511 qdf_mem_copy((void *)&txctl_log.priv.txdesc_ctl,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800512 ((void *)data + sizeof(struct ath_pktlog_hdr)),
513 pl_hdr.size);
Anurag Chouhanc5548422016-02-24 18:33:27 +0530514 qdf_assert(txctl_log.txdesc_hdr_ctl);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530515 qdf_mem_copy(txctl_log.txdesc_hdr_ctl, &txctl_log.priv,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800516 sizeof(txctl_log.priv));
Himanshu Agarwal46956a52016-07-26 19:46:25 +0530517 pl_hdr.size = log_size;
518 cds_pkt_stats_to_logger_thread(&pl_hdr, NULL,
519 txctl_log.txdesc_hdr_ctl);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800520 /* Add Protocol information and HT specific information */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800521 }
522
523 if (pl_hdr.log_type == PKTLOG_TYPE_TX_STAT) {
524 struct ath_pktlog_tx_status txstat_log;
525 size_t log_size = pl_hdr.size;
526
527 txstat_log.ds_status = (void *)
528 pktlog_getbuf(pl_dev, pl_info, log_size, &pl_hdr);
Anurag Chouhanc5548422016-02-24 18:33:27 +0530529 qdf_assert(txstat_log.ds_status);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530530 qdf_mem_copy(txstat_log.ds_status,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800531 ((void *)data + sizeof(struct ath_pktlog_hdr)),
532 pl_hdr.size);
Himanshu Agarwal46956a52016-07-26 19:46:25 +0530533 cds_pkt_stats_to_logger_thread(&pl_hdr, NULL,
534 txstat_log.ds_status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800535 }
536
537 if (pl_hdr.log_type == PKTLOG_TYPE_TX_MSDU_ID) {
538 struct ath_pktlog_msdu_info pl_msdu_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800539 size_t log_size;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800540
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530541 qdf_mem_set(&pl_msdu_info, sizeof(pl_msdu_info), 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800542 log_size = sizeof(pl_msdu_info.priv);
543
Nirav Shah7f337db2016-05-25 10:49:02 +0530544 if (pl_dev->mt_pktlog_enabled == false)
545 fill_ieee80211_hdr_data(txrx_pdev, &pl_msdu_info, data);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800546
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800547 pl_msdu_info.ath_msdu_info = pktlog_getbuf(pl_dev, pl_info,
548 log_size, &pl_hdr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530549 qdf_mem_copy((void *)&pl_msdu_info.priv.msdu_id_info,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800550 ((void *)data + sizeof(struct ath_pktlog_hdr)),
551 sizeof(pl_msdu_info.priv.msdu_id_info));
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530552 qdf_mem_copy(pl_msdu_info.ath_msdu_info, &pl_msdu_info.priv,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800553 sizeof(pl_msdu_info.priv));
Himanshu Agarwal46956a52016-07-26 19:46:25 +0530554 cds_pkt_stats_to_logger_thread(&pl_hdr, NULL,
555 pl_msdu_info.ath_msdu_info);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800556 }
557 return A_OK;
558}
Poddar, Siddarth53858122016-09-06 19:00:09 +0530559#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800560
Nirav Shahc657ef52016-07-26 14:22:38 +0530561A_STATUS process_rx_info_remote(void *pdev, void *data)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800562{
563 struct ol_pktlog_dev_t *pl_dev;
564 struct ath_pktlog_info *pl_info;
565 struct htt_host_rx_desc_base *rx_desc;
566 struct ath_pktlog_hdr pl_hdr;
567 struct ath_pktlog_rx_info rxstat_log;
568 size_t log_size;
Nirav Shahc657ef52016-07-26 14:22:38 +0530569 struct ol_rx_remote_data *r_data = (struct ol_rx_remote_data *)data;
Nirav Shahcbc6d722016-03-01 16:24:53 +0530570 qdf_nbuf_t msdu;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800571
572 if (!pdev) {
573 printk("Invalid pdev in %s\n", __func__);
574 return A_ERROR;
575 }
Nirav Shahc657ef52016-07-26 14:22:38 +0530576 if (!r_data) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800577 printk("Invalid data in %s\n", __func__);
578 return A_ERROR;
579 }
580 pl_dev = ((struct ol_txrx_pdev_t *)pdev)->pl_dev;
581 pl_info = pl_dev->pl_info;
Nirav Shahc657ef52016-07-26 14:22:38 +0530582 msdu = r_data->msdu;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800583
584 while (msdu) {
585 rx_desc =
Nirav Shahcbc6d722016-03-01 16:24:53 +0530586 (struct htt_host_rx_desc_base *)(qdf_nbuf_data(msdu)) - 1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800587 log_size =
588 sizeof(*rx_desc) - sizeof(struct htt_host_fw_desc_base);
589
590 /*
591 * Construct the pktlog header pl_hdr
592 * Because desc is DMA'd to the host memory
593 */
594 pl_hdr.flags = (1 << PKTLOG_FLG_FRM_TYPE_REMOTE_S);
595 pl_hdr.missed_cnt = 0;
Nirav Shahc657ef52016-07-26 14:22:38 +0530596#if defined(HELIUMPLUS)
597 pl_hdr.macId = r_data->mac_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800598 pl_hdr.log_type = PKTLOG_TYPE_RX_STAT;
Himanshu Agarwal6e224f62016-12-05 18:27:35 +0530599 pl_hdr.flags |= PKTLOG_HDR_SIZE_16;
Nirav Shahc657ef52016-07-26 14:22:38 +0530600#else
601 pl_hdr.log_type = PKTLOG_TYPE_RX_STAT;
602#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800603 pl_hdr.size = sizeof(*rx_desc) -
604 sizeof(struct htt_host_fw_desc_base);
605#if defined(HELIUMPLUS)
606 pl_hdr.timestamp =
607 rx_desc->ppdu_end.rx_pkt_end.phy_timestamp_1_lower_32;
608 pl_hdr.type_specific_data = 0xDEADAA;
609#else
610 pl_hdr.timestamp = rx_desc->ppdu_end.tsf_timestamp;
611#endif /* !defined(HELIUMPLUS) */
612 rxstat_log.rx_desc = (void *)pktlog_getbuf(pl_dev, pl_info,
613 log_size, &pl_hdr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530614 qdf_mem_copy(rxstat_log.rx_desc, (void *)rx_desc +
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800615 sizeof(struct htt_host_fw_desc_base), pl_hdr.size);
Himanshu Agarwal46956a52016-07-26 19:46:25 +0530616 cds_pkt_stats_to_logger_thread(&pl_hdr, NULL,
617 rxstat_log.rx_desc);
Nirav Shahcbc6d722016-03-01 16:24:53 +0530618 msdu = qdf_nbuf_next(msdu);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800619 }
620 return A_OK;
621}
622
623A_STATUS process_rx_info(void *pdev, void *data)
624{
625 struct ol_pktlog_dev_t *pl_dev;
626 struct ath_pktlog_info *pl_info;
627 struct ath_pktlog_rx_info rxstat_log;
628 struct ath_pktlog_hdr pl_hdr;
629 size_t log_size;
630 uint32_t *pl_tgt_hdr;
631
632 if (!pdev) {
633 printk("Invalid pdev in %s", __func__);
634 return A_ERROR;
635 }
636 pl_dev = ((struct ol_txrx_pdev_t *)pdev)->pl_dev;
637 pl_info = pl_dev->pl_info;
638 pl_tgt_hdr = (uint32_t *) data;
639 pl_hdr.flags = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_FLAGS_OFFSET) &
640 ATH_PKTLOG_HDR_FLAGS_MASK) >>
641 ATH_PKTLOG_HDR_FLAGS_SHIFT;
642 pl_hdr.missed_cnt = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MISSED_CNT_OFFSET) &
643 ATH_PKTLOG_HDR_MISSED_CNT_MASK) >>
644 ATH_PKTLOG_HDR_MISSED_CNT_SHIFT;
Nirav Shahc657ef52016-07-26 14:22:38 +0530645#ifdef HELIUMPLUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800646 pl_hdr.log_type = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_LOG_TYPE_OFFSET) &
647 ATH_PKTLOG_HDR_LOG_TYPE_MASK) >>
648 ATH_PKTLOG_HDR_LOG_TYPE_SHIFT;
Nirav Shahc657ef52016-07-26 14:22:38 +0530649 pl_hdr.macId = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MAC_ID_OFFSET) &
650 ATH_PKTLOG_HDR_MAC_ID_MASK) >>
651 ATH_PKTLOG_HDR_MAC_ID_SHIFT;
Himanshu Agarwal6e224f62016-12-05 18:27:35 +0530652 pl_hdr.flags |= PKTLOG_HDR_SIZE_16;
Nirav Shahc657ef52016-07-26 14:22:38 +0530653#else
654 pl_hdr.log_type = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_LOG_TYPE_OFFSET) &
655 ATH_PKTLOG_HDR_LOG_TYPE_MASK) >>
656 ATH_PKTLOG_HDR_LOG_TYPE_SHIFT;
657#endif
658
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800659 pl_hdr.size = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_SIZE_OFFSET) &
660 ATH_PKTLOG_HDR_SIZE_MASK) >> ATH_PKTLOG_HDR_SIZE_SHIFT;
661 pl_hdr.timestamp = *(pl_tgt_hdr + ATH_PKTLOG_HDR_TIMESTAMP_OFFSET);
662 log_size = pl_hdr.size;
663 rxstat_log.rx_desc = (void *)pktlog_getbuf(pl_dev, pl_info,
664 log_size, &pl_hdr);
665
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530666 qdf_mem_copy(rxstat_log.rx_desc,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800667 (void *)data + sizeof(struct ath_pktlog_hdr), pl_hdr.size);
Himanshu Agarwal46956a52016-07-26 19:46:25 +0530668 cds_pkt_stats_to_logger_thread(&pl_hdr, NULL, rxstat_log.rx_desc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800669
670 return A_OK;
671}
672
673A_STATUS process_rate_find(void *pdev, void *data)
674{
675 struct ol_pktlog_dev_t *pl_dev;
676 struct ath_pktlog_hdr pl_hdr;
677 struct ath_pktlog_info *pl_info;
678 size_t log_size;
679
680 /*
681 * Will be uncommented when the rate control find
682 * for pktlog is implemented in the firmware.
683 * Currently derived from the TX PPDU status
684 */
685 struct ath_pktlog_rc_find rcf_log;
686 uint32_t *pl_tgt_hdr;
687
688 if (!pdev) {
Anurag Chouhan6d760662016-02-20 16:05:43 +0530689 qdf_print("Invalid pdev in %s\n", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800690 return A_ERROR;
691 }
692 if (!data) {
Anurag Chouhan6d760662016-02-20 16:05:43 +0530693 qdf_print("Invalid data in %s\n", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800694 return A_ERROR;
695 }
696
697 pl_tgt_hdr = (uint32_t *) data;
698 /*
699 * Makes the short words (16 bits) portable b/w little endian
700 * and big endian
701 */
702 pl_hdr.flags = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_FLAGS_OFFSET) &
703 ATH_PKTLOG_HDR_FLAGS_MASK) >>
704 ATH_PKTLOG_HDR_FLAGS_SHIFT;
705 pl_hdr.missed_cnt = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MISSED_CNT_OFFSET) &
706 ATH_PKTLOG_HDR_MISSED_CNT_MASK) >>
707 ATH_PKTLOG_HDR_MISSED_CNT_SHIFT;
Nirav Shahc657ef52016-07-26 14:22:38 +0530708#ifdef HELIUMPLUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800709 pl_hdr.log_type = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_LOG_TYPE_OFFSET) &
710 ATH_PKTLOG_HDR_LOG_TYPE_MASK) >>
711 ATH_PKTLOG_HDR_LOG_TYPE_SHIFT;
Nirav Shahc657ef52016-07-26 14:22:38 +0530712 pl_hdr.macId = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MAC_ID_OFFSET) &
713 ATH_PKTLOG_HDR_MAC_ID_MASK) >>
714 ATH_PKTLOG_HDR_MAC_ID_SHIFT;
Himanshu Agarwal6e224f62016-12-05 18:27:35 +0530715 pl_hdr.flags |= PKTLOG_HDR_SIZE_16;
Nirav Shahc657ef52016-07-26 14:22:38 +0530716#else
717 pl_hdr.log_type = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_LOG_TYPE_OFFSET) &
718 ATH_PKTLOG_HDR_LOG_TYPE_MASK) >>
719 ATH_PKTLOG_HDR_LOG_TYPE_SHIFT;
720#endif
721
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800722 pl_hdr.size = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_SIZE_OFFSET) &
723 ATH_PKTLOG_HDR_SIZE_MASK) >> ATH_PKTLOG_HDR_SIZE_SHIFT;
724 pl_hdr.timestamp = *(pl_tgt_hdr + ATH_PKTLOG_HDR_TIMESTAMP_OFFSET);
725 pl_dev = ((struct ol_txrx_pdev_t *)pdev)->pl_dev;
726 pl_info = pl_dev->pl_info;
727 log_size = pl_hdr.size;
728 rcf_log.rcFind = (void *)pktlog_getbuf(pl_dev, pl_info,
729 log_size, &pl_hdr);
730
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530731 qdf_mem_copy(rcf_log.rcFind,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800732 ((char *)data + sizeof(struct ath_pktlog_hdr)),
733 pl_hdr.size);
Himanshu Agarwal46956a52016-07-26 19:46:25 +0530734 cds_pkt_stats_to_logger_thread(&pl_hdr, NULL, rcf_log.rcFind);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800735
736 return A_OK;
737}
738
Nirav Shahdcc4c872016-07-28 11:35:26 +0530739A_STATUS process_sw_event(void *pdev, void *data)
740{
741 struct ol_pktlog_dev_t *pl_dev;
742 struct ath_pktlog_hdr pl_hdr;
743 struct ath_pktlog_info *pl_info;
744 size_t log_size;
745
746 /*
747 * Will be uncommented when the rate control find
748 * for pktlog is implemented in the firmware.
749 * Currently derived from the TX PPDU status
750 */
751 struct ath_pktlog_sw_event sw_event;
752 uint32_t *pl_tgt_hdr;
753
754 if (!pdev) {
755 qdf_print("Invalid pdev in %s\n", __func__);
756 return A_ERROR;
757 }
758 if (!data) {
759 qdf_print("Invalid data in %s\n", __func__);
760 return A_ERROR;
761 }
762
763 pl_tgt_hdr = (uint32_t *) data;
764 /*
765 * Makes the short words (16 bits) portable b/w little endian
766 * and big endian
767 */
768 pl_hdr.flags = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_FLAGS_OFFSET) &
769 ATH_PKTLOG_HDR_FLAGS_MASK) >>
770 ATH_PKTLOG_HDR_FLAGS_SHIFT;
771 pl_hdr.missed_cnt = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MISSED_CNT_OFFSET) &
772 ATH_PKTLOG_HDR_MISSED_CNT_MASK) >>
773 ATH_PKTLOG_HDR_MISSED_CNT_SHIFT;
774#ifdef HELIUMPLUS
775 pl_hdr.log_type = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_LOG_TYPE_OFFSET) &
776 ATH_PKTLOG_HDR_LOG_TYPE_MASK) >>
777 ATH_PKTLOG_HDR_LOG_TYPE_SHIFT;
778 pl_hdr.macId = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MAC_ID_OFFSET) &
779 ATH_PKTLOG_HDR_MAC_ID_MASK) >>
780 ATH_PKTLOG_HDR_MAC_ID_SHIFT;
781#else
782 pl_hdr.log_type = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_LOG_TYPE_OFFSET) &
783 ATH_PKTLOG_HDR_LOG_TYPE_MASK) >>
784 ATH_PKTLOG_HDR_LOG_TYPE_SHIFT;
785#endif
786
787 pl_hdr.size = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_SIZE_OFFSET) &
788 ATH_PKTLOG_HDR_SIZE_MASK) >> ATH_PKTLOG_HDR_SIZE_SHIFT;
789 pl_hdr.timestamp = *(pl_tgt_hdr + ATH_PKTLOG_HDR_TIMESTAMP_OFFSET);
Poddar, Siddarth1dbc3162016-09-02 20:48:09 +0530790
791#ifdef HELIUMPLUS
792 pl_hdr.type_specific_data =
793 *(pl_tgt_hdr + ATH_PKTLOG_HDR_TYPE_SPECIFIC_DATA_OFFSET);
794#endif
795
Nirav Shahdcc4c872016-07-28 11:35:26 +0530796 pl_dev = ((struct ol_txrx_pdev_t *)pdev)->pl_dev;
797 pl_info = pl_dev->pl_info;
798 log_size = pl_hdr.size;
799 sw_event.sw_event = (void *)pktlog_getbuf(pl_dev, pl_info,
800 log_size, &pl_hdr);
801
802 qdf_mem_copy(sw_event.sw_event,
803 ((char *)data + sizeof(struct ath_pktlog_hdr)),
804 pl_hdr.size);
805
806 return A_OK;
807}
808
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800809A_STATUS process_rate_update(void *pdev, void *data)
810{
811 struct ol_pktlog_dev_t *pl_dev;
812 struct ath_pktlog_hdr pl_hdr;
813 size_t log_size;
814 struct ath_pktlog_info *pl_info;
815 struct ath_pktlog_rc_update rcu_log;
816 uint32_t *pl_tgt_hdr;
817
818 if (!pdev) {
819 printk("Invalid pdev in %s\n", __func__);
820 return A_ERROR;
821 }
822 if (!data) {
823 printk("Invalid data in %s\n", __func__);
824 return A_ERROR;
825 }
826 pl_tgt_hdr = (uint32_t *) data;
827 /*
828 * Makes the short words (16 bits) portable b/w little endian
829 * and big endian
830 */
831 pl_hdr.flags = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_FLAGS_OFFSET) &
832 ATH_PKTLOG_HDR_FLAGS_MASK) >>
833 ATH_PKTLOG_HDR_FLAGS_SHIFT;
834 pl_hdr.missed_cnt = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MISSED_CNT_OFFSET) &
835 ATH_PKTLOG_HDR_MISSED_CNT_MASK) >>
836 ATH_PKTLOG_HDR_MISSED_CNT_SHIFT;
Nirav Shahc657ef52016-07-26 14:22:38 +0530837#ifdef HELIUMPLUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800838 pl_hdr.log_type = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_LOG_TYPE_OFFSET) &
839 ATH_PKTLOG_HDR_LOG_TYPE_MASK) >>
840 ATH_PKTLOG_HDR_LOG_TYPE_SHIFT;
Nirav Shahc657ef52016-07-26 14:22:38 +0530841 pl_hdr.macId = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MAC_ID_OFFSET) &
842 ATH_PKTLOG_HDR_MAC_ID_MASK) >>
843 ATH_PKTLOG_HDR_MAC_ID_SHIFT;
Himanshu Agarwal6e224f62016-12-05 18:27:35 +0530844 pl_hdr.flags |= PKTLOG_HDR_SIZE_16;
Nirav Shahc657ef52016-07-26 14:22:38 +0530845#else
846 pl_hdr.log_type = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_LOG_TYPE_OFFSET) &
847 ATH_PKTLOG_HDR_LOG_TYPE_MASK) >>
848 ATH_PKTLOG_HDR_LOG_TYPE_SHIFT;
849#endif
850
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800851 pl_hdr.size = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_SIZE_OFFSET) &
852 ATH_PKTLOG_HDR_SIZE_MASK) >> ATH_PKTLOG_HDR_SIZE_SHIFT;
853 pl_hdr.timestamp = *(pl_tgt_hdr + ATH_PKTLOG_HDR_TIMESTAMP_OFFSET);
854 pl_dev = ((struct ol_txrx_pdev_t *)pdev)->pl_dev;
855 log_size = pl_hdr.size;
856 pl_info = pl_dev->pl_info;
857
858 /*
859 * Will be uncommented when the rate control update
860 * for pktlog is implemented in the firmware.
861 * Currently derived from the TX PPDU status
862 */
863 rcu_log.txRateCtrl = (void *)pktlog_getbuf(pl_dev, pl_info,
864 log_size, &pl_hdr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530865 qdf_mem_copy(rcu_log.txRateCtrl,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800866 ((char *)data + sizeof(struct ath_pktlog_hdr)),
867 pl_hdr.size);
Himanshu Agarwal46956a52016-07-26 19:46:25 +0530868 cds_pkt_stats_to_logger_thread(&pl_hdr, NULL, rcu_log.txRateCtrl);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800869 return A_OK;
870}
871#endif /*REMOVE_PKT_LOG */