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_TGT_API_H_ 26 #define _WLAN_DFS_TGT_API_H_ 27 28 #include <wlan_dfs_public_struct.h> 29 30 /* Max number arguments for DFS unit test command */ 31 #define DFS_MAX_NUM_UNIT_TEST_ARGS 3 32 33 /* Command id to send test radar to firmware */ 34 #define DFS_PHYERR_OFFLOAD_TEST_SET_RADAR 0 35 36 /* Number of arguments for DFS unit test command */ 37 #define DFS_UNIT_TEST_NUM_ARGS 3 38 39 /* Segment ID corresponding to primary segment */ 40 #define SEG_ID_PRIMARY 0 41 42 /* Segment ID corresponding to secondary segment */ 43 #define SEG_ID_SECONDARY 1 44 45 /* Index id pointing to command id value */ 46 #define IDX_CMD_ID 0 47 48 /* Index id pointing to pdev id value */ 49 #define IDX_PDEV_ID 1 50 51 /* Index pointing to segment id value */ 52 #define IDX_SEG_ID 2 53 54 /** 55 * struct dfs_emulate_bang_radar_test_cmd - Unit test command structure to send 56 * WMI command to firmware from host 57 * and simulate bangradar event. 58 * @vdev_id: vdev id 59 * @num_args: number of arguments 60 * @args: arguments 61 */ 62 struct dfs_emulate_bang_radar_test_cmd { 63 uint32_t vdev_id; 64 uint32_t num_args; 65 uint32_t args[DFS_MAX_NUM_UNIT_TEST_ARGS]; 66 }; 67 68 extern struct dfs_to_mlme global_dfs_to_mlme; 69 70 /** 71 * tgt_dfs_set_current_channel() - Fill dfs channel structure from 72 * dfs_channel structure. 73 * @pdev: Pointer to DFS pdev object. 74 * @dfs_ch_freq: Frequency in Mhz. 75 * @dfs_ch_flags: Channel flags. 76 * @dfs_ch_flagext: Extended channel flags. 77 * @dfs_ch_ieee: IEEE channel number. 78 * @dfs_ch_vhtop_ch_freq_seg1: Channel Center frequency1. 79 * @dfs_ch_vhtop_ch_freq_seg2: Channel Center frequency2. 80 */ 81 #ifdef DFS_COMPONENT_ENABLE 82 QDF_STATUS tgt_dfs_set_current_channel(struct wlan_objmgr_pdev *pdev, 83 uint16_t dfs_ch_freq, 84 uint64_t dfs_ch_flags, 85 uint16_t dfs_ch_flagext, 86 uint8_t dfs_ch_ieee, 87 uint8_t dfs_ch_vhtop_ch_freq_seg1, 88 uint8_t dfs_ch_vhtop_ch_freq_seg2); 89 90 /** 91 * tgt_dfs_radar_enable() - Enables the radar. 92 * @pdev: Pointer to DFS pdev object. 93 * @no_cac: If no_cac is 0, it cancels the CAC. 94 * 95 * This is called each time a channel change occurs, to (potentially) enable 96 * the radar code. 97 */ 98 QDF_STATUS tgt_dfs_radar_enable(struct wlan_objmgr_pdev *pdev, 99 int no_cac, uint32_t opmode); 100 101 /** 102 * tgt_dfs_control()- Used to process ioctls related to DFS. 103 * @pdev: Pointer to DFS pdev object. 104 * @id: Command type. 105 * @indata: Input buffer. 106 * @insize: size of the input buffer. 107 * @outdata: A buffer for the results. 108 * @outsize: Size of the output buffer. 109 */ 110 QDF_STATUS tgt_dfs_control(struct wlan_objmgr_pdev *pdev, 111 u_int id, 112 void *indata, 113 uint32_t insize, 114 void *outdata, 115 uint32_t *outsize, 116 int *error); 117 118 /** 119 * tgt_dfs_get_radars() - Based on the chipset, calls init radar table functions 120 * @pdev: Pointer to DFS pdev object. 121 * 122 * Wrapper function for dfs_get_radars(). This function called from 123 * outside of DFS component. 124 */ 125 QDF_STATUS tgt_dfs_get_radars(struct wlan_objmgr_pdev *pdev); 126 127 /** 128 * tgt_dfs_process_radar_ind() - Process radar found indication. 129 * @pdev: Pointer to DFS pdev object. 130 * @radar_found: radar found info. 131 * 132 * Process radar found indication. 133 * 134 * Return QDF_STATUS. 135 */ 136 QDF_STATUS tgt_dfs_process_radar_ind(struct wlan_objmgr_pdev *pdev, 137 struct radar_found_info *radar_found); 138 #else 139 static inline QDF_STATUS tgt_dfs_set_current_channel( 140 struct wlan_objmgr_pdev *pdev, 141 uint16_t dfs_ch_freq, 142 uint64_t dfs_ch_flags, 143 uint16_t dfs_ch_flagext, 144 uint8_t dfs_ch_ieee, 145 uint8_t dfs_ch_vhtop_ch_freq_seg1, 146 uint8_t dfs_ch_vhtop_ch_freq_seg2) 147 { 148 return QDF_STATUS_SUCCESS; 149 } 150 151 static inline QDF_STATUS tgt_dfs_radar_enable(struct wlan_objmgr_pdev *pdev, 152 int no_cac, uint32_t opmode) 153 { 154 return QDF_STATUS_SUCCESS; 155 } 156 157 static inline QDF_STATUS tgt_dfs_control(struct wlan_objmgr_pdev *pdev, 158 u_int id, 159 void *indata, 160 uint32_t insize, 161 void *outdata, 162 uint32_t *outsize, 163 int *error) 164 { 165 return QDF_STATUS_SUCCESS; 166 } 167 168 static inline QDF_STATUS tgt_dfs_get_radars(struct wlan_objmgr_pdev *pdev) 169 { 170 return QDF_STATUS_SUCCESS; 171 } 172 173 static inline QDF_STATUS tgt_dfs_process_radar_ind( 174 struct wlan_objmgr_pdev *pdev, 175 struct radar_found_info *radar_found) 176 { 177 return QDF_STATUS_SUCCESS; 178 } 179 #endif 180 181 /** 182 * tgt_dfs_process_phyerr() - Process phyerr. 183 * @pdev: Pointer to DFS pdev object. 184 * @buf: Phyerr buffer. 185 * @datalen: phyerr buffer length. 186 * @r_rssi: RSSI. 187 * @r_ext_rssi: Extension channel RSSI. 188 * @r_rs_tstamp: Timestamp. 189 * @r_fulltsf: TSF64. 190 * 191 * Wrapper function for dfs_process_phyerr(). This function called from 192 * outside of DFS component. 193 */ 194 QDF_STATUS tgt_dfs_process_phyerr(struct wlan_objmgr_pdev *pdev, 195 void *buf, 196 uint16_t datalen, 197 uint8_t r_rssi, 198 uint8_t r_ext_rssi, 199 uint32_t r_rs_tstamp, 200 uint64_t r_fulltsf); 201 202 /** 203 * tgt_dfs_process_phyerr_filter_offload() - Process radar event. 204 * Wrapper function for dfs_process_phyerr_filter_offload(). This function 205 * called from outside of DFS component. 206 * @pdev: Pointer to DFS pdev object. 207 * @wlan_radar_event: pointer to radar_event_info. 208 * 209 * Return: QDF_STATUS 210 */ 211 QDF_STATUS tgt_dfs_process_phyerr_filter_offload(struct wlan_objmgr_pdev *pdev, 212 struct radar_event_info *wlan_radar_event); 213 214 /** 215 * tgt_dfs_is_phyerr_filter_offload() - Is phyerr filter offload. 216 * @psoc: Pointer to psoc object. 217 * @is_phyerr_filter_offload: Pointer to is_phyerr_filter_offload. 218 * 219 * Return: QDF_STATUS 220 */ 221 QDF_STATUS tgt_dfs_is_phyerr_filter_offload(struct wlan_objmgr_psoc *psoc, 222 bool *is_phyerr_filter_offload); 223 224 /** 225 * tgt_dfs_destroy_object() - Destroys the DFS object. 226 * @pdev: Pointer to DFS pdev object. 227 * 228 * Wrapper function for dfs_destroy_object(). This function called from 229 * outside of DFS component. 230 */ 231 QDF_STATUS tgt_dfs_destroy_object(struct wlan_objmgr_pdev *pdev); 232 233 #ifdef QCA_MCL_DFS_SUPPORT 234 /** 235 * tgt_dfs_set_tx_leakage_threshold() - set tx_leakage_threshold. 236 * @pdev: Pointer to DFS pdev object. 237 * @tx_leakage_threshold: tx leakage threshold for dfs. 238 * 239 * Return QDF_STATUS. 240 */ 241 QDF_STATUS tgt_dfs_set_tx_leakage_threshold(struct wlan_objmgr_pdev *pdev, 242 uint16_t tx_leakage_threshold); 243 #else 244 static inline QDF_STATUS tgt_dfs_set_tx_leakage_threshold 245 (struct wlan_objmgr_pdev *pdev, 246 uint16_t tx_leakage_threshold) 247 { 248 return QDF_STATUS_SUCCESS; 249 } 250 #endif 251 252 /** 253 * tgt_dfs_is_precac_timer_running() - Check whether precac timer is running. 254 * @pdev: Pointer to DFS pdev object. 255 * @is_precac_timer_running: Pointer to save precac timer value. 256 * 257 * Wrapper function for dfs_is_precac_timer_running(). This function called from 258 * outside of DFS component. 259 */ 260 QDF_STATUS tgt_dfs_is_precac_timer_running(struct wlan_objmgr_pdev *pdev, 261 bool *is_precac_timer_running); 262 263 /** 264 * utils_dfs_find_vht80_chan_for_precac() - Find VHT80 channel for precac. 265 * @pdev: Pointer to DFS pdev object. 266 * @chan_mode: Channel mode. 267 * @ch_freq_seg1: Segment1 channel freq. 268 * @cfreq1: cfreq1. 269 * @cfreq2: cfreq2. 270 * @phy_mode: Precac phymode. 271 * @dfs_set_cfreq2: Precac cfreq2 272 * @set_agile: Agile mode flag. 273 * 274 * wrapper function for dfs_find_vht80_chan_for_precacdfs_cancel_cac_timer(). 275 * This function called from outside of dfs component. 276 */ 277 QDF_STATUS tgt_dfs_find_vht80_chan_for_precac(struct wlan_objmgr_pdev *pdev, 278 uint32_t chan_mode, 279 uint8_t ch_freq_seg1, 280 uint32_t *cfreq1, 281 uint32_t *cfreq2, 282 uint32_t *phy_mode, 283 bool *dfs_set_cfreq2, 284 bool *set_agile); 285 286 /** 287 * tgt_dfs_cac_complete() - Process cac complete indication. 288 * @pdev: Pointer to DFS pdev object. 289 * @vdev_id: vdev id. 290 * 291 * Process cac complete indication from firmware. 292 * 293 * Return QDF_STATUS. 294 */ 295 QDF_STATUS tgt_dfs_cac_complete(struct wlan_objmgr_pdev *pdev, 296 uint32_t vdev_id); 297 298 /** 299 * tgt_dfs_reg_ev_handler() - Register dfs events. 300 * @psoc: Pointer to psoc. 301 * 302 * Register dfs events. 303 * 304 * Return: QDF_STATUS. 305 */ 306 QDF_STATUS tgt_dfs_reg_ev_handler(struct wlan_objmgr_psoc *psoc); 307 308 /** 309 * tgt_dfs_stop() - Clear dfs timers. 310 * @dfs: Pointer to wlan_dfs structure. 311 */ 312 QDF_STATUS tgt_dfs_stop(struct wlan_objmgr_pdev *pdev); 313 314 /** 315 * tgt_dfs_process_emulate_bang_radar_cmd() - Process to emulate dfs bangradar 316 * command. 317 * @pdev: Pointer to DFS pdev object. 318 * 319 * Process to emulate dfs bangradar command. 320 * 321 * Return: QDF_STATUS. 322 */ 323 QDF_STATUS tgt_dfs_process_emulate_bang_radar_cmd(struct wlan_objmgr_pdev *pdev, 324 struct dfs_emulate_bang_radar_test_cmd *dfs_unit_test); 325 326 #ifdef QCA_MCL_DFS_SUPPORT 327 /** 328 * tgt_dfs_set_phyerr_filter_offload() - config phyerr filter offload 329 * @pdev: Pointer to DFS pdev object. 330 * 331 * Return: QDF_STATUS 332 */ 333 QDF_STATUS tgt_dfs_set_phyerr_filter_offload(struct wlan_objmgr_pdev *pdev); 334 #else 335 static inline QDF_STATUS tgt_dfs_set_phyerr_filter_offload 336 (struct wlan_objmgr_pdev *pdev) 337 { 338 return QDF_STATUS_SUCCESS; 339 } 340 #endif 341 342 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST) 343 /** 344 * tgt_dfs_send_avg_params_to_fw() - send average radar parameters to fw. 345 * @pdev: Pointer to DFS pdev object. 346 * @params: Pointer to dfs radar average parameters. 347 * 348 * Return: QDF_STATUS 349 */ 350 QDF_STATUS 351 tgt_dfs_send_avg_params_to_fw(struct wlan_objmgr_pdev *pdev, 352 struct dfs_radar_found_params *params); 353 #endif 354 355 /** 356 * tgt_dfs_action_on_status_from_fw() - trigger the action to be taken based on 357 * host dfs status received from fw. 358 * @pdev: Pointer to pdev object. 359 * @status: Pointer to the host dfs status received from fw. 360 * 361 * Return: QDF_STATUS 362 */ 363 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST) 364 QDF_STATUS tgt_dfs_action_on_status_from_fw(struct wlan_objmgr_pdev *pdev, 365 uint32_t *status); 366 #else 367 static inline 368 QDF_STATUS tgt_dfs_action_on_status_from_fw(struct wlan_objmgr_pdev *pdev, 369 uint32_t *status) 370 { 371 return QDF_STATUS_SUCCESS; 372 } 373 #endif 374 375 /** 376 * tgt_dfs_is_radar_enabled() - checks if radar detection is enabled. 377 * @pdev: Pointer to pdev object. 378 * @ignore_dfs: Pointer to check the value. If 1, radar detection is disabled. 379 */ 380 void tgt_dfs_is_radar_enabled(struct wlan_objmgr_pdev *pdev, int *ignore_dfs); 381 382 /** 383 * tgt_dfs_reset_spoof_test() - reset the dfs spoof check variables 384 * @pdev: Pointer to pdev object. 385 * 386 * Return: QDF_STATUS 387 */ 388 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST) 389 QDF_STATUS tgt_dfs_reset_spoof_test(struct wlan_objmgr_pdev *pdev); 390 #else 391 static inline 392 QDF_STATUS tgt_dfs_reset_spoof_test(struct wlan_objmgr_pdev *pdev) 393 { 394 return QDF_STATUS_SUCCESS; 395 } 396 #endif 397 398 /** 399 * tgt_dfs_enable_stadfs() - Enable/Disable STADFS capability. 400 * @pdev: Pointer to DFS pdev object. 401 * @val: input value. 402 */ 403 void tgt_dfs_enable_stadfs(struct wlan_objmgr_pdev *pdev, bool val); 404 405 /** 406 * tgt_dfs_is_stadfs_enabled() - Get STADFS capability 407 * @pdev: Pointer to DFS pdev object. 408 * 409 * Return: true if STADFS is enabled, else false. 410 */ 411 bool tgt_dfs_is_stadfs_enabled(struct wlan_objmgr_pdev *pdev); 412 413 /** 414 * tgt_dfs_is_pdev_5ghz() - Check if the input pdev is 5GHZ. 415 * @pdev: Pointer to DFS pdev object. 416 * 417 * Return: true if the pdev supports 5GHz, else false. 418 */ 419 bool tgt_dfs_is_pdev_5ghz(struct wlan_objmgr_pdev *pdev); 420 421 #if defined(WLAN_DFS_FULL_OFFLOAD) && defined(QCA_DFS_NOL_OFFLOAD) 422 /** 423 * tgt_dfs_send_usenol_pdev_param() - Send usenol pdev param to FW. 424 * @pdev: Pointer to pdev object. 425 * @usenol: Value of usenol 426 * 427 * Return: QDF_STATUS 428 */ 429 QDF_STATUS tgt_dfs_send_usenol_pdev_param(struct wlan_objmgr_pdev *pdev, 430 bool usenol); 431 432 /** 433 * tgt_dfs_send_subchan_marking() - Send subchannel marking pdev param to FW. 434 * @pdev: Pointer to pdev object. 435 * @subchanmark: Value of subchannel_marking. 436 * 437 * Return: QDF_STATUS 438 */ 439 QDF_STATUS tgt_dfs_send_subchan_marking(struct wlan_objmgr_pdev *pdev, 440 bool subchanmark); 441 #else 442 static inline 443 QDF_STATUS tgt_dfs_send_usenol_pdev_param(struct wlan_objmgr_pdev *pdev, 444 bool usenol) 445 { 446 return QDF_STATUS_SUCCESS; 447 } 448 449 static inline QDF_STATUS 450 tgt_dfs_send_subchan_marking(struct wlan_objmgr_pdev *pdev, bool subchanmark) 451 { 452 return QDF_STATUS_SUCCESS; 453 } 454 #endif 455 #endif /* _WLAN_DFS_TGT_API_H_ */ 456