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: Functions to call mlme functions from DFS component. 22 */ 23 24 #include "wlan_dfs_mlme_api.h" 25 #include "wlan_objmgr_vdev_obj.h" 26 #include "wlan_objmgr_pdev_obj.h" 27 #include "../../core/src/dfs.h" 28 #include "scheduler_api.h" 29 #ifdef QCA_MCL_DFS_SUPPORT 30 #include "wni_api.h" 31 #endif 32 33 void dfs_mlme_start_rcsa(struct wlan_objmgr_pdev *pdev, 34 bool *wait_for_csa) 35 { 36 if (global_dfs_to_mlme.dfs_start_rcsa != NULL) 37 global_dfs_to_mlme.dfs_start_rcsa(pdev, wait_for_csa); 38 } 39 40 #ifndef QCA_MCL_DFS_SUPPORT 41 void dfs_mlme_mark_dfs(struct wlan_objmgr_pdev *pdev, 42 uint8_t ieee, 43 uint16_t freq, 44 uint8_t vhtop_ch_freq_seg2, 45 uint64_t flags) 46 { 47 if (global_dfs_to_mlme.mlme_mark_dfs != NULL) 48 global_dfs_to_mlme.mlme_mark_dfs(pdev, 49 ieee, 50 freq, 51 vhtop_ch_freq_seg2, 52 flags); 53 } 54 #else 55 static void dfs_send_radar_ind(struct wlan_objmgr_pdev *pdev, 56 void *object, 57 void *arg) 58 { 59 struct scheduler_msg sme_msg = {0}; 60 uint8_t vdev_id = wlan_vdev_get_id((struct wlan_objmgr_vdev *)object); 61 62 sme_msg.type = eWNI_SME_DFS_RADAR_FOUND; 63 sme_msg.bodyptr = NULL; 64 sme_msg.bodyval = vdev_id; 65 scheduler_post_msg(QDF_MODULE_ID_SME, &sme_msg); 66 dfs_info(NULL, WLAN_DEBUG_DFS_ALWAYS, "eWNI_SME_DFS_RADAR_FOUND pdev%d posted", 67 vdev_id); 68 } 69 70 void dfs_mlme_mark_dfs(struct wlan_objmgr_pdev *pdev, 71 uint8_t ieee, 72 uint16_t freq, 73 uint8_t vhtop_ch_freq_seg2, 74 uint64_t flags) 75 { 76 if (!pdev) { 77 dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, "null pdev"); 78 return; 79 } 80 81 wlan_objmgr_pdev_iterate_obj_list(pdev, 82 WLAN_VDEV_OP, 83 dfs_send_radar_ind, 84 NULL, 0, WLAN_DFS_ID); 85 } 86 #endif 87 88 #ifndef QCA_MCL_DFS_SUPPORT 89 void dfs_mlme_start_csa(struct wlan_objmgr_pdev *pdev, 90 uint8_t ieee_chan, uint16_t freq, 91 uint8_t cfreq2, uint64_t flags) 92 { 93 if (global_dfs_to_mlme.mlme_start_csa != NULL) 94 global_dfs_to_mlme.mlme_start_csa(pdev, ieee_chan, freq, cfreq2, 95 flags); 96 } 97 #else 98 void dfs_mlme_start_csa(struct wlan_objmgr_pdev *pdev, 99 uint8_t ieee_chan, uint16_t freq, 100 uint8_t cfreq2, uint64_t flags) 101 { 102 if (!pdev) { 103 dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, "null pdev"); 104 return; 105 } 106 107 wlan_objmgr_pdev_iterate_obj_list(pdev, 108 WLAN_VDEV_OP, 109 dfs_send_radar_ind, 110 NULL, 0, WLAN_DFS_ID); 111 } 112 #endif 113 114 #ifndef QCA_MCL_DFS_SUPPORT 115 void dfs_mlme_proc_cac(struct wlan_objmgr_pdev *pdev, uint32_t vdev_id) 116 { 117 if (global_dfs_to_mlme.mlme_proc_cac != NULL) 118 global_dfs_to_mlme.mlme_proc_cac(pdev); 119 } 120 #else 121 void dfs_mlme_proc_cac(struct wlan_objmgr_pdev *pdev, uint32_t vdev_id) 122 { 123 struct scheduler_msg sme_msg = {0}; 124 125 sme_msg.type = eWNI_SME_DFS_CAC_COMPLETE; 126 sme_msg.bodyptr = NULL; 127 sme_msg.bodyval = vdev_id; 128 scheduler_post_msg(QDF_MODULE_ID_SME, &sme_msg); 129 dfs_info(NULL, WLAN_DEBUG_DFS_ALWAYS, "eWNI_SME_DFS_CAC_COMPLETE vdev%d posted", 130 vdev_id); 131 } 132 #endif 133 134 void dfs_mlme_deliver_event_up_after_cac(struct wlan_objmgr_pdev *pdev) 135 { 136 if (global_dfs_to_mlme.mlme_deliver_event_up_after_cac) 137 global_dfs_to_mlme.mlme_deliver_event_up_after_cac( 138 pdev); 139 } 140 141 void dfs_mlme_get_dfs_ch_nchans(struct wlan_objmgr_pdev *pdev, 142 int *nchans) 143 { 144 if (global_dfs_to_mlme.mlme_get_dfs_ch_nchans != NULL) 145 global_dfs_to_mlme.mlme_get_dfs_ch_nchans(pdev, 146 nchans); 147 } 148 149 QDF_STATUS dfs_mlme_get_extchan(struct wlan_objmgr_pdev *pdev, 150 uint16_t *dfs_ch_freq, 151 uint64_t *dfs_ch_flags, 152 uint16_t *dfs_ch_flagext, 153 uint8_t *dfs_ch_ieee, 154 uint8_t *dfs_ch_vhtop_ch_freq_seg1, 155 uint8_t *dfs_ch_vhtop_ch_freq_seg2) 156 { 157 if (global_dfs_to_mlme.mlme_get_extchan != NULL) 158 return global_dfs_to_mlme.mlme_get_extchan(pdev, 159 dfs_ch_freq, 160 dfs_ch_flags, 161 dfs_ch_flagext, 162 dfs_ch_ieee, 163 dfs_ch_vhtop_ch_freq_seg1, 164 dfs_ch_vhtop_ch_freq_seg2); 165 166 return QDF_STATUS_E_FAILURE; 167 } 168 169 void dfs_mlme_set_no_chans_available(struct wlan_objmgr_pdev *pdev, 170 int val) 171 { 172 if (global_dfs_to_mlme.mlme_set_no_chans_available != NULL) 173 global_dfs_to_mlme.mlme_set_no_chans_available( 174 pdev, 175 val); 176 } 177 178 int dfs_mlme_ieee2mhz(struct wlan_objmgr_pdev *pdev, int ieee, uint64_t flag) 179 { 180 int freq = 0; 181 182 if (global_dfs_to_mlme.mlme_ieee2mhz != NULL) 183 global_dfs_to_mlme.mlme_ieee2mhz(pdev, 184 ieee, 185 flag, 186 &freq); 187 188 return freq; 189 } 190 191 QDF_STATUS 192 dfs_mlme_find_dot11_channel(struct wlan_objmgr_pdev *pdev, 193 uint8_t ieee, 194 uint8_t des_cfreq2, 195 int mode, 196 uint16_t *dfs_ch_freq, 197 uint64_t *dfs_ch_flags, 198 uint16_t *dfs_ch_flagext, 199 uint8_t *dfs_ch_ieee, 200 uint8_t *dfs_ch_vhtop_ch_freq_seg1, 201 uint8_t *dfs_ch_vhtop_ch_freq_seg2) 202 { 203 if (global_dfs_to_mlme.mlme_find_dot11_channel != NULL) 204 return global_dfs_to_mlme.mlme_find_dot11_channel(pdev, 205 ieee, 206 des_cfreq2, 207 mode, 208 dfs_ch_freq, 209 dfs_ch_flags, 210 dfs_ch_flagext, 211 dfs_ch_ieee, 212 dfs_ch_vhtop_ch_freq_seg1, 213 dfs_ch_vhtop_ch_freq_seg2); 214 return QDF_STATUS_E_FAILURE; 215 } 216 217 void dfs_mlme_get_dfs_ch_channels(struct wlan_objmgr_pdev *pdev, 218 uint16_t *dfs_ch_freq, 219 uint64_t *dfs_ch_flags, 220 uint16_t *dfs_ch_flagext, 221 uint8_t *dfs_ch_ieee, 222 uint8_t *dfs_ch_vhtop_ch_freq_seg1, 223 uint8_t *dfs_ch_vhtop_ch_freq_seg2, 224 int index) 225 { 226 if (global_dfs_to_mlme.mlme_get_dfs_ch_channels != NULL) 227 global_dfs_to_mlme.mlme_get_dfs_ch_channels(pdev, 228 dfs_ch_freq, 229 dfs_ch_flags, 230 dfs_ch_flagext, 231 dfs_ch_ieee, 232 dfs_ch_vhtop_ch_freq_seg1, 233 dfs_ch_vhtop_ch_freq_seg2, 234 index); 235 } 236 237 uint32_t dfs_mlme_dfs_ch_flags_ext(struct wlan_objmgr_pdev *pdev) 238 { 239 uint16_t flag_ext = 0; 240 241 if (global_dfs_to_mlme.mlme_dfs_ch_flags_ext != NULL) 242 global_dfs_to_mlme.mlme_dfs_ch_flags_ext(pdev, 243 &flag_ext); 244 245 return flag_ext; 246 } 247 248 void dfs_mlme_channel_change_by_precac(struct wlan_objmgr_pdev *pdev) 249 { 250 if (global_dfs_to_mlme.mlme_channel_change_by_precac != NULL) 251 global_dfs_to_mlme.mlme_channel_change_by_precac( 252 pdev); 253 } 254 255 void dfs_mlme_nol_timeout_notification(struct wlan_objmgr_pdev *pdev) 256 { 257 if (global_dfs_to_mlme.mlme_nol_timeout_notification != NULL) 258 global_dfs_to_mlme.mlme_nol_timeout_notification( 259 pdev); 260 } 261 262 void dfs_mlme_clist_update(struct wlan_objmgr_pdev *pdev, 263 void *nollist, 264 int nentries) 265 { 266 if (global_dfs_to_mlme.mlme_clist_update != NULL) 267 global_dfs_to_mlme.mlme_clist_update(pdev, 268 nollist, 269 nentries); 270 } 271 272 int dfs_mlme_get_cac_timeout(struct wlan_objmgr_pdev *pdev, 273 uint16_t dfs_ch_freq, 274 uint8_t dfs_ch_vhtop_ch_freq_seg2, 275 uint64_t dfs_ch_flags) 276 { 277 int cac_timeout = 0; 278 279 if (global_dfs_to_mlme.mlme_get_cac_timeout != NULL) 280 global_dfs_to_mlme.mlme_get_cac_timeout(pdev, 281 dfs_ch_freq, 282 dfs_ch_vhtop_ch_freq_seg2, 283 dfs_ch_flags, 284 &cac_timeout); 285 286 return cac_timeout; 287 } 288 289 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST) 290 int dfs_mlme_rebuild_chan_list_with_non_dfs_channels( 291 struct wlan_objmgr_pdev *pdev) 292 { 293 if (!global_dfs_to_mlme.mlme_rebuild_chan_list_with_non_dfs_channels) 294 return 1; 295 296 return global_dfs_to_mlme.mlme_rebuild_chan_list_with_non_dfs_channels( 297 pdev); 298 } 299 300 void dfs_mlme_restart_vaps_with_non_dfs_chan(struct wlan_objmgr_pdev *pdev, 301 int no_chans_avail) 302 { 303 if (!global_dfs_to_mlme.mlme_restart_vaps_with_non_dfs_chan) 304 return; 305 306 global_dfs_to_mlme.mlme_restart_vaps_with_non_dfs_chan(pdev, 307 no_chans_avail); 308 } 309 #endif 310 311 #if defined(WLAN_SUPPORT_PRIMARY_ALLOWED_CHAN) 312 bool dfs_mlme_check_allowed_prim_chanlist(struct wlan_objmgr_pdev *pdev, 313 uint32_t chan_num) 314 { 315 if (!global_dfs_to_mlme.mlme_check_allowed_prim_chanlist) 316 return true; 317 318 return global_dfs_to_mlme.mlme_check_allowed_prim_chanlist(pdev, 319 chan_num); 320 } 321 #endif 322