1 /* 2 * Copyright (c) 2016-2018 The Linux Foundation. All rights reserved. 3 * 4 * 5 * Permission to use, copy, modify, and/or distribute this software for 6 * any purpose with or without fee is hereby granted, provided that the 7 * above copyright notice and this permission notice appear in all 8 * copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL 11 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED 12 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE 13 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 14 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 15 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 16 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 17 * PERFORMANCE OF THIS SOFTWARE. 18 */ 19 20 /** 21 * DOC: This file has the DFS dispatcher API implementation which is exposed 22 * to outside of DFS component. 23 */ 24 25 #include "wlan_dfs_ucfg_api.h" 26 #include "../../core/src/dfs.h" 27 #include "../../core/src/dfs_zero_cac.h" 28 #include "../../core/src/dfs_partial_offload_radar.h" 29 #include <qdf_module.h> 30 31 QDF_STATUS ucfg_dfs_is_ap_cac_timer_running(struct wlan_objmgr_pdev *pdev, 32 int *is_ap_cac_timer_running) 33 { 34 struct wlan_dfs *dfs; 35 36 dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); 37 if (!dfs) 38 return QDF_STATUS_E_FAILURE; 39 40 *is_ap_cac_timer_running = dfs_is_ap_cac_timer_running(dfs); 41 42 return QDF_STATUS_SUCCESS; 43 } 44 qdf_export_symbol(ucfg_dfs_is_ap_cac_timer_running); 45 46 QDF_STATUS ucfg_dfs_getnol(struct wlan_objmgr_pdev *pdev, 47 void *dfs_nolinfo) 48 { 49 struct wlan_dfs *dfs; 50 51 dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); 52 if (!dfs) 53 return QDF_STATUS_E_FAILURE; 54 55 dfs_getnol(dfs, dfs_nolinfo); 56 57 return QDF_STATUS_SUCCESS; 58 } 59 qdf_export_symbol(ucfg_dfs_getnol); 60 61 QDF_STATUS ucfg_dfs_override_cac_timeout(struct wlan_objmgr_pdev *pdev, 62 int cac_timeout, 63 int *status) 64 { 65 struct wlan_dfs *dfs; 66 67 dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); 68 if (!dfs) 69 return QDF_STATUS_E_FAILURE; 70 71 *status = dfs_override_cac_timeout(dfs, cac_timeout); 72 73 return QDF_STATUS_SUCCESS; 74 } 75 qdf_export_symbol(ucfg_dfs_override_cac_timeout); 76 77 QDF_STATUS ucfg_dfs_get_override_cac_timeout(struct wlan_objmgr_pdev *pdev, 78 int *cac_timeout, 79 int *status) 80 { 81 struct wlan_dfs *dfs; 82 83 dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); 84 if (!dfs) 85 return QDF_STATUS_E_FAILURE; 86 87 *status = dfs_get_override_cac_timeout(dfs, cac_timeout); 88 89 return QDF_STATUS_SUCCESS; 90 } 91 qdf_export_symbol(ucfg_dfs_get_override_cac_timeout); 92 93 QDF_STATUS ucfg_dfs_get_override_precac_timeout(struct wlan_objmgr_pdev *pdev, 94 int *precac_timeout) 95 { 96 struct wlan_dfs *dfs; 97 98 dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); 99 if (!dfs) 100 return QDF_STATUS_E_FAILURE; 101 102 dfs_get_override_precac_timeout(dfs, precac_timeout); 103 104 return QDF_STATUS_SUCCESS; 105 } 106 qdf_export_symbol(ucfg_dfs_get_override_precac_timeout); 107 108 QDF_STATUS ucfg_dfs_override_precac_timeout(struct wlan_objmgr_pdev *pdev, 109 int precac_timeout) 110 { 111 struct wlan_dfs *dfs; 112 113 dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); 114 if (!dfs) 115 return QDF_STATUS_E_FAILURE; 116 117 dfs_override_precac_timeout(dfs, precac_timeout); 118 119 return QDF_STATUS_SUCCESS; 120 } 121 qdf_export_symbol(ucfg_dfs_override_precac_timeout); 122 123 QDF_STATUS ucfg_dfs_set_precac_enable(struct wlan_objmgr_pdev *pdev, 124 uint32_t value) 125 { 126 struct wlan_dfs *dfs; 127 128 dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); 129 if (!dfs) { 130 dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "null dfs"); 131 return QDF_STATUS_E_FAILURE; 132 } 133 134 dfs_set_precac_enable(dfs, value); 135 136 return QDF_STATUS_SUCCESS; 137 } 138 qdf_export_symbol(ucfg_dfs_set_precac_enable); 139 140 QDF_STATUS ucfg_dfs_get_precac_enable(struct wlan_objmgr_pdev *pdev, 141 int *buff) 142 { 143 struct wlan_dfs *dfs; 144 145 if (!tgt_dfs_is_pdev_5ghz(pdev)) 146 return QDF_STATUS_SUCCESS; 147 148 dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); 149 if (!dfs) { 150 dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "null dfs"); 151 return QDF_STATUS_E_FAILURE; 152 } 153 154 *buff = dfs_get_precac_enable(dfs); 155 156 return QDF_STATUS_SUCCESS; 157 } 158 qdf_export_symbol(ucfg_dfs_get_precac_enable); 159 160 #ifdef WLAN_DFS_PRECAC_AUTO_CHAN_SUPPORT 161 QDF_STATUS ucfg_dfs_set_precac_intermediate_chan(struct wlan_objmgr_pdev *pdev, 162 uint32_t value) 163 { 164 struct wlan_dfs *dfs; 165 166 dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); 167 if (!dfs) { 168 dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "null dfs"); 169 return QDF_STATUS_E_FAILURE; 170 } 171 172 dfs_set_precac_intermediate_chan(dfs, value); 173 174 return QDF_STATUS_SUCCESS; 175 } 176 177 QDF_STATUS ucfg_dfs_get_precac_intermediate_chan(struct wlan_objmgr_pdev *pdev, 178 int *buff) 179 { 180 struct wlan_dfs *dfs; 181 182 dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); 183 if (!dfs) { 184 dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "null dfs"); 185 return QDF_STATUS_E_FAILURE; 186 } 187 188 *buff = dfs_get_precac_intermediate_chan(dfs); 189 190 return QDF_STATUS_SUCCESS; 191 } 192 193 enum precac_chan_state 194 ucfg_dfs_get_precac_chan_state(struct wlan_objmgr_pdev *pdev, 195 uint8_t precac_chan) 196 { 197 struct wlan_dfs *dfs; 198 enum precac_chan_state retval = PRECAC_ERR; 199 200 dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); 201 if (!dfs) { 202 dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "null dfs"); 203 return PRECAC_ERR; 204 } 205 206 retval = dfs_get_precac_chan_state(dfs, precac_chan); 207 if (PRECAC_ERR == retval) { 208 dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, 209 "Could not find precac channel state"); 210 } 211 212 return retval; 213 } 214 #endif 215 216 #ifdef QCA_MCL_DFS_SUPPORT 217 QDF_STATUS ucfg_dfs_update_config(struct wlan_objmgr_psoc *psoc, 218 struct dfs_user_config *req) 219 { 220 struct dfs_soc_priv_obj *soc_obj; 221 222 if (!psoc || !req) { 223 dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, 224 "psoc: 0x%pK, req: 0x%pK", psoc, req); 225 return QDF_STATUS_E_FAILURE; 226 } 227 228 soc_obj = wlan_objmgr_psoc_get_comp_private_obj(psoc, 229 WLAN_UMAC_COMP_DFS); 230 if (!soc_obj) { 231 dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, 232 "Failed to get dfs psoc component"); 233 return QDF_STATUS_E_FAILURE; 234 } 235 236 soc_obj->dfs_is_phyerr_filter_offload = 237 req->dfs_is_phyerr_filter_offload; 238 239 return QDF_STATUS_SUCCESS; 240 } 241 qdf_export_symbol(ucfg_dfs_update_config); 242 #endif 243 244 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST) 245 QDF_STATUS ucfg_dfs_set_override_status_timeout(struct wlan_objmgr_pdev *pdev, 246 int status_timeout) 247 { 248 struct wlan_dfs *dfs; 249 250 dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); 251 if (!dfs) { 252 dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "null dfs"); 253 return QDF_STATUS_E_FAILURE; 254 } 255 256 dfs_set_override_status_timeout(dfs, status_timeout); 257 258 return QDF_STATUS_SUCCESS; 259 } 260 261 qdf_export_symbol(ucfg_dfs_set_override_status_timeout); 262 263 QDF_STATUS ucfg_dfs_get_override_status_timeout(struct wlan_objmgr_pdev *pdev, 264 int *status_timeout) 265 { 266 struct wlan_dfs *dfs; 267 268 dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); 269 if (!dfs) { 270 dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "null dfs"); 271 return QDF_STATUS_E_FAILURE; 272 } 273 274 dfs_get_override_status_timeout(dfs, status_timeout); 275 276 return QDF_STATUS_SUCCESS; 277 } 278 279 qdf_export_symbol(ucfg_dfs_get_override_status_timeout); 280 #endif 281