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