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