pktlog_wifi3.c 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. /**
  2. * Copyright (c) 2013-2020, The Linux Foundation. All rights reserved.
  3. *
  4. * Permission to use, copy, modify, and/or distribute this software for any
  5. * purpose with or without fee is hereby granted, provided that the above
  6. * copyright notice and this permission notice appear in all copies.
  7. *
  8. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  9. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  10. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  11. * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  12. * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  13. * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  14. * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  15. */
  16. /* WIFI3 - Refers to platforms - 6290/6390/6490 */
  17. #include "pktlog_wifi3.h"
  18. #ifndef REMOVE_PKT_LOG
  19. A_STATUS
  20. process_offload_pktlog_wifi3(struct cdp_pdev *pdev, void *data)
  21. {
  22. struct pktlog_dev_t *pl_dev = get_pktlog_handle();
  23. struct ath_pktlog_info *pl_info;
  24. struct ath_pktlog_hdr pl_hdr;
  25. uint32_t *pl_tgt_hdr;
  26. void *txdesc_hdr_ctl = NULL;
  27. size_t log_size = 0;
  28. if (!pl_dev) {
  29. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
  30. "Invalid context in %s\n", __func__);
  31. return A_ERROR;
  32. }
  33. if (!data) {
  34. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
  35. "Invalid data in %s\n", __func__);
  36. return A_ERROR;
  37. }
  38. pl_tgt_hdr = (uint32_t *)data;
  39. pl_hdr.flags = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_FLAGS_OFFSET) &
  40. ATH_PKTLOG_HDR_FLAGS_MASK) >>
  41. ATH_PKTLOG_HDR_FLAGS_SHIFT;
  42. pl_hdr.missed_cnt = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_MISSED_CNT_OFFSET) &
  43. ATH_PKTLOG_HDR_MISSED_CNT_MASK) >>
  44. ATH_PKTLOG_HDR_MISSED_CNT_SHIFT;
  45. pl_hdr.log_type = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_LOG_TYPE_OFFSET) &
  46. ATH_PKTLOG_HDR_LOG_TYPE_MASK) >>
  47. ATH_PKTLOG_HDR_LOG_TYPE_SHIFT;
  48. pl_hdr.size = (*(pl_tgt_hdr + ATH_PKTLOG_HDR_SIZE_OFFSET) &
  49. ATH_PKTLOG_HDR_SIZE_MASK) >> ATH_PKTLOG_HDR_SIZE_SHIFT;
  50. pl_hdr.timestamp = *(pl_tgt_hdr + ATH_PKTLOG_HDR_TIMESTAMP_OFFSET);
  51. pktlog_hdr_set_specific_data(&pl_hdr,
  52. *(pl_tgt_hdr +
  53. ATH_PKTLOG_HDR_TYPE_SPECIFIC_DATA_OFFSET));
  54. if (pl_hdr.size > MAX_PKTLOG_RECV_BUF_SIZE) {
  55. pl_dev->invalid_packets++;
  56. return A_ERROR;
  57. }
  58. /*
  59. * Must include to process different types
  60. * TX_CTL, TX_STATUS, TX_MSDU_ID, TX_FRM_HDR
  61. */
  62. pl_info = pl_dev->pl_info;
  63. log_size = pl_hdr.size;
  64. txdesc_hdr_ctl =
  65. (void *)pktlog_getbuf(pl_dev, pl_info, log_size, &pl_hdr);
  66. if (!txdesc_hdr_ctl) {
  67. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
  68. "Failed to allocate pktlog descriptor");
  69. return A_NO_MEMORY;
  70. }
  71. qdf_assert(txdesc_hdr_ctl);
  72. qdf_assert(pl_hdr->size < PKTLOG_MAX_TX_WORDS * sizeof(u_int32_t));
  73. qdf_mem_copy(txdesc_hdr_ctl,
  74. ((void *)data + sizeof(struct ath_pktlog_hdr)),
  75. pl_hdr.size);
  76. cds_pkt_stats_to_logger_thread(&pl_hdr, NULL, txdesc_hdr_ctl);
  77. return A_OK;
  78. }
  79. int process_rx_desc_remote_wifi3(void *pdev, void *data)
  80. {
  81. struct pktlog_dev_t *pl_dev = get_pktlog_handle();
  82. struct ath_pktlog_hdr pl_hdr;
  83. struct ath_pktlog_rx_info rxstat_log;
  84. size_t log_size;
  85. struct ath_pktlog_info *pl_info;
  86. qdf_nbuf_t log_nbuf = (qdf_nbuf_t)data;
  87. if (!pl_dev) {
  88. qdf_err("Pktlog handle is NULL");
  89. return -EINVAL;
  90. }
  91. pl_info = pl_dev->pl_info;
  92. qdf_mem_zero(&pl_hdr, sizeof(pl_hdr));
  93. pl_hdr.flags = (1 << PKTLOG_FLG_FRM_TYPE_REMOTE_S);
  94. pl_hdr.missed_cnt = 0;
  95. pl_hdr.log_type = PKTLOG_TYPE_RX_STATBUF;
  96. pl_hdr.size = qdf_nbuf_len(log_nbuf);
  97. pl_hdr.timestamp = 0;
  98. log_size = pl_hdr.size;
  99. rxstat_log.rx_desc = (void *)pktlog_getbuf(pl_dev, pl_info,
  100. log_size, &pl_hdr);
  101. if (!rxstat_log.rx_desc) {
  102. QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_DEBUG,
  103. "%s: Rx descriptor is NULL", __func__);
  104. return -EINVAL;
  105. }
  106. qdf_mem_copy(rxstat_log.rx_desc, qdf_nbuf_data(log_nbuf), pl_hdr.size);
  107. cds_pkt_stats_to_logger_thread(&pl_hdr, NULL,
  108. rxstat_log.rx_desc);
  109. return 0;
  110. }
  111. int
  112. process_pktlog_lite_wifi3(void *context, void *log_data,
  113. uint16_t log_type)
  114. {
  115. struct pktlog_dev_t *pl_dev = get_pktlog_handle();
  116. struct ath_pktlog_info *pl_info;
  117. struct ath_pktlog_hdr pl_hdr;
  118. struct ath_pktlog_rx_info rxstat_log;
  119. size_t log_size;
  120. qdf_nbuf_t log_nbuf = (qdf_nbuf_t)log_data;
  121. if (!pl_dev) {
  122. qdf_err("Pktlog handle is NULL");
  123. return -EINVAL;
  124. }
  125. pl_info = pl_dev->pl_info;
  126. qdf_mem_zero(&pl_hdr, sizeof(pl_hdr));
  127. pl_hdr.flags = (1 << PKTLOG_FLG_FRM_TYPE_REMOTE_S);
  128. pl_hdr.missed_cnt = 0;
  129. pl_hdr.log_type = log_type;
  130. pl_hdr.size = qdf_nbuf_len(log_nbuf);
  131. pl_hdr.timestamp = 0;
  132. log_size = pl_hdr.size;
  133. rxstat_log.rx_desc = (void *)pktlog_getbuf(pl_dev, pl_info,
  134. log_size, &pl_hdr);
  135. if (!rxstat_log.rx_desc) {
  136. QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_DEBUG,
  137. "%s: Rx descriptor is NULL", __func__);
  138. return -EINVAL;
  139. }
  140. qdf_mem_copy(rxstat_log.rx_desc, qdf_nbuf_data(log_nbuf), pl_hdr.size);
  141. cds_pkt_stats_to_logger_thread(&pl_hdr, NULL, rxstat_log.rx_desc);
  142. return 0;
  143. }
  144. #endif /* REMOVE_PKT_LOG */