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