wlan_mlme_api.c 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. /*
  2. * Copyright (c) 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. /**
  19. * DOC: define public APIs exposed by the mlme component
  20. */
  21. #include "cfg_ucfg_api.h"
  22. #include "wlan_mlme_main.h"
  23. #include "wlan_mlme_ucfg_api.h"
  24. #include "wma_types.h"
  25. #include "wmi_unified.h"
  26. QDF_STATUS wlan_mlme_get_ht_cap_info(struct wlan_objmgr_psoc *psoc,
  27. struct mlme_ht_capabilities_info
  28. *ht_cap_info)
  29. {
  30. struct wlan_mlme_psoc_obj *mlme_obj;
  31. mlme_obj = mlme_get_psoc_obj(psoc);
  32. if (!mlme_obj) {
  33. mlme_err("Failed to get MLME Obj");
  34. return QDF_STATUS_E_FAILURE;
  35. }
  36. *ht_cap_info = mlme_obj->cfg.ht_caps.ht_cap_info;
  37. return QDF_STATUS_SUCCESS;
  38. }
  39. QDF_STATUS wlan_mlme_set_ht_cap_info(struct wlan_objmgr_psoc *psoc,
  40. struct mlme_ht_capabilities_info
  41. ht_cap_info)
  42. {
  43. struct wlan_mlme_psoc_obj *mlme_obj;
  44. mlme_obj = mlme_get_psoc_obj(psoc);
  45. if (!mlme_obj) {
  46. mlme_err("Failed to get MLME Obj");
  47. return QDF_STATUS_E_FAILURE;
  48. }
  49. mlme_obj->cfg.ht_caps.ht_cap_info = ht_cap_info;
  50. return QDF_STATUS_SUCCESS;
  51. }
  52. QDF_STATUS wlan_mlme_get_ignore_peer_ht_mode(struct wlan_objmgr_psoc *psoc,
  53. bool *value)
  54. {
  55. struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
  56. if (!mlme_obj) {
  57. mlme_err("Failed to get MLME Obj");
  58. return QDF_STATUS_E_FAILURE;
  59. }
  60. *value = mlme_obj->cfg.sap_protection_cfg.ignore_peer_ht_mode;
  61. return QDF_STATUS_SUCCESS;
  62. }
  63. QDF_STATUS wlan_mlme_get_tx_chainmask_cck(struct wlan_objmgr_psoc *psoc,
  64. bool *value)
  65. {
  66. struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
  67. if (!mlme_obj) {
  68. mlme_err("Failed to get MLME Obj");
  69. return QDF_STATUS_E_FAILURE;
  70. }
  71. *value = mlme_obj->cfg.chainmask_cfg.tx_chain_mask_cck;
  72. return QDF_STATUS_SUCCESS;
  73. }
  74. QDF_STATUS wlan_mlme_get_tx_chainmask_1ss(struct wlan_objmgr_psoc *psoc,
  75. uint8_t *value)
  76. {
  77. struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
  78. if (!mlme_obj) {
  79. mlme_err("Failed to get MLME Obj");
  80. return QDF_STATUS_E_FAILURE;
  81. }
  82. *value = mlme_obj->cfg.chainmask_cfg.tx_chain_mask_1ss;
  83. return QDF_STATUS_SUCCESS;
  84. }
  85. QDF_STATUS wlan_mlme_get_num_11b_tx_chains(struct wlan_objmgr_psoc *psoc,
  86. uint16_t *value)
  87. {
  88. struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
  89. if (!mlme_obj) {
  90. mlme_err("Failed to get MLME Obj");
  91. return QDF_STATUS_E_FAILURE;
  92. }
  93. *value = mlme_obj->cfg.chainmask_cfg.num_11b_tx_chains;
  94. return QDF_STATUS_SUCCESS;
  95. }
  96. QDF_STATUS wlan_mlme_get_num_11ag_tx_chains(struct wlan_objmgr_psoc *psoc,
  97. uint16_t *value)
  98. {
  99. struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
  100. if (!mlme_obj) {
  101. mlme_err("Failed to get MLME Obj");
  102. return QDF_STATUS_E_FAILURE;
  103. }
  104. *value = mlme_obj->cfg.chainmask_cfg.num_11ag_tx_chains;
  105. return QDF_STATUS_SUCCESS;
  106. }
  107. QDF_STATUS wlan_mlme_configure_chain_mask(struct wlan_objmgr_psoc *psoc,
  108. uint8_t session_id)
  109. {
  110. int ret_val;
  111. uint8_t ch_msk_val;
  112. struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
  113. if (!mlme_obj) {
  114. mlme_err("Failed to get MLME Obj");
  115. return QDF_STATUS_E_FAILURE;
  116. }
  117. mlme_debug("txchainmask1x1: %d rxchainmask1x1: %d",
  118. mlme_obj->cfg.chainmask_cfg.txchainmask1x1,
  119. mlme_obj->cfg.chainmask_cfg.rxchainmask1x1);
  120. mlme_debug("tx_chain_mask_2g: %d, rx_chain_mask_2g: %d",
  121. mlme_obj->cfg.chainmask_cfg.tx_chain_mask_2g,
  122. mlme_obj->cfg.chainmask_cfg.rx_chain_mask_2g);
  123. mlme_debug("tx_chain_mask_5g: %d, rx_chain_mask_5g: %d",
  124. mlme_obj->cfg.chainmask_cfg.tx_chain_mask_5g,
  125. mlme_obj->cfg.chainmask_cfg.rx_chain_mask_5g);
  126. if (mlme_obj->cfg.chainmask_cfg.txchainmask1x1) {
  127. ch_msk_val = mlme_obj->cfg.chainmask_cfg.txchainmask1x1;
  128. ret_val = wma_cli_set_command(session_id,
  129. WMI_PDEV_PARAM_TX_CHAIN_MASK,
  130. ch_msk_val, PDEV_CMD);
  131. if (ret_val)
  132. return QDF_STATUS_E_FAILURE;
  133. }
  134. if (mlme_obj->cfg.chainmask_cfg.rxchainmask1x1) {
  135. ch_msk_val = mlme_obj->cfg.chainmask_cfg.rxchainmask1x1;
  136. ret_val = wma_cli_set_command(session_id,
  137. WMI_PDEV_PARAM_RX_CHAIN_MASK,
  138. ch_msk_val, PDEV_CMD);
  139. if (ret_val)
  140. return QDF_STATUS_E_FAILURE;
  141. }
  142. if (mlme_obj->cfg.chainmask_cfg.txchainmask1x1 ||
  143. mlme_obj->cfg.chainmask_cfg.rxchainmask1x1) {
  144. mlme_debug("band agnostic tx/rx chain mask set. skip per band chain mask");
  145. return QDF_STATUS_SUCCESS;
  146. }
  147. if (mlme_obj->cfg.chainmask_cfg.tx_chain_mask_2g) {
  148. ch_msk_val = mlme_obj->cfg.chainmask_cfg.tx_chain_mask_2g;
  149. ret_val = wma_cli_set_command(session_id,
  150. WMI_PDEV_PARAM_TX_CHAIN_MASK_2G,
  151. ch_msk_val, PDEV_CMD);
  152. if (0 != ret_val)
  153. return QDF_STATUS_E_FAILURE;
  154. }
  155. if (mlme_obj->cfg.chainmask_cfg.rx_chain_mask_2g) {
  156. ch_msk_val = mlme_obj->cfg.chainmask_cfg.rx_chain_mask_2g;
  157. ret_val = wma_cli_set_command(session_id,
  158. WMI_PDEV_PARAM_RX_CHAIN_MASK_2G,
  159. ch_msk_val, PDEV_CMD);
  160. if (0 != ret_val)
  161. return QDF_STATUS_E_FAILURE;
  162. }
  163. if (mlme_obj->cfg.chainmask_cfg.tx_chain_mask_5g) {
  164. ch_msk_val = mlme_obj->cfg.chainmask_cfg.tx_chain_mask_5g;
  165. ret_val = wma_cli_set_command(session_id,
  166. WMI_PDEV_PARAM_TX_CHAIN_MASK_5G,
  167. ch_msk_val, PDEV_CMD);
  168. if (0 != ret_val)
  169. return QDF_STATUS_E_FAILURE;
  170. }
  171. if (mlme_obj->cfg.chainmask_cfg.rx_chain_mask_5g) {
  172. ch_msk_val = mlme_obj->cfg.chainmask_cfg.rx_chain_mask_5g;
  173. ret_val = wma_cli_set_command(session_id,
  174. WMI_PDEV_PARAM_RX_CHAIN_MASK_5G,
  175. ch_msk_val, PDEV_CMD);
  176. if (0 != ret_val)
  177. return QDF_STATUS_E_FAILURE;
  178. }
  179. return QDF_STATUS_SUCCESS;
  180. }