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