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. pl_hdr.type_specific_data = *(pl_tgt_hdr +
  52. ATH_PKTLOG_HDR_TYPE_SPECIFIC_DATA_OFFSET);
  53. if (pl_hdr.size > MAX_PKTLOG_RECV_BUF_SIZE) {
  54. pl_dev->invalid_packets++;
  55. return A_ERROR;
  56. }
  57. /*
  58. * Must include to process different types
  59. * TX_CTL, TX_STATUS, TX_MSDU_ID, TX_FRM_HDR
  60. */
  61. pl_info = pl_dev->pl_info;
  62. log_size = pl_hdr.size;
  63. txdesc_hdr_ctl =
  64. (void *)pktlog_getbuf(pl_dev, pl_info, log_size, &pl_hdr);
  65. if (!txdesc_hdr_ctl) {
  66. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
  67. "Failed to allocate pktlog descriptor");
  68. return A_NO_MEMORY;
  69. }
  70. qdf_assert(txdesc_hdr_ctl);
  71. qdf_assert(pl_hdr->size < PKTLOG_MAX_TX_WORDS * sizeof(u_int32_t));
  72. qdf_mem_copy(txdesc_hdr_ctl,
  73. ((void *)data + sizeof(struct ath_pktlog_hdr)),
  74. pl_hdr.size);
  75. cds_pkt_stats_to_logger_thread(&pl_hdr, NULL, txdesc_hdr_ctl);
  76. return A_OK;
  77. }
  78. int process_rx_desc_remote_wifi3(void *pdev, void *data)
  79. {
  80. struct pktlog_dev_t *pl_dev = get_pktlog_handle();
  81. struct ath_pktlog_hdr pl_hdr;
  82. struct ath_pktlog_rx_info rxstat_log;
  83. size_t log_size;
  84. struct ath_pktlog_info *pl_info;
  85. qdf_nbuf_t log_nbuf = (qdf_nbuf_t)data;
  86. if (!pl_dev) {
  87. qdf_err("Pktlog handle is NULL");
  88. return -EINVAL;
  89. }
  90. pl_info = pl_dev->pl_info;
  91. qdf_mem_zero(&pl_hdr, sizeof(pl_hdr));
  92. pl_hdr.flags = (1 << PKTLOG_FLG_FRM_TYPE_REMOTE_S);
  93. pl_hdr.missed_cnt = 0;
  94. pl_hdr.log_type = PKTLOG_TYPE_RX_STATBUF;
  95. pl_hdr.size = qdf_nbuf_len(log_nbuf);
  96. pl_hdr.timestamp = 0;
  97. log_size = pl_hdr.size;
  98. rxstat_log.rx_desc = (void *)pktlog_getbuf(pl_dev, pl_info,
  99. log_size, &pl_hdr);
  100. if (!rxstat_log.rx_desc) {
  101. QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_DEBUG,
  102. "%s: Rx descriptor is NULL", __func__);
  103. return -EINVAL;
  104. }
  105. qdf_mem_copy(rxstat_log.rx_desc, qdf_nbuf_data(log_nbuf), pl_hdr.size);
  106. cds_pkt_stats_to_logger_thread(&pl_hdr, NULL,
  107. rxstat_log.rx_desc);
  108. return 0;
  109. }
  110. int
  111. process_pktlog_lite_wifi3(void *context, void *log_data,
  112. uint16_t log_type)
  113. {
  114. struct pktlog_dev_t *pl_dev = get_pktlog_handle();
  115. struct ath_pktlog_info *pl_info;
  116. struct ath_pktlog_hdr pl_hdr;
  117. struct ath_pktlog_rx_info rxstat_log;
  118. size_t log_size;
  119. qdf_nbuf_t log_nbuf = (qdf_nbuf_t)log_data;
  120. if (!pl_dev) {
  121. qdf_err("Pktlog handle is NULL");
  122. return -EINVAL;
  123. }
  124. pl_info = pl_dev->pl_info;
  125. qdf_mem_zero(&pl_hdr, sizeof(pl_hdr));
  126. pl_hdr.flags = (1 << PKTLOG_FLG_FRM_TYPE_REMOTE_S);
  127. pl_hdr.missed_cnt = 0;
  128. pl_hdr.log_type = log_type;
  129. pl_hdr.size = qdf_nbuf_len(log_nbuf);
  130. pl_hdr.timestamp = 0;
  131. log_size = pl_hdr.size;
  132. rxstat_log.rx_desc = (void *)pktlog_getbuf(pl_dev, pl_info,
  133. log_size, &pl_hdr);
  134. if (!rxstat_log.rx_desc) {
  135. QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_DEBUG,
  136. "%s: Rx descriptor is NULL", __func__);
  137. return -EINVAL;
  138. }
  139. qdf_mem_copy(rxstat_log.rx_desc, qdf_nbuf_data(log_nbuf), pl_hdr.size);
  140. cds_pkt_stats_to_logger_thread(&pl_hdr, NULL, rxstat_log.rx_desc);
  141. return 0;
  142. }
  143. #endif /* REMOVE_PKT_LOG */