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 QCA_MCL_DFS_SUPPORT 158 QDF_STATUS ucfg_dfs_update_config(struct wlan_objmgr_psoc *psoc, 159 struct dfs_user_config *req) 160 { 161 struct dfs_soc_priv_obj *soc_obj; 162 163 if (!psoc || !req) { 164 dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, 165 "psoc: 0x%pK, req: 0x%pK", psoc, req); 166 return QDF_STATUS_E_FAILURE; 167 } 168 169 soc_obj = wlan_objmgr_psoc_get_comp_private_obj(psoc, 170 WLAN_UMAC_COMP_DFS); 171 if (!soc_obj) { 172 dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, 173 "Failed to get dfs psoc component"); 174 return QDF_STATUS_E_FAILURE; 175 } 176 177 soc_obj->dfs_is_phyerr_filter_offload = 178 req->dfs_is_phyerr_filter_offload; 179 180 return QDF_STATUS_SUCCESS; 181 } 182 qdf_export_symbol(ucfg_dfs_update_config); 183 #endif 184 185 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST) 186 QDF_STATUS ucfg_dfs_set_override_status_timeout(struct wlan_objmgr_pdev *pdev, 187 int status_timeout) 188 { 189 struct wlan_dfs *dfs; 190 191 dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); 192 if (!dfs) { 193 dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "null dfs"); 194 return QDF_STATUS_E_FAILURE; 195 } 196 197 dfs_set_override_status_timeout(dfs, status_timeout); 198 199 return QDF_STATUS_SUCCESS; 200 } 201 202 qdf_export_symbol(ucfg_dfs_set_override_status_timeout); 203 204 QDF_STATUS ucfg_dfs_get_override_status_timeout(struct wlan_objmgr_pdev *pdev, 205 int *status_timeout) 206 { 207 struct wlan_dfs *dfs; 208 209 dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); 210 if (!dfs) { 211 dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "null dfs"); 212 return QDF_STATUS_E_FAILURE; 213 } 214 215 dfs_get_override_status_timeout(dfs, status_timeout); 216 217 return QDF_STATUS_SUCCESS; 218 } 219 220 qdf_export_symbol(ucfg_dfs_get_override_status_timeout); 221 #endif 222