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