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_channel_mark_radar: Mark the channel as RADAR. 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_afrer_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_nol_timeout_notification: NOL timeout notification. 53 * @mlme_clist_update: Updates the channel list. 54 * @mlme_get_cac_timeout: Gets the CAC timeout. 55 * @mlme_rebuild_chan_list_with_non_dfs_channel: Rebuild channels with non-dfs 56 * channels. 57 * @mlme_restart_vaps_with_non_dfs_chan: Restart vaps with non-dfs channel. 58 */ 59 struct dfs_to_mlme { 60 QDF_STATUS (*pdev_component_obj_attach)(struct wlan_objmgr_pdev *pdev, 61 enum wlan_umac_comp_id id, 62 void *comp_priv_obj, 63 QDF_STATUS status); 64 QDF_STATUS (*pdev_component_obj_detach)(struct wlan_objmgr_pdev *pdev, 65 enum wlan_umac_comp_id id, 66 void *comp_priv_obj); 67 struct wlan_dfs *(*pdev_get_comp_private_obj)( 68 struct wlan_objmgr_pdev *pdev); 69 QDF_STATUS (*dfs_channel_mark_radar)(struct wlan_objmgr_pdev *pdev, 70 uint16_t freq, 71 uint8_t vhtop_ch_freq_seg2, 72 uint64_t flags); 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_afrer_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 QDF_STATUS (*mlme_nol_timeout_notification)( 125 struct wlan_objmgr_pdev *pdev); 126 QDF_STATUS (*mlme_clist_update)(struct wlan_objmgr_pdev *pdev, 127 void *nollist, 128 int nentries); 129 QDF_STATUS (*mlme_get_cac_timeout)(struct wlan_objmgr_pdev *pdev, 130 uint16_t dfs_ch_freq, 131 uint8_t c_vhtop_ch_freq_seg2, 132 uint64_t dfs_ch_flags, 133 int *cac_timeout); 134 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST) 135 QDF_STATUS (*mlme_rebuild_chan_list_with_non_dfs_channels) 136 (struct wlan_objmgr_pdev *pdev); 137 QDF_STATUS (*mlme_restart_vaps_with_non_dfs_chan) 138 (struct wlan_objmgr_pdev *pdev, int no_chans_avail); 139 #endif 140 }; 141 142 extern struct dfs_to_mlme global_dfs_to_mlme; 143 144 /** 145 * wlan_dfs_pdev_obj_create_notification() - DFS pdev object create handler. 146 * @pdev: Pointer to DFS pdev object. 147 */ 148 QDF_STATUS wlan_dfs_pdev_obj_create_notification(struct wlan_objmgr_pdev *pdev, 149 void *arg); 150 151 /** 152 * wlan_dfs_pdev_obj_destroy_notification() - DFS pdev object delete handler. 153 * @pdev: Pointer to DFS pdev object. 154 */ 155 QDF_STATUS wlan_dfs_pdev_obj_destroy_notification(struct wlan_objmgr_pdev *pdev, 156 void *arg); 157 158 /** 159 * ucfg_dfs_is_ap_cac_timer_running() - Returns the dfs cac timer. 160 * @pdev: Pointer to DFS pdev object. 161 * @is_ap_cac_timer_running: Pointer to save dfs_cac_timer_running value. 162 * 163 * Wrapper function for dfs_is_ap_cac_timer_running(). 164 * This function called from outside of dfs component. 165 */ 166 QDF_STATUS ucfg_dfs_is_ap_cac_timer_running(struct wlan_objmgr_pdev *pdev, 167 int *is_ap_cac_timer_running); 168 169 /** 170 * ucfg_dfs_getnol() - Wrapper function for dfs_get_nol() 171 * @pdev: Pointer to DFS pdev object. 172 * @dfs_nolinfo: Pointer to dfsreq_nolinfo structure. 173 * 174 * Wrapper function for dfs_getnol(). 175 * This function called from outside of dfs component. 176 */ 177 QDF_STATUS ucfg_dfs_getnol(struct wlan_objmgr_pdev *pdev, void *dfs_nolinfo); 178 179 /** 180 * ucfg_dfs_override_cac_timeout() - Override the default CAC timeout. 181 * @pdev: Pointer to DFS pdev object. 182 * @cac_timeout: CAC timeout value. 183 * 184 * Wrapper function for dfs_override_cac_timeout(). 185 * This function called from outside of dfs component. 186 */ 187 QDF_STATUS ucfg_dfs_override_cac_timeout(struct wlan_objmgr_pdev *pdev, 188 int cac_timeout, int *status); 189 190 /** 191 * ucfg_dfs_get_override_cac_timeout() - Get override CAC timeout value. 192 * @pdev: Pointer to DFS pdev object. 193 * @cac_timeout: Pointer to save the CAC timeout value. 194 * 195 * Wrapper function for dfs_get_override_cac_timeout(). 196 * This function called from outside of dfs component. 197 */ 198 QDF_STATUS ucfg_dfs_get_override_cac_timeout(struct wlan_objmgr_pdev *pdev, 199 int *cac_timeout, int *status); 200 201 /** 202 * ucfg_dfs_get_override_precac_timeout() - Get precac timeout. 203 * @pdev: Pointer to DFS pdev object. 204 * @precac_timeout: Get precac timeout value in this variable. 205 * 206 * Wrapper function for dfs_get_override_precac_timeout(). 207 * This function called from outside of dfs component. 208 */ 209 QDF_STATUS ucfg_dfs_get_override_precac_timeout(struct wlan_objmgr_pdev *pdev, 210 int *precac_timeout); 211 212 /** 213 * ucfg_dfs_override_precac_timeout() - Override the default precac timeout. 214 * @pdev: Pointer to DFS pdev object. 215 * @precac_timeout: Precac timeout value. 216 * 217 * Wrapper function for dfs_override_precac_timeout(). 218 * This function called from outside of dfs component. 219 */ 220 QDF_STATUS ucfg_dfs_override_precac_timeout(struct wlan_objmgr_pdev *pdev, 221 int precac_timeout); 222 223 /** 224 * ucfg_dfs_set_precac_enable() - Set precac enable flag. 225 * @pdev: Pointer to DFS pdev object. 226 * @value: input value for dfs_precac_enable flag. 227 * 228 * Wrapper function for dfs_set_precac_enable(). 229 * This function called from outside of dfs component. 230 */ 231 QDF_STATUS ucfg_dfs_set_precac_enable(struct wlan_objmgr_pdev *pdev, 232 uint32_t value); 233 234 /** 235 * ucfg_dfs_get_precac_enable() - Get precac enable flag. 236 * @pdev: Pointer to DFS pdev object. 237 * @buff: Pointer to save precac_enable value. 238 * 239 * Wrapper function for dfs_get_precac_enable(). 240 * This function called from outside of dfs component. 241 */ 242 QDF_STATUS ucfg_dfs_get_precac_enable(struct wlan_objmgr_pdev *pdev, int *buff); 243 244 #ifdef QCA_MCL_DFS_SUPPORT 245 /** 246 * ucfg_dfs_update_config() - Update DFS user config. 247 * @psoc: Pointer to psoc. 248 * @req: DFS user config. 249 * 250 * Return: QDF_STATUS 251 */ 252 QDF_STATUS ucfg_dfs_update_config(struct wlan_objmgr_psoc *psoc, 253 struct dfs_user_config *req); 254 #else 255 static inline QDF_STATUS ucfg_dfs_update_config(struct wlan_objmgr_psoc *psoc, 256 struct dfs_user_config *req) 257 { 258 return QDF_STATUS_SUCCESS; 259 } 260 #endif 261 262 /** 263 * ucfg_dfs_set_override_status_timeout() - override the value of host dfs 264 * status wait timeout. 265 * @pdev: Pointer to DFS pdev object. 266 * @status_timeout: timeout value. 267 * 268 * Wrapper function for dfs_set_override_status_timeout(). 269 * This function called from outside of dfs component. 270 * 271 * Return: QDF_STATUS 272 */ 273 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST) 274 QDF_STATUS ucfg_dfs_set_override_status_timeout(struct wlan_objmgr_pdev *pdev, 275 int status_timeout); 276 #else 277 static inline 278 QDF_STATUS ucfg_dfs_set_override_status_timeout(struct wlan_objmgr_pdev *pdev, 279 int status_timeout) 280 { 281 return QDF_STATUS_SUCCESS; 282 } 283 #endif 284 285 /** 286 * ucfg_dfs_get_override_status_timeout() - Get the value of host dfs status 287 * wait timeout. 288 * @pdev: Pointer to DFS pdev object. 289 * @status_timeout: Pointer to save the timeout value. 290 * 291 * Wrapper function for dfs_get_override_status_timeout(). 292 * This function called from outside of dfs component. 293 * 294 * Return: QDF_STATUS 295 */ 296 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST) 297 QDF_STATUS ucfg_dfs_get_override_status_timeout(struct wlan_objmgr_pdev *pdev, 298 int *status_timeout); 299 #else 300 static inline 301 QDF_STATUS ucfg_dfs_get_override_status_timeout(struct wlan_objmgr_pdev *pdev, 302 int *status_timeout) 303 { 304 return QDF_STATUS_SUCCESS; 305 } 306 #endif 307 #endif /* _WLAN_DFS_UCFG_API_H_ */ 308