blob: 448145a9f6c6d706ce2519ad934bfcc0ab33fa64 [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>
Bapiraju Alla866d5542020-05-26 10:30:08 +053072#include "cdp_txrx_host_stats.h"
Mukul Sharma00058692017-01-28 19:04:32 +053073
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053074/**
75 * WMA_SET_VDEV_IE_SOURCE_HOST - Flag to identify the source of VDEV SET IE
76 * command. The value is 0x0 for the VDEV SET IE WMI commands from mobile
77 * MCL platform.
78 */
79#define WMA_SET_VDEV_IE_SOURCE_HOST 0x0
80
Naveen Rawat3ff5cff2018-01-29 14:31:16 -080081#if defined(FEATURE_WLAN_DIAG_SUPPORT)
Yeshwanth Sriram Guntukaa10da362017-10-06 12:57:11 +053082/**
83 * qdf_wma_wow_wakeup_stats_event()- send wow wakeup stats
84 * @tp_wma_handle wma: WOW wakeup packet counter
85 *
86 * This function sends wow wakeup stats diag event
87 *
88 * Return: void.
89 */
Naveen Rawat3ff5cff2018-01-29 14:31:16 -080090static inline void qdf_wma_wow_wakeup_stats_event(tp_wma_handle wma)
91{
92 QDF_STATUS status;
93 struct wake_lock_stats stats = {0};
94
95 WLAN_HOST_DIAG_EVENT_DEF(wow_stats,
96 struct host_event_wlan_powersave_wow_stats);
97
98 status = ucfg_mc_cp_stats_get_psoc_wake_lock_stats(wma->psoc, &stats);
99 if (QDF_IS_STATUS_ERROR(status))
100 return;
101 qdf_mem_zero(&wow_stats, sizeof(wow_stats));
102
103 wow_stats.wow_bcast_wake_up_count = stats.bcast_wake_up_count;
104 wow_stats.wow_ipv4_mcast_wake_up_count = stats.ipv4_mcast_wake_up_count;
105 wow_stats.wow_ipv6_mcast_wake_up_count = stats.ipv6_mcast_wake_up_count;
106 wow_stats.wow_ipv6_mcast_ra_stats = stats.ipv6_mcast_ra_stats;
107 wow_stats.wow_ipv6_mcast_ns_stats = stats.ipv6_mcast_ns_stats;
108 wow_stats.wow_ipv6_mcast_na_stats = stats.ipv6_mcast_na_stats;
109 wow_stats.wow_pno_match_wake_up_count = stats.pno_match_wake_up_count;
110 wow_stats.wow_pno_complete_wake_up_count =
111 stats.pno_complete_wake_up_count;
112 wow_stats.wow_gscan_wake_up_count = stats.gscan_wake_up_count;
113 wow_stats.wow_low_rssi_wake_up_count = stats.low_rssi_wake_up_count;
114 wow_stats.wow_rssi_breach_wake_up_count =
115 stats.rssi_breach_wake_up_count;
116 wow_stats.wow_icmpv4_count = stats.icmpv4_count;
117 wow_stats.wow_icmpv6_count = stats.icmpv6_count;
118 wow_stats.wow_oem_response_wake_up_count =
119 stats.oem_response_wake_up_count;
120
121 WLAN_HOST_DIAG_EVENT_REPORT(&wow_stats, EVENT_WLAN_POWERSAVE_WOW_STATS);
122}
Yeshwanth Sriram Guntukaa10da362017-10-06 12:57:11 +0530123#else
124static inline void qdf_wma_wow_wakeup_stats_event(tp_wma_handle wma)
125{
126 return;
127}
128#endif
129
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800130#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
131/**
jiad391c5282018-11-26 16:21:04 +0800132 * wma_wake_reason_auto_shutdown() - to post auto shutdown event to sme
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800133 *
134 * Return: 0 for success or error code
135 */
Dustin Browne2206fb2017-04-20 13:39:25 -0700136static int wma_wake_reason_auto_shutdown(void)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800137{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530138 QDF_STATUS qdf_status;
Rajeev Kumarb60abe42017-01-21 15:39:31 -0800139 struct scheduler_msg sme_msg = { 0 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800140
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800141 sme_msg.type = eWNI_SME_AUTO_SHUTDOWN_IND;
gaurank kathpalia00861f02018-08-28 19:16:12 +0530142 qdf_status = scheduler_post_message(QDF_MODULE_ID_WMA,
143 QDF_MODULE_ID_SME,
144 QDF_MODULE_ID_SME, &sme_msg);
Jeff Johnsonaebd8232019-02-17 09:48:17 -0800145 if (!QDF_IS_STATUS_SUCCESS(qdf_status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800146 WMA_LOGE("Fail to post eWNI_SME_AUTO_SHUTDOWN_IND msg to SME");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800147
Jeff Johnsonaebd8232019-02-17 09:48:17 -0800148 return qdf_status_to_os_return(qdf_status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800149}
Dustin Browne2206fb2017-04-20 13:39:25 -0700150#else
151static inline int wma_wake_reason_auto_shutdown(void)
152{
153 return 0;
154}
155#endif /* FEATURE_WLAN_AUTO_SHUTDOWN */
156
157#ifdef FEATURE_WLAN_SCAN_PNO
158static int wma_wake_reason_nlod(t_wma_handle *wma, uint8_t vdev_id)
159{
160 wmi_nlo_event nlo_event = { .vdev_id = vdev_id };
161 WMI_NLO_MATCH_EVENTID_param_tlvs param = { .fixed_param = &nlo_event };
162
163 return target_if_nlo_match_event_handler(wma, (uint8_t *)&param,
164 sizeof(param));
165}
166#else
Pragaspathi Thilagaraj24789d32018-12-10 22:28:03 +0530167static inline int wma_wake_reason_nlod(t_wma_handle *wma, uint8_t vdev_id)
Dustin Browne2206fb2017-04-20 13:39:25 -0700168{
169 return 0;
170}
171#endif /* FEATURE_WLAN_SCAN_PNO */
172
Nachiket Kukade6003bd22018-11-08 18:30:08 +0530173#ifdef WLAN_FEATURE_NAN
174/**
175 * wma_nan_rsp_handler_callback() - call NAN Discovery event handler
176 * @handle: wma handle
177 * @event: event buffer
178 * @len: buffer length
179 *
180 * Return: 0 for success or error code
181 */
182static int wma_nan_rsp_handler_callback(void *handle, uint8_t *event,
183 uint32_t len)
184{
185 return target_if_nan_rsp_handler(handle, event, len);
186}
187#else
188static inline int wma_nan_rsp_handler_callback(void *handle, uint8_t *event,
189 uint32_t len)
190{
191 return 0;
192}
193#endif
194
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800195/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800196 * wma_get_snr() - get RSSI from fw
197 * @psnr_req: request params
198 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +0530199 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800200 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530201QDF_STATUS wma_get_snr(tAniGetSnrReq *psnr_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800202{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800203 tAniGetSnrReq *psnr_req_bkp;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800204 tp_wma_handle wma_handle = NULL;
205 struct wma_txrx_node *intr;
206
Anurag Chouhan6d760662016-02-20 16:05:43 +0530207 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800208
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -0700209 if (!wma_handle) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800210 WMA_LOGE("%s : Failed to get wma_handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530211 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800212 }
213
214 intr = &wma_handle->interfaces[psnr_req->sessionId];
Jeff Johnsonc97816c2018-05-12 17:13:23 -0700215 /* command is in progress */
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -0700216 if (intr->psnr_req) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800217 WMA_LOGE("%s : previous snr request is pending", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530218 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800219 }
220
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530221 psnr_req_bkp = qdf_mem_malloc(sizeof(tAniGetSnrReq));
Arif Hussain157263f2018-10-03 13:07:15 -0700222 if (!psnr_req_bkp)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530223 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800224
hangtian127c9532019-01-12 13:29:07 +0800225 qdf_mem_zero(psnr_req_bkp, sizeof(tAniGetSnrReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800226 psnr_req_bkp->pDevContext = psnr_req->pDevContext;
227 psnr_req_bkp->snrCallback = psnr_req->snrCallback;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800228 intr->psnr_req = (void *)psnr_req_bkp;
Govind Singhaa64c242016-03-08 11:31:49 +0530229
230 if (wmi_unified_snr_cmd(wma_handle->wmi_handle,
231 psnr_req->sessionId)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800232 WMA_LOGE("Failed to send host stats request to fw");
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530233 qdf_mem_free(psnr_req_bkp);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800234 intr->psnr_req = NULL;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530235 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800236 }
237
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530238 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800239}
240
Bapiraju Alla866d5542020-05-26 10:30:08 +0530241void wma_get_rx_retry_cnt(struct mac_context *mac, uint8_t vdev_id,
242 uint8_t *mac_addr)
243{
244 struct cdp_peer_stats *peer_stats;
245 QDF_STATUS status;
246
247 peer_stats = qdf_mem_malloc(sizeof(*peer_stats));
248 if (!peer_stats) {
249 wma_err("Failed to allocate memory for peer stats");
250 return;
251 }
252
253 status = cdp_host_get_peer_stats(cds_get_context(QDF_MODULE_ID_SOC),
254 vdev_id, mac_addr, peer_stats);
255
256 if (QDF_IS_STATUS_ERROR(status)) {
257 wma_err("Failed to get peer stats");
258 goto exit;
259 }
260
261 mac->rx_retry_cnt = peer_stats->rx.rx_retries;
262 wma_debug("Rx retry count %d, Peer" QDF_MAC_ADDR_STR, mac->rx_retry_cnt,
263 QDF_MAC_ADDR_ARRAY(mac_addr));
264
265exit:
266 qdf_mem_free(peer_stats);
267}
268
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800269/**
270 * wma_process_link_status_req() - process link status request from UMAC
271 * @wma: wma handle
272 * @pGetLinkStatus: get link params
273 *
274 * Return: none
275 */
276void wma_process_link_status_req(tp_wma_handle wma,
277 tAniGetLinkStatus *pGetLinkStatus)
278{
Govind Singhaa64c242016-03-08 11:31:49 +0530279 struct link_status_params cmd = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800280 struct wma_txrx_node *iface =
281 &wma->interfaces[pGetLinkStatus->sessionId];
282
283 if (iface->plink_status_req) {
284 WMA_LOGE("%s:previous link status request is pending,deleting the new request",
285 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530286 qdf_mem_free(pGetLinkStatus);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800287 return;
288 }
289
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800290 iface->plink_status_req = pGetLinkStatus;
Jeff Johnson999644a2019-01-15 12:21:02 -0800291 cmd.vdev_id = pGetLinkStatus->sessionId;
Govind Singhaa64c242016-03-08 11:31:49 +0530292 if (wmi_unified_link_status_req_cmd(wma->wmi_handle, &cmd)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800293 WMA_LOGE("Failed to send WMI link status request to fw");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800294 iface->plink_status_req = NULL;
295 goto end;
296 }
297
298 return;
299
300end:
301 wma_post_link_status(pGetLinkStatus, LINK_STATUS_LEGACY);
302}
303
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700304#ifdef WLAN_FEATURE_TSF
305/**
306 * wma_vdev_tsf_handler() - handle tsf event indicated by FW
307 * @handle: wma context
308 * @data: event buffer
309 * @data len: length of event buffer
310 *
311 * Return: 0 on success
312 */
313int wma_vdev_tsf_handler(void *handle, uint8_t *data, uint32_t data_len)
314{
Rajeev Kumarb60abe42017-01-21 15:39:31 -0800315 struct scheduler_msg tsf_msg = {0};
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700316 WMI_VDEV_TSF_REPORT_EVENTID_param_tlvs *param_buf;
317 wmi_vdev_tsf_report_event_fixed_param *tsf_event;
318 struct stsf *ptsf;
319
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -0700320 if (!data) {
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700321 WMA_LOGE("%s: invalid pointer", __func__);
322 return -EINVAL;
323 }
324 ptsf = qdf_mem_malloc(sizeof(*ptsf));
Arif Hussain157263f2018-10-03 13:07:15 -0700325 if (!ptsf)
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700326 return -ENOMEM;
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700327
328 param_buf = (WMI_VDEV_TSF_REPORT_EVENTID_param_tlvs *)data;
329 tsf_event = param_buf->fixed_param;
330
331 ptsf->vdev_id = tsf_event->vdev_id;
332 ptsf->tsf_low = tsf_event->tsf_low;
333 ptsf->tsf_high = tsf_event->tsf_high;
Manikandan Mohan5356c2b2016-04-03 15:51:35 -0700334 ptsf->soc_timer_low = tsf_event->qtimer_low;
335 ptsf->soc_timer_high = tsf_event->qtimer_high;
Jiani Liu6d3b6a12019-05-08 15:15:06 +0800336 ptsf->global_tsf_low = tsf_event->wlan_global_tsf_low;
337 ptsf->global_tsf_high = tsf_event->wlan_global_tsf_high;
Arif Hussain157263f2018-10-03 13:07:15 -0700338 wma_nofl_debug("receive WMI_VDEV_TSF_REPORT_EVENTID on %d, tsf: %d %d",
339 ptsf->vdev_id, ptsf->tsf_low, ptsf->tsf_high);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700340
Jiani Liu6d3b6a12019-05-08 15:15:06 +0800341 wma_nofl_debug("g_tsf: %d %d; soc_timer: %d %d",
342 ptsf->global_tsf_low, ptsf->global_tsf_high,
343 ptsf->soc_timer_low, ptsf->soc_timer_high);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700344 tsf_msg.type = eWNI_SME_TSF_EVENT;
345 tsf_msg.bodyptr = ptsf;
346 tsf_msg.bodyval = 0;
347
348 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia00861f02018-08-28 19:16:12 +0530349 scheduler_post_message(QDF_MODULE_ID_WMA,
350 QDF_MODULE_ID_SME,
351 QDF_MODULE_ID_SME, &tsf_msg)) {
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700352 qdf_mem_free(ptsf);
353 return -EINVAL;
354 }
355 return 0;
356}
357
Manikandan Mohan5356c2b2016-04-03 15:51:35 -0700358#ifdef QCA_WIFI_3_0
359#define TSF_FW_ACTION_CMD TSF_TSTAMP_QTIMER_CAPTURE_REQ
360#else
361#define TSF_FW_ACTION_CMD TSF_TSTAMP_CAPTURE_REQ
362#endif
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700363/**
364 * wma_capture_tsf() - send wmi to fw to capture tsf
365 * @wma_handle: wma handler
366 * @vdev_id: vdev id
367 *
368 * Return: wmi send state
369 */
370QDF_STATUS wma_capture_tsf(tp_wma_handle wma_handle, uint32_t vdev_id)
371{
Dustin Brownfd578602019-02-22 13:52:24 -0800372 QDF_STATUS status;
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700373 wmi_buf_t buf;
374 wmi_vdev_tsf_tstamp_action_cmd_fixed_param *cmd;
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700375 int len = sizeof(*cmd);
376
377 buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -0700378 if (!buf)
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700379 return QDF_STATUS_E_NOMEM;
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700380
381 cmd = (wmi_vdev_tsf_tstamp_action_cmd_fixed_param *) wmi_buf_data(buf);
382 cmd->vdev_id = vdev_id;
Manikandan Mohan5356c2b2016-04-03 15:51:35 -0700383 cmd->tsf_action = TSF_FW_ACTION_CMD;
384 WMA_LOGD("%s :vdev_id %u, tsf_cmd: %d", __func__, cmd->vdev_id,
385 cmd->tsf_action);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700386
387 WMITLV_SET_HDR(&cmd->tlv_header,
388 WMITLV_TAG_STRUC_wmi_vdev_tsf_tstamp_action_cmd_fixed_param,
389 WMITLV_GET_STRUCT_TLVLEN(
390 wmi_vdev_tsf_tstamp_action_cmd_fixed_param));
391
Dustin Brownfd578602019-02-22 13:52:24 -0800392 status = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
393 WMI_VDEV_TSF_TSTAMP_ACTION_CMDID);
394 if (QDF_IS_STATUS_ERROR(status))
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700395 wmi_buf_free(buf);
Dustin Brownfd578602019-02-22 13:52:24 -0800396
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700397 return status;
398}
399
400/**
401 * wma_reset_tsf_gpio() - send wmi to fw to reset GPIO
402 * @wma_handle: wma handler
403 * @vdev_id: vdev id
404 *
405 * Return: wmi send state
406 */
407QDF_STATUS wma_reset_tsf_gpio(tp_wma_handle wma_handle, uint32_t vdev_id)
408{
Dustin Brownfd578602019-02-22 13:52:24 -0800409 QDF_STATUS status;
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700410 wmi_buf_t buf;
411 wmi_vdev_tsf_tstamp_action_cmd_fixed_param *cmd;
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700412 int len = sizeof(*cmd);
413 uint8_t *buf_ptr;
414
415 buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -0700416 if (!buf)
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700417 return QDF_STATUS_E_NOMEM;
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700418
419 buf_ptr = (uint8_t *) wmi_buf_data(buf);
420 cmd = (wmi_vdev_tsf_tstamp_action_cmd_fixed_param *) buf_ptr;
421 cmd->vdev_id = vdev_id;
422 cmd->tsf_action = TSF_TSTAMP_CAPTURE_RESET;
423
424 WMA_LOGD("%s :vdev_id %u, TSF_TSTAMP_CAPTURE_RESET", __func__,
425 cmd->vdev_id);
426
427 WMITLV_SET_HDR(&cmd->tlv_header,
428 WMITLV_TAG_STRUC_wmi_vdev_tsf_tstamp_action_cmd_fixed_param,
429 WMITLV_GET_STRUCT_TLVLEN(
430 wmi_vdev_tsf_tstamp_action_cmd_fixed_param));
431
Dustin Brownfd578602019-02-22 13:52:24 -0800432 status = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
433 WMI_VDEV_TSF_TSTAMP_ACTION_CMDID);
434 if (QDF_IS_STATUS_ERROR(status))
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700435 wmi_buf_free(buf);
Dustin Brownfd578602019-02-22 13:52:24 -0800436
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700437 return status;
438}
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700439
Manikandan Mohan976e7562016-03-15 16:33:31 -0700440/**
441 * wma_set_tsf_gpio_pin() - send wmi cmd to configure gpio pin
442 * @handle: wma handler
443 * @pin: GPIO pin id
444 *
445 * Return: QDF_STATUS
446 */
447QDF_STATUS wma_set_tsf_gpio_pin(WMA_HANDLE handle, uint32_t pin)
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700448{
Manikandan Mohan976e7562016-03-15 16:33:31 -0700449 tp_wma_handle wma = (tp_wma_handle)handle;
450 struct pdev_params pdev_param = {0};
451 int32_t ret;
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700452
Manikandan Mohan976e7562016-03-15 16:33:31 -0700453 if (!wma || !wma->wmi_handle) {
454 WMA_LOGE("%s: WMA is closed, can not set gpio", __func__);
455 return QDF_STATUS_E_INVAL;
456 }
457
458 WMA_LOGD("%s: set tsf gpio pin: %d", __func__, pin);
459
460 pdev_param.param_id = WMI_PDEV_PARAM_WNTS_CONFIG;
461 pdev_param.param_value = pin;
462 ret = wmi_unified_pdev_param_send(wma->wmi_handle,
463 &pdev_param,
464 WMA_WILDCARD_PDEV_ID);
465 if (ret) {
466 WMA_LOGE("%s: Failed to set tsf gpio pin (%d)", __func__, ret);
467 return QDF_STATUS_E_FAILURE;
468 }
469 return QDF_STATUS_SUCCESS;
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700470}
471#endif
472
Manikandan Mohan80dea792016-04-28 16:36:48 -0700473/**
474 * wma_set_wisa_params(): Set WISA features related params in FW
475 * @wma_handle: WMA handle
476 * @wisa: Pointer to WISA param struct
477 *
478 * Return: CDF status
479 */
480QDF_STATUS wma_set_wisa_params(tp_wma_handle wma_handle,
481 struct sir_wisa_params *wisa)
482{
Dustin Brownfd578602019-02-22 13:52:24 -0800483 QDF_STATUS status;
Manikandan Mohan80dea792016-04-28 16:36:48 -0700484 wmi_buf_t buf;
485 wmi_vdev_wisa_cmd_fixed_param *cmd;
Dustin Brownfd578602019-02-22 13:52:24 -0800486 int len = sizeof(*cmd);
Manikandan Mohan80dea792016-04-28 16:36:48 -0700487
488 buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -0700489 if (!buf)
Manikandan Mohan80dea792016-04-28 16:36:48 -0700490 return QDF_STATUS_E_NOMEM;
Manikandan Mohan80dea792016-04-28 16:36:48 -0700491
492 cmd = (wmi_vdev_wisa_cmd_fixed_param *) wmi_buf_data(buf);
493 cmd->wisa_mode = wisa->mode;
494 cmd->vdev_id = wisa->vdev_id;
495
496 WMITLV_SET_HDR(&cmd->tlv_header,
497 WMITLV_TAG_STRUC_wmi_vdev_wisa_cmd_fixed_param,
498 WMITLV_GET_STRUCT_TLVLEN(
499 wmi_vdev_wisa_cmd_fixed_param));
500
Dustin Brownfd578602019-02-22 13:52:24 -0800501 status = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
502 WMI_VDEV_WISA_CMDID);
503 if (QDF_IS_STATUS_ERROR(status))
504 wmi_buf_free(buf);
Manikandan Mohan80dea792016-04-28 16:36:48 -0700505
Manikandan Mohan80dea792016-04-28 16:36:48 -0700506 return status;
507}
508
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800509/**
510 * wma_process_dhcp_ind() - process dhcp indication from SME
511 * @wma_handle: wma handle
512 * @ta_dhcp_ind: DHCP indication
513 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +0530514 * Return: QDF Status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800515 */
Yun Parkc3e35562018-03-08 12:05:52 -0800516QDF_STATUS wma_process_dhcp_ind(WMA_HANDLE handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800517 tAniDHCPInd *ta_dhcp_ind)
518{
Yun Parkc3e35562018-03-08 12:05:52 -0800519 tp_wma_handle wma_handle = (tp_wma_handle) handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800520 uint8_t vdev_id;
Govind Singhaa64c242016-03-08 11:31:49 +0530521 wmi_peer_set_param_cmd_fixed_param peer_set_param_fp = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800522
Pragaspathi Thilagaraj961a8b82018-05-03 14:16:44 +0530523 if (!wma_handle) {
524 WMA_LOGE("%s : wma_handle is NULL", __func__);
525 return QDF_STATUS_E_FAILURE;
526 }
527
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800528 if (!ta_dhcp_ind) {
529 WMA_LOGE("%s : DHCP indication is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530530 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800531 }
532
Vevek Venkatesan2d88a6b2019-10-04 19:03:10 +0530533 if (wma_find_vdev_id_by_addr(wma_handle,
534 ta_dhcp_ind->adapterMacAddr.bytes,
535 &vdev_id)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800536 WMA_LOGE("%s: Failed to find vdev id for DHCP indication",
537 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530538 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800539 }
540
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -0700541 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 -0700542 ta_dhcp_ind->msgType == WMA_DHCP_START_IND ?
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700543 "WMA_DHCP_START_IND" : "WMA_DHCP_STOP_IND",
544 ta_dhcp_ind->device_mode,
Srinivas Girigowda34fbba02019-04-08 12:07:44 -0700545 QDF_MAC_ADDR_ARRAY(ta_dhcp_ind->peerMacAddr.bytes));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800546
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800547 /* fill in values */
Govind Singhaa64c242016-03-08 11:31:49 +0530548 peer_set_param_fp.vdev_id = vdev_id;
549 peer_set_param_fp.param_id = WMI_PEER_CRIT_PROTO_HINT_ENABLED;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800550 if (WMA_DHCP_START_IND == ta_dhcp_ind->msgType)
Govind Singhaa64c242016-03-08 11:31:49 +0530551 peer_set_param_fp.param_value = 1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800552 else
Govind Singhaa64c242016-03-08 11:31:49 +0530553 peer_set_param_fp.param_value = 0;
Srinivas Girigowda296105a2015-09-24 16:31:16 -0700554 WMI_CHAR_ARRAY_TO_MAC_ADDR(ta_dhcp_ind->peerMacAddr.bytes,
Govind Singhaa64c242016-03-08 11:31:49 +0530555 &peer_set_param_fp.peer_macaddr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800556
Dustin Brownfd578602019-02-22 13:52:24 -0800557 return wmi_unified_process_dhcp_ind(wma_handle->wmi_handle,
558 &peer_set_param_fp);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800559}
560
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530561enum wlan_phymode wma_chan_phy_mode(uint32_t freq, enum phy_ch_width chan_width,
562 uint8_t dot11_mode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800563{
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530564 enum wlan_phymode phymode = WLAN_PHYMODE_AUTO;
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -0700565 uint16_t bw_val = wlan_reg_get_bw_value(chan_width);
Kiran Kumar Lokere1a43bcf2018-05-15 15:51:58 -0700566 t_wma_handle *wma = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800567
Jiachao Wu52c060a2018-07-23 18:17:14 +0800568 if (!wma) {
569 WMA_LOGE("%s : wma_handle is NULL", __func__);
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530570 return WLAN_PHYMODE_AUTO;
Jiachao Wu52c060a2018-07-23 18:17:14 +0800571 }
572
Ashish Kumar Dhanotiyacd311c82018-09-14 10:55:10 +0530573 if (chan_width >= CH_WIDTH_INVALID) {
Ashish Kumar Dhanotiyabf3742b2020-01-21 14:21:33 +0530574 wma_err_rl("%s : Invalid channel width", __func__);
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530575 return WLAN_PHYMODE_AUTO;
Ashish Kumar Dhanotiyacd311c82018-09-14 10:55:10 +0530576 }
577
gaurank kathpaliac99859b2019-07-23 12:02:35 +0530578 if (wlan_reg_is_24ghz_ch_freq(freq)) {
Amar Singhal046eb8a2016-05-05 12:50:15 -0700579 if (((CH_WIDTH_5MHZ == chan_width) ||
580 (CH_WIDTH_10MHZ == chan_width)) &&
gaurank kathpalia0c48d3d2019-01-29 15:03:07 +0530581 ((MLME_DOT11_MODE_11B == dot11_mode) ||
582 (MLME_DOT11_MODE_11G == dot11_mode) ||
583 (MLME_DOT11_MODE_11N == dot11_mode) ||
584 (MLME_DOT11_MODE_ALL == dot11_mode) ||
585 (MLME_DOT11_MODE_11AC == dot11_mode) ||
586 (MLME_DOT11_MODE_11AX == dot11_mode)))
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530587 phymode = WLAN_PHYMODE_11G;
Amar Singhal046eb8a2016-05-05 12:50:15 -0700588 else {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800589 switch (dot11_mode) {
gaurank kathpalia0c48d3d2019-01-29 15:03:07 +0530590 case MLME_DOT11_MODE_11B:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700591 if ((bw_val == 20) || (bw_val == 40))
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530592 phymode = WLAN_PHYMODE_11B;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800593 break;
gaurank kathpalia0c48d3d2019-01-29 15:03:07 +0530594 case MLME_DOT11_MODE_11G:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700595 if ((bw_val == 20) || (bw_val == 40))
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530596 phymode = WLAN_PHYMODE_11G;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800597 break;
gaurank kathpalia0c48d3d2019-01-29 15:03:07 +0530598 case MLME_DOT11_MODE_11G_ONLY:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700599 if ((bw_val == 20) || (bw_val == 40))
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530600 phymode = WLAN_PHYMODE_11G_ONLY;
Amar Singhal046eb8a2016-05-05 12:50:15 -0700601 break;
gaurank kathpalia0c48d3d2019-01-29 15:03:07 +0530602 case MLME_DOT11_MODE_11N:
603 case MLME_DOT11_MODE_11N_ONLY:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700604 if (bw_val == 20)
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530605 phymode = WLAN_PHYMODE_11NG_HT20;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700606 else if (bw_val == 40)
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530607 phymode = WLAN_PHYMODE_11NG_HT40;
Amar Singhal046eb8a2016-05-05 12:50:15 -0700608 break;
gaurank kathpalia0c48d3d2019-01-29 15:03:07 +0530609 case MLME_DOT11_MODE_ALL:
610 case MLME_DOT11_MODE_11AC:
611 case MLME_DOT11_MODE_11AC_ONLY:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700612 if (bw_val == 20)
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530613 phymode = WLAN_PHYMODE_11AC_VHT20_2G;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700614 else if (bw_val == 40)
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530615 phymode = WLAN_PHYMODE_11AC_VHT40_2G;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800616 break;
gaurank kathpalia0c48d3d2019-01-29 15:03:07 +0530617 case MLME_DOT11_MODE_11AX:
618 case MLME_DOT11_MODE_11AX_ONLY:
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -0800619 if (20 == bw_val)
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530620 phymode = WLAN_PHYMODE_11AXG_HE20;
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -0800621 else if (40 == bw_val)
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530622 phymode = WLAN_PHYMODE_11AXG_HE40;
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -0800623 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800624 default:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800625 break;
626 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800627 }
gaurank kathpaliacc3e2fd2019-11-12 10:33:52 +0530628 } else if (wlan_reg_is_dsrc_freq(freq))
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530629 phymode = WLAN_PHYMODE_11A;
Amar Singhal046eb8a2016-05-05 12:50:15 -0700630 else {
631 if (((CH_WIDTH_5MHZ == chan_width) ||
632 (CH_WIDTH_10MHZ == chan_width)) &&
gaurank kathpalia0c48d3d2019-01-29 15:03:07 +0530633 ((MLME_DOT11_MODE_11A == dot11_mode) ||
634 (MLME_DOT11_MODE_11N == dot11_mode) ||
635 (MLME_DOT11_MODE_ALL == dot11_mode) ||
636 (MLME_DOT11_MODE_11AC == dot11_mode) ||
637 (MLME_DOT11_MODE_11AX == dot11_mode)))
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530638 phymode = WLAN_PHYMODE_11A;
Amar Singhal046eb8a2016-05-05 12:50:15 -0700639 else {
640 switch (dot11_mode) {
gaurank kathpalia0c48d3d2019-01-29 15:03:07 +0530641 case MLME_DOT11_MODE_11A:
Amar Singhal046eb8a2016-05-05 12:50:15 -0700642 if (0 < bw_val)
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530643 phymode = WLAN_PHYMODE_11A;
Amar Singhal046eb8a2016-05-05 12:50:15 -0700644 break;
gaurank kathpalia0c48d3d2019-01-29 15:03:07 +0530645 case MLME_DOT11_MODE_11N:
646 case MLME_DOT11_MODE_11N_ONLY:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700647 if (bw_val == 20)
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530648 phymode = WLAN_PHYMODE_11NA_HT20;
Amar Singhal046eb8a2016-05-05 12:50:15 -0700649 else if (40 <= bw_val)
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530650 phymode = WLAN_PHYMODE_11NA_HT40;
Amar Singhal046eb8a2016-05-05 12:50:15 -0700651 break;
gaurank kathpalia0c48d3d2019-01-29 15:03:07 +0530652 case MLME_DOT11_MODE_ALL:
653 case MLME_DOT11_MODE_11AC:
654 case MLME_DOT11_MODE_11AC_ONLY:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700655 if (bw_val == 20)
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530656 phymode = WLAN_PHYMODE_11AC_VHT20;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700657 else if (bw_val == 40)
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530658 phymode = WLAN_PHYMODE_11AC_VHT40;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700659 else if (bw_val == 80)
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530660 phymode = WLAN_PHYMODE_11AC_VHT80;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700661 else if (chan_width == CH_WIDTH_160MHZ)
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530662 phymode = WLAN_PHYMODE_11AC_VHT160;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700663 else if (chan_width == CH_WIDTH_80P80MHZ)
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530664 phymode = WLAN_PHYMODE_11AC_VHT80_80;
Amar Singhal046eb8a2016-05-05 12:50:15 -0700665 break;
gaurank kathpalia0c48d3d2019-01-29 15:03:07 +0530666 case MLME_DOT11_MODE_11AX:
667 case MLME_DOT11_MODE_11AX_ONLY:
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -0800668 if (20 == bw_val)
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530669 phymode = WLAN_PHYMODE_11AXA_HE20;
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -0800670 else if (40 == bw_val)
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530671 phymode = WLAN_PHYMODE_11AXA_HE40;
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -0800672 else if (80 == bw_val)
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530673 phymode = WLAN_PHYMODE_11AXA_HE80;
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -0800674 else if (CH_WIDTH_160MHZ == chan_width)
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530675 phymode = WLAN_PHYMODE_11AXA_HE160;
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -0800676 else if (CH_WIDTH_80P80MHZ == chan_width)
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530677 phymode = WLAN_PHYMODE_11AXA_HE80_80;
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -0800678 break;
Amar Singhal046eb8a2016-05-05 12:50:15 -0700679 default:
680 break;
681 }
682 }
683 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800684
gaurank kathpaliac99859b2019-07-23 12:02:35 +0530685 WMA_LOGD("%s: phymode %d freq %d ch_width %d dot11_mode %d",
686 __func__, phymode, freq, chan_width, dot11_mode);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800687
Abhishek Ambure6a2773e2019-10-14 15:15:42 +0530688 QDF_ASSERT(phymode != WLAN_PHYMODE_AUTO);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800689 return phymode;
690}
691
692/**
693 * wma_get_link_speed() -send command to get linkspeed
694 * @handle: wma handle
695 * @pLinkSpeed: link speed info
696 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +0530697 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800698 */
Jeff Johnsone943bca2019-02-08 22:45:17 -0800699QDF_STATUS wma_get_link_speed(WMA_HANDLE handle,
700 struct link_speed_info *pLinkSpeed)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800701{
702 tp_wma_handle wma_handle = (tp_wma_handle) handle;
Govind Singhaa64c242016-03-08 11:31:49 +0530703 wmi_mac_addr peer_macaddr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800704
705 if (!wma_handle || !wma_handle->wmi_handle) {
706 WMA_LOGE("%s: WMA is closed, can not issue get link speed cmd",
707 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530708 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800709 }
Sourav Mohapatra89c85d12017-12-01 09:17:54 +0530710 if (!wmi_service_enabled(wma_handle->wmi_handle,
711 wmi_service_estimate_linkspeed)) {
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700712 WMA_LOGE("%s: Linkspeed feature bit not enabled Sending value 0 as link speed.",
713 __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800714 wma_send_link_speed(0);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530715 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800716 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800717 /* Copy the peer macaddress to the wma buffer */
Srinivas Girigowdadccab9a2015-11-19 14:31:14 -0800718 WMI_CHAR_ARRAY_TO_MAC_ADDR(pLinkSpeed->peer_macaddr.bytes,
Govind Singhaa64c242016-03-08 11:31:49 +0530719 &peer_macaddr);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700720 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 -0800721 __func__, pLinkSpeed->peer_macaddr.bytes,
Govind Singhaa64c242016-03-08 11:31:49 +0530722 peer_macaddr.mac_addr31to0,
723 peer_macaddr.mac_addr47to32);
Govind Singhaa64c242016-03-08 11:31:49 +0530724 if (wmi_unified_get_link_speed_cmd(wma_handle->wmi_handle,
725 peer_macaddr)) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530726 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800727 }
Govind Singhaa64c242016-03-08 11:31:49 +0530728
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530729 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800730}
731
Will Huanga9814592017-05-24 15:47:58 +0800732QDF_STATUS wma_get_peer_info_ext(WMA_HANDLE handle,
733 struct sir_peer_info_ext_req *peer_info_req)
734{
735 tp_wma_handle wma_handle = (tp_wma_handle)handle;
736 wmi_request_peer_stats_info_cmd_fixed_param *cmd;
737 wmi_buf_t wmi_buf;
738 uint32_t len;
739 uint8_t *buf_ptr;
740
741 if (!wma_handle || !wma_handle->wmi_handle) {
742 WMA_LOGE("%s: WMA is closed, can not issue get rssi",
743 __func__);
744 return QDF_STATUS_E_INVAL;
745 }
746
747 WMA_LOGI("%s send WMI_REQUEST_PEER_STATS_INFO_CMDID", __func__);
748
749 len = sizeof(wmi_request_peer_stats_info_cmd_fixed_param);
750 wmi_buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -0700751 if (!wmi_buf)
Will Huanga9814592017-05-24 15:47:58 +0800752 return QDF_STATUS_E_NOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -0700753
Will Huanga9814592017-05-24 15:47:58 +0800754 buf_ptr = (uint8_t *)wmi_buf_data(wmi_buf);
755
756 cmd = (wmi_request_peer_stats_info_cmd_fixed_param *)buf_ptr;
757 WMITLV_SET_HDR(&cmd->tlv_header,
758 WMITLV_TAG_STRUC_wmi_request_peer_stats_info_cmd_fixed_param,
759 WMITLV_GET_STRUCT_TLVLEN(
760 wmi_request_peer_stats_info_cmd_fixed_param));
761 cmd->vdev_id = peer_info_req->sessionid;
762 cmd->request_type = WMI_REQUEST_ONE_PEER_STATS_INFO;
763 wma_handle->get_one_peer_info = true;
764 WMI_CHAR_ARRAY_TO_MAC_ADDR(peer_info_req->peer_macaddr.bytes,
765 &cmd->peer_macaddr);
766 cmd->reset_after_request = peer_info_req->reset_after_request;
767
768 if (wmi_unified_cmd_send(wma_handle->wmi_handle, wmi_buf, len,
769 WMI_REQUEST_PEER_STATS_INFO_CMDID)) {
Will Huanga9814592017-05-24 15:47:58 +0800770 wmi_buf_free(wmi_buf);
771 return QDF_STATUS_E_FAILURE;
772 }
773
774 WMA_LOGI("%s vdev_id %d, mac %pM, req_type %x, reset %x",
775 __func__,
776 cmd->vdev_id,
777 peer_info_req->peer_macaddr.bytes,
778 cmd->request_type,
779 cmd->reset_after_request);
780
781 qdf_mem_copy(&(wma_handle->peer_macaddr),
782 &(peer_info_req->peer_macaddr),
783 QDF_MAC_ADDR_SIZE);
784
785 return QDF_STATUS_SUCCESS;
786}
787
guangde4853c402019-05-06 15:54:04 +0800788QDF_STATUS wma_get_isolation(tp_wma_handle wma)
789{
790 wmi_coex_get_antenna_isolation_cmd_fixed_param *cmd;
791 wmi_buf_t wmi_buf;
792 uint32_t len;
793 uint8_t *buf_ptr;
794
795 WMA_LOGD("%s: get isolation", __func__);
796
797 if (!wma || !wma->wmi_handle) {
798 WMA_LOGE("%s: WMA is closed, can not issue get isolation",
799 __func__);
800 return QDF_STATUS_E_INVAL;
801 }
802
803 len = sizeof(wmi_coex_get_antenna_isolation_cmd_fixed_param);
804 wmi_buf = wmi_buf_alloc(wma->wmi_handle, len);
805 if (!wmi_buf) {
806 WMA_LOGE("%s: wmi_buf_alloc failed", __func__);
807 return QDF_STATUS_E_NOMEM;
808 }
809 buf_ptr = (uint8_t *)wmi_buf_data(wmi_buf);
810
811 cmd = (wmi_coex_get_antenna_isolation_cmd_fixed_param *)buf_ptr;
812 WMITLV_SET_HDR(
813 &cmd->tlv_header,
814 WMITLV_TAG_STRUC_wmi_coex_get_antenna_isolation_cmd_fixed_param,
815 WMITLV_GET_STRUCT_TLVLEN(
816 wmi_coex_get_antenna_isolation_cmd_fixed_param));
817
818 if (wmi_unified_cmd_send(wma->wmi_handle, wmi_buf, len,
819 WMI_COEX_GET_ANTENNA_ISOLATION_CMDID)) {
820 WMA_LOGE("Failed to get isolation request from fw");
821 wmi_buf_free(wmi_buf);
822 return QDF_STATUS_E_FAILURE;
823 }
824
825 return QDF_STATUS_SUCCESS;
826}
827
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -0700828/**
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700829 * wma_add_beacon_filter() - Issue WMI command to set beacon filter
830 * @wma: wma handler
831 * @filter_params: beacon_filter_param to set
832 *
833 * Return: Return QDF_STATUS
834 */
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -0700835QDF_STATUS wma_add_beacon_filter(WMA_HANDLE handle,
836 struct beacon_filter_param *filter_params)
837{
838 int i;
839 wmi_buf_t wmi_buf;
840 u_int8_t *buf;
841 A_UINT32 *ie_map;
842 int ret;
Kiran Kumar Lokeref9dc7912017-06-28 18:10:58 -0700843 struct wma_txrx_node *iface;
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -0700844 tp_wma_handle wma = (tp_wma_handle) handle;
Kiran Kumar Lokeref9dc7912017-06-28 18:10:58 -0700845
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -0700846 wmi_add_bcn_filter_cmd_fixed_param *cmd;
847 int len = sizeof(wmi_add_bcn_filter_cmd_fixed_param);
848
849 len += WMI_TLV_HDR_SIZE;
850 len += BCN_FLT_MAX_ELEMS_IE_LIST*sizeof(A_UINT32);
851
852 if (!wma || !wma->wmi_handle) {
853 WMA_LOGE("%s: WMA is closed, can not issue set beacon filter",
854 __func__);
855 return QDF_STATUS_E_INVAL;
856 }
857
Kiran Kumar Lokeref9dc7912017-06-28 18:10:58 -0700858 iface = &wma->interfaces[filter_params->vdev_id];
859 qdf_mem_copy(&iface->beacon_filter, filter_params,
860 sizeof(struct beacon_filter_param));
861 iface->beacon_filter_enabled = true;
862
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -0700863 wmi_buf = wmi_buf_alloc(wma->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -0700864 if (!wmi_buf)
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -0700865 return QDF_STATUS_E_NOMEM;
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -0700866
867 buf = (u_int8_t *) wmi_buf_data(wmi_buf);
868
869 cmd = (wmi_add_bcn_filter_cmd_fixed_param *)wmi_buf_data(wmi_buf);
870 cmd->vdev_id = filter_params->vdev_id;
871
872 WMITLV_SET_HDR(&cmd->tlv_header,
873 WMITLV_TAG_STRUC_wmi_add_bcn_filter_cmd_fixed_param,
874 WMITLV_GET_STRUCT_TLVLEN(
875 wmi_add_bcn_filter_cmd_fixed_param));
876
877 buf += sizeof(wmi_add_bcn_filter_cmd_fixed_param);
878
879 WMITLV_SET_HDR(buf, WMITLV_TAG_ARRAY_UINT32,
880 (BCN_FLT_MAX_ELEMS_IE_LIST * sizeof(u_int32_t)));
881
882 ie_map = (A_UINT32 *)(buf + WMI_TLV_HDR_SIZE);
883 for (i = 0; i < BCN_FLT_MAX_ELEMS_IE_LIST; i++) {
884 ie_map[i] = filter_params->ie_map[i];
885 WMA_LOGD("beacon filter ie map = %u", ie_map[i]);
886 }
887
888 ret = wmi_unified_cmd_send(wma->wmi_handle, wmi_buf, len,
889 WMI_ADD_BCN_FILTER_CMDID);
890 if (ret) {
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -0700891 wmi_buf_free(wmi_buf);
892 return QDF_STATUS_E_FAILURE;
893 }
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -0700894
895 return QDF_STATUS_SUCCESS;
896}
897
898/**
899* wma_remove_beacon_filter() - Issue WMI command to remove beacon filter
900* @wma: wma handler
901* @filter_params: beacon_filter_params
902*
903* Return: Return QDF_STATUS
904*/
905QDF_STATUS wma_remove_beacon_filter(WMA_HANDLE handle,
906 struct beacon_filter_param *filter_params)
907{
908 wmi_buf_t buf;
909 tp_wma_handle wma = (tp_wma_handle) handle;
910 wmi_rmv_bcn_filter_cmd_fixed_param *cmd;
911 int len = sizeof(wmi_rmv_bcn_filter_cmd_fixed_param);
912 int ret;
913
914 if (!wma || !wma->wmi_handle) {
915 WMA_LOGE("%s: WMA is closed, cannot issue remove beacon filter",
916 __func__);
917 return QDF_STATUS_E_INVAL;
918 }
919
920 buf = wmi_buf_alloc(wma->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -0700921 if (!buf)
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -0700922 return QDF_STATUS_E_NOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -0700923
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -0700924 cmd = (wmi_rmv_bcn_filter_cmd_fixed_param *)wmi_buf_data(buf);
925 cmd->vdev_id = filter_params->vdev_id;
926
927 WMITLV_SET_HDR(&cmd->tlv_header,
928 WMITLV_TAG_STRUC_wmi_rmv_bcn_filter_cmd_fixed_param,
929 WMITLV_GET_STRUCT_TLVLEN(
930 wmi_rmv_bcn_filter_cmd_fixed_param));
931
932 ret = wmi_unified_cmd_send(wma->wmi_handle, buf, len,
933 WMI_RMV_BCN_FILTER_CMDID);
934 if (ret) {
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -0700935 wmi_buf_free(buf);
936 return QDF_STATUS_E_FAILURE;
937 }
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -0700938
939 return QDF_STATUS_SUCCESS;
940}
941
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +0530942/**
943 * wma_send_adapt_dwelltime_params() - send adaptive dwelltime configuration
944 * params to firmware
945 * @wma_handle: wma handler
946 * @dwelltime_params: pointer to dwelltime_params
947 *
948 * Return: QDF_STATUS_SUCCESS on success and QDF failure reason code for failure
949 */
950QDF_STATUS wma_send_adapt_dwelltime_params(WMA_HANDLE handle,
951 struct adaptive_dwelltime_params *dwelltime_params)
952{
953 tp_wma_handle wma_handle = (tp_wma_handle) handle;
954 struct wmi_adaptive_dwelltime_params wmi_param = {0};
955 int32_t err;
956
957 wmi_param.is_enabled = dwelltime_params->is_enabled;
958 wmi_param.dwelltime_mode = dwelltime_params->dwelltime_mode;
959 wmi_param.lpf_weight = dwelltime_params->lpf_weight;
960 wmi_param.passive_mon_intval = dwelltime_params->passive_mon_intval;
961 wmi_param.wifi_act_threshold = dwelltime_params->wifi_act_threshold;
962 err = wmi_unified_send_adapt_dwelltime_params_cmd(wma_handle->
963 wmi_handle, &wmi_param);
964 if (err)
965 return QDF_STATUS_E_FAILURE;
966
967 return QDF_STATUS_SUCCESS;
968}
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -0700969
Nitesh Shahf9a09ff2017-05-22 15:46:25 +0530970QDF_STATUS wma_send_dbs_scan_selection_params(WMA_HANDLE handle,
971 struct wmi_dbs_scan_sel_params *dbs_scan_params)
972{
973 tp_wma_handle wma_handle = (tp_wma_handle) handle;
974 int32_t err;
975
976 err = wmi_unified_send_dbs_scan_sel_params_cmd(wma_handle->
977 wmi_handle, dbs_scan_params);
978 if (err)
979 return QDF_STATUS_E_FAILURE;
980
981 return QDF_STATUS_SUCCESS;
982}
983
Govind Singha471e5e2015-10-12 17:11:14 +0530984/**
Govind Singhaa64c242016-03-08 11:31:49 +0530985 * wma_unified_fw_profiling_cmd() - send FW profiling cmd to WLAN FW
Govind Singha471e5e2015-10-12 17:11:14 +0530986 * @wma: wma handle
987 * @cmd: Profiling command index
988 * @value1: parameter1 value
989 * @value2: parameter2 value
990 *
991 * Return: 0 for success else error code
992 */
Govind Singhaa64c242016-03-08 11:31:49 +0530993QDF_STATUS wma_unified_fw_profiling_cmd(wmi_unified_t wmi_handle,
Govind Singha471e5e2015-10-12 17:11:14 +0530994 uint32_t cmd, uint32_t value1, uint32_t value2)
995{
Govind Singha471e5e2015-10-12 17:11:14 +0530996 int ret;
Govind Singha471e5e2015-10-12 17:11:14 +0530997
Govind Singhaa64c242016-03-08 11:31:49 +0530998 ret = wmi_unified_fw_profiling_data_cmd(wmi_handle, cmd,
999 value1, value2);
1000 if (ret) {
1001 WMA_LOGE("enable cmd Failed for id %d value %d",
1002 value1, value2);
1003 return ret;
Govind Singha471e5e2015-10-12 17:11:14 +05301004 }
1005
Govind Singhaa64c242016-03-08 11:31:49 +05301006 return QDF_STATUS_SUCCESS;
Govind Singha471e5e2015-10-12 17:11:14 +05301007}
1008
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001009/**
Naveen Rawatd7734142017-10-27 10:02:40 -07001010 * wma_wow_set_wake_time() - set timer pattern tlv, so that firmware will wake
1011 * up host after specified time is elapsed
1012 * @wma_handle: wma handle
1013 * @vdev_id: vdev id
1014 * @cookie: value to identify reason why host set up wake call.
1015 * @time: time in ms
1016 *
1017 * Return: QDF status
1018 */
1019static QDF_STATUS wma_wow_set_wake_time(WMA_HANDLE wma_handle, uint8_t vdev_id,
1020 uint32_t cookie, uint32_t time)
1021{
1022 int ret;
1023 tp_wma_handle wma = (tp_wma_handle)wma_handle;
1024
1025 WMA_LOGD(FL("send timer patter with time: %d and vdev = %d to fw"),
1026 time, vdev_id);
1027 ret = wmi_unified_wow_timer_pattern_cmd(wma->wmi_handle, vdev_id,
1028 cookie, time);
1029 if (ret) {
1030 WMA_LOGE(FL("Failed to send timer patter to fw"));
1031 return QDF_STATUS_E_FAILURE;
1032 }
1033
1034 return QDF_STATUS_SUCCESS;
1035}
1036
Qiwei Caidcb73b02018-09-17 19:58:29 +08001037#ifdef WLAN_POWER_MANAGEMENT_OFFLOAD
Naveen Rawatd7734142017-10-27 10:02:40 -07001038/**
1039 * wma_check_and_set_wake_timer(): checks all interfaces and if any interface
1040 * has install_key pending, sets timer pattern in fw to wake up host after
1041 * specified time has elapsed.
1042 * @wma: wma handle
1043 * @time: time after which host wants to be awaken.
1044 *
1045 * Return: None
1046 */
1047void wma_check_and_set_wake_timer(uint32_t time)
1048{
1049 int i;
1050 struct wma_txrx_node *iface;
Rajeev Kumarf31b9232018-01-19 14:35:20 -08001051 bool is_set_key_in_progress = false;
Naveen Rawatd7734142017-10-27 10:02:40 -07001052 t_wma_handle *wma = cds_get_context(QDF_MODULE_ID_WMA);
1053
Amar Singhal4c3fbb42018-01-02 13:20:28 -08001054 if (!wma) {
1055 WMA_LOGE("%s: WMA is closed",
1056 __func__);
1057 return;
1058 }
1059
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05301060 if (!wmi_service_enabled(wma->wmi_handle,
1061 wmi_service_wow_wakeup_by_timer_pattern)) {
Naveen Rawatd7734142017-10-27 10:02:40 -07001062 WMA_LOGD("TIME_PATTERN is not enabled");
1063 return;
1064 }
1065
1066 for (i = 0; i < wma->max_bssid; i++) {
1067 iface = &wma->interfaces[i];
Pragaspathi Thilagarajf81a8f02018-08-15 21:44:07 +05301068 if (iface->vdev_active && iface->is_waiting_for_key) {
Naveen Rawatd7734142017-10-27 10:02:40 -07001069 /*
1070 * right now cookie is dont care, since FW disregards
1071 * that.
1072 */
Rajeev Kumarf31b9232018-01-19 14:35:20 -08001073 is_set_key_in_progress = true;
Naveen Rawatd7734142017-10-27 10:02:40 -07001074 wma_wow_set_wake_time((WMA_HANDLE)wma, i, 0, time);
1075 break;
1076 }
1077 }
Rajeev Kumarf31b9232018-01-19 14:35:20 -08001078
1079 if (!is_set_key_in_progress)
1080 WMA_LOGD("set key not in progress for any vdev");
Naveen Rawatd7734142017-10-27 10:02:40 -07001081}
1082
1083/**
Govind Singhd76a5b02016-03-08 15:12:14 +05301084 * wma_unified_csa_offload_enable() - sen CSA offload enable command
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001085 * @wma: wma handle
1086 * @vdev_id: vdev id
1087 *
1088 * Return: 0 for success or error code
1089 */
Govind Singhd76a5b02016-03-08 15:12:14 +05301090int wma_unified_csa_offload_enable(tp_wma_handle wma, uint8_t vdev_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001091{
Govind Singhaa64c242016-03-08 11:31:49 +05301092 if (wmi_unified_csa_offload_enable(wma->wmi_handle,
1093 vdev_id)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001094 WMA_LOGP("%s: Failed to send CSA offload enable command",
1095 __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001096 return -EIO;
1097 }
Govind Singhaa64c242016-03-08 11:31:49 +05301098
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001099 return 0;
1100}
Qiwei Caidcb73b02018-09-17 19:58:29 +08001101#endif /* WLAN_POWER_MANAGEMENT_OFFLOAD */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001102
Abhishek Ambure0ceb5ca2019-11-15 18:22:45 +05301103static uint8_t *
1104wma_parse_ch_switch_wrapper_ie(uint8_t *ch_wr_ie, uint8_t sub_ele_id)
1105{
1106 uint8_t len = 0, sub_ele_len = 0;
1107 struct ie_header *ele;
1108
1109 ele = (struct ie_header *)ch_wr_ie;
1110 if (ele->ie_id != WLAN_ELEMID_CHAN_SWITCH_WRAP ||
1111 ele->ie_len == 0)
1112 return NULL;
1113
1114 len = ele->ie_len;
1115 ele = (struct ie_header *)(ch_wr_ie + sizeof(struct ie_header));
1116
1117 while (len > 0) {
1118 sub_ele_len = sizeof(struct ie_header) + ele->ie_len;
1119 len -= sub_ele_len;
1120 if (ele->ie_id == sub_ele_id)
1121 return (uint8_t *)ele;
1122
1123 ele = (struct ie_header *)((uint8_t *)ele + sub_ele_len);
1124 }
1125
1126 return NULL;
1127}
1128
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001129/**
1130 * wma_csa_offload_handler() - CSA event handler
1131 * @handle: wma handle
1132 * @event: event buffer
1133 * @len: buffer length
1134 *
1135 * This event is sent by firmware when it receives CSA IE.
1136 *
1137 * Return: 0 for success or error code
1138 */
1139int wma_csa_offload_handler(void *handle, uint8_t *event, uint32_t len)
1140{
1141 tp_wma_handle wma = (tp_wma_handle) handle;
1142 WMI_CSA_HANDLING_EVENTID_param_tlvs *param_buf;
1143 wmi_csa_event_fixed_param *csa_event;
Srinivas Girigowdaa47b45f2019-02-27 12:29:02 -08001144 uint8_t bssid[QDF_MAC_ADDR_SIZE];
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001145 uint8_t vdev_id = 0;
1146 uint8_t cur_chan = 0;
1147 struct ieee80211_channelswitch_ie *csa_ie;
Chandrasekaran, Manishekar5c19dc52016-02-04 14:58:26 +05301148 struct csa_offload_params *csa_offload_event;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001149 struct ieee80211_extendedchannelswitch_ie *xcsa_ie;
1150 struct ieee80211_ie_wide_bw_switch *wb_ie;
1151 struct wma_txrx_node *intr = wma->interfaces;
1152
1153 param_buf = (WMI_CSA_HANDLING_EVENTID_param_tlvs *) event;
1154
1155 WMA_LOGD("%s: Enter", __func__);
1156 if (!param_buf) {
1157 WMA_LOGE("Invalid csa event buffer");
1158 return -EINVAL;
1159 }
1160 csa_event = param_buf->fixed_param;
1161 WMI_MAC_ADDR_TO_CHAR_ARRAY(&csa_event->i_addr2, &bssid[0]);
1162
Vevek Venkatesan2d88a6b2019-10-04 19:03:10 +05301163 if (wma_find_vdev_id_by_bssid(wma, bssid, &vdev_id)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001164 WMA_LOGE("Invalid bssid received %s:%d", __func__, __LINE__);
1165 return -EINVAL;
1166 }
1167
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301168 csa_offload_event = qdf_mem_malloc(sizeof(*csa_offload_event));
Arif Hussain157263f2018-10-03 13:07:15 -07001169 if (!csa_offload_event)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001170 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001171
Tushnim Bhattacharyyaeb622b02018-05-07 13:50:51 -07001172 if (wma->interfaces[vdev_id].roaming_in_progress ||
1173 wma->interfaces[vdev_id].roam_synch_in_progress) {
1174 WMA_LOGE("Roaming in progress for vdev %d, ignore csa_offload_event",
1175 vdev_id);
1176 qdf_mem_free(csa_offload_event);
1177 return -EINVAL;
1178 }
1179
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301180 qdf_mem_zero(csa_offload_event, sizeof(*csa_offload_event));
Srinivas Girigowdaa47b45f2019-02-27 12:29:02 -08001181 qdf_mem_copy(csa_offload_event->bssId, &bssid, QDF_MAC_ADDR_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001182
1183 if (csa_event->ies_present_flag & WMI_CSA_IE_PRESENT) {
1184 csa_ie = (struct ieee80211_channelswitch_ie *)
1185 (&csa_event->csa_ie[0]);
1186 csa_offload_event->channel = csa_ie->newchannel;
Liangwei Dongc1956bd2020-01-07 19:50:57 +08001187 csa_offload_event->csa_chan_freq =
1188 wlan_reg_legacy_chan_to_freq(wma->pdev,
1189 csa_ie->newchannel);
Chandrasekaran, Manishekar5c19dc52016-02-04 14:58:26 +05301190 csa_offload_event->switch_mode = csa_ie->switchmode;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001191 } else if (csa_event->ies_present_flag & WMI_XCSA_IE_PRESENT) {
1192 xcsa_ie = (struct ieee80211_extendedchannelswitch_ie *)
1193 (&csa_event->xcsa_ie[0]);
1194 csa_offload_event->channel = xcsa_ie->newchannel;
Chandrasekaran, Manishekar5c19dc52016-02-04 14:58:26 +05301195 csa_offload_event->switch_mode = xcsa_ie->switchmode;
Gupta, Kapil121bf212015-11-25 19:21:29 +05301196 csa_offload_event->new_op_class = xcsa_ie->newClass;
Liangwei Dongc1956bd2020-01-07 19:50:57 +08001197 if (wlan_reg_is_6ghz_op_class(wma->pdev, xcsa_ie->newClass)) {
1198 csa_offload_event->csa_chan_freq =
1199 wlan_reg_chan_band_to_freq
1200 (wma->pdev, xcsa_ie->newchannel,
1201 BIT(REG_BAND_6G));
1202 } else {
1203 csa_offload_event->csa_chan_freq =
1204 wlan_reg_legacy_chan_to_freq
1205 (wma->pdev, xcsa_ie->newchannel);
1206 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001207 } else {
1208 WMA_LOGE("CSA Event error: No CSA IE present");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301209 qdf_mem_free(csa_offload_event);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001210 return -EINVAL;
1211 }
1212
1213 if (csa_event->ies_present_flag & WMI_WBW_IE_PRESENT) {
1214 wb_ie = (struct ieee80211_ie_wide_bw_switch *)
1215 (&csa_event->wb_ie[0]);
1216 csa_offload_event->new_ch_width = wb_ie->new_ch_width;
1217 csa_offload_event->new_ch_freq_seg1 = wb_ie->new_ch_freq_seg1;
1218 csa_offload_event->new_ch_freq_seg2 = wb_ie->new_ch_freq_seg2;
Abhishek Ambure0ceb5ca2019-11-15 18:22:45 +05301219 } else if (csa_event->ies_present_flag &
1220 WMI_CSWRAP_IE_EXTENDED_PRESENT) {
1221 wb_ie = (struct ieee80211_ie_wide_bw_switch *)
1222 wma_parse_ch_switch_wrapper_ie(
1223 (uint8_t *)&csa_event->cswrap_ie_extended,
1224 WLAN_ELEMID_WIDE_BAND_CHAN_SWITCH);
1225 if (wb_ie) {
1226 csa_offload_event->new_ch_width = wb_ie->new_ch_width;
1227 csa_offload_event->new_ch_freq_seg1 =
1228 wb_ie->new_ch_freq_seg1;
1229 csa_offload_event->new_ch_freq_seg2 =
1230 wb_ie->new_ch_freq_seg2;
1231 csa_event->ies_present_flag |= WMI_WBW_IE_PRESENT;
1232 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001233 }
1234
1235 csa_offload_event->ies_present_flag = csa_event->ies_present_flag;
1236
Abhishek Singh98ab5e42020-02-14 11:07:31 +05301237 WMA_LOGD("CSA: BSSID %pM chan %d freq %d flag 0x%x width = %d freq1 = %d freq2 = %d op class = %d",
1238 csa_offload_event->bssId, csa_offload_event->channel,
1239 csa_offload_event->csa_chan_freq,
Abhishek Ambure0ceb5ca2019-11-15 18:22:45 +05301240 csa_event->ies_present_flag,
1241 csa_offload_event->new_ch_width,
1242 csa_offload_event->new_ch_freq_seg1,
1243 csa_offload_event->new_ch_freq_seg2,
1244 csa_offload_event->new_op_class);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001245
1246 cur_chan = cds_freq_to_chan(intr[vdev_id].mhz);
1247 /*
1248 * basic sanity check: requested channel should not be 0
1249 * and equal to home channel
1250 */
Kiran Kumar Lokere75d636f2016-12-20 14:52:03 -08001251 if (0 == csa_offload_event->channel) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001252 WMA_LOGE("CSA Event with channel %d. Ignore !!",
1253 csa_offload_event->channel);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301254 qdf_mem_free(csa_offload_event);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001255 return -EINVAL;
1256 }
Abhishek Singhfb5b4d32018-12-06 11:53:08 +05301257
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001258 wma_send_msg(wma, WMA_CSA_OFFLOAD_EVENT, (void *)csa_offload_event, 0);
1259 return 0;
1260}
1261
1262#ifdef FEATURE_OEM_DATA_SUPPORT
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001263/**
Krishna Kumaar Natarajan4e9cf392015-11-20 13:35:05 -08001264 * wma_oem_data_response_handler() - OEM data response event handler
1265 * @handle: wma handle
1266 * @datap: data ptr
1267 * @len: data length
1268 *
1269 * Return: 0 for success or error code
1270 */
1271int wma_oem_data_response_handler(void *handle,
1272 uint8_t *datap, uint32_t len)
1273{
Krishna Kumaar Natarajan4e9cf392015-11-20 13:35:05 -08001274 WMI_OEM_RESPONSE_EVENTID_param_tlvs *param_buf;
1275 uint8_t *data;
1276 uint32_t datalen;
Krishna Kumaar Natarajanc1fa17d2016-08-03 14:19:20 -07001277 struct oem_data_rsp *oem_rsp;
Jeff Johnson9f18aa72018-12-02 12:05:12 -08001278 struct mac_context *pmac = cds_get_context(QDF_MODULE_ID_PE);
Krishna Kumaar Natarajan73ea9f22016-06-30 18:38:47 -07001279
1280 if (!pmac) {
1281 WMA_LOGE(FL("Invalid pmac"));
1282 return -EINVAL;
1283 }
1284
Krishna Kumaar Natarajanbbbf2ef2016-08-03 14:06:26 -07001285 if (!pmac->sme.oem_data_rsp_callback) {
Krishna Kumaar Natarajan73ea9f22016-06-30 18:38:47 -07001286 WMA_LOGE(FL("Callback not registered"));
1287 return -EINVAL;
1288 }
Krishna Kumaar Natarajan4e9cf392015-11-20 13:35:05 -08001289
1290 param_buf = (WMI_OEM_RESPONSE_EVENTID_param_tlvs *) datap;
1291 if (!param_buf) {
1292 WMA_LOGE(FL("Received NULL buf ptr from FW"));
1293 return -ENOMEM;
1294 }
1295
1296 data = param_buf->data;
1297 datalen = param_buf->num_data;
1298
1299 if (!data) {
1300 WMA_LOGE(FL("Received NULL data from FW"));
1301 return -EINVAL;
1302 }
1303
1304 if (datalen > OEM_DATA_RSP_SIZE) {
1305 WMA_LOGE(FL("Received data len %d exceeds max value %d"),
1306 datalen, OEM_DATA_RSP_SIZE);
1307 return -EINVAL;
1308 }
1309
Krishna Kumaar Natarajan608291e2015-12-14 18:17:27 -08001310 oem_rsp = qdf_mem_malloc(sizeof(*oem_rsp));
Arif Hussain157263f2018-10-03 13:07:15 -07001311 if (!oem_rsp)
Krishna Kumaar Natarajan4e9cf392015-11-20 13:35:05 -08001312 return -ENOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -07001313
Krishna Kumaar Natarajan608291e2015-12-14 18:17:27 -08001314 oem_rsp->rsp_len = datalen;
Krishna Kumaar Natarajana96ee0f2016-03-10 16:57:45 -08001315 if (oem_rsp->rsp_len) {
Krishna Kumaar Natarajan73ea9f22016-06-30 18:38:47 -07001316 oem_rsp->data = qdf_mem_malloc(oem_rsp->rsp_len);
1317 if (!oem_rsp->data) {
Krishna Kumaar Natarajana96ee0f2016-03-10 16:57:45 -08001318 qdf_mem_free(oem_rsp);
1319 return -ENOMEM;
1320 }
1321 } else {
1322 WMA_LOGE(FL("Invalid rsp length: %d"),
1323 oem_rsp->rsp_len);
Krishna Kumaar Natarajan608291e2015-12-14 18:17:27 -08001324 qdf_mem_free(oem_rsp);
Krishna Kumaar Natarajana96ee0f2016-03-10 16:57:45 -08001325 return -EINVAL;
Krishna Kumaar Natarajan608291e2015-12-14 18:17:27 -08001326 }
Krishna Kumaar Natarajan4e9cf392015-11-20 13:35:05 -08001327
Krishna Kumaar Natarajan73ea9f22016-06-30 18:38:47 -07001328 qdf_mem_copy(oem_rsp->data, data, datalen);
Krishna Kumaar Natarajan4e9cf392015-11-20 13:35:05 -08001329
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08001330 WMA_LOGD("Sending OEM_DATA_RSP(len: %d) to upper layer", datalen);
Krishna Kumaar Natarajan4e9cf392015-11-20 13:35:05 -08001331
Krishna Kumaar Natarajanbbbf2ef2016-08-03 14:06:26 -07001332 pmac->sme.oem_data_rsp_callback(oem_rsp);
Krishna Kumaar Natarajan73ea9f22016-06-30 18:38:47 -07001333
1334 if (oem_rsp->data)
1335 qdf_mem_free(oem_rsp->data);
1336 qdf_mem_free(oem_rsp);
1337
Krishna Kumaar Natarajan4e9cf392015-11-20 13:35:05 -08001338 return 0;
1339}
1340
Paul Zhangda2970b2019-06-23 18:16:38 +08001341QDF_STATUS wma_start_oem_req_cmd(tp_wma_handle wma_handle,
1342 struct oem_data_req *oem_data_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001343{
Paul Zhangda2970b2019-06-23 18:16:38 +08001344 QDF_STATUS ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001345
Krishna Kumaar Natarajan9ac8efd2015-11-20 13:40:24 -08001346 WMA_LOGD(FL("Send OEM Data Request to target"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001347
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07001348 if (!oem_data_req || !oem_data_req->data) {
1349 WMA_LOGE(FL("oem_data_req is null"));
1350 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001351 }
1352
1353 if (!wma_handle || !wma_handle->wmi_handle) {
Krishna Kumaar Natarajan9ac8efd2015-11-20 13:40:24 -08001354 WMA_LOGE(FL("WMA - closed, can not send Oem data request cmd"));
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07001355 qdf_mem_free(oem_data_req->data);
1356 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001357 }
1358
Paul Zhangda2970b2019-06-23 18:16:38 +08001359 /* legacy api, for oem data request case */
Govind Singhaa64c242016-03-08 11:31:49 +05301360 ret = wmi_unified_start_oem_data_cmd(wma_handle->wmi_handle,
Paul Zhangda2970b2019-06-23 18:16:38 +08001361 oem_data_req->data_len,
1362 oem_data_req->data);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001363
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07001364 if (!QDF_IS_STATUS_SUCCESS(ret))
1365 WMA_LOGE(FL("wmi cmd send failed"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001366
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07001367 return ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001368}
1369#endif /* FEATURE_OEM_DATA_SUPPORT */
1370
Paul Zhangda2970b2019-06-23 18:16:38 +08001371#ifdef FEATURE_OEM_DATA
1372QDF_STATUS wma_start_oem_data_cmd(tp_wma_handle wma_handle,
1373 struct oem_data *oem_data)
1374{
1375 QDF_STATUS ret;
1376
1377 wma_debug("Send OEM Data to target");
1378
1379 if (!oem_data || !oem_data->data) {
1380 wma_err("oem_data is null");
1381 return QDF_STATUS_E_INVAL;
1382 }
1383
1384 if (!wma_handle || !wma_handle->wmi_handle) {
1385 wma_err("WMA - closed");
1386 return QDF_STATUS_E_INVAL;
1387 }
1388
1389 /* common api, for oem data command case */
1390 ret = wmi_unified_start_oemv2_data_cmd(wma_handle->wmi_handle,
1391 oem_data);
1392 if (!QDF_IS_STATUS_SUCCESS(ret))
1393 wma_err("call start wmi cmd failed");
1394
1395 return ret;
1396}
1397#endif
1398
Vevek Venkatesan988a1392019-06-19 00:54:11 +05301399#if !defined(REMOVE_PKT_LOG) && defined(FEATURE_PKTLOG)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001400/**
1401 * wma_pktlog_wmi_send_cmd() - send pktlog enable/disable command to target
1402 * @handle: wma handle
1403 * @params: pktlog params
1404 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301405 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001406 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301407QDF_STATUS wma_pktlog_wmi_send_cmd(WMA_HANDLE handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001408 struct ath_pktlog_wmi_params *params)
1409{
1410 tp_wma_handle wma_handle = (tp_wma_handle) handle;
Govind Singhaa64c242016-03-08 11:31:49 +05301411 int ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001412
Govind Singhaa64c242016-03-08 11:31:49 +05301413 ret = wmi_unified_pktlog_wmi_send_cmd(wma_handle->wmi_handle,
Srinivas Girigowdac34f11d2016-02-25 16:02:42 -08001414 params->pktlog_event,
1415 params->cmd_id, params->user_triggered);
Govind Singhaa64c242016-03-08 11:31:49 +05301416 if (ret)
1417 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001418
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301419 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001420}
Vevek Venkatesan988a1392019-06-19 00:54:11 +05301421#endif /* !REMOVE_PKT_LOG && FEATURE_PKTLOG */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001422
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001423/**
1424 * wma_wow_wake_reason_str() - Converts wow wakeup reason code to text format
1425 * @wake_reason - WOW wake reason
1426 *
1427 * Return: reason code in string format
1428 */
Krunal Sonibd7e8932018-10-03 11:14:51 -07001429static const uint8_t *wma_wow_wake_reason_str(A_INT32 wake_reason)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001430{
1431 switch (wake_reason) {
1432 case WOW_REASON_UNSPECIFIED:
1433 return "UNSPECIFIED";
1434 case WOW_REASON_NLOD:
1435 return "NLOD";
1436 case WOW_REASON_AP_ASSOC_LOST:
1437 return "AP_ASSOC_LOST";
1438 case WOW_REASON_LOW_RSSI:
1439 return "LOW_RSSI";
1440 case WOW_REASON_DEAUTH_RECVD:
1441 return "DEAUTH_RECVD";
1442 case WOW_REASON_DISASSOC_RECVD:
1443 return "DISASSOC_RECVD";
1444 case WOW_REASON_GTK_HS_ERR:
1445 return "GTK_HS_ERR";
1446 case WOW_REASON_EAP_REQ:
1447 return "EAP_REQ";
1448 case WOW_REASON_FOURWAY_HS_RECV:
1449 return "FOURWAY_HS_RECV";
1450 case WOW_REASON_TIMER_INTR_RECV:
1451 return "TIMER_INTR_RECV";
1452 case WOW_REASON_PATTERN_MATCH_FOUND:
1453 return "PATTERN_MATCH_FOUND";
1454 case WOW_REASON_RECV_MAGIC_PATTERN:
1455 return "RECV_MAGIC_PATTERN";
1456 case WOW_REASON_P2P_DISC:
1457 return "P2P_DISC";
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001458 case WOW_REASON_WLAN_HB:
1459 return "WLAN_HB";
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001460 case WOW_REASON_CSA_EVENT:
1461 return "CSA_EVENT";
1462 case WOW_REASON_PROBE_REQ_WPS_IE_RECV:
Dustin Brown72f02252017-01-10 15:34:57 -08001463 return "PROBE_REQ_WPS_IE_RECV";
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001464 case WOW_REASON_AUTH_REQ_RECV:
1465 return "AUTH_REQ_RECV";
1466 case WOW_REASON_ASSOC_REQ_RECV:
1467 return "ASSOC_REQ_RECV";
1468 case WOW_REASON_HTT_EVENT:
Dustin Brown72f02252017-01-10 15:34:57 -08001469 return "HTT_EVENT";
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001470 case WOW_REASON_RA_MATCH:
Dustin Brown72f02252017-01-10 15:34:57 -08001471 return "RA_MATCH";
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001472 case WOW_REASON_HOST_AUTO_SHUTDOWN:
Dustin Brown72f02252017-01-10 15:34:57 -08001473 return "HOST_AUTO_SHUTDOWN";
1474 case WOW_REASON_IOAC_MAGIC_EVENT:
1475 return "IOAC_MAGIC_EVENT";
1476 case WOW_REASON_IOAC_SHORT_EVENT:
1477 return "IOAC_SHORT_EVENT";
1478 case WOW_REASON_IOAC_EXTEND_EVENT:
1479 return "IOAC_EXTEND_EVENT";
1480 case WOW_REASON_IOAC_TIMER_EVENT:
1481 return "IOAC_TIMER_EVENT";
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001482 case WOW_REASON_ROAM_HO:
Dustin Brown72f02252017-01-10 15:34:57 -08001483 return "ROAM_HO";
Pragaspathi Thilagaraj0c4489f2019-08-05 20:50:23 +05301484 case WOW_REASON_ROAM_PREAUTH_START:
1485 return "ROAM_PREAUTH_START_EVENT";
Dustin Brown72f02252017-01-10 15:34:57 -08001486 case WOW_REASON_DFS_PHYERR_RADADR_EVENT:
1487 return "DFS_PHYERR_RADADR_EVENT";
1488 case WOW_REASON_BEACON_RECV:
1489 return "BEACON_RECV";
1490 case WOW_REASON_CLIENT_KICKOUT_EVENT:
1491 return "CLIENT_KICKOUT_EVENT";
Naveen Rawatc9f09522016-05-12 14:02:42 -07001492 case WOW_REASON_NAN_EVENT:
Dustin Brown72f02252017-01-10 15:34:57 -08001493 return "NAN_EVENT";
1494 case WOW_REASON_EXTSCAN:
1495 return "EXTSCAN";
1496 case WOW_REASON_RSSI_BREACH_EVENT:
1497 return "RSSI_BREACH_EVENT";
1498 case WOW_REASON_IOAC_REV_KA_FAIL_EVENT:
1499 return "IOAC_REV_KA_FAIL_EVENT";
1500 case WOW_REASON_IOAC_SOCK_EVENT:
1501 return "IOAC_SOCK_EVENT";
1502 case WOW_REASON_NLO_SCAN_COMPLETE:
1503 return "NLO_SCAN_COMPLETE";
1504 case WOW_REASON_PACKET_FILTER_MATCH:
1505 return "PACKET_FILTER_MATCH";
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05301506 case WOW_REASON_ASSOC_RES_RECV:
1507 return "ASSOC_RES_RECV";
1508 case WOW_REASON_REASSOC_REQ_RECV:
1509 return "REASSOC_REQ_RECV";
1510 case WOW_REASON_REASSOC_RES_RECV:
1511 return "REASSOC_RES_RECV";
1512 case WOW_REASON_ACTION_FRAME_RECV:
1513 return "ACTION_FRAME_RECV";
Arun Khandavalli3dd06de2016-08-17 10:20:29 +05301514 case WOW_REASON_BPF_ALLOW:
Nachiket Kukade177b5b02018-05-22 20:52:17 +05301515 return "BPF_ALLOW";
Rajeev Kumar969d1b12016-12-20 23:53:20 -08001516 case WOW_REASON_NAN_DATA:
Dustin Brown72f02252017-01-10 15:34:57 -08001517 return "NAN_DATA";
1518 case WOW_REASON_OEM_RESPONSE_EVENT:
1519 return "OEM_RESPONSE_EVENT";
Rajeev Kumar969d1b12016-12-20 23:53:20 -08001520 case WOW_REASON_TDLS_CONN_TRACKER_EVENT:
Dustin Brown72f02252017-01-10 15:34:57 -08001521 return "TDLS_CONN_TRACKER_EVENT";
Rajeev Kumar969d1b12016-12-20 23:53:20 -08001522 case WOW_REASON_CRITICAL_LOG:
Dustin Brown72f02252017-01-10 15:34:57 -08001523 return "CRITICAL_LOG";
Rajeev Kumar969d1b12016-12-20 23:53:20 -08001524 case WOW_REASON_P2P_LISTEN_OFFLOAD:
Dustin Brown72f02252017-01-10 15:34:57 -08001525 return "P2P_LISTEN_OFFLOAD";
Rajeev Kumar969d1b12016-12-20 23:53:20 -08001526 case WOW_REASON_NAN_EVENT_WAKE_HOST:
Dustin Brown72f02252017-01-10 15:34:57 -08001527 return "NAN_EVENT_WAKE_HOST";
1528 case WOW_REASON_DEBUG_TEST:
1529 return "DEBUG_TEST";
Ravi Kumar Bokka05c14e52017-03-27 14:48:23 +05301530 case WOW_REASON_CHIP_POWER_FAILURE_DETECT:
1531 return "CHIP_POWER_FAILURE_DETECT";
Amar Singhal5eb9acb2017-05-26 15:25:27 -07001532 case WOW_REASON_11D_SCAN:
1533 return "11D_SCAN";
Arif Hussain05fb4872018-01-03 16:02:55 -08001534 case WOW_REASON_SAP_OBSS_DETECTION:
1535 return "SAP_OBSS_DETECTION";
1536 case WOW_REASON_BSS_COLOR_COLLISION_DETECT:
1537 return "BSS_COLOR_COLLISION_DETECT";
Visweswara Tanuku633976b2019-01-07 16:13:12 +05301538#ifdef WLAN_FEATURE_MOTION_DETECTION
1539 case WOW_REASON_WLAN_MD:
1540 return "MOTION_DETECT";
1541 case WOW_REASON_WLAN_BL:
1542 return "MOTION_DETECT_BASELINE";
1543#endif /* WLAN_FEATURE_MOTION_DETECTION */
Rajeev Kumar0e5dec02019-06-13 18:12:22 -07001544 case WOW_REASON_PAGE_FAULT:
1545 return "PAGE_FAULT";
Srikanth Marepalli72213312019-12-20 16:11:02 +05301546 case WOW_REASON_ROAM_PMKID_REQUEST:
1547 return "ROAM_PMKID_REQUEST";
Dustin Brown72f02252017-01-10 15:34:57 -08001548 default:
1549 return "unknown";
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001550 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001551}
1552
Dustin Brownb1032c22018-05-03 16:21:19 -07001553static bool wma_wow_reason_has_stats(enum wake_reason_e reason)
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08001554{
Dustin Brownb1032c22018-05-03 16:21:19 -07001555 switch (reason) {
1556 case WOW_REASON_ASSOC_REQ_RECV:
1557 case WOW_REASON_DISASSOC_RECVD:
1558 case WOW_REASON_ASSOC_RES_RECV:
1559 case WOW_REASON_REASSOC_REQ_RECV:
1560 case WOW_REASON_REASSOC_RES_RECV:
1561 case WOW_REASON_AUTH_REQ_RECV:
1562 case WOW_REASON_DEAUTH_RECVD:
1563 case WOW_REASON_ACTION_FRAME_RECV:
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08001564 case WOW_REASON_BPF_ALLOW:
1565 case WOW_REASON_PATTERN_MATCH_FOUND:
Will Huang3f7cb652018-11-28 10:41:24 +08001566 case WOW_REASON_PACKET_FILTER_MATCH:
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08001567 case WOW_REASON_RA_MATCH:
1568 case WOW_REASON_NLOD:
1569 case WOW_REASON_NLO_SCAN_COMPLETE:
1570 case WOW_REASON_LOW_RSSI:
1571 case WOW_REASON_EXTSCAN:
1572 case WOW_REASON_RSSI_BREACH_EVENT:
1573 case WOW_REASON_OEM_RESPONSE_EVENT:
1574 case WOW_REASON_CHIP_POWER_FAILURE_DETECT:
1575 case WOW_REASON_11D_SCAN:
Dustin Brownb1032c22018-05-03 16:21:19 -07001576 return true;
Visweswara Tanuku633976b2019-01-07 16:13:12 +05301577#ifdef WLAN_FEATURE_MOTION_DETECTION
1578 case WOW_REASON_WLAN_MD:
1579 case WOW_REASON_WLAN_BL:
1580 return true;
1581#endif /* WLAN_FEATURE_MOTION_DETECTION */
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08001582 default:
Dustin Brownb1032c22018-05-03 16:21:19 -07001583 return false;
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08001584 }
Dustin Brownb1032c22018-05-03 16:21:19 -07001585}
1586
1587static void wma_inc_wow_stats(t_wma_handle *wma,
1588 WOW_EVENT_INFO_fixed_param *wake_info)
1589{
1590 ucfg_mc_cp_stats_inc_wake_lock_stats(wma->psoc,
1591 wake_info->vdev_id,
1592 wake_info->wake_reason);
1593}
1594
1595static void wma_wow_stats_display(struct wake_lock_stats *stats)
1596{
1597 WMA_LOGA("WLAN wake reason counters:");
1598 WMA_LOGA("uc:%d bc:%d v4_mc:%d v6_mc:%d ra:%d ns:%d na:%d "
1599 "icmp:%d icmpv6:%d",
1600 stats->ucast_wake_up_count,
1601 stats->bcast_wake_up_count,
1602 stats->ipv4_mcast_wake_up_count,
1603 stats->ipv6_mcast_wake_up_count,
1604 stats->ipv6_mcast_ra_stats,
1605 stats->ipv6_mcast_ns_stats,
1606 stats->ipv6_mcast_na_stats,
1607 stats->icmpv4_count,
1608 stats->icmpv6_count);
1609
1610 WMA_LOGA("assoc:%d disassoc:%d assoc_resp:%d reassoc:%d "
1611 "reassoc_resp:%d auth:%d deauth:%d action:%d",
1612 stats->mgmt_assoc,
1613 stats->mgmt_disassoc,
1614 stats->mgmt_assoc_resp,
1615 stats->mgmt_reassoc,
1616 stats->mgmt_reassoc_resp,
1617 stats->mgmt_auth,
1618 stats->mgmt_deauth,
1619 stats->mgmt_action);
1620
1621 WMA_LOGA("pno_match:%d pno_complete:%d gscan:%d "
1622 "low_rssi:%d rssi_breach:%d oem:%d scan_11d:%d",
1623 stats->pno_match_wake_up_count,
1624 stats->pno_complete_wake_up_count,
1625 stats->gscan_wake_up_count,
1626 stats->low_rssi_wake_up_count,
1627 stats->rssi_breach_wake_up_count,
1628 stats->oem_response_wake_up_count,
1629 stats->scan_11d);
1630}
1631
1632static void wma_print_wow_stats(t_wma_handle *wma,
1633 WOW_EVENT_INFO_fixed_param *wake_info)
1634{
1635 struct wlan_objmgr_vdev *vdev;
1636 struct wake_lock_stats stats = {0};
1637
1638 if (!wma_wow_reason_has_stats(wake_info->wake_reason))
1639 return;
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08001640
1641 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(wma->psoc,
1642 wake_info->vdev_id,
1643 WLAN_LEGACY_WMA_ID);
Abhinav Kumar9ff44902019-11-12 13:53:21 +05301644 if (!vdev) {
1645 WMA_LOGE("%s, vdev_id: %d, failed to get vdev from psoc",
1646 __func__, wake_info->vdev_id);
1647 return;
1648 }
1649
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08001650 ucfg_mc_cp_stats_get_vdev_wake_lock_stats(vdev, &stats);
1651 wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_WMA_ID);
1652 wma_wow_stats_display(&stats);
1653}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001654
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001655#ifdef FEATURE_WLAN_EXTSCAN
1656/**
1657 * wma_extscan_get_eventid_from_tlvtag() - map tlv tag to corresponding event id
1658 * @tag: WMI TLV tag
1659 *
1660 * Return:
1661 * 0 if TLV tag is invalid
1662 * else return corresponding WMI event id
1663 */
1664static int wma_extscan_get_eventid_from_tlvtag(uint32_t tag)
1665{
1666 uint32_t event_id;
1667
1668 switch (tag) {
1669 case WMITLV_TAG_STRUC_wmi_extscan_start_stop_event_fixed_param:
1670 event_id = WMI_EXTSCAN_START_STOP_EVENTID;
1671 break;
1672
1673 case WMITLV_TAG_STRUC_wmi_extscan_operation_event_fixed_param:
1674 event_id = WMI_EXTSCAN_OPERATION_EVENTID;
1675 break;
1676
1677 case WMITLV_TAG_STRUC_wmi_extscan_table_usage_event_fixed_param:
1678 event_id = WMI_EXTSCAN_TABLE_USAGE_EVENTID;
1679 break;
1680
1681 case WMITLV_TAG_STRUC_wmi_extscan_cached_results_event_fixed_param:
1682 event_id = WMI_EXTSCAN_CACHED_RESULTS_EVENTID;
1683 break;
1684
1685 case WMITLV_TAG_STRUC_wmi_extscan_wlan_change_results_event_fixed_param:
1686 event_id = WMI_EXTSCAN_WLAN_CHANGE_RESULTS_EVENTID;
1687 break;
1688
1689 case WMITLV_TAG_STRUC_wmi_extscan_hotlist_match_event_fixed_param:
1690 event_id = WMI_EXTSCAN_HOTLIST_MATCH_EVENTID;
1691 break;
1692
1693 case WMITLV_TAG_STRUC_wmi_extscan_capabilities_event_fixed_param:
1694 event_id = WMI_EXTSCAN_CAPABILITIES_EVENTID;
1695 break;
1696
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001697 default:
1698 event_id = 0;
1699 WMA_LOGE("%s: Unknown tag: %d", __func__, tag);
1700 break;
1701 }
1702
1703 WMA_LOGI("%s: For tag %d WMI event 0x%x", __func__, tag, event_id);
1704 return event_id;
1705}
1706#else
1707static int wma_extscan_get_eventid_from_tlvtag(uint32_t tag)
1708{
1709 return 0;
1710}
1711#endif
1712
1713/**
1714 * wow_get_wmi_eventid() - map reason or tlv tag to corresponding event id
1715 * @tag: WMI TLV tag
1716 * @reason: WOW reason
1717 *
1718 * WOW reason type is primarily used to find the ID. If there could be
1719 * multiple events that can be sent as a WOW event with same reason
1720 * then tlv tag is used to identify the corresponding event.
1721 *
1722 * Return:
1723 * 0 if TLV tag/reason is invalid
1724 * else return corresponding WMI event id
1725 */
1726static int wow_get_wmi_eventid(int32_t reason, uint32_t tag)
1727{
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001728 int event_id;
1729
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001730 switch (reason) {
Dustin Browne2206fb2017-04-20 13:39:25 -07001731 case WOW_REASON_AP_ASSOC_LOST:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001732 event_id = WMI_ROAM_EVENTID;
1733 break;
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001734 case WOW_REASON_NLO_SCAN_COMPLETE:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001735 event_id = WMI_NLO_SCAN_COMPLETE_EVENTID;
1736 break;
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001737 case WOW_REASON_CSA_EVENT:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001738 event_id = WMI_CSA_HANDLING_EVENTID;
1739 break;
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001740 case WOW_REASON_LOW_RSSI:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001741 event_id = WMI_ROAM_EVENTID;
1742 break;
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001743 case WOW_REASON_CLIENT_KICKOUT_EVENT:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001744 event_id = WMI_PEER_STA_KICKOUT_EVENTID;
1745 break;
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001746 case WOW_REASON_EXTSCAN:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001747 event_id = wma_extscan_get_eventid_from_tlvtag(tag);
1748 break;
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001749 case WOW_REASON_RSSI_BREACH_EVENT:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001750 event_id = WMI_RSSI_BREACH_EVENTID;
1751 break;
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001752 case WOW_REASON_NAN_EVENT:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001753 event_id = WMI_NAN_EVENTID;
1754 break;
Naveen Rawat17dccbe2016-08-23 17:09:04 -07001755 case WOW_REASON_NAN_DATA:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001756 event_id = wma_ndp_get_eventid_from_tlvtag(tag);
1757 break;
Selvaraj, Sridhar251761a2016-06-25 16:05:15 +05301758 case WOW_REASON_TDLS_CONN_TRACKER_EVENT:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001759 event_id = WOW_TDLS_CONN_TRACKER_EVENT;
1760 break;
Deepak Dhamdhere6d2c97a2017-02-04 22:09:27 -08001761 case WOW_REASON_ROAM_HO:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001762 event_id = WMI_ROAM_EVENTID;
1763 break;
Amar Singhal5eb9acb2017-05-26 15:25:27 -07001764 case WOW_REASON_11D_SCAN:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001765 event_id = WMI_11D_NEW_COUNTRY_EVENTID;
1766 break;
Pragaspathi Thilagaraj0c4489f2019-08-05 20:50:23 +05301767 case WOW_ROAM_PREAUTH_START_EVENT:
1768 event_id = WMI_ROAM_PREAUTH_STATUS_CMDID;
1769 break;
Srikanth Marepalli72213312019-12-20 16:11:02 +05301770 case WOW_REASON_ROAM_PMKID_REQUEST:
1771 event_id = WMI_ROAM_PMKID_REQUEST_EVENTID;
1772 break;
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001773 default:
Dustin Browne2206fb2017-04-20 13:39:25 -07001774 WMA_LOGD(FL("No Event Id for WOW reason %s(%d)"),
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001775 wma_wow_wake_reason_str(reason), reason);
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001776 event_id = 0;
1777 break;
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001778 }
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001779 wlan_roam_debug_log(WMA_INVALID_VDEV_ID, DEBUG_WOW_REASON,
1780 DEBUG_INVALID_PEER_ID, NULL, NULL,
1781 reason, event_id);
1782
1783 return event_id;
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001784}
1785
1786/**
Dustin Brown3c89c012017-05-01 12:17:32 -07001787 * is_piggybacked_event() - Returns true if the given wake reason indicates
1788 * there will be piggybacked TLV event data
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001789 * @reason: WOW reason
1790 *
Dustin Brown3c89c012017-05-01 12:17:32 -07001791 * There are three types of WoW event payloads: none, piggybacked event, and
1792 * network packet. This function returns true for wake reasons that fall into
1793 * the piggybacked event case.
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001794 *
Dustin Brown3c89c012017-05-01 12:17:32 -07001795 * Return: true for piggybacked event data
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001796 */
Dustin Browne2206fb2017-04-20 13:39:25 -07001797static bool is_piggybacked_event(int32_t reason)
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001798{
1799 switch (reason) {
Dustin Browne2206fb2017-04-20 13:39:25 -07001800 case WOW_REASON_AP_ASSOC_LOST:
Krishna Kumaar Natarajane1a59832016-09-07 12:19:24 -07001801 case WOW_REASON_NLO_SCAN_COMPLETE:
1802 case WOW_REASON_CSA_EVENT:
1803 case WOW_REASON_LOW_RSSI:
1804 case WOW_REASON_CLIENT_KICKOUT_EVENT:
1805 case WOW_REASON_EXTSCAN:
1806 case WOW_REASON_RSSI_BREACH_EVENT:
1807 case WOW_REASON_NAN_EVENT:
1808 case WOW_REASON_NAN_DATA:
Dustin Browne2206fb2017-04-20 13:39:25 -07001809 case WOW_REASON_TDLS_CONN_TRACKER_EVENT:
Deepak Dhamdhere6d2c97a2017-02-04 22:09:27 -08001810 case WOW_REASON_ROAM_HO:
Srikanth Marepalli72213312019-12-20 16:11:02 +05301811 case WOW_REASON_ROAM_PMKID_REQUEST:
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001812 return true;
Krishna Kumaar Natarajane1a59832016-09-07 12:19:24 -07001813 default:
1814 return false;
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001815 }
1816}
1817
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001818/**
Himanshu Agarwal82de9042016-07-20 18:11:03 +05301819 * wma_pkt_proto_subtype_to_string() - to convert proto subtype
1820 * of data packet to string.
1821 * @proto_subtype: proto subtype for data packet
1822 *
1823 * This function returns the string for the proto subtype of
1824 * data packet.
1825 *
1826 * Return: string for proto subtype for data packet
1827 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07001828static const char *
Himanshu Agarwal82de9042016-07-20 18:11:03 +05301829wma_pkt_proto_subtype_to_string(enum qdf_proto_subtype proto_subtype)
1830{
1831 switch (proto_subtype) {
1832 case QDF_PROTO_EAPOL_M1:
1833 return "EAPOL M1";
1834 case QDF_PROTO_EAPOL_M2:
1835 return "EAPOL M2";
1836 case QDF_PROTO_EAPOL_M3:
1837 return "EAPOL M3";
1838 case QDF_PROTO_EAPOL_M4:
1839 return "EAPOL M4";
1840 case QDF_PROTO_DHCP_DISCOVER:
1841 return "DHCP DISCOVER";
1842 case QDF_PROTO_DHCP_REQUEST:
1843 return "DHCP REQUEST";
1844 case QDF_PROTO_DHCP_OFFER:
1845 return "DHCP OFFER";
1846 case QDF_PROTO_DHCP_ACK:
1847 return "DHCP ACK";
1848 case QDF_PROTO_DHCP_NACK:
1849 return "DHCP NACK";
1850 case QDF_PROTO_DHCP_RELEASE:
1851 return "DHCP RELEASE";
1852 case QDF_PROTO_DHCP_INFORM:
1853 return "DHCP INFORM";
1854 case QDF_PROTO_DHCP_DECLINE:
1855 return "DHCP DECLINE";
1856 case QDF_PROTO_ARP_REQ:
1857 return "ARP REQUEST";
1858 case QDF_PROTO_ARP_RES:
1859 return "ARP RESPONSE";
1860 case QDF_PROTO_ICMP_REQ:
1861 return "ICMP REQUEST";
1862 case QDF_PROTO_ICMP_RES:
1863 return "ICMP RESPONSE";
1864 case QDF_PROTO_ICMPV6_REQ:
1865 return "ICMPV6 REQUEST";
1866 case QDF_PROTO_ICMPV6_RES:
1867 return "ICMPV6 RESPONSE";
Himanshu Agarwal471eaef2017-01-31 13:16:52 +05301868 case QDF_PROTO_ICMPV6_RS:
1869 return "ICMPV6 RS";
1870 case QDF_PROTO_ICMPV6_RA:
1871 return "ICMPV6 RA";
1872 case QDF_PROTO_ICMPV6_NS:
1873 return "ICMPV6 NS";
1874 case QDF_PROTO_ICMPV6_NA:
1875 return "ICMPV6 NA";
Himanshu Agarwal82de9042016-07-20 18:11:03 +05301876 case QDF_PROTO_IPV4_UDP:
1877 return "IPV4 UDP Packet";
1878 case QDF_PROTO_IPV4_TCP:
1879 return "IPV4 TCP Packet";
1880 case QDF_PROTO_IPV6_UDP:
1881 return "IPV6 UDP Packet";
1882 case QDF_PROTO_IPV6_TCP:
1883 return "IPV6 TCP Packet";
1884 default:
Dustin Browne2206fb2017-04-20 13:39:25 -07001885 return NULL;
Himanshu Agarwal82de9042016-07-20 18:11:03 +05301886 }
1887}
1888
1889/**
Dustin Brown3c89c012017-05-01 12:17:32 -07001890 * wma_wow_get_pkt_proto_subtype() - get the proto subtype of the packet.
1891 * @data: Pointer to the packet data buffer
1892 * @len: length of the packet data buffer
Himanshu Agarwal82de9042016-07-20 18:11:03 +05301893 *
1894 * Return: proto subtype of the packet.
1895 */
1896static enum qdf_proto_subtype
Dustin Brown3c89c012017-05-01 12:17:32 -07001897wma_wow_get_pkt_proto_subtype(uint8_t *data, uint32_t len)
Himanshu Agarwal82de9042016-07-20 18:11:03 +05301898{
Dustin Browne2206fb2017-04-20 13:39:25 -07001899 uint16_t eth_type;
1900 uint8_t proto_type;
Himanshu Agarwalec51a5a2016-07-20 19:47:26 +05301901
Dustin Browne2206fb2017-04-20 13:39:25 -07001902 if (len < QDF_NBUF_TRAC_ETH_TYPE_OFFSET + 2) {
1903 WMA_LOGE("Malformed ethernet packet: length %u < %d",
1904 len, QDF_NBUF_TRAC_ETH_TYPE_OFFSET + 2);
Himanshu Agarwalec51a5a2016-07-20 19:47:26 +05301905 return QDF_PROTO_INVALID;
Himanshu Agarwal82de9042016-07-20 18:11:03 +05301906 }
1907
Dustin Browne2206fb2017-04-20 13:39:25 -07001908 eth_type = *(uint16_t *)(data + QDF_NBUF_TRAC_ETH_TYPE_OFFSET);
Dustin Brown3c89c012017-05-01 12:17:32 -07001909 eth_type = qdf_cpu_to_be16(eth_type);
Dustin Browne2206fb2017-04-20 13:39:25 -07001910
1911 WMA_LOGD("Ether Type: 0x%04x", eth_type);
1912 switch (eth_type) {
1913 case QDF_NBUF_TRAC_EAPOL_ETH_TYPE:
1914 if (len < WMA_EAPOL_SUBTYPE_GET_MIN_LEN)
1915 return QDF_PROTO_INVALID;
1916
1917 WMA_LOGD("EAPOL Packet");
1918 return qdf_nbuf_data_get_eapol_subtype(data);
1919
1920 case QDF_NBUF_TRAC_ARP_ETH_TYPE:
1921 if (len < WMA_ARP_SUBTYPE_GET_MIN_LEN)
1922 return QDF_PROTO_INVALID;
1923
1924 WMA_LOGD("ARP Packet");
1925 return qdf_nbuf_data_get_arp_subtype(data);
1926
1927 case QDF_NBUF_TRAC_IPV4_ETH_TYPE:
1928 if (len < WMA_IPV4_PROTO_GET_MIN_LEN)
1929 return QDF_PROTO_INVALID;
1930
1931 WMA_LOGD("IPV4 Packet");
1932
1933 proto_type = qdf_nbuf_data_get_ipv4_proto(data);
1934 WMA_LOGD("IPV4_proto_type: %u", proto_type);
1935
1936 switch (proto_type) {
1937 case QDF_NBUF_TRAC_ICMP_TYPE:
1938 if (len < WMA_ICMP_SUBTYPE_GET_MIN_LEN)
1939 return QDF_PROTO_INVALID;
1940
1941 WMA_LOGD("ICMP Packet");
1942 return qdf_nbuf_data_get_icmp_subtype(data);
1943
1944 case QDF_NBUF_TRAC_UDP_TYPE:
1945 if (len < WMA_IS_DHCP_GET_MIN_LEN)
1946 return QDF_PROTO_IPV4_UDP;
1947
1948 if (!qdf_nbuf_data_is_ipv4_dhcp_pkt(data))
1949 return QDF_PROTO_INVALID;
1950
1951 if (len < WMA_DHCP_SUBTYPE_GET_MIN_LEN)
1952 return QDF_PROTO_INVALID;
1953
1954 WMA_LOGD("DHCP Packet");
1955 return qdf_nbuf_data_get_dhcp_subtype(data);
1956
1957 case QDF_NBUF_TRAC_TCP_TYPE:
1958 return QDF_PROTO_IPV4_TCP;
1959
1960 default:
1961 return QDF_PROTO_INVALID;
1962 }
1963
1964 case QDF_NBUF_TRAC_IPV6_ETH_TYPE:
1965 if (len < WMA_IPV6_PROTO_GET_MIN_LEN)
1966 return QDF_PROTO_INVALID;
1967
1968 WMA_LOGD("IPV6 Packet");
1969
1970 proto_type = qdf_nbuf_data_get_ipv6_proto(data);
1971 WMA_LOGD("IPV6_proto_type: %u", proto_type);
1972
1973 switch (proto_type) {
1974 case QDF_NBUF_TRAC_ICMPV6_TYPE:
1975 if (len < WMA_ICMPV6_SUBTYPE_GET_MIN_LEN)
1976 return QDF_PROTO_INVALID;
1977
1978 WMA_LOGD("ICMPV6 Packet");
1979 return qdf_nbuf_data_get_icmpv6_subtype(data);
1980
1981 case QDF_NBUF_TRAC_UDP_TYPE:
1982 return QDF_PROTO_IPV6_UDP;
1983
1984 case QDF_NBUF_TRAC_TCP_TYPE:
1985 return QDF_PROTO_IPV6_TCP;
1986
1987 default:
1988 return QDF_PROTO_INVALID;
1989 }
1990
1991 default:
1992 return QDF_PROTO_INVALID;
1993 }
1994}
1995
Dustin Browne2206fb2017-04-20 13:39:25 -07001996static void wma_log_pkt_eapol(uint8_t *data, uint32_t length)
1997{
1998 uint16_t pkt_len, key_len;
1999
2000 if (length < WMA_EAPOL_INFO_GET_MIN_LEN)
2001 return;
2002
2003 pkt_len = *(uint16_t *)(data + EAPOL_PKT_LEN_OFFSET);
2004 key_len = *(uint16_t *)(data + EAPOL_KEY_LEN_OFFSET);
2005 WMA_LOGD("Pkt_len: %u, Key_len: %u",
Dustin Brown3c89c012017-05-01 12:17:32 -07002006 qdf_cpu_to_be16(pkt_len), qdf_cpu_to_be16(key_len));
Dustin Browne2206fb2017-04-20 13:39:25 -07002007}
2008
2009static void wma_log_pkt_dhcp(uint8_t *data, uint32_t length)
2010{
2011 uint16_t pkt_len;
2012 uint32_t trans_id;
2013
2014 if (length < WMA_DHCP_INFO_GET_MIN_LEN)
2015 return;
2016
2017 pkt_len = *(uint16_t *)(data + DHCP_PKT_LEN_OFFSET);
2018 trans_id = *(uint32_t *)(data + DHCP_TRANSACTION_ID_OFFSET);
2019 WMA_LOGD("Pkt_len: %u, Transaction_id: %u",
Dustin Brown3c89c012017-05-01 12:17:32 -07002020 qdf_cpu_to_be16(pkt_len), qdf_cpu_to_be16(trans_id));
Dustin Browne2206fb2017-04-20 13:39:25 -07002021}
2022
2023static void wma_log_pkt_icmpv4(uint8_t *data, uint32_t length)
2024{
2025 uint16_t pkt_len, seq_num;
2026
2027 if (length < WMA_IPV4_PKT_INFO_GET_MIN_LEN)
2028 return;
2029
2030 pkt_len = *(uint16_t *)(data + IPV4_PKT_LEN_OFFSET);
2031 seq_num = *(uint16_t *)(data + ICMP_SEQ_NUM_OFFSET);
2032 WMA_LOGD("Pkt_len: %u, Seq_num: %u",
Dustin Brown3c89c012017-05-01 12:17:32 -07002033 qdf_cpu_to_be16(pkt_len), qdf_cpu_to_be16(seq_num));
Dustin Browne2206fb2017-04-20 13:39:25 -07002034}
2035
2036static void wma_log_pkt_icmpv6(uint8_t *data, uint32_t length)
2037{
2038 uint16_t pkt_len, seq_num;
2039
2040 if (length < WMA_IPV6_PKT_INFO_GET_MIN_LEN)
2041 return;
2042
2043 pkt_len = *(uint16_t *)(data + IPV6_PKT_LEN_OFFSET);
2044 seq_num = *(uint16_t *)(data + ICMPV6_SEQ_NUM_OFFSET);
2045 WMA_LOGD("Pkt_len: %u, Seq_num: %u",
Dustin Brown3c89c012017-05-01 12:17:32 -07002046 qdf_cpu_to_be16(pkt_len), qdf_cpu_to_be16(seq_num));
Dustin Browne2206fb2017-04-20 13:39:25 -07002047}
2048
2049static void wma_log_pkt_ipv4(uint8_t *data, uint32_t length)
2050{
2051 uint16_t pkt_len, src_port, dst_port;
Sravan Kumar Kairam4402a262017-08-07 10:45:24 +05302052 char *ip_addr;
Dustin Browne2206fb2017-04-20 13:39:25 -07002053
2054 if (length < WMA_IPV4_PKT_INFO_GET_MIN_LEN)
2055 return;
2056
2057 pkt_len = *(uint16_t *)(data + IPV4_PKT_LEN_OFFSET);
Sravan Kumar Kairam4402a262017-08-07 10:45:24 +05302058 ip_addr = (char *)(data + IPV4_SRC_ADDR_OFFSET);
2059 WMA_LOGD("src addr %d:%d:%d:%d", ip_addr[0], ip_addr[1],
2060 ip_addr[2], ip_addr[3]);
2061 ip_addr = (char *)(data + IPV4_DST_ADDR_OFFSET);
2062 WMA_LOGD("dst addr %d:%d:%d:%d", ip_addr[0], ip_addr[1],
2063 ip_addr[2], ip_addr[3]);
Dustin Browne2206fb2017-04-20 13:39:25 -07002064 src_port = *(uint16_t *)(data + IPV4_SRC_PORT_OFFSET);
2065 dst_port = *(uint16_t *)(data + IPV4_DST_PORT_OFFSET);
Srinivas Girigowdae1be8772018-05-07 16:16:27 -07002066 WMA_LOGI("Pkt_len: %u, src_port: %u, dst_port: %u",
Dustin Brown3c89c012017-05-01 12:17:32 -07002067 qdf_cpu_to_be16(pkt_len),
2068 qdf_cpu_to_be16(src_port),
2069 qdf_cpu_to_be16(dst_port));
Dustin Browne2206fb2017-04-20 13:39:25 -07002070}
2071
2072static void wma_log_pkt_ipv6(uint8_t *data, uint32_t length)
2073{
2074 uint16_t pkt_len, src_port, dst_port;
Sravan Kumar Kairam4402a262017-08-07 10:45:24 +05302075 char *ip_addr;
Dustin Browne2206fb2017-04-20 13:39:25 -07002076
2077 if (length < WMA_IPV6_PKT_INFO_GET_MIN_LEN)
2078 return;
2079
2080 pkt_len = *(uint16_t *)(data + IPV6_PKT_LEN_OFFSET);
Sravan Kumar Kairam4402a262017-08-07 10:45:24 +05302081 ip_addr = (char *)(data + IPV6_SRC_ADDR_OFFSET);
2082 WMA_LOGD("src addr "IPV6_ADDR_STR, ip_addr[0],
2083 ip_addr[1], ip_addr[2], ip_addr[3], ip_addr[4],
2084 ip_addr[5], ip_addr[6], ip_addr[7], ip_addr[8],
2085 ip_addr[9], ip_addr[10], ip_addr[11],
2086 ip_addr[12], ip_addr[13], ip_addr[14],
2087 ip_addr[15]);
2088 ip_addr = (char *)(data + IPV6_DST_ADDR_OFFSET);
2089 WMA_LOGD("dst addr "IPV6_ADDR_STR, ip_addr[0],
2090 ip_addr[1], ip_addr[2], ip_addr[3], ip_addr[4],
2091 ip_addr[5], ip_addr[6], ip_addr[7], ip_addr[8],
2092 ip_addr[9], ip_addr[10], ip_addr[11],
2093 ip_addr[12], ip_addr[13], ip_addr[14],
2094 ip_addr[15]);
Dustin Browne2206fb2017-04-20 13:39:25 -07002095 src_port = *(uint16_t *)(data + IPV6_SRC_PORT_OFFSET);
2096 dst_port = *(uint16_t *)(data + IPV6_DST_PORT_OFFSET);
Srinivas Girigowdae1be8772018-05-07 16:16:27 -07002097 WMA_LOGI("Pkt_len: %u, src_port: %u, dst_port: %u",
Dustin Brown3c89c012017-05-01 12:17:32 -07002098 qdf_cpu_to_be16(pkt_len),
2099 qdf_cpu_to_be16(src_port),
2100 qdf_cpu_to_be16(dst_port));
Dustin Browne2206fb2017-04-20 13:39:25 -07002101}
2102
2103static void wma_log_pkt_tcpv4(uint8_t *data, uint32_t length)
2104{
2105 uint32_t seq_num;
2106
2107 if (length < WMA_IPV4_PKT_INFO_GET_MIN_LEN)
2108 return;
2109
2110 seq_num = *(uint32_t *)(data + IPV4_TCP_SEQ_NUM_OFFSET);
Dustin Brown3c89c012017-05-01 12:17:32 -07002111 WMA_LOGD("TCP_seq_num: %u", qdf_cpu_to_be16(seq_num));
Dustin Browne2206fb2017-04-20 13:39:25 -07002112}
2113
2114static void wma_log_pkt_tcpv6(uint8_t *data, uint32_t length)
2115{
2116 uint32_t seq_num;
2117
2118 if (length < WMA_IPV6_PKT_INFO_GET_MIN_LEN)
2119 return;
2120
2121 seq_num = *(uint32_t *)(data + IPV6_TCP_SEQ_NUM_OFFSET);
Dustin Brown3c89c012017-05-01 12:17:32 -07002122 WMA_LOGD("TCP_seq_num: %u", qdf_cpu_to_be16(seq_num));
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302123}
2124
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002125static void wma_wow_inc_wake_lock_stats_by_dst_addr(t_wma_handle *wma,
2126 uint8_t vdev_id,
2127 uint8_t *dest_mac)
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302128{
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002129 ucfg_mc_cp_stats_inc_wake_lock_stats_by_dst_addr(wma->psoc,
2130 vdev_id,
2131 dest_mac);
2132}
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302133
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002134static void wma_wow_inc_wake_lock_stats_by_protocol(t_wma_handle *wma,
2135 uint8_t vdev_id, enum qdf_proto_subtype proto_subtype)
2136{
2137 ucfg_mc_cp_stats_inc_wake_lock_stats_by_protocol(wma->psoc,
2138 vdev_id,
2139 proto_subtype);
2140}
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002141
2142/**
2143 * wma_wow_parse_data_pkt() - API to parse data buffer for data
2144 * packet that resulted in WOW wakeup.
2145 * @stats: per-vdev stats for tracking packet types
2146 * @data: Pointer to data buffer
2147 * @length: data buffer length
2148 *
2149 * This function parses the data buffer received (first few bytes of
2150 * skb->data) to get information like src mac addr, dst mac addr, packet
2151 * len, seq_num, etc. It also increments stats for different packet types.
2152 *
2153 * Return: void
2154 */
2155static void wma_wow_parse_data_pkt(t_wma_handle *wma,
2156 uint8_t vdev_id, uint8_t *data,
2157 uint32_t length)
2158{
2159 uint8_t *src_mac;
2160 uint8_t *dest_mac;
2161 const char *proto_subtype_name;
2162 enum qdf_proto_subtype proto_subtype;
2163
2164 WMA_LOGD("packet length: %u", length);
2165 if (length < QDF_NBUF_TRAC_IPV4_OFFSET)
2166 return;
2167
2168 src_mac = data + QDF_NBUF_SRC_MAC_OFFSET;
2169 dest_mac = data + QDF_NBUF_DEST_MAC_OFFSET;
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -07002170 wma_info("Src_mac: " QDF_MAC_ADDR_STR ", Dst_mac: " QDF_MAC_ADDR_STR,
Srinivas Girigowda34fbba02019-04-08 12:07:44 -07002171 QDF_MAC_ADDR_ARRAY(src_mac), QDF_MAC_ADDR_ARRAY(dest_mac));
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002172
2173 wma_wow_inc_wake_lock_stats_by_dst_addr(wma, vdev_id, dest_mac);
Dustin Browne2206fb2017-04-20 13:39:25 -07002174
2175 proto_subtype = wma_wow_get_pkt_proto_subtype(data, length);
2176 proto_subtype_name = wma_pkt_proto_subtype_to_string(proto_subtype);
2177 if (proto_subtype_name)
Srinivas Girigowdae1be8772018-05-07 16:16:27 -07002178 WMA_LOGI("WOW Wakeup: %s rcvd", proto_subtype_name);
Dustin Browne2206fb2017-04-20 13:39:25 -07002179
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302180 switch (proto_subtype) {
2181 case QDF_PROTO_EAPOL_M1:
2182 case QDF_PROTO_EAPOL_M2:
2183 case QDF_PROTO_EAPOL_M3:
2184 case QDF_PROTO_EAPOL_M4:
Dustin Browne2206fb2017-04-20 13:39:25 -07002185 wma_log_pkt_eapol(data, length);
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302186 break;
2187
2188 case QDF_PROTO_DHCP_DISCOVER:
2189 case QDF_PROTO_DHCP_REQUEST:
2190 case QDF_PROTO_DHCP_OFFER:
2191 case QDF_PROTO_DHCP_ACK:
2192 case QDF_PROTO_DHCP_NACK:
2193 case QDF_PROTO_DHCP_RELEASE:
2194 case QDF_PROTO_DHCP_INFORM:
2195 case QDF_PROTO_DHCP_DECLINE:
Dustin Browne2206fb2017-04-20 13:39:25 -07002196 wma_log_pkt_dhcp(data, length);
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302197 break;
2198
2199 case QDF_PROTO_ICMP_REQ:
2200 case QDF_PROTO_ICMP_RES:
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002201 wma_wow_inc_wake_lock_stats_by_protocol(wma, vdev_id,
2202 proto_subtype);
Dustin Browne2206fb2017-04-20 13:39:25 -07002203 wma_log_pkt_icmpv4(data, length);
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302204 break;
2205
2206 case QDF_PROTO_ICMPV6_REQ:
2207 case QDF_PROTO_ICMPV6_RES:
Himanshu Agarwal471eaef2017-01-31 13:16:52 +05302208 case QDF_PROTO_ICMPV6_RS:
2209 case QDF_PROTO_ICMPV6_RA:
2210 case QDF_PROTO_ICMPV6_NS:
2211 case QDF_PROTO_ICMPV6_NA:
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002212 wma_wow_inc_wake_lock_stats_by_protocol(wma, vdev_id,
2213 proto_subtype);
Dustin Browne2206fb2017-04-20 13:39:25 -07002214 wma_log_pkt_icmpv6(data, length);
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302215 break;
2216
2217 case QDF_PROTO_IPV4_UDP:
Dustin Browne2206fb2017-04-20 13:39:25 -07002218 wma_log_pkt_ipv4(data, length);
2219 break;
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302220 case QDF_PROTO_IPV4_TCP:
Dustin Browne2206fb2017-04-20 13:39:25 -07002221 wma_log_pkt_ipv4(data, length);
2222 wma_log_pkt_tcpv4(data, length);
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302223 break;
2224
2225 case QDF_PROTO_IPV6_UDP:
Dustin Browne2206fb2017-04-20 13:39:25 -07002226 wma_log_pkt_ipv6(data, length);
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302227 break;
Dustin Browne2206fb2017-04-20 13:39:25 -07002228 case QDF_PROTO_IPV6_TCP:
2229 wma_log_pkt_ipv6(data, length);
2230 wma_log_pkt_tcpv6(data, length);
2231 break;
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302232 default:
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302233 break;
2234 }
2235}
2236
2237/**
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302238 * wma_wow_dump_mgmt_buffer() - API to parse data buffer for mgmt.
2239 * packet that resulted in WOW wakeup.
2240 * @wow_packet_buffer: Pointer to data buffer
2241 * @buf_len: length of data buffer
2242 *
2243 * This function parses the data buffer received (802.11 header)
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002244 * to get information like src mac addr, dst mac addr, seq_num,
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302245 * frag_num, etc.
2246 *
2247 * Return: void
2248 */
2249static void wma_wow_dump_mgmt_buffer(uint8_t *wow_packet_buffer,
Dustin Browne2206fb2017-04-20 13:39:25 -07002250 uint32_t buf_len)
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302251{
2252 struct ieee80211_frame_addr4 *wh;
2253
Himanshu Agarwalf9515002016-07-20 19:09:10 +05302254 WMA_LOGD("wow_buf_pkt_len: %u", buf_len);
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302255 wh = (struct ieee80211_frame_addr4 *)
Dustin Brownecb7eb92017-04-06 17:00:11 -07002256 (wow_packet_buffer);
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302257 if (buf_len >= sizeof(struct ieee80211_frame)) {
2258 uint8_t to_from_ds, frag_num;
2259 uint32_t seq_num;
2260
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -07002261 wma_err("RA: " QDF_MAC_ADDR_STR " TA: " QDF_MAC_ADDR_STR,
Srinivas Girigowda34fbba02019-04-08 12:07:44 -07002262 QDF_MAC_ADDR_ARRAY(wh->i_addr1),
2263 QDF_MAC_ADDR_ARRAY(wh->i_addr2));
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302264
Himanshu Agarwalf9515002016-07-20 19:09:10 +05302265 WMA_LOGE("TO_DS: %u, FROM_DS: %u",
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302266 wh->i_fc[1] & IEEE80211_FC1_DIR_TODS,
2267 wh->i_fc[1] & IEEE80211_FC1_DIR_FROMDS);
2268
Jeff Johnsone866cac2018-12-10 17:57:04 -08002269 to_from_ds = wh->i_fc[1] & IEEE80211_FC1_DIR_MASK;
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302270
2271 switch (to_from_ds) {
Jeff Johnsone866cac2018-12-10 17:57:04 -08002272 case IEEE80211_FC1_DIR_NODS:
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -07002273 wma_err("BSSID: " QDF_MAC_ADDR_STR,
Srinivas Girigowda34fbba02019-04-08 12:07:44 -07002274 QDF_MAC_ADDR_ARRAY(wh->i_addr3));
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302275 break;
Jeff Johnsone866cac2018-12-10 17:57:04 -08002276 case IEEE80211_FC1_DIR_TODS:
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -07002277 wma_err("DA: " QDF_MAC_ADDR_STR,
Srinivas Girigowda34fbba02019-04-08 12:07:44 -07002278 QDF_MAC_ADDR_ARRAY(wh->i_addr3));
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302279 break;
Jeff Johnsone866cac2018-12-10 17:57:04 -08002280 case IEEE80211_FC1_DIR_FROMDS:
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -07002281 wma_err("SA: " QDF_MAC_ADDR_STR,
Srinivas Girigowda34fbba02019-04-08 12:07:44 -07002282 QDF_MAC_ADDR_ARRAY(wh->i_addr3));
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302283 break;
Jeff Johnsone866cac2018-12-10 17:57:04 -08002284 case IEEE80211_FC1_DIR_DSTODS:
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302285 if (buf_len >= sizeof(struct ieee80211_frame_addr4))
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -07002286 wma_err("DA: " QDF_MAC_ADDR_STR " SA: "
2287 QDF_MAC_ADDR_STR,
Srinivas Girigowda34fbba02019-04-08 12:07:44 -07002288 QDF_MAC_ADDR_ARRAY(wh->i_addr3),
2289 QDF_MAC_ADDR_ARRAY(wh->i_addr4));
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302290 break;
2291 }
2292
2293 seq_num = (((*(uint16_t *)wh->i_seq) &
2294 IEEE80211_SEQ_SEQ_MASK) >>
2295 IEEE80211_SEQ_SEQ_SHIFT);
2296 frag_num = (((*(uint16_t *)wh->i_seq) &
2297 IEEE80211_SEQ_FRAG_MASK) >>
2298 IEEE80211_SEQ_FRAG_SHIFT);
2299
Himanshu Agarwalf9515002016-07-20 19:09:10 +05302300 WMA_LOGE("SEQ_NUM: %u, FRAG_NUM: %u",
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302301 seq_num, frag_num);
2302 } else {
2303 WMA_LOGE("Insufficient buffer length for mgmt. packet");
2304 }
2305}
2306
2307/**
Dustin Browne2206fb2017-04-20 13:39:25 -07002308 * wma_acquire_wakelock() - conditionally aquires a wakelock base on wake reason
2309 * @wma: the wma handle with the wakelocks to aquire
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302310 * @wake_reason: wow wakeup reason
2311 *
Dustin Browne2206fb2017-04-20 13:39:25 -07002312 * Return: None
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302313 */
Dustin Browne2206fb2017-04-20 13:39:25 -07002314static void wma_acquire_wow_wakelock(t_wma_handle *wma, int wake_reason)
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302315{
Dustin Browne2206fb2017-04-20 13:39:25 -07002316 qdf_wake_lock_t *wl;
2317 uint32_t ms;
2318
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302319 switch (wake_reason) {
2320 case WOW_REASON_AUTH_REQ_RECV:
Mukul Sharmae44d0542017-05-23 21:50:56 +05302321 wl = &wma->wow_auth_req_wl;
Dustin Browne2206fb2017-04-20 13:39:25 -07002322 ms = WMA_AUTH_REQ_RECV_WAKE_LOCK_TIMEOUT;
2323 break;
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302324 case WOW_REASON_ASSOC_REQ_RECV:
Mukul Sharmae44d0542017-05-23 21:50:56 +05302325 wl = &wma->wow_assoc_req_wl;
Dustin Browne2206fb2017-04-20 13:39:25 -07002326 ms = WMA_ASSOC_REQ_RECV_WAKE_LOCK_DURATION;
2327 break;
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302328 case WOW_REASON_DEAUTH_RECVD:
Mukul Sharmae44d0542017-05-23 21:50:56 +05302329 wl = &wma->wow_deauth_rec_wl;
Dustin Browne2206fb2017-04-20 13:39:25 -07002330 ms = WMA_DEAUTH_RECV_WAKE_LOCK_DURATION;
2331 break;
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302332 case WOW_REASON_DISASSOC_RECVD:
Mukul Sharmae44d0542017-05-23 21:50:56 +05302333 wl = &wma->wow_disassoc_rec_wl;
Dustin Browne2206fb2017-04-20 13:39:25 -07002334 ms = WMA_DISASSOC_RECV_WAKE_LOCK_DURATION;
2335 break;
yeshwanth sriram guntuka37c09822017-01-24 18:30:15 +05302336 case WOW_REASON_AP_ASSOC_LOST:
Mukul Sharmae44d0542017-05-23 21:50:56 +05302337 wl = &wma->wow_ap_assoc_lost_wl;
Dustin Browne2206fb2017-04-20 13:39:25 -07002338 ms = WMA_BMISS_EVENT_WAKE_LOCK_DURATION;
2339 break;
yeshwanth sriram guntuka37c09822017-01-24 18:30:15 +05302340#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
2341 case WOW_REASON_HOST_AUTO_SHUTDOWN:
Mukul Sharmae44d0542017-05-23 21:50:56 +05302342 wl = &wma->wow_auto_shutdown_wl;
Dustin Browne2206fb2017-04-20 13:39:25 -07002343 ms = WMA_AUTO_SHUTDOWN_WAKE_LOCK_DURATION;
2344 break;
yeshwanth sriram guntuka37c09822017-01-24 18:30:15 +05302345#endif
2346 case WOW_REASON_ROAM_HO:
Mukul Sharmae44d0542017-05-23 21:50:56 +05302347 wl = &wma->roam_ho_wl;
Dustin Browne2206fb2017-04-20 13:39:25 -07002348 ms = WMA_ROAM_HO_WAKE_LOCK_DURATION;
2349 break;
Pragaspathi Thilagaraj0c4489f2019-08-05 20:50:23 +05302350 case WOW_REASON_ROAM_PREAUTH_START:
2351 wl = &wma->roam_preauth_wl;
2352 ms = WMA_ROAM_PREAUTH_WAKE_LOCK_DURATION;
Dustin Browne2206fb2017-04-20 13:39:25 -07002353 default:
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +05302354 return;
2355 }
2356
Dustin Browne2206fb2017-04-20 13:39:25 -07002357 WMA_LOGA("Holding %d msec wake_lock", ms);
2358 cds_host_diag_log_work(wl, ms, WIFI_POWER_EVENT_WAKELOCK_WOW);
2359 qdf_wake_lock_timeout_acquire(wl, ms);
2360}
2361
2362/**
2363 * wma_wake_reason_ap_assoc_lost() - WOW_REASON_AP_ASSOC_LOST handler
2364 * @wma: Pointer to wma handle
2365 * @event: pointer to piggybacked WMI_ROAM_EVENTID_param_tlvs buffer
2366 * @len: length of the event buffer
2367 *
2368 * Return: Errno
2369 */
2370static int
2371wma_wake_reason_ap_assoc_lost(t_wma_handle *wma, void *event, uint32_t len)
2372{
2373 WMI_ROAM_EVENTID_param_tlvs *event_param;
2374 wmi_roam_event_fixed_param *roam_event;
2375
2376 event_param = event;
2377 if (!event_param) {
2378 WMA_LOGE("AP Assoc Lost event data is null");
2379 return -EINVAL;
2380 }
2381
2382 roam_event = event_param->fixed_param;
2383 WMA_LOGA(FL("Beacon miss indication on vdev %d"), roam_event->vdev_id);
2384
2385 wma_beacon_miss_handler(wma, roam_event->vdev_id, roam_event->rssi);
2386
2387 return 0;
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +05302388}
2389
Dustin Brown9d797d62017-01-11 16:39:12 -08002390static const char *wma_vdev_type_str(uint32_t vdev_type)
2391{
2392 switch (vdev_type) {
2393 case WMI_VDEV_TYPE_AP:
2394 return "AP";
2395 case WMI_VDEV_TYPE_STA:
2396 return "STA";
2397 case WMI_VDEV_TYPE_IBSS:
2398 return "IBSS";
2399 case WMI_VDEV_TYPE_MONITOR:
2400 return "MONITOR";
2401 case WMI_VDEV_TYPE_NAN:
2402 return "NAN";
2403 case WMI_VDEV_TYPE_OCB:
2404 return "OCB";
2405 case WMI_VDEV_TYPE_NDI:
2406 return "NDI";
2407 default:
2408 return "unknown";
2409 }
2410}
2411
Dustin Browne2206fb2017-04-20 13:39:25 -07002412static int wma_wake_event_packet(
2413 t_wma_handle *wma,
2414 WMI_WOW_WAKEUP_HOST_EVENTID_param_tlvs *event_param,
2415 uint32_t length)
2416{
2417 WOW_EVENT_INFO_fixed_param *wake_info;
2418 struct wma_txrx_node *vdev;
2419 uint8_t *packet;
2420 uint32_t packet_len;
2421
Abhinav Kumarb0f99562018-01-24 16:15:30 +05302422 if (event_param->num_wow_packet_buffer <= 4) {
2423 WMA_LOGE("Invalid wow packet buffer from firmware %u",
2424 event_param->num_wow_packet_buffer);
2425 return -EINVAL;
2426 }
Dustin Browne2206fb2017-04-20 13:39:25 -07002427 /* first 4 bytes are the length, followed by the buffer */
2428 packet_len = *(uint32_t *)event_param->wow_packet_buffer;
2429 packet = event_param->wow_packet_buffer + 4;
2430
2431 if (!packet_len) {
2432 WMA_LOGE("Wake event packet is empty");
2433 return 0;
2434 }
2435
Himanshu Agarwale6b49122017-10-13 17:50:11 +05302436 if (packet_len > (event_param->num_wow_packet_buffer - 4)) {
2437 WMA_LOGE("Invalid packet_len from firmware, packet_len: %u, num_wow_packet_buffer: %u",
2438 packet_len,
2439 event_param->num_wow_packet_buffer);
2440 return -EINVAL;
2441 }
2442
Dustin Browne2206fb2017-04-20 13:39:25 -07002443 wake_info = event_param->fixed_param;
2444
2445 switch (wake_info->wake_reason) {
2446 case WOW_REASON_AUTH_REQ_RECV:
2447 case WOW_REASON_ASSOC_REQ_RECV:
2448 case WOW_REASON_DEAUTH_RECVD:
2449 case WOW_REASON_DISASSOC_RECVD:
2450 case WOW_REASON_ASSOC_RES_RECV:
2451 case WOW_REASON_REASSOC_REQ_RECV:
2452 case WOW_REASON_REASSOC_RES_RECV:
2453 case WOW_REASON_BEACON_RECV:
2454 case WOW_REASON_ACTION_FRAME_RECV:
2455 /* management frame case */
2456 wma_wow_dump_mgmt_buffer(packet, packet_len);
2457 break;
2458
2459 case WOW_REASON_BPF_ALLOW:
2460 case WOW_REASON_PATTERN_MATCH_FOUND:
2461 case WOW_REASON_RA_MATCH:
2462 case WOW_REASON_RECV_MAGIC_PATTERN:
Will Huang3f7cb652018-11-28 10:41:24 +08002463 case WOW_REASON_PACKET_FILTER_MATCH:
Dustin Browne2206fb2017-04-20 13:39:25 -07002464 WMA_LOGD("Wake event packet:");
2465 qdf_trace_hex_dump(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG,
2466 packet, packet_len);
2467
2468 vdev = &wma->interfaces[wake_info->vdev_id];
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002469 wma_wow_parse_data_pkt(wma, wake_info->vdev_id,
2470 packet, packet_len);
Dustin Browne2206fb2017-04-20 13:39:25 -07002471 break;
2472
2473 default:
Rajeev Kumare7bae1e2020-02-10 15:36:08 -08002474 WMA_LOGE("Wake reason %s is not a packet event",
2475 wma_wow_wake_reason_str(wake_info->wake_reason));
Dustin Browne2206fb2017-04-20 13:39:25 -07002476 return -EINVAL;
2477 }
2478
2479 return 0;
2480}
2481
2482static int wma_wake_event_no_payload(
2483 t_wma_handle *wma,
2484 WMI_WOW_WAKEUP_HOST_EVENTID_param_tlvs *event_param,
2485 uint32_t length)
2486{
2487 WOW_EVENT_INFO_fixed_param *wake_info = event_param->fixed_param;
2488
2489 switch (wake_info->wake_reason) {
2490 case WOW_REASON_HOST_AUTO_SHUTDOWN:
2491 return wma_wake_reason_auto_shutdown();
2492
2493 case WOW_REASON_NLOD:
2494 return wma_wake_reason_nlod(wma, wake_info->vdev_id);
Dustin Browne2206fb2017-04-20 13:39:25 -07002495
Dustin Brown3c89c012017-05-01 12:17:32 -07002496 default:
2497 return 0;
2498 }
Dustin Browne2206fb2017-04-20 13:39:25 -07002499}
2500
2501static int wma_wake_event_piggybacked(
2502 t_wma_handle *wma,
2503 WMI_WOW_WAKEUP_HOST_EVENTID_param_tlvs *event_param,
2504 uint32_t length)
2505{
Deepak Dhamdhere6d2c97a2017-02-04 22:09:27 -08002506 int errno = 0;
Dustin Browne2206fb2017-04-20 13:39:25 -07002507 void *pb_event;
2508 uint32_t pb_event_len;
2509 uint32_t wake_reason;
2510 uint32_t event_id;
Naveen Rawata600b2e2018-03-29 13:41:18 -07002511 uint8_t *bssid;
Naveen Rawata600b2e2018-03-29 13:41:18 -07002512 tpDeleteStaContext del_sta_ctx;
Dustin Browne2206fb2017-04-20 13:39:25 -07002513
2514 /*
2515 * There are "normal" cases where a wake reason that usually contains a
2516 * piggybacked event is empty. In these cases we just want to wake up,
2517 * and no action is needed. Bail out now if that is the case.
2518 */
Abhinav Kumarb0f99562018-01-24 16:15:30 +05302519 if (!event_param->wow_packet_buffer ||
2520 event_param->num_wow_packet_buffer <= 4) {
2521 WMA_LOGE("Invalid wow packet buffer from firmware %u",
2522 event_param->num_wow_packet_buffer);
Dustin Browne2206fb2017-04-20 13:39:25 -07002523 return 0;
Abhinav Kumarb0f99562018-01-24 16:15:30 +05302524 }
Dustin Browne2206fb2017-04-20 13:39:25 -07002525
Abhishek Ambure3ee80882019-09-20 16:32:12 +05302526 bssid = wma_get_vdev_bssid
2527 (wma->interfaces[event_param->fixed_param->vdev_id].vdev);
2528 if (!bssid) {
2529 WMA_LOGE("%s: Failed to get bssid for vdev_%d",
2530 __func__, event_param->fixed_param->vdev_id);
2531 return 0;
2532 }
Dustin Browne2206fb2017-04-20 13:39:25 -07002533 wake_reason = event_param->fixed_param->wake_reason;
2534
2535 /* parse piggybacked event from param buffer */
2536 {
2537 int ret_code;
2538 uint8_t *pb_event_buf;
2539 uint32_t tag;
2540
2541 /* first 4 bytes are the length, followed by the buffer */
2542 pb_event_len = *(uint32_t *)event_param->wow_packet_buffer;
Himanshu Agarwale6b49122017-10-13 17:50:11 +05302543 if (pb_event_len > (event_param->num_wow_packet_buffer - 4)) {
2544 WMA_LOGE("Invalid pb_event_len from firmware, pb_event_len: %u, num_wow_packet_buffer: %u",
2545 pb_event_len,
2546 event_param->num_wow_packet_buffer);
2547 return -EINVAL;
2548 }
Dustin Browne2206fb2017-04-20 13:39:25 -07002549 pb_event_buf = event_param->wow_packet_buffer + 4;
2550
2551 WMA_LOGD("piggybacked event buffer:");
2552 qdf_trace_hex_dump(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG,
2553 pb_event_buf, pb_event_len);
2554
2555 tag = WMITLV_GET_TLVTAG(WMITLV_GET_HDR(pb_event_buf));
2556 event_id = wow_get_wmi_eventid(wake_reason, tag);
2557 if (!event_id) {
2558 WMA_LOGE(FL("Unable to find Event Id"));
2559 return -EINVAL;
2560 }
2561
2562 ret_code = wmitlv_check_and_pad_event_tlvs(wma, pb_event_buf,
2563 pb_event_len,
2564 event_id, &pb_event);
2565 if (ret_code) {
2566 WMA_LOGE(FL("Bad TLVs; len:%d, event_id:%d, status:%d"),
2567 pb_event_len, event_id, ret_code);
2568 return -EINVAL;
2569 }
2570 }
2571
2572 switch (wake_reason) {
2573 case WOW_REASON_AP_ASSOC_LOST:
2574 errno = wma_wake_reason_ap_assoc_lost(wma, pb_event,
2575 pb_event_len);
2576 break;
2577
2578#ifdef FEATURE_WLAN_SCAN_PNO
2579 case WOW_REASON_NLO_SCAN_COMPLETE:
2580 errno = target_if_nlo_complete_handler(wma, pb_event,
2581 pb_event_len);
2582 break;
2583#endif /* FEATURE_WLAN_SCAN_PNO */
2584
2585 case WOW_REASON_CSA_EVENT:
2586 errno = wma_csa_offload_handler(wma, pb_event, pb_event_len);
2587 break;
2588
Deepak Dhamdhere6d2c97a2017-02-04 22:09:27 -08002589 /*
2590 * WOW_REASON_LOW_RSSI is used for following roaming events -
2591 * WMI_ROAM_REASON_BETTER_AP, WMI_ROAM_REASON_BMISS,
2592 * WMI_ROAM_REASON_SUITABLE_AP will be handled by
2593 * wma_roam_event_callback().
2594 * WOW_REASON_ROAM_HO is associated with
2595 * WMI_ROAM_REASON_HO_FAILED event and it will be handled by
2596 * wma_roam_event_callback().
2597 */
Dustin Browne2206fb2017-04-20 13:39:25 -07002598 case WOW_REASON_LOW_RSSI:
Deepak Dhamdhere6d2c97a2017-02-04 22:09:27 -08002599 case WOW_REASON_ROAM_HO:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07002600 wlan_roam_debug_log(event_param->fixed_param->vdev_id,
2601 DEBUG_WOW_ROAM_EVENT,
2602 DEBUG_INVALID_PEER_ID,
2603 NULL, NULL, wake_reason,
2604 pb_event_len);
Deepak Dhamdhere6d2c97a2017-02-04 22:09:27 -08002605 if (pb_event_len > 0) {
2606 errno = wma_roam_event_callback(wma, pb_event,
2607 pb_event_len);
2608 } else {
2609 /*
2610 * No wow_packet_buffer means a better AP beacon
2611 * will follow in a later event.
2612 */
2613 WMA_LOGD("Host woken up because of better AP beacon");
2614 }
Dustin Browne2206fb2017-04-20 13:39:25 -07002615 break;
2616
2617 case WOW_REASON_CLIENT_KICKOUT_EVENT:
2618 errno = wma_peer_sta_kickout_event_handler(wma, pb_event,
2619 pb_event_len);
2620 break;
2621
2622#ifdef FEATURE_WLAN_EXTSCAN
2623 case WOW_REASON_EXTSCAN:
2624 errno = wma_extscan_wow_event_callback(wma, pb_event,
2625 pb_event_len);
2626 break;
2627#endif
2628
2629 case WOW_REASON_RSSI_BREACH_EVENT:
2630 errno = wma_rssi_breached_event_handler(wma, pb_event,
2631 pb_event_len);
2632 break;
2633
2634 case WOW_REASON_NAN_EVENT:
Nachiket Kukade6003bd22018-11-08 18:30:08 +05302635 errno = wma_nan_rsp_handler_callback(wma, pb_event,
2636 pb_event_len);
Dustin Browne2206fb2017-04-20 13:39:25 -07002637 break;
2638
2639 case WOW_REASON_NAN_DATA:
2640 errno = wma_ndp_wow_event_callback(wma, pb_event, pb_event_len,
2641 event_id);
2642 break;
2643
2644#ifdef FEATURE_WLAN_TDLS
2645 case WOW_REASON_TDLS_CONN_TRACKER_EVENT:
2646 errno = wma_tdls_event_handler(wma, pb_event, pb_event_len);
2647 break;
2648#endif
Naveen Rawatd7734142017-10-27 10:02:40 -07002649
2650 case WOW_REASON_TIMER_INTR_RECV:
2651 /*
2652 * Right now firmware is not returning any cookie host has
2653 * programmed. So do not check for cookie.
2654 */
2655 WMA_LOGE("WOW_REASON_TIMER_INTR_RECV received, indicating key exchange did not finish. Initiate disconnect");
Arif Hussain157263f2018-10-03 13:07:15 -07002656 del_sta_ctx = qdf_mem_malloc(sizeof(*del_sta_ctx));
2657 if (!del_sta_ctx)
Naveen Rawata600b2e2018-03-29 13:41:18 -07002658 break;
Arif Hussain157263f2018-10-03 13:07:15 -07002659
Naveen Rawata600b2e2018-03-29 13:41:18 -07002660 del_sta_ctx->is_tdls = false;
2661 del_sta_ctx->vdev_id = event_param->fixed_param->vdev_id;
Srinivas Girigowdaa47b45f2019-02-27 12:29:02 -08002662 qdf_mem_copy(del_sta_ctx->addr2, bssid, QDF_MAC_ADDR_SIZE);
2663 qdf_mem_copy(del_sta_ctx->bssId, bssid, QDF_MAC_ADDR_SIZE);
Naveen Rawata600b2e2018-03-29 13:41:18 -07002664 del_sta_ctx->reasonCode = HAL_DEL_STA_REASON_CODE_KEEP_ALIVE;
2665 wma_send_msg(wma, SIR_LIM_DELETE_STA_CONTEXT_IND, del_sta_ctx,
2666 0);
Naveen Rawatd7734142017-10-27 10:02:40 -07002667 break;
Srikanth Marepalli72213312019-12-20 16:11:02 +05302668 case WOW_REASON_ROAM_PMKID_REQUEST:
2669 WMA_LOGD("Host woken up because of PMKID request event");
2670 errno = wma_roam_pmkid_request_event_handler(wma, pb_event,
2671 pb_event_len);
2672 break;
Dustin Browne2206fb2017-04-20 13:39:25 -07002673 default:
2674 WMA_LOGE("Wake reason %s(%u) is not a piggybacked event",
2675 wma_wow_wake_reason_str(wake_reason), wake_reason);
2676 errno = -EINVAL;
2677 break;
2678 }
2679
2680 wmitlv_free_allocated_event_tlvs(event_id, &pb_event);
2681
2682 return errno;
2683}
2684
Rajeev Kumar4cfc6ee2019-06-07 12:11:12 -07002685static void wma_debug_assert_page_fault_wakeup(uint32_t reason)
2686{
2687 /* During DRV if page fault wake up then assert */
2688 if ((WOW_REASON_PAGE_FAULT == reason) && (qdf_is_drv_connected()))
2689 QDF_DEBUG_PANIC("Unexpected page fault wake up detected during DRV wow");
2690}
2691
Dustin Browne2206fb2017-04-20 13:39:25 -07002692static void wma_wake_event_log_reason(t_wma_handle *wma,
2693 WOW_EVENT_INFO_fixed_param *wake_info)
2694{
Dustin Brown3c89c012017-05-01 12:17:32 -07002695 struct wma_txrx_node *vdev;
Dustin Browne2206fb2017-04-20 13:39:25 -07002696
2697 /* "Unspecified" means APPS triggered wake, else firmware triggered */
2698 if (wake_info->wake_reason != WOW_REASON_UNSPECIFIED) {
Dustin Brown3c89c012017-05-01 12:17:32 -07002699 vdev = &wma->interfaces[wake_info->vdev_id];
Dustin Brown4ea846d2017-06-05 10:56:57 -07002700 WMA_LOGA("WLAN triggered wakeup: %s (%d), vdev: %d (%s)",
Dustin Browne2206fb2017-04-20 13:39:25 -07002701 wma_wow_wake_reason_str(wake_info->wake_reason),
2702 wake_info->wake_reason,
2703 wake_info->vdev_id,
Dustin Brown3c89c012017-05-01 12:17:32 -07002704 wma_vdev_type_str(vdev->type));
Rajeev Kumar4cfc6ee2019-06-07 12:11:12 -07002705 wma_debug_assert_page_fault_wakeup(wake_info->wake_reason);
Dustin Browne2206fb2017-04-20 13:39:25 -07002706 } else if (!wmi_get_runtime_pm_inprogress(wma->wmi_handle)) {
Dustin Brown4ea846d2017-06-05 10:56:57 -07002707 WMA_LOGA("Non-WLAN triggered wakeup: %s (%d)",
Dustin Browne2206fb2017-04-20 13:39:25 -07002708 wma_wow_wake_reason_str(wake_info->wake_reason),
2709 wake_info->wake_reason);
2710 }
2711
2712 qdf_wow_wakeup_host_event(wake_info->wake_reason);
Yeshwanth Sriram Guntukaa10da362017-10-06 12:57:11 +05302713 qdf_wma_wow_wakeup_stats_event(wma);
Dustin Browne2206fb2017-04-20 13:39:25 -07002714}
2715
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +05302716/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002717 * wma_wow_wakeup_host_event() - wakeup host event handler
2718 * @handle: wma handle
2719 * @event: event data
2720 * @len: buffer length
2721 *
2722 * Handler to catch wow wakeup host event. This event will have
2723 * reason why the firmware has woken the host.
2724 *
Dustin Brownecb7eb92017-04-06 17:00:11 -07002725 * Return: Errno
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002726 */
Dustin Brownecb7eb92017-04-06 17:00:11 -07002727int wma_wow_wakeup_host_event(void *handle, uint8_t *event, uint32_t len)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002728{
Dustin Browne2206fb2017-04-20 13:39:25 -07002729 int errno;
2730 t_wma_handle *wma = handle;
2731 WMI_WOW_WAKEUP_HOST_EVENTID_param_tlvs *event_param;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002732 WOW_EVENT_INFO_fixed_param *wake_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002733
Dustin Browne2206fb2017-04-20 13:39:25 -07002734 event_param = (WMI_WOW_WAKEUP_HOST_EVENTID_param_tlvs *)event;
2735 if (!event_param) {
2736 WMA_LOGE("Wake event data is null");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002737 return -EINVAL;
2738 }
2739
Dustin Browne2206fb2017-04-20 13:39:25 -07002740 wake_info = event_param->fixed_param;
Vignesh Viswanathan1f6e08f2018-01-25 17:45:23 +05302741
2742 if (wake_info->vdev_id >= wma->max_bssid) {
2743 WMA_LOGE("%s: received invalid vdev_id %d",
2744 __func__, wake_info->vdev_id);
2745 return -EINVAL;
2746 }
2747
Dustin Browne2206fb2017-04-20 13:39:25 -07002748 wma_wake_event_log_reason(wma, wake_info);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002749
Wu Gaod7dd6e42018-10-16 17:22:56 +08002750 ucfg_pmo_psoc_wakeup_host_event_received(wma->psoc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002751
Dustin Browne2206fb2017-04-20 13:39:25 -07002752 wma_print_wow_stats(wma, wake_info);
Dustin Browne2206fb2017-04-20 13:39:25 -07002753 /* split based on payload type */
2754 if (is_piggybacked_event(wake_info->wake_reason))
2755 errno = wma_wake_event_piggybacked(wma, event_param, len);
2756 else if (event_param->wow_packet_buffer)
2757 errno = wma_wake_event_packet(wma, event_param, len);
Dustin Brown9d797d62017-01-11 16:39:12 -08002758 else
Dustin Browne2206fb2017-04-20 13:39:25 -07002759 errno = wma_wake_event_no_payload(wma, event_param, len);
Dustin Brown9d797d62017-01-11 16:39:12 -08002760
Dustin Browne2206fb2017-04-20 13:39:25 -07002761 wma_inc_wow_stats(wma, wake_info);
2762 wma_print_wow_stats(wma, wake_info);
Dustin Browne2206fb2017-04-20 13:39:25 -07002763 wma_acquire_wow_wakelock(wma, wake_info->wake_reason);
Rajeev Kumar2c892fe2016-08-24 16:17:16 -07002764
Dustin Browne2206fb2017-04-20 13:39:25 -07002765 return errno;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002766}
2767
Will Huang3cd2b7c2017-11-17 13:16:56 +08002768#ifdef FEATURE_WLAN_D0WOW
2769/**
2770 * wma_d0_wow_disable_ack_event() - wakeup host event handler
2771 * @handle: wma handle
2772 * @event: event data
2773 * @len: buffer length
2774 *
2775 * Handler to catch D0-WOW disable ACK event. This event will have
2776 * reason why the firmware has woken the host.
2777 * This is for backward compatible with cld2.0.
2778 *
2779 * Return: 0 for success or error
2780 */
2781int wma_d0_wow_disable_ack_event(void *handle, uint8_t *event, uint32_t len)
2782{
2783 tp_wma_handle wma = (tp_wma_handle)handle;
2784 WMI_D0_WOW_DISABLE_ACK_EVENTID_param_tlvs *param_buf;
2785 wmi_d0_wow_disable_ack_event_fixed_param *resp_data;
2786
2787 param_buf = (WMI_D0_WOW_DISABLE_ACK_EVENTID_param_tlvs *)event;
2788 if (!param_buf) {
2789 WMA_LOGE("Invalid D0-WOW disable ACK event buffer!");
2790 return -EINVAL;
2791 }
2792
2793 resp_data = param_buf->fixed_param;
2794
Wu Gaod7dd6e42018-10-16 17:22:56 +08002795 ucfg_pmo_psoc_wakeup_host_event_received(wma->psoc);
Will Huang3cd2b7c2017-11-17 13:16:56 +08002796
2797 WMA_LOGD("Received D0-WOW disable ACK");
2798
2799 return 0;
2800}
2801#else
2802int wma_d0_wow_disable_ack_event(void *handle, uint8_t *event, uint32_t len)
2803{
2804 return 0;
2805}
2806#endif
2807
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002808/**
2809 * wma_pdev_resume_event_handler() - PDEV resume event handler
2810 * @handle: wma handle
2811 * @event: event data
2812 * @len: buffer length
2813 *
2814 * Return: 0 for success or error
2815 */
2816int wma_pdev_resume_event_handler(void *handle, uint8_t *event, uint32_t len)
2817{
2818 tp_wma_handle wma = (tp_wma_handle) handle;
2819
2820 WMA_LOGA("Received PDEV resume event");
2821
Wu Gaod7dd6e42018-10-16 17:22:56 +08002822 ucfg_pmo_psoc_wakeup_host_event_received(wma->psoc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002823
2824 return 0;
2825}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002826
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002827/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002828 * wma_del_ts_req() - send DELTS request to fw
2829 * @wma: wma handle
2830 * @msg: delts params
2831 *
2832 * Return: none
2833 */
Jeff Johnson256002f2018-12-22 17:53:19 -08002834void wma_del_ts_req(tp_wma_handle wma, struct del_ts_params *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002835{
Pragaspathi Thilagaraj0d1159e2018-08-08 19:00:36 +05302836 if (!wma_is_vdev_valid(msg->sessionId)) {
2837 WMA_LOGE("%s: vdev id:%d is not active ", __func__,
2838 msg->sessionId);
2839 qdf_mem_free(msg);
2840 return;
2841 }
Govind Singhaa64c242016-03-08 11:31:49 +05302842 if (wmi_unified_del_ts_cmd(wma->wmi_handle,
2843 msg->sessionId,
2844 TID_TO_WME_AC(msg->userPrio))) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002845 WMA_LOGP("%s: Failed to send vdev DELTS command", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002846 }
Govind Singhaa64c242016-03-08 11:31:49 +05302847
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002848#ifdef WLAN_FEATURE_ROAM_OFFLOAD
2849 if (msg->setRICparams == true)
2850 wma_set_ric_req(wma, msg, false);
2851#endif /* WLAN_FEATURE_ROAM_OFFLOAD */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302852 qdf_mem_free(msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002853}
2854
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002855void wma_aggr_qos_req(tp_wma_handle wma,
Pragaspathi Thilagarajd5cb9e82019-02-04 14:13:52 +05302856 struct aggr_add_ts_param *aggr_qos_rsp_msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002857{
Pragaspathi Thilagarajd5cb9e82019-02-04 14:13:52 +05302858 if (!wma_is_vdev_valid(aggr_qos_rsp_msg->vdev_id)) {
2859 WMA_LOGE("%s: vdev id:%d is not active ", __func__,
2860 aggr_qos_rsp_msg->vdev_id);
2861 return;
2862 }
2863 wmi_unified_aggr_qos_cmd(wma->wmi_handle, aggr_qos_rsp_msg);
Jeff Johnsonc97816c2018-05-12 17:13:23 -07002864 /* send response to upper layers from here only. */
Pragaspathi Thilagarajd5cb9e82019-02-04 14:13:52 +05302865 wma_send_msg_high_priority(wma, WMA_AGGR_QOS_RSP, aggr_qos_rsp_msg, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002866}
2867
Mahesh Kumar Kalikot Veetil40575112016-09-09 16:57:08 -07002868#ifdef FEATURE_WLAN_ESE
2869/**
2870 * wma_set_tsm_interval() - Set TSM interval
2871 * @req: pointer to ADDTS request
2872 *
2873 * Return: QDF_STATUS_E_FAILURE or QDF_STATUS_SUCCESS
2874 */
Jeff Johnson9851fcc2018-12-22 17:29:58 -08002875static QDF_STATUS wma_set_tsm_interval(struct add_ts_param *req)
Mahesh Kumar Kalikot Veetil40575112016-09-09 16:57:08 -07002876{
2877 /*
2878 * msmt_interval is in unit called TU (1 TU = 1024 us)
2879 * max value of msmt_interval cannot make resulting
2880 * interval_milliseconds overflow 32 bit
2881 *
2882 */
2883 uint32_t interval_milliseconds;
Mahesh Kumar Kalikot Veetil40575112016-09-09 16:57:08 -07002884
2885 interval_milliseconds = (req->tsm_interval * 1024) / 1000;
2886
Leo Chang96464902016-10-28 11:10:54 -07002887 cdp_tx_set_compute_interval(cds_get_context(QDF_MODULE_ID_SOC),
Rakesh Pillaief35fab2019-07-04 20:13:09 +05302888 WMI_PDEV_ID_SOC,
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08002889 interval_milliseconds);
Mahesh Kumar Kalikot Veetil40575112016-09-09 16:57:08 -07002890 return QDF_STATUS_SUCCESS;
2891}
2892#else
Jeff Johnson9851fcc2018-12-22 17:29:58 -08002893static inline QDF_STATUS wma_set_tsm_interval(struct add_ts_param *req)
Mahesh Kumar Kalikot Veetil40575112016-09-09 16:57:08 -07002894{
2895 return QDF_STATUS_SUCCESS;
2896}
2897#endif /* FEATURE_WLAN_ESE */
2898
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002899/**
2900 * wma_add_ts_req() - send ADDTS request to fw
2901 * @wma: wma handle
2902 * @msg: ADDTS params
2903 *
2904 * Return: none
2905 */
Jeff Johnson9851fcc2018-12-22 17:29:58 -08002906void wma_add_ts_req(tp_wma_handle wma, struct add_ts_param *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002907{
Govind Singhaa64c242016-03-08 11:31:49 +05302908 struct add_ts_param cmd = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002909
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002910 msg->status = QDF_STATUS_SUCCESS;
Mahesh Kumar Kalikot Veetil40575112016-09-09 16:57:08 -07002911 if (wma_set_tsm_interval(msg) == QDF_STATUS_SUCCESS) {
Govind Singhaa64c242016-03-08 11:31:49 +05302912
Jeff Johnson5c68c5b2019-01-20 15:37:43 -08002913 cmd.vdev_id = msg->vdev_id;
Mahesh Kumar Kalikot Veetil40575112016-09-09 16:57:08 -07002914 cmd.tspec.tsinfo.traffic.userPrio =
Govind Singhaa64c242016-03-08 11:31:49 +05302915 TID_TO_WME_AC(msg->tspec.tsinfo.traffic.userPrio);
Mahesh Kumar Kalikot Veetil40575112016-09-09 16:57:08 -07002916 cmd.tspec.mediumTime = msg->tspec.mediumTime;
2917 if (wmi_unified_add_ts_cmd(wma->wmi_handle, &cmd))
2918 msg->status = QDF_STATUS_E_FAILURE;
Govind Singhaa64c242016-03-08 11:31:49 +05302919
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002920#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Jeff Johnsone2da5782019-01-20 09:58:07 -08002921 if (msg->set_ric_params)
Mahesh Kumar Kalikot Veetil40575112016-09-09 16:57:08 -07002922 wma_set_ric_req(wma, msg, true);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002923#endif /* WLAN_FEATURE_ROAM_OFFLOAD */
2924
Mahesh Kumar Kalikot Veetil40575112016-09-09 16:57:08 -07002925 }
Abhishek Singh2d775fd2017-08-18 10:51:33 +05302926 wma_send_msg_high_priority(wma, WMA_ADD_TS_RSP, msg, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002927}
2928
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002929#ifdef FEATURE_WLAN_ESE
2930
2931#define TSM_DELAY_HISTROGRAM_BINS 4
2932/**
2933 * wma_process_tsm_stats_req() - process tsm stats request
2934 * @wma_handler - handle to wma
2935 * @pTsmStatsMsg - TSM stats struct that needs to be populated and
2936 * passed in message.
2937 *
2938 * A parallel function to WMA_ProcessTsmStatsReq for pronto. This
2939 * function fetches stats from data path APIs and post
2940 * WMA_TSM_STATS_RSP msg back to LIM.
2941 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302942 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002943 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302944QDF_STATUS wma_process_tsm_stats_req(tp_wma_handle wma_handler,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002945 void *pTsmStatsMsg)
2946{
2947 uint8_t counter;
2948 uint32_t queue_delay_microsec = 0;
2949 uint32_t tx_delay_microsec = 0;
2950 uint16_t packet_count = 0;
2951 uint16_t packet_loss_count = 0;
2952 tpAniTrafStrmMetrics pTsmMetric = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002953 tpAniGetTsmStatsReq pStats = (tpAniGetTsmStatsReq) pTsmStatsMsg;
2954 tpAniGetTsmStatsRsp pTsmRspParams = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002955 int tid = pStats->tid;
2956 /*
2957 * The number of histrogram bin report by data path api are different
2958 * than required by TSM, hence different (6) size array used
2959 */
2960 uint16_t bin_values[QCA_TX_DELAY_HIST_REPORT_BINS] = { 0, };
Leo Chang96464902016-10-28 11:10:54 -07002961 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002962
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002963 /* get required values from data path APIs */
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08002964 cdp_tx_delay(soc,
Rakesh Pillaief35fab2019-07-04 20:13:09 +05302965 WMI_PDEV_ID_SOC,
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08002966 &queue_delay_microsec,
2967 &tx_delay_microsec, tid);
2968 cdp_tx_delay_hist(soc,
Rakesh Pillaief35fab2019-07-04 20:13:09 +05302969 WMI_PDEV_ID_SOC,
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08002970 bin_values, tid);
2971 cdp_tx_packet_count(soc,
Rakesh Pillaief35fab2019-07-04 20:13:09 +05302972 WMI_PDEV_ID_SOC,
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08002973 &packet_count,
2974 &packet_loss_count, tid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002975
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08002976 pTsmRspParams = qdf_mem_malloc(sizeof(*pTsmRspParams));
Arif Hussain157263f2018-10-03 13:07:15 -07002977 if (!pTsmRspParams) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302978 QDF_ASSERT(0);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302979 qdf_mem_free(pTsmStatsMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302980 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002981 }
Abhinav Kumaraa8f2df2019-01-11 20:02:26 +05302982 qdf_copy_macaddr(&pTsmRspParams->bssid, &pStats->bssId);
Jeff Johnsone88dd752018-06-07 22:57:54 -07002983 pTsmRspParams->rc = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002984 pTsmRspParams->tsmStatsReq = pStats;
2985 pTsmMetric = &pTsmRspParams->tsmMetrics;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002986 /* populate pTsmMetric */
2987 pTsmMetric->UplinkPktQueueDly = queue_delay_microsec;
2988 /* store only required number of bin values */
2989 for (counter = 0; counter < TSM_DELAY_HISTROGRAM_BINS; counter++) {
2990 pTsmMetric->UplinkPktQueueDlyHist[counter] =
2991 bin_values[counter];
2992 }
2993 pTsmMetric->UplinkPktTxDly = tx_delay_microsec;
2994 pTsmMetric->UplinkPktLoss = packet_loss_count;
2995 pTsmMetric->UplinkPktCount = packet_count;
2996
2997 /*
2998 * No need to populate roaming delay and roaming count as they are
2999 * being populated just before sending IAPP frame out
3000 */
3001 /* post this message to LIM/PE */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003002 wma_send_msg(wma_handler, WMA_TSM_STATS_RSP, (void *)pTsmRspParams, 0);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303003 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003004}
3005
3006#endif /* FEATURE_WLAN_ESE */
3007
3008/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003009 * wma_process_mcbc_set_filter_req() - process mcbc set filter request
3010 * @wma_handle: wma handle
3011 * @mcbc_param: mcbc params
3012 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303013 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003014 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303015QDF_STATUS wma_process_mcbc_set_filter_req(tp_wma_handle wma_handle,
Anurag Chouhance0dc992016-02-16 18:18:03 +05303016 tSirRcvFltMcAddrList *mcbc_param)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003017{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303018 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003019}
3020
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003021/**
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003022 * wma_process_cesium_enable_ind() - enables cesium functionality in target
3023 * @wma: wma handle
3024 *
3025 * Return: QDF status
3026 */
3027QDF_STATUS wma_process_cesium_enable_ind(tp_wma_handle wma)
3028{
3029 QDF_STATUS ret;
3030 int32_t vdev_id;
3031
3032 vdev_id = wma_find_vdev_by_type(wma, WMI_VDEV_TYPE_IBSS);
3033 if (vdev_id < 0) {
3034 WMA_LOGE("%s: IBSS vdev does not exist could not enable cesium",
3035 __func__);
3036 return QDF_STATUS_E_FAILURE;
3037 }
3038
3039 /* Send enable cesium command to target */
3040 WMA_LOGE("Enable cesium in target for vdevId %d ", vdev_id);
3041 ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
3042 WMI_VDEV_PARAM_ENABLE_RMC, 1);
3043 if (ret) {
3044 WMA_LOGE("Enable cesium failed for vdevId %d", vdev_id);
3045 return QDF_STATUS_E_FAILURE;
3046 }
3047 return QDF_STATUS_SUCCESS;
3048}
3049
3050/**
3051 * wma_process_get_peer_info_req() - sends get peer info cmd to target
3052 * @wma: wma handle
3053 * @preq: get peer info request
3054 *
3055 * Return: QDF status
3056 */
3057QDF_STATUS wma_process_get_peer_info_req
3058 (tp_wma_handle wma, tSirIbssGetPeerInfoReqParams *pReq)
3059{
3060 int32_t ret;
3061 uint8_t *p;
3062 uint16_t len;
3063 wmi_buf_t buf;
3064 int32_t vdev_id;
Vevek Venkatesan2d88a6b2019-10-04 19:03:10 +05303065 uint8_t pdev_id;
Leo Chang96464902016-10-28 11:10:54 -07003066 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Srinivas Girigowdaa47b45f2019-02-27 12:29:02 -08003067 uint8_t peer_mac[QDF_MAC_ADDR_SIZE];
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003068 wmi_peer_info_req_cmd_fixed_param *p_get_peer_info_cmd;
Srinivas Girigowdaa47b45f2019-02-27 12:29:02 -08003069 uint8_t bcast_mac[QDF_MAC_ADDR_SIZE] = { 0xff, 0xff, 0xff,
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003070 0xff, 0xff, 0xff };
3071
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07003072 if (!soc) {
Nishank Aggarwala13b61d2016-12-01 12:53:58 +05303073 WMA_LOGE("%s: SOC context is NULL", __func__);
3074 return QDF_STATUS_E_FAILURE;
3075 }
3076
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003077 vdev_id = wma_find_vdev_by_type(wma, WMI_VDEV_TYPE_IBSS);
3078 if (vdev_id < 0) {
3079 WMA_LOGE("%s: IBSS vdev does not exist could not get peer info",
3080 __func__);
3081 return QDF_STATUS_E_FAILURE;
3082 }
3083
Vevek Venkatesan2d88a6b2019-10-04 19:03:10 +05303084 pdev_id = WMI_PDEV_ID_SOC;
3085 if (pdev_id == OL_TXRX_INVALID_PDEV_ID) {
3086 WMA_LOGE("%s: Failed to get pdev id", __func__);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003087 return QDF_STATUS_E_FAILURE;
3088 }
3089
Yeshwanth Sriram Guntuka3f262102019-07-16 15:41:08 +05303090 if (qdf_is_macaddr_broadcast(&pReq->peer_mac)) {
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003091 /*get info for all peers */
Srinivas Girigowdaa47b45f2019-02-27 12:29:02 -08003092 qdf_mem_copy(peer_mac, bcast_mac, QDF_MAC_ADDR_SIZE);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003093 } else {
3094 /*get info for a single peer */
Vevek Venkatesan2d88a6b2019-10-04 19:03:10 +05303095 if (!cdp_find_peer_exist(soc, pdev_id, pReq->peer_mac.bytes)) {
Yeshwanth Sriram Guntuka3f262102019-07-16 15:41:08 +05303096 WMA_LOGE("%s: Failed to get peer handle using peer "
3097 QDF_MAC_ADDR_STR, __func__,
3098 QDF_MAC_ADDR_ARRAY(pReq->peer_mac.bytes));
Nishank Aggarwala13b61d2016-12-01 12:53:58 +05303099 return QDF_STATUS_E_FAILURE;
3100 }
3101
Yeshwanth Sriram Guntuka3f262102019-07-16 15:41:08 +05303102 WMA_LOGE("%s: peer mac: " QDF_MAC_ADDR_STR, __func__,
3103 QDF_MAC_ADDR_ARRAY(pReq->peer_mac.bytes));
3104 qdf_mem_copy(peer_mac, pReq->peer_mac.bytes, QDF_MAC_ADDR_SIZE);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003105 }
3106
3107 len = sizeof(wmi_peer_info_req_cmd_fixed_param);
3108 buf = wmi_buf_alloc(wma->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07003109 if (!buf)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003110 return QDF_STATUS_E_FAILURE;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003111
3112 p = (uint8_t *) wmi_buf_data(buf);
3113 qdf_mem_zero(p, len);
3114 p_get_peer_info_cmd = (wmi_peer_info_req_cmd_fixed_param *) p;
3115
3116 WMITLV_SET_HDR(&p_get_peer_info_cmd->tlv_header,
3117 WMITLV_TAG_STRUC_wmi_peer_info_req_cmd_fixed_param,
3118 WMITLV_GET_STRUCT_TLVLEN
3119 (wmi_peer_info_req_cmd_fixed_param));
3120
3121 p_get_peer_info_cmd->vdev_id = vdev_id;
3122 WMI_CHAR_ARRAY_TO_MAC_ADDR(peer_mac,
3123 &p_get_peer_info_cmd->peer_mac_address);
3124
3125 ret = wmi_unified_cmd_send(wma->wmi_handle, buf, len,
3126 WMI_PEER_INFO_REQ_CMDID);
Dustin Brown2afb6f52016-12-02 14:47:48 -08003127 if (ret != QDF_STATUS_SUCCESS)
3128 wmi_buf_free(buf);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003129
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003130 WMA_LOGE("IBSS get peer info cmd sent len: %d, vdev %d command id: %d, status: %d",
3131 len, vdev_id, WMI_PEER_INFO_REQ_CMDID, ret);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003132
3133 return QDF_STATUS_SUCCESS;
3134}
3135
3136/**
3137 * wma_process_tx_fail_monitor_ind() - sends tx fail monitor cmd to target
3138 * @wma: wma handle
3139 * @pReq: tx fail monitor command params
3140 *
3141 * Return: QDF status
3142 */
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003143QDF_STATUS wma_process_tx_fail_monitor_ind(tp_wma_handle wma,
3144 tAniTXFailMonitorInd *pReq)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003145{
3146 QDF_STATUS ret;
3147 int32_t vdev_id;
3148
3149 vdev_id = wma_find_vdev_by_type(wma, WMI_VDEV_TYPE_IBSS);
3150 if (vdev_id < 0) {
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003151 WMA_LOGE("%s: IBSS vdev does not exist could not send fast tx fail monitor indication message to target",
3152 __func__);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003153 return QDF_STATUS_E_FAILURE;
3154 }
3155
3156 /* Send enable cesium command to target */
3157 WMA_LOGE("send fast tx fail monitor ind cmd target for vdevId %d val %d",
3158 vdev_id, pReq->tx_fail_count);
3159
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003160 if (pReq->tx_fail_count == 0)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003161 wma->hddTxFailCb = NULL;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003162 else
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003163 wma->hddTxFailCb = pReq->txFailIndCallback;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003164 ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
3165 WMI_VDEV_PARAM_SET_IBSS_TX_FAIL_CNT_THR,
3166 pReq->tx_fail_count);
3167 if (ret) {
3168 WMA_LOGE("tx fail monitor failed for vdevId %d", vdev_id);
3169 return QDF_STATUS_E_FAILURE;
3170 }
3171
3172 return QDF_STATUS_SUCCESS;
3173}
3174
Rachit Kankaneee1735c2018-08-02 13:19:34 +05303175#ifdef FEATURE_WLAN_RMC
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003176/**
3177 * wma_process_rmc_enable_ind() - enables RMC functionality in target
3178 * @wma: wma handle
3179 *
3180 * Return: QDF status
3181 */
3182QDF_STATUS wma_process_rmc_enable_ind(tp_wma_handle wma)
3183{
3184 int ret;
3185 uint8_t *p;
3186 uint16_t len;
3187 wmi_buf_t buf;
3188 int32_t vdev_id;
3189 wmi_rmc_set_mode_cmd_fixed_param *p_rmc_enable_cmd;
3190
3191 vdev_id = wma_find_vdev_by_type(wma, WMI_VDEV_TYPE_IBSS);
3192 if (vdev_id < 0) {
3193 WMA_LOGE("%s: IBSS vdev does not exist could not enable RMC",
3194 __func__);
3195 return QDF_STATUS_E_FAILURE;
3196 }
3197
3198 len = sizeof(wmi_rmc_set_mode_cmd_fixed_param);
3199 buf = wmi_buf_alloc(wma->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07003200 if (!buf)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003201 return QDF_STATUS_E_FAILURE;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003202
3203 p = (uint8_t *) wmi_buf_data(buf);
3204 qdf_mem_zero(p, len);
3205 p_rmc_enable_cmd = (wmi_rmc_set_mode_cmd_fixed_param *) p;
3206
3207 WMITLV_SET_HDR(&p_rmc_enable_cmd->tlv_header,
3208 WMITLV_TAG_STRUC_wmi_rmc_set_mode_cmd_fixed_param,
3209 WMITLV_GET_STRUCT_TLVLEN
3210 (wmi_rmc_set_mode_cmd_fixed_param));
3211
3212 p_rmc_enable_cmd->vdev_id = vdev_id;
3213 p_rmc_enable_cmd->enable_rmc = WMI_RMC_MODE_ENABLED;
3214
3215 ret = wmi_unified_cmd_send(wma->wmi_handle, buf, len,
3216 WMI_RMC_SET_MODE_CMDID);
Dustin Brown2afb6f52016-12-02 14:47:48 -08003217 if (ret != QDF_STATUS_SUCCESS)
3218 wmi_buf_free(buf);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003219
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003220 WMA_LOGE("Enable RMC cmd sent len: %d, vdev %d command id: %d, status: %d",
3221 len, vdev_id, WMI_RMC_SET_MODE_CMDID, ret);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003222
3223 return QDF_STATUS_SUCCESS;
3224}
3225
3226/**
3227 * wma_process_rmc_disable_ind() - disables rmc functionality in target
3228 * @wma: wma handle
3229 *
3230 * Return: QDF status
3231 */
3232QDF_STATUS wma_process_rmc_disable_ind(tp_wma_handle wma)
3233{
3234 int ret;
3235 uint8_t *p;
3236 uint16_t len;
3237 wmi_buf_t buf;
3238 int32_t vdev_id;
3239 wmi_rmc_set_mode_cmd_fixed_param *p_rmc_disable_cmd;
3240
3241 vdev_id = wma_find_vdev_by_type(wma, WMI_VDEV_TYPE_IBSS);
3242 if (vdev_id < 0) {
3243 WMA_LOGE("%s: IBSS vdev does not exist could not disable RMC",
3244 __func__);
3245 return QDF_STATUS_E_FAILURE;
3246 }
3247
3248 len = sizeof(wmi_rmc_set_mode_cmd_fixed_param);
3249 buf = wmi_buf_alloc(wma->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07003250 if (!buf)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003251 return QDF_STATUS_E_FAILURE;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003252
3253 p = (uint8_t *) wmi_buf_data(buf);
3254 qdf_mem_zero(p, len);
3255 p_rmc_disable_cmd = (wmi_rmc_set_mode_cmd_fixed_param *) p;
3256
3257 WMITLV_SET_HDR(&p_rmc_disable_cmd->tlv_header,
3258 WMITLV_TAG_STRUC_wmi_rmc_set_mode_cmd_fixed_param,
3259 WMITLV_GET_STRUCT_TLVLEN
3260 (wmi_rmc_set_mode_cmd_fixed_param));
3261
3262 p_rmc_disable_cmd->vdev_id = vdev_id;
3263 p_rmc_disable_cmd->enable_rmc = WMI_RMC_MODE_DISABLED;
3264
3265 ret = wmi_unified_cmd_send(wma->wmi_handle, buf, len,
3266 WMI_RMC_SET_MODE_CMDID);
Dustin Brown2afb6f52016-12-02 14:47:48 -08003267 if (ret != QDF_STATUS_SUCCESS)
3268 wmi_buf_free(buf);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003269
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003270 WMA_LOGE("Disable RMC cmd sent len: %d, vdev %d command id: %d, status: %d",
3271 len, vdev_id, WMI_RMC_SET_MODE_CMDID, ret);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003272
3273 return QDF_STATUS_SUCCESS;
3274}
3275
3276/**
3277 * wma_process_rmc_action_period_ind() - sends RMC action period to target
3278 * @wma: wma handle
3279 *
3280 * Return: QDF status
3281 */
3282QDF_STATUS wma_process_rmc_action_period_ind(tp_wma_handle wma)
3283{
3284 int ret;
3285 uint8_t *p;
3286 uint16_t len;
Dustin Brownecfae9a2016-11-15 13:01:39 -08003287 uint32_t periodicity_msec;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003288 wmi_buf_t buf;
3289 int32_t vdev_id;
3290 wmi_rmc_set_action_period_cmd_fixed_param *p_rmc_cmd;
Jeff Johnson009c40f2018-11-05 09:54:37 -08003291 struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003292
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07003293 if (!mac) {
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003294 WMA_LOGE("%s: MAC mac does not exist", __func__);
3295 return QDF_STATUS_E_FAILURE;
3296 }
3297
3298 vdev_id = wma_find_vdev_by_type(wma, WMI_VDEV_TYPE_IBSS);
3299 if (vdev_id < 0) {
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003300 WMA_LOGE("%s: IBSS vdev does not exist could not send RMC action period to target",
3301 __func__);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003302 return QDF_STATUS_E_FAILURE;
3303 }
3304
3305 len = sizeof(wmi_rmc_set_action_period_cmd_fixed_param);
3306 buf = wmi_buf_alloc(wma->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07003307 if (!buf)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003308 return QDF_STATUS_E_FAILURE;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003309
3310 p = (uint8_t *) wmi_buf_data(buf);
3311 qdf_mem_zero(p, len);
3312 p_rmc_cmd = (wmi_rmc_set_action_period_cmd_fixed_param *) p;
3313
3314 WMITLV_SET_HDR(&p_rmc_cmd->tlv_header,
3315 WMITLV_TAG_STRUC_wmi_rmc_set_action_period_cmd_fixed_param,
3316 WMITLV_GET_STRUCT_TLVLEN
3317 (wmi_rmc_set_action_period_cmd_fixed_param));
3318
Bala Venkatesh2fde2c62018-09-11 20:33:24 +05303319 periodicity_msec = mac->mlme_cfg->sap_cfg.rmc_action_period_freq;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003320 p_rmc_cmd->vdev_id = vdev_id;
Dustin Brownecfae9a2016-11-15 13:01:39 -08003321 p_rmc_cmd->periodicity_msec = periodicity_msec;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003322
3323 ret = wmi_unified_cmd_send(wma->wmi_handle, buf, len,
3324 WMI_RMC_SET_ACTION_PERIOD_CMDID);
Dustin Brown2afb6f52016-12-02 14:47:48 -08003325 if (ret != QDF_STATUS_SUCCESS)
3326 wmi_buf_free(buf);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003327
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003328 WMA_LOGE("RMC action period %d cmd sent len: %d, vdev %d command id: %d, status: %d",
3329 periodicity_msec, len, vdev_id, WMI_RMC_SET_ACTION_PERIOD_CMDID,
3330 ret);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003331
3332 return QDF_STATUS_SUCCESS;
3333}
Rachit Kankaneee1735c2018-08-02 13:19:34 +05303334#endif /* FEATURE_WLAN_RMC */
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003335
3336/**
Jeff Johnson6dcb44a2018-12-23 10:17:00 -08003337 * wma_process_add_periodic_tx_ptrn_ind() - add periodic tx pattern
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003338 * @handle: wma handle
Jeff Johnson6dcb44a2018-12-23 10:17:00 -08003339 * @pattern: tx pattern params
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003340 *
Jeff Johnson6dcb44a2018-12-23 10:17:00 -08003341 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003342 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303343QDF_STATUS wma_process_add_periodic_tx_ptrn_ind(WMA_HANDLE handle,
Jeff Johnson6dcb44a2018-12-23 10:17:00 -08003344 tSirAddPeriodicTxPtrn *pattern)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003345{
3346 tp_wma_handle wma_handle = (tp_wma_handle) handle;
Mohit Khanna0fe61672016-05-19 16:53:39 -07003347 struct periodic_tx_pattern *params_ptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003348 uint8_t vdev_id;
Mohit Khanna0fe61672016-05-19 16:53:39 -07003349 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003350
3351 if (!wma_handle || !wma_handle->wmi_handle) {
3352 WMA_LOGE("%s: WMA is closed, can not issue fw add pattern cmd",
3353 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303354 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003355 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003356
Vevek Venkatesan2d88a6b2019-10-04 19:03:10 +05303357 if (wma_find_vdev_id_by_addr(wma_handle,
3358 pattern->mac_address.bytes,
3359 &vdev_id)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003360 WMA_LOGE("%s: Failed to find vdev id for %pM", __func__,
Jeff Johnson6dcb44a2018-12-23 10:17:00 -08003361 pattern->mac_address.bytes);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303362 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003363 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003364
Jeff Johnson0536c172018-12-23 10:20:06 -08003365 params_ptr = qdf_mem_malloc(sizeof(*params_ptr));
3366 if (!params_ptr)
3367 return QDF_STATUS_E_NOMEM;
3368
Jeff Johnson6dcb44a2018-12-23 10:17:00 -08003369 params_ptr->ucPtrnId = pattern->ucPtrnId;
3370 params_ptr->ucPtrnSize = pattern->ucPtrnSize;
3371 params_ptr->usPtrnIntervalMs = pattern->usPtrnIntervalMs;
3372 qdf_mem_copy(&params_ptr->mac_address, &pattern->mac_address,
3373 sizeof(struct qdf_mac_addr));
3374 qdf_mem_copy(params_ptr->ucPattern, pattern->ucPattern,
3375 params_ptr->ucPtrnSize);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003376
Jeff Johnson6dcb44a2018-12-23 10:17:00 -08003377 status = wmi_unified_process_add_periodic_tx_ptrn_cmd(
3378 wma_handle->wmi_handle, params_ptr, vdev_id);
Mohit Khanna0fe61672016-05-19 16:53:39 -07003379
3380 qdf_mem_free(params_ptr);
3381 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003382}
3383
3384/**
3385 * wma_process_del_periodic_tx_ptrn_ind - del periodic tx ptrn
3386 * @handle: wma handle
3387 * @pDelPeriodicTxPtrnParams: tx ptrn params
3388 *
Jeff Johnson6dcb44a2018-12-23 10:17:00 -08003389 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003390 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303391QDF_STATUS wma_process_del_periodic_tx_ptrn_ind(WMA_HANDLE handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003392 tSirDelPeriodicTxPtrn *
3393 pDelPeriodicTxPtrnParams)
3394{
3395 tp_wma_handle wma_handle = (tp_wma_handle) handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003396 uint8_t vdev_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003397
3398 if (!wma_handle || !wma_handle->wmi_handle) {
3399 WMA_LOGE("%s: WMA is closed, can not issue Del Pattern cmd",
3400 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303401 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003402 }
Himanshu Agarwal44195412016-03-09 13:03:54 +05303403
Vevek Venkatesan2d88a6b2019-10-04 19:03:10 +05303404 if (wma_find_vdev_id_by_addr(
3405 wma_handle,
3406 pDelPeriodicTxPtrnParams->mac_address.bytes,
3407 &vdev_id)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003408 WMA_LOGE("%s: Failed to find vdev id for %pM", __func__,
Srinivas Girigowdaa5bba7a2015-11-18 22:44:36 -08003409 pDelPeriodicTxPtrnParams->mac_address.bytes);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303410 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003411 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003412
Himanshu Agarwal44195412016-03-09 13:03:54 +05303413 return wmi_unified_process_del_periodic_tx_ptrn_cmd(
3414 wma_handle->wmi_handle, vdev_id,
3415 pDelPeriodicTxPtrnParams->ucPtrnId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003416}
3417
3418#ifdef WLAN_FEATURE_STATS_EXT
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303419QDF_STATUS wma_stats_ext_req(void *wma_ptr, tpStatsExtRequest preq)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003420{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003421 tp_wma_handle wma = (tp_wma_handle) wma_ptr;
Krishna Kumaar Natarajan1b909d72016-06-06 15:02:18 -07003422 struct stats_ext_params *params;
3423 size_t params_len;
3424 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003425
Himanshu Agarwal44195412016-03-09 13:03:54 +05303426 if (!wma) {
3427 WMA_LOGE("%s: wma handle is NULL", __func__);
3428 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003429 }
3430
Krishna Kumaar Natarajan1b909d72016-06-06 15:02:18 -07003431 params_len = sizeof(*params) + preq->request_data_len;
3432 params = qdf_mem_malloc(params_len);
Arif Hussain157263f2018-10-03 13:07:15 -07003433 if (!params)
Krishna Kumaar Natarajan1b909d72016-06-06 15:02:18 -07003434 return QDF_STATUS_E_NOMEM;
Krishna Kumaar Natarajan1b909d72016-06-06 15:02:18 -07003435
3436 params->vdev_id = preq->vdev_id;
3437 params->request_data_len = preq->request_data_len;
3438 if (preq->request_data_len > 0)
3439 qdf_mem_copy(params->request_data, preq->request_data,
3440 params->request_data_len);
3441
3442 status = wmi_unified_stats_ext_req_cmd(wma->wmi_handle, params);
3443 qdf_mem_free(params);
3444
3445 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003446}
3447
3448#endif /* WLAN_FEATURE_STATS_EXT */
3449
3450#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
3451/**
3452 * wma_send_status_of_ext_wow() - send ext wow status to SME
3453 * @wma: wma handle
3454 * @status: status
3455 *
3456 * Return: none
3457 */
3458static void wma_send_status_of_ext_wow(tp_wma_handle wma, bool status)
3459{
3460 tSirReadyToExtWoWInd *ready_to_extwow;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303461 QDF_STATUS vstatus;
Rajeev Kumarcf7bd802017-04-18 11:11:42 -07003462 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003463 uint8_t len;
3464
3465 WMA_LOGD("Posting ready to suspend indication to umac");
3466
3467 len = sizeof(tSirReadyToExtWoWInd);
Arif Hussain157263f2018-10-03 13:07:15 -07003468 ready_to_extwow = qdf_mem_malloc(len);
3469 if (!ready_to_extwow)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003470 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003471
3472 ready_to_extwow->mesgType = eWNI_SME_READY_TO_EXTWOW_IND;
3473 ready_to_extwow->mesgLen = len;
3474 ready_to_extwow->status = status;
3475
Rajeev Kumarb60abe42017-01-21 15:39:31 -08003476 message.type = eWNI_SME_READY_TO_EXTWOW_IND;
3477 message.bodyptr = (void *)ready_to_extwow;
3478 message.bodyval = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003479
gaurank kathpalia00861f02018-08-28 19:16:12 +05303480 vstatus = scheduler_post_message(QDF_MODULE_ID_WMA,
3481 QDF_MODULE_ID_SME,
3482 QDF_MODULE_ID_SME, &message);
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05303483 if (vstatus != QDF_STATUS_SUCCESS)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303484 qdf_mem_free(ready_to_extwow);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003485}
3486
3487/**
3488 * wma_enable_ext_wow() - enable ext wow in fw
3489 * @wma: wma handle
3490 * @params: ext wow params
3491 *
3492 * Return:0 for success or error code
3493 */
Himanshu Agarwal44195412016-03-09 13:03:54 +05303494QDF_STATUS wma_enable_ext_wow(tp_wma_handle wma, tpSirExtWoWParams params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003495{
Himanshu Agarwal44195412016-03-09 13:03:54 +05303496 struct ext_wow_params wow_params = {0};
3497 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003498
Himanshu Agarwal44195412016-03-09 13:03:54 +05303499 if (!wma) {
3500 WMA_LOGE("%s: wma handle is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303501 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003502 }
3503
Himanshu Agarwal44195412016-03-09 13:03:54 +05303504 wow_params.vdev_id = params->vdev_id;
3505 wow_params.type = (enum wmi_ext_wow_type) params->type;
3506 wow_params.wakeup_pin_num = params->wakeup_pin_num;
3507
3508 status = wmi_unified_enable_ext_wow_cmd(wma->wmi_handle,
3509 &wow_params);
3510 if (QDF_IS_STATUS_ERROR(status))
3511 return status;
3512
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003513 wma_send_status_of_ext_wow(wma, true);
Himanshu Agarwal44195412016-03-09 13:03:54 +05303514 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003515
3516}
3517
3518/**
3519 * wma_set_app_type1_params_in_fw() - set app type1 params in fw
3520 * @wma: wma handle
3521 * @appType1Params: app type1 params
3522 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303523 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003524 */
3525int wma_set_app_type1_params_in_fw(tp_wma_handle wma,
3526 tpSirAppType1Params appType1Params)
3527{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003528 int ret;
3529
Govind Singhaa64c242016-03-08 11:31:49 +05303530 ret = wmi_unified_app_type1_params_in_fw_cmd(wma->wmi_handle,
3531 (struct app_type1_params *)appType1Params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003532 if (ret) {
3533 WMA_LOGE("%s: Failed to set APP TYPE1 PARAMS", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303534 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003535 }
3536
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303537 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003538}
3539
3540/**
3541 * wma_set_app_type2_params_in_fw() - set app type2 params in fw
3542 * @wma: wma handle
3543 * @appType2Params: app type2 params
3544 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303545 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003546 */
Himanshu Agarwal44195412016-03-09 13:03:54 +05303547QDF_STATUS wma_set_app_type2_params_in_fw(tp_wma_handle wma,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003548 tpSirAppType2Params appType2Params)
3549{
Himanshu Agarwal44195412016-03-09 13:03:54 +05303550 struct app_type2_params params = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003551
Himanshu Agarwal44195412016-03-09 13:03:54 +05303552 if (!wma) {
3553 WMA_LOGE("%s: wma handle is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303554 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003555 }
3556
Himanshu Agarwal44195412016-03-09 13:03:54 +05303557 params.vdev_id = appType2Params->vdev_id;
3558 params.rc4_key_len = appType2Params->rc4_key_len;
3559 qdf_mem_copy(params.rc4_key, appType2Params->rc4_key, 16);
3560 params.ip_id = appType2Params->ip_id;
3561 params.ip_device_ip = appType2Params->ip_device_ip;
3562 params.ip_server_ip = appType2Params->ip_server_ip;
3563 params.tcp_src_port = appType2Params->tcp_src_port;
3564 params.tcp_dst_port = appType2Params->tcp_dst_port;
3565 params.tcp_seq = appType2Params->tcp_seq;
3566 params.tcp_ack_seq = appType2Params->tcp_ack_seq;
3567 params.keepalive_init = appType2Params->keepalive_init;
3568 params.keepalive_min = appType2Params->keepalive_min;
3569 params.keepalive_max = appType2Params->keepalive_max;
3570 params.keepalive_inc = appType2Params->keepalive_inc;
3571 params.tcp_tx_timeout_val = appType2Params->tcp_tx_timeout_val;
3572 params.tcp_rx_timeout_val = appType2Params->tcp_rx_timeout_val;
3573 qdf_mem_copy(&params.gateway_mac, &appType2Params->gateway_mac,
3574 sizeof(struct qdf_mac_addr));
3575
3576 return wmi_unified_set_app_type2_params_in_fw_cmd(wma->wmi_handle,
3577 &params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003578}
3579#endif /* WLAN_FEATURE_EXTWOW_SUPPORT */
3580
3581#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
3582/**
3583 * wma_auto_shutdown_event_handler() - process auto shutdown timer trigger
3584 * @handle: wma handle
3585 * @event: event buffer
3586 * @len: buffer length
3587 *
3588 * Return: 0 for success or error code
3589 */
3590int wma_auto_shutdown_event_handler(void *handle, uint8_t *event,
3591 uint32_t len)
3592{
3593 wmi_host_auto_shutdown_event_fixed_param *wmi_auto_sh_evt;
3594 WMI_HOST_AUTO_SHUTDOWN_EVENTID_param_tlvs *param_buf =
3595 (WMI_HOST_AUTO_SHUTDOWN_EVENTID_param_tlvs *)
3596 event;
3597
3598 if (!param_buf || !param_buf->fixed_param) {
3599 WMA_LOGE("%s:%d: Invalid Auto shutdown timer evt", __func__,
3600 __LINE__);
3601 return -EINVAL;
3602 }
3603
3604 wmi_auto_sh_evt = param_buf->fixed_param;
3605
3606 if (wmi_auto_sh_evt->shutdown_reason
3607 != WMI_HOST_AUTO_SHUTDOWN_REASON_TIMER_EXPIRY) {
3608 WMA_LOGE("%s:%d: Invalid Auto shutdown timer evt", __func__,
3609 __LINE__);
3610 return -EINVAL;
3611 }
3612
3613 WMA_LOGD("%s:%d: Auto Shutdown Evt: %d", __func__, __LINE__,
3614 wmi_auto_sh_evt->shutdown_reason);
jiad391c5282018-11-26 16:21:04 +08003615 return wma_wake_reason_auto_shutdown();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003616}
3617
Jeff Johnsona9ade7d2019-02-17 10:08:17 -08003618QDF_STATUS
3619wma_set_auto_shutdown_timer_req(tp_wma_handle wma_handle,
3620 struct auto_shutdown_cmd *auto_sh_cmd)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003621{
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07003622 if (!auto_sh_cmd) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003623 WMA_LOGE("%s : Invalid Autoshutdown cfg cmd", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303624 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003625 }
3626
Himanshu Agarwal44195412016-03-09 13:03:54 +05303627 return wmi_unified_set_auto_shutdown_timer_cmd(wma_handle->wmi_handle,
Jeff Johnsona9ade7d2019-02-17 10:08:17 -08003628 auto_sh_cmd->timer_val);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003629}
3630#endif /* FEATURE_WLAN_AUTO_SHUTDOWN */
3631
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003632#ifdef DHCP_SERVER_OFFLOAD
Jeff Johnson8bfc29e2019-02-15 07:58:15 -08003633QDF_STATUS
3634wma_process_dhcpserver_offload(tp_wma_handle wma_handle,
3635 struct dhcp_offload_info_params *params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003636{
Himanshu Agarwal44195412016-03-09 13:03:54 +05303637 QDF_STATUS status;
Jeff Johnson8bfc29e2019-02-15 07:58:15 -08003638 wmi_unified_t wmi_handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003639
Himanshu Agarwal44195412016-03-09 13:03:54 +05303640 if (!wma_handle) {
3641 WMA_LOGE("%s: wma handle is NULL", __func__);
Jeff Johnsone77641e2019-02-15 09:00:41 -08003642 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003643 }
Himanshu Agarwal44195412016-03-09 13:03:54 +05303644
Jeff Johnson8bfc29e2019-02-15 07:58:15 -08003645 wmi_handle = wma_handle->wmi_handle;
3646 status = wmi_unified_process_dhcpserver_offload_cmd(wmi_handle,
3647 params);
3648 WMA_LOGD("Set dhcp server offload to vdev %d status %d",
3649 params->vdev_id, status);
Himanshu Agarwal44195412016-03-09 13:03:54 +05303650
Himanshu Agarwal44195412016-03-09 13:03:54 +05303651 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003652}
3653#endif /* DHCP_SERVER_OFFLOAD */
3654
3655#ifdef WLAN_FEATURE_GPIO_LED_FLASHING
3656/**
3657 * wma_set_led_flashing() - set led flashing in fw
3658 * @wma_handle: wma handle
3659 * @flashing: flashing request
3660 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303661 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003662 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303663QDF_STATUS wma_set_led_flashing(tp_wma_handle wma_handle,
Jeff Johnson5a6b6602017-10-04 14:44:30 -07003664 struct flashing_req_params *flashing)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003665{
Jeff Johnson5a6b6602017-10-04 14:44:30 -07003666 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003667
3668 if (!wma_handle || !wma_handle->wmi_handle) {
3669 WMA_LOGE(FL("WMA is closed, can not issue cmd"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303670 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003671 }
3672 if (!flashing) {
3673 WMA_LOGE(FL("invalid parameter: flashing"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303674 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003675 }
Govind Singhaa64c242016-03-08 11:31:49 +05303676 status = wmi_unified_set_led_flashing_cmd(wma_handle->wmi_handle,
Jeff Johnson5a6b6602017-10-04 14:44:30 -07003677 flashing);
3678 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003679}
3680#endif /* WLAN_FEATURE_GPIO_LED_FLASHING */
3681
Kabilan Kannanebe01e72018-06-13 01:13:46 -07003682int wma_sar_rsp_evt_handler(ol_scn_t handle, uint8_t *event, uint32_t len)
Kabilan Kannancaa85502018-04-13 18:04:58 -07003683{
Kabilan Kannanebe01e72018-06-13 01:13:46 -07003684 tp_wma_handle wma_handle;
3685 wmi_unified_t wmi_handle;
Kabilan Kannancaa85502018-04-13 18:04:58 -07003686 QDF_STATUS status;
3687
Kabilan Kannanebe01e72018-06-13 01:13:46 -07003688 WMA_LOGD(FL("handle:%pK event:%pK len:%u"), handle, event, len);
3689
3690 wma_handle = handle;
3691 if (!wma_handle) {
3692 WMA_LOGE(FL("NULL wma_handle"));
3693 return QDF_STATUS_E_INVAL;
3694 }
3695
3696 wmi_handle = wma_handle->wmi_handle;
3697 if (!wmi_handle) {
3698 WMA_LOGE(FL("NULL wmi_handle"));
3699 return QDF_STATUS_E_INVAL;
3700 }
3701
3702 status = wmi_unified_extract_sar2_result_event(wmi_handle,
Kabilan Kannancaa85502018-04-13 18:04:58 -07003703 event, len);
3704 if (QDF_IS_STATUS_ERROR(status)) {
3705 WMA_LOGE(FL("Event extract failure: %d"), status);
3706 return -EINVAL;
3707 }
3708
3709 return 0;
3710}
3711
Nirav Shaheb017be2018-02-15 11:20:58 +05303712#ifdef FEATURE_WLAN_CH_AVOID
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003713/**
3714 * wma_process_ch_avoid_update_req() - handles channel avoid update request
3715 * @wma_handle: wma handle
3716 * @ch_avoid_update_req: channel avoid update params
3717 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303718 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003719 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303720QDF_STATUS wma_process_ch_avoid_update_req(tp_wma_handle wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003721 tSirChAvoidUpdateReq *
3722 ch_avoid_update_req)
3723{
Himanshu Agarwal44195412016-03-09 13:03:54 +05303724 QDF_STATUS status;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003725
Himanshu Agarwal44195412016-03-09 13:03:54 +05303726 if (!wma_handle) {
3727 WMA_LOGE("%s: wma handle is NULL", __func__);
3728 return QDF_STATUS_E_FAILURE;
3729 }
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07003730 if (!ch_avoid_update_req) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003731 WMA_LOGE("%s : ch_avoid_update_req is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303732 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003733 }
3734
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08003735 WMA_LOGD("%s: WMA --> WMI_CHAN_AVOID_UPDATE", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003736
Himanshu Agarwal44195412016-03-09 13:03:54 +05303737 status = wmi_unified_process_ch_avoid_update_cmd(
3738 wma_handle->wmi_handle);
3739 if (QDF_IS_STATUS_ERROR(status))
3740 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003741
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08003742 WMA_LOGD("%s: WMA --> WMI_CHAN_AVOID_UPDATE sent through WMI",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003743 __func__);
Himanshu Agarwal44195412016-03-09 13:03:54 +05303744 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003745}
Nirav Shaheb017be2018-02-15 11:20:58 +05303746#endif
Kiran Kumar Lokere0751f0e2017-07-21 19:42:36 -07003747
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003748void wma_send_regdomain_info_to_fw(uint32_t reg_dmn, uint16_t regdmn2G,
Rajeev Kumar Sirasanagandla873b6d92017-06-06 13:11:17 +05303749 uint16_t regdmn5G, uint8_t ctl2G,
3750 uint8_t ctl5G)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003751{
Anurag Chouhan6d760662016-02-20 16:05:43 +05303752 tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003753 int32_t cck_mask_val = 0;
Govind Singhd76a5b02016-03-08 15:12:14 +05303754 struct pdev_params pdev_param = {0};
Himanshu Agarwal44195412016-03-09 13:03:54 +05303755 QDF_STATUS ret = QDF_STATUS_SUCCESS;
3756 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003757
Amar Singhal50d30752018-04-12 13:44:10 -07003758 WMA_LOGD("reg_dmn: %d regdmn2g: %d regdmn5g :%d ctl2g: %d ctl5g: %d",
3759 reg_dmn, regdmn2G, regdmn5G, ctl2G, ctl5G);
3760
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07003761 if (!wma) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003762 WMA_LOGE("%s: wma context is NULL", __func__);
3763 return;
3764 }
3765
Himanshu Agarwal44195412016-03-09 13:03:54 +05303766 status = wmi_unified_send_regdomain_info_to_fw_cmd(wma->wmi_handle,
3767 reg_dmn, regdmn2G, regdmn5G, ctl2G, ctl5G);
3768 if (status == QDF_STATUS_E_NOMEM)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003769 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003770
Ashish Kumar Dhanotiyabfee5892017-09-19 18:05:21 +05303771 if ((((reg_dmn & ~CTRY_FLAG) == CTRY_JAPAN15) ||
Amar Singhal5f997862016-08-24 13:17:50 -07003772 ((reg_dmn & ~CTRY_FLAG) == CTRY_KOREA_ROC)) &&
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003773 (true == wma->tx_chain_mask_cck))
3774 cck_mask_val = 1;
3775
3776 cck_mask_val |= (wma->self_gen_frm_pwr << 16);
Govind Singhd76a5b02016-03-08 15:12:14 +05303777 pdev_param.param_id = WMI_PDEV_PARAM_TX_CHAIN_MASK_CCK;
3778 pdev_param.param_value = cck_mask_val;
3779 ret = wmi_unified_pdev_param_send(wma->wmi_handle,
3780 &pdev_param,
3781 WMA_WILDCARD_PDEV_ID);
3782
Himanshu Agarwal44195412016-03-09 13:03:54 +05303783 if (QDF_IS_STATUS_ERROR(ret))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003784 WMA_LOGE("failed to set PDEV tx_chain_mask_cck %d",
3785 ret);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003786}
3787
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003788#ifdef FEATURE_WLAN_TDLS
3789/**
3790 * wma_tdls_event_handler() - handle TDLS event
3791 * @handle: wma handle
3792 * @event: event buffer
3793 * @len: buffer length
3794 *
3795 * Return: 0 for success or error code
3796 */
3797int wma_tdls_event_handler(void *handle, uint8_t *event, uint32_t len)
3798{
Frank Liu1a912b22017-09-06 17:47:32 +08003799 /* TODO update with target rx ops */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003800 return 0;
3801}
3802
3803/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003804 * wma_update_tdls_peer_state() - update TDLS peer state
3805 * @handle: wma handle
Jeff Johnson517ee492019-02-07 11:59:04 -08003806 * @peer_state: TDLS peer state params
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003807 *
3808 * Return: 0 for success or error code
3809 */
3810int wma_update_tdls_peer_state(WMA_HANDLE handle,
Jeff Johnson517ee492019-02-07 11:59:04 -08003811 struct tdls_peer_update_state *peer_state)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003812{
3813 tp_wma_handle wma_handle = (tp_wma_handle) handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003814 uint32_t i;
Leo Chang96464902016-10-28 11:10:54 -07003815 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Jeff Johnson517ee492019-02-07 11:59:04 -08003816 struct tdls_peer_params *peer_cap;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003817 int ret = 0;
Kabilan Kannanc89fe712016-07-21 06:57:12 -07003818 uint32_t *ch_mhz = NULL;
Jeff Johnson517ee492019-02-07 11:59:04 -08003819 size_t ch_mhz_len;
3820 uint8_t chan_id;
Poddar, Siddarth5a91f5b2016-04-28 12:24:10 +05303821 bool restore_last_peer = false;
Pragaspathi Thilagaraj46e10b32018-11-12 16:23:02 +05303822 QDF_STATUS qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003823
3824 if (!wma_handle || !wma_handle->wmi_handle) {
3825 WMA_LOGE("%s: WMA is closed, can not issue cmd", __func__);
3826 ret = -EINVAL;
3827 goto end_tdls_peer_state;
3828 }
3829
Nishank Aggarwala13b61d2016-12-01 12:53:58 +05303830 if (!soc) {
3831 WMA_LOGE("%s: SOC context is NULL", __func__);
3832 ret = -EINVAL;
3833 goto end_tdls_peer_state;
3834 }
3835
Nitesh Shah622d3122017-06-05 17:04:06 +05303836 if (wma_is_roam_synch_in_progress(wma_handle,
Jeff Johnson517ee492019-02-07 11:59:04 -08003837 peer_state->vdev_id)) {
Nitesh Shah622d3122017-06-05 17:04:06 +05303838 WMA_LOGE("%s: roaming in progress, reject peer update cmd!",
3839 __func__);
3840 ret = -EPERM;
3841 goto end_tdls_peer_state;
3842 }
3843
Pankaj Singh1c7d59e2020-04-23 21:05:28 +05303844
3845 if (!wma_objmgr_peer_exist(wma_handle,
3846 peer_state->peer_macaddr, NULL)) {
3847 wma_err("peer:" QDF_MAC_ADDR_STR "doesn't exist",
3848 QDF_MAC_ADDR_ARRAY(peer_state->peer_macaddr));
3849 ret = -EINVAL;
3850 goto end_tdls_peer_state;
3851 }
3852
Jeff Johnson517ee492019-02-07 11:59:04 -08003853 peer_cap = &peer_state->peer_cap;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003854
Jeff Johnson517ee492019-02-07 11:59:04 -08003855 /* peer capability info is valid only when peer state is connected */
3856 if (TDLS_PEER_STATE_CONNECTED != peer_state->peer_state)
3857 qdf_mem_zero(peer_cap, sizeof(*peer_cap));
3858
3859 if (peer_cap->peer_chanlen) {
3860 ch_mhz_len = sizeof(*ch_mhz) * peer_cap->peer_chanlen;
3861 ch_mhz = qdf_mem_malloc(ch_mhz_len);
Arif Hussain157263f2018-10-03 13:07:15 -07003862 if (!ch_mhz) {
Kabilan Kannanc89fe712016-07-21 06:57:12 -07003863 ret = -ENOMEM;
3864 goto end_tdls_peer_state;
3865 }
Naveen Rawat35804772016-06-27 15:40:28 -07003866
Jeff Johnson517ee492019-02-07 11:59:04 -08003867 for (i = 0; i < peer_cap->peer_chanlen; ++i) {
3868 chan_id = peer_cap->peer_chan[i].chan_id;
3869 ch_mhz[i] = cds_chan_to_freq(chan_id);
3870 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003871 }
3872
Vevek Venkatesan2d88a6b2019-10-04 19:03:10 +05303873 cdp_peer_set_tdls_offchan_enabled(soc, peer_state->vdev_id,
3874 peer_state->peer_macaddr,
nakul kachhwahae3e92ae2019-10-24 17:59:48 +05303875 !!peer_cap->peer_off_chan_support);
3876
Govind Singhaa64c242016-03-08 11:31:49 +05303877 if (wmi_unified_update_tdls_peer_state_cmd(wma_handle->wmi_handle,
Jeff Johnson517ee492019-02-07 11:59:04 -08003878 peer_state,
3879 ch_mhz)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003880 WMA_LOGE("%s: failed to send tdls peer update state command",
3881 __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003882 ret = -EIO;
3883 goto end_tdls_peer_state;
3884 }
3885
3886 /* in case of teardown, remove peer from fw */
Jeff Johnson517ee492019-02-07 11:59:04 -08003887 if (TDLS_PEER_STATE_TEARDOWN == peer_state->peer_state) {
Leo Chang96464902016-10-28 11:10:54 -07003888 restore_last_peer = cdp_peer_is_vdev_restore_last_peer(
Vevek Venkatesan2d88a6b2019-10-04 19:03:10 +05303889 soc,
3890 peer_state->vdev_id,
3891 peer_state->peer_macaddr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003892
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -07003893 wma_debug("calling wma_remove_peer for peer " QDF_MAC_ADDR_STR
Srinivas Girigowda34fbba02019-04-08 12:07:44 -07003894 " vdevId: %d",
Vevek Venkatesan2d88a6b2019-10-04 19:03:10 +05303895 QDF_MAC_ADDR_ARRAY(peer_state->peer_macaddr),
Jeff Johnson517ee492019-02-07 11:59:04 -08003896 peer_state->vdev_id);
Vevek Venkatesan2d88a6b2019-10-04 19:03:10 +05303897 qdf_status = wma_remove_peer(wma_handle,
3898 peer_state->peer_macaddr,
3899 peer_state->vdev_id, false);
Pragaspathi Thilagaraj46e10b32018-11-12 16:23:02 +05303900 if (QDF_IS_STATUS_ERROR(qdf_status)) {
3901 WMA_LOGE(FL("wma_remove_peer failed"));
3902 ret = -EINVAL;
3903 goto end_tdls_peer_state;
3904 }
Vevek Venkatesan2d88a6b2019-10-04 19:03:10 +05303905 cdp_peer_update_last_real_peer(soc, WMI_PDEV_ID_SOC,
3906 peer_state->vdev_id,
gaurank kathpalia8197e352019-09-11 16:09:53 +05303907 restore_last_peer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003908 }
3909
Wu Gaofd60f3a2019-04-03 19:49:23 +08003910 if (TDLS_PEER_STATE_CONNECTED == peer_state->peer_state) {
Vevek Venkatesan2d88a6b2019-10-04 19:03:10 +05303911 cdp_peer_state_update(soc, peer_state->peer_macaddr,
3912 OL_TXRX_PEER_STATE_AUTH);
Wu Gaofd60f3a2019-04-03 19:49:23 +08003913 }
3914
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003915end_tdls_peer_state:
Kabilan Kannanc89fe712016-07-21 06:57:12 -07003916 if (ch_mhz)
3917 qdf_mem_free(ch_mhz);
Jeff Johnson517ee492019-02-07 11:59:04 -08003918 if (peer_state)
3919 qdf_mem_free(peer_state);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003920 return ret;
3921}
3922#endif /* FEATURE_WLAN_TDLS */
3923
Kiran Kumar Lokereee205772018-09-27 00:27:27 -07003924/*
3925 * wma_process_cfg_action_frm_tb_ppdu() - action frame TB PPDU cfg to firmware
3926 * @wma: Pointer to WMA handle
3927 * @cfg_info: Pointer for cfg info
3928 *
3929 * Return: QDF_STATUS_SUCCESS for success otherwise failure
3930 *
3931 */
3932QDF_STATUS wma_process_cfg_action_frm_tb_ppdu(tp_wma_handle wma,
3933 struct cfg_action_frm_tb_ppdu *cfg_info)
3934{
3935 struct cfg_action_frm_tb_ppdu_param cmd = {0};
3936
3937 if (!wma) {
3938 WMA_LOGE(FL("WMA pointer is NULL"));
3939 return QDF_STATUS_E_FAILURE;
3940 }
3941
3942 cmd.frm_len = cfg_info->frm_len;
3943 cmd.cfg = cfg_info->cfg;
3944 cmd.data = cfg_info->data;
3945
3946 WMA_LOGD(FL("cfg: %d, frm_len: %d"),
3947 cfg_info->cfg, cfg_info->frm_len);
3948
3949 return wmi_unified_cfg_action_frm_tb_ppdu_cmd(wma->wmi_handle, &cmd);
3950}
3951
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003952
3953/*
3954 * wma_process_set_ie_info() - Function to send IE info to firmware
3955 * @wma: Pointer to WMA handle
3956 * @ie_data: Pointer for ie data
3957 *
3958 * This function sends IE information to firmware
3959 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303960 * Return: QDF_STATUS_SUCCESS for success otherwise failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003961 *
3962 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303963QDF_STATUS wma_process_set_ie_info(tp_wma_handle wma,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003964 struct vdev_ie_info *ie_info)
3965{
Naveen Rawatb47287a2017-01-05 15:50:52 -08003966 struct wma_txrx_node *interface;
Govind Singhaa64c242016-03-08 11:31:49 +05303967 struct vdev_ie_info_param cmd = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003968
3969 if (!ie_info || !wma) {
3970 WMA_LOGE(FL("input pointer is NULL"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303971 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003972 }
3973
3974 /* Validate the input */
3975 if (ie_info->length <= 0) {
3976 WMA_LOGE(FL("Invalid IE length"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303977 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003978 }
3979
Pragaspathi Thilagarajf81a8f02018-08-15 21:44:07 +05303980 if (!wma_is_vdev_valid(ie_info->vdev_id)) {
Naveen Rawatb47287a2017-01-05 15:50:52 -08003981 WMA_LOGE(FL("vdev_id: %d is not active"), ie_info->vdev_id);
3982 return QDF_STATUS_E_INVAL;
3983 }
3984
Pragaspathi Thilagaraj0d1159e2018-08-08 19:00:36 +05303985 interface = &wma->interfaces[ie_info->vdev_id];
Govind Singhaa64c242016-03-08 11:31:49 +05303986 cmd.vdev_id = ie_info->vdev_id;
3987 cmd.ie_id = ie_info->ie_id;
3988 cmd.length = ie_info->length;
Naveen Rawat03e8d952016-08-01 15:22:20 -07003989 cmd.band = ie_info->band;
Govind Singhaa64c242016-03-08 11:31:49 +05303990 cmd.data = ie_info->data;
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +05303991 cmd.ie_source = WMA_SET_VDEV_IE_SOURCE_HOST;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003992
Selvaraj, Sridhard1225e62017-03-17 12:56:58 +05303993 WMA_LOGD(FL("vdev id: %d, ie_id: %d, band: %d, len: %d"),
3994 ie_info->vdev_id, ie_info->ie_id, ie_info->band,
3995 ie_info->length);
Naveen Rawat03e8d952016-08-01 15:22:20 -07003996
3997 QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG,
3998 ie_info->data, ie_info->length);
3999
Pragaspathi Thilagaraj0d1159e2018-08-08 19:00:36 +05304000 return wmi_unified_process_set_ie_info_cmd(wma->wmi_handle, &cmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004001}
4002
Nachiket Kukade177b5b02018-05-22 20:52:17 +05304003#ifdef FEATURE_WLAN_APF
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304004/**
Nachiket Kukadee547a482018-05-22 16:43:30 +05304005 * wma_get_apf_caps_event_handler() - Event handler for get apf capability
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304006 * @handle: WMA global handle
4007 * @cmd_param_info: command event data
4008 * @len: Length of @cmd_param_info
4009 *
4010 * Return: 0 on Success or Errno on failure
4011 */
Nachiket Kukadee547a482018-05-22 16:43:30 +05304012int wma_get_apf_caps_event_handler(void *handle, u_int8_t *cmd_param_info,
4013 u_int32_t len)
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304014{
4015 WMI_BPF_CAPABILIY_INFO_EVENTID_param_tlvs *param_buf;
4016 wmi_bpf_capability_info_evt_fixed_param *event;
Nachiket Kukadee547a482018-05-22 16:43:30 +05304017 struct sir_apf_get_offload *apf_get_offload;
Jeff Johnson9f18aa72018-12-02 12:05:12 -08004018 struct mac_context *pmac = (struct mac_context *)cds_get_context(
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304019 QDF_MODULE_ID_PE);
4020
4021 if (!pmac) {
4022 WMA_LOGE("%s: Invalid pmac", __func__);
4023 return -EINVAL;
4024 }
Nachiket Kukadee547a482018-05-22 16:43:30 +05304025 if (!pmac->sme.apf_get_offload_cb) {
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304026 WMA_LOGE("%s: Callback not registered", __func__);
4027 return -EINVAL;
4028 }
4029
4030 param_buf = (WMI_BPF_CAPABILIY_INFO_EVENTID_param_tlvs *)cmd_param_info;
4031 event = param_buf->fixed_param;
Nachiket Kukadee547a482018-05-22 16:43:30 +05304032 apf_get_offload = qdf_mem_malloc(sizeof(*apf_get_offload));
Arif Hussain157263f2018-10-03 13:07:15 -07004033 if (!apf_get_offload)
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304034 return -ENOMEM;
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304035
Nachiket Kukadee547a482018-05-22 16:43:30 +05304036 apf_get_offload->apf_version = event->bpf_version;
4037 apf_get_offload->max_apf_filters = event->max_bpf_filters;
4038 apf_get_offload->max_bytes_for_apf_inst =
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304039 event->max_bytes_for_bpf_inst;
Nachiket Kukadee547a482018-05-22 16:43:30 +05304040 WMA_LOGD("%s: APF capabilities version: %d max apf filter size: %d",
4041 __func__, apf_get_offload->apf_version,
4042 apf_get_offload->max_bytes_for_apf_inst);
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304043
Nachiket Kukadee547a482018-05-22 16:43:30 +05304044 WMA_LOGD("%s: sending apf capabilities event to hdd", __func__);
4045 pmac->sme.apf_get_offload_cb(pmac->sme.apf_get_offload_context,
4046 apf_get_offload);
4047 qdf_mem_free(apf_get_offload);
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304048 return 0;
4049}
4050
Nachiket Kukadee547a482018-05-22 16:43:30 +05304051QDF_STATUS wma_get_apf_capabilities(tp_wma_handle wma)
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304052{
4053 QDF_STATUS status = QDF_STATUS_SUCCESS;
4054 wmi_bpf_get_capability_cmd_fixed_param *cmd;
4055 wmi_buf_t wmi_buf;
4056 uint32_t len;
4057 u_int8_t *buf_ptr;
4058
4059 if (!wma || !wma->wmi_handle) {
Nachiket Kukadee547a482018-05-22 16:43:30 +05304060 WMA_LOGE(FL("WMA is closed, can not issue get APF capab"));
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304061 return QDF_STATUS_E_INVAL;
4062 }
4063
Nachiket Kukadee547a482018-05-22 16:43:30 +05304064 if (!wmi_service_enabled(wma->wmi_handle, wmi_service_apf_offload)) {
4065 WMA_LOGE(FL("APF cababilities feature bit not enabled"));
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304066 return QDF_STATUS_E_FAILURE;
4067 }
4068
4069 len = sizeof(*cmd);
4070 wmi_buf = wmi_buf_alloc(wma->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07004071 if (!wmi_buf)
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304072 return QDF_STATUS_E_NOMEM;
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304073
4074 buf_ptr = (u_int8_t *) wmi_buf_data(wmi_buf);
4075 cmd = (wmi_bpf_get_capability_cmd_fixed_param *) buf_ptr;
4076 WMITLV_SET_HDR(&cmd->tlv_header,
4077 WMITLV_TAG_STRUC_wmi_bpf_get_capability_cmd_fixed_param,
4078 WMITLV_GET_STRUCT_TLVLEN(
4079 wmi_bpf_get_capability_cmd_fixed_param));
4080
4081 if (wmi_unified_cmd_send(wma->wmi_handle, wmi_buf, len,
Nachiket Kukadee547a482018-05-22 16:43:30 +05304082 WMI_BPF_GET_CAPABILITY_CMDID)) {
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304083 wmi_buf_free(wmi_buf);
4084 return QDF_STATUS_E_FAILURE;
4085 }
4086 return status;
4087}
4088
Nachiket Kukadee547a482018-05-22 16:43:30 +05304089QDF_STATUS wma_set_apf_instructions(tp_wma_handle wma,
4090 struct sir_apf_set_offload *apf_set_offload)
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304091{
4092 wmi_bpf_set_vdev_instructions_cmd_fixed_param *cmd;
4093 wmi_buf_t wmi_buf;
4094 uint32_t len = 0, len_aligned = 0;
4095 u_int8_t *buf_ptr;
4096
4097 if (!wma || !wma->wmi_handle) {
Nachiket Kukadee547a482018-05-22 16:43:30 +05304098 WMA_LOGE("%s: WMA is closed, can not issue set APF capability",
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304099 __func__);
4100 return QDF_STATUS_E_INVAL;
4101 }
4102
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304103 if (!wmi_service_enabled(wma->wmi_handle,
Nachiket Kukadee547a482018-05-22 16:43:30 +05304104 wmi_service_apf_offload)) {
4105 WMA_LOGE(FL("APF offload feature Disabled"));
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304106 return QDF_STATUS_E_NOSUPPORT;
4107 }
4108
Nachiket Kukadee547a482018-05-22 16:43:30 +05304109 if (!apf_set_offload) {
4110 WMA_LOGE("%s: Invalid APF instruction request", __func__);
Rajeev Kumar90016022017-08-22 14:00:48 -07004111 return QDF_STATUS_E_INVAL;
4112 }
4113
Nachiket Kukadee547a482018-05-22 16:43:30 +05304114 if (apf_set_offload->session_id >= wma->max_bssid) {
Rajeev Kumar90016022017-08-22 14:00:48 -07004115 WMA_LOGE(FL("Invalid vdev_id: %d"),
Nachiket Kukadee547a482018-05-22 16:43:30 +05304116 apf_set_offload->session_id);
Rajeev Kumar90016022017-08-22 14:00:48 -07004117 return QDF_STATUS_E_INVAL;
4118 }
4119
Nachiket Kukadee547a482018-05-22 16:43:30 +05304120 if (!wma_is_vdev_up(apf_set_offload->session_id)) {
4121 WMA_LOGE("vdev %d is not up skipping APF offload",
4122 apf_set_offload->session_id);
Rajeev Kumar90016022017-08-22 14:00:48 -07004123 return QDF_STATUS_E_INVAL;
4124 }
4125
Nachiket Kukadee547a482018-05-22 16:43:30 +05304126 if (apf_set_offload->total_length) {
4127 len_aligned = roundup(apf_set_offload->current_length,
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304128 sizeof(A_UINT32));
4129 len = len_aligned + WMI_TLV_HDR_SIZE;
4130 }
4131
4132 len += sizeof(*cmd);
4133 wmi_buf = wmi_buf_alloc(wma->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07004134 if (!wmi_buf)
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304135 return QDF_STATUS_E_NOMEM;
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304136
4137 buf_ptr = (u_int8_t *) wmi_buf_data(wmi_buf);
4138 cmd = (wmi_bpf_set_vdev_instructions_cmd_fixed_param *) buf_ptr;
4139
4140 WMITLV_SET_HDR(&cmd->tlv_header,
4141 WMITLV_TAG_STRUC_wmi_bpf_set_vdev_instructions_cmd_fixed_param,
4142 WMITLV_GET_STRUCT_TLVLEN(
4143 wmi_bpf_set_vdev_instructions_cmd_fixed_param));
Nachiket Kukadee547a482018-05-22 16:43:30 +05304144 cmd->vdev_id = apf_set_offload->session_id;
4145 cmd->filter_id = apf_set_offload->filter_id;
4146 cmd->total_length = apf_set_offload->total_length;
4147 cmd->current_offset = apf_set_offload->current_offset;
4148 cmd->current_length = apf_set_offload->current_length;
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304149
Nachiket Kukadee547a482018-05-22 16:43:30 +05304150 if (apf_set_offload->total_length) {
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304151 buf_ptr +=
4152 sizeof(wmi_bpf_set_vdev_instructions_cmd_fixed_param);
4153 WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_BYTE, len_aligned);
4154 buf_ptr += WMI_TLV_HDR_SIZE;
Nachiket Kukadee547a482018-05-22 16:43:30 +05304155 qdf_mem_copy(buf_ptr, apf_set_offload->program,
4156 apf_set_offload->current_length);
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304157 }
4158
4159 if (wmi_unified_cmd_send(wma->wmi_handle, wmi_buf, len,
Nachiket Kukadee547a482018-05-22 16:43:30 +05304160 WMI_BPF_SET_VDEV_INSTRUCTIONS_CMDID)) {
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304161 wmi_buf_free(wmi_buf);
4162 return QDF_STATUS_E_FAILURE;
4163 }
Nachiket Kukadee547a482018-05-22 16:43:30 +05304164 WMA_LOGD(FL("APF offload enabled in fw"));
Rajeev Kumar90016022017-08-22 14:00:48 -07004165
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304166 return QDF_STATUS_SUCCESS;
4167}
Peng Xu8fdaa492016-06-22 10:20:47 -07004168
Nachiket Kukade177b5b02018-05-22 20:52:17 +05304169QDF_STATUS wma_send_apf_enable_cmd(WMA_HANDLE handle, uint8_t vdev_id,
4170 bool apf_enable)
4171{
4172 QDF_STATUS status = QDF_STATUS_SUCCESS;
4173 tp_wma_handle wma = (tp_wma_handle) handle;
4174
4175 if (!wma || !wma->wmi_handle) {
4176 WMA_LOGE(FL("WMA is closed, can not issue get APF capab"));
4177 return QDF_STATUS_E_INVAL;
4178 }
4179
4180 if (!WMI_SERVICE_IS_ENABLED(wma->wmi_service_bitmap,
4181 WMI_SERVICE_BPF_OFFLOAD)) {
4182 WMA_LOGE(FL("APF cababilities feature bit not enabled"));
4183 return QDF_STATUS_E_FAILURE;
4184 }
4185
4186 status = wmi_unified_send_apf_enable_cmd(wma->wmi_handle, vdev_id,
4187 apf_enable);
4188 if (QDF_IS_STATUS_ERROR(status)) {
4189 WMA_LOGE("Failed to send apf enable/disable cmd");
4190 return QDF_STATUS_E_FAILURE;
4191 }
4192
4193 if (apf_enable)
4194 WMA_LOGD("Sent APF Enable on vdevid: %d", vdev_id);
4195 else
4196 WMA_LOGD("Sent APF Disable on vdevid: %d", vdev_id);
4197
4198 return status;
4199}
4200
4201QDF_STATUS
4202wma_send_apf_write_work_memory_cmd(WMA_HANDLE handle,
4203 struct wmi_apf_write_memory_params
4204 *write_params)
4205{
4206 QDF_STATUS status = QDF_STATUS_SUCCESS;
4207 tp_wma_handle wma = (tp_wma_handle) handle;
4208
4209 if (!wma || !wma->wmi_handle) {
4210 WMA_LOGE(FL("WMA is closed, can not issue write APF mem"));
4211 return QDF_STATUS_E_INVAL;
4212 }
4213
4214 if (!WMI_SERVICE_IS_ENABLED(wma->wmi_service_bitmap,
4215 WMI_SERVICE_BPF_OFFLOAD)) {
4216 WMA_LOGE(FL("APF cababilities feature bit not enabled"));
4217 return QDF_STATUS_E_FAILURE;
4218 }
4219
4220 if (wmi_unified_send_apf_write_work_memory_cmd(wma->wmi_handle,
4221 write_params)) {
4222 WMA_LOGE(FL("Failed to send APF write mem command"));
4223 return QDF_STATUS_E_FAILURE;
4224 }
4225
4226 WMA_LOGD("Sent APF wite mem on vdevid: %d", write_params->vdev_id);
4227 return status;
4228}
4229
4230int wma_apf_read_work_memory_event_handler(void *handle, uint8_t *evt_buf,
4231 uint32_t len)
4232{
4233 tp_wma_handle wma_handle;
4234 wmi_unified_t wmi_handle;
4235 struct wmi_apf_read_memory_resp_event_params evt_params = {0};
4236 QDF_STATUS status;
Jeff Johnson9f18aa72018-12-02 12:05:12 -08004237 struct mac_context *pmac = cds_get_context(QDF_MODULE_ID_PE);
Nachiket Kukade177b5b02018-05-22 20:52:17 +05304238
Yeshwanth Sriram Guntukacbe61442018-08-23 18:08:44 +05304239 WMA_LOGD(FL("handle:%pK event:%pK len:%u"), handle, evt_buf, len);
Nachiket Kukade177b5b02018-05-22 20:52:17 +05304240
4241 wma_handle = handle;
4242 if (!wma_handle) {
4243 WMA_LOGE(FL("NULL wma_handle"));
4244 return -EINVAL;
4245 }
4246
4247 wmi_handle = wma_handle->wmi_handle;
4248 if (!wmi_handle) {
4249 WMA_LOGE(FL("NULL wmi_handle"));
4250 return -EINVAL;
4251 }
4252
4253 if (!pmac) {
4254 WMA_LOGE(FL("Invalid pmac"));
4255 return -EINVAL;
4256 }
4257
4258 if (!pmac->sme.apf_read_mem_cb) {
4259 WMA_LOGE(FL("Callback not registered"));
4260 return -EINVAL;
4261 }
4262
4263 status = wmi_extract_apf_read_memory_resp_event(wmi_handle,
4264 evt_buf, &evt_params);
4265 if (QDF_IS_STATUS_ERROR(status)) {
4266 WMA_LOGE(FL("Event extract failure: %d"), status);
4267 return -EINVAL;
4268 }
4269
Jeff Johnson6aaaa992018-06-30 10:43:04 -07004270 pmac->sme.apf_read_mem_cb(pmac->hdd_handle, &evt_params);
Nachiket Kukade177b5b02018-05-22 20:52:17 +05304271
4272 return 0;
4273}
4274
4275QDF_STATUS wma_send_apf_read_work_memory_cmd(WMA_HANDLE handle,
4276 struct wmi_apf_read_memory_params
4277 *read_params)
4278{
4279 QDF_STATUS status = QDF_STATUS_SUCCESS;
4280 tp_wma_handle wma = (tp_wma_handle) handle;
4281
4282 if (!wma || !wma->wmi_handle) {
4283 WMA_LOGE(FL("WMA is closed, can not issue read APF memory"));
4284 return QDF_STATUS_E_INVAL;
4285 }
4286
4287 if (!WMI_SERVICE_IS_ENABLED(wma->wmi_service_bitmap,
4288 WMI_SERVICE_BPF_OFFLOAD)) {
4289 WMA_LOGE(FL("APF cababilities feature bit not enabled"));
4290 return QDF_STATUS_E_FAILURE;
4291 }
4292
4293 if (wmi_unified_send_apf_read_work_memory_cmd(wma->wmi_handle,
4294 read_params)) {
4295 WMA_LOGE(FL("Failed to send APF read memory command"));
4296 return QDF_STATUS_E_FAILURE;
4297 }
4298
4299 WMA_LOGD("Sent APF read memory on vdevid: %d", read_params->vdev_id);
4300 return status;
4301}
4302#endif /* FEATURE_WLAN_APF */
4303
Abhishek Ambure74709762019-05-27 19:43:26 +05304304QDF_STATUS wma_set_tx_rx_aggr_size(uint8_t vdev_id,
4305 uint32_t tx_size,
4306 uint32_t rx_size,
4307 wmi_vdev_custom_aggr_type_t aggr_type)
Padma, Santhosh Kumara7119672016-08-16 16:05:14 +05304308{
4309 tp_wma_handle wma_handle;
4310 wmi_vdev_set_custom_aggr_size_cmd_fixed_param *cmd;
4311 int32_t len;
4312 wmi_buf_t buf;
4313 u_int8_t *buf_ptr;
4314 int ret;
4315
4316 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
4317
Padma, Santhosh Kumara7119672016-08-16 16:05:14 +05304318
4319 if (!wma_handle) {
4320 WMA_LOGE("%s: WMA context is invald!", __func__);
4321 return QDF_STATUS_E_INVAL;
4322 }
4323
4324 len = sizeof(*cmd);
4325 buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07004326 if (!buf)
Padma, Santhosh Kumara7119672016-08-16 16:05:14 +05304327 return QDF_STATUS_E_NOMEM;
Padma, Santhosh Kumara7119672016-08-16 16:05:14 +05304328
4329 buf_ptr = (u_int8_t *) wmi_buf_data(buf);
4330 cmd = (wmi_vdev_set_custom_aggr_size_cmd_fixed_param *) buf_ptr;
Arif Hussain0e246802018-05-01 18:13:44 -07004331 qdf_mem_zero(cmd, sizeof(*cmd));
Padma, Santhosh Kumara7119672016-08-16 16:05:14 +05304332
4333 WMITLV_SET_HDR(&cmd->tlv_header,
4334 WMITLV_TAG_STRUC_wmi_vdev_set_custom_aggr_size_cmd_fixed_param,
4335 WMITLV_GET_STRUCT_TLVLEN(
4336 wmi_vdev_set_custom_aggr_size_cmd_fixed_param));
4337
Abhishek Ambure74709762019-05-27 19:43:26 +05304338 cmd->vdev_id = vdev_id;
4339 cmd->tx_aggr_size = tx_size;
4340 cmd->rx_aggr_size = rx_size;
Arif Hussain0e246802018-05-01 18:13:44 -07004341 /* bit 2 (aggr_type): TX Aggregation Type (0=A-MPDU, 1=A-MSDU) */
Abhishek Ambure74709762019-05-27 19:43:26 +05304342 if (aggr_type == WMI_VDEV_CUSTOM_AGGR_TYPE_AMSDU)
Arif Hussain0e246802018-05-01 18:13:44 -07004343 cmd->enable_bitmap |= 0x04;
Padma, Santhosh Kumara7119672016-08-16 16:05:14 +05304344
Arif Hussain0e246802018-05-01 18:13:44 -07004345 WMA_LOGD("tx aggr: %d rx aggr: %d vdev: %d enable_bitmap %d",
4346 cmd->tx_aggr_size, cmd->rx_aggr_size, cmd->vdev_id,
4347 cmd->enable_bitmap);
Padma, Santhosh Kumara7119672016-08-16 16:05:14 +05304348
4349 ret = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
4350 WMI_VDEV_SET_CUSTOM_AGGR_SIZE_CMDID);
4351 if (ret) {
Padma, Santhosh Kumara7119672016-08-16 16:05:14 +05304352 wmi_buf_free(buf);
4353 return QDF_STATUS_E_FAILURE;
4354 }
4355
4356 return QDF_STATUS_SUCCESS;
4357}
4358
Abhishek Ambure74709762019-05-27 19:43:26 +05304359QDF_STATUS wma_set_tx_rx_aggr_size_per_ac(WMA_HANDLE handle,
4360 uint8_t vdev_id,
4361 struct wlan_mlme_qos *qos_aggr,
4362 wmi_vdev_custom_aggr_type_t aggr_type)
Paul Zhangee09f8e2018-04-23 16:11:32 +08004363{
Paul Zhangee09f8e2018-04-23 16:11:32 +08004364 wmi_vdev_set_custom_aggr_size_cmd_fixed_param *cmd;
4365 int32_t len;
4366 wmi_buf_t buf;
4367 u_int8_t *buf_ptr;
4368 int ret;
4369 int queue_num;
4370 uint32_t tx_aggr_size[4];
Abhishek Ambure74709762019-05-27 19:43:26 +05304371 tp_wma_handle wma_handle = (tp_wma_handle)handle;
Paul Zhangee09f8e2018-04-23 16:11:32 +08004372
4373 if (!wma_handle) {
4374 WMA_LOGE("%s: WMA context is invald!", __func__);
4375 return QDF_STATUS_E_INVAL;
4376 }
4377
Abhishek Ambure74709762019-05-27 19:43:26 +05304378 tx_aggr_size[0] = qos_aggr->tx_aggregation_size_be;
4379 tx_aggr_size[1] = qos_aggr->tx_aggregation_size_bk;
4380 tx_aggr_size[2] = qos_aggr->tx_aggregation_size_vi;
4381 tx_aggr_size[3] = qos_aggr->tx_aggregation_size_vo;
Paul Zhangee09f8e2018-04-23 16:11:32 +08004382
4383 for (queue_num = 0; queue_num < 4; queue_num++) {
4384 if (tx_aggr_size[queue_num] == 0)
4385 continue;
4386
4387 len = sizeof(*cmd);
4388 buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07004389 if (!buf)
Paul Zhangee09f8e2018-04-23 16:11:32 +08004390 return QDF_STATUS_E_NOMEM;
Paul Zhangee09f8e2018-04-23 16:11:32 +08004391
4392 buf_ptr = (u_int8_t *)wmi_buf_data(buf);
4393 cmd = (wmi_vdev_set_custom_aggr_size_cmd_fixed_param *)buf_ptr;
Arif Hussain0e246802018-05-01 18:13:44 -07004394 qdf_mem_zero(cmd, sizeof(*cmd));
Paul Zhangee09f8e2018-04-23 16:11:32 +08004395
4396 WMITLV_SET_HDR(&cmd->tlv_header,
4397 WMITLV_TAG_STRUC_wmi_vdev_set_custom_aggr_size_cmd_fixed_param,
4398 WMITLV_GET_STRUCT_TLVLEN(
4399 wmi_vdev_set_custom_aggr_size_cmd_fixed_param));
4400
Abhishek Ambure74709762019-05-27 19:43:26 +05304401 cmd->vdev_id = vdev_id;
4402 cmd->rx_aggr_size = qos_aggr->rx_aggregation_size;
Paul Zhangee09f8e2018-04-23 16:11:32 +08004403 cmd->tx_aggr_size = tx_aggr_size[queue_num];
4404 /* bit 5: tx_ac_enable, if set, ac bitmap is valid. */
4405 cmd->enable_bitmap = 0x20 | queue_num;
Arif Hussain0e246802018-05-01 18:13:44 -07004406 /* bit 2 (aggr_type): TX Aggregation Type (0=A-MPDU, 1=A-MSDU) */
Abhishek Ambure74709762019-05-27 19:43:26 +05304407 if (aggr_type == WMI_VDEV_CUSTOM_AGGR_TYPE_AMSDU)
Arif Hussain0e246802018-05-01 18:13:44 -07004408 cmd->enable_bitmap |= 0x04;
Paul Zhangee09f8e2018-04-23 16:11:32 +08004409
Arif Hussain0e246802018-05-01 18:13:44 -07004410 WMA_LOGD("queue_num: %d, tx aggr: %d rx aggr: %d vdev: %d, bitmap: %d",
Paul Zhangee09f8e2018-04-23 16:11:32 +08004411 queue_num, cmd->tx_aggr_size,
Arif Hussain0e246802018-05-01 18:13:44 -07004412 cmd->rx_aggr_size, cmd->vdev_id,
4413 cmd->enable_bitmap);
Paul Zhangee09f8e2018-04-23 16:11:32 +08004414
4415 ret = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
4416 WMI_VDEV_SET_CUSTOM_AGGR_SIZE_CMDID);
4417 if (ret) {
Paul Zhangee09f8e2018-04-23 16:11:32 +08004418 wmi_buf_free(buf);
4419 return QDF_STATUS_E_FAILURE;
4420 }
4421 }
4422
4423 return QDF_STATUS_SUCCESS;
4424}
4425
stonez26388d02018-10-17 13:37:48 +08004426static QDF_STATUS wma_set_sw_retry_by_qos(
4427 tp_wma_handle handle, uint8_t vdev_id,
4428 wmi_vdev_custom_sw_retry_type_t retry_type,
4429 wmi_traffic_ac ac_type,
4430 uint32_t sw_retry)
Paul Zhang33fae272018-04-23 16:19:00 +08004431{
Paul Zhang33fae272018-04-23 16:19:00 +08004432 wmi_vdev_set_custom_sw_retry_th_cmd_fixed_param *cmd;
4433 int32_t len;
4434 wmi_buf_t buf;
4435 u_int8_t *buf_ptr;
4436 int ret;
Paul Zhang33fae272018-04-23 16:19:00 +08004437
stonez26388d02018-10-17 13:37:48 +08004438 len = sizeof(*cmd);
4439 buf = wmi_buf_alloc(handle->wmi_handle, len);
4440
4441 if (!buf)
4442 return QDF_STATUS_E_NOMEM;
4443
4444 buf_ptr = (u_int8_t *)wmi_buf_data(buf);
4445 cmd = (wmi_vdev_set_custom_sw_retry_th_cmd_fixed_param *)buf_ptr;
4446
4447 WMITLV_SET_HDR(&cmd->tlv_header,
4448 WMITLV_TAG_STRUC_wmi_vdev_set_custom_sw_retry_th_cmd_fixed_param,
4449 WMITLV_GET_STRUCT_TLVLEN(
4450 wmi_vdev_set_custom_sw_retry_th_cmd_fixed_param));
4451
4452 cmd->vdev_id = vdev_id;
4453 cmd->ac_type = ac_type;
4454 cmd->sw_retry_type = retry_type;
4455 cmd->sw_retry_th = sw_retry;
4456
4457 wma_debug("ac_type: %d re_type: %d threshold: %d vid: %d",
4458 cmd->ac_type, cmd->sw_retry_type,
4459 cmd->sw_retry_th, cmd->vdev_id);
4460
4461 ret = wmi_unified_cmd_send(handle->wmi_handle,
4462 buf, len,
4463 WMI_VDEV_SET_CUSTOM_SW_RETRY_TH_CMDID);
4464
4465 if (ret) {
4466 wmi_buf_free(buf);
4467 return QDF_STATUS_E_FAILURE;
4468 }
4469
4470 return QDF_STATUS_SUCCESS;
4471}
4472
Abhishek Ambure74709762019-05-27 19:43:26 +05304473QDF_STATUS wma_set_sw_retry_threshold_per_ac(WMA_HANDLE handle,
4474 uint8_t vdev_id,
4475 struct wlan_mlme_qos *qos_aggr)
stonez26388d02018-10-17 13:37:48 +08004476{
4477 QDF_STATUS ret;
stonez26388d02018-10-17 13:37:48 +08004478 int retry_type, queue_num;
4479 uint32_t tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_MAX][WMI_AC_MAX];
4480 uint32_t sw_retry;
Abhishek Ambure74709762019-05-27 19:43:26 +05304481 tp_wma_handle wma_handle = (tp_wma_handle)handle;
Paul Zhang33fae272018-04-23 16:19:00 +08004482
4483 if (!wma_handle) {
stonez26388d02018-10-17 13:37:48 +08004484 wma_err("%s: WMA context is invalid!", __func__);
Paul Zhang33fae272018-04-23 16:19:00 +08004485 return QDF_STATUS_E_INVAL;
4486 }
4487
stonez26388d02018-10-17 13:37:48 +08004488 tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_AGGR][WMI_AC_BE] =
Abhishek Ambure74709762019-05-27 19:43:26 +05304489 qos_aggr->tx_aggr_sw_retry_threshold_be;
stonez26388d02018-10-17 13:37:48 +08004490 tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_AGGR][WMI_AC_BK] =
Abhishek Ambure74709762019-05-27 19:43:26 +05304491 qos_aggr->tx_aggr_sw_retry_threshold_bk;
stonez26388d02018-10-17 13:37:48 +08004492 tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_AGGR][WMI_AC_VI] =
Abhishek Ambure74709762019-05-27 19:43:26 +05304493 qos_aggr->tx_aggr_sw_retry_threshold_vi;
stonez26388d02018-10-17 13:37:48 +08004494 tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_AGGR][WMI_AC_VO] =
Abhishek Ambure74709762019-05-27 19:43:26 +05304495 qos_aggr->tx_aggr_sw_retry_threshold_vo;
Paul Zhang33fae272018-04-23 16:19:00 +08004496
stonez26388d02018-10-17 13:37:48 +08004497 tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_NONAGGR][WMI_AC_BE] =
Abhishek Ambure74709762019-05-27 19:43:26 +05304498 qos_aggr->tx_non_aggr_sw_retry_threshold_be;
stonez26388d02018-10-17 13:37:48 +08004499 tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_NONAGGR][WMI_AC_BK] =
Abhishek Ambure74709762019-05-27 19:43:26 +05304500 qos_aggr->tx_non_aggr_sw_retry_threshold_bk;
stonez26388d02018-10-17 13:37:48 +08004501 tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_NONAGGR][WMI_AC_VI] =
Abhishek Ambure74709762019-05-27 19:43:26 +05304502 qos_aggr->tx_non_aggr_sw_retry_threshold_vi;
stonez26388d02018-10-17 13:37:48 +08004503 tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_NONAGGR][WMI_AC_VO] =
Abhishek Ambure74709762019-05-27 19:43:26 +05304504 qos_aggr->tx_non_aggr_sw_retry_threshold_vo;
Paul Zhang33fae272018-04-23 16:19:00 +08004505
stonez26388d02018-10-17 13:37:48 +08004506 retry_type = WMI_VDEV_CUSTOM_SW_RETRY_TYPE_NONAGGR;
4507 while (retry_type < WMI_VDEV_CUSTOM_SW_RETRY_TYPE_MAX) {
4508 for (queue_num = 0; queue_num < WMI_AC_MAX; queue_num++) {
4509 if (tx_sw_retry[retry_type][queue_num] == 0)
4510 continue;
Paul Zhang33fae272018-04-23 16:19:00 +08004511
stonez26388d02018-10-17 13:37:48 +08004512 sw_retry = tx_sw_retry[retry_type][queue_num];
4513 ret = wma_set_sw_retry_by_qos(wma_handle,
4514 vdev_id,
4515 retry_type,
4516 queue_num,
4517 sw_retry);
Paul Zhang33fae272018-04-23 16:19:00 +08004518
stonez26388d02018-10-17 13:37:48 +08004519 if (QDF_IS_STATUS_ERROR(ret))
4520 return ret;
Paul Zhang33fae272018-04-23 16:19:00 +08004521 }
stonez26388d02018-10-17 13:37:48 +08004522 retry_type++;
Paul Zhang33fae272018-04-23 16:19:00 +08004523 }
4524
4525 return QDF_STATUS_SUCCESS;
4526}
4527
Paul Zhanga25f75a2019-04-12 17:11:14 +08004528QDF_STATUS wma_set_sw_retry_threshold(uint8_t vdev_id, uint32_t retry,
4529 uint32_t param_id)
4530{
4531 uint32_t max, min;
4532 uint32_t ret;
4533
4534 if (param_id == WMI_PDEV_PARAM_AGG_SW_RETRY_TH) {
4535 max = cfg_max(CFG_TX_AGGR_SW_RETRY);
4536 min = cfg_min(CFG_TX_AGGR_SW_RETRY);
4537 } else {
4538 max = cfg_max(CFG_TX_NON_AGGR_SW_RETRY);
4539 min = cfg_min(CFG_TX_NON_AGGR_SW_RETRY);
4540 }
4541
4542 retry = (retry > max) ? max : retry;
4543 retry = (retry < min) ? min : retry;
4544
4545 ret = wma_cli_set_command(vdev_id, param_id, retry, PDEV_CMD);
4546 if (ret)
4547 return QDF_STATUS_E_IO;
4548
4549 return QDF_STATUS_SUCCESS;
4550}
Abhishek Ambure74709762019-05-27 19:43:26 +05304551
Anurag Chouhanbf5e0e22016-09-12 12:54:09 +05304552/**
4553 * wma_process_fw_test_cmd() - send unit test command to fw.
4554 * @handle: wma handle
4555 * @wma_fwtest: fw test command
4556 *
4557 * This function send fw test command to fw.
4558 *
4559 * Return: none
4560 */
Bala Venkateshe45f03d2019-03-25 16:00:42 +05304561QDF_STATUS wma_process_fw_test_cmd(WMA_HANDLE handle,
4562 struct set_fwtest_params *wma_fwtest)
Anurag Chouhanbf5e0e22016-09-12 12:54:09 +05304563{
4564 tp_wma_handle wma_handle = (tp_wma_handle) handle;
4565
4566 if (!wma_handle || !wma_handle->wmi_handle) {
4567 WMA_LOGE("%s: WMA is closed, can not issue fw test cmd",
4568 __func__);
Bala Venkateshe45f03d2019-03-25 16:00:42 +05304569 return QDF_STATUS_E_FAILURE;
Anurag Chouhanbf5e0e22016-09-12 12:54:09 +05304570 }
4571
4572 if (wmi_unified_fw_test_cmd(wma_handle->wmi_handle,
4573 (struct set_fwtest_params *)wma_fwtest)) {
4574 WMA_LOGE("%s: Failed to issue fw test cmd",
4575 __func__);
Bala Venkateshe45f03d2019-03-25 16:00:42 +05304576 return QDF_STATUS_E_FAILURE;
Anurag Chouhanbf5e0e22016-09-12 12:54:09 +05304577 }
Bala Venkateshe45f03d2019-03-25 16:00:42 +05304578 return QDF_STATUS_SUCCESS;
Anurag Chouhanbf5e0e22016-09-12 12:54:09 +05304579}
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +05304580
4581/**
4582 * wma_enable_disable_caevent_ind() - Issue WMI command to enable or
4583 * disable ca event indication
4584 * @wma: wma handler
4585 * @val: boolean value true or false
4586 *
4587 * Return: QDF_STATUS
4588 */
4589QDF_STATUS wma_enable_disable_caevent_ind(tp_wma_handle wma, uint8_t val)
4590{
4591 WMI_CHAN_AVOID_RPT_ALLOW_CMD_fixed_param *cmd;
4592 wmi_buf_t wmi_buf;
4593 uint8_t *buf_ptr;
4594 uint32_t len;
4595
4596 if (!wma || !wma->wmi_handle) {
4597 WMA_LOGE(FL("WMA is closed, can not issue set/clear CA"));
4598 return QDF_STATUS_E_INVAL;
4599 }
4600
4601 len = sizeof(*cmd);
4602 wmi_buf = wmi_buf_alloc(wma->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07004603 if (!wmi_buf)
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +05304604 return QDF_STATUS_E_NOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -07004605
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +05304606 buf_ptr = (uint8_t *) wmi_buf_data(wmi_buf);
4607 cmd = (WMI_CHAN_AVOID_RPT_ALLOW_CMD_fixed_param *) buf_ptr;
4608 WMITLV_SET_HDR(&cmd->tlv_header,
4609 WMITLV_TAG_STRUC_WMI_CHAN_AVOID_RPT_ALLOW_CMD_fixed_param,
4610 WMITLV_GET_STRUCT_TLVLEN(
4611 WMI_CHAN_AVOID_RPT_ALLOW_CMD_fixed_param));
4612 cmd->rpt_allow = val;
4613 if (wmi_unified_cmd_send(wma->wmi_handle, wmi_buf, len,
4614 WMI_CHAN_AVOID_RPT_ALLOW_CMDID)) {
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +05304615 wmi_buf_free(wmi_buf);
4616 return QDF_STATUS_E_FAILURE;
4617 }
4618
4619 return QDF_STATUS_SUCCESS;
4620}
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +05304621
Jeff Johnsonf0e54b02017-12-18 15:22:25 -08004622static wma_sar_cb sar_callback;
4623static void *sar_context;
4624
4625static int wma_sar_event_handler(void *handle, uint8_t *evt_buf, uint32_t len)
4626{
4627 tp_wma_handle wma_handle;
4628 wmi_unified_t wmi_handle;
jiadb17a2972018-01-25 10:02:31 +08004629 struct sar_limit_event *event;
Jeff Johnsonf0e54b02017-12-18 15:22:25 -08004630 wma_sar_cb callback;
4631 QDF_STATUS status;
4632
4633 WMA_LOGI(FL("handle:%pK event:%pK len:%u"), handle, evt_buf, len);
4634
4635 wma_handle = handle;
4636 if (!wma_handle) {
4637 WMA_LOGE(FL("NULL wma_handle"));
4638 return QDF_STATUS_E_INVAL;
4639 }
4640
4641 wmi_handle = wma_handle->wmi_handle;
4642 if (!wmi_handle) {
4643 WMA_LOGE(FL("NULL wmi_handle"));
4644 return QDF_STATUS_E_INVAL;
4645 }
4646
jiadb17a2972018-01-25 10:02:31 +08004647 event = qdf_mem_malloc(sizeof(*event));
Arif Hussain157263f2018-10-03 13:07:15 -07004648 if (!event)
jiadb17a2972018-01-25 10:02:31 +08004649 return QDF_STATUS_E_NOMEM;
jiadb17a2972018-01-25 10:02:31 +08004650
Jeff Johnsonf0e54b02017-12-18 15:22:25 -08004651 status = wmi_unified_extract_sar_limit_event(wmi_handle,
jiadb17a2972018-01-25 10:02:31 +08004652 evt_buf, event);
Jeff Johnsonf0e54b02017-12-18 15:22:25 -08004653 if (QDF_IS_STATUS_ERROR(status)) {
4654 WMA_LOGE(FL("Event extract failure: %d"), status);
jiadb17a2972018-01-25 10:02:31 +08004655 qdf_mem_free(event);
Jeff Johnsonf0e54b02017-12-18 15:22:25 -08004656 return QDF_STATUS_E_INVAL;
4657 }
4658
4659 callback = sar_callback;
4660 sar_callback = NULL;
4661 if (callback)
jiadb17a2972018-01-25 10:02:31 +08004662 callback(sar_context, event);
4663
4664 qdf_mem_free(event);
Jeff Johnsonf0e54b02017-12-18 15:22:25 -08004665
4666 return 0;
4667}
4668
4669QDF_STATUS wma_sar_register_event_handlers(WMA_HANDLE handle)
4670{
4671 tp_wma_handle wma_handle = handle;
4672 wmi_unified_t wmi_handle;
4673
4674 if (!wma_handle) {
4675 WMA_LOGE(FL("NULL wma_handle"));
4676 return QDF_STATUS_E_INVAL;
4677 }
4678
4679 wmi_handle = wma_handle->wmi_handle;
4680 if (!wmi_handle) {
4681 WMA_LOGE(FL("NULL wmi_handle"));
4682 return QDF_STATUS_E_INVAL;
4683 }
4684
4685 return wmi_unified_register_event_handler(wmi_handle,
4686 wmi_sar_get_limits_event_id,
4687 wma_sar_event_handler,
4688 WMA_RX_WORK_CTX);
4689}
4690
4691QDF_STATUS wma_get_sar_limit(WMA_HANDLE handle,
4692 wma_sar_cb callback, void *context)
4693{
4694 tp_wma_handle wma_handle = handle;
4695 wmi_unified_t wmi_handle;
4696 QDF_STATUS status;
4697
4698 if (!wma_handle) {
4699 WMA_LOGE(FL("NULL wma_handle"));
4700 return QDF_STATUS_E_INVAL;
4701 }
4702
4703 wmi_handle = wma_handle->wmi_handle;
4704 if (!wmi_handle) {
4705 WMA_LOGE(FL("NULL wmi_handle"));
4706 return QDF_STATUS_E_INVAL;
4707 }
4708
4709 sar_callback = callback;
4710 sar_context = context;
4711 status = wmi_unified_get_sar_limit_cmd(wmi_handle);
4712 if (QDF_IS_STATUS_ERROR(status)) {
4713 WMA_LOGE(FL("wmi_unified_get_sar_limit_cmd() error: %u"),
4714 status);
4715 sar_callback = NULL;
4716 }
4717
4718 return status;
4719}
4720
Kabilan Kannan3c0a7352016-12-02 18:49:38 -08004721QDF_STATUS wma_set_sar_limit(WMA_HANDLE handle,
4722 struct sar_limit_cmd_params *sar_limit_params)
4723{
4724 int ret;
4725 tp_wma_handle wma = (tp_wma_handle) handle;
4726
4727 if (!wma || !wma->wmi_handle) {
4728 WMA_LOGE("%s: WMA is closed, can not issue set sar limit msg",
4729 __func__);
4730 return QDF_STATUS_E_INVAL;
4731 }
4732
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07004733 if (!sar_limit_params) {
Kabilan Kannan3c0a7352016-12-02 18:49:38 -08004734 WMA_LOGE("%s: set sar limit ptr NULL",
4735 __func__);
4736 return QDF_STATUS_E_INVAL;
4737 }
4738
4739 ret = wmi_unified_send_sar_limit_cmd(wma->wmi_handle,
4740 sar_limit_params);
4741
4742 return ret;
4743}
4744
Dundi Raviteja3b637092018-09-12 13:42:50 +05304745QDF_STATUS wma_send_coex_config_cmd(WMA_HANDLE wma_handle,
4746 struct coex_config_params *coex_cfg_params)
4747{
4748 tp_wma_handle wma = (tp_wma_handle)wma_handle;
4749
4750 if (!wma || !wma->wmi_handle) {
4751 WMA_LOGE("%s: WMA is closed, can not issue coex config command",
4752 __func__);
4753 return QDF_STATUS_E_INVAL;
4754 }
4755
4756 if (!coex_cfg_params) {
4757 WMA_LOGE("%s: coex cfg params ptr NULL", __func__);
4758 return QDF_STATUS_E_INVAL;
4759 }
4760
4761 return wmi_unified_send_coex_config_cmd(wma->wmi_handle,
4762 coex_cfg_params);
4763}
4764
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05304765/**
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05304766 * wma_get_arp_stats_handler() - handle arp stats data
4767 * indicated by FW
4768 * @handle: wma context
4769 * @data: event buffer
4770 * @data len: length of event buffer
4771 *
4772 * Return: 0 on success
4773 */
4774int wma_get_arp_stats_handler(void *handle, uint8_t *data,
4775 uint32_t data_len)
4776{
4777 WMI_VDEV_GET_ARP_STAT_EVENTID_param_tlvs *param_buf;
4778 wmi_vdev_get_arp_stats_event_fixed_param *data_event;
Poddar, Siddarth465330e2018-01-08 18:23:54 +05304779 wmi_vdev_get_connectivity_check_stats *connect_stats_event;
4780 uint8_t *buf_ptr;
Naveen Rawat6e45d9a2018-04-27 16:35:59 -07004781 struct rsp_stats rsp = {0};
Jeff Johnson9f18aa72018-12-02 12:05:12 -08004782 struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05304783
4784 if (!mac) {
4785 WMA_LOGE("%s: Invalid mac context", __func__);
4786 return -EINVAL;
4787 }
4788
4789 if (!mac->sme.get_arp_stats_cb) {
4790 WMA_LOGE("%s: Callback not registered", __func__);
4791 return -EINVAL;
4792 }
4793
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07004794 if (!data) {
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05304795 WMA_LOGE("%s: invalid pointer", __func__);
4796 return -EINVAL;
4797 }
4798 param_buf = (WMI_VDEV_GET_ARP_STAT_EVENTID_param_tlvs *)data;
4799 if (!param_buf) {
4800 WMA_LOGE("%s: Invalid get arp stats event", __func__);
4801 return -EINVAL;
4802 }
4803 data_event = param_buf->fixed_param;
4804 if (!data_event) {
4805 WMA_LOGE("%s: Invalid get arp stats data event", __func__);
4806 return -EINVAL;
4807 }
4808 rsp.arp_req_enqueue = data_event->arp_req_enqueue;
4809 rsp.vdev_id = data_event->vdev_id;
4810 rsp.arp_req_tx_success = data_event->arp_req_tx_success;
4811 rsp.arp_req_tx_failure = data_event->arp_req_tx_failure;
4812 rsp.arp_rsp_recvd = data_event->arp_rsp_recvd;
4813 rsp.out_of_order_arp_rsp_drop_cnt =
4814 data_event->out_of_order_arp_rsp_drop_cnt;
4815 rsp.dad_detected = data_event->dad_detected;
4816 rsp.connect_status = data_event->connect_status;
4817 rsp.ba_session_establishment_status =
4818 data_event->ba_session_establishment_status;
4819
Poddar, Siddarth465330e2018-01-08 18:23:54 +05304820 buf_ptr = (uint8_t *)data_event;
4821 buf_ptr = buf_ptr + sizeof(wmi_vdev_get_arp_stats_event_fixed_param) +
4822 WMI_TLV_HDR_SIZE;
4823 connect_stats_event = (wmi_vdev_get_connectivity_check_stats *)buf_ptr;
4824
4825 if (((connect_stats_event->tlv_header & 0xFFFF0000) >> 16 ==
4826 WMITLV_TAG_STRUC_wmi_vdev_get_connectivity_check_stats)) {
4827 rsp.connect_stats_present = true;
4828 rsp.tcp_ack_recvd = connect_stats_event->tcp_ack_recvd;
4829 rsp.icmpv4_rsp_recvd = connect_stats_event->icmpv4_rsp_recvd;
4830 WMA_LOGD("tcp_ack_recvd %d icmpv4_rsp_recvd %d",
4831 connect_stats_event->tcp_ack_recvd,
4832 connect_stats_event->icmpv4_rsp_recvd);
4833 }
4834
Jeff Johnson6aaaa992018-06-30 10:43:04 -07004835 mac->sme.get_arp_stats_cb(mac->hdd_handle, &rsp,
Dundi Raviteja3bcf3a82018-05-22 13:24:18 +05304836 mac->sme.get_arp_stats_context);
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05304837
4838 return 0;
4839}
4840
4841/**
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05304842 * wma_unified_power_debug_stats_event_handler() - WMA handler function to
4843 * handle Power stats event from firmware
4844 * @handle: Pointer to wma handle
4845 * @cmd_param_info: Pointer to Power stats event TLV
4846 * @len: Length of the cmd_param_info
4847 *
4848 * Return: 0 on success, error number otherwise
4849 */
Aditya Kodukula0a590372020-04-15 13:30:14 -07004850 #ifdef WLAN_POWER_DEBUG
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05304851int wma_unified_power_debug_stats_event_handler(void *handle,
4852 uint8_t *cmd_param_info, uint32_t len)
4853{
4854 WMI_PDEV_CHIP_POWER_STATS_EVENTID_param_tlvs *param_tlvs;
4855 struct power_stats_response *power_stats_results;
4856 wmi_pdev_chip_power_stats_event_fixed_param *param_buf;
4857 uint32_t power_stats_len, stats_registers_len, *debug_registers;
4858
Jeff Johnson9f18aa72018-12-02 12:05:12 -08004859 struct mac_context *mac = (struct mac_context *)cds_get_context(QDF_MODULE_ID_PE);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004860
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05304861 param_tlvs =
4862 (WMI_PDEV_CHIP_POWER_STATS_EVENTID_param_tlvs *) cmd_param_info;
4863
4864 param_buf = (wmi_pdev_chip_power_stats_event_fixed_param *)
4865 param_tlvs->fixed_param;
4866 if (!mac || !mac->sme.power_stats_resp_callback) {
4867 WMA_LOGD("%s: NULL mac ptr or HDD callback is null", __func__);
4868 return -EINVAL;
4869 }
4870
4871 if (!param_buf) {
4872 WMA_LOGD("%s: NULL power stats event fixed param", __func__);
4873 return -EINVAL;
4874 }
4875
Sandeep Puligilla2f931532017-09-20 16:27:43 -07004876 if (param_buf->num_debug_register > ((WMI_SVC_MSG_MAX_SIZE -
4877 sizeof(wmi_pdev_chip_power_stats_event_fixed_param)) /
Himanshu Agarwal82218792017-12-22 14:00:01 +05304878 sizeof(uint32_t)) ||
4879 param_buf->num_debug_register > param_tlvs->num_debug_registers) {
Sandeep Puligilla2f931532017-09-20 16:27:43 -07004880 WMA_LOGE("excess payload: LEN num_debug_register:%u",
4881 param_buf->num_debug_register);
4882 return -EINVAL;
4883 }
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05304884 debug_registers = param_tlvs->debug_registers;
4885 stats_registers_len =
4886 (sizeof(uint32_t) * param_buf->num_debug_register);
4887 power_stats_len = stats_registers_len + sizeof(*power_stats_results);
4888 power_stats_results = qdf_mem_malloc(power_stats_len);
Arif Hussain157263f2018-10-03 13:07:15 -07004889 if (!power_stats_results)
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05304890 return -ENOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -07004891
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05304892 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",
4893 param_buf->cumulative_sleep_time_ms,
4894 param_buf->cumulative_total_on_time_ms,
4895 param_buf->deep_sleep_enter_counter,
4896 param_buf->last_deep_sleep_enter_tstamp_ms,
4897 param_buf->debug_register_fmt,
4898 param_buf->num_debug_register);
4899
4900 power_stats_results->cumulative_sleep_time_ms
4901 = param_buf->cumulative_sleep_time_ms;
4902 power_stats_results->cumulative_total_on_time_ms
4903 = param_buf->cumulative_total_on_time_ms;
4904 power_stats_results->deep_sleep_enter_counter
4905 = param_buf->deep_sleep_enter_counter;
4906 power_stats_results->last_deep_sleep_enter_tstamp_ms
4907 = param_buf->last_deep_sleep_enter_tstamp_ms;
4908 power_stats_results->debug_register_fmt
4909 = param_buf->debug_register_fmt;
4910 power_stats_results->num_debug_register
4911 = param_buf->num_debug_register;
4912
4913 power_stats_results->debug_registers
4914 = (uint32_t *)(power_stats_results + 1);
4915
4916 qdf_mem_copy(power_stats_results->debug_registers,
4917 debug_registers, stats_registers_len);
4918
4919 mac->sme.power_stats_resp_callback(power_stats_results,
4920 mac->sme.power_debug_stats_context);
4921 qdf_mem_free(power_stats_results);
4922 return 0;
4923}
Aditya Kodukula0a590372020-04-15 13:30:14 -07004924#else
4925int wma_unified_power_debug_stats_event_handler(void *handle,
4926 uint8_t *cmd_param_info,
4927 uint32_t len)
4928{
4929 return 0;
4930}
4931#endif
4932
Arunk Khandavallica56d4b2018-11-29 15:46:00 +05304933#ifdef WLAN_FEATURE_BEACON_RECEPTION_STATS
4934int wma_unified_beacon_debug_stats_event_handler(void *handle,
4935 uint8_t *cmd_param_info,
4936 uint32_t len)
4937{
4938 WMI_VDEV_BCN_RECEPTION_STATS_EVENTID_param_tlvs *param_tlvs;
4939 struct bcn_reception_stats_rsp *bcn_reception_stats;
4940 wmi_vdev_bcn_recv_stats_fixed_param *param_buf;
4941 struct mac_context *mac =
4942 (struct mac_context *)cds_get_context(QDF_MODULE_ID_PE);
4943
4944 param_tlvs =
4945 (WMI_VDEV_BCN_RECEPTION_STATS_EVENTID_param_tlvs *)cmd_param_info;
4946 if (!param_tlvs) {
4947 WMA_LOGA("%s: Invalid stats event", __func__);
4948 return -EINVAL;
4949 }
4950
4951 param_buf = (wmi_vdev_bcn_recv_stats_fixed_param *)
4952 param_tlvs->fixed_param;
4953 if (!param_buf || !mac || !mac->sme.beacon_stats_resp_callback) {
4954 WMA_LOGD("%s: NULL mac ptr or HDD callback is null", __func__);
4955 return -EINVAL;
4956 }
4957
4958 if (!param_buf) {
4959 WMA_LOGD("%s: NULL beacon stats event fixed param", __func__);
4960 return -EINVAL;
4961 }
4962
4963 bcn_reception_stats = qdf_mem_malloc(sizeof(*bcn_reception_stats));
4964 if (!bcn_reception_stats)
4965 return -ENOMEM;
4966
4967 bcn_reception_stats->total_bcn_cnt = param_buf->total_bcn_cnt;
4968 bcn_reception_stats->total_bmiss_cnt = param_buf->total_bmiss_cnt;
4969 bcn_reception_stats->vdev_id = param_buf->vdev_id;
4970
4971 WMA_LOGD("Total beacon count %d total beacon miss count %d vdev_id %d",
4972 param_buf->total_bcn_cnt,
4973 param_buf->total_bmiss_cnt,
4974 param_buf->vdev_id);
4975
4976 qdf_mem_copy(bcn_reception_stats->bmiss_bitmap,
4977 param_buf->bmiss_bitmap,
4978 MAX_BCNMISS_BITMAP * sizeof(uint32_t));
4979
4980 mac->sme.beacon_stats_resp_callback(bcn_reception_stats,
4981 mac->sme.beacon_stats_context);
4982 qdf_mem_free(bcn_reception_stats);
4983 return 0;
4984}
4985#else
4986int wma_unified_beacon_debug_stats_event_handler(void *handle,
4987 uint8_t *cmd_param_info,
4988 uint32_t len)
4989{
4990 return 0;
4991}
4992#endif
Kapil Gupta4f0c0c12017-02-07 15:21:15 +05304993
4994int wma_chan_info_event_handler(void *handle, uint8_t *event_buf,
4995 uint32_t len)
4996{
4997 tp_wma_handle wma = (tp_wma_handle)handle;
4998 WMI_CHAN_INFO_EVENTID_param_tlvs *param_buf;
4999 wmi_chan_info_event_fixed_param *event;
5000 struct scan_chan_info buf;
Jeff Johnson9f18aa72018-12-02 12:05:12 -08005001 struct mac_context *mac = NULL;
gaoleze5108942017-03-31 16:56:42 +08005002 struct lim_channel_status *channel_status;
Sandeep Puligillad7887022019-02-26 00:48:52 -08005003 bool snr_monitor_enabled;
Abhishek Ambure74709762019-05-27 19:43:26 +05305004 struct wlan_objmgr_vdev *vdev;
5005 enum QDF_OPMODE mode;
Kapil Gupta4f0c0c12017-02-07 15:21:15 +05305006
Jeff Johnsonfb6d0ca2019-03-18 13:38:29 -07005007 if (wma && wma->cds_context)
Jeff Johnson9f18aa72018-12-02 12:05:12 -08005008 mac = (struct mac_context *)cds_get_context(QDF_MODULE_ID_PE);
Kapil Gupta4f0c0c12017-02-07 15:21:15 +05305009
5010 if (!mac) {
5011 WMA_LOGE("%s: Invalid mac context", __func__);
5012 return -EINVAL;
5013 }
5014
Abhishek Ambure74709762019-05-27 19:43:26 +05305015 param_buf = (WMI_CHAN_INFO_EVENTID_param_tlvs *)event_buf;
5016 if (!param_buf) {
5017 WMA_LOGE("Invalid chan info event buffer");
5018 return -EINVAL;
5019 }
5020 event = param_buf->fixed_param;
5021 if (!event) {
5022 WMA_LOGA("%s: Invalid fixed param", __func__);
5023 return -EINVAL;
5024 }
5025
Sandeep Puligillad7887022019-02-26 00:48:52 -08005026 snr_monitor_enabled = wlan_scan_is_snr_monitor_enabled(mac->psoc);
Sandeep Puligillad7887022019-02-26 00:48:52 -08005027 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) {
Abhishek Singh48175fd2020-01-29 17:03:49 +05305042 wma_err("vdev not found for vdev %d", event->vdev_id);
Abhishek Ambure74709762019-05-27 19:43:26 +05305043 return -EINVAL;
5044 }
5045 mode = wlan_vdev_mlme_get_opmode(vdev);
5046 wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_WMA_ID);
Abhishek Ambure74709762019-05-27 19:43:26 +05305047
5048 if (mac->sap.acs_with_more_param && mode == QDF_SAP_MODE) {
Arif Hussain157263f2018-10-03 13:07:15 -07005049 channel_status = qdf_mem_malloc(sizeof(*channel_status));
5050 if (!channel_status)
gaoleze5108942017-03-31 16:56:42 +08005051 return -ENOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -07005052
Abhishek Singh48175fd2020-01-29 17:03:49 +05305053 wma_debug("freq %d nf %d rxcnt %u cyccnt %u tx_r %d tx_t %d",
5054 event->freq, event->noise_floor,
5055 event->rx_clear_count, event->cycle_count,
5056 event->chan_tx_pwr_range, event->chan_tx_pwr_tp);
gaoleze5108942017-03-31 16:56:42 +08005057
5058 channel_status->channelfreq = event->freq;
5059 channel_status->noise_floor = event->noise_floor;
5060 channel_status->rx_clear_count =
5061 event->rx_clear_count;
5062 channel_status->cycle_count = event->cycle_count;
5063 channel_status->chan_tx_pwr_range =
5064 event->chan_tx_pwr_range;
5065 channel_status->chan_tx_pwr_throughput =
5066 event->chan_tx_pwr_tp;
5067 channel_status->rx_frame_count =
5068 event->rx_frame_count;
5069 channel_status->bss_rx_cycle_count =
5070 event->my_bss_rx_cycle_count;
5071 channel_status->rx_11b_mode_data_duration =
5072 event->rx_11b_mode_data_duration;
5073 channel_status->tx_frame_count = event->tx_frame_cnt;
5074 channel_status->mac_clk_mhz = event->mac_clk_mhz;
5075 channel_status->channel_id =
5076 cds_freq_to_chan(event->freq);
5077 channel_status->cmd_flags =
5078 event->cmd_flags;
5079
5080 wma_send_msg(handle, WMA_RX_CHN_STATUS_EVENT,
5081 (void *)channel_status, 0);
5082 }
5083
Kapil Gupta4f0c0c12017-02-07 15:21:15 +05305084 return 0;
5085}
lifeng66831662017-05-19 16:01:35 +08005086
5087int wma_rx_aggr_failure_event_handler(void *handle, u_int8_t *event_buf,
5088 u_int32_t len)
5089{
5090 WMI_REPORT_RX_AGGR_FAILURE_EVENTID_param_tlvs *param_buf;
5091 struct sir_sme_rx_aggr_hole_ind *rx_aggr_hole_event;
5092 wmi_rx_aggr_failure_event_fixed_param *rx_aggr_failure_info;
5093 wmi_rx_aggr_failure_info *hole_info;
5094 uint32_t i, alloc_len;
Jeff Johnson9f18aa72018-12-02 12:05:12 -08005095 struct mac_context *mac;
lifeng66831662017-05-19 16:01:35 +08005096
Jeff Johnson9f18aa72018-12-02 12:05:12 -08005097 mac = (struct mac_context *)cds_get_context(QDF_MODULE_ID_PE);
lifeng66831662017-05-19 16:01:35 +08005098 if (!mac || !mac->sme.stats_ext2_cb) {
5099 WMA_LOGD("%s: NULL mac ptr or HDD callback is null", __func__);
5100 return -EINVAL;
5101 }
5102
5103 param_buf = (WMI_REPORT_RX_AGGR_FAILURE_EVENTID_param_tlvs *)event_buf;
5104 if (!param_buf) {
5105 WMA_LOGE("%s: Invalid stats ext event buf", __func__);
5106 return -EINVAL;
5107 }
5108
5109 rx_aggr_failure_info = param_buf->fixed_param;
5110 hole_info = param_buf->failure_info;
5111
Vignesh Viswanathan677e3ec2017-09-27 20:44:27 +05305112 if (rx_aggr_failure_info->num_failure_info > ((WMI_SVC_MSG_MAX_SIZE -
5113 sizeof(*rx_aggr_hole_event)) /
5114 sizeof(rx_aggr_hole_event->hole_info_array[0]))) {
5115 WMA_LOGE("%s: Excess data from WMI num_failure_info %d",
5116 __func__, rx_aggr_failure_info->num_failure_info);
Vignesh Viswanathan677e3ec2017-09-27 20:44:27 +05305117 return -EINVAL;
5118 }
5119
lifeng66831662017-05-19 16:01:35 +08005120 alloc_len = sizeof(*rx_aggr_hole_event) +
5121 (rx_aggr_failure_info->num_failure_info)*
5122 sizeof(rx_aggr_hole_event->hole_info_array[0]);
5123 rx_aggr_hole_event = qdf_mem_malloc(alloc_len);
Arif Hussain157263f2018-10-03 13:07:15 -07005124 if (!rx_aggr_hole_event)
lifeng66831662017-05-19 16:01:35 +08005125 return -ENOMEM;
lifeng66831662017-05-19 16:01:35 +08005126
5127 rx_aggr_hole_event->hole_cnt = rx_aggr_failure_info->num_failure_info;
Abhinav Kumara03659c2017-12-28 15:18:07 +05305128 if (rx_aggr_hole_event->hole_cnt > param_buf->num_failure_info) {
5129 WMA_LOGE("Invalid no of hole count: %d",
5130 rx_aggr_hole_event->hole_cnt);
5131 qdf_mem_free(rx_aggr_hole_event);
5132 return -EINVAL;
5133 }
lifeng66831662017-05-19 16:01:35 +08005134 WMA_LOGD("aggr holes_sum: %d\n",
5135 rx_aggr_failure_info->num_failure_info);
5136 for (i = 0; i < rx_aggr_hole_event->hole_cnt; i++) {
5137 rx_aggr_hole_event->hole_info_array[i] =
5138 hole_info->end_seq - hole_info->start_seq + 1;
5139 WMA_LOGD("aggr_index: %d\tstart_seq: %d\tend_seq: %d\t"
5140 "hole_info: %d mpdu lost",
5141 i, hole_info->start_seq, hole_info->end_seq,
5142 rx_aggr_hole_event->hole_info_array[i]);
5143 hole_info++;
5144 }
5145
Jeff Johnson6aaaa992018-06-30 10:43:04 -07005146 mac->sme.stats_ext2_cb(mac->hdd_handle, rx_aggr_hole_event);
lifeng66831662017-05-19 16:01:35 +08005147 qdf_mem_free(rx_aggr_hole_event);
5148
5149 return 0;
5150}
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +05305151
5152int wma_wlan_bt_activity_evt_handler(void *handle, uint8_t *event, uint32_t len)
5153{
5154 wmi_coex_bt_activity_event_fixed_param *fixed_param;
5155 WMI_WLAN_COEX_BT_ACTIVITY_EVENTID_param_tlvs *param_buf =
5156 (WMI_WLAN_COEX_BT_ACTIVITY_EVENTID_param_tlvs *)event;
5157 struct scheduler_msg sme_msg = {0};
5158 QDF_STATUS qdf_status;
5159
5160 if (!param_buf) {
5161 WMA_LOGE(FL("Invalid BT activity event buffer"));
5162 return -EINVAL;
5163 }
5164
5165 fixed_param = param_buf->fixed_param;
5166 if (!fixed_param) {
5167 WMA_LOGE(FL("Invalid BT activity event fixed param buffer"));
5168 return -EINVAL;
5169 }
5170
5171 WMA_LOGI(FL("Received BT activity event %u"),
5172 fixed_param->coex_profile_evt);
5173
5174 sme_msg.type = eWNI_SME_BT_ACTIVITY_INFO_IND;
5175 sme_msg.bodyptr = NULL;
5176 sme_msg.bodyval = fixed_param->coex_profile_evt;
5177
gaurank kathpalia00861f02018-08-28 19:16:12 +05305178 qdf_status = scheduler_post_message(QDF_MODULE_ID_WMA,
5179 QDF_MODULE_ID_SME,
5180 QDF_MODULE_ID_SME, &sme_msg);
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05305181 if (QDF_IS_STATUS_ERROR(qdf_status))
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +05305182 return -EINVAL;
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +05305183
5184 return 0;
5185}
lifengd217d192017-05-09 19:44:16 +08005186
lifengfe6c3e22018-04-03 12:10:04 +08005187int wma_pdev_div_info_evt_handler(void *handle, u_int8_t *event_buf,
lifengd217d192017-05-09 19:44:16 +08005188 u_int32_t len)
5189{
lifengfe6c3e22018-04-03 12:10:04 +08005190 WMI_PDEV_DIV_RSSI_ANTID_EVENTID_param_tlvs *param_buf;
5191 wmi_pdev_div_rssi_antid_event_fixed_param *event;
5192 struct chain_rssi_result chain_rssi_result;
5193 u_int32_t i;
Srinivas Girigowdaa47b45f2019-02-27 12:29:02 -08005194 u_int8_t macaddr[QDF_MAC_ADDR_SIZE];
Yeshwanth Sriram Guntuka14ab04c2018-09-21 15:06:49 +05305195 tp_wma_handle wma = (tp_wma_handle)handle;
lifengd217d192017-05-09 19:44:16 +08005196
Jeff Johnson9f18aa72018-12-02 12:05:12 -08005197 struct mac_context *pmac = (struct mac_context *)cds_get_context(
lifengd217d192017-05-09 19:44:16 +08005198 QDF_MODULE_ID_PE);
Yeshwanth Sriram Guntuka14ab04c2018-09-21 15:06:49 +05305199 if (!pmac || !wma) {
5200 WMA_LOGE(FL("Invalid pmac or wma"));
lifengd217d192017-05-09 19:44:16 +08005201 return -EINVAL;
5202 }
5203
Harprit Chhabada2e2aa692018-10-04 18:28:28 -07005204 if (!pmac->sme.get_chain_rssi_cb) {
5205 WMA_LOGE(FL("Invalid get_chain_rssi_cb"));
5206 return -EINVAL;
5207 }
lifengfe6c3e22018-04-03 12:10:04 +08005208 param_buf = (WMI_PDEV_DIV_RSSI_ANTID_EVENTID_param_tlvs *) event_buf;
lifengd217d192017-05-09 19:44:16 +08005209 if (!param_buf) {
lifengfe6c3e22018-04-03 12:10:04 +08005210 WMA_LOGE(FL("Invalid rssi antid event buffer"));
lifengd217d192017-05-09 19:44:16 +08005211 return -EINVAL;
5212 }
5213
lifengfe6c3e22018-04-03 12:10:04 +08005214 event = param_buf->fixed_param;
5215 if (!event) {
5216 WMA_LOGE(FL("Invalid fixed param"));
5217 return -EINVAL;
lifengd217d192017-05-09 19:44:16 +08005218 }
5219
Pragaspathi Thilagaraj96aff772018-08-29 23:15:31 +05305220 if (event->num_chains_valid > CHAIN_MAX_NUM) {
5221 WMA_LOGE(FL("Invalid num of chains"));
5222 return -EINVAL;
5223 }
5224
stonez396a9732019-01-16 12:29:16 +08005225 qdf_mem_zero(&chain_rssi_result, sizeof(chain_rssi_result));
5226
lifengfe6c3e22018-04-03 12:10:04 +08005227 WMI_MAC_ADDR_TO_CHAR_ARRAY(&event->macaddr, macaddr);
Srinivas Girigowdacb7b8b82019-04-10 14:27:47 -07005228 wma_debug("macaddr: " QDF_MAC_ADDR_STR, QDF_MAC_ADDR_ARRAY(macaddr));
lifengd217d192017-05-09 19:44:16 +08005229
lifengfe6c3e22018-04-03 12:10:04 +08005230 WMA_LOGD(FL("num_chains_valid: %d"), event->num_chains_valid);
5231 chain_rssi_result.num_chains_valid = event->num_chains_valid;
5232
lifengfe6c3e22018-04-03 12:10:04 +08005233 qdf_mem_copy(chain_rssi_result.chain_rssi, event->chain_rssi,
stonez396a9732019-01-16 12:29:16 +08005234 sizeof(event->chain_rssi));
5235
5236 qdf_mem_copy(chain_rssi_result.chain_evm, event->chain_evm,
5237 sizeof(event->chain_evm));
5238
5239 qdf_mem_copy(chain_rssi_result.ant_id, event->ant_id,
5240 sizeof(event->ant_id));
5241
5242 for (i = 0; i < chain_rssi_result.num_chains_valid; i++) {
5243 WMA_LOGD(FL("chain_rssi: %d, chain_evm: %d,ant_id: %d"),
5244 chain_rssi_result.chain_rssi[i],
5245 chain_rssi_result.chain_evm[i],
5246 chain_rssi_result.ant_id[i]);
5247
Yeshwanth Sriram Guntuka14ab04c2018-09-21 15:06:49 +05305248 if (!wmi_service_enabled(wma->wmi_handle,
5249 wmi_service_hw_db2dbm_support)) {
5250 if (chain_rssi_result.chain_rssi[i] !=
5251 WMA_INVALID_PER_CHAIN_SNR)
5252 chain_rssi_result.chain_rssi[i] +=
stonez396a9732019-01-16 12:29:16 +08005253 WMA_TGT_NOISE_FLOOR_DBM;
Yeshwanth Sriram Guntuka14ab04c2018-09-21 15:06:49 +05305254 else
5255 chain_rssi_result.chain_rssi[i] =
5256 WMA_INVALID_PER_CHAIN_RSSI;
5257 }
Pragaspathi Thilagaraj96aff772018-08-29 23:15:31 +05305258 }
lifengfe6c3e22018-04-03 12:10:04 +08005259
lifengd217d192017-05-09 19:44:16 +08005260 pmac->sme.get_chain_rssi_cb(pmac->sme.get_chain_rssi_context,
lifengfe6c3e22018-04-03 12:10:04 +08005261 &chain_rssi_result);
lifengd217d192017-05-09 19:44:16 +08005262
5263 return 0;
5264}
Arif Hussainee10f902017-12-27 16:30:17 -08005265
5266int wma_vdev_obss_detection_info_handler(void *handle, uint8_t *event,
5267 uint32_t len)
5268{
5269 tp_wma_handle wma = (tp_wma_handle) handle;
5270 struct wmi_obss_detect_info *obss_detection;
5271 QDF_STATUS status;
5272
5273 if (!event) {
5274 WMA_LOGE("Invalid obss_detection_info event buffer");
5275 return -EINVAL;
5276 }
5277
5278 obss_detection = qdf_mem_malloc(sizeof(*obss_detection));
Arif Hussain157263f2018-10-03 13:07:15 -07005279 if (!obss_detection)
Arif Hussainee10f902017-12-27 16:30:17 -08005280 return -ENOMEM;
Arif Hussainee10f902017-12-27 16:30:17 -08005281
5282 status = wmi_unified_extract_obss_detection_info(wma->wmi_handle,
5283 event, obss_detection);
5284
5285 if (QDF_IS_STATUS_ERROR(status)) {
5286 WMA_LOGE("%s: Failed to extract obss info", __func__);
5287 qdf_mem_free(obss_detection);
5288 return -EINVAL;
5289 }
5290
5291 if (!wma_is_vdev_valid(obss_detection->vdev_id)) {
5292 WMA_LOGE("%s: Invalid vdev id %d", __func__,
5293 obss_detection->vdev_id);
5294 qdf_mem_free(obss_detection);
5295 return -EINVAL;
5296 }
5297
5298 wma_send_msg(wma, WMA_OBSS_DETECTION_INFO, obss_detection, 0);
5299
5300 return 0;
5301}
Arif Hussain05fb4872018-01-03 16:02:55 -08005302
Abhishek Singhefe21e62019-09-20 10:03:24 +05305303static void wma_send_set_key_rsp(uint8_t vdev_id, bool pairwise,
Kiran Kumar Lokere7d6e4c92018-09-19 13:45:47 -07005304 uint8_t key_index)
5305{
5306 tSetStaKeyParams *key_info_uc;
5307 tSetBssKeyParams *key_info_mc;
5308 struct wlan_crypto_key *crypto_key;
5309 struct wlan_objmgr_vdev *vdev;
5310 tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA);
Varun Reddy Yeturuff4c9982019-02-15 15:59:24 -08005311 struct qdf_mac_addr bcast_mac = QDF_MAC_ADDR_BCAST_INIT;
Kiran Kumar Lokere7d6e4c92018-09-19 13:45:47 -07005312
5313 if (!wma) {
5314 wma_err("WMA context does not exist");
5315 return;
5316 }
5317 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(wma->psoc,
Abhishek Singhefe21e62019-09-20 10:03:24 +05305318 vdev_id,
Kiran Kumar Lokere7d6e4c92018-09-19 13:45:47 -07005319 WLAN_LEGACY_WMA_ID);
5320 if (!vdev) {
5321 wma_err("VDEV object not found");
5322 return;
5323 }
5324 crypto_key = wlan_crypto_get_key(vdev, key_index);
5325
5326 wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_WMA_ID);
5327 if (!crypto_key) {
Bapiraju Alla779675f2020-01-23 14:24:55 +05305328 wma_debug("crypto_key not found");
Kiran Kumar Lokere7d6e4c92018-09-19 13:45:47 -07005329 return;
5330 }
5331
5332 if (pairwise) {
5333 key_info_uc = qdf_mem_malloc(sizeof(*key_info_uc));
5334 if (!key_info_uc)
5335 return;
Abhishek Singhefe21e62019-09-20 10:03:24 +05305336 key_info_uc->vdev_id = vdev_id;
Kiran Kumar Lokere7d6e4c92018-09-19 13:45:47 -07005337 key_info_uc->status = QDF_STATUS_SUCCESS;
5338 key_info_uc->key[0].keyLength = crypto_key->keylen;
5339 qdf_mem_copy(&key_info_uc->macaddr, &crypto_key->macaddr,
5340 QDF_MAC_ADDR_SIZE);
5341 wma_send_msg_high_priority(wma, WMA_SET_STAKEY_RSP,
5342 key_info_uc, 0);
5343 } else {
5344 key_info_mc = qdf_mem_malloc(sizeof(*key_info_mc));
5345 if (!key_info_mc)
5346 return;
Abhishek Singhefe21e62019-09-20 10:03:24 +05305347 key_info_mc->vdev_id = vdev_id;
Kiran Kumar Lokere7d6e4c92018-09-19 13:45:47 -07005348 key_info_mc->status = QDF_STATUS_SUCCESS;
5349 key_info_mc->key[0].keyLength = crypto_key->keylen;
Varun Reddy Yeturuff4c9982019-02-15 15:59:24 -08005350 qdf_mem_copy(&key_info_mc->macaddr, &bcast_mac,
Kiran Kumar Lokere7d6e4c92018-09-19 13:45:47 -07005351 QDF_MAC_ADDR_SIZE);
5352 wma_send_msg_high_priority(wma, WMA_SET_BSSKEY_RSP,
5353 key_info_mc, 0);
5354 }
5355}
5356
Abhishek Singhf880a7d2019-04-29 14:51:11 +05305357static uint32_t wma_cipher_to_cap(enum wlan_crypto_cipher_type cipher)
5358{
5359 switch (cipher) {
5360 case WLAN_CRYPTO_CIPHER_WEP: return WLAN_CRYPTO_CAP_WEP;
5361 case WLAN_CRYPTO_CIPHER_WEP_40: return WLAN_CRYPTO_CAP_WEP;
5362 case WLAN_CRYPTO_CIPHER_WEP_104: return WLAN_CRYPTO_CAP_WEP;
5363 case WLAN_CRYPTO_CIPHER_AES_OCB: return WLAN_CRYPTO_CAP_AES;
5364 case WLAN_CRYPTO_CIPHER_AES_CCM: return WLAN_CRYPTO_CAP_AES;
5365 case WLAN_CRYPTO_CIPHER_AES_CCM_256: return WLAN_CRYPTO_CAP_AES;
5366 case WLAN_CRYPTO_CIPHER_AES_GCM: return WLAN_CRYPTO_CAP_AES;
5367 case WLAN_CRYPTO_CIPHER_AES_GCM_256: return WLAN_CRYPTO_CAP_AES;
5368 case WLAN_CRYPTO_CIPHER_CKIP: return WLAN_CRYPTO_CAP_CKIP;
5369 case WLAN_CRYPTO_CIPHER_TKIP: return WLAN_CRYPTO_CAP_TKIP_MIC;
5370 case WLAN_CRYPTO_CIPHER_WAPI_SMS4: return WLAN_CRYPTO_CAP_WAPI_SMS4;
5371 case WLAN_CRYPTO_CIPHER_WAPI_GCM4: return WLAN_CRYPTO_CAP_WAPI_GCM4;
5372 case WLAN_CRYPTO_CIPHER_FILS_AEAD: return WLAN_CRYPTO_CAP_FILS_AEAD;
5373 default: return 0;
5374 }
5375}
5376
5377void wma_set_peer_ucast_cipher(uint8_t *mac_addr,
5378 enum wlan_crypto_cipher_type cipher)
5379{
5380 int32_t set_val = 0, cipher_cap;
5381 struct wlan_objmgr_peer *peer;
5382 tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA);
5383
5384 if (!wma) {
5385 wma_err("wma context is NULL");
5386 return;
5387 }
5388
5389 peer = wlan_objmgr_get_peer(wma->psoc,
5390 wlan_objmgr_pdev_get_pdev_id(wma->pdev),
5391 mac_addr, WLAN_LEGACY_WMA_ID);
5392 if (!peer) {
5393 wma_err("Peer of peer_mac %pM not found", mac_addr);
5394 return;
5395 }
5396 cipher_cap = wma_cipher_to_cap(cipher);
5397 MLME_SET_BIT(set_val, cipher_cap);
5398 wlan_crypto_set_peer_param(peer, WLAN_CRYPTO_PARAM_CIPHER_CAP,
5399 set_val);
5400 set_val = 0;
5401 MLME_SET_BIT(set_val, cipher);
5402 wlan_crypto_set_peer_param(peer, WLAN_CRYPTO_PARAM_UCAST_CIPHER,
5403 set_val);
5404 wlan_objmgr_peer_release_ref(peer, WLAN_LEGACY_WMA_ID);
5405
5406 wma_debug("Set unicast cipher %x and cap %x for %pM", 1 << cipher,
5407 1 << cipher_cap, mac_addr);
5408}
5409
Kiran Kumar Lokere7d6e4c92018-09-19 13:45:47 -07005410static void wma_reset_ipn(struct wma_txrx_node *iface, uint8_t key_index)
5411{
5412 if (key_index == WMA_IGTK_KEY_INDEX_4 ||
5413 key_index == WMA_IGTK_KEY_INDEX_5)
5414 qdf_mem_zero(iface->key.key_id[key_index -
5415 WMA_IGTK_KEY_INDEX_4].ipn,
5416 CMAC_IPN_LEN);
5417}
5418
5419void wma_update_set_key(uint8_t session_id, bool pairwise,
5420 uint8_t key_index,
5421 enum wlan_crypto_cipher_type cipher_type)
5422{
5423 tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA);
5424 struct wma_txrx_node *iface;
5425
5426 if (!wma) {
5427 wma_err("Invalid WMA context");
5428 return;
5429 }
5430 iface = &wma->interfaces[session_id];
Qun Zhang114cdd82020-03-19 15:16:57 +08005431 if (!iface) {
5432 wma_err("iface not found for session id %d", session_id);
5433 return;
5434 }
Kiran Kumar Lokere47d0dac2019-01-24 18:38:33 -08005435
Abhishek Singh5be0e032019-04-29 15:35:05 +05305436 if (cipher_type == WLAN_CRYPTO_CIPHER_AES_GMAC ||
5437 cipher_type == WLAN_CRYPTO_CIPHER_AES_GMAC_256 ||
5438 cipher_type == WLAN_CRYPTO_CIPHER_AES_CMAC)
5439 iface->key.key_cipher =
5440 wlan_crypto_cipher_to_wmi_cipher(cipher_type);
5441
5442 if (iface) {
5443 wma_reset_ipn(iface, key_index);
5444 iface->is_waiting_for_key = false;
5445 }
Kiran Kumar Lokere7d6e4c92018-09-19 13:45:47 -07005446 if (!pairwise && iface) {
5447 /* Its GTK release the wake lock */
5448 wma_debug("Release set key wake lock");
Alan Chen34250b72019-08-12 16:06:35 -07005449 qdf_runtime_pm_allow_suspend(
5450 &iface->vdev_set_key_runtime_wakelock);
Kiran Kumar Lokere7d6e4c92018-09-19 13:45:47 -07005451 wma_release_wakelock(&iface->vdev_set_key_wakelock);
5452 }
Kiran Kumar Lokere7d6e4c92018-09-19 13:45:47 -07005453
5454 wma_send_set_key_rsp(session_id, pairwise, key_index);
5455}
Kiran Kumar Lokere7d6e4c92018-09-19 13:45:47 -07005456
Arif Hussain05fb4872018-01-03 16:02:55 -08005457int wma_vdev_bss_color_collision_info_handler(void *handle,
5458 uint8_t *event,
5459 uint32_t len)
5460{
5461 tp_wma_handle wma = (tp_wma_handle) handle;
5462 struct wmi_obss_color_collision_info *obss_color_info;
5463 QDF_STATUS status;
5464
5465 if (!event) {
5466 WMA_LOGE("Invalid obss_color_collision event buffer");
5467 return -EINVAL;
5468 }
5469
5470 obss_color_info = qdf_mem_malloc(sizeof(*obss_color_info));
Arif Hussain157263f2018-10-03 13:07:15 -07005471 if (!obss_color_info)
Arif Hussain05fb4872018-01-03 16:02:55 -08005472 return -ENOMEM;
Arif Hussain05fb4872018-01-03 16:02:55 -08005473
5474 status = wmi_unified_extract_obss_color_collision_info(wma->wmi_handle,
5475 event,
5476 obss_color_info);
5477
5478 if (QDF_IS_STATUS_ERROR(status)) {
5479 WMA_LOGE("%s: Failed to extract obss color info", __func__);
5480 qdf_mem_free(obss_color_info);
5481 return -EINVAL;
5482 }
5483
5484 if (!wma_is_vdev_valid(obss_color_info->vdev_id)) {
5485 WMA_LOGE("%s: Invalid vdev id %d", __func__,
5486 obss_color_info->vdev_id);
5487 qdf_mem_free(obss_color_info);
5488 return -EINVAL;
5489 }
5490
5491 wma_send_msg(wma, WMA_OBSS_COLOR_COLLISION_INFO, obss_color_info, 0);
5492
5493 return 0;
5494}
Sourav Mohapatra2a67b0e2019-10-15 17:59:59 +05305495
5496#ifdef FEATURE_ANI_LEVEL_REQUEST
5497int wma_get_ani_level_evt_handler(void *handle, uint8_t *event_buf,
5498 uint32_t len)
5499{
5500 tp_wma_handle wma = (tp_wma_handle)handle;
5501 struct wmi_host_ani_level_event *ani = NULL;
5502 uint32_t num_freqs = 0;
5503 QDF_STATUS status;
5504 struct mac_context *pmac;
5505 int ret = 0;
5506
5507 pmac = (struct mac_context *)cds_get_context(QDF_MODULE_ID_PE);
5508 if (!pmac || !wma) {
5509 WMA_LOGE(FL("Invalid pmac or wma"));
5510 return -EINVAL;
5511 }
5512
5513 status = wmi_unified_extract_ani_level(wma->wmi_handle, event_buf,
5514 &ani, &num_freqs);
5515
5516 if (QDF_IS_STATUS_ERROR(status)) {
5517 WMA_LOGE("%s: Failed to extract ani level", __func__);
5518 return -EINVAL;
5519 }
5520
5521 if (!pmac->ani_params.ani_level_cb) {
5522 WMA_LOGE(FL("Invalid ani_level_cb"));
5523 ret = -EINVAL;
5524 goto free;
5525 }
5526
5527 pmac->ani_params.ani_level_cb(ani, num_freqs,
5528 pmac->ani_params.context);
5529
5530free:
5531 qdf_mem_free(ani);
5532 return ret;
5533}
5534#else
5535int wma_get_ani_level_evt_handler(void *handle, uint8_t *event_buf,
5536 uint32_t len)
5537{
5538 return 0;
5539}
5540#endif
5541