1 /* 2 * Copyright (c) 2016-2020 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: Functions to call lmac/offload functions from DFS component. 22 */ 23 24 #include "wlan_dfs_lmac_api.h" 25 #include "../../core/src/dfs_internal.h" 26 #include <wlan_reg_services_api.h> 27 #include <wlan_lmac_if_def.h> 28 29 void lmac_get_caps(struct wlan_objmgr_pdev *pdev, 30 struct wlan_dfs_caps *dfs_caps) 31 { 32 struct wlan_objmgr_psoc *psoc; 33 struct wlan_lmac_if_dfs_tx_ops *dfs_tx_ops; 34 struct wlan_lmac_if_tx_ops *tx_ops; 35 36 psoc = wlan_pdev_get_psoc(pdev); 37 tx_ops = wlan_psoc_get_lmac_if_txops(psoc); 38 if (!tx_ops) { 39 dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, "tx_ops is null"); 40 return; 41 } 42 43 dfs_tx_ops = &tx_ops->dfs_tx_ops; 44 45 if (dfs_tx_ops->dfs_get_caps) 46 dfs_tx_ops->dfs_get_caps(pdev, dfs_caps); 47 } 48 49 uint64_t lmac_get_tsf64(struct wlan_objmgr_pdev *pdev) 50 { 51 struct wlan_objmgr_psoc *psoc; 52 struct wlan_lmac_if_dfs_tx_ops *dfs_tx_ops; 53 uint64_t tsf64 = 0; 54 struct wlan_lmac_if_tx_ops *tx_ops; 55 56 psoc = wlan_pdev_get_psoc(pdev); 57 tx_ops = wlan_psoc_get_lmac_if_txops(psoc); 58 if (!tx_ops) { 59 dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, "tx_ops is null"); 60 return tsf64; 61 } 62 63 dfs_tx_ops = &tx_ops->dfs_tx_ops; 64 65 if (dfs_tx_ops->dfs_gettsf64) 66 dfs_tx_ops->dfs_gettsf64(pdev, &tsf64); 67 68 return tsf64; 69 } 70 71 void lmac_dfs_disable(struct wlan_objmgr_pdev *pdev, int no_cac) 72 { 73 struct wlan_objmgr_psoc *psoc; 74 struct wlan_lmac_if_dfs_tx_ops *dfs_tx_ops; 75 struct wlan_lmac_if_tx_ops *tx_ops; 76 77 psoc = wlan_pdev_get_psoc(pdev); 78 tx_ops = wlan_psoc_get_lmac_if_txops(psoc); 79 if (!tx_ops) { 80 dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, "tx_ops is null"); 81 return; 82 } 83 84 dfs_tx_ops = &tx_ops->dfs_tx_ops; 85 86 if (dfs_tx_ops->dfs_disable) 87 dfs_tx_ops->dfs_disable(pdev, no_cac); 88 } 89 90 void lmac_dfs_enable(struct wlan_objmgr_pdev *pdev, 91 int *is_fastclk, 92 struct wlan_dfs_phyerr_param *param, 93 int dfsdomain) 94 { 95 struct wlan_objmgr_psoc *psoc; 96 struct wlan_lmac_if_dfs_tx_ops *dfs_tx_ops; 97 struct wlan_lmac_if_tx_ops *tx_ops; 98 99 psoc = wlan_pdev_get_psoc(pdev); 100 tx_ops = wlan_psoc_get_lmac_if_txops(psoc); 101 if (!tx_ops) { 102 dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, "tx_ops is null"); 103 return; 104 } 105 106 dfs_tx_ops = &tx_ops->dfs_tx_ops; 107 108 if (dfs_tx_ops->dfs_enable) 109 dfs_tx_ops->dfs_enable(pdev, 110 is_fastclk, 111 param, 112 dfsdomain); 113 } 114 115 void lmac_dfs_get_thresholds(struct wlan_objmgr_pdev *pdev, 116 struct wlan_dfs_phyerr_param *param) 117 { 118 struct wlan_objmgr_psoc *psoc; 119 struct wlan_lmac_if_dfs_tx_ops *dfs_tx_ops; 120 struct wlan_lmac_if_tx_ops *tx_ops; 121 122 psoc = wlan_pdev_get_psoc(pdev); 123 tx_ops = wlan_psoc_get_lmac_if_txops(psoc); 124 if (!tx_ops) { 125 dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, "tx_ops is null"); 126 return; 127 } 128 129 dfs_tx_ops = &tx_ops->dfs_tx_ops; 130 131 if (dfs_tx_ops->dfs_get_thresholds) 132 dfs_tx_ops->dfs_get_thresholds(pdev, param); 133 } 134 135 uint16_t lmac_get_ah_devid(struct wlan_objmgr_pdev *pdev) 136 { 137 struct wlan_objmgr_psoc *psoc; 138 struct wlan_lmac_if_dfs_tx_ops *dfs_tx_ops; 139 uint16_t devid = 0; 140 struct wlan_lmac_if_tx_ops *tx_ops; 141 142 psoc = wlan_pdev_get_psoc(pdev); 143 tx_ops = wlan_psoc_get_lmac_if_txops(psoc); 144 if (!tx_ops) { 145 dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, "tx_ops is null"); 146 return devid; 147 } 148 149 dfs_tx_ops = &tx_ops->dfs_tx_ops; 150 151 if (dfs_tx_ops->dfs_get_ah_devid) 152 dfs_tx_ops->dfs_get_ah_devid(pdev, &devid); 153 154 return devid; 155 } 156 157 uint32_t lmac_get_ext_busy(struct wlan_objmgr_pdev *pdev) 158 { 159 struct wlan_objmgr_psoc *psoc; 160 struct wlan_lmac_if_dfs_tx_ops *dfs_tx_ops; 161 uint32_t ext_chan_busy = 0; 162 struct wlan_lmac_if_tx_ops *tx_ops; 163 164 psoc = wlan_pdev_get_psoc(pdev); 165 tx_ops = wlan_psoc_get_lmac_if_txops(psoc); 166 if (!tx_ops) { 167 dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, "tx_ops is null"); 168 return ext_chan_busy; 169 } 170 171 dfs_tx_ops = &tx_ops->dfs_tx_ops; 172 173 if (dfs_tx_ops->dfs_get_ext_busy) 174 dfs_tx_ops->dfs_get_ext_busy(pdev, &ext_chan_busy); 175 176 return ext_chan_busy; 177 } 178 179 void lmac_set_use_cac_prssi(struct wlan_objmgr_pdev *pdev) 180 { 181 struct wlan_objmgr_psoc *psoc; 182 struct wlan_lmac_if_dfs_tx_ops *dfs_tx_ops; 183 struct wlan_lmac_if_tx_ops *tx_ops; 184 185 psoc = wlan_pdev_get_psoc(pdev); 186 tx_ops = wlan_psoc_get_lmac_if_txops(psoc); 187 if (!tx_ops) { 188 dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, "tx_ops is null"); 189 return; 190 } 191 192 dfs_tx_ops = &tx_ops->dfs_tx_ops; 193 194 if (dfs_tx_ops->dfs_set_use_cac_prssi) 195 dfs_tx_ops->dfs_set_use_cac_prssi(pdev); 196 } 197 198 uint32_t lmac_get_target_type(struct wlan_objmgr_pdev *pdev) 199 { 200 struct wlan_objmgr_psoc *psoc; 201 struct wlan_lmac_if_dfs_tx_ops *dfs_tx_ops; 202 uint32_t target_type = 0; 203 struct wlan_lmac_if_tx_ops *tx_ops; 204 205 psoc = wlan_pdev_get_psoc(pdev); 206 tx_ops = wlan_psoc_get_lmac_if_txops(psoc); 207 if (!tx_ops) { 208 dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, "tx_ops is null"); 209 return target_type; 210 } 211 212 dfs_tx_ops = &tx_ops->dfs_tx_ops; 213 214 if (dfs_tx_ops->dfs_get_target_type) 215 dfs_tx_ops->dfs_get_target_type(pdev, &target_type); 216 217 return target_type; 218 } 219 220 uint32_t lmac_get_phymode_info(struct wlan_objmgr_pdev *pdev, 221 uint32_t chan_mode) 222 { 223 struct wlan_objmgr_psoc *psoc; 224 struct wlan_lmac_if_dfs_tx_ops *dfs_tx_ops; 225 uint32_t mode_info = 0; 226 struct wlan_lmac_if_tx_ops *tx_ops; 227 228 psoc = wlan_pdev_get_psoc(pdev); 229 tx_ops = wlan_psoc_get_lmac_if_txops(psoc); 230 if (!tx_ops) { 231 dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, "tx_ops is null"); 232 return mode_info; 233 } 234 235 dfs_tx_ops = &tx_ops->dfs_tx_ops; 236 237 /* since dfs never comes into 2G, hardcode is_2gvht_en flag to false */ 238 if (dfs_tx_ops->dfs_get_phymode_info) 239 dfs_tx_ops->dfs_get_phymode_info(pdev, chan_mode, &mode_info, 240 false); 241 242 return mode_info; 243 } 244 245 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST) 246 bool lmac_is_host_dfs_check_support_enabled(struct wlan_objmgr_pdev *pdev) 247 { 248 struct wlan_objmgr_psoc *psoc; 249 struct wlan_lmac_if_dfs_tx_ops *dfs_tx_ops; 250 bool enabled = false; 251 struct wlan_lmac_if_tx_ops *tx_ops; 252 253 psoc = wlan_pdev_get_psoc(pdev); 254 tx_ops = wlan_psoc_get_lmac_if_txops(psoc); 255 if (!tx_ops) { 256 dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, "tx_ops is null"); 257 return enabled; 258 } 259 260 dfs_tx_ops = &tx_ops->dfs_tx_ops; 261 262 if (dfs_tx_ops->dfs_host_dfs_check_support) 263 dfs_tx_ops->dfs_host_dfs_check_support(pdev, &enabled); 264 265 return enabled; 266 } 267 #endif 268