1 /* 2 * Copyright (c) 2016-2019 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: This file has the DFS dispatcher API which is exposed to outside of DFS 22 * component. 23 */ 24 25 #ifndef _WLAN_DFS_UCFG_API_H_ 26 #define _WLAN_DFS_UCFG_API_H_ 27 28 #include <wlan_objmgr_psoc_obj.h> 29 #include <wlan_objmgr_pdev_obj.h> 30 31 /** 32 * struct dfs_to_mlme - These are MLME function pointer used by DFS component. 33 * @pdev_component_obj_attach: Attach DFS object to PDEV. 34 * @pdev_component_obj_detach: Detach DFS object from PDEV. 35 * @pdev_get_comp_private_obj: Get DFS object from PDEV. 36 * @dfs_start_rcsa: Send RCSA to RootAP. 37 * @mlme_mark_dfs: Calls dfs_action function. 38 * @mlme_start_csa: Sends CSA. 39 * @mlme_proc_cac: Process the CAC completion event. 40 * @mlme_deliver_event_up_after_cac: Send a CAC timeout, VAP up event to user 41 * space 42 * @mlme_get_dfs_ch_nchans: Get number of channels in the channel 43 * list. 44 * @mlme_get_extchan: Gets the extension channel. 45 * @mlme_set_no_chans_available: Sets no_chans_available flag. 46 * @mlme_ieee2mhz: Gets Channel freq from ieee number. 47 * @mlme_find_dot11_channel: Find dot11 channel. 48 * @mlme_get_dfs_ch_channels: Get the channel list. 49 * @mlme_dfs_ch_flags_ext: Gets channel extension flag. 50 * @mlme_channel_change_by_precac: Channel change triggered by PreCAC. 51 * @mlme_precac_chan_change_csa: Channel change triggered by PrCAC using 52 * Channel Switch Announcement. 53 * @mlme_nol_timeout_notification: NOL timeout notification. 54 * @mlme_clist_update: Updates the channel list. 55 * @mlme_is_opmode_sta: Check if pdev opmode is STA. 56 * @mlme_get_cac_timeout: Gets the CAC timeout. 57 * @mlme_rebuild_chan_list_with_non_dfs_channel: Rebuild channels with non-dfs 58 * channels. 59 * @mlme_restart_vaps_with_non_dfs_chan: Restart vaps with non-dfs channel. 60 * @mlme_check_allowed_prim_chanlist: Check whether the given channel is 61 * present in the primary allowed channel 62 * list or not. 63 * @mlme_update_scan_channel_list: Update the scan channel list sent to FW. 64 * @mlme_bringdown_vaps: Bringdown vaps if no chans is present. 65 */ 66 struct dfs_to_mlme { 67 QDF_STATUS (*pdev_component_obj_attach)(struct wlan_objmgr_pdev *pdev, 68 enum wlan_umac_comp_id id, 69 void *comp_priv_obj, 70 QDF_STATUS status); 71 QDF_STATUS (*pdev_component_obj_detach)(struct wlan_objmgr_pdev *pdev, 72 enum wlan_umac_comp_id id, 73 void *comp_priv_obj); 74 QDF_STATUS (*dfs_start_rcsa)(struct wlan_objmgr_pdev *pdev, 75 bool *wait_for_csa); 76 QDF_STATUS (*mlme_mark_dfs)(struct wlan_objmgr_pdev *pdev, 77 uint8_t ieee, 78 uint16_t freq, 79 uint8_t vhtop_ch_freq_seg2, 80 uint64_t flags); 81 QDF_STATUS (*mlme_start_csa)(struct wlan_objmgr_pdev *pdev, 82 uint8_t ieee_chan, uint16_t freq, 83 uint8_t cfreq2, uint64_t flags); 84 QDF_STATUS (*mlme_proc_cac)(struct wlan_objmgr_pdev *pdev); 85 QDF_STATUS (*mlme_deliver_event_up_after_cac)( 86 struct wlan_objmgr_pdev *pdev); 87 QDF_STATUS (*mlme_get_dfs_ch_nchans)(struct wlan_objmgr_pdev *pdev, 88 int *nchans); 89 QDF_STATUS (*mlme_get_extchan)(struct wlan_objmgr_pdev *pdev, 90 uint16_t *dfs_ch_freq, 91 uint64_t *dfs_ch_flags, 92 uint16_t *dfs_ch_flagext, 93 uint8_t *dfs_ch_ieee, 94 uint8_t *dfs_ch_vhtop_ch_freq_seg1, 95 uint8_t *dfs_ch_vhtop_ch_freq_seg2); 96 QDF_STATUS (*mlme_set_no_chans_available)(struct wlan_objmgr_pdev *pdev, 97 int val); 98 QDF_STATUS (*mlme_ieee2mhz)(struct wlan_objmgr_pdev *pdev, 99 int ieee, 100 uint64_t flag, 101 int *freq); 102 QDF_STATUS (*mlme_find_dot11_channel)(struct wlan_objmgr_pdev *pdev, 103 uint8_t ieee, 104 uint8_t des_cfreq2, 105 int mode, 106 uint16_t *dfs_ch_freq, 107 uint64_t *dfs_ch_flags, 108 uint16_t *dfs_ch_flagext, 109 uint8_t *dfs_ch_ieee, 110 uint8_t *dfs_ch_vhtop_ch_freq_seg1, 111 uint8_t *dfs_ch_vhtop_ch_freq_seg2); 112 113 QDF_STATUS (*mlme_get_dfs_ch_channels)(struct wlan_objmgr_pdev *pdev, 114 uint16_t *dfs_ch_freq, 115 uint64_t *dfs_ch_flags, 116 uint16_t *dfs_ch_flagext, 117 uint8_t *dfs_ch_ieee, 118 uint8_t *dfs_ch_vhtop_ch_freq_seg1, 119 uint8_t *dfs_ch_vhtop_ch_freq_seg2, 120 int index); 121 QDF_STATUS (*mlme_dfs_ch_flags_ext)(struct wlan_objmgr_pdev *pdev, 122 uint16_t *flag_ext); 123 QDF_STATUS (*mlme_channel_change_by_precac)( 124 struct wlan_objmgr_pdev *pdev); 125 #ifdef WLAN_DFS_PRECAC_AUTO_CHAN_SUPPORT 126 QDF_STATUS (*mlme_precac_chan_change_csa)(struct wlan_objmgr_pdev *pdev, 127 uint8_t des_chan, 128 enum wlan_phymode des_mode); 129 #endif 130 QDF_STATUS (*mlme_nol_timeout_notification)( 131 struct wlan_objmgr_pdev *pdev); 132 QDF_STATUS (*mlme_clist_update)(struct wlan_objmgr_pdev *pdev, 133 void *nollist, 134 int nentries); 135 bool (*mlme_is_opmode_sta)(struct wlan_objmgr_pdev *pdev); 136 QDF_STATUS (*mlme_get_cac_timeout)(struct wlan_objmgr_pdev *pdev, 137 uint16_t dfs_ch_freq, 138 uint8_t c_vhtop_ch_freq_seg2, 139 uint64_t dfs_ch_flags, 140 int *cac_timeout); 141 QDF_STATUS (*mlme_rebuild_chan_list_with_non_dfs_channels) 142 (struct wlan_objmgr_pdev *pdev); 143 QDF_STATUS (*mlme_restart_vaps_with_non_dfs_chan) 144 (struct wlan_objmgr_pdev *pdev, int no_chans_avail); 145 bool (*mlme_check_allowed_prim_chanlist) 146 (struct wlan_objmgr_pdev *pdev, uint32_t chan_num); 147 QDF_STATUS (*mlme_update_scan_channel_list) 148 (struct wlan_objmgr_pdev *pdev); 149 QDF_STATUS (*mlme_bringdown_vaps) 150 (struct wlan_objmgr_pdev *pdev); 151 }; 152 153 extern struct dfs_to_mlme global_dfs_to_mlme; 154 155 /** 156 * wlan_dfs_pdev_obj_create_notification() - DFS pdev object create handler. 157 * @pdev: Pointer to DFS pdev object. 158 */ 159 QDF_STATUS wlan_dfs_pdev_obj_create_notification(struct wlan_objmgr_pdev *pdev, 160 void *arg); 161 162 /** 163 * wlan_dfs_pdev_obj_destroy_notification() - DFS pdev object delete handler. 164 * @pdev: Pointer to DFS pdev object. 165 */ 166 QDF_STATUS wlan_dfs_pdev_obj_destroy_notification(struct wlan_objmgr_pdev *pdev, 167 void *arg); 168 169 /** 170 * ucfg_dfs_is_ap_cac_timer_running() - Returns the dfs cac timer. 171 * @pdev: Pointer to DFS pdev object. 172 * @is_ap_cac_timer_running: Pointer to save dfs_cac_timer_running value. 173 * 174 * Wrapper function for dfs_is_ap_cac_timer_running(). 175 * This function called from outside of dfs component. 176 */ 177 QDF_STATUS ucfg_dfs_is_ap_cac_timer_running(struct wlan_objmgr_pdev *pdev, 178 int *is_ap_cac_timer_running); 179 180 /** 181 * ucfg_dfs_getnol() - Wrapper function for dfs_get_nol() 182 * @pdev: Pointer to DFS pdev object. 183 * @dfs_nolinfo: Pointer to dfsreq_nolinfo structure. 184 * 185 * Wrapper function for dfs_getnol(). 186 * This function called from outside of dfs component. 187 */ 188 QDF_STATUS ucfg_dfs_getnol(struct wlan_objmgr_pdev *pdev, void *dfs_nolinfo); 189 190 /** 191 * ucfg_dfs_override_cac_timeout() - Override the default CAC timeout. 192 * @pdev: Pointer to DFS pdev object. 193 * @cac_timeout: CAC timeout value. 194 * 195 * Wrapper function for dfs_override_cac_timeout(). 196 * This function called from outside of dfs component. 197 */ 198 QDF_STATUS ucfg_dfs_override_cac_timeout(struct wlan_objmgr_pdev *pdev, 199 int cac_timeout, int *status); 200 201 /** 202 * ucfg_dfs_get_override_cac_timeout() - Get override CAC timeout value. 203 * @pdev: Pointer to DFS pdev object. 204 * @cac_timeout: Pointer to save the CAC timeout value. 205 * 206 * Wrapper function for dfs_get_override_cac_timeout(). 207 * This function called from outside of dfs component. 208 */ 209 QDF_STATUS ucfg_dfs_get_override_cac_timeout(struct wlan_objmgr_pdev *pdev, 210 int *cac_timeout, int *status); 211 212 /** 213 * ucfg_dfs_get_override_precac_timeout() - Get precac timeout. 214 * @pdev: Pointer to DFS pdev object. 215 * @precac_timeout: Get precac timeout value in this variable. 216 * 217 * Wrapper function for dfs_get_override_precac_timeout(). 218 * This function called from outside of dfs component. 219 */ 220 QDF_STATUS ucfg_dfs_get_override_precac_timeout(struct wlan_objmgr_pdev *pdev, 221 int *precac_timeout); 222 223 /** 224 * ucfg_dfs_override_precac_timeout() - Override the default precac timeout. 225 * @pdev: Pointer to DFS pdev object. 226 * @precac_timeout: Precac timeout value. 227 * 228 * Wrapper function for dfs_override_precac_timeout(). 229 * This function called from outside of dfs component. 230 */ 231 QDF_STATUS ucfg_dfs_override_precac_timeout(struct wlan_objmgr_pdev *pdev, 232 int precac_timeout); 233 234 /** 235 * ucfg_dfs_set_precac_enable() - Set precac enable flag. 236 * @pdev: Pointer to DFS pdev object. 237 * @value: input value for dfs_precac_enable flag. 238 * 239 * Wrapper function for dfs_set_precac_enable(). 240 * This function called from outside of dfs component. 241 */ 242 QDF_STATUS ucfg_dfs_set_precac_enable(struct wlan_objmgr_pdev *pdev, 243 uint32_t value); 244 245 /** 246 * ucfg_dfs_get_precac_enable() - Get precac enable flag. 247 * @pdev: Pointer to DFS pdev object. 248 * @buff: Pointer to save precac_enable value. 249 * 250 * Wrapper function for dfs_get_precac_enable(). 251 * This function called from outside of dfs component. 252 */ 253 QDF_STATUS ucfg_dfs_get_precac_enable(struct wlan_objmgr_pdev *pdev, int *buff); 254 255 #ifdef WLAN_DFS_PRECAC_AUTO_CHAN_SUPPORT 256 /** 257 * ucfg_dfs_set_precac_intermediate_chan() - Set intermediate channel 258 * for preCAC. 259 * @pdev: Pointer to DFS pdev object. 260 * @value: Channel number of intermediate channel 261 * 262 * Wrapper function for dfs_set_precac_intermediate_chan(). 263 * This function is called from outside of dfs component. 264 * 265 * Return: 266 * * QDF_STATUS_SUCCESS : Successfully set intermediate channel. 267 * * QDF_STATUS_E_FAILURE: Failed to set intermediate channel. 268 */ 269 QDF_STATUS ucfg_dfs_set_precac_intermediate_chan(struct wlan_objmgr_pdev *pdev, 270 uint32_t value); 271 272 /** 273 * ucfg_dfs_get_precac_intermediate_chan() - Get intermediate channel 274 * for preCAC. 275 * @pdev: Pointer to DFS pdev object. 276 * @buff: Pointer to Channel number of intermediate channel. 277 * 278 * Wrapper function for dfs_get_precac_intermediate_chan(). 279 * This function is called from outside of dfs component. 280 * 281 * Return: Configured intermediate precac channel. 282 */ 283 QDF_STATUS ucfg_dfs_get_precac_intermediate_chan(struct wlan_objmgr_pdev *pdev, 284 int *buff); 285 286 /** 287 * ucfg_dfs_get_precac_chan_state() - Get precac status for the given channel. 288 * @pdev: Pointer to DFS pdev object. 289 * @precac_chan: Channel number for which precac state needs to be determined. 290 * 291 * Wrapper function for dfs_get_precac_chan_state(). 292 * This function called from outside of dfs component. 293 * 294 * Return: Precac state of the given channel. 295 */ 296 enum precac_chan_state 297 ucfg_dfs_get_precac_chan_state(struct wlan_objmgr_pdev *pdev, 298 uint8_t precac_chan); 299 #endif 300 301 #ifdef QCA_MCL_DFS_SUPPORT 302 /** 303 * ucfg_dfs_update_config() - Update DFS user config. 304 * @psoc: Pointer to psoc. 305 * @req: DFS user config. 306 * 307 * Return: QDF_STATUS 308 */ 309 QDF_STATUS ucfg_dfs_update_config(struct wlan_objmgr_psoc *psoc, 310 struct dfs_user_config *req); 311 #else 312 static inline QDF_STATUS ucfg_dfs_update_config(struct wlan_objmgr_psoc *psoc, 313 struct dfs_user_config *req) 314 { 315 return QDF_STATUS_SUCCESS; 316 } 317 #endif 318 319 /** 320 * ucfg_dfs_set_override_status_timeout() - override the value of host dfs 321 * status wait timeout. 322 * @pdev: Pointer to DFS pdev object. 323 * @status_timeout: timeout value. 324 * 325 * Wrapper function for dfs_set_override_status_timeout(). 326 * This function called from outside of dfs component. 327 * 328 * Return: QDF_STATUS 329 */ 330 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST) 331 QDF_STATUS ucfg_dfs_set_override_status_timeout(struct wlan_objmgr_pdev *pdev, 332 int status_timeout); 333 #else 334 static inline 335 QDF_STATUS ucfg_dfs_set_override_status_timeout(struct wlan_objmgr_pdev *pdev, 336 int status_timeout) 337 { 338 return QDF_STATUS_SUCCESS; 339 } 340 #endif 341 342 /** 343 * ucfg_dfs_get_override_status_timeout() - Get the value of host dfs status 344 * wait timeout. 345 * @pdev: Pointer to DFS pdev object. 346 * @status_timeout: Pointer to save the timeout value. 347 * 348 * Wrapper function for dfs_get_override_status_timeout(). 349 * This function called from outside of dfs component. 350 * 351 * Return: QDF_STATUS 352 */ 353 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST) 354 QDF_STATUS ucfg_dfs_get_override_status_timeout(struct wlan_objmgr_pdev *pdev, 355 int *status_timeout); 356 #else 357 static inline 358 QDF_STATUS ucfg_dfs_get_override_status_timeout(struct wlan_objmgr_pdev *pdev, 359 int *status_timeout) 360 { 361 return QDF_STATUS_SUCCESS; 362 } 363 #endif 364 365 /** 366 * ucfg_dfs_set_nol_subchannel_marking() - Set or unset NOL subchannel marking. 367 * @pdev: Pointer to DFS pdev object. 368 * @nol_subchannel_marking: Set NOL subchannel marking based on this value. 369 * 370 * Wrapper function for dfs_set_nol_subchannel_marking(). 371 * This function is called from outside of dfs component. 372 * 373 * Return: QDF_STATUS 374 */ 375 QDF_STATUS ucfg_dfs_set_nol_subchannel_marking(struct wlan_objmgr_pdev *pdev, 376 bool nol_subchannel_marking); 377 378 /** 379 * ucfg_dfs_get_nol_subchannel_marking() - Get the value of NOL subchannel 380 * marking. 381 * @pdev: Pointer to DFS pdev object. 382 * @nol_subchannel_marking: Store the value of NOL subchannel marking. 383 * 384 * Wrapper function for dfs_get_nol_subchannel_marking(). 385 * This function is called from outside of dfs component. 386 * 387 * Return: QDF_STATUS 388 */ 389 QDF_STATUS ucfg_dfs_get_nol_subchannel_marking(struct wlan_objmgr_pdev *pdev, 390 bool *nol_subchannel_marking); 391 #endif /* _WLAN_DFS_UCFG_API_H_ */ 392