pktlog_internal.c 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  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
  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. #ifdef PKTLOG_HAS_SPECIFIC_DATA
  43. void
  44. pktlog_hdr_set_specific_data(struct ath_pktlog_hdr *log_hdr,
  45. uint32_t type_specific_data)
  46. {
  47. log_hdr->type_specific_data = type_specific_data;
  48. }
  49. uint32_t
  50. pktlog_hdr_get_specific_data(struct ath_pktlog_hdr *log_hdr)
  51. {
  52. return log_hdr->type_specific_data;
  53. }
  54. void
  55. pktlog_arg_set_specific_data(struct ath_pktlog_arg *plarg,
  56. uint32_t type_specific_data)
  57. {
  58. plarg->type_specific_data = type_specific_data;
  59. }
  60. uint32_t
  61. pktlog_arg_get_specific_data(struct ath_pktlog_arg *plarg)
  62. {
  63. return plarg->type_specific_data;
  64. }
  65. #endif /* PKTLOG_HAS_SPECIFIC_DATA */
  66. void pktlog_getbuf_intsafe(struct ath_pktlog_arg *plarg)
  67. {
  68. struct ath_pktlog_buf *log_buf;
  69. int32_t buf_size;
  70. struct ath_pktlog_hdr *log_hdr;
  71. int32_t cur_wr_offset;
  72. char *log_ptr;
  73. struct ath_pktlog_info *pl_info;
  74. uint16_t log_type;
  75. size_t log_size;
  76. uint32_t flags;
  77. #ifdef HELIUMPLUS
  78. uint8_t mac_id;
  79. #endif
  80. if (!plarg) {
  81. qdf_info("Invalid parg");
  82. return;
  83. }
  84. pl_info = plarg->pl_info;
  85. #ifdef HELIUMPLUS
  86. mac_id = plarg->macId;
  87. log_type = plarg->log_type;
  88. #else
  89. log_type = plarg->log_type;
  90. #endif
  91. log_size = plarg->log_size;
  92. log_buf = pl_info->buf;
  93. flags = plarg->flags;
  94. if (!log_buf) {
  95. qdf_info("Invalid log_buf");
  96. return;
  97. }
  98. buf_size = pl_info->buf_size;
  99. cur_wr_offset = log_buf->wr_offset;
  100. /* Move read offset to the next entry if there is a buffer overlap */
  101. if (log_buf->rd_offset >= 0) {
  102. if ((cur_wr_offset <= log_buf->rd_offset)
  103. && (cur_wr_offset + sizeof(struct ath_pktlog_hdr)) >
  104. log_buf->rd_offset) {
  105. PKTLOG_MOV_RD_IDX(log_buf->rd_offset, log_buf,
  106. buf_size);
  107. }
  108. } else {
  109. log_buf->rd_offset = cur_wr_offset;
  110. }
  111. log_hdr = (struct ath_pktlog_hdr *)(log_buf->log_data + cur_wr_offset);
  112. log_hdr->flags = flags;
  113. #ifdef HELIUMPLUS
  114. log_hdr->macId = mac_id;
  115. log_hdr->log_type = log_type;
  116. #else
  117. log_hdr->log_type = log_type;
  118. #endif
  119. log_hdr->size = (uint16_t) log_size;
  120. log_hdr->missed_cnt = plarg->missed_cnt;
  121. log_hdr->timestamp = plarg->timestamp;
  122. pktlog_hdr_set_specific_data(log_hdr,
  123. pktlog_arg_get_specific_data(plarg));
  124. cur_wr_offset += sizeof(*log_hdr);
  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. while ((cur_wr_offset <= log_buf->rd_offset)
  134. && (cur_wr_offset + log_size) > log_buf->rd_offset) {
  135. PKTLOG_MOV_RD_IDX(log_buf->rd_offset, log_buf, buf_size);
  136. }
  137. log_ptr = &(log_buf->log_data[cur_wr_offset]);
  138. cur_wr_offset += log_hdr->size;
  139. log_buf->wr_offset = ((buf_size - cur_wr_offset) >=
  140. sizeof(struct ath_pktlog_hdr)) ? cur_wr_offset :
  141. 0;
  142. plarg->buf = log_ptr;
  143. }
  144. char *pktlog_getbuf(struct pktlog_dev_t *pl_dev,
  145. struct ath_pktlog_info *pl_info,
  146. size_t log_size, struct ath_pktlog_hdr *pl_hdr)
  147. {
  148. struct ath_pktlog_arg plarg = { 0, };
  149. uint8_t flags = 0;
  150. plarg.pl_info = pl_info;
  151. #ifdef HELIUMPLUS
  152. plarg.macId = pl_hdr->macId;
  153. plarg.log_type = pl_hdr->log_type;
  154. #else
  155. plarg.log_type = pl_hdr->log_type;
  156. #endif
  157. plarg.log_size = log_size;
  158. plarg.flags = pl_hdr->flags;
  159. plarg.missed_cnt = pl_hdr->missed_cnt;
  160. plarg.timestamp = pl_hdr->timestamp;
  161. pktlog_arg_set_specific_data(&plarg,
  162. pktlog_hdr_get_specific_data(pl_hdr));
  163. if (flags & PHFLAGS_INTERRUPT_CONTEXT) {
  164. /*
  165. * We are already in interrupt context, no need to make it
  166. * intsafe. call the function directly.
  167. */
  168. pktlog_getbuf_intsafe(&plarg);
  169. } else {
  170. PKTLOG_LOCK(pl_info);
  171. pktlog_getbuf_intsafe(&plarg);
  172. PKTLOG_UNLOCK(pl_info);
  173. }
  174. return plarg.buf;
  175. }
  176. #endif /*REMOVE_PKT_LOG */