1 /* 2 * Copyright (c) 2020, The Linux Foundation. All rights reserved. 3 * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved. 4 * 5 * Permission to use, copy, modify, and/or distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 */ 17 18 /* 19 * DOC: contains coex north bound interface definitions 20 */ 21 22 #include <wlan_coex_main.h> 23 #include <wlan_coex_ucfg_api.h> 24 #include "wmi_unified.h" 25 #include "wlan_coex_public_structs.h" 26 #include "wlan_coex_tgt_api.h" 27 28 QDF_STATUS 29 ucfg_coex_register_cfg_updated_handler(struct wlan_objmgr_psoc *psoc, 30 enum coex_config_type type, 31 update_coex_cb handler) 32 { 33 struct coex_psoc_obj *coex_obj; 34 35 if (type >= COEX_CONFIG_TYPE_MAX) { 36 coex_err("invalid coex type: %d", type); 37 return QDF_STATUS_E_INVAL; 38 } 39 40 coex_obj = wlan_psoc_get_coex_obj(psoc); 41 if (!coex_obj) 42 return QDF_STATUS_E_INVAL; 43 44 coex_obj->coex_config_updated[type] = handler; 45 46 return QDF_STATUS_SUCCESS; 47 } 48 49 QDF_STATUS 50 ucfg_coex_psoc_set_btc_chain_mode(struct wlan_objmgr_psoc *psoc, 51 enum coex_btc_chain_mode val) 52 { 53 return wlan_coex_psoc_set_btc_chain_mode(psoc, val); 54 } 55 56 QDF_STATUS 57 ucfg_coex_psoc_get_btc_chain_mode(struct wlan_objmgr_psoc *psoc, 58 enum coex_btc_chain_mode *val) 59 { 60 return wlan_coex_psoc_get_btc_chain_mode(psoc, val); 61 } 62 63 QDF_STATUS 64 ucfg_coex_send_btc_chain_mode(struct wlan_objmgr_vdev *vdev, 65 enum coex_btc_chain_mode mode) 66 { 67 struct coex_config_params param = {0}; 68 69 if (mode > WLAN_COEX_BTC_CHAIN_MODE_HYBRID) 70 return QDF_STATUS_E_INVAL; 71 72 param.vdev_id = wlan_vdev_get_id(vdev); 73 param.config_type = WMI_COEX_CONFIG_BTCOEX_SEPARATE_CHAIN_MODE; 74 param.config_arg1 = mode; 75 76 coex_debug("send btc chain mode %d for vdev %d", mode, param.vdev_id); 77 78 return wlan_coex_config_send(vdev, ¶m); 79 } 80 81 QDF_STATUS 82 ucfg_coex_send_multi_config(struct wlan_objmgr_vdev *vdev, 83 struct coex_multi_config *param) 84 { 85 return wlan_coex_multi_config_send(vdev, param); 86 } 87 88 #ifdef WLAN_FEATURE_DBAM_CONFIG 89 QDF_STATUS 90 ucfg_coex_send_dbam_config(struct wlan_objmgr_vdev *vdev, 91 struct coex_dbam_config_params *param, 92 void (*clbk)(void *ctx, 93 enum coex_dbam_comp_status *rsp), 94 void *context) 95 { 96 struct wlan_objmgr_psoc *psoc; 97 struct coex_psoc_obj *coex_obj; 98 struct wlan_coex_callback *cbk; 99 100 if (!vdev) { 101 coex_err("Null vdev"); 102 return QDF_STATUS_E_INVAL; 103 } 104 105 psoc = wlan_vdev_get_psoc(vdev); 106 if (!psoc) { 107 coex_err("psoc is null"); 108 return QDF_STATUS_E_INVAL; 109 } 110 111 coex_obj = wlan_psoc_get_coex_obj(psoc); 112 if (!coex_obj) { 113 coex_err("failed to get coex_obj"); 114 return QDF_STATUS_E_INVAL; 115 } 116 117 cbk = &coex_obj->cb; 118 cbk->set_dbam_config_cb = clbk; 119 cbk->set_dbam_config_ctx = context; 120 121 coex_debug("send dbam config mode %d for vdev_id %d", 122 param->dbam_mode, param->vdev_id); 123 124 return wlan_dbam_config_send(vdev, param); 125 } 126 #endif 127 128 #define COEX_CONFIG_ENABLE_CONT_INFO 12 129 130 QDF_STATUS 131 ucfg_coex_send_logging_config(struct wlan_objmgr_psoc *psoc, 132 uint32_t *apps_args) 133 { 134 struct coex_config_params param = {0}; 135 struct wlan_objmgr_vdev *vdev; 136 QDF_STATUS status; 137 138 if (apps_args[0] != COEX_CONFIG_ENABLE_CONT_INFO) { 139 coex_err("invalid cmd %d", apps_args[0]); 140 return QDF_STATUS_E_FAILURE; 141 } 142 143 vdev = wlan_objmgr_get_vdev_by_opmode_from_psoc(psoc, QDF_STA_MODE, 144 WLAN_COEX_ID); 145 146 if (!vdev) { 147 coex_err("vdev is null"); 148 return QDF_STATUS_E_INVAL; 149 } 150 151 param.vdev_id = wlan_vdev_get_id(vdev); 152 param.config_type = WMI_COEX_CONFIG_ENABLE_CONT_INFO; 153 param.config_arg1 = apps_args[1]; 154 param.config_arg2 = apps_args[2]; 155 param.config_arg3 = apps_args[3]; 156 param.config_arg4 = apps_args[4]; 157 param.config_arg5 = apps_args[5]; 158 param.config_arg6 = apps_args[6]; 159 160 coex_debug("send logging_config arg: %u for vdev %d", *apps_args, 161 param.vdev_id); 162 163 status = wlan_coex_config_send(vdev, ¶m); 164 wlan_objmgr_vdev_release_ref(vdev, WLAN_COEX_ID); 165 166 return status; 167 } 168