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