blob: ec52096fa88982d957a11a4f4f5f161175ac06b8 [file] [log] [blame]
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001/*
Yue Ma34321602019-12-23 12:39:20 -08002 * Copyright (c) 2013-2020 The Linux Foundation. All rights reserved.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003 *
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004 * 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
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080019/**
20 * DOC: wma_features.c
21 * This file contains different features related functions like WoW,
22 * Offloads, TDLS etc.
23 */
24
25/* Header files */
26
Himanshu Agarwaldd356df2016-07-20 19:04:39 +053027#include "cds_ieee80211_common.h" /* ieee80211_frame */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080028#include "wma.h"
29#include "wma_api.h"
30#include "cds_api.h"
31#include "wmi_unified_api.h"
32#include "wlan_qct_sys.h"
33#include "wni_api.h"
34#include "ani_global.h"
35#include "wmi_unified.h"
36#include "wni_cfg.h"
Manjunathappa Prakash3454fd62016-04-01 08:52:06 -070037#include <cdp_txrx_tx_delay.h>
Manjunathappa Prakash3454fd62016-04-01 08:52:06 -070038#include <cdp_txrx_peer_ops.h>
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080039
Nirav Shahcbc6d722016-03-01 16:24:53 +053040#include "qdf_nbuf.h"
Anurag Chouhan6d760662016-02-20 16:05:43 +053041#include "qdf_types.h"
Anurag Chouhan600c3a02016-03-01 10:33:54 +053042#include "qdf_mem.h"
Dustin Brown3c89c012017-05-01 12:17:32 -070043#include "qdf_util.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080044
45#include "wma_types.h"
46#include "lim_api.h"
47#include "lim_session_utils.h"
Paul Zhanga25f75a2019-04-12 17:11:14 +080048#include "cfg_ucfg_api.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080049#include "cds_utils.h"
Paul Zhanga25f75a2019-04-12 17:11:14 +080050#include "cfg_qos.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080051#if !defined(REMOVE_PKT_LOG)
52#include "pktlog_ac.h"
53#endif /* REMOVE_PKT_LOG */
54
55#include "dbglog_host.h"
56#include "csr_api.h"
57#include "ol_fw.h"
58
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080059#include "wma_internal.h"
Naveen Rawate82c1f32016-06-22 15:34:36 -070060#include "wma_nan_datapath.h"
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -080061#include <cdp_txrx_handle.h>
Mukul Sharma00058692017-01-28 19:04:32 +053062#include "wlan_pmo_ucfg_api.h"
Abhishek Singhb20db962017-03-03 21:28:46 +053063#include <target_if_scan.h>
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070064#include "wlan_reg_services_api.h"
Deepak Dhamdheref918d422017-07-06 12:56:29 -070065#include "wlan_roam_debug.h"
Naveen Rawat3ff5cff2018-01-29 14:31:16 -080066#include <wlan_cp_stats_mc_ucfg_api.h>
Nachiket Kukade6003bd22018-11-08 18:30:08 +053067#ifdef WLAN_FEATURE_NAN
68#include "target_if_nan.h"
69#endif
Sandeep Puligillad7887022019-02-26 00:48:52 -080070#include "wlan_scan_api.h"
Kiran Kumar Lokere7d6e4c92018-09-19 13:45:47 -070071#include <wlan_crypto_global_api.h>
Mukul Sharma00058692017-01-28 19:04:32 +053072
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053073/**
74 * WMA_SET_VDEV_IE_SOURCE_HOST - Flag to identify the source of VDEV SET IE
75 * command. The value is 0x0 for the VDEV SET IE WMI commands from mobile
76 * MCL platform.
77 */
78#define WMA_SET_VDEV_IE_SOURCE_HOST 0x0
79
Naveen Rawat3ff5cff2018-01-29 14:31:16 -080080#if defined(FEATURE_WLAN_DIAG_SUPPORT)
Yeshwanth Sriram Guntukaa10da362017-10-06 12:57:11 +053081/**
82 * qdf_wma_wow_wakeup_stats_event()- send wow wakeup stats
83 * @tp_wma_handle wma: WOW wakeup packet counter
84 *
85 * This function sends wow wakeup stats diag event
86 *
87 * Return: void.
88 */
Naveen Rawat3ff5cff2018-01-29 14:31:16 -080089static inline void qdf_wma_wow_wakeup_stats_event(tp_wma_handle wma)
90{
91 QDF_STATUS status;
92 struct wake_lock_stats stats = {0};
93
94 WLAN_HOST_DIAG_EVENT_DEF(wow_stats,
95 struct host_event_wlan_powersave_wow_stats);
96
97 status = ucfg_mc_cp_stats_get_psoc_wake_lock_stats(wma->psoc, &stats);
98 if (QDF_IS_STATUS_ERROR(status))
99 return;
100 qdf_mem_zero(&wow_stats, sizeof(wow_stats));
101
102 wow_stats.wow_bcast_wake_up_count = stats.bcast_wake_up_count;
103 wow_stats.wow_ipv4_mcast_wake_up_count = stats.ipv4_mcast_wake_up_count;
104 wow_stats.wow_ipv6_mcast_wake_up_count = stats.ipv6_mcast_wake_up_count;
105 wow_stats.wow_ipv6_mcast_ra_stats = stats.ipv6_mcast_ra_stats;
106 wow_stats.wow_ipv6_mcast_ns_stats = stats.ipv6_mcast_ns_stats;
107 wow_stats.wow_ipv6_mcast_na_stats = stats.ipv6_mcast_na_stats;
108 wow_stats.wow_pno_match_wake_up_count = stats.pno_match_wake_up_count;
109 wow_stats.wow_pno_complete_wake_up_count =
110 stats.pno_complete_wake_up_count;
111 wow_stats.wow_gscan_wake_up_count = stats.gscan_wake_up_count;
112 wow_stats.wow_low_rssi_wake_up_count = stats.low_rssi_wake_up_count;
113 wow_stats.wow_rssi_breach_wake_up_count =
114 stats.rssi_breach_wake_up_count;
115 wow_stats.wow_icmpv4_count = stats.icmpv4_count;
116 wow_stats.wow_icmpv6_count = stats.icmpv6_count;
117 wow_stats.wow_oem_response_wake_up_count =
118 stats.oem_response_wake_up_count;
119
120 WLAN_HOST_DIAG_EVENT_REPORT(&wow_stats, EVENT_WLAN_POWERSAVE_WOW_STATS);
121}
Yeshwanth Sriram Guntukaa10da362017-10-06 12:57:11 +0530122#else
123static inline void qdf_wma_wow_wakeup_stats_event(tp_wma_handle wma)
124{
125 return;
126}
127#endif
128
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800129#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
130/**
jiad391c5282018-11-26 16:21:04 +0800131 * wma_wake_reason_auto_shutdown() - to post auto shutdown event to sme
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800132 *
133 * Return: 0 for success or error code
134 */
Dustin Browne2206fb2017-04-20 13:39:25 -0700135static int wma_wake_reason_auto_shutdown(void)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800136{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530137 QDF_STATUS qdf_status;
Rajeev Kumarb60abe42017-01-21 15:39:31 -0800138 struct scheduler_msg sme_msg = { 0 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800139
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800140 sme_msg.type = eWNI_SME_AUTO_SHUTDOWN_IND;
gaurank kathpalia00861f02018-08-28 19:16:12 +0530141 qdf_status = scheduler_post_message(QDF_MODULE_ID_WMA,
142 QDF_MODULE_ID_SME,
143 QDF_MODULE_ID_SME, &sme_msg);
Jeff Johnsonaebd8232019-02-17 09:48:17 -0800144 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800145 WMA_LOGE("Fail to post eWNI_SME_AUTO_SHUTDOWN_IND msg to SME");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800146
Jeff Johnsonaebd8232019-02-17 09:48:17 -0800147 return qdf_status_to_os_return(qdf_status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800148}
Dustin Browne2206fb2017-04-20 13:39:25 -0700149#else
150static inline int wma_wake_reason_auto_shutdown(void)
151{
152 return 0;
153}
154#endif /* FEATURE_WLAN_AUTO_SHUTDOWN */
155
156#ifdef FEATURE_WLAN_SCAN_PNO
157static int wma_wake_reason_nlod(t_wma_handle *wma, uint8_t vdev_id)
158{
159 wmi_nlo_event nlo_event = { .vdev_id = vdev_id };
160 WMI_NLO_MATCH_EVENTID_param_tlvs param = { .fixed_param = &nlo_event };
161
162 return target_if_nlo_match_event_handler(wma, (uint8_t *)&param,
163 sizeof(param));
164}
165#else
Pragaspathi Thilagaraj24789d32018-12-10 22:28:03 +0530166static inline int wma_wake_reason_nlod(t_wma_handle *wma, uint8_t vdev_id)
Dustin Browne2206fb2017-04-20 13:39:25 -0700167{
168 return 0;
169}
170#endif /* FEATURE_WLAN_SCAN_PNO */
171
Nachiket Kukade6003bd22018-11-08 18:30:08 +0530172#ifdef WLAN_FEATURE_NAN
173/**
174 * wma_nan_rsp_handler_callback() - call NAN Discovery event handler
175 * @handle: wma handle
176 * @event: event buffer
177 * @len: buffer length
178 *
179 * Return: 0 for success or error code
180 */
181static int wma_nan_rsp_handler_callback(void *handle, uint8_t *event,
182 uint32_t len)
183{
184 return target_if_nan_rsp_handler(handle, event, len);
185}
186#else
187static inline int wma_nan_rsp_handler_callback(void *handle, uint8_t *event,
188 uint32_t len)
189{
190 return 0;
191}
192#endif
193
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800194/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800195 * wma_get_snr() - get RSSI from fw
196 * @psnr_req: request params
197 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +0530198 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800199 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530200QDF_STATUS wma_get_snr(tAniGetSnrReq *psnr_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800201{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800202 tAniGetSnrReq *psnr_req_bkp;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800203 tp_wma_handle wma_handle = NULL;
204 struct wma_txrx_node *intr;
205
Anurag Chouhan6d760662016-02-20 16:05:43 +0530206 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800207
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -0700208 if (!wma_handle) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800209 WMA_LOGE("%s : Failed to get wma_handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530210 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800211 }
212
213 intr = &wma_handle->interfaces[psnr_req->sessionId];
Jeff Johnsonc97816c2018-05-12 17:13:23 -0700214 /* command is in progress */
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -0700215 if (intr->psnr_req) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800216 WMA_LOGE("%s : previous snr request is pending", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530217 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800218 }
219
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530220 psnr_req_bkp = qdf_mem_malloc(sizeof(tAniGetSnrReq));
Arif Hussain157263f2018-10-03 13:07:15 -0700221 if (!psnr_req_bkp)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530222 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800223
hangtian127c9532019-01-12 13:29:07 +0800224 qdf_mem_zero(psnr_req_bkp, sizeof(tAniGetSnrReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800225 psnr_req_bkp->pDevContext = psnr_req->pDevContext;
226 psnr_req_bkp->snrCallback = psnr_req->snrCallback;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800227 intr->psnr_req = (void *)psnr_req_bkp;
Govind Singhaa64c242016-03-08 11:31:49 +0530228
229 if (wmi_unified_snr_cmd(wma_handle->wmi_handle,
230 psnr_req->sessionId)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800231 WMA_LOGE("Failed to send host stats request to fw");
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530232 qdf_mem_free(psnr_req_bkp);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800233 intr->psnr_req = NULL;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530234 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800235 }
236
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530237 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800238}
239
240/**
241 * wma_process_link_status_req() - process link status request from UMAC
242 * @wma: wma handle
243 * @pGetLinkStatus: get link params
244 *
245 * Return: none
246 */
247void wma_process_link_status_req(tp_wma_handle wma,
248 tAniGetLinkStatus *pGetLinkStatus)
249{
Govind Singhaa64c242016-03-08 11:31:49 +0530250 struct link_status_params cmd = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800251 struct wma_txrx_node *iface =
252 &wma->interfaces[pGetLinkStatus->sessionId];
253
254 if (iface->plink_status_req) {
255 WMA_LOGE("%s:previous link status request is pending,deleting the new request",
256 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530257 qdf_mem_free(pGetLinkStatus);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800258 return;
259 }
260
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800261 iface->plink_status_req = pGetLinkStatus;
Jeff Johnson999644a2019-01-15 12:21:02 -0800262 cmd.vdev_id = pGetLinkStatus->sessionId;
Govind Singhaa64c242016-03-08 11:31:49 +0530263 if (wmi_unified_link_status_req_cmd(wma->wmi_handle, &cmd)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800264 WMA_LOGE("Failed to send WMI link status request to fw");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800265 iface->plink_status_req = NULL;
266 goto end;
267 }
268
269 return;
270
271end:
272 wma_post_link_status(pGetLinkStatus, LINK_STATUS_LEGACY);
273}
274
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700275#ifdef WLAN_FEATURE_TSF
276/**
277 * wma_vdev_tsf_handler() - handle tsf event indicated by FW
278 * @handle: wma context
279 * @data: event buffer
280 * @data len: length of event buffer
281 *
282 * Return: 0 on success
283 */
284int wma_vdev_tsf_handler(void *handle, uint8_t *data, uint32_t data_len)
285{
Rajeev Kumarb60abe42017-01-21 15:39:31 -0800286 struct scheduler_msg tsf_msg = {0};
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700287 WMI_VDEV_TSF_REPORT_EVENTID_param_tlvs *param_buf;
288 wmi_vdev_tsf_report_event_fixed_param *tsf_event;
289 struct stsf *ptsf;
290
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -0700291 if (!data) {
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700292 WMA_LOGE("%s: invalid pointer", __func__);
293 return -EINVAL;
294 }
295 ptsf = qdf_mem_malloc(sizeof(*ptsf));
Arif Hussain157263f2018-10-03 13:07:15 -0700296 if (!ptsf)
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700297 return -ENOMEM;
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700298
299 param_buf = (WMI_VDEV_TSF_REPORT_EVENTID_param_tlvs *)data;
300 tsf_event = param_buf->fixed_param;
301
302 ptsf->vdev_id = tsf_event->vdev_id;
303 ptsf->tsf_low = tsf_event->tsf_low;
304 ptsf->tsf_high = tsf_event->tsf_high;
Manikandan Mohan5356c2b2016-04-03 15:51:35 -0700305 ptsf->soc_timer_low = tsf_event->qtimer_low;
306 ptsf->soc_timer_high = tsf_event->qtimer_high;
Jiani Liu6d3b6a12019-05-08 15:15:06 +0800307 ptsf->global_tsf_low = tsf_event->wlan_global_tsf_low;
308 ptsf->global_tsf_high = tsf_event->wlan_global_tsf_high;
Arif Hussain157263f2018-10-03 13:07:15 -0700309 wma_nofl_debug("receive WMI_VDEV_TSF_REPORT_EVENTID on %d, tsf: %d %d",
310 ptsf->vdev_id, ptsf->tsf_low, ptsf->tsf_high);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700311
Jiani Liu6d3b6a12019-05-08 15:15:06 +0800312 wma_nofl_debug("g_tsf: %d %d; soc_timer: %d %d",
313 ptsf->global_tsf_low, ptsf->global_tsf_high,
314 ptsf->soc_timer_low, ptsf->soc_timer_high);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700315 tsf_msg.type = eWNI_SME_TSF_EVENT;
316 tsf_msg.bodyptr = ptsf;
317 tsf_msg.bodyval = 0;
318
319 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia00861f02018-08-28 19:16:12 +0530320 scheduler_post_message(QDF_MODULE_ID_WMA,
321 QDF_MODULE_ID_SME,
322 QDF_MODULE_ID_SME, &tsf_msg)) {
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700323 qdf_mem_free(ptsf);
324 return -EINVAL;
325 }
326 return 0;
327}
328
Manikandan Mohan5356c2b2016-04-03 15:51:35 -0700329#ifdef QCA_WIFI_3_0
330#define TSF_FW_ACTION_CMD TSF_TSTAMP_QTIMER_CAPTURE_REQ
331#else
332#define TSF_FW_ACTION_CMD TSF_TSTAMP_CAPTURE_REQ
333#endif
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700334/**
335 * wma_capture_tsf() - send wmi to fw to capture tsf
336 * @wma_handle: wma handler
337 * @vdev_id: vdev id
338 *
339 * Return: wmi send state
340 */
341QDF_STATUS wma_capture_tsf(tp_wma_handle wma_handle, uint32_t vdev_id)
342{
Dustin Brownfd578602019-02-22 13:52:24 -0800343 QDF_STATUS status;
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700344 wmi_buf_t buf;
345 wmi_vdev_tsf_tstamp_action_cmd_fixed_param *cmd;
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700346 int len = sizeof(*cmd);
347
348 buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -0700349 if (!buf)
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700350 return QDF_STATUS_E_NOMEM;
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700351
352 cmd = (wmi_vdev_tsf_tstamp_action_cmd_fixed_param *) wmi_buf_data(buf);
353 cmd->vdev_id = vdev_id;
Manikandan Mohan5356c2b2016-04-03 15:51:35 -0700354 cmd->tsf_action = TSF_FW_ACTION_CMD;
355 WMA_LOGD("%s :vdev_id %u, tsf_cmd: %d", __func__, cmd->vdev_id,
356 cmd->tsf_action);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700357
358 WMITLV_SET_HDR(&cmd->tlv_header,
359 WMITLV_TAG_STRUC_wmi_vdev_tsf_tstamp_action_cmd_fixed_param,
360 WMITLV_GET_STRUCT_TLVLEN(
361 wmi_vdev_tsf_tstamp_action_cmd_fixed_param));
362
Dustin Brownfd578602019-02-22 13:52:24 -0800363 status = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
364 WMI_VDEV_TSF_TSTAMP_ACTION_CMDID);
365 if (QDF_IS_STATUS_ERROR(status))
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700366 wmi_buf_free(buf);
Dustin Brownfd578602019-02-22 13:52:24 -0800367
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700368 return status;
369}
370
371/**
372 * wma_reset_tsf_gpio() - send wmi to fw to reset GPIO
373 * @wma_handle: wma handler
374 * @vdev_id: vdev id
375 *
376 * Return: wmi send state
377 */
378QDF_STATUS wma_reset_tsf_gpio(tp_wma_handle wma_handle, uint32_t vdev_id)
379{
Dustin Brownfd578602019-02-22 13:52:24 -0800380 QDF_STATUS status;
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700381 wmi_buf_t buf;
382 wmi_vdev_tsf_tstamp_action_cmd_fixed_param *cmd;
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700383 int len = sizeof(*cmd);
384 uint8_t *buf_ptr;
385
386 buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -0700387 if (!buf)
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700388 return QDF_STATUS_E_NOMEM;
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700389
390 buf_ptr = (uint8_t *) wmi_buf_data(buf);
391 cmd = (wmi_vdev_tsf_tstamp_action_cmd_fixed_param *) buf_ptr;
392 cmd->vdev_id = vdev_id;
393 cmd->tsf_action = TSF_TSTAMP_CAPTURE_RESET;
394
395 WMA_LOGD("%s :vdev_id %u, TSF_TSTAMP_CAPTURE_RESET", __func__,
396 cmd->vdev_id);
397
398 WMITLV_SET_HDR(&cmd->tlv_header,
399 WMITLV_TAG_STRUC_wmi_vdev_tsf_tstamp_action_cmd_fixed_param,
400 WMITLV_GET_STRUCT_TLVLEN(
401 wmi_vdev_tsf_tstamp_action_cmd_fixed_param));
402
Dustin Brownfd578602019-02-22 13:52:24 -0800403 status = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
404 WMI_VDEV_TSF_TSTAMP_ACTION_CMDID);
405 if (QDF_IS_STATUS_ERROR(status))
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700406 wmi_buf_free(buf);
Dustin Brownfd578602019-02-22 13:52:24 -0800407
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700408 return status;
409}
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700410
Manikandan Mohan976e7562016-03-15 16:33:31 -0700411/**
412 * wma_set_tsf_gpio_pin() - send wmi cmd to configure gpio pin
413 * @handle: wma handler
414 * @pin: GPIO pin id
415 *
416 * Return: QDF_STATUS
417 */
418QDF_STATUS wma_set_tsf_gpio_pin(WMA_HANDLE handle, uint32_t pin)
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700419{
Manikandan Mohan976e7562016-03-15 16:33:31 -0700420 tp_wma_handle wma = (tp_wma_handle)handle;
421 struct pdev_params pdev_param = {0};
422 int32_t ret;
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700423
Manikandan Mohan976e7562016-03-15 16:33:31 -0700424 if (!wma || !wma->wmi_handle) {
425 WMA_LOGE("%s: WMA is closed, can not set gpio", __func__);
426 return QDF_STATUS_E_INVAL;
427 }
428
429 WMA_LOGD("%s: set tsf gpio pin: %d", __func__, pin);
430
431 pdev_param.param_id = WMI_PDEV_PARAM_WNTS_CONFIG;
432 pdev_param.param_value = pin;
433 ret = wmi_unified_pdev_param_send(wma->wmi_handle,
434 &pdev_param,
435 WMA_WILDCARD_PDEV_ID);
436 if (ret) {
437 WMA_LOGE("%s: Failed to set tsf gpio pin (%d)", __func__, ret);
438 return QDF_STATUS_E_FAILURE;
439 }
440 return QDF_STATUS_SUCCESS;
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700441}
442#endif
443
Manikandan Mohan80dea792016-04-28 16:36:48 -0700444/**
445 * wma_set_wisa_params(): Set WISA features related params in FW
446 * @wma_handle: WMA handle
447 * @wisa: Pointer to WISA param struct
448 *
449 * Return: CDF status
450 */
451QDF_STATUS wma_set_wisa_params(tp_wma_handle wma_handle,
452 struct sir_wisa_params *wisa)
453{
Dustin Brownfd578602019-02-22 13:52:24 -0800454 QDF_STATUS status;
Manikandan Mohan80dea792016-04-28 16:36:48 -0700455 wmi_buf_t buf;
456 wmi_vdev_wisa_cmd_fixed_param *cmd;
Dustin Brownfd578602019-02-22 13:52:24 -0800457 int len = sizeof(*cmd);
Manikandan Mohan80dea792016-04-28 16:36:48 -0700458
459 buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -0700460 if (!buf)
Manikandan Mohan80dea792016-04-28 16:36:48 -0700461 return QDF_STATUS_E_NOMEM;
Manikandan Mohan80dea792016-04-28 16:36:48 -0700462
463 cmd = (wmi_vdev_wisa_cmd_fixed_param *) wmi_buf_data(buf);
464 cmd->wisa_mode = wisa->mode;
465 cmd->vdev_id = wisa->vdev_id;
466
467 WMITLV_SET_HDR(&cmd->tlv_header,
468 WMITLV_TAG_STRUC_wmi_vdev_wisa_cmd_fixed_param,
469 WMITLV_GET_STRUCT_TLVLEN(
470 wmi_vdev_wisa_cmd_fixed_param));
471
Dustin Brownfd578602019-02-22 13:52:24 -0800472 status = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
473 WMI_VDEV_WISA_CMDID);
474 if (QDF_IS_STATUS_ERROR(status))
475 wmi_buf_free(buf);
Manikandan Mohan80dea792016-04-28 16:36:48 -0700476
Manikandan Mohan80dea792016-04-28 16:36:48 -0700477 return status;
478}
479
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800480/**
481 * wma_process_dhcp_ind() - process dhcp indication from SME
482 * @wma_handle: wma handle
483 * @ta_dhcp_ind: DHCP indication
484 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +0530485 * Return: QDF Status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800486 */
Yun Parkc3e35562018-03-08 12:05:52 -0800487QDF_STATUS wma_process_dhcp_ind(WMA_HANDLE handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800488 tAniDHCPInd *ta_dhcp_ind)
489{
Yun Parkc3e35562018-03-08 12:05:52 -0800490 tp_wma_handle wma_handle = (tp_wma_handle) handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800491 uint8_t vdev_id;
Govind Singhaa64c242016-03-08 11:31:49 +0530492 wmi_peer_set_param_cmd_fixed_param peer_set_param_fp = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800493
Pragaspathi Thilagaraj961a8b82018-05-03 14:16:44 +0530494 if (!wma_handle) {
495 WMA_LOGE("%s : wma_handle is NULL", __func__);
496 return QDF_STATUS_E_FAILURE;
497 }
498
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800499 if (!ta_dhcp_ind) {
500 WMA_LOGE("%s : DHCP indication is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530501 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800502 }
503
Srinivas Girigowda296105a2015-09-24 16:31:16 -0700504 if (!wma_find_vdev_by_addr(wma_handle,
505 ta_dhcp_ind->adapterMacAddr.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800506 &vdev_id)) {
507 WMA_LOGE("%s: Failed to find vdev id for DHCP indication",
508 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530509 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800510 }
511
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -0700512 wma_debug("WMA --> WMI_PEER_SET_PARAM triggered by DHCP, msgType=%s, device_mode=%d, macAddr=" QDF_MAC_ADDR_STR,
Srinivas Girigowda34fbba02019-04-08 12:07:44 -0700513 ta_dhcp_ind->msgType == WMA_DHCP_START_IND ?
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700514 "WMA_DHCP_START_IND" : "WMA_DHCP_STOP_IND",
515 ta_dhcp_ind->device_mode,
Srinivas Girigowda34fbba02019-04-08 12:07:44 -0700516 QDF_MAC_ADDR_ARRAY(ta_dhcp_ind->peerMacAddr.bytes));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800517
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800518 /* fill in values */
Govind Singhaa64c242016-03-08 11:31:49 +0530519 peer_set_param_fp.vdev_id = vdev_id;
520 peer_set_param_fp.param_id = WMI_PEER_CRIT_PROTO_HINT_ENABLED;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800521 if (WMA_DHCP_START_IND == ta_dhcp_ind->msgType)
Govind Singhaa64c242016-03-08 11:31:49 +0530522 peer_set_param_fp.param_value = 1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800523 else
Govind Singhaa64c242016-03-08 11:31:49 +0530524 peer_set_param_fp.param_value = 0;
Srinivas Girigowda296105a2015-09-24 16:31:16 -0700525 WMI_CHAR_ARRAY_TO_MAC_ADDR(ta_dhcp_ind->peerMacAddr.bytes,
Govind Singhaa64c242016-03-08 11:31:49 +0530526 &peer_set_param_fp.peer_macaddr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800527
Dustin Brownfd578602019-02-22 13:52:24 -0800528 return wmi_unified_process_dhcp_ind(wma_handle->wmi_handle,
529 &peer_set_param_fp);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800530}
531
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530532enum wlan_phymode wma_chan_phy_mode(uint32_t freq, enum phy_ch_width chan_width,
533 uint8_t dot11_mode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800534{
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530535 enum wlan_phymode phymode = WLAN_PHYMODE_AUTO;
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -0700536 uint16_t bw_val = wlan_reg_get_bw_value(chan_width);
Kiran Kumar Lokere1a43bcf2018-05-15 15:51:58 -0700537 t_wma_handle *wma = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800538
Jiachao Wu52c060a2018-07-23 18:17:14 +0800539 if (!wma) {
540 WMA_LOGE("%s : wma_handle is NULL", __func__);
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530541 return WLAN_PHYMODE_AUTO;
Jiachao Wu52c060a2018-07-23 18:17:14 +0800542 }
543
Ashish Kumar Dhanotiyacd311c82018-09-14 10:55:10 +0530544 if (chan_width >= CH_WIDTH_INVALID) {
545 WMA_LOGE("%s : Invalid channel width", __func__);
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530546 return WLAN_PHYMODE_AUTO;
Ashish Kumar Dhanotiyacd311c82018-09-14 10:55:10 +0530547 }
548
gaurank kathpaliac99859b2019-07-23 12:02:35 +0530549 if (wlan_reg_is_24ghz_ch_freq(freq)) {
Amar Singhal046eb8a2016-05-05 12:50:15 -0700550 if (((CH_WIDTH_5MHZ == chan_width) ||
551 (CH_WIDTH_10MHZ == chan_width)) &&
gaurank kathpalia0c48d3d2019-01-29 15:03:07 +0530552 ((MLME_DOT11_MODE_11B == dot11_mode) ||
553 (MLME_DOT11_MODE_11G == dot11_mode) ||
554 (MLME_DOT11_MODE_11N == dot11_mode) ||
555 (MLME_DOT11_MODE_ALL == dot11_mode) ||
556 (MLME_DOT11_MODE_11AC == dot11_mode) ||
557 (MLME_DOT11_MODE_11AX == dot11_mode)))
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530558 phymode = WLAN_PHYMODE_11G;
Amar Singhal046eb8a2016-05-05 12:50:15 -0700559 else {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800560 switch (dot11_mode) {
gaurank kathpalia0c48d3d2019-01-29 15:03:07 +0530561 case MLME_DOT11_MODE_11B:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700562 if ((bw_val == 20) || (bw_val == 40))
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530563 phymode = WLAN_PHYMODE_11B;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800564 break;
gaurank kathpalia0c48d3d2019-01-29 15:03:07 +0530565 case MLME_DOT11_MODE_11G:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700566 if ((bw_val == 20) || (bw_val == 40))
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530567 phymode = WLAN_PHYMODE_11G;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800568 break;
gaurank kathpalia0c48d3d2019-01-29 15:03:07 +0530569 case MLME_DOT11_MODE_11G_ONLY:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700570 if ((bw_val == 20) || (bw_val == 40))
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530571 phymode = WLAN_PHYMODE_11G_ONLY;
Amar Singhal046eb8a2016-05-05 12:50:15 -0700572 break;
gaurank kathpalia0c48d3d2019-01-29 15:03:07 +0530573 case MLME_DOT11_MODE_11N:
574 case MLME_DOT11_MODE_11N_ONLY:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700575 if (bw_val == 20)
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530576 phymode = WLAN_PHYMODE_11NG_HT20;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700577 else if (bw_val == 40)
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530578 phymode = WLAN_PHYMODE_11NG_HT40;
Amar Singhal046eb8a2016-05-05 12:50:15 -0700579 break;
gaurank kathpalia0c48d3d2019-01-29 15:03:07 +0530580 case MLME_DOT11_MODE_ALL:
581 case MLME_DOT11_MODE_11AC:
582 case MLME_DOT11_MODE_11AC_ONLY:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700583 if (bw_val == 20)
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530584 phymode = WLAN_PHYMODE_11AC_VHT20_2G;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700585 else if (bw_val == 40)
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530586 phymode = WLAN_PHYMODE_11AC_VHT40_2G;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800587 break;
gaurank kathpalia0c48d3d2019-01-29 15:03:07 +0530588 case MLME_DOT11_MODE_11AX:
589 case MLME_DOT11_MODE_11AX_ONLY:
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -0800590 if (20 == bw_val)
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530591 phymode = WLAN_PHYMODE_11AXG_HE20;
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -0800592 else if (40 == bw_val)
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530593 phymode = WLAN_PHYMODE_11AXG_HE40;
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -0800594 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800595 default:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800596 break;
597 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800598 }
gaurank kathpaliacc3e2fd2019-11-12 10:33:52 +0530599 } else if (wlan_reg_is_dsrc_freq(freq))
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530600 phymode = WLAN_PHYMODE_11A;
Amar Singhal046eb8a2016-05-05 12:50:15 -0700601 else {
602 if (((CH_WIDTH_5MHZ == chan_width) ||
603 (CH_WIDTH_10MHZ == chan_width)) &&
gaurank kathpalia0c48d3d2019-01-29 15:03:07 +0530604 ((MLME_DOT11_MODE_11A == dot11_mode) ||
605 (MLME_DOT11_MODE_11N == dot11_mode) ||
606 (MLME_DOT11_MODE_ALL == dot11_mode) ||
607 (MLME_DOT11_MODE_11AC == dot11_mode) ||
608 (MLME_DOT11_MODE_11AX == dot11_mode)))
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530609 phymode = WLAN_PHYMODE_11A;
Amar Singhal046eb8a2016-05-05 12:50:15 -0700610 else {
611 switch (dot11_mode) {
gaurank kathpalia0c48d3d2019-01-29 15:03:07 +0530612 case MLME_DOT11_MODE_11A:
Amar Singhal046eb8a2016-05-05 12:50:15 -0700613 if (0 < bw_val)
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530614 phymode = WLAN_PHYMODE_11A;
Amar Singhal046eb8a2016-05-05 12:50:15 -0700615 break;
gaurank kathpalia0c48d3d2019-01-29 15:03:07 +0530616 case MLME_DOT11_MODE_11N:
617 case MLME_DOT11_MODE_11N_ONLY:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700618 if (bw_val == 20)
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530619 phymode = WLAN_PHYMODE_11NA_HT20;
Amar Singhal046eb8a2016-05-05 12:50:15 -0700620 else if (40 <= bw_val)
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530621 phymode = WLAN_PHYMODE_11NA_HT40;
Amar Singhal046eb8a2016-05-05 12:50:15 -0700622 break;
gaurank kathpalia0c48d3d2019-01-29 15:03:07 +0530623 case MLME_DOT11_MODE_ALL:
624 case MLME_DOT11_MODE_11AC:
625 case MLME_DOT11_MODE_11AC_ONLY:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700626 if (bw_val == 20)
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530627 phymode = WLAN_PHYMODE_11AC_VHT20;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700628 else if (bw_val == 40)
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530629 phymode = WLAN_PHYMODE_11AC_VHT40;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700630 else if (bw_val == 80)
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530631 phymode = WLAN_PHYMODE_11AC_VHT80;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700632 else if (chan_width == CH_WIDTH_160MHZ)
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530633 phymode = WLAN_PHYMODE_11AC_VHT160;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700634 else if (chan_width == CH_WIDTH_80P80MHZ)
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530635 phymode = WLAN_PHYMODE_11AC_VHT80_80;
Amar Singhal046eb8a2016-05-05 12:50:15 -0700636 break;
gaurank kathpalia0c48d3d2019-01-29 15:03:07 +0530637 case MLME_DOT11_MODE_11AX:
638 case MLME_DOT11_MODE_11AX_ONLY:
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -0800639 if (20 == bw_val)
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530640 phymode = WLAN_PHYMODE_11AXA_HE20;
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -0800641 else if (40 == bw_val)
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530642 phymode = WLAN_PHYMODE_11AXA_HE40;
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -0800643 else if (80 == bw_val)
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530644 phymode = WLAN_PHYMODE_11AXA_HE80;
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -0800645 else if (CH_WIDTH_160MHZ == chan_width)
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530646 phymode = WLAN_PHYMODE_11AXA_HE160;
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -0800647 else if (CH_WIDTH_80P80MHZ == chan_width)
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530648 phymode = WLAN_PHYMODE_11AXA_HE80_80;
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -0800649 break;
Amar Singhal046eb8a2016-05-05 12:50:15 -0700650 default:
651 break;
652 }
653 }
654 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800655
gaurank kathpaliac99859b2019-07-23 12:02:35 +0530656 WMA_LOGD("%s: phymode %d freq %d ch_width %d dot11_mode %d",
657 __func__, phymode, freq, chan_width, dot11_mode);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800658
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530659 QDF_ASSERT(phymode != WLAN_PHYMODE_AUTO);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800660 return phymode;
661}
662
663/**
664 * wma_get_link_speed() -send command to get linkspeed
665 * @handle: wma handle
666 * @pLinkSpeed: link speed info
667 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +0530668 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800669 */
Jeff Johnsone943bca2019-02-08 22:45:17 -0800670QDF_STATUS wma_get_link_speed(WMA_HANDLE handle,
671 struct link_speed_info *pLinkSpeed)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800672{
673 tp_wma_handle wma_handle = (tp_wma_handle) handle;
Govind Singhaa64c242016-03-08 11:31:49 +0530674 wmi_mac_addr peer_macaddr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800675
676 if (!wma_handle || !wma_handle->wmi_handle) {
677 WMA_LOGE("%s: WMA is closed, can not issue get link speed cmd",
678 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530679 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800680 }
Sourav Mohapatra89c85d12017-12-01 09:17:54 +0530681 if (!wmi_service_enabled(wma_handle->wmi_handle,
682 wmi_service_estimate_linkspeed)) {
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700683 WMA_LOGE("%s: Linkspeed feature bit not enabled Sending value 0 as link speed.",
684 __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800685 wma_send_link_speed(0);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530686 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800687 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800688 /* Copy the peer macaddress to the wma buffer */
Srinivas Girigowdadccab9a2015-11-19 14:31:14 -0800689 WMI_CHAR_ARRAY_TO_MAC_ADDR(pLinkSpeed->peer_macaddr.bytes,
Govind Singhaa64c242016-03-08 11:31:49 +0530690 &peer_macaddr);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700691 WMA_LOGD("%s: pLinkSpeed->peerMacAddr: %pM, peer_macaddr.mac_addr31to0: 0x%x, peer_macaddr.mac_addr47to32: 0x%x",
Srinivas Girigowdadccab9a2015-11-19 14:31:14 -0800692 __func__, pLinkSpeed->peer_macaddr.bytes,
Govind Singhaa64c242016-03-08 11:31:49 +0530693 peer_macaddr.mac_addr31to0,
694 peer_macaddr.mac_addr47to32);
Govind Singhaa64c242016-03-08 11:31:49 +0530695 if (wmi_unified_get_link_speed_cmd(wma_handle->wmi_handle,
696 peer_macaddr)) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530697 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800698 }
Govind Singhaa64c242016-03-08 11:31:49 +0530699
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530700 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800701}
702
Will Huanga9814592017-05-24 15:47:58 +0800703QDF_STATUS wma_get_peer_info_ext(WMA_HANDLE handle,
704 struct sir_peer_info_ext_req *peer_info_req)
705{
706 tp_wma_handle wma_handle = (tp_wma_handle)handle;
707 wmi_request_peer_stats_info_cmd_fixed_param *cmd;
708 wmi_buf_t wmi_buf;
709 uint32_t len;
710 uint8_t *buf_ptr;
711
712 if (!wma_handle || !wma_handle->wmi_handle) {
713 WMA_LOGE("%s: WMA is closed, can not issue get rssi",
714 __func__);
715 return QDF_STATUS_E_INVAL;
716 }
717
718 WMA_LOGI("%s send WMI_REQUEST_PEER_STATS_INFO_CMDID", __func__);
719
720 len = sizeof(wmi_request_peer_stats_info_cmd_fixed_param);
721 wmi_buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -0700722 if (!wmi_buf)
Will Huanga9814592017-05-24 15:47:58 +0800723 return QDF_STATUS_E_NOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -0700724
Will Huanga9814592017-05-24 15:47:58 +0800725 buf_ptr = (uint8_t *)wmi_buf_data(wmi_buf);
726
727 cmd = (wmi_request_peer_stats_info_cmd_fixed_param *)buf_ptr;
728 WMITLV_SET_HDR(&cmd->tlv_header,
729 WMITLV_TAG_STRUC_wmi_request_peer_stats_info_cmd_fixed_param,
730 WMITLV_GET_STRUCT_TLVLEN(
731 wmi_request_peer_stats_info_cmd_fixed_param));
732 cmd->vdev_id = peer_info_req->sessionid;
733 cmd->request_type = WMI_REQUEST_ONE_PEER_STATS_INFO;
734 wma_handle->get_one_peer_info = true;
735 WMI_CHAR_ARRAY_TO_MAC_ADDR(peer_info_req->peer_macaddr.bytes,
736 &cmd->peer_macaddr);
737 cmd->reset_after_request = peer_info_req->reset_after_request;
738
739 if (wmi_unified_cmd_send(wma_handle->wmi_handle, wmi_buf, len,
740 WMI_REQUEST_PEER_STATS_INFO_CMDID)) {
Will Huanga9814592017-05-24 15:47:58 +0800741 wmi_buf_free(wmi_buf);
742 return QDF_STATUS_E_FAILURE;
743 }
744
745 WMA_LOGI("%s vdev_id %d, mac %pM, req_type %x, reset %x",
746 __func__,
747 cmd->vdev_id,
748 peer_info_req->peer_macaddr.bytes,
749 cmd->request_type,
750 cmd->reset_after_request);
751
752 qdf_mem_copy(&(wma_handle->peer_macaddr),
753 &(peer_info_req->peer_macaddr),
754 QDF_MAC_ADDR_SIZE);
755
756 return QDF_STATUS_SUCCESS;
757}
758
guangde4853c402019-05-06 15:54:04 +0800759QDF_STATUS wma_get_isolation(tp_wma_handle wma)
760{
761 wmi_coex_get_antenna_isolation_cmd_fixed_param *cmd;
762 wmi_buf_t wmi_buf;
763 uint32_t len;
764 uint8_t *buf_ptr;
765
766 WMA_LOGD("%s: get isolation", __func__);
767
768 if (!wma || !wma->wmi_handle) {
769 WMA_LOGE("%s: WMA is closed, can not issue get isolation",
770 __func__);
771 return QDF_STATUS_E_INVAL;
772 }
773
774 len = sizeof(wmi_coex_get_antenna_isolation_cmd_fixed_param);
775 wmi_buf = wmi_buf_alloc(wma->wmi_handle, len);
776 if (!wmi_buf) {
777 WMA_LOGE("%s: wmi_buf_alloc failed", __func__);
778 return QDF_STATUS_E_NOMEM;
779 }
780 buf_ptr = (uint8_t *)wmi_buf_data(wmi_buf);
781
782 cmd = (wmi_coex_get_antenna_isolation_cmd_fixed_param *)buf_ptr;
783 WMITLV_SET_HDR(
784 &cmd->tlv_header,
785 WMITLV_TAG_STRUC_wmi_coex_get_antenna_isolation_cmd_fixed_param,
786 WMITLV_GET_STRUCT_TLVLEN(
787 wmi_coex_get_antenna_isolation_cmd_fixed_param));
788
789 if (wmi_unified_cmd_send(wma->wmi_handle, wmi_buf, len,
790 WMI_COEX_GET_ANTENNA_ISOLATION_CMDID)) {
791 WMA_LOGE("Failed to get isolation request from fw");
792 wmi_buf_free(wmi_buf);
793 return QDF_STATUS_E_FAILURE;
794 }
795
796 return QDF_STATUS_SUCCESS;
797}
798
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -0700799/**
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700800 * wma_add_beacon_filter() - Issue WMI command to set beacon filter
801 * @wma: wma handler
802 * @filter_params: beacon_filter_param to set
803 *
804 * Return: Return QDF_STATUS
805 */
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -0700806QDF_STATUS wma_add_beacon_filter(WMA_HANDLE handle,
807 struct beacon_filter_param *filter_params)
808{
809 int i;
810 wmi_buf_t wmi_buf;
811 u_int8_t *buf;
812 A_UINT32 *ie_map;
813 int ret;
Kiran Kumar Lokeref9dc7912017-06-28 18:10:58 -0700814 struct wma_txrx_node *iface;
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -0700815 tp_wma_handle wma = (tp_wma_handle) handle;
Kiran Kumar Lokeref9dc7912017-06-28 18:10:58 -0700816
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -0700817 wmi_add_bcn_filter_cmd_fixed_param *cmd;
818 int len = sizeof(wmi_add_bcn_filter_cmd_fixed_param);
819
820 len += WMI_TLV_HDR_SIZE;
821 len += BCN_FLT_MAX_ELEMS_IE_LIST*sizeof(A_UINT32);
822
823 if (!wma || !wma->wmi_handle) {
824 WMA_LOGE("%s: WMA is closed, can not issue set beacon filter",
825 __func__);
826 return QDF_STATUS_E_INVAL;
827 }
828
Kiran Kumar Lokeref9dc7912017-06-28 18:10:58 -0700829 iface = &wma->interfaces[filter_params->vdev_id];
830 qdf_mem_copy(&iface->beacon_filter, filter_params,
831 sizeof(struct beacon_filter_param));
832 iface->beacon_filter_enabled = true;
833
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -0700834 wmi_buf = wmi_buf_alloc(wma->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -0700835 if (!wmi_buf)
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -0700836 return QDF_STATUS_E_NOMEM;
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -0700837
838 buf = (u_int8_t *) wmi_buf_data(wmi_buf);
839
840 cmd = (wmi_add_bcn_filter_cmd_fixed_param *)wmi_buf_data(wmi_buf);
841 cmd->vdev_id = filter_params->vdev_id;
842
843 WMITLV_SET_HDR(&cmd->tlv_header,
844 WMITLV_TAG_STRUC_wmi_add_bcn_filter_cmd_fixed_param,
845 WMITLV_GET_STRUCT_TLVLEN(
846 wmi_add_bcn_filter_cmd_fixed_param));
847
848 buf += sizeof(wmi_add_bcn_filter_cmd_fixed_param);
849
850 WMITLV_SET_HDR(buf, WMITLV_TAG_ARRAY_UINT32,
851 (BCN_FLT_MAX_ELEMS_IE_LIST * sizeof(u_int32_t)));
852
853 ie_map = (A_UINT32 *)(buf + WMI_TLV_HDR_SIZE);
854 for (i = 0; i < BCN_FLT_MAX_ELEMS_IE_LIST; i++) {
855 ie_map[i] = filter_params->ie_map[i];
856 WMA_LOGD("beacon filter ie map = %u", ie_map[i]);
857 }
858
859 ret = wmi_unified_cmd_send(wma->wmi_handle, wmi_buf, len,
860 WMI_ADD_BCN_FILTER_CMDID);
861 if (ret) {
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -0700862 wmi_buf_free(wmi_buf);
863 return QDF_STATUS_E_FAILURE;
864 }
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -0700865
866 return QDF_STATUS_SUCCESS;
867}
868
869/**
870* wma_remove_beacon_filter() - Issue WMI command to remove beacon filter
871* @wma: wma handler
872* @filter_params: beacon_filter_params
873*
874* Return: Return QDF_STATUS
875*/
876QDF_STATUS wma_remove_beacon_filter(WMA_HANDLE handle,
877 struct beacon_filter_param *filter_params)
878{
879 wmi_buf_t buf;
880 tp_wma_handle wma = (tp_wma_handle) handle;
881 wmi_rmv_bcn_filter_cmd_fixed_param *cmd;
882 int len = sizeof(wmi_rmv_bcn_filter_cmd_fixed_param);
883 int ret;
884
885 if (!wma || !wma->wmi_handle) {
886 WMA_LOGE("%s: WMA is closed, cannot issue remove beacon filter",
887 __func__);
888 return QDF_STATUS_E_INVAL;
889 }
890
891 buf = wmi_buf_alloc(wma->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -0700892 if (!buf)
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -0700893 return QDF_STATUS_E_NOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -0700894
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -0700895 cmd = (wmi_rmv_bcn_filter_cmd_fixed_param *)wmi_buf_data(buf);
896 cmd->vdev_id = filter_params->vdev_id;
897
898 WMITLV_SET_HDR(&cmd->tlv_header,
899 WMITLV_TAG_STRUC_wmi_rmv_bcn_filter_cmd_fixed_param,
900 WMITLV_GET_STRUCT_TLVLEN(
901 wmi_rmv_bcn_filter_cmd_fixed_param));
902
903 ret = wmi_unified_cmd_send(wma->wmi_handle, buf, len,
904 WMI_RMV_BCN_FILTER_CMDID);
905 if (ret) {
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -0700906 wmi_buf_free(buf);
907 return QDF_STATUS_E_FAILURE;
908 }
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -0700909
910 return QDF_STATUS_SUCCESS;
911}
912
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +0530913/**
914 * wma_send_adapt_dwelltime_params() - send adaptive dwelltime configuration
915 * params to firmware
916 * @wma_handle: wma handler
917 * @dwelltime_params: pointer to dwelltime_params
918 *
919 * Return: QDF_STATUS_SUCCESS on success and QDF failure reason code for failure
920 */
921QDF_STATUS wma_send_adapt_dwelltime_params(WMA_HANDLE handle,
922 struct adaptive_dwelltime_params *dwelltime_params)
923{
924 tp_wma_handle wma_handle = (tp_wma_handle) handle;
925 struct wmi_adaptive_dwelltime_params wmi_param = {0};
926 int32_t err;
927
928 wmi_param.is_enabled = dwelltime_params->is_enabled;
929 wmi_param.dwelltime_mode = dwelltime_params->dwelltime_mode;
930 wmi_param.lpf_weight = dwelltime_params->lpf_weight;
931 wmi_param.passive_mon_intval = dwelltime_params->passive_mon_intval;
932 wmi_param.wifi_act_threshold = dwelltime_params->wifi_act_threshold;
933 err = wmi_unified_send_adapt_dwelltime_params_cmd(wma_handle->
934 wmi_handle, &wmi_param);
935 if (err)
936 return QDF_STATUS_E_FAILURE;
937
938 return QDF_STATUS_SUCCESS;
939}
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -0700940
Nitesh Shahf9a09ff2017-05-22 15:46:25 +0530941QDF_STATUS wma_send_dbs_scan_selection_params(WMA_HANDLE handle,
942 struct wmi_dbs_scan_sel_params *dbs_scan_params)
943{
944 tp_wma_handle wma_handle = (tp_wma_handle) handle;
945 int32_t err;
946
947 err = wmi_unified_send_dbs_scan_sel_params_cmd(wma_handle->
948 wmi_handle, dbs_scan_params);
949 if (err)
950 return QDF_STATUS_E_FAILURE;
951
952 return QDF_STATUS_SUCCESS;
953}
954
Govind Singha471e5e2015-10-12 17:11:14 +0530955/**
Govind Singhaa64c242016-03-08 11:31:49 +0530956 * wma_unified_fw_profiling_cmd() - send FW profiling cmd to WLAN FW
Govind Singha471e5e2015-10-12 17:11:14 +0530957 * @wma: wma handle
958 * @cmd: Profiling command index
959 * @value1: parameter1 value
960 * @value2: parameter2 value
961 *
962 * Return: 0 for success else error code
963 */
Govind Singhaa64c242016-03-08 11:31:49 +0530964QDF_STATUS wma_unified_fw_profiling_cmd(wmi_unified_t wmi_handle,
Govind Singha471e5e2015-10-12 17:11:14 +0530965 uint32_t cmd, uint32_t value1, uint32_t value2)
966{
Govind Singha471e5e2015-10-12 17:11:14 +0530967 int ret;
Govind Singha471e5e2015-10-12 17:11:14 +0530968
Govind Singhaa64c242016-03-08 11:31:49 +0530969 ret = wmi_unified_fw_profiling_data_cmd(wmi_handle, cmd,
970 value1, value2);
971 if (ret) {
972 WMA_LOGE("enable cmd Failed for id %d value %d",
973 value1, value2);
974 return ret;
Govind Singha471e5e2015-10-12 17:11:14 +0530975 }
976
Govind Singhaa64c242016-03-08 11:31:49 +0530977 return QDF_STATUS_SUCCESS;
Govind Singha471e5e2015-10-12 17:11:14 +0530978}
979
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800980/**
Naveen Rawatd7734142017-10-27 10:02:40 -0700981 * wma_wow_set_wake_time() - set timer pattern tlv, so that firmware will wake
982 * up host after specified time is elapsed
983 * @wma_handle: wma handle
984 * @vdev_id: vdev id
985 * @cookie: value to identify reason why host set up wake call.
986 * @time: time in ms
987 *
988 * Return: QDF status
989 */
990static QDF_STATUS wma_wow_set_wake_time(WMA_HANDLE wma_handle, uint8_t vdev_id,
991 uint32_t cookie, uint32_t time)
992{
993 int ret;
994 tp_wma_handle wma = (tp_wma_handle)wma_handle;
995
996 WMA_LOGD(FL("send timer patter with time: %d and vdev = %d to fw"),
997 time, vdev_id);
998 ret = wmi_unified_wow_timer_pattern_cmd(wma->wmi_handle, vdev_id,
999 cookie, time);
1000 if (ret) {
1001 WMA_LOGE(FL("Failed to send timer patter to fw"));
1002 return QDF_STATUS_E_FAILURE;
1003 }
1004
1005 return QDF_STATUS_SUCCESS;
1006}
1007
Qiwei Caidcb73b02018-09-17 19:58:29 +08001008#ifdef WLAN_POWER_MANAGEMENT_OFFLOAD
Naveen Rawatd7734142017-10-27 10:02:40 -07001009/**
1010 * wma_check_and_set_wake_timer(): checks all interfaces and if any interface
1011 * has install_key pending, sets timer pattern in fw to wake up host after
1012 * specified time has elapsed.
1013 * @wma: wma handle
1014 * @time: time after which host wants to be awaken.
1015 *
1016 * Return: None
1017 */
1018void wma_check_and_set_wake_timer(uint32_t time)
1019{
1020 int i;
1021 struct wma_txrx_node *iface;
Rajeev Kumarf31b9232018-01-19 14:35:20 -08001022 bool is_set_key_in_progress = false;
Naveen Rawatd7734142017-10-27 10:02:40 -07001023 t_wma_handle *wma = cds_get_context(QDF_MODULE_ID_WMA);
1024
Amar Singhal4c3fbb42018-01-02 13:20:28 -08001025 if (!wma) {
1026 WMA_LOGE("%s: WMA is closed",
1027 __func__);
1028 return;
1029 }
1030
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05301031 if (!wmi_service_enabled(wma->wmi_handle,
1032 wmi_service_wow_wakeup_by_timer_pattern)) {
Naveen Rawatd7734142017-10-27 10:02:40 -07001033 WMA_LOGD("TIME_PATTERN is not enabled");
1034 return;
1035 }
1036
1037 for (i = 0; i < wma->max_bssid; i++) {
1038 iface = &wma->interfaces[i];
Pragaspathi Thilagarajf81a8f02018-08-15 21:44:07 +05301039 if (iface->vdev_active && iface->is_waiting_for_key) {
Naveen Rawatd7734142017-10-27 10:02:40 -07001040 /*
1041 * right now cookie is dont care, since FW disregards
1042 * that.
1043 */
Rajeev Kumarf31b9232018-01-19 14:35:20 -08001044 is_set_key_in_progress = true;
Naveen Rawatd7734142017-10-27 10:02:40 -07001045 wma_wow_set_wake_time((WMA_HANDLE)wma, i, 0, time);
1046 break;
1047 }
1048 }
Rajeev Kumarf31b9232018-01-19 14:35:20 -08001049
1050 if (!is_set_key_in_progress)
1051 WMA_LOGD("set key not in progress for any vdev");
Naveen Rawatd7734142017-10-27 10:02:40 -07001052}
1053
1054/**
Govind Singhd76a5b02016-03-08 15:12:14 +05301055 * wma_unified_csa_offload_enable() - sen CSA offload enable command
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001056 * @wma: wma handle
1057 * @vdev_id: vdev id
1058 *
1059 * Return: 0 for success or error code
1060 */
Govind Singhd76a5b02016-03-08 15:12:14 +05301061int wma_unified_csa_offload_enable(tp_wma_handle wma, uint8_t vdev_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001062{
Govind Singhaa64c242016-03-08 11:31:49 +05301063 if (wmi_unified_csa_offload_enable(wma->wmi_handle,
1064 vdev_id)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001065 WMA_LOGP("%s: Failed to send CSA offload enable command",
1066 __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001067 return -EIO;
1068 }
Govind Singhaa64c242016-03-08 11:31:49 +05301069
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001070 return 0;
1071}
Qiwei Caidcb73b02018-09-17 19:58:29 +08001072#endif /* WLAN_POWER_MANAGEMENT_OFFLOAD */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001073
Abhishek Ambure0ceb5ca2019-11-15 18:22:45 +05301074static uint8_t *
1075wma_parse_ch_switch_wrapper_ie(uint8_t *ch_wr_ie, uint8_t sub_ele_id)
1076{
1077 uint8_t len = 0, sub_ele_len = 0;
1078 struct ie_header *ele;
1079
1080 ele = (struct ie_header *)ch_wr_ie;
1081 if (ele->ie_id != WLAN_ELEMID_CHAN_SWITCH_WRAP ||
1082 ele->ie_len == 0)
1083 return NULL;
1084
1085 len = ele->ie_len;
1086 ele = (struct ie_header *)(ch_wr_ie + sizeof(struct ie_header));
1087
1088 while (len > 0) {
1089 sub_ele_len = sizeof(struct ie_header) + ele->ie_len;
1090 len -= sub_ele_len;
1091 if (ele->ie_id == sub_ele_id)
1092 return (uint8_t *)ele;
1093
1094 ele = (struct ie_header *)((uint8_t *)ele + sub_ele_len);
1095 }
1096
1097 return NULL;
1098}
1099
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001100/**
1101 * wma_csa_offload_handler() - CSA event handler
1102 * @handle: wma handle
1103 * @event: event buffer
1104 * @len: buffer length
1105 *
1106 * This event is sent by firmware when it receives CSA IE.
1107 *
1108 * Return: 0 for success or error code
1109 */
1110int wma_csa_offload_handler(void *handle, uint8_t *event, uint32_t len)
1111{
1112 tp_wma_handle wma = (tp_wma_handle) handle;
1113 WMI_CSA_HANDLING_EVENTID_param_tlvs *param_buf;
1114 wmi_csa_event_fixed_param *csa_event;
Srinivas Girigowdaa47b45f2019-02-27 12:29:02 -08001115 uint8_t bssid[QDF_MAC_ADDR_SIZE];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001116 uint8_t vdev_id = 0;
1117 uint8_t cur_chan = 0;
1118 struct ieee80211_channelswitch_ie *csa_ie;
Chandrasekaran, Manishekar5c19dc52016-02-04 14:58:26 +05301119 struct csa_offload_params *csa_offload_event;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001120 struct ieee80211_extendedchannelswitch_ie *xcsa_ie;
1121 struct ieee80211_ie_wide_bw_switch *wb_ie;
1122 struct wma_txrx_node *intr = wma->interfaces;
1123
1124 param_buf = (WMI_CSA_HANDLING_EVENTID_param_tlvs *) event;
1125
1126 WMA_LOGD("%s: Enter", __func__);
1127 if (!param_buf) {
1128 WMA_LOGE("Invalid csa event buffer");
1129 return -EINVAL;
1130 }
1131 csa_event = param_buf->fixed_param;
1132 WMI_MAC_ADDR_TO_CHAR_ARRAY(&csa_event->i_addr2, &bssid[0]);
1133
1134 if (wma_find_vdev_by_bssid(wma, bssid, &vdev_id) == NULL) {
1135 WMA_LOGE("Invalid bssid received %s:%d", __func__, __LINE__);
1136 return -EINVAL;
1137 }
1138
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301139 csa_offload_event = qdf_mem_malloc(sizeof(*csa_offload_event));
Arif Hussain157263f2018-10-03 13:07:15 -07001140 if (!csa_offload_event)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001141 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001142
Tushnim Bhattacharyyaeb622b02018-05-07 13:50:51 -07001143 if (wma->interfaces[vdev_id].roaming_in_progress ||
1144 wma->interfaces[vdev_id].roam_synch_in_progress) {
1145 WMA_LOGE("Roaming in progress for vdev %d, ignore csa_offload_event",
1146 vdev_id);
1147 qdf_mem_free(csa_offload_event);
1148 return -EINVAL;
1149 }
1150
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301151 qdf_mem_zero(csa_offload_event, sizeof(*csa_offload_event));
Srinivas Girigowdaa47b45f2019-02-27 12:29:02 -08001152 qdf_mem_copy(csa_offload_event->bssId, &bssid, QDF_MAC_ADDR_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001153
1154 if (csa_event->ies_present_flag & WMI_CSA_IE_PRESENT) {
1155 csa_ie = (struct ieee80211_channelswitch_ie *)
1156 (&csa_event->csa_ie[0]);
1157 csa_offload_event->channel = csa_ie->newchannel;
Liangwei Dongc1956bd2020-01-07 19:50:57 +08001158 csa_offload_event->csa_chan_freq =
1159 wlan_reg_legacy_chan_to_freq(wma->pdev,
1160 csa_ie->newchannel);
Chandrasekaran, Manishekar5c19dc52016-02-04 14:58:26 +05301161 csa_offload_event->switch_mode = csa_ie->switchmode;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001162 } else if (csa_event->ies_present_flag & WMI_XCSA_IE_PRESENT) {
1163 xcsa_ie = (struct ieee80211_extendedchannelswitch_ie *)
1164 (&csa_event->xcsa_ie[0]);
1165 csa_offload_event->channel = xcsa_ie->newchannel;
Chandrasekaran, Manishekar5c19dc52016-02-04 14:58:26 +05301166 csa_offload_event->switch_mode = xcsa_ie->switchmode;
Gupta, Kapil121bf212015-11-25 19:21:29 +05301167 csa_offload_event->new_op_class = xcsa_ie->newClass;
Liangwei Dongc1956bd2020-01-07 19:50:57 +08001168 if (wlan_reg_is_6ghz_op_class(wma->pdev, xcsa_ie->newClass)) {
1169 csa_offload_event->csa_chan_freq =
1170 wlan_reg_chan_band_to_freq
1171 (wma->pdev, xcsa_ie->newchannel,
1172 BIT(REG_BAND_6G));
1173 } else {
1174 csa_offload_event->csa_chan_freq =
1175 wlan_reg_legacy_chan_to_freq
1176 (wma->pdev, xcsa_ie->newchannel);
1177 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001178 } else {
1179 WMA_LOGE("CSA Event error: No CSA IE present");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301180 qdf_mem_free(csa_offload_event);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001181 return -EINVAL;
1182 }
1183
1184 if (csa_event->ies_present_flag & WMI_WBW_IE_PRESENT) {
1185 wb_ie = (struct ieee80211_ie_wide_bw_switch *)
1186 (&csa_event->wb_ie[0]);
1187 csa_offload_event->new_ch_width = wb_ie->new_ch_width;
1188 csa_offload_event->new_ch_freq_seg1 = wb_ie->new_ch_freq_seg1;
1189 csa_offload_event->new_ch_freq_seg2 = wb_ie->new_ch_freq_seg2;
Abhishek Ambure0ceb5ca2019-11-15 18:22:45 +05301190 } else if (csa_event->ies_present_flag &
1191 WMI_CSWRAP_IE_EXTENDED_PRESENT) {
1192 wb_ie = (struct ieee80211_ie_wide_bw_switch *)
1193 wma_parse_ch_switch_wrapper_ie(
1194 (uint8_t *)&csa_event->cswrap_ie_extended,
1195 WLAN_ELEMID_WIDE_BAND_CHAN_SWITCH);
1196 if (wb_ie) {
1197 csa_offload_event->new_ch_width = wb_ie->new_ch_width;
1198 csa_offload_event->new_ch_freq_seg1 =
1199 wb_ie->new_ch_freq_seg1;
1200 csa_offload_event->new_ch_freq_seg2 =
1201 wb_ie->new_ch_freq_seg2;
1202 csa_event->ies_present_flag |= WMI_WBW_IE_PRESENT;
1203 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001204 }
1205
1206 csa_offload_event->ies_present_flag = csa_event->ies_present_flag;
1207
Liangwei Dongc1956bd2020-01-07 19:50:57 +08001208 WMA_LOGD("CSA: New Channel = %d freq %d BSSID:%pM",
1209 csa_offload_event->channel, csa_offload_event->csa_chan_freq,
1210 csa_offload_event->bssId);
Abhishek Ambure0ceb5ca2019-11-15 18:22:45 +05301211 WMA_LOGD("CSA: IEs Present Flag = 0x%x new ch width = %d ch center freq1 = %d ch center freq2 = %d new op class = %d",
1212 csa_event->ies_present_flag,
1213 csa_offload_event->new_ch_width,
1214 csa_offload_event->new_ch_freq_seg1,
1215 csa_offload_event->new_ch_freq_seg2,
1216 csa_offload_event->new_op_class);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001217
1218 cur_chan = cds_freq_to_chan(intr[vdev_id].mhz);
1219 /*
1220 * basic sanity check: requested channel should not be 0
1221 * and equal to home channel
1222 */
Kiran Kumar Lokere75d636f2016-12-20 14:52:03 -08001223 if (0 == csa_offload_event->channel) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001224 WMA_LOGE("CSA Event with channel %d. Ignore !!",
1225 csa_offload_event->channel);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301226 qdf_mem_free(csa_offload_event);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001227 return -EINVAL;
1228 }
Abhishek Singhfb5b4d32018-12-06 11:53:08 +05301229
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001230 wma_send_msg(wma, WMA_CSA_OFFLOAD_EVENT, (void *)csa_offload_event, 0);
1231 return 0;
1232}
1233
1234#ifdef FEATURE_OEM_DATA_SUPPORT
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001235/**
Krishna Kumaar Natarajan4e9cf392015-11-20 13:35:05 -08001236 * wma_oem_data_response_handler() - OEM data response event handler
1237 * @handle: wma handle
1238 * @datap: data ptr
1239 * @len: data length
1240 *
1241 * Return: 0 for success or error code
1242 */
1243int wma_oem_data_response_handler(void *handle,
1244 uint8_t *datap, uint32_t len)
1245{
Krishna Kumaar Natarajan4e9cf392015-11-20 13:35:05 -08001246 WMI_OEM_RESPONSE_EVENTID_param_tlvs *param_buf;
1247 uint8_t *data;
1248 uint32_t datalen;
Krishna Kumaar Natarajanc1fa17d2016-08-03 14:19:20 -07001249 struct oem_data_rsp *oem_rsp;
Jeff Johnson9f18aa72018-12-02 12:05:12 -08001250 struct mac_context *pmac = cds_get_context(QDF_MODULE_ID_PE);
Krishna Kumaar Natarajan73ea9f22016-06-30 18:38:47 -07001251
1252 if (!pmac) {
1253 WMA_LOGE(FL("Invalid pmac"));
1254 return -EINVAL;
1255 }
1256
Krishna Kumaar Natarajanbbbf2ef2016-08-03 14:06:26 -07001257 if (!pmac->sme.oem_data_rsp_callback) {
Krishna Kumaar Natarajan73ea9f22016-06-30 18:38:47 -07001258 WMA_LOGE(FL("Callback not registered"));
1259 return -EINVAL;
1260 }
Krishna Kumaar Natarajan4e9cf392015-11-20 13:35:05 -08001261
1262 param_buf = (WMI_OEM_RESPONSE_EVENTID_param_tlvs *) datap;
1263 if (!param_buf) {
1264 WMA_LOGE(FL("Received NULL buf ptr from FW"));
1265 return -ENOMEM;
1266 }
1267
1268 data = param_buf->data;
1269 datalen = param_buf->num_data;
1270
1271 if (!data) {
1272 WMA_LOGE(FL("Received NULL data from FW"));
1273 return -EINVAL;
1274 }
1275
1276 if (datalen > OEM_DATA_RSP_SIZE) {
1277 WMA_LOGE(FL("Received data len %d exceeds max value %d"),
1278 datalen, OEM_DATA_RSP_SIZE);
1279 return -EINVAL;
1280 }
1281
Krishna Kumaar Natarajan608291e2015-12-14 18:17:27 -08001282 oem_rsp = qdf_mem_malloc(sizeof(*oem_rsp));
Arif Hussain157263f2018-10-03 13:07:15 -07001283 if (!oem_rsp)
Krishna Kumaar Natarajan4e9cf392015-11-20 13:35:05 -08001284 return -ENOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -07001285
Krishna Kumaar Natarajan608291e2015-12-14 18:17:27 -08001286 oem_rsp->rsp_len = datalen;
Krishna Kumaar Natarajana96ee0f2016-03-10 16:57:45 -08001287 if (oem_rsp->rsp_len) {
Krishna Kumaar Natarajan73ea9f22016-06-30 18:38:47 -07001288 oem_rsp->data = qdf_mem_malloc(oem_rsp->rsp_len);
1289 if (!oem_rsp->data) {
Krishna Kumaar Natarajana96ee0f2016-03-10 16:57:45 -08001290 qdf_mem_free(oem_rsp);
1291 return -ENOMEM;
1292 }
1293 } else {
1294 WMA_LOGE(FL("Invalid rsp length: %d"),
1295 oem_rsp->rsp_len);
Krishna Kumaar Natarajan608291e2015-12-14 18:17:27 -08001296 qdf_mem_free(oem_rsp);
Krishna Kumaar Natarajana96ee0f2016-03-10 16:57:45 -08001297 return -EINVAL;
Krishna Kumaar Natarajan608291e2015-12-14 18:17:27 -08001298 }
Krishna Kumaar Natarajan4e9cf392015-11-20 13:35:05 -08001299
Krishna Kumaar Natarajan73ea9f22016-06-30 18:38:47 -07001300 qdf_mem_copy(oem_rsp->data, data, datalen);
Krishna Kumaar Natarajan4e9cf392015-11-20 13:35:05 -08001301
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08001302 WMA_LOGD("Sending OEM_DATA_RSP(len: %d) to upper layer", datalen);
Krishna Kumaar Natarajan4e9cf392015-11-20 13:35:05 -08001303
Krishna Kumaar Natarajanbbbf2ef2016-08-03 14:06:26 -07001304 pmac->sme.oem_data_rsp_callback(oem_rsp);
Krishna Kumaar Natarajan73ea9f22016-06-30 18:38:47 -07001305
1306 if (oem_rsp->data)
1307 qdf_mem_free(oem_rsp->data);
1308 qdf_mem_free(oem_rsp);
1309
Krishna Kumaar Natarajan4e9cf392015-11-20 13:35:05 -08001310 return 0;
1311}
1312
Paul Zhangda2970b2019-06-23 18:16:38 +08001313QDF_STATUS wma_start_oem_req_cmd(tp_wma_handle wma_handle,
1314 struct oem_data_req *oem_data_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001315{
Paul Zhangda2970b2019-06-23 18:16:38 +08001316 QDF_STATUS ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001317
Krishna Kumaar Natarajan9ac8efd2015-11-20 13:40:24 -08001318 WMA_LOGD(FL("Send OEM Data Request to target"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001319
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07001320 if (!oem_data_req || !oem_data_req->data) {
1321 WMA_LOGE(FL("oem_data_req is null"));
1322 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001323 }
1324
1325 if (!wma_handle || !wma_handle->wmi_handle) {
Krishna Kumaar Natarajan9ac8efd2015-11-20 13:40:24 -08001326 WMA_LOGE(FL("WMA - closed, can not send Oem data request cmd"));
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07001327 qdf_mem_free(oem_data_req->data);
1328 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001329 }
1330
Paul Zhangda2970b2019-06-23 18:16:38 +08001331 /* legacy api, for oem data request case */
Govind Singhaa64c242016-03-08 11:31:49 +05301332 ret = wmi_unified_start_oem_data_cmd(wma_handle->wmi_handle,
Paul Zhangda2970b2019-06-23 18:16:38 +08001333 oem_data_req->data_len,
1334 oem_data_req->data);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001335
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07001336 if (!QDF_IS_STATUS_SUCCESS(ret))
1337 WMA_LOGE(FL("wmi cmd send failed"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001338
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07001339 return ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001340}
1341#endif /* FEATURE_OEM_DATA_SUPPORT */
1342
Paul Zhangda2970b2019-06-23 18:16:38 +08001343#ifdef FEATURE_OEM_DATA
1344QDF_STATUS wma_start_oem_data_cmd(tp_wma_handle wma_handle,
1345 struct oem_data *oem_data)
1346{
1347 QDF_STATUS ret;
1348
1349 wma_debug("Send OEM Data to target");
1350
1351 if (!oem_data || !oem_data->data) {
1352 wma_err("oem_data is null");
1353 return QDF_STATUS_E_INVAL;
1354 }
1355
1356 if (!wma_handle || !wma_handle->wmi_handle) {
1357 wma_err("WMA - closed");
1358 return QDF_STATUS_E_INVAL;
1359 }
1360
1361 /* common api, for oem data command case */
1362 ret = wmi_unified_start_oemv2_data_cmd(wma_handle->wmi_handle,
1363 oem_data);
1364 if (!QDF_IS_STATUS_SUCCESS(ret))
1365 wma_err("call start wmi cmd failed");
1366
1367 return ret;
1368}
1369#endif
1370
Vevek Venkatesan988a1392019-06-19 00:54:11 +05301371#if !defined(REMOVE_PKT_LOG) && defined(FEATURE_PKTLOG)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001372/**
1373 * wma_pktlog_wmi_send_cmd() - send pktlog enable/disable command to target
1374 * @handle: wma handle
1375 * @params: pktlog params
1376 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301377 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001378 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301379QDF_STATUS wma_pktlog_wmi_send_cmd(WMA_HANDLE handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001380 struct ath_pktlog_wmi_params *params)
1381{
1382 tp_wma_handle wma_handle = (tp_wma_handle) handle;
Govind Singhaa64c242016-03-08 11:31:49 +05301383 int ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001384
Govind Singhaa64c242016-03-08 11:31:49 +05301385 ret = wmi_unified_pktlog_wmi_send_cmd(wma_handle->wmi_handle,
Srinivas Girigowdac34f11d2016-02-25 16:02:42 -08001386 params->pktlog_event,
1387 params->cmd_id, params->user_triggered);
Govind Singhaa64c242016-03-08 11:31:49 +05301388 if (ret)
1389 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001390
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301391 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001392}
Vevek Venkatesan988a1392019-06-19 00:54:11 +05301393#endif /* !REMOVE_PKT_LOG && FEATURE_PKTLOG */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001394
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001395/**
1396 * wma_wow_wake_reason_str() - Converts wow wakeup reason code to text format
1397 * @wake_reason - WOW wake reason
1398 *
1399 * Return: reason code in string format
1400 */
Krunal Sonibd7e8932018-10-03 11:14:51 -07001401static const uint8_t *wma_wow_wake_reason_str(A_INT32 wake_reason)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001402{
1403 switch (wake_reason) {
1404 case WOW_REASON_UNSPECIFIED:
1405 return "UNSPECIFIED";
1406 case WOW_REASON_NLOD:
1407 return "NLOD";
1408 case WOW_REASON_AP_ASSOC_LOST:
1409 return "AP_ASSOC_LOST";
1410 case WOW_REASON_LOW_RSSI:
1411 return "LOW_RSSI";
1412 case WOW_REASON_DEAUTH_RECVD:
1413 return "DEAUTH_RECVD";
1414 case WOW_REASON_DISASSOC_RECVD:
1415 return "DISASSOC_RECVD";
1416 case WOW_REASON_GTK_HS_ERR:
1417 return "GTK_HS_ERR";
1418 case WOW_REASON_EAP_REQ:
1419 return "EAP_REQ";
1420 case WOW_REASON_FOURWAY_HS_RECV:
1421 return "FOURWAY_HS_RECV";
1422 case WOW_REASON_TIMER_INTR_RECV:
1423 return "TIMER_INTR_RECV";
1424 case WOW_REASON_PATTERN_MATCH_FOUND:
1425 return "PATTERN_MATCH_FOUND";
1426 case WOW_REASON_RECV_MAGIC_PATTERN:
1427 return "RECV_MAGIC_PATTERN";
1428 case WOW_REASON_P2P_DISC:
1429 return "P2P_DISC";
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001430 case WOW_REASON_WLAN_HB:
1431 return "WLAN_HB";
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001432 case WOW_REASON_CSA_EVENT:
1433 return "CSA_EVENT";
1434 case WOW_REASON_PROBE_REQ_WPS_IE_RECV:
Dustin Brown72f02252017-01-10 15:34:57 -08001435 return "PROBE_REQ_WPS_IE_RECV";
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001436 case WOW_REASON_AUTH_REQ_RECV:
1437 return "AUTH_REQ_RECV";
1438 case WOW_REASON_ASSOC_REQ_RECV:
1439 return "ASSOC_REQ_RECV";
1440 case WOW_REASON_HTT_EVENT:
Dustin Brown72f02252017-01-10 15:34:57 -08001441 return "HTT_EVENT";
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001442 case WOW_REASON_RA_MATCH:
Dustin Brown72f02252017-01-10 15:34:57 -08001443 return "RA_MATCH";
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001444 case WOW_REASON_HOST_AUTO_SHUTDOWN:
Dustin Brown72f02252017-01-10 15:34:57 -08001445 return "HOST_AUTO_SHUTDOWN";
1446 case WOW_REASON_IOAC_MAGIC_EVENT:
1447 return "IOAC_MAGIC_EVENT";
1448 case WOW_REASON_IOAC_SHORT_EVENT:
1449 return "IOAC_SHORT_EVENT";
1450 case WOW_REASON_IOAC_EXTEND_EVENT:
1451 return "IOAC_EXTEND_EVENT";
1452 case WOW_REASON_IOAC_TIMER_EVENT:
1453 return "IOAC_TIMER_EVENT";
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001454 case WOW_REASON_ROAM_HO:
Dustin Brown72f02252017-01-10 15:34:57 -08001455 return "ROAM_HO";
Pragaspathi Thilagaraj0c4489f2019-08-05 20:50:23 +05301456 case WOW_REASON_ROAM_PREAUTH_START:
1457 return "ROAM_PREAUTH_START_EVENT";
Dustin Brown72f02252017-01-10 15:34:57 -08001458 case WOW_REASON_DFS_PHYERR_RADADR_EVENT:
1459 return "DFS_PHYERR_RADADR_EVENT";
1460 case WOW_REASON_BEACON_RECV:
1461 return "BEACON_RECV";
1462 case WOW_REASON_CLIENT_KICKOUT_EVENT:
1463 return "CLIENT_KICKOUT_EVENT";
Naveen Rawatc9f09522016-05-12 14:02:42 -07001464 case WOW_REASON_NAN_EVENT:
Dustin Brown72f02252017-01-10 15:34:57 -08001465 return "NAN_EVENT";
1466 case WOW_REASON_EXTSCAN:
1467 return "EXTSCAN";
1468 case WOW_REASON_RSSI_BREACH_EVENT:
1469 return "RSSI_BREACH_EVENT";
1470 case WOW_REASON_IOAC_REV_KA_FAIL_EVENT:
1471 return "IOAC_REV_KA_FAIL_EVENT";
1472 case WOW_REASON_IOAC_SOCK_EVENT:
1473 return "IOAC_SOCK_EVENT";
1474 case WOW_REASON_NLO_SCAN_COMPLETE:
1475 return "NLO_SCAN_COMPLETE";
1476 case WOW_REASON_PACKET_FILTER_MATCH:
1477 return "PACKET_FILTER_MATCH";
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05301478 case WOW_REASON_ASSOC_RES_RECV:
1479 return "ASSOC_RES_RECV";
1480 case WOW_REASON_REASSOC_REQ_RECV:
1481 return "REASSOC_REQ_RECV";
1482 case WOW_REASON_REASSOC_RES_RECV:
1483 return "REASSOC_RES_RECV";
1484 case WOW_REASON_ACTION_FRAME_RECV:
1485 return "ACTION_FRAME_RECV";
Arun Khandavalli3dd06de2016-08-17 10:20:29 +05301486 case WOW_REASON_BPF_ALLOW:
Nachiket Kukade177b5b02018-05-22 20:52:17 +05301487 return "BPF_ALLOW";
Rajeev Kumar969d1b12016-12-20 23:53:20 -08001488 case WOW_REASON_NAN_DATA:
Dustin Brown72f02252017-01-10 15:34:57 -08001489 return "NAN_DATA";
1490 case WOW_REASON_OEM_RESPONSE_EVENT:
1491 return "OEM_RESPONSE_EVENT";
Rajeev Kumar969d1b12016-12-20 23:53:20 -08001492 case WOW_REASON_TDLS_CONN_TRACKER_EVENT:
Dustin Brown72f02252017-01-10 15:34:57 -08001493 return "TDLS_CONN_TRACKER_EVENT";
Rajeev Kumar969d1b12016-12-20 23:53:20 -08001494 case WOW_REASON_CRITICAL_LOG:
Dustin Brown72f02252017-01-10 15:34:57 -08001495 return "CRITICAL_LOG";
Rajeev Kumar969d1b12016-12-20 23:53:20 -08001496 case WOW_REASON_P2P_LISTEN_OFFLOAD:
Dustin Brown72f02252017-01-10 15:34:57 -08001497 return "P2P_LISTEN_OFFLOAD";
Rajeev Kumar969d1b12016-12-20 23:53:20 -08001498 case WOW_REASON_NAN_EVENT_WAKE_HOST:
Dustin Brown72f02252017-01-10 15:34:57 -08001499 return "NAN_EVENT_WAKE_HOST";
1500 case WOW_REASON_DEBUG_TEST:
1501 return "DEBUG_TEST";
Ravi Kumar Bokka05c14e52017-03-27 14:48:23 +05301502 case WOW_REASON_CHIP_POWER_FAILURE_DETECT:
1503 return "CHIP_POWER_FAILURE_DETECT";
Amar Singhal5eb9acb2017-05-26 15:25:27 -07001504 case WOW_REASON_11D_SCAN:
1505 return "11D_SCAN";
Arif Hussain05fb4872018-01-03 16:02:55 -08001506 case WOW_REASON_SAP_OBSS_DETECTION:
1507 return "SAP_OBSS_DETECTION";
1508 case WOW_REASON_BSS_COLOR_COLLISION_DETECT:
1509 return "BSS_COLOR_COLLISION_DETECT";
Visweswara Tanuku633976b2019-01-07 16:13:12 +05301510#ifdef WLAN_FEATURE_MOTION_DETECTION
1511 case WOW_REASON_WLAN_MD:
1512 return "MOTION_DETECT";
1513 case WOW_REASON_WLAN_BL:
1514 return "MOTION_DETECT_BASELINE";
1515#endif /* WLAN_FEATURE_MOTION_DETECTION */
Rajeev Kumar0e5dec02019-06-13 18:12:22 -07001516 case WOW_REASON_PAGE_FAULT:
1517 return "PAGE_FAULT";
Dustin Brown72f02252017-01-10 15:34:57 -08001518 default:
1519 return "unknown";
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001520 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001521}
1522
Dustin Brownb1032c22018-05-03 16:21:19 -07001523static bool wma_wow_reason_has_stats(enum wake_reason_e reason)
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08001524{
Dustin Brownb1032c22018-05-03 16:21:19 -07001525 switch (reason) {
1526 case WOW_REASON_ASSOC_REQ_RECV:
1527 case WOW_REASON_DISASSOC_RECVD:
1528 case WOW_REASON_ASSOC_RES_RECV:
1529 case WOW_REASON_REASSOC_REQ_RECV:
1530 case WOW_REASON_REASSOC_RES_RECV:
1531 case WOW_REASON_AUTH_REQ_RECV:
1532 case WOW_REASON_DEAUTH_RECVD:
1533 case WOW_REASON_ACTION_FRAME_RECV:
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08001534 case WOW_REASON_BPF_ALLOW:
1535 case WOW_REASON_PATTERN_MATCH_FOUND:
Will Huang3f7cb652018-11-28 10:41:24 +08001536 case WOW_REASON_PACKET_FILTER_MATCH:
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08001537 case WOW_REASON_RA_MATCH:
1538 case WOW_REASON_NLOD:
1539 case WOW_REASON_NLO_SCAN_COMPLETE:
1540 case WOW_REASON_LOW_RSSI:
1541 case WOW_REASON_EXTSCAN:
1542 case WOW_REASON_RSSI_BREACH_EVENT:
1543 case WOW_REASON_OEM_RESPONSE_EVENT:
1544 case WOW_REASON_CHIP_POWER_FAILURE_DETECT:
1545 case WOW_REASON_11D_SCAN:
Dustin Brownb1032c22018-05-03 16:21:19 -07001546 return true;
Visweswara Tanuku633976b2019-01-07 16:13:12 +05301547#ifdef WLAN_FEATURE_MOTION_DETECTION
1548 case WOW_REASON_WLAN_MD:
1549 case WOW_REASON_WLAN_BL:
1550 return true;
1551#endif /* WLAN_FEATURE_MOTION_DETECTION */
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08001552 default:
Dustin Brownb1032c22018-05-03 16:21:19 -07001553 return false;
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08001554 }
Dustin Brownb1032c22018-05-03 16:21:19 -07001555}
1556
1557static void wma_inc_wow_stats(t_wma_handle *wma,
1558 WOW_EVENT_INFO_fixed_param *wake_info)
1559{
1560 ucfg_mc_cp_stats_inc_wake_lock_stats(wma->psoc,
1561 wake_info->vdev_id,
1562 wake_info->wake_reason);
1563}
1564
1565static void wma_wow_stats_display(struct wake_lock_stats *stats)
1566{
1567 WMA_LOGA("WLAN wake reason counters:");
1568 WMA_LOGA("uc:%d bc:%d v4_mc:%d v6_mc:%d ra:%d ns:%d na:%d "
1569 "icmp:%d icmpv6:%d",
1570 stats->ucast_wake_up_count,
1571 stats->bcast_wake_up_count,
1572 stats->ipv4_mcast_wake_up_count,
1573 stats->ipv6_mcast_wake_up_count,
1574 stats->ipv6_mcast_ra_stats,
1575 stats->ipv6_mcast_ns_stats,
1576 stats->ipv6_mcast_na_stats,
1577 stats->icmpv4_count,
1578 stats->icmpv6_count);
1579
1580 WMA_LOGA("assoc:%d disassoc:%d assoc_resp:%d reassoc:%d "
1581 "reassoc_resp:%d auth:%d deauth:%d action:%d",
1582 stats->mgmt_assoc,
1583 stats->mgmt_disassoc,
1584 stats->mgmt_assoc_resp,
1585 stats->mgmt_reassoc,
1586 stats->mgmt_reassoc_resp,
1587 stats->mgmt_auth,
1588 stats->mgmt_deauth,
1589 stats->mgmt_action);
1590
1591 WMA_LOGA("pno_match:%d pno_complete:%d gscan:%d "
1592 "low_rssi:%d rssi_breach:%d oem:%d scan_11d:%d",
1593 stats->pno_match_wake_up_count,
1594 stats->pno_complete_wake_up_count,
1595 stats->gscan_wake_up_count,
1596 stats->low_rssi_wake_up_count,
1597 stats->rssi_breach_wake_up_count,
1598 stats->oem_response_wake_up_count,
1599 stats->scan_11d);
1600}
1601
1602static void wma_print_wow_stats(t_wma_handle *wma,
1603 WOW_EVENT_INFO_fixed_param *wake_info)
1604{
1605 struct wlan_objmgr_vdev *vdev;
1606 struct wake_lock_stats stats = {0};
1607
1608 if (!wma_wow_reason_has_stats(wake_info->wake_reason))
1609 return;
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08001610
1611 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(wma->psoc,
1612 wake_info->vdev_id,
1613 WLAN_LEGACY_WMA_ID);
Abhinav Kumar9ff44902019-11-12 13:53:21 +05301614 if (!vdev) {
1615 WMA_LOGE("%s, vdev_id: %d, failed to get vdev from psoc",
1616 __func__, wake_info->vdev_id);
1617 return;
1618 }
1619
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08001620 ucfg_mc_cp_stats_get_vdev_wake_lock_stats(vdev, &stats);
1621 wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_WMA_ID);
1622 wma_wow_stats_display(&stats);
1623}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001624
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001625#ifdef FEATURE_WLAN_EXTSCAN
1626/**
1627 * wma_extscan_get_eventid_from_tlvtag() - map tlv tag to corresponding event id
1628 * @tag: WMI TLV tag
1629 *
1630 * Return:
1631 * 0 if TLV tag is invalid
1632 * else return corresponding WMI event id
1633 */
1634static int wma_extscan_get_eventid_from_tlvtag(uint32_t tag)
1635{
1636 uint32_t event_id;
1637
1638 switch (tag) {
1639 case WMITLV_TAG_STRUC_wmi_extscan_start_stop_event_fixed_param:
1640 event_id = WMI_EXTSCAN_START_STOP_EVENTID;
1641 break;
1642
1643 case WMITLV_TAG_STRUC_wmi_extscan_operation_event_fixed_param:
1644 event_id = WMI_EXTSCAN_OPERATION_EVENTID;
1645 break;
1646
1647 case WMITLV_TAG_STRUC_wmi_extscan_table_usage_event_fixed_param:
1648 event_id = WMI_EXTSCAN_TABLE_USAGE_EVENTID;
1649 break;
1650
1651 case WMITLV_TAG_STRUC_wmi_extscan_cached_results_event_fixed_param:
1652 event_id = WMI_EXTSCAN_CACHED_RESULTS_EVENTID;
1653 break;
1654
1655 case WMITLV_TAG_STRUC_wmi_extscan_wlan_change_results_event_fixed_param:
1656 event_id = WMI_EXTSCAN_WLAN_CHANGE_RESULTS_EVENTID;
1657 break;
1658
1659 case WMITLV_TAG_STRUC_wmi_extscan_hotlist_match_event_fixed_param:
1660 event_id = WMI_EXTSCAN_HOTLIST_MATCH_EVENTID;
1661 break;
1662
1663 case WMITLV_TAG_STRUC_wmi_extscan_capabilities_event_fixed_param:
1664 event_id = WMI_EXTSCAN_CAPABILITIES_EVENTID;
1665 break;
1666
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001667 default:
1668 event_id = 0;
1669 WMA_LOGE("%s: Unknown tag: %d", __func__, tag);
1670 break;
1671 }
1672
1673 WMA_LOGI("%s: For tag %d WMI event 0x%x", __func__, tag, event_id);
1674 return event_id;
1675}
1676#else
1677static int wma_extscan_get_eventid_from_tlvtag(uint32_t tag)
1678{
1679 return 0;
1680}
1681#endif
1682
1683/**
1684 * wow_get_wmi_eventid() - map reason or tlv tag to corresponding event id
1685 * @tag: WMI TLV tag
1686 * @reason: WOW reason
1687 *
1688 * WOW reason type is primarily used to find the ID. If there could be
1689 * multiple events that can be sent as a WOW event with same reason
1690 * then tlv tag is used to identify the corresponding event.
1691 *
1692 * Return:
1693 * 0 if TLV tag/reason is invalid
1694 * else return corresponding WMI event id
1695 */
1696static int wow_get_wmi_eventid(int32_t reason, uint32_t tag)
1697{
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001698 int event_id;
1699
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001700 switch (reason) {
Dustin Browne2206fb2017-04-20 13:39:25 -07001701 case WOW_REASON_AP_ASSOC_LOST:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001702 event_id = WMI_ROAM_EVENTID;
1703 break;
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001704 case WOW_REASON_NLO_SCAN_COMPLETE:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001705 event_id = WMI_NLO_SCAN_COMPLETE_EVENTID;
1706 break;
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001707 case WOW_REASON_CSA_EVENT:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001708 event_id = WMI_CSA_HANDLING_EVENTID;
1709 break;
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001710 case WOW_REASON_LOW_RSSI:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001711 event_id = WMI_ROAM_EVENTID;
1712 break;
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001713 case WOW_REASON_CLIENT_KICKOUT_EVENT:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001714 event_id = WMI_PEER_STA_KICKOUT_EVENTID;
1715 break;
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001716 case WOW_REASON_EXTSCAN:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001717 event_id = wma_extscan_get_eventid_from_tlvtag(tag);
1718 break;
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001719 case WOW_REASON_RSSI_BREACH_EVENT:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001720 event_id = WMI_RSSI_BREACH_EVENTID;
1721 break;
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001722 case WOW_REASON_NAN_EVENT:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001723 event_id = WMI_NAN_EVENTID;
1724 break;
Naveen Rawat17dccbe2016-08-23 17:09:04 -07001725 case WOW_REASON_NAN_DATA:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001726 event_id = wma_ndp_get_eventid_from_tlvtag(tag);
1727 break;
Selvaraj, Sridhar251761a2016-06-25 16:05:15 +05301728 case WOW_REASON_TDLS_CONN_TRACKER_EVENT:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001729 event_id = WOW_TDLS_CONN_TRACKER_EVENT;
1730 break;
Deepak Dhamdhere6d2c97a2017-02-04 22:09:27 -08001731 case WOW_REASON_ROAM_HO:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001732 event_id = WMI_ROAM_EVENTID;
1733 break;
Amar Singhal5eb9acb2017-05-26 15:25:27 -07001734 case WOW_REASON_11D_SCAN:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001735 event_id = WMI_11D_NEW_COUNTRY_EVENTID;
1736 break;
Pragaspathi Thilagaraj0c4489f2019-08-05 20:50:23 +05301737 case WOW_ROAM_PREAUTH_START_EVENT:
1738 event_id = WMI_ROAM_PREAUTH_STATUS_CMDID;
1739 break;
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001740 default:
Dustin Browne2206fb2017-04-20 13:39:25 -07001741 WMA_LOGD(FL("No Event Id for WOW reason %s(%d)"),
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001742 wma_wow_wake_reason_str(reason), reason);
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001743 event_id = 0;
1744 break;
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001745 }
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001746 wlan_roam_debug_log(WMA_INVALID_VDEV_ID, DEBUG_WOW_REASON,
1747 DEBUG_INVALID_PEER_ID, NULL, NULL,
1748 reason, event_id);
1749
1750 return event_id;
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001751}
1752
1753/**
Dustin Brown3c89c012017-05-01 12:17:32 -07001754 * is_piggybacked_event() - Returns true if the given wake reason indicates
1755 * there will be piggybacked TLV event data
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001756 * @reason: WOW reason
1757 *
Dustin Brown3c89c012017-05-01 12:17:32 -07001758 * There are three types of WoW event payloads: none, piggybacked event, and
1759 * network packet. This function returns true for wake reasons that fall into
1760 * the piggybacked event case.
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001761 *
Dustin Brown3c89c012017-05-01 12:17:32 -07001762 * Return: true for piggybacked event data
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001763 */
Dustin Browne2206fb2017-04-20 13:39:25 -07001764static bool is_piggybacked_event(int32_t reason)
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001765{
1766 switch (reason) {
Dustin Browne2206fb2017-04-20 13:39:25 -07001767 case WOW_REASON_AP_ASSOC_LOST:
Krishna Kumaar Natarajane1a59832016-09-07 12:19:24 -07001768 case WOW_REASON_NLO_SCAN_COMPLETE:
1769 case WOW_REASON_CSA_EVENT:
1770 case WOW_REASON_LOW_RSSI:
1771 case WOW_REASON_CLIENT_KICKOUT_EVENT:
1772 case WOW_REASON_EXTSCAN:
1773 case WOW_REASON_RSSI_BREACH_EVENT:
1774 case WOW_REASON_NAN_EVENT:
1775 case WOW_REASON_NAN_DATA:
Dustin Browne2206fb2017-04-20 13:39:25 -07001776 case WOW_REASON_TDLS_CONN_TRACKER_EVENT:
Deepak Dhamdhere6d2c97a2017-02-04 22:09:27 -08001777 case WOW_REASON_ROAM_HO:
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001778 return true;
Krishna Kumaar Natarajane1a59832016-09-07 12:19:24 -07001779 default:
1780 return false;
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001781 }
1782}
1783
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001784/**
Himanshu Agarwal82de9042016-07-20 18:11:03 +05301785 * wma_pkt_proto_subtype_to_string() - to convert proto subtype
1786 * of data packet to string.
1787 * @proto_subtype: proto subtype for data packet
1788 *
1789 * This function returns the string for the proto subtype of
1790 * data packet.
1791 *
1792 * Return: string for proto subtype for data packet
1793 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07001794static const char *
Himanshu Agarwal82de9042016-07-20 18:11:03 +05301795wma_pkt_proto_subtype_to_string(enum qdf_proto_subtype proto_subtype)
1796{
1797 switch (proto_subtype) {
1798 case QDF_PROTO_EAPOL_M1:
1799 return "EAPOL M1";
1800 case QDF_PROTO_EAPOL_M2:
1801 return "EAPOL M2";
1802 case QDF_PROTO_EAPOL_M3:
1803 return "EAPOL M3";
1804 case QDF_PROTO_EAPOL_M4:
1805 return "EAPOL M4";
1806 case QDF_PROTO_DHCP_DISCOVER:
1807 return "DHCP DISCOVER";
1808 case QDF_PROTO_DHCP_REQUEST:
1809 return "DHCP REQUEST";
1810 case QDF_PROTO_DHCP_OFFER:
1811 return "DHCP OFFER";
1812 case QDF_PROTO_DHCP_ACK:
1813 return "DHCP ACK";
1814 case QDF_PROTO_DHCP_NACK:
1815 return "DHCP NACK";
1816 case QDF_PROTO_DHCP_RELEASE:
1817 return "DHCP RELEASE";
1818 case QDF_PROTO_DHCP_INFORM:
1819 return "DHCP INFORM";
1820 case QDF_PROTO_DHCP_DECLINE:
1821 return "DHCP DECLINE";
1822 case QDF_PROTO_ARP_REQ:
1823 return "ARP REQUEST";
1824 case QDF_PROTO_ARP_RES:
1825 return "ARP RESPONSE";
1826 case QDF_PROTO_ICMP_REQ:
1827 return "ICMP REQUEST";
1828 case QDF_PROTO_ICMP_RES:
1829 return "ICMP RESPONSE";
1830 case QDF_PROTO_ICMPV6_REQ:
1831 return "ICMPV6 REQUEST";
1832 case QDF_PROTO_ICMPV6_RES:
1833 return "ICMPV6 RESPONSE";
Himanshu Agarwal471eaef2017-01-31 13:16:52 +05301834 case QDF_PROTO_ICMPV6_RS:
1835 return "ICMPV6 RS";
1836 case QDF_PROTO_ICMPV6_RA:
1837 return "ICMPV6 RA";
1838 case QDF_PROTO_ICMPV6_NS:
1839 return "ICMPV6 NS";
1840 case QDF_PROTO_ICMPV6_NA:
1841 return "ICMPV6 NA";
Himanshu Agarwal82de9042016-07-20 18:11:03 +05301842 case QDF_PROTO_IPV4_UDP:
1843 return "IPV4 UDP Packet";
1844 case QDF_PROTO_IPV4_TCP:
1845 return "IPV4 TCP Packet";
1846 case QDF_PROTO_IPV6_UDP:
1847 return "IPV6 UDP Packet";
1848 case QDF_PROTO_IPV6_TCP:
1849 return "IPV6 TCP Packet";
1850 default:
Dustin Browne2206fb2017-04-20 13:39:25 -07001851 return NULL;
Himanshu Agarwal82de9042016-07-20 18:11:03 +05301852 }
1853}
1854
1855/**
Dustin Brown3c89c012017-05-01 12:17:32 -07001856 * wma_wow_get_pkt_proto_subtype() - get the proto subtype of the packet.
1857 * @data: Pointer to the packet data buffer
1858 * @len: length of the packet data buffer
Himanshu Agarwal82de9042016-07-20 18:11:03 +05301859 *
1860 * Return: proto subtype of the packet.
1861 */
1862static enum qdf_proto_subtype
Dustin Brown3c89c012017-05-01 12:17:32 -07001863wma_wow_get_pkt_proto_subtype(uint8_t *data, uint32_t len)
Himanshu Agarwal82de9042016-07-20 18:11:03 +05301864{
Dustin Browne2206fb2017-04-20 13:39:25 -07001865 uint16_t eth_type;
1866 uint8_t proto_type;
Himanshu Agarwalec51a5a2016-07-20 19:47:26 +05301867
Dustin Browne2206fb2017-04-20 13:39:25 -07001868 if (len < QDF_NBUF_TRAC_ETH_TYPE_OFFSET + 2) {
1869 WMA_LOGE("Malformed ethernet packet: length %u < %d",
1870 len, QDF_NBUF_TRAC_ETH_TYPE_OFFSET + 2);
Himanshu Agarwalec51a5a2016-07-20 19:47:26 +05301871 return QDF_PROTO_INVALID;
Himanshu Agarwal82de9042016-07-20 18:11:03 +05301872 }
1873
Dustin Browne2206fb2017-04-20 13:39:25 -07001874 eth_type = *(uint16_t *)(data + QDF_NBUF_TRAC_ETH_TYPE_OFFSET);
Dustin Brown3c89c012017-05-01 12:17:32 -07001875 eth_type = qdf_cpu_to_be16(eth_type);
Dustin Browne2206fb2017-04-20 13:39:25 -07001876
1877 WMA_LOGD("Ether Type: 0x%04x", eth_type);
1878 switch (eth_type) {
1879 case QDF_NBUF_TRAC_EAPOL_ETH_TYPE:
1880 if (len < WMA_EAPOL_SUBTYPE_GET_MIN_LEN)
1881 return QDF_PROTO_INVALID;
1882
1883 WMA_LOGD("EAPOL Packet");
1884 return qdf_nbuf_data_get_eapol_subtype(data);
1885
1886 case QDF_NBUF_TRAC_ARP_ETH_TYPE:
1887 if (len < WMA_ARP_SUBTYPE_GET_MIN_LEN)
1888 return QDF_PROTO_INVALID;
1889
1890 WMA_LOGD("ARP Packet");
1891 return qdf_nbuf_data_get_arp_subtype(data);
1892
1893 case QDF_NBUF_TRAC_IPV4_ETH_TYPE:
1894 if (len < WMA_IPV4_PROTO_GET_MIN_LEN)
1895 return QDF_PROTO_INVALID;
1896
1897 WMA_LOGD("IPV4 Packet");
1898
1899 proto_type = qdf_nbuf_data_get_ipv4_proto(data);
1900 WMA_LOGD("IPV4_proto_type: %u", proto_type);
1901
1902 switch (proto_type) {
1903 case QDF_NBUF_TRAC_ICMP_TYPE:
1904 if (len < WMA_ICMP_SUBTYPE_GET_MIN_LEN)
1905 return QDF_PROTO_INVALID;
1906
1907 WMA_LOGD("ICMP Packet");
1908 return qdf_nbuf_data_get_icmp_subtype(data);
1909
1910 case QDF_NBUF_TRAC_UDP_TYPE:
1911 if (len < WMA_IS_DHCP_GET_MIN_LEN)
1912 return QDF_PROTO_IPV4_UDP;
1913
1914 if (!qdf_nbuf_data_is_ipv4_dhcp_pkt(data))
1915 return QDF_PROTO_INVALID;
1916
1917 if (len < WMA_DHCP_SUBTYPE_GET_MIN_LEN)
1918 return QDF_PROTO_INVALID;
1919
1920 WMA_LOGD("DHCP Packet");
1921 return qdf_nbuf_data_get_dhcp_subtype(data);
1922
1923 case QDF_NBUF_TRAC_TCP_TYPE:
1924 return QDF_PROTO_IPV4_TCP;
1925
1926 default:
1927 return QDF_PROTO_INVALID;
1928 }
1929
1930 case QDF_NBUF_TRAC_IPV6_ETH_TYPE:
1931 if (len < WMA_IPV6_PROTO_GET_MIN_LEN)
1932 return QDF_PROTO_INVALID;
1933
1934 WMA_LOGD("IPV6 Packet");
1935
1936 proto_type = qdf_nbuf_data_get_ipv6_proto(data);
1937 WMA_LOGD("IPV6_proto_type: %u", proto_type);
1938
1939 switch (proto_type) {
1940 case QDF_NBUF_TRAC_ICMPV6_TYPE:
1941 if (len < WMA_ICMPV6_SUBTYPE_GET_MIN_LEN)
1942 return QDF_PROTO_INVALID;
1943
1944 WMA_LOGD("ICMPV6 Packet");
1945 return qdf_nbuf_data_get_icmpv6_subtype(data);
1946
1947 case QDF_NBUF_TRAC_UDP_TYPE:
1948 return QDF_PROTO_IPV6_UDP;
1949
1950 case QDF_NBUF_TRAC_TCP_TYPE:
1951 return QDF_PROTO_IPV6_TCP;
1952
1953 default:
1954 return QDF_PROTO_INVALID;
1955 }
1956
1957 default:
1958 return QDF_PROTO_INVALID;
1959 }
1960}
1961
Dustin Browne2206fb2017-04-20 13:39:25 -07001962static void wma_log_pkt_eapol(uint8_t *data, uint32_t length)
1963{
1964 uint16_t pkt_len, key_len;
1965
1966 if (length < WMA_EAPOL_INFO_GET_MIN_LEN)
1967 return;
1968
1969 pkt_len = *(uint16_t *)(data + EAPOL_PKT_LEN_OFFSET);
1970 key_len = *(uint16_t *)(data + EAPOL_KEY_LEN_OFFSET);
1971 WMA_LOGD("Pkt_len: %u, Key_len: %u",
Dustin Brown3c89c012017-05-01 12:17:32 -07001972 qdf_cpu_to_be16(pkt_len), qdf_cpu_to_be16(key_len));
Dustin Browne2206fb2017-04-20 13:39:25 -07001973}
1974
1975static void wma_log_pkt_dhcp(uint8_t *data, uint32_t length)
1976{
1977 uint16_t pkt_len;
1978 uint32_t trans_id;
1979
1980 if (length < WMA_DHCP_INFO_GET_MIN_LEN)
1981 return;
1982
1983 pkt_len = *(uint16_t *)(data + DHCP_PKT_LEN_OFFSET);
1984 trans_id = *(uint32_t *)(data + DHCP_TRANSACTION_ID_OFFSET);
1985 WMA_LOGD("Pkt_len: %u, Transaction_id: %u",
Dustin Brown3c89c012017-05-01 12:17:32 -07001986 qdf_cpu_to_be16(pkt_len), qdf_cpu_to_be16(trans_id));
Dustin Browne2206fb2017-04-20 13:39:25 -07001987}
1988
1989static void wma_log_pkt_icmpv4(uint8_t *data, uint32_t length)
1990{
1991 uint16_t pkt_len, seq_num;
1992
1993 if (length < WMA_IPV4_PKT_INFO_GET_MIN_LEN)
1994 return;
1995
1996 pkt_len = *(uint16_t *)(data + IPV4_PKT_LEN_OFFSET);
1997 seq_num = *(uint16_t *)(data + ICMP_SEQ_NUM_OFFSET);
1998 WMA_LOGD("Pkt_len: %u, Seq_num: %u",
Dustin Brown3c89c012017-05-01 12:17:32 -07001999 qdf_cpu_to_be16(pkt_len), qdf_cpu_to_be16(seq_num));
Dustin Browne2206fb2017-04-20 13:39:25 -07002000}
2001
2002static void wma_log_pkt_icmpv6(uint8_t *data, uint32_t length)
2003{
2004 uint16_t pkt_len, seq_num;
2005
2006 if (length < WMA_IPV6_PKT_INFO_GET_MIN_LEN)
2007 return;
2008
2009 pkt_len = *(uint16_t *)(data + IPV6_PKT_LEN_OFFSET);
2010 seq_num = *(uint16_t *)(data + ICMPV6_SEQ_NUM_OFFSET);
2011 WMA_LOGD("Pkt_len: %u, Seq_num: %u",
Dustin Brown3c89c012017-05-01 12:17:32 -07002012 qdf_cpu_to_be16(pkt_len), qdf_cpu_to_be16(seq_num));
Dustin Browne2206fb2017-04-20 13:39:25 -07002013}
2014
2015static void wma_log_pkt_ipv4(uint8_t *data, uint32_t length)
2016{
2017 uint16_t pkt_len, src_port, dst_port;
Sravan Kumar Kairam4402a262017-08-07 10:45:24 +05302018 char *ip_addr;
Dustin Browne2206fb2017-04-20 13:39:25 -07002019
2020 if (length < WMA_IPV4_PKT_INFO_GET_MIN_LEN)
2021 return;
2022
2023 pkt_len = *(uint16_t *)(data + IPV4_PKT_LEN_OFFSET);
Sravan Kumar Kairam4402a262017-08-07 10:45:24 +05302024 ip_addr = (char *)(data + IPV4_SRC_ADDR_OFFSET);
2025 WMA_LOGD("src addr %d:%d:%d:%d", ip_addr[0], ip_addr[1],
2026 ip_addr[2], ip_addr[3]);
2027 ip_addr = (char *)(data + IPV4_DST_ADDR_OFFSET);
2028 WMA_LOGD("dst addr %d:%d:%d:%d", ip_addr[0], ip_addr[1],
2029 ip_addr[2], ip_addr[3]);
Dustin Browne2206fb2017-04-20 13:39:25 -07002030 src_port = *(uint16_t *)(data + IPV4_SRC_PORT_OFFSET);
2031 dst_port = *(uint16_t *)(data + IPV4_DST_PORT_OFFSET);
Srinivas Girigowdae1be8772018-05-07 16:16:27 -07002032 WMA_LOGI("Pkt_len: %u, src_port: %u, dst_port: %u",
Dustin Brown3c89c012017-05-01 12:17:32 -07002033 qdf_cpu_to_be16(pkt_len),
2034 qdf_cpu_to_be16(src_port),
2035 qdf_cpu_to_be16(dst_port));
Dustin Browne2206fb2017-04-20 13:39:25 -07002036}
2037
2038static void wma_log_pkt_ipv6(uint8_t *data, uint32_t length)
2039{
2040 uint16_t pkt_len, src_port, dst_port;
Sravan Kumar Kairam4402a262017-08-07 10:45:24 +05302041 char *ip_addr;
Dustin Browne2206fb2017-04-20 13:39:25 -07002042
2043 if (length < WMA_IPV6_PKT_INFO_GET_MIN_LEN)
2044 return;
2045
2046 pkt_len = *(uint16_t *)(data + IPV6_PKT_LEN_OFFSET);
Sravan Kumar Kairam4402a262017-08-07 10:45:24 +05302047 ip_addr = (char *)(data + IPV6_SRC_ADDR_OFFSET);
2048 WMA_LOGD("src addr "IPV6_ADDR_STR, ip_addr[0],
2049 ip_addr[1], ip_addr[2], ip_addr[3], ip_addr[4],
2050 ip_addr[5], ip_addr[6], ip_addr[7], ip_addr[8],
2051 ip_addr[9], ip_addr[10], ip_addr[11],
2052 ip_addr[12], ip_addr[13], ip_addr[14],
2053 ip_addr[15]);
2054 ip_addr = (char *)(data + IPV6_DST_ADDR_OFFSET);
2055 WMA_LOGD("dst addr "IPV6_ADDR_STR, ip_addr[0],
2056 ip_addr[1], ip_addr[2], ip_addr[3], ip_addr[4],
2057 ip_addr[5], ip_addr[6], ip_addr[7], ip_addr[8],
2058 ip_addr[9], ip_addr[10], ip_addr[11],
2059 ip_addr[12], ip_addr[13], ip_addr[14],
2060 ip_addr[15]);
Dustin Browne2206fb2017-04-20 13:39:25 -07002061 src_port = *(uint16_t *)(data + IPV6_SRC_PORT_OFFSET);
2062 dst_port = *(uint16_t *)(data + IPV6_DST_PORT_OFFSET);
Srinivas Girigowdae1be8772018-05-07 16:16:27 -07002063 WMA_LOGI("Pkt_len: %u, src_port: %u, dst_port: %u",
Dustin Brown3c89c012017-05-01 12:17:32 -07002064 qdf_cpu_to_be16(pkt_len),
2065 qdf_cpu_to_be16(src_port),
2066 qdf_cpu_to_be16(dst_port));
Dustin Browne2206fb2017-04-20 13:39:25 -07002067}
2068
2069static void wma_log_pkt_tcpv4(uint8_t *data, uint32_t length)
2070{
2071 uint32_t seq_num;
2072
2073 if (length < WMA_IPV4_PKT_INFO_GET_MIN_LEN)
2074 return;
2075
2076 seq_num = *(uint32_t *)(data + IPV4_TCP_SEQ_NUM_OFFSET);
Dustin Brown3c89c012017-05-01 12:17:32 -07002077 WMA_LOGD("TCP_seq_num: %u", qdf_cpu_to_be16(seq_num));
Dustin Browne2206fb2017-04-20 13:39:25 -07002078}
2079
2080static void wma_log_pkt_tcpv6(uint8_t *data, uint32_t length)
2081{
2082 uint32_t seq_num;
2083
2084 if (length < WMA_IPV6_PKT_INFO_GET_MIN_LEN)
2085 return;
2086
2087 seq_num = *(uint32_t *)(data + IPV6_TCP_SEQ_NUM_OFFSET);
Dustin Brown3c89c012017-05-01 12:17:32 -07002088 WMA_LOGD("TCP_seq_num: %u", qdf_cpu_to_be16(seq_num));
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302089}
2090
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002091static void wma_wow_inc_wake_lock_stats_by_dst_addr(t_wma_handle *wma,
2092 uint8_t vdev_id,
2093 uint8_t *dest_mac)
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302094{
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002095 ucfg_mc_cp_stats_inc_wake_lock_stats_by_dst_addr(wma->psoc,
2096 vdev_id,
2097 dest_mac);
2098}
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302099
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002100static void wma_wow_inc_wake_lock_stats_by_protocol(t_wma_handle *wma,
2101 uint8_t vdev_id, enum qdf_proto_subtype proto_subtype)
2102{
2103 ucfg_mc_cp_stats_inc_wake_lock_stats_by_protocol(wma->psoc,
2104 vdev_id,
2105 proto_subtype);
2106}
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002107
2108/**
2109 * wma_wow_parse_data_pkt() - API to parse data buffer for data
2110 * packet that resulted in WOW wakeup.
2111 * @stats: per-vdev stats for tracking packet types
2112 * @data: Pointer to data buffer
2113 * @length: data buffer length
2114 *
2115 * This function parses the data buffer received (first few bytes of
2116 * skb->data) to get information like src mac addr, dst mac addr, packet
2117 * len, seq_num, etc. It also increments stats for different packet types.
2118 *
2119 * Return: void
2120 */
2121static void wma_wow_parse_data_pkt(t_wma_handle *wma,
2122 uint8_t vdev_id, uint8_t *data,
2123 uint32_t length)
2124{
2125 uint8_t *src_mac;
2126 uint8_t *dest_mac;
2127 const char *proto_subtype_name;
2128 enum qdf_proto_subtype proto_subtype;
2129
2130 WMA_LOGD("packet length: %u", length);
2131 if (length < QDF_NBUF_TRAC_IPV4_OFFSET)
2132 return;
2133
2134 src_mac = data + QDF_NBUF_SRC_MAC_OFFSET;
2135 dest_mac = data + QDF_NBUF_DEST_MAC_OFFSET;
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -07002136 wma_info("Src_mac: " QDF_MAC_ADDR_STR ", Dst_mac: " QDF_MAC_ADDR_STR,
Srinivas Girigowda34fbba02019-04-08 12:07:44 -07002137 QDF_MAC_ADDR_ARRAY(src_mac), QDF_MAC_ADDR_ARRAY(dest_mac));
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002138
2139 wma_wow_inc_wake_lock_stats_by_dst_addr(wma, vdev_id, dest_mac);
Dustin Browne2206fb2017-04-20 13:39:25 -07002140
2141 proto_subtype = wma_wow_get_pkt_proto_subtype(data, length);
2142 proto_subtype_name = wma_pkt_proto_subtype_to_string(proto_subtype);
2143 if (proto_subtype_name)
Srinivas Girigowdae1be8772018-05-07 16:16:27 -07002144 WMA_LOGI("WOW Wakeup: %s rcvd", proto_subtype_name);
Dustin Browne2206fb2017-04-20 13:39:25 -07002145
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302146 switch (proto_subtype) {
2147 case QDF_PROTO_EAPOL_M1:
2148 case QDF_PROTO_EAPOL_M2:
2149 case QDF_PROTO_EAPOL_M3:
2150 case QDF_PROTO_EAPOL_M4:
Dustin Browne2206fb2017-04-20 13:39:25 -07002151 wma_log_pkt_eapol(data, length);
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302152 break;
2153
2154 case QDF_PROTO_DHCP_DISCOVER:
2155 case QDF_PROTO_DHCP_REQUEST:
2156 case QDF_PROTO_DHCP_OFFER:
2157 case QDF_PROTO_DHCP_ACK:
2158 case QDF_PROTO_DHCP_NACK:
2159 case QDF_PROTO_DHCP_RELEASE:
2160 case QDF_PROTO_DHCP_INFORM:
2161 case QDF_PROTO_DHCP_DECLINE:
Dustin Browne2206fb2017-04-20 13:39:25 -07002162 wma_log_pkt_dhcp(data, length);
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302163 break;
2164
2165 case QDF_PROTO_ICMP_REQ:
2166 case QDF_PROTO_ICMP_RES:
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002167 wma_wow_inc_wake_lock_stats_by_protocol(wma, vdev_id,
2168 proto_subtype);
Dustin Browne2206fb2017-04-20 13:39:25 -07002169 wma_log_pkt_icmpv4(data, length);
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302170 break;
2171
2172 case QDF_PROTO_ICMPV6_REQ:
2173 case QDF_PROTO_ICMPV6_RES:
Himanshu Agarwal471eaef2017-01-31 13:16:52 +05302174 case QDF_PROTO_ICMPV6_RS:
2175 case QDF_PROTO_ICMPV6_RA:
2176 case QDF_PROTO_ICMPV6_NS:
2177 case QDF_PROTO_ICMPV6_NA:
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002178 wma_wow_inc_wake_lock_stats_by_protocol(wma, vdev_id,
2179 proto_subtype);
Dustin Browne2206fb2017-04-20 13:39:25 -07002180 wma_log_pkt_icmpv6(data, length);
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302181 break;
2182
2183 case QDF_PROTO_IPV4_UDP:
Dustin Browne2206fb2017-04-20 13:39:25 -07002184 wma_log_pkt_ipv4(data, length);
2185 break;
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302186 case QDF_PROTO_IPV4_TCP:
Dustin Browne2206fb2017-04-20 13:39:25 -07002187 wma_log_pkt_ipv4(data, length);
2188 wma_log_pkt_tcpv4(data, length);
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302189 break;
2190
2191 case QDF_PROTO_IPV6_UDP:
Dustin Browne2206fb2017-04-20 13:39:25 -07002192 wma_log_pkt_ipv6(data, length);
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302193 break;
Dustin Browne2206fb2017-04-20 13:39:25 -07002194 case QDF_PROTO_IPV6_TCP:
2195 wma_log_pkt_ipv6(data, length);
2196 wma_log_pkt_tcpv6(data, length);
2197 break;
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302198 default:
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302199 break;
2200 }
2201}
2202
2203/**
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302204 * wma_wow_dump_mgmt_buffer() - API to parse data buffer for mgmt.
2205 * packet that resulted in WOW wakeup.
2206 * @wow_packet_buffer: Pointer to data buffer
2207 * @buf_len: length of data buffer
2208 *
2209 * This function parses the data buffer received (802.11 header)
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002210 * to get information like src mac addr, dst mac addr, seq_num,
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302211 * frag_num, etc.
2212 *
2213 * Return: void
2214 */
2215static void wma_wow_dump_mgmt_buffer(uint8_t *wow_packet_buffer,
Dustin Browne2206fb2017-04-20 13:39:25 -07002216 uint32_t buf_len)
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302217{
2218 struct ieee80211_frame_addr4 *wh;
2219
Himanshu Agarwalf9515002016-07-20 19:09:10 +05302220 WMA_LOGD("wow_buf_pkt_len: %u", buf_len);
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302221 wh = (struct ieee80211_frame_addr4 *)
Dustin Brownecb7eb92017-04-06 17:00:11 -07002222 (wow_packet_buffer);
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302223 if (buf_len >= sizeof(struct ieee80211_frame)) {
2224 uint8_t to_from_ds, frag_num;
2225 uint32_t seq_num;
2226
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -07002227 wma_err("RA: " QDF_MAC_ADDR_STR " TA: " QDF_MAC_ADDR_STR,
Srinivas Girigowda34fbba02019-04-08 12:07:44 -07002228 QDF_MAC_ADDR_ARRAY(wh->i_addr1),
2229 QDF_MAC_ADDR_ARRAY(wh->i_addr2));
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302230
Himanshu Agarwalf9515002016-07-20 19:09:10 +05302231 WMA_LOGE("TO_DS: %u, FROM_DS: %u",
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302232 wh->i_fc[1] & IEEE80211_FC1_DIR_TODS,
2233 wh->i_fc[1] & IEEE80211_FC1_DIR_FROMDS);
2234
Jeff Johnsone866cac2018-12-10 17:57:04 -08002235 to_from_ds = wh->i_fc[1] & IEEE80211_FC1_DIR_MASK;
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302236
2237 switch (to_from_ds) {
Jeff Johnsone866cac2018-12-10 17:57:04 -08002238 case IEEE80211_FC1_DIR_NODS:
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -07002239 wma_err("BSSID: " QDF_MAC_ADDR_STR,
Srinivas Girigowda34fbba02019-04-08 12:07:44 -07002240 QDF_MAC_ADDR_ARRAY(wh->i_addr3));
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302241 break;
Jeff Johnsone866cac2018-12-10 17:57:04 -08002242 case IEEE80211_FC1_DIR_TODS:
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -07002243 wma_err("DA: " QDF_MAC_ADDR_STR,
Srinivas Girigowda34fbba02019-04-08 12:07:44 -07002244 QDF_MAC_ADDR_ARRAY(wh->i_addr3));
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302245 break;
Jeff Johnsone866cac2018-12-10 17:57:04 -08002246 case IEEE80211_FC1_DIR_FROMDS:
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -07002247 wma_err("SA: " QDF_MAC_ADDR_STR,
Srinivas Girigowda34fbba02019-04-08 12:07:44 -07002248 QDF_MAC_ADDR_ARRAY(wh->i_addr3));
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302249 break;
Jeff Johnsone866cac2018-12-10 17:57:04 -08002250 case IEEE80211_FC1_DIR_DSTODS:
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302251 if (buf_len >= sizeof(struct ieee80211_frame_addr4))
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -07002252 wma_err("DA: " QDF_MAC_ADDR_STR " SA: "
2253 QDF_MAC_ADDR_STR,
Srinivas Girigowda34fbba02019-04-08 12:07:44 -07002254 QDF_MAC_ADDR_ARRAY(wh->i_addr3),
2255 QDF_MAC_ADDR_ARRAY(wh->i_addr4));
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302256 break;
2257 }
2258
2259 seq_num = (((*(uint16_t *)wh->i_seq) &
2260 IEEE80211_SEQ_SEQ_MASK) >>
2261 IEEE80211_SEQ_SEQ_SHIFT);
2262 frag_num = (((*(uint16_t *)wh->i_seq) &
2263 IEEE80211_SEQ_FRAG_MASK) >>
2264 IEEE80211_SEQ_FRAG_SHIFT);
2265
Himanshu Agarwalf9515002016-07-20 19:09:10 +05302266 WMA_LOGE("SEQ_NUM: %u, FRAG_NUM: %u",
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302267 seq_num, frag_num);
2268 } else {
2269 WMA_LOGE("Insufficient buffer length for mgmt. packet");
2270 }
2271}
2272
2273/**
Dustin Browne2206fb2017-04-20 13:39:25 -07002274 * wma_acquire_wakelock() - conditionally aquires a wakelock base on wake reason
2275 * @wma: the wma handle with the wakelocks to aquire
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302276 * @wake_reason: wow wakeup reason
2277 *
Dustin Browne2206fb2017-04-20 13:39:25 -07002278 * Return: None
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302279 */
Dustin Browne2206fb2017-04-20 13:39:25 -07002280static void wma_acquire_wow_wakelock(t_wma_handle *wma, int wake_reason)
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302281{
Dustin Browne2206fb2017-04-20 13:39:25 -07002282 qdf_wake_lock_t *wl;
2283 uint32_t ms;
2284
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302285 switch (wake_reason) {
2286 case WOW_REASON_AUTH_REQ_RECV:
Mukul Sharmae44d0542017-05-23 21:50:56 +05302287 wl = &wma->wow_auth_req_wl;
Dustin Browne2206fb2017-04-20 13:39:25 -07002288 ms = WMA_AUTH_REQ_RECV_WAKE_LOCK_TIMEOUT;
2289 break;
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302290 case WOW_REASON_ASSOC_REQ_RECV:
Mukul Sharmae44d0542017-05-23 21:50:56 +05302291 wl = &wma->wow_assoc_req_wl;
Dustin Browne2206fb2017-04-20 13:39:25 -07002292 ms = WMA_ASSOC_REQ_RECV_WAKE_LOCK_DURATION;
2293 break;
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302294 case WOW_REASON_DEAUTH_RECVD:
Mukul Sharmae44d0542017-05-23 21:50:56 +05302295 wl = &wma->wow_deauth_rec_wl;
Dustin Browne2206fb2017-04-20 13:39:25 -07002296 ms = WMA_DEAUTH_RECV_WAKE_LOCK_DURATION;
2297 break;
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302298 case WOW_REASON_DISASSOC_RECVD:
Mukul Sharmae44d0542017-05-23 21:50:56 +05302299 wl = &wma->wow_disassoc_rec_wl;
Dustin Browne2206fb2017-04-20 13:39:25 -07002300 ms = WMA_DISASSOC_RECV_WAKE_LOCK_DURATION;
2301 break;
yeshwanth sriram guntuka37c09822017-01-24 18:30:15 +05302302 case WOW_REASON_AP_ASSOC_LOST:
Mukul Sharmae44d0542017-05-23 21:50:56 +05302303 wl = &wma->wow_ap_assoc_lost_wl;
Dustin Browne2206fb2017-04-20 13:39:25 -07002304 ms = WMA_BMISS_EVENT_WAKE_LOCK_DURATION;
2305 break;
yeshwanth sriram guntuka37c09822017-01-24 18:30:15 +05302306#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
2307 case WOW_REASON_HOST_AUTO_SHUTDOWN:
Mukul Sharmae44d0542017-05-23 21:50:56 +05302308 wl = &wma->wow_auto_shutdown_wl;
Dustin Browne2206fb2017-04-20 13:39:25 -07002309 ms = WMA_AUTO_SHUTDOWN_WAKE_LOCK_DURATION;
2310 break;
yeshwanth sriram guntuka37c09822017-01-24 18:30:15 +05302311#endif
2312 case WOW_REASON_ROAM_HO:
Mukul Sharmae44d0542017-05-23 21:50:56 +05302313 wl = &wma->roam_ho_wl;
Dustin Browne2206fb2017-04-20 13:39:25 -07002314 ms = WMA_ROAM_HO_WAKE_LOCK_DURATION;
2315 break;
Pragaspathi Thilagaraj0c4489f2019-08-05 20:50:23 +05302316 case WOW_REASON_ROAM_PREAUTH_START:
2317 wl = &wma->roam_preauth_wl;
2318 ms = WMA_ROAM_PREAUTH_WAKE_LOCK_DURATION;
Dustin Browne2206fb2017-04-20 13:39:25 -07002319 default:
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +05302320 return;
2321 }
2322
Dustin Browne2206fb2017-04-20 13:39:25 -07002323 WMA_LOGA("Holding %d msec wake_lock", ms);
2324 cds_host_diag_log_work(wl, ms, WIFI_POWER_EVENT_WAKELOCK_WOW);
2325 qdf_wake_lock_timeout_acquire(wl, ms);
2326}
2327
2328/**
2329 * wma_wake_reason_ap_assoc_lost() - WOW_REASON_AP_ASSOC_LOST handler
2330 * @wma: Pointer to wma handle
2331 * @event: pointer to piggybacked WMI_ROAM_EVENTID_param_tlvs buffer
2332 * @len: length of the event buffer
2333 *
2334 * Return: Errno
2335 */
2336static int
2337wma_wake_reason_ap_assoc_lost(t_wma_handle *wma, void *event, uint32_t len)
2338{
2339 WMI_ROAM_EVENTID_param_tlvs *event_param;
2340 wmi_roam_event_fixed_param *roam_event;
2341
2342 event_param = event;
2343 if (!event_param) {
2344 WMA_LOGE("AP Assoc Lost event data is null");
2345 return -EINVAL;
2346 }
2347
2348 roam_event = event_param->fixed_param;
2349 WMA_LOGA(FL("Beacon miss indication on vdev %d"), roam_event->vdev_id);
2350
2351 wma_beacon_miss_handler(wma, roam_event->vdev_id, roam_event->rssi);
2352
2353 return 0;
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +05302354}
2355
Dustin Brown9d797d62017-01-11 16:39:12 -08002356static const char *wma_vdev_type_str(uint32_t vdev_type)
2357{
2358 switch (vdev_type) {
2359 case WMI_VDEV_TYPE_AP:
2360 return "AP";
2361 case WMI_VDEV_TYPE_STA:
2362 return "STA";
2363 case WMI_VDEV_TYPE_IBSS:
2364 return "IBSS";
2365 case WMI_VDEV_TYPE_MONITOR:
2366 return "MONITOR";
2367 case WMI_VDEV_TYPE_NAN:
2368 return "NAN";
2369 case WMI_VDEV_TYPE_OCB:
2370 return "OCB";
2371 case WMI_VDEV_TYPE_NDI:
2372 return "NDI";
2373 default:
2374 return "unknown";
2375 }
2376}
2377
Dustin Browne2206fb2017-04-20 13:39:25 -07002378static int wma_wake_event_packet(
2379 t_wma_handle *wma,
2380 WMI_WOW_WAKEUP_HOST_EVENTID_param_tlvs *event_param,
2381 uint32_t length)
2382{
2383 WOW_EVENT_INFO_fixed_param *wake_info;
2384 struct wma_txrx_node *vdev;
2385 uint8_t *packet;
2386 uint32_t packet_len;
2387
Abhinav Kumarb0f99562018-01-24 16:15:30 +05302388 if (event_param->num_wow_packet_buffer <= 4) {
2389 WMA_LOGE("Invalid wow packet buffer from firmware %u",
2390 event_param->num_wow_packet_buffer);
2391 return -EINVAL;
2392 }
Dustin Browne2206fb2017-04-20 13:39:25 -07002393 /* first 4 bytes are the length, followed by the buffer */
2394 packet_len = *(uint32_t *)event_param->wow_packet_buffer;
2395 packet = event_param->wow_packet_buffer + 4;
2396
2397 if (!packet_len) {
2398 WMA_LOGE("Wake event packet is empty");
2399 return 0;
2400 }
2401
Himanshu Agarwale6b49122017-10-13 17:50:11 +05302402 if (packet_len > (event_param->num_wow_packet_buffer - 4)) {
2403 WMA_LOGE("Invalid packet_len from firmware, packet_len: %u, num_wow_packet_buffer: %u",
2404 packet_len,
2405 event_param->num_wow_packet_buffer);
2406 return -EINVAL;
2407 }
2408
Dustin Browne2206fb2017-04-20 13:39:25 -07002409 wake_info = event_param->fixed_param;
2410
2411 switch (wake_info->wake_reason) {
2412 case WOW_REASON_AUTH_REQ_RECV:
2413 case WOW_REASON_ASSOC_REQ_RECV:
2414 case WOW_REASON_DEAUTH_RECVD:
2415 case WOW_REASON_DISASSOC_RECVD:
2416 case WOW_REASON_ASSOC_RES_RECV:
2417 case WOW_REASON_REASSOC_REQ_RECV:
2418 case WOW_REASON_REASSOC_RES_RECV:
2419 case WOW_REASON_BEACON_RECV:
2420 case WOW_REASON_ACTION_FRAME_RECV:
2421 /* management frame case */
2422 wma_wow_dump_mgmt_buffer(packet, packet_len);
2423 break;
2424
2425 case WOW_REASON_BPF_ALLOW:
2426 case WOW_REASON_PATTERN_MATCH_FOUND:
2427 case WOW_REASON_RA_MATCH:
2428 case WOW_REASON_RECV_MAGIC_PATTERN:
Will Huang3f7cb652018-11-28 10:41:24 +08002429 case WOW_REASON_PACKET_FILTER_MATCH:
Dustin Browne2206fb2017-04-20 13:39:25 -07002430 WMA_LOGD("Wake event packet:");
2431 qdf_trace_hex_dump(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG,
2432 packet, packet_len);
2433
2434 vdev = &wma->interfaces[wake_info->vdev_id];
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002435 wma_wow_parse_data_pkt(wma, wake_info->vdev_id,
2436 packet, packet_len);
Dustin Browne2206fb2017-04-20 13:39:25 -07002437 break;
2438
2439 default:
2440 WMA_LOGE("Wake reason %s(%u) is not a packet event",
2441 wma_wow_wake_reason_str(wake_info->wake_reason),
2442 wake_info->wake_reason);
2443 return -EINVAL;
2444 }
2445
2446 return 0;
2447}
2448
2449static int wma_wake_event_no_payload(
2450 t_wma_handle *wma,
2451 WMI_WOW_WAKEUP_HOST_EVENTID_param_tlvs *event_param,
2452 uint32_t length)
2453{
2454 WOW_EVENT_INFO_fixed_param *wake_info = event_param->fixed_param;
2455
2456 switch (wake_info->wake_reason) {
2457 case WOW_REASON_HOST_AUTO_SHUTDOWN:
2458 return wma_wake_reason_auto_shutdown();
2459
2460 case WOW_REASON_NLOD:
2461 return wma_wake_reason_nlod(wma, wake_info->vdev_id);
Dustin Browne2206fb2017-04-20 13:39:25 -07002462
Dustin Brown3c89c012017-05-01 12:17:32 -07002463 default:
2464 return 0;
2465 }
Dustin Browne2206fb2017-04-20 13:39:25 -07002466}
2467
2468static int wma_wake_event_piggybacked(
2469 t_wma_handle *wma,
2470 WMI_WOW_WAKEUP_HOST_EVENTID_param_tlvs *event_param,
2471 uint32_t length)
2472{
Deepak Dhamdhere6d2c97a2017-02-04 22:09:27 -08002473 int errno = 0;
Dustin Browne2206fb2017-04-20 13:39:25 -07002474 void *pb_event;
2475 uint32_t pb_event_len;
2476 uint32_t wake_reason;
2477 uint32_t event_id;
Naveen Rawata600b2e2018-03-29 13:41:18 -07002478 uint8_t *bssid;
Naveen Rawata600b2e2018-03-29 13:41:18 -07002479 void *peer, *pdev;
2480 tpDeleteStaContext del_sta_ctx;
2481 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Dustin Browne2206fb2017-04-20 13:39:25 -07002482
2483 /*
2484 * There are "normal" cases where a wake reason that usually contains a
2485 * piggybacked event is empty. In these cases we just want to wake up,
2486 * and no action is needed. Bail out now if that is the case.
2487 */
Abhinav Kumarb0f99562018-01-24 16:15:30 +05302488 if (!event_param->wow_packet_buffer ||
2489 event_param->num_wow_packet_buffer <= 4) {
2490 WMA_LOGE("Invalid wow packet buffer from firmware %u",
2491 event_param->num_wow_packet_buffer);
Dustin Browne2206fb2017-04-20 13:39:25 -07002492 return 0;
Abhinav Kumarb0f99562018-01-24 16:15:30 +05302493 }
Dustin Browne2206fb2017-04-20 13:39:25 -07002494
Naveen Rawata600b2e2018-03-29 13:41:18 -07002495 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Sourav Mohapatra5778c1d2019-09-24 11:11:06 +05302496 if (!pdev) {
2497 WMA_LOGE("Invalid pdev");
2498 return -EINVAL;
2499 }
2500
Abhishek Ambure3ee80882019-09-20 16:32:12 +05302501 bssid = wma_get_vdev_bssid
2502 (wma->interfaces[event_param->fixed_param->vdev_id].vdev);
2503 if (!bssid) {
2504 WMA_LOGE("%s: Failed to get bssid for vdev_%d",
2505 __func__, event_param->fixed_param->vdev_id);
2506 return 0;
2507 }
gaurank kathpalia8197e352019-09-11 16:09:53 +05302508 peer = cdp_peer_find_by_addr(soc, pdev, bssid);
Dustin Browne2206fb2017-04-20 13:39:25 -07002509 wake_reason = event_param->fixed_param->wake_reason;
2510
2511 /* parse piggybacked event from param buffer */
2512 {
2513 int ret_code;
2514 uint8_t *pb_event_buf;
2515 uint32_t tag;
2516
2517 /* first 4 bytes are the length, followed by the buffer */
2518 pb_event_len = *(uint32_t *)event_param->wow_packet_buffer;
Himanshu Agarwale6b49122017-10-13 17:50:11 +05302519 if (pb_event_len > (event_param->num_wow_packet_buffer - 4)) {
2520 WMA_LOGE("Invalid pb_event_len from firmware, pb_event_len: %u, num_wow_packet_buffer: %u",
2521 pb_event_len,
2522 event_param->num_wow_packet_buffer);
2523 return -EINVAL;
2524 }
Dustin Browne2206fb2017-04-20 13:39:25 -07002525 pb_event_buf = event_param->wow_packet_buffer + 4;
2526
2527 WMA_LOGD("piggybacked event buffer:");
2528 qdf_trace_hex_dump(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG,
2529 pb_event_buf, pb_event_len);
2530
2531 tag = WMITLV_GET_TLVTAG(WMITLV_GET_HDR(pb_event_buf));
2532 event_id = wow_get_wmi_eventid(wake_reason, tag);
2533 if (!event_id) {
2534 WMA_LOGE(FL("Unable to find Event Id"));
2535 return -EINVAL;
2536 }
2537
2538 ret_code = wmitlv_check_and_pad_event_tlvs(wma, pb_event_buf,
2539 pb_event_len,
2540 event_id, &pb_event);
2541 if (ret_code) {
2542 WMA_LOGE(FL("Bad TLVs; len:%d, event_id:%d, status:%d"),
2543 pb_event_len, event_id, ret_code);
2544 return -EINVAL;
2545 }
2546 }
2547
2548 switch (wake_reason) {
2549 case WOW_REASON_AP_ASSOC_LOST:
2550 errno = wma_wake_reason_ap_assoc_lost(wma, pb_event,
2551 pb_event_len);
2552 break;
2553
2554#ifdef FEATURE_WLAN_SCAN_PNO
2555 case WOW_REASON_NLO_SCAN_COMPLETE:
2556 errno = target_if_nlo_complete_handler(wma, pb_event,
2557 pb_event_len);
2558 break;
2559#endif /* FEATURE_WLAN_SCAN_PNO */
2560
2561 case WOW_REASON_CSA_EVENT:
2562 errno = wma_csa_offload_handler(wma, pb_event, pb_event_len);
2563 break;
2564
Deepak Dhamdhere6d2c97a2017-02-04 22:09:27 -08002565 /*
2566 * WOW_REASON_LOW_RSSI is used for following roaming events -
2567 * WMI_ROAM_REASON_BETTER_AP, WMI_ROAM_REASON_BMISS,
2568 * WMI_ROAM_REASON_SUITABLE_AP will be handled by
2569 * wma_roam_event_callback().
2570 * WOW_REASON_ROAM_HO is associated with
2571 * WMI_ROAM_REASON_HO_FAILED event and it will be handled by
2572 * wma_roam_event_callback().
2573 */
Dustin Browne2206fb2017-04-20 13:39:25 -07002574 case WOW_REASON_LOW_RSSI:
Deepak Dhamdhere6d2c97a2017-02-04 22:09:27 -08002575 case WOW_REASON_ROAM_HO:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07002576 wlan_roam_debug_log(event_param->fixed_param->vdev_id,
2577 DEBUG_WOW_ROAM_EVENT,
2578 DEBUG_INVALID_PEER_ID,
2579 NULL, NULL, wake_reason,
2580 pb_event_len);
Deepak Dhamdhere6d2c97a2017-02-04 22:09:27 -08002581 if (pb_event_len > 0) {
2582 errno = wma_roam_event_callback(wma, pb_event,
2583 pb_event_len);
2584 } else {
2585 /*
2586 * No wow_packet_buffer means a better AP beacon
2587 * will follow in a later event.
2588 */
2589 WMA_LOGD("Host woken up because of better AP beacon");
2590 }
Dustin Browne2206fb2017-04-20 13:39:25 -07002591 break;
2592
2593 case WOW_REASON_CLIENT_KICKOUT_EVENT:
2594 errno = wma_peer_sta_kickout_event_handler(wma, pb_event,
2595 pb_event_len);
2596 break;
2597
2598#ifdef FEATURE_WLAN_EXTSCAN
2599 case WOW_REASON_EXTSCAN:
2600 errno = wma_extscan_wow_event_callback(wma, pb_event,
2601 pb_event_len);
2602 break;
2603#endif
2604
2605 case WOW_REASON_RSSI_BREACH_EVENT:
2606 errno = wma_rssi_breached_event_handler(wma, pb_event,
2607 pb_event_len);
2608 break;
2609
2610 case WOW_REASON_NAN_EVENT:
Nachiket Kukade6003bd22018-11-08 18:30:08 +05302611 errno = wma_nan_rsp_handler_callback(wma, pb_event,
2612 pb_event_len);
Dustin Browne2206fb2017-04-20 13:39:25 -07002613 break;
2614
2615 case WOW_REASON_NAN_DATA:
2616 errno = wma_ndp_wow_event_callback(wma, pb_event, pb_event_len,
2617 event_id);
2618 break;
2619
2620#ifdef FEATURE_WLAN_TDLS
2621 case WOW_REASON_TDLS_CONN_TRACKER_EVENT:
2622 errno = wma_tdls_event_handler(wma, pb_event, pb_event_len);
2623 break;
2624#endif
Naveen Rawatd7734142017-10-27 10:02:40 -07002625
2626 case WOW_REASON_TIMER_INTR_RECV:
2627 /*
2628 * Right now firmware is not returning any cookie host has
2629 * programmed. So do not check for cookie.
2630 */
2631 WMA_LOGE("WOW_REASON_TIMER_INTR_RECV received, indicating key exchange did not finish. Initiate disconnect");
Arif Hussain157263f2018-10-03 13:07:15 -07002632 del_sta_ctx = qdf_mem_malloc(sizeof(*del_sta_ctx));
2633 if (!del_sta_ctx)
Naveen Rawata600b2e2018-03-29 13:41:18 -07002634 break;
Arif Hussain157263f2018-10-03 13:07:15 -07002635
Naveen Rawata600b2e2018-03-29 13:41:18 -07002636 del_sta_ctx->is_tdls = false;
2637 del_sta_ctx->vdev_id = event_param->fixed_param->vdev_id;
Srinivas Girigowdaa47b45f2019-02-27 12:29:02 -08002638 qdf_mem_copy(del_sta_ctx->addr2, bssid, QDF_MAC_ADDR_SIZE);
2639 qdf_mem_copy(del_sta_ctx->bssId, bssid, QDF_MAC_ADDR_SIZE);
Naveen Rawata600b2e2018-03-29 13:41:18 -07002640 del_sta_ctx->reasonCode = HAL_DEL_STA_REASON_CODE_KEEP_ALIVE;
2641 wma_send_msg(wma, SIR_LIM_DELETE_STA_CONTEXT_IND, del_sta_ctx,
2642 0);
Naveen Rawatd7734142017-10-27 10:02:40 -07002643 break;
2644
Dustin Browne2206fb2017-04-20 13:39:25 -07002645 default:
2646 WMA_LOGE("Wake reason %s(%u) is not a piggybacked event",
2647 wma_wow_wake_reason_str(wake_reason), wake_reason);
2648 errno = -EINVAL;
2649 break;
2650 }
2651
2652 wmitlv_free_allocated_event_tlvs(event_id, &pb_event);
2653
2654 return errno;
2655}
2656
Rajeev Kumar4cfc6ee2019-06-07 12:11:12 -07002657static void wma_debug_assert_page_fault_wakeup(uint32_t reason)
2658{
2659 /* During DRV if page fault wake up then assert */
2660 if ((WOW_REASON_PAGE_FAULT == reason) && (qdf_is_drv_connected()))
2661 QDF_DEBUG_PANIC("Unexpected page fault wake up detected during DRV wow");
2662}
2663
Dustin Browne2206fb2017-04-20 13:39:25 -07002664static void wma_wake_event_log_reason(t_wma_handle *wma,
2665 WOW_EVENT_INFO_fixed_param *wake_info)
2666{
Dustin Brown3c89c012017-05-01 12:17:32 -07002667 struct wma_txrx_node *vdev;
Dustin Browne2206fb2017-04-20 13:39:25 -07002668
2669 /* "Unspecified" means APPS triggered wake, else firmware triggered */
2670 if (wake_info->wake_reason != WOW_REASON_UNSPECIFIED) {
Dustin Brown3c89c012017-05-01 12:17:32 -07002671 vdev = &wma->interfaces[wake_info->vdev_id];
Dustin Brown4ea846d2017-06-05 10:56:57 -07002672 WMA_LOGA("WLAN triggered wakeup: %s (%d), vdev: %d (%s)",
Dustin Browne2206fb2017-04-20 13:39:25 -07002673 wma_wow_wake_reason_str(wake_info->wake_reason),
2674 wake_info->wake_reason,
2675 wake_info->vdev_id,
Dustin Brown3c89c012017-05-01 12:17:32 -07002676 wma_vdev_type_str(vdev->type));
Rajeev Kumar4cfc6ee2019-06-07 12:11:12 -07002677 wma_debug_assert_page_fault_wakeup(wake_info->wake_reason);
Dustin Browne2206fb2017-04-20 13:39:25 -07002678 } else if (!wmi_get_runtime_pm_inprogress(wma->wmi_handle)) {
Dustin Brown4ea846d2017-06-05 10:56:57 -07002679 WMA_LOGA("Non-WLAN triggered wakeup: %s (%d)",
Dustin Browne2206fb2017-04-20 13:39:25 -07002680 wma_wow_wake_reason_str(wake_info->wake_reason),
2681 wake_info->wake_reason);
2682 }
2683
2684 qdf_wow_wakeup_host_event(wake_info->wake_reason);
Yeshwanth Sriram Guntukaa10da362017-10-06 12:57:11 +05302685 qdf_wma_wow_wakeup_stats_event(wma);
Dustin Browne2206fb2017-04-20 13:39:25 -07002686}
2687
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +05302688/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002689 * wma_wow_wakeup_host_event() - wakeup host event handler
2690 * @handle: wma handle
2691 * @event: event data
2692 * @len: buffer length
2693 *
2694 * Handler to catch wow wakeup host event. This event will have
2695 * reason why the firmware has woken the host.
2696 *
Dustin Brownecb7eb92017-04-06 17:00:11 -07002697 * Return: Errno
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002698 */
Dustin Brownecb7eb92017-04-06 17:00:11 -07002699int wma_wow_wakeup_host_event(void *handle, uint8_t *event, uint32_t len)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002700{
Dustin Browne2206fb2017-04-20 13:39:25 -07002701 int errno;
2702 t_wma_handle *wma = handle;
2703 WMI_WOW_WAKEUP_HOST_EVENTID_param_tlvs *event_param;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002704 WOW_EVENT_INFO_fixed_param *wake_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002705
Dustin Browne2206fb2017-04-20 13:39:25 -07002706 event_param = (WMI_WOW_WAKEUP_HOST_EVENTID_param_tlvs *)event;
2707 if (!event_param) {
2708 WMA_LOGE("Wake event data is null");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002709 return -EINVAL;
2710 }
2711
Dustin Browne2206fb2017-04-20 13:39:25 -07002712 wake_info = event_param->fixed_param;
Vignesh Viswanathan1f6e08f2018-01-25 17:45:23 +05302713
2714 if (wake_info->vdev_id >= wma->max_bssid) {
2715 WMA_LOGE("%s: received invalid vdev_id %d",
2716 __func__, wake_info->vdev_id);
2717 return -EINVAL;
2718 }
2719
Dustin Browne2206fb2017-04-20 13:39:25 -07002720 wma_wake_event_log_reason(wma, wake_info);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002721
Wu Gaod7dd6e42018-10-16 17:22:56 +08002722 ucfg_pmo_psoc_wakeup_host_event_received(wma->psoc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002723
Dustin Browne2206fb2017-04-20 13:39:25 -07002724 wma_print_wow_stats(wma, wake_info);
Dustin Browne2206fb2017-04-20 13:39:25 -07002725 /* split based on payload type */
2726 if (is_piggybacked_event(wake_info->wake_reason))
2727 errno = wma_wake_event_piggybacked(wma, event_param, len);
2728 else if (event_param->wow_packet_buffer)
2729 errno = wma_wake_event_packet(wma, event_param, len);
Dustin Brown9d797d62017-01-11 16:39:12 -08002730 else
Dustin Browne2206fb2017-04-20 13:39:25 -07002731 errno = wma_wake_event_no_payload(wma, event_param, len);
Dustin Brown9d797d62017-01-11 16:39:12 -08002732
Dustin Browne2206fb2017-04-20 13:39:25 -07002733 wma_inc_wow_stats(wma, wake_info);
2734 wma_print_wow_stats(wma, wake_info);
Dustin Browne2206fb2017-04-20 13:39:25 -07002735 wma_acquire_wow_wakelock(wma, wake_info->wake_reason);
Rajeev Kumar2c892fe2016-08-24 16:17:16 -07002736
Dustin Browne2206fb2017-04-20 13:39:25 -07002737 return errno;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002738}
2739
Will Huang3cd2b7c2017-11-17 13:16:56 +08002740#ifdef FEATURE_WLAN_D0WOW
2741/**
2742 * wma_d0_wow_disable_ack_event() - wakeup host event handler
2743 * @handle: wma handle
2744 * @event: event data
2745 * @len: buffer length
2746 *
2747 * Handler to catch D0-WOW disable ACK event. This event will have
2748 * reason why the firmware has woken the host.
2749 * This is for backward compatible with cld2.0.
2750 *
2751 * Return: 0 for success or error
2752 */
2753int wma_d0_wow_disable_ack_event(void *handle, uint8_t *event, uint32_t len)
2754{
2755 tp_wma_handle wma = (tp_wma_handle)handle;
2756 WMI_D0_WOW_DISABLE_ACK_EVENTID_param_tlvs *param_buf;
2757 wmi_d0_wow_disable_ack_event_fixed_param *resp_data;
2758
2759 param_buf = (WMI_D0_WOW_DISABLE_ACK_EVENTID_param_tlvs *)event;
2760 if (!param_buf) {
2761 WMA_LOGE("Invalid D0-WOW disable ACK event buffer!");
2762 return -EINVAL;
2763 }
2764
2765 resp_data = param_buf->fixed_param;
2766
Wu Gaod7dd6e42018-10-16 17:22:56 +08002767 ucfg_pmo_psoc_wakeup_host_event_received(wma->psoc);
Will Huang3cd2b7c2017-11-17 13:16:56 +08002768
2769 WMA_LOGD("Received D0-WOW disable ACK");
2770
2771 return 0;
2772}
2773#else
2774int wma_d0_wow_disable_ack_event(void *handle, uint8_t *event, uint32_t len)
2775{
2776 return 0;
2777}
2778#endif
2779
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002780/**
2781 * wma_pdev_resume_event_handler() - PDEV resume event handler
2782 * @handle: wma handle
2783 * @event: event data
2784 * @len: buffer length
2785 *
2786 * Return: 0 for success or error
2787 */
2788int wma_pdev_resume_event_handler(void *handle, uint8_t *event, uint32_t len)
2789{
2790 tp_wma_handle wma = (tp_wma_handle) handle;
2791
2792 WMA_LOGA("Received PDEV resume event");
2793
Wu Gaod7dd6e42018-10-16 17:22:56 +08002794 ucfg_pmo_psoc_wakeup_host_event_received(wma->psoc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002795
2796 return 0;
2797}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002798
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002799/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002800 * wma_del_ts_req() - send DELTS request to fw
2801 * @wma: wma handle
2802 * @msg: delts params
2803 *
2804 * Return: none
2805 */
Jeff Johnson256002f2018-12-22 17:53:19 -08002806void wma_del_ts_req(tp_wma_handle wma, struct del_ts_params *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002807{
Pragaspathi Thilagaraj0d1159e2018-08-08 19:00:36 +05302808 if (!wma_is_vdev_valid(msg->sessionId)) {
2809 WMA_LOGE("%s: vdev id:%d is not active ", __func__,
2810 msg->sessionId);
2811 qdf_mem_free(msg);
2812 return;
2813 }
Govind Singhaa64c242016-03-08 11:31:49 +05302814 if (wmi_unified_del_ts_cmd(wma->wmi_handle,
2815 msg->sessionId,
2816 TID_TO_WME_AC(msg->userPrio))) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002817 WMA_LOGP("%s: Failed to send vdev DELTS command", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002818 }
Govind Singhaa64c242016-03-08 11:31:49 +05302819
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002820#ifdef WLAN_FEATURE_ROAM_OFFLOAD
2821 if (msg->setRICparams == true)
2822 wma_set_ric_req(wma, msg, false);
2823#endif /* WLAN_FEATURE_ROAM_OFFLOAD */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302824 qdf_mem_free(msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002825}
2826
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002827void wma_aggr_qos_req(tp_wma_handle wma,
Pragaspathi Thilagarajd5cb9e82019-02-04 14:13:52 +05302828 struct aggr_add_ts_param *aggr_qos_rsp_msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002829{
Pragaspathi Thilagarajd5cb9e82019-02-04 14:13:52 +05302830 if (!wma_is_vdev_valid(aggr_qos_rsp_msg->vdev_id)) {
2831 WMA_LOGE("%s: vdev id:%d is not active ", __func__,
2832 aggr_qos_rsp_msg->vdev_id);
2833 return;
2834 }
2835 wmi_unified_aggr_qos_cmd(wma->wmi_handle, aggr_qos_rsp_msg);
Jeff Johnsonc97816c2018-05-12 17:13:23 -07002836 /* send response to upper layers from here only. */
Pragaspathi Thilagarajd5cb9e82019-02-04 14:13:52 +05302837 wma_send_msg_high_priority(wma, WMA_AGGR_QOS_RSP, aggr_qos_rsp_msg, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002838}
2839
Mahesh Kumar Kalikot Veetil40575112016-09-09 16:57:08 -07002840#ifdef FEATURE_WLAN_ESE
2841/**
2842 * wma_set_tsm_interval() - Set TSM interval
2843 * @req: pointer to ADDTS request
2844 *
2845 * Return: QDF_STATUS_E_FAILURE or QDF_STATUS_SUCCESS
2846 */
Jeff Johnson9851fcc2018-12-22 17:29:58 -08002847static QDF_STATUS wma_set_tsm_interval(struct add_ts_param *req)
Mahesh Kumar Kalikot Veetil40575112016-09-09 16:57:08 -07002848{
2849 /*
2850 * msmt_interval is in unit called TU (1 TU = 1024 us)
2851 * max value of msmt_interval cannot make resulting
2852 * interval_milliseconds overflow 32 bit
2853 *
2854 */
2855 uint32_t interval_milliseconds;
Mahesh Kumar Kalikot Veetil40575112016-09-09 16:57:08 -07002856
2857 interval_milliseconds = (req->tsm_interval * 1024) / 1000;
2858
Leo Chang96464902016-10-28 11:10:54 -07002859 cdp_tx_set_compute_interval(cds_get_context(QDF_MODULE_ID_SOC),
Rakesh Pillaief35fab2019-07-04 20:13:09 +05302860 WMI_PDEV_ID_SOC,
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08002861 interval_milliseconds);
Mahesh Kumar Kalikot Veetil40575112016-09-09 16:57:08 -07002862 return QDF_STATUS_SUCCESS;
2863}
2864#else
Jeff Johnson9851fcc2018-12-22 17:29:58 -08002865static inline QDF_STATUS wma_set_tsm_interval(struct add_ts_param *req)
Mahesh Kumar Kalikot Veetil40575112016-09-09 16:57:08 -07002866{
2867 return QDF_STATUS_SUCCESS;
2868}
2869#endif /* FEATURE_WLAN_ESE */
2870
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002871/**
2872 * wma_add_ts_req() - send ADDTS request to fw
2873 * @wma: wma handle
2874 * @msg: ADDTS params
2875 *
2876 * Return: none
2877 */
Jeff Johnson9851fcc2018-12-22 17:29:58 -08002878void wma_add_ts_req(tp_wma_handle wma, struct add_ts_param *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002879{
Govind Singhaa64c242016-03-08 11:31:49 +05302880 struct add_ts_param cmd = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002881
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002882 msg->status = QDF_STATUS_SUCCESS;
Mahesh Kumar Kalikot Veetil40575112016-09-09 16:57:08 -07002883 if (wma_set_tsm_interval(msg) == QDF_STATUS_SUCCESS) {
Govind Singhaa64c242016-03-08 11:31:49 +05302884
Jeff Johnson5c68c5b2019-01-20 15:37:43 -08002885 cmd.vdev_id = msg->vdev_id;
Mahesh Kumar Kalikot Veetil40575112016-09-09 16:57:08 -07002886 cmd.tspec.tsinfo.traffic.userPrio =
Govind Singhaa64c242016-03-08 11:31:49 +05302887 TID_TO_WME_AC(msg->tspec.tsinfo.traffic.userPrio);
Mahesh Kumar Kalikot Veetil40575112016-09-09 16:57:08 -07002888 cmd.tspec.mediumTime = msg->tspec.mediumTime;
2889 if (wmi_unified_add_ts_cmd(wma->wmi_handle, &cmd))
2890 msg->status = QDF_STATUS_E_FAILURE;
Govind Singhaa64c242016-03-08 11:31:49 +05302891
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002892#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Jeff Johnsone2da5782019-01-20 09:58:07 -08002893 if (msg->set_ric_params)
Mahesh Kumar Kalikot Veetil40575112016-09-09 16:57:08 -07002894 wma_set_ric_req(wma, msg, true);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002895#endif /* WLAN_FEATURE_ROAM_OFFLOAD */
2896
Mahesh Kumar Kalikot Veetil40575112016-09-09 16:57:08 -07002897 }
Abhishek Singh2d775fd2017-08-18 10:51:33 +05302898 wma_send_msg_high_priority(wma, WMA_ADD_TS_RSP, msg, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002899}
2900
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002901#ifdef FEATURE_WLAN_ESE
2902
2903#define TSM_DELAY_HISTROGRAM_BINS 4
2904/**
2905 * wma_process_tsm_stats_req() - process tsm stats request
2906 * @wma_handler - handle to wma
2907 * @pTsmStatsMsg - TSM stats struct that needs to be populated and
2908 * passed in message.
2909 *
2910 * A parallel function to WMA_ProcessTsmStatsReq for pronto. This
2911 * function fetches stats from data path APIs and post
2912 * WMA_TSM_STATS_RSP msg back to LIM.
2913 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302914 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002915 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302916QDF_STATUS wma_process_tsm_stats_req(tp_wma_handle wma_handler,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002917 void *pTsmStatsMsg)
2918{
2919 uint8_t counter;
2920 uint32_t queue_delay_microsec = 0;
2921 uint32_t tx_delay_microsec = 0;
2922 uint16_t packet_count = 0;
2923 uint16_t packet_loss_count = 0;
2924 tpAniTrafStrmMetrics pTsmMetric = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002925 tpAniGetTsmStatsReq pStats = (tpAniGetTsmStatsReq) pTsmStatsMsg;
2926 tpAniGetTsmStatsRsp pTsmRspParams = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002927 int tid = pStats->tid;
2928 /*
2929 * The number of histrogram bin report by data path api are different
2930 * than required by TSM, hence different (6) size array used
2931 */
2932 uint16_t bin_values[QCA_TX_DELAY_HIST_REPORT_BINS] = { 0, };
Leo Chang96464902016-10-28 11:10:54 -07002933 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002934
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002935 /* get required values from data path APIs */
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08002936 cdp_tx_delay(soc,
Rakesh Pillaief35fab2019-07-04 20:13:09 +05302937 WMI_PDEV_ID_SOC,
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08002938 &queue_delay_microsec,
2939 &tx_delay_microsec, tid);
2940 cdp_tx_delay_hist(soc,
Rakesh Pillaief35fab2019-07-04 20:13:09 +05302941 WMI_PDEV_ID_SOC,
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08002942 bin_values, tid);
2943 cdp_tx_packet_count(soc,
Rakesh Pillaief35fab2019-07-04 20:13:09 +05302944 WMI_PDEV_ID_SOC,
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08002945 &packet_count,
2946 &packet_loss_count, tid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002947
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002948 pTsmRspParams = qdf_mem_malloc(sizeof(*pTsmRspParams));
Arif Hussain157263f2018-10-03 13:07:15 -07002949 if (!pTsmRspParams) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302950 QDF_ASSERT(0);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302951 qdf_mem_free(pTsmStatsMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302952 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002953 }
Abhinav Kumaraa8f2df2019-01-11 20:02:26 +05302954 qdf_copy_macaddr(&pTsmRspParams->bssid, &pStats->bssId);
Jeff Johnsone88dd752018-06-07 22:57:54 -07002955 pTsmRspParams->rc = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002956 pTsmRspParams->tsmStatsReq = pStats;
2957 pTsmMetric = &pTsmRspParams->tsmMetrics;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002958 /* populate pTsmMetric */
2959 pTsmMetric->UplinkPktQueueDly = queue_delay_microsec;
2960 /* store only required number of bin values */
2961 for (counter = 0; counter < TSM_DELAY_HISTROGRAM_BINS; counter++) {
2962 pTsmMetric->UplinkPktQueueDlyHist[counter] =
2963 bin_values[counter];
2964 }
2965 pTsmMetric->UplinkPktTxDly = tx_delay_microsec;
2966 pTsmMetric->UplinkPktLoss = packet_loss_count;
2967 pTsmMetric->UplinkPktCount = packet_count;
2968
2969 /*
2970 * No need to populate roaming delay and roaming count as they are
2971 * being populated just before sending IAPP frame out
2972 */
2973 /* post this message to LIM/PE */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002974 wma_send_msg(wma_handler, WMA_TSM_STATS_RSP, (void *)pTsmRspParams, 0);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302975 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002976}
2977
2978#endif /* FEATURE_WLAN_ESE */
2979
2980/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002981 * wma_process_mcbc_set_filter_req() - process mcbc set filter request
2982 * @wma_handle: wma handle
2983 * @mcbc_param: mcbc params
2984 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302985 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002986 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302987QDF_STATUS wma_process_mcbc_set_filter_req(tp_wma_handle wma_handle,
Anurag Chouhance0dc992016-02-16 18:18:03 +05302988 tSirRcvFltMcAddrList *mcbc_param)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002989{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302990 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002991}
2992
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002993/**
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08002994 * wma_process_cesium_enable_ind() - enables cesium functionality in target
2995 * @wma: wma handle
2996 *
2997 * Return: QDF status
2998 */
2999QDF_STATUS wma_process_cesium_enable_ind(tp_wma_handle wma)
3000{
3001 QDF_STATUS ret;
3002 int32_t vdev_id;
3003
3004 vdev_id = wma_find_vdev_by_type(wma, WMI_VDEV_TYPE_IBSS);
3005 if (vdev_id < 0) {
3006 WMA_LOGE("%s: IBSS vdev does not exist could not enable cesium",
3007 __func__);
3008 return QDF_STATUS_E_FAILURE;
3009 }
3010
3011 /* Send enable cesium command to target */
3012 WMA_LOGE("Enable cesium in target for vdevId %d ", vdev_id);
3013 ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
3014 WMI_VDEV_PARAM_ENABLE_RMC, 1);
3015 if (ret) {
3016 WMA_LOGE("Enable cesium failed for vdevId %d", vdev_id);
3017 return QDF_STATUS_E_FAILURE;
3018 }
3019 return QDF_STATUS_SUCCESS;
3020}
3021
3022/**
3023 * wma_process_get_peer_info_req() - sends get peer info cmd to target
3024 * @wma: wma handle
3025 * @preq: get peer info request
3026 *
3027 * Return: QDF status
3028 */
3029QDF_STATUS wma_process_get_peer_info_req
3030 (tp_wma_handle wma, tSirIbssGetPeerInfoReqParams *pReq)
3031{
3032 int32_t ret;
3033 uint8_t *p;
3034 uint16_t len;
3035 wmi_buf_t buf;
3036 int32_t vdev_id;
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003037 struct cdp_pdev *pdev;
Leo Chang96464902016-10-28 11:10:54 -07003038 void *peer;
3039 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Srinivas Girigowdaa47b45f2019-02-27 12:29:02 -08003040 uint8_t peer_mac[QDF_MAC_ADDR_SIZE];
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003041 wmi_peer_info_req_cmd_fixed_param *p_get_peer_info_cmd;
Srinivas Girigowdaa47b45f2019-02-27 12:29:02 -08003042 uint8_t bcast_mac[QDF_MAC_ADDR_SIZE] = { 0xff, 0xff, 0xff,
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003043 0xff, 0xff, 0xff };
3044
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07003045 if (!soc) {
Nishank Aggarwala13b61d2016-12-01 12:53:58 +05303046 WMA_LOGE("%s: SOC context is NULL", __func__);
3047 return QDF_STATUS_E_FAILURE;
3048 }
3049
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003050 vdev_id = wma_find_vdev_by_type(wma, WMI_VDEV_TYPE_IBSS);
3051 if (vdev_id < 0) {
3052 WMA_LOGE("%s: IBSS vdev does not exist could not get peer info",
3053 __func__);
3054 return QDF_STATUS_E_FAILURE;
3055 }
3056
3057 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07003058 if (!pdev) {
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003059 WMA_LOGE("%s: Failed to get pdev context", __func__);
3060 return QDF_STATUS_E_FAILURE;
3061 }
3062
Yeshwanth Sriram Guntuka3f262102019-07-16 15:41:08 +05303063 if (qdf_is_macaddr_broadcast(&pReq->peer_mac)) {
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003064 /*get info for all peers */
Srinivas Girigowdaa47b45f2019-02-27 12:29:02 -08003065 qdf_mem_copy(peer_mac, bcast_mac, QDF_MAC_ADDR_SIZE);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003066 } else {
3067 /*get info for a single peer */
gaurank kathpalia8197e352019-09-11 16:09:53 +05303068 peer = cdp_peer_find_by_addr(soc, pdev, pReq->peer_mac.bytes);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003069 if (!peer) {
Yeshwanth Sriram Guntuka3f262102019-07-16 15:41:08 +05303070 WMA_LOGE("%s: Failed to get peer handle using peer "
3071 QDF_MAC_ADDR_STR, __func__,
3072 QDF_MAC_ADDR_ARRAY(pReq->peer_mac.bytes));
Nishank Aggarwala13b61d2016-12-01 12:53:58 +05303073 return QDF_STATUS_E_FAILURE;
3074 }
3075
Yeshwanth Sriram Guntuka3f262102019-07-16 15:41:08 +05303076 WMA_LOGE("%s: peer mac: " QDF_MAC_ADDR_STR, __func__,
3077 QDF_MAC_ADDR_ARRAY(pReq->peer_mac.bytes));
3078 qdf_mem_copy(peer_mac, pReq->peer_mac.bytes, QDF_MAC_ADDR_SIZE);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003079 }
3080
3081 len = sizeof(wmi_peer_info_req_cmd_fixed_param);
3082 buf = wmi_buf_alloc(wma->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07003083 if (!buf)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003084 return QDF_STATUS_E_FAILURE;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003085
3086 p = (uint8_t *) wmi_buf_data(buf);
3087 qdf_mem_zero(p, len);
3088 p_get_peer_info_cmd = (wmi_peer_info_req_cmd_fixed_param *) p;
3089
3090 WMITLV_SET_HDR(&p_get_peer_info_cmd->tlv_header,
3091 WMITLV_TAG_STRUC_wmi_peer_info_req_cmd_fixed_param,
3092 WMITLV_GET_STRUCT_TLVLEN
3093 (wmi_peer_info_req_cmd_fixed_param));
3094
3095 p_get_peer_info_cmd->vdev_id = vdev_id;
3096 WMI_CHAR_ARRAY_TO_MAC_ADDR(peer_mac,
3097 &p_get_peer_info_cmd->peer_mac_address);
3098
3099 ret = wmi_unified_cmd_send(wma->wmi_handle, buf, len,
3100 WMI_PEER_INFO_REQ_CMDID);
Dustin Brown2afb6f52016-12-02 14:47:48 -08003101 if (ret != QDF_STATUS_SUCCESS)
3102 wmi_buf_free(buf);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003103
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003104 WMA_LOGE("IBSS get peer info cmd sent len: %d, vdev %d command id: %d, status: %d",
3105 len, vdev_id, WMI_PEER_INFO_REQ_CMDID, ret);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003106
3107 return QDF_STATUS_SUCCESS;
3108}
3109
3110/**
3111 * wma_process_tx_fail_monitor_ind() - sends tx fail monitor cmd to target
3112 * @wma: wma handle
3113 * @pReq: tx fail monitor command params
3114 *
3115 * Return: QDF status
3116 */
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003117QDF_STATUS wma_process_tx_fail_monitor_ind(tp_wma_handle wma,
3118 tAniTXFailMonitorInd *pReq)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003119{
3120 QDF_STATUS ret;
3121 int32_t vdev_id;
3122
3123 vdev_id = wma_find_vdev_by_type(wma, WMI_VDEV_TYPE_IBSS);
3124 if (vdev_id < 0) {
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003125 WMA_LOGE("%s: IBSS vdev does not exist could not send fast tx fail monitor indication message to target",
3126 __func__);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003127 return QDF_STATUS_E_FAILURE;
3128 }
3129
3130 /* Send enable cesium command to target */
3131 WMA_LOGE("send fast tx fail monitor ind cmd target for vdevId %d val %d",
3132 vdev_id, pReq->tx_fail_count);
3133
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003134 if (pReq->tx_fail_count == 0)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003135 wma->hddTxFailCb = NULL;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003136 else
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003137 wma->hddTxFailCb = pReq->txFailIndCallback;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003138 ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
3139 WMI_VDEV_PARAM_SET_IBSS_TX_FAIL_CNT_THR,
3140 pReq->tx_fail_count);
3141 if (ret) {
3142 WMA_LOGE("tx fail monitor failed for vdevId %d", vdev_id);
3143 return QDF_STATUS_E_FAILURE;
3144 }
3145
3146 return QDF_STATUS_SUCCESS;
3147}
3148
Rachit Kankaneee1735c2018-08-02 13:19:34 +05303149#ifdef FEATURE_WLAN_RMC
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003150/**
3151 * wma_process_rmc_enable_ind() - enables RMC functionality in target
3152 * @wma: wma handle
3153 *
3154 * Return: QDF status
3155 */
3156QDF_STATUS wma_process_rmc_enable_ind(tp_wma_handle wma)
3157{
3158 int ret;
3159 uint8_t *p;
3160 uint16_t len;
3161 wmi_buf_t buf;
3162 int32_t vdev_id;
3163 wmi_rmc_set_mode_cmd_fixed_param *p_rmc_enable_cmd;
3164
3165 vdev_id = wma_find_vdev_by_type(wma, WMI_VDEV_TYPE_IBSS);
3166 if (vdev_id < 0) {
3167 WMA_LOGE("%s: IBSS vdev does not exist could not enable RMC",
3168 __func__);
3169 return QDF_STATUS_E_FAILURE;
3170 }
3171
3172 len = sizeof(wmi_rmc_set_mode_cmd_fixed_param);
3173 buf = wmi_buf_alloc(wma->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07003174 if (!buf)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003175 return QDF_STATUS_E_FAILURE;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003176
3177 p = (uint8_t *) wmi_buf_data(buf);
3178 qdf_mem_zero(p, len);
3179 p_rmc_enable_cmd = (wmi_rmc_set_mode_cmd_fixed_param *) p;
3180
3181 WMITLV_SET_HDR(&p_rmc_enable_cmd->tlv_header,
3182 WMITLV_TAG_STRUC_wmi_rmc_set_mode_cmd_fixed_param,
3183 WMITLV_GET_STRUCT_TLVLEN
3184 (wmi_rmc_set_mode_cmd_fixed_param));
3185
3186 p_rmc_enable_cmd->vdev_id = vdev_id;
3187 p_rmc_enable_cmd->enable_rmc = WMI_RMC_MODE_ENABLED;
3188
3189 ret = wmi_unified_cmd_send(wma->wmi_handle, buf, len,
3190 WMI_RMC_SET_MODE_CMDID);
Dustin Brown2afb6f52016-12-02 14:47:48 -08003191 if (ret != QDF_STATUS_SUCCESS)
3192 wmi_buf_free(buf);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003193
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003194 WMA_LOGE("Enable RMC cmd sent len: %d, vdev %d command id: %d, status: %d",
3195 len, vdev_id, WMI_RMC_SET_MODE_CMDID, ret);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003196
3197 return QDF_STATUS_SUCCESS;
3198}
3199
3200/**
3201 * wma_process_rmc_disable_ind() - disables rmc functionality in target
3202 * @wma: wma handle
3203 *
3204 * Return: QDF status
3205 */
3206QDF_STATUS wma_process_rmc_disable_ind(tp_wma_handle wma)
3207{
3208 int ret;
3209 uint8_t *p;
3210 uint16_t len;
3211 wmi_buf_t buf;
3212 int32_t vdev_id;
3213 wmi_rmc_set_mode_cmd_fixed_param *p_rmc_disable_cmd;
3214
3215 vdev_id = wma_find_vdev_by_type(wma, WMI_VDEV_TYPE_IBSS);
3216 if (vdev_id < 0) {
3217 WMA_LOGE("%s: IBSS vdev does not exist could not disable RMC",
3218 __func__);
3219 return QDF_STATUS_E_FAILURE;
3220 }
3221
3222 len = sizeof(wmi_rmc_set_mode_cmd_fixed_param);
3223 buf = wmi_buf_alloc(wma->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07003224 if (!buf)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003225 return QDF_STATUS_E_FAILURE;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003226
3227 p = (uint8_t *) wmi_buf_data(buf);
3228 qdf_mem_zero(p, len);
3229 p_rmc_disable_cmd = (wmi_rmc_set_mode_cmd_fixed_param *) p;
3230
3231 WMITLV_SET_HDR(&p_rmc_disable_cmd->tlv_header,
3232 WMITLV_TAG_STRUC_wmi_rmc_set_mode_cmd_fixed_param,
3233 WMITLV_GET_STRUCT_TLVLEN
3234 (wmi_rmc_set_mode_cmd_fixed_param));
3235
3236 p_rmc_disable_cmd->vdev_id = vdev_id;
3237 p_rmc_disable_cmd->enable_rmc = WMI_RMC_MODE_DISABLED;
3238
3239 ret = wmi_unified_cmd_send(wma->wmi_handle, buf, len,
3240 WMI_RMC_SET_MODE_CMDID);
Dustin Brown2afb6f52016-12-02 14:47:48 -08003241 if (ret != QDF_STATUS_SUCCESS)
3242 wmi_buf_free(buf);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003243
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003244 WMA_LOGE("Disable RMC cmd sent len: %d, vdev %d command id: %d, status: %d",
3245 len, vdev_id, WMI_RMC_SET_MODE_CMDID, ret);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003246
3247 return QDF_STATUS_SUCCESS;
3248}
3249
3250/**
3251 * wma_process_rmc_action_period_ind() - sends RMC action period to target
3252 * @wma: wma handle
3253 *
3254 * Return: QDF status
3255 */
3256QDF_STATUS wma_process_rmc_action_period_ind(tp_wma_handle wma)
3257{
3258 int ret;
3259 uint8_t *p;
3260 uint16_t len;
Dustin Brownecfae9a2016-11-15 13:01:39 -08003261 uint32_t periodicity_msec;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003262 wmi_buf_t buf;
3263 int32_t vdev_id;
3264 wmi_rmc_set_action_period_cmd_fixed_param *p_rmc_cmd;
Jeff Johnson009c40f2018-11-05 09:54:37 -08003265 struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003266
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07003267 if (!mac) {
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003268 WMA_LOGE("%s: MAC mac does not exist", __func__);
3269 return QDF_STATUS_E_FAILURE;
3270 }
3271
3272 vdev_id = wma_find_vdev_by_type(wma, WMI_VDEV_TYPE_IBSS);
3273 if (vdev_id < 0) {
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003274 WMA_LOGE("%s: IBSS vdev does not exist could not send RMC action period to target",
3275 __func__);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003276 return QDF_STATUS_E_FAILURE;
3277 }
3278
3279 len = sizeof(wmi_rmc_set_action_period_cmd_fixed_param);
3280 buf = wmi_buf_alloc(wma->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07003281 if (!buf)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003282 return QDF_STATUS_E_FAILURE;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003283
3284 p = (uint8_t *) wmi_buf_data(buf);
3285 qdf_mem_zero(p, len);
3286 p_rmc_cmd = (wmi_rmc_set_action_period_cmd_fixed_param *) p;
3287
3288 WMITLV_SET_HDR(&p_rmc_cmd->tlv_header,
3289 WMITLV_TAG_STRUC_wmi_rmc_set_action_period_cmd_fixed_param,
3290 WMITLV_GET_STRUCT_TLVLEN
3291 (wmi_rmc_set_action_period_cmd_fixed_param));
3292
Bala Venkatesh2fde2c62018-09-11 20:33:24 +05303293 periodicity_msec = mac->mlme_cfg->sap_cfg.rmc_action_period_freq;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003294 p_rmc_cmd->vdev_id = vdev_id;
Dustin Brownecfae9a2016-11-15 13:01:39 -08003295 p_rmc_cmd->periodicity_msec = periodicity_msec;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003296
3297 ret = wmi_unified_cmd_send(wma->wmi_handle, buf, len,
3298 WMI_RMC_SET_ACTION_PERIOD_CMDID);
Dustin Brown2afb6f52016-12-02 14:47:48 -08003299 if (ret != QDF_STATUS_SUCCESS)
3300 wmi_buf_free(buf);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003301
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003302 WMA_LOGE("RMC action period %d cmd sent len: %d, vdev %d command id: %d, status: %d",
3303 periodicity_msec, len, vdev_id, WMI_RMC_SET_ACTION_PERIOD_CMDID,
3304 ret);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003305
3306 return QDF_STATUS_SUCCESS;
3307}
Rachit Kankaneee1735c2018-08-02 13:19:34 +05303308#endif /* FEATURE_WLAN_RMC */
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003309
3310/**
Jeff Johnson6dcb44a2018-12-23 10:17:00 -08003311 * wma_process_add_periodic_tx_ptrn_ind() - add periodic tx pattern
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003312 * @handle: wma handle
Jeff Johnson6dcb44a2018-12-23 10:17:00 -08003313 * @pattern: tx pattern params
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003314 *
Jeff Johnson6dcb44a2018-12-23 10:17:00 -08003315 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003316 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303317QDF_STATUS wma_process_add_periodic_tx_ptrn_ind(WMA_HANDLE handle,
Jeff Johnson6dcb44a2018-12-23 10:17:00 -08003318 tSirAddPeriodicTxPtrn *pattern)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003319{
3320 tp_wma_handle wma_handle = (tp_wma_handle) handle;
Mohit Khanna0fe61672016-05-19 16:53:39 -07003321 struct periodic_tx_pattern *params_ptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003322 uint8_t vdev_id;
Mohit Khanna0fe61672016-05-19 16:53:39 -07003323 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003324
3325 if (!wma_handle || !wma_handle->wmi_handle) {
3326 WMA_LOGE("%s: WMA is closed, can not issue fw add pattern cmd",
3327 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303328 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003329 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003330
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003331 if (!wma_find_vdev_by_addr(wma_handle,
Jeff Johnson6dcb44a2018-12-23 10:17:00 -08003332 pattern->mac_address.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003333 &vdev_id)) {
3334 WMA_LOGE("%s: Failed to find vdev id for %pM", __func__,
Jeff Johnson6dcb44a2018-12-23 10:17:00 -08003335 pattern->mac_address.bytes);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303336 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003337 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003338
Jeff Johnson0536c172018-12-23 10:20:06 -08003339 params_ptr = qdf_mem_malloc(sizeof(*params_ptr));
3340 if (!params_ptr)
3341 return QDF_STATUS_E_NOMEM;
3342
Jeff Johnson6dcb44a2018-12-23 10:17:00 -08003343 params_ptr->ucPtrnId = pattern->ucPtrnId;
3344 params_ptr->ucPtrnSize = pattern->ucPtrnSize;
3345 params_ptr->usPtrnIntervalMs = pattern->usPtrnIntervalMs;
3346 qdf_mem_copy(&params_ptr->mac_address, &pattern->mac_address,
3347 sizeof(struct qdf_mac_addr));
3348 qdf_mem_copy(params_ptr->ucPattern, pattern->ucPattern,
3349 params_ptr->ucPtrnSize);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003350
Jeff Johnson6dcb44a2018-12-23 10:17:00 -08003351 status = wmi_unified_process_add_periodic_tx_ptrn_cmd(
3352 wma_handle->wmi_handle, params_ptr, vdev_id);
Mohit Khanna0fe61672016-05-19 16:53:39 -07003353
3354 qdf_mem_free(params_ptr);
3355 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003356}
3357
3358/**
3359 * wma_process_del_periodic_tx_ptrn_ind - del periodic tx ptrn
3360 * @handle: wma handle
3361 * @pDelPeriodicTxPtrnParams: tx ptrn params
3362 *
Jeff Johnson6dcb44a2018-12-23 10:17:00 -08003363 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003364 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303365QDF_STATUS wma_process_del_periodic_tx_ptrn_ind(WMA_HANDLE handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003366 tSirDelPeriodicTxPtrn *
3367 pDelPeriodicTxPtrnParams)
3368{
3369 tp_wma_handle wma_handle = (tp_wma_handle) handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003370 uint8_t vdev_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003371
3372 if (!wma_handle || !wma_handle->wmi_handle) {
3373 WMA_LOGE("%s: WMA is closed, can not issue Del Pattern cmd",
3374 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303375 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003376 }
Himanshu Agarwal44195412016-03-09 13:03:54 +05303377
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003378 if (!wma_find_vdev_by_addr(wma_handle,
Srinivas Girigowdaa5bba7a2015-11-18 22:44:36 -08003379 pDelPeriodicTxPtrnParams->mac_address.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003380 &vdev_id)) {
3381 WMA_LOGE("%s: Failed to find vdev id for %pM", __func__,
Srinivas Girigowdaa5bba7a2015-11-18 22:44:36 -08003382 pDelPeriodicTxPtrnParams->mac_address.bytes);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303383 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003384 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003385
Himanshu Agarwal44195412016-03-09 13:03:54 +05303386 return wmi_unified_process_del_periodic_tx_ptrn_cmd(
3387 wma_handle->wmi_handle, vdev_id,
3388 pDelPeriodicTxPtrnParams->ucPtrnId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003389}
3390
3391#ifdef WLAN_FEATURE_STATS_EXT
3392/**
3393 * wma_stats_ext_req() - request ext stats from fw
3394 * @wma_ptr: wma handle
3395 * @preq: stats ext params
3396 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303397 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003398 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303399QDF_STATUS wma_stats_ext_req(void *wma_ptr, tpStatsExtRequest preq)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003400{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003401 tp_wma_handle wma = (tp_wma_handle) wma_ptr;
Krishna Kumaar Natarajan1b909d72016-06-06 15:02:18 -07003402 struct stats_ext_params *params;
3403 size_t params_len;
3404 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003405
Himanshu Agarwal44195412016-03-09 13:03:54 +05303406 if (!wma) {
3407 WMA_LOGE("%s: wma handle is NULL", __func__);
3408 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003409 }
3410
Krishna Kumaar Natarajan1b909d72016-06-06 15:02:18 -07003411 params_len = sizeof(*params) + preq->request_data_len;
3412 params = qdf_mem_malloc(params_len);
Arif Hussain157263f2018-10-03 13:07:15 -07003413 if (!params)
Krishna Kumaar Natarajan1b909d72016-06-06 15:02:18 -07003414 return QDF_STATUS_E_NOMEM;
Krishna Kumaar Natarajan1b909d72016-06-06 15:02:18 -07003415
3416 params->vdev_id = preq->vdev_id;
3417 params->request_data_len = preq->request_data_len;
3418 if (preq->request_data_len > 0)
3419 qdf_mem_copy(params->request_data, preq->request_data,
3420 params->request_data_len);
3421
3422 status = wmi_unified_stats_ext_req_cmd(wma->wmi_handle, params);
3423 qdf_mem_free(params);
3424
3425 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003426}
3427
3428#endif /* WLAN_FEATURE_STATS_EXT */
3429
3430#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
3431/**
3432 * wma_send_status_of_ext_wow() - send ext wow status to SME
3433 * @wma: wma handle
3434 * @status: status
3435 *
3436 * Return: none
3437 */
3438static void wma_send_status_of_ext_wow(tp_wma_handle wma, bool status)
3439{
3440 tSirReadyToExtWoWInd *ready_to_extwow;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303441 QDF_STATUS vstatus;
Rajeev Kumarcf7bd802017-04-18 11:11:42 -07003442 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003443 uint8_t len;
3444
3445 WMA_LOGD("Posting ready to suspend indication to umac");
3446
3447 len = sizeof(tSirReadyToExtWoWInd);
Arif Hussain157263f2018-10-03 13:07:15 -07003448 ready_to_extwow = qdf_mem_malloc(len);
3449 if (!ready_to_extwow)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003450 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003451
3452 ready_to_extwow->mesgType = eWNI_SME_READY_TO_EXTWOW_IND;
3453 ready_to_extwow->mesgLen = len;
3454 ready_to_extwow->status = status;
3455
Rajeev Kumarb60abe42017-01-21 15:39:31 -08003456 message.type = eWNI_SME_READY_TO_EXTWOW_IND;
3457 message.bodyptr = (void *)ready_to_extwow;
3458 message.bodyval = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003459
gaurank kathpalia00861f02018-08-28 19:16:12 +05303460 vstatus = scheduler_post_message(QDF_MODULE_ID_WMA,
3461 QDF_MODULE_ID_SME,
3462 QDF_MODULE_ID_SME, &message);
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05303463 if (vstatus != QDF_STATUS_SUCCESS)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303464 qdf_mem_free(ready_to_extwow);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003465}
3466
3467/**
3468 * wma_enable_ext_wow() - enable ext wow in fw
3469 * @wma: wma handle
3470 * @params: ext wow params
3471 *
3472 * Return:0 for success or error code
3473 */
Himanshu Agarwal44195412016-03-09 13:03:54 +05303474QDF_STATUS wma_enable_ext_wow(tp_wma_handle wma, tpSirExtWoWParams params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003475{
Himanshu Agarwal44195412016-03-09 13:03:54 +05303476 struct ext_wow_params wow_params = {0};
3477 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003478
Himanshu Agarwal44195412016-03-09 13:03:54 +05303479 if (!wma) {
3480 WMA_LOGE("%s: wma handle is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303481 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003482 }
3483
Himanshu Agarwal44195412016-03-09 13:03:54 +05303484 wow_params.vdev_id = params->vdev_id;
3485 wow_params.type = (enum wmi_ext_wow_type) params->type;
3486 wow_params.wakeup_pin_num = params->wakeup_pin_num;
3487
3488 status = wmi_unified_enable_ext_wow_cmd(wma->wmi_handle,
3489 &wow_params);
3490 if (QDF_IS_STATUS_ERROR(status))
3491 return status;
3492
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003493 wma_send_status_of_ext_wow(wma, true);
Himanshu Agarwal44195412016-03-09 13:03:54 +05303494 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003495
3496}
3497
3498/**
3499 * wma_set_app_type1_params_in_fw() - set app type1 params in fw
3500 * @wma: wma handle
3501 * @appType1Params: app type1 params
3502 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303503 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003504 */
3505int wma_set_app_type1_params_in_fw(tp_wma_handle wma,
3506 tpSirAppType1Params appType1Params)
3507{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003508 int ret;
3509
Govind Singhaa64c242016-03-08 11:31:49 +05303510 ret = wmi_unified_app_type1_params_in_fw_cmd(wma->wmi_handle,
3511 (struct app_type1_params *)appType1Params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003512 if (ret) {
3513 WMA_LOGE("%s: Failed to set APP TYPE1 PARAMS", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303514 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003515 }
3516
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303517 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003518}
3519
3520/**
3521 * wma_set_app_type2_params_in_fw() - set app type2 params in fw
3522 * @wma: wma handle
3523 * @appType2Params: app type2 params
3524 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303525 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003526 */
Himanshu Agarwal44195412016-03-09 13:03:54 +05303527QDF_STATUS wma_set_app_type2_params_in_fw(tp_wma_handle wma,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003528 tpSirAppType2Params appType2Params)
3529{
Himanshu Agarwal44195412016-03-09 13:03:54 +05303530 struct app_type2_params params = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003531
Himanshu Agarwal44195412016-03-09 13:03:54 +05303532 if (!wma) {
3533 WMA_LOGE("%s: wma handle is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303534 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003535 }
3536
Himanshu Agarwal44195412016-03-09 13:03:54 +05303537 params.vdev_id = appType2Params->vdev_id;
3538 params.rc4_key_len = appType2Params->rc4_key_len;
3539 qdf_mem_copy(params.rc4_key, appType2Params->rc4_key, 16);
3540 params.ip_id = appType2Params->ip_id;
3541 params.ip_device_ip = appType2Params->ip_device_ip;
3542 params.ip_server_ip = appType2Params->ip_server_ip;
3543 params.tcp_src_port = appType2Params->tcp_src_port;
3544 params.tcp_dst_port = appType2Params->tcp_dst_port;
3545 params.tcp_seq = appType2Params->tcp_seq;
3546 params.tcp_ack_seq = appType2Params->tcp_ack_seq;
3547 params.keepalive_init = appType2Params->keepalive_init;
3548 params.keepalive_min = appType2Params->keepalive_min;
3549 params.keepalive_max = appType2Params->keepalive_max;
3550 params.keepalive_inc = appType2Params->keepalive_inc;
3551 params.tcp_tx_timeout_val = appType2Params->tcp_tx_timeout_val;
3552 params.tcp_rx_timeout_val = appType2Params->tcp_rx_timeout_val;
3553 qdf_mem_copy(&params.gateway_mac, &appType2Params->gateway_mac,
3554 sizeof(struct qdf_mac_addr));
3555
3556 return wmi_unified_set_app_type2_params_in_fw_cmd(wma->wmi_handle,
3557 &params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003558}
3559#endif /* WLAN_FEATURE_EXTWOW_SUPPORT */
3560
3561#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
3562/**
3563 * wma_auto_shutdown_event_handler() - process auto shutdown timer trigger
3564 * @handle: wma handle
3565 * @event: event buffer
3566 * @len: buffer length
3567 *
3568 * Return: 0 for success or error code
3569 */
3570int wma_auto_shutdown_event_handler(void *handle, uint8_t *event,
3571 uint32_t len)
3572{
3573 wmi_host_auto_shutdown_event_fixed_param *wmi_auto_sh_evt;
3574 WMI_HOST_AUTO_SHUTDOWN_EVENTID_param_tlvs *param_buf =
3575 (WMI_HOST_AUTO_SHUTDOWN_EVENTID_param_tlvs *)
3576 event;
3577
3578 if (!param_buf || !param_buf->fixed_param) {
3579 WMA_LOGE("%s:%d: Invalid Auto shutdown timer evt", __func__,
3580 __LINE__);
3581 return -EINVAL;
3582 }
3583
3584 wmi_auto_sh_evt = param_buf->fixed_param;
3585
3586 if (wmi_auto_sh_evt->shutdown_reason
3587 != WMI_HOST_AUTO_SHUTDOWN_REASON_TIMER_EXPIRY) {
3588 WMA_LOGE("%s:%d: Invalid Auto shutdown timer evt", __func__,
3589 __LINE__);
3590 return -EINVAL;
3591 }
3592
3593 WMA_LOGD("%s:%d: Auto Shutdown Evt: %d", __func__, __LINE__,
3594 wmi_auto_sh_evt->shutdown_reason);
jiad391c5282018-11-26 16:21:04 +08003595 return wma_wake_reason_auto_shutdown();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003596}
3597
Jeff Johnsona9ade7d2019-02-17 10:08:17 -08003598QDF_STATUS
3599wma_set_auto_shutdown_timer_req(tp_wma_handle wma_handle,
3600 struct auto_shutdown_cmd *auto_sh_cmd)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003601{
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07003602 if (!auto_sh_cmd) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003603 WMA_LOGE("%s : Invalid Autoshutdown cfg cmd", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303604 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003605 }
3606
Himanshu Agarwal44195412016-03-09 13:03:54 +05303607 return wmi_unified_set_auto_shutdown_timer_cmd(wma_handle->wmi_handle,
Jeff Johnsona9ade7d2019-02-17 10:08:17 -08003608 auto_sh_cmd->timer_val);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003609}
3610#endif /* FEATURE_WLAN_AUTO_SHUTDOWN */
3611
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003612#ifdef DHCP_SERVER_OFFLOAD
Jeff Johnson8bfc29e2019-02-15 07:58:15 -08003613QDF_STATUS
3614wma_process_dhcpserver_offload(tp_wma_handle wma_handle,
3615 struct dhcp_offload_info_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003616{
Himanshu Agarwal44195412016-03-09 13:03:54 +05303617 QDF_STATUS status;
Jeff Johnson8bfc29e2019-02-15 07:58:15 -08003618 wmi_unified_t wmi_handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003619
Himanshu Agarwal44195412016-03-09 13:03:54 +05303620 if (!wma_handle) {
3621 WMA_LOGE("%s: wma handle is NULL", __func__);
Jeff Johnsone77641e2019-02-15 09:00:41 -08003622 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003623 }
Himanshu Agarwal44195412016-03-09 13:03:54 +05303624
Jeff Johnson8bfc29e2019-02-15 07:58:15 -08003625 wmi_handle = wma_handle->wmi_handle;
3626 status = wmi_unified_process_dhcpserver_offload_cmd(wmi_handle,
3627 params);
3628 WMA_LOGD("Set dhcp server offload to vdev %d status %d",
3629 params->vdev_id, status);
Himanshu Agarwal44195412016-03-09 13:03:54 +05303630
Himanshu Agarwal44195412016-03-09 13:03:54 +05303631 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003632}
3633#endif /* DHCP_SERVER_OFFLOAD */
3634
3635#ifdef WLAN_FEATURE_GPIO_LED_FLASHING
3636/**
3637 * wma_set_led_flashing() - set led flashing in fw
3638 * @wma_handle: wma handle
3639 * @flashing: flashing request
3640 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303641 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003642 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303643QDF_STATUS wma_set_led_flashing(tp_wma_handle wma_handle,
Jeff Johnson5a6b6602017-10-04 14:44:30 -07003644 struct flashing_req_params *flashing)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003645{
Jeff Johnson5a6b6602017-10-04 14:44:30 -07003646 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003647
3648 if (!wma_handle || !wma_handle->wmi_handle) {
3649 WMA_LOGE(FL("WMA is closed, can not issue cmd"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303650 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003651 }
3652 if (!flashing) {
3653 WMA_LOGE(FL("invalid parameter: flashing"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303654 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003655 }
Govind Singhaa64c242016-03-08 11:31:49 +05303656 status = wmi_unified_set_led_flashing_cmd(wma_handle->wmi_handle,
Jeff Johnson5a6b6602017-10-04 14:44:30 -07003657 flashing);
3658 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003659}
3660#endif /* WLAN_FEATURE_GPIO_LED_FLASHING */
3661
Kabilan Kannanebe01e72018-06-13 01:13:46 -07003662int wma_sar_rsp_evt_handler(ol_scn_t handle, uint8_t *event, uint32_t len)
Kabilan Kannancaa85502018-04-13 18:04:58 -07003663{
Kabilan Kannanebe01e72018-06-13 01:13:46 -07003664 tp_wma_handle wma_handle;
3665 wmi_unified_t wmi_handle;
Kabilan Kannancaa85502018-04-13 18:04:58 -07003666 QDF_STATUS status;
3667
Kabilan Kannanebe01e72018-06-13 01:13:46 -07003668 WMA_LOGD(FL("handle:%pK event:%pK len:%u"), handle, event, len);
3669
3670 wma_handle = handle;
3671 if (!wma_handle) {
3672 WMA_LOGE(FL("NULL wma_handle"));
3673 return QDF_STATUS_E_INVAL;
3674 }
3675
3676 wmi_handle = wma_handle->wmi_handle;
3677 if (!wmi_handle) {
3678 WMA_LOGE(FL("NULL wmi_handle"));
3679 return QDF_STATUS_E_INVAL;
3680 }
3681
3682 status = wmi_unified_extract_sar2_result_event(wmi_handle,
Kabilan Kannancaa85502018-04-13 18:04:58 -07003683 event, len);
3684 if (QDF_IS_STATUS_ERROR(status)) {
3685 WMA_LOGE(FL("Event extract failure: %d"), status);
3686 return -EINVAL;
3687 }
3688
3689 return 0;
3690}
3691
Nirav Shaheb017be2018-02-15 11:20:58 +05303692#ifdef FEATURE_WLAN_CH_AVOID
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003693/**
3694 * wma_process_ch_avoid_update_req() - handles channel avoid update request
3695 * @wma_handle: wma handle
3696 * @ch_avoid_update_req: channel avoid update params
3697 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303698 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003699 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303700QDF_STATUS wma_process_ch_avoid_update_req(tp_wma_handle wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003701 tSirChAvoidUpdateReq *
3702 ch_avoid_update_req)
3703{
Himanshu Agarwal44195412016-03-09 13:03:54 +05303704 QDF_STATUS status;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003705
Himanshu Agarwal44195412016-03-09 13:03:54 +05303706 if (!wma_handle) {
3707 WMA_LOGE("%s: wma handle is NULL", __func__);
3708 return QDF_STATUS_E_FAILURE;
3709 }
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07003710 if (!ch_avoid_update_req) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003711 WMA_LOGE("%s : ch_avoid_update_req is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303712 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003713 }
3714
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08003715 WMA_LOGD("%s: WMA --> WMI_CHAN_AVOID_UPDATE", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003716
Himanshu Agarwal44195412016-03-09 13:03:54 +05303717 status = wmi_unified_process_ch_avoid_update_cmd(
3718 wma_handle->wmi_handle);
3719 if (QDF_IS_STATUS_ERROR(status))
3720 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003721
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08003722 WMA_LOGD("%s: WMA --> WMI_CHAN_AVOID_UPDATE sent through WMI",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003723 __func__);
Himanshu Agarwal44195412016-03-09 13:03:54 +05303724 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003725}
Nirav Shaheb017be2018-02-15 11:20:58 +05303726#endif
Kiran Kumar Lokere0751f0e2017-07-21 19:42:36 -07003727
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003728void wma_send_regdomain_info_to_fw(uint32_t reg_dmn, uint16_t regdmn2G,
Rajeev Kumar Sirasanagandla873b6d92017-06-06 13:11:17 +05303729 uint16_t regdmn5G, uint8_t ctl2G,
3730 uint8_t ctl5G)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003731{
Anurag Chouhan6d760662016-02-20 16:05:43 +05303732 tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003733 int32_t cck_mask_val = 0;
Govind Singhd76a5b02016-03-08 15:12:14 +05303734 struct pdev_params pdev_param = {0};
Himanshu Agarwal44195412016-03-09 13:03:54 +05303735 QDF_STATUS ret = QDF_STATUS_SUCCESS;
3736 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003737
Amar Singhal50d30752018-04-12 13:44:10 -07003738 WMA_LOGD("reg_dmn: %d regdmn2g: %d regdmn5g :%d ctl2g: %d ctl5g: %d",
3739 reg_dmn, regdmn2G, regdmn5G, ctl2G, ctl5G);
3740
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07003741 if (!wma) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003742 WMA_LOGE("%s: wma context is NULL", __func__);
3743 return;
3744 }
3745
Himanshu Agarwal44195412016-03-09 13:03:54 +05303746 status = wmi_unified_send_regdomain_info_to_fw_cmd(wma->wmi_handle,
3747 reg_dmn, regdmn2G, regdmn5G, ctl2G, ctl5G);
3748 if (status == QDF_STATUS_E_NOMEM)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003749 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003750
Ashish Kumar Dhanotiyabfee5892017-09-19 18:05:21 +05303751 if ((((reg_dmn & ~CTRY_FLAG) == CTRY_JAPAN15) ||
Amar Singhal5f997862016-08-24 13:17:50 -07003752 ((reg_dmn & ~CTRY_FLAG) == CTRY_KOREA_ROC)) &&
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003753 (true == wma->tx_chain_mask_cck))
3754 cck_mask_val = 1;
3755
3756 cck_mask_val |= (wma->self_gen_frm_pwr << 16);
Govind Singhd76a5b02016-03-08 15:12:14 +05303757 pdev_param.param_id = WMI_PDEV_PARAM_TX_CHAIN_MASK_CCK;
3758 pdev_param.param_value = cck_mask_val;
3759 ret = wmi_unified_pdev_param_send(wma->wmi_handle,
3760 &pdev_param,
3761 WMA_WILDCARD_PDEV_ID);
3762
Himanshu Agarwal44195412016-03-09 13:03:54 +05303763 if (QDF_IS_STATUS_ERROR(ret))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003764 WMA_LOGE("failed to set PDEV tx_chain_mask_cck %d",
3765 ret);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003766}
3767
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003768#ifdef FEATURE_WLAN_TDLS
3769/**
3770 * wma_tdls_event_handler() - handle TDLS event
3771 * @handle: wma handle
3772 * @event: event buffer
3773 * @len: buffer length
3774 *
3775 * Return: 0 for success or error code
3776 */
3777int wma_tdls_event_handler(void *handle, uint8_t *event, uint32_t len)
3778{
Frank Liu1a912b22017-09-06 17:47:32 +08003779 /* TODO update with target rx ops */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003780 return 0;
3781}
3782
3783/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003784 * wma_update_tdls_peer_state() - update TDLS peer state
3785 * @handle: wma handle
Jeff Johnson517ee492019-02-07 11:59:04 -08003786 * @peer_state: TDLS peer state params
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003787 *
3788 * Return: 0 for success or error code
3789 */
3790int wma_update_tdls_peer_state(WMA_HANDLE handle,
Jeff Johnson517ee492019-02-07 11:59:04 -08003791 struct tdls_peer_update_state *peer_state)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003792{
3793 tp_wma_handle wma_handle = (tp_wma_handle) handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003794 uint32_t i;
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003795 struct cdp_pdev *pdev;
Rachit Kankane87b16542019-02-28 14:14:36 +05303796 void *peer, *vdev;
Leo Chang96464902016-10-28 11:10:54 -07003797 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Jeff Johnson517ee492019-02-07 11:59:04 -08003798 struct tdls_peer_params *peer_cap;
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07003799 uint8_t *peer_mac_addr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003800 int ret = 0;
Kabilan Kannanc89fe712016-07-21 06:57:12 -07003801 uint32_t *ch_mhz = NULL;
Jeff Johnson517ee492019-02-07 11:59:04 -08003802 size_t ch_mhz_len;
3803 uint8_t chan_id;
Poddar, Siddarth5a91f5b2016-04-28 12:24:10 +05303804 bool restore_last_peer = false;
Pragaspathi Thilagaraj46e10b32018-11-12 16:23:02 +05303805 QDF_STATUS qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003806
3807 if (!wma_handle || !wma_handle->wmi_handle) {
3808 WMA_LOGE("%s: WMA is closed, can not issue cmd", __func__);
3809 ret = -EINVAL;
3810 goto end_tdls_peer_state;
3811 }
3812
Nishank Aggarwala13b61d2016-12-01 12:53:58 +05303813 if (!soc) {
3814 WMA_LOGE("%s: SOC context is NULL", __func__);
3815 ret = -EINVAL;
3816 goto end_tdls_peer_state;
3817 }
3818
Nitesh Shah622d3122017-06-05 17:04:06 +05303819 if (wma_is_roam_synch_in_progress(wma_handle,
Jeff Johnson517ee492019-02-07 11:59:04 -08003820 peer_state->vdev_id)) {
Nitesh Shah622d3122017-06-05 17:04:06 +05303821 WMA_LOGE("%s: roaming in progress, reject peer update cmd!",
3822 __func__);
3823 ret = -EPERM;
3824 goto end_tdls_peer_state;
3825 }
3826
Jeff Johnson517ee492019-02-07 11:59:04 -08003827 peer_cap = &peer_state->peer_cap;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003828
Jeff Johnson517ee492019-02-07 11:59:04 -08003829 /* peer capability info is valid only when peer state is connected */
3830 if (TDLS_PEER_STATE_CONNECTED != peer_state->peer_state)
3831 qdf_mem_zero(peer_cap, sizeof(*peer_cap));
3832
3833 if (peer_cap->peer_chanlen) {
3834 ch_mhz_len = sizeof(*ch_mhz) * peer_cap->peer_chanlen;
3835 ch_mhz = qdf_mem_malloc(ch_mhz_len);
Arif Hussain157263f2018-10-03 13:07:15 -07003836 if (!ch_mhz) {
Kabilan Kannanc89fe712016-07-21 06:57:12 -07003837 ret = -ENOMEM;
3838 goto end_tdls_peer_state;
3839 }
Naveen Rawat35804772016-06-27 15:40:28 -07003840
Jeff Johnson517ee492019-02-07 11:59:04 -08003841 for (i = 0; i < peer_cap->peer_chanlen; ++i) {
3842 chan_id = peer_cap->peer_chan[i].chan_id;
3843 ch_mhz[i] = cds_chan_to_freq(chan_id);
3844 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003845 }
3846
Ganesh Kondabattini3bf9efe2017-04-13 19:08:56 +05303847 /* Make sure that peer exists before sending peer state cmd*/
3848 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
3849 if (!pdev) {
3850 WMA_LOGE("%s: Failed to find pdev", __func__);
3851 ret = -EIO;
3852 goto end_tdls_peer_state;
3853 }
3854
3855 peer = cdp_peer_find_by_addr(soc,
Jeff Johnson517ee492019-02-07 11:59:04 -08003856 pdev,
gaurank kathpalia8197e352019-09-11 16:09:53 +05303857 peer_state->peer_macaddr);
Ganesh Kondabattini3bf9efe2017-04-13 19:08:56 +05303858 if (!peer) {
3859 WMA_LOGE("%s: Failed to get peer handle using peer mac %pM",
Jeff Johnson517ee492019-02-07 11:59:04 -08003860 __func__, peer_state->peer_macaddr);
Ganesh Kondabattini3bf9efe2017-04-13 19:08:56 +05303861 ret = -EIO;
3862 goto end_tdls_peer_state;
3863 }
nakul kachhwahae3e92ae2019-10-24 17:59:48 +05303864
3865 cdp_peer_set_tdls_offchan_enabled(soc,
3866 peer,
3867 !!peer_cap->peer_off_chan_support);
3868
Rachit Kankane87b16542019-02-28 14:14:36 +05303869 vdev = cdp_peer_get_vdev(soc, peer);
Ganesh Kondabattini3bf9efe2017-04-13 19:08:56 +05303870
Govind Singhaa64c242016-03-08 11:31:49 +05303871 if (wmi_unified_update_tdls_peer_state_cmd(wma_handle->wmi_handle,
Jeff Johnson517ee492019-02-07 11:59:04 -08003872 peer_state,
3873 ch_mhz)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003874 WMA_LOGE("%s: failed to send tdls peer update state command",
3875 __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003876 ret = -EIO;
3877 goto end_tdls_peer_state;
3878 }
3879
3880 /* in case of teardown, remove peer from fw */
Jeff Johnson517ee492019-02-07 11:59:04 -08003881 if (TDLS_PEER_STATE_TEARDOWN == peer_state->peer_state) {
Leo Chang96464902016-10-28 11:10:54 -07003882 peer_mac_addr = cdp_peer_get_peer_mac_addr(soc, peer);
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07003883 if (!peer_mac_addr) {
Nishank Aggarwala13b61d2016-12-01 12:53:58 +05303884 WMA_LOGE("peer_mac_addr is NULL");
3885 ret = -EIO;
3886 goto end_tdls_peer_state;
3887 }
3888
Leo Chang96464902016-10-28 11:10:54 -07003889 restore_last_peer = cdp_peer_is_vdev_restore_last_peer(
3890 soc, peer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003891
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -07003892 wma_debug("calling wma_remove_peer for peer " QDF_MAC_ADDR_STR
Srinivas Girigowda34fbba02019-04-08 12:07:44 -07003893 " vdevId: %d",
3894 QDF_MAC_ADDR_ARRAY(peer_mac_addr),
Jeff Johnson517ee492019-02-07 11:59:04 -08003895 peer_state->vdev_id);
Pragaspathi Thilagaraj46e10b32018-11-12 16:23:02 +05303896 qdf_status = wma_remove_peer(wma_handle, peer_mac_addr,
Jeff Johnson517ee492019-02-07 11:59:04 -08003897 peer_state->vdev_id, peer, false);
Pragaspathi Thilagaraj46e10b32018-11-12 16:23:02 +05303898 if (QDF_IS_STATUS_ERROR(qdf_status)) {
3899 WMA_LOGE(FL("wma_remove_peer failed"));
3900 ret = -EINVAL;
3901 goto end_tdls_peer_state;
3902 }
gaurank kathpalia8197e352019-09-11 16:09:53 +05303903 cdp_peer_update_last_real_peer(soc, pdev, vdev,
3904 restore_last_peer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003905 }
3906
Wu Gaofd60f3a2019-04-03 19:49:23 +08003907 if (TDLS_PEER_STATE_CONNECTED == peer_state->peer_state) {
3908 peer_mac_addr = cdp_peer_get_peer_mac_addr(soc, peer);
3909 if (peer_mac_addr)
3910 cdp_peer_state_update(soc, pdev, peer_mac_addr,
3911 OL_TXRX_PEER_STATE_AUTH);
3912 }
3913
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003914end_tdls_peer_state:
Kabilan Kannanc89fe712016-07-21 06:57:12 -07003915 if (ch_mhz)
3916 qdf_mem_free(ch_mhz);
Jeff Johnson517ee492019-02-07 11:59:04 -08003917 if (peer_state)
3918 qdf_mem_free(peer_state);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003919 return ret;
3920}
3921#endif /* FEATURE_WLAN_TDLS */
3922
Kiran Kumar Lokereee205772018-09-27 00:27:27 -07003923/*
3924 * wma_process_cfg_action_frm_tb_ppdu() - action frame TB PPDU cfg to firmware
3925 * @wma: Pointer to WMA handle
3926 * @cfg_info: Pointer for cfg info
3927 *
3928 * Return: QDF_STATUS_SUCCESS for success otherwise failure
3929 *
3930 */
3931QDF_STATUS wma_process_cfg_action_frm_tb_ppdu(tp_wma_handle wma,
3932 struct cfg_action_frm_tb_ppdu *cfg_info)
3933{
3934 struct cfg_action_frm_tb_ppdu_param cmd = {0};
3935
3936 if (!wma) {
3937 WMA_LOGE(FL("WMA pointer is NULL"));
3938 return QDF_STATUS_E_FAILURE;
3939 }
3940
3941 cmd.frm_len = cfg_info->frm_len;
3942 cmd.cfg = cfg_info->cfg;
3943 cmd.data = cfg_info->data;
3944
3945 WMA_LOGD(FL("cfg: %d, frm_len: %d"),
3946 cfg_info->cfg, cfg_info->frm_len);
3947
3948 return wmi_unified_cfg_action_frm_tb_ppdu_cmd(wma->wmi_handle, &cmd);
3949}
3950
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003951
3952/*
3953 * wma_process_set_ie_info() - Function to send IE info to firmware
3954 * @wma: Pointer to WMA handle
3955 * @ie_data: Pointer for ie data
3956 *
3957 * This function sends IE information to firmware
3958 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303959 * Return: QDF_STATUS_SUCCESS for success otherwise failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003960 *
3961 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303962QDF_STATUS wma_process_set_ie_info(tp_wma_handle wma,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003963 struct vdev_ie_info *ie_info)
3964{
Naveen Rawatb47287a2017-01-05 15:50:52 -08003965 struct wma_txrx_node *interface;
Govind Singhaa64c242016-03-08 11:31:49 +05303966 struct vdev_ie_info_param cmd = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003967
3968 if (!ie_info || !wma) {
3969 WMA_LOGE(FL("input pointer is NULL"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303970 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003971 }
3972
3973 /* Validate the input */
3974 if (ie_info->length <= 0) {
3975 WMA_LOGE(FL("Invalid IE length"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303976 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003977 }
3978
Pragaspathi Thilagarajf81a8f02018-08-15 21:44:07 +05303979 if (!wma_is_vdev_valid(ie_info->vdev_id)) {
Naveen Rawatb47287a2017-01-05 15:50:52 -08003980 WMA_LOGE(FL("vdev_id: %d is not active"), ie_info->vdev_id);
3981 return QDF_STATUS_E_INVAL;
3982 }
3983
Pragaspathi Thilagaraj0d1159e2018-08-08 19:00:36 +05303984 interface = &wma->interfaces[ie_info->vdev_id];
Govind Singhaa64c242016-03-08 11:31:49 +05303985 cmd.vdev_id = ie_info->vdev_id;
3986 cmd.ie_id = ie_info->ie_id;
3987 cmd.length = ie_info->length;
Naveen Rawat03e8d952016-08-01 15:22:20 -07003988 cmd.band = ie_info->band;
Govind Singhaa64c242016-03-08 11:31:49 +05303989 cmd.data = ie_info->data;
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +05303990 cmd.ie_source = WMA_SET_VDEV_IE_SOURCE_HOST;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003991
Selvaraj, Sridhard1225e62017-03-17 12:56:58 +05303992 WMA_LOGD(FL("vdev id: %d, ie_id: %d, band: %d, len: %d"),
3993 ie_info->vdev_id, ie_info->ie_id, ie_info->band,
3994 ie_info->length);
Naveen Rawat03e8d952016-08-01 15:22:20 -07003995
3996 QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG,
3997 ie_info->data, ie_info->length);
3998
Pragaspathi Thilagaraj0d1159e2018-08-08 19:00:36 +05303999 return wmi_unified_process_set_ie_info_cmd(wma->wmi_handle, &cmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004000}
4001
Nachiket Kukade177b5b02018-05-22 20:52:17 +05304002#ifdef FEATURE_WLAN_APF
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304003/**
Nachiket Kukadee547a482018-05-22 16:43:30 +05304004 * wma_get_apf_caps_event_handler() - Event handler for get apf capability
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304005 * @handle: WMA global handle
4006 * @cmd_param_info: command event data
4007 * @len: Length of @cmd_param_info
4008 *
4009 * Return: 0 on Success or Errno on failure
4010 */
Nachiket Kukadee547a482018-05-22 16:43:30 +05304011int wma_get_apf_caps_event_handler(void *handle, u_int8_t *cmd_param_info,
4012 u_int32_t len)
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304013{
4014 WMI_BPF_CAPABILIY_INFO_EVENTID_param_tlvs *param_buf;
4015 wmi_bpf_capability_info_evt_fixed_param *event;
Nachiket Kukadee547a482018-05-22 16:43:30 +05304016 struct sir_apf_get_offload *apf_get_offload;
Jeff Johnson9f18aa72018-12-02 12:05:12 -08004017 struct mac_context *pmac = (struct mac_context *)cds_get_context(
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304018 QDF_MODULE_ID_PE);
4019
4020 if (!pmac) {
4021 WMA_LOGE("%s: Invalid pmac", __func__);
4022 return -EINVAL;
4023 }
Nachiket Kukadee547a482018-05-22 16:43:30 +05304024 if (!pmac->sme.apf_get_offload_cb) {
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304025 WMA_LOGE("%s: Callback not registered", __func__);
4026 return -EINVAL;
4027 }
4028
4029 param_buf = (WMI_BPF_CAPABILIY_INFO_EVENTID_param_tlvs *)cmd_param_info;
4030 event = param_buf->fixed_param;
Nachiket Kukadee547a482018-05-22 16:43:30 +05304031 apf_get_offload = qdf_mem_malloc(sizeof(*apf_get_offload));
Arif Hussain157263f2018-10-03 13:07:15 -07004032 if (!apf_get_offload)
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304033 return -ENOMEM;
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304034
Nachiket Kukadee547a482018-05-22 16:43:30 +05304035 apf_get_offload->apf_version = event->bpf_version;
4036 apf_get_offload->max_apf_filters = event->max_bpf_filters;
4037 apf_get_offload->max_bytes_for_apf_inst =
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304038 event->max_bytes_for_bpf_inst;
Nachiket Kukadee547a482018-05-22 16:43:30 +05304039 WMA_LOGD("%s: APF capabilities version: %d max apf filter size: %d",
4040 __func__, apf_get_offload->apf_version,
4041 apf_get_offload->max_bytes_for_apf_inst);
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304042
Nachiket Kukadee547a482018-05-22 16:43:30 +05304043 WMA_LOGD("%s: sending apf capabilities event to hdd", __func__);
4044 pmac->sme.apf_get_offload_cb(pmac->sme.apf_get_offload_context,
4045 apf_get_offload);
4046 qdf_mem_free(apf_get_offload);
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304047 return 0;
4048}
4049
Nachiket Kukadee547a482018-05-22 16:43:30 +05304050QDF_STATUS wma_get_apf_capabilities(tp_wma_handle wma)
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304051{
4052 QDF_STATUS status = QDF_STATUS_SUCCESS;
4053 wmi_bpf_get_capability_cmd_fixed_param *cmd;
4054 wmi_buf_t wmi_buf;
4055 uint32_t len;
4056 u_int8_t *buf_ptr;
4057
4058 if (!wma || !wma->wmi_handle) {
Nachiket Kukadee547a482018-05-22 16:43:30 +05304059 WMA_LOGE(FL("WMA is closed, can not issue get APF capab"));
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304060 return QDF_STATUS_E_INVAL;
4061 }
4062
Nachiket Kukadee547a482018-05-22 16:43:30 +05304063 if (!wmi_service_enabled(wma->wmi_handle, wmi_service_apf_offload)) {
4064 WMA_LOGE(FL("APF cababilities feature bit not enabled"));
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304065 return QDF_STATUS_E_FAILURE;
4066 }
4067
4068 len = sizeof(*cmd);
4069 wmi_buf = wmi_buf_alloc(wma->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07004070 if (!wmi_buf)
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304071 return QDF_STATUS_E_NOMEM;
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304072
4073 buf_ptr = (u_int8_t *) wmi_buf_data(wmi_buf);
4074 cmd = (wmi_bpf_get_capability_cmd_fixed_param *) buf_ptr;
4075 WMITLV_SET_HDR(&cmd->tlv_header,
4076 WMITLV_TAG_STRUC_wmi_bpf_get_capability_cmd_fixed_param,
4077 WMITLV_GET_STRUCT_TLVLEN(
4078 wmi_bpf_get_capability_cmd_fixed_param));
4079
4080 if (wmi_unified_cmd_send(wma->wmi_handle, wmi_buf, len,
Nachiket Kukadee547a482018-05-22 16:43:30 +05304081 WMI_BPF_GET_CAPABILITY_CMDID)) {
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304082 wmi_buf_free(wmi_buf);
4083 return QDF_STATUS_E_FAILURE;
4084 }
4085 return status;
4086}
4087
Nachiket Kukadee547a482018-05-22 16:43:30 +05304088QDF_STATUS wma_set_apf_instructions(tp_wma_handle wma,
4089 struct sir_apf_set_offload *apf_set_offload)
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304090{
4091 wmi_bpf_set_vdev_instructions_cmd_fixed_param *cmd;
4092 wmi_buf_t wmi_buf;
4093 uint32_t len = 0, len_aligned = 0;
4094 u_int8_t *buf_ptr;
4095
4096 if (!wma || !wma->wmi_handle) {
Nachiket Kukadee547a482018-05-22 16:43:30 +05304097 WMA_LOGE("%s: WMA is closed, can not issue set APF capability",
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304098 __func__);
4099 return QDF_STATUS_E_INVAL;
4100 }
4101
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304102 if (!wmi_service_enabled(wma->wmi_handle,
Nachiket Kukadee547a482018-05-22 16:43:30 +05304103 wmi_service_apf_offload)) {
4104 WMA_LOGE(FL("APF offload feature Disabled"));
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304105 return QDF_STATUS_E_NOSUPPORT;
4106 }
4107
Nachiket Kukadee547a482018-05-22 16:43:30 +05304108 if (!apf_set_offload) {
4109 WMA_LOGE("%s: Invalid APF instruction request", __func__);
Rajeev Kumar90016022017-08-22 14:00:48 -07004110 return QDF_STATUS_E_INVAL;
4111 }
4112
Nachiket Kukadee547a482018-05-22 16:43:30 +05304113 if (apf_set_offload->session_id >= wma->max_bssid) {
Rajeev Kumar90016022017-08-22 14:00:48 -07004114 WMA_LOGE(FL("Invalid vdev_id: %d"),
Nachiket Kukadee547a482018-05-22 16:43:30 +05304115 apf_set_offload->session_id);
Rajeev Kumar90016022017-08-22 14:00:48 -07004116 return QDF_STATUS_E_INVAL;
4117 }
4118
Nachiket Kukadee547a482018-05-22 16:43:30 +05304119 if (!wma_is_vdev_up(apf_set_offload->session_id)) {
4120 WMA_LOGE("vdev %d is not up skipping APF offload",
4121 apf_set_offload->session_id);
Rajeev Kumar90016022017-08-22 14:00:48 -07004122 return QDF_STATUS_E_INVAL;
4123 }
4124
Nachiket Kukadee547a482018-05-22 16:43:30 +05304125 if (apf_set_offload->total_length) {
4126 len_aligned = roundup(apf_set_offload->current_length,
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304127 sizeof(A_UINT32));
4128 len = len_aligned + WMI_TLV_HDR_SIZE;
4129 }
4130
4131 len += sizeof(*cmd);
4132 wmi_buf = wmi_buf_alloc(wma->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07004133 if (!wmi_buf)
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304134 return QDF_STATUS_E_NOMEM;
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304135
4136 buf_ptr = (u_int8_t *) wmi_buf_data(wmi_buf);
4137 cmd = (wmi_bpf_set_vdev_instructions_cmd_fixed_param *) buf_ptr;
4138
4139 WMITLV_SET_HDR(&cmd->tlv_header,
4140 WMITLV_TAG_STRUC_wmi_bpf_set_vdev_instructions_cmd_fixed_param,
4141 WMITLV_GET_STRUCT_TLVLEN(
4142 wmi_bpf_set_vdev_instructions_cmd_fixed_param));
Nachiket Kukadee547a482018-05-22 16:43:30 +05304143 cmd->vdev_id = apf_set_offload->session_id;
4144 cmd->filter_id = apf_set_offload->filter_id;
4145 cmd->total_length = apf_set_offload->total_length;
4146 cmd->current_offset = apf_set_offload->current_offset;
4147 cmd->current_length = apf_set_offload->current_length;
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304148
Nachiket Kukadee547a482018-05-22 16:43:30 +05304149 if (apf_set_offload->total_length) {
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304150 buf_ptr +=
4151 sizeof(wmi_bpf_set_vdev_instructions_cmd_fixed_param);
4152 WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_BYTE, len_aligned);
4153 buf_ptr += WMI_TLV_HDR_SIZE;
Nachiket Kukadee547a482018-05-22 16:43:30 +05304154 qdf_mem_copy(buf_ptr, apf_set_offload->program,
4155 apf_set_offload->current_length);
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304156 }
4157
4158 if (wmi_unified_cmd_send(wma->wmi_handle, wmi_buf, len,
Nachiket Kukadee547a482018-05-22 16:43:30 +05304159 WMI_BPF_SET_VDEV_INSTRUCTIONS_CMDID)) {
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304160 wmi_buf_free(wmi_buf);
4161 return QDF_STATUS_E_FAILURE;
4162 }
Nachiket Kukadee547a482018-05-22 16:43:30 +05304163 WMA_LOGD(FL("APF offload enabled in fw"));
Rajeev Kumar90016022017-08-22 14:00:48 -07004164
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304165 return QDF_STATUS_SUCCESS;
4166}
Peng Xu8fdaa492016-06-22 10:20:47 -07004167
Nachiket Kukade177b5b02018-05-22 20:52:17 +05304168QDF_STATUS wma_send_apf_enable_cmd(WMA_HANDLE handle, uint8_t vdev_id,
4169 bool apf_enable)
4170{
4171 QDF_STATUS status = QDF_STATUS_SUCCESS;
4172 tp_wma_handle wma = (tp_wma_handle) handle;
4173
4174 if (!wma || !wma->wmi_handle) {
4175 WMA_LOGE(FL("WMA is closed, can not issue get APF capab"));
4176 return QDF_STATUS_E_INVAL;
4177 }
4178
4179 if (!WMI_SERVICE_IS_ENABLED(wma->wmi_service_bitmap,
4180 WMI_SERVICE_BPF_OFFLOAD)) {
4181 WMA_LOGE(FL("APF cababilities feature bit not enabled"));
4182 return QDF_STATUS_E_FAILURE;
4183 }
4184
4185 status = wmi_unified_send_apf_enable_cmd(wma->wmi_handle, vdev_id,
4186 apf_enable);
4187 if (QDF_IS_STATUS_ERROR(status)) {
4188 WMA_LOGE("Failed to send apf enable/disable cmd");
4189 return QDF_STATUS_E_FAILURE;
4190 }
4191
4192 if (apf_enable)
4193 WMA_LOGD("Sent APF Enable on vdevid: %d", vdev_id);
4194 else
4195 WMA_LOGD("Sent APF Disable on vdevid: %d", vdev_id);
4196
4197 return status;
4198}
4199
4200QDF_STATUS
4201wma_send_apf_write_work_memory_cmd(WMA_HANDLE handle,
4202 struct wmi_apf_write_memory_params
4203 *write_params)
4204{
4205 QDF_STATUS status = QDF_STATUS_SUCCESS;
4206 tp_wma_handle wma = (tp_wma_handle) handle;
4207
4208 if (!wma || !wma->wmi_handle) {
4209 WMA_LOGE(FL("WMA is closed, can not issue write APF mem"));
4210 return QDF_STATUS_E_INVAL;
4211 }
4212
4213 if (!WMI_SERVICE_IS_ENABLED(wma->wmi_service_bitmap,
4214 WMI_SERVICE_BPF_OFFLOAD)) {
4215 WMA_LOGE(FL("APF cababilities feature bit not enabled"));
4216 return QDF_STATUS_E_FAILURE;
4217 }
4218
4219 if (wmi_unified_send_apf_write_work_memory_cmd(wma->wmi_handle,
4220 write_params)) {
4221 WMA_LOGE(FL("Failed to send APF write mem command"));
4222 return QDF_STATUS_E_FAILURE;
4223 }
4224
4225 WMA_LOGD("Sent APF wite mem on vdevid: %d", write_params->vdev_id);
4226 return status;
4227}
4228
4229int wma_apf_read_work_memory_event_handler(void *handle, uint8_t *evt_buf,
4230 uint32_t len)
4231{
4232 tp_wma_handle wma_handle;
4233 wmi_unified_t wmi_handle;
4234 struct wmi_apf_read_memory_resp_event_params evt_params = {0};
4235 QDF_STATUS status;
Jeff Johnson9f18aa72018-12-02 12:05:12 -08004236 struct mac_context *pmac = cds_get_context(QDF_MODULE_ID_PE);
Nachiket Kukade177b5b02018-05-22 20:52:17 +05304237
Yeshwanth Sriram Guntukacbe61442018-08-23 18:08:44 +05304238 WMA_LOGD(FL("handle:%pK event:%pK len:%u"), handle, evt_buf, len);
Nachiket Kukade177b5b02018-05-22 20:52:17 +05304239
4240 wma_handle = handle;
4241 if (!wma_handle) {
4242 WMA_LOGE(FL("NULL wma_handle"));
4243 return -EINVAL;
4244 }
4245
4246 wmi_handle = wma_handle->wmi_handle;
4247 if (!wmi_handle) {
4248 WMA_LOGE(FL("NULL wmi_handle"));
4249 return -EINVAL;
4250 }
4251
4252 if (!pmac) {
4253 WMA_LOGE(FL("Invalid pmac"));
4254 return -EINVAL;
4255 }
4256
4257 if (!pmac->sme.apf_read_mem_cb) {
4258 WMA_LOGE(FL("Callback not registered"));
4259 return -EINVAL;
4260 }
4261
4262 status = wmi_extract_apf_read_memory_resp_event(wmi_handle,
4263 evt_buf, &evt_params);
4264 if (QDF_IS_STATUS_ERROR(status)) {
4265 WMA_LOGE(FL("Event extract failure: %d"), status);
4266 return -EINVAL;
4267 }
4268
Jeff Johnson6aaaa992018-06-30 10:43:04 -07004269 pmac->sme.apf_read_mem_cb(pmac->hdd_handle, &evt_params);
Nachiket Kukade177b5b02018-05-22 20:52:17 +05304270
4271 return 0;
4272}
4273
4274QDF_STATUS wma_send_apf_read_work_memory_cmd(WMA_HANDLE handle,
4275 struct wmi_apf_read_memory_params
4276 *read_params)
4277{
4278 QDF_STATUS status = QDF_STATUS_SUCCESS;
4279 tp_wma_handle wma = (tp_wma_handle) handle;
4280
4281 if (!wma || !wma->wmi_handle) {
4282 WMA_LOGE(FL("WMA is closed, can not issue read APF memory"));
4283 return QDF_STATUS_E_INVAL;
4284 }
4285
4286 if (!WMI_SERVICE_IS_ENABLED(wma->wmi_service_bitmap,
4287 WMI_SERVICE_BPF_OFFLOAD)) {
4288 WMA_LOGE(FL("APF cababilities feature bit not enabled"));
4289 return QDF_STATUS_E_FAILURE;
4290 }
4291
4292 if (wmi_unified_send_apf_read_work_memory_cmd(wma->wmi_handle,
4293 read_params)) {
4294 WMA_LOGE(FL("Failed to send APF read memory command"));
4295 return QDF_STATUS_E_FAILURE;
4296 }
4297
4298 WMA_LOGD("Sent APF read memory on vdevid: %d", read_params->vdev_id);
4299 return status;
4300}
4301#endif /* FEATURE_WLAN_APF */
4302
Abhishek Ambure74709762019-05-27 19:43:26 +05304303QDF_STATUS wma_set_tx_rx_aggr_size(uint8_t vdev_id,
4304 uint32_t tx_size,
4305 uint32_t rx_size,
4306 wmi_vdev_custom_aggr_type_t aggr_type)
Padma, Santhosh Kumara7119672016-08-16 16:05:14 +05304307{
4308 tp_wma_handle wma_handle;
4309 wmi_vdev_set_custom_aggr_size_cmd_fixed_param *cmd;
4310 int32_t len;
4311 wmi_buf_t buf;
4312 u_int8_t *buf_ptr;
4313 int ret;
4314
4315 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
4316
Padma, Santhosh Kumara7119672016-08-16 16:05:14 +05304317
4318 if (!wma_handle) {
4319 WMA_LOGE("%s: WMA context is invald!", __func__);
4320 return QDF_STATUS_E_INVAL;
4321 }
4322
4323 len = sizeof(*cmd);
4324 buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07004325 if (!buf)
Padma, Santhosh Kumara7119672016-08-16 16:05:14 +05304326 return QDF_STATUS_E_NOMEM;
Padma, Santhosh Kumara7119672016-08-16 16:05:14 +05304327
4328 buf_ptr = (u_int8_t *) wmi_buf_data(buf);
4329 cmd = (wmi_vdev_set_custom_aggr_size_cmd_fixed_param *) buf_ptr;
Arif Hussain0e246802018-05-01 18:13:44 -07004330 qdf_mem_zero(cmd, sizeof(*cmd));
Padma, Santhosh Kumara7119672016-08-16 16:05:14 +05304331
4332 WMITLV_SET_HDR(&cmd->tlv_header,
4333 WMITLV_TAG_STRUC_wmi_vdev_set_custom_aggr_size_cmd_fixed_param,
4334 WMITLV_GET_STRUCT_TLVLEN(
4335 wmi_vdev_set_custom_aggr_size_cmd_fixed_param));
4336
Abhishek Ambure74709762019-05-27 19:43:26 +05304337 cmd->vdev_id = vdev_id;
4338 cmd->tx_aggr_size = tx_size;
4339 cmd->rx_aggr_size = rx_size;
Arif Hussain0e246802018-05-01 18:13:44 -07004340 /* bit 2 (aggr_type): TX Aggregation Type (0=A-MPDU, 1=A-MSDU) */
Abhishek Ambure74709762019-05-27 19:43:26 +05304341 if (aggr_type == WMI_VDEV_CUSTOM_AGGR_TYPE_AMSDU)
Arif Hussain0e246802018-05-01 18:13:44 -07004342 cmd->enable_bitmap |= 0x04;
Padma, Santhosh Kumara7119672016-08-16 16:05:14 +05304343
Arif Hussain0e246802018-05-01 18:13:44 -07004344 WMA_LOGD("tx aggr: %d rx aggr: %d vdev: %d enable_bitmap %d",
4345 cmd->tx_aggr_size, cmd->rx_aggr_size, cmd->vdev_id,
4346 cmd->enable_bitmap);
Padma, Santhosh Kumara7119672016-08-16 16:05:14 +05304347
4348 ret = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
4349 WMI_VDEV_SET_CUSTOM_AGGR_SIZE_CMDID);
4350 if (ret) {
Padma, Santhosh Kumara7119672016-08-16 16:05:14 +05304351 wmi_buf_free(buf);
4352 return QDF_STATUS_E_FAILURE;
4353 }
4354
4355 return QDF_STATUS_SUCCESS;
4356}
4357
Abhishek Ambure74709762019-05-27 19:43:26 +05304358QDF_STATUS wma_set_tx_rx_aggr_size_per_ac(WMA_HANDLE handle,
4359 uint8_t vdev_id,
4360 struct wlan_mlme_qos *qos_aggr,
4361 wmi_vdev_custom_aggr_type_t aggr_type)
Paul Zhangee09f8e2018-04-23 16:11:32 +08004362{
Paul Zhangee09f8e2018-04-23 16:11:32 +08004363 wmi_vdev_set_custom_aggr_size_cmd_fixed_param *cmd;
4364 int32_t len;
4365 wmi_buf_t buf;
4366 u_int8_t *buf_ptr;
4367 int ret;
4368 int queue_num;
4369 uint32_t tx_aggr_size[4];
Abhishek Ambure74709762019-05-27 19:43:26 +05304370 tp_wma_handle wma_handle = (tp_wma_handle)handle;
Paul Zhangee09f8e2018-04-23 16:11:32 +08004371
4372 if (!wma_handle) {
4373 WMA_LOGE("%s: WMA context is invald!", __func__);
4374 return QDF_STATUS_E_INVAL;
4375 }
4376
Abhishek Ambure74709762019-05-27 19:43:26 +05304377 tx_aggr_size[0] = qos_aggr->tx_aggregation_size_be;
4378 tx_aggr_size[1] = qos_aggr->tx_aggregation_size_bk;
4379 tx_aggr_size[2] = qos_aggr->tx_aggregation_size_vi;
4380 tx_aggr_size[3] = qos_aggr->tx_aggregation_size_vo;
Paul Zhangee09f8e2018-04-23 16:11:32 +08004381
4382 for (queue_num = 0; queue_num < 4; queue_num++) {
4383 if (tx_aggr_size[queue_num] == 0)
4384 continue;
4385
4386 len = sizeof(*cmd);
4387 buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07004388 if (!buf)
Paul Zhangee09f8e2018-04-23 16:11:32 +08004389 return QDF_STATUS_E_NOMEM;
Paul Zhangee09f8e2018-04-23 16:11:32 +08004390
4391 buf_ptr = (u_int8_t *)wmi_buf_data(buf);
4392 cmd = (wmi_vdev_set_custom_aggr_size_cmd_fixed_param *)buf_ptr;
Arif Hussain0e246802018-05-01 18:13:44 -07004393 qdf_mem_zero(cmd, sizeof(*cmd));
Paul Zhangee09f8e2018-04-23 16:11:32 +08004394
4395 WMITLV_SET_HDR(&cmd->tlv_header,
4396 WMITLV_TAG_STRUC_wmi_vdev_set_custom_aggr_size_cmd_fixed_param,
4397 WMITLV_GET_STRUCT_TLVLEN(
4398 wmi_vdev_set_custom_aggr_size_cmd_fixed_param));
4399
Abhishek Ambure74709762019-05-27 19:43:26 +05304400 cmd->vdev_id = vdev_id;
4401 cmd->rx_aggr_size = qos_aggr->rx_aggregation_size;
Paul Zhangee09f8e2018-04-23 16:11:32 +08004402 cmd->tx_aggr_size = tx_aggr_size[queue_num];
4403 /* bit 5: tx_ac_enable, if set, ac bitmap is valid. */
4404 cmd->enable_bitmap = 0x20 | queue_num;
Arif Hussain0e246802018-05-01 18:13:44 -07004405 /* bit 2 (aggr_type): TX Aggregation Type (0=A-MPDU, 1=A-MSDU) */
Abhishek Ambure74709762019-05-27 19:43:26 +05304406 if (aggr_type == WMI_VDEV_CUSTOM_AGGR_TYPE_AMSDU)
Arif Hussain0e246802018-05-01 18:13:44 -07004407 cmd->enable_bitmap |= 0x04;
Paul Zhangee09f8e2018-04-23 16:11:32 +08004408
Arif Hussain0e246802018-05-01 18:13:44 -07004409 WMA_LOGD("queue_num: %d, tx aggr: %d rx aggr: %d vdev: %d, bitmap: %d",
Paul Zhangee09f8e2018-04-23 16:11:32 +08004410 queue_num, cmd->tx_aggr_size,
Arif Hussain0e246802018-05-01 18:13:44 -07004411 cmd->rx_aggr_size, cmd->vdev_id,
4412 cmd->enable_bitmap);
Paul Zhangee09f8e2018-04-23 16:11:32 +08004413
4414 ret = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
4415 WMI_VDEV_SET_CUSTOM_AGGR_SIZE_CMDID);
4416 if (ret) {
Paul Zhangee09f8e2018-04-23 16:11:32 +08004417 wmi_buf_free(buf);
4418 return QDF_STATUS_E_FAILURE;
4419 }
4420 }
4421
4422 return QDF_STATUS_SUCCESS;
4423}
4424
stonez26388d02018-10-17 13:37:48 +08004425static QDF_STATUS wma_set_sw_retry_by_qos(
4426 tp_wma_handle handle, uint8_t vdev_id,
4427 wmi_vdev_custom_sw_retry_type_t retry_type,
4428 wmi_traffic_ac ac_type,
4429 uint32_t sw_retry)
Paul Zhang33fae272018-04-23 16:19:00 +08004430{
Paul Zhang33fae272018-04-23 16:19:00 +08004431 wmi_vdev_set_custom_sw_retry_th_cmd_fixed_param *cmd;
4432 int32_t len;
4433 wmi_buf_t buf;
4434 u_int8_t *buf_ptr;
4435 int ret;
Paul Zhang33fae272018-04-23 16:19:00 +08004436
stonez26388d02018-10-17 13:37:48 +08004437 len = sizeof(*cmd);
4438 buf = wmi_buf_alloc(handle->wmi_handle, len);
4439
4440 if (!buf)
4441 return QDF_STATUS_E_NOMEM;
4442
4443 buf_ptr = (u_int8_t *)wmi_buf_data(buf);
4444 cmd = (wmi_vdev_set_custom_sw_retry_th_cmd_fixed_param *)buf_ptr;
4445
4446 WMITLV_SET_HDR(&cmd->tlv_header,
4447 WMITLV_TAG_STRUC_wmi_vdev_set_custom_sw_retry_th_cmd_fixed_param,
4448 WMITLV_GET_STRUCT_TLVLEN(
4449 wmi_vdev_set_custom_sw_retry_th_cmd_fixed_param));
4450
4451 cmd->vdev_id = vdev_id;
4452 cmd->ac_type = ac_type;
4453 cmd->sw_retry_type = retry_type;
4454 cmd->sw_retry_th = sw_retry;
4455
4456 wma_debug("ac_type: %d re_type: %d threshold: %d vid: %d",
4457 cmd->ac_type, cmd->sw_retry_type,
4458 cmd->sw_retry_th, cmd->vdev_id);
4459
4460 ret = wmi_unified_cmd_send(handle->wmi_handle,
4461 buf, len,
4462 WMI_VDEV_SET_CUSTOM_SW_RETRY_TH_CMDID);
4463
4464 if (ret) {
4465 wmi_buf_free(buf);
4466 return QDF_STATUS_E_FAILURE;
4467 }
4468
4469 return QDF_STATUS_SUCCESS;
4470}
4471
Abhishek Ambure74709762019-05-27 19:43:26 +05304472QDF_STATUS wma_set_sw_retry_threshold_per_ac(WMA_HANDLE handle,
4473 uint8_t vdev_id,
4474 struct wlan_mlme_qos *qos_aggr)
stonez26388d02018-10-17 13:37:48 +08004475{
4476 QDF_STATUS ret;
stonez26388d02018-10-17 13:37:48 +08004477 int retry_type, queue_num;
4478 uint32_t tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_MAX][WMI_AC_MAX];
4479 uint32_t sw_retry;
Abhishek Ambure74709762019-05-27 19:43:26 +05304480 tp_wma_handle wma_handle = (tp_wma_handle)handle;
Paul Zhang33fae272018-04-23 16:19:00 +08004481
4482 if (!wma_handle) {
stonez26388d02018-10-17 13:37:48 +08004483 wma_err("%s: WMA context is invalid!", __func__);
Paul Zhang33fae272018-04-23 16:19:00 +08004484 return QDF_STATUS_E_INVAL;
4485 }
4486
stonez26388d02018-10-17 13:37:48 +08004487 tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_AGGR][WMI_AC_BE] =
Abhishek Ambure74709762019-05-27 19:43:26 +05304488 qos_aggr->tx_aggr_sw_retry_threshold_be;
stonez26388d02018-10-17 13:37:48 +08004489 tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_AGGR][WMI_AC_BK] =
Abhishek Ambure74709762019-05-27 19:43:26 +05304490 qos_aggr->tx_aggr_sw_retry_threshold_bk;
stonez26388d02018-10-17 13:37:48 +08004491 tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_AGGR][WMI_AC_VI] =
Abhishek Ambure74709762019-05-27 19:43:26 +05304492 qos_aggr->tx_aggr_sw_retry_threshold_vi;
stonez26388d02018-10-17 13:37:48 +08004493 tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_AGGR][WMI_AC_VO] =
Abhishek Ambure74709762019-05-27 19:43:26 +05304494 qos_aggr->tx_aggr_sw_retry_threshold_vo;
Paul Zhang33fae272018-04-23 16:19:00 +08004495
stonez26388d02018-10-17 13:37:48 +08004496 tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_NONAGGR][WMI_AC_BE] =
Abhishek Ambure74709762019-05-27 19:43:26 +05304497 qos_aggr->tx_non_aggr_sw_retry_threshold_be;
stonez26388d02018-10-17 13:37:48 +08004498 tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_NONAGGR][WMI_AC_BK] =
Abhishek Ambure74709762019-05-27 19:43:26 +05304499 qos_aggr->tx_non_aggr_sw_retry_threshold_bk;
stonez26388d02018-10-17 13:37:48 +08004500 tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_NONAGGR][WMI_AC_VI] =
Abhishek Ambure74709762019-05-27 19:43:26 +05304501 qos_aggr->tx_non_aggr_sw_retry_threshold_vi;
stonez26388d02018-10-17 13:37:48 +08004502 tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_NONAGGR][WMI_AC_VO] =
Abhishek Ambure74709762019-05-27 19:43:26 +05304503 qos_aggr->tx_non_aggr_sw_retry_threshold_vo;
Paul Zhang33fae272018-04-23 16:19:00 +08004504
stonez26388d02018-10-17 13:37:48 +08004505 retry_type = WMI_VDEV_CUSTOM_SW_RETRY_TYPE_NONAGGR;
4506 while (retry_type < WMI_VDEV_CUSTOM_SW_RETRY_TYPE_MAX) {
4507 for (queue_num = 0; queue_num < WMI_AC_MAX; queue_num++) {
4508 if (tx_sw_retry[retry_type][queue_num] == 0)
4509 continue;
Paul Zhang33fae272018-04-23 16:19:00 +08004510
stonez26388d02018-10-17 13:37:48 +08004511 sw_retry = tx_sw_retry[retry_type][queue_num];
4512 ret = wma_set_sw_retry_by_qos(wma_handle,
4513 vdev_id,
4514 retry_type,
4515 queue_num,
4516 sw_retry);
Paul Zhang33fae272018-04-23 16:19:00 +08004517
stonez26388d02018-10-17 13:37:48 +08004518 if (QDF_IS_STATUS_ERROR(ret))
4519 return ret;
Paul Zhang33fae272018-04-23 16:19:00 +08004520 }
stonez26388d02018-10-17 13:37:48 +08004521 retry_type++;
Paul Zhang33fae272018-04-23 16:19:00 +08004522 }
4523
4524 return QDF_STATUS_SUCCESS;
4525}
4526
Paul Zhanga25f75a2019-04-12 17:11:14 +08004527QDF_STATUS wma_set_sw_retry_threshold(uint8_t vdev_id, uint32_t retry,
4528 uint32_t param_id)
4529{
4530 uint32_t max, min;
4531 uint32_t ret;
4532
4533 if (param_id == WMI_PDEV_PARAM_AGG_SW_RETRY_TH) {
4534 max = cfg_max(CFG_TX_AGGR_SW_RETRY);
4535 min = cfg_min(CFG_TX_AGGR_SW_RETRY);
4536 } else {
4537 max = cfg_max(CFG_TX_NON_AGGR_SW_RETRY);
4538 min = cfg_min(CFG_TX_NON_AGGR_SW_RETRY);
4539 }
4540
4541 retry = (retry > max) ? max : retry;
4542 retry = (retry < min) ? min : retry;
4543
4544 ret = wma_cli_set_command(vdev_id, param_id, retry, PDEV_CMD);
4545 if (ret)
4546 return QDF_STATUS_E_IO;
4547
4548 return QDF_STATUS_SUCCESS;
4549}
Abhishek Ambure74709762019-05-27 19:43:26 +05304550
Anurag Chouhanbf5e0e22016-09-12 12:54:09 +05304551/**
4552 * wma_process_fw_test_cmd() - send unit test command to fw.
4553 * @handle: wma handle
4554 * @wma_fwtest: fw test command
4555 *
4556 * This function send fw test command to fw.
4557 *
4558 * Return: none
4559 */
Bala Venkateshe45f03d2019-03-25 16:00:42 +05304560QDF_STATUS wma_process_fw_test_cmd(WMA_HANDLE handle,
4561 struct set_fwtest_params *wma_fwtest)
Anurag Chouhanbf5e0e22016-09-12 12:54:09 +05304562{
4563 tp_wma_handle wma_handle = (tp_wma_handle) handle;
4564
4565 if (!wma_handle || !wma_handle->wmi_handle) {
4566 WMA_LOGE("%s: WMA is closed, can not issue fw test cmd",
4567 __func__);
Bala Venkateshe45f03d2019-03-25 16:00:42 +05304568 return QDF_STATUS_E_FAILURE;
Anurag Chouhanbf5e0e22016-09-12 12:54:09 +05304569 }
4570
4571 if (wmi_unified_fw_test_cmd(wma_handle->wmi_handle,
4572 (struct set_fwtest_params *)wma_fwtest)) {
4573 WMA_LOGE("%s: Failed to issue fw test cmd",
4574 __func__);
Bala Venkateshe45f03d2019-03-25 16:00:42 +05304575 return QDF_STATUS_E_FAILURE;
Anurag Chouhanbf5e0e22016-09-12 12:54:09 +05304576 }
Bala Venkateshe45f03d2019-03-25 16:00:42 +05304577 return QDF_STATUS_SUCCESS;
Anurag Chouhanbf5e0e22016-09-12 12:54:09 +05304578}
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +05304579
4580/**
4581 * wma_enable_disable_caevent_ind() - Issue WMI command to enable or
4582 * disable ca event indication
4583 * @wma: wma handler
4584 * @val: boolean value true or false
4585 *
4586 * Return: QDF_STATUS
4587 */
4588QDF_STATUS wma_enable_disable_caevent_ind(tp_wma_handle wma, uint8_t val)
4589{
4590 WMI_CHAN_AVOID_RPT_ALLOW_CMD_fixed_param *cmd;
4591 wmi_buf_t wmi_buf;
4592 uint8_t *buf_ptr;
4593 uint32_t len;
4594
4595 if (!wma || !wma->wmi_handle) {
4596 WMA_LOGE(FL("WMA is closed, can not issue set/clear CA"));
4597 return QDF_STATUS_E_INVAL;
4598 }
4599
4600 len = sizeof(*cmd);
4601 wmi_buf = wmi_buf_alloc(wma->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07004602 if (!wmi_buf)
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +05304603 return QDF_STATUS_E_NOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -07004604
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +05304605 buf_ptr = (uint8_t *) wmi_buf_data(wmi_buf);
4606 cmd = (WMI_CHAN_AVOID_RPT_ALLOW_CMD_fixed_param *) buf_ptr;
4607 WMITLV_SET_HDR(&cmd->tlv_header,
4608 WMITLV_TAG_STRUC_WMI_CHAN_AVOID_RPT_ALLOW_CMD_fixed_param,
4609 WMITLV_GET_STRUCT_TLVLEN(
4610 WMI_CHAN_AVOID_RPT_ALLOW_CMD_fixed_param));
4611 cmd->rpt_allow = val;
4612 if (wmi_unified_cmd_send(wma->wmi_handle, wmi_buf, len,
4613 WMI_CHAN_AVOID_RPT_ALLOW_CMDID)) {
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +05304614 wmi_buf_free(wmi_buf);
4615 return QDF_STATUS_E_FAILURE;
4616 }
4617
4618 return QDF_STATUS_SUCCESS;
4619}
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +05304620
Jeff Johnsonf0e54b02017-12-18 15:22:25 -08004621static wma_sar_cb sar_callback;
4622static void *sar_context;
4623
4624static int wma_sar_event_handler(void *handle, uint8_t *evt_buf, uint32_t len)
4625{
4626 tp_wma_handle wma_handle;
4627 wmi_unified_t wmi_handle;
jiadb17a2972018-01-25 10:02:31 +08004628 struct sar_limit_event *event;
Jeff Johnsonf0e54b02017-12-18 15:22:25 -08004629 wma_sar_cb callback;
4630 QDF_STATUS status;
4631
4632 WMA_LOGI(FL("handle:%pK event:%pK len:%u"), handle, evt_buf, len);
4633
4634 wma_handle = handle;
4635 if (!wma_handle) {
4636 WMA_LOGE(FL("NULL wma_handle"));
4637 return QDF_STATUS_E_INVAL;
4638 }
4639
4640 wmi_handle = wma_handle->wmi_handle;
4641 if (!wmi_handle) {
4642 WMA_LOGE(FL("NULL wmi_handle"));
4643 return QDF_STATUS_E_INVAL;
4644 }
4645
jiadb17a2972018-01-25 10:02:31 +08004646 event = qdf_mem_malloc(sizeof(*event));
Arif Hussain157263f2018-10-03 13:07:15 -07004647 if (!event)
jiadb17a2972018-01-25 10:02:31 +08004648 return QDF_STATUS_E_NOMEM;
jiadb17a2972018-01-25 10:02:31 +08004649
Jeff Johnsonf0e54b02017-12-18 15:22:25 -08004650 status = wmi_unified_extract_sar_limit_event(wmi_handle,
jiadb17a2972018-01-25 10:02:31 +08004651 evt_buf, event);
Jeff Johnsonf0e54b02017-12-18 15:22:25 -08004652 if (QDF_IS_STATUS_ERROR(status)) {
4653 WMA_LOGE(FL("Event extract failure: %d"), status);
jiadb17a2972018-01-25 10:02:31 +08004654 qdf_mem_free(event);
Jeff Johnsonf0e54b02017-12-18 15:22:25 -08004655 return QDF_STATUS_E_INVAL;
4656 }
4657
4658 callback = sar_callback;
4659 sar_callback = NULL;
4660 if (callback)
jiadb17a2972018-01-25 10:02:31 +08004661 callback(sar_context, event);
4662
4663 qdf_mem_free(event);
Jeff Johnsonf0e54b02017-12-18 15:22:25 -08004664
4665 return 0;
4666}
4667
4668QDF_STATUS wma_sar_register_event_handlers(WMA_HANDLE handle)
4669{
4670 tp_wma_handle wma_handle = handle;
4671 wmi_unified_t wmi_handle;
4672
4673 if (!wma_handle) {
4674 WMA_LOGE(FL("NULL wma_handle"));
4675 return QDF_STATUS_E_INVAL;
4676 }
4677
4678 wmi_handle = wma_handle->wmi_handle;
4679 if (!wmi_handle) {
4680 WMA_LOGE(FL("NULL wmi_handle"));
4681 return QDF_STATUS_E_INVAL;
4682 }
4683
4684 return wmi_unified_register_event_handler(wmi_handle,
4685 wmi_sar_get_limits_event_id,
4686 wma_sar_event_handler,
4687 WMA_RX_WORK_CTX);
4688}
4689
4690QDF_STATUS wma_get_sar_limit(WMA_HANDLE handle,
4691 wma_sar_cb callback, void *context)
4692{
4693 tp_wma_handle wma_handle = handle;
4694 wmi_unified_t wmi_handle;
4695 QDF_STATUS status;
4696
4697 if (!wma_handle) {
4698 WMA_LOGE(FL("NULL wma_handle"));
4699 return QDF_STATUS_E_INVAL;
4700 }
4701
4702 wmi_handle = wma_handle->wmi_handle;
4703 if (!wmi_handle) {
4704 WMA_LOGE(FL("NULL wmi_handle"));
4705 return QDF_STATUS_E_INVAL;
4706 }
4707
4708 sar_callback = callback;
4709 sar_context = context;
4710 status = wmi_unified_get_sar_limit_cmd(wmi_handle);
4711 if (QDF_IS_STATUS_ERROR(status)) {
4712 WMA_LOGE(FL("wmi_unified_get_sar_limit_cmd() error: %u"),
4713 status);
4714 sar_callback = NULL;
4715 }
4716
4717 return status;
4718}
4719
Kabilan Kannan3c0a7352016-12-02 18:49:38 -08004720QDF_STATUS wma_set_sar_limit(WMA_HANDLE handle,
4721 struct sar_limit_cmd_params *sar_limit_params)
4722{
4723 int ret;
4724 tp_wma_handle wma = (tp_wma_handle) handle;
4725
4726 if (!wma || !wma->wmi_handle) {
4727 WMA_LOGE("%s: WMA is closed, can not issue set sar limit msg",
4728 __func__);
4729 return QDF_STATUS_E_INVAL;
4730 }
4731
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07004732 if (!sar_limit_params) {
Kabilan Kannan3c0a7352016-12-02 18:49:38 -08004733 WMA_LOGE("%s: set sar limit ptr NULL",
4734 __func__);
4735 return QDF_STATUS_E_INVAL;
4736 }
4737
4738 ret = wmi_unified_send_sar_limit_cmd(wma->wmi_handle,
4739 sar_limit_params);
4740
4741 return ret;
4742}
4743
Dundi Raviteja3b637092018-09-12 13:42:50 +05304744QDF_STATUS wma_send_coex_config_cmd(WMA_HANDLE wma_handle,
4745 struct coex_config_params *coex_cfg_params)
4746{
4747 tp_wma_handle wma = (tp_wma_handle)wma_handle;
4748
4749 if (!wma || !wma->wmi_handle) {
4750 WMA_LOGE("%s: WMA is closed, can not issue coex config command",
4751 __func__);
4752 return QDF_STATUS_E_INVAL;
4753 }
4754
4755 if (!coex_cfg_params) {
4756 WMA_LOGE("%s: coex cfg params ptr NULL", __func__);
4757 return QDF_STATUS_E_INVAL;
4758 }
4759
4760 return wmi_unified_send_coex_config_cmd(wma->wmi_handle,
4761 coex_cfg_params);
4762}
4763
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05304764/**
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05304765 * wma_get_arp_stats_handler() - handle arp stats data
4766 * indicated by FW
4767 * @handle: wma context
4768 * @data: event buffer
4769 * @data len: length of event buffer
4770 *
4771 * Return: 0 on success
4772 */
4773int wma_get_arp_stats_handler(void *handle, uint8_t *data,
4774 uint32_t data_len)
4775{
4776 WMI_VDEV_GET_ARP_STAT_EVENTID_param_tlvs *param_buf;
4777 wmi_vdev_get_arp_stats_event_fixed_param *data_event;
Poddar, Siddarth465330e2018-01-08 18:23:54 +05304778 wmi_vdev_get_connectivity_check_stats *connect_stats_event;
4779 uint8_t *buf_ptr;
Naveen Rawat6e45d9a2018-04-27 16:35:59 -07004780 struct rsp_stats rsp = {0};
Jeff Johnson9f18aa72018-12-02 12:05:12 -08004781 struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05304782
4783 if (!mac) {
4784 WMA_LOGE("%s: Invalid mac context", __func__);
4785 return -EINVAL;
4786 }
4787
4788 if (!mac->sme.get_arp_stats_cb) {
4789 WMA_LOGE("%s: Callback not registered", __func__);
4790 return -EINVAL;
4791 }
4792
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07004793 if (!data) {
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05304794 WMA_LOGE("%s: invalid pointer", __func__);
4795 return -EINVAL;
4796 }
4797 param_buf = (WMI_VDEV_GET_ARP_STAT_EVENTID_param_tlvs *)data;
4798 if (!param_buf) {
4799 WMA_LOGE("%s: Invalid get arp stats event", __func__);
4800 return -EINVAL;
4801 }
4802 data_event = param_buf->fixed_param;
4803 if (!data_event) {
4804 WMA_LOGE("%s: Invalid get arp stats data event", __func__);
4805 return -EINVAL;
4806 }
4807 rsp.arp_req_enqueue = data_event->arp_req_enqueue;
4808 rsp.vdev_id = data_event->vdev_id;
4809 rsp.arp_req_tx_success = data_event->arp_req_tx_success;
4810 rsp.arp_req_tx_failure = data_event->arp_req_tx_failure;
4811 rsp.arp_rsp_recvd = data_event->arp_rsp_recvd;
4812 rsp.out_of_order_arp_rsp_drop_cnt =
4813 data_event->out_of_order_arp_rsp_drop_cnt;
4814 rsp.dad_detected = data_event->dad_detected;
4815 rsp.connect_status = data_event->connect_status;
4816 rsp.ba_session_establishment_status =
4817 data_event->ba_session_establishment_status;
4818
Poddar, Siddarth465330e2018-01-08 18:23:54 +05304819 buf_ptr = (uint8_t *)data_event;
4820 buf_ptr = buf_ptr + sizeof(wmi_vdev_get_arp_stats_event_fixed_param) +
4821 WMI_TLV_HDR_SIZE;
4822 connect_stats_event = (wmi_vdev_get_connectivity_check_stats *)buf_ptr;
4823
4824 if (((connect_stats_event->tlv_header & 0xFFFF0000) >> 16 ==
4825 WMITLV_TAG_STRUC_wmi_vdev_get_connectivity_check_stats)) {
4826 rsp.connect_stats_present = true;
4827 rsp.tcp_ack_recvd = connect_stats_event->tcp_ack_recvd;
4828 rsp.icmpv4_rsp_recvd = connect_stats_event->icmpv4_rsp_recvd;
4829 WMA_LOGD("tcp_ack_recvd %d icmpv4_rsp_recvd %d",
4830 connect_stats_event->tcp_ack_recvd,
4831 connect_stats_event->icmpv4_rsp_recvd);
4832 }
4833
Jeff Johnson6aaaa992018-06-30 10:43:04 -07004834 mac->sme.get_arp_stats_cb(mac->hdd_handle, &rsp,
Dundi Raviteja3bcf3a82018-05-22 13:24:18 +05304835 mac->sme.get_arp_stats_context);
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05304836
4837 return 0;
4838}
4839
4840/**
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05304841 * wma_unified_power_debug_stats_event_handler() - WMA handler function to
4842 * handle Power stats event from firmware
4843 * @handle: Pointer to wma handle
4844 * @cmd_param_info: Pointer to Power stats event TLV
4845 * @len: Length of the cmd_param_info
4846 *
4847 * Return: 0 on success, error number otherwise
4848 */
4849#ifdef WLAN_POWER_DEBUGFS
4850int wma_unified_power_debug_stats_event_handler(void *handle,
4851 uint8_t *cmd_param_info, uint32_t len)
4852{
4853 WMI_PDEV_CHIP_POWER_STATS_EVENTID_param_tlvs *param_tlvs;
4854 struct power_stats_response *power_stats_results;
4855 wmi_pdev_chip_power_stats_event_fixed_param *param_buf;
4856 uint32_t power_stats_len, stats_registers_len, *debug_registers;
4857
Jeff Johnson9f18aa72018-12-02 12:05:12 -08004858 struct mac_context *mac = (struct mac_context *)cds_get_context(QDF_MODULE_ID_PE);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004859
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05304860 param_tlvs =
4861 (WMI_PDEV_CHIP_POWER_STATS_EVENTID_param_tlvs *) cmd_param_info;
4862
4863 param_buf = (wmi_pdev_chip_power_stats_event_fixed_param *)
4864 param_tlvs->fixed_param;
4865 if (!mac || !mac->sme.power_stats_resp_callback) {
4866 WMA_LOGD("%s: NULL mac ptr or HDD callback is null", __func__);
4867 return -EINVAL;
4868 }
4869
4870 if (!param_buf) {
4871 WMA_LOGD("%s: NULL power stats event fixed param", __func__);
4872 return -EINVAL;
4873 }
4874
Sandeep Puligilla2f931532017-09-20 16:27:43 -07004875 if (param_buf->num_debug_register > ((WMI_SVC_MSG_MAX_SIZE -
4876 sizeof(wmi_pdev_chip_power_stats_event_fixed_param)) /
Himanshu Agarwal82218792017-12-22 14:00:01 +05304877 sizeof(uint32_t)) ||
4878 param_buf->num_debug_register > param_tlvs->num_debug_registers) {
Sandeep Puligilla2f931532017-09-20 16:27:43 -07004879 WMA_LOGE("excess payload: LEN num_debug_register:%u",
4880 param_buf->num_debug_register);
4881 return -EINVAL;
4882 }
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05304883 debug_registers = param_tlvs->debug_registers;
4884 stats_registers_len =
4885 (sizeof(uint32_t) * param_buf->num_debug_register);
4886 power_stats_len = stats_registers_len + sizeof(*power_stats_results);
4887 power_stats_results = qdf_mem_malloc(power_stats_len);
Arif Hussain157263f2018-10-03 13:07:15 -07004888 if (!power_stats_results)
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05304889 return -ENOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -07004890
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05304891 WMA_LOGD("Cumulative sleep time %d cumulative total on time %d deep sleep enter counter %d last deep sleep enter tstamp ts %d debug registers fmt %d num debug register %d",
4892 param_buf->cumulative_sleep_time_ms,
4893 param_buf->cumulative_total_on_time_ms,
4894 param_buf->deep_sleep_enter_counter,
4895 param_buf->last_deep_sleep_enter_tstamp_ms,
4896 param_buf->debug_register_fmt,
4897 param_buf->num_debug_register);
4898
4899 power_stats_results->cumulative_sleep_time_ms
4900 = param_buf->cumulative_sleep_time_ms;
4901 power_stats_results->cumulative_total_on_time_ms
4902 = param_buf->cumulative_total_on_time_ms;
4903 power_stats_results->deep_sleep_enter_counter
4904 = param_buf->deep_sleep_enter_counter;
4905 power_stats_results->last_deep_sleep_enter_tstamp_ms
4906 = param_buf->last_deep_sleep_enter_tstamp_ms;
4907 power_stats_results->debug_register_fmt
4908 = param_buf->debug_register_fmt;
4909 power_stats_results->num_debug_register
4910 = param_buf->num_debug_register;
4911
4912 power_stats_results->debug_registers
4913 = (uint32_t *)(power_stats_results + 1);
4914
4915 qdf_mem_copy(power_stats_results->debug_registers,
4916 debug_registers, stats_registers_len);
4917
4918 mac->sme.power_stats_resp_callback(power_stats_results,
4919 mac->sme.power_debug_stats_context);
4920 qdf_mem_free(power_stats_results);
4921 return 0;
4922}
4923#else
4924int wma_unified_power_debug_stats_event_handler(void *handle,
4925 uint8_t *cmd_param_info, uint32_t len)
4926{
4927 return 0;
4928}
4929#endif
Arunk Khandavallica56d4b2018-11-29 15:46:00 +05304930#ifdef WLAN_FEATURE_BEACON_RECEPTION_STATS
4931int wma_unified_beacon_debug_stats_event_handler(void *handle,
4932 uint8_t *cmd_param_info,
4933 uint32_t len)
4934{
4935 WMI_VDEV_BCN_RECEPTION_STATS_EVENTID_param_tlvs *param_tlvs;
4936 struct bcn_reception_stats_rsp *bcn_reception_stats;
4937 wmi_vdev_bcn_recv_stats_fixed_param *param_buf;
4938 struct mac_context *mac =
4939 (struct mac_context *)cds_get_context(QDF_MODULE_ID_PE);
4940
4941 param_tlvs =
4942 (WMI_VDEV_BCN_RECEPTION_STATS_EVENTID_param_tlvs *)cmd_param_info;
4943 if (!param_tlvs) {
4944 WMA_LOGA("%s: Invalid stats event", __func__);
4945 return -EINVAL;
4946 }
4947
4948 param_buf = (wmi_vdev_bcn_recv_stats_fixed_param *)
4949 param_tlvs->fixed_param;
4950 if (!param_buf || !mac || !mac->sme.beacon_stats_resp_callback) {
4951 WMA_LOGD("%s: NULL mac ptr or HDD callback is null", __func__);
4952 return -EINVAL;
4953 }
4954
4955 if (!param_buf) {
4956 WMA_LOGD("%s: NULL beacon stats event fixed param", __func__);
4957 return -EINVAL;
4958 }
4959
4960 bcn_reception_stats = qdf_mem_malloc(sizeof(*bcn_reception_stats));
4961 if (!bcn_reception_stats)
4962 return -ENOMEM;
4963
4964 bcn_reception_stats->total_bcn_cnt = param_buf->total_bcn_cnt;
4965 bcn_reception_stats->total_bmiss_cnt = param_buf->total_bmiss_cnt;
4966 bcn_reception_stats->vdev_id = param_buf->vdev_id;
4967
4968 WMA_LOGD("Total beacon count %d total beacon miss count %d vdev_id %d",
4969 param_buf->total_bcn_cnt,
4970 param_buf->total_bmiss_cnt,
4971 param_buf->vdev_id);
4972
4973 qdf_mem_copy(bcn_reception_stats->bmiss_bitmap,
4974 param_buf->bmiss_bitmap,
4975 MAX_BCNMISS_BITMAP * sizeof(uint32_t));
4976
4977 mac->sme.beacon_stats_resp_callback(bcn_reception_stats,
4978 mac->sme.beacon_stats_context);
4979 qdf_mem_free(bcn_reception_stats);
4980 return 0;
4981}
4982#else
4983int wma_unified_beacon_debug_stats_event_handler(void *handle,
4984 uint8_t *cmd_param_info,
4985 uint32_t len)
4986{
4987 return 0;
4988}
4989#endif
Kapil Gupta4f0c0c12017-02-07 15:21:15 +05304990
4991int wma_chan_info_event_handler(void *handle, uint8_t *event_buf,
4992 uint32_t len)
4993{
4994 tp_wma_handle wma = (tp_wma_handle)handle;
4995 WMI_CHAN_INFO_EVENTID_param_tlvs *param_buf;
4996 wmi_chan_info_event_fixed_param *event;
4997 struct scan_chan_info buf;
Jeff Johnson9f18aa72018-12-02 12:05:12 -08004998 struct mac_context *mac = NULL;
gaoleze5108942017-03-31 16:56:42 +08004999 struct lim_channel_status *channel_status;
Sandeep Puligillad7887022019-02-26 00:48:52 -08005000 bool snr_monitor_enabled;
Abhishek Ambure74709762019-05-27 19:43:26 +05305001 struct wlan_objmgr_vdev *vdev;
5002 enum QDF_OPMODE mode;
Kapil Gupta4f0c0c12017-02-07 15:21:15 +05305003
5004 WMA_LOGD("%s: Enter", __func__);
5005
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07005006 if (wma && wma->cds_context)
Jeff Johnson9f18aa72018-12-02 12:05:12 -08005007 mac = (struct mac_context *)cds_get_context(QDF_MODULE_ID_PE);
Kapil Gupta4f0c0c12017-02-07 15:21:15 +05305008
5009 if (!mac) {
5010 WMA_LOGE("%s: Invalid mac context", __func__);
5011 return -EINVAL;
5012 }
5013
Abhishek Ambure74709762019-05-27 19:43:26 +05305014 param_buf = (WMI_CHAN_INFO_EVENTID_param_tlvs *)event_buf;
5015 if (!param_buf) {
5016 WMA_LOGE("Invalid chan info event buffer");
5017 return -EINVAL;
5018 }
5019 event = param_buf->fixed_param;
5020 if (!event) {
5021 WMA_LOGA("%s: Invalid fixed param", __func__);
5022 return -EINVAL;
5023 }
5024
Sandeep Puligillad7887022019-02-26 00:48:52 -08005025 snr_monitor_enabled = wlan_scan_is_snr_monitor_enabled(mac->psoc);
5026 WMA_LOGD("%s: monitor:%d", __func__, snr_monitor_enabled);
5027 if (snr_monitor_enabled && mac->chan_info_cb) {
Kapil Gupta4f0c0c12017-02-07 15:21:15 +05305028 buf.tx_frame_count = event->tx_frame_cnt;
5029 buf.clock_freq = event->mac_clk_mhz;
5030 buf.cmd_flag = event->cmd_flags;
5031 buf.freq = event->freq;
5032 buf.noise_floor = event->noise_floor;
5033 buf.cycle_count = event->cycle_count;
5034 buf.rx_clear_count = event->rx_clear_count;
5035 mac->chan_info_cb(&buf);
5036 }
5037
Abhishek Ambure74709762019-05-27 19:43:26 +05305038 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(wma->psoc, event->vdev_id,
5039 WLAN_LEGACY_WMA_ID);
5040
5041 if (!vdev) {
5042 WMA_LOGE("%s: vdev is NULL for vdev %d",
5043 __func__, event->vdev_id);
5044 return -EINVAL;
5045 }
5046 mode = wlan_vdev_mlme_get_opmode(vdev);
5047 wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_WMA_ID);
5048 WMA_LOGD("Vdevid %d mode %d", event->vdev_id, mode);
5049
5050 if (mac->sap.acs_with_more_param && mode == QDF_SAP_MODE) {
Arif Hussain157263f2018-10-03 13:07:15 -07005051 channel_status = qdf_mem_malloc(sizeof(*channel_status));
5052 if (!channel_status)
gaoleze5108942017-03-31 16:56:42 +08005053 return -ENOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -07005054
gaoleze5108942017-03-31 16:56:42 +08005055 WMA_LOGD(FL("freq=%d nf=%d rxcnt=%u cyccnt=%u tx_r=%d tx_t=%d"),
5056 event->freq,
5057 event->noise_floor,
5058 event->rx_clear_count,
5059 event->cycle_count,
5060 event->chan_tx_pwr_range,
5061 event->chan_tx_pwr_tp);
5062
5063 channel_status->channelfreq = event->freq;
5064 channel_status->noise_floor = event->noise_floor;
5065 channel_status->rx_clear_count =
5066 event->rx_clear_count;
5067 channel_status->cycle_count = event->cycle_count;
5068 channel_status->chan_tx_pwr_range =
5069 event->chan_tx_pwr_range;
5070 channel_status->chan_tx_pwr_throughput =
5071 event->chan_tx_pwr_tp;
5072 channel_status->rx_frame_count =
5073 event->rx_frame_count;
5074 channel_status->bss_rx_cycle_count =
5075 event->my_bss_rx_cycle_count;
5076 channel_status->rx_11b_mode_data_duration =
5077 event->rx_11b_mode_data_duration;
5078 channel_status->tx_frame_count = event->tx_frame_cnt;
5079 channel_status->mac_clk_mhz = event->mac_clk_mhz;
5080 channel_status->channel_id =
5081 cds_freq_to_chan(event->freq);
5082 channel_status->cmd_flags =
5083 event->cmd_flags;
5084
5085 wma_send_msg(handle, WMA_RX_CHN_STATUS_EVENT,
5086 (void *)channel_status, 0);
5087 }
5088
Kapil Gupta4f0c0c12017-02-07 15:21:15 +05305089 return 0;
5090}
lifeng66831662017-05-19 16:01:35 +08005091
5092int wma_rx_aggr_failure_event_handler(void *handle, u_int8_t *event_buf,
5093 u_int32_t len)
5094{
5095 WMI_REPORT_RX_AGGR_FAILURE_EVENTID_param_tlvs *param_buf;
5096 struct sir_sme_rx_aggr_hole_ind *rx_aggr_hole_event;
5097 wmi_rx_aggr_failure_event_fixed_param *rx_aggr_failure_info;
5098 wmi_rx_aggr_failure_info *hole_info;
5099 uint32_t i, alloc_len;
Jeff Johnson9f18aa72018-12-02 12:05:12 -08005100 struct mac_context *mac;
lifeng66831662017-05-19 16:01:35 +08005101
Jeff Johnson9f18aa72018-12-02 12:05:12 -08005102 mac = (struct mac_context *)cds_get_context(QDF_MODULE_ID_PE);
lifeng66831662017-05-19 16:01:35 +08005103 if (!mac || !mac->sme.stats_ext2_cb) {
5104 WMA_LOGD("%s: NULL mac ptr or HDD callback is null", __func__);
5105 return -EINVAL;
5106 }
5107
5108 param_buf = (WMI_REPORT_RX_AGGR_FAILURE_EVENTID_param_tlvs *)event_buf;
5109 if (!param_buf) {
5110 WMA_LOGE("%s: Invalid stats ext event buf", __func__);
5111 return -EINVAL;
5112 }
5113
5114 rx_aggr_failure_info = param_buf->fixed_param;
5115 hole_info = param_buf->failure_info;
5116
Vignesh Viswanathan677e3ec2017-09-27 20:44:27 +05305117 if (rx_aggr_failure_info->num_failure_info > ((WMI_SVC_MSG_MAX_SIZE -
5118 sizeof(*rx_aggr_hole_event)) /
5119 sizeof(rx_aggr_hole_event->hole_info_array[0]))) {
5120 WMA_LOGE("%s: Excess data from WMI num_failure_info %d",
5121 __func__, rx_aggr_failure_info->num_failure_info);
Vignesh Viswanathan677e3ec2017-09-27 20:44:27 +05305122 return -EINVAL;
5123 }
5124
lifeng66831662017-05-19 16:01:35 +08005125 alloc_len = sizeof(*rx_aggr_hole_event) +
5126 (rx_aggr_failure_info->num_failure_info)*
5127 sizeof(rx_aggr_hole_event->hole_info_array[0]);
5128 rx_aggr_hole_event = qdf_mem_malloc(alloc_len);
Arif Hussain157263f2018-10-03 13:07:15 -07005129 if (!rx_aggr_hole_event)
lifeng66831662017-05-19 16:01:35 +08005130 return -ENOMEM;
lifeng66831662017-05-19 16:01:35 +08005131
5132 rx_aggr_hole_event->hole_cnt = rx_aggr_failure_info->num_failure_info;
Abhinav Kumara03659c2017-12-28 15:18:07 +05305133 if (rx_aggr_hole_event->hole_cnt > param_buf->num_failure_info) {
5134 WMA_LOGE("Invalid no of hole count: %d",
5135 rx_aggr_hole_event->hole_cnt);
5136 qdf_mem_free(rx_aggr_hole_event);
5137 return -EINVAL;
5138 }
lifeng66831662017-05-19 16:01:35 +08005139 WMA_LOGD("aggr holes_sum: %d\n",
5140 rx_aggr_failure_info->num_failure_info);
5141 for (i = 0; i < rx_aggr_hole_event->hole_cnt; i++) {
5142 rx_aggr_hole_event->hole_info_array[i] =
5143 hole_info->end_seq - hole_info->start_seq + 1;
5144 WMA_LOGD("aggr_index: %d\tstart_seq: %d\tend_seq: %d\t"
5145 "hole_info: %d mpdu lost",
5146 i, hole_info->start_seq, hole_info->end_seq,
5147 rx_aggr_hole_event->hole_info_array[i]);
5148 hole_info++;
5149 }
5150
Jeff Johnson6aaaa992018-06-30 10:43:04 -07005151 mac->sme.stats_ext2_cb(mac->hdd_handle, rx_aggr_hole_event);
lifeng66831662017-05-19 16:01:35 +08005152 qdf_mem_free(rx_aggr_hole_event);
5153
5154 return 0;
5155}
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +05305156
5157int wma_wlan_bt_activity_evt_handler(void *handle, uint8_t *event, uint32_t len)
5158{
5159 wmi_coex_bt_activity_event_fixed_param *fixed_param;
5160 WMI_WLAN_COEX_BT_ACTIVITY_EVENTID_param_tlvs *param_buf =
5161 (WMI_WLAN_COEX_BT_ACTIVITY_EVENTID_param_tlvs *)event;
5162 struct scheduler_msg sme_msg = {0};
5163 QDF_STATUS qdf_status;
5164
5165 if (!param_buf) {
5166 WMA_LOGE(FL("Invalid BT activity event buffer"));
5167 return -EINVAL;
5168 }
5169
5170 fixed_param = param_buf->fixed_param;
5171 if (!fixed_param) {
5172 WMA_LOGE(FL("Invalid BT activity event fixed param buffer"));
5173 return -EINVAL;
5174 }
5175
5176 WMA_LOGI(FL("Received BT activity event %u"),
5177 fixed_param->coex_profile_evt);
5178
5179 sme_msg.type = eWNI_SME_BT_ACTIVITY_INFO_IND;
5180 sme_msg.bodyptr = NULL;
5181 sme_msg.bodyval = fixed_param->coex_profile_evt;
5182
gaurank kathpalia00861f02018-08-28 19:16:12 +05305183 qdf_status = scheduler_post_message(QDF_MODULE_ID_WMA,
5184 QDF_MODULE_ID_SME,
5185 QDF_MODULE_ID_SME, &sme_msg);
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05305186 if (QDF_IS_STATUS_ERROR(qdf_status))
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +05305187 return -EINVAL;
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +05305188
5189 return 0;
5190}
lifengd217d192017-05-09 19:44:16 +08005191
lifengfe6c3e22018-04-03 12:10:04 +08005192int wma_pdev_div_info_evt_handler(void *handle, u_int8_t *event_buf,
lifengd217d192017-05-09 19:44:16 +08005193 u_int32_t len)
5194{
lifengfe6c3e22018-04-03 12:10:04 +08005195 WMI_PDEV_DIV_RSSI_ANTID_EVENTID_param_tlvs *param_buf;
5196 wmi_pdev_div_rssi_antid_event_fixed_param *event;
5197 struct chain_rssi_result chain_rssi_result;
5198 u_int32_t i;
Srinivas Girigowdaa47b45f2019-02-27 12:29:02 -08005199 u_int8_t macaddr[QDF_MAC_ADDR_SIZE];
Yeshwanth Sriram Guntuka14ab04c2018-09-21 15:06:49 +05305200 tp_wma_handle wma = (tp_wma_handle)handle;
lifengd217d192017-05-09 19:44:16 +08005201
Jeff Johnson9f18aa72018-12-02 12:05:12 -08005202 struct mac_context *pmac = (struct mac_context *)cds_get_context(
lifengd217d192017-05-09 19:44:16 +08005203 QDF_MODULE_ID_PE);
Yeshwanth Sriram Guntuka14ab04c2018-09-21 15:06:49 +05305204 if (!pmac || !wma) {
5205 WMA_LOGE(FL("Invalid pmac or wma"));
lifengd217d192017-05-09 19:44:16 +08005206 return -EINVAL;
5207 }
5208
Harprit Chhabada2e2aa692018-10-04 18:28:28 -07005209 if (!pmac->sme.get_chain_rssi_cb) {
5210 WMA_LOGE(FL("Invalid get_chain_rssi_cb"));
5211 return -EINVAL;
5212 }
lifengfe6c3e22018-04-03 12:10:04 +08005213 param_buf = (WMI_PDEV_DIV_RSSI_ANTID_EVENTID_param_tlvs *) event_buf;
lifengd217d192017-05-09 19:44:16 +08005214 if (!param_buf) {
lifengfe6c3e22018-04-03 12:10:04 +08005215 WMA_LOGE(FL("Invalid rssi antid event buffer"));
lifengd217d192017-05-09 19:44:16 +08005216 return -EINVAL;
5217 }
5218
lifengfe6c3e22018-04-03 12:10:04 +08005219 event = param_buf->fixed_param;
5220 if (!event) {
5221 WMA_LOGE(FL("Invalid fixed param"));
5222 return -EINVAL;
lifengd217d192017-05-09 19:44:16 +08005223 }
5224
Pragaspathi Thilagaraj96aff772018-08-29 23:15:31 +05305225 if (event->num_chains_valid > CHAIN_MAX_NUM) {
5226 WMA_LOGE(FL("Invalid num of chains"));
5227 return -EINVAL;
5228 }
5229
stonez396a9732019-01-16 12:29:16 +08005230 qdf_mem_zero(&chain_rssi_result, sizeof(chain_rssi_result));
5231
lifengfe6c3e22018-04-03 12:10:04 +08005232 WMI_MAC_ADDR_TO_CHAR_ARRAY(&event->macaddr, macaddr);
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -07005233 wma_debug("macaddr: " QDF_MAC_ADDR_STR, QDF_MAC_ADDR_ARRAY(macaddr));
lifengd217d192017-05-09 19:44:16 +08005234
lifengfe6c3e22018-04-03 12:10:04 +08005235 WMA_LOGD(FL("num_chains_valid: %d"), event->num_chains_valid);
5236 chain_rssi_result.num_chains_valid = event->num_chains_valid;
5237
lifengfe6c3e22018-04-03 12:10:04 +08005238 qdf_mem_copy(chain_rssi_result.chain_rssi, event->chain_rssi,
stonez396a9732019-01-16 12:29:16 +08005239 sizeof(event->chain_rssi));
5240
5241 qdf_mem_copy(chain_rssi_result.chain_evm, event->chain_evm,
5242 sizeof(event->chain_evm));
5243
5244 qdf_mem_copy(chain_rssi_result.ant_id, event->ant_id,
5245 sizeof(event->ant_id));
5246
5247 for (i = 0; i < chain_rssi_result.num_chains_valid; i++) {
5248 WMA_LOGD(FL("chain_rssi: %d, chain_evm: %d,ant_id: %d"),
5249 chain_rssi_result.chain_rssi[i],
5250 chain_rssi_result.chain_evm[i],
5251 chain_rssi_result.ant_id[i]);
5252
Yeshwanth Sriram Guntuka14ab04c2018-09-21 15:06:49 +05305253 if (!wmi_service_enabled(wma->wmi_handle,
5254 wmi_service_hw_db2dbm_support)) {
5255 if (chain_rssi_result.chain_rssi[i] !=
5256 WMA_INVALID_PER_CHAIN_SNR)
5257 chain_rssi_result.chain_rssi[i] +=
stonez396a9732019-01-16 12:29:16 +08005258 WMA_TGT_NOISE_FLOOR_DBM;
Yeshwanth Sriram Guntuka14ab04c2018-09-21 15:06:49 +05305259 else
5260 chain_rssi_result.chain_rssi[i] =
5261 WMA_INVALID_PER_CHAIN_RSSI;
5262 }
Pragaspathi Thilagaraj96aff772018-08-29 23:15:31 +05305263 }
lifengfe6c3e22018-04-03 12:10:04 +08005264
lifengd217d192017-05-09 19:44:16 +08005265 pmac->sme.get_chain_rssi_cb(pmac->sme.get_chain_rssi_context,
lifengfe6c3e22018-04-03 12:10:04 +08005266 &chain_rssi_result);
lifengd217d192017-05-09 19:44:16 +08005267
5268 return 0;
5269}
Arif Hussainee10f902017-12-27 16:30:17 -08005270
5271int wma_vdev_obss_detection_info_handler(void *handle, uint8_t *event,
5272 uint32_t len)
5273{
5274 tp_wma_handle wma = (tp_wma_handle) handle;
5275 struct wmi_obss_detect_info *obss_detection;
5276 QDF_STATUS status;
5277
5278 if (!event) {
5279 WMA_LOGE("Invalid obss_detection_info event buffer");
5280 return -EINVAL;
5281 }
5282
5283 obss_detection = qdf_mem_malloc(sizeof(*obss_detection));
Arif Hussain157263f2018-10-03 13:07:15 -07005284 if (!obss_detection)
Arif Hussainee10f902017-12-27 16:30:17 -08005285 return -ENOMEM;
Arif Hussainee10f902017-12-27 16:30:17 -08005286
5287 status = wmi_unified_extract_obss_detection_info(wma->wmi_handle,
5288 event, obss_detection);
5289
5290 if (QDF_IS_STATUS_ERROR(status)) {
5291 WMA_LOGE("%s: Failed to extract obss info", __func__);
5292 qdf_mem_free(obss_detection);
5293 return -EINVAL;
5294 }
5295
5296 if (!wma_is_vdev_valid(obss_detection->vdev_id)) {
5297 WMA_LOGE("%s: Invalid vdev id %d", __func__,
5298 obss_detection->vdev_id);
5299 qdf_mem_free(obss_detection);
5300 return -EINVAL;
5301 }
5302
5303 wma_send_msg(wma, WMA_OBSS_DETECTION_INFO, obss_detection, 0);
5304
5305 return 0;
5306}
Arif Hussain05fb4872018-01-03 16:02:55 -08005307
Abhishek Singhefe21e62019-09-20 10:03:24 +05305308static void wma_send_set_key_rsp(uint8_t vdev_id, bool pairwise,
Kiran Kumar Lokere7d6e4c92018-09-19 13:45:47 -07005309 uint8_t key_index)
5310{
5311 tSetStaKeyParams *key_info_uc;
5312 tSetBssKeyParams *key_info_mc;
5313 struct wlan_crypto_key *crypto_key;
5314 struct wlan_objmgr_vdev *vdev;
5315 tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA);
Varun Reddy Yeturuff4c9982019-02-15 15:59:24 -08005316 struct qdf_mac_addr bcast_mac = QDF_MAC_ADDR_BCAST_INIT;
Kiran Kumar Lokere7d6e4c92018-09-19 13:45:47 -07005317
5318 if (!wma) {
5319 wma_err("WMA context does not exist");
5320 return;
5321 }
5322 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(wma->psoc,
Abhishek Singhefe21e62019-09-20 10:03:24 +05305323 vdev_id,
Kiran Kumar Lokere7d6e4c92018-09-19 13:45:47 -07005324 WLAN_LEGACY_WMA_ID);
5325 if (!vdev) {
5326 wma_err("VDEV object not found");
5327 return;
5328 }
5329 crypto_key = wlan_crypto_get_key(vdev, key_index);
5330
5331 wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_WMA_ID);
5332 if (!crypto_key) {
5333 wma_err("crypto_key not found");
5334 return;
5335 }
5336
5337 if (pairwise) {
5338 key_info_uc = qdf_mem_malloc(sizeof(*key_info_uc));
5339 if (!key_info_uc)
5340 return;
Abhishek Singhefe21e62019-09-20 10:03:24 +05305341 key_info_uc->vdev_id = vdev_id;
Kiran Kumar Lokere7d6e4c92018-09-19 13:45:47 -07005342 key_info_uc->status = QDF_STATUS_SUCCESS;
5343 key_info_uc->key[0].keyLength = crypto_key->keylen;
5344 qdf_mem_copy(&key_info_uc->macaddr, &crypto_key->macaddr,
5345 QDF_MAC_ADDR_SIZE);
5346 wma_send_msg_high_priority(wma, WMA_SET_STAKEY_RSP,
5347 key_info_uc, 0);
5348 } else {
5349 key_info_mc = qdf_mem_malloc(sizeof(*key_info_mc));
5350 if (!key_info_mc)
5351 return;
Abhishek Singhefe21e62019-09-20 10:03:24 +05305352 key_info_mc->vdev_id = vdev_id;
Kiran Kumar Lokere7d6e4c92018-09-19 13:45:47 -07005353 key_info_mc->status = QDF_STATUS_SUCCESS;
5354 key_info_mc->key[0].keyLength = crypto_key->keylen;
Varun Reddy Yeturuff4c9982019-02-15 15:59:24 -08005355 qdf_mem_copy(&key_info_mc->macaddr, &bcast_mac,
Kiran Kumar Lokere7d6e4c92018-09-19 13:45:47 -07005356 QDF_MAC_ADDR_SIZE);
5357 wma_send_msg_high_priority(wma, WMA_SET_BSSKEY_RSP,
5358 key_info_mc, 0);
5359 }
5360}
5361
Abhishek Singhf880a7d2019-04-29 14:51:11 +05305362static uint32_t wma_cipher_to_cap(enum wlan_crypto_cipher_type cipher)
5363{
5364 switch (cipher) {
5365 case WLAN_CRYPTO_CIPHER_WEP: return WLAN_CRYPTO_CAP_WEP;
5366 case WLAN_CRYPTO_CIPHER_WEP_40: return WLAN_CRYPTO_CAP_WEP;
5367 case WLAN_CRYPTO_CIPHER_WEP_104: return WLAN_CRYPTO_CAP_WEP;
5368 case WLAN_CRYPTO_CIPHER_AES_OCB: return WLAN_CRYPTO_CAP_AES;
5369 case WLAN_CRYPTO_CIPHER_AES_CCM: return WLAN_CRYPTO_CAP_AES;
5370 case WLAN_CRYPTO_CIPHER_AES_CCM_256: return WLAN_CRYPTO_CAP_AES;
5371 case WLAN_CRYPTO_CIPHER_AES_GCM: return WLAN_CRYPTO_CAP_AES;
5372 case WLAN_CRYPTO_CIPHER_AES_GCM_256: return WLAN_CRYPTO_CAP_AES;
5373 case WLAN_CRYPTO_CIPHER_CKIP: return WLAN_CRYPTO_CAP_CKIP;
5374 case WLAN_CRYPTO_CIPHER_TKIP: return WLAN_CRYPTO_CAP_TKIP_MIC;
5375 case WLAN_CRYPTO_CIPHER_WAPI_SMS4: return WLAN_CRYPTO_CAP_WAPI_SMS4;
5376 case WLAN_CRYPTO_CIPHER_WAPI_GCM4: return WLAN_CRYPTO_CAP_WAPI_GCM4;
5377 case WLAN_CRYPTO_CIPHER_FILS_AEAD: return WLAN_CRYPTO_CAP_FILS_AEAD;
5378 default: return 0;
5379 }
5380}
5381
5382void wma_set_peer_ucast_cipher(uint8_t *mac_addr,
5383 enum wlan_crypto_cipher_type cipher)
5384{
5385 int32_t set_val = 0, cipher_cap;
5386 struct wlan_objmgr_peer *peer;
5387 tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA);
5388
5389 if (!wma) {
5390 wma_err("wma context is NULL");
5391 return;
5392 }
5393
5394 peer = wlan_objmgr_get_peer(wma->psoc,
5395 wlan_objmgr_pdev_get_pdev_id(wma->pdev),
5396 mac_addr, WLAN_LEGACY_WMA_ID);
5397 if (!peer) {
5398 wma_err("Peer of peer_mac %pM not found", mac_addr);
5399 return;
5400 }
5401 cipher_cap = wma_cipher_to_cap(cipher);
5402 MLME_SET_BIT(set_val, cipher_cap);
5403 wlan_crypto_set_peer_param(peer, WLAN_CRYPTO_PARAM_CIPHER_CAP,
5404 set_val);
5405 set_val = 0;
5406 MLME_SET_BIT(set_val, cipher);
5407 wlan_crypto_set_peer_param(peer, WLAN_CRYPTO_PARAM_UCAST_CIPHER,
5408 set_val);
5409 wlan_objmgr_peer_release_ref(peer, WLAN_LEGACY_WMA_ID);
5410
5411 wma_debug("Set unicast cipher %x and cap %x for %pM", 1 << cipher,
5412 1 << cipher_cap, mac_addr);
5413}
5414
Kiran Kumar Lokere7d6e4c92018-09-19 13:45:47 -07005415static void wma_reset_ipn(struct wma_txrx_node *iface, uint8_t key_index)
5416{
5417 if (key_index == WMA_IGTK_KEY_INDEX_4 ||
5418 key_index == WMA_IGTK_KEY_INDEX_5)
5419 qdf_mem_zero(iface->key.key_id[key_index -
5420 WMA_IGTK_KEY_INDEX_4].ipn,
5421 CMAC_IPN_LEN);
5422}
5423
5424void wma_update_set_key(uint8_t session_id, bool pairwise,
5425 uint8_t key_index,
5426 enum wlan_crypto_cipher_type cipher_type)
5427{
5428 tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA);
5429 struct wma_txrx_node *iface;
5430
5431 if (!wma) {
5432 wma_err("Invalid WMA context");
5433 return;
5434 }
5435 iface = &wma->interfaces[session_id];
Kiran Kumar Lokere47d0dac2019-01-24 18:38:33 -08005436 if (!iface)
5437 wma_info("iface not found for session id %d", session_id);
5438
Abhishek Singh5be0e032019-04-29 15:35:05 +05305439 if (cipher_type == WLAN_CRYPTO_CIPHER_AES_GMAC ||
5440 cipher_type == WLAN_CRYPTO_CIPHER_AES_GMAC_256 ||
5441 cipher_type == WLAN_CRYPTO_CIPHER_AES_CMAC)
5442 iface->key.key_cipher =
5443 wlan_crypto_cipher_to_wmi_cipher(cipher_type);
5444
5445 if (iface) {
5446 wma_reset_ipn(iface, key_index);
5447 iface->is_waiting_for_key = false;
5448 }
Kiran Kumar Lokere7d6e4c92018-09-19 13:45:47 -07005449 if (!pairwise && iface) {
5450 /* Its GTK release the wake lock */
5451 wma_debug("Release set key wake lock");
Alan Chen34250b72019-08-12 16:06:35 -07005452 qdf_runtime_pm_allow_suspend(
5453 &iface->vdev_set_key_runtime_wakelock);
Kiran Kumar Lokere7d6e4c92018-09-19 13:45:47 -07005454 wma_release_wakelock(&iface->vdev_set_key_wakelock);
5455 }
Kiran Kumar Lokere7d6e4c92018-09-19 13:45:47 -07005456
5457 wma_send_set_key_rsp(session_id, pairwise, key_index);
5458}
Kiran Kumar Lokere7d6e4c92018-09-19 13:45:47 -07005459
Arif Hussain05fb4872018-01-03 16:02:55 -08005460int wma_vdev_bss_color_collision_info_handler(void *handle,
5461 uint8_t *event,
5462 uint32_t len)
5463{
5464 tp_wma_handle wma = (tp_wma_handle) handle;
5465 struct wmi_obss_color_collision_info *obss_color_info;
5466 QDF_STATUS status;
5467
5468 if (!event) {
5469 WMA_LOGE("Invalid obss_color_collision event buffer");
5470 return -EINVAL;
5471 }
5472
5473 obss_color_info = qdf_mem_malloc(sizeof(*obss_color_info));
Arif Hussain157263f2018-10-03 13:07:15 -07005474 if (!obss_color_info)
Arif Hussain05fb4872018-01-03 16:02:55 -08005475 return -ENOMEM;
Arif Hussain05fb4872018-01-03 16:02:55 -08005476
5477 status = wmi_unified_extract_obss_color_collision_info(wma->wmi_handle,
5478 event,
5479 obss_color_info);
5480
5481 if (QDF_IS_STATUS_ERROR(status)) {
5482 WMA_LOGE("%s: Failed to extract obss color info", __func__);
5483 qdf_mem_free(obss_color_info);
5484 return -EINVAL;
5485 }
5486
5487 if (!wma_is_vdev_valid(obss_color_info->vdev_id)) {
5488 WMA_LOGE("%s: Invalid vdev id %d", __func__,
5489 obss_color_info->vdev_id);
5490 qdf_mem_free(obss_color_info);
5491 return -EINVAL;
5492 }
5493
5494 wma_send_msg(wma, WMA_OBSS_COLOR_COLLISION_INFO, obss_color_info, 0);
5495
5496 return 0;
5497}
Sourav Mohapatra2a67b0e2019-10-15 17:59:59 +05305498
5499#ifdef FEATURE_ANI_LEVEL_REQUEST
5500int wma_get_ani_level_evt_handler(void *handle, uint8_t *event_buf,
5501 uint32_t len)
5502{
5503 tp_wma_handle wma = (tp_wma_handle)handle;
5504 struct wmi_host_ani_level_event *ani = NULL;
5505 uint32_t num_freqs = 0;
5506 QDF_STATUS status;
5507 struct mac_context *pmac;
5508 int ret = 0;
5509
5510 pmac = (struct mac_context *)cds_get_context(QDF_MODULE_ID_PE);
5511 if (!pmac || !wma) {
5512 WMA_LOGE(FL("Invalid pmac or wma"));
5513 return -EINVAL;
5514 }
5515
5516 status = wmi_unified_extract_ani_level(wma->wmi_handle, event_buf,
5517 &ani, &num_freqs);
5518
5519 if (QDF_IS_STATUS_ERROR(status)) {
5520 WMA_LOGE("%s: Failed to extract ani level", __func__);
5521 return -EINVAL;
5522 }
5523
5524 if (!pmac->ani_params.ani_level_cb) {
5525 WMA_LOGE(FL("Invalid ani_level_cb"));
5526 ret = -EINVAL;
5527 goto free;
5528 }
5529
5530 pmac->ani_params.ani_level_cb(ani, num_freqs,
5531 pmac->ani_params.context);
5532
5533free:
5534 qdf_mem_free(ani);
5535 return ret;
5536}
5537#else
5538int wma_get_ani_level_evt_handler(void *handle, uint8_t *event_buf,
5539 uint32_t len)
5540{
5541 return 0;
5542}
5543#endif
5544