target_if_dp.c 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. /*
  2. * Copyright (c) 2019 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. * DOC: defines DP interaction with FW using WMI
  20. */
  21. #include <qdf_status.h>
  22. #include "target_if_dp.h"
  23. #include <init_deinit_lmac.h>
  24. void
  25. target_if_peer_set_default_routing(struct cdp_ctrl_objmgr_psoc *psoc,
  26. uint8_t pdev_id, uint8_t *peer_macaddr,
  27. uint8_t vdev_id,
  28. bool hash_based, uint8_t ring_num)
  29. {
  30. uint32_t value;
  31. struct peer_set_params param;
  32. struct wmi_unified *pdev_wmi_handle;
  33. struct wlan_objmgr_pdev *pdev =
  34. wlan_objmgr_get_pdev_by_id((struct wlan_objmgr_psoc *)psoc,
  35. pdev_id, WLAN_PDEV_TARGET_IF_ID);
  36. if (!pdev) {
  37. target_if_err("pdev with id %d is NULL", pdev_id);
  38. return;
  39. }
  40. pdev_wmi_handle = lmac_get_pdev_wmi_handle(pdev);
  41. if (!pdev_wmi_handle) {
  42. wlan_objmgr_pdev_release_ref(pdev, WLAN_PDEV_TARGET_IF_ID);
  43. target_if_err("pdev wmi handle NULL");
  44. return;
  45. }
  46. qdf_mem_zero(&param, sizeof(param));
  47. /* TODO: Need bit definitions for ring number and hash based routing
  48. * fields in common wmi header file
  49. */
  50. value = ((hash_based) ? 1 : 0) | (ring_num << 1);
  51. param.param_id = WMI_HOST_PEER_SET_DEFAULT_ROUTING;
  52. param.vdev_id = vdev_id;
  53. param.param_value = value;
  54. if (wmi_set_peer_param_send(pdev_wmi_handle, peer_macaddr, &param)) {
  55. target_if_err("Unable to set default routing for peer "
  56. QDF_MAC_ADDR_STR,
  57. QDF_MAC_ADDR_ARRAY(peer_macaddr));
  58. }
  59. wlan_objmgr_pdev_release_ref(pdev, WLAN_PDEV_TARGET_IF_ID);
  60. }
  61. #ifdef SERIALIZE_QUEUE_SETUP
  62. static QDF_STATUS
  63. target_if_rx_reorder_queue_setup(struct scheduler_msg *msg)
  64. {
  65. struct rx_reorder_queue_setup_params param;
  66. struct wmi_unified *pdev_wmi_handle;
  67. struct reorder_q_setup *q_params;
  68. QDF_STATUS status;
  69. struct wlan_objmgr_pdev *pdev;
  70. struct wlan_objmgr_psoc *psoc;
  71. if (!(msg->bodyptr)) {
  72. target_if_err("rx_reorder: Invalid message body");
  73. return QDF_STATUS_E_INVAL;
  74. }
  75. q_params = msg->bodyptr;
  76. psoc = (struct wlan_objmgr_psoc *)q_params->psoc;
  77. pdev = wlan_objmgr_get_pdev_by_id(psoc, q_params->pdev_id,
  78. WLAN_PDEV_TARGET_IF_ID);
  79. if (!pdev) {
  80. target_if_err("pdev with id %d is NULL", q_params->pdev_id);
  81. return QDF_STATUS_E_INVAL;
  82. }
  83. pdev_wmi_handle = lmac_get_pdev_wmi_handle(pdev);
  84. if (!pdev_wmi_handle) {
  85. target_if_err("pdev wmi handle NULL");
  86. status = QDF_STATUS_E_FAILURE;
  87. goto out;
  88. }
  89. param.tid = q_params->tid;
  90. param.vdev_id = q_params->vdev_id;
  91. param.peer_macaddr = q_params->peer_mac;
  92. param.hw_qdesc_paddr_lo = q_params->hw_qdesc_paddr & 0xffffffff;
  93. param.hw_qdesc_paddr_hi = (uint64_t)q_params->hw_qdesc_paddr >> 32;
  94. param.queue_no = q_params->queue_no;
  95. param.ba_window_size_valid = q_params->ba_window_size_valid;
  96. param.ba_window_size = q_params->ba_window_size;
  97. status = wmi_unified_peer_rx_reorder_queue_setup_send(pdev_wmi_handle,
  98. &param);
  99. out:
  100. wlan_objmgr_pdev_release_ref(pdev, WLAN_PDEV_TARGET_IF_ID);
  101. qdf_mem_free(q_params);
  102. return status;
  103. }
  104. QDF_STATUS
  105. target_if_peer_rx_reorder_queue_setup(struct cdp_ctrl_objmgr_psoc *psoc,
  106. uint8_t pdev_id,
  107. uint8_t vdev_id, uint8_t *peer_macaddr,
  108. qdf_dma_addr_t hw_qdesc, int tid,
  109. uint16_t queue_no,
  110. uint8_t ba_window_size_valid,
  111. uint16_t ba_window_size)
  112. {
  113. struct scheduler_msg msg = {0};
  114. struct reorder_q_setup *q_params;
  115. QDF_STATUS status;
  116. q_params = qdf_mem_malloc(sizeof(*q_params));
  117. if (!q_params)
  118. return QDF_STATUS_E_NOMEM;
  119. q_params->psoc = psoc;
  120. q_params->vdev_id = vdev_id;
  121. q_params->pdev_id = pdev_id;
  122. q_params->hw_qdesc_paddr = hw_qdesc;
  123. q_params->tid = tid;
  124. q_params->queue_no = queue_no;
  125. q_params->ba_window_size_valid = ba_window_size_valid;
  126. q_params->ba_window_size = ba_window_size;
  127. qdf_mem_copy(q_params->peer_mac, peer_macaddr, QDF_MAC_ADDR_SIZE);
  128. msg.bodyptr = q_params;
  129. msg.callback = target_if_rx_reorder_queue_setup;
  130. status = scheduler_post_message(QDF_MODULE_ID_TARGET_IF,
  131. QDF_MODULE_ID_TARGET_IF,
  132. QDF_MODULE_ID_TARGET_IF, &msg);
  133. if (status != QDF_STATUS_SUCCESS)
  134. qdf_mem_free(q_params);
  135. return status;
  136. }
  137. #else
  138. QDF_STATUS
  139. target_if_peer_rx_reorder_queue_setup(struct cdp_ctrl_objmgr_psoc *psoc,
  140. uint8_t pdev_id,
  141. uint8_t vdev_id, uint8_t *peer_macaddr,
  142. qdf_dma_addr_t hw_qdesc, int tid,
  143. uint16_t queue_no,
  144. uint8_t ba_window_size_valid,
  145. uint16_t ba_window_size)
  146. {
  147. struct rx_reorder_queue_setup_params param;
  148. struct wmi_unified *pdev_wmi_handle;
  149. QDF_STATUS status;
  150. struct wlan_objmgr_pdev *pdev =
  151. wlan_objmgr_get_pdev_by_id((struct wlan_objmgr_psoc *)psoc,
  152. pdev_id, WLAN_PDEV_TARGET_IF_ID);
  153. if (!pdev) {
  154. target_if_err("pdev with id %d is NULL", pdev_id);
  155. return QDF_STATUS_E_INVAL;
  156. }
  157. pdev_wmi_handle = lmac_get_pdev_wmi_handle(pdev);
  158. if (!pdev_wmi_handle) {
  159. wlan_objmgr_pdev_release_ref(pdev, WLAN_PDEV_TARGET_IF_ID);
  160. target_if_err("pdev wmi handle NULL");
  161. return QDF_STATUS_E_FAILURE;
  162. }
  163. param.tid = tid;
  164. param.vdev_id = vdev_id;
  165. param.peer_macaddr = peer_macaddr;
  166. param.hw_qdesc_paddr_lo = hw_qdesc & 0xffffffff;
  167. param.hw_qdesc_paddr_hi = (uint64_t)hw_qdesc >> 32;
  168. param.queue_no = queue_no;
  169. param.ba_window_size_valid = ba_window_size_valid;
  170. param.ba_window_size = ba_window_size;
  171. status = wmi_unified_peer_rx_reorder_queue_setup_send(pdev_wmi_handle,
  172. &param);
  173. wlan_objmgr_pdev_release_ref(pdev, WLAN_PDEV_TARGET_IF_ID);
  174. return status;
  175. }
  176. #endif
  177. QDF_STATUS
  178. target_if_peer_rx_reorder_queue_remove(struct cdp_ctrl_objmgr_psoc *psoc,
  179. uint8_t pdev_id,
  180. uint8_t vdev_id, uint8_t *peer_macaddr,
  181. uint32_t peer_tid_bitmap)
  182. {
  183. struct rx_reorder_queue_remove_params param;
  184. struct wmi_unified *pdev_wmi_handle;
  185. QDF_STATUS status;
  186. struct wlan_objmgr_pdev *pdev =
  187. wlan_objmgr_get_pdev_by_id((struct wlan_objmgr_psoc *)psoc,
  188. pdev_id, WLAN_PDEV_TARGET_IF_ID);
  189. if (!pdev) {
  190. target_if_err("pdev with id %d is NULL", pdev_id);
  191. return QDF_STATUS_E_INVAL;
  192. }
  193. pdev_wmi_handle = lmac_get_pdev_wmi_handle(pdev);
  194. if (!pdev_wmi_handle) {
  195. wlan_objmgr_pdev_release_ref(pdev, WLAN_PDEV_TARGET_IF_ID);
  196. target_if_err("pdev wmi handle NULL");
  197. return QDF_STATUS_E_FAILURE;
  198. }
  199. param.vdev_id = vdev_id;
  200. param.peer_macaddr = peer_macaddr;
  201. param.peer_tid_bitmap = peer_tid_bitmap;
  202. status = wmi_unified_peer_rx_reorder_queue_remove_send(pdev_wmi_handle,
  203. &param);
  204. wlan_objmgr_pdev_release_ref(pdev, WLAN_PDEV_TARGET_IF_ID);
  205. return status;
  206. }
  207. QDF_STATUS
  208. target_if_lro_hash_config(struct cdp_ctrl_objmgr_psoc *psoc, uint8_t pdev_id,
  209. struct cdp_lro_hash_config *lro_hash_cfg)
  210. {
  211. struct wmi_lro_config_cmd_t wmi_lro_cmd = {0};
  212. struct wmi_unified *pdev_wmi_handle;
  213. QDF_STATUS status;
  214. struct wlan_objmgr_pdev *pdev =
  215. wlan_objmgr_get_pdev_by_id((struct wlan_objmgr_psoc *)psoc,
  216. pdev_id, WLAN_PDEV_TARGET_IF_ID);
  217. if (!pdev) {
  218. target_if_err("pdev with id %d is NULL", pdev_id);
  219. return QDF_STATUS_E_INVAL;
  220. }
  221. pdev_wmi_handle = lmac_get_pdev_wmi_handle(pdev);
  222. if (!lro_hash_cfg || !pdev_wmi_handle) {
  223. wlan_objmgr_pdev_release_ref(pdev, WLAN_PDEV_TARGET_IF_ID);
  224. target_if_err("wmi_handle: 0x%pK, lro_hash_cfg: 0x%pK",
  225. pdev_wmi_handle, lro_hash_cfg);
  226. return QDF_STATUS_E_FAILURE;
  227. }
  228. wmi_lro_cmd.lro_enable = lro_hash_cfg->lro_enable;
  229. wmi_lro_cmd.tcp_flag = lro_hash_cfg->tcp_flag;
  230. wmi_lro_cmd.tcp_flag_mask = lro_hash_cfg->tcp_flag_mask;
  231. wmi_lro_cmd.pdev_id = pdev_id;
  232. qdf_mem_copy(wmi_lro_cmd.toeplitz_hash_ipv4,
  233. lro_hash_cfg->toeplitz_hash_ipv4,
  234. LRO_IPV4_SEED_ARR_SZ * sizeof(uint32_t));
  235. qdf_mem_copy(wmi_lro_cmd.toeplitz_hash_ipv6,
  236. lro_hash_cfg->toeplitz_hash_ipv6,
  237. LRO_IPV6_SEED_ARR_SZ * sizeof(uint32_t));
  238. status = wmi_unified_lro_config_cmd(pdev_wmi_handle,
  239. &wmi_lro_cmd);
  240. wlan_objmgr_pdev_release_ref(pdev, WLAN_PDEV_TARGET_IF_ID);
  241. return status;
  242. }