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: 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 void dfs_mlme_mark_dfs(struct wlan_objmgr_pdev *pdev, 48 uint8_t ieee, 49 uint16_t freq, 50 uint8_t vhtop_ch_freq_seg2, 51 uint64_t flags); 52 53 /** 54 * dfs_mlme_start_csa() - Sends CSA in ieeeChan 55 * @pdev: Pointer to DFS pdev object. 56 * @ieee_chan: Channel number. 57 * @freq: Channel frequency. 58 * @cfreq2: HT80 cfreq2. 59 * @flags: channel flags. 60 */ 61 void dfs_mlme_start_csa(struct wlan_objmgr_pdev *pdev, 62 uint8_t ieee_chan, 63 uint16_t freq, 64 uint8_t cfreq2, 65 uint64_t flags); 66 67 /** 68 * dfs_mlme_proc_cac() - Process the CAC completion event. 69 * @pdev: Pointer to DFS pdev object. 70 * @vdev_id: vdev id. 71 */ 72 void dfs_mlme_proc_cac(struct wlan_objmgr_pdev *pdev, uint32_t vdev_id); 73 74 /** 75 * dfs_mlme_deliver_event_up_after_cac() - Send a CAC timeout, VAP up event to 76 * userspace. 77 * @pdev: Pointer to DFS pdev object. 78 */ 79 void dfs_mlme_deliver_event_up_after_cac(struct wlan_objmgr_pdev *pdev); 80 81 /** 82 * dfs_mlme_get_dfs_ch_nchans() - Get number of channels in the channel list 83 * @pdev: Pointer to DFS pdev object. 84 * @nchans: Pointer to save the channel number. 85 */ 86 void dfs_mlme_get_dfs_ch_nchans(struct wlan_objmgr_pdev *pdev, int *nchans); 87 88 /** 89 * dfs_mlme_get_extchan() - Get extension channel. 90 * @pdev: Pointer to DFS pdev object. 91 * @dfs_ch_freq: Frequency in Mhz. 92 * @dfs_ch_flags: Channel flags. 93 * @dfs_ch_flagext: Extended channel flags. 94 * @dfs_ch_ieee: IEEE channel number. 95 * @dfs_ch_vhtop_ch_freq_seg1: Channel Center frequency. 96 * @dfs_ch_vhtop_ch_freq_seg2: Channel Center frequency applicable for 80+80MHz 97 * mode of operation. 98 */ 99 QDF_STATUS dfs_mlme_get_extchan(struct wlan_objmgr_pdev *pdev, 100 uint16_t *dfs_ch_freq, 101 uint64_t *dfs_ch_flags, 102 uint16_t *dfs_ch_flagext, 103 uint8_t *dfs_ch_ieee, 104 uint8_t *dfs_ch_vhtop_ch_freq_seg1, 105 uint8_t *dfs_ch_vhtop_ch_freq_seg2); 106 107 /** 108 * dfs_mlme_set_no_chans_available() - Set no_chans_available flag. 109 * @pdev: Pointer to DFS pdev object. 110 * @val: Set this value to no_chans_available flag. 111 */ 112 void dfs_mlme_set_no_chans_available(struct wlan_objmgr_pdev *pdev, 113 int val); 114 115 /** 116 * dfs_mlme_ieee2mhz() - Get the frequency from channel number. 117 * @pdev: Pointer to DFS pdev object. 118 * @ieee: Channel number. 119 * @flag: Channel flag. 120 */ 121 int dfs_mlme_ieee2mhz(struct wlan_objmgr_pdev *pdev, 122 int ieee, 123 uint64_t flag); 124 125 /** 126 * dfs_mlme_find_dot11_channel() - Get dot11 channel from ieee, cfreq2 and mode. 127 * @pdev: Pointer to DFS pdev object. 128 * @ieee: Channel number. 129 * @des_cfreq2: cfreq2 130 * @mode: Phymode 131 * @dfs_ch_freq: Frequency in Mhz. 132 * @dfs_ch_flags: Channel flags. 133 * @dfs_ch_flagext: Extended channel flags. 134 * @dfs_ch_ieee: IEEE channel number. 135 * @dfs_ch_vhtop_ch_freq_seg1: Channel Center frequency. 136 * @dfs_ch_vhtop_ch_freq_seg2: Channel Center frequency applicable for 80+80MHz 137 * mode of operation. 138 * 139 * Return: 140 * * QDF_STATUS_SUCCESS : Channel found. 141 * * QDF_STATUS_E_FAILURE: Channel not found. 142 */ 143 QDF_STATUS 144 dfs_mlme_find_dot11_channel(struct wlan_objmgr_pdev *pdev, 145 uint8_t ieee, 146 uint8_t des_cfreq2, 147 int mode, 148 uint16_t *dfs_ch_freq, 149 uint64_t *dfs_ch_flags, 150 uint16_t *dfs_ch_flagext, 151 uint8_t *dfs_ch_ieee, 152 uint8_t *dfs_ch_vhtop_ch_freq_seg1, 153 uint8_t *dfs_ch_vhtop_ch_freq_seg2); 154 155 /** 156 * dfs_mlme_get_dfs_ch_channels() - Get channel from channel list. 157 * @pdev: Pointer to DFS pdev object. 158 * @dfs_ch_freq: Frequency in Mhz. 159 * @dfs_ch_flags: Channel flags. 160 * @dfs_ch_flagext: Extended channel flags. 161 * @dfs_ch_ieee: IEEE channel number. 162 * @dfs_ch_vhtop_ch_freq_seg1: Channel Center frequency. 163 * @dfs_ch_vhtop_ch_freq_seg2: Channel Center frequency applicable for 80+80MHz 164 * mode of operation. 165 * @index: Index into channel list. 166 */ 167 void dfs_mlme_get_dfs_ch_channels(struct wlan_objmgr_pdev *pdev, 168 uint16_t *dfs_ch_freq, 169 uint64_t *dfs_ch_flags, 170 uint16_t *dfs_ch_flagext, 171 uint8_t *dfs_ch_ieee, 172 uint8_t *dfs_ch_vhtop_ch_freq_seg1, 173 uint8_t *dfs_ch_vhtop_ch_freq_seg2, 174 int index); 175 176 /** 177 * dfs_mlme_dfs_ch_flags_ext() - Get extension channel flags. 178 * @pdev: Pointer to DFS pdev object. 179 */ 180 uint32_t dfs_mlme_dfs_ch_flags_ext(struct wlan_objmgr_pdev *pdev); 181 182 /** 183 * dfs_mlme_channel_change_by_precac() - Channel change by PreCAC. 184 * @pdev: Pointer to DFS pdev object. 185 */ 186 void dfs_mlme_channel_change_by_precac(struct wlan_objmgr_pdev *pdev); 187 188 /** 189 * dfs_mlme_nol_timeout_notification() - NOL timeout notification to userspace. 190 * @pdev: Pointer to DFS pdev object. 191 */ 192 void dfs_mlme_nol_timeout_notification(struct wlan_objmgr_pdev *pdev); 193 194 /** 195 * dfs_mlme_clist_update() - Mark the channel as RADAR. 196 * @pdev: Pointer to DFS pdev object. 197 * @nollist: Pointer to NOL list. 198 * @nentries: Number of channels in the NOL list. 199 */ 200 void dfs_mlme_clist_update(struct wlan_objmgr_pdev *pdev, 201 void *nollist, 202 int nentries); 203 204 /** 205 * dfs_mlme_get_cac_timeout() - Get cac_timeout. 206 * @pdev: Pointer to DFS pdev object. 207 * @dfs_ch_freq: Frequency in Mhz. 208 * @dfs_ch_vhtop_ch_freq_seg2: Channel Center frequency applicable for 80+80MHz 209 * mode of operation. 210 * @dfs_ch_flags: Channel flags. 211 */ 212 int dfs_mlme_get_cac_timeout(struct wlan_objmgr_pdev *pdev, 213 uint16_t dfs_ch_freq, 214 uint8_t dfs_ch_vhtop_ch_freq_seg2, 215 uint64_t dfs_ch_flags); 216 217 /** 218 * dfs_mlme_rebuild_chan_list_with_non_dfs_channels() - Rebuild the channel list 219 * with only non DFS channels. 220 * @pdev: Pointer to DFS pdev object. 221 * 222 * return: On success return 1 or 0, else failure. 223 */ 224 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST) 225 int dfs_mlme_rebuild_chan_list_with_non_dfs_channels( 226 struct wlan_objmgr_pdev *pdev); 227 #else 228 static inline int dfs_mlme_rebuild_chan_list_with_non_dfs_channels( 229 struct wlan_objmgr_pdev *pdev) 230 { 231 return 0; 232 } 233 #endif 234 235 /** 236 * dfs_mlme_restart_vaps_with_non_dfs_chan() - Restart vaps with non DFS 237 * channels 238 * @pdev: Pointer to DFS pdev object. 239 * @no_chans_avail: Indicates if no channel is available. 240 */ 241 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST) 242 void dfs_mlme_restart_vaps_with_non_dfs_chan(struct wlan_objmgr_pdev *pdev, 243 int no_chans_avail); 244 #else 245 static inline 246 void dfs_mlme_restart_vaps_with_non_dfs_chan(struct wlan_objmgr_pdev *pdev, 247 int no_chans_avail) 248 { 249 } 250 #endif 251 252 /** 253 * dfs_mlme_check_allowed_prim_chanlist() - Check whether the given channel is 254 * present in the primary allowed channel list or not 255 * @pdev: Pointer to DFS pdev object. 256 * @chan_num: Channel number 257 */ 258 #if defined(WLAN_SUPPORT_PRIMARY_ALLOWED_CHAN) 259 bool dfs_mlme_check_allowed_prim_chanlist(struct wlan_objmgr_pdev *pdev, 260 uint32_t chan_num); 261 262 #else 263 static inline 264 bool dfs_mlme_check_allowed_prim_chanlist(struct wlan_objmgr_pdev *pdev, 265 uint32_t chan_num) 266 { 267 return true; 268 } 269 #endif 270 271 /** 272 * dfs_mlme_handle_dfs_scan_violation() - Handle scan start failure 273 * due to DFS violation (presence of NOL channel in scan channel list). 274 * @pdev: Pointer to pdev object. 275 */ 276 #if defined(WLAN_DFS_FULL_OFFLOAD) && defined(QCA_DFS_NOL_OFFLOAD) 277 void dfs_mlme_handle_dfs_scan_violation(struct wlan_objmgr_pdev *pdev); 278 #else 279 static inline 280 void dfs_mlme_handle_dfs_scan_violation(struct wlan_objmgr_pdev *pdev) 281 { 282 } 283 #endif 284 285 /** 286 * dfs_mlme_is_opmode_sta() - Check if pdev opmode is STA. 287 * @pdev: Pointer to DFS pdev object. 288 * 289 * Return: true if pdev opmode is STA, else false. 290 */ 291 bool dfs_mlme_is_opmode_sta(struct wlan_objmgr_pdev *pdev); 292 #endif /* _WLAN_DFS_MLME_API_H_ */ 293