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 "wlan_dfs_init_deinit_api.h" 27 #include "../../core/src/dfs.h" 28 #include "../../core/src/dfs_zero_cac.h" 29 #include "../../core/src/dfs_partial_offload_radar.h" 30 #include "../../core/src/dfs_process_radar_found_ind.h" 31 #include <qdf_module.h> 32 33 QDF_STATUS ucfg_dfs_is_ap_cac_timer_running(struct wlan_objmgr_pdev *pdev, 34 int *is_ap_cac_timer_running) 35 { 36 struct wlan_dfs *dfs; 37 38 dfs = wlan_pdev_get_dfs_obj(pdev); 39 if (!dfs) 40 return QDF_STATUS_E_FAILURE; 41 42 *is_ap_cac_timer_running = dfs_is_ap_cac_timer_running(dfs); 43 44 return QDF_STATUS_SUCCESS; 45 } 46 qdf_export_symbol(ucfg_dfs_is_ap_cac_timer_running); 47 48 QDF_STATUS ucfg_dfs_getnol(struct wlan_objmgr_pdev *pdev, 49 void *dfs_nolinfo) 50 { 51 struct wlan_dfs *dfs; 52 53 dfs = wlan_pdev_get_dfs_obj(pdev); 54 if (!dfs) 55 return QDF_STATUS_E_FAILURE; 56 57 dfs_getnol(dfs, dfs_nolinfo); 58 59 return QDF_STATUS_SUCCESS; 60 } 61 qdf_export_symbol(ucfg_dfs_getnol); 62 63 QDF_STATUS ucfg_dfs_override_cac_timeout(struct wlan_objmgr_pdev *pdev, 64 int cac_timeout, 65 int *status) 66 { 67 struct wlan_dfs *dfs; 68 69 dfs = wlan_pdev_get_dfs_obj(pdev); 70 if (!dfs) 71 return QDF_STATUS_E_FAILURE; 72 73 *status = dfs_override_cac_timeout(dfs, cac_timeout); 74 75 return QDF_STATUS_SUCCESS; 76 } 77 qdf_export_symbol(ucfg_dfs_override_cac_timeout); 78 79 QDF_STATUS ucfg_dfs_get_override_cac_timeout(struct wlan_objmgr_pdev *pdev, 80 int *cac_timeout, 81 int *status) 82 { 83 struct wlan_dfs *dfs; 84 85 dfs = wlan_pdev_get_dfs_obj(pdev); 86 if (!dfs) 87 return QDF_STATUS_E_FAILURE; 88 89 *status = dfs_get_override_cac_timeout(dfs, cac_timeout); 90 91 return QDF_STATUS_SUCCESS; 92 } 93 qdf_export_symbol(ucfg_dfs_get_override_cac_timeout); 94 95 QDF_STATUS ucfg_dfs_get_override_precac_timeout(struct wlan_objmgr_pdev *pdev, 96 int *precac_timeout) 97 { 98 struct wlan_dfs *dfs; 99 100 dfs = wlan_pdev_get_dfs_obj(pdev); 101 if (!dfs) 102 return QDF_STATUS_E_FAILURE; 103 104 dfs_get_override_precac_timeout(dfs, precac_timeout); 105 106 return QDF_STATUS_SUCCESS; 107 } 108 qdf_export_symbol(ucfg_dfs_get_override_precac_timeout); 109 110 QDF_STATUS ucfg_dfs_override_precac_timeout(struct wlan_objmgr_pdev *pdev, 111 int precac_timeout) 112 { 113 struct wlan_dfs *dfs; 114 115 dfs = wlan_pdev_get_dfs_obj(pdev); 116 if (!dfs) 117 return QDF_STATUS_E_FAILURE; 118 119 dfs_override_precac_timeout(dfs, precac_timeout); 120 121 return QDF_STATUS_SUCCESS; 122 } 123 qdf_export_symbol(ucfg_dfs_override_precac_timeout); 124 125 QDF_STATUS ucfg_dfs_set_precac_enable(struct wlan_objmgr_pdev *pdev, 126 uint32_t value) 127 { 128 struct wlan_dfs *dfs; 129 130 dfs = wlan_pdev_get_dfs_obj(pdev); 131 if (!dfs) { 132 dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "null dfs"); 133 return QDF_STATUS_E_FAILURE; 134 } 135 136 dfs_set_precac_enable(dfs, value); 137 138 return QDF_STATUS_SUCCESS; 139 } 140 qdf_export_symbol(ucfg_dfs_set_precac_enable); 141 142 QDF_STATUS ucfg_dfs_get_precac_enable(struct wlan_objmgr_pdev *pdev, 143 int *buff) 144 { 145 struct wlan_dfs *dfs; 146 147 if (!tgt_dfs_is_pdev_5ghz(pdev)) 148 return QDF_STATUS_SUCCESS; 149 150 dfs = wlan_pdev_get_dfs_obj(pdev); 151 if (!dfs) { 152 dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "null dfs"); 153 return QDF_STATUS_E_FAILURE; 154 } 155 156 *buff = dfs_get_precac_enable(dfs); 157 158 return QDF_STATUS_SUCCESS; 159 } 160 qdf_export_symbol(ucfg_dfs_get_precac_enable); 161 162 QDF_STATUS 163 ucfg_dfs_set_nol_subchannel_marking(struct wlan_objmgr_pdev *pdev, 164 bool nol_subchannel_marking) 165 { 166 struct wlan_dfs *dfs; 167 168 dfs = wlan_pdev_get_dfs_obj(pdev); 169 if (!dfs) 170 return QDF_STATUS_E_FAILURE; 171 172 dfs_set_nol_subchannel_marking(dfs, nol_subchannel_marking); 173 174 return QDF_STATUS_SUCCESS; 175 } 176 qdf_export_symbol(ucfg_dfs_set_nol_subchannel_marking); 177 178 QDF_STATUS ucfg_dfs_get_nol_subchannel_marking(struct wlan_objmgr_pdev *pdev, 179 bool *nol_subchannel_marking) 180 { 181 struct wlan_dfs *dfs; 182 183 dfs = wlan_pdev_get_dfs_obj(pdev); 184 if (!dfs) 185 return QDF_STATUS_E_FAILURE; 186 187 dfs_get_nol_subchannel_marking(dfs, nol_subchannel_marking); 188 189 return QDF_STATUS_SUCCESS; 190 } 191 qdf_export_symbol(ucfg_dfs_get_nol_subchannel_marking); 192 #ifdef WLAN_DFS_PRECAC_AUTO_CHAN_SUPPORT 193 QDF_STATUS ucfg_dfs_set_precac_intermediate_chan(struct wlan_objmgr_pdev *pdev, 194 uint32_t value) 195 { 196 struct wlan_dfs *dfs; 197 198 dfs = wlan_pdev_get_dfs_obj(pdev); 199 if (!dfs) { 200 dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "null dfs"); 201 return QDF_STATUS_E_FAILURE; 202 } 203 204 dfs_set_precac_intermediate_chan(dfs, value); 205 206 return QDF_STATUS_SUCCESS; 207 } 208 209 QDF_STATUS ucfg_dfs_get_precac_intermediate_chan(struct wlan_objmgr_pdev *pdev, 210 int *buff) 211 { 212 struct wlan_dfs *dfs; 213 214 dfs = wlan_pdev_get_dfs_obj(pdev); 215 if (!dfs) { 216 dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "null dfs"); 217 return QDF_STATUS_E_FAILURE; 218 } 219 220 *buff = dfs_get_precac_intermediate_chan(dfs); 221 222 return QDF_STATUS_SUCCESS; 223 } 224 225 enum precac_chan_state 226 ucfg_dfs_get_precac_chan_state(struct wlan_objmgr_pdev *pdev, 227 uint8_t precac_chan) 228 { 229 struct wlan_dfs *dfs; 230 enum precac_chan_state retval = PRECAC_ERR; 231 232 dfs = wlan_pdev_get_dfs_obj(pdev); 233 if (!dfs) { 234 dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "null dfs"); 235 return PRECAC_ERR; 236 } 237 238 retval = dfs_get_precac_chan_state(dfs, precac_chan); 239 if (PRECAC_ERR == retval) { 240 dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, 241 "Could not find precac channel state"); 242 } 243 244 return retval; 245 } 246 #endif 247 248 #ifdef QCA_MCL_DFS_SUPPORT 249 QDF_STATUS ucfg_dfs_update_config(struct wlan_objmgr_psoc *psoc, 250 struct dfs_user_config *req) 251 { 252 struct dfs_soc_priv_obj *soc_obj; 253 254 if (!psoc || !req) { 255 dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, 256 "psoc: 0x%pK, req: 0x%pK", psoc, req); 257 return QDF_STATUS_E_FAILURE; 258 } 259 260 soc_obj = wlan_objmgr_psoc_get_comp_private_obj(psoc, 261 WLAN_UMAC_COMP_DFS); 262 if (!soc_obj) { 263 dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, 264 "Failed to get dfs psoc component"); 265 return QDF_STATUS_E_FAILURE; 266 } 267 268 soc_obj->dfs_is_phyerr_filter_offload = 269 req->dfs_is_phyerr_filter_offload; 270 271 return QDF_STATUS_SUCCESS; 272 } 273 qdf_export_symbol(ucfg_dfs_update_config); 274 #endif 275 276 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST) 277 QDF_STATUS ucfg_dfs_set_override_status_timeout(struct wlan_objmgr_pdev *pdev, 278 int status_timeout) 279 { 280 struct wlan_dfs *dfs; 281 282 dfs = wlan_pdev_get_dfs_obj(pdev); 283 if (!dfs) { 284 dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "null dfs"); 285 return QDF_STATUS_E_FAILURE; 286 } 287 288 dfs_set_override_status_timeout(dfs, status_timeout); 289 290 return QDF_STATUS_SUCCESS; 291 } 292 293 qdf_export_symbol(ucfg_dfs_set_override_status_timeout); 294 295 QDF_STATUS ucfg_dfs_get_override_status_timeout(struct wlan_objmgr_pdev *pdev, 296 int *status_timeout) 297 { 298 struct wlan_dfs *dfs; 299 300 dfs = wlan_pdev_get_dfs_obj(pdev); 301 if (!dfs) { 302 dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "null dfs"); 303 return QDF_STATUS_E_FAILURE; 304 } 305 306 dfs_get_override_status_timeout(dfs, status_timeout); 307 308 return QDF_STATUS_SUCCESS; 309 } 310 311 qdf_export_symbol(ucfg_dfs_get_override_status_timeout); 312 #endif 313