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 <qdf_module.h> 29 30 QDF_STATUS ucfg_dfs_is_ap_cac_timer_running(struct wlan_objmgr_pdev *pdev, 31 int *is_ap_cac_timer_running) 32 { 33 struct wlan_dfs *dfs; 34 35 dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); 36 if (!dfs) 37 return QDF_STATUS_E_FAILURE; 38 39 *is_ap_cac_timer_running = dfs_is_ap_cac_timer_running(dfs); 40 41 return QDF_STATUS_SUCCESS; 42 } 43 qdf_export_symbol(ucfg_dfs_is_ap_cac_timer_running); 44 45 QDF_STATUS ucfg_dfs_getnol(struct wlan_objmgr_pdev *pdev, 46 void *dfs_nolinfo) 47 { 48 struct wlan_dfs *dfs; 49 50 dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); 51 if (!dfs) 52 return QDF_STATUS_E_FAILURE; 53 54 dfs_getnol(dfs, dfs_nolinfo); 55 56 return QDF_STATUS_SUCCESS; 57 } 58 qdf_export_symbol(ucfg_dfs_getnol); 59 60 QDF_STATUS ucfg_dfs_override_cac_timeout(struct wlan_objmgr_pdev *pdev, 61 int cac_timeout, 62 int *status) 63 { 64 struct wlan_dfs *dfs; 65 66 dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); 67 if (!dfs) 68 return QDF_STATUS_E_FAILURE; 69 70 *status = dfs_override_cac_timeout(dfs, cac_timeout); 71 72 return QDF_STATUS_SUCCESS; 73 } 74 qdf_export_symbol(ucfg_dfs_override_cac_timeout); 75 76 QDF_STATUS ucfg_dfs_get_override_cac_timeout(struct wlan_objmgr_pdev *pdev, 77 int *cac_timeout, 78 int *status) 79 { 80 struct wlan_dfs *dfs; 81 82 dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); 83 if (!dfs) 84 return QDF_STATUS_E_FAILURE; 85 86 *status = dfs_get_override_cac_timeout(dfs, cac_timeout); 87 88 return QDF_STATUS_SUCCESS; 89 } 90 qdf_export_symbol(ucfg_dfs_get_override_cac_timeout); 91 92 QDF_STATUS ucfg_dfs_get_override_precac_timeout(struct wlan_objmgr_pdev *pdev, 93 int *precac_timeout) 94 { 95 struct wlan_dfs *dfs; 96 97 dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); 98 if (!dfs) 99 return QDF_STATUS_E_FAILURE; 100 101 dfs_get_override_precac_timeout(dfs, precac_timeout); 102 103 return QDF_STATUS_SUCCESS; 104 } 105 qdf_export_symbol(ucfg_dfs_get_override_precac_timeout); 106 107 QDF_STATUS ucfg_dfs_override_precac_timeout(struct wlan_objmgr_pdev *pdev, 108 int precac_timeout) 109 { 110 struct wlan_dfs *dfs; 111 112 dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); 113 if (!dfs) 114 return QDF_STATUS_E_FAILURE; 115 116 dfs_override_precac_timeout(dfs, precac_timeout); 117 118 return QDF_STATUS_SUCCESS; 119 } 120 qdf_export_symbol(ucfg_dfs_override_precac_timeout); 121 122 QDF_STATUS ucfg_dfs_set_precac_enable(struct wlan_objmgr_pdev *pdev, 123 uint32_t value) 124 { 125 struct wlan_dfs *dfs; 126 127 dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); 128 if (!dfs) 129 return QDF_STATUS_E_FAILURE; 130 131 dfs_set_precac_enable(dfs, value); 132 133 return QDF_STATUS_SUCCESS; 134 } 135 qdf_export_symbol(ucfg_dfs_set_precac_enable); 136 137 QDF_STATUS ucfg_dfs_get_precac_enable(struct wlan_objmgr_pdev *pdev, 138 int *buff) 139 { 140 struct wlan_dfs *dfs; 141 142 dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); 143 if (!dfs) 144 return QDF_STATUS_E_FAILURE; 145 146 *buff = dfs_get_precac_enable(dfs); 147 148 return QDF_STATUS_SUCCESS; 149 } 150 qdf_export_symbol(ucfg_dfs_get_precac_enable); 151 152 #ifdef QCA_MCL_DFS_SUPPORT 153 QDF_STATUS ucfg_dfs_update_config(struct wlan_objmgr_psoc *psoc, 154 struct dfs_user_config *req) 155 { 156 struct dfs_soc_priv_obj *soc_obj; 157 158 if (!psoc || !req) { 159 dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, 160 "psoc: 0x%pK, req: 0x%pK", psoc, req); 161 return QDF_STATUS_E_FAILURE; 162 } 163 164 soc_obj = wlan_objmgr_psoc_get_comp_private_obj(psoc, 165 WLAN_UMAC_COMP_DFS); 166 if (!soc_obj) { 167 dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, 168 "Failed to get dfs psoc component"); 169 return QDF_STATUS_E_FAILURE; 170 } 171 172 soc_obj->dfs_is_phyerr_filter_offload = 173 req->dfs_is_phyerr_filter_offload; 174 175 return QDF_STATUS_SUCCESS; 176 } 177 qdf_export_symbol(ucfg_dfs_update_config); 178 #endif 179