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_get_cac_timeout: Gets the CAC timeout. 56 * @mlme_rebuild_chan_list_with_non_dfs_channel: Rebuild channels with non-dfs 57 * channels. 58 * @mlme_restart_vaps_with_non_dfs_chan: Restart vaps with non-dfs channel. 59 * @mlme_check_allowed_prim_chanlist: Check whether the given channel is 60 * present in the primary allowed channel 61 * list or not. 62 */ 63 struct dfs_to_mlme { 64 QDF_STATUS (*pdev_component_obj_attach)(struct wlan_objmgr_pdev *pdev, 65 enum wlan_umac_comp_id id, 66 void *comp_priv_obj, 67 QDF_STATUS status); 68 QDF_STATUS (*pdev_component_obj_detach)(struct wlan_objmgr_pdev *pdev, 69 enum wlan_umac_comp_id id, 70 void *comp_priv_obj); 71 struct wlan_dfs *(*pdev_get_comp_private_obj)( 72 struct wlan_objmgr_pdev *pdev); 73 QDF_STATUS (*dfs_start_rcsa)(struct wlan_objmgr_pdev *pdev, 74 bool *wait_for_csa); 75 QDF_STATUS (*mlme_mark_dfs)(struct wlan_objmgr_pdev *pdev, 76 uint8_t ieee, 77 uint16_t freq, 78 uint8_t vhtop_ch_freq_seg2, 79 uint64_t flags); 80 QDF_STATUS (*mlme_start_csa)(struct wlan_objmgr_pdev *pdev, 81 uint8_t ieee_chan, uint16_t freq, 82 uint8_t cfreq2, uint64_t flags); 83 QDF_STATUS (*mlme_proc_cac)(struct wlan_objmgr_pdev *pdev); 84 QDF_STATUS (*mlme_deliver_event_up_after_cac)( 85 struct wlan_objmgr_pdev *pdev); 86 QDF_STATUS (*mlme_get_dfs_ch_nchans)(struct wlan_objmgr_pdev *pdev, 87 int *nchans); 88 QDF_STATUS (*mlme_get_extchan)(struct wlan_objmgr_pdev *pdev, 89 uint16_t *dfs_ch_freq, 90 uint64_t *dfs_ch_flags, 91 uint16_t *dfs_ch_flagext, 92 uint8_t *dfs_ch_ieee, 93 uint8_t *dfs_ch_vhtop_ch_freq_seg1, 94 uint8_t *dfs_ch_vhtop_ch_freq_seg2); 95 QDF_STATUS (*mlme_set_no_chans_available)(struct wlan_objmgr_pdev *pdev, 96 int val); 97 QDF_STATUS (*mlme_ieee2mhz)(struct wlan_objmgr_pdev *pdev, 98 int ieee, 99 uint64_t flag, 100 int *freq); 101 QDF_STATUS (*mlme_find_dot11_channel)(struct wlan_objmgr_pdev *pdev, 102 uint8_t ieee, 103 uint8_t des_cfreq2, 104 int mode, 105 uint16_t *dfs_ch_freq, 106 uint64_t *dfs_ch_flags, 107 uint16_t *dfs_ch_flagext, 108 uint8_t *dfs_ch_ieee, 109 uint8_t *dfs_ch_vhtop_ch_freq_seg1, 110 uint8_t *dfs_ch_vhtop_ch_freq_seg2); 111 112 QDF_STATUS (*mlme_get_dfs_ch_channels)(struct wlan_objmgr_pdev *pdev, 113 uint16_t *dfs_ch_freq, 114 uint64_t *dfs_ch_flags, 115 uint16_t *dfs_ch_flagext, 116 uint8_t *dfs_ch_ieee, 117 uint8_t *dfs_ch_vhtop_ch_freq_seg1, 118 uint8_t *dfs_ch_vhtop_ch_freq_seg2, 119 int index); 120 QDF_STATUS (*mlme_dfs_ch_flags_ext)(struct wlan_objmgr_pdev *pdev, 121 uint16_t *flag_ext); 122 QDF_STATUS (*mlme_channel_change_by_precac)( 123 struct wlan_objmgr_pdev *pdev); 124 #ifdef WLAN_DFS_PRECAC_AUTO_CHAN_SUPPORT 125 QDF_STATUS (*mlme_precac_chan_change_csa)(struct wlan_objmgr_pdev *pdev, 126 uint8_t ch_ieee); 127 #endif 128 QDF_STATUS (*mlme_nol_timeout_notification)( 129 struct wlan_objmgr_pdev *pdev); 130 QDF_STATUS (*mlme_clist_update)(struct wlan_objmgr_pdev *pdev, 131 void *nollist, 132 int nentries); 133 QDF_STATUS (*mlme_get_cac_timeout)(struct wlan_objmgr_pdev *pdev, 134 uint16_t dfs_ch_freq, 135 uint8_t c_vhtop_ch_freq_seg2, 136 uint64_t dfs_ch_flags, 137 int *cac_timeout); 138 QDF_STATUS (*mlme_rebuild_chan_list_with_non_dfs_channels) 139 (struct wlan_objmgr_pdev *pdev); 140 QDF_STATUS (*mlme_restart_vaps_with_non_dfs_chan) 141 (struct wlan_objmgr_pdev *pdev, int no_chans_avail); 142 bool (*mlme_check_allowed_prim_chanlist) 143 (struct wlan_objmgr_pdev *pdev, uint32_t chan_num); 144 }; 145 146 extern struct dfs_to_mlme global_dfs_to_mlme; 147 148 /** 149 * wlan_dfs_pdev_obj_create_notification() - DFS pdev object create handler. 150 * @pdev: Pointer to DFS pdev object. 151 */ 152 QDF_STATUS wlan_dfs_pdev_obj_create_notification(struct wlan_objmgr_pdev *pdev, 153 void *arg); 154 155 /** 156 * wlan_dfs_pdev_obj_destroy_notification() - DFS pdev object delete handler. 157 * @pdev: Pointer to DFS pdev object. 158 */ 159 QDF_STATUS wlan_dfs_pdev_obj_destroy_notification(struct wlan_objmgr_pdev *pdev, 160 void *arg); 161 162 /** 163 * ucfg_dfs_is_ap_cac_timer_running() - Returns the dfs cac timer. 164 * @pdev: Pointer to DFS pdev object. 165 * @is_ap_cac_timer_running: Pointer to save dfs_cac_timer_running value. 166 * 167 * Wrapper function for dfs_is_ap_cac_timer_running(). 168 * This function called from outside of dfs component. 169 */ 170 QDF_STATUS ucfg_dfs_is_ap_cac_timer_running(struct wlan_objmgr_pdev *pdev, 171 int *is_ap_cac_timer_running); 172 173 /** 174 * ucfg_dfs_getnol() - Wrapper function for dfs_get_nol() 175 * @pdev: Pointer to DFS pdev object. 176 * @dfs_nolinfo: Pointer to dfsreq_nolinfo structure. 177 * 178 * Wrapper function for dfs_getnol(). 179 * This function called from outside of dfs component. 180 */ 181 QDF_STATUS ucfg_dfs_getnol(struct wlan_objmgr_pdev *pdev, void *dfs_nolinfo); 182 183 /** 184 * ucfg_dfs_override_cac_timeout() - Override the default CAC timeout. 185 * @pdev: Pointer to DFS pdev object. 186 * @cac_timeout: CAC timeout value. 187 * 188 * Wrapper function for dfs_override_cac_timeout(). 189 * This function called from outside of dfs component. 190 */ 191 QDF_STATUS ucfg_dfs_override_cac_timeout(struct wlan_objmgr_pdev *pdev, 192 int cac_timeout, int *status); 193 194 /** 195 * ucfg_dfs_get_override_cac_timeout() - Get override CAC timeout value. 196 * @pdev: Pointer to DFS pdev object. 197 * @cac_timeout: Pointer to save the CAC timeout value. 198 * 199 * Wrapper function for dfs_get_override_cac_timeout(). 200 * This function called from outside of dfs component. 201 */ 202 QDF_STATUS ucfg_dfs_get_override_cac_timeout(struct wlan_objmgr_pdev *pdev, 203 int *cac_timeout, int *status); 204 205 /** 206 * ucfg_dfs_get_override_precac_timeout() - Get precac timeout. 207 * @pdev: Pointer to DFS pdev object. 208 * @precac_timeout: Get precac timeout value in this variable. 209 * 210 * Wrapper function for dfs_get_override_precac_timeout(). 211 * This function called from outside of dfs component. 212 */ 213 QDF_STATUS ucfg_dfs_get_override_precac_timeout(struct wlan_objmgr_pdev *pdev, 214 int *precac_timeout); 215 216 /** 217 * ucfg_dfs_override_precac_timeout() - Override the default precac timeout. 218 * @pdev: Pointer to DFS pdev object. 219 * @precac_timeout: Precac timeout value. 220 * 221 * Wrapper function for dfs_override_precac_timeout(). 222 * This function called from outside of dfs component. 223 */ 224 QDF_STATUS ucfg_dfs_override_precac_timeout(struct wlan_objmgr_pdev *pdev, 225 int precac_timeout); 226 227 /** 228 * ucfg_dfs_set_precac_enable() - Set precac enable flag. 229 * @pdev: Pointer to DFS pdev object. 230 * @value: input value for dfs_precac_enable flag. 231 * 232 * Wrapper function for dfs_set_precac_enable(). 233 * This function called from outside of dfs component. 234 */ 235 QDF_STATUS ucfg_dfs_set_precac_enable(struct wlan_objmgr_pdev *pdev, 236 uint32_t value); 237 238 /** 239 * ucfg_dfs_get_precac_enable() - Get precac enable flag. 240 * @pdev: Pointer to DFS pdev object. 241 * @buff: Pointer to save precac_enable value. 242 * 243 * Wrapper function for dfs_get_precac_enable(). 244 * This function called from outside of dfs component. 245 */ 246 QDF_STATUS ucfg_dfs_get_precac_enable(struct wlan_objmgr_pdev *pdev, int *buff); 247 248 #ifdef WLAN_DFS_PRECAC_AUTO_CHAN_SUPPORT 249 /** 250 * ucfg_dfs_set_precac_intermediate_chan() - Set intermediate channel 251 * for preCAC. 252 * @pdev: Pointer to DFS pdev object. 253 * @value: Channel number of intermediate channel 254 * 255 * Wrapper function for dfs_set_precac_intermediate_chan(). 256 * This function is called from outside of dfs component. 257 * 258 * Return: 259 * * QDF_STATUS_SUCCESS : Successfully set intermediate channel. 260 * * QDF_STATUS_E_FAILURE: Failed to set intermediate channel. 261 */ 262 QDF_STATUS ucfg_dfs_set_precac_intermediate_chan(struct wlan_objmgr_pdev *pdev, 263 uint32_t value); 264 265 /** 266 * ucfg_dfs_get_precac_intermediate_chan() - Get intermediate channel 267 * for preCAC. 268 * @pdev: Pointer to DFS pdev object. 269 * @buff: Pointer to Channel number of intermediate channel. 270 * 271 * Wrapper function for dfs_get_precac_intermediate_chan(). 272 * This function is called from outside of dfs component. 273 * 274 * Return: Configured intermediate precac channel. 275 */ 276 QDF_STATUS ucfg_dfs_get_precac_intermediate_chan(struct wlan_objmgr_pdev *pdev, 277 int *buff); 278 279 /** 280 * ucfg_dfs_get_precac_chan_state() - Get precac status for the given channel. 281 * @pdev: Pointer to DFS pdev object. 282 * @precac_chan: Channel number for which precac state needs to be determined. 283 * 284 * Wrapper function for dfs_get_precac_chan_state(). 285 * This function called from outside of dfs component. 286 * 287 * Return: Precac state of the given channel. 288 */ 289 enum precac_chan_state 290 ucfg_dfs_get_precac_chan_state(struct wlan_objmgr_pdev *pdev, 291 uint8_t precac_chan); 292 #endif 293 294 #ifdef QCA_MCL_DFS_SUPPORT 295 /** 296 * ucfg_dfs_update_config() - Update DFS user config. 297 * @psoc: Pointer to psoc. 298 * @req: DFS user config. 299 * 300 * Return: QDF_STATUS 301 */ 302 QDF_STATUS ucfg_dfs_update_config(struct wlan_objmgr_psoc *psoc, 303 struct dfs_user_config *req); 304 #else 305 static inline QDF_STATUS ucfg_dfs_update_config(struct wlan_objmgr_psoc *psoc, 306 struct dfs_user_config *req) 307 { 308 return QDF_STATUS_SUCCESS; 309 } 310 #endif 311 312 /** 313 * ucfg_dfs_set_override_status_timeout() - override the value of host dfs 314 * status wait timeout. 315 * @pdev: Pointer to DFS pdev object. 316 * @status_timeout: timeout value. 317 * 318 * Wrapper function for dfs_set_override_status_timeout(). 319 * This function called from outside of dfs component. 320 * 321 * Return: QDF_STATUS 322 */ 323 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST) 324 QDF_STATUS ucfg_dfs_set_override_status_timeout(struct wlan_objmgr_pdev *pdev, 325 int status_timeout); 326 #else 327 static inline 328 QDF_STATUS ucfg_dfs_set_override_status_timeout(struct wlan_objmgr_pdev *pdev, 329 int status_timeout) 330 { 331 return QDF_STATUS_SUCCESS; 332 } 333 #endif 334 335 /** 336 * ucfg_dfs_get_override_status_timeout() - Get the value of host dfs status 337 * wait timeout. 338 * @pdev: Pointer to DFS pdev object. 339 * @status_timeout: Pointer to save the timeout value. 340 * 341 * Wrapper function for dfs_get_override_status_timeout(). 342 * This function called from outside of dfs component. 343 * 344 * Return: QDF_STATUS 345 */ 346 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST) 347 QDF_STATUS ucfg_dfs_get_override_status_timeout(struct wlan_objmgr_pdev *pdev, 348 int *status_timeout); 349 #else 350 static inline 351 QDF_STATUS ucfg_dfs_get_override_status_timeout(struct wlan_objmgr_pdev *pdev, 352 int *status_timeout) 353 { 354 return QDF_STATUS_SUCCESS; 355 } 356 #endif 357 #endif /* _WLAN_DFS_UCFG_API_H_ */ 358