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 dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); 146 if (!dfs) { 147 dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "null dfs"); 148 return QDF_STATUS_E_FAILURE; 149 } 150 151 *buff = dfs_get_precac_enable(dfs); 152 153 return QDF_STATUS_SUCCESS; 154 } 155 qdf_export_symbol(ucfg_dfs_get_precac_enable); 156 157 #ifdef WLAN_DFS_PRECAC_AUTO_CHAN_SUPPORT 158 QDF_STATUS ucfg_dfs_set_precac_intermediate_chan(struct wlan_objmgr_pdev *pdev, 159 uint32_t value) 160 { 161 struct wlan_dfs *dfs; 162 163 dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); 164 if (!dfs) { 165 dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "null dfs"); 166 return QDF_STATUS_E_FAILURE; 167 } 168 169 dfs_set_precac_intermediate_chan(dfs, value); 170 171 return QDF_STATUS_SUCCESS; 172 } 173 174 QDF_STATUS ucfg_dfs_get_precac_intermediate_chan(struct wlan_objmgr_pdev *pdev, 175 int *buff) 176 { 177 struct wlan_dfs *dfs; 178 179 dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); 180 if (!dfs) { 181 dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "null dfs"); 182 return QDF_STATUS_E_FAILURE; 183 } 184 185 *buff = dfs_get_precac_intermediate_chan(dfs); 186 187 return QDF_STATUS_SUCCESS; 188 } 189 190 enum precac_chan_state 191 ucfg_dfs_get_precac_chan_state(struct wlan_objmgr_pdev *pdev, 192 uint8_t precac_chan) 193 { 194 struct wlan_dfs *dfs; 195 enum precac_chan_state retval = PRECAC_ERR; 196 197 dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); 198 if (!dfs) { 199 dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "null dfs"); 200 return PRECAC_ERR; 201 } 202 203 retval = dfs_get_precac_chan_state(dfs, precac_chan); 204 if (PRECAC_ERR == retval) { 205 dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, 206 "Could not find precac channel state"); 207 } 208 209 return retval; 210 } 211 #endif 212 213 #ifdef QCA_MCL_DFS_SUPPORT 214 QDF_STATUS ucfg_dfs_update_config(struct wlan_objmgr_psoc *psoc, 215 struct dfs_user_config *req) 216 { 217 struct dfs_soc_priv_obj *soc_obj; 218 219 if (!psoc || !req) { 220 dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, 221 "psoc: 0x%pK, req: 0x%pK", psoc, req); 222 return QDF_STATUS_E_FAILURE; 223 } 224 225 soc_obj = wlan_objmgr_psoc_get_comp_private_obj(psoc, 226 WLAN_UMAC_COMP_DFS); 227 if (!soc_obj) { 228 dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, 229 "Failed to get dfs psoc component"); 230 return QDF_STATUS_E_FAILURE; 231 } 232 233 soc_obj->dfs_is_phyerr_filter_offload = 234 req->dfs_is_phyerr_filter_offload; 235 236 return QDF_STATUS_SUCCESS; 237 } 238 qdf_export_symbol(ucfg_dfs_update_config); 239 #endif 240 241 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST) 242 QDF_STATUS ucfg_dfs_set_override_status_timeout(struct wlan_objmgr_pdev *pdev, 243 int status_timeout) 244 { 245 struct wlan_dfs *dfs; 246 247 dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); 248 if (!dfs) { 249 dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "null dfs"); 250 return QDF_STATUS_E_FAILURE; 251 } 252 253 dfs_set_override_status_timeout(dfs, status_timeout); 254 255 return QDF_STATUS_SUCCESS; 256 } 257 258 qdf_export_symbol(ucfg_dfs_set_override_status_timeout); 259 260 QDF_STATUS ucfg_dfs_get_override_status_timeout(struct wlan_objmgr_pdev *pdev, 261 int *status_timeout) 262 { 263 struct wlan_dfs *dfs; 264 265 dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); 266 if (!dfs) { 267 dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "null dfs"); 268 return QDF_STATUS_E_FAILURE; 269 } 270 271 dfs_get_override_status_timeout(dfs, status_timeout); 272 273 return QDF_STATUS_SUCCESS; 274 } 275 276 qdf_export_symbol(ucfg_dfs_get_override_status_timeout); 277 #endif 278