wmi_unified_dbr_tlv.c 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. /*
  2. * Copyright (c) 2016-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. #include <osdep.h>
  19. #include "wmi.h"
  20. #include "wmi_unified_priv.h"
  21. #include "wmi_unified_dbr_param.h"
  22. #include "wmi_unified_dbr_api.h"
  23. /**
  24. * send_dbr_cfg_cmd_tlv() - configure DMA rings for Direct Buf RX
  25. * @wmi_handle: wmi handle
  26. * @data_len: len of dma cfg req
  27. * @data: dma cfg req
  28. *
  29. * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure
  30. */
  31. static QDF_STATUS send_dbr_cfg_cmd_tlv(wmi_unified_t wmi_handle,
  32. struct direct_buf_rx_cfg_req *cfg)
  33. {
  34. wmi_buf_t buf;
  35. wmi_dma_ring_cfg_req_fixed_param *cmd;
  36. QDF_STATUS ret;
  37. int32_t len = sizeof(*cmd);
  38. buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
  39. if (!buf) {
  40. WMI_LOGE(FL("wmi_buf_alloc failed"));
  41. return QDF_STATUS_E_FAILURE;
  42. }
  43. cmd = (wmi_dma_ring_cfg_req_fixed_param *)wmi_buf_data(buf);
  44. WMITLV_SET_HDR(&cmd->tlv_header,
  45. WMITLV_TAG_STRUC_wmi_dma_ring_cfg_req_fixed_param,
  46. WMITLV_GET_STRUCT_TLVLEN(wmi_dma_ring_cfg_req_fixed_param));
  47. cmd->pdev_id = wmi_handle->ops->convert_pdev_id_host_to_target(
  48. cfg->pdev_id);
  49. cmd->mod_id = cfg->mod_id;
  50. cmd->base_paddr_lo = cfg->base_paddr_lo;
  51. cmd->base_paddr_hi = cfg->base_paddr_hi;
  52. cmd->head_idx_paddr_lo = cfg->head_idx_paddr_lo;
  53. cmd->head_idx_paddr_hi = cfg->head_idx_paddr_hi;
  54. cmd->tail_idx_paddr_lo = cfg->tail_idx_paddr_lo;
  55. cmd->tail_idx_paddr_hi = cfg->tail_idx_paddr_hi;
  56. cmd->num_elems = cfg->num_elems;
  57. cmd->buf_size = cfg->buf_size;
  58. cmd->num_resp_per_event = cfg->num_resp_per_event;
  59. cmd->event_timeout_ms = cfg->event_timeout_ms;
  60. WMI_LOGD("%s: wmi_dma_ring_cfg_req_fixed_param pdev id %d mod id %d"
  61. "base paddr lo %x base paddr hi %x head idx paddr lo %x"
  62. "head idx paddr hi %x tail idx paddr lo %x"
  63. "tail idx addr hi %x num elems %d buf size %d num resp %d"
  64. "event timeout %d", __func__, cmd->pdev_id,
  65. cmd->mod_id, cmd->base_paddr_lo, cmd->base_paddr_hi,
  66. cmd->head_idx_paddr_lo, cmd->head_idx_paddr_hi,
  67. cmd->tail_idx_paddr_lo, cmd->tail_idx_paddr_hi,
  68. cmd->num_elems, cmd->buf_size, cmd->num_resp_per_event,
  69. cmd->event_timeout_ms);
  70. wmi_mtrace(WMI_PDEV_DMA_RING_CFG_REQ_CMDID, NO_SESSION, 0);
  71. ret = wmi_unified_cmd_send(wmi_handle, buf, len,
  72. WMI_PDEV_DMA_RING_CFG_REQ_CMDID);
  73. if (QDF_IS_STATUS_ERROR(ret)) {
  74. WMI_LOGE(FL(":wmi cmd send failed"));
  75. wmi_buf_free(buf);
  76. }
  77. return ret;
  78. }
  79. static QDF_STATUS extract_dbr_buf_release_fixed_tlv(wmi_unified_t wmi_handle,
  80. uint8_t *event, struct direct_buf_rx_rsp *param)
  81. {
  82. WMI_PDEV_DMA_RING_BUF_RELEASE_EVENTID_param_tlvs *param_buf;
  83. wmi_dma_buf_release_fixed_param *ev;
  84. param_buf = (WMI_PDEV_DMA_RING_BUF_RELEASE_EVENTID_param_tlvs *)event;
  85. if (!param_buf)
  86. return QDF_STATUS_E_INVAL;
  87. ev = param_buf->fixed_param;
  88. if (!ev)
  89. return QDF_STATUS_E_INVAL;
  90. param->pdev_id = wmi_handle->ops->convert_pdev_id_target_to_host(
  91. ev->pdev_id);
  92. param->mod_id = ev->mod_id;
  93. param->num_buf_release_entry = ev->num_buf_release_entry;
  94. param->num_meta_data_entry = ev->num_meta_data_entry;
  95. WMI_LOGD("%s:pdev id %d mod id %d num buf release entry %d", __func__,
  96. param->pdev_id, param->mod_id, param->num_buf_release_entry);
  97. return QDF_STATUS_SUCCESS;
  98. }
  99. static QDF_STATUS extract_dbr_buf_release_entry_tlv(wmi_unified_t wmi_handle,
  100. uint8_t *event, uint8_t idx, struct direct_buf_rx_entry *param)
  101. {
  102. WMI_PDEV_DMA_RING_BUF_RELEASE_EVENTID_param_tlvs *param_buf;
  103. wmi_dma_buf_release_entry *entry;
  104. param_buf = (WMI_PDEV_DMA_RING_BUF_RELEASE_EVENTID_param_tlvs *)event;
  105. if (!param_buf)
  106. return QDF_STATUS_E_INVAL;
  107. entry = &param_buf->entries[idx];
  108. if (!entry) {
  109. WMI_LOGE("%s: Entry is NULL", __func__);
  110. return QDF_STATUS_E_FAILURE;
  111. }
  112. WMI_LOGD("%s: paddr_lo[%d] = %x", __func__, idx, entry->paddr_lo);
  113. param->paddr_lo = entry->paddr_lo;
  114. param->paddr_hi = entry->paddr_hi;
  115. return QDF_STATUS_SUCCESS;
  116. }
  117. static QDF_STATUS extract_dbr_buf_metadata_tlv(
  118. wmi_unified_t wmi_handle, uint8_t *event,
  119. uint8_t idx, struct direct_buf_rx_metadata *param)
  120. {
  121. WMI_PDEV_DMA_RING_BUF_RELEASE_EVENTID_param_tlvs *param_buf;
  122. wmi_dma_buf_release_spectral_meta_data *entry;
  123. param_buf = (WMI_PDEV_DMA_RING_BUF_RELEASE_EVENTID_param_tlvs *)event;
  124. if (!param_buf)
  125. return QDF_STATUS_E_INVAL;
  126. entry = &param_buf->meta_data[idx];
  127. if (!entry) {
  128. WMI_LOGE("%s: Entry is NULL", __func__);
  129. return QDF_STATUS_E_FAILURE;
  130. }
  131. qdf_mem_copy(param->noisefloor, entry->noise_floor,
  132. qdf_min(sizeof(entry->noise_floor),
  133. sizeof(param->noisefloor)));
  134. param->reset_delay = entry->reset_delay;
  135. return QDF_STATUS_SUCCESS;
  136. }
  137. void wmi_dbr_attach_tlv(wmi_unified_t wmi_handle)
  138. {
  139. struct wmi_ops *ops = wmi_handle->ops;
  140. ops->send_dbr_cfg_cmd = send_dbr_cfg_cmd_tlv;
  141. ops->extract_dbr_buf_release_entry = extract_dbr_buf_release_entry_tlv;
  142. ops->extract_dbr_buf_metadata = extract_dbr_buf_metadata_tlv;
  143. ops->extract_dbr_buf_release_fixed = extract_dbr_buf_release_fixed_tlv;
  144. }