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: These APIs are used by DFS core functions to call mlme functions. 22 */ 23 24 #ifndef _WLAN_DFS_MLME_API_H_ 25 #define _WLAN_DFS_MLME_API_H_ 26 27 #include "wlan_dfs_ucfg_api.h" 28 29 extern struct dfs_to_mlme global_dfs_to_mlme; 30 31 /** 32 * dfs_mlme_start_rcsa() - Send RCSA to RootAP. 33 * @pdev: Pointer to DFS pdev object. 34 * @wait_for_csa: Wait for CSA from RootAP. 35 */ 36 #if defined(QCA_DFS_RCSA_SUPPORT) 37 void dfs_mlme_start_rcsa(struct wlan_objmgr_pdev *pdev, 38 bool *wait_for_csa); 39 #endif 40 41 /** 42 * dfs_mlme_mark_dfs() - Mark the channel in the channel list. 43 * @pdev: Pointer to DFS pdev object. 44 * @ieee: Channel number. 45 * @freq: Channel frequency. 46 * @vhtop_ch_freq_seg2: VHT80 Cfreq2. 47 * @flags: channel flags. 48 */ 49 #ifdef CONFIG_CHAN_NUM_API 50 void dfs_mlme_mark_dfs(struct wlan_objmgr_pdev *pdev, 51 uint8_t ieee, 52 uint16_t freq, 53 uint8_t vhtop_ch_freq_seg2, 54 uint64_t flags); 55 #endif 56 57 /** 58 * dfs_mlme_mark_dfs_for_freq() - Mark the channel in the channel list. 59 * @pdev: Pointer to DFS pdev object. 60 * @ieee: Channel number. 61 * @freq: Channel frequency. 62 * @vhtop_ch_freq_seg2_mhz: VHT80 Cfreq2 in Mhz. 63 * @flags: channel flags. 64 */ 65 #ifdef CONFIG_CHAN_FREQ_API 66 void dfs_mlme_mark_dfs_for_freq(struct wlan_objmgr_pdev *pdev, 67 uint8_t ieee, 68 uint16_t freq, 69 uint16_t vhtop_ch_freq_mhz_seg2, 70 uint64_t flags); 71 #endif 72 /** 73 * dfs_mlme_start_csa() - Sends CSA in ieeeChan 74 * @pdev: Pointer to DFS pdev object. 75 * @ieee_chan: Channel number. 76 * @freq: Channel frequency. 77 * @cfreq2: HT80 cfreq2. 78 * @flags: channel flags. 79 */ 80 #ifdef CONFIG_CHAN_NUM_API 81 void dfs_mlme_start_csa(struct wlan_objmgr_pdev *pdev, 82 uint8_t ieee_chan, 83 uint16_t freq, 84 uint8_t cfreq2, 85 uint64_t flags); 86 #endif 87 88 /** 89 * dfs_mlme_start_csa_for_freq() - Sends CSA in ieeeChan 90 * @pdev: Pointer to DFS pdev object. 91 * @ieee_chan: Channel number. 92 * @freq: Channel frequency. 93 * @cfreq2: HT80 cfreq2 in Mhz. 94 * @flags: channel flags. 95 */ 96 #ifdef CONFIG_CHAN_FREQ_API 97 void dfs_mlme_start_csa_for_freq(struct wlan_objmgr_pdev *pdev, 98 uint8_t ieee_chan, 99 uint16_t freq, 100 uint16_t cfreq2_mhz, 101 uint64_t flags); 102 #endif 103 /** 104 * dfs_mlme_proc_cac() - Process the CAC completion event. 105 * @pdev: Pointer to DFS pdev object. 106 * @vdev_id: vdev id. 107 */ 108 void dfs_mlme_proc_cac(struct wlan_objmgr_pdev *pdev, uint32_t vdev_id); 109 110 /** 111 * dfs_mlme_deliver_event_up_after_cac() - Send a CAC timeout, VAP up event to 112 * userspace. 113 * @pdev: Pointer to DFS pdev object. 114 */ 115 void dfs_mlme_deliver_event_up_after_cac(struct wlan_objmgr_pdev *pdev); 116 117 /** 118 * dfs_mlme_get_dfs_ch_nchans() - Get number of channels in the channel list 119 * @pdev: Pointer to DFS pdev object. 120 * @nchans: Pointer to save the channel number. 121 */ 122 void dfs_mlme_get_dfs_ch_nchans(struct wlan_objmgr_pdev *pdev, int *nchans); 123 124 /** 125 * dfs_mlme_get_extchan() - Get extension channel. 126 * @pdev: Pointer to DFS pdev object. 127 * @dfs_ch_freq: Frequency in Mhz. 128 * @dfs_ch_flags: Channel flags. 129 * @dfs_ch_flagext: Extended channel flags. 130 * @dfs_ch_ieee: IEEE channel number. 131 * @dfs_ch_vhtop_ch_freq_seg1: Channel Center frequency. 132 * @dfs_ch_vhtop_ch_freq_seg2: Channel Center frequency applicable for 80+80MHz 133 * mode of operation. 134 */ 135 #ifdef CONFIG_CHAN_NUM_API 136 QDF_STATUS dfs_mlme_get_extchan(struct wlan_objmgr_pdev *pdev, 137 uint16_t *dfs_ch_freq, 138 uint64_t *dfs_ch_flags, 139 uint16_t *dfs_ch_flagext, 140 uint8_t *dfs_ch_ieee, 141 uint8_t *dfs_ch_vhtop_ch_freq_seg1, 142 uint8_t *dfs_ch_vhtop_ch_freq_seg2); 143 #endif 144 145 /** 146 * dfs_mlme_get_extchan() - Get extension channel. 147 * @pdev: Pointer to DFS pdev object. 148 * @dfs_chan_freq: Frequency in Mhz. 149 * @dfs_chan_flags: Channel flags. 150 * @dfs_chan_flagext: Extended channel flags. 151 * @dfs_chan_ieee: IEEE channel number. 152 * @dfs_chan_vhtop_ch_freq_seg1: Channel Center IEEE. 153 * @dfs_chan_vhtop_ch_freq_seg2: Channel Center IEEE applicable for 80+80MHz 154 * mode of operation. 155 * @dfs_chan_mhz_freq_seg1: Primary channel center freq. 156 * @dfs_chan_mhz_freq_seg2: Secondary channel center freq applicable for 157 * 80+80 MHZ. 158 */ 159 160 #ifdef CONFIG_CHAN_FREQ_API 161 QDF_STATUS dfs_mlme_get_extchan_for_freq(struct wlan_objmgr_pdev *pdev, 162 uint16_t *dfs_chan_freq, 163 uint64_t *dfs_chan_flags, 164 uint16_t *dfs_chan_flagext, 165 uint8_t *dfs_chan_ieee, 166 uint8_t *dfs_chan_vhtop_ch_freq_seg1, 167 uint8_t *dfs_chan_vhtop_ch_freq_seg2, 168 uint16_t *dfs_chan_mhz_freq_seg1, 169 uint16_t *dfs_chan_mhz_freq_seg2); 170 #endif 171 172 /** 173 * dfs_mlme_set_no_chans_available() - Set no_chans_available flag. 174 * @pdev: Pointer to DFS pdev object. 175 * @val: Set this value to no_chans_available flag. 176 */ 177 void dfs_mlme_set_no_chans_available(struct wlan_objmgr_pdev *pdev, 178 int val); 179 180 /** 181 * dfs_mlme_ieee2mhz() - Get the frequency from channel number. 182 * @pdev: Pointer to DFS pdev object. 183 * @ieee: Channel number. 184 * @flag: Channel flag. 185 */ 186 int dfs_mlme_ieee2mhz(struct wlan_objmgr_pdev *pdev, 187 int ieee, 188 uint64_t flag); 189 190 /** 191 * dfs_mlme_find_dot11_channel() - Get dot11 channel from ieee, cfreq2 and mode. 192 * @pdev: Pointer to DFS pdev object. 193 * @ieee: Channel number. 194 * @des_cfreq2: cfreq2 195 * @mode: Phymode 196 * @dfs_ch_freq: Frequency in Mhz. 197 * @dfs_ch_flags: Channel flags. 198 * @dfs_ch_flagext: Extended channel flags. 199 * @dfs_ch_ieee: IEEE channel number. 200 * @dfs_ch_vhtop_ch_freq_seg1: Channel Center frequency. 201 * @dfs_ch_vhtop_ch_freq_seg2: Channel Center frequency applicable for 80+80MHz 202 * mode of operation. 203 * 204 * Return: 205 * * QDF_STATUS_SUCCESS : Channel found. 206 * * QDF_STATUS_E_FAILURE: Channel not found. 207 */ 208 #ifdef CONFIG_CHAN_NUM_API 209 QDF_STATUS 210 dfs_mlme_find_dot11_channel(struct wlan_objmgr_pdev *pdev, 211 uint8_t ieee, 212 uint8_t des_cfreq2, 213 int mode, 214 uint16_t *dfs_ch_freq, 215 uint64_t *dfs_ch_flags, 216 uint16_t *dfs_ch_flagext, 217 uint8_t *dfs_ch_ieee, 218 uint8_t *dfs_ch_vhtop_ch_freq_seg1, 219 uint8_t *dfs_ch_vhtop_ch_freq_seg2); 220 #endif 221 222 /** 223 * dfs_mlme_find_dot11_chan_for_freq() - Find a channel pointer given the mode, 224 * frequency and channel flags. 225 * @pdev: Pointer to DFS pdev object. 226 * @ch_freq: Channel frequency. 227 * @des_cfreq2_mhz: cfreq2 in MHZ. 228 * @mode: Phymode 229 * @dfs_chan_freq: Frequency in Mhz. 230 * @dfs_chan_flags: Channel flags. 231 * @dfs_chan_flagext: Extended channel flags. 232 * @dfs_chan_ieee: IEEE channel number. 233 * @dfs_chan_vhtop_ch_freq_seg1: Channel Center IEEE for primary 80 segment. 234 * @dfs_chan_vhtop_ch_freq_seg2: Channel Center frequency applicable for 235 * 80+80MHz mode of operation. 236 * @dfs_chan_mhz_freq_seg1: Channel center frequency of primary 80 segment. 237 * @dfs_chan_mhz_freq_seg2: Channel center frequency for secondary 80 238 * segment applicable only for 80+80MHZ mode of 239 * operation. 240 * 241 * Return: 242 * * QDF_STATUS_SUCCESS : Channel found. 243 * * QDF_STATUS_E_FAILURE: Channel not found. 244 */ 245 #ifdef CONFIG_CHAN_FREQ_API 246 QDF_STATUS 247 dfs_mlme_find_dot11_chan_for_freq(struct wlan_objmgr_pdev *pdev, 248 uint16_t chan_freq, 249 uint16_t des_cfreq2_mhz, 250 int mode, 251 uint16_t *dfs_chan_freq, 252 uint64_t *dfs_chan_flags, 253 uint16_t *dfs_chan_flagext, 254 uint8_t *dfs_chan_ieee, 255 uint8_t *dfs_chan_vhtop_ch_freq_seg1, 256 uint8_t *dfs_chan_vhtop_ch_freq_seg2, 257 uint16_t *dfs_chan_mhz_freq_seg1, 258 uint16_t *dfs_chan_mhz_freq_seg2); 259 #endif 260 261 /** 262 * dfs_mlme_get_dfs_ch_channels() - Get channel from channel list. 263 * @pdev: Pointer to DFS pdev object. 264 * @dfs_ch_freq: Frequency in Mhz. 265 * @dfs_ch_flags: Channel flags. 266 * @dfs_ch_flagext: Extended channel flags. 267 * @dfs_ch_ieee: IEEE channel number. 268 * @dfs_ch_vhtop_ch_freq_seg1: Channel Center frequency. 269 * @dfs_ch_vhtop_ch_freq_seg2: Channel Center frequency applicable for 80+80MHz 270 * mode of operation. 271 * @index: Index into channel list. 272 */ 273 #ifdef CONFIG_CHAN_NUM_API 274 void dfs_mlme_get_dfs_ch_channels(struct wlan_objmgr_pdev *pdev, 275 uint16_t *dfs_ch_freq, 276 uint64_t *dfs_ch_flags, 277 uint16_t *dfs_ch_flagext, 278 uint8_t *dfs_ch_ieee, 279 uint8_t *dfs_ch_vhtop_ch_freq_seg1, 280 uint8_t *dfs_ch_vhtop_ch_freq_seg2, 281 int index); 282 #endif 283 284 /** 285 * dfs_mlme_get_dfs_channels_for_freq() - Get DFS channel from channel list. 286 * @pdev: Pointer to DFS pdev object. 287 * @dfs_chan_freq: Frequency in Mhz. 288 * @dfs_chan_flags: Channel flags. 289 * @dfs_chan_flagext: Extended channel flags. 290 * @dfs_chan_ieee: IEEE channel number. 291 * @dfs_chan_vhtop_ch_freq_seg1: Channel Center IEEE number. 292 * @dfs_chan_vhtop_ch_freq_seg2: Channel Center IEEE applicable for 80+80MHz 293 * mode of operation. 294 * @dfs_chan_mhz_freq_seg1 : Primary 80 Channel Center frequency. 295 * @dfs_chan_mhz_freq_seg2 : Channel center frequency applicable only for 296 * 80+80 mode of operation. 297 * @index: Index into channel list. 298 */ 299 #ifdef CONFIG_CHAN_FREQ_API 300 void 301 dfs_mlme_get_dfs_channels_for_freq(struct wlan_objmgr_pdev *pdev, 302 uint16_t *dfs_chan_freq, 303 uint64_t *dfs_chan_flags, 304 uint16_t *dfs_chan_flagext, 305 uint8_t *dfs_chan_ieee, 306 uint8_t *dfs_chan_vhtop_ch_freq_seg1, 307 uint8_t *dfs_chan_vhtop_ch_freq_seg2, 308 uint16_t *dfs_chan_mhz_freq_seg1, 309 uint16_t *dfs_chan_mhz_freq_seg2, 310 int index); 311 #endif 312 313 /** 314 * dfs_mlme_dfs_ch_flags_ext() - Get extension channel flags. 315 * @pdev: Pointer to DFS pdev object. 316 */ 317 uint32_t dfs_mlme_dfs_ch_flags_ext(struct wlan_objmgr_pdev *pdev); 318 319 /** 320 * dfs_mlme_channel_change_by_precac() - Channel change by PreCAC. 321 * @pdev: Pointer to DFS pdev object. 322 */ 323 void dfs_mlme_channel_change_by_precac(struct wlan_objmgr_pdev *pdev); 324 325 /** 326 * dfs_mlme_nol_timeout_notification() - NOL timeout notification to userspace. 327 * @pdev: Pointer to DFS pdev object. 328 */ 329 void dfs_mlme_nol_timeout_notification(struct wlan_objmgr_pdev *pdev); 330 331 /** 332 * dfs_mlme_clist_update() - Mark the channel as RADAR. 333 * @pdev: Pointer to DFS pdev object. 334 * @nollist: Pointer to NOL list. 335 * @nentries: Number of channels in the NOL list. 336 */ 337 void dfs_mlme_clist_update(struct wlan_objmgr_pdev *pdev, 338 void *nollist, 339 int nentries); 340 341 /** 342 * dfs_mlme_get_cac_timeout() - Get cac_timeout. 343 * @pdev: Pointer to DFS pdev object. 344 * @dfs_ch_freq: Frequency in Mhz. 345 * @dfs_ch_vhtop_ch_freq_seg2: Channel Center frequency applicable for 80+80MHz 346 * mode of operation. 347 * @dfs_ch_flags: Channel flags. 348 */ 349 #ifdef CONFIG_CHAN_NUM_API 350 int dfs_mlme_get_cac_timeout(struct wlan_objmgr_pdev *pdev, 351 uint16_t dfs_ch_freq, 352 uint8_t dfs_ch_vhtop_ch_freq_seg2, 353 uint64_t dfs_ch_flags); 354 #endif 355 356 /** 357 * dfs_mlme_get_cac_timeout_for_freq() - Get cac_timeout. 358 * @pdev: Pointer to DFS pdev object. 359 * @dfs_chan_freq: Frequency in Mhz. 360 * @dfs_chan_vhtop_freq_seg2: Channel Center frequency applicable for 80+80MHz 361 * mode of operation. 362 * @dfs_chan_flags: Channel flags. 363 */ 364 #ifdef CONFIG_CHAN_FREQ_API 365 int dfs_mlme_get_cac_timeout_for_freq(struct wlan_objmgr_pdev *pdev, 366 uint16_t dfs_chan_freq, 367 uint16_t dfs_chan_vhtop_freq_seg2_mhz, 368 uint64_t dfs_chan_flags); 369 #endif 370 /** 371 * dfs_mlme_rebuild_chan_list_with_non_dfs_channels() - Rebuild the channel list 372 * with only non DFS channels. 373 * @pdev: Pointer to DFS pdev object. 374 * 375 * return: On success return 1 or 0, else failure. 376 */ 377 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST) 378 int dfs_mlme_rebuild_chan_list_with_non_dfs_channels( 379 struct wlan_objmgr_pdev *pdev); 380 #else 381 static inline int dfs_mlme_rebuild_chan_list_with_non_dfs_channels( 382 struct wlan_objmgr_pdev *pdev) 383 { 384 return 0; 385 } 386 #endif 387 388 /** 389 * dfs_mlme_restart_vaps_with_non_dfs_chan() - Restart vaps with non DFS 390 * channels 391 * @pdev: Pointer to DFS pdev object. 392 * @no_chans_avail: Indicates if no channel is available. 393 */ 394 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST) 395 void dfs_mlme_restart_vaps_with_non_dfs_chan(struct wlan_objmgr_pdev *pdev, 396 int no_chans_avail); 397 #else 398 static inline 399 void dfs_mlme_restart_vaps_with_non_dfs_chan(struct wlan_objmgr_pdev *pdev, 400 int no_chans_avail) 401 { 402 } 403 #endif 404 405 /** 406 * dfs_mlme_check_allowed_prim_chanlist() - Check whether the given channel is 407 * present in the primary allowed channel list or not 408 * @pdev: Pointer to DFS pdev object. 409 * @chan_num: Channel number 410 */ 411 #if defined(WLAN_SUPPORT_PRIMARY_ALLOWED_CHAN) 412 bool dfs_mlme_check_allowed_prim_chanlist(struct wlan_objmgr_pdev *pdev, 413 uint32_t chan_freq); 414 415 #else 416 static inline 417 bool dfs_mlme_check_allowed_prim_chanlist(struct wlan_objmgr_pdev *pdev, 418 uint32_t chan_freq) 419 { 420 return true; 421 } 422 #endif 423 424 /** 425 * dfs_mlme_handle_dfs_scan_violation() - Handle scan start failure 426 * due to DFS violation (presence of NOL channel in scan channel list). 427 * @pdev: Pointer to pdev object. 428 */ 429 #if defined(WLAN_DFS_FULL_OFFLOAD) && defined(QCA_DFS_NOL_OFFLOAD) 430 void dfs_mlme_handle_dfs_scan_violation(struct wlan_objmgr_pdev *pdev); 431 #else 432 static inline 433 void dfs_mlme_handle_dfs_scan_violation(struct wlan_objmgr_pdev *pdev) 434 { 435 } 436 #endif 437 438 /** 439 * dfs_mlme_is_opmode_sta() - Check if pdev opmode is STA. 440 * @pdev: Pointer to DFS pdev object. 441 * 442 * Return: true if pdev opmode is STA, else false. 443 */ 444 bool dfs_mlme_is_opmode_sta(struct wlan_objmgr_pdev *pdev); 445 446 /** 447 * dfs_mlme_acquire_radar_mode_switch_lock() - Acquire lock for radar processing 448 * over mode switch handling. 449 * @pdev: Pointer to DFS pdev object. 450 * 451 * Return: void. 452 */ 453 void dfs_mlme_acquire_radar_mode_switch_lock(struct wlan_objmgr_pdev *pdev); 454 455 /** 456 * dfs_mlme_release_radar_mode_switch_lock() - Release lock taken for radar 457 * processing over mode switch handling. 458 * @pdev: Pointer to DFS pdev object. 459 * 460 * Return: void. 461 */ 462 void dfs_mlme_release_radar_mode_switch_lock(struct wlan_objmgr_pdev *pdev); 463 #endif /* _WLAN_DFS_MLME_API_H_ */ 464