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: 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 ch_ieee); 128 #endif 129 QDF_STATUS (*mlme_nol_timeout_notification)( 130 struct wlan_objmgr_pdev *pdev); 131 QDF_STATUS (*mlme_clist_update)(struct wlan_objmgr_pdev *pdev, 132 void *nollist, 133 int nentries); 134 bool (*mlme_is_opmode_sta)(struct wlan_objmgr_pdev *pdev); 135 QDF_STATUS (*mlme_get_cac_timeout)(struct wlan_objmgr_pdev *pdev, 136 uint16_t dfs_ch_freq, 137 uint8_t c_vhtop_ch_freq_seg2, 138 uint64_t dfs_ch_flags, 139 int *cac_timeout); 140 QDF_STATUS (*mlme_rebuild_chan_list_with_non_dfs_channels) 141 (struct wlan_objmgr_pdev *pdev); 142 QDF_STATUS (*mlme_restart_vaps_with_non_dfs_chan) 143 (struct wlan_objmgr_pdev *pdev, int no_chans_avail); 144 bool (*mlme_check_allowed_prim_chanlist) 145 (struct wlan_objmgr_pdev *pdev, uint32_t chan_num); 146 QDF_STATUS (*mlme_update_scan_channel_list) 147 (struct wlan_objmgr_pdev *pdev); 148 QDF_STATUS (*mlme_bringdown_vaps) 149 (struct wlan_objmgr_pdev *pdev); 150 }; 151 152 extern struct dfs_to_mlme global_dfs_to_mlme; 153 154 /** 155 * wlan_dfs_pdev_obj_create_notification() - DFS pdev object create handler. 156 * @pdev: Pointer to DFS pdev object. 157 */ 158 QDF_STATUS wlan_dfs_pdev_obj_create_notification(struct wlan_objmgr_pdev *pdev, 159 void *arg); 160 161 /** 162 * wlan_dfs_pdev_obj_destroy_notification() - DFS pdev object delete handler. 163 * @pdev: Pointer to DFS pdev object. 164 */ 165 QDF_STATUS wlan_dfs_pdev_obj_destroy_notification(struct wlan_objmgr_pdev *pdev, 166 void *arg); 167 168 /** 169 * ucfg_dfs_is_ap_cac_timer_running() - Returns the dfs cac timer. 170 * @pdev: Pointer to DFS pdev object. 171 * @is_ap_cac_timer_running: Pointer to save dfs_cac_timer_running value. 172 * 173 * Wrapper function for dfs_is_ap_cac_timer_running(). 174 * This function called from outside of dfs component. 175 */ 176 QDF_STATUS ucfg_dfs_is_ap_cac_timer_running(struct wlan_objmgr_pdev *pdev, 177 int *is_ap_cac_timer_running); 178 179 /** 180 * ucfg_dfs_getnol() - Wrapper function for dfs_get_nol() 181 * @pdev: Pointer to DFS pdev object. 182 * @dfs_nolinfo: Pointer to dfsreq_nolinfo structure. 183 * 184 * Wrapper function for dfs_getnol(). 185 * This function called from outside of dfs component. 186 */ 187 QDF_STATUS ucfg_dfs_getnol(struct wlan_objmgr_pdev *pdev, void *dfs_nolinfo); 188 189 /** 190 * ucfg_dfs_override_cac_timeout() - Override the default CAC timeout. 191 * @pdev: Pointer to DFS pdev object. 192 * @cac_timeout: CAC timeout value. 193 * 194 * Wrapper function for dfs_override_cac_timeout(). 195 * This function called from outside of dfs component. 196 */ 197 QDF_STATUS ucfg_dfs_override_cac_timeout(struct wlan_objmgr_pdev *pdev, 198 int cac_timeout, int *status); 199 200 /** 201 * ucfg_dfs_get_override_cac_timeout() - Get override CAC timeout value. 202 * @pdev: Pointer to DFS pdev object. 203 * @cac_timeout: Pointer to save the CAC timeout value. 204 * 205 * Wrapper function for dfs_get_override_cac_timeout(). 206 * This function called from outside of dfs component. 207 */ 208 QDF_STATUS ucfg_dfs_get_override_cac_timeout(struct wlan_objmgr_pdev *pdev, 209 int *cac_timeout, int *status); 210 211 /** 212 * ucfg_dfs_get_override_precac_timeout() - Get precac timeout. 213 * @pdev: Pointer to DFS pdev object. 214 * @precac_timeout: Get precac timeout value in this variable. 215 * 216 * Wrapper function for dfs_get_override_precac_timeout(). 217 * This function called from outside of dfs component. 218 */ 219 QDF_STATUS ucfg_dfs_get_override_precac_timeout(struct wlan_objmgr_pdev *pdev, 220 int *precac_timeout); 221 222 /** 223 * ucfg_dfs_override_precac_timeout() - Override the default precac timeout. 224 * @pdev: Pointer to DFS pdev object. 225 * @precac_timeout: Precac timeout value. 226 * 227 * Wrapper function for dfs_override_precac_timeout(). 228 * This function called from outside of dfs component. 229 */ 230 QDF_STATUS ucfg_dfs_override_precac_timeout(struct wlan_objmgr_pdev *pdev, 231 int precac_timeout); 232 233 /** 234 * ucfg_dfs_set_precac_enable() - Set precac enable flag. 235 * @pdev: Pointer to DFS pdev object. 236 * @value: input value for dfs_precac_enable flag. 237 * 238 * Wrapper function for dfs_set_precac_enable(). 239 * This function called from outside of dfs component. 240 */ 241 QDF_STATUS ucfg_dfs_set_precac_enable(struct wlan_objmgr_pdev *pdev, 242 uint32_t value); 243 244 /** 245 * ucfg_dfs_get_precac_enable() - Get precac enable flag. 246 * @pdev: Pointer to DFS pdev object. 247 * @buff: Pointer to save precac_enable value. 248 * 249 * Wrapper function for dfs_get_precac_enable(). 250 * This function called from outside of dfs component. 251 */ 252 QDF_STATUS ucfg_dfs_get_precac_enable(struct wlan_objmgr_pdev *pdev, int *buff); 253 254 #ifdef WLAN_DFS_PRECAC_AUTO_CHAN_SUPPORT 255 /** 256 * ucfg_dfs_set_precac_intermediate_chan() - Set intermediate channel 257 * for preCAC. 258 * @pdev: Pointer to DFS pdev object. 259 * @value: Channel number of intermediate channel 260 * 261 * Wrapper function for dfs_set_precac_intermediate_chan(). 262 * This function is called from outside of dfs component. 263 * 264 * Return: 265 * * QDF_STATUS_SUCCESS : Successfully set intermediate channel. 266 * * QDF_STATUS_E_FAILURE: Failed to set intermediate channel. 267 */ 268 QDF_STATUS ucfg_dfs_set_precac_intermediate_chan(struct wlan_objmgr_pdev *pdev, 269 uint32_t value); 270 271 /** 272 * ucfg_dfs_get_precac_intermediate_chan() - Get intermediate channel 273 * for preCAC. 274 * @pdev: Pointer to DFS pdev object. 275 * @buff: Pointer to Channel number of intermediate channel. 276 * 277 * Wrapper function for dfs_get_precac_intermediate_chan(). 278 * This function is called from outside of dfs component. 279 * 280 * Return: Configured intermediate precac channel. 281 */ 282 QDF_STATUS ucfg_dfs_get_precac_intermediate_chan(struct wlan_objmgr_pdev *pdev, 283 int *buff); 284 285 /** 286 * ucfg_dfs_get_precac_chan_state() - Get precac status for the given channel. 287 * @pdev: Pointer to DFS pdev object. 288 * @precac_chan: Channel number for which precac state needs to be determined. 289 * 290 * Wrapper function for dfs_get_precac_chan_state(). 291 * This function called from outside of dfs component. 292 * 293 * Return: Precac state of the given channel. 294 */ 295 enum precac_chan_state 296 ucfg_dfs_get_precac_chan_state(struct wlan_objmgr_pdev *pdev, 297 uint8_t precac_chan); 298 #endif 299 300 #ifdef QCA_MCL_DFS_SUPPORT 301 /** 302 * ucfg_dfs_update_config() - Update DFS user config. 303 * @psoc: Pointer to psoc. 304 * @req: DFS user config. 305 * 306 * Return: QDF_STATUS 307 */ 308 QDF_STATUS ucfg_dfs_update_config(struct wlan_objmgr_psoc *psoc, 309 struct dfs_user_config *req); 310 #else 311 static inline QDF_STATUS ucfg_dfs_update_config(struct wlan_objmgr_psoc *psoc, 312 struct dfs_user_config *req) 313 { 314 return QDF_STATUS_SUCCESS; 315 } 316 #endif 317 318 /** 319 * ucfg_dfs_set_override_status_timeout() - override the value of host dfs 320 * status wait timeout. 321 * @pdev: Pointer to DFS pdev object. 322 * @status_timeout: timeout value. 323 * 324 * Wrapper function for dfs_set_override_status_timeout(). 325 * This function called from outside of dfs component. 326 * 327 * Return: QDF_STATUS 328 */ 329 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST) 330 QDF_STATUS ucfg_dfs_set_override_status_timeout(struct wlan_objmgr_pdev *pdev, 331 int status_timeout); 332 #else 333 static inline 334 QDF_STATUS ucfg_dfs_set_override_status_timeout(struct wlan_objmgr_pdev *pdev, 335 int status_timeout) 336 { 337 return QDF_STATUS_SUCCESS; 338 } 339 #endif 340 341 /** 342 * ucfg_dfs_get_override_status_timeout() - Get the value of host dfs status 343 * wait timeout. 344 * @pdev: Pointer to DFS pdev object. 345 * @status_timeout: Pointer to save the timeout value. 346 * 347 * Wrapper function for dfs_get_override_status_timeout(). 348 * This function called from outside of dfs component. 349 * 350 * Return: QDF_STATUS 351 */ 352 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST) 353 QDF_STATUS ucfg_dfs_get_override_status_timeout(struct wlan_objmgr_pdev *pdev, 354 int *status_timeout); 355 #else 356 static inline 357 QDF_STATUS ucfg_dfs_get_override_status_timeout(struct wlan_objmgr_pdev *pdev, 358 int *status_timeout) 359 { 360 return QDF_STATUS_SUCCESS; 361 } 362 #endif 363 364 /** 365 * ucfg_dfs_set_nol_subchannel_marking() - Set or unset NOL subchannel marking. 366 * @pdev: Pointer to DFS pdev object. 367 * @nol_subchannel_marking: Set NOL subchannel marking based on this value. 368 * 369 * Wrapper function for dfs_set_nol_subchannel_marking(). 370 * This function is called from outside of dfs component. 371 * 372 * Return: QDF_STATUS 373 */ 374 QDF_STATUS ucfg_dfs_set_nol_subchannel_marking(struct wlan_objmgr_pdev *pdev, 375 bool nol_subchannel_marking); 376 377 /** 378 * ucfg_dfs_get_nol_subchannel_marking() - Get the value of NOL subchannel 379 * marking. 380 * @pdev: Pointer to DFS pdev object. 381 * @nol_subchannel_marking: Store the value of NOL subchannel marking. 382 * 383 * Wrapper function for dfs_get_nol_subchannel_marking(). 384 * This function is called from outside of dfs component. 385 * 386 * Return: QDF_STATUS 387 */ 388 QDF_STATUS ucfg_dfs_get_nol_subchannel_marking(struct wlan_objmgr_pdev *pdev, 389 bool *nol_subchannel_marking); 390 #endif /* _WLAN_DFS_UCFG_API_H_ */ 391