1 /* 2 * Copyright (c) 2012 - 2021 The Linux Foundation. All rights reserved. 3 * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. 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 * DOC: declare utility API related to the fw_offload component 21 * called by other components 22 */ 23 24 #ifndef _WLAN_FW_OFFLOAD_MAIN_H_ 25 #define _WLAN_FW_OFFLOAD_MAIN_H_ 26 27 #include <wlan_objmgr_psoc_obj.h> 28 #include <wlan_objmgr_global_obj.h> 29 #include <wlan_cmn.h> 30 #include <scheduler_api.h> 31 32 #include "cfg_ucfg_api.h" 33 #include "wlan_fwol_public_structs.h" 34 35 #define fwol_alert(params...) QDF_TRACE_FATAL(QDF_MODULE_ID_FWOL, params) 36 #define fwol_err(params...) QDF_TRACE_ERROR(QDF_MODULE_ID_FWOL, params) 37 #define fwol_warn(params...) QDF_TRACE_WARN(QDF_MODULE_ID_FWOL, params) 38 #define fwol_info(params...) QDF_TRACE_INFO(QDF_MODULE_ID_FWOL, params) 39 #define fwol_debug(params...) QDF_TRACE_DEBUG(QDF_MODULE_ID_FWOL, params) 40 41 #define fwol_nofl_alert(params...) \ 42 QDF_TRACE_FATAL_NO_FL(QDF_MODULE_ID_FWOL, params) 43 #define fwol_nofl_err(params...) \ 44 QDF_TRACE_ERROR_NO_FL(QDF_MODULE_ID_FWOL, params) 45 #define fwol_nofl_warn(params...) \ 46 QDF_TRACE_WARN_NO_FL(QDF_MODULE_ID_FWOL, params) 47 #define fwol_nofl_info(params...) \ 48 QDF_TRACE_INFO_NO_FL(QDF_MODULE_ID_FWOL, params) 49 #define fwol_nofl_debug(params...) \ 50 QDF_TRACE_DEBUG_NO_FL(QDF_MODULE_ID_FWOL, params) 51 52 /** 53 * enum wlan_fwol_southbound_event - fw offload south bound event type 54 * @WLAN_FWOL_EVT_INVALID: invalid/unknown value 55 * @WLAN_FWOL_EVT_GET_ELNA_BYPASS_RESPONSE: get eLNA bypass response 56 * @WLAN_FWOL_EVT_GET_THERMAL_STATS_RESPONSE: get Thermal Stats response 57 * @WLAN_FWOL_EVT_LAST: internal use 58 * @WLAN_FWOL_EVT_MAX: value of last valid enumerator 59 */ 60 enum wlan_fwol_southbound_event { 61 WLAN_FWOL_EVT_INVALID = 0, 62 WLAN_FWOL_EVT_GET_ELNA_BYPASS_RESPONSE, 63 WLAN_FWOL_EVT_GET_THERMAL_STATS_RESPONSE, 64 WLAN_FWOL_EVT_LAST, 65 WLAN_FWOL_EVT_MAX = WLAN_FWOL_EVT_LAST - 1 66 }; 67 68 /** 69 * struct wlan_fwol_coex_config - BTC config items 70 * @btc_mode: Config BTC mode 71 * @antenna_isolation: Antenna isolation 72 * @max_tx_power_for_btc: Max wlan tx power in co-ex scenario 73 * @wlan_low_rssi_threshold: Wlan low rssi threshold for BTC mode switching 74 * @bt_low_rssi_threshold: BT low rssi threshold for BTC mode switching 75 * @bt_interference_low_ll: Lower limit of low level BT interference 76 * @bt_interference_low_ul: Upper limit of low level BT interference 77 * @bt_interference_medium_ll: Lower limit of medium level BT interference 78 * @bt_interference_medium_ul: Upper limit of medium level BT interference 79 * @bt_interference_high_ll: Lower limit of high level BT interference 80 * @bt_interference_high_ul: Upper limit of high level BT interference 81 * @btc_mpta_helper_enable: Enable/Disable tri-radio MPTA helper 82 * @bt_sco_allow_wlan_2g_scan: Enable/Disable wlan 2g scan when 83 * BT SCO connection is on 84 * @btc_three_way_coex_config_legacy_enable: Enable/Disable tri-radio coex 85 * config legacy feature 86 * @ble_scan_coex_policy: BLE Scan policy, true - better BLE scan result, false 87 * better wlan throughput 88 * @coex_tput_shaping_enable: wifi traffic shaping enable, true - enable, 89 * false - disable 90 */ 91 struct wlan_fwol_coex_config { 92 uint8_t btc_mode; 93 uint8_t antenna_isolation; 94 uint8_t max_tx_power_for_btc; 95 int16_t wlan_low_rssi_threshold; 96 int16_t bt_low_rssi_threshold; 97 int16_t bt_interference_low_ll; 98 int16_t bt_interference_low_ul; 99 int16_t bt_interference_medium_ll; 100 int16_t bt_interference_medium_ul; 101 int16_t bt_interference_high_ll; 102 int16_t bt_interference_high_ul; 103 #ifdef FEATURE_MPTA_HELPER 104 bool btc_mpta_helper_enable; 105 #endif 106 bool bt_sco_allow_wlan_2g_scan; 107 #ifdef FEATURE_COEX_CONFIG 108 bool btc_three_way_coex_config_legacy_enable; 109 #endif 110 bool ble_scan_coex_policy; 111 #ifdef FEATURE_COEX_TPUT_SHAPING_CONFIG 112 bool coex_tput_shaping_enable; 113 #endif 114 }; 115 116 #define FWOL_THERMAL_LEVEL_MAX 6 117 #define FWOL_THERMAL_THROTTLE_LEVEL_MAX 6 118 /** 119 * struct wlan_fwol_thermal_temp - Thermal temperature config items 120 * @thermal_temp_min_level: Array of temperature minimum levels 121 * @thermal_temp_max_level: Array of temperature maximum levels 122 * @thermal_mitigation_enable: Control for Thermal mitigation feature 123 * @throttle_period: Thermal throttle period value 124 * @throttle_dutycycle_level: Array of throttle duty cycle levels 125 * @thermal_sampling_time: sampling time for thermal mitigation in ms 126 * @mon_id: Monitor client id either the wpps or apps 127 * @priority_apps: Priority of the apps mitigation to consider by fw 128 * @priority_wpps: Priority of the wpps mitigation to consider by fw 129 * @thermal_action: thermal action as defined enum thermal_mgmt_action_code 130 * @therm_stats_offset: thermal temp offset as set in gThermalStatsTempOffset 131 */ 132 struct wlan_fwol_thermal_temp { 133 bool thermal_mitigation_enable; 134 uint32_t throttle_period; 135 uint16_t thermal_temp_min_level[FWOL_THERMAL_LEVEL_MAX]; 136 uint16_t thermal_temp_max_level[FWOL_THERMAL_LEVEL_MAX]; 137 uint32_t throttle_dutycycle_level[FWOL_THERMAL_THROTTLE_LEVEL_MAX]; 138 uint16_t thermal_sampling_time; 139 uint8_t mon_id; 140 uint8_t priority_apps; 141 uint8_t priority_wpps; 142 enum thermal_mgmt_action_code thermal_action; 143 #ifdef THERMAL_STATS_SUPPORT 144 uint8_t therm_stats_offset; 145 #endif 146 }; 147 148 /** 149 * struct wlan_fwol_ie_allowlist - Probe request IE allowlist config items 150 * @ie_allowlist: IE allowlist flag 151 * @ie_bitmap_0: IE bitmap 0 152 * @ie_bitmap_1: IE bitmap 1 153 * @ie_bitmap_2: IE bitmap 2 154 * @ie_bitmap_3: IE bitmap 3 155 * @ie_bitmap_4: IE bitmap 4 156 * @ie_bitmap_5: IE bitmap 5 157 * @ie_bitmap_6: IE bitmap 6 158 * @ie_bitmap_7: IE bitmap 7 159 * @no_of_probe_req_ouis: Total number of ouis present in probe req 160 * @probe_req_voui: Stores oui values after parsing probe req ouis 161 */ 162 struct wlan_fwol_ie_allowlist { 163 bool ie_allowlist; 164 uint32_t ie_bitmap_0; 165 uint32_t ie_bitmap_1; 166 uint32_t ie_bitmap_2; 167 uint32_t ie_bitmap_3; 168 uint32_t ie_bitmap_4; 169 uint32_t ie_bitmap_5; 170 uint32_t ie_bitmap_6; 171 uint32_t ie_bitmap_7; 172 uint32_t no_of_probe_req_ouis; 173 uint32_t probe_req_voui[MAX_PROBE_REQ_OUIS]; 174 }; 175 176 /** 177 * struct wlan_fwol_neighbor_report_cfg - Neighbor report config params 178 * @enable_bitmask: Neighbor report offload bitmask control 179 * @params_bitmask: Param validity bitmask 180 * @time_offset: Neighbor report frame time offset 181 * @low_rssi_offset: Low RSSI offset 182 * @bmiss_count_trigger: Beacon miss trigger count 183 * @per_threshold_offset: PER Threshold offset 184 * @cache_timeout: Cache timeout 185 * @max_req_cap: Max request per peer 186 */ 187 struct wlan_fwol_neighbor_report_cfg { 188 uint32_t enable_bitmask; 189 uint32_t params_bitmask; 190 uint32_t time_offset; 191 uint32_t low_rssi_offset; 192 uint32_t bmiss_count_trigger; 193 uint32_t per_threshold_offset; 194 uint32_t cache_timeout; 195 uint32_t max_req_cap; 196 }; 197 198 #ifdef WLAN_FEATURE_TSF_ACCURACY 199 /** 200 * struct wlan_fwol_tsf_accuracy_configs - TSF Accuracy feature config params 201 * @enable: Flag to Enable/Disable TSF Accuracy Feature 202 * @sync_gpio: GPIO to indicate TSF sync is done. The GPIO pin is toggled at 203 * every TSF sync done. 204 * @periodic_pulse_gpio: GPIO to indicate TSF time completes a cycle of given 205 * interval. The GPIO pin gets pulse of 1msec for every 206 * TSF cycle complete. 207 * @pulse_interval_ms: Periodicy of TSF pulse in milli seconds. 208 */ 209 struct wlan_fwol_tsf_accuracy_configs { 210 bool enable; 211 uint32_t sync_gpio; 212 uint32_t periodic_pulse_gpio; 213 uint32_t pulse_interval_ms; 214 }; 215 #endif 216 217 /** 218 * struct wlan_fwol_cfg - fwol config items 219 * @coex_config: coex config items 220 * @thermal_temp_cfg: Thermal temperature related config items 221 * @ie_allowlist_cfg: IE Allowlist related config items 222 * @neighbor_report_cfg: 11K neighbor report config 223 * @ani_enabled: ANI enable/disable 224 * @pcie_config: to control pcie gen and lane params 225 * @enable_rts_sifsbursting: Enable RTS SIFS Bursting 226 * @enable_sifs_burst: Enable SIFS burst 227 * @max_mpdus_inampdu: Max number of MPDUS 228 * @enable_phy_reg_retention: Enable PHY reg retention 229 * @upper_brssi_thresh: Upper BRSSI threshold 230 * @lower_brssi_thresh: Lower BRSSI threshold 231 * @enable_dtim_1chrx: Enable/disable DTIM 1 CHRX 232 * @alternative_chainmask_enabled: Alternate chainmask 233 * @smart_chainmask_enabled: Enable/disable chainmask 234 * @get_rts_profile: Set the RTS profile 235 * @enable_fw_log_level: Set the FW log level 236 * @enable_fw_log_type: Set the FW log type 237 * @enable_fw_module_log_level: enable fw module log level 238 * @enable_fw_module_log_level_num: enable fw module log level num 239 * @enable_fw_mod_wow_log_level: enable fw wow module log level 240 * @enable_fw_mod_wow_log_level_num: enable fw wow module log level num 241 * @sap_xlna_bypass: bypass SAP xLNA 242 * @is_rate_limit_enabled: Enable/disable RA rate limited 243 * @tsf_gpio_pin: TSF GPIO Pin config 244 * @tsf_irq_host_gpio_pin: TSF GPIO Pin config 245 * @tsf_sync_host_gpio_pin: TSF Sync GPIO Pin config 246 * @tsf_ptp_options: TSF Plus feature options config 247 * @tsf_sync_enable: TSF sync feature enable/disable 248 * @tsf_accuracy_configs: TSF Accuracy feature config parameters 249 * @sae_enable: SAE feature enable config 250 * @gcmp_enable: GCMP feature enable config 251 * @enable_tx_sch_delay: Enable TX SCH delay value config 252 * @enable_secondary_rate: Enable secondary retry rate config 253 * @enable_dhcp_server_offload: DHCP Offload is enabled or not 254 * @dhcp_max_num_clients: Max number of DHCP client supported 255 * @dwelltime_params: adaptive dwell time parameters 256 * @enable_ilp: ILP HW block configuration 257 * @sap_sho: SAP SHO HW offload configuration 258 * @disable_hw_assist: Flag to configure HW assist feature in FW 259 * @enable_ofdm_scrambler_seed: Decide to enable/disable OFDM scrambler seed 260 */ 261 struct wlan_fwol_cfg { 262 /* Add CFG and INI items here */ 263 struct wlan_fwol_coex_config coex_config; 264 struct wlan_fwol_thermal_temp thermal_temp_cfg; 265 struct wlan_fwol_ie_allowlist ie_allowlist_cfg; 266 struct wlan_fwol_neighbor_report_cfg neighbor_report_cfg; 267 bool ani_enabled; 268 uint8_t pcie_config; 269 bool enable_rts_sifsbursting; 270 uint8_t enable_sifs_burst; 271 uint8_t max_mpdus_inampdu; 272 uint8_t enable_phy_reg_retention; 273 uint16_t upper_brssi_thresh; 274 uint16_t lower_brssi_thresh; 275 bool enable_dtim_1chrx; 276 bool alternative_chainmask_enabled; 277 bool smart_chainmask_enabled; 278 uint16_t get_rts_profile; 279 uint16_t enable_fw_log_level; 280 uint16_t enable_fw_log_type; 281 uint8_t enable_fw_module_log_level[FW_MODULE_LOG_LEVEL_STRING_LENGTH]; 282 uint8_t enable_fw_module_log_level_num; 283 uint8_t enable_fw_mod_wow_log_level[FW_MODULE_LOG_LEVEL_STRING_LENGTH]; 284 uint8_t enable_fw_mod_wow_log_level_num; 285 bool sap_xlna_bypass; 286 #ifdef FEATURE_WLAN_RA_FILTERING 287 bool is_rate_limit_enabled; 288 #endif 289 #ifdef WLAN_FEATURE_TSF 290 uint32_t tsf_gpio_pin; 291 #ifdef WLAN_FEATURE_TSF_PLUS 292 uint32_t tsf_ptp_options; 293 bool tsf_sync_enable; 294 #ifdef WLAN_FEATURE_TSF_ACCURACY 295 struct wlan_fwol_tsf_accuracy_configs tsf_accuracy_configs; 296 #endif 297 #ifdef WLAN_FEATURE_TSF_PLUS_EXT_GPIO_IRQ 298 uint32_t tsf_irq_host_gpio_pin; 299 #endif 300 #ifdef WLAN_FEATURE_TSF_PLUS_EXT_GPIO_SYNC 301 uint32_t tsf_sync_host_gpio_pin; 302 #endif 303 #endif 304 #endif 305 #ifdef WLAN_FEATURE_SAE 306 bool sae_enable; 307 #endif 308 bool gcmp_enable; 309 uint8_t enable_tx_sch_delay; 310 uint32_t enable_secondary_rate; 311 #ifdef DHCP_SERVER_OFFLOAD 312 bool enable_dhcp_server_offload; 313 uint32_t dhcp_max_num_clients; 314 #endif 315 struct adaptive_dwelltime_params dwelltime_params; 316 uint32_t enable_ilp; 317 uint32_t sap_sho; 318 bool disable_hw_assist; 319 #ifdef WLAN_FEATURE_OFDM_SCRAMBLER_SEED 320 bool enable_ofdm_scrambler_seed; 321 #endif 322 }; 323 324 /** 325 * struct wlan_fwol_thermal_throttle_info - FW offload thermal throttle info 326 * @level: thermal throttle level 327 * @pdev_id: pdev id 328 */ 329 struct wlan_fwol_thermal_throttle_info { 330 enum thermal_throttle_level level; 331 uint32_t pdev_id; 332 }; 333 334 /** 335 * struct wlan_fwol_capability_info - FW offload capability component 336 * @fw_thermal_stats_cap: Thermal Stats Fw capability 337 */ 338 struct wlan_fwol_capability_info { 339 #ifdef THERMAL_STATS_SUPPORT 340 bool fw_thermal_stats_cap; 341 #endif 342 }; 343 344 /** 345 * struct wlan_fwol_psoc_obj - FW offload psoc priv object 346 * @cfg: cfg items 347 * @cbs: callback functions 348 * @tx_ops: tx operations for target interface 349 * @rx_ops: rx operations for target interface 350 * @thermal_throttle: cached target thermal stats information 351 * @thermal_cbs: thermal notification callbacks to hdd layer 352 * @capability_info: fwol capability info 353 */ 354 struct wlan_fwol_psoc_obj { 355 struct wlan_fwol_cfg cfg; 356 struct wlan_fwol_callbacks cbs; 357 struct wlan_fwol_tx_ops tx_ops; 358 struct wlan_fwol_rx_ops rx_ops; 359 #ifdef FW_THERMAL_THROTTLE_SUPPORT 360 struct wlan_fwol_thermal_throttle_info thermal_throttle; 361 struct fwol_thermal_callbacks thermal_cbs; 362 #endif 363 struct wlan_fwol_capability_info capability_info; 364 }; 365 366 /** 367 * struct wlan_fwol_rx_event - event from south bound 368 * @psoc: psoc handle 369 * @event_id: event ID 370 * @get_elna_bypass_response: get eLNA bypass response 371 * @get_thermal_stats_response: get thermal stats response 372 */ 373 struct wlan_fwol_rx_event { 374 struct wlan_objmgr_psoc *psoc; 375 enum wlan_fwol_southbound_event event_id; 376 union { 377 #ifdef WLAN_FEATURE_ELNA 378 struct get_elna_bypass_response get_elna_bypass_response; 379 #endif 380 #ifdef THERMAL_STATS_SUPPORT 381 struct thermal_throttle_info get_thermal_stats_response; 382 #endif 383 }; 384 }; 385 386 /** 387 * fwol_get_psoc_obj() - private API to get fwol object from psoc 388 * @psoc: psoc object 389 * 390 * Return: fwol object 391 */ 392 struct wlan_fwol_psoc_obj *fwol_get_psoc_obj(struct wlan_objmgr_psoc *psoc); 393 394 /** 395 * fwol_cfg_on_psoc_enable() - Populate FWOL structure from CFG and INI 396 * @psoc: pointer to the psoc object 397 * 398 * Populate the FWOL CFG structure from CFG and INI values using CFG APIs 399 * 400 * Return: QDF_STATUS 401 */ 402 QDF_STATUS fwol_cfg_on_psoc_enable(struct wlan_objmgr_psoc *psoc); 403 404 /** 405 * fwol_cfg_on_psoc_disable() - Clear the CFG structure on psoc disable 406 * @psoc: pointer to the psoc object 407 * 408 * Clear the FWOL CFG structure on psoc disable 409 * 410 * Return: QDF_STATUS 411 */ 412 QDF_STATUS fwol_cfg_on_psoc_disable(struct wlan_objmgr_psoc *psoc); 413 414 /** 415 * fwol_process_event() - API to process event from south bound 416 * @msg: south bound message 417 * 418 * Return: QDF_STATUS_SUCCESS on success 419 */ 420 QDF_STATUS fwol_process_event(struct scheduler_msg *msg); 421 422 /** 423 * fwol_release_rx_event() - Release fw offload RX event 424 * @event: fw offload RX event 425 * 426 * Return: none 427 */ 428 void fwol_release_rx_event(struct wlan_fwol_rx_event *event); 429 430 /** 431 * fwol_init_neighbor_report_cfg() - Populate default neighbor report CFG values 432 * @psoc: pointer to the psoc object 433 * @fwol_neighbor_report_cfg: Pointer to Neighbor report config data structure 434 * 435 * Return: QDF_STATUS 436 */ 437 QDF_STATUS fwol_init_neighbor_report_cfg(struct wlan_objmgr_psoc *psoc, 438 struct wlan_fwol_neighbor_report_cfg 439 *fwol_neighbor_report_cfg); 440 441 /** 442 * fwol_init_adapt_dwelltime_in_cfg() - initialize adaptive dwell time params 443 * @psoc: Pointer to struct wlan_objmgr_psoc context 444 * @dwelltime_params: Pointer to dwell time params 445 * 446 * This function parses initialize the adaptive dwell params from ini. 447 * 448 * Return: QDF_STATUS 449 */ 450 QDF_STATUS 451 fwol_init_adapt_dwelltime_in_cfg( 452 struct wlan_objmgr_psoc *psoc, 453 struct adaptive_dwelltime_params *dwelltime_params); 454 455 /** 456 * fwol_set_adaptive_dwelltime_config() - API to set adaptive dwell params 457 * config 458 * @dwelltime_params: adaptive_dwelltime_params structure 459 * 460 * Return: QDF Status 461 */ 462 QDF_STATUS 463 fwol_set_adaptive_dwelltime_config( 464 struct adaptive_dwelltime_params *dwelltime_params); 465 466 /** 467 * fwol_set_ilp_config() - API to set ILP HW block config 468 * @pdev: pointer to the pdev object 469 * @enable_ilp: ILP HW block configuration with various options 470 * 471 * Return: QDF_STATUS 472 */ 473 QDF_STATUS fwol_set_ilp_config(struct wlan_objmgr_pdev *pdev, 474 uint32_t enable_ilp); 475 476 /** 477 * fwol_set_sap_sho() - API to set SAP SHO config 478 * @psoc: pointer to the psoc object 479 * @vdev_id: vdev id 480 * @sap_sho: enable/disable config for SAP SHO 481 * SHO- SoftAP hardware offload – When enabled the beacon/probe resp 482 * will be offloaded to HW. 483 * 484 * Return: QDF_STATUS 485 */ 486 QDF_STATUS fwol_set_sap_sho(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, 487 uint32_t sap_sho); 488 489 /** 490 * fwol_configure_hw_assist() - API to configure HW assist feature in FW 491 * @pdev: pointer to the pdev object 492 * @disable_hw_assist: Flag to enable/disable HW assist feature 493 * 494 * Return: QDF_STATUS 495 */ 496 QDF_STATUS fwol_configure_hw_assist(struct wlan_objmgr_pdev *pdev, 497 bool disable_hw_assist); 498 499 /** 500 * fwol_set_sap_wds_config() - API to configure WDS mode on SAP vdev 501 * @psoc: pointer to the psoc object 502 * @vdev_id: vdev id 503 * 504 * Return: QDF_STATUS 505 */ 506 #ifdef FEATURE_WDS 507 QDF_STATUS 508 fwol_set_sap_wds_config(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id); 509 #else 510 static inline QDF_STATUS fwol_set_sap_wds_config(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id)511 fwol_set_sap_wds_config(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id) 512 { 513 return QDF_STATUS_SUCCESS; 514 } 515 #endif 516 #endif 517