blob: 16fcd337906891926a85e6096daac980268dcceb [file] [log] [blame]
Sourav Mohapatra113685f2018-08-29 14:21:55 +05301/*
Harprit Chhabadad59ae762019-01-08 16:40:43 -08002 * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
Sourav Mohapatra113685f2018-08-29 14:21:55 +05303 *
4 * Permission to use, copy, modify, and/or distribute this software for
5 * any purpose with or without fee is hereby granted, provided that the
6 * above copyright notice and this permission notice appear in all
7 * copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16 * PERFORMANCE OF THIS SOFTWARE.
17 */
18/**
19 * DOC: define internal APIs related to the fwol component
20 */
21
22#include "wlan_fw_offload_main.h"
Harprit Chhabadad59ae762019-01-08 16:40:43 -080023#include "cds_api.h"
24#include "wma.h"
Sourav Mohapatra113685f2018-08-29 14:21:55 +053025
26struct wlan_fwol_psoc_obj *fwol_get_psoc_obj(struct wlan_objmgr_psoc *psoc)
27{
28 return wlan_objmgr_psoc_get_comp_private_obj(psoc,
29 WLAN_UMAC_COMP_FWOL);
30}
31
stonezc9936cb2019-03-11 16:41:22 +080032/**
33 * fwol_mpta_helper_config_get: Populate btc_mpta_helper_enable from cfg
34 * @psoc: The global psoc handler
35 * @coex_config: The cfg structure
36 *
37 * Return: none
38 */
39#ifdef FEATURE_MPTA_HELPER
40static void
41fwol_mpta_helper_config_get(struct wlan_objmgr_psoc *psoc,
42 struct wlan_fwol_coex_config *coex_config)
43{
44 coex_config->btc_mpta_helper_enable =
45 cfg_get(psoc, CFG_COEX_MPTA_HELPER);
46}
47#else
48static void
49fwol_mpta_helper_config_get(struct wlan_objmgr_psoc *psoc,
50 struct wlan_fwol_coex_config *coex_config)
51{
52}
53#endif
54
guangde963710d2019-07-02 15:51:15 +080055/**
56 * fwol_three_way_coex_config_legacy_config_get: Populate
57 * btc_three_way_coex_config_legacy_enable from cfg
58 * @psoc: The global psoc handler
59 * @coex_config: The cfg structure
60 *
61 * Return: none
62 */
63#ifdef FEATURE_COEX_CONFIG
64static void
65fwol_three_way_coex_config_legacy_config_get(
66 struct wlan_objmgr_psoc *psoc,
67 struct wlan_fwol_coex_config *coex_config)
68{
69 coex_config->btc_three_way_coex_config_legacy_enable =
70 cfg_get(psoc, CFG_THREE_WAY_COEX_CONFIG_LEGACY);
71}
72#else
73static void
74fwol_three_way_coex_config_legacy_config_get(
75 struct wlan_objmgr_psoc *psoc,
76 struct wlan_fwol_coex_config *coex_config)
77{
78}
79#endif
80
Dundi Raviteja3b637092018-09-12 13:42:50 +053081static void
Dundi Raviteja85a240a2018-09-10 15:03:07 +053082fwol_init_coex_config_in_cfg(struct wlan_objmgr_psoc *psoc,
83 struct wlan_fwol_coex_config *coex_config)
Dundi Raviteja3b637092018-09-12 13:42:50 +053084{
85 coex_config->btc_mode = cfg_get(psoc, CFG_BTC_MODE);
86 coex_config->antenna_isolation = cfg_get(psoc, CFG_ANTENNA_ISOLATION);
87 coex_config->max_tx_power_for_btc =
88 cfg_get(psoc, CFG_MAX_TX_POWER_FOR_BTC);
89 coex_config->wlan_low_rssi_threshold =
90 cfg_get(psoc, CFG_WLAN_LOW_RSSI_THRESHOLD);
91 coex_config->bt_low_rssi_threshold =
92 cfg_get(psoc, CFG_BT_LOW_RSSI_THRESHOLD);
93 coex_config->bt_interference_low_ll =
94 cfg_get(psoc, CFG_BT_INTERFERENCE_LOW_LL);
95 coex_config->bt_interference_low_ul =
96 cfg_get(psoc, CFG_BT_INTERFERENCE_LOW_UL);
97 coex_config->bt_interference_medium_ll =
98 cfg_get(psoc, CFG_BT_INTERFERENCE_MEDIUM_LL);
99 coex_config->bt_interference_medium_ul =
100 cfg_get(psoc, CFG_BT_INTERFERENCE_MEDIUM_UL);
101 coex_config->bt_interference_high_ll =
102 cfg_get(psoc, CFG_BT_INTERFERENCE_HIGH_LL);
103 coex_config->bt_interference_high_ul =
104 cfg_get(psoc, CFG_BT_INTERFERENCE_HIGH_UL);
stonezc9936cb2019-03-11 16:41:22 +0800105 fwol_mpta_helper_config_get(psoc, coex_config);
hqu1dd504a2019-06-04 11:24:11 +0800106 coex_config->bt_sco_allow_wlan_2g_scan =
107 cfg_get(psoc, CFG_BT_SCO_ALLOW_WLAN_2G_SCAN);
guangde963710d2019-07-02 15:51:15 +0800108 fwol_three_way_coex_config_legacy_config_get(psoc, coex_config);
Dundi Raviteja3b637092018-09-12 13:42:50 +0530109}
110
Dundi Raviteja47ac7092018-09-07 10:40:28 +0530111static void
Dundi Raviteja85a240a2018-09-10 15:03:07 +0530112fwol_init_thermal_temp_in_cfg(struct wlan_objmgr_psoc *psoc,
113 struct wlan_fwol_thermal_temp *thermal_temp)
Dundi Raviteja47ac7092018-09-07 10:40:28 +0530114{
Manikandan Mohan9045e2e2018-11-26 16:44:19 -0800115 thermal_temp->thermal_temp_min_level[0] =
Dundi Raviteja47ac7092018-09-07 10:40:28 +0530116 cfg_get(psoc, CFG_THERMAL_TEMP_MIN_LEVEL0);
Manikandan Mohan9045e2e2018-11-26 16:44:19 -0800117 thermal_temp->thermal_temp_max_level[0] =
Dundi Raviteja47ac7092018-09-07 10:40:28 +0530118 cfg_get(psoc, CFG_THERMAL_TEMP_MAX_LEVEL0);
Manikandan Mohan9045e2e2018-11-26 16:44:19 -0800119 thermal_temp->thermal_temp_min_level[1] =
Dundi Raviteja47ac7092018-09-07 10:40:28 +0530120 cfg_get(psoc, CFG_THERMAL_TEMP_MIN_LEVEL1);
Manikandan Mohan9045e2e2018-11-26 16:44:19 -0800121 thermal_temp->thermal_temp_max_level[1] =
Dundi Raviteja47ac7092018-09-07 10:40:28 +0530122 cfg_get(psoc, CFG_THERMAL_TEMP_MAX_LEVEL1);
Manikandan Mohan9045e2e2018-11-26 16:44:19 -0800123 thermal_temp->thermal_temp_min_level[2] =
Dundi Raviteja47ac7092018-09-07 10:40:28 +0530124 cfg_get(psoc, CFG_THERMAL_TEMP_MIN_LEVEL2);
Manikandan Mohan9045e2e2018-11-26 16:44:19 -0800125 thermal_temp->thermal_temp_max_level[2] =
Dundi Raviteja47ac7092018-09-07 10:40:28 +0530126 cfg_get(psoc, CFG_THERMAL_TEMP_MAX_LEVEL2);
Manikandan Mohan9045e2e2018-11-26 16:44:19 -0800127 thermal_temp->thermal_temp_min_level[3] =
Dundi Raviteja47ac7092018-09-07 10:40:28 +0530128 cfg_get(psoc, CFG_THERMAL_TEMP_MIN_LEVEL3);
Manikandan Mohan9045e2e2018-11-26 16:44:19 -0800129 thermal_temp->thermal_temp_max_level[3] =
Dundi Raviteja47ac7092018-09-07 10:40:28 +0530130 cfg_get(psoc, CFG_THERMAL_TEMP_MAX_LEVEL3);
Manikandan Mohan9045e2e2018-11-26 16:44:19 -0800131
132 thermal_temp->thermal_mitigation_enable =
133 cfg_get(psoc, CFG_THERMAL_MITIGATION_ENABLE);
134 thermal_temp->throttle_period = cfg_get(psoc, CFG_THROTTLE_PERIOD);
135 thermal_temp->throttle_dutycycle_level[0] =
136 cfg_get(psoc, CFG_THROTTLE_DUTY_CYCLE_LEVEL0);
137 thermal_temp->throttle_dutycycle_level[1]=
138 cfg_get(psoc, CFG_THROTTLE_DUTY_CYCLE_LEVEL1);
139 thermal_temp->throttle_dutycycle_level[2]=
140 cfg_get(psoc, CFG_THROTTLE_DUTY_CYCLE_LEVEL2);
141 thermal_temp->throttle_dutycycle_level[3]=
142 cfg_get(psoc, CFG_THROTTLE_DUTY_CYCLE_LEVEL3);
Dundi Raviteja47ac7092018-09-07 10:40:28 +0530143}
144
Manikandan Mohan06d38d82018-11-26 18:36:58 -0800145QDF_STATUS fwol_init_neighbor_report_cfg(struct wlan_objmgr_psoc *psoc,
146 struct wlan_fwol_neighbor_report_cfg
147 *fwol_neighbor_report_cfg)
148{
149 if (!fwol_neighbor_report_cfg) {
150 fwol_err("Neighbor report config pointer null");
151 return QDF_STATUS_E_FAILURE;
152 }
153
154 fwol_neighbor_report_cfg->enable_bitmask =
155 cfg_get(psoc, CFG_OFFLOAD_11K_ENABLE_BITMASK);
156 fwol_neighbor_report_cfg->params_bitmask =
157 cfg_get(psoc, CFG_OFFLOAD_NEIGHBOR_REPORT_PARAMS_BITMASK);
158 fwol_neighbor_report_cfg->time_offset =
159 cfg_get(psoc, CFG_OFFLOAD_NEIGHBOR_REPORT_TIME_OFFSET);
160 fwol_neighbor_report_cfg->low_rssi_offset =
161 cfg_get(psoc, CFG_OFFLOAD_NEIGHBOR_REPORT_LOW_RSSI_OFFSET);
162 fwol_neighbor_report_cfg->bmiss_count_trigger =
163 cfg_get(psoc, CFG_OFFLOAD_NEIGHBOR_REPORT_BMISS_COUNT_TRIGGER);
164 fwol_neighbor_report_cfg->per_threshold_offset =
165 cfg_get(psoc, CFG_OFFLOAD_NEIGHBOR_REPORT_PER_THRESHOLD_OFFSET);
166 fwol_neighbor_report_cfg->cache_timeout =
167 cfg_get(psoc, CFG_OFFLOAD_NEIGHBOR_REPORT_CACHE_TIMEOUT);
168 fwol_neighbor_report_cfg->max_req_cap =
169 cfg_get(psoc, CFG_OFFLOAD_NEIGHBOR_REPORT_MAX_REQ_CAP);
170
171 return QDF_STATUS_SUCCESS;
172}
173
Harprit Chhabadad59ae762019-01-08 16:40:43 -0800174QDF_STATUS
175fwol_init_adapt_dwelltime_in_cfg(
176 struct wlan_objmgr_psoc *psoc,
177 struct adaptive_dwelltime_params *dwelltime_params)
178{
179 if (!dwelltime_params) {
180 fwol_err("dwelltime params config pointer null");
181 return QDF_STATUS_E_FAILURE;
182 }
183 dwelltime_params->is_enabled =
184 cfg_get(psoc, CFG_ADAPTIVE_DWELL_MODE_ENABLED);
185 dwelltime_params->dwelltime_mode =
186 cfg_get(psoc, CFG_GLOBAL_ADAPTIVE_DWELL_MODE);
187 dwelltime_params->lpf_weight =
188 cfg_get(psoc, CFG_ADAPT_DWELL_LPF_WEIGHT);
189 dwelltime_params->passive_mon_intval =
190 cfg_get(psoc, CFG_ADAPT_DWELL_PASMON_INTVAL);
191 dwelltime_params->wifi_act_threshold =
192 cfg_get(psoc, CFG_ADAPT_DWELL_WIFI_THRESH);
193
194 return QDF_STATUS_SUCCESS;
195}
196
197QDF_STATUS
198fwol_set_adaptive_dwelltime_config(
199 struct adaptive_dwelltime_params *dwelltime_params)
200{
201 tp_wma_handle wma_handle;
202 QDF_STATUS status;
203
204 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
205 if (!wma_handle) {
206 fwol_err("wma handle is null");
207 return QDF_STATUS_E_FAILURE;
208 }
209 status = wma_send_adapt_dwelltime_params(wma_handle,
210 dwelltime_params);
211 return status;
212}
Dundi Raviteja9ab4e7b2018-09-28 14:18:28 +0530213/**
214 * fwol_parse_probe_req_ouis - form ouis from ini gProbeReqOUIs
215 * @psoc: Pointer to struct wlan_objmgr_psoc context
216 * @whitelist: Pointer to struct wlan_fwol_ie_whitelist
217 *
218 * This function parses the ini string gProbeReqOUIs which needs be to in the
219 * following format:
220 * "<8 characters of [0-9] or [A-F]>space<8 characters from [0-9] etc.,"
221 * example: "AABBCCDD 1122EEFF"
222 * and the logic counts the number of OUIS and allocates the memory
223 * for every valid OUI and is stored in struct hdd_context
224 *
225 * Return: None
226 */
227static void fwol_parse_probe_req_ouis(struct wlan_objmgr_psoc *psoc,
228 struct wlan_fwol_ie_whitelist *whitelist)
229{
230 uint8_t probe_req_ouis[MAX_PRB_REQ_VENDOR_OUI_INI_LEN] = {0};
231 uint32_t *voui = whitelist->probe_req_voui;
232 char *str;
233 uint8_t *token;
234 uint32_t oui_indx = 0;
235 int ret;
236 uint32_t hex_value;
237
238 qdf_str_lcopy(probe_req_ouis, cfg_get(psoc, CFG_PROBE_REQ_OUI),
239 MAX_PRB_REQ_VENDOR_OUI_INI_LEN);
240 str = probe_req_ouis;
241 whitelist->no_of_probe_req_ouis = 0;
242
243 if (!qdf_str_len(str)) {
244 fwol_info("NO OUIs to parse");
245 return;
246 }
247
248 token = strsep(&str, " ");
249 while (token) {
250 if (qdf_str_len(token) != 8)
251 goto next_token;
252
253 ret = qdf_kstrtouint(token, 16, &hex_value);
254 if (ret)
255 goto next_token;
256
257 voui[oui_indx++] = cpu_to_be32(hex_value);
258 if (oui_indx >= MAX_PROBE_REQ_OUIS)
259 break;
260next_token:
261 token = strsep(&str, " ");
262 }
263
264 if (!oui_indx) {
265 whitelist->ie_whitelist = false;
266 return;
267 }
268
269 whitelist->no_of_probe_req_ouis = oui_indx;
270}
271
272/**
273 * fwol_validate_ie_bitmaps() - Validate all IE whitelist bitmap param values
274 * @psoc: Pointer to struct wlan_objmgr_psoc
275 * @whitelist: Pointer to struct wlan_fwol_ie_whitelist
276 *
277 * Return: True if all bitmap values are valid, else false
278 */
279static bool fwol_validate_ie_bitmaps(struct wlan_objmgr_psoc *psoc,
280 struct wlan_fwol_ie_whitelist *whitelist)
281{
282 if (!(whitelist->ie_bitmap_0 && whitelist->ie_bitmap_1 &&
283 whitelist->ie_bitmap_2 && whitelist->ie_bitmap_3 &&
284 whitelist->ie_bitmap_4 && whitelist->ie_bitmap_5 &&
285 whitelist->ie_bitmap_6 && whitelist->ie_bitmap_7))
286 return false;
287
288 /*
289 * check whether vendor oui IE is set and OUIs are present, each OUI
290 * is entered in the form of string of 8 characters from ini, therefore,
291 * for atleast one OUI, minimum length is 8 and hence this string length
292 * is checked for minimum of 8
293 */
294 if ((whitelist->ie_bitmap_6 & VENDOR_SPECIFIC_IE_BITMAP) &&
295 (qdf_str_len(cfg_get(psoc, CFG_PROBE_REQ_OUI)) < 8))
296 return false;
297
298 /* check whether vendor oui IE is not set but OUIs are present */
299 if (!(whitelist->ie_bitmap_6 & VENDOR_SPECIFIC_IE_BITMAP) &&
300 (qdf_str_len(cfg_get(psoc, CFG_PROBE_REQ_OUI)) > 0))
301 return false;
302
303 return true;
304}
305
Dundi Raviteja85a240a2018-09-10 15:03:07 +0530306static void
307fwol_init_ie_whiltelist_in_cfg(struct wlan_objmgr_psoc *psoc,
308 struct wlan_fwol_ie_whitelist *whitelist)
309{
310 whitelist->ie_whitelist = cfg_get(psoc, CFG_PROBE_REQ_IE_WHITELIST);
311 whitelist->ie_bitmap_0 = cfg_get(psoc, CFG_PROBE_REQ_IE_BIT_MAP0);
312 whitelist->ie_bitmap_1 = cfg_get(psoc, CFG_PROBE_REQ_IE_BIT_MAP1);
313 whitelist->ie_bitmap_2 = cfg_get(psoc, CFG_PROBE_REQ_IE_BIT_MAP2);
314 whitelist->ie_bitmap_3 = cfg_get(psoc, CFG_PROBE_REQ_IE_BIT_MAP3);
315 whitelist->ie_bitmap_4 = cfg_get(psoc, CFG_PROBE_REQ_IE_BIT_MAP4);
316 whitelist->ie_bitmap_5 = cfg_get(psoc, CFG_PROBE_REQ_IE_BIT_MAP5);
317 whitelist->ie_bitmap_6 = cfg_get(psoc, CFG_PROBE_REQ_IE_BIT_MAP6);
318 whitelist->ie_bitmap_7 = cfg_get(psoc, CFG_PROBE_REQ_IE_BIT_MAP7);
Dundi Raviteja9ab4e7b2018-09-28 14:18:28 +0530319 if (!fwol_validate_ie_bitmaps(psoc, whitelist))
320 whitelist->ie_whitelist = false;
321 fwol_parse_probe_req_ouis(psoc, whitelist);
Dundi Raviteja85a240a2018-09-10 15:03:07 +0530322}
323
Sourav Mohapatra0f3b8572018-09-12 10:03:51 +0530324/**
325 * ucfg_fwol_fetch_dhcp_server_settings: Populate the enable_dhcp_server_offload
326 * and dhcp_max_num_clients from cfg
327 * @psoc: The global psoc handler
328 * @fwol_cfg: The cfg structure
329 *
330 * Return: none
331 */
332#ifdef DHCP_SERVER_OFFLOAD
333static void ucfg_fwol_fetch_dhcp_server_settings(struct wlan_objmgr_psoc *psoc,
334 struct wlan_fwol_cfg *fwol_cfg)
335{
336 fwol_cfg->enable_dhcp_server_offload =
337 cfg_get(psoc, CFG_DHCP_SERVER_OFFLOAD_SUPPORT);
338 fwol_cfg->dhcp_max_num_clients =
339 cfg_get(psoc, CFG_DHCP_SERVER_OFFLOAD_NUM_CLIENT);
340}
341#else
342static void ucfg_fwol_fetch_dhcp_server_settings(struct wlan_objmgr_psoc *psoc,
343 struct wlan_fwol_cfg *fwol_cfg)
344{
345}
346#endif
347
348/**
349 * ucfg_fwol_fetch_tsf_gpio_pin: Populate the tsf_gpio_pin from cfg
350 * @psoc: The global psoc handler
351 * @fwol_cfg: The cfg structure
352 *
353 * Return: none
354 */
355#ifdef WLAN_FEATURE_TSF
356static void ucfg_fwol_fetch_tsf_gpio_pin(struct wlan_objmgr_psoc *psoc,
357 struct wlan_fwol_cfg *fwol_cfg)
358{
359 fwol_cfg->tsf_gpio_pin = cfg_get(psoc, CFG_SET_TSF_GPIO_PIN);
360}
361#else
362static void ucfg_fwol_fetch_tsf_gpio_pin(struct wlan_objmgr_psoc *psoc,
363 struct wlan_fwol_cfg *fwol_cfg)
364{
365}
366#endif
367
368/**
Manikandan Mohand350c192018-11-29 14:01:12 -0800369 * ucfg_fwol_init_tsf_ptp_options: Populate the tsf_ptp_options from cfg
370 * @psoc: The global psoc handler
371 * @fwol_cfg: The cfg structure
372 *
373 * Return: none
374 */
375#if defined(WLAN_FEATURE_TSF) && defined(WLAN_FEATURE_TSF_PLUS)
376static void ucfg_fwol_init_tsf_ptp_options(struct wlan_objmgr_psoc *psoc,
377 struct wlan_fwol_cfg *fwol_cfg)
378{
379 fwol_cfg->tsf_ptp_options = cfg_get(psoc, CFG_SET_TSF_PTP_OPT);
380}
381#else
382static void ucfg_fwol_init_tsf_ptp_options(struct wlan_objmgr_psoc *psoc,
383 struct wlan_fwol_cfg *fwol_cfg)
384{
385}
386#endif
387
Subrat Dash5f36fbe2019-02-12 16:28:14 +0530388#ifdef WLAN_FEATURE_TSF_PLUS_EXT_GPIO_IRQ
389/**
390 * ucfg_fwol_fetch_tsf_irq_host_gpio_pin: Populate the
391 * tsf_irq_host_gpio_pin from cfg
392 * @psoc: The global psoc handler
393 * @fwol_cfg: The cfg structure
394 *
395 * This function is used to populate the cfg value of host platform
396 * gpio pin configured to receive tsf interrupt from fw.
397 *
398 * Return: none
399 */
400static void
401ucfg_fwol_fetch_tsf_irq_host_gpio_pin(struct wlan_objmgr_psoc *psoc,
402 struct wlan_fwol_cfg *fwol_cfg)
403{
404 fwol_cfg->tsf_irq_host_gpio_pin =
405 cfg_get(psoc, CFG_SET_TSF_IRQ_HOST_GPIO_PIN);
406}
407#else
408static void
409ucfg_fwol_fetch_tsf_irq_host_gpio_pin(struct wlan_objmgr_psoc *psoc,
410 struct wlan_fwol_cfg *fwol_cfg)
411{
412}
413#endif
Subrat Dashb1e61b22019-07-22 14:09:34 +0530414
415#ifdef WLAN_FEATURE_TSF_PLUS_EXT_GPIO_SYNC
416/**
417 * ucfg_fwol_fetch_tsf_sync_host_gpio_pin: Populate the
418 * tsf_sync_host_gpio_pin from cfg
419 * @psoc: The global psoc handler
420 * @fwol_cfg: The cfg structure
421 *
422 * This function is used to populate the cfg value of host platform
423 * gpio pin configured to drive tsf sync interrupt pin on wlan chip.
424 *
425 * Return: none
426 */
427static void
428ucfg_fwol_fetch_tsf_sync_host_gpio_pin(struct wlan_objmgr_psoc *psoc,
429 struct wlan_fwol_cfg *fwol_cfg)
430{
431 fwol_cfg->tsf_sync_host_gpio_pin =
432 cfg_get(psoc, CFG_SET_TSF_SYNC_HOST_GPIO_PIN);
433}
434#else
435static void
436ucfg_fwol_fetch_tsf_sync_host_gpio_pin(struct wlan_objmgr_psoc *psoc,
437 struct wlan_fwol_cfg *fwol_cfg)
438{
439}
440#endif
Manikandan Mohand350c192018-11-29 14:01:12 -0800441/**
442 * ucfg_fwol_init_sae_cfg: Populate the sae control config from cfg
443 * @psoc: The global psoc handler
444 * @fwol_cfg: The cfg structure
445 *
446 * Return: none
447 */
448#ifdef WLAN_FEATURE_SAE
449static void ucfg_fwol_init_sae_cfg(struct wlan_objmgr_psoc *psoc,
450 struct wlan_fwol_cfg *fwol_cfg)
451{
452 fwol_cfg->sae_enable = cfg_get(psoc, CFG_IS_SAE_ENABLED);
453}
454#else
455static void ucfg_fwol_init_sae_cfg(struct wlan_objmgr_psoc *psoc,
456 struct wlan_fwol_cfg *fwol_cfg)
457{
458}
459#endif
460
461/**
Sourav Mohapatra0f3b8572018-09-12 10:03:51 +0530462 * ucfg_fwol_fetch_ra_filter: Populate the RA filter enabled or not from cfg
463 * @psoc: The global psoc handler
464 * @fwol_cfg: The cfg structure
465 *
466 * Return: none
467 */
468#ifdef FEATURE_WLAN_RA_FILTERING
469static void ucfg_fwol_fetch_ra_filter(struct wlan_objmgr_psoc *psoc,
470 struct wlan_fwol_cfg *fwol_cfg)
471{
472 fwol_cfg->is_rate_limit_enabled = cfg_get(psoc, CFG_RA_FILTER_ENABLE);
473}
474#else
475static void ucfg_fwol_fetch_ra_filter(struct wlan_objmgr_psoc *psoc,
476 struct wlan_fwol_cfg *fwol_cfg)
477{
478}
479#endif
480
Sourav Mohapatra113685f2018-08-29 14:21:55 +0530481QDF_STATUS fwol_cfg_on_psoc_enable(struct wlan_objmgr_psoc *psoc)
482{
483 QDF_STATUS status = QDF_STATUS_SUCCESS;
484 struct wlan_fwol_psoc_obj *fwol_obj;
485 struct wlan_fwol_cfg *fwol_cfg;
lifengfaa83cb2018-11-24 01:53:56 +0800486 qdf_size_t enable_fw_module_log_level_num;
Sourav Mohapatra113685f2018-08-29 14:21:55 +0530487
488 fwol_obj = fwol_get_psoc_obj(psoc);
489 if (!fwol_obj) {
490 fwol_err("Failed to get FWOL Obj");
491 return QDF_STATUS_E_FAILURE;
492 }
493
494 fwol_cfg = &fwol_obj->cfg;
Dundi Raviteja3b637092018-09-12 13:42:50 +0530495
Dundi Raviteja85a240a2018-09-10 15:03:07 +0530496 fwol_init_coex_config_in_cfg(psoc, &fwol_cfg->coex_config);
497 fwol_init_thermal_temp_in_cfg(psoc, &fwol_cfg->thermal_temp_cfg);
498 fwol_init_ie_whiltelist_in_cfg(psoc, &fwol_cfg->ie_whitelist_cfg);
Manikandan Mohan06d38d82018-11-26 18:36:58 -0800499 fwol_init_neighbor_report_cfg(psoc, &fwol_cfg->neighbor_report_cfg);
Sourav Mohapatrad9387d82018-09-07 12:28:52 +0530500 fwol_cfg->ani_enabled = cfg_get(psoc, CFG_ENABLE_ANI);
501 fwol_cfg->enable_rts_sifsbursting =
502 cfg_get(psoc, CFG_SET_RTS_FOR_SIFS_BURSTING);
Qun Zhang1b3c85c2019-08-27 16:31:49 +0800503 fwol_cfg->enable_sifs_burst = cfg_get(psoc, CFG_SET_SIFS_BURST);
Sourav Mohapatrad9387d82018-09-07 12:28:52 +0530504 fwol_cfg->max_mpdus_inampdu = cfg_get(psoc, CFG_MAX_MPDUS_IN_AMPDU);
505 fwol_cfg->arp_ac_category = cfg_get(psoc, CFG_ARP_AC_CATEGORY);
506 fwol_cfg->enable_phy_reg_retention = cfg_get(psoc, CFG_ENABLE_PHY_REG);
507 fwol_cfg->upper_brssi_thresh = cfg_get(psoc, CFG_UPPER_BRSSI_THRESH);
508 fwol_cfg->lower_brssi_thresh = cfg_get(psoc, CFG_LOWER_BRSSI_THRESH);
509 fwol_cfg->enable_dtim_1chrx = cfg_get(psoc, CFG_DTIM_1CHRX_ENABLE);
510 fwol_cfg->alternative_chainmask_enabled =
511 cfg_get(psoc, CFG_ENABLE_COEX_ALT_CHAINMASK);
Sourav Mohapatra0f3b8572018-09-12 10:03:51 +0530512 fwol_cfg->smart_chainmask_enabled =
513 cfg_get(psoc, CFG_ENABLE_SMART_CHAINMASK);
514 fwol_cfg->get_rts_profile = cfg_get(psoc, CFG_ENABLE_FW_RTS_PROFILE);
515 fwol_cfg->enable_fw_log_level =
516 cfg_get(psoc, CFG_ENABLE_FW_DEBUG_LOG_LEVEL);
517 fwol_cfg->enable_fw_log_type = cfg_get(psoc, CFG_ENABLE_FW_LOG_TYPE);
lifengfaa83cb2018-11-24 01:53:56 +0800518 qdf_uint8_array_parse(cfg_get(psoc, CFG_ENABLE_FW_MODULE_LOG_LEVEL),
519 fwol_cfg->enable_fw_module_log_level,
520 FW_MODULE_LOG_LEVEL_STRING_LENGTH,
521 &enable_fw_module_log_level_num);
522 fwol_cfg->enable_fw_module_log_level_num =
523 (uint8_t)enable_fw_module_log_level_num;
Manikandan Mohand350c192018-11-29 14:01:12 -0800524 ucfg_fwol_init_tsf_ptp_options(psoc, fwol_cfg);
525 ucfg_fwol_init_sae_cfg(psoc, fwol_cfg);
526 fwol_cfg->lprx_enable = cfg_get(psoc, CFG_LPRX);
527 fwol_cfg->gcmp_enable = cfg_get(psoc, CFG_ENABLE_GCMP);
528 fwol_cfg->enable_tx_sch_delay = cfg_get(psoc, CFG_TX_SCH_DELAY);
529 fwol_cfg->enable_secondary_rate = cfg_get(psoc,
530 CFG_ENABLE_SECONDARY_RATE);
Harprit Chhabadad59ae762019-01-08 16:40:43 -0800531 fwol_init_adapt_dwelltime_in_cfg(psoc, &fwol_cfg->dwelltime_params);
Sourav Mohapatra0f3b8572018-09-12 10:03:51 +0530532 ucfg_fwol_fetch_ra_filter(psoc, fwol_cfg);
533 ucfg_fwol_fetch_tsf_gpio_pin(psoc, fwol_cfg);
Subrat Dash5f36fbe2019-02-12 16:28:14 +0530534 ucfg_fwol_fetch_tsf_irq_host_gpio_pin(psoc, fwol_cfg);
Subrat Dashb1e61b22019-07-22 14:09:34 +0530535 ucfg_fwol_fetch_tsf_sync_host_gpio_pin(psoc, fwol_cfg);
Sourav Mohapatra0f3b8572018-09-12 10:03:51 +0530536 ucfg_fwol_fetch_dhcp_server_settings(psoc, fwol_cfg);
Sourav Mohapatra113685f2018-08-29 14:21:55 +0530537
538 return status;
539}
540
541QDF_STATUS fwol_cfg_on_psoc_disable(struct wlan_objmgr_psoc *psoc)
542{
543 /* Clear the CFG structure */
544 return QDF_STATUS_SUCCESS;
545}
Paul Zhangc9dbaee2019-06-23 22:07:31 +0800546
547#ifdef WLAN_FEATURE_ELNA
548/**
549 * fwol_process_get_elna_bypass_resp() - Process get eLNA bypass response
550 * @event: response event
551 *
552 * Return: QDF_STATUS_SUCCESS on success
553 */
554static QDF_STATUS
555fwol_process_get_elna_bypass_resp(struct wlan_fwol_rx_event *event)
556{
557 QDF_STATUS status = QDF_STATUS_SUCCESS;
558 struct wlan_objmgr_psoc *psoc;
559 struct wlan_fwol_psoc_obj *fwol_obj;
560 struct wlan_fwol_callbacks *cbs;
561 struct get_elna_bypass_response *resp;
562
563 if (!event) {
564 fwol_err("Event buffer is NULL");
565 return QDF_STATUS_E_FAILURE;
566 }
567
568 psoc = event->psoc;
569 if (!psoc) {
570 fwol_err("psoc is NULL");
571 return QDF_STATUS_E_INVAL;
572 }
573
574 fwol_obj = fwol_get_psoc_obj(psoc);
575 if (!fwol_obj) {
576 fwol_err("Failed to get FWOL Obj");
577 return QDF_STATUS_E_INVAL;
578 }
579
580 cbs = &fwol_obj->cbs;
581 if (cbs->get_elna_bypass_callback) {
582 resp = &event->get_elna_bypass_response;
583 cbs->get_elna_bypass_callback(cbs->get_elna_bypass_context,
584 resp);
585 } else {
586 fwol_err("NULL pointer for callback");
587 status = QDF_STATUS_E_IO;
588 }
589
590 return status;
591}
592#else
593static QDF_STATUS
594fwol_process_get_elna_bypass_resp(struct wlan_fwol_rx_event *event)
595{
596 return QDF_STATUS_SUCCESS;
597}
598#endif /* WLAN_FEATURE_ELNA */
599
600QDF_STATUS fwol_process_event(struct scheduler_msg *msg)
601{
602 QDF_STATUS status;
603 struct wlan_fwol_rx_event *event;
604
605 fwol_debug("msg type %d", msg->type);
606
607 if (!(msg->bodyptr)) {
608 fwol_err("Invalid message body");
609 return QDF_STATUS_E_INVAL;
610 }
611
612 event = msg->bodyptr;
613 msg->bodyptr = NULL;
614
615 switch (msg->type) {
616 case WLAN_FWOL_EVT_GET_ELNA_BYPASS_RESPONSE:
617 status = fwol_process_get_elna_bypass_resp(event);
618 break;
619 default:
620 status = QDF_STATUS_E_INVAL;
621 break;
622 }
623
624 fwol_release_rx_event(event);
625
626 return status;
627}
628
629void fwol_release_rx_event(struct wlan_fwol_rx_event *event)
630{
631 if (!event) {
632 fwol_err("event is NULL");
633 return;
634 }
635
636 if (event->psoc)
637 wlan_objmgr_psoc_release_ref(event->psoc, WLAN_FWOL_SB_ID);
638 qdf_mem_free(event);
639}