1 /* 2 * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved. 3 * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. 4 * 5 * 6 * Permission to use, copy, modify, and/or distribute this software for 7 * any purpose with or without fee is hereby granted, provided that the 8 * above copyright notice and this permission notice appear in all 9 * copies. 10 * 11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL 12 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED 13 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE 14 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 15 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 16 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 17 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 18 * PERFORMANCE OF THIS SOFTWARE. 19 */ 20 21 /** 22 * DOC: These APIs are used by DFS core functions to call mlme functions. 23 */ 24 25 #ifndef _WLAN_DFS_MLME_API_H_ 26 #define _WLAN_DFS_MLME_API_H_ 27 28 #include "wlan_dfs_ucfg_api.h" 29 30 extern struct dfs_to_mlme global_dfs_to_mlme; 31 32 /** 33 * dfs_mlme_start_rcsa() - Send RCSA to RootAP. 34 * @pdev: Pointer to DFS pdev object. 35 * @wait_for_csa: Wait for CSA from RootAP. 36 */ 37 #if defined(QCA_DFS_RCSA_SUPPORT) 38 void dfs_mlme_start_rcsa(struct wlan_objmgr_pdev *pdev, 39 bool *wait_for_csa); 40 #endif 41 42 /** 43 * dfs_mlme_mark_dfs() - Mark the channel in the channel list. 44 * @pdev: Pointer to DFS pdev object. 45 * @ieee: Channel number. 46 * @freq: Channel frequency. 47 * @vhtop_ch_freq_seg2: VHT80 Cfreq2. 48 * @flags: channel flags. 49 * @dfs_radar_bitmap: Radar bitmap. 50 */ 51 void dfs_mlme_mark_dfs(struct wlan_objmgr_pdev *pdev, 52 uint8_t ieee, 53 uint16_t freq, 54 uint16_t vhtop_ch_freq_seg2, 55 uint64_t flags, 56 uint16_t dfs_radar_bitmap); 57 58 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST) 59 /** 60 * dfs_mlme_proc_spoof_success() - Process Spoof Completion status 61 * @pdev: Pointer to DFS pdev object. 62 */ 63 void dfs_mlme_proc_spoof_success(struct wlan_objmgr_pdev *pdev); 64 #else 65 static inline void 66 dfs_mlme_proc_spoof_success(struct wlan_objmgr_pdev *pdev) 67 { 68 } 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_mhz: 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_extchan_for_freq() - Get extension channel. 102 * @pdev: Pointer to DFS pdev object. 103 * @dfs_chan_freq: Frequency in Mhz. 104 * @dfs_chan_flags: Channel flags. 105 * @dfs_chan_flagext: Extended channel flags. 106 * @dfs_chan_ieee: IEEE channel number. 107 * @dfs_chan_vhtop_ch_freq_seg1: Channel Center IEEE. 108 * @dfs_chan_vhtop_ch_freq_seg2: Channel Center IEEE applicable for 80+80MHz 109 * mode of operation. 110 * @dfs_chan_mhz_freq_seg1: Primary channel center freq. 111 * @dfs_chan_mhz_freq_seg2: Secondary channel center freq applicable for 112 * 80+80 MHZ. 113 */ 114 115 #ifdef CONFIG_CHAN_FREQ_API 116 QDF_STATUS dfs_mlme_get_extchan_for_freq(struct wlan_objmgr_pdev *pdev, 117 uint16_t *dfs_chan_freq, 118 uint64_t *dfs_chan_flags, 119 uint16_t *dfs_chan_flagext, 120 uint8_t *dfs_chan_ieee, 121 uint8_t *dfs_chan_vhtop_ch_freq_seg1, 122 uint8_t *dfs_chan_vhtop_ch_freq_seg2, 123 uint16_t *dfs_chan_mhz_freq_seg1, 124 uint16_t *dfs_chan_mhz_freq_seg2); 125 #endif 126 127 /** 128 * dfs_mlme_set_no_chans_available() - Set no_chans_available flag. 129 * @pdev: Pointer to DFS pdev object. 130 * @val: Set this value to no_chans_available flag. 131 */ 132 void dfs_mlme_set_no_chans_available(struct wlan_objmgr_pdev *pdev, 133 int val); 134 135 /** 136 * dfs_mlme_ieee2mhz() - Get the frequency from channel number. 137 * @pdev: Pointer to DFS pdev object. 138 * @ieee: Channel number. 139 * @flag: Channel flag. 140 */ 141 int dfs_mlme_ieee2mhz(struct wlan_objmgr_pdev *pdev, 142 int ieee, 143 uint64_t flag); 144 145 /** 146 * dfs_mlme_find_dot11_chan_for_freq() - Find a channel pointer given the mode, 147 * frequency and channel flags. 148 * @pdev: Pointer to DFS pdev object. 149 * @chan_freq: Channel frequency. 150 * @des_cfreq2_mhz: cfreq2 in MHz. 151 * @mode: Phymode 152 * @dfs_chan_freq: Frequency in MHz. 153 * @dfs_chan_flags: Channel flags. 154 * @dfs_chan_flagext: Extended channel flags. 155 * @dfs_chan_ieee: IEEE channel number. 156 * @dfs_chan_vhtop_ch_freq_seg1: Channel Center IEEE for primary 80 segment. 157 * @dfs_chan_vhtop_ch_freq_seg2: Channel Center frequency applicable for 158 * 80+80 MHz mode of operation. 159 * @dfs_chan_mhz_freq_seg1: Channel center frequency of primary 80 segment. 160 * @dfs_chan_mhz_freq_seg2: Channel center frequency for secondary 80 161 * segment applicable only for 80+80 MHz mode of 162 * operation. 163 * 164 * Return: 165 * * QDF_STATUS_SUCCESS : Channel found. 166 * * QDF_STATUS_E_FAILURE: Channel not found. 167 */ 168 #ifdef CONFIG_CHAN_FREQ_API 169 QDF_STATUS 170 dfs_mlme_find_dot11_chan_for_freq(struct wlan_objmgr_pdev *pdev, 171 uint16_t chan_freq, 172 uint16_t des_cfreq2_mhz, 173 int mode, 174 uint16_t *dfs_chan_freq, 175 uint64_t *dfs_chan_flags, 176 uint16_t *dfs_chan_flagext, 177 uint8_t *dfs_chan_ieee, 178 uint8_t *dfs_chan_vhtop_ch_freq_seg1, 179 uint8_t *dfs_chan_vhtop_ch_freq_seg2, 180 uint16_t *dfs_chan_mhz_freq_seg1, 181 uint16_t *dfs_chan_mhz_freq_seg2); 182 #endif 183 184 /** 185 * dfs_mlme_get_dfs_channels_for_freq() - Get DFS channel from channel list. 186 * @pdev: Pointer to DFS pdev object. 187 * @dfs_chan_freq: Frequency in Mhz. 188 * @dfs_chan_flags: Channel flags. 189 * @dfs_chan_flagext: Extended channel flags. 190 * @dfs_chan_ieee: IEEE channel number. 191 * @dfs_chan_vhtop_ch_freq_seg1: Channel Center IEEE number. 192 * @dfs_chan_vhtop_ch_freq_seg2: Channel Center IEEE applicable for 80+80MHz 193 * mode of operation. 194 * @dfs_chan_mhz_freq_seg1 : Primary 80 Channel Center frequency. 195 * @dfs_chan_mhz_freq_seg2 : Channel center frequency applicable only for 196 * 80+80 mode of operation. 197 * @index: Index into channel list. 198 */ 199 #ifdef CONFIG_CHAN_FREQ_API 200 void 201 dfs_mlme_get_dfs_channels_for_freq(struct wlan_objmgr_pdev *pdev, 202 uint16_t *dfs_chan_freq, 203 uint64_t *dfs_chan_flags, 204 uint16_t *dfs_chan_flagext, 205 uint8_t *dfs_chan_ieee, 206 uint8_t *dfs_chan_vhtop_ch_freq_seg1, 207 uint8_t *dfs_chan_vhtop_ch_freq_seg2, 208 uint16_t *dfs_chan_mhz_freq_seg1, 209 uint16_t *dfs_chan_mhz_freq_seg2, 210 int index); 211 #endif 212 213 /** 214 * dfs_mlme_dfs_ch_flags_ext() - Get extension channel flags. 215 * @pdev: Pointer to DFS pdev object. 216 */ 217 uint32_t dfs_mlme_dfs_ch_flags_ext(struct wlan_objmgr_pdev *pdev); 218 219 /** 220 * dfs_mlme_channel_change_by_precac() - Channel change by PreCAC. 221 * @pdev: Pointer to DFS pdev object. 222 */ 223 void dfs_mlme_channel_change_by_precac(struct wlan_objmgr_pdev *pdev); 224 225 /** 226 * dfs_mlme_nol_timeout_notification() - NOL timeout notification to userspace. 227 * @pdev: Pointer to DFS pdev object. 228 */ 229 void dfs_mlme_nol_timeout_notification(struct wlan_objmgr_pdev *pdev); 230 231 /** 232 * dfs_mlme_set_tx_flag() - Set the Vap flag to block Tx on Radar detection. 233 * @pdev: Pointer to DFS pdev object. 234 * @is_tx_allowed: Flag value to be set. 235 * True indicate data Tx is allowed 236 * False indicate data Tx is blocked; 237 */ 238 void dfs_mlme_set_tx_flag(struct wlan_objmgr_pdev *pdev, bool is_tx_allowed); 239 240 /** 241 * dfs_mlme_clist_update() - Mark the channel as RADAR. 242 * @pdev: Pointer to DFS pdev object. 243 * @nollist: Pointer to NOL list. 244 * @nentries: Number of channels in the NOL list. 245 */ 246 void dfs_mlme_clist_update(struct wlan_objmgr_pdev *pdev, 247 void *nollist, 248 int nentries); 249 250 /** 251 * dfs_mlme_get_cac_timeout_for_freq() - Get cac_timeout. 252 * @pdev: Pointer to DFS pdev object. 253 * @dfs_chan_freq: Frequency in MHz. 254 * @dfs_chan_vhtop_freq_seg2_mhz: Channel Center frequency applicable for 255 * 80+80 MHz mode of operation. 256 * @dfs_chan_flags: Channel flags. 257 */ 258 #ifdef CONFIG_CHAN_FREQ_API 259 int dfs_mlme_get_cac_timeout_for_freq(struct wlan_objmgr_pdev *pdev, 260 uint16_t dfs_chan_freq, 261 uint16_t dfs_chan_vhtop_freq_seg2_mhz, 262 uint64_t dfs_chan_flags); 263 #endif 264 /** 265 * dfs_mlme_rebuild_chan_list_with_non_dfs_channels() - Rebuild the channel list 266 * with only non DFS channels. 267 * @pdev: Pointer to DFS pdev object. 268 * 269 * return: On success return 1 or 0, else failure. 270 */ 271 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST) 272 int dfs_mlme_rebuild_chan_list_with_non_dfs_channels( 273 struct wlan_objmgr_pdev *pdev); 274 #else 275 static inline int dfs_mlme_rebuild_chan_list_with_non_dfs_channels( 276 struct wlan_objmgr_pdev *pdev) 277 { 278 return 0; 279 } 280 #endif 281 282 /** 283 * dfs_mlme_restart_vaps_with_non_dfs_chan() - Restart vaps with non DFS 284 * channels 285 * @pdev: Pointer to DFS pdev object. 286 * @no_chans_avail: Indicates if no channel is available. 287 */ 288 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST) 289 void dfs_mlme_restart_vaps_with_non_dfs_chan(struct wlan_objmgr_pdev *pdev, 290 int no_chans_avail); 291 #else 292 static inline 293 void dfs_mlme_restart_vaps_with_non_dfs_chan(struct wlan_objmgr_pdev *pdev, 294 int no_chans_avail) 295 { 296 } 297 #endif 298 299 /** 300 * dfs_mlme_check_allowed_prim_chanlist() - Check whether the given channel is 301 * present in the primary allowed channel list or not 302 * @pdev: Pointer to DFS pdev object. 303 * @chan_freq: Channel frequency 304 */ 305 #if defined(WLAN_SUPPORT_PRIMARY_ALLOWED_CHAN) 306 bool dfs_mlme_check_allowed_prim_chanlist(struct wlan_objmgr_pdev *pdev, 307 uint32_t chan_freq); 308 309 #else 310 static inline 311 bool dfs_mlme_check_allowed_prim_chanlist(struct wlan_objmgr_pdev *pdev, 312 uint32_t chan_freq) 313 { 314 return true; 315 } 316 #endif 317 318 /** 319 * dfs_mlme_handle_dfs_scan_violation() - Handle scan start failure 320 * due to DFS violation (presence of NOL channel in scan channel list). 321 * @pdev: Pointer to pdev object. 322 */ 323 #if defined(WLAN_DFS_FULL_OFFLOAD) && defined(QCA_DFS_NOL_OFFLOAD) 324 void dfs_mlme_handle_dfs_scan_violation(struct wlan_objmgr_pdev *pdev); 325 #else 326 static inline 327 void dfs_mlme_handle_dfs_scan_violation(struct wlan_objmgr_pdev *pdev) 328 { 329 } 330 #endif 331 332 /** 333 * dfs_mlme_is_opmode_sta() - Check if pdev opmode is STA. 334 * @pdev: Pointer to DFS pdev object. 335 * 336 * Return: true if pdev opmode is STA, else false. 337 */ 338 bool dfs_mlme_is_opmode_sta(struct wlan_objmgr_pdev *pdev); 339 340 /** 341 * dfs_mlme_is_inter_band_chan_switch_allowed() - Check if inter-band channel 342 * switch is allowed. 343 * @pdev: Pointer to DFS pdev object. 344 * 345 * Return: true if inter-band channel switch is allowed. 346 */ 347 bool dfs_mlme_is_inter_band_chan_switch_allowed(struct wlan_objmgr_pdev *pdev); 348 349 /** 350 * dfs_mlme_acquire_radar_mode_switch_lock() - Acquire lock for radar processing 351 * over mode switch handling. 352 * @pdev: Pointer to DFS pdev object. 353 * 354 * Return: void. 355 */ 356 #ifdef QCA_HW_MODE_SWITCH 357 void dfs_mlme_acquire_radar_mode_switch_lock(struct wlan_objmgr_pdev *pdev); 358 #else 359 static inline 360 void dfs_mlme_acquire_radar_mode_switch_lock(struct wlan_objmgr_pdev *pdev) 361 { 362 } 363 #endif 364 365 /** 366 * dfs_mlme_release_radar_mode_switch_lock() - Release lock taken for radar 367 * processing over mode switch handling. 368 * @pdev: Pointer to DFS pdev object. 369 * 370 * Return: void. 371 */ 372 #ifdef QCA_HW_MODE_SWITCH 373 void dfs_mlme_release_radar_mode_switch_lock(struct wlan_objmgr_pdev *pdev); 374 #else 375 static inline 376 void dfs_mlme_release_radar_mode_switch_lock(struct wlan_objmgr_pdev *pdev) 377 { 378 } 379 #endif 380 #endif /* _WLAN_DFS_MLME_API_H_ */ 381