blob: 3f01ed8e51db34d6ca939ad65f80fe01de519d33 [file] [log] [blame]
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001/*
Kiran Kumar Lokere7d6e4c92018-09-19 13:45:47 -07002 * Copyright (c) 2013-2019 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"
48
49#include "cds_utils.h"
50
51#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
Kiran Kumar Lokere7d6e4c92018-09-19 13:45:47 -070070#include <wlan_crypto_global_api.h>
Mukul Sharma00058692017-01-28 19:04:32 +053071
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080072#ifndef ARRAY_LENGTH
73#define ARRAY_LENGTH(a) (sizeof(a) / sizeof((a)[0]))
74#endif
75
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053076/**
77 * WMA_SET_VDEV_IE_SOURCE_HOST - Flag to identify the source of VDEV SET IE
78 * command. The value is 0x0 for the VDEV SET IE WMI commands from mobile
79 * MCL platform.
80 */
81#define WMA_SET_VDEV_IE_SOURCE_HOST 0x0
82
Yeshwanth Sriram Guntukaa10da362017-10-06 12:57:11 +053083
Naveen Rawat3ff5cff2018-01-29 14:31:16 -080084#if defined(FEATURE_WLAN_DIAG_SUPPORT)
Yeshwanth Sriram Guntukaa10da362017-10-06 12:57:11 +053085/**
86 * qdf_wma_wow_wakeup_stats_event()- send wow wakeup stats
87 * @tp_wma_handle wma: WOW wakeup packet counter
88 *
89 * This function sends wow wakeup stats diag event
90 *
91 * Return: void.
92 */
Naveen Rawat3ff5cff2018-01-29 14:31:16 -080093#ifdef QCA_SUPPORT_CP_STATS
94static inline void qdf_wma_wow_wakeup_stats_event(tp_wma_handle wma)
95{
96 QDF_STATUS status;
97 struct wake_lock_stats stats = {0};
98
99 WLAN_HOST_DIAG_EVENT_DEF(wow_stats,
100 struct host_event_wlan_powersave_wow_stats);
101
102 status = ucfg_mc_cp_stats_get_psoc_wake_lock_stats(wma->psoc, &stats);
103 if (QDF_IS_STATUS_ERROR(status))
104 return;
105 qdf_mem_zero(&wow_stats, sizeof(wow_stats));
106
107 wow_stats.wow_bcast_wake_up_count = stats.bcast_wake_up_count;
108 wow_stats.wow_ipv4_mcast_wake_up_count = stats.ipv4_mcast_wake_up_count;
109 wow_stats.wow_ipv6_mcast_wake_up_count = stats.ipv6_mcast_wake_up_count;
110 wow_stats.wow_ipv6_mcast_ra_stats = stats.ipv6_mcast_ra_stats;
111 wow_stats.wow_ipv6_mcast_ns_stats = stats.ipv6_mcast_ns_stats;
112 wow_stats.wow_ipv6_mcast_na_stats = stats.ipv6_mcast_na_stats;
113 wow_stats.wow_pno_match_wake_up_count = stats.pno_match_wake_up_count;
114 wow_stats.wow_pno_complete_wake_up_count =
115 stats.pno_complete_wake_up_count;
116 wow_stats.wow_gscan_wake_up_count = stats.gscan_wake_up_count;
117 wow_stats.wow_low_rssi_wake_up_count = stats.low_rssi_wake_up_count;
118 wow_stats.wow_rssi_breach_wake_up_count =
119 stats.rssi_breach_wake_up_count;
120 wow_stats.wow_icmpv4_count = stats.icmpv4_count;
121 wow_stats.wow_icmpv6_count = stats.icmpv6_count;
122 wow_stats.wow_oem_response_wake_up_count =
123 stats.oem_response_wake_up_count;
124
125 WLAN_HOST_DIAG_EVENT_REPORT(&wow_stats, EVENT_WLAN_POWERSAVE_WOW_STATS);
126}
127#else /* QCA_SUPPORT_CP_STATS*/
Yeshwanth Sriram Guntukaa10da362017-10-06 12:57:11 +0530128static inline void qdf_wma_wow_wakeup_stats_event(tp_wma_handle wma)
129{
130 QDF_STATUS status;
131 struct sir_wake_lock_stats stats;
132
133 WLAN_HOST_DIAG_EVENT_DEF(WowStats,
134 struct host_event_wlan_powersave_wow_stats);
135
136 status = wma_get_wakelock_stats(&stats);
137 if (QDF_IS_STATUS_ERROR(status))
138 return;
139 qdf_mem_zero(&WowStats, sizeof(WowStats));
140
141 WowStats.wow_bcast_wake_up_count =
142 stats.wow_bcast_wake_up_count;
143 WowStats.wow_ipv4_mcast_wake_up_count =
144 stats.wow_ipv4_mcast_wake_up_count;
145 WowStats.wow_ipv6_mcast_wake_up_count =
146 stats.wow_ipv6_mcast_wake_up_count;
147 WowStats.wow_ipv6_mcast_ra_stats =
148 stats.wow_ipv6_mcast_ra_stats;
149 WowStats.wow_ipv6_mcast_ns_stats =
150 stats.wow_ipv6_mcast_ns_stats;
151 WowStats.wow_ipv6_mcast_na_stats =
152 stats.wow_ipv6_mcast_na_stats;
153 WowStats.wow_pno_match_wake_up_count =
154 stats.wow_pno_match_wake_up_count;
155 WowStats.wow_pno_complete_wake_up_count =
156 stats.wow_pno_complete_wake_up_count;
157 WowStats.wow_gscan_wake_up_count =
158 stats.wow_gscan_wake_up_count;
159 WowStats.wow_low_rssi_wake_up_count =
160 stats.wow_low_rssi_wake_up_count;
161 WowStats.wow_rssi_breach_wake_up_count =
162 stats.wow_rssi_breach_wake_up_count;
163 WowStats.wow_icmpv4_count =
164 stats.wow_icmpv4_count;
165 WowStats.wow_icmpv6_count =
166 stats.wow_icmpv6_count;
167 WowStats.wow_oem_response_wake_up_count =
168 stats.wow_oem_response_wake_up_count;
169
170 WLAN_HOST_DIAG_EVENT_REPORT(&WowStats, EVENT_WLAN_POWERSAVE_WOW_STATS);
171}
Naveen Rawat3ff5cff2018-01-29 14:31:16 -0800172#endif /* QCA_SUPPORT_CP_STATS */
Yeshwanth Sriram Guntukaa10da362017-10-06 12:57:11 +0530173#else
174static inline void qdf_wma_wow_wakeup_stats_event(tp_wma_handle wma)
175{
176 return;
177}
178#endif
179
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800180#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
181/**
jiad391c5282018-11-26 16:21:04 +0800182 * wma_wake_reason_auto_shutdown() - to post auto shutdown event to sme
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800183 *
184 * Return: 0 for success or error code
185 */
Dustin Browne2206fb2017-04-20 13:39:25 -0700186static int wma_wake_reason_auto_shutdown(void)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800187{
188 tSirAutoShutdownEvtParams *auto_sh_evt;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530189 QDF_STATUS qdf_status;
Rajeev Kumarb60abe42017-01-21 15:39:31 -0800190 struct scheduler_msg sme_msg = { 0 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800191
Arif Hussain157263f2018-10-03 13:07:15 -0700192 auto_sh_evt = qdf_mem_malloc(sizeof(tSirAutoShutdownEvtParams));
193 if (!auto_sh_evt)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800194 return -ENOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800195
196 auto_sh_evt->shutdown_reason =
197 WMI_HOST_AUTO_SHUTDOWN_REASON_TIMER_EXPIRY;
198 sme_msg.type = eWNI_SME_AUTO_SHUTDOWN_IND;
199 sme_msg.bodyptr = auto_sh_evt;
200 sme_msg.bodyval = 0;
201
gaurank kathpalia00861f02018-08-28 19:16:12 +0530202 qdf_status = scheduler_post_message(QDF_MODULE_ID_WMA,
203 QDF_MODULE_ID_SME,
204 QDF_MODULE_ID_SME, &sme_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530205 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800206 WMA_LOGE("Fail to post eWNI_SME_AUTO_SHUTDOWN_IND msg to SME");
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530207 qdf_mem_free(auto_sh_evt);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800208 return -EINVAL;
209 }
210
211 return 0;
212}
Dustin Browne2206fb2017-04-20 13:39:25 -0700213#else
214static inline int wma_wake_reason_auto_shutdown(void)
215{
216 return 0;
217}
218#endif /* FEATURE_WLAN_AUTO_SHUTDOWN */
219
220#ifdef FEATURE_WLAN_SCAN_PNO
221static int wma_wake_reason_nlod(t_wma_handle *wma, uint8_t vdev_id)
222{
223 wmi_nlo_event nlo_event = { .vdev_id = vdev_id };
224 WMI_NLO_MATCH_EVENTID_param_tlvs param = { .fixed_param = &nlo_event };
225
226 return target_if_nlo_match_event_handler(wma, (uint8_t *)&param,
227 sizeof(param));
228}
229#else
Pragaspathi Thilagaraj24789d32018-12-10 22:28:03 +0530230static inline int wma_wake_reason_nlod(t_wma_handle *wma, uint8_t vdev_id)
Dustin Browne2206fb2017-04-20 13:39:25 -0700231{
232 return 0;
233}
234#endif /* FEATURE_WLAN_SCAN_PNO */
235
Nachiket Kukade6003bd22018-11-08 18:30:08 +0530236#ifdef WLAN_FEATURE_NAN
237/**
238 * wma_nan_rsp_handler_callback() - call NAN Discovery event handler
239 * @handle: wma handle
240 * @event: event buffer
241 * @len: buffer length
242 *
243 * Return: 0 for success or error code
244 */
245static int wma_nan_rsp_handler_callback(void *handle, uint8_t *event,
246 uint32_t len)
247{
248 return target_if_nan_rsp_handler(handle, event, len);
249}
250#else
251static inline int wma_nan_rsp_handler_callback(void *handle, uint8_t *event,
252 uint32_t len)
253{
254 return 0;
255}
256#endif
257
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800258/**
259 * wma_send_snr_request() - send request to fw to get RSSI stats
260 * @wma_handle: wma handle
261 * @pGetRssiReq: get RSSI request
262 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +0530263 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800264 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530265QDF_STATUS wma_send_snr_request(tp_wma_handle wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800266 void *pGetRssiReq)
267{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800268 tAniGetRssiReq *pRssiBkUp = NULL;
269
Jeff Johnsonc97816c2018-05-12 17:13:23 -0700270 /* command is in progress */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800271 if (NULL != wma_handle->pGetRssiReq)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530272 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800273
274 /* create a copy of csrRssiCallback to send rssi value
275 * after wmi event
276 */
277 if (pGetRssiReq) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530278 pRssiBkUp = qdf_mem_malloc(sizeof(tAniGetRssiReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800279 if (!pRssiBkUp) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800280 wma_handle->pGetRssiReq = NULL;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530281 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800282 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800283 pRssiBkUp->sessionId =
284 ((tAniGetRssiReq *) pGetRssiReq)->sessionId;
285 pRssiBkUp->rssiCallback =
286 ((tAniGetRssiReq *) pGetRssiReq)->rssiCallback;
287 pRssiBkUp->pDevContext =
288 ((tAniGetRssiReq *) pGetRssiReq)->pDevContext;
289 wma_handle->pGetRssiReq = (void *)pRssiBkUp;
290 }
291
Govind Singhaa64c242016-03-08 11:31:49 +0530292 if (wmi_unified_snr_request_cmd(wma_handle->wmi_handle)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800293 WMA_LOGE("Failed to send host stats request to fw");
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530294 qdf_mem_free(pRssiBkUp);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800295 wma_handle->pGetRssiReq = NULL;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530296 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800297 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530298 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800299}
300
301/**
302 * wma_get_snr() - get RSSI from fw
303 * @psnr_req: request params
304 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +0530305 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800306 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530307QDF_STATUS wma_get_snr(tAniGetSnrReq *psnr_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800308{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800309 tAniGetSnrReq *psnr_req_bkp;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800310 tp_wma_handle wma_handle = NULL;
311 struct wma_txrx_node *intr;
312
Anurag Chouhan6d760662016-02-20 16:05:43 +0530313 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800314
315 if (NULL == wma_handle) {
316 WMA_LOGE("%s : Failed to get wma_handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530317 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800318 }
319
320 intr = &wma_handle->interfaces[psnr_req->sessionId];
Jeff Johnsonc97816c2018-05-12 17:13:23 -0700321 /* command is in progress */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800322 if (NULL != intr->psnr_req) {
323 WMA_LOGE("%s : previous snr request is pending", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530324 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800325 }
326
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530327 psnr_req_bkp = qdf_mem_malloc(sizeof(tAniGetSnrReq));
Arif Hussain157263f2018-10-03 13:07:15 -0700328 if (!psnr_req_bkp)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530329 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800330
hangtian127c9532019-01-12 13:29:07 +0800331 qdf_mem_zero(psnr_req_bkp, sizeof(tAniGetSnrReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800332 psnr_req_bkp->staId = psnr_req->staId;
333 psnr_req_bkp->pDevContext = psnr_req->pDevContext;
334 psnr_req_bkp->snrCallback = psnr_req->snrCallback;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800335 intr->psnr_req = (void *)psnr_req_bkp;
Govind Singhaa64c242016-03-08 11:31:49 +0530336
337 if (wmi_unified_snr_cmd(wma_handle->wmi_handle,
338 psnr_req->sessionId)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800339 WMA_LOGE("Failed to send host stats request to fw");
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530340 qdf_mem_free(psnr_req_bkp);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800341 intr->psnr_req = NULL;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530342 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800343 }
344
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530345 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800346}
347
348/**
349 * wma_process_link_status_req() - process link status request from UMAC
350 * @wma: wma handle
351 * @pGetLinkStatus: get link params
352 *
353 * Return: none
354 */
355void wma_process_link_status_req(tp_wma_handle wma,
356 tAniGetLinkStatus *pGetLinkStatus)
357{
Govind Singhaa64c242016-03-08 11:31:49 +0530358 struct link_status_params cmd = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800359 struct wma_txrx_node *iface =
360 &wma->interfaces[pGetLinkStatus->sessionId];
361
362 if (iface->plink_status_req) {
363 WMA_LOGE("%s:previous link status request is pending,deleting the new request",
364 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530365 qdf_mem_free(pGetLinkStatus);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800366 return;
367 }
368
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800369 iface->plink_status_req = pGetLinkStatus;
Jeff Johnson999644a2019-01-15 12:21:02 -0800370 cmd.vdev_id = pGetLinkStatus->sessionId;
Govind Singhaa64c242016-03-08 11:31:49 +0530371 if (wmi_unified_link_status_req_cmd(wma->wmi_handle, &cmd)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800372 WMA_LOGE("Failed to send WMI link status request to fw");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800373 iface->plink_status_req = NULL;
374 goto end;
375 }
376
377 return;
378
379end:
380 wma_post_link_status(pGetLinkStatus, LINK_STATUS_LEGACY);
381}
382
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700383#ifdef WLAN_FEATURE_TSF
384/**
385 * wma_vdev_tsf_handler() - handle tsf event indicated by FW
386 * @handle: wma context
387 * @data: event buffer
388 * @data len: length of event buffer
389 *
390 * Return: 0 on success
391 */
392int wma_vdev_tsf_handler(void *handle, uint8_t *data, uint32_t data_len)
393{
Rajeev Kumarb60abe42017-01-21 15:39:31 -0800394 struct scheduler_msg tsf_msg = {0};
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700395 WMI_VDEV_TSF_REPORT_EVENTID_param_tlvs *param_buf;
396 wmi_vdev_tsf_report_event_fixed_param *tsf_event;
397 struct stsf *ptsf;
398
399 if (data == NULL) {
400 WMA_LOGE("%s: invalid pointer", __func__);
401 return -EINVAL;
402 }
403 ptsf = qdf_mem_malloc(sizeof(*ptsf));
Arif Hussain157263f2018-10-03 13:07:15 -0700404 if (!ptsf)
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700405 return -ENOMEM;
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700406
407 param_buf = (WMI_VDEV_TSF_REPORT_EVENTID_param_tlvs *)data;
408 tsf_event = param_buf->fixed_param;
409
410 ptsf->vdev_id = tsf_event->vdev_id;
411 ptsf->tsf_low = tsf_event->tsf_low;
412 ptsf->tsf_high = tsf_event->tsf_high;
Manikandan Mohan5356c2b2016-04-03 15:51:35 -0700413 ptsf->soc_timer_low = tsf_event->qtimer_low;
414 ptsf->soc_timer_high = tsf_event->qtimer_high;
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700415
Arif Hussain157263f2018-10-03 13:07:15 -0700416 wma_nofl_debug("receive WMI_VDEV_TSF_REPORT_EVENTID on %d, tsf: %d %d",
417 ptsf->vdev_id, ptsf->tsf_low, ptsf->tsf_high);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700418
419 tsf_msg.type = eWNI_SME_TSF_EVENT;
420 tsf_msg.bodyptr = ptsf;
421 tsf_msg.bodyval = 0;
422
423 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia00861f02018-08-28 19:16:12 +0530424 scheduler_post_message(QDF_MODULE_ID_WMA,
425 QDF_MODULE_ID_SME,
426 QDF_MODULE_ID_SME, &tsf_msg)) {
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700427 qdf_mem_free(ptsf);
428 return -EINVAL;
429 }
430 return 0;
431}
432
Manikandan Mohan5356c2b2016-04-03 15:51:35 -0700433#ifdef QCA_WIFI_3_0
434#define TSF_FW_ACTION_CMD TSF_TSTAMP_QTIMER_CAPTURE_REQ
435#else
436#define TSF_FW_ACTION_CMD TSF_TSTAMP_CAPTURE_REQ
437#endif
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700438/**
439 * wma_capture_tsf() - send wmi to fw to capture tsf
440 * @wma_handle: wma handler
441 * @vdev_id: vdev id
442 *
443 * Return: wmi send state
444 */
445QDF_STATUS wma_capture_tsf(tp_wma_handle wma_handle, uint32_t vdev_id)
446{
447 QDF_STATUS status = QDF_STATUS_SUCCESS;
448 wmi_buf_t buf;
449 wmi_vdev_tsf_tstamp_action_cmd_fixed_param *cmd;
450 int ret;
451 int len = sizeof(*cmd);
452
453 buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -0700454 if (!buf)
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700455 return QDF_STATUS_E_NOMEM;
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700456
457 cmd = (wmi_vdev_tsf_tstamp_action_cmd_fixed_param *) wmi_buf_data(buf);
458 cmd->vdev_id = vdev_id;
Manikandan Mohan5356c2b2016-04-03 15:51:35 -0700459 cmd->tsf_action = TSF_FW_ACTION_CMD;
460 WMA_LOGD("%s :vdev_id %u, tsf_cmd: %d", __func__, cmd->vdev_id,
461 cmd->tsf_action);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700462
463 WMITLV_SET_HDR(&cmd->tlv_header,
464 WMITLV_TAG_STRUC_wmi_vdev_tsf_tstamp_action_cmd_fixed_param,
465 WMITLV_GET_STRUCT_TLVLEN(
466 wmi_vdev_tsf_tstamp_action_cmd_fixed_param));
467
468 ret = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
469 WMI_VDEV_TSF_TSTAMP_ACTION_CMDID);
470 if (ret != EOK) {
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700471 status = QDF_STATUS_E_FAILURE;
472 goto error;
473 }
474
475 return QDF_STATUS_SUCCESS;
476
477error:
478 if (buf)
479 wmi_buf_free(buf);
480 return status;
481}
482
483/**
484 * wma_reset_tsf_gpio() - send wmi to fw to reset GPIO
485 * @wma_handle: wma handler
486 * @vdev_id: vdev id
487 *
488 * Return: wmi send state
489 */
490QDF_STATUS wma_reset_tsf_gpio(tp_wma_handle wma_handle, uint32_t vdev_id)
491{
492 QDF_STATUS status = QDF_STATUS_SUCCESS;
493 wmi_buf_t buf;
494 wmi_vdev_tsf_tstamp_action_cmd_fixed_param *cmd;
495 int ret;
496 int len = sizeof(*cmd);
497 uint8_t *buf_ptr;
498
499 buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -0700500 if (!buf)
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700501 return QDF_STATUS_E_NOMEM;
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700502
503 buf_ptr = (uint8_t *) wmi_buf_data(buf);
504 cmd = (wmi_vdev_tsf_tstamp_action_cmd_fixed_param *) buf_ptr;
505 cmd->vdev_id = vdev_id;
506 cmd->tsf_action = TSF_TSTAMP_CAPTURE_RESET;
507
508 WMA_LOGD("%s :vdev_id %u, TSF_TSTAMP_CAPTURE_RESET", __func__,
509 cmd->vdev_id);
510
511 WMITLV_SET_HDR(&cmd->tlv_header,
512 WMITLV_TAG_STRUC_wmi_vdev_tsf_tstamp_action_cmd_fixed_param,
513 WMITLV_GET_STRUCT_TLVLEN(
514 wmi_vdev_tsf_tstamp_action_cmd_fixed_param));
515
516 ret = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
517 WMI_VDEV_TSF_TSTAMP_ACTION_CMDID);
518
519 if (ret != EOK) {
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700520 status = QDF_STATUS_E_FAILURE;
521 goto error;
522 }
523 return QDF_STATUS_SUCCESS;
524
525error:
526 if (buf)
527 wmi_buf_free(buf);
528 return status;
529}
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700530
Manikandan Mohan976e7562016-03-15 16:33:31 -0700531/**
532 * wma_set_tsf_gpio_pin() - send wmi cmd to configure gpio pin
533 * @handle: wma handler
534 * @pin: GPIO pin id
535 *
536 * Return: QDF_STATUS
537 */
538QDF_STATUS wma_set_tsf_gpio_pin(WMA_HANDLE handle, uint32_t pin)
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700539{
Manikandan Mohan976e7562016-03-15 16:33:31 -0700540 tp_wma_handle wma = (tp_wma_handle)handle;
541 struct pdev_params pdev_param = {0};
542 int32_t ret;
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700543
Manikandan Mohan976e7562016-03-15 16:33:31 -0700544 if (!wma || !wma->wmi_handle) {
545 WMA_LOGE("%s: WMA is closed, can not set gpio", __func__);
546 return QDF_STATUS_E_INVAL;
547 }
548
549 WMA_LOGD("%s: set tsf gpio pin: %d", __func__, pin);
550
551 pdev_param.param_id = WMI_PDEV_PARAM_WNTS_CONFIG;
552 pdev_param.param_value = pin;
553 ret = wmi_unified_pdev_param_send(wma->wmi_handle,
554 &pdev_param,
555 WMA_WILDCARD_PDEV_ID);
556 if (ret) {
557 WMA_LOGE("%s: Failed to set tsf gpio pin (%d)", __func__, ret);
558 return QDF_STATUS_E_FAILURE;
559 }
560 return QDF_STATUS_SUCCESS;
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700561}
562#endif
563
Manikandan Mohan80dea792016-04-28 16:36:48 -0700564/**
565 * wma_set_wisa_params(): Set WISA features related params in FW
566 * @wma_handle: WMA handle
567 * @wisa: Pointer to WISA param struct
568 *
569 * Return: CDF status
570 */
571QDF_STATUS wma_set_wisa_params(tp_wma_handle wma_handle,
572 struct sir_wisa_params *wisa)
573{
574 QDF_STATUS status = QDF_STATUS_SUCCESS;
575 wmi_buf_t buf;
576 wmi_vdev_wisa_cmd_fixed_param *cmd;
577 int ret, len = sizeof(*cmd);
578
579 buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -0700580 if (!buf)
Manikandan Mohan80dea792016-04-28 16:36:48 -0700581 return QDF_STATUS_E_NOMEM;
Manikandan Mohan80dea792016-04-28 16:36:48 -0700582
583 cmd = (wmi_vdev_wisa_cmd_fixed_param *) wmi_buf_data(buf);
584 cmd->wisa_mode = wisa->mode;
585 cmd->vdev_id = wisa->vdev_id;
586
587 WMITLV_SET_HDR(&cmd->tlv_header,
588 WMITLV_TAG_STRUC_wmi_vdev_wisa_cmd_fixed_param,
589 WMITLV_GET_STRUCT_TLVLEN(
590 wmi_vdev_wisa_cmd_fixed_param));
591
592 ret = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
593 WMI_VDEV_WISA_CMDID);
594 if (ret != EOK) {
Manikandan Mohan80dea792016-04-28 16:36:48 -0700595 status = QDF_STATUS_E_FAILURE;
596 goto error;
597 }
598 return QDF_STATUS_SUCCESS;
599
600error:
601 wmi_buf_free(buf);
602 return status;
603}
604
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800605/**
606 * wma_process_dhcp_ind() - process dhcp indication from SME
607 * @wma_handle: wma handle
608 * @ta_dhcp_ind: DHCP indication
609 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +0530610 * Return: QDF Status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800611 */
Yun Parkc3e35562018-03-08 12:05:52 -0800612QDF_STATUS wma_process_dhcp_ind(WMA_HANDLE handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800613 tAniDHCPInd *ta_dhcp_ind)
614{
Yun Parkc3e35562018-03-08 12:05:52 -0800615 tp_wma_handle wma_handle = (tp_wma_handle) handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800616 uint8_t vdev_id;
617 int status = 0;
Govind Singhaa64c242016-03-08 11:31:49 +0530618 wmi_peer_set_param_cmd_fixed_param peer_set_param_fp = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800619
Pragaspathi Thilagaraj961a8b82018-05-03 14:16:44 +0530620 if (!wma_handle) {
621 WMA_LOGE("%s : wma_handle is NULL", __func__);
622 return QDF_STATUS_E_FAILURE;
623 }
624
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800625 if (!ta_dhcp_ind) {
626 WMA_LOGE("%s : DHCP indication is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530627 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800628 }
629
Srinivas Girigowda296105a2015-09-24 16:31:16 -0700630 if (!wma_find_vdev_by_addr(wma_handle,
631 ta_dhcp_ind->adapterMacAddr.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800632 &vdev_id)) {
633 WMA_LOGE("%s: Failed to find vdev id for DHCP indication",
634 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530635 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800636 }
637
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700638 WMA_LOGD("%s: WMA --> WMI_PEER_SET_PARAM triggered by DHCP, msgType=%s, device_mode=%d, macAddr=" MAC_ADDRESS_STR,
639 __func__, ta_dhcp_ind->msgType == WMA_DHCP_START_IND ?
640 "WMA_DHCP_START_IND" : "WMA_DHCP_STOP_IND",
641 ta_dhcp_ind->device_mode,
642 MAC_ADDR_ARRAY(ta_dhcp_ind->peerMacAddr.bytes));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800643
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800644 /* fill in values */
Govind Singhaa64c242016-03-08 11:31:49 +0530645 peer_set_param_fp.vdev_id = vdev_id;
646 peer_set_param_fp.param_id = WMI_PEER_CRIT_PROTO_HINT_ENABLED;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800647 if (WMA_DHCP_START_IND == ta_dhcp_ind->msgType)
Govind Singhaa64c242016-03-08 11:31:49 +0530648 peer_set_param_fp.param_value = 1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800649 else
Govind Singhaa64c242016-03-08 11:31:49 +0530650 peer_set_param_fp.param_value = 0;
Srinivas Girigowda296105a2015-09-24 16:31:16 -0700651 WMI_CHAR_ARRAY_TO_MAC_ADDR(ta_dhcp_ind->peerMacAddr.bytes,
Govind Singhaa64c242016-03-08 11:31:49 +0530652 &peer_set_param_fp.peer_macaddr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800653
Govind Singhaa64c242016-03-08 11:31:49 +0530654 status = wmi_unified_process_dhcp_ind(wma_handle->wmi_handle,
655 &peer_set_param_fp);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700656 if (status != EOK)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530657 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800658
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530659 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800660}
661
662/**
Amar Singhal046eb8a2016-05-05 12:50:15 -0700663 * wma_chan_phy__mode() - get WLAN_PHY_MODE for channel
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800664 * @chan: channel number
Amar Singhal046eb8a2016-05-05 12:50:15 -0700665 * @chan_width: maximum channel width possible
666 * @dot11_mode: maximum phy_mode possible
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800667 *
Amar Singhal046eb8a2016-05-05 12:50:15 -0700668 * Return: return WLAN_PHY_MODE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800669 */
Krunal Sonibd7e8932018-10-03 11:14:51 -0700670WLAN_PHY_MODE wma_chan_phy_mode(uint8_t chan, enum phy_ch_width chan_width,
671 uint8_t dot11_mode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800672{
673 WLAN_PHY_MODE phymode = MODE_UNKNOWN;
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -0700674 uint16_t bw_val = wlan_reg_get_bw_value(chan_width);
Kiran Kumar Lokere1a43bcf2018-05-15 15:51:58 -0700675 t_wma_handle *wma = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800676
Jiachao Wu52c060a2018-07-23 18:17:14 +0800677 if (!wma) {
678 WMA_LOGE("%s : wma_handle is NULL", __func__);
679 return MODE_UNKNOWN;
680 }
681
Ashish Kumar Dhanotiyacd311c82018-09-14 10:55:10 +0530682 if (chan_width >= CH_WIDTH_INVALID) {
683 WMA_LOGE("%s : Invalid channel width", __func__);
684 return MODE_UNKNOWN;
685 }
686
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -0700687 if (WLAN_REG_IS_24GHZ_CH(chan)) {
Amar Singhal046eb8a2016-05-05 12:50:15 -0700688 if (((CH_WIDTH_5MHZ == chan_width) ||
689 (CH_WIDTH_10MHZ == chan_width)) &&
gaurank kathpalia0c48d3d2019-01-29 15:03:07 +0530690 ((MLME_DOT11_MODE_11B == dot11_mode) ||
691 (MLME_DOT11_MODE_11G == dot11_mode) ||
692 (MLME_DOT11_MODE_11N == dot11_mode) ||
693 (MLME_DOT11_MODE_ALL == dot11_mode) ||
694 (MLME_DOT11_MODE_11AC == dot11_mode) ||
695 (MLME_DOT11_MODE_11AX == dot11_mode)))
Amar Singhal046eb8a2016-05-05 12:50:15 -0700696 phymode = MODE_11G;
697 else {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800698 switch (dot11_mode) {
gaurank kathpalia0c48d3d2019-01-29 15:03:07 +0530699 case MLME_DOT11_MODE_11B:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700700 if ((bw_val == 20) || (bw_val == 40))
Amar Singhal046eb8a2016-05-05 12:50:15 -0700701 phymode = MODE_11B;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800702 break;
gaurank kathpalia0c48d3d2019-01-29 15:03:07 +0530703 case MLME_DOT11_MODE_11G:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700704 if ((bw_val == 20) || (bw_val == 40))
Amar Singhal046eb8a2016-05-05 12:50:15 -0700705 phymode = MODE_11G;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800706 break;
gaurank kathpalia0c48d3d2019-01-29 15:03:07 +0530707 case MLME_DOT11_MODE_11G_ONLY:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700708 if ((bw_val == 20) || (bw_val == 40))
Amar Singhal046eb8a2016-05-05 12:50:15 -0700709 phymode = MODE_11GONLY;
710 break;
gaurank kathpalia0c48d3d2019-01-29 15:03:07 +0530711 case MLME_DOT11_MODE_11N:
712 case MLME_DOT11_MODE_11N_ONLY:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700713 if (bw_val == 20)
Amar Singhal046eb8a2016-05-05 12:50:15 -0700714 phymode = MODE_11NG_HT20;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700715 else if (bw_val == 40)
Amar Singhal046eb8a2016-05-05 12:50:15 -0700716 phymode = MODE_11NG_HT40;
717 break;
gaurank kathpalia0c48d3d2019-01-29 15:03:07 +0530718 case MLME_DOT11_MODE_ALL:
719 case MLME_DOT11_MODE_11AC:
720 case MLME_DOT11_MODE_11AC_ONLY:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700721 if (bw_val == 20)
Amar Singhal046eb8a2016-05-05 12:50:15 -0700722 phymode = MODE_11AC_VHT20_2G;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700723 else if (bw_val == 40)
Amar Singhal046eb8a2016-05-05 12:50:15 -0700724 phymode = MODE_11AC_VHT40_2G;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800725 break;
gaurank kathpalia0c48d3d2019-01-29 15:03:07 +0530726 case MLME_DOT11_MODE_11AX:
727 case MLME_DOT11_MODE_11AX_ONLY:
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -0800728 if (20 == bw_val)
729 phymode = MODE_11AX_HE20_2G;
730 else if (40 == bw_val)
731 phymode = MODE_11AX_HE40_2G;
732 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800733 default:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800734 break;
735 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800736 }
Kiran Kumar Lokere1a43bcf2018-05-15 15:51:58 -0700737 } else if (wlan_reg_is_dsrc_chan(wma->pdev, chan))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800738 phymode = MODE_11A;
Amar Singhal046eb8a2016-05-05 12:50:15 -0700739 else {
740 if (((CH_WIDTH_5MHZ == chan_width) ||
741 (CH_WIDTH_10MHZ == chan_width)) &&
gaurank kathpalia0c48d3d2019-01-29 15:03:07 +0530742 ((MLME_DOT11_MODE_11A == dot11_mode) ||
743 (MLME_DOT11_MODE_11N == dot11_mode) ||
744 (MLME_DOT11_MODE_ALL == dot11_mode) ||
745 (MLME_DOT11_MODE_11AC == dot11_mode) ||
746 (MLME_DOT11_MODE_11AX == dot11_mode)))
Amar Singhal046eb8a2016-05-05 12:50:15 -0700747 phymode = MODE_11A;
748 else {
749 switch (dot11_mode) {
gaurank kathpalia0c48d3d2019-01-29 15:03:07 +0530750 case MLME_DOT11_MODE_11A:
Amar Singhal046eb8a2016-05-05 12:50:15 -0700751 if (0 < bw_val)
752 phymode = MODE_11A;
753 break;
gaurank kathpalia0c48d3d2019-01-29 15:03:07 +0530754 case MLME_DOT11_MODE_11N:
755 case MLME_DOT11_MODE_11N_ONLY:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700756 if (bw_val == 20)
Amar Singhal046eb8a2016-05-05 12:50:15 -0700757 phymode = MODE_11NA_HT20;
758 else if (40 <= bw_val)
759 phymode = MODE_11NA_HT40;
760 break;
gaurank kathpalia0c48d3d2019-01-29 15:03:07 +0530761 case MLME_DOT11_MODE_ALL:
762 case MLME_DOT11_MODE_11AC:
763 case MLME_DOT11_MODE_11AC_ONLY:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700764 if (bw_val == 20)
Amar Singhal046eb8a2016-05-05 12:50:15 -0700765 phymode = MODE_11AC_VHT20;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700766 else if (bw_val == 40)
Amar Singhal046eb8a2016-05-05 12:50:15 -0700767 phymode = MODE_11AC_VHT40;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700768 else if (bw_val == 80)
Amar Singhal046eb8a2016-05-05 12:50:15 -0700769 phymode = MODE_11AC_VHT80;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700770 else if (chan_width == CH_WIDTH_160MHZ)
Amar Singhal046eb8a2016-05-05 12:50:15 -0700771 phymode = MODE_11AC_VHT160;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700772 else if (chan_width == CH_WIDTH_80P80MHZ)
Amar Singhal046eb8a2016-05-05 12:50:15 -0700773 phymode = MODE_11AC_VHT80_80;
774 break;
gaurank kathpalia0c48d3d2019-01-29 15:03:07 +0530775 case MLME_DOT11_MODE_11AX:
776 case MLME_DOT11_MODE_11AX_ONLY:
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -0800777 if (20 == bw_val)
778 phymode = MODE_11AX_HE20;
779 else if (40 == bw_val)
780 phymode = MODE_11AX_HE40;
781 else if (80 == bw_val)
782 phymode = MODE_11AX_HE80;
783 else if (CH_WIDTH_160MHZ == chan_width)
784 phymode = MODE_11AX_HE160;
785 else if (CH_WIDTH_80P80MHZ == chan_width)
786 phymode = MODE_11AX_HE80_80;
787 break;
Amar Singhal046eb8a2016-05-05 12:50:15 -0700788 default:
789 break;
790 }
791 }
792 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800793
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700794 WMA_LOGD("%s: phymode %d channel %d ch_width %d dot11_mode %d",
795 __func__, phymode, chan, chan_width, dot11_mode);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800796
Amar Singhal046eb8a2016-05-05 12:50:15 -0700797 QDF_ASSERT(MODE_UNKNOWN != phymode);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800798 return phymode;
799}
800
801/**
802 * wma_get_link_speed() -send command to get linkspeed
803 * @handle: wma handle
804 * @pLinkSpeed: link speed info
805 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +0530806 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800807 */
Jeff Johnsone943bca2019-02-08 22:45:17 -0800808QDF_STATUS wma_get_link_speed(WMA_HANDLE handle,
809 struct link_speed_info *pLinkSpeed)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800810{
811 tp_wma_handle wma_handle = (tp_wma_handle) handle;
Govind Singhaa64c242016-03-08 11:31:49 +0530812 wmi_mac_addr peer_macaddr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800813
814 if (!wma_handle || !wma_handle->wmi_handle) {
815 WMA_LOGE("%s: WMA is closed, can not issue get link speed cmd",
816 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530817 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800818 }
Sourav Mohapatra89c85d12017-12-01 09:17:54 +0530819 if (!wmi_service_enabled(wma_handle->wmi_handle,
820 wmi_service_estimate_linkspeed)) {
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700821 WMA_LOGE("%s: Linkspeed feature bit not enabled Sending value 0 as link speed.",
822 __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800823 wma_send_link_speed(0);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530824 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800825 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800826 /* Copy the peer macaddress to the wma buffer */
Srinivas Girigowdadccab9a2015-11-19 14:31:14 -0800827 WMI_CHAR_ARRAY_TO_MAC_ADDR(pLinkSpeed->peer_macaddr.bytes,
Govind Singhaa64c242016-03-08 11:31:49 +0530828 &peer_macaddr);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700829 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 -0800830 __func__, pLinkSpeed->peer_macaddr.bytes,
Govind Singhaa64c242016-03-08 11:31:49 +0530831 peer_macaddr.mac_addr31to0,
832 peer_macaddr.mac_addr47to32);
Govind Singhaa64c242016-03-08 11:31:49 +0530833 if (wmi_unified_get_link_speed_cmd(wma_handle->wmi_handle,
834 peer_macaddr)) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530835 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800836 }
Govind Singhaa64c242016-03-08 11:31:49 +0530837
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530838 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800839}
840
Will Huanga9814592017-05-24 15:47:58 +0800841QDF_STATUS wma_get_peer_info(WMA_HANDLE handle,
842 struct sir_peer_info_req *peer_info_req)
843{
844 tp_wma_handle wma_handle = (tp_wma_handle)handle;
845 wmi_request_stats_cmd_fixed_param *cmd;
846 wmi_buf_t wmi_buf;
847 uint32_t len;
848 uint8_t *buf_ptr;
849
850 if (!wma_handle || !wma_handle->wmi_handle) {
851 WMA_LOGE("%s: WMA is closed, can not issue get rssi",
852 __func__);
853 return QDF_STATUS_E_INVAL;
854 }
855
856 len = sizeof(wmi_request_stats_cmd_fixed_param);
857 wmi_buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -0700858 if (!wmi_buf)
Will Huanga9814592017-05-24 15:47:58 +0800859 return QDF_STATUS_E_NOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -0700860
Will Huanga9814592017-05-24 15:47:58 +0800861 buf_ptr = (uint8_t *)wmi_buf_data(wmi_buf);
862
863 cmd = (wmi_request_stats_cmd_fixed_param *)buf_ptr;
864 WMITLV_SET_HDR(&cmd->tlv_header,
865 WMITLV_TAG_STRUC_wmi_request_stats_cmd_fixed_param,
866 WMITLV_GET_STRUCT_TLVLEN(wmi_request_stats_cmd_fixed_param));
867
868 cmd->stats_id = WMI_REQUEST_PEER_STAT;
869 cmd->vdev_id = peer_info_req->sessionid;
Will Huang496b36c2017-07-11 16:38:50 +0800870 WMI_CHAR_ARRAY_TO_MAC_ADDR(peer_info_req->peer_macaddr.bytes,
871 &cmd->peer_macaddr);
Will Huanga9814592017-05-24 15:47:58 +0800872 wma_handle->get_sta_peer_info = true;
873
874 if (wmi_unified_cmd_send(wma_handle->wmi_handle, wmi_buf, len,
875 WMI_REQUEST_STATS_CMDID)) {
Will Huanga9814592017-05-24 15:47:58 +0800876 wmi_buf_free(wmi_buf);
877 return QDF_STATUS_E_FAILURE;
878 }
879
880 qdf_mem_copy(&(wma_handle->peer_macaddr),
881 &(peer_info_req->peer_macaddr),
882 QDF_MAC_ADDR_SIZE);
883 return QDF_STATUS_SUCCESS;
884}
885
886QDF_STATUS wma_get_peer_info_ext(WMA_HANDLE handle,
887 struct sir_peer_info_ext_req *peer_info_req)
888{
889 tp_wma_handle wma_handle = (tp_wma_handle)handle;
890 wmi_request_peer_stats_info_cmd_fixed_param *cmd;
891 wmi_buf_t wmi_buf;
892 uint32_t len;
893 uint8_t *buf_ptr;
894
895 if (!wma_handle || !wma_handle->wmi_handle) {
896 WMA_LOGE("%s: WMA is closed, can not issue get rssi",
897 __func__);
898 return QDF_STATUS_E_INVAL;
899 }
900
901 WMA_LOGI("%s send WMI_REQUEST_PEER_STATS_INFO_CMDID", __func__);
902
903 len = sizeof(wmi_request_peer_stats_info_cmd_fixed_param);
904 wmi_buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -0700905 if (!wmi_buf)
Will Huanga9814592017-05-24 15:47:58 +0800906 return QDF_STATUS_E_NOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -0700907
Will Huanga9814592017-05-24 15:47:58 +0800908 buf_ptr = (uint8_t *)wmi_buf_data(wmi_buf);
909
910 cmd = (wmi_request_peer_stats_info_cmd_fixed_param *)buf_ptr;
911 WMITLV_SET_HDR(&cmd->tlv_header,
912 WMITLV_TAG_STRUC_wmi_request_peer_stats_info_cmd_fixed_param,
913 WMITLV_GET_STRUCT_TLVLEN(
914 wmi_request_peer_stats_info_cmd_fixed_param));
915 cmd->vdev_id = peer_info_req->sessionid;
916 cmd->request_type = WMI_REQUEST_ONE_PEER_STATS_INFO;
917 wma_handle->get_one_peer_info = true;
918 WMI_CHAR_ARRAY_TO_MAC_ADDR(peer_info_req->peer_macaddr.bytes,
919 &cmd->peer_macaddr);
920 cmd->reset_after_request = peer_info_req->reset_after_request;
921
922 if (wmi_unified_cmd_send(wma_handle->wmi_handle, wmi_buf, len,
923 WMI_REQUEST_PEER_STATS_INFO_CMDID)) {
Will Huanga9814592017-05-24 15:47:58 +0800924 wmi_buf_free(wmi_buf);
925 return QDF_STATUS_E_FAILURE;
926 }
927
928 WMA_LOGI("%s vdev_id %d, mac %pM, req_type %x, reset %x",
929 __func__,
930 cmd->vdev_id,
931 peer_info_req->peer_macaddr.bytes,
932 cmd->request_type,
933 cmd->reset_after_request);
934
935 qdf_mem_copy(&(wma_handle->peer_macaddr),
936 &(peer_info_req->peer_macaddr),
937 QDF_MAC_ADDR_SIZE);
938
939 return QDF_STATUS_SUCCESS;
940}
941
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -0700942/**
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700943 * wma_add_beacon_filter() - Issue WMI command to set beacon filter
944 * @wma: wma handler
945 * @filter_params: beacon_filter_param to set
946 *
947 * Return: Return QDF_STATUS
948 */
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -0700949QDF_STATUS wma_add_beacon_filter(WMA_HANDLE handle,
950 struct beacon_filter_param *filter_params)
951{
952 int i;
953 wmi_buf_t wmi_buf;
954 u_int8_t *buf;
955 A_UINT32 *ie_map;
956 int ret;
Kiran Kumar Lokeref9dc7912017-06-28 18:10:58 -0700957 struct wma_txrx_node *iface;
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -0700958 tp_wma_handle wma = (tp_wma_handle) handle;
Kiran Kumar Lokeref9dc7912017-06-28 18:10:58 -0700959
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -0700960 wmi_add_bcn_filter_cmd_fixed_param *cmd;
961 int len = sizeof(wmi_add_bcn_filter_cmd_fixed_param);
962
963 len += WMI_TLV_HDR_SIZE;
964 len += BCN_FLT_MAX_ELEMS_IE_LIST*sizeof(A_UINT32);
965
966 if (!wma || !wma->wmi_handle) {
967 WMA_LOGE("%s: WMA is closed, can not issue set beacon filter",
968 __func__);
969 return QDF_STATUS_E_INVAL;
970 }
971
Kiran Kumar Lokeref9dc7912017-06-28 18:10:58 -0700972 iface = &wma->interfaces[filter_params->vdev_id];
973 qdf_mem_copy(&iface->beacon_filter, filter_params,
974 sizeof(struct beacon_filter_param));
975 iface->beacon_filter_enabled = true;
976
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -0700977 wmi_buf = wmi_buf_alloc(wma->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -0700978 if (!wmi_buf)
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -0700979 return QDF_STATUS_E_NOMEM;
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -0700980
981 buf = (u_int8_t *) wmi_buf_data(wmi_buf);
982
983 cmd = (wmi_add_bcn_filter_cmd_fixed_param *)wmi_buf_data(wmi_buf);
984 cmd->vdev_id = filter_params->vdev_id;
985
986 WMITLV_SET_HDR(&cmd->tlv_header,
987 WMITLV_TAG_STRUC_wmi_add_bcn_filter_cmd_fixed_param,
988 WMITLV_GET_STRUCT_TLVLEN(
989 wmi_add_bcn_filter_cmd_fixed_param));
990
991 buf += sizeof(wmi_add_bcn_filter_cmd_fixed_param);
992
993 WMITLV_SET_HDR(buf, WMITLV_TAG_ARRAY_UINT32,
994 (BCN_FLT_MAX_ELEMS_IE_LIST * sizeof(u_int32_t)));
995
996 ie_map = (A_UINT32 *)(buf + WMI_TLV_HDR_SIZE);
997 for (i = 0; i < BCN_FLT_MAX_ELEMS_IE_LIST; i++) {
998 ie_map[i] = filter_params->ie_map[i];
999 WMA_LOGD("beacon filter ie map = %u", ie_map[i]);
1000 }
1001
1002 ret = wmi_unified_cmd_send(wma->wmi_handle, wmi_buf, len,
1003 WMI_ADD_BCN_FILTER_CMDID);
1004 if (ret) {
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -07001005 wmi_buf_free(wmi_buf);
1006 return QDF_STATUS_E_FAILURE;
1007 }
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -07001008
1009 return QDF_STATUS_SUCCESS;
1010}
1011
1012/**
1013* wma_remove_beacon_filter() - Issue WMI command to remove beacon filter
1014* @wma: wma handler
1015* @filter_params: beacon_filter_params
1016*
1017* Return: Return QDF_STATUS
1018*/
1019QDF_STATUS wma_remove_beacon_filter(WMA_HANDLE handle,
1020 struct beacon_filter_param *filter_params)
1021{
1022 wmi_buf_t buf;
1023 tp_wma_handle wma = (tp_wma_handle) handle;
1024 wmi_rmv_bcn_filter_cmd_fixed_param *cmd;
1025 int len = sizeof(wmi_rmv_bcn_filter_cmd_fixed_param);
1026 int ret;
1027
1028 if (!wma || !wma->wmi_handle) {
1029 WMA_LOGE("%s: WMA is closed, cannot issue remove beacon filter",
1030 __func__);
1031 return QDF_STATUS_E_INVAL;
1032 }
1033
1034 buf = wmi_buf_alloc(wma->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07001035 if (!buf)
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -07001036 return QDF_STATUS_E_NOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -07001037
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -07001038 cmd = (wmi_rmv_bcn_filter_cmd_fixed_param *)wmi_buf_data(buf);
1039 cmd->vdev_id = filter_params->vdev_id;
1040
1041 WMITLV_SET_HDR(&cmd->tlv_header,
1042 WMITLV_TAG_STRUC_wmi_rmv_bcn_filter_cmd_fixed_param,
1043 WMITLV_GET_STRUCT_TLVLEN(
1044 wmi_rmv_bcn_filter_cmd_fixed_param));
1045
1046 ret = wmi_unified_cmd_send(wma->wmi_handle, buf, len,
1047 WMI_RMV_BCN_FILTER_CMDID);
1048 if (ret) {
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -07001049 wmi_buf_free(buf);
1050 return QDF_STATUS_E_FAILURE;
1051 }
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -07001052
1053 return QDF_STATUS_SUCCESS;
1054}
1055
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +05301056/**
1057 * wma_send_adapt_dwelltime_params() - send adaptive dwelltime configuration
1058 * params to firmware
1059 * @wma_handle: wma handler
1060 * @dwelltime_params: pointer to dwelltime_params
1061 *
1062 * Return: QDF_STATUS_SUCCESS on success and QDF failure reason code for failure
1063 */
1064QDF_STATUS wma_send_adapt_dwelltime_params(WMA_HANDLE handle,
1065 struct adaptive_dwelltime_params *dwelltime_params)
1066{
1067 tp_wma_handle wma_handle = (tp_wma_handle) handle;
1068 struct wmi_adaptive_dwelltime_params wmi_param = {0};
1069 int32_t err;
1070
1071 wmi_param.is_enabled = dwelltime_params->is_enabled;
1072 wmi_param.dwelltime_mode = dwelltime_params->dwelltime_mode;
1073 wmi_param.lpf_weight = dwelltime_params->lpf_weight;
1074 wmi_param.passive_mon_intval = dwelltime_params->passive_mon_intval;
1075 wmi_param.wifi_act_threshold = dwelltime_params->wifi_act_threshold;
1076 err = wmi_unified_send_adapt_dwelltime_params_cmd(wma_handle->
1077 wmi_handle, &wmi_param);
1078 if (err)
1079 return QDF_STATUS_E_FAILURE;
1080
1081 return QDF_STATUS_SUCCESS;
1082}
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -07001083
Nitesh Shahf9a09ff2017-05-22 15:46:25 +05301084QDF_STATUS wma_send_dbs_scan_selection_params(WMA_HANDLE handle,
1085 struct wmi_dbs_scan_sel_params *dbs_scan_params)
1086{
1087 tp_wma_handle wma_handle = (tp_wma_handle) handle;
1088 int32_t err;
1089
1090 err = wmi_unified_send_dbs_scan_sel_params_cmd(wma_handle->
1091 wmi_handle, dbs_scan_params);
1092 if (err)
1093 return QDF_STATUS_E_FAILURE;
1094
1095 return QDF_STATUS_SUCCESS;
1096}
1097
Govind Singha471e5e2015-10-12 17:11:14 +05301098/**
Govind Singhaa64c242016-03-08 11:31:49 +05301099 * wma_unified_fw_profiling_cmd() - send FW profiling cmd to WLAN FW
Govind Singha471e5e2015-10-12 17:11:14 +05301100 * @wma: wma handle
1101 * @cmd: Profiling command index
1102 * @value1: parameter1 value
1103 * @value2: parameter2 value
1104 *
1105 * Return: 0 for success else error code
1106 */
Govind Singhaa64c242016-03-08 11:31:49 +05301107QDF_STATUS wma_unified_fw_profiling_cmd(wmi_unified_t wmi_handle,
Govind Singha471e5e2015-10-12 17:11:14 +05301108 uint32_t cmd, uint32_t value1, uint32_t value2)
1109{
Govind Singha471e5e2015-10-12 17:11:14 +05301110 int ret;
Govind Singha471e5e2015-10-12 17:11:14 +05301111
Govind Singhaa64c242016-03-08 11:31:49 +05301112 ret = wmi_unified_fw_profiling_data_cmd(wmi_handle, cmd,
1113 value1, value2);
1114 if (ret) {
1115 WMA_LOGE("enable cmd Failed for id %d value %d",
1116 value1, value2);
1117 return ret;
Govind Singha471e5e2015-10-12 17:11:14 +05301118 }
1119
Govind Singhaa64c242016-03-08 11:31:49 +05301120 return QDF_STATUS_SUCCESS;
Govind Singha471e5e2015-10-12 17:11:14 +05301121}
1122
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001123/**
Naveen Rawatd7734142017-10-27 10:02:40 -07001124 * wma_wow_set_wake_time() - set timer pattern tlv, so that firmware will wake
1125 * up host after specified time is elapsed
1126 * @wma_handle: wma handle
1127 * @vdev_id: vdev id
1128 * @cookie: value to identify reason why host set up wake call.
1129 * @time: time in ms
1130 *
1131 * Return: QDF status
1132 */
1133static QDF_STATUS wma_wow_set_wake_time(WMA_HANDLE wma_handle, uint8_t vdev_id,
1134 uint32_t cookie, uint32_t time)
1135{
1136 int ret;
1137 tp_wma_handle wma = (tp_wma_handle)wma_handle;
1138
1139 WMA_LOGD(FL("send timer patter with time: %d and vdev = %d to fw"),
1140 time, vdev_id);
1141 ret = wmi_unified_wow_timer_pattern_cmd(wma->wmi_handle, vdev_id,
1142 cookie, time);
1143 if (ret) {
1144 WMA_LOGE(FL("Failed to send timer patter to fw"));
1145 return QDF_STATUS_E_FAILURE;
1146 }
1147
1148 return QDF_STATUS_SUCCESS;
1149}
1150
Qiwei Caidcb73b02018-09-17 19:58:29 +08001151#ifdef WLAN_POWER_MANAGEMENT_OFFLOAD
Naveen Rawatd7734142017-10-27 10:02:40 -07001152/**
1153 * wma_check_and_set_wake_timer(): checks all interfaces and if any interface
1154 * has install_key pending, sets timer pattern in fw to wake up host after
1155 * specified time has elapsed.
1156 * @wma: wma handle
1157 * @time: time after which host wants to be awaken.
1158 *
1159 * Return: None
1160 */
1161void wma_check_and_set_wake_timer(uint32_t time)
1162{
1163 int i;
1164 struct wma_txrx_node *iface;
Rajeev Kumarf31b9232018-01-19 14:35:20 -08001165 bool is_set_key_in_progress = false;
Naveen Rawatd7734142017-10-27 10:02:40 -07001166 t_wma_handle *wma = cds_get_context(QDF_MODULE_ID_WMA);
1167
Amar Singhal4c3fbb42018-01-02 13:20:28 -08001168 if (!wma) {
1169 WMA_LOGE("%s: WMA is closed",
1170 __func__);
1171 return;
1172 }
1173
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05301174 if (!wmi_service_enabled(wma->wmi_handle,
1175 wmi_service_wow_wakeup_by_timer_pattern)) {
Naveen Rawatd7734142017-10-27 10:02:40 -07001176 WMA_LOGD("TIME_PATTERN is not enabled");
1177 return;
1178 }
1179
1180 for (i = 0; i < wma->max_bssid; i++) {
1181 iface = &wma->interfaces[i];
Pragaspathi Thilagarajf81a8f02018-08-15 21:44:07 +05301182 if (iface->vdev_active && iface->is_waiting_for_key) {
Naveen Rawatd7734142017-10-27 10:02:40 -07001183 /*
1184 * right now cookie is dont care, since FW disregards
1185 * that.
1186 */
Rajeev Kumarf31b9232018-01-19 14:35:20 -08001187 is_set_key_in_progress = true;
Naveen Rawatd7734142017-10-27 10:02:40 -07001188 wma_wow_set_wake_time((WMA_HANDLE)wma, i, 0, time);
1189 break;
1190 }
1191 }
Rajeev Kumarf31b9232018-01-19 14:35:20 -08001192
1193 if (!is_set_key_in_progress)
1194 WMA_LOGD("set key not in progress for any vdev");
Naveen Rawatd7734142017-10-27 10:02:40 -07001195}
1196
1197/**
Govind Singhd76a5b02016-03-08 15:12:14 +05301198 * wma_unified_csa_offload_enable() - sen CSA offload enable command
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001199 * @wma: wma handle
1200 * @vdev_id: vdev id
1201 *
1202 * Return: 0 for success or error code
1203 */
Govind Singhd76a5b02016-03-08 15:12:14 +05301204int wma_unified_csa_offload_enable(tp_wma_handle wma, uint8_t vdev_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001205{
Govind Singhaa64c242016-03-08 11:31:49 +05301206 if (wmi_unified_csa_offload_enable(wma->wmi_handle,
1207 vdev_id)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001208 WMA_LOGP("%s: Failed to send CSA offload enable command",
1209 __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001210 return -EIO;
1211 }
Govind Singhaa64c242016-03-08 11:31:49 +05301212
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001213 return 0;
1214}
Qiwei Caidcb73b02018-09-17 19:58:29 +08001215#endif /* WLAN_POWER_MANAGEMENT_OFFLOAD */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001216
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001217/**
1218 * wma_csa_offload_handler() - CSA event handler
1219 * @handle: wma handle
1220 * @event: event buffer
1221 * @len: buffer length
1222 *
1223 * This event is sent by firmware when it receives CSA IE.
1224 *
1225 * Return: 0 for success or error code
1226 */
1227int wma_csa_offload_handler(void *handle, uint8_t *event, uint32_t len)
1228{
1229 tp_wma_handle wma = (tp_wma_handle) handle;
1230 WMI_CSA_HANDLING_EVENTID_param_tlvs *param_buf;
1231 wmi_csa_event_fixed_param *csa_event;
1232 uint8_t bssid[IEEE80211_ADDR_LEN];
1233 uint8_t vdev_id = 0;
1234 uint8_t cur_chan = 0;
1235 struct ieee80211_channelswitch_ie *csa_ie;
Chandrasekaran, Manishekar5c19dc52016-02-04 14:58:26 +05301236 struct csa_offload_params *csa_offload_event;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001237 struct ieee80211_extendedchannelswitch_ie *xcsa_ie;
1238 struct ieee80211_ie_wide_bw_switch *wb_ie;
1239 struct wma_txrx_node *intr = wma->interfaces;
1240
1241 param_buf = (WMI_CSA_HANDLING_EVENTID_param_tlvs *) event;
1242
1243 WMA_LOGD("%s: Enter", __func__);
1244 if (!param_buf) {
1245 WMA_LOGE("Invalid csa event buffer");
1246 return -EINVAL;
1247 }
1248 csa_event = param_buf->fixed_param;
1249 WMI_MAC_ADDR_TO_CHAR_ARRAY(&csa_event->i_addr2, &bssid[0]);
1250
1251 if (wma_find_vdev_by_bssid(wma, bssid, &vdev_id) == NULL) {
1252 WMA_LOGE("Invalid bssid received %s:%d", __func__, __LINE__);
1253 return -EINVAL;
1254 }
1255
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301256 csa_offload_event = qdf_mem_malloc(sizeof(*csa_offload_event));
Arif Hussain157263f2018-10-03 13:07:15 -07001257 if (!csa_offload_event)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001258 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001259
Tushnim Bhattacharyyaeb622b02018-05-07 13:50:51 -07001260 if (wma->interfaces[vdev_id].roaming_in_progress ||
1261 wma->interfaces[vdev_id].roam_synch_in_progress) {
1262 WMA_LOGE("Roaming in progress for vdev %d, ignore csa_offload_event",
1263 vdev_id);
1264 qdf_mem_free(csa_offload_event);
1265 return -EINVAL;
1266 }
1267
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301268 qdf_mem_zero(csa_offload_event, sizeof(*csa_offload_event));
1269 qdf_mem_copy(csa_offload_event->bssId, &bssid, IEEE80211_ADDR_LEN);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001270
1271 if (csa_event->ies_present_flag & WMI_CSA_IE_PRESENT) {
1272 csa_ie = (struct ieee80211_channelswitch_ie *)
1273 (&csa_event->csa_ie[0]);
1274 csa_offload_event->channel = csa_ie->newchannel;
Chandrasekaran, Manishekar5c19dc52016-02-04 14:58:26 +05301275 csa_offload_event->switch_mode = csa_ie->switchmode;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001276 } else if (csa_event->ies_present_flag & WMI_XCSA_IE_PRESENT) {
1277 xcsa_ie = (struct ieee80211_extendedchannelswitch_ie *)
1278 (&csa_event->xcsa_ie[0]);
1279 csa_offload_event->channel = xcsa_ie->newchannel;
Chandrasekaran, Manishekar5c19dc52016-02-04 14:58:26 +05301280 csa_offload_event->switch_mode = xcsa_ie->switchmode;
Gupta, Kapil121bf212015-11-25 19:21:29 +05301281 csa_offload_event->new_op_class = xcsa_ie->newClass;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001282 } else {
1283 WMA_LOGE("CSA Event error: No CSA IE present");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301284 qdf_mem_free(csa_offload_event);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001285 return -EINVAL;
1286 }
1287
1288 if (csa_event->ies_present_flag & WMI_WBW_IE_PRESENT) {
1289 wb_ie = (struct ieee80211_ie_wide_bw_switch *)
1290 (&csa_event->wb_ie[0]);
1291 csa_offload_event->new_ch_width = wb_ie->new_ch_width;
1292 csa_offload_event->new_ch_freq_seg1 = wb_ie->new_ch_freq_seg1;
1293 csa_offload_event->new_ch_freq_seg2 = wb_ie->new_ch_freq_seg2;
1294 }
1295
1296 csa_offload_event->ies_present_flag = csa_event->ies_present_flag;
1297
1298 WMA_LOGD("CSA: New Channel = %d BSSID:%pM",
1299 csa_offload_event->channel, csa_offload_event->bssId);
1300
1301 cur_chan = cds_freq_to_chan(intr[vdev_id].mhz);
1302 /*
1303 * basic sanity check: requested channel should not be 0
1304 * and equal to home channel
1305 */
Kiran Kumar Lokere75d636f2016-12-20 14:52:03 -08001306 if (0 == csa_offload_event->channel) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001307 WMA_LOGE("CSA Event with channel %d. Ignore !!",
1308 csa_offload_event->channel);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301309 qdf_mem_free(csa_offload_event);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001310 return -EINVAL;
1311 }
Abhishek Singhfb5b4d32018-12-06 11:53:08 +05301312
1313 wma_set_channel_switch_in_progress(&wma->interfaces[vdev_id]);
1314
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001315 wma_send_msg(wma, WMA_CSA_OFFLOAD_EVENT, (void *)csa_offload_event, 0);
1316 return 0;
1317}
1318
1319#ifdef FEATURE_OEM_DATA_SUPPORT
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001320/**
Krishna Kumaar Natarajan4e9cf392015-11-20 13:35:05 -08001321 * wma_oem_data_response_handler() - OEM data response event handler
1322 * @handle: wma handle
1323 * @datap: data ptr
1324 * @len: data length
1325 *
1326 * Return: 0 for success or error code
1327 */
1328int wma_oem_data_response_handler(void *handle,
1329 uint8_t *datap, uint32_t len)
1330{
Krishna Kumaar Natarajan4e9cf392015-11-20 13:35:05 -08001331 WMI_OEM_RESPONSE_EVENTID_param_tlvs *param_buf;
1332 uint8_t *data;
1333 uint32_t datalen;
Krishna Kumaar Natarajanc1fa17d2016-08-03 14:19:20 -07001334 struct oem_data_rsp *oem_rsp;
Jeff Johnson9f18aa72018-12-02 12:05:12 -08001335 struct mac_context *pmac = cds_get_context(QDF_MODULE_ID_PE);
Krishna Kumaar Natarajan73ea9f22016-06-30 18:38:47 -07001336
1337 if (!pmac) {
1338 WMA_LOGE(FL("Invalid pmac"));
1339 return -EINVAL;
1340 }
1341
Krishna Kumaar Natarajanbbbf2ef2016-08-03 14:06:26 -07001342 if (!pmac->sme.oem_data_rsp_callback) {
Krishna Kumaar Natarajan73ea9f22016-06-30 18:38:47 -07001343 WMA_LOGE(FL("Callback not registered"));
1344 return -EINVAL;
1345 }
Krishna Kumaar Natarajan4e9cf392015-11-20 13:35:05 -08001346
1347 param_buf = (WMI_OEM_RESPONSE_EVENTID_param_tlvs *) datap;
1348 if (!param_buf) {
1349 WMA_LOGE(FL("Received NULL buf ptr from FW"));
1350 return -ENOMEM;
1351 }
1352
1353 data = param_buf->data;
1354 datalen = param_buf->num_data;
1355
1356 if (!data) {
1357 WMA_LOGE(FL("Received NULL data from FW"));
1358 return -EINVAL;
1359 }
1360
1361 if (datalen > OEM_DATA_RSP_SIZE) {
1362 WMA_LOGE(FL("Received data len %d exceeds max value %d"),
1363 datalen, OEM_DATA_RSP_SIZE);
1364 return -EINVAL;
1365 }
1366
Krishna Kumaar Natarajan608291e2015-12-14 18:17:27 -08001367 oem_rsp = qdf_mem_malloc(sizeof(*oem_rsp));
Arif Hussain157263f2018-10-03 13:07:15 -07001368 if (!oem_rsp)
Krishna Kumaar Natarajan4e9cf392015-11-20 13:35:05 -08001369 return -ENOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -07001370
Krishna Kumaar Natarajan608291e2015-12-14 18:17:27 -08001371 oem_rsp->rsp_len = datalen;
Krishna Kumaar Natarajana96ee0f2016-03-10 16:57:45 -08001372 if (oem_rsp->rsp_len) {
Krishna Kumaar Natarajan73ea9f22016-06-30 18:38:47 -07001373 oem_rsp->data = qdf_mem_malloc(oem_rsp->rsp_len);
1374 if (!oem_rsp->data) {
Krishna Kumaar Natarajana96ee0f2016-03-10 16:57:45 -08001375 qdf_mem_free(oem_rsp);
1376 return -ENOMEM;
1377 }
1378 } else {
1379 WMA_LOGE(FL("Invalid rsp length: %d"),
1380 oem_rsp->rsp_len);
Krishna Kumaar Natarajan608291e2015-12-14 18:17:27 -08001381 qdf_mem_free(oem_rsp);
Krishna Kumaar Natarajana96ee0f2016-03-10 16:57:45 -08001382 return -EINVAL;
Krishna Kumaar Natarajan608291e2015-12-14 18:17:27 -08001383 }
Krishna Kumaar Natarajan4e9cf392015-11-20 13:35:05 -08001384
Krishna Kumaar Natarajan73ea9f22016-06-30 18:38:47 -07001385 qdf_mem_copy(oem_rsp->data, data, datalen);
Krishna Kumaar Natarajan4e9cf392015-11-20 13:35:05 -08001386
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08001387 WMA_LOGD("Sending OEM_DATA_RSP(len: %d) to upper layer", datalen);
Krishna Kumaar Natarajan4e9cf392015-11-20 13:35:05 -08001388
Krishna Kumaar Natarajanbbbf2ef2016-08-03 14:06:26 -07001389 pmac->sme.oem_data_rsp_callback(oem_rsp);
Krishna Kumaar Natarajan73ea9f22016-06-30 18:38:47 -07001390
1391 if (oem_rsp->data)
1392 qdf_mem_free(oem_rsp->data);
1393 qdf_mem_free(oem_rsp);
1394
Krishna Kumaar Natarajan4e9cf392015-11-20 13:35:05 -08001395 return 0;
1396}
1397
1398/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001399 * wma_start_oem_data_req() - start OEM data request to target
1400 * @wma_handle: wma handle
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07001401 * @oem_data_req: start request params
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001402 *
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07001403 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001404 */
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07001405QDF_STATUS wma_start_oem_data_req(tp_wma_handle wma_handle,
Krishna Kumaar Natarajanc1fa17d2016-08-03 14:19:20 -07001406 struct oem_data_req *oem_data_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001407{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001408 int ret = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001409
Krishna Kumaar Natarajan9ac8efd2015-11-20 13:40:24 -08001410 WMA_LOGD(FL("Send OEM Data Request to target"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001411
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07001412 if (!oem_data_req || !oem_data_req->data) {
1413 WMA_LOGE(FL("oem_data_req is null"));
1414 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001415 }
1416
1417 if (!wma_handle || !wma_handle->wmi_handle) {
Krishna Kumaar Natarajan9ac8efd2015-11-20 13:40:24 -08001418 WMA_LOGE(FL("WMA - closed, can not send Oem data request cmd"));
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07001419 qdf_mem_free(oem_data_req->data);
1420 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001421 }
1422
Govind Singhaa64c242016-03-08 11:31:49 +05301423 ret = wmi_unified_start_oem_data_cmd(wma_handle->wmi_handle,
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07001424 oem_data_req->data_len,
1425 oem_data_req->data);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001426
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07001427 if (!QDF_IS_STATUS_SUCCESS(ret))
1428 WMA_LOGE(FL("wmi cmd send failed"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001429
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07001430 return ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001431}
1432#endif /* FEATURE_OEM_DATA_SUPPORT */
1433
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001434#if !defined(REMOVE_PKT_LOG)
1435/**
1436 * wma_pktlog_wmi_send_cmd() - send pktlog enable/disable command to target
1437 * @handle: wma handle
1438 * @params: pktlog params
1439 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301440 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001441 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301442QDF_STATUS wma_pktlog_wmi_send_cmd(WMA_HANDLE handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001443 struct ath_pktlog_wmi_params *params)
1444{
1445 tp_wma_handle wma_handle = (tp_wma_handle) handle;
Govind Singhaa64c242016-03-08 11:31:49 +05301446 int ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001447
Govind Singhaa64c242016-03-08 11:31:49 +05301448 ret = wmi_unified_pktlog_wmi_send_cmd(wma_handle->wmi_handle,
Srinivas Girigowdac34f11d2016-02-25 16:02:42 -08001449 params->pktlog_event,
1450 params->cmd_id, params->user_triggered);
Govind Singhaa64c242016-03-08 11:31:49 +05301451 if (ret)
1452 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001453
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301454 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001455}
1456#endif /* REMOVE_PKT_LOG */
1457
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001458/**
1459 * wma_wow_wake_reason_str() - Converts wow wakeup reason code to text format
1460 * @wake_reason - WOW wake reason
1461 *
1462 * Return: reason code in string format
1463 */
Krunal Sonibd7e8932018-10-03 11:14:51 -07001464static const uint8_t *wma_wow_wake_reason_str(A_INT32 wake_reason)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001465{
1466 switch (wake_reason) {
1467 case WOW_REASON_UNSPECIFIED:
1468 return "UNSPECIFIED";
1469 case WOW_REASON_NLOD:
1470 return "NLOD";
1471 case WOW_REASON_AP_ASSOC_LOST:
1472 return "AP_ASSOC_LOST";
1473 case WOW_REASON_LOW_RSSI:
1474 return "LOW_RSSI";
1475 case WOW_REASON_DEAUTH_RECVD:
1476 return "DEAUTH_RECVD";
1477 case WOW_REASON_DISASSOC_RECVD:
1478 return "DISASSOC_RECVD";
1479 case WOW_REASON_GTK_HS_ERR:
1480 return "GTK_HS_ERR";
1481 case WOW_REASON_EAP_REQ:
1482 return "EAP_REQ";
1483 case WOW_REASON_FOURWAY_HS_RECV:
1484 return "FOURWAY_HS_RECV";
1485 case WOW_REASON_TIMER_INTR_RECV:
1486 return "TIMER_INTR_RECV";
1487 case WOW_REASON_PATTERN_MATCH_FOUND:
1488 return "PATTERN_MATCH_FOUND";
1489 case WOW_REASON_RECV_MAGIC_PATTERN:
1490 return "RECV_MAGIC_PATTERN";
1491 case WOW_REASON_P2P_DISC:
1492 return "P2P_DISC";
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001493 case WOW_REASON_WLAN_HB:
1494 return "WLAN_HB";
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001495 case WOW_REASON_CSA_EVENT:
1496 return "CSA_EVENT";
1497 case WOW_REASON_PROBE_REQ_WPS_IE_RECV:
Dustin Brown72f02252017-01-10 15:34:57 -08001498 return "PROBE_REQ_WPS_IE_RECV";
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001499 case WOW_REASON_AUTH_REQ_RECV:
1500 return "AUTH_REQ_RECV";
1501 case WOW_REASON_ASSOC_REQ_RECV:
1502 return "ASSOC_REQ_RECV";
1503 case WOW_REASON_HTT_EVENT:
Dustin Brown72f02252017-01-10 15:34:57 -08001504 return "HTT_EVENT";
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001505 case WOW_REASON_RA_MATCH:
Dustin Brown72f02252017-01-10 15:34:57 -08001506 return "RA_MATCH";
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001507 case WOW_REASON_HOST_AUTO_SHUTDOWN:
Dustin Brown72f02252017-01-10 15:34:57 -08001508 return "HOST_AUTO_SHUTDOWN";
1509 case WOW_REASON_IOAC_MAGIC_EVENT:
1510 return "IOAC_MAGIC_EVENT";
1511 case WOW_REASON_IOAC_SHORT_EVENT:
1512 return "IOAC_SHORT_EVENT";
1513 case WOW_REASON_IOAC_EXTEND_EVENT:
1514 return "IOAC_EXTEND_EVENT";
1515 case WOW_REASON_IOAC_TIMER_EVENT:
1516 return "IOAC_TIMER_EVENT";
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001517 case WOW_REASON_ROAM_HO:
Dustin Brown72f02252017-01-10 15:34:57 -08001518 return "ROAM_HO";
1519 case WOW_REASON_DFS_PHYERR_RADADR_EVENT:
1520 return "DFS_PHYERR_RADADR_EVENT";
1521 case WOW_REASON_BEACON_RECV:
1522 return "BEACON_RECV";
1523 case WOW_REASON_CLIENT_KICKOUT_EVENT:
1524 return "CLIENT_KICKOUT_EVENT";
Naveen Rawatc9f09522016-05-12 14:02:42 -07001525 case WOW_REASON_NAN_EVENT:
Dustin Brown72f02252017-01-10 15:34:57 -08001526 return "NAN_EVENT";
1527 case WOW_REASON_EXTSCAN:
1528 return "EXTSCAN";
1529 case WOW_REASON_RSSI_BREACH_EVENT:
1530 return "RSSI_BREACH_EVENT";
1531 case WOW_REASON_IOAC_REV_KA_FAIL_EVENT:
1532 return "IOAC_REV_KA_FAIL_EVENT";
1533 case WOW_REASON_IOAC_SOCK_EVENT:
1534 return "IOAC_SOCK_EVENT";
1535 case WOW_REASON_NLO_SCAN_COMPLETE:
1536 return "NLO_SCAN_COMPLETE";
1537 case WOW_REASON_PACKET_FILTER_MATCH:
1538 return "PACKET_FILTER_MATCH";
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05301539 case WOW_REASON_ASSOC_RES_RECV:
1540 return "ASSOC_RES_RECV";
1541 case WOW_REASON_REASSOC_REQ_RECV:
1542 return "REASSOC_REQ_RECV";
1543 case WOW_REASON_REASSOC_RES_RECV:
1544 return "REASSOC_RES_RECV";
1545 case WOW_REASON_ACTION_FRAME_RECV:
1546 return "ACTION_FRAME_RECV";
Arun Khandavalli3dd06de2016-08-17 10:20:29 +05301547 case WOW_REASON_BPF_ALLOW:
Nachiket Kukade177b5b02018-05-22 20:52:17 +05301548 return "BPF_ALLOW";
Rajeev Kumar969d1b12016-12-20 23:53:20 -08001549 case WOW_REASON_NAN_DATA:
Dustin Brown72f02252017-01-10 15:34:57 -08001550 return "NAN_DATA";
1551 case WOW_REASON_OEM_RESPONSE_EVENT:
1552 return "OEM_RESPONSE_EVENT";
Rajeev Kumar969d1b12016-12-20 23:53:20 -08001553 case WOW_REASON_TDLS_CONN_TRACKER_EVENT:
Dustin Brown72f02252017-01-10 15:34:57 -08001554 return "TDLS_CONN_TRACKER_EVENT";
Rajeev Kumar969d1b12016-12-20 23:53:20 -08001555 case WOW_REASON_CRITICAL_LOG:
Dustin Brown72f02252017-01-10 15:34:57 -08001556 return "CRITICAL_LOG";
Rajeev Kumar969d1b12016-12-20 23:53:20 -08001557 case WOW_REASON_P2P_LISTEN_OFFLOAD:
Dustin Brown72f02252017-01-10 15:34:57 -08001558 return "P2P_LISTEN_OFFLOAD";
Rajeev Kumar969d1b12016-12-20 23:53:20 -08001559 case WOW_REASON_NAN_EVENT_WAKE_HOST:
Dustin Brown72f02252017-01-10 15:34:57 -08001560 return "NAN_EVENT_WAKE_HOST";
1561 case WOW_REASON_DEBUG_TEST:
1562 return "DEBUG_TEST";
Ravi Kumar Bokka05c14e52017-03-27 14:48:23 +05301563 case WOW_REASON_CHIP_POWER_FAILURE_DETECT:
1564 return "CHIP_POWER_FAILURE_DETECT";
Amar Singhal5eb9acb2017-05-26 15:25:27 -07001565 case WOW_REASON_11D_SCAN:
1566 return "11D_SCAN";
Arif Hussain05fb4872018-01-03 16:02:55 -08001567 case WOW_REASON_SAP_OBSS_DETECTION:
1568 return "SAP_OBSS_DETECTION";
1569 case WOW_REASON_BSS_COLOR_COLLISION_DETECT:
1570 return "BSS_COLOR_COLLISION_DETECT";
Visweswara Tanuku633976b2019-01-07 16:13:12 +05301571#ifdef WLAN_FEATURE_MOTION_DETECTION
1572 case WOW_REASON_WLAN_MD:
1573 return "MOTION_DETECT";
1574 case WOW_REASON_WLAN_BL:
1575 return "MOTION_DETECT_BASELINE";
1576#endif /* WLAN_FEATURE_MOTION_DETECTION */
Dustin Brown72f02252017-01-10 15:34:57 -08001577 default:
1578 return "unknown";
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001579 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001580}
1581
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08001582#ifdef QCA_SUPPORT_CP_STATS
Dustin Brownb1032c22018-05-03 16:21:19 -07001583static bool wma_wow_reason_has_stats(enum wake_reason_e reason)
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08001584{
Dustin Brownb1032c22018-05-03 16:21:19 -07001585 switch (reason) {
1586 case WOW_REASON_ASSOC_REQ_RECV:
1587 case WOW_REASON_DISASSOC_RECVD:
1588 case WOW_REASON_ASSOC_RES_RECV:
1589 case WOW_REASON_REASSOC_REQ_RECV:
1590 case WOW_REASON_REASSOC_RES_RECV:
1591 case WOW_REASON_AUTH_REQ_RECV:
1592 case WOW_REASON_DEAUTH_RECVD:
1593 case WOW_REASON_ACTION_FRAME_RECV:
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08001594 case WOW_REASON_BPF_ALLOW:
1595 case WOW_REASON_PATTERN_MATCH_FOUND:
Will Huang3f7cb652018-11-28 10:41:24 +08001596 case WOW_REASON_PACKET_FILTER_MATCH:
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08001597 case WOW_REASON_RA_MATCH:
1598 case WOW_REASON_NLOD:
1599 case WOW_REASON_NLO_SCAN_COMPLETE:
1600 case WOW_REASON_LOW_RSSI:
1601 case WOW_REASON_EXTSCAN:
1602 case WOW_REASON_RSSI_BREACH_EVENT:
1603 case WOW_REASON_OEM_RESPONSE_EVENT:
1604 case WOW_REASON_CHIP_POWER_FAILURE_DETECT:
1605 case WOW_REASON_11D_SCAN:
Dustin Brownb1032c22018-05-03 16:21:19 -07001606 return true;
Visweswara Tanuku633976b2019-01-07 16:13:12 +05301607#ifdef WLAN_FEATURE_MOTION_DETECTION
1608 case WOW_REASON_WLAN_MD:
1609 case WOW_REASON_WLAN_BL:
1610 return true;
1611#endif /* WLAN_FEATURE_MOTION_DETECTION */
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08001612 default:
Dustin Brownb1032c22018-05-03 16:21:19 -07001613 return false;
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08001614 }
Dustin Brownb1032c22018-05-03 16:21:19 -07001615}
1616
1617static void wma_inc_wow_stats(t_wma_handle *wma,
1618 WOW_EVENT_INFO_fixed_param *wake_info)
1619{
1620 ucfg_mc_cp_stats_inc_wake_lock_stats(wma->psoc,
1621 wake_info->vdev_id,
1622 wake_info->wake_reason);
1623}
1624
1625static void wma_wow_stats_display(struct wake_lock_stats *stats)
1626{
1627 WMA_LOGA("WLAN wake reason counters:");
1628 WMA_LOGA("uc:%d bc:%d v4_mc:%d v6_mc:%d ra:%d ns:%d na:%d "
1629 "icmp:%d icmpv6:%d",
1630 stats->ucast_wake_up_count,
1631 stats->bcast_wake_up_count,
1632 stats->ipv4_mcast_wake_up_count,
1633 stats->ipv6_mcast_wake_up_count,
1634 stats->ipv6_mcast_ra_stats,
1635 stats->ipv6_mcast_ns_stats,
1636 stats->ipv6_mcast_na_stats,
1637 stats->icmpv4_count,
1638 stats->icmpv6_count);
1639
1640 WMA_LOGA("assoc:%d disassoc:%d assoc_resp:%d reassoc:%d "
1641 "reassoc_resp:%d auth:%d deauth:%d action:%d",
1642 stats->mgmt_assoc,
1643 stats->mgmt_disassoc,
1644 stats->mgmt_assoc_resp,
1645 stats->mgmt_reassoc,
1646 stats->mgmt_reassoc_resp,
1647 stats->mgmt_auth,
1648 stats->mgmt_deauth,
1649 stats->mgmt_action);
1650
1651 WMA_LOGA("pno_match:%d pno_complete:%d gscan:%d "
1652 "low_rssi:%d rssi_breach:%d oem:%d scan_11d:%d",
1653 stats->pno_match_wake_up_count,
1654 stats->pno_complete_wake_up_count,
1655 stats->gscan_wake_up_count,
1656 stats->low_rssi_wake_up_count,
1657 stats->rssi_breach_wake_up_count,
1658 stats->oem_response_wake_up_count,
1659 stats->scan_11d);
1660}
1661
1662static void wma_print_wow_stats(t_wma_handle *wma,
1663 WOW_EVENT_INFO_fixed_param *wake_info)
1664{
1665 struct wlan_objmgr_vdev *vdev;
1666 struct wake_lock_stats stats = {0};
1667
1668 if (!wma_wow_reason_has_stats(wake_info->wake_reason))
1669 return;
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08001670
1671 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(wma->psoc,
1672 wake_info->vdev_id,
1673 WLAN_LEGACY_WMA_ID);
1674 ucfg_mc_cp_stats_get_vdev_wake_lock_stats(vdev, &stats);
1675 wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_WMA_ID);
1676 wma_wow_stats_display(&stats);
1677}
1678#else
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001679/**
Dustin Brown9d797d62017-01-11 16:39:12 -08001680 * wma_wow_stats_display() - display wow wake up stats
1681 * @stats: per vdev stats counters
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001682 *
1683 * Return: none
1684 */
Dustin Brown9d797d62017-01-11 16:39:12 -08001685static void wma_wow_stats_display(struct sir_vdev_wow_stats *stats)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001686{
Sreelakshmi Konamkie1cd51f2016-08-19 16:58:24 +05301687 WMA_LOGA("uc %d bc %d v4_mc %d v6_mc %d ra %d ns %d na %d pno_match %d pno_complete %d gscan %d low_rssi %d rssi_breach %d icmp %d icmpv6 %d oem %d",
Dustin Brown9d797d62017-01-11 16:39:12 -08001688 stats->ucast,
1689 stats->bcast,
1690 stats->ipv4_mcast,
1691 stats->ipv6_mcast,
1692 stats->ipv6_mcast_ra,
1693 stats->ipv6_mcast_ns,
1694 stats->ipv6_mcast_na,
1695 stats->pno_match,
1696 stats->pno_complete,
1697 stats->gscan,
1698 stats->low_rssi,
1699 stats->rssi_breach,
1700 stats->icmpv4,
1701 stats->icmpv6,
1702 stats->oem_response);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001703}
1704
Dustin Browne2206fb2017-04-20 13:39:25 -07001705static void wma_print_wow_stats(t_wma_handle *wma,
1706 WOW_EVENT_INFO_fixed_param *wake_info)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001707{
Dustin Brown3c89c012017-05-01 12:17:32 -07001708 struct sir_vdev_wow_stats *stats;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001709
Dustin Browne2206fb2017-04-20 13:39:25 -07001710 switch (wake_info->wake_reason) {
1711 case WOW_REASON_BPF_ALLOW:
1712 case WOW_REASON_PATTERN_MATCH_FOUND:
Will Huang3f7cb652018-11-28 10:41:24 +08001713 case WOW_REASON_PACKET_FILTER_MATCH:
Dustin Browne2206fb2017-04-20 13:39:25 -07001714 case WOW_REASON_RA_MATCH:
1715 case WOW_REASON_NLOD:
1716 case WOW_REASON_NLO_SCAN_COMPLETE:
1717 case WOW_REASON_LOW_RSSI:
1718 case WOW_REASON_EXTSCAN:
1719 case WOW_REASON_RSSI_BREACH_EVENT:
1720 case WOW_REASON_OEM_RESPONSE_EVENT:
Ravi Kumar Bokka05c14e52017-03-27 14:48:23 +05301721 case WOW_REASON_CHIP_POWER_FAILURE_DETECT:
Amar Singhal5eb9acb2017-05-26 15:25:27 -07001722 case WOW_REASON_11D_SCAN:
Dustin Browne2206fb2017-04-20 13:39:25 -07001723 break;
Visweswara Tanuku633976b2019-01-07 16:13:12 +05301724#ifdef WLAN_FEATURE_MOTION_DETECTION
1725 case WOW_REASON_WLAN_MD:
1726 case WOW_REASON_WLAN_BL:
1727 break;
1728#endif /* WLAN_FEATURE_MOTION_DETECTION */
Dustin Browne2206fb2017-04-20 13:39:25 -07001729 default:
1730 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001731 }
1732
Dustin Brown3c89c012017-05-01 12:17:32 -07001733 stats = &wma->interfaces[wake_info->vdev_id].wow_stats;
1734 wma_wow_stats_display(stats);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001735}
1736
1737/**
Dustin Brown9d797d62017-01-11 16:39:12 -08001738 * wma_inc_wow_stats() - maintain wow pattern match wake up stats
Dustin Browne2206fb2017-04-20 13:39:25 -07001739 * @wma: wma handle, containing the stats counters
1740 * @wake_info: the wake event information
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001741 *
1742 * Return: none
1743 */
Dustin Browne2206fb2017-04-20 13:39:25 -07001744static void wma_inc_wow_stats(t_wma_handle *wma,
1745 WOW_EVENT_INFO_fixed_param *wake_info)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001746{
Dustin Browne2206fb2017-04-20 13:39:25 -07001747 struct sir_vdev_wow_stats *stats;
Dustin Brown9d797d62017-01-11 16:39:12 -08001748
Dustin Browne2206fb2017-04-20 13:39:25 -07001749 if (wake_info->wake_reason == WOW_REASON_UNSPECIFIED) {
1750 wma->wow_unspecified_wake_count++;
1751 return;
1752 }
Himanshu Agarwal11a08c02016-08-10 15:39:54 +05301753
Dustin Brown3c89c012017-05-01 12:17:32 -07001754 stats = &wma->interfaces[wake_info->vdev_id].wow_stats;
Dustin Browne2206fb2017-04-20 13:39:25 -07001755 switch (wake_info->wake_reason) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001756 case WOW_REASON_RA_MATCH:
Dustin Brown9d797d62017-01-11 16:39:12 -08001757 stats->ipv6_mcast++;
1758 stats->ipv6_mcast_ra++;
1759 stats->icmpv6++;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001760 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001761 case WOW_REASON_NLOD:
Dustin Brown9d797d62017-01-11 16:39:12 -08001762 stats->pno_match++;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001763 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001764 case WOW_REASON_NLO_SCAN_COMPLETE:
Dustin Brown9d797d62017-01-11 16:39:12 -08001765 stats->pno_complete++;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001766 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001767 case WOW_REASON_LOW_RSSI:
Dustin Brown9d797d62017-01-11 16:39:12 -08001768 stats->low_rssi++;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001769 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001770 case WOW_REASON_EXTSCAN:
Dustin Brown9d797d62017-01-11 16:39:12 -08001771 stats->gscan++;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001772 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001773 case WOW_REASON_RSSI_BREACH_EVENT:
Dustin Brown9d797d62017-01-11 16:39:12 -08001774 stats->rssi_breach++;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001775 break;
Selvaraj, Sridhar172cabc2016-07-05 15:19:24 +05301776 case WOW_REASON_OEM_RESPONSE_EVENT:
Dustin Brown9d797d62017-01-11 16:39:12 -08001777 stats->oem_response++;
gaurank kathpalia3a1059e2018-05-07 09:51:05 +05301778 break;
Amar Singhal5eb9acb2017-05-26 15:25:27 -07001779 case WOW_REASON_11D_SCAN:
1780 stats->scan_11d++;
Selvaraj, Sridhar172cabc2016-07-05 15:19:24 +05301781 break;
Ravi Kumar Bokka05c14e52017-03-27 14:48:23 +05301782 case WOW_REASON_CHIP_POWER_FAILURE_DETECT:
1783 stats->pwr_save_fail_detected++;
1784 break;
Visweswara Tanuku633976b2019-01-07 16:13:12 +05301785#ifdef WLAN_FEATURE_MOTION_DETECTION
1786 case WOW_REASON_WLAN_MD::
1787 stats->motion_detect++;
1788 break;
1789 case WOW_REASON_WLAN_BL:
1790 stats->motion_detect_bl++;
1791 break;
1792#endif /* WLAN_FEATURE_MOTION_DETECTION */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001793 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001794}
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08001795#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001796
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001797#ifdef FEATURE_WLAN_EXTSCAN
1798/**
1799 * wma_extscan_get_eventid_from_tlvtag() - map tlv tag to corresponding event id
1800 * @tag: WMI TLV tag
1801 *
1802 * Return:
1803 * 0 if TLV tag is invalid
1804 * else return corresponding WMI event id
1805 */
1806static int wma_extscan_get_eventid_from_tlvtag(uint32_t tag)
1807{
1808 uint32_t event_id;
1809
1810 switch (tag) {
1811 case WMITLV_TAG_STRUC_wmi_extscan_start_stop_event_fixed_param:
1812 event_id = WMI_EXTSCAN_START_STOP_EVENTID;
1813 break;
1814
1815 case WMITLV_TAG_STRUC_wmi_extscan_operation_event_fixed_param:
1816 event_id = WMI_EXTSCAN_OPERATION_EVENTID;
1817 break;
1818
1819 case WMITLV_TAG_STRUC_wmi_extscan_table_usage_event_fixed_param:
1820 event_id = WMI_EXTSCAN_TABLE_USAGE_EVENTID;
1821 break;
1822
1823 case WMITLV_TAG_STRUC_wmi_extscan_cached_results_event_fixed_param:
1824 event_id = WMI_EXTSCAN_CACHED_RESULTS_EVENTID;
1825 break;
1826
1827 case WMITLV_TAG_STRUC_wmi_extscan_wlan_change_results_event_fixed_param:
1828 event_id = WMI_EXTSCAN_WLAN_CHANGE_RESULTS_EVENTID;
1829 break;
1830
1831 case WMITLV_TAG_STRUC_wmi_extscan_hotlist_match_event_fixed_param:
1832 event_id = WMI_EXTSCAN_HOTLIST_MATCH_EVENTID;
1833 break;
1834
1835 case WMITLV_TAG_STRUC_wmi_extscan_capabilities_event_fixed_param:
1836 event_id = WMI_EXTSCAN_CAPABILITIES_EVENTID;
1837 break;
1838
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001839 default:
1840 event_id = 0;
1841 WMA_LOGE("%s: Unknown tag: %d", __func__, tag);
1842 break;
1843 }
1844
1845 WMA_LOGI("%s: For tag %d WMI event 0x%x", __func__, tag, event_id);
1846 return event_id;
1847}
1848#else
1849static int wma_extscan_get_eventid_from_tlvtag(uint32_t tag)
1850{
1851 return 0;
1852}
1853#endif
1854
1855/**
1856 * wow_get_wmi_eventid() - map reason or tlv tag to corresponding event id
1857 * @tag: WMI TLV tag
1858 * @reason: WOW reason
1859 *
1860 * WOW reason type is primarily used to find the ID. If there could be
1861 * multiple events that can be sent as a WOW event with same reason
1862 * then tlv tag is used to identify the corresponding event.
1863 *
1864 * Return:
1865 * 0 if TLV tag/reason is invalid
1866 * else return corresponding WMI event id
1867 */
1868static int wow_get_wmi_eventid(int32_t reason, uint32_t tag)
1869{
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001870 int event_id;
1871
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001872 switch (reason) {
Dustin Browne2206fb2017-04-20 13:39:25 -07001873 case WOW_REASON_AP_ASSOC_LOST:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001874 event_id = WMI_ROAM_EVENTID;
1875 break;
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001876 case WOW_REASON_NLO_SCAN_COMPLETE:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001877 event_id = WMI_NLO_SCAN_COMPLETE_EVENTID;
1878 break;
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001879 case WOW_REASON_CSA_EVENT:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001880 event_id = WMI_CSA_HANDLING_EVENTID;
1881 break;
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001882 case WOW_REASON_LOW_RSSI:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001883 event_id = WMI_ROAM_EVENTID;
1884 break;
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001885 case WOW_REASON_CLIENT_KICKOUT_EVENT:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001886 event_id = WMI_PEER_STA_KICKOUT_EVENTID;
1887 break;
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001888 case WOW_REASON_EXTSCAN:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001889 event_id = wma_extscan_get_eventid_from_tlvtag(tag);
1890 break;
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001891 case WOW_REASON_RSSI_BREACH_EVENT:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001892 event_id = WMI_RSSI_BREACH_EVENTID;
1893 break;
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001894 case WOW_REASON_NAN_EVENT:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001895 event_id = WMI_NAN_EVENTID;
1896 break;
Naveen Rawat17dccbe2016-08-23 17:09:04 -07001897 case WOW_REASON_NAN_DATA:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001898 event_id = wma_ndp_get_eventid_from_tlvtag(tag);
1899 break;
Selvaraj, Sridhar251761a2016-06-25 16:05:15 +05301900 case WOW_REASON_TDLS_CONN_TRACKER_EVENT:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001901 event_id = WOW_TDLS_CONN_TRACKER_EVENT;
1902 break;
Deepak Dhamdhere6d2c97a2017-02-04 22:09:27 -08001903 case WOW_REASON_ROAM_HO:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001904 event_id = WMI_ROAM_EVENTID;
1905 break;
Amar Singhal5eb9acb2017-05-26 15:25:27 -07001906 case WOW_REASON_11D_SCAN:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001907 event_id = WMI_11D_NEW_COUNTRY_EVENTID;
1908 break;
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001909 default:
Dustin Browne2206fb2017-04-20 13:39:25 -07001910 WMA_LOGD(FL("No Event Id for WOW reason %s(%d)"),
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001911 wma_wow_wake_reason_str(reason), reason);
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001912 event_id = 0;
1913 break;
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001914 }
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001915 wlan_roam_debug_log(WMA_INVALID_VDEV_ID, DEBUG_WOW_REASON,
1916 DEBUG_INVALID_PEER_ID, NULL, NULL,
1917 reason, event_id);
1918
1919 return event_id;
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001920}
1921
1922/**
Dustin Brown3c89c012017-05-01 12:17:32 -07001923 * is_piggybacked_event() - Returns true if the given wake reason indicates
1924 * there will be piggybacked TLV event data
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001925 * @reason: WOW reason
1926 *
Dustin Brown3c89c012017-05-01 12:17:32 -07001927 * There are three types of WoW event payloads: none, piggybacked event, and
1928 * network packet. This function returns true for wake reasons that fall into
1929 * the piggybacked event case.
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001930 *
Dustin Brown3c89c012017-05-01 12:17:32 -07001931 * Return: true for piggybacked event data
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001932 */
Dustin Browne2206fb2017-04-20 13:39:25 -07001933static bool is_piggybacked_event(int32_t reason)
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001934{
1935 switch (reason) {
Dustin Browne2206fb2017-04-20 13:39:25 -07001936 case WOW_REASON_AP_ASSOC_LOST:
Krishna Kumaar Natarajane1a59832016-09-07 12:19:24 -07001937 case WOW_REASON_NLO_SCAN_COMPLETE:
1938 case WOW_REASON_CSA_EVENT:
1939 case WOW_REASON_LOW_RSSI:
1940 case WOW_REASON_CLIENT_KICKOUT_EVENT:
1941 case WOW_REASON_EXTSCAN:
1942 case WOW_REASON_RSSI_BREACH_EVENT:
1943 case WOW_REASON_NAN_EVENT:
1944 case WOW_REASON_NAN_DATA:
Dustin Browne2206fb2017-04-20 13:39:25 -07001945 case WOW_REASON_TDLS_CONN_TRACKER_EVENT:
Deepak Dhamdhere6d2c97a2017-02-04 22:09:27 -08001946 case WOW_REASON_ROAM_HO:
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001947 return true;
Krishna Kumaar Natarajane1a59832016-09-07 12:19:24 -07001948 default:
1949 return false;
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001950 }
1951}
1952
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001953/**
Himanshu Agarwal82de9042016-07-20 18:11:03 +05301954 * wma_pkt_proto_subtype_to_string() - to convert proto subtype
1955 * of data packet to string.
1956 * @proto_subtype: proto subtype for data packet
1957 *
1958 * This function returns the string for the proto subtype of
1959 * data packet.
1960 *
1961 * Return: string for proto subtype for data packet
1962 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07001963static const char *
Himanshu Agarwal82de9042016-07-20 18:11:03 +05301964wma_pkt_proto_subtype_to_string(enum qdf_proto_subtype proto_subtype)
1965{
1966 switch (proto_subtype) {
1967 case QDF_PROTO_EAPOL_M1:
1968 return "EAPOL M1";
1969 case QDF_PROTO_EAPOL_M2:
1970 return "EAPOL M2";
1971 case QDF_PROTO_EAPOL_M3:
1972 return "EAPOL M3";
1973 case QDF_PROTO_EAPOL_M4:
1974 return "EAPOL M4";
1975 case QDF_PROTO_DHCP_DISCOVER:
1976 return "DHCP DISCOVER";
1977 case QDF_PROTO_DHCP_REQUEST:
1978 return "DHCP REQUEST";
1979 case QDF_PROTO_DHCP_OFFER:
1980 return "DHCP OFFER";
1981 case QDF_PROTO_DHCP_ACK:
1982 return "DHCP ACK";
1983 case QDF_PROTO_DHCP_NACK:
1984 return "DHCP NACK";
1985 case QDF_PROTO_DHCP_RELEASE:
1986 return "DHCP RELEASE";
1987 case QDF_PROTO_DHCP_INFORM:
1988 return "DHCP INFORM";
1989 case QDF_PROTO_DHCP_DECLINE:
1990 return "DHCP DECLINE";
1991 case QDF_PROTO_ARP_REQ:
1992 return "ARP REQUEST";
1993 case QDF_PROTO_ARP_RES:
1994 return "ARP RESPONSE";
1995 case QDF_PROTO_ICMP_REQ:
1996 return "ICMP REQUEST";
1997 case QDF_PROTO_ICMP_RES:
1998 return "ICMP RESPONSE";
1999 case QDF_PROTO_ICMPV6_REQ:
2000 return "ICMPV6 REQUEST";
2001 case QDF_PROTO_ICMPV6_RES:
2002 return "ICMPV6 RESPONSE";
Himanshu Agarwal471eaef2017-01-31 13:16:52 +05302003 case QDF_PROTO_ICMPV6_RS:
2004 return "ICMPV6 RS";
2005 case QDF_PROTO_ICMPV6_RA:
2006 return "ICMPV6 RA";
2007 case QDF_PROTO_ICMPV6_NS:
2008 return "ICMPV6 NS";
2009 case QDF_PROTO_ICMPV6_NA:
2010 return "ICMPV6 NA";
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302011 case QDF_PROTO_IPV4_UDP:
2012 return "IPV4 UDP Packet";
2013 case QDF_PROTO_IPV4_TCP:
2014 return "IPV4 TCP Packet";
2015 case QDF_PROTO_IPV6_UDP:
2016 return "IPV6 UDP Packet";
2017 case QDF_PROTO_IPV6_TCP:
2018 return "IPV6 TCP Packet";
2019 default:
Dustin Browne2206fb2017-04-20 13:39:25 -07002020 return NULL;
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302021 }
2022}
2023
2024/**
Dustin Brown3c89c012017-05-01 12:17:32 -07002025 * wma_wow_get_pkt_proto_subtype() - get the proto subtype of the packet.
2026 * @data: Pointer to the packet data buffer
2027 * @len: length of the packet data buffer
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302028 *
2029 * Return: proto subtype of the packet.
2030 */
2031static enum qdf_proto_subtype
Dustin Brown3c89c012017-05-01 12:17:32 -07002032wma_wow_get_pkt_proto_subtype(uint8_t *data, uint32_t len)
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302033{
Dustin Browne2206fb2017-04-20 13:39:25 -07002034 uint16_t eth_type;
2035 uint8_t proto_type;
Himanshu Agarwalec51a5a2016-07-20 19:47:26 +05302036
Dustin Browne2206fb2017-04-20 13:39:25 -07002037 if (len < QDF_NBUF_TRAC_ETH_TYPE_OFFSET + 2) {
2038 WMA_LOGE("Malformed ethernet packet: length %u < %d",
2039 len, QDF_NBUF_TRAC_ETH_TYPE_OFFSET + 2);
Himanshu Agarwalec51a5a2016-07-20 19:47:26 +05302040 return QDF_PROTO_INVALID;
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302041 }
2042
Dustin Browne2206fb2017-04-20 13:39:25 -07002043 eth_type = *(uint16_t *)(data + QDF_NBUF_TRAC_ETH_TYPE_OFFSET);
Dustin Brown3c89c012017-05-01 12:17:32 -07002044 eth_type = qdf_cpu_to_be16(eth_type);
Dustin Browne2206fb2017-04-20 13:39:25 -07002045
2046 WMA_LOGD("Ether Type: 0x%04x", eth_type);
2047 switch (eth_type) {
2048 case QDF_NBUF_TRAC_EAPOL_ETH_TYPE:
2049 if (len < WMA_EAPOL_SUBTYPE_GET_MIN_LEN)
2050 return QDF_PROTO_INVALID;
2051
2052 WMA_LOGD("EAPOL Packet");
2053 return qdf_nbuf_data_get_eapol_subtype(data);
2054
2055 case QDF_NBUF_TRAC_ARP_ETH_TYPE:
2056 if (len < WMA_ARP_SUBTYPE_GET_MIN_LEN)
2057 return QDF_PROTO_INVALID;
2058
2059 WMA_LOGD("ARP Packet");
2060 return qdf_nbuf_data_get_arp_subtype(data);
2061
2062 case QDF_NBUF_TRAC_IPV4_ETH_TYPE:
2063 if (len < WMA_IPV4_PROTO_GET_MIN_LEN)
2064 return QDF_PROTO_INVALID;
2065
2066 WMA_LOGD("IPV4 Packet");
2067
2068 proto_type = qdf_nbuf_data_get_ipv4_proto(data);
2069 WMA_LOGD("IPV4_proto_type: %u", proto_type);
2070
2071 switch (proto_type) {
2072 case QDF_NBUF_TRAC_ICMP_TYPE:
2073 if (len < WMA_ICMP_SUBTYPE_GET_MIN_LEN)
2074 return QDF_PROTO_INVALID;
2075
2076 WMA_LOGD("ICMP Packet");
2077 return qdf_nbuf_data_get_icmp_subtype(data);
2078
2079 case QDF_NBUF_TRAC_UDP_TYPE:
2080 if (len < WMA_IS_DHCP_GET_MIN_LEN)
2081 return QDF_PROTO_IPV4_UDP;
2082
2083 if (!qdf_nbuf_data_is_ipv4_dhcp_pkt(data))
2084 return QDF_PROTO_INVALID;
2085
2086 if (len < WMA_DHCP_SUBTYPE_GET_MIN_LEN)
2087 return QDF_PROTO_INVALID;
2088
2089 WMA_LOGD("DHCP Packet");
2090 return qdf_nbuf_data_get_dhcp_subtype(data);
2091
2092 case QDF_NBUF_TRAC_TCP_TYPE:
2093 return QDF_PROTO_IPV4_TCP;
2094
2095 default:
2096 return QDF_PROTO_INVALID;
2097 }
2098
2099 case QDF_NBUF_TRAC_IPV6_ETH_TYPE:
2100 if (len < WMA_IPV6_PROTO_GET_MIN_LEN)
2101 return QDF_PROTO_INVALID;
2102
2103 WMA_LOGD("IPV6 Packet");
2104
2105 proto_type = qdf_nbuf_data_get_ipv6_proto(data);
2106 WMA_LOGD("IPV6_proto_type: %u", proto_type);
2107
2108 switch (proto_type) {
2109 case QDF_NBUF_TRAC_ICMPV6_TYPE:
2110 if (len < WMA_ICMPV6_SUBTYPE_GET_MIN_LEN)
2111 return QDF_PROTO_INVALID;
2112
2113 WMA_LOGD("ICMPV6 Packet");
2114 return qdf_nbuf_data_get_icmpv6_subtype(data);
2115
2116 case QDF_NBUF_TRAC_UDP_TYPE:
2117 return QDF_PROTO_IPV6_UDP;
2118
2119 case QDF_NBUF_TRAC_TCP_TYPE:
2120 return QDF_PROTO_IPV6_TCP;
2121
2122 default:
2123 return QDF_PROTO_INVALID;
2124 }
2125
2126 default:
2127 return QDF_PROTO_INVALID;
2128 }
2129}
2130
Dustin Browne2206fb2017-04-20 13:39:25 -07002131static void wma_log_pkt_eapol(uint8_t *data, uint32_t length)
2132{
2133 uint16_t pkt_len, key_len;
2134
2135 if (length < WMA_EAPOL_INFO_GET_MIN_LEN)
2136 return;
2137
2138 pkt_len = *(uint16_t *)(data + EAPOL_PKT_LEN_OFFSET);
2139 key_len = *(uint16_t *)(data + EAPOL_KEY_LEN_OFFSET);
2140 WMA_LOGD("Pkt_len: %u, Key_len: %u",
Dustin Brown3c89c012017-05-01 12:17:32 -07002141 qdf_cpu_to_be16(pkt_len), qdf_cpu_to_be16(key_len));
Dustin Browne2206fb2017-04-20 13:39:25 -07002142}
2143
2144static void wma_log_pkt_dhcp(uint8_t *data, uint32_t length)
2145{
2146 uint16_t pkt_len;
2147 uint32_t trans_id;
2148
2149 if (length < WMA_DHCP_INFO_GET_MIN_LEN)
2150 return;
2151
2152 pkt_len = *(uint16_t *)(data + DHCP_PKT_LEN_OFFSET);
2153 trans_id = *(uint32_t *)(data + DHCP_TRANSACTION_ID_OFFSET);
2154 WMA_LOGD("Pkt_len: %u, Transaction_id: %u",
Dustin Brown3c89c012017-05-01 12:17:32 -07002155 qdf_cpu_to_be16(pkt_len), qdf_cpu_to_be16(trans_id));
Dustin Browne2206fb2017-04-20 13:39:25 -07002156}
2157
2158static void wma_log_pkt_icmpv4(uint8_t *data, uint32_t length)
2159{
2160 uint16_t pkt_len, seq_num;
2161
2162 if (length < WMA_IPV4_PKT_INFO_GET_MIN_LEN)
2163 return;
2164
2165 pkt_len = *(uint16_t *)(data + IPV4_PKT_LEN_OFFSET);
2166 seq_num = *(uint16_t *)(data + ICMP_SEQ_NUM_OFFSET);
2167 WMA_LOGD("Pkt_len: %u, Seq_num: %u",
Dustin Brown3c89c012017-05-01 12:17:32 -07002168 qdf_cpu_to_be16(pkt_len), qdf_cpu_to_be16(seq_num));
Dustin Browne2206fb2017-04-20 13:39:25 -07002169}
2170
2171static void wma_log_pkt_icmpv6(uint8_t *data, uint32_t length)
2172{
2173 uint16_t pkt_len, seq_num;
2174
2175 if (length < WMA_IPV6_PKT_INFO_GET_MIN_LEN)
2176 return;
2177
2178 pkt_len = *(uint16_t *)(data + IPV6_PKT_LEN_OFFSET);
2179 seq_num = *(uint16_t *)(data + ICMPV6_SEQ_NUM_OFFSET);
2180 WMA_LOGD("Pkt_len: %u, Seq_num: %u",
Dustin Brown3c89c012017-05-01 12:17:32 -07002181 qdf_cpu_to_be16(pkt_len), qdf_cpu_to_be16(seq_num));
Dustin Browne2206fb2017-04-20 13:39:25 -07002182}
2183
2184static void wma_log_pkt_ipv4(uint8_t *data, uint32_t length)
2185{
2186 uint16_t pkt_len, src_port, dst_port;
Sravan Kumar Kairam4402a262017-08-07 10:45:24 +05302187 char *ip_addr;
Dustin Browne2206fb2017-04-20 13:39:25 -07002188
2189 if (length < WMA_IPV4_PKT_INFO_GET_MIN_LEN)
2190 return;
2191
2192 pkt_len = *(uint16_t *)(data + IPV4_PKT_LEN_OFFSET);
Sravan Kumar Kairam4402a262017-08-07 10:45:24 +05302193 ip_addr = (char *)(data + IPV4_SRC_ADDR_OFFSET);
2194 WMA_LOGD("src addr %d:%d:%d:%d", ip_addr[0], ip_addr[1],
2195 ip_addr[2], ip_addr[3]);
2196 ip_addr = (char *)(data + IPV4_DST_ADDR_OFFSET);
2197 WMA_LOGD("dst addr %d:%d:%d:%d", ip_addr[0], ip_addr[1],
2198 ip_addr[2], ip_addr[3]);
Dustin Browne2206fb2017-04-20 13:39:25 -07002199 src_port = *(uint16_t *)(data + IPV4_SRC_PORT_OFFSET);
2200 dst_port = *(uint16_t *)(data + IPV4_DST_PORT_OFFSET);
Srinivas Girigowdae1be8772018-05-07 16:16:27 -07002201 WMA_LOGI("Pkt_len: %u, src_port: %u, dst_port: %u",
Dustin Brown3c89c012017-05-01 12:17:32 -07002202 qdf_cpu_to_be16(pkt_len),
2203 qdf_cpu_to_be16(src_port),
2204 qdf_cpu_to_be16(dst_port));
Dustin Browne2206fb2017-04-20 13:39:25 -07002205}
2206
2207static void wma_log_pkt_ipv6(uint8_t *data, uint32_t length)
2208{
2209 uint16_t pkt_len, src_port, dst_port;
Sravan Kumar Kairam4402a262017-08-07 10:45:24 +05302210 char *ip_addr;
Dustin Browne2206fb2017-04-20 13:39:25 -07002211
2212 if (length < WMA_IPV6_PKT_INFO_GET_MIN_LEN)
2213 return;
2214
2215 pkt_len = *(uint16_t *)(data + IPV6_PKT_LEN_OFFSET);
Sravan Kumar Kairam4402a262017-08-07 10:45:24 +05302216 ip_addr = (char *)(data + IPV6_SRC_ADDR_OFFSET);
2217 WMA_LOGD("src addr "IPV6_ADDR_STR, ip_addr[0],
2218 ip_addr[1], ip_addr[2], ip_addr[3], ip_addr[4],
2219 ip_addr[5], ip_addr[6], ip_addr[7], ip_addr[8],
2220 ip_addr[9], ip_addr[10], ip_addr[11],
2221 ip_addr[12], ip_addr[13], ip_addr[14],
2222 ip_addr[15]);
2223 ip_addr = (char *)(data + IPV6_DST_ADDR_OFFSET);
2224 WMA_LOGD("dst addr "IPV6_ADDR_STR, ip_addr[0],
2225 ip_addr[1], ip_addr[2], ip_addr[3], ip_addr[4],
2226 ip_addr[5], ip_addr[6], ip_addr[7], ip_addr[8],
2227 ip_addr[9], ip_addr[10], ip_addr[11],
2228 ip_addr[12], ip_addr[13], ip_addr[14],
2229 ip_addr[15]);
Dustin Browne2206fb2017-04-20 13:39:25 -07002230 src_port = *(uint16_t *)(data + IPV6_SRC_PORT_OFFSET);
2231 dst_port = *(uint16_t *)(data + IPV6_DST_PORT_OFFSET);
Srinivas Girigowdae1be8772018-05-07 16:16:27 -07002232 WMA_LOGI("Pkt_len: %u, src_port: %u, dst_port: %u",
Dustin Brown3c89c012017-05-01 12:17:32 -07002233 qdf_cpu_to_be16(pkt_len),
2234 qdf_cpu_to_be16(src_port),
2235 qdf_cpu_to_be16(dst_port));
Dustin Browne2206fb2017-04-20 13:39:25 -07002236}
2237
2238static void wma_log_pkt_tcpv4(uint8_t *data, uint32_t length)
2239{
2240 uint32_t seq_num;
2241
2242 if (length < WMA_IPV4_PKT_INFO_GET_MIN_LEN)
2243 return;
2244
2245 seq_num = *(uint32_t *)(data + IPV4_TCP_SEQ_NUM_OFFSET);
Dustin Brown3c89c012017-05-01 12:17:32 -07002246 WMA_LOGD("TCP_seq_num: %u", qdf_cpu_to_be16(seq_num));
Dustin Browne2206fb2017-04-20 13:39:25 -07002247}
2248
2249static void wma_log_pkt_tcpv6(uint8_t *data, uint32_t length)
2250{
2251 uint32_t seq_num;
2252
2253 if (length < WMA_IPV6_PKT_INFO_GET_MIN_LEN)
2254 return;
2255
2256 seq_num = *(uint32_t *)(data + IPV6_TCP_SEQ_NUM_OFFSET);
Dustin Brown3c89c012017-05-01 12:17:32 -07002257 WMA_LOGD("TCP_seq_num: %u", qdf_cpu_to_be16(seq_num));
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302258}
2259
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002260#ifdef QCA_SUPPORT_CP_STATS
2261static void wma_wow_inc_wake_lock_stats_by_dst_addr(t_wma_handle *wma,
2262 uint8_t vdev_id,
2263 uint8_t *dest_mac)
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302264{
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002265 ucfg_mc_cp_stats_inc_wake_lock_stats_by_dst_addr(wma->psoc,
2266 vdev_id,
2267 dest_mac);
2268}
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302269
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002270static void wma_wow_inc_wake_lock_stats_by_protocol(t_wma_handle *wma,
2271 uint8_t vdev_id, enum qdf_proto_subtype proto_subtype)
2272{
2273 ucfg_mc_cp_stats_inc_wake_lock_stats_by_protocol(wma->psoc,
2274 vdev_id,
2275 proto_subtype);
2276}
2277#else
2278static void wma_wow_inc_wake_lock_stats_by_dst_addr(t_wma_handle *wma,
2279 uint8_t vdev_id,
2280 uint8_t *dest_mac)
2281{
2282 struct wma_txrx_node *vdev;
2283 struct sir_vdev_wow_stats *stats;
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302284
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002285 vdev = &wma->interfaces[vdev_id];
2286 stats = &vdev->wow_stats;
Dustin Browne2206fb2017-04-20 13:39:25 -07002287
2288 switch (*dest_mac) {
2289 case WMA_BCAST_MAC_ADDR:
2290 stats->bcast++;
2291 break;
2292 case WMA_MCAST_IPV4_MAC_ADDR:
2293 stats->ipv4_mcast++;
2294 break;
2295 case WMA_MCAST_IPV6_MAC_ADDR:
2296 stats->ipv6_mcast++;
2297 break;
2298 default:
2299 stats->ucast++;
Dustin Browne2206fb2017-04-20 13:39:25 -07002300 break;
2301 }
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002302}
2303
2304static void wma_wow_inc_wake_lock_stats_by_protocol(t_wma_handle *wma,
2305 uint8_t vdev_id, enum qdf_proto_subtype proto_subtype)
2306{
2307 struct wma_txrx_node *vdev;
2308 struct sir_vdev_wow_stats *stats;
2309
2310 vdev = &wma->interfaces[vdev_id];
2311 stats = &vdev->wow_stats;
2312
2313 switch (proto_subtype) {
2314 case QDF_PROTO_ICMP_RES:
2315 stats->icmpv4++;
2316 break;
2317 case QDF_PROTO_ICMPV6_REQ:
2318 case QDF_PROTO_ICMPV6_RES:
2319 case QDF_PROTO_ICMPV6_RS:
2320 stats->icmpv6++;
2321 break;
2322 case QDF_PROTO_ICMPV6_RA:
2323 stats->icmpv6++;
2324 stats->ipv6_mcast_ra++;
2325 break;
2326 case QDF_PROTO_ICMPV6_NS:
2327 stats->icmpv6++;
2328 stats->ipv6_mcast_ns++;
2329 break;
2330 case QDF_PROTO_ICMPV6_NA:
2331 stats->icmpv6++;
2332 stats->ipv6_mcast_na++;
2333 break;
2334 default:
2335 break;
2336 }
2337}
2338#endif
2339
2340/**
2341 * wma_wow_parse_data_pkt() - API to parse data buffer for data
2342 * packet that resulted in WOW wakeup.
2343 * @stats: per-vdev stats for tracking packet types
2344 * @data: Pointer to data buffer
2345 * @length: data buffer length
2346 *
2347 * This function parses the data buffer received (first few bytes of
2348 * skb->data) to get information like src mac addr, dst mac addr, packet
2349 * len, seq_num, etc. It also increments stats for different packet types.
2350 *
2351 * Return: void
2352 */
2353static void wma_wow_parse_data_pkt(t_wma_handle *wma,
2354 uint8_t vdev_id, uint8_t *data,
2355 uint32_t length)
2356{
2357 uint8_t *src_mac;
2358 uint8_t *dest_mac;
2359 const char *proto_subtype_name;
2360 enum qdf_proto_subtype proto_subtype;
2361
2362 WMA_LOGD("packet length: %u", length);
2363 if (length < QDF_NBUF_TRAC_IPV4_OFFSET)
2364 return;
2365
2366 src_mac = data + QDF_NBUF_SRC_MAC_OFFSET;
2367 dest_mac = data + QDF_NBUF_DEST_MAC_OFFSET;
Srinivas Girigowdae1be8772018-05-07 16:16:27 -07002368 WMA_LOGI("Src_mac: " MAC_ADDRESS_STR ", Dst_mac: " MAC_ADDRESS_STR,
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002369 MAC_ADDR_ARRAY(src_mac), MAC_ADDR_ARRAY(dest_mac));
2370
2371 wma_wow_inc_wake_lock_stats_by_dst_addr(wma, vdev_id, dest_mac);
Dustin Browne2206fb2017-04-20 13:39:25 -07002372
2373 proto_subtype = wma_wow_get_pkt_proto_subtype(data, length);
2374 proto_subtype_name = wma_pkt_proto_subtype_to_string(proto_subtype);
2375 if (proto_subtype_name)
Srinivas Girigowdae1be8772018-05-07 16:16:27 -07002376 WMA_LOGI("WOW Wakeup: %s rcvd", proto_subtype_name);
Dustin Browne2206fb2017-04-20 13:39:25 -07002377
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302378 switch (proto_subtype) {
2379 case QDF_PROTO_EAPOL_M1:
2380 case QDF_PROTO_EAPOL_M2:
2381 case QDF_PROTO_EAPOL_M3:
2382 case QDF_PROTO_EAPOL_M4:
Dustin Browne2206fb2017-04-20 13:39:25 -07002383 wma_log_pkt_eapol(data, length);
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302384 break;
2385
2386 case QDF_PROTO_DHCP_DISCOVER:
2387 case QDF_PROTO_DHCP_REQUEST:
2388 case QDF_PROTO_DHCP_OFFER:
2389 case QDF_PROTO_DHCP_ACK:
2390 case QDF_PROTO_DHCP_NACK:
2391 case QDF_PROTO_DHCP_RELEASE:
2392 case QDF_PROTO_DHCP_INFORM:
2393 case QDF_PROTO_DHCP_DECLINE:
Dustin Browne2206fb2017-04-20 13:39:25 -07002394 wma_log_pkt_dhcp(data, length);
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302395 break;
2396
2397 case QDF_PROTO_ICMP_REQ:
2398 case QDF_PROTO_ICMP_RES:
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002399 wma_wow_inc_wake_lock_stats_by_protocol(wma, vdev_id,
2400 proto_subtype);
Dustin Browne2206fb2017-04-20 13:39:25 -07002401 wma_log_pkt_icmpv4(data, length);
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302402 break;
2403
2404 case QDF_PROTO_ICMPV6_REQ:
2405 case QDF_PROTO_ICMPV6_RES:
Himanshu Agarwal471eaef2017-01-31 13:16:52 +05302406 case QDF_PROTO_ICMPV6_RS:
2407 case QDF_PROTO_ICMPV6_RA:
2408 case QDF_PROTO_ICMPV6_NS:
2409 case QDF_PROTO_ICMPV6_NA:
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002410 wma_wow_inc_wake_lock_stats_by_protocol(wma, vdev_id,
2411 proto_subtype);
Dustin Browne2206fb2017-04-20 13:39:25 -07002412 wma_log_pkt_icmpv6(data, length);
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302413 break;
2414
2415 case QDF_PROTO_IPV4_UDP:
Dustin Browne2206fb2017-04-20 13:39:25 -07002416 wma_log_pkt_ipv4(data, length);
2417 break;
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302418 case QDF_PROTO_IPV4_TCP:
Dustin Browne2206fb2017-04-20 13:39:25 -07002419 wma_log_pkt_ipv4(data, length);
2420 wma_log_pkt_tcpv4(data, length);
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302421 break;
2422
2423 case QDF_PROTO_IPV6_UDP:
Dustin Browne2206fb2017-04-20 13:39:25 -07002424 wma_log_pkt_ipv6(data, length);
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302425 break;
Dustin Browne2206fb2017-04-20 13:39:25 -07002426 case QDF_PROTO_IPV6_TCP:
2427 wma_log_pkt_ipv6(data, length);
2428 wma_log_pkt_tcpv6(data, length);
2429 break;
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302430 default:
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302431 break;
2432 }
2433}
2434
2435/**
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302436 * wma_wow_dump_mgmt_buffer() - API to parse data buffer for mgmt.
2437 * packet that resulted in WOW wakeup.
2438 * @wow_packet_buffer: Pointer to data buffer
2439 * @buf_len: length of data buffer
2440 *
2441 * This function parses the data buffer received (802.11 header)
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002442 * to get information like src mac addr, dst mac addr, seq_num,
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302443 * frag_num, etc.
2444 *
2445 * Return: void
2446 */
2447static void wma_wow_dump_mgmt_buffer(uint8_t *wow_packet_buffer,
Dustin Browne2206fb2017-04-20 13:39:25 -07002448 uint32_t buf_len)
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302449{
2450 struct ieee80211_frame_addr4 *wh;
2451
Himanshu Agarwalf9515002016-07-20 19:09:10 +05302452 WMA_LOGD("wow_buf_pkt_len: %u", buf_len);
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302453 wh = (struct ieee80211_frame_addr4 *)
Dustin Brownecb7eb92017-04-06 17:00:11 -07002454 (wow_packet_buffer);
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302455 if (buf_len >= sizeof(struct ieee80211_frame)) {
2456 uint8_t to_from_ds, frag_num;
2457 uint32_t seq_num;
2458
2459 WMA_LOGE("RA: " MAC_ADDRESS_STR " TA: " MAC_ADDRESS_STR,
2460 MAC_ADDR_ARRAY(wh->i_addr1),
2461 MAC_ADDR_ARRAY(wh->i_addr2));
2462
Himanshu Agarwalf9515002016-07-20 19:09:10 +05302463 WMA_LOGE("TO_DS: %u, FROM_DS: %u",
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302464 wh->i_fc[1] & IEEE80211_FC1_DIR_TODS,
2465 wh->i_fc[1] & IEEE80211_FC1_DIR_FROMDS);
2466
Jeff Johnsone866cac2018-12-10 17:57:04 -08002467 to_from_ds = wh->i_fc[1] & IEEE80211_FC1_DIR_MASK;
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302468
2469 switch (to_from_ds) {
Jeff Johnsone866cac2018-12-10 17:57:04 -08002470 case IEEE80211_FC1_DIR_NODS:
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302471 WMA_LOGE("BSSID: " MAC_ADDRESS_STR,
2472 MAC_ADDR_ARRAY(wh->i_addr3));
2473 break;
Jeff Johnsone866cac2018-12-10 17:57:04 -08002474 case IEEE80211_FC1_DIR_TODS:
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302475 WMA_LOGE("DA: " MAC_ADDRESS_STR,
2476 MAC_ADDR_ARRAY(wh->i_addr3));
2477 break;
Jeff Johnsone866cac2018-12-10 17:57:04 -08002478 case IEEE80211_FC1_DIR_FROMDS:
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302479 WMA_LOGE("SA: " MAC_ADDRESS_STR,
2480 MAC_ADDR_ARRAY(wh->i_addr3));
2481 break;
Jeff Johnsone866cac2018-12-10 17:57:04 -08002482 case IEEE80211_FC1_DIR_DSTODS:
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302483 if (buf_len >= sizeof(struct ieee80211_frame_addr4))
2484 WMA_LOGE("DA: " MAC_ADDRESS_STR " SA: "
2485 MAC_ADDRESS_STR,
2486 MAC_ADDR_ARRAY(wh->i_addr3),
2487 MAC_ADDR_ARRAY(wh->i_addr4));
2488 break;
2489 }
2490
2491 seq_num = (((*(uint16_t *)wh->i_seq) &
2492 IEEE80211_SEQ_SEQ_MASK) >>
2493 IEEE80211_SEQ_SEQ_SHIFT);
2494 frag_num = (((*(uint16_t *)wh->i_seq) &
2495 IEEE80211_SEQ_FRAG_MASK) >>
2496 IEEE80211_SEQ_FRAG_SHIFT);
2497
Himanshu Agarwalf9515002016-07-20 19:09:10 +05302498 WMA_LOGE("SEQ_NUM: %u, FRAG_NUM: %u",
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302499 seq_num, frag_num);
2500 } else {
2501 WMA_LOGE("Insufficient buffer length for mgmt. packet");
2502 }
2503}
2504
2505/**
Dustin Browne2206fb2017-04-20 13:39:25 -07002506 * wma_acquire_wakelock() - conditionally aquires a wakelock base on wake reason
2507 * @wma: the wma handle with the wakelocks to aquire
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302508 * @wake_reason: wow wakeup reason
2509 *
Dustin Browne2206fb2017-04-20 13:39:25 -07002510 * Return: None
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302511 */
Dustin Browne2206fb2017-04-20 13:39:25 -07002512static void wma_acquire_wow_wakelock(t_wma_handle *wma, int wake_reason)
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302513{
Dustin Browne2206fb2017-04-20 13:39:25 -07002514 qdf_wake_lock_t *wl;
2515 uint32_t ms;
2516
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302517 switch (wake_reason) {
2518 case WOW_REASON_AUTH_REQ_RECV:
Mukul Sharmae44d0542017-05-23 21:50:56 +05302519 wl = &wma->wow_auth_req_wl;
Dustin Browne2206fb2017-04-20 13:39:25 -07002520 ms = WMA_AUTH_REQ_RECV_WAKE_LOCK_TIMEOUT;
2521 break;
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302522 case WOW_REASON_ASSOC_REQ_RECV:
Mukul Sharmae44d0542017-05-23 21:50:56 +05302523 wl = &wma->wow_assoc_req_wl;
Dustin Browne2206fb2017-04-20 13:39:25 -07002524 ms = WMA_ASSOC_REQ_RECV_WAKE_LOCK_DURATION;
2525 break;
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302526 case WOW_REASON_DEAUTH_RECVD:
Mukul Sharmae44d0542017-05-23 21:50:56 +05302527 wl = &wma->wow_deauth_rec_wl;
Dustin Browne2206fb2017-04-20 13:39:25 -07002528 ms = WMA_DEAUTH_RECV_WAKE_LOCK_DURATION;
2529 break;
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302530 case WOW_REASON_DISASSOC_RECVD:
Mukul Sharmae44d0542017-05-23 21:50:56 +05302531 wl = &wma->wow_disassoc_rec_wl;
Dustin Browne2206fb2017-04-20 13:39:25 -07002532 ms = WMA_DISASSOC_RECV_WAKE_LOCK_DURATION;
2533 break;
yeshwanth sriram guntuka37c09822017-01-24 18:30:15 +05302534 case WOW_REASON_AP_ASSOC_LOST:
Mukul Sharmae44d0542017-05-23 21:50:56 +05302535 wl = &wma->wow_ap_assoc_lost_wl;
Dustin Browne2206fb2017-04-20 13:39:25 -07002536 ms = WMA_BMISS_EVENT_WAKE_LOCK_DURATION;
2537 break;
yeshwanth sriram guntuka37c09822017-01-24 18:30:15 +05302538#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
2539 case WOW_REASON_HOST_AUTO_SHUTDOWN:
Mukul Sharmae44d0542017-05-23 21:50:56 +05302540 wl = &wma->wow_auto_shutdown_wl;
Dustin Browne2206fb2017-04-20 13:39:25 -07002541 ms = WMA_AUTO_SHUTDOWN_WAKE_LOCK_DURATION;
2542 break;
yeshwanth sriram guntuka37c09822017-01-24 18:30:15 +05302543#endif
2544 case WOW_REASON_ROAM_HO:
Mukul Sharmae44d0542017-05-23 21:50:56 +05302545 wl = &wma->roam_ho_wl;
Dustin Browne2206fb2017-04-20 13:39:25 -07002546 ms = WMA_ROAM_HO_WAKE_LOCK_DURATION;
2547 break;
2548 default:
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +05302549 return;
2550 }
2551
Dustin Browne2206fb2017-04-20 13:39:25 -07002552 WMA_LOGA("Holding %d msec wake_lock", ms);
2553 cds_host_diag_log_work(wl, ms, WIFI_POWER_EVENT_WAKELOCK_WOW);
2554 qdf_wake_lock_timeout_acquire(wl, ms);
2555}
2556
2557/**
2558 * wma_wake_reason_ap_assoc_lost() - WOW_REASON_AP_ASSOC_LOST handler
2559 * @wma: Pointer to wma handle
2560 * @event: pointer to piggybacked WMI_ROAM_EVENTID_param_tlvs buffer
2561 * @len: length of the event buffer
2562 *
2563 * Return: Errno
2564 */
2565static int
2566wma_wake_reason_ap_assoc_lost(t_wma_handle *wma, void *event, uint32_t len)
2567{
2568 WMI_ROAM_EVENTID_param_tlvs *event_param;
2569 wmi_roam_event_fixed_param *roam_event;
2570
2571 event_param = event;
2572 if (!event_param) {
2573 WMA_LOGE("AP Assoc Lost event data is null");
2574 return -EINVAL;
2575 }
2576
2577 roam_event = event_param->fixed_param;
2578 WMA_LOGA(FL("Beacon miss indication on vdev %d"), roam_event->vdev_id);
2579
2580 wma_beacon_miss_handler(wma, roam_event->vdev_id, roam_event->rssi);
2581
2582 return 0;
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +05302583}
2584
Dustin Brown9d797d62017-01-11 16:39:12 -08002585static const char *wma_vdev_type_str(uint32_t vdev_type)
2586{
2587 switch (vdev_type) {
2588 case WMI_VDEV_TYPE_AP:
2589 return "AP";
2590 case WMI_VDEV_TYPE_STA:
2591 return "STA";
2592 case WMI_VDEV_TYPE_IBSS:
2593 return "IBSS";
2594 case WMI_VDEV_TYPE_MONITOR:
2595 return "MONITOR";
2596 case WMI_VDEV_TYPE_NAN:
2597 return "NAN";
2598 case WMI_VDEV_TYPE_OCB:
2599 return "OCB";
2600 case WMI_VDEV_TYPE_NDI:
2601 return "NDI";
2602 default:
2603 return "unknown";
2604 }
2605}
2606
Dustin Browne2206fb2017-04-20 13:39:25 -07002607static int wma_wake_event_packet(
2608 t_wma_handle *wma,
2609 WMI_WOW_WAKEUP_HOST_EVENTID_param_tlvs *event_param,
2610 uint32_t length)
2611{
2612 WOW_EVENT_INFO_fixed_param *wake_info;
2613 struct wma_txrx_node *vdev;
2614 uint8_t *packet;
2615 uint32_t packet_len;
2616
Abhinav Kumarb0f99562018-01-24 16:15:30 +05302617 if (event_param->num_wow_packet_buffer <= 4) {
2618 WMA_LOGE("Invalid wow packet buffer from firmware %u",
2619 event_param->num_wow_packet_buffer);
2620 return -EINVAL;
2621 }
Dustin Browne2206fb2017-04-20 13:39:25 -07002622 /* first 4 bytes are the length, followed by the buffer */
2623 packet_len = *(uint32_t *)event_param->wow_packet_buffer;
2624 packet = event_param->wow_packet_buffer + 4;
2625
2626 if (!packet_len) {
2627 WMA_LOGE("Wake event packet is empty");
2628 return 0;
2629 }
2630
Himanshu Agarwale6b49122017-10-13 17:50:11 +05302631 if (packet_len > (event_param->num_wow_packet_buffer - 4)) {
2632 WMA_LOGE("Invalid packet_len from firmware, packet_len: %u, num_wow_packet_buffer: %u",
2633 packet_len,
2634 event_param->num_wow_packet_buffer);
2635 return -EINVAL;
2636 }
2637
Dustin Browne2206fb2017-04-20 13:39:25 -07002638 wake_info = event_param->fixed_param;
2639
2640 switch (wake_info->wake_reason) {
2641 case WOW_REASON_AUTH_REQ_RECV:
2642 case WOW_REASON_ASSOC_REQ_RECV:
2643 case WOW_REASON_DEAUTH_RECVD:
2644 case WOW_REASON_DISASSOC_RECVD:
2645 case WOW_REASON_ASSOC_RES_RECV:
2646 case WOW_REASON_REASSOC_REQ_RECV:
2647 case WOW_REASON_REASSOC_RES_RECV:
2648 case WOW_REASON_BEACON_RECV:
2649 case WOW_REASON_ACTION_FRAME_RECV:
2650 /* management frame case */
2651 wma_wow_dump_mgmt_buffer(packet, packet_len);
2652 break;
2653
2654 case WOW_REASON_BPF_ALLOW:
2655 case WOW_REASON_PATTERN_MATCH_FOUND:
2656 case WOW_REASON_RA_MATCH:
2657 case WOW_REASON_RECV_MAGIC_PATTERN:
Will Huang3f7cb652018-11-28 10:41:24 +08002658 case WOW_REASON_PACKET_FILTER_MATCH:
Dustin Browne2206fb2017-04-20 13:39:25 -07002659 WMA_LOGD("Wake event packet:");
2660 qdf_trace_hex_dump(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG,
2661 packet, packet_len);
2662
2663 vdev = &wma->interfaces[wake_info->vdev_id];
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002664 wma_wow_parse_data_pkt(wma, wake_info->vdev_id,
2665 packet, packet_len);
Dustin Browne2206fb2017-04-20 13:39:25 -07002666 break;
2667
2668 default:
2669 WMA_LOGE("Wake reason %s(%u) is not a packet event",
2670 wma_wow_wake_reason_str(wake_info->wake_reason),
2671 wake_info->wake_reason);
2672 return -EINVAL;
2673 }
2674
2675 return 0;
2676}
2677
2678static int wma_wake_event_no_payload(
2679 t_wma_handle *wma,
2680 WMI_WOW_WAKEUP_HOST_EVENTID_param_tlvs *event_param,
2681 uint32_t length)
2682{
2683 WOW_EVENT_INFO_fixed_param *wake_info = event_param->fixed_param;
2684
2685 switch (wake_info->wake_reason) {
2686 case WOW_REASON_HOST_AUTO_SHUTDOWN:
2687 return wma_wake_reason_auto_shutdown();
2688
2689 case WOW_REASON_NLOD:
2690 return wma_wake_reason_nlod(wma, wake_info->vdev_id);
Dustin Browne2206fb2017-04-20 13:39:25 -07002691
Dustin Brown3c89c012017-05-01 12:17:32 -07002692 default:
2693 return 0;
2694 }
Dustin Browne2206fb2017-04-20 13:39:25 -07002695}
2696
2697static int wma_wake_event_piggybacked(
2698 t_wma_handle *wma,
2699 WMI_WOW_WAKEUP_HOST_EVENTID_param_tlvs *event_param,
2700 uint32_t length)
2701{
Deepak Dhamdhere6d2c97a2017-02-04 22:09:27 -08002702 int errno = 0;
Dustin Browne2206fb2017-04-20 13:39:25 -07002703 void *pb_event;
2704 uint32_t pb_event_len;
2705 uint32_t wake_reason;
2706 uint32_t event_id;
Naveen Rawata600b2e2018-03-29 13:41:18 -07002707 uint8_t *bssid;
2708 uint8_t peer_id;
2709 void *peer, *pdev;
2710 tpDeleteStaContext del_sta_ctx;
2711 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Dustin Browne2206fb2017-04-20 13:39:25 -07002712
2713 /*
2714 * There are "normal" cases where a wake reason that usually contains a
2715 * piggybacked event is empty. In these cases we just want to wake up,
2716 * and no action is needed. Bail out now if that is the case.
2717 */
Abhinav Kumarb0f99562018-01-24 16:15:30 +05302718 if (!event_param->wow_packet_buffer ||
2719 event_param->num_wow_packet_buffer <= 4) {
2720 WMA_LOGE("Invalid wow packet buffer from firmware %u",
2721 event_param->num_wow_packet_buffer);
Dustin Browne2206fb2017-04-20 13:39:25 -07002722 return 0;
Abhinav Kumarb0f99562018-01-24 16:15:30 +05302723 }
Dustin Browne2206fb2017-04-20 13:39:25 -07002724
Naveen Rawata600b2e2018-03-29 13:41:18 -07002725 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
2726 bssid = wma->interfaces[event_param->fixed_param->vdev_id].bssid;
2727 peer = cdp_peer_find_by_addr(soc, pdev, bssid, &peer_id);
Dustin Browne2206fb2017-04-20 13:39:25 -07002728 wake_reason = event_param->fixed_param->wake_reason;
2729
2730 /* parse piggybacked event from param buffer */
2731 {
2732 int ret_code;
2733 uint8_t *pb_event_buf;
2734 uint32_t tag;
2735
2736 /* first 4 bytes are the length, followed by the buffer */
2737 pb_event_len = *(uint32_t *)event_param->wow_packet_buffer;
Himanshu Agarwale6b49122017-10-13 17:50:11 +05302738 if (pb_event_len > (event_param->num_wow_packet_buffer - 4)) {
2739 WMA_LOGE("Invalid pb_event_len from firmware, pb_event_len: %u, num_wow_packet_buffer: %u",
2740 pb_event_len,
2741 event_param->num_wow_packet_buffer);
2742 return -EINVAL;
2743 }
Dustin Browne2206fb2017-04-20 13:39:25 -07002744 pb_event_buf = event_param->wow_packet_buffer + 4;
2745
2746 WMA_LOGD("piggybacked event buffer:");
2747 qdf_trace_hex_dump(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG,
2748 pb_event_buf, pb_event_len);
2749
2750 tag = WMITLV_GET_TLVTAG(WMITLV_GET_HDR(pb_event_buf));
2751 event_id = wow_get_wmi_eventid(wake_reason, tag);
2752 if (!event_id) {
2753 WMA_LOGE(FL("Unable to find Event Id"));
2754 return -EINVAL;
2755 }
2756
2757 ret_code = wmitlv_check_and_pad_event_tlvs(wma, pb_event_buf,
2758 pb_event_len,
2759 event_id, &pb_event);
2760 if (ret_code) {
2761 WMA_LOGE(FL("Bad TLVs; len:%d, event_id:%d, status:%d"),
2762 pb_event_len, event_id, ret_code);
2763 return -EINVAL;
2764 }
2765 }
2766
2767 switch (wake_reason) {
2768 case WOW_REASON_AP_ASSOC_LOST:
2769 errno = wma_wake_reason_ap_assoc_lost(wma, pb_event,
2770 pb_event_len);
2771 break;
2772
2773#ifdef FEATURE_WLAN_SCAN_PNO
2774 case WOW_REASON_NLO_SCAN_COMPLETE:
2775 errno = target_if_nlo_complete_handler(wma, pb_event,
2776 pb_event_len);
2777 break;
2778#endif /* FEATURE_WLAN_SCAN_PNO */
2779
2780 case WOW_REASON_CSA_EVENT:
2781 errno = wma_csa_offload_handler(wma, pb_event, pb_event_len);
2782 break;
2783
Deepak Dhamdhere6d2c97a2017-02-04 22:09:27 -08002784 /*
2785 * WOW_REASON_LOW_RSSI is used for following roaming events -
2786 * WMI_ROAM_REASON_BETTER_AP, WMI_ROAM_REASON_BMISS,
2787 * WMI_ROAM_REASON_SUITABLE_AP will be handled by
2788 * wma_roam_event_callback().
2789 * WOW_REASON_ROAM_HO is associated with
2790 * WMI_ROAM_REASON_HO_FAILED event and it will be handled by
2791 * wma_roam_event_callback().
2792 */
Dustin Browne2206fb2017-04-20 13:39:25 -07002793 case WOW_REASON_LOW_RSSI:
Deepak Dhamdhere6d2c97a2017-02-04 22:09:27 -08002794 case WOW_REASON_ROAM_HO:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07002795 wlan_roam_debug_log(event_param->fixed_param->vdev_id,
2796 DEBUG_WOW_ROAM_EVENT,
2797 DEBUG_INVALID_PEER_ID,
2798 NULL, NULL, wake_reason,
2799 pb_event_len);
Deepak Dhamdhere6d2c97a2017-02-04 22:09:27 -08002800 if (pb_event_len > 0) {
2801 errno = wma_roam_event_callback(wma, pb_event,
2802 pb_event_len);
2803 } else {
2804 /*
2805 * No wow_packet_buffer means a better AP beacon
2806 * will follow in a later event.
2807 */
2808 WMA_LOGD("Host woken up because of better AP beacon");
2809 }
Dustin Browne2206fb2017-04-20 13:39:25 -07002810 break;
2811
2812 case WOW_REASON_CLIENT_KICKOUT_EVENT:
2813 errno = wma_peer_sta_kickout_event_handler(wma, pb_event,
2814 pb_event_len);
2815 break;
2816
2817#ifdef FEATURE_WLAN_EXTSCAN
2818 case WOW_REASON_EXTSCAN:
2819 errno = wma_extscan_wow_event_callback(wma, pb_event,
2820 pb_event_len);
2821 break;
2822#endif
2823
2824 case WOW_REASON_RSSI_BREACH_EVENT:
2825 errno = wma_rssi_breached_event_handler(wma, pb_event,
2826 pb_event_len);
2827 break;
2828
2829 case WOW_REASON_NAN_EVENT:
Nachiket Kukade6003bd22018-11-08 18:30:08 +05302830 errno = wma_nan_rsp_handler_callback(wma, pb_event,
2831 pb_event_len);
Dustin Browne2206fb2017-04-20 13:39:25 -07002832 break;
2833
2834 case WOW_REASON_NAN_DATA:
2835 errno = wma_ndp_wow_event_callback(wma, pb_event, pb_event_len,
2836 event_id);
2837 break;
2838
2839#ifdef FEATURE_WLAN_TDLS
2840 case WOW_REASON_TDLS_CONN_TRACKER_EVENT:
2841 errno = wma_tdls_event_handler(wma, pb_event, pb_event_len);
2842 break;
2843#endif
Naveen Rawatd7734142017-10-27 10:02:40 -07002844
2845 case WOW_REASON_TIMER_INTR_RECV:
2846 /*
2847 * Right now firmware is not returning any cookie host has
2848 * programmed. So do not check for cookie.
2849 */
2850 WMA_LOGE("WOW_REASON_TIMER_INTR_RECV received, indicating key exchange did not finish. Initiate disconnect");
Arif Hussain157263f2018-10-03 13:07:15 -07002851 del_sta_ctx = qdf_mem_malloc(sizeof(*del_sta_ctx));
2852 if (!del_sta_ctx)
Naveen Rawata600b2e2018-03-29 13:41:18 -07002853 break;
Arif Hussain157263f2018-10-03 13:07:15 -07002854
Naveen Rawata600b2e2018-03-29 13:41:18 -07002855 del_sta_ctx->is_tdls = false;
2856 del_sta_ctx->vdev_id = event_param->fixed_param->vdev_id;
2857 del_sta_ctx->staId = peer_id;
2858 qdf_mem_copy(del_sta_ctx->addr2, bssid, IEEE80211_ADDR_LEN);
2859 qdf_mem_copy(del_sta_ctx->bssId, bssid, IEEE80211_ADDR_LEN);
2860 del_sta_ctx->reasonCode = HAL_DEL_STA_REASON_CODE_KEEP_ALIVE;
2861 wma_send_msg(wma, SIR_LIM_DELETE_STA_CONTEXT_IND, del_sta_ctx,
2862 0);
Naveen Rawatd7734142017-10-27 10:02:40 -07002863 break;
2864
Dustin Browne2206fb2017-04-20 13:39:25 -07002865 default:
2866 WMA_LOGE("Wake reason %s(%u) is not a piggybacked event",
2867 wma_wow_wake_reason_str(wake_reason), wake_reason);
2868 errno = -EINVAL;
2869 break;
2870 }
2871
2872 wmitlv_free_allocated_event_tlvs(event_id, &pb_event);
2873
2874 return errno;
2875}
2876
2877static void wma_wake_event_log_reason(t_wma_handle *wma,
2878 WOW_EVENT_INFO_fixed_param *wake_info)
2879{
Dustin Brown3c89c012017-05-01 12:17:32 -07002880 struct wma_txrx_node *vdev;
Dustin Browne2206fb2017-04-20 13:39:25 -07002881
2882 /* "Unspecified" means APPS triggered wake, else firmware triggered */
2883 if (wake_info->wake_reason != WOW_REASON_UNSPECIFIED) {
Dustin Brown3c89c012017-05-01 12:17:32 -07002884 vdev = &wma->interfaces[wake_info->vdev_id];
Dustin Brown4ea846d2017-06-05 10:56:57 -07002885 WMA_LOGA("WLAN triggered wakeup: %s (%d), vdev: %d (%s)",
Dustin Browne2206fb2017-04-20 13:39:25 -07002886 wma_wow_wake_reason_str(wake_info->wake_reason),
2887 wake_info->wake_reason,
2888 wake_info->vdev_id,
Dustin Brown3c89c012017-05-01 12:17:32 -07002889 wma_vdev_type_str(vdev->type));
Dustin Browne2206fb2017-04-20 13:39:25 -07002890 } else if (!wmi_get_runtime_pm_inprogress(wma->wmi_handle)) {
Dustin Brown4ea846d2017-06-05 10:56:57 -07002891 WMA_LOGA("Non-WLAN triggered wakeup: %s (%d)",
Dustin Browne2206fb2017-04-20 13:39:25 -07002892 wma_wow_wake_reason_str(wake_info->wake_reason),
2893 wake_info->wake_reason);
2894 }
2895
2896 qdf_wow_wakeup_host_event(wake_info->wake_reason);
Yeshwanth Sriram Guntukaa10da362017-10-06 12:57:11 +05302897 qdf_wma_wow_wakeup_stats_event(wma);
Dustin Browne2206fb2017-04-20 13:39:25 -07002898}
2899
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +05302900/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002901 * wma_wow_wakeup_host_event() - wakeup host event handler
2902 * @handle: wma handle
2903 * @event: event data
2904 * @len: buffer length
2905 *
2906 * Handler to catch wow wakeup host event. This event will have
2907 * reason why the firmware has woken the host.
2908 *
Dustin Brownecb7eb92017-04-06 17:00:11 -07002909 * Return: Errno
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002910 */
Dustin Brownecb7eb92017-04-06 17:00:11 -07002911int wma_wow_wakeup_host_event(void *handle, uint8_t *event, uint32_t len)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002912{
Dustin Browne2206fb2017-04-20 13:39:25 -07002913 int errno;
2914 t_wma_handle *wma = handle;
2915 WMI_WOW_WAKEUP_HOST_EVENTID_param_tlvs *event_param;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002916 WOW_EVENT_INFO_fixed_param *wake_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002917
Dustin Browne2206fb2017-04-20 13:39:25 -07002918 event_param = (WMI_WOW_WAKEUP_HOST_EVENTID_param_tlvs *)event;
2919 if (!event_param) {
2920 WMA_LOGE("Wake event data is null");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002921 return -EINVAL;
2922 }
2923
Dustin Browne2206fb2017-04-20 13:39:25 -07002924 wake_info = event_param->fixed_param;
Vignesh Viswanathan1f6e08f2018-01-25 17:45:23 +05302925
2926 if (wake_info->vdev_id >= wma->max_bssid) {
2927 WMA_LOGE("%s: received invalid vdev_id %d",
2928 __func__, wake_info->vdev_id);
2929 return -EINVAL;
2930 }
2931
Dustin Browne2206fb2017-04-20 13:39:25 -07002932 wma_wake_event_log_reason(wma, wake_info);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002933
Wu Gaod7dd6e42018-10-16 17:22:56 +08002934 ucfg_pmo_psoc_wakeup_host_event_received(wma->psoc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002935
Dustin Browne2206fb2017-04-20 13:39:25 -07002936 wma_print_wow_stats(wma, wake_info);
Dustin Browne2206fb2017-04-20 13:39:25 -07002937 /* split based on payload type */
2938 if (is_piggybacked_event(wake_info->wake_reason))
2939 errno = wma_wake_event_piggybacked(wma, event_param, len);
2940 else if (event_param->wow_packet_buffer)
2941 errno = wma_wake_event_packet(wma, event_param, len);
Dustin Brown9d797d62017-01-11 16:39:12 -08002942 else
Dustin Browne2206fb2017-04-20 13:39:25 -07002943 errno = wma_wake_event_no_payload(wma, event_param, len);
Dustin Brown9d797d62017-01-11 16:39:12 -08002944
Dustin Browne2206fb2017-04-20 13:39:25 -07002945 wma_inc_wow_stats(wma, wake_info);
2946 wma_print_wow_stats(wma, wake_info);
Dustin Browne2206fb2017-04-20 13:39:25 -07002947 wma_acquire_wow_wakelock(wma, wake_info->wake_reason);
Rajeev Kumar2c892fe2016-08-24 16:17:16 -07002948
Dustin Browne2206fb2017-04-20 13:39:25 -07002949 return errno;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002950}
2951
Will Huang3cd2b7c2017-11-17 13:16:56 +08002952#ifdef FEATURE_WLAN_D0WOW
2953/**
2954 * wma_d0_wow_disable_ack_event() - wakeup host event handler
2955 * @handle: wma handle
2956 * @event: event data
2957 * @len: buffer length
2958 *
2959 * Handler to catch D0-WOW disable ACK event. This event will have
2960 * reason why the firmware has woken the host.
2961 * This is for backward compatible with cld2.0.
2962 *
2963 * Return: 0 for success or error
2964 */
2965int wma_d0_wow_disable_ack_event(void *handle, uint8_t *event, uint32_t len)
2966{
2967 tp_wma_handle wma = (tp_wma_handle)handle;
2968 WMI_D0_WOW_DISABLE_ACK_EVENTID_param_tlvs *param_buf;
2969 wmi_d0_wow_disable_ack_event_fixed_param *resp_data;
2970
2971 param_buf = (WMI_D0_WOW_DISABLE_ACK_EVENTID_param_tlvs *)event;
2972 if (!param_buf) {
2973 WMA_LOGE("Invalid D0-WOW disable ACK event buffer!");
2974 return -EINVAL;
2975 }
2976
2977 resp_data = param_buf->fixed_param;
2978
Wu Gaod7dd6e42018-10-16 17:22:56 +08002979 ucfg_pmo_psoc_wakeup_host_event_received(wma->psoc);
Will Huang3cd2b7c2017-11-17 13:16:56 +08002980
2981 WMA_LOGD("Received D0-WOW disable ACK");
2982
2983 return 0;
2984}
2985#else
2986int wma_d0_wow_disable_ack_event(void *handle, uint8_t *event, uint32_t len)
2987{
2988 return 0;
2989}
2990#endif
2991
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002992/**
2993 * wma_pdev_resume_event_handler() - PDEV resume event handler
2994 * @handle: wma handle
2995 * @event: event data
2996 * @len: buffer length
2997 *
2998 * Return: 0 for success or error
2999 */
3000int wma_pdev_resume_event_handler(void *handle, uint8_t *event, uint32_t len)
3001{
3002 tp_wma_handle wma = (tp_wma_handle) handle;
3003
3004 WMA_LOGA("Received PDEV resume event");
3005
Wu Gaod7dd6e42018-10-16 17:22:56 +08003006 ucfg_pmo_psoc_wakeup_host_event_received(wma->psoc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003007
3008 return 0;
3009}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003010
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003011/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003012 * wma_del_ts_req() - send DELTS request to fw
3013 * @wma: wma handle
3014 * @msg: delts params
3015 *
3016 * Return: none
3017 */
Jeff Johnson256002f2018-12-22 17:53:19 -08003018void wma_del_ts_req(tp_wma_handle wma, struct del_ts_params *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003019{
Pragaspathi Thilagaraj0d1159e2018-08-08 19:00:36 +05303020 if (!wma_is_vdev_valid(msg->sessionId)) {
3021 WMA_LOGE("%s: vdev id:%d is not active ", __func__,
3022 msg->sessionId);
3023 qdf_mem_free(msg);
3024 return;
3025 }
Govind Singhaa64c242016-03-08 11:31:49 +05303026 if (wmi_unified_del_ts_cmd(wma->wmi_handle,
3027 msg->sessionId,
3028 TID_TO_WME_AC(msg->userPrio))) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003029 WMA_LOGP("%s: Failed to send vdev DELTS command", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003030 }
Govind Singhaa64c242016-03-08 11:31:49 +05303031
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003032#ifdef WLAN_FEATURE_ROAM_OFFLOAD
3033 if (msg->setRICparams == true)
3034 wma_set_ric_req(wma, msg, false);
3035#endif /* WLAN_FEATURE_ROAM_OFFLOAD */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303036 qdf_mem_free(msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003037}
3038
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003039void wma_aggr_qos_req(tp_wma_handle wma,
Pragaspathi Thilagarajd5cb9e82019-02-04 14:13:52 +05303040 struct aggr_add_ts_param *aggr_qos_rsp_msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003041{
Pragaspathi Thilagarajd5cb9e82019-02-04 14:13:52 +05303042 if (!wma_is_vdev_valid(aggr_qos_rsp_msg->vdev_id)) {
3043 WMA_LOGE("%s: vdev id:%d is not active ", __func__,
3044 aggr_qos_rsp_msg->vdev_id);
3045 return;
3046 }
3047 wmi_unified_aggr_qos_cmd(wma->wmi_handle, aggr_qos_rsp_msg);
Jeff Johnsonc97816c2018-05-12 17:13:23 -07003048 /* send response to upper layers from here only. */
Pragaspathi Thilagarajd5cb9e82019-02-04 14:13:52 +05303049 wma_send_msg_high_priority(wma, WMA_AGGR_QOS_RSP, aggr_qos_rsp_msg, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003050}
3051
Mahesh Kumar Kalikot Veetil40575112016-09-09 16:57:08 -07003052#ifdef FEATURE_WLAN_ESE
3053/**
3054 * wma_set_tsm_interval() - Set TSM interval
3055 * @req: pointer to ADDTS request
3056 *
3057 * Return: QDF_STATUS_E_FAILURE or QDF_STATUS_SUCCESS
3058 */
Jeff Johnson9851fcc2018-12-22 17:29:58 -08003059static QDF_STATUS wma_set_tsm_interval(struct add_ts_param *req)
Mahesh Kumar Kalikot Veetil40575112016-09-09 16:57:08 -07003060{
3061 /*
3062 * msmt_interval is in unit called TU (1 TU = 1024 us)
3063 * max value of msmt_interval cannot make resulting
3064 * interval_milliseconds overflow 32 bit
3065 *
3066 */
3067 uint32_t interval_milliseconds;
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003068 struct cdp_pdev *pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003069
Mahesh Kumar Kalikot Veetil40575112016-09-09 16:57:08 -07003070 if (NULL == pdev) {
3071 WMA_LOGE("%s: Failed to get pdev", __func__);
3072 return QDF_STATUS_E_FAILURE;
3073 }
3074
3075 interval_milliseconds = (req->tsm_interval * 1024) / 1000;
3076
Leo Chang96464902016-10-28 11:10:54 -07003077 cdp_tx_set_compute_interval(cds_get_context(QDF_MODULE_ID_SOC),
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003078 pdev,
3079 interval_milliseconds);
Mahesh Kumar Kalikot Veetil40575112016-09-09 16:57:08 -07003080 return QDF_STATUS_SUCCESS;
3081}
3082#else
Jeff Johnson9851fcc2018-12-22 17:29:58 -08003083static inline QDF_STATUS wma_set_tsm_interval(struct add_ts_param *req)
Mahesh Kumar Kalikot Veetil40575112016-09-09 16:57:08 -07003084{
3085 return QDF_STATUS_SUCCESS;
3086}
3087#endif /* FEATURE_WLAN_ESE */
3088
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003089/**
3090 * wma_add_ts_req() - send ADDTS request to fw
3091 * @wma: wma handle
3092 * @msg: ADDTS params
3093 *
3094 * Return: none
3095 */
Jeff Johnson9851fcc2018-12-22 17:29:58 -08003096void wma_add_ts_req(tp_wma_handle wma, struct add_ts_param *msg)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003097{
Govind Singhaa64c242016-03-08 11:31:49 +05303098 struct add_ts_param cmd = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003099
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003100 msg->status = QDF_STATUS_SUCCESS;
Mahesh Kumar Kalikot Veetil40575112016-09-09 16:57:08 -07003101 if (wma_set_tsm_interval(msg) == QDF_STATUS_SUCCESS) {
Govind Singhaa64c242016-03-08 11:31:49 +05303102
Jeff Johnson5c68c5b2019-01-20 15:37:43 -08003103 cmd.vdev_id = msg->vdev_id;
Mahesh Kumar Kalikot Veetil40575112016-09-09 16:57:08 -07003104 cmd.tspec.tsinfo.traffic.userPrio =
Govind Singhaa64c242016-03-08 11:31:49 +05303105 TID_TO_WME_AC(msg->tspec.tsinfo.traffic.userPrio);
Mahesh Kumar Kalikot Veetil40575112016-09-09 16:57:08 -07003106 cmd.tspec.mediumTime = msg->tspec.mediumTime;
3107 if (wmi_unified_add_ts_cmd(wma->wmi_handle, &cmd))
3108 msg->status = QDF_STATUS_E_FAILURE;
Govind Singhaa64c242016-03-08 11:31:49 +05303109
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003110#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Mahesh Kumar Kalikot Veetil40575112016-09-09 16:57:08 -07003111 if (msg->setRICparams == true)
3112 wma_set_ric_req(wma, msg, true);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003113#endif /* WLAN_FEATURE_ROAM_OFFLOAD */
3114
Mahesh Kumar Kalikot Veetil40575112016-09-09 16:57:08 -07003115 }
Abhishek Singh2d775fd2017-08-18 10:51:33 +05303116 wma_send_msg_high_priority(wma, WMA_ADD_TS_RSP, msg, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003117}
3118
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003119#ifdef FEATURE_WLAN_ESE
3120
3121#define TSM_DELAY_HISTROGRAM_BINS 4
3122/**
3123 * wma_process_tsm_stats_req() - process tsm stats request
3124 * @wma_handler - handle to wma
3125 * @pTsmStatsMsg - TSM stats struct that needs to be populated and
3126 * passed in message.
3127 *
3128 * A parallel function to WMA_ProcessTsmStatsReq for pronto. This
3129 * function fetches stats from data path APIs and post
3130 * WMA_TSM_STATS_RSP msg back to LIM.
3131 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303132 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003133 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303134QDF_STATUS wma_process_tsm_stats_req(tp_wma_handle wma_handler,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003135 void *pTsmStatsMsg)
3136{
3137 uint8_t counter;
3138 uint32_t queue_delay_microsec = 0;
3139 uint32_t tx_delay_microsec = 0;
3140 uint16_t packet_count = 0;
3141 uint16_t packet_loss_count = 0;
3142 tpAniTrafStrmMetrics pTsmMetric = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003143 tpAniGetTsmStatsReq pStats = (tpAniGetTsmStatsReq) pTsmStatsMsg;
3144 tpAniGetTsmStatsRsp pTsmRspParams = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003145 int tid = pStats->tid;
3146 /*
3147 * The number of histrogram bin report by data path api are different
3148 * than required by TSM, hence different (6) size array used
3149 */
3150 uint16_t bin_values[QCA_TX_DELAY_HIST_REPORT_BINS] = { 0, };
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003151 struct cdp_pdev *pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Leo Chang96464902016-10-28 11:10:54 -07003152 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003153
3154 if (NULL == pdev) {
3155 WMA_LOGE("%s: Failed to get pdev", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303156 qdf_mem_free(pTsmStatsMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303157 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003158 }
3159
3160 /* get required values from data path APIs */
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003161 cdp_tx_delay(soc,
3162 pdev,
3163 &queue_delay_microsec,
3164 &tx_delay_microsec, tid);
3165 cdp_tx_delay_hist(soc,
3166 pdev,
3167 bin_values, tid);
3168 cdp_tx_packet_count(soc,
3169 pdev,
3170 &packet_count,
3171 &packet_loss_count, tid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003172
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08003173 pTsmRspParams = qdf_mem_malloc(sizeof(*pTsmRspParams));
Arif Hussain157263f2018-10-03 13:07:15 -07003174 if (!pTsmRspParams) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303175 QDF_ASSERT(0);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303176 qdf_mem_free(pTsmStatsMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303177 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003178 }
3179 pTsmRspParams->staId = pStats->staId;
Abhinav Kumaraa8f2df2019-01-11 20:02:26 +05303180 qdf_copy_macaddr(&pTsmRspParams->bssid, &pStats->bssId);
Jeff Johnsone88dd752018-06-07 22:57:54 -07003181 pTsmRspParams->rc = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003182 pTsmRspParams->tsmStatsReq = pStats;
3183 pTsmMetric = &pTsmRspParams->tsmMetrics;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003184 /* populate pTsmMetric */
3185 pTsmMetric->UplinkPktQueueDly = queue_delay_microsec;
3186 /* store only required number of bin values */
3187 for (counter = 0; counter < TSM_DELAY_HISTROGRAM_BINS; counter++) {
3188 pTsmMetric->UplinkPktQueueDlyHist[counter] =
3189 bin_values[counter];
3190 }
3191 pTsmMetric->UplinkPktTxDly = tx_delay_microsec;
3192 pTsmMetric->UplinkPktLoss = packet_loss_count;
3193 pTsmMetric->UplinkPktCount = packet_count;
3194
3195 /*
3196 * No need to populate roaming delay and roaming count as they are
3197 * being populated just before sending IAPP frame out
3198 */
3199 /* post this message to LIM/PE */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003200 wma_send_msg(wma_handler, WMA_TSM_STATS_RSP, (void *)pTsmRspParams, 0);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303201 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003202}
3203
3204#endif /* FEATURE_WLAN_ESE */
3205
3206/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003207 * wma_process_mcbc_set_filter_req() - process mcbc set filter request
3208 * @wma_handle: wma handle
3209 * @mcbc_param: mcbc params
3210 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303211 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003212 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303213QDF_STATUS wma_process_mcbc_set_filter_req(tp_wma_handle wma_handle,
Anurag Chouhance0dc992016-02-16 18:18:03 +05303214 tSirRcvFltMcAddrList *mcbc_param)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003215{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303216 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003217}
3218
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003219/**
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003220 * wma_process_cesium_enable_ind() - enables cesium functionality in target
3221 * @wma: wma handle
3222 *
3223 * Return: QDF status
3224 */
3225QDF_STATUS wma_process_cesium_enable_ind(tp_wma_handle wma)
3226{
3227 QDF_STATUS ret;
3228 int32_t vdev_id;
3229
3230 vdev_id = wma_find_vdev_by_type(wma, WMI_VDEV_TYPE_IBSS);
3231 if (vdev_id < 0) {
3232 WMA_LOGE("%s: IBSS vdev does not exist could not enable cesium",
3233 __func__);
3234 return QDF_STATUS_E_FAILURE;
3235 }
3236
3237 /* Send enable cesium command to target */
3238 WMA_LOGE("Enable cesium in target for vdevId %d ", vdev_id);
3239 ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
3240 WMI_VDEV_PARAM_ENABLE_RMC, 1);
3241 if (ret) {
3242 WMA_LOGE("Enable cesium failed for vdevId %d", vdev_id);
3243 return QDF_STATUS_E_FAILURE;
3244 }
3245 return QDF_STATUS_SUCCESS;
3246}
3247
3248/**
3249 * wma_process_get_peer_info_req() - sends get peer info cmd to target
3250 * @wma: wma handle
3251 * @preq: get peer info request
3252 *
3253 * Return: QDF status
3254 */
3255QDF_STATUS wma_process_get_peer_info_req
3256 (tp_wma_handle wma, tSirIbssGetPeerInfoReqParams *pReq)
3257{
3258 int32_t ret;
3259 uint8_t *p;
3260 uint16_t len;
3261 wmi_buf_t buf;
3262 int32_t vdev_id;
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003263 struct cdp_pdev *pdev;
Leo Chang96464902016-10-28 11:10:54 -07003264 void *peer;
3265 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003266 uint8_t peer_mac[IEEE80211_ADDR_LEN];
Leo Chang96464902016-10-28 11:10:54 -07003267 uint8_t *peer_mac_raw;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003268 wmi_peer_info_req_cmd_fixed_param *p_get_peer_info_cmd;
3269 uint8_t bcast_mac[IEEE80211_ADDR_LEN] = { 0xff, 0xff, 0xff,
3270 0xff, 0xff, 0xff };
3271
Nishank Aggarwala13b61d2016-12-01 12:53:58 +05303272 if (NULL == soc) {
3273 WMA_LOGE("%s: SOC context is NULL", __func__);
3274 return QDF_STATUS_E_FAILURE;
3275 }
3276
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003277 vdev_id = wma_find_vdev_by_type(wma, WMI_VDEV_TYPE_IBSS);
3278 if (vdev_id < 0) {
3279 WMA_LOGE("%s: IBSS vdev does not exist could not get peer info",
3280 __func__);
3281 return QDF_STATUS_E_FAILURE;
3282 }
3283
3284 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
3285 if (NULL == pdev) {
3286 WMA_LOGE("%s: Failed to get pdev context", __func__);
3287 return QDF_STATUS_E_FAILURE;
3288 }
3289
3290 if (0xFF == pReq->staIdx) {
3291 /*get info for all peers */
3292 qdf_mem_copy(peer_mac, bcast_mac, IEEE80211_ADDR_LEN);
3293 } else {
3294 /*get info for a single peer */
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003295 peer = cdp_peer_find_by_local_id(soc,
3296 pdev, pReq->staIdx);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003297 if (!peer) {
3298 WMA_LOGE("%s: Failed to get peer handle using peer id %d",
3299 __func__, pReq->staIdx);
3300 return QDF_STATUS_E_FAILURE;
3301 }
Leo Chang96464902016-10-28 11:10:54 -07003302 peer_mac_raw = cdp_peer_get_peer_mac_addr(soc, peer);
Nishank Aggarwala13b61d2016-12-01 12:53:58 +05303303 if (peer_mac_raw == NULL) {
3304 WMA_LOGE("peer_mac_raw is NULL");
3305 return QDF_STATUS_E_FAILURE;
3306 }
3307
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003308 WMA_LOGE("%s: staIdx %d peer mac: 0x%2x:0x%2x:0x%2x:0x%2x:0x%2x:0x%2x",
Leo Chang96464902016-10-28 11:10:54 -07003309 __func__, pReq->staIdx, peer_mac_raw[0],
3310 peer_mac_raw[1], peer_mac_raw[2],
3311 peer_mac_raw[3], peer_mac_raw[4],
3312 peer_mac_raw[5]);
3313 qdf_mem_copy(peer_mac, peer_mac_raw, IEEE80211_ADDR_LEN);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003314 }
3315
3316 len = sizeof(wmi_peer_info_req_cmd_fixed_param);
3317 buf = wmi_buf_alloc(wma->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07003318 if (!buf)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003319 return QDF_STATUS_E_FAILURE;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003320
3321 p = (uint8_t *) wmi_buf_data(buf);
3322 qdf_mem_zero(p, len);
3323 p_get_peer_info_cmd = (wmi_peer_info_req_cmd_fixed_param *) p;
3324
3325 WMITLV_SET_HDR(&p_get_peer_info_cmd->tlv_header,
3326 WMITLV_TAG_STRUC_wmi_peer_info_req_cmd_fixed_param,
3327 WMITLV_GET_STRUCT_TLVLEN
3328 (wmi_peer_info_req_cmd_fixed_param));
3329
3330 p_get_peer_info_cmd->vdev_id = vdev_id;
3331 WMI_CHAR_ARRAY_TO_MAC_ADDR(peer_mac,
3332 &p_get_peer_info_cmd->peer_mac_address);
3333
3334 ret = wmi_unified_cmd_send(wma->wmi_handle, buf, len,
3335 WMI_PEER_INFO_REQ_CMDID);
Dustin Brown2afb6f52016-12-02 14:47:48 -08003336 if (ret != QDF_STATUS_SUCCESS)
3337 wmi_buf_free(buf);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003338
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003339 WMA_LOGE("IBSS get peer info cmd sent len: %d, vdev %d command id: %d, status: %d",
3340 len, vdev_id, WMI_PEER_INFO_REQ_CMDID, ret);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003341
3342 return QDF_STATUS_SUCCESS;
3343}
3344
3345/**
3346 * wma_process_tx_fail_monitor_ind() - sends tx fail monitor cmd to target
3347 * @wma: wma handle
3348 * @pReq: tx fail monitor command params
3349 *
3350 * Return: QDF status
3351 */
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003352QDF_STATUS wma_process_tx_fail_monitor_ind(tp_wma_handle wma,
3353 tAniTXFailMonitorInd *pReq)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003354{
3355 QDF_STATUS ret;
3356 int32_t vdev_id;
3357
3358 vdev_id = wma_find_vdev_by_type(wma, WMI_VDEV_TYPE_IBSS);
3359 if (vdev_id < 0) {
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003360 WMA_LOGE("%s: IBSS vdev does not exist could not send fast tx fail monitor indication message to target",
3361 __func__);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003362 return QDF_STATUS_E_FAILURE;
3363 }
3364
3365 /* Send enable cesium command to target */
3366 WMA_LOGE("send fast tx fail monitor ind cmd target for vdevId %d val %d",
3367 vdev_id, pReq->tx_fail_count);
3368
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003369 if (pReq->tx_fail_count == 0)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003370 wma->hddTxFailCb = NULL;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003371 else
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003372 wma->hddTxFailCb = pReq->txFailIndCallback;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003373 ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
3374 WMI_VDEV_PARAM_SET_IBSS_TX_FAIL_CNT_THR,
3375 pReq->tx_fail_count);
3376 if (ret) {
3377 WMA_LOGE("tx fail monitor failed for vdevId %d", vdev_id);
3378 return QDF_STATUS_E_FAILURE;
3379 }
3380
3381 return QDF_STATUS_SUCCESS;
3382}
3383
Rachit Kankaneee1735c2018-08-02 13:19:34 +05303384#ifdef FEATURE_WLAN_RMC
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003385/**
3386 * wma_process_rmc_enable_ind() - enables RMC functionality in target
3387 * @wma: wma handle
3388 *
3389 * Return: QDF status
3390 */
3391QDF_STATUS wma_process_rmc_enable_ind(tp_wma_handle wma)
3392{
3393 int ret;
3394 uint8_t *p;
3395 uint16_t len;
3396 wmi_buf_t buf;
3397 int32_t vdev_id;
3398 wmi_rmc_set_mode_cmd_fixed_param *p_rmc_enable_cmd;
3399
3400 vdev_id = wma_find_vdev_by_type(wma, WMI_VDEV_TYPE_IBSS);
3401 if (vdev_id < 0) {
3402 WMA_LOGE("%s: IBSS vdev does not exist could not enable RMC",
3403 __func__);
3404 return QDF_STATUS_E_FAILURE;
3405 }
3406
3407 len = sizeof(wmi_rmc_set_mode_cmd_fixed_param);
3408 buf = wmi_buf_alloc(wma->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07003409 if (!buf)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003410 return QDF_STATUS_E_FAILURE;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003411
3412 p = (uint8_t *) wmi_buf_data(buf);
3413 qdf_mem_zero(p, len);
3414 p_rmc_enable_cmd = (wmi_rmc_set_mode_cmd_fixed_param *) p;
3415
3416 WMITLV_SET_HDR(&p_rmc_enable_cmd->tlv_header,
3417 WMITLV_TAG_STRUC_wmi_rmc_set_mode_cmd_fixed_param,
3418 WMITLV_GET_STRUCT_TLVLEN
3419 (wmi_rmc_set_mode_cmd_fixed_param));
3420
3421 p_rmc_enable_cmd->vdev_id = vdev_id;
3422 p_rmc_enable_cmd->enable_rmc = WMI_RMC_MODE_ENABLED;
3423
3424 ret = wmi_unified_cmd_send(wma->wmi_handle, buf, len,
3425 WMI_RMC_SET_MODE_CMDID);
Dustin Brown2afb6f52016-12-02 14:47:48 -08003426 if (ret != QDF_STATUS_SUCCESS)
3427 wmi_buf_free(buf);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003428
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003429 WMA_LOGE("Enable RMC cmd sent len: %d, vdev %d command id: %d, status: %d",
3430 len, vdev_id, WMI_RMC_SET_MODE_CMDID, ret);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003431
3432 return QDF_STATUS_SUCCESS;
3433}
3434
3435/**
3436 * wma_process_rmc_disable_ind() - disables rmc functionality in target
3437 * @wma: wma handle
3438 *
3439 * Return: QDF status
3440 */
3441QDF_STATUS wma_process_rmc_disable_ind(tp_wma_handle wma)
3442{
3443 int ret;
3444 uint8_t *p;
3445 uint16_t len;
3446 wmi_buf_t buf;
3447 int32_t vdev_id;
3448 wmi_rmc_set_mode_cmd_fixed_param *p_rmc_disable_cmd;
3449
3450 vdev_id = wma_find_vdev_by_type(wma, WMI_VDEV_TYPE_IBSS);
3451 if (vdev_id < 0) {
3452 WMA_LOGE("%s: IBSS vdev does not exist could not disable RMC",
3453 __func__);
3454 return QDF_STATUS_E_FAILURE;
3455 }
3456
3457 len = sizeof(wmi_rmc_set_mode_cmd_fixed_param);
3458 buf = wmi_buf_alloc(wma->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07003459 if (!buf)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003460 return QDF_STATUS_E_FAILURE;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003461
3462 p = (uint8_t *) wmi_buf_data(buf);
3463 qdf_mem_zero(p, len);
3464 p_rmc_disable_cmd = (wmi_rmc_set_mode_cmd_fixed_param *) p;
3465
3466 WMITLV_SET_HDR(&p_rmc_disable_cmd->tlv_header,
3467 WMITLV_TAG_STRUC_wmi_rmc_set_mode_cmd_fixed_param,
3468 WMITLV_GET_STRUCT_TLVLEN
3469 (wmi_rmc_set_mode_cmd_fixed_param));
3470
3471 p_rmc_disable_cmd->vdev_id = vdev_id;
3472 p_rmc_disable_cmd->enable_rmc = WMI_RMC_MODE_DISABLED;
3473
3474 ret = wmi_unified_cmd_send(wma->wmi_handle, buf, len,
3475 WMI_RMC_SET_MODE_CMDID);
Dustin Brown2afb6f52016-12-02 14:47:48 -08003476 if (ret != QDF_STATUS_SUCCESS)
3477 wmi_buf_free(buf);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003478
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003479 WMA_LOGE("Disable RMC cmd sent len: %d, vdev %d command id: %d, status: %d",
3480 len, vdev_id, WMI_RMC_SET_MODE_CMDID, ret);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003481
3482 return QDF_STATUS_SUCCESS;
3483}
3484
3485/**
3486 * wma_process_rmc_action_period_ind() - sends RMC action period to target
3487 * @wma: wma handle
3488 *
3489 * Return: QDF status
3490 */
3491QDF_STATUS wma_process_rmc_action_period_ind(tp_wma_handle wma)
3492{
3493 int ret;
3494 uint8_t *p;
3495 uint16_t len;
Dustin Brownecfae9a2016-11-15 13:01:39 -08003496 uint32_t periodicity_msec;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003497 wmi_buf_t buf;
3498 int32_t vdev_id;
3499 wmi_rmc_set_action_period_cmd_fixed_param *p_rmc_cmd;
Jeff Johnson009c40f2018-11-05 09:54:37 -08003500 struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003501
3502 if (NULL == mac) {
3503 WMA_LOGE("%s: MAC mac does not exist", __func__);
3504 return QDF_STATUS_E_FAILURE;
3505 }
3506
3507 vdev_id = wma_find_vdev_by_type(wma, WMI_VDEV_TYPE_IBSS);
3508 if (vdev_id < 0) {
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003509 WMA_LOGE("%s: IBSS vdev does not exist could not send RMC action period to target",
3510 __func__);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003511 return QDF_STATUS_E_FAILURE;
3512 }
3513
3514 len = sizeof(wmi_rmc_set_action_period_cmd_fixed_param);
3515 buf = wmi_buf_alloc(wma->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07003516 if (!buf)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003517 return QDF_STATUS_E_FAILURE;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003518
3519 p = (uint8_t *) wmi_buf_data(buf);
3520 qdf_mem_zero(p, len);
3521 p_rmc_cmd = (wmi_rmc_set_action_period_cmd_fixed_param *) p;
3522
3523 WMITLV_SET_HDR(&p_rmc_cmd->tlv_header,
3524 WMITLV_TAG_STRUC_wmi_rmc_set_action_period_cmd_fixed_param,
3525 WMITLV_GET_STRUCT_TLVLEN
3526 (wmi_rmc_set_action_period_cmd_fixed_param));
3527
Bala Venkatesh2fde2c62018-09-11 20:33:24 +05303528 periodicity_msec = mac->mlme_cfg->sap_cfg.rmc_action_period_freq;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003529 p_rmc_cmd->vdev_id = vdev_id;
Dustin Brownecfae9a2016-11-15 13:01:39 -08003530 p_rmc_cmd->periodicity_msec = periodicity_msec;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003531
3532 ret = wmi_unified_cmd_send(wma->wmi_handle, buf, len,
3533 WMI_RMC_SET_ACTION_PERIOD_CMDID);
Dustin Brown2afb6f52016-12-02 14:47:48 -08003534 if (ret != QDF_STATUS_SUCCESS)
3535 wmi_buf_free(buf);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003536
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003537 WMA_LOGE("RMC action period %d cmd sent len: %d, vdev %d command id: %d, status: %d",
3538 periodicity_msec, len, vdev_id, WMI_RMC_SET_ACTION_PERIOD_CMDID,
3539 ret);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003540
3541 return QDF_STATUS_SUCCESS;
3542}
Rachit Kankaneee1735c2018-08-02 13:19:34 +05303543#endif /* FEATURE_WLAN_RMC */
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003544
3545/**
Jeff Johnson6dcb44a2018-12-23 10:17:00 -08003546 * wma_process_add_periodic_tx_ptrn_ind() - add periodic tx pattern
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003547 * @handle: wma handle
Jeff Johnson6dcb44a2018-12-23 10:17:00 -08003548 * @pattern: tx pattern params
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003549 *
Jeff Johnson6dcb44a2018-12-23 10:17:00 -08003550 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003551 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303552QDF_STATUS wma_process_add_periodic_tx_ptrn_ind(WMA_HANDLE handle,
Jeff Johnson6dcb44a2018-12-23 10:17:00 -08003553 tSirAddPeriodicTxPtrn *pattern)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003554{
3555 tp_wma_handle wma_handle = (tp_wma_handle) handle;
Mohit Khanna0fe61672016-05-19 16:53:39 -07003556 struct periodic_tx_pattern *params_ptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003557 uint8_t vdev_id;
Mohit Khanna0fe61672016-05-19 16:53:39 -07003558 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003559
3560 if (!wma_handle || !wma_handle->wmi_handle) {
3561 WMA_LOGE("%s: WMA is closed, can not issue fw add pattern cmd",
3562 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303563 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003564 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003565
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003566 if (!wma_find_vdev_by_addr(wma_handle,
Jeff Johnson6dcb44a2018-12-23 10:17:00 -08003567 pattern->mac_address.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003568 &vdev_id)) {
3569 WMA_LOGE("%s: Failed to find vdev id for %pM", __func__,
Jeff Johnson6dcb44a2018-12-23 10:17:00 -08003570 pattern->mac_address.bytes);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303571 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003572 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003573
Jeff Johnson0536c172018-12-23 10:20:06 -08003574 params_ptr = qdf_mem_malloc(sizeof(*params_ptr));
3575 if (!params_ptr)
3576 return QDF_STATUS_E_NOMEM;
3577
Jeff Johnson6dcb44a2018-12-23 10:17:00 -08003578 params_ptr->ucPtrnId = pattern->ucPtrnId;
3579 params_ptr->ucPtrnSize = pattern->ucPtrnSize;
3580 params_ptr->usPtrnIntervalMs = pattern->usPtrnIntervalMs;
3581 qdf_mem_copy(&params_ptr->mac_address, &pattern->mac_address,
3582 sizeof(struct qdf_mac_addr));
3583 qdf_mem_copy(params_ptr->ucPattern, pattern->ucPattern,
3584 params_ptr->ucPtrnSize);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003585
Jeff Johnson6dcb44a2018-12-23 10:17:00 -08003586 status = wmi_unified_process_add_periodic_tx_ptrn_cmd(
3587 wma_handle->wmi_handle, params_ptr, vdev_id);
Mohit Khanna0fe61672016-05-19 16:53:39 -07003588
3589 qdf_mem_free(params_ptr);
3590 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003591}
3592
3593/**
3594 * wma_process_del_periodic_tx_ptrn_ind - del periodic tx ptrn
3595 * @handle: wma handle
3596 * @pDelPeriodicTxPtrnParams: tx ptrn params
3597 *
Jeff Johnson6dcb44a2018-12-23 10:17:00 -08003598 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003599 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303600QDF_STATUS wma_process_del_periodic_tx_ptrn_ind(WMA_HANDLE handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003601 tSirDelPeriodicTxPtrn *
3602 pDelPeriodicTxPtrnParams)
3603{
3604 tp_wma_handle wma_handle = (tp_wma_handle) handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003605 uint8_t vdev_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003606
3607 if (!wma_handle || !wma_handle->wmi_handle) {
3608 WMA_LOGE("%s: WMA is closed, can not issue Del Pattern cmd",
3609 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303610 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003611 }
Himanshu Agarwal44195412016-03-09 13:03:54 +05303612
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003613 if (!wma_find_vdev_by_addr(wma_handle,
Srinivas Girigowdaa5bba7a2015-11-18 22:44:36 -08003614 pDelPeriodicTxPtrnParams->mac_address.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003615 &vdev_id)) {
3616 WMA_LOGE("%s: Failed to find vdev id for %pM", __func__,
Srinivas Girigowdaa5bba7a2015-11-18 22:44:36 -08003617 pDelPeriodicTxPtrnParams->mac_address.bytes);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303618 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003619 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003620
Himanshu Agarwal44195412016-03-09 13:03:54 +05303621 return wmi_unified_process_del_periodic_tx_ptrn_cmd(
3622 wma_handle->wmi_handle, vdev_id,
3623 pDelPeriodicTxPtrnParams->ucPtrnId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003624}
3625
3626#ifdef WLAN_FEATURE_STATS_EXT
3627/**
3628 * wma_stats_ext_req() - request ext stats from fw
3629 * @wma_ptr: wma handle
3630 * @preq: stats ext params
3631 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303632 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003633 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303634QDF_STATUS wma_stats_ext_req(void *wma_ptr, tpStatsExtRequest preq)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003635{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003636 tp_wma_handle wma = (tp_wma_handle) wma_ptr;
Krishna Kumaar Natarajan1b909d72016-06-06 15:02:18 -07003637 struct stats_ext_params *params;
3638 size_t params_len;
3639 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003640
Himanshu Agarwal44195412016-03-09 13:03:54 +05303641 if (!wma) {
3642 WMA_LOGE("%s: wma handle is NULL", __func__);
3643 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003644 }
3645
Krishna Kumaar Natarajan1b909d72016-06-06 15:02:18 -07003646 params_len = sizeof(*params) + preq->request_data_len;
3647 params = qdf_mem_malloc(params_len);
Arif Hussain157263f2018-10-03 13:07:15 -07003648 if (!params)
Krishna Kumaar Natarajan1b909d72016-06-06 15:02:18 -07003649 return QDF_STATUS_E_NOMEM;
Krishna Kumaar Natarajan1b909d72016-06-06 15:02:18 -07003650
3651 params->vdev_id = preq->vdev_id;
3652 params->request_data_len = preq->request_data_len;
3653 if (preq->request_data_len > 0)
3654 qdf_mem_copy(params->request_data, preq->request_data,
3655 params->request_data_len);
3656
3657 status = wmi_unified_stats_ext_req_cmd(wma->wmi_handle, params);
3658 qdf_mem_free(params);
3659
3660 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003661}
3662
3663#endif /* WLAN_FEATURE_STATS_EXT */
3664
3665#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
3666/**
3667 * wma_send_status_of_ext_wow() - send ext wow status to SME
3668 * @wma: wma handle
3669 * @status: status
3670 *
3671 * Return: none
3672 */
3673static void wma_send_status_of_ext_wow(tp_wma_handle wma, bool status)
3674{
3675 tSirReadyToExtWoWInd *ready_to_extwow;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303676 QDF_STATUS vstatus;
Rajeev Kumarcf7bd802017-04-18 11:11:42 -07003677 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003678 uint8_t len;
3679
3680 WMA_LOGD("Posting ready to suspend indication to umac");
3681
3682 len = sizeof(tSirReadyToExtWoWInd);
Arif Hussain157263f2018-10-03 13:07:15 -07003683 ready_to_extwow = qdf_mem_malloc(len);
3684 if (!ready_to_extwow)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003685 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003686
3687 ready_to_extwow->mesgType = eWNI_SME_READY_TO_EXTWOW_IND;
3688 ready_to_extwow->mesgLen = len;
3689 ready_to_extwow->status = status;
3690
Rajeev Kumarb60abe42017-01-21 15:39:31 -08003691 message.type = eWNI_SME_READY_TO_EXTWOW_IND;
3692 message.bodyptr = (void *)ready_to_extwow;
3693 message.bodyval = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003694
gaurank kathpalia00861f02018-08-28 19:16:12 +05303695 vstatus = scheduler_post_message(QDF_MODULE_ID_WMA,
3696 QDF_MODULE_ID_SME,
3697 QDF_MODULE_ID_SME, &message);
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05303698 if (vstatus != QDF_STATUS_SUCCESS)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303699 qdf_mem_free(ready_to_extwow);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003700}
3701
3702/**
3703 * wma_enable_ext_wow() - enable ext wow in fw
3704 * @wma: wma handle
3705 * @params: ext wow params
3706 *
3707 * Return:0 for success or error code
3708 */
Himanshu Agarwal44195412016-03-09 13:03:54 +05303709QDF_STATUS wma_enable_ext_wow(tp_wma_handle wma, tpSirExtWoWParams params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003710{
Himanshu Agarwal44195412016-03-09 13:03:54 +05303711 struct ext_wow_params wow_params = {0};
3712 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003713
Himanshu Agarwal44195412016-03-09 13:03:54 +05303714 if (!wma) {
3715 WMA_LOGE("%s: wma handle is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303716 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003717 }
3718
Himanshu Agarwal44195412016-03-09 13:03:54 +05303719 wow_params.vdev_id = params->vdev_id;
3720 wow_params.type = (enum wmi_ext_wow_type) params->type;
3721 wow_params.wakeup_pin_num = params->wakeup_pin_num;
3722
3723 status = wmi_unified_enable_ext_wow_cmd(wma->wmi_handle,
3724 &wow_params);
3725 if (QDF_IS_STATUS_ERROR(status))
3726 return status;
3727
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003728 wma_send_status_of_ext_wow(wma, true);
Himanshu Agarwal44195412016-03-09 13:03:54 +05303729 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003730
3731}
3732
3733/**
3734 * wma_set_app_type1_params_in_fw() - set app type1 params in fw
3735 * @wma: wma handle
3736 * @appType1Params: app type1 params
3737 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303738 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003739 */
3740int wma_set_app_type1_params_in_fw(tp_wma_handle wma,
3741 tpSirAppType1Params appType1Params)
3742{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003743 int ret;
3744
Govind Singhaa64c242016-03-08 11:31:49 +05303745 ret = wmi_unified_app_type1_params_in_fw_cmd(wma->wmi_handle,
3746 (struct app_type1_params *)appType1Params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003747 if (ret) {
3748 WMA_LOGE("%s: Failed to set APP TYPE1 PARAMS", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303749 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003750 }
3751
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303752 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003753}
3754
3755/**
3756 * wma_set_app_type2_params_in_fw() - set app type2 params in fw
3757 * @wma: wma handle
3758 * @appType2Params: app type2 params
3759 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303760 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003761 */
Himanshu Agarwal44195412016-03-09 13:03:54 +05303762QDF_STATUS wma_set_app_type2_params_in_fw(tp_wma_handle wma,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003763 tpSirAppType2Params appType2Params)
3764{
Himanshu Agarwal44195412016-03-09 13:03:54 +05303765 struct app_type2_params params = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003766
Himanshu Agarwal44195412016-03-09 13:03:54 +05303767 if (!wma) {
3768 WMA_LOGE("%s: wma handle is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303769 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003770 }
3771
Himanshu Agarwal44195412016-03-09 13:03:54 +05303772 params.vdev_id = appType2Params->vdev_id;
3773 params.rc4_key_len = appType2Params->rc4_key_len;
3774 qdf_mem_copy(params.rc4_key, appType2Params->rc4_key, 16);
3775 params.ip_id = appType2Params->ip_id;
3776 params.ip_device_ip = appType2Params->ip_device_ip;
3777 params.ip_server_ip = appType2Params->ip_server_ip;
3778 params.tcp_src_port = appType2Params->tcp_src_port;
3779 params.tcp_dst_port = appType2Params->tcp_dst_port;
3780 params.tcp_seq = appType2Params->tcp_seq;
3781 params.tcp_ack_seq = appType2Params->tcp_ack_seq;
3782 params.keepalive_init = appType2Params->keepalive_init;
3783 params.keepalive_min = appType2Params->keepalive_min;
3784 params.keepalive_max = appType2Params->keepalive_max;
3785 params.keepalive_inc = appType2Params->keepalive_inc;
3786 params.tcp_tx_timeout_val = appType2Params->tcp_tx_timeout_val;
3787 params.tcp_rx_timeout_val = appType2Params->tcp_rx_timeout_val;
3788 qdf_mem_copy(&params.gateway_mac, &appType2Params->gateway_mac,
3789 sizeof(struct qdf_mac_addr));
3790
3791 return wmi_unified_set_app_type2_params_in_fw_cmd(wma->wmi_handle,
3792 &params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003793}
3794#endif /* WLAN_FEATURE_EXTWOW_SUPPORT */
3795
3796#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
3797/**
3798 * wma_auto_shutdown_event_handler() - process auto shutdown timer trigger
3799 * @handle: wma handle
3800 * @event: event buffer
3801 * @len: buffer length
3802 *
3803 * Return: 0 for success or error code
3804 */
3805int wma_auto_shutdown_event_handler(void *handle, uint8_t *event,
3806 uint32_t len)
3807{
3808 wmi_host_auto_shutdown_event_fixed_param *wmi_auto_sh_evt;
3809 WMI_HOST_AUTO_SHUTDOWN_EVENTID_param_tlvs *param_buf =
3810 (WMI_HOST_AUTO_SHUTDOWN_EVENTID_param_tlvs *)
3811 event;
3812
3813 if (!param_buf || !param_buf->fixed_param) {
3814 WMA_LOGE("%s:%d: Invalid Auto shutdown timer evt", __func__,
3815 __LINE__);
3816 return -EINVAL;
3817 }
3818
3819 wmi_auto_sh_evt = param_buf->fixed_param;
3820
3821 if (wmi_auto_sh_evt->shutdown_reason
3822 != WMI_HOST_AUTO_SHUTDOWN_REASON_TIMER_EXPIRY) {
3823 WMA_LOGE("%s:%d: Invalid Auto shutdown timer evt", __func__,
3824 __LINE__);
3825 return -EINVAL;
3826 }
3827
3828 WMA_LOGD("%s:%d: Auto Shutdown Evt: %d", __func__, __LINE__,
3829 wmi_auto_sh_evt->shutdown_reason);
jiad391c5282018-11-26 16:21:04 +08003830 return wma_wake_reason_auto_shutdown();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003831}
3832
3833/**
3834 * wma_set_auto_shutdown_timer_req() - sets auto shutdown timer in firmware
3835 * @wma: wma handle
3836 * @auto_sh_cmd: auto shutdown timer value
3837 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303838 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003839 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303840QDF_STATUS wma_set_auto_shutdown_timer_req(tp_wma_handle wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003841 tSirAutoShutdownCmdParams *
3842 auto_sh_cmd)
3843{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003844 if (auto_sh_cmd == NULL) {
3845 WMA_LOGE("%s : Invalid Autoshutdown cfg cmd", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303846 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003847 }
3848
Himanshu Agarwal44195412016-03-09 13:03:54 +05303849 return wmi_unified_set_auto_shutdown_timer_cmd(wma_handle->wmi_handle,
3850 auto_sh_cmd->timer_val);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003851}
3852#endif /* FEATURE_WLAN_AUTO_SHUTDOWN */
3853
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003854#ifdef DHCP_SERVER_OFFLOAD
3855/**
3856 * wma_process_dhcpserver_offload() - enable DHCP server offload
3857 * @wma_handle: wma handle
3858 * @pDhcpSrvOffloadInfo: DHCP server offload info
3859 *
3860 * Return: 0 for success or error code
3861 */
Himanshu Agarwal44195412016-03-09 13:03:54 +05303862QDF_STATUS wma_process_dhcpserver_offload(tp_wma_handle wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003863 tSirDhcpSrvOffloadInfo *
3864 pDhcpSrvOffloadInfo)
3865{
Himanshu Agarwal44195412016-03-09 13:03:54 +05303866 struct dhcp_offload_info_params params = {0};
3867 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003868
Himanshu Agarwal44195412016-03-09 13:03:54 +05303869 if (!wma_handle) {
3870 WMA_LOGE("%s: wma handle is NULL", __func__);
Jeff Johnsone77641e2019-02-15 09:00:41 -08003871 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003872 }
Himanshu Agarwal44195412016-03-09 13:03:54 +05303873
3874 params.vdev_id = pDhcpSrvOffloadInfo->vdev_id;
Jeff Johnson678c52c2017-10-04 19:35:36 -07003875 params.dhcp_offload_enabled =
Himanshu Agarwal44195412016-03-09 13:03:54 +05303876 pDhcpSrvOffloadInfo->dhcpSrvOffloadEnabled;
Jeff Johnson678c52c2017-10-04 19:35:36 -07003877 params.dhcp_client_num = pDhcpSrvOffloadInfo->dhcpClientNum;
3878 params.dhcp_srv_addr = pDhcpSrvOffloadInfo->dhcpSrvIP;
Himanshu Agarwal44195412016-03-09 13:03:54 +05303879
3880 status = wmi_unified_process_dhcpserver_offload_cmd(
3881 wma_handle->wmi_handle, &params);
3882 if (QDF_IS_STATUS_ERROR(status))
3883 return status;
3884
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003885 WMA_LOGD("Set dhcp server offload to vdevId %d",
3886 pDhcpSrvOffloadInfo->vdev_id);
Himanshu Agarwal44195412016-03-09 13:03:54 +05303887 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003888}
3889#endif /* DHCP_SERVER_OFFLOAD */
3890
3891#ifdef WLAN_FEATURE_GPIO_LED_FLASHING
3892/**
3893 * wma_set_led_flashing() - set led flashing in fw
3894 * @wma_handle: wma handle
3895 * @flashing: flashing request
3896 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303897 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003898 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303899QDF_STATUS wma_set_led_flashing(tp_wma_handle wma_handle,
Jeff Johnson5a6b6602017-10-04 14:44:30 -07003900 struct flashing_req_params *flashing)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003901{
Jeff Johnson5a6b6602017-10-04 14:44:30 -07003902 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003903
3904 if (!wma_handle || !wma_handle->wmi_handle) {
3905 WMA_LOGE(FL("WMA is closed, can not issue cmd"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303906 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003907 }
3908 if (!flashing) {
3909 WMA_LOGE(FL("invalid parameter: flashing"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303910 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003911 }
Govind Singhaa64c242016-03-08 11:31:49 +05303912 status = wmi_unified_set_led_flashing_cmd(wma_handle->wmi_handle,
Jeff Johnson5a6b6602017-10-04 14:44:30 -07003913 flashing);
3914 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003915}
3916#endif /* WLAN_FEATURE_GPIO_LED_FLASHING */
3917
Kabilan Kannanebe01e72018-06-13 01:13:46 -07003918int wma_sar_rsp_evt_handler(ol_scn_t handle, uint8_t *event, uint32_t len)
Kabilan Kannancaa85502018-04-13 18:04:58 -07003919{
Kabilan Kannanebe01e72018-06-13 01:13:46 -07003920 tp_wma_handle wma_handle;
3921 wmi_unified_t wmi_handle;
Kabilan Kannancaa85502018-04-13 18:04:58 -07003922 QDF_STATUS status;
3923
Kabilan Kannanebe01e72018-06-13 01:13:46 -07003924 WMA_LOGD(FL("handle:%pK event:%pK len:%u"), handle, event, len);
3925
3926 wma_handle = handle;
3927 if (!wma_handle) {
3928 WMA_LOGE(FL("NULL wma_handle"));
3929 return QDF_STATUS_E_INVAL;
3930 }
3931
3932 wmi_handle = wma_handle->wmi_handle;
3933 if (!wmi_handle) {
3934 WMA_LOGE(FL("NULL wmi_handle"));
3935 return QDF_STATUS_E_INVAL;
3936 }
3937
3938 status = wmi_unified_extract_sar2_result_event(wmi_handle,
Kabilan Kannancaa85502018-04-13 18:04:58 -07003939 event, len);
3940 if (QDF_IS_STATUS_ERROR(status)) {
3941 WMA_LOGE(FL("Event extract failure: %d"), status);
3942 return -EINVAL;
3943 }
3944
3945 return 0;
3946}
3947
Nirav Shaheb017be2018-02-15 11:20:58 +05303948#ifdef FEATURE_WLAN_CH_AVOID
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003949/**
3950 * wma_process_ch_avoid_update_req() - handles channel avoid update request
3951 * @wma_handle: wma handle
3952 * @ch_avoid_update_req: channel avoid update params
3953 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303954 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003955 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303956QDF_STATUS wma_process_ch_avoid_update_req(tp_wma_handle wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003957 tSirChAvoidUpdateReq *
3958 ch_avoid_update_req)
3959{
Himanshu Agarwal44195412016-03-09 13:03:54 +05303960 QDF_STATUS status;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003961
Himanshu Agarwal44195412016-03-09 13:03:54 +05303962 if (!wma_handle) {
3963 WMA_LOGE("%s: wma handle is NULL", __func__);
3964 return QDF_STATUS_E_FAILURE;
3965 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003966 if (ch_avoid_update_req == NULL) {
3967 WMA_LOGE("%s : ch_avoid_update_req is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303968 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003969 }
3970
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08003971 WMA_LOGD("%s: WMA --> WMI_CHAN_AVOID_UPDATE", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003972
Himanshu Agarwal44195412016-03-09 13:03:54 +05303973 status = wmi_unified_process_ch_avoid_update_cmd(
3974 wma_handle->wmi_handle);
3975 if (QDF_IS_STATUS_ERROR(status))
3976 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003977
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08003978 WMA_LOGD("%s: WMA --> WMI_CHAN_AVOID_UPDATE sent through WMI",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003979 __func__);
Himanshu Agarwal44195412016-03-09 13:03:54 +05303980 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003981}
Nirav Shaheb017be2018-02-15 11:20:58 +05303982#endif
Kiran Kumar Lokere0751f0e2017-07-21 19:42:36 -07003983
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003984/**
3985 * wma_send_regdomain_info_to_fw() - send regdomain info to fw
3986 * @reg_dmn: reg domain
3987 * @regdmn2G: 2G reg domain
3988 * @regdmn5G: 5G reg domain
3989 * @ctl2G: 2G test limit
3990 * @ctl5G: 5G test limit
3991 *
3992 * Return: none
3993 */
3994void wma_send_regdomain_info_to_fw(uint32_t reg_dmn, uint16_t regdmn2G,
Rajeev Kumar Sirasanagandla873b6d92017-06-06 13:11:17 +05303995 uint16_t regdmn5G, uint8_t ctl2G,
3996 uint8_t ctl5G)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003997{
Anurag Chouhan6d760662016-02-20 16:05:43 +05303998 tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003999 int32_t cck_mask_val = 0;
Govind Singhd76a5b02016-03-08 15:12:14 +05304000 struct pdev_params pdev_param = {0};
Himanshu Agarwal44195412016-03-09 13:03:54 +05304001 QDF_STATUS ret = QDF_STATUS_SUCCESS;
4002 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004003
Amar Singhal50d30752018-04-12 13:44:10 -07004004 WMA_LOGD("reg_dmn: %d regdmn2g: %d regdmn5g :%d ctl2g: %d ctl5g: %d",
4005 reg_dmn, regdmn2G, regdmn5G, ctl2G, ctl5G);
4006
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004007 if (NULL == wma) {
4008 WMA_LOGE("%s: wma context is NULL", __func__);
4009 return;
4010 }
4011
Himanshu Agarwal44195412016-03-09 13:03:54 +05304012 status = wmi_unified_send_regdomain_info_to_fw_cmd(wma->wmi_handle,
4013 reg_dmn, regdmn2G, regdmn5G, ctl2G, ctl5G);
4014 if (status == QDF_STATUS_E_NOMEM)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004015 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004016
Ashish Kumar Dhanotiyabfee5892017-09-19 18:05:21 +05304017 if ((((reg_dmn & ~CTRY_FLAG) == CTRY_JAPAN15) ||
Amar Singhal5f997862016-08-24 13:17:50 -07004018 ((reg_dmn & ~CTRY_FLAG) == CTRY_KOREA_ROC)) &&
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004019 (true == wma->tx_chain_mask_cck))
4020 cck_mask_val = 1;
4021
4022 cck_mask_val |= (wma->self_gen_frm_pwr << 16);
Govind Singhd76a5b02016-03-08 15:12:14 +05304023 pdev_param.param_id = WMI_PDEV_PARAM_TX_CHAIN_MASK_CCK;
4024 pdev_param.param_value = cck_mask_val;
4025 ret = wmi_unified_pdev_param_send(wma->wmi_handle,
4026 &pdev_param,
4027 WMA_WILDCARD_PDEV_ID);
4028
Himanshu Agarwal44195412016-03-09 13:03:54 +05304029 if (QDF_IS_STATUS_ERROR(ret))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004030 WMA_LOGE("failed to set PDEV tx_chain_mask_cck %d",
4031 ret);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004032}
4033
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004034#ifdef FEATURE_WLAN_TDLS
4035/**
4036 * wma_tdls_event_handler() - handle TDLS event
4037 * @handle: wma handle
4038 * @event: event buffer
4039 * @len: buffer length
4040 *
4041 * Return: 0 for success or error code
4042 */
4043int wma_tdls_event_handler(void *handle, uint8_t *event, uint32_t len)
4044{
Frank Liu1a912b22017-09-06 17:47:32 +08004045 /* TODO update with target rx ops */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004046 return 0;
4047}
4048
4049/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004050 * wma_update_tdls_peer_state() - update TDLS peer state
4051 * @handle: wma handle
4052 * @peerStateParams: TDLS peer state params
4053 *
4054 * Return: 0 for success or error code
4055 */
4056int wma_update_tdls_peer_state(WMA_HANDLE handle,
4057 tTdlsPeerStateParams *peerStateParams)
4058{
4059 tp_wma_handle wma_handle = (tp_wma_handle) handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004060 uint32_t i;
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004061 struct cdp_pdev *pdev;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004062 uint8_t peer_id;
Leo Chang96464902016-10-28 11:10:54 -07004063 void *peer;
4064 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07004065 uint8_t *peer_mac_addr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004066 int ret = 0;
Kabilan Kannanc89fe712016-07-21 06:57:12 -07004067 uint32_t *ch_mhz = NULL;
Poddar, Siddarth5a91f5b2016-04-28 12:24:10 +05304068 bool restore_last_peer = false;
Pragaspathi Thilagaraj46e10b32018-11-12 16:23:02 +05304069 QDF_STATUS qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004070
4071 if (!wma_handle || !wma_handle->wmi_handle) {
4072 WMA_LOGE("%s: WMA is closed, can not issue cmd", __func__);
4073 ret = -EINVAL;
4074 goto end_tdls_peer_state;
4075 }
4076
Nishank Aggarwala13b61d2016-12-01 12:53:58 +05304077 if (!soc) {
4078 WMA_LOGE("%s: SOC context is NULL", __func__);
4079 ret = -EINVAL;
4080 goto end_tdls_peer_state;
4081 }
4082
Nitesh Shah622d3122017-06-05 17:04:06 +05304083 if (wma_is_roam_synch_in_progress(wma_handle,
4084 peerStateParams->vdevId)) {
4085 WMA_LOGE("%s: roaming in progress, reject peer update cmd!",
4086 __func__);
4087 ret = -EPERM;
4088 goto end_tdls_peer_state;
4089 }
4090
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004091 /* peer capability info is valid only when peer state is connected */
Jeff Johnsonf51c7fa2019-02-07 12:21:13 -08004092 if (TDLS_PEER_STATE_CONNECTED != peerStateParams->peerState) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304093 qdf_mem_zero(&peerStateParams->peerCap,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004094 sizeof(tTdlsPeerCapParams));
4095 }
4096
Kabilan Kannanc89fe712016-07-21 06:57:12 -07004097 if (peerStateParams->peerCap.peerChanLen) {
4098 ch_mhz = qdf_mem_malloc(sizeof(uint32_t) *
4099 peerStateParams->peerCap.peerChanLen);
Arif Hussain157263f2018-10-03 13:07:15 -07004100 if (!ch_mhz) {
Kabilan Kannanc89fe712016-07-21 06:57:12 -07004101 ret = -ENOMEM;
4102 goto end_tdls_peer_state;
4103 }
Naveen Rawat35804772016-06-27 15:40:28 -07004104 }
4105
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004106 for (i = 0; i < peerStateParams->peerCap.peerChanLen; ++i) {
Govind Singhaa64c242016-03-08 11:31:49 +05304107 ch_mhz[i] =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004108 cds_chan_to_freq(peerStateParams->peerCap.peerChan[i].
4109 chanId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004110 }
4111
Ganesh Kondabattini3bf9efe2017-04-13 19:08:56 +05304112 /* Make sure that peer exists before sending peer state cmd*/
4113 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
4114 if (!pdev) {
4115 WMA_LOGE("%s: Failed to find pdev", __func__);
4116 ret = -EIO;
4117 goto end_tdls_peer_state;
4118 }
4119
4120 peer = cdp_peer_find_by_addr(soc,
4121 pdev,
4122 peerStateParams->peerMacAddr,
4123 &peer_id);
4124 if (!peer) {
4125 WMA_LOGE("%s: Failed to get peer handle using peer mac %pM",
4126 __func__, peerStateParams->peerMacAddr);
4127 ret = -EIO;
4128 goto end_tdls_peer_state;
4129 }
4130
Govind Singhaa64c242016-03-08 11:31:49 +05304131 if (wmi_unified_update_tdls_peer_state_cmd(wma_handle->wmi_handle,
Jeff Johnsonf1158942019-02-07 17:26:41 -08004132 (void *)peerStateParams,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004133 ch_mhz)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004134 WMA_LOGE("%s: failed to send tdls peer update state command",
4135 __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004136 ret = -EIO;
4137 goto end_tdls_peer_state;
4138 }
4139
4140 /* in case of teardown, remove peer from fw */
Jeff Johnsonf51c7fa2019-02-07 12:21:13 -08004141 if (TDLS_PEER_STATE_TEARDOWN == peerStateParams->peerState) {
Leo Chang96464902016-10-28 11:10:54 -07004142 peer_mac_addr = cdp_peer_get_peer_mac_addr(soc, peer);
Nishank Aggarwala13b61d2016-12-01 12:53:58 +05304143 if (peer_mac_addr == NULL) {
4144 WMA_LOGE("peer_mac_addr is NULL");
4145 ret = -EIO;
4146 goto end_tdls_peer_state;
4147 }
4148
Leo Chang96464902016-10-28 11:10:54 -07004149 restore_last_peer = cdp_peer_is_vdev_restore_last_peer(
4150 soc, peer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004151
4152 WMA_LOGD("%s: calling wma_remove_peer for peer " MAC_ADDRESS_STR
4153 " vdevId: %d", __func__,
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07004154 MAC_ADDR_ARRAY(peer_mac_addr),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004155 peerStateParams->vdevId);
Pragaspathi Thilagaraj46e10b32018-11-12 16:23:02 +05304156 qdf_status = wma_remove_peer(wma_handle, peer_mac_addr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004157 peerStateParams->vdevId, peer, false);
Pragaspathi Thilagaraj46e10b32018-11-12 16:23:02 +05304158 if (QDF_IS_STATUS_ERROR(qdf_status)) {
4159 WMA_LOGE(FL("wma_remove_peer failed"));
4160 ret = -EINVAL;
4161 goto end_tdls_peer_state;
4162 }
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004163 cdp_peer_update_last_real_peer(soc,
4164 pdev, peer, &peer_id,
4165 restore_last_peer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004166 }
4167
4168end_tdls_peer_state:
Kabilan Kannanc89fe712016-07-21 06:57:12 -07004169 if (ch_mhz)
4170 qdf_mem_free(ch_mhz);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004171 if (peerStateParams)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304172 qdf_mem_free(peerStateParams);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004173 return ret;
4174}
4175#endif /* FEATURE_WLAN_TDLS */
4176
Kiran Kumar Lokereee205772018-09-27 00:27:27 -07004177/*
4178 * wma_process_cfg_action_frm_tb_ppdu() - action frame TB PPDU cfg to firmware
4179 * @wma: Pointer to WMA handle
4180 * @cfg_info: Pointer for cfg info
4181 *
4182 * Return: QDF_STATUS_SUCCESS for success otherwise failure
4183 *
4184 */
4185QDF_STATUS wma_process_cfg_action_frm_tb_ppdu(tp_wma_handle wma,
4186 struct cfg_action_frm_tb_ppdu *cfg_info)
4187{
4188 struct cfg_action_frm_tb_ppdu_param cmd = {0};
4189
4190 if (!wma) {
4191 WMA_LOGE(FL("WMA pointer is NULL"));
4192 return QDF_STATUS_E_FAILURE;
4193 }
4194
4195 cmd.frm_len = cfg_info->frm_len;
4196 cmd.cfg = cfg_info->cfg;
4197 cmd.data = cfg_info->data;
4198
4199 WMA_LOGD(FL("cfg: %d, frm_len: %d"),
4200 cfg_info->cfg, cfg_info->frm_len);
4201
4202 return wmi_unified_cfg_action_frm_tb_ppdu_cmd(wma->wmi_handle, &cmd);
4203}
4204
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004205
4206/*
4207 * wma_process_set_ie_info() - Function to send IE info to firmware
4208 * @wma: Pointer to WMA handle
4209 * @ie_data: Pointer for ie data
4210 *
4211 * This function sends IE information to firmware
4212 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304213 * Return: QDF_STATUS_SUCCESS for success otherwise failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004214 *
4215 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304216QDF_STATUS wma_process_set_ie_info(tp_wma_handle wma,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004217 struct vdev_ie_info *ie_info)
4218{
Naveen Rawatb47287a2017-01-05 15:50:52 -08004219 struct wma_txrx_node *interface;
Govind Singhaa64c242016-03-08 11:31:49 +05304220 struct vdev_ie_info_param cmd = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004221
4222 if (!ie_info || !wma) {
4223 WMA_LOGE(FL("input pointer is NULL"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304224 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004225 }
4226
4227 /* Validate the input */
4228 if (ie_info->length <= 0) {
4229 WMA_LOGE(FL("Invalid IE length"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304230 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004231 }
4232
Pragaspathi Thilagarajf81a8f02018-08-15 21:44:07 +05304233 if (!wma_is_vdev_valid(ie_info->vdev_id)) {
Naveen Rawatb47287a2017-01-05 15:50:52 -08004234 WMA_LOGE(FL("vdev_id: %d is not active"), ie_info->vdev_id);
4235 return QDF_STATUS_E_INVAL;
4236 }
4237
Pragaspathi Thilagaraj0d1159e2018-08-08 19:00:36 +05304238 interface = &wma->interfaces[ie_info->vdev_id];
Govind Singhaa64c242016-03-08 11:31:49 +05304239 cmd.vdev_id = ie_info->vdev_id;
4240 cmd.ie_id = ie_info->ie_id;
4241 cmd.length = ie_info->length;
Naveen Rawat03e8d952016-08-01 15:22:20 -07004242 cmd.band = ie_info->band;
Govind Singhaa64c242016-03-08 11:31:49 +05304243 cmd.data = ie_info->data;
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +05304244 cmd.ie_source = WMA_SET_VDEV_IE_SOURCE_HOST;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004245
Selvaraj, Sridhard1225e62017-03-17 12:56:58 +05304246 WMA_LOGD(FL("vdev id: %d, ie_id: %d, band: %d, len: %d"),
4247 ie_info->vdev_id, ie_info->ie_id, ie_info->band,
4248 ie_info->length);
Naveen Rawat03e8d952016-08-01 15:22:20 -07004249
4250 QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG,
4251 ie_info->data, ie_info->length);
4252
Pragaspathi Thilagaraj0d1159e2018-08-08 19:00:36 +05304253 return wmi_unified_process_set_ie_info_cmd(wma->wmi_handle, &cmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004254}
4255
Nachiket Kukade177b5b02018-05-22 20:52:17 +05304256#ifdef FEATURE_WLAN_APF
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304257/**
Nachiket Kukadee547a482018-05-22 16:43:30 +05304258 * wma_get_apf_caps_event_handler() - Event handler for get apf capability
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304259 * @handle: WMA global handle
4260 * @cmd_param_info: command event data
4261 * @len: Length of @cmd_param_info
4262 *
4263 * Return: 0 on Success or Errno on failure
4264 */
Nachiket Kukadee547a482018-05-22 16:43:30 +05304265int wma_get_apf_caps_event_handler(void *handle, u_int8_t *cmd_param_info,
4266 u_int32_t len)
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304267{
4268 WMI_BPF_CAPABILIY_INFO_EVENTID_param_tlvs *param_buf;
4269 wmi_bpf_capability_info_evt_fixed_param *event;
Nachiket Kukadee547a482018-05-22 16:43:30 +05304270 struct sir_apf_get_offload *apf_get_offload;
Jeff Johnson9f18aa72018-12-02 12:05:12 -08004271 struct mac_context *pmac = (struct mac_context *)cds_get_context(
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304272 QDF_MODULE_ID_PE);
4273
4274 if (!pmac) {
4275 WMA_LOGE("%s: Invalid pmac", __func__);
4276 return -EINVAL;
4277 }
Nachiket Kukadee547a482018-05-22 16:43:30 +05304278 if (!pmac->sme.apf_get_offload_cb) {
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304279 WMA_LOGE("%s: Callback not registered", __func__);
4280 return -EINVAL;
4281 }
4282
4283 param_buf = (WMI_BPF_CAPABILIY_INFO_EVENTID_param_tlvs *)cmd_param_info;
4284 event = param_buf->fixed_param;
Nachiket Kukadee547a482018-05-22 16:43:30 +05304285 apf_get_offload = qdf_mem_malloc(sizeof(*apf_get_offload));
Arif Hussain157263f2018-10-03 13:07:15 -07004286 if (!apf_get_offload)
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304287 return -ENOMEM;
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304288
Nachiket Kukadee547a482018-05-22 16:43:30 +05304289 apf_get_offload->apf_version = event->bpf_version;
4290 apf_get_offload->max_apf_filters = event->max_bpf_filters;
4291 apf_get_offload->max_bytes_for_apf_inst =
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304292 event->max_bytes_for_bpf_inst;
Nachiket Kukadee547a482018-05-22 16:43:30 +05304293 WMA_LOGD("%s: APF capabilities version: %d max apf filter size: %d",
4294 __func__, apf_get_offload->apf_version,
4295 apf_get_offload->max_bytes_for_apf_inst);
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304296
Nachiket Kukadee547a482018-05-22 16:43:30 +05304297 WMA_LOGD("%s: sending apf capabilities event to hdd", __func__);
4298 pmac->sme.apf_get_offload_cb(pmac->sme.apf_get_offload_context,
4299 apf_get_offload);
4300 qdf_mem_free(apf_get_offload);
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304301 return 0;
4302}
4303
Nachiket Kukadee547a482018-05-22 16:43:30 +05304304QDF_STATUS wma_get_apf_capabilities(tp_wma_handle wma)
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304305{
4306 QDF_STATUS status = QDF_STATUS_SUCCESS;
4307 wmi_bpf_get_capability_cmd_fixed_param *cmd;
4308 wmi_buf_t wmi_buf;
4309 uint32_t len;
4310 u_int8_t *buf_ptr;
4311
4312 if (!wma || !wma->wmi_handle) {
Nachiket Kukadee547a482018-05-22 16:43:30 +05304313 WMA_LOGE(FL("WMA is closed, can not issue get APF capab"));
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304314 return QDF_STATUS_E_INVAL;
4315 }
4316
Nachiket Kukadee547a482018-05-22 16:43:30 +05304317 if (!wmi_service_enabled(wma->wmi_handle, wmi_service_apf_offload)) {
4318 WMA_LOGE(FL("APF cababilities feature bit not enabled"));
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304319 return QDF_STATUS_E_FAILURE;
4320 }
4321
4322 len = sizeof(*cmd);
4323 wmi_buf = wmi_buf_alloc(wma->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07004324 if (!wmi_buf)
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304325 return QDF_STATUS_E_NOMEM;
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304326
4327 buf_ptr = (u_int8_t *) wmi_buf_data(wmi_buf);
4328 cmd = (wmi_bpf_get_capability_cmd_fixed_param *) buf_ptr;
4329 WMITLV_SET_HDR(&cmd->tlv_header,
4330 WMITLV_TAG_STRUC_wmi_bpf_get_capability_cmd_fixed_param,
4331 WMITLV_GET_STRUCT_TLVLEN(
4332 wmi_bpf_get_capability_cmd_fixed_param));
4333
4334 if (wmi_unified_cmd_send(wma->wmi_handle, wmi_buf, len,
Nachiket Kukadee547a482018-05-22 16:43:30 +05304335 WMI_BPF_GET_CAPABILITY_CMDID)) {
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304336 wmi_buf_free(wmi_buf);
4337 return QDF_STATUS_E_FAILURE;
4338 }
4339 return status;
4340}
4341
Nachiket Kukadee547a482018-05-22 16:43:30 +05304342QDF_STATUS wma_set_apf_instructions(tp_wma_handle wma,
4343 struct sir_apf_set_offload *apf_set_offload)
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304344{
4345 wmi_bpf_set_vdev_instructions_cmd_fixed_param *cmd;
4346 wmi_buf_t wmi_buf;
4347 uint32_t len = 0, len_aligned = 0;
4348 u_int8_t *buf_ptr;
4349
4350 if (!wma || !wma->wmi_handle) {
Nachiket Kukadee547a482018-05-22 16:43:30 +05304351 WMA_LOGE("%s: WMA is closed, can not issue set APF capability",
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304352 __func__);
4353 return QDF_STATUS_E_INVAL;
4354 }
4355
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304356 if (!wmi_service_enabled(wma->wmi_handle,
Nachiket Kukadee547a482018-05-22 16:43:30 +05304357 wmi_service_apf_offload)) {
4358 WMA_LOGE(FL("APF offload feature Disabled"));
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304359 return QDF_STATUS_E_NOSUPPORT;
4360 }
4361
Nachiket Kukadee547a482018-05-22 16:43:30 +05304362 if (!apf_set_offload) {
4363 WMA_LOGE("%s: Invalid APF instruction request", __func__);
Rajeev Kumar90016022017-08-22 14:00:48 -07004364 return QDF_STATUS_E_INVAL;
4365 }
4366
Nachiket Kukadee547a482018-05-22 16:43:30 +05304367 if (apf_set_offload->session_id >= wma->max_bssid) {
Rajeev Kumar90016022017-08-22 14:00:48 -07004368 WMA_LOGE(FL("Invalid vdev_id: %d"),
Nachiket Kukadee547a482018-05-22 16:43:30 +05304369 apf_set_offload->session_id);
Rajeev Kumar90016022017-08-22 14:00:48 -07004370 return QDF_STATUS_E_INVAL;
4371 }
4372
Nachiket Kukadee547a482018-05-22 16:43:30 +05304373 if (!wma_is_vdev_up(apf_set_offload->session_id)) {
4374 WMA_LOGE("vdev %d is not up skipping APF offload",
4375 apf_set_offload->session_id);
Rajeev Kumar90016022017-08-22 14:00:48 -07004376 return QDF_STATUS_E_INVAL;
4377 }
4378
Nachiket Kukadee547a482018-05-22 16:43:30 +05304379 if (apf_set_offload->total_length) {
4380 len_aligned = roundup(apf_set_offload->current_length,
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304381 sizeof(A_UINT32));
4382 len = len_aligned + WMI_TLV_HDR_SIZE;
4383 }
4384
4385 len += sizeof(*cmd);
4386 wmi_buf = wmi_buf_alloc(wma->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07004387 if (!wmi_buf)
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304388 return QDF_STATUS_E_NOMEM;
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304389
4390 buf_ptr = (u_int8_t *) wmi_buf_data(wmi_buf);
4391 cmd = (wmi_bpf_set_vdev_instructions_cmd_fixed_param *) buf_ptr;
4392
4393 WMITLV_SET_HDR(&cmd->tlv_header,
4394 WMITLV_TAG_STRUC_wmi_bpf_set_vdev_instructions_cmd_fixed_param,
4395 WMITLV_GET_STRUCT_TLVLEN(
4396 wmi_bpf_set_vdev_instructions_cmd_fixed_param));
Nachiket Kukadee547a482018-05-22 16:43:30 +05304397 cmd->vdev_id = apf_set_offload->session_id;
4398 cmd->filter_id = apf_set_offload->filter_id;
4399 cmd->total_length = apf_set_offload->total_length;
4400 cmd->current_offset = apf_set_offload->current_offset;
4401 cmd->current_length = apf_set_offload->current_length;
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304402
Nachiket Kukadee547a482018-05-22 16:43:30 +05304403 if (apf_set_offload->total_length) {
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304404 buf_ptr +=
4405 sizeof(wmi_bpf_set_vdev_instructions_cmd_fixed_param);
4406 WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_BYTE, len_aligned);
4407 buf_ptr += WMI_TLV_HDR_SIZE;
Nachiket Kukadee547a482018-05-22 16:43:30 +05304408 qdf_mem_copy(buf_ptr, apf_set_offload->program,
4409 apf_set_offload->current_length);
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304410 }
4411
4412 if (wmi_unified_cmd_send(wma->wmi_handle, wmi_buf, len,
Nachiket Kukadee547a482018-05-22 16:43:30 +05304413 WMI_BPF_SET_VDEV_INSTRUCTIONS_CMDID)) {
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304414 wmi_buf_free(wmi_buf);
4415 return QDF_STATUS_E_FAILURE;
4416 }
Nachiket Kukadee547a482018-05-22 16:43:30 +05304417 WMA_LOGD(FL("APF offload enabled in fw"));
Rajeev Kumar90016022017-08-22 14:00:48 -07004418
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304419 return QDF_STATUS_SUCCESS;
4420}
Peng Xu8fdaa492016-06-22 10:20:47 -07004421
Nachiket Kukade177b5b02018-05-22 20:52:17 +05304422QDF_STATUS wma_send_apf_enable_cmd(WMA_HANDLE handle, uint8_t vdev_id,
4423 bool apf_enable)
4424{
4425 QDF_STATUS status = QDF_STATUS_SUCCESS;
4426 tp_wma_handle wma = (tp_wma_handle) handle;
4427
4428 if (!wma || !wma->wmi_handle) {
4429 WMA_LOGE(FL("WMA is closed, can not issue get APF capab"));
4430 return QDF_STATUS_E_INVAL;
4431 }
4432
4433 if (!WMI_SERVICE_IS_ENABLED(wma->wmi_service_bitmap,
4434 WMI_SERVICE_BPF_OFFLOAD)) {
4435 WMA_LOGE(FL("APF cababilities feature bit not enabled"));
4436 return QDF_STATUS_E_FAILURE;
4437 }
4438
4439 status = wmi_unified_send_apf_enable_cmd(wma->wmi_handle, vdev_id,
4440 apf_enable);
4441 if (QDF_IS_STATUS_ERROR(status)) {
4442 WMA_LOGE("Failed to send apf enable/disable cmd");
4443 return QDF_STATUS_E_FAILURE;
4444 }
4445
4446 if (apf_enable)
4447 WMA_LOGD("Sent APF Enable on vdevid: %d", vdev_id);
4448 else
4449 WMA_LOGD("Sent APF Disable on vdevid: %d", vdev_id);
4450
4451 return status;
4452}
4453
4454QDF_STATUS
4455wma_send_apf_write_work_memory_cmd(WMA_HANDLE handle,
4456 struct wmi_apf_write_memory_params
4457 *write_params)
4458{
4459 QDF_STATUS status = QDF_STATUS_SUCCESS;
4460 tp_wma_handle wma = (tp_wma_handle) handle;
4461
4462 if (!wma || !wma->wmi_handle) {
4463 WMA_LOGE(FL("WMA is closed, can not issue write APF mem"));
4464 return QDF_STATUS_E_INVAL;
4465 }
4466
4467 if (!WMI_SERVICE_IS_ENABLED(wma->wmi_service_bitmap,
4468 WMI_SERVICE_BPF_OFFLOAD)) {
4469 WMA_LOGE(FL("APF cababilities feature bit not enabled"));
4470 return QDF_STATUS_E_FAILURE;
4471 }
4472
4473 if (wmi_unified_send_apf_write_work_memory_cmd(wma->wmi_handle,
4474 write_params)) {
4475 WMA_LOGE(FL("Failed to send APF write mem command"));
4476 return QDF_STATUS_E_FAILURE;
4477 }
4478
4479 WMA_LOGD("Sent APF wite mem on vdevid: %d", write_params->vdev_id);
4480 return status;
4481}
4482
4483int wma_apf_read_work_memory_event_handler(void *handle, uint8_t *evt_buf,
4484 uint32_t len)
4485{
4486 tp_wma_handle wma_handle;
4487 wmi_unified_t wmi_handle;
4488 struct wmi_apf_read_memory_resp_event_params evt_params = {0};
4489 QDF_STATUS status;
Jeff Johnson9f18aa72018-12-02 12:05:12 -08004490 struct mac_context *pmac = cds_get_context(QDF_MODULE_ID_PE);
Nachiket Kukade177b5b02018-05-22 20:52:17 +05304491
Yeshwanth Sriram Guntukacbe61442018-08-23 18:08:44 +05304492 WMA_LOGD(FL("handle:%pK event:%pK len:%u"), handle, evt_buf, len);
Nachiket Kukade177b5b02018-05-22 20:52:17 +05304493
4494 wma_handle = handle;
4495 if (!wma_handle) {
4496 WMA_LOGE(FL("NULL wma_handle"));
4497 return -EINVAL;
4498 }
4499
4500 wmi_handle = wma_handle->wmi_handle;
4501 if (!wmi_handle) {
4502 WMA_LOGE(FL("NULL wmi_handle"));
4503 return -EINVAL;
4504 }
4505
4506 if (!pmac) {
4507 WMA_LOGE(FL("Invalid pmac"));
4508 return -EINVAL;
4509 }
4510
4511 if (!pmac->sme.apf_read_mem_cb) {
4512 WMA_LOGE(FL("Callback not registered"));
4513 return -EINVAL;
4514 }
4515
4516 status = wmi_extract_apf_read_memory_resp_event(wmi_handle,
4517 evt_buf, &evt_params);
4518 if (QDF_IS_STATUS_ERROR(status)) {
4519 WMA_LOGE(FL("Event extract failure: %d"), status);
4520 return -EINVAL;
4521 }
4522
Jeff Johnson6aaaa992018-06-30 10:43:04 -07004523 pmac->sme.apf_read_mem_cb(pmac->hdd_handle, &evt_params);
Nachiket Kukade177b5b02018-05-22 20:52:17 +05304524
4525 return 0;
4526}
4527
4528QDF_STATUS wma_send_apf_read_work_memory_cmd(WMA_HANDLE handle,
4529 struct wmi_apf_read_memory_params
4530 *read_params)
4531{
4532 QDF_STATUS status = QDF_STATUS_SUCCESS;
4533 tp_wma_handle wma = (tp_wma_handle) handle;
4534
4535 if (!wma || !wma->wmi_handle) {
4536 WMA_LOGE(FL("WMA is closed, can not issue read APF memory"));
4537 return QDF_STATUS_E_INVAL;
4538 }
4539
4540 if (!WMI_SERVICE_IS_ENABLED(wma->wmi_service_bitmap,
4541 WMI_SERVICE_BPF_OFFLOAD)) {
4542 WMA_LOGE(FL("APF cababilities feature bit not enabled"));
4543 return QDF_STATUS_E_FAILURE;
4544 }
4545
4546 if (wmi_unified_send_apf_read_work_memory_cmd(wma->wmi_handle,
4547 read_params)) {
4548 WMA_LOGE(FL("Failed to send APF read memory command"));
4549 return QDF_STATUS_E_FAILURE;
4550 }
4551
4552 WMA_LOGD("Sent APF read memory on vdevid: %d", read_params->vdev_id);
4553 return status;
4554}
4555#endif /* FEATURE_WLAN_APF */
4556
Peng Xu8fdaa492016-06-22 10:20:47 -07004557/**
Padma, Santhosh Kumara7119672016-08-16 16:05:14 +05304558 * wma_set_tx_rx_aggregation_size() - sets tx rx aggregation sizes
4559 * @tx_rx_aggregation_size: aggregation size parameters
4560 *
4561 * This function sets tx rx aggregation sizes
4562 *
4563 * Return: VOS_STATUS_SUCCESS on success, error number otherwise
4564 */
4565QDF_STATUS wma_set_tx_rx_aggregation_size(
4566 struct sir_set_tx_rx_aggregation_size *tx_rx_aggregation_size)
4567{
4568 tp_wma_handle wma_handle;
4569 wmi_vdev_set_custom_aggr_size_cmd_fixed_param *cmd;
4570 int32_t len;
4571 wmi_buf_t buf;
4572 u_int8_t *buf_ptr;
4573 int ret;
4574
4575 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
4576
4577 if (!tx_rx_aggregation_size) {
4578 WMA_LOGE("%s: invalid pointer", __func__);
4579 return QDF_STATUS_E_INVAL;
4580 }
4581
4582 if (!wma_handle) {
4583 WMA_LOGE("%s: WMA context is invald!", __func__);
4584 return QDF_STATUS_E_INVAL;
4585 }
4586
4587 len = sizeof(*cmd);
4588 buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07004589 if (!buf)
Padma, Santhosh Kumara7119672016-08-16 16:05:14 +05304590 return QDF_STATUS_E_NOMEM;
Padma, Santhosh Kumara7119672016-08-16 16:05:14 +05304591
4592 buf_ptr = (u_int8_t *) wmi_buf_data(buf);
4593 cmd = (wmi_vdev_set_custom_aggr_size_cmd_fixed_param *) buf_ptr;
Arif Hussain0e246802018-05-01 18:13:44 -07004594 qdf_mem_zero(cmd, sizeof(*cmd));
Padma, Santhosh Kumara7119672016-08-16 16:05:14 +05304595
4596 WMITLV_SET_HDR(&cmd->tlv_header,
4597 WMITLV_TAG_STRUC_wmi_vdev_set_custom_aggr_size_cmd_fixed_param,
4598 WMITLV_GET_STRUCT_TLVLEN(
4599 wmi_vdev_set_custom_aggr_size_cmd_fixed_param));
4600
4601 cmd->vdev_id = tx_rx_aggregation_size->vdev_id;
4602 cmd->tx_aggr_size = tx_rx_aggregation_size->tx_aggregation_size;
4603 cmd->rx_aggr_size = tx_rx_aggregation_size->rx_aggregation_size;
Arif Hussain0e246802018-05-01 18:13:44 -07004604 /* bit 2 (aggr_type): TX Aggregation Type (0=A-MPDU, 1=A-MSDU) */
4605 if (tx_rx_aggregation_size->aggr_type ==
4606 WMI_VDEV_CUSTOM_AGGR_TYPE_AMSDU)
4607 cmd->enable_bitmap |= 0x04;
Padma, Santhosh Kumara7119672016-08-16 16:05:14 +05304608
Arif Hussain0e246802018-05-01 18:13:44 -07004609 WMA_LOGD("tx aggr: %d rx aggr: %d vdev: %d enable_bitmap %d",
4610 cmd->tx_aggr_size, cmd->rx_aggr_size, cmd->vdev_id,
4611 cmd->enable_bitmap);
Padma, Santhosh Kumara7119672016-08-16 16:05:14 +05304612
4613 ret = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
4614 WMI_VDEV_SET_CUSTOM_AGGR_SIZE_CMDID);
4615 if (ret) {
Padma, Santhosh Kumara7119672016-08-16 16:05:14 +05304616 wmi_buf_free(buf);
4617 return QDF_STATUS_E_FAILURE;
4618 }
4619
4620 return QDF_STATUS_SUCCESS;
4621}
4622
Paul Zhangee09f8e2018-04-23 16:11:32 +08004623QDF_STATUS wma_set_tx_rx_aggregation_size_per_ac(
4624 struct sir_set_tx_rx_aggregation_size *tx_rx_aggregation_size)
4625{
4626 tp_wma_handle wma_handle;
4627 wmi_vdev_set_custom_aggr_size_cmd_fixed_param *cmd;
4628 int32_t len;
4629 wmi_buf_t buf;
4630 u_int8_t *buf_ptr;
4631 int ret;
4632 int queue_num;
4633 uint32_t tx_aggr_size[4];
4634
4635 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
4636
4637 if (!tx_rx_aggregation_size) {
4638 WMA_LOGE("%s: invalid pointer", __func__);
4639 return QDF_STATUS_E_INVAL;
4640 }
4641
4642 if (!wma_handle) {
4643 WMA_LOGE("%s: WMA context is invald!", __func__);
4644 return QDF_STATUS_E_INVAL;
4645 }
4646
4647 tx_aggr_size[0] = tx_rx_aggregation_size->tx_aggregation_size_be;
4648 tx_aggr_size[1] = tx_rx_aggregation_size->tx_aggregation_size_bk;
4649 tx_aggr_size[2] = tx_rx_aggregation_size->tx_aggregation_size_vi;
4650 tx_aggr_size[3] = tx_rx_aggregation_size->tx_aggregation_size_vo;
4651
4652 for (queue_num = 0; queue_num < 4; queue_num++) {
4653 if (tx_aggr_size[queue_num] == 0)
4654 continue;
4655
4656 len = sizeof(*cmd);
4657 buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07004658 if (!buf)
Paul Zhangee09f8e2018-04-23 16:11:32 +08004659 return QDF_STATUS_E_NOMEM;
Paul Zhangee09f8e2018-04-23 16:11:32 +08004660
4661 buf_ptr = (u_int8_t *)wmi_buf_data(buf);
4662 cmd = (wmi_vdev_set_custom_aggr_size_cmd_fixed_param *)buf_ptr;
Arif Hussain0e246802018-05-01 18:13:44 -07004663 qdf_mem_zero(cmd, sizeof(*cmd));
Paul Zhangee09f8e2018-04-23 16:11:32 +08004664
4665 WMITLV_SET_HDR(&cmd->tlv_header,
4666 WMITLV_TAG_STRUC_wmi_vdev_set_custom_aggr_size_cmd_fixed_param,
4667 WMITLV_GET_STRUCT_TLVLEN(
4668 wmi_vdev_set_custom_aggr_size_cmd_fixed_param));
4669
4670 cmd->vdev_id = tx_rx_aggregation_size->vdev_id;
4671 cmd->rx_aggr_size =
4672 tx_rx_aggregation_size->rx_aggregation_size;
4673
4674 cmd->tx_aggr_size = tx_aggr_size[queue_num];
4675 /* bit 5: tx_ac_enable, if set, ac bitmap is valid. */
4676 cmd->enable_bitmap = 0x20 | queue_num;
Arif Hussain0e246802018-05-01 18:13:44 -07004677 /* bit 2 (aggr_type): TX Aggregation Type (0=A-MPDU, 1=A-MSDU) */
4678 if (tx_rx_aggregation_size->aggr_type ==
4679 WMI_VDEV_CUSTOM_AGGR_TYPE_AMSDU)
4680 cmd->enable_bitmap |= 0x04;
Paul Zhangee09f8e2018-04-23 16:11:32 +08004681
Arif Hussain0e246802018-05-01 18:13:44 -07004682 WMA_LOGD("queue_num: %d, tx aggr: %d rx aggr: %d vdev: %d, bitmap: %d",
Paul Zhangee09f8e2018-04-23 16:11:32 +08004683 queue_num, cmd->tx_aggr_size,
Arif Hussain0e246802018-05-01 18:13:44 -07004684 cmd->rx_aggr_size, cmd->vdev_id,
4685 cmd->enable_bitmap);
Paul Zhangee09f8e2018-04-23 16:11:32 +08004686
4687 ret = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
4688 WMI_VDEV_SET_CUSTOM_AGGR_SIZE_CMDID);
4689 if (ret) {
Paul Zhangee09f8e2018-04-23 16:11:32 +08004690 wmi_buf_free(buf);
4691 return QDF_STATUS_E_FAILURE;
4692 }
4693 }
4694
4695 return QDF_STATUS_SUCCESS;
4696}
4697
stonez26388d02018-10-17 13:37:48 +08004698static QDF_STATUS wma_set_sw_retry_by_qos(
4699 tp_wma_handle handle, uint8_t vdev_id,
4700 wmi_vdev_custom_sw_retry_type_t retry_type,
4701 wmi_traffic_ac ac_type,
4702 uint32_t sw_retry)
Paul Zhang33fae272018-04-23 16:19:00 +08004703{
Paul Zhang33fae272018-04-23 16:19:00 +08004704 wmi_vdev_set_custom_sw_retry_th_cmd_fixed_param *cmd;
4705 int32_t len;
4706 wmi_buf_t buf;
4707 u_int8_t *buf_ptr;
4708 int ret;
Paul Zhang33fae272018-04-23 16:19:00 +08004709
stonez26388d02018-10-17 13:37:48 +08004710 len = sizeof(*cmd);
4711 buf = wmi_buf_alloc(handle->wmi_handle, len);
4712
4713 if (!buf)
4714 return QDF_STATUS_E_NOMEM;
4715
4716 buf_ptr = (u_int8_t *)wmi_buf_data(buf);
4717 cmd = (wmi_vdev_set_custom_sw_retry_th_cmd_fixed_param *)buf_ptr;
4718
4719 WMITLV_SET_HDR(&cmd->tlv_header,
4720 WMITLV_TAG_STRUC_wmi_vdev_set_custom_sw_retry_th_cmd_fixed_param,
4721 WMITLV_GET_STRUCT_TLVLEN(
4722 wmi_vdev_set_custom_sw_retry_th_cmd_fixed_param));
4723
4724 cmd->vdev_id = vdev_id;
4725 cmd->ac_type = ac_type;
4726 cmd->sw_retry_type = retry_type;
4727 cmd->sw_retry_th = sw_retry;
4728
4729 wma_debug("ac_type: %d re_type: %d threshold: %d vid: %d",
4730 cmd->ac_type, cmd->sw_retry_type,
4731 cmd->sw_retry_th, cmd->vdev_id);
4732
4733 ret = wmi_unified_cmd_send(handle->wmi_handle,
4734 buf, len,
4735 WMI_VDEV_SET_CUSTOM_SW_RETRY_TH_CMDID);
4736
4737 if (ret) {
4738 wmi_buf_free(buf);
4739 return QDF_STATUS_E_FAILURE;
4740 }
4741
4742 return QDF_STATUS_SUCCESS;
4743}
4744
4745QDF_STATUS wma_set_sw_retry_threshold(
4746 WMA_HANDLE handle,
4747 struct sir_set_tx_sw_retry_threshold *tx_sw_retry_threshold)
4748{
4749 QDF_STATUS ret;
4750 tp_wma_handle wma_handle;
4751 uint8_t vdev_id;
4752 int retry_type, queue_num;
4753 uint32_t tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_MAX][WMI_AC_MAX];
4754 uint32_t sw_retry;
4755
4756 wma_handle = (tp_wma_handle)handle;
Paul Zhang33fae272018-04-23 16:19:00 +08004757
4758 if (!tx_sw_retry_threshold) {
stonez26388d02018-10-17 13:37:48 +08004759 wma_err("%s: invalid pointer", __func__);
Paul Zhang33fae272018-04-23 16:19:00 +08004760 return QDF_STATUS_E_INVAL;
4761 }
4762
4763 if (!wma_handle) {
stonez26388d02018-10-17 13:37:48 +08004764 wma_err("%s: WMA context is invalid!", __func__);
Paul Zhang33fae272018-04-23 16:19:00 +08004765 return QDF_STATUS_E_INVAL;
4766 }
4767
stonez26388d02018-10-17 13:37:48 +08004768 tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_AGGR][WMI_AC_BE] =
Paul Zhang33fae272018-04-23 16:19:00 +08004769 tx_sw_retry_threshold->tx_aggr_sw_retry_threshold_be;
stonez26388d02018-10-17 13:37:48 +08004770 tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_AGGR][WMI_AC_BK] =
Paul Zhang33fae272018-04-23 16:19:00 +08004771 tx_sw_retry_threshold->tx_aggr_sw_retry_threshold_bk;
stonez26388d02018-10-17 13:37:48 +08004772 tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_AGGR][WMI_AC_VI] =
Paul Zhang33fae272018-04-23 16:19:00 +08004773 tx_sw_retry_threshold->tx_aggr_sw_retry_threshold_vi;
stonez26388d02018-10-17 13:37:48 +08004774 tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_AGGR][WMI_AC_VO] =
Paul Zhang33fae272018-04-23 16:19:00 +08004775 tx_sw_retry_threshold->tx_aggr_sw_retry_threshold_vo;
4776
stonez26388d02018-10-17 13:37:48 +08004777 tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_NONAGGR][WMI_AC_BE] =
4778 tx_sw_retry_threshold->tx_non_aggr_sw_retry_threshold_be;
4779 tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_NONAGGR][WMI_AC_BK] =
4780 tx_sw_retry_threshold->tx_non_aggr_sw_retry_threshold_bk;
4781 tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_NONAGGR][WMI_AC_VI] =
4782 tx_sw_retry_threshold->tx_non_aggr_sw_retry_threshold_vi;
4783 tx_sw_retry[WMI_VDEV_CUSTOM_SW_RETRY_TYPE_NONAGGR][WMI_AC_VO] =
4784 tx_sw_retry_threshold->tx_non_aggr_sw_retry_threshold_vo;
Paul Zhang33fae272018-04-23 16:19:00 +08004785
stonez26388d02018-10-17 13:37:48 +08004786 retry_type = WMI_VDEV_CUSTOM_SW_RETRY_TYPE_NONAGGR;
4787 while (retry_type < WMI_VDEV_CUSTOM_SW_RETRY_TYPE_MAX) {
4788 for (queue_num = 0; queue_num < WMI_AC_MAX; queue_num++) {
4789 if (tx_sw_retry[retry_type][queue_num] == 0)
4790 continue;
Paul Zhang33fae272018-04-23 16:19:00 +08004791
stonez26388d02018-10-17 13:37:48 +08004792 vdev_id = tx_sw_retry_threshold->vdev_id;
4793 sw_retry = tx_sw_retry[retry_type][queue_num];
4794 ret = wma_set_sw_retry_by_qos(wma_handle,
4795 vdev_id,
4796 retry_type,
4797 queue_num,
4798 sw_retry);
Paul Zhang33fae272018-04-23 16:19:00 +08004799
stonez26388d02018-10-17 13:37:48 +08004800 if (QDF_IS_STATUS_ERROR(ret))
4801 return ret;
Paul Zhang33fae272018-04-23 16:19:00 +08004802 }
stonez26388d02018-10-17 13:37:48 +08004803 retry_type++;
Paul Zhang33fae272018-04-23 16:19:00 +08004804 }
4805
4806 return QDF_STATUS_SUCCESS;
4807}
4808
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08004809#ifndef QCA_SUPPORT_CP_STATS
Padma, Santhosh Kumar5e33beb2016-08-08 19:07:06 +05304810/**
Dustin Brown9d797d62017-01-11 16:39:12 -08004811 * wma_get_wakelock_stats() - Populates wake lock stats
4812 * @stats: non-null wakelock structure to populate
Padma, Santhosh Kumar5e33beb2016-08-08 19:07:06 +05304813 *
4814 * This function collects wake lock stats
4815 *
Dustin Brown9d797d62017-01-11 16:39:12 -08004816 * Return: QDF_STATUS_SUCCESS on success, error value otherwise
Padma, Santhosh Kumar5e33beb2016-08-08 19:07:06 +05304817 */
Dustin Brown9d797d62017-01-11 16:39:12 -08004818QDF_STATUS wma_get_wakelock_stats(struct sir_wake_lock_stats *stats)
Padma, Santhosh Kumar5e33beb2016-08-08 19:07:06 +05304819{
Dustin Brown9d797d62017-01-11 16:39:12 -08004820 t_wma_handle *wma;
4821 struct sir_vdev_wow_stats *vstats;
4822 int i;
Padma, Santhosh Kumar5e33beb2016-08-08 19:07:06 +05304823
Dustin Brown9d797d62017-01-11 16:39:12 -08004824 if (!stats) {
4825 WMA_LOGE("%s: invalid stats pointer", __func__);
Padma, Santhosh Kumar5e33beb2016-08-08 19:07:06 +05304826 return QDF_STATUS_E_INVAL;
4827 }
4828
Dustin Brown9d797d62017-01-11 16:39:12 -08004829 wma = cds_get_context(QDF_MODULE_ID_WMA);
4830 if (!wma) {
4831 WMA_LOGE("%s: invalid WMA context", __func__);
Padma, Santhosh Kumar5e33beb2016-08-08 19:07:06 +05304832 return QDF_STATUS_E_INVAL;
4833 }
4834
Dustin Brown9d797d62017-01-11 16:39:12 -08004835 /* ensure counters are zeroed */
4836 qdf_mem_zero(stats, sizeof(*stats));
4837
4838 /* populate global level stats */
4839 stats->wow_unspecified_wake_up_count = wma->wow_unspecified_wake_count;
4840
4841 /* populate vdev level stats */
4842 for (i = 0; i < wma->max_bssid; ++i) {
4843 if (!wma->interfaces[i].handle)
4844 continue;
4845
4846 vstats = &wma->interfaces[i].wow_stats;
4847
4848 stats->wow_ucast_wake_up_count += vstats->ucast;
4849 stats->wow_bcast_wake_up_count += vstats->bcast;
4850 stats->wow_ipv4_mcast_wake_up_count += vstats->ipv4_mcast;
4851 stats->wow_ipv6_mcast_wake_up_count += vstats->ipv6_mcast;
4852 stats->wow_ipv6_mcast_ra_stats += vstats->ipv6_mcast_ra;
4853 stats->wow_ipv6_mcast_ns_stats += vstats->ipv6_mcast_ns;
4854 stats->wow_ipv6_mcast_na_stats += vstats->ipv6_mcast_na;
4855 stats->wow_icmpv4_count += vstats->icmpv4;
4856 stats->wow_icmpv6_count += vstats->icmpv6;
4857 stats->wow_rssi_breach_wake_up_count += vstats->rssi_breach;
4858 stats->wow_low_rssi_wake_up_count += vstats->low_rssi;
4859 stats->wow_gscan_wake_up_count += vstats->gscan;
4860 stats->wow_pno_complete_wake_up_count += vstats->pno_complete;
4861 stats->wow_pno_match_wake_up_count += vstats->pno_match;
4862 stats->wow_oem_response_wake_up_count += vstats->oem_response;
4863 }
Padma, Santhosh Kumar5e33beb2016-08-08 19:07:06 +05304864
4865 return QDF_STATUS_SUCCESS;
4866}
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08004867#endif
Anurag Chouhanbf5e0e22016-09-12 12:54:09 +05304868
4869/**
4870 * wma_process_fw_test_cmd() - send unit test command to fw.
4871 * @handle: wma handle
4872 * @wma_fwtest: fw test command
4873 *
4874 * This function send fw test command to fw.
4875 *
4876 * Return: none
4877 */
4878void wma_process_fw_test_cmd(WMA_HANDLE handle,
4879 struct set_fwtest_params *wma_fwtest)
4880{
4881 tp_wma_handle wma_handle = (tp_wma_handle) handle;
4882
4883 if (!wma_handle || !wma_handle->wmi_handle) {
4884 WMA_LOGE("%s: WMA is closed, can not issue fw test cmd",
4885 __func__);
4886 return;
4887 }
4888
4889 if (wmi_unified_fw_test_cmd(wma_handle->wmi_handle,
4890 (struct set_fwtest_params *)wma_fwtest)) {
4891 WMA_LOGE("%s: Failed to issue fw test cmd",
4892 __func__);
4893 return;
4894 }
4895}
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +05304896
4897/**
4898 * wma_enable_disable_caevent_ind() - Issue WMI command to enable or
4899 * disable ca event indication
4900 * @wma: wma handler
4901 * @val: boolean value true or false
4902 *
4903 * Return: QDF_STATUS
4904 */
4905QDF_STATUS wma_enable_disable_caevent_ind(tp_wma_handle wma, uint8_t val)
4906{
4907 WMI_CHAN_AVOID_RPT_ALLOW_CMD_fixed_param *cmd;
4908 wmi_buf_t wmi_buf;
4909 uint8_t *buf_ptr;
4910 uint32_t len;
4911
4912 if (!wma || !wma->wmi_handle) {
4913 WMA_LOGE(FL("WMA is closed, can not issue set/clear CA"));
4914 return QDF_STATUS_E_INVAL;
4915 }
4916
4917 len = sizeof(*cmd);
4918 wmi_buf = wmi_buf_alloc(wma->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07004919 if (!wmi_buf)
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +05304920 return QDF_STATUS_E_NOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -07004921
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +05304922 buf_ptr = (uint8_t *) wmi_buf_data(wmi_buf);
4923 cmd = (WMI_CHAN_AVOID_RPT_ALLOW_CMD_fixed_param *) buf_ptr;
4924 WMITLV_SET_HDR(&cmd->tlv_header,
4925 WMITLV_TAG_STRUC_WMI_CHAN_AVOID_RPT_ALLOW_CMD_fixed_param,
4926 WMITLV_GET_STRUCT_TLVLEN(
4927 WMI_CHAN_AVOID_RPT_ALLOW_CMD_fixed_param));
4928 cmd->rpt_allow = val;
4929 if (wmi_unified_cmd_send(wma->wmi_handle, wmi_buf, len,
4930 WMI_CHAN_AVOID_RPT_ALLOW_CMDID)) {
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +05304931 wmi_buf_free(wmi_buf);
4932 return QDF_STATUS_E_FAILURE;
4933 }
4934
4935 return QDF_STATUS_SUCCESS;
4936}
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +05304937
Jeff Johnsonf0e54b02017-12-18 15:22:25 -08004938static wma_sar_cb sar_callback;
4939static void *sar_context;
4940
4941static int wma_sar_event_handler(void *handle, uint8_t *evt_buf, uint32_t len)
4942{
4943 tp_wma_handle wma_handle;
4944 wmi_unified_t wmi_handle;
jiadb17a2972018-01-25 10:02:31 +08004945 struct sar_limit_event *event;
Jeff Johnsonf0e54b02017-12-18 15:22:25 -08004946 wma_sar_cb callback;
4947 QDF_STATUS status;
4948
4949 WMA_LOGI(FL("handle:%pK event:%pK len:%u"), handle, evt_buf, len);
4950
4951 wma_handle = handle;
4952 if (!wma_handle) {
4953 WMA_LOGE(FL("NULL wma_handle"));
4954 return QDF_STATUS_E_INVAL;
4955 }
4956
4957 wmi_handle = wma_handle->wmi_handle;
4958 if (!wmi_handle) {
4959 WMA_LOGE(FL("NULL wmi_handle"));
4960 return QDF_STATUS_E_INVAL;
4961 }
4962
jiadb17a2972018-01-25 10:02:31 +08004963 event = qdf_mem_malloc(sizeof(*event));
Arif Hussain157263f2018-10-03 13:07:15 -07004964 if (!event)
jiadb17a2972018-01-25 10:02:31 +08004965 return QDF_STATUS_E_NOMEM;
jiadb17a2972018-01-25 10:02:31 +08004966
Jeff Johnsonf0e54b02017-12-18 15:22:25 -08004967 status = wmi_unified_extract_sar_limit_event(wmi_handle,
jiadb17a2972018-01-25 10:02:31 +08004968 evt_buf, event);
Jeff Johnsonf0e54b02017-12-18 15:22:25 -08004969 if (QDF_IS_STATUS_ERROR(status)) {
4970 WMA_LOGE(FL("Event extract failure: %d"), status);
jiadb17a2972018-01-25 10:02:31 +08004971 qdf_mem_free(event);
Jeff Johnsonf0e54b02017-12-18 15:22:25 -08004972 return QDF_STATUS_E_INVAL;
4973 }
4974
4975 callback = sar_callback;
4976 sar_callback = NULL;
4977 if (callback)
jiadb17a2972018-01-25 10:02:31 +08004978 callback(sar_context, event);
4979
4980 qdf_mem_free(event);
Jeff Johnsonf0e54b02017-12-18 15:22:25 -08004981
4982 return 0;
4983}
4984
4985QDF_STATUS wma_sar_register_event_handlers(WMA_HANDLE handle)
4986{
4987 tp_wma_handle wma_handle = handle;
4988 wmi_unified_t wmi_handle;
4989
4990 if (!wma_handle) {
4991 WMA_LOGE(FL("NULL wma_handle"));
4992 return QDF_STATUS_E_INVAL;
4993 }
4994
4995 wmi_handle = wma_handle->wmi_handle;
4996 if (!wmi_handle) {
4997 WMA_LOGE(FL("NULL wmi_handle"));
4998 return QDF_STATUS_E_INVAL;
4999 }
5000
5001 return wmi_unified_register_event_handler(wmi_handle,
5002 wmi_sar_get_limits_event_id,
5003 wma_sar_event_handler,
5004 WMA_RX_WORK_CTX);
5005}
5006
5007QDF_STATUS wma_get_sar_limit(WMA_HANDLE handle,
5008 wma_sar_cb callback, void *context)
5009{
5010 tp_wma_handle wma_handle = handle;
5011 wmi_unified_t wmi_handle;
5012 QDF_STATUS status;
5013
5014 if (!wma_handle) {
5015 WMA_LOGE(FL("NULL wma_handle"));
5016 return QDF_STATUS_E_INVAL;
5017 }
5018
5019 wmi_handle = wma_handle->wmi_handle;
5020 if (!wmi_handle) {
5021 WMA_LOGE(FL("NULL wmi_handle"));
5022 return QDF_STATUS_E_INVAL;
5023 }
5024
5025 sar_callback = callback;
5026 sar_context = context;
5027 status = wmi_unified_get_sar_limit_cmd(wmi_handle);
5028 if (QDF_IS_STATUS_ERROR(status)) {
5029 WMA_LOGE(FL("wmi_unified_get_sar_limit_cmd() error: %u"),
5030 status);
5031 sar_callback = NULL;
5032 }
5033
5034 return status;
5035}
5036
Kabilan Kannan3c0a7352016-12-02 18:49:38 -08005037QDF_STATUS wma_set_sar_limit(WMA_HANDLE handle,
5038 struct sar_limit_cmd_params *sar_limit_params)
5039{
5040 int ret;
5041 tp_wma_handle wma = (tp_wma_handle) handle;
5042
5043 if (!wma || !wma->wmi_handle) {
5044 WMA_LOGE("%s: WMA is closed, can not issue set sar limit msg",
5045 __func__);
5046 return QDF_STATUS_E_INVAL;
5047 }
5048
5049 if (sar_limit_params == NULL) {
5050 WMA_LOGE("%s: set sar limit ptr NULL",
5051 __func__);
5052 return QDF_STATUS_E_INVAL;
5053 }
5054
5055 ret = wmi_unified_send_sar_limit_cmd(wma->wmi_handle,
5056 sar_limit_params);
5057
5058 return ret;
5059}
5060
Dundi Raviteja3b637092018-09-12 13:42:50 +05305061QDF_STATUS wma_send_coex_config_cmd(WMA_HANDLE wma_handle,
5062 struct coex_config_params *coex_cfg_params)
5063{
5064 tp_wma_handle wma = (tp_wma_handle)wma_handle;
5065
5066 if (!wma || !wma->wmi_handle) {
5067 WMA_LOGE("%s: WMA is closed, can not issue coex config command",
5068 __func__);
5069 return QDF_STATUS_E_INVAL;
5070 }
5071
5072 if (!coex_cfg_params) {
5073 WMA_LOGE("%s: coex cfg params ptr NULL", __func__);
5074 return QDF_STATUS_E_INVAL;
5075 }
5076
5077 return wmi_unified_send_coex_config_cmd(wma->wmi_handle,
5078 coex_cfg_params);
5079}
5080
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05305081/**
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05305082 * wma_get_arp_stats_handler() - handle arp stats data
5083 * indicated by FW
5084 * @handle: wma context
5085 * @data: event buffer
5086 * @data len: length of event buffer
5087 *
5088 * Return: 0 on success
5089 */
5090int wma_get_arp_stats_handler(void *handle, uint8_t *data,
5091 uint32_t data_len)
5092{
5093 WMI_VDEV_GET_ARP_STAT_EVENTID_param_tlvs *param_buf;
5094 wmi_vdev_get_arp_stats_event_fixed_param *data_event;
Poddar, Siddarth465330e2018-01-08 18:23:54 +05305095 wmi_vdev_get_connectivity_check_stats *connect_stats_event;
5096 uint8_t *buf_ptr;
Naveen Rawat6e45d9a2018-04-27 16:35:59 -07005097 struct rsp_stats rsp = {0};
Jeff Johnson9f18aa72018-12-02 12:05:12 -08005098 struct mac_context *mac = cds_get_context(QDF_MODULE_ID_PE);
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05305099
5100 if (!mac) {
5101 WMA_LOGE("%s: Invalid mac context", __func__);
5102 return -EINVAL;
5103 }
5104
5105 if (!mac->sme.get_arp_stats_cb) {
5106 WMA_LOGE("%s: Callback not registered", __func__);
5107 return -EINVAL;
5108 }
5109
5110 if (data == NULL) {
5111 WMA_LOGE("%s: invalid pointer", __func__);
5112 return -EINVAL;
5113 }
5114 param_buf = (WMI_VDEV_GET_ARP_STAT_EVENTID_param_tlvs *)data;
5115 if (!param_buf) {
5116 WMA_LOGE("%s: Invalid get arp stats event", __func__);
5117 return -EINVAL;
5118 }
5119 data_event = param_buf->fixed_param;
5120 if (!data_event) {
5121 WMA_LOGE("%s: Invalid get arp stats data event", __func__);
5122 return -EINVAL;
5123 }
5124 rsp.arp_req_enqueue = data_event->arp_req_enqueue;
5125 rsp.vdev_id = data_event->vdev_id;
5126 rsp.arp_req_tx_success = data_event->arp_req_tx_success;
5127 rsp.arp_req_tx_failure = data_event->arp_req_tx_failure;
5128 rsp.arp_rsp_recvd = data_event->arp_rsp_recvd;
5129 rsp.out_of_order_arp_rsp_drop_cnt =
5130 data_event->out_of_order_arp_rsp_drop_cnt;
5131 rsp.dad_detected = data_event->dad_detected;
5132 rsp.connect_status = data_event->connect_status;
5133 rsp.ba_session_establishment_status =
5134 data_event->ba_session_establishment_status;
5135
Poddar, Siddarth465330e2018-01-08 18:23:54 +05305136 buf_ptr = (uint8_t *)data_event;
5137 buf_ptr = buf_ptr + sizeof(wmi_vdev_get_arp_stats_event_fixed_param) +
5138 WMI_TLV_HDR_SIZE;
5139 connect_stats_event = (wmi_vdev_get_connectivity_check_stats *)buf_ptr;
5140
5141 if (((connect_stats_event->tlv_header & 0xFFFF0000) >> 16 ==
5142 WMITLV_TAG_STRUC_wmi_vdev_get_connectivity_check_stats)) {
5143 rsp.connect_stats_present = true;
5144 rsp.tcp_ack_recvd = connect_stats_event->tcp_ack_recvd;
5145 rsp.icmpv4_rsp_recvd = connect_stats_event->icmpv4_rsp_recvd;
5146 WMA_LOGD("tcp_ack_recvd %d icmpv4_rsp_recvd %d",
5147 connect_stats_event->tcp_ack_recvd,
5148 connect_stats_event->icmpv4_rsp_recvd);
5149 }
5150
Jeff Johnson6aaaa992018-06-30 10:43:04 -07005151 mac->sme.get_arp_stats_cb(mac->hdd_handle, &rsp,
Dundi Raviteja3bcf3a82018-05-22 13:24:18 +05305152 mac->sme.get_arp_stats_context);
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05305153
5154 return 0;
5155}
5156
5157/**
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05305158 * wma_unified_power_debug_stats_event_handler() - WMA handler function to
5159 * handle Power stats event from firmware
5160 * @handle: Pointer to wma handle
5161 * @cmd_param_info: Pointer to Power stats event TLV
5162 * @len: Length of the cmd_param_info
5163 *
5164 * Return: 0 on success, error number otherwise
5165 */
5166#ifdef WLAN_POWER_DEBUGFS
5167int wma_unified_power_debug_stats_event_handler(void *handle,
5168 uint8_t *cmd_param_info, uint32_t len)
5169{
5170 WMI_PDEV_CHIP_POWER_STATS_EVENTID_param_tlvs *param_tlvs;
5171 struct power_stats_response *power_stats_results;
5172 wmi_pdev_chip_power_stats_event_fixed_param *param_buf;
5173 uint32_t power_stats_len, stats_registers_len, *debug_registers;
5174
Jeff Johnson9f18aa72018-12-02 12:05:12 -08005175 struct mac_context *mac = (struct mac_context *)cds_get_context(QDF_MODULE_ID_PE);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07005176
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05305177 param_tlvs =
5178 (WMI_PDEV_CHIP_POWER_STATS_EVENTID_param_tlvs *) cmd_param_info;
5179
5180 param_buf = (wmi_pdev_chip_power_stats_event_fixed_param *)
5181 param_tlvs->fixed_param;
5182 if (!mac || !mac->sme.power_stats_resp_callback) {
5183 WMA_LOGD("%s: NULL mac ptr or HDD callback is null", __func__);
5184 return -EINVAL;
5185 }
5186
5187 if (!param_buf) {
5188 WMA_LOGD("%s: NULL power stats event fixed param", __func__);
5189 return -EINVAL;
5190 }
5191
Sandeep Puligilla2f931532017-09-20 16:27:43 -07005192 if (param_buf->num_debug_register > ((WMI_SVC_MSG_MAX_SIZE -
5193 sizeof(wmi_pdev_chip_power_stats_event_fixed_param)) /
Himanshu Agarwal82218792017-12-22 14:00:01 +05305194 sizeof(uint32_t)) ||
5195 param_buf->num_debug_register > param_tlvs->num_debug_registers) {
Sandeep Puligilla2f931532017-09-20 16:27:43 -07005196 WMA_LOGE("excess payload: LEN num_debug_register:%u",
5197 param_buf->num_debug_register);
5198 return -EINVAL;
5199 }
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05305200 debug_registers = param_tlvs->debug_registers;
5201 stats_registers_len =
5202 (sizeof(uint32_t) * param_buf->num_debug_register);
5203 power_stats_len = stats_registers_len + sizeof(*power_stats_results);
5204 power_stats_results = qdf_mem_malloc(power_stats_len);
Arif Hussain157263f2018-10-03 13:07:15 -07005205 if (!power_stats_results)
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05305206 return -ENOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -07005207
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05305208 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",
5209 param_buf->cumulative_sleep_time_ms,
5210 param_buf->cumulative_total_on_time_ms,
5211 param_buf->deep_sleep_enter_counter,
5212 param_buf->last_deep_sleep_enter_tstamp_ms,
5213 param_buf->debug_register_fmt,
5214 param_buf->num_debug_register);
5215
5216 power_stats_results->cumulative_sleep_time_ms
5217 = param_buf->cumulative_sleep_time_ms;
5218 power_stats_results->cumulative_total_on_time_ms
5219 = param_buf->cumulative_total_on_time_ms;
5220 power_stats_results->deep_sleep_enter_counter
5221 = param_buf->deep_sleep_enter_counter;
5222 power_stats_results->last_deep_sleep_enter_tstamp_ms
5223 = param_buf->last_deep_sleep_enter_tstamp_ms;
5224 power_stats_results->debug_register_fmt
5225 = param_buf->debug_register_fmt;
5226 power_stats_results->num_debug_register
5227 = param_buf->num_debug_register;
5228
5229 power_stats_results->debug_registers
5230 = (uint32_t *)(power_stats_results + 1);
5231
5232 qdf_mem_copy(power_stats_results->debug_registers,
5233 debug_registers, stats_registers_len);
5234
5235 mac->sme.power_stats_resp_callback(power_stats_results,
5236 mac->sme.power_debug_stats_context);
5237 qdf_mem_free(power_stats_results);
5238 return 0;
5239}
5240#else
5241int wma_unified_power_debug_stats_event_handler(void *handle,
5242 uint8_t *cmd_param_info, uint32_t len)
5243{
5244 return 0;
5245}
5246#endif
Arunk Khandavallica56d4b2018-11-29 15:46:00 +05305247#ifdef WLAN_FEATURE_BEACON_RECEPTION_STATS
5248int wma_unified_beacon_debug_stats_event_handler(void *handle,
5249 uint8_t *cmd_param_info,
5250 uint32_t len)
5251{
5252 WMI_VDEV_BCN_RECEPTION_STATS_EVENTID_param_tlvs *param_tlvs;
5253 struct bcn_reception_stats_rsp *bcn_reception_stats;
5254 wmi_vdev_bcn_recv_stats_fixed_param *param_buf;
5255 struct mac_context *mac =
5256 (struct mac_context *)cds_get_context(QDF_MODULE_ID_PE);
5257
5258 param_tlvs =
5259 (WMI_VDEV_BCN_RECEPTION_STATS_EVENTID_param_tlvs *)cmd_param_info;
5260 if (!param_tlvs) {
5261 WMA_LOGA("%s: Invalid stats event", __func__);
5262 return -EINVAL;
5263 }
5264
5265 param_buf = (wmi_vdev_bcn_recv_stats_fixed_param *)
5266 param_tlvs->fixed_param;
5267 if (!param_buf || !mac || !mac->sme.beacon_stats_resp_callback) {
5268 WMA_LOGD("%s: NULL mac ptr or HDD callback is null", __func__);
5269 return -EINVAL;
5270 }
5271
5272 if (!param_buf) {
5273 WMA_LOGD("%s: NULL beacon stats event fixed param", __func__);
5274 return -EINVAL;
5275 }
5276
5277 bcn_reception_stats = qdf_mem_malloc(sizeof(*bcn_reception_stats));
5278 if (!bcn_reception_stats)
5279 return -ENOMEM;
5280
5281 bcn_reception_stats->total_bcn_cnt = param_buf->total_bcn_cnt;
5282 bcn_reception_stats->total_bmiss_cnt = param_buf->total_bmiss_cnt;
5283 bcn_reception_stats->vdev_id = param_buf->vdev_id;
5284
5285 WMA_LOGD("Total beacon count %d total beacon miss count %d vdev_id %d",
5286 param_buf->total_bcn_cnt,
5287 param_buf->total_bmiss_cnt,
5288 param_buf->vdev_id);
5289
5290 qdf_mem_copy(bcn_reception_stats->bmiss_bitmap,
5291 param_buf->bmiss_bitmap,
5292 MAX_BCNMISS_BITMAP * sizeof(uint32_t));
5293
5294 mac->sme.beacon_stats_resp_callback(bcn_reception_stats,
5295 mac->sme.beacon_stats_context);
5296 qdf_mem_free(bcn_reception_stats);
5297 return 0;
5298}
5299#else
5300int wma_unified_beacon_debug_stats_event_handler(void *handle,
5301 uint8_t *cmd_param_info,
5302 uint32_t len)
5303{
5304 return 0;
5305}
5306#endif
Kapil Gupta4f0c0c12017-02-07 15:21:15 +05305307
5308int wma_chan_info_event_handler(void *handle, uint8_t *event_buf,
5309 uint32_t len)
5310{
5311 tp_wma_handle wma = (tp_wma_handle)handle;
5312 WMI_CHAN_INFO_EVENTID_param_tlvs *param_buf;
5313 wmi_chan_info_event_fixed_param *event;
5314 struct scan_chan_info buf;
Jeff Johnson9f18aa72018-12-02 12:05:12 -08005315 struct mac_context *mac = NULL;
gaoleze5108942017-03-31 16:56:42 +08005316 struct lim_channel_status *channel_status;
Kapil Gupta4f0c0c12017-02-07 15:21:15 +05305317
5318 WMA_LOGD("%s: Enter", __func__);
5319
5320 if (wma != NULL && wma->cds_context != NULL)
Jeff Johnson9f18aa72018-12-02 12:05:12 -08005321 mac = (struct mac_context *)cds_get_context(QDF_MODULE_ID_PE);
Kapil Gupta4f0c0c12017-02-07 15:21:15 +05305322
5323 if (!mac) {
5324 WMA_LOGE("%s: Invalid mac context", __func__);
5325 return -EINVAL;
5326 }
5327
5328 WMA_LOGD("%s: monitor:%d", __func__, mac->snr_monitor_enabled);
5329 if (mac->snr_monitor_enabled && mac->chan_info_cb) {
5330 param_buf =
5331 (WMI_CHAN_INFO_EVENTID_param_tlvs *)event_buf;
5332 if (!param_buf) {
5333 WMA_LOGA("%s: Invalid chan info event", __func__);
5334 return -EINVAL;
5335 }
5336
5337 event = param_buf->fixed_param;
5338 if (!event) {
5339 WMA_LOGA("%s: Invalid fixed param", __func__);
5340 return -EINVAL;
5341 }
5342 buf.tx_frame_count = event->tx_frame_cnt;
5343 buf.clock_freq = event->mac_clk_mhz;
5344 buf.cmd_flag = event->cmd_flags;
5345 buf.freq = event->freq;
5346 buf.noise_floor = event->noise_floor;
5347 buf.cycle_count = event->cycle_count;
5348 buf.rx_clear_count = event->rx_clear_count;
5349 mac->chan_info_cb(&buf);
5350 }
5351
gaoleze5108942017-03-31 16:56:42 +08005352 if (mac->sap.acs_with_more_param &&
5353 mac->sme.currDeviceMode == QDF_SAP_MODE) {
5354 param_buf = (WMI_CHAN_INFO_EVENTID_param_tlvs *) event_buf;
5355 if (!param_buf) {
5356 WMA_LOGE("Invalid chan info event buffer");
5357 return -EINVAL;
5358 }
5359 event = param_buf->fixed_param;
Arif Hussain157263f2018-10-03 13:07:15 -07005360 channel_status = qdf_mem_malloc(sizeof(*channel_status));
5361 if (!channel_status)
gaoleze5108942017-03-31 16:56:42 +08005362 return -ENOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -07005363
gaoleze5108942017-03-31 16:56:42 +08005364 WMA_LOGD(FL("freq=%d nf=%d rxcnt=%u cyccnt=%u tx_r=%d tx_t=%d"),
5365 event->freq,
5366 event->noise_floor,
5367 event->rx_clear_count,
5368 event->cycle_count,
5369 event->chan_tx_pwr_range,
5370 event->chan_tx_pwr_tp);
5371
5372 channel_status->channelfreq = event->freq;
5373 channel_status->noise_floor = event->noise_floor;
5374 channel_status->rx_clear_count =
5375 event->rx_clear_count;
5376 channel_status->cycle_count = event->cycle_count;
5377 channel_status->chan_tx_pwr_range =
5378 event->chan_tx_pwr_range;
5379 channel_status->chan_tx_pwr_throughput =
5380 event->chan_tx_pwr_tp;
5381 channel_status->rx_frame_count =
5382 event->rx_frame_count;
5383 channel_status->bss_rx_cycle_count =
5384 event->my_bss_rx_cycle_count;
5385 channel_status->rx_11b_mode_data_duration =
5386 event->rx_11b_mode_data_duration;
5387 channel_status->tx_frame_count = event->tx_frame_cnt;
5388 channel_status->mac_clk_mhz = event->mac_clk_mhz;
5389 channel_status->channel_id =
5390 cds_freq_to_chan(event->freq);
5391 channel_status->cmd_flags =
5392 event->cmd_flags;
5393
5394 wma_send_msg(handle, WMA_RX_CHN_STATUS_EVENT,
5395 (void *)channel_status, 0);
5396 }
5397
Kapil Gupta4f0c0c12017-02-07 15:21:15 +05305398 return 0;
5399}
lifeng66831662017-05-19 16:01:35 +08005400
5401int wma_rx_aggr_failure_event_handler(void *handle, u_int8_t *event_buf,
5402 u_int32_t len)
5403{
5404 WMI_REPORT_RX_AGGR_FAILURE_EVENTID_param_tlvs *param_buf;
5405 struct sir_sme_rx_aggr_hole_ind *rx_aggr_hole_event;
5406 wmi_rx_aggr_failure_event_fixed_param *rx_aggr_failure_info;
5407 wmi_rx_aggr_failure_info *hole_info;
5408 uint32_t i, alloc_len;
Jeff Johnson9f18aa72018-12-02 12:05:12 -08005409 struct mac_context *mac;
lifeng66831662017-05-19 16:01:35 +08005410
Jeff Johnson9f18aa72018-12-02 12:05:12 -08005411 mac = (struct mac_context *)cds_get_context(QDF_MODULE_ID_PE);
lifeng66831662017-05-19 16:01:35 +08005412 if (!mac || !mac->sme.stats_ext2_cb) {
5413 WMA_LOGD("%s: NULL mac ptr or HDD callback is null", __func__);
5414 return -EINVAL;
5415 }
5416
5417 param_buf = (WMI_REPORT_RX_AGGR_FAILURE_EVENTID_param_tlvs *)event_buf;
5418 if (!param_buf) {
5419 WMA_LOGE("%s: Invalid stats ext event buf", __func__);
5420 return -EINVAL;
5421 }
5422
5423 rx_aggr_failure_info = param_buf->fixed_param;
5424 hole_info = param_buf->failure_info;
5425
Vignesh Viswanathan677e3ec2017-09-27 20:44:27 +05305426 if (rx_aggr_failure_info->num_failure_info > ((WMI_SVC_MSG_MAX_SIZE -
5427 sizeof(*rx_aggr_hole_event)) /
5428 sizeof(rx_aggr_hole_event->hole_info_array[0]))) {
5429 WMA_LOGE("%s: Excess data from WMI num_failure_info %d",
5430 __func__, rx_aggr_failure_info->num_failure_info);
Vignesh Viswanathan677e3ec2017-09-27 20:44:27 +05305431 return -EINVAL;
5432 }
5433
lifeng66831662017-05-19 16:01:35 +08005434 alloc_len = sizeof(*rx_aggr_hole_event) +
5435 (rx_aggr_failure_info->num_failure_info)*
5436 sizeof(rx_aggr_hole_event->hole_info_array[0]);
5437 rx_aggr_hole_event = qdf_mem_malloc(alloc_len);
Arif Hussain157263f2018-10-03 13:07:15 -07005438 if (!rx_aggr_hole_event)
lifeng66831662017-05-19 16:01:35 +08005439 return -ENOMEM;
lifeng66831662017-05-19 16:01:35 +08005440
5441 rx_aggr_hole_event->hole_cnt = rx_aggr_failure_info->num_failure_info;
Abhinav Kumara03659c2017-12-28 15:18:07 +05305442 if (rx_aggr_hole_event->hole_cnt > param_buf->num_failure_info) {
5443 WMA_LOGE("Invalid no of hole count: %d",
5444 rx_aggr_hole_event->hole_cnt);
5445 qdf_mem_free(rx_aggr_hole_event);
5446 return -EINVAL;
5447 }
lifeng66831662017-05-19 16:01:35 +08005448 WMA_LOGD("aggr holes_sum: %d\n",
5449 rx_aggr_failure_info->num_failure_info);
5450 for (i = 0; i < rx_aggr_hole_event->hole_cnt; i++) {
5451 rx_aggr_hole_event->hole_info_array[i] =
5452 hole_info->end_seq - hole_info->start_seq + 1;
5453 WMA_LOGD("aggr_index: %d\tstart_seq: %d\tend_seq: %d\t"
5454 "hole_info: %d mpdu lost",
5455 i, hole_info->start_seq, hole_info->end_seq,
5456 rx_aggr_hole_event->hole_info_array[i]);
5457 hole_info++;
5458 }
5459
Jeff Johnson6aaaa992018-06-30 10:43:04 -07005460 mac->sme.stats_ext2_cb(mac->hdd_handle, rx_aggr_hole_event);
lifeng66831662017-05-19 16:01:35 +08005461 qdf_mem_free(rx_aggr_hole_event);
5462
5463 return 0;
5464}
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +05305465
5466int wma_wlan_bt_activity_evt_handler(void *handle, uint8_t *event, uint32_t len)
5467{
5468 wmi_coex_bt_activity_event_fixed_param *fixed_param;
5469 WMI_WLAN_COEX_BT_ACTIVITY_EVENTID_param_tlvs *param_buf =
5470 (WMI_WLAN_COEX_BT_ACTIVITY_EVENTID_param_tlvs *)event;
5471 struct scheduler_msg sme_msg = {0};
5472 QDF_STATUS qdf_status;
5473
5474 if (!param_buf) {
5475 WMA_LOGE(FL("Invalid BT activity event buffer"));
5476 return -EINVAL;
5477 }
5478
5479 fixed_param = param_buf->fixed_param;
5480 if (!fixed_param) {
5481 WMA_LOGE(FL("Invalid BT activity event fixed param buffer"));
5482 return -EINVAL;
5483 }
5484
5485 WMA_LOGI(FL("Received BT activity event %u"),
5486 fixed_param->coex_profile_evt);
5487
5488 sme_msg.type = eWNI_SME_BT_ACTIVITY_INFO_IND;
5489 sme_msg.bodyptr = NULL;
5490 sme_msg.bodyval = fixed_param->coex_profile_evt;
5491
gaurank kathpalia00861f02018-08-28 19:16:12 +05305492 qdf_status = scheduler_post_message(QDF_MODULE_ID_WMA,
5493 QDF_MODULE_ID_SME,
5494 QDF_MODULE_ID_SME, &sme_msg);
Madhvapathi Sriram3e6627a2018-12-19 12:54:49 +05305495 if (QDF_IS_STATUS_ERROR(qdf_status))
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +05305496 return -EINVAL;
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +05305497
5498 return 0;
5499}
lifengd217d192017-05-09 19:44:16 +08005500
lifengfe6c3e22018-04-03 12:10:04 +08005501int wma_pdev_div_info_evt_handler(void *handle, u_int8_t *event_buf,
lifengd217d192017-05-09 19:44:16 +08005502 u_int32_t len)
5503{
lifengfe6c3e22018-04-03 12:10:04 +08005504 WMI_PDEV_DIV_RSSI_ANTID_EVENTID_param_tlvs *param_buf;
5505 wmi_pdev_div_rssi_antid_event_fixed_param *event;
5506 struct chain_rssi_result chain_rssi_result;
5507 u_int32_t i;
5508 u_int8_t macaddr[IEEE80211_ADDR_LEN];
Yeshwanth Sriram Guntuka14ab04c2018-09-21 15:06:49 +05305509 tp_wma_handle wma = (tp_wma_handle)handle;
lifengd217d192017-05-09 19:44:16 +08005510
Jeff Johnson9f18aa72018-12-02 12:05:12 -08005511 struct mac_context *pmac = (struct mac_context *)cds_get_context(
lifengd217d192017-05-09 19:44:16 +08005512 QDF_MODULE_ID_PE);
Yeshwanth Sriram Guntuka14ab04c2018-09-21 15:06:49 +05305513 if (!pmac || !wma) {
5514 WMA_LOGE(FL("Invalid pmac or wma"));
lifengd217d192017-05-09 19:44:16 +08005515 return -EINVAL;
5516 }
5517
Harprit Chhabada2e2aa692018-10-04 18:28:28 -07005518 if (!pmac->sme.get_chain_rssi_cb) {
5519 WMA_LOGE(FL("Invalid get_chain_rssi_cb"));
5520 return -EINVAL;
5521 }
lifengfe6c3e22018-04-03 12:10:04 +08005522 param_buf = (WMI_PDEV_DIV_RSSI_ANTID_EVENTID_param_tlvs *) event_buf;
lifengd217d192017-05-09 19:44:16 +08005523 if (!param_buf) {
lifengfe6c3e22018-04-03 12:10:04 +08005524 WMA_LOGE(FL("Invalid rssi antid event buffer"));
lifengd217d192017-05-09 19:44:16 +08005525 return -EINVAL;
5526 }
5527
lifengfe6c3e22018-04-03 12:10:04 +08005528 event = param_buf->fixed_param;
5529 if (!event) {
5530 WMA_LOGE(FL("Invalid fixed param"));
5531 return -EINVAL;
lifengd217d192017-05-09 19:44:16 +08005532 }
5533
Pragaspathi Thilagaraj96aff772018-08-29 23:15:31 +05305534 if (event->num_chains_valid > CHAIN_MAX_NUM) {
5535 WMA_LOGE(FL("Invalid num of chains"));
5536 return -EINVAL;
5537 }
5538
stonez396a9732019-01-16 12:29:16 +08005539 qdf_mem_zero(&chain_rssi_result, sizeof(chain_rssi_result));
5540
lifengfe6c3e22018-04-03 12:10:04 +08005541 WMI_MAC_ADDR_TO_CHAR_ARRAY(&event->macaddr, macaddr);
5542 WMA_LOGD(FL("macaddr: " MAC_ADDRESS_STR), MAC_ADDR_ARRAY(macaddr));
lifengd217d192017-05-09 19:44:16 +08005543
lifengfe6c3e22018-04-03 12:10:04 +08005544 WMA_LOGD(FL("num_chains_valid: %d"), event->num_chains_valid);
5545 chain_rssi_result.num_chains_valid = event->num_chains_valid;
5546
lifengfe6c3e22018-04-03 12:10:04 +08005547 qdf_mem_copy(chain_rssi_result.chain_rssi, event->chain_rssi,
stonez396a9732019-01-16 12:29:16 +08005548 sizeof(event->chain_rssi));
5549
5550 qdf_mem_copy(chain_rssi_result.chain_evm, event->chain_evm,
5551 sizeof(event->chain_evm));
5552
5553 qdf_mem_copy(chain_rssi_result.ant_id, event->ant_id,
5554 sizeof(event->ant_id));
5555
5556 for (i = 0; i < chain_rssi_result.num_chains_valid; i++) {
5557 WMA_LOGD(FL("chain_rssi: %d, chain_evm: %d,ant_id: %d"),
5558 chain_rssi_result.chain_rssi[i],
5559 chain_rssi_result.chain_evm[i],
5560 chain_rssi_result.ant_id[i]);
5561
Yeshwanth Sriram Guntuka14ab04c2018-09-21 15:06:49 +05305562 if (!wmi_service_enabled(wma->wmi_handle,
5563 wmi_service_hw_db2dbm_support)) {
5564 if (chain_rssi_result.chain_rssi[i] !=
5565 WMA_INVALID_PER_CHAIN_SNR)
5566 chain_rssi_result.chain_rssi[i] +=
stonez396a9732019-01-16 12:29:16 +08005567 WMA_TGT_NOISE_FLOOR_DBM;
Yeshwanth Sriram Guntuka14ab04c2018-09-21 15:06:49 +05305568 else
5569 chain_rssi_result.chain_rssi[i] =
5570 WMA_INVALID_PER_CHAIN_RSSI;
5571 }
Pragaspathi Thilagaraj96aff772018-08-29 23:15:31 +05305572 }
lifengfe6c3e22018-04-03 12:10:04 +08005573
lifengd217d192017-05-09 19:44:16 +08005574 pmac->sme.get_chain_rssi_cb(pmac->sme.get_chain_rssi_context,
lifengfe6c3e22018-04-03 12:10:04 +08005575 &chain_rssi_result);
lifengd217d192017-05-09 19:44:16 +08005576
5577 return 0;
5578}
Arif Hussainee10f902017-12-27 16:30:17 -08005579
5580int wma_vdev_obss_detection_info_handler(void *handle, uint8_t *event,
5581 uint32_t len)
5582{
5583 tp_wma_handle wma = (tp_wma_handle) handle;
5584 struct wmi_obss_detect_info *obss_detection;
5585 QDF_STATUS status;
5586
5587 if (!event) {
5588 WMA_LOGE("Invalid obss_detection_info event buffer");
5589 return -EINVAL;
5590 }
5591
5592 obss_detection = qdf_mem_malloc(sizeof(*obss_detection));
Arif Hussain157263f2018-10-03 13:07:15 -07005593 if (!obss_detection)
Arif Hussainee10f902017-12-27 16:30:17 -08005594 return -ENOMEM;
Arif Hussainee10f902017-12-27 16:30:17 -08005595
5596 status = wmi_unified_extract_obss_detection_info(wma->wmi_handle,
5597 event, obss_detection);
5598
5599 if (QDF_IS_STATUS_ERROR(status)) {
5600 WMA_LOGE("%s: Failed to extract obss info", __func__);
5601 qdf_mem_free(obss_detection);
5602 return -EINVAL;
5603 }
5604
5605 if (!wma_is_vdev_valid(obss_detection->vdev_id)) {
5606 WMA_LOGE("%s: Invalid vdev id %d", __func__,
5607 obss_detection->vdev_id);
5608 qdf_mem_free(obss_detection);
5609 return -EINVAL;
5610 }
5611
5612 wma_send_msg(wma, WMA_OBSS_DETECTION_INFO, obss_detection, 0);
5613
5614 return 0;
5615}
Arif Hussain05fb4872018-01-03 16:02:55 -08005616
Kiran Kumar Lokere7d6e4c92018-09-19 13:45:47 -07005617#ifdef CRYPTO_SET_KEY_CONVERGED
5618static void wma_send_set_key_rsp(uint8_t session_id, bool pairwise,
5619 uint8_t key_index)
5620{
5621 tSetStaKeyParams *key_info_uc;
5622 tSetBssKeyParams *key_info_mc;
5623 struct wlan_crypto_key *crypto_key;
5624 struct wlan_objmgr_vdev *vdev;
5625 tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA);
5626
5627 if (!wma) {
5628 wma_err("WMA context does not exist");
5629 return;
5630 }
5631 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(wma->psoc,
5632 session_id,
5633 WLAN_LEGACY_WMA_ID);
5634 if (!vdev) {
5635 wma_err("VDEV object not found");
5636 return;
5637 }
5638 crypto_key = wlan_crypto_get_key(vdev, key_index);
5639
5640 wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_WMA_ID);
5641 if (!crypto_key) {
5642 wma_err("crypto_key not found");
5643 return;
5644 }
5645
5646 if (pairwise) {
5647 key_info_uc = qdf_mem_malloc(sizeof(*key_info_uc));
5648 if (!key_info_uc)
5649 return;
5650 key_info_uc->sessionId = session_id;
5651 key_info_uc->smesessionId = session_id;
5652 key_info_uc->status = QDF_STATUS_SUCCESS;
5653 key_info_uc->key[0].keyLength = crypto_key->keylen;
5654 qdf_mem_copy(&key_info_uc->macaddr, &crypto_key->macaddr,
5655 QDF_MAC_ADDR_SIZE);
5656 wma_send_msg_high_priority(wma, WMA_SET_STAKEY_RSP,
5657 key_info_uc, 0);
5658 } else {
5659 key_info_mc = qdf_mem_malloc(sizeof(*key_info_mc));
5660 if (!key_info_mc)
5661 return;
5662 key_info_mc->sessionId = session_id;
5663 key_info_mc->smesessionId = session_id;
5664 key_info_mc->status = QDF_STATUS_SUCCESS;
5665 key_info_mc->key[0].keyLength = crypto_key->keylen;
5666 qdf_mem_copy(&key_info_mc->macaddr, &crypto_key->macaddr,
5667 QDF_MAC_ADDR_SIZE);
5668 wma_send_msg_high_priority(wma, WMA_SET_BSSKEY_RSP,
5669 key_info_mc, 0);
5670 }
5671}
5672
5673static void wma_reset_ipn(struct wma_txrx_node *iface, uint8_t key_index)
5674{
5675 if (key_index == WMA_IGTK_KEY_INDEX_4 ||
5676 key_index == WMA_IGTK_KEY_INDEX_5)
5677 qdf_mem_zero(iface->key.key_id[key_index -
5678 WMA_IGTK_KEY_INDEX_4].ipn,
5679 CMAC_IPN_LEN);
5680}
5681
5682void wma_update_set_key(uint8_t session_id, bool pairwise,
5683 uint8_t key_index,
5684 enum wlan_crypto_cipher_type cipher_type)
5685{
5686 tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA);
5687 struct wma_txrx_node *iface;
5688
5689 if (!wma) {
5690 wma_err("Invalid WMA context");
5691 return;
5692 }
5693 iface = &wma->interfaces[session_id];
Kiran Kumar Lokere47d0dac2019-01-24 18:38:33 -08005694 if (!iface)
5695 wma_info("iface not found for session id %d", session_id);
5696
Kiran Kumar Lokere7d6e4c92018-09-19 13:45:47 -07005697 wma_reset_ipn(iface, key_index);
5698 if (iface && pairwise)
5699 iface->ucast_key_cipher =
5700 wlan_crypto_cipher_to_wmi_cipher(cipher_type);
5701 if (!pairwise && iface) {
5702 /* Its GTK release the wake lock */
5703 wma_debug("Release set key wake lock");
5704 wma_release_wakelock(&iface->vdev_set_key_wakelock);
5705 }
5706 if (iface)
5707 iface->is_waiting_for_key = false;
5708
5709 wma_send_set_key_rsp(session_id, pairwise, key_index);
5710}
5711#endif /* CRYPTO_SET_KEY_CONVERGED */
5712
Arif Hussain05fb4872018-01-03 16:02:55 -08005713int wma_vdev_bss_color_collision_info_handler(void *handle,
5714 uint8_t *event,
5715 uint32_t len)
5716{
5717 tp_wma_handle wma = (tp_wma_handle) handle;
5718 struct wmi_obss_color_collision_info *obss_color_info;
5719 QDF_STATUS status;
5720
5721 if (!event) {
5722 WMA_LOGE("Invalid obss_color_collision event buffer");
5723 return -EINVAL;
5724 }
5725
5726 obss_color_info = qdf_mem_malloc(sizeof(*obss_color_info));
Arif Hussain157263f2018-10-03 13:07:15 -07005727 if (!obss_color_info)
Arif Hussain05fb4872018-01-03 16:02:55 -08005728 return -ENOMEM;
Arif Hussain05fb4872018-01-03 16:02:55 -08005729
5730 status = wmi_unified_extract_obss_color_collision_info(wma->wmi_handle,
5731 event,
5732 obss_color_info);
5733
5734 if (QDF_IS_STATUS_ERROR(status)) {
5735 WMA_LOGE("%s: Failed to extract obss color info", __func__);
5736 qdf_mem_free(obss_color_info);
5737 return -EINVAL;
5738 }
5739
5740 if (!wma_is_vdev_valid(obss_color_info->vdev_id)) {
5741 WMA_LOGE("%s: Invalid vdev id %d", __func__,
5742 obss_color_info->vdev_id);
5743 qdf_mem_free(obss_color_info);
5744 return -EINVAL;
5745 }
5746
5747 wma_send_msg(wma, WMA_OBSS_COLOR_COLLISION_INFO, obss_color_info, 0);
5748
5749 return 0;
5750}