blob: 08311c076cce7eb703ab2cdc0b9cff6b3132341e [file] [log] [blame]
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001/*
Amar Singhal4c3fbb42018-01-02 13:20:28 -08002 * Copyright (c) 2013-2018 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"
37#include "cfg_api.h"
Manjunathappa Prakash3454fd62016-04-01 08:52:06 -070038#include <cdp_txrx_tx_delay.h>
Manjunathappa Prakash3454fd62016-04-01 08:52:06 -070039#include <cdp_txrx_peer_ops.h>
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080040
Nirav Shahcbc6d722016-03-01 16:24:53 +053041#include "qdf_nbuf.h"
Anurag Chouhan6d760662016-02-20 16:05:43 +053042#include "qdf_types.h"
Anurag Chouhan600c3a02016-03-01 10:33:54 +053043#include "qdf_mem.h"
Dustin Brown3c89c012017-05-01 12:17:32 -070044#include "qdf_util.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080045
46#include "wma_types.h"
47#include "lim_api.h"
48#include "lim_session_utils.h"
49
50#include "cds_utils.h"
51
52#if !defined(REMOVE_PKT_LOG)
53#include "pktlog_ac.h"
54#endif /* REMOVE_PKT_LOG */
55
56#include "dbglog_host.h"
57#include "csr_api.h"
58#include "ol_fw.h"
59
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080060#include "wma_internal.h"
Naveen Rawate82c1f32016-06-22 15:34:36 -070061#include "wma_nan_datapath.h"
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -080062#include <cdp_txrx_handle.h>
Mukul Sharma00058692017-01-28 19:04:32 +053063#include "wlan_pmo_ucfg_api.h"
Abhishek Singhb20db962017-03-03 21:28:46 +053064#include <target_if_scan.h>
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070065#include "wlan_reg_services_api.h"
Deepak Dhamdheref918d422017-07-06 12:56:29 -070066#include "wlan_roam_debug.h"
Naveen Rawat3ff5cff2018-01-29 14:31:16 -080067#include <wlan_cp_stats_mc_ucfg_api.h>
Mukul Sharma00058692017-01-28 19:04:32 +053068
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080069#ifndef ARRAY_LENGTH
70#define ARRAY_LENGTH(a) (sizeof(a) / sizeof((a)[0]))
71#endif
72
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +053073/**
74 * WMA_SET_VDEV_IE_SOURCE_HOST - Flag to identify the source of VDEV SET IE
75 * command. The value is 0x0 for the VDEV SET IE WMI commands from mobile
76 * MCL platform.
77 */
78#define WMA_SET_VDEV_IE_SOURCE_HOST 0x0
79
Yeshwanth Sriram Guntukaa10da362017-10-06 12:57:11 +053080
Naveen Rawat3ff5cff2018-01-29 14:31:16 -080081#if defined(FEATURE_WLAN_DIAG_SUPPORT)
Yeshwanth Sriram Guntukaa10da362017-10-06 12:57:11 +053082/**
83 * qdf_wma_wow_wakeup_stats_event()- send wow wakeup stats
84 * @tp_wma_handle wma: WOW wakeup packet counter
85 *
86 * This function sends wow wakeup stats diag event
87 *
88 * Return: void.
89 */
Naveen Rawat3ff5cff2018-01-29 14:31:16 -080090#ifdef QCA_SUPPORT_CP_STATS
91static inline void qdf_wma_wow_wakeup_stats_event(tp_wma_handle wma)
92{
93 QDF_STATUS status;
94 struct wake_lock_stats stats = {0};
95
96 WLAN_HOST_DIAG_EVENT_DEF(wow_stats,
97 struct host_event_wlan_powersave_wow_stats);
98
99 status = ucfg_mc_cp_stats_get_psoc_wake_lock_stats(wma->psoc, &stats);
100 if (QDF_IS_STATUS_ERROR(status))
101 return;
102 qdf_mem_zero(&wow_stats, sizeof(wow_stats));
103
104 wow_stats.wow_bcast_wake_up_count = stats.bcast_wake_up_count;
105 wow_stats.wow_ipv4_mcast_wake_up_count = stats.ipv4_mcast_wake_up_count;
106 wow_stats.wow_ipv6_mcast_wake_up_count = stats.ipv6_mcast_wake_up_count;
107 wow_stats.wow_ipv6_mcast_ra_stats = stats.ipv6_mcast_ra_stats;
108 wow_stats.wow_ipv6_mcast_ns_stats = stats.ipv6_mcast_ns_stats;
109 wow_stats.wow_ipv6_mcast_na_stats = stats.ipv6_mcast_na_stats;
110 wow_stats.wow_pno_match_wake_up_count = stats.pno_match_wake_up_count;
111 wow_stats.wow_pno_complete_wake_up_count =
112 stats.pno_complete_wake_up_count;
113 wow_stats.wow_gscan_wake_up_count = stats.gscan_wake_up_count;
114 wow_stats.wow_low_rssi_wake_up_count = stats.low_rssi_wake_up_count;
115 wow_stats.wow_rssi_breach_wake_up_count =
116 stats.rssi_breach_wake_up_count;
117 wow_stats.wow_icmpv4_count = stats.icmpv4_count;
118 wow_stats.wow_icmpv6_count = stats.icmpv6_count;
119 wow_stats.wow_oem_response_wake_up_count =
120 stats.oem_response_wake_up_count;
121
122 WLAN_HOST_DIAG_EVENT_REPORT(&wow_stats, EVENT_WLAN_POWERSAVE_WOW_STATS);
123}
124#else /* QCA_SUPPORT_CP_STATS*/
Yeshwanth Sriram Guntukaa10da362017-10-06 12:57:11 +0530125static inline void qdf_wma_wow_wakeup_stats_event(tp_wma_handle wma)
126{
127 QDF_STATUS status;
128 struct sir_wake_lock_stats stats;
129
130 WLAN_HOST_DIAG_EVENT_DEF(WowStats,
131 struct host_event_wlan_powersave_wow_stats);
132
133 status = wma_get_wakelock_stats(&stats);
134 if (QDF_IS_STATUS_ERROR(status))
135 return;
136 qdf_mem_zero(&WowStats, sizeof(WowStats));
137
138 WowStats.wow_bcast_wake_up_count =
139 stats.wow_bcast_wake_up_count;
140 WowStats.wow_ipv4_mcast_wake_up_count =
141 stats.wow_ipv4_mcast_wake_up_count;
142 WowStats.wow_ipv6_mcast_wake_up_count =
143 stats.wow_ipv6_mcast_wake_up_count;
144 WowStats.wow_ipv6_mcast_ra_stats =
145 stats.wow_ipv6_mcast_ra_stats;
146 WowStats.wow_ipv6_mcast_ns_stats =
147 stats.wow_ipv6_mcast_ns_stats;
148 WowStats.wow_ipv6_mcast_na_stats =
149 stats.wow_ipv6_mcast_na_stats;
150 WowStats.wow_pno_match_wake_up_count =
151 stats.wow_pno_match_wake_up_count;
152 WowStats.wow_pno_complete_wake_up_count =
153 stats.wow_pno_complete_wake_up_count;
154 WowStats.wow_gscan_wake_up_count =
155 stats.wow_gscan_wake_up_count;
156 WowStats.wow_low_rssi_wake_up_count =
157 stats.wow_low_rssi_wake_up_count;
158 WowStats.wow_rssi_breach_wake_up_count =
159 stats.wow_rssi_breach_wake_up_count;
160 WowStats.wow_icmpv4_count =
161 stats.wow_icmpv4_count;
162 WowStats.wow_icmpv6_count =
163 stats.wow_icmpv6_count;
164 WowStats.wow_oem_response_wake_up_count =
165 stats.wow_oem_response_wake_up_count;
166
167 WLAN_HOST_DIAG_EVENT_REPORT(&WowStats, EVENT_WLAN_POWERSAVE_WOW_STATS);
168}
Naveen Rawat3ff5cff2018-01-29 14:31:16 -0800169#endif /* QCA_SUPPORT_CP_STATS */
Yeshwanth Sriram Guntukaa10da362017-10-06 12:57:11 +0530170#else
171static inline void qdf_wma_wow_wakeup_stats_event(tp_wma_handle wma)
172{
173 return;
174}
175#endif
176
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800177#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
178/**
179 * wma_post_auto_shutdown_msg() - to post auto shutdown event to sme
180 *
181 * Return: 0 for success or error code
182 */
Dustin Browne2206fb2017-04-20 13:39:25 -0700183static int wma_wake_reason_auto_shutdown(void)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800184{
185 tSirAutoShutdownEvtParams *auto_sh_evt;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530186 QDF_STATUS qdf_status;
Rajeev Kumarb60abe42017-01-21 15:39:31 -0800187 struct scheduler_msg sme_msg = { 0 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800188
Arif Hussain157263f2018-10-03 13:07:15 -0700189 auto_sh_evt = qdf_mem_malloc(sizeof(tSirAutoShutdownEvtParams));
190 if (!auto_sh_evt)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800191 return -ENOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800192
193 auto_sh_evt->shutdown_reason =
194 WMI_HOST_AUTO_SHUTDOWN_REASON_TIMER_EXPIRY;
195 sme_msg.type = eWNI_SME_AUTO_SHUTDOWN_IND;
196 sme_msg.bodyptr = auto_sh_evt;
197 sme_msg.bodyval = 0;
198
gaurank kathpalia00861f02018-08-28 19:16:12 +0530199 qdf_status = scheduler_post_message(QDF_MODULE_ID_WMA,
200 QDF_MODULE_ID_SME,
201 QDF_MODULE_ID_SME, &sme_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530202 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800203 WMA_LOGE("Fail to post eWNI_SME_AUTO_SHUTDOWN_IND msg to SME");
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530204 qdf_mem_free(auto_sh_evt);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800205 return -EINVAL;
206 }
207
208 return 0;
209}
Dustin Browne2206fb2017-04-20 13:39:25 -0700210#else
211static inline int wma_wake_reason_auto_shutdown(void)
212{
213 return 0;
214}
215#endif /* FEATURE_WLAN_AUTO_SHUTDOWN */
216
217#ifdef FEATURE_WLAN_SCAN_PNO
218static int wma_wake_reason_nlod(t_wma_handle *wma, uint8_t vdev_id)
219{
220 wmi_nlo_event nlo_event = { .vdev_id = vdev_id };
221 WMI_NLO_MATCH_EVENTID_param_tlvs param = { .fixed_param = &nlo_event };
222
223 return target_if_nlo_match_event_handler(wma, (uint8_t *)&param,
224 sizeof(param));
225}
226#else
227static inline int wma_wake_reason_nlod(uint8_t vdev_id)
228{
229 return 0;
230}
231#endif /* FEATURE_WLAN_SCAN_PNO */
232
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800233/**
234 * wma_send_snr_request() - send request to fw to get RSSI stats
235 * @wma_handle: wma handle
236 * @pGetRssiReq: get RSSI request
237 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +0530238 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800239 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530240QDF_STATUS wma_send_snr_request(tp_wma_handle wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800241 void *pGetRssiReq)
242{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800243 tAniGetRssiReq *pRssiBkUp = NULL;
244
Jeff Johnsonc97816c2018-05-12 17:13:23 -0700245 /* command is in progress */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800246 if (NULL != wma_handle->pGetRssiReq)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530247 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800248
249 /* create a copy of csrRssiCallback to send rssi value
250 * after wmi event
251 */
252 if (pGetRssiReq) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530253 pRssiBkUp = qdf_mem_malloc(sizeof(tAniGetRssiReq));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800254 if (!pRssiBkUp) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800255 wma_handle->pGetRssiReq = NULL;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530256 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800257 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800258 pRssiBkUp->sessionId =
259 ((tAniGetRssiReq *) pGetRssiReq)->sessionId;
260 pRssiBkUp->rssiCallback =
261 ((tAniGetRssiReq *) pGetRssiReq)->rssiCallback;
262 pRssiBkUp->pDevContext =
263 ((tAniGetRssiReq *) pGetRssiReq)->pDevContext;
264 wma_handle->pGetRssiReq = (void *)pRssiBkUp;
265 }
266
Govind Singhaa64c242016-03-08 11:31:49 +0530267 if (wmi_unified_snr_request_cmd(wma_handle->wmi_handle)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800268 WMA_LOGE("Failed to send host stats request to fw");
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530269 qdf_mem_free(pRssiBkUp);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800270 wma_handle->pGetRssiReq = NULL;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530271 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800272 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530273 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800274}
275
276/**
277 * wma_get_snr() - get RSSI from fw
278 * @psnr_req: request params
279 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +0530280 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800281 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530282QDF_STATUS wma_get_snr(tAniGetSnrReq *psnr_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800283{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800284 tAniGetSnrReq *psnr_req_bkp;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800285 tp_wma_handle wma_handle = NULL;
286 struct wma_txrx_node *intr;
287
Anurag Chouhan6d760662016-02-20 16:05:43 +0530288 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800289
290 if (NULL == wma_handle) {
291 WMA_LOGE("%s : Failed to get wma_handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530292 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800293 }
294
295 intr = &wma_handle->interfaces[psnr_req->sessionId];
Jeff Johnsonc97816c2018-05-12 17:13:23 -0700296 /* command is in progress */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800297 if (NULL != intr->psnr_req) {
298 WMA_LOGE("%s : previous snr request is pending", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530299 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800300 }
301
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530302 psnr_req_bkp = qdf_mem_malloc(sizeof(tAniGetSnrReq));
Arif Hussain157263f2018-10-03 13:07:15 -0700303 if (!psnr_req_bkp)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530304 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800305
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530306 qdf_mem_set(psnr_req_bkp, sizeof(tAniGetSnrReq), 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800307 psnr_req_bkp->staId = psnr_req->staId;
308 psnr_req_bkp->pDevContext = psnr_req->pDevContext;
309 psnr_req_bkp->snrCallback = psnr_req->snrCallback;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800310 intr->psnr_req = (void *)psnr_req_bkp;
Govind Singhaa64c242016-03-08 11:31:49 +0530311
312 if (wmi_unified_snr_cmd(wma_handle->wmi_handle,
313 psnr_req->sessionId)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800314 WMA_LOGE("Failed to send host stats request to fw");
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530315 qdf_mem_free(psnr_req_bkp);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800316 intr->psnr_req = NULL;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530317 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800318 }
319
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530320 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800321}
322
323/**
324 * wma_process_link_status_req() - process link status request from UMAC
325 * @wma: wma handle
326 * @pGetLinkStatus: get link params
327 *
328 * Return: none
329 */
330void wma_process_link_status_req(tp_wma_handle wma,
331 tAniGetLinkStatus *pGetLinkStatus)
332{
Govind Singhaa64c242016-03-08 11:31:49 +0530333 struct link_status_params cmd = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800334 struct wma_txrx_node *iface =
335 &wma->interfaces[pGetLinkStatus->sessionId];
336
337 if (iface->plink_status_req) {
338 WMA_LOGE("%s:previous link status request is pending,deleting the new request",
339 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530340 qdf_mem_free(pGetLinkStatus);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800341 return;
342 }
343
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800344 iface->plink_status_req = pGetLinkStatus;
Govind Singhaa64c242016-03-08 11:31:49 +0530345 cmd.session_id = pGetLinkStatus->sessionId;
346 if (wmi_unified_link_status_req_cmd(wma->wmi_handle, &cmd)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800347 WMA_LOGE("Failed to send WMI link status request to fw");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800348 iface->plink_status_req = NULL;
349 goto end;
350 }
351
352 return;
353
354end:
355 wma_post_link_status(pGetLinkStatus, LINK_STATUS_LEGACY);
356}
357
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700358#ifdef WLAN_FEATURE_TSF
359/**
360 * wma_vdev_tsf_handler() - handle tsf event indicated by FW
361 * @handle: wma context
362 * @data: event buffer
363 * @data len: length of event buffer
364 *
365 * Return: 0 on success
366 */
367int wma_vdev_tsf_handler(void *handle, uint8_t *data, uint32_t data_len)
368{
Rajeev Kumarb60abe42017-01-21 15:39:31 -0800369 struct scheduler_msg tsf_msg = {0};
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700370 WMI_VDEV_TSF_REPORT_EVENTID_param_tlvs *param_buf;
371 wmi_vdev_tsf_report_event_fixed_param *tsf_event;
372 struct stsf *ptsf;
373
374 if (data == NULL) {
375 WMA_LOGE("%s: invalid pointer", __func__);
376 return -EINVAL;
377 }
378 ptsf = qdf_mem_malloc(sizeof(*ptsf));
Arif Hussain157263f2018-10-03 13:07:15 -0700379 if (!ptsf)
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700380 return -ENOMEM;
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700381
382 param_buf = (WMI_VDEV_TSF_REPORT_EVENTID_param_tlvs *)data;
383 tsf_event = param_buf->fixed_param;
384
385 ptsf->vdev_id = tsf_event->vdev_id;
386 ptsf->tsf_low = tsf_event->tsf_low;
387 ptsf->tsf_high = tsf_event->tsf_high;
Manikandan Mohan5356c2b2016-04-03 15:51:35 -0700388 ptsf->soc_timer_low = tsf_event->qtimer_low;
389 ptsf->soc_timer_high = tsf_event->qtimer_high;
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700390
Arif Hussain157263f2018-10-03 13:07:15 -0700391 wma_nofl_debug("receive WMI_VDEV_TSF_REPORT_EVENTID on %d, tsf: %d %d",
392 ptsf->vdev_id, ptsf->tsf_low, ptsf->tsf_high);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700393
394 tsf_msg.type = eWNI_SME_TSF_EVENT;
395 tsf_msg.bodyptr = ptsf;
396 tsf_msg.bodyval = 0;
397
398 if (QDF_STATUS_SUCCESS !=
gaurank kathpalia00861f02018-08-28 19:16:12 +0530399 scheduler_post_message(QDF_MODULE_ID_WMA,
400 QDF_MODULE_ID_SME,
401 QDF_MODULE_ID_SME, &tsf_msg)) {
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700402
403 WMA_LOGP("%s: Failed to post eWNI_SME_TSF_EVENT", __func__);
404 qdf_mem_free(ptsf);
405 return -EINVAL;
406 }
407 return 0;
408}
409
Manikandan Mohan5356c2b2016-04-03 15:51:35 -0700410#ifdef QCA_WIFI_3_0
411#define TSF_FW_ACTION_CMD TSF_TSTAMP_QTIMER_CAPTURE_REQ
412#else
413#define TSF_FW_ACTION_CMD TSF_TSTAMP_CAPTURE_REQ
414#endif
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700415/**
416 * wma_capture_tsf() - send wmi to fw to capture tsf
417 * @wma_handle: wma handler
418 * @vdev_id: vdev id
419 *
420 * Return: wmi send state
421 */
422QDF_STATUS wma_capture_tsf(tp_wma_handle wma_handle, uint32_t vdev_id)
423{
424 QDF_STATUS status = QDF_STATUS_SUCCESS;
425 wmi_buf_t buf;
426 wmi_vdev_tsf_tstamp_action_cmd_fixed_param *cmd;
427 int ret;
428 int len = sizeof(*cmd);
429
430 buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -0700431 if (!buf)
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700432 return QDF_STATUS_E_NOMEM;
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700433
434 cmd = (wmi_vdev_tsf_tstamp_action_cmd_fixed_param *) wmi_buf_data(buf);
435 cmd->vdev_id = vdev_id;
Manikandan Mohan5356c2b2016-04-03 15:51:35 -0700436 cmd->tsf_action = TSF_FW_ACTION_CMD;
437 WMA_LOGD("%s :vdev_id %u, tsf_cmd: %d", __func__, cmd->vdev_id,
438 cmd->tsf_action);
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700439
440 WMITLV_SET_HDR(&cmd->tlv_header,
441 WMITLV_TAG_STRUC_wmi_vdev_tsf_tstamp_action_cmd_fixed_param,
442 WMITLV_GET_STRUCT_TLVLEN(
443 wmi_vdev_tsf_tstamp_action_cmd_fixed_param));
444
445 ret = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
446 WMI_VDEV_TSF_TSTAMP_ACTION_CMDID);
447 if (ret != EOK) {
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700448 status = QDF_STATUS_E_FAILURE;
449 goto error;
450 }
451
452 return QDF_STATUS_SUCCESS;
453
454error:
455 if (buf)
456 wmi_buf_free(buf);
457 return status;
458}
459
460/**
461 * wma_reset_tsf_gpio() - send wmi to fw to reset GPIO
462 * @wma_handle: wma handler
463 * @vdev_id: vdev id
464 *
465 * Return: wmi send state
466 */
467QDF_STATUS wma_reset_tsf_gpio(tp_wma_handle wma_handle, uint32_t vdev_id)
468{
469 QDF_STATUS status = QDF_STATUS_SUCCESS;
470 wmi_buf_t buf;
471 wmi_vdev_tsf_tstamp_action_cmd_fixed_param *cmd;
472 int ret;
473 int len = sizeof(*cmd);
474 uint8_t *buf_ptr;
475
476 buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -0700477 if (!buf)
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700478 return QDF_STATUS_E_NOMEM;
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700479
480 buf_ptr = (uint8_t *) wmi_buf_data(buf);
481 cmd = (wmi_vdev_tsf_tstamp_action_cmd_fixed_param *) buf_ptr;
482 cmd->vdev_id = vdev_id;
483 cmd->tsf_action = TSF_TSTAMP_CAPTURE_RESET;
484
485 WMA_LOGD("%s :vdev_id %u, TSF_TSTAMP_CAPTURE_RESET", __func__,
486 cmd->vdev_id);
487
488 WMITLV_SET_HDR(&cmd->tlv_header,
489 WMITLV_TAG_STRUC_wmi_vdev_tsf_tstamp_action_cmd_fixed_param,
490 WMITLV_GET_STRUCT_TLVLEN(
491 wmi_vdev_tsf_tstamp_action_cmd_fixed_param));
492
493 ret = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
494 WMI_VDEV_TSF_TSTAMP_ACTION_CMDID);
495
496 if (ret != EOK) {
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700497 status = QDF_STATUS_E_FAILURE;
498 goto error;
499 }
500 return QDF_STATUS_SUCCESS;
501
502error:
503 if (buf)
504 wmi_buf_free(buf);
505 return status;
506}
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700507
Manikandan Mohan976e7562016-03-15 16:33:31 -0700508/**
509 * wma_set_tsf_gpio_pin() - send wmi cmd to configure gpio pin
510 * @handle: wma handler
511 * @pin: GPIO pin id
512 *
513 * Return: QDF_STATUS
514 */
515QDF_STATUS wma_set_tsf_gpio_pin(WMA_HANDLE handle, uint32_t pin)
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700516{
Manikandan Mohan976e7562016-03-15 16:33:31 -0700517 tp_wma_handle wma = (tp_wma_handle)handle;
518 struct pdev_params pdev_param = {0};
519 int32_t ret;
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700520
Manikandan Mohan976e7562016-03-15 16:33:31 -0700521 if (!wma || !wma->wmi_handle) {
522 WMA_LOGE("%s: WMA is closed, can not set gpio", __func__);
523 return QDF_STATUS_E_INVAL;
524 }
525
526 WMA_LOGD("%s: set tsf gpio pin: %d", __func__, pin);
527
528 pdev_param.param_id = WMI_PDEV_PARAM_WNTS_CONFIG;
529 pdev_param.param_value = pin;
530 ret = wmi_unified_pdev_param_send(wma->wmi_handle,
531 &pdev_param,
532 WMA_WILDCARD_PDEV_ID);
533 if (ret) {
534 WMA_LOGE("%s: Failed to set tsf gpio pin (%d)", __func__, ret);
535 return QDF_STATUS_E_FAILURE;
536 }
537 return QDF_STATUS_SUCCESS;
Manikandan Mohandcc21ba2016-03-15 14:31:56 -0700538}
539#endif
540
Manikandan Mohan80dea792016-04-28 16:36:48 -0700541/**
542 * wma_set_wisa_params(): Set WISA features related params in FW
543 * @wma_handle: WMA handle
544 * @wisa: Pointer to WISA param struct
545 *
546 * Return: CDF status
547 */
548QDF_STATUS wma_set_wisa_params(tp_wma_handle wma_handle,
549 struct sir_wisa_params *wisa)
550{
551 QDF_STATUS status = QDF_STATUS_SUCCESS;
552 wmi_buf_t buf;
553 wmi_vdev_wisa_cmd_fixed_param *cmd;
554 int ret, len = sizeof(*cmd);
555
556 buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -0700557 if (!buf)
Manikandan Mohan80dea792016-04-28 16:36:48 -0700558 return QDF_STATUS_E_NOMEM;
Manikandan Mohan80dea792016-04-28 16:36:48 -0700559
560 cmd = (wmi_vdev_wisa_cmd_fixed_param *) wmi_buf_data(buf);
561 cmd->wisa_mode = wisa->mode;
562 cmd->vdev_id = wisa->vdev_id;
563
564 WMITLV_SET_HDR(&cmd->tlv_header,
565 WMITLV_TAG_STRUC_wmi_vdev_wisa_cmd_fixed_param,
566 WMITLV_GET_STRUCT_TLVLEN(
567 wmi_vdev_wisa_cmd_fixed_param));
568
569 ret = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
570 WMI_VDEV_WISA_CMDID);
571 if (ret != EOK) {
Manikandan Mohan80dea792016-04-28 16:36:48 -0700572 status = QDF_STATUS_E_FAILURE;
573 goto error;
574 }
575 return QDF_STATUS_SUCCESS;
576
577error:
578 wmi_buf_free(buf);
579 return status;
580}
581
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800582/**
583 * wma_process_dhcp_ind() - process dhcp indication from SME
584 * @wma_handle: wma handle
585 * @ta_dhcp_ind: DHCP indication
586 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +0530587 * Return: QDF Status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800588 */
Yun Parkc3e35562018-03-08 12:05:52 -0800589QDF_STATUS wma_process_dhcp_ind(WMA_HANDLE handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800590 tAniDHCPInd *ta_dhcp_ind)
591{
Yun Parkc3e35562018-03-08 12:05:52 -0800592 tp_wma_handle wma_handle = (tp_wma_handle) handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800593 uint8_t vdev_id;
594 int status = 0;
Govind Singhaa64c242016-03-08 11:31:49 +0530595 wmi_peer_set_param_cmd_fixed_param peer_set_param_fp = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800596
Pragaspathi Thilagaraj961a8b82018-05-03 14:16:44 +0530597 if (!wma_handle) {
598 WMA_LOGE("%s : wma_handle is NULL", __func__);
599 return QDF_STATUS_E_FAILURE;
600 }
601
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800602 if (!ta_dhcp_ind) {
603 WMA_LOGE("%s : DHCP indication is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530604 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800605 }
606
Srinivas Girigowda296105a2015-09-24 16:31:16 -0700607 if (!wma_find_vdev_by_addr(wma_handle,
608 ta_dhcp_ind->adapterMacAddr.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800609 &vdev_id)) {
610 WMA_LOGE("%s: Failed to find vdev id for DHCP indication",
611 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530612 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800613 }
614
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700615 WMA_LOGD("%s: WMA --> WMI_PEER_SET_PARAM triggered by DHCP, msgType=%s, device_mode=%d, macAddr=" MAC_ADDRESS_STR,
616 __func__, ta_dhcp_ind->msgType == WMA_DHCP_START_IND ?
617 "WMA_DHCP_START_IND" : "WMA_DHCP_STOP_IND",
618 ta_dhcp_ind->device_mode,
619 MAC_ADDR_ARRAY(ta_dhcp_ind->peerMacAddr.bytes));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800620
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800621 /* fill in values */
Govind Singhaa64c242016-03-08 11:31:49 +0530622 peer_set_param_fp.vdev_id = vdev_id;
623 peer_set_param_fp.param_id = WMI_PEER_CRIT_PROTO_HINT_ENABLED;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800624 if (WMA_DHCP_START_IND == ta_dhcp_ind->msgType)
Govind Singhaa64c242016-03-08 11:31:49 +0530625 peer_set_param_fp.param_value = 1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800626 else
Govind Singhaa64c242016-03-08 11:31:49 +0530627 peer_set_param_fp.param_value = 0;
Srinivas Girigowda296105a2015-09-24 16:31:16 -0700628 WMI_CHAR_ARRAY_TO_MAC_ADDR(ta_dhcp_ind->peerMacAddr.bytes,
Govind Singhaa64c242016-03-08 11:31:49 +0530629 &peer_set_param_fp.peer_macaddr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800630
Govind Singhaa64c242016-03-08 11:31:49 +0530631 status = wmi_unified_process_dhcp_ind(wma_handle->wmi_handle,
632 &peer_set_param_fp);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700633 if (status != EOK)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530634 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800635
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530636 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800637}
638
639/**
Amar Singhal046eb8a2016-05-05 12:50:15 -0700640 * wma_chan_phy__mode() - get WLAN_PHY_MODE for channel
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800641 * @chan: channel number
Amar Singhal046eb8a2016-05-05 12:50:15 -0700642 * @chan_width: maximum channel width possible
643 * @dot11_mode: maximum phy_mode possible
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800644 *
Amar Singhal046eb8a2016-05-05 12:50:15 -0700645 * Return: return WLAN_PHY_MODE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800646 */
Amar Singhal046eb8a2016-05-05 12:50:15 -0700647WLAN_PHY_MODE wma_chan_phy_mode(u8 chan, enum phy_ch_width chan_width,
648 u8 dot11_mode)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800649{
650 WLAN_PHY_MODE phymode = MODE_UNKNOWN;
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -0700651 uint16_t bw_val = wlan_reg_get_bw_value(chan_width);
Kiran Kumar Lokere1a43bcf2018-05-15 15:51:58 -0700652 t_wma_handle *wma = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800653
Jiachao Wu52c060a2018-07-23 18:17:14 +0800654 if (!wma) {
655 WMA_LOGE("%s : wma_handle is NULL", __func__);
656 return MODE_UNKNOWN;
657 }
658
Ashish Kumar Dhanotiyacd311c82018-09-14 10:55:10 +0530659 if (chan_width >= CH_WIDTH_INVALID) {
660 WMA_LOGE("%s : Invalid channel width", __func__);
661 return MODE_UNKNOWN;
662 }
663
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -0700664 if (WLAN_REG_IS_24GHZ_CH(chan)) {
Amar Singhal046eb8a2016-05-05 12:50:15 -0700665 if (((CH_WIDTH_5MHZ == chan_width) ||
666 (CH_WIDTH_10MHZ == chan_width)) &&
667 ((WNI_CFG_DOT11_MODE_11B == dot11_mode) ||
668 (WNI_CFG_DOT11_MODE_11G == dot11_mode) ||
669 (WNI_CFG_DOT11_MODE_11N == dot11_mode) ||
670 (WNI_CFG_DOT11_MODE_ALL == dot11_mode) ||
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -0800671 (WNI_CFG_DOT11_MODE_11AC == dot11_mode) ||
672 (WNI_CFG_DOT11_MODE_11AX == dot11_mode)))
Amar Singhal046eb8a2016-05-05 12:50:15 -0700673 phymode = MODE_11G;
674 else {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800675 switch (dot11_mode) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800676 case WNI_CFG_DOT11_MODE_11B:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700677 if ((bw_val == 20) || (bw_val == 40))
Amar Singhal046eb8a2016-05-05 12:50:15 -0700678 phymode = MODE_11B;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800679 break;
680 case WNI_CFG_DOT11_MODE_11G:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700681 if ((bw_val == 20) || (bw_val == 40))
Amar Singhal046eb8a2016-05-05 12:50:15 -0700682 phymode = MODE_11G;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800683 break;
684 case WNI_CFG_DOT11_MODE_11G_ONLY:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700685 if ((bw_val == 20) || (bw_val == 40))
Amar Singhal046eb8a2016-05-05 12:50:15 -0700686 phymode = MODE_11GONLY;
687 break;
688 case WNI_CFG_DOT11_MODE_11N:
689 case WNI_CFG_DOT11_MODE_11N_ONLY:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700690 if (bw_val == 20)
Amar Singhal046eb8a2016-05-05 12:50:15 -0700691 phymode = MODE_11NG_HT20;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700692 else if (bw_val == 40)
Amar Singhal046eb8a2016-05-05 12:50:15 -0700693 phymode = MODE_11NG_HT40;
694 break;
695 case WNI_CFG_DOT11_MODE_ALL:
696 case WNI_CFG_DOT11_MODE_11AC:
697 case WNI_CFG_DOT11_MODE_11AC_ONLY:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700698 if (bw_val == 20)
Amar Singhal046eb8a2016-05-05 12:50:15 -0700699 phymode = MODE_11AC_VHT20_2G;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700700 else if (bw_val == 40)
Amar Singhal046eb8a2016-05-05 12:50:15 -0700701 phymode = MODE_11AC_VHT40_2G;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800702 break;
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -0800703 case WNI_CFG_DOT11_MODE_11AX:
704 case WNI_CFG_DOT11_MODE_11AX_ONLY:
705 if (20 == bw_val)
706 phymode = MODE_11AX_HE20_2G;
707 else if (40 == bw_val)
708 phymode = MODE_11AX_HE40_2G;
709 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800710 default:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800711 break;
712 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800713 }
Kiran Kumar Lokere1a43bcf2018-05-15 15:51:58 -0700714 } else if (wlan_reg_is_dsrc_chan(wma->pdev, chan))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800715 phymode = MODE_11A;
Amar Singhal046eb8a2016-05-05 12:50:15 -0700716 else {
717 if (((CH_WIDTH_5MHZ == chan_width) ||
718 (CH_WIDTH_10MHZ == chan_width)) &&
719 ((WNI_CFG_DOT11_MODE_11A == dot11_mode) ||
720 (WNI_CFG_DOT11_MODE_11N == dot11_mode) ||
721 (WNI_CFG_DOT11_MODE_ALL == dot11_mode) ||
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -0800722 (WNI_CFG_DOT11_MODE_11AC == dot11_mode) ||
723 (WNI_CFG_DOT11_MODE_11AX == dot11_mode)))
Amar Singhal046eb8a2016-05-05 12:50:15 -0700724 phymode = MODE_11A;
725 else {
726 switch (dot11_mode) {
727 case WNI_CFG_DOT11_MODE_11A:
728 if (0 < bw_val)
729 phymode = MODE_11A;
730 break;
731 case WNI_CFG_DOT11_MODE_11N:
732 case WNI_CFG_DOT11_MODE_11N_ONLY:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700733 if (bw_val == 20)
Amar Singhal046eb8a2016-05-05 12:50:15 -0700734 phymode = MODE_11NA_HT20;
735 else if (40 <= bw_val)
736 phymode = MODE_11NA_HT40;
737 break;
738 case WNI_CFG_DOT11_MODE_ALL:
739 case WNI_CFG_DOT11_MODE_11AC:
740 case WNI_CFG_DOT11_MODE_11AC_ONLY:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700741 if (bw_val == 20)
Amar Singhal046eb8a2016-05-05 12:50:15 -0700742 phymode = MODE_11AC_VHT20;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700743 else if (bw_val == 40)
Amar Singhal046eb8a2016-05-05 12:50:15 -0700744 phymode = MODE_11AC_VHT40;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700745 else if (bw_val == 80)
Amar Singhal046eb8a2016-05-05 12:50:15 -0700746 phymode = MODE_11AC_VHT80;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700747 else if (chan_width == CH_WIDTH_160MHZ)
Amar Singhal046eb8a2016-05-05 12:50:15 -0700748 phymode = MODE_11AC_VHT160;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700749 else if (chan_width == CH_WIDTH_80P80MHZ)
Amar Singhal046eb8a2016-05-05 12:50:15 -0700750 phymode = MODE_11AC_VHT80_80;
751 break;
Krishna Kumaar Natarajan4f1d7722017-03-03 21:12:51 -0800752 case WNI_CFG_DOT11_MODE_11AX:
753 case WNI_CFG_DOT11_MODE_11AX_ONLY:
754 if (20 == bw_val)
755 phymode = MODE_11AX_HE20;
756 else if (40 == bw_val)
757 phymode = MODE_11AX_HE40;
758 else if (80 == bw_val)
759 phymode = MODE_11AX_HE80;
760 else if (CH_WIDTH_160MHZ == chan_width)
761 phymode = MODE_11AX_HE160;
762 else if (CH_WIDTH_80P80MHZ == chan_width)
763 phymode = MODE_11AX_HE80_80;
764 break;
Amar Singhal046eb8a2016-05-05 12:50:15 -0700765 default:
766 break;
767 }
768 }
769 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800770
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700771 WMA_LOGD("%s: phymode %d channel %d ch_width %d dot11_mode %d",
772 __func__, phymode, chan, chan_width, dot11_mode);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800773
Amar Singhal046eb8a2016-05-05 12:50:15 -0700774 QDF_ASSERT(MODE_UNKNOWN != phymode);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800775 return phymode;
776}
777
778/**
779 * wma_get_link_speed() -send command to get linkspeed
780 * @handle: wma handle
781 * @pLinkSpeed: link speed info
782 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +0530783 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800784 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530785QDF_STATUS wma_get_link_speed(WMA_HANDLE handle, tSirLinkSpeedInfo *pLinkSpeed)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800786{
787 tp_wma_handle wma_handle = (tp_wma_handle) handle;
Govind Singhaa64c242016-03-08 11:31:49 +0530788 wmi_mac_addr peer_macaddr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800789
790 if (!wma_handle || !wma_handle->wmi_handle) {
791 WMA_LOGE("%s: WMA is closed, can not issue get link speed cmd",
792 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530793 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800794 }
Sourav Mohapatra89c85d12017-12-01 09:17:54 +0530795 if (!wmi_service_enabled(wma_handle->wmi_handle,
796 wmi_service_estimate_linkspeed)) {
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700797 WMA_LOGE("%s: Linkspeed feature bit not enabled Sending value 0 as link speed.",
798 __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800799 wma_send_link_speed(0);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530800 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800801 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800802 /* Copy the peer macaddress to the wma buffer */
Srinivas Girigowdadccab9a2015-11-19 14:31:14 -0800803 WMI_CHAR_ARRAY_TO_MAC_ADDR(pLinkSpeed->peer_macaddr.bytes,
Govind Singhaa64c242016-03-08 11:31:49 +0530804 &peer_macaddr);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700805 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 -0800806 __func__, pLinkSpeed->peer_macaddr.bytes,
Govind Singhaa64c242016-03-08 11:31:49 +0530807 peer_macaddr.mac_addr31to0,
808 peer_macaddr.mac_addr47to32);
Govind Singhaa64c242016-03-08 11:31:49 +0530809 if (wmi_unified_get_link_speed_cmd(wma_handle->wmi_handle,
810 peer_macaddr)) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530811 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800812 }
Govind Singhaa64c242016-03-08 11:31:49 +0530813
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530814 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800815}
816
Will Huanga9814592017-05-24 15:47:58 +0800817QDF_STATUS wma_get_peer_info(WMA_HANDLE handle,
818 struct sir_peer_info_req *peer_info_req)
819{
820 tp_wma_handle wma_handle = (tp_wma_handle)handle;
821 wmi_request_stats_cmd_fixed_param *cmd;
822 wmi_buf_t wmi_buf;
823 uint32_t len;
824 uint8_t *buf_ptr;
825
826 if (!wma_handle || !wma_handle->wmi_handle) {
827 WMA_LOGE("%s: WMA is closed, can not issue get rssi",
828 __func__);
829 return QDF_STATUS_E_INVAL;
830 }
831
832 len = sizeof(wmi_request_stats_cmd_fixed_param);
833 wmi_buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -0700834 if (!wmi_buf)
Will Huanga9814592017-05-24 15:47:58 +0800835 return QDF_STATUS_E_NOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -0700836
Will Huanga9814592017-05-24 15:47:58 +0800837 buf_ptr = (uint8_t *)wmi_buf_data(wmi_buf);
838
839 cmd = (wmi_request_stats_cmd_fixed_param *)buf_ptr;
840 WMITLV_SET_HDR(&cmd->tlv_header,
841 WMITLV_TAG_STRUC_wmi_request_stats_cmd_fixed_param,
842 WMITLV_GET_STRUCT_TLVLEN(wmi_request_stats_cmd_fixed_param));
843
844 cmd->stats_id = WMI_REQUEST_PEER_STAT;
845 cmd->vdev_id = peer_info_req->sessionid;
Will Huang496b36c2017-07-11 16:38:50 +0800846 WMI_CHAR_ARRAY_TO_MAC_ADDR(peer_info_req->peer_macaddr.bytes,
847 &cmd->peer_macaddr);
Will Huanga9814592017-05-24 15:47:58 +0800848 wma_handle->get_sta_peer_info = true;
849
850 if (wmi_unified_cmd_send(wma_handle->wmi_handle, wmi_buf, len,
851 WMI_REQUEST_STATS_CMDID)) {
Will Huanga9814592017-05-24 15:47:58 +0800852 wmi_buf_free(wmi_buf);
853 return QDF_STATUS_E_FAILURE;
854 }
855
856 qdf_mem_copy(&(wma_handle->peer_macaddr),
857 &(peer_info_req->peer_macaddr),
858 QDF_MAC_ADDR_SIZE);
859 return QDF_STATUS_SUCCESS;
860}
861
862QDF_STATUS wma_get_peer_info_ext(WMA_HANDLE handle,
863 struct sir_peer_info_ext_req *peer_info_req)
864{
865 tp_wma_handle wma_handle = (tp_wma_handle)handle;
866 wmi_request_peer_stats_info_cmd_fixed_param *cmd;
867 wmi_buf_t wmi_buf;
868 uint32_t len;
869 uint8_t *buf_ptr;
870
871 if (!wma_handle || !wma_handle->wmi_handle) {
872 WMA_LOGE("%s: WMA is closed, can not issue get rssi",
873 __func__);
874 return QDF_STATUS_E_INVAL;
875 }
876
877 WMA_LOGI("%s send WMI_REQUEST_PEER_STATS_INFO_CMDID", __func__);
878
879 len = sizeof(wmi_request_peer_stats_info_cmd_fixed_param);
880 wmi_buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -0700881 if (!wmi_buf)
Will Huanga9814592017-05-24 15:47:58 +0800882 return QDF_STATUS_E_NOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -0700883
Will Huanga9814592017-05-24 15:47:58 +0800884 buf_ptr = (uint8_t *)wmi_buf_data(wmi_buf);
885
886 cmd = (wmi_request_peer_stats_info_cmd_fixed_param *)buf_ptr;
887 WMITLV_SET_HDR(&cmd->tlv_header,
888 WMITLV_TAG_STRUC_wmi_request_peer_stats_info_cmd_fixed_param,
889 WMITLV_GET_STRUCT_TLVLEN(
890 wmi_request_peer_stats_info_cmd_fixed_param));
891 cmd->vdev_id = peer_info_req->sessionid;
892 cmd->request_type = WMI_REQUEST_ONE_PEER_STATS_INFO;
893 wma_handle->get_one_peer_info = true;
894 WMI_CHAR_ARRAY_TO_MAC_ADDR(peer_info_req->peer_macaddr.bytes,
895 &cmd->peer_macaddr);
896 cmd->reset_after_request = peer_info_req->reset_after_request;
897
898 if (wmi_unified_cmd_send(wma_handle->wmi_handle, wmi_buf, len,
899 WMI_REQUEST_PEER_STATS_INFO_CMDID)) {
Will Huanga9814592017-05-24 15:47:58 +0800900 wmi_buf_free(wmi_buf);
901 return QDF_STATUS_E_FAILURE;
902 }
903
904 WMA_LOGI("%s vdev_id %d, mac %pM, req_type %x, reset %x",
905 __func__,
906 cmd->vdev_id,
907 peer_info_req->peer_macaddr.bytes,
908 cmd->request_type,
909 cmd->reset_after_request);
910
911 qdf_mem_copy(&(wma_handle->peer_macaddr),
912 &(peer_info_req->peer_macaddr),
913 QDF_MAC_ADDR_SIZE);
914
915 return QDF_STATUS_SUCCESS;
916}
917
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -0700918/**
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700919 * wma_add_beacon_filter() - Issue WMI command to set beacon filter
920 * @wma: wma handler
921 * @filter_params: beacon_filter_param to set
922 *
923 * Return: Return QDF_STATUS
924 */
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -0700925QDF_STATUS wma_add_beacon_filter(WMA_HANDLE handle,
926 struct beacon_filter_param *filter_params)
927{
928 int i;
929 wmi_buf_t wmi_buf;
930 u_int8_t *buf;
931 A_UINT32 *ie_map;
932 int ret;
Kiran Kumar Lokeref9dc7912017-06-28 18:10:58 -0700933 struct wma_txrx_node *iface;
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -0700934 tp_wma_handle wma = (tp_wma_handle) handle;
Kiran Kumar Lokeref9dc7912017-06-28 18:10:58 -0700935
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -0700936 wmi_add_bcn_filter_cmd_fixed_param *cmd;
937 int len = sizeof(wmi_add_bcn_filter_cmd_fixed_param);
938
939 len += WMI_TLV_HDR_SIZE;
940 len += BCN_FLT_MAX_ELEMS_IE_LIST*sizeof(A_UINT32);
941
942 if (!wma || !wma->wmi_handle) {
943 WMA_LOGE("%s: WMA is closed, can not issue set beacon filter",
944 __func__);
945 return QDF_STATUS_E_INVAL;
946 }
947
Kiran Kumar Lokeref9dc7912017-06-28 18:10:58 -0700948 iface = &wma->interfaces[filter_params->vdev_id];
949 qdf_mem_copy(&iface->beacon_filter, filter_params,
950 sizeof(struct beacon_filter_param));
951 iface->beacon_filter_enabled = true;
952
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -0700953 wmi_buf = wmi_buf_alloc(wma->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -0700954 if (!wmi_buf)
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -0700955 return QDF_STATUS_E_NOMEM;
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -0700956
957 buf = (u_int8_t *) wmi_buf_data(wmi_buf);
958
959 cmd = (wmi_add_bcn_filter_cmd_fixed_param *)wmi_buf_data(wmi_buf);
960 cmd->vdev_id = filter_params->vdev_id;
961
962 WMITLV_SET_HDR(&cmd->tlv_header,
963 WMITLV_TAG_STRUC_wmi_add_bcn_filter_cmd_fixed_param,
964 WMITLV_GET_STRUCT_TLVLEN(
965 wmi_add_bcn_filter_cmd_fixed_param));
966
967 buf += sizeof(wmi_add_bcn_filter_cmd_fixed_param);
968
969 WMITLV_SET_HDR(buf, WMITLV_TAG_ARRAY_UINT32,
970 (BCN_FLT_MAX_ELEMS_IE_LIST * sizeof(u_int32_t)));
971
972 ie_map = (A_UINT32 *)(buf + WMI_TLV_HDR_SIZE);
973 for (i = 0; i < BCN_FLT_MAX_ELEMS_IE_LIST; i++) {
974 ie_map[i] = filter_params->ie_map[i];
975 WMA_LOGD("beacon filter ie map = %u", ie_map[i]);
976 }
977
978 ret = wmi_unified_cmd_send(wma->wmi_handle, wmi_buf, len,
979 WMI_ADD_BCN_FILTER_CMDID);
980 if (ret) {
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -0700981 wmi_buf_free(wmi_buf);
982 return QDF_STATUS_E_FAILURE;
983 }
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -0700984
985 return QDF_STATUS_SUCCESS;
986}
987
988/**
989* wma_remove_beacon_filter() - Issue WMI command to remove beacon filter
990* @wma: wma handler
991* @filter_params: beacon_filter_params
992*
993* Return: Return QDF_STATUS
994*/
995QDF_STATUS wma_remove_beacon_filter(WMA_HANDLE handle,
996 struct beacon_filter_param *filter_params)
997{
998 wmi_buf_t buf;
999 tp_wma_handle wma = (tp_wma_handle) handle;
1000 wmi_rmv_bcn_filter_cmd_fixed_param *cmd;
1001 int len = sizeof(wmi_rmv_bcn_filter_cmd_fixed_param);
1002 int ret;
1003
1004 if (!wma || !wma->wmi_handle) {
1005 WMA_LOGE("%s: WMA is closed, cannot issue remove beacon filter",
1006 __func__);
1007 return QDF_STATUS_E_INVAL;
1008 }
1009
1010 buf = wmi_buf_alloc(wma->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07001011 if (!buf)
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -07001012 return QDF_STATUS_E_NOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -07001013
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -07001014 cmd = (wmi_rmv_bcn_filter_cmd_fixed_param *)wmi_buf_data(buf);
1015 cmd->vdev_id = filter_params->vdev_id;
1016
1017 WMITLV_SET_HDR(&cmd->tlv_header,
1018 WMITLV_TAG_STRUC_wmi_rmv_bcn_filter_cmd_fixed_param,
1019 WMITLV_GET_STRUCT_TLVLEN(
1020 wmi_rmv_bcn_filter_cmd_fixed_param));
1021
1022 ret = wmi_unified_cmd_send(wma->wmi_handle, buf, len,
1023 WMI_RMV_BCN_FILTER_CMDID);
1024 if (ret) {
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -07001025 wmi_buf_free(buf);
1026 return QDF_STATUS_E_FAILURE;
1027 }
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -07001028
1029 return QDF_STATUS_SUCCESS;
1030}
1031
Gupta, Kapil96c7f2f2016-04-25 19:13:41 +05301032/**
1033 * wma_send_adapt_dwelltime_params() - send adaptive dwelltime configuration
1034 * params to firmware
1035 * @wma_handle: wma handler
1036 * @dwelltime_params: pointer to dwelltime_params
1037 *
1038 * Return: QDF_STATUS_SUCCESS on success and QDF failure reason code for failure
1039 */
1040QDF_STATUS wma_send_adapt_dwelltime_params(WMA_HANDLE handle,
1041 struct adaptive_dwelltime_params *dwelltime_params)
1042{
1043 tp_wma_handle wma_handle = (tp_wma_handle) handle;
1044 struct wmi_adaptive_dwelltime_params wmi_param = {0};
1045 int32_t err;
1046
1047 wmi_param.is_enabled = dwelltime_params->is_enabled;
1048 wmi_param.dwelltime_mode = dwelltime_params->dwelltime_mode;
1049 wmi_param.lpf_weight = dwelltime_params->lpf_weight;
1050 wmi_param.passive_mon_intval = dwelltime_params->passive_mon_intval;
1051 wmi_param.wifi_act_threshold = dwelltime_params->wifi_act_threshold;
1052 err = wmi_unified_send_adapt_dwelltime_params_cmd(wma_handle->
1053 wmi_handle, &wmi_param);
1054 if (err)
1055 return QDF_STATUS_E_FAILURE;
1056
1057 return QDF_STATUS_SUCCESS;
1058}
Gupta, Kapil4cb1d7d2016-04-16 18:16:25 -07001059
Nitesh Shahf9a09ff2017-05-22 15:46:25 +05301060QDF_STATUS wma_send_dbs_scan_selection_params(WMA_HANDLE handle,
1061 struct wmi_dbs_scan_sel_params *dbs_scan_params)
1062{
1063 tp_wma_handle wma_handle = (tp_wma_handle) handle;
1064 int32_t err;
1065
1066 err = wmi_unified_send_dbs_scan_sel_params_cmd(wma_handle->
1067 wmi_handle, dbs_scan_params);
1068 if (err)
1069 return QDF_STATUS_E_FAILURE;
1070
1071 return QDF_STATUS_SUCCESS;
1072}
1073
Govind Singha471e5e2015-10-12 17:11:14 +05301074/**
Govind Singhaa64c242016-03-08 11:31:49 +05301075 * wma_unified_fw_profiling_cmd() - send FW profiling cmd to WLAN FW
Govind Singha471e5e2015-10-12 17:11:14 +05301076 * @wma: wma handle
1077 * @cmd: Profiling command index
1078 * @value1: parameter1 value
1079 * @value2: parameter2 value
1080 *
1081 * Return: 0 for success else error code
1082 */
Govind Singhaa64c242016-03-08 11:31:49 +05301083QDF_STATUS wma_unified_fw_profiling_cmd(wmi_unified_t wmi_handle,
Govind Singha471e5e2015-10-12 17:11:14 +05301084 uint32_t cmd, uint32_t value1, uint32_t value2)
1085{
Govind Singha471e5e2015-10-12 17:11:14 +05301086 int ret;
Govind Singha471e5e2015-10-12 17:11:14 +05301087
Govind Singhaa64c242016-03-08 11:31:49 +05301088 ret = wmi_unified_fw_profiling_data_cmd(wmi_handle, cmd,
1089 value1, value2);
1090 if (ret) {
1091 WMA_LOGE("enable cmd Failed for id %d value %d",
1092 value1, value2);
1093 return ret;
Govind Singha471e5e2015-10-12 17:11:14 +05301094 }
1095
Govind Singhaa64c242016-03-08 11:31:49 +05301096 return QDF_STATUS_SUCCESS;
Govind Singha471e5e2015-10-12 17:11:14 +05301097}
1098
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001099/**
Naveen Rawatd7734142017-10-27 10:02:40 -07001100 * wma_wow_set_wake_time() - set timer pattern tlv, so that firmware will wake
1101 * up host after specified time is elapsed
1102 * @wma_handle: wma handle
1103 * @vdev_id: vdev id
1104 * @cookie: value to identify reason why host set up wake call.
1105 * @time: time in ms
1106 *
1107 * Return: QDF status
1108 */
1109static QDF_STATUS wma_wow_set_wake_time(WMA_HANDLE wma_handle, uint8_t vdev_id,
1110 uint32_t cookie, uint32_t time)
1111{
1112 int ret;
1113 tp_wma_handle wma = (tp_wma_handle)wma_handle;
1114
1115 WMA_LOGD(FL("send timer patter with time: %d and vdev = %d to fw"),
1116 time, vdev_id);
1117 ret = wmi_unified_wow_timer_pattern_cmd(wma->wmi_handle, vdev_id,
1118 cookie, time);
1119 if (ret) {
1120 WMA_LOGE(FL("Failed to send timer patter to fw"));
1121 return QDF_STATUS_E_FAILURE;
1122 }
1123
1124 return QDF_STATUS_SUCCESS;
1125}
1126
Qiwei Caidcb73b02018-09-17 19:58:29 +08001127#ifdef WLAN_POWER_MANAGEMENT_OFFLOAD
Naveen Rawatd7734142017-10-27 10:02:40 -07001128/**
1129 * wma_check_and_set_wake_timer(): checks all interfaces and if any interface
1130 * has install_key pending, sets timer pattern in fw to wake up host after
1131 * specified time has elapsed.
1132 * @wma: wma handle
1133 * @time: time after which host wants to be awaken.
1134 *
1135 * Return: None
1136 */
1137void wma_check_and_set_wake_timer(uint32_t time)
1138{
1139 int i;
1140 struct wma_txrx_node *iface;
Rajeev Kumarf31b9232018-01-19 14:35:20 -08001141 bool is_set_key_in_progress = false;
Naveen Rawatd7734142017-10-27 10:02:40 -07001142 t_wma_handle *wma = cds_get_context(QDF_MODULE_ID_WMA);
1143
Amar Singhal4c3fbb42018-01-02 13:20:28 -08001144 if (!wma) {
1145 WMA_LOGE("%s: WMA is closed",
1146 __func__);
1147 return;
1148 }
1149
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05301150 if (!wmi_service_enabled(wma->wmi_handle,
1151 wmi_service_wow_wakeup_by_timer_pattern)) {
Naveen Rawatd7734142017-10-27 10:02:40 -07001152 WMA_LOGD("TIME_PATTERN is not enabled");
1153 return;
1154 }
1155
1156 for (i = 0; i < wma->max_bssid; i++) {
1157 iface = &wma->interfaces[i];
Pragaspathi Thilagarajf81a8f02018-08-15 21:44:07 +05301158 if (iface->vdev_active && iface->is_waiting_for_key) {
Naveen Rawatd7734142017-10-27 10:02:40 -07001159 /*
1160 * right now cookie is dont care, since FW disregards
1161 * that.
1162 */
Rajeev Kumarf31b9232018-01-19 14:35:20 -08001163 is_set_key_in_progress = true;
Naveen Rawatd7734142017-10-27 10:02:40 -07001164 wma_wow_set_wake_time((WMA_HANDLE)wma, i, 0, time);
1165 break;
1166 }
1167 }
Rajeev Kumarf31b9232018-01-19 14:35:20 -08001168
1169 if (!is_set_key_in_progress)
1170 WMA_LOGD("set key not in progress for any vdev");
Naveen Rawatd7734142017-10-27 10:02:40 -07001171}
1172
1173/**
Govind Singhd76a5b02016-03-08 15:12:14 +05301174 * wma_unified_csa_offload_enable() - sen CSA offload enable command
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001175 * @wma: wma handle
1176 * @vdev_id: vdev id
1177 *
1178 * Return: 0 for success or error code
1179 */
Govind Singhd76a5b02016-03-08 15:12:14 +05301180int wma_unified_csa_offload_enable(tp_wma_handle wma, uint8_t vdev_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001181{
Govind Singhaa64c242016-03-08 11:31:49 +05301182 if (wmi_unified_csa_offload_enable(wma->wmi_handle,
1183 vdev_id)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001184 WMA_LOGP("%s: Failed to send CSA offload enable command",
1185 __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001186 return -EIO;
1187 }
Govind Singhaa64c242016-03-08 11:31:49 +05301188
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001189 return 0;
1190}
Qiwei Caidcb73b02018-09-17 19:58:29 +08001191#endif /* WLAN_POWER_MANAGEMENT_OFFLOAD */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001192
1193#ifdef WLAN_FEATURE_NAN
1194/**
1195 * wma_nan_rsp_event_handler() - Function is used to handle nan response
1196 * @handle: wma handle
1197 * @event_buf: event buffer
1198 * @len: length of buffer
1199 *
1200 * Return: 0 for success or error code
1201 */
1202int wma_nan_rsp_event_handler(void *handle, uint8_t *event_buf,
1203 uint32_t len)
1204{
1205 WMI_NAN_EVENTID_param_tlvs *param_buf;
1206 tSirNanEvent *nan_rsp_event;
1207 wmi_nan_event_hdr *nan_rsp_event_hdr;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301208 QDF_STATUS status;
Rajeev Kumarcf7bd802017-04-18 11:11:42 -07001209 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001210 uint8_t *buf_ptr;
1211 uint32_t alloc_len;
1212
1213 /*
1214 * This is how received event_buf looks like
1215 *
1216 * <-------------------- event_buf ----------------------------------->
1217 *
1218 * <--wmi_nan_event_hdr--><---WMI_TLV_HDR_SIZE---><----- data -------->
1219 *
1220 * +-----------+---------+-----------------------+--------------------+
1221 * | tlv_header| data_len| WMITLV_TAG_ARRAY_BYTE | nan_rsp_event_data |
1222 * +-----------+---------+-----------------------+--------------------+
1223 */
1224
1225 WMA_LOGD("%s: Posting NaN response event to SME", __func__);
1226 param_buf = (WMI_NAN_EVENTID_param_tlvs *) event_buf;
1227 if (!param_buf) {
1228 WMA_LOGE("%s: Invalid nan response event buf", __func__);
1229 return -EINVAL;
1230 }
1231 nan_rsp_event_hdr = param_buf->fixed_param;
1232 buf_ptr = (uint8_t *) nan_rsp_event_hdr;
1233 alloc_len = sizeof(tSirNanEvent);
1234 alloc_len += nan_rsp_event_hdr->data_len;
Varun Reddy Yeturu46ba20c2017-08-17 15:03:27 -07001235 if (nan_rsp_event_hdr->data_len > ((WMI_SVC_MSG_MAX_SIZE -
Yeshwanth Sriram Guntuka011904f2018-04-20 14:36:30 +05301236 WMI_TLV_HDR_SIZE - sizeof(*nan_rsp_event_hdr)) / sizeof(uint8_t)) ||
Himanshu Agarwal55e16212017-12-22 16:24:22 +05301237 nan_rsp_event_hdr->data_len > param_buf->num_data) {
Abhinav Kumara03659c2017-12-28 15:18:07 +05301238 WMA_LOGE("excess data length:%d, num_data:%d",
1239 nan_rsp_event_hdr->data_len, param_buf->num_data);
Varun Reddy Yeturu46ba20c2017-08-17 15:03:27 -07001240 return -EINVAL;
1241 }
Arif Hussain157263f2018-10-03 13:07:15 -07001242 nan_rsp_event = qdf_mem_malloc(alloc_len);
1243 if (!nan_rsp_event)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001244 return -ENOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001245
1246 nan_rsp_event->event_data_len = nan_rsp_event_hdr->data_len;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301247 qdf_mem_copy(nan_rsp_event->event_data, buf_ptr +
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001248 sizeof(wmi_nan_event_hdr) + WMI_TLV_HDR_SIZE,
1249 nan_rsp_event->event_data_len);
Rajeev Kumarb60abe42017-01-21 15:39:31 -08001250 message.type = eWNI_SME_NAN_EVENT;
1251 message.bodyptr = (void *)nan_rsp_event;
1252 message.bodyval = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001253
gaurank kathpalia00861f02018-08-28 19:16:12 +05301254 status = scheduler_post_message(QDF_MODULE_ID_WMA,
1255 QDF_MODULE_ID_SME,
1256 QDF_MODULE_ID_SME, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301257 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001258 WMA_LOGE("%s: Failed to post NaN response event to SME",
1259 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301260 qdf_mem_free(nan_rsp_event);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001261 return -EFAULT;
1262 }
1263 WMA_LOGD("%s: NaN response event Posted to SME", __func__);
1264 return 0;
1265}
Naveen Rawatc9f09522016-05-12 14:02:42 -07001266#else
Tang Yingying523322d2017-01-17 23:28:43 +08001267static int wma_nan_rsp_event_handler(void *handle, uint8_t *event_buf,
1268 uint32_t len)
Naveen Rawatc9f09522016-05-12 14:02:42 -07001269{
1270 return 0;
1271}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001272#endif /* WLAN_FEATURE_NAN */
1273
1274/**
1275 * wma_csa_offload_handler() - CSA event handler
1276 * @handle: wma handle
1277 * @event: event buffer
1278 * @len: buffer length
1279 *
1280 * This event is sent by firmware when it receives CSA IE.
1281 *
1282 * Return: 0 for success or error code
1283 */
1284int wma_csa_offload_handler(void *handle, uint8_t *event, uint32_t len)
1285{
1286 tp_wma_handle wma = (tp_wma_handle) handle;
1287 WMI_CSA_HANDLING_EVENTID_param_tlvs *param_buf;
1288 wmi_csa_event_fixed_param *csa_event;
1289 uint8_t bssid[IEEE80211_ADDR_LEN];
1290 uint8_t vdev_id = 0;
1291 uint8_t cur_chan = 0;
1292 struct ieee80211_channelswitch_ie *csa_ie;
Chandrasekaran, Manishekar5c19dc52016-02-04 14:58:26 +05301293 struct csa_offload_params *csa_offload_event;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001294 struct ieee80211_extendedchannelswitch_ie *xcsa_ie;
1295 struct ieee80211_ie_wide_bw_switch *wb_ie;
1296 struct wma_txrx_node *intr = wma->interfaces;
1297
1298 param_buf = (WMI_CSA_HANDLING_EVENTID_param_tlvs *) event;
1299
1300 WMA_LOGD("%s: Enter", __func__);
1301 if (!param_buf) {
1302 WMA_LOGE("Invalid csa event buffer");
1303 return -EINVAL;
1304 }
1305 csa_event = param_buf->fixed_param;
1306 WMI_MAC_ADDR_TO_CHAR_ARRAY(&csa_event->i_addr2, &bssid[0]);
1307
1308 if (wma_find_vdev_by_bssid(wma, bssid, &vdev_id) == NULL) {
1309 WMA_LOGE("Invalid bssid received %s:%d", __func__, __LINE__);
1310 return -EINVAL;
1311 }
1312
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301313 csa_offload_event = qdf_mem_malloc(sizeof(*csa_offload_event));
Arif Hussain157263f2018-10-03 13:07:15 -07001314 if (!csa_offload_event)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001315 return -EINVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001316
Tushnim Bhattacharyyaeb622b02018-05-07 13:50:51 -07001317 if (wma->interfaces[vdev_id].roaming_in_progress ||
1318 wma->interfaces[vdev_id].roam_synch_in_progress) {
1319 WMA_LOGE("Roaming in progress for vdev %d, ignore csa_offload_event",
1320 vdev_id);
1321 qdf_mem_free(csa_offload_event);
1322 return -EINVAL;
1323 }
1324
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301325 qdf_mem_zero(csa_offload_event, sizeof(*csa_offload_event));
1326 qdf_mem_copy(csa_offload_event->bssId, &bssid, IEEE80211_ADDR_LEN);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001327
1328 if (csa_event->ies_present_flag & WMI_CSA_IE_PRESENT) {
1329 csa_ie = (struct ieee80211_channelswitch_ie *)
1330 (&csa_event->csa_ie[0]);
1331 csa_offload_event->channel = csa_ie->newchannel;
Chandrasekaran, Manishekar5c19dc52016-02-04 14:58:26 +05301332 csa_offload_event->switch_mode = csa_ie->switchmode;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001333 } else if (csa_event->ies_present_flag & WMI_XCSA_IE_PRESENT) {
1334 xcsa_ie = (struct ieee80211_extendedchannelswitch_ie *)
1335 (&csa_event->xcsa_ie[0]);
1336 csa_offload_event->channel = xcsa_ie->newchannel;
Chandrasekaran, Manishekar5c19dc52016-02-04 14:58:26 +05301337 csa_offload_event->switch_mode = xcsa_ie->switchmode;
Gupta, Kapil121bf212015-11-25 19:21:29 +05301338 csa_offload_event->new_op_class = xcsa_ie->newClass;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001339 } else {
1340 WMA_LOGE("CSA Event error: No CSA IE present");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301341 qdf_mem_free(csa_offload_event);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001342 return -EINVAL;
1343 }
1344
1345 if (csa_event->ies_present_flag & WMI_WBW_IE_PRESENT) {
1346 wb_ie = (struct ieee80211_ie_wide_bw_switch *)
1347 (&csa_event->wb_ie[0]);
1348 csa_offload_event->new_ch_width = wb_ie->new_ch_width;
1349 csa_offload_event->new_ch_freq_seg1 = wb_ie->new_ch_freq_seg1;
1350 csa_offload_event->new_ch_freq_seg2 = wb_ie->new_ch_freq_seg2;
1351 }
1352
1353 csa_offload_event->ies_present_flag = csa_event->ies_present_flag;
1354
1355 WMA_LOGD("CSA: New Channel = %d BSSID:%pM",
1356 csa_offload_event->channel, csa_offload_event->bssId);
1357
1358 cur_chan = cds_freq_to_chan(intr[vdev_id].mhz);
1359 /*
1360 * basic sanity check: requested channel should not be 0
1361 * and equal to home channel
1362 */
Kiran Kumar Lokere75d636f2016-12-20 14:52:03 -08001363 if (0 == csa_offload_event->channel) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001364 WMA_LOGE("CSA Event with channel %d. Ignore !!",
1365 csa_offload_event->channel);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301366 qdf_mem_free(csa_offload_event);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001367 return -EINVAL;
1368 }
Abhishek Singha063f1c2018-09-19 11:37:51 +05301369#ifndef CONFIG_VDEV_SM
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001370 wma->interfaces[vdev_id].is_channel_switch = true;
Abhishek Singha063f1c2018-09-19 11:37:51 +05301371#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001372 wma_send_msg(wma, WMA_CSA_OFFLOAD_EVENT, (void *)csa_offload_event, 0);
1373 return 0;
1374}
1375
1376#ifdef FEATURE_OEM_DATA_SUPPORT
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001377/**
Krishna Kumaar Natarajan4e9cf392015-11-20 13:35:05 -08001378 * wma_oem_data_response_handler() - OEM data response event handler
1379 * @handle: wma handle
1380 * @datap: data ptr
1381 * @len: data length
1382 *
1383 * Return: 0 for success or error code
1384 */
1385int wma_oem_data_response_handler(void *handle,
1386 uint8_t *datap, uint32_t len)
1387{
Krishna Kumaar Natarajan4e9cf392015-11-20 13:35:05 -08001388 WMI_OEM_RESPONSE_EVENTID_param_tlvs *param_buf;
1389 uint8_t *data;
1390 uint32_t datalen;
Krishna Kumaar Natarajanc1fa17d2016-08-03 14:19:20 -07001391 struct oem_data_rsp *oem_rsp;
Krishna Kumaar Natarajan73ea9f22016-06-30 18:38:47 -07001392 tpAniSirGlobal pmac = cds_get_context(QDF_MODULE_ID_PE);
1393
1394 if (!pmac) {
1395 WMA_LOGE(FL("Invalid pmac"));
1396 return -EINVAL;
1397 }
1398
Krishna Kumaar Natarajanbbbf2ef2016-08-03 14:06:26 -07001399 if (!pmac->sme.oem_data_rsp_callback) {
Krishna Kumaar Natarajan73ea9f22016-06-30 18:38:47 -07001400 WMA_LOGE(FL("Callback not registered"));
1401 return -EINVAL;
1402 }
Krishna Kumaar Natarajan4e9cf392015-11-20 13:35:05 -08001403
1404 param_buf = (WMI_OEM_RESPONSE_EVENTID_param_tlvs *) datap;
1405 if (!param_buf) {
1406 WMA_LOGE(FL("Received NULL buf ptr from FW"));
1407 return -ENOMEM;
1408 }
1409
1410 data = param_buf->data;
1411 datalen = param_buf->num_data;
1412
1413 if (!data) {
1414 WMA_LOGE(FL("Received NULL data from FW"));
1415 return -EINVAL;
1416 }
1417
1418 if (datalen > OEM_DATA_RSP_SIZE) {
1419 WMA_LOGE(FL("Received data len %d exceeds max value %d"),
1420 datalen, OEM_DATA_RSP_SIZE);
1421 return -EINVAL;
1422 }
1423
Krishna Kumaar Natarajan608291e2015-12-14 18:17:27 -08001424 oem_rsp = qdf_mem_malloc(sizeof(*oem_rsp));
Arif Hussain157263f2018-10-03 13:07:15 -07001425 if (!oem_rsp)
Krishna Kumaar Natarajan4e9cf392015-11-20 13:35:05 -08001426 return -ENOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -07001427
Krishna Kumaar Natarajan608291e2015-12-14 18:17:27 -08001428 oem_rsp->rsp_len = datalen;
Krishna Kumaar Natarajana96ee0f2016-03-10 16:57:45 -08001429 if (oem_rsp->rsp_len) {
Krishna Kumaar Natarajan73ea9f22016-06-30 18:38:47 -07001430 oem_rsp->data = qdf_mem_malloc(oem_rsp->rsp_len);
1431 if (!oem_rsp->data) {
Krishna Kumaar Natarajana96ee0f2016-03-10 16:57:45 -08001432 qdf_mem_free(oem_rsp);
1433 return -ENOMEM;
1434 }
1435 } else {
1436 WMA_LOGE(FL("Invalid rsp length: %d"),
1437 oem_rsp->rsp_len);
Krishna Kumaar Natarajan608291e2015-12-14 18:17:27 -08001438 qdf_mem_free(oem_rsp);
Krishna Kumaar Natarajana96ee0f2016-03-10 16:57:45 -08001439 return -EINVAL;
Krishna Kumaar Natarajan608291e2015-12-14 18:17:27 -08001440 }
Krishna Kumaar Natarajan4e9cf392015-11-20 13:35:05 -08001441
Krishna Kumaar Natarajan73ea9f22016-06-30 18:38:47 -07001442 qdf_mem_copy(oem_rsp->data, data, datalen);
Krishna Kumaar Natarajan4e9cf392015-11-20 13:35:05 -08001443
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08001444 WMA_LOGD("Sending OEM_DATA_RSP(len: %d) to upper layer", datalen);
Krishna Kumaar Natarajan4e9cf392015-11-20 13:35:05 -08001445
Krishna Kumaar Natarajanbbbf2ef2016-08-03 14:06:26 -07001446 pmac->sme.oem_data_rsp_callback(oem_rsp);
Krishna Kumaar Natarajan73ea9f22016-06-30 18:38:47 -07001447
1448 if (oem_rsp->data)
1449 qdf_mem_free(oem_rsp->data);
1450 qdf_mem_free(oem_rsp);
1451
Krishna Kumaar Natarajan4e9cf392015-11-20 13:35:05 -08001452 return 0;
1453}
1454
1455/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001456 * wma_start_oem_data_req() - start OEM data request to target
1457 * @wma_handle: wma handle
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07001458 * @oem_data_req: start request params
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001459 *
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07001460 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001461 */
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07001462QDF_STATUS wma_start_oem_data_req(tp_wma_handle wma_handle,
Krishna Kumaar Natarajanc1fa17d2016-08-03 14:19:20 -07001463 struct oem_data_req *oem_data_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001464{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001465 int ret = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001466
Krishna Kumaar Natarajan9ac8efd2015-11-20 13:40:24 -08001467 WMA_LOGD(FL("Send OEM Data Request to target"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001468
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07001469 if (!oem_data_req || !oem_data_req->data) {
1470 WMA_LOGE(FL("oem_data_req is null"));
1471 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001472 }
1473
1474 if (!wma_handle || !wma_handle->wmi_handle) {
Krishna Kumaar Natarajan9ac8efd2015-11-20 13:40:24 -08001475 WMA_LOGE(FL("WMA - closed, can not send Oem data request cmd"));
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07001476 qdf_mem_free(oem_data_req->data);
1477 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001478 }
1479
Govind Singhaa64c242016-03-08 11:31:49 +05301480 ret = wmi_unified_start_oem_data_cmd(wma_handle->wmi_handle,
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07001481 oem_data_req->data_len,
1482 oem_data_req->data);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001483
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07001484 if (!QDF_IS_STATUS_SUCCESS(ret))
1485 WMA_LOGE(FL("wmi cmd send failed"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001486
Krishna Kumaar Natarajanc5e06ac2016-06-30 16:49:19 -07001487 return ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001488}
1489#endif /* FEATURE_OEM_DATA_SUPPORT */
1490
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001491#if !defined(REMOVE_PKT_LOG)
1492/**
1493 * wma_pktlog_wmi_send_cmd() - send pktlog enable/disable command to target
1494 * @handle: wma handle
1495 * @params: pktlog params
1496 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301497 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001498 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301499QDF_STATUS wma_pktlog_wmi_send_cmd(WMA_HANDLE handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001500 struct ath_pktlog_wmi_params *params)
1501{
1502 tp_wma_handle wma_handle = (tp_wma_handle) handle;
Govind Singhaa64c242016-03-08 11:31:49 +05301503 int ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001504
Govind Singhaa64c242016-03-08 11:31:49 +05301505 ret = wmi_unified_pktlog_wmi_send_cmd(wma_handle->wmi_handle,
Srinivas Girigowdac34f11d2016-02-25 16:02:42 -08001506 params->pktlog_event,
1507 params->cmd_id, params->user_triggered);
Govind Singhaa64c242016-03-08 11:31:49 +05301508 if (ret)
1509 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001510
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301511 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001512}
1513#endif /* REMOVE_PKT_LOG */
1514
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001515/**
1516 * wma_wow_wake_reason_str() - Converts wow wakeup reason code to text format
1517 * @wake_reason - WOW wake reason
1518 *
1519 * Return: reason code in string format
1520 */
1521static const u8 *wma_wow_wake_reason_str(A_INT32 wake_reason)
1522{
1523 switch (wake_reason) {
1524 case WOW_REASON_UNSPECIFIED:
1525 return "UNSPECIFIED";
1526 case WOW_REASON_NLOD:
1527 return "NLOD";
1528 case WOW_REASON_AP_ASSOC_LOST:
1529 return "AP_ASSOC_LOST";
1530 case WOW_REASON_LOW_RSSI:
1531 return "LOW_RSSI";
1532 case WOW_REASON_DEAUTH_RECVD:
1533 return "DEAUTH_RECVD";
1534 case WOW_REASON_DISASSOC_RECVD:
1535 return "DISASSOC_RECVD";
1536 case WOW_REASON_GTK_HS_ERR:
1537 return "GTK_HS_ERR";
1538 case WOW_REASON_EAP_REQ:
1539 return "EAP_REQ";
1540 case WOW_REASON_FOURWAY_HS_RECV:
1541 return "FOURWAY_HS_RECV";
1542 case WOW_REASON_TIMER_INTR_RECV:
1543 return "TIMER_INTR_RECV";
1544 case WOW_REASON_PATTERN_MATCH_FOUND:
1545 return "PATTERN_MATCH_FOUND";
1546 case WOW_REASON_RECV_MAGIC_PATTERN:
1547 return "RECV_MAGIC_PATTERN";
1548 case WOW_REASON_P2P_DISC:
1549 return "P2P_DISC";
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001550 case WOW_REASON_WLAN_HB:
1551 return "WLAN_HB";
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001552 case WOW_REASON_CSA_EVENT:
1553 return "CSA_EVENT";
1554 case WOW_REASON_PROBE_REQ_WPS_IE_RECV:
Dustin Brown72f02252017-01-10 15:34:57 -08001555 return "PROBE_REQ_WPS_IE_RECV";
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001556 case WOW_REASON_AUTH_REQ_RECV:
1557 return "AUTH_REQ_RECV";
1558 case WOW_REASON_ASSOC_REQ_RECV:
1559 return "ASSOC_REQ_RECV";
1560 case WOW_REASON_HTT_EVENT:
Dustin Brown72f02252017-01-10 15:34:57 -08001561 return "HTT_EVENT";
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001562 case WOW_REASON_RA_MATCH:
Dustin Brown72f02252017-01-10 15:34:57 -08001563 return "RA_MATCH";
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001564 case WOW_REASON_HOST_AUTO_SHUTDOWN:
Dustin Brown72f02252017-01-10 15:34:57 -08001565 return "HOST_AUTO_SHUTDOWN";
1566 case WOW_REASON_IOAC_MAGIC_EVENT:
1567 return "IOAC_MAGIC_EVENT";
1568 case WOW_REASON_IOAC_SHORT_EVENT:
1569 return "IOAC_SHORT_EVENT";
1570 case WOW_REASON_IOAC_EXTEND_EVENT:
1571 return "IOAC_EXTEND_EVENT";
1572 case WOW_REASON_IOAC_TIMER_EVENT:
1573 return "IOAC_TIMER_EVENT";
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001574 case WOW_REASON_ROAM_HO:
Dustin Brown72f02252017-01-10 15:34:57 -08001575 return "ROAM_HO";
1576 case WOW_REASON_DFS_PHYERR_RADADR_EVENT:
1577 return "DFS_PHYERR_RADADR_EVENT";
1578 case WOW_REASON_BEACON_RECV:
1579 return "BEACON_RECV";
1580 case WOW_REASON_CLIENT_KICKOUT_EVENT:
1581 return "CLIENT_KICKOUT_EVENT";
Naveen Rawatc9f09522016-05-12 14:02:42 -07001582 case WOW_REASON_NAN_EVENT:
Dustin Brown72f02252017-01-10 15:34:57 -08001583 return "NAN_EVENT";
1584 case WOW_REASON_EXTSCAN:
1585 return "EXTSCAN";
1586 case WOW_REASON_RSSI_BREACH_EVENT:
1587 return "RSSI_BREACH_EVENT";
1588 case WOW_REASON_IOAC_REV_KA_FAIL_EVENT:
1589 return "IOAC_REV_KA_FAIL_EVENT";
1590 case WOW_REASON_IOAC_SOCK_EVENT:
1591 return "IOAC_SOCK_EVENT";
1592 case WOW_REASON_NLO_SCAN_COMPLETE:
1593 return "NLO_SCAN_COMPLETE";
1594 case WOW_REASON_PACKET_FILTER_MATCH:
1595 return "PACKET_FILTER_MATCH";
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05301596 case WOW_REASON_ASSOC_RES_RECV:
1597 return "ASSOC_RES_RECV";
1598 case WOW_REASON_REASSOC_REQ_RECV:
1599 return "REASSOC_REQ_RECV";
1600 case WOW_REASON_REASSOC_RES_RECV:
1601 return "REASSOC_RES_RECV";
1602 case WOW_REASON_ACTION_FRAME_RECV:
1603 return "ACTION_FRAME_RECV";
Arun Khandavalli3dd06de2016-08-17 10:20:29 +05301604 case WOW_REASON_BPF_ALLOW:
Nachiket Kukade177b5b02018-05-22 20:52:17 +05301605 return "BPF_ALLOW";
Rajeev Kumar969d1b12016-12-20 23:53:20 -08001606 case WOW_REASON_NAN_DATA:
Dustin Brown72f02252017-01-10 15:34:57 -08001607 return "NAN_DATA";
1608 case WOW_REASON_OEM_RESPONSE_EVENT:
1609 return "OEM_RESPONSE_EVENT";
Rajeev Kumar969d1b12016-12-20 23:53:20 -08001610 case WOW_REASON_TDLS_CONN_TRACKER_EVENT:
Dustin Brown72f02252017-01-10 15:34:57 -08001611 return "TDLS_CONN_TRACKER_EVENT";
Rajeev Kumar969d1b12016-12-20 23:53:20 -08001612 case WOW_REASON_CRITICAL_LOG:
Dustin Brown72f02252017-01-10 15:34:57 -08001613 return "CRITICAL_LOG";
Rajeev Kumar969d1b12016-12-20 23:53:20 -08001614 case WOW_REASON_P2P_LISTEN_OFFLOAD:
Dustin Brown72f02252017-01-10 15:34:57 -08001615 return "P2P_LISTEN_OFFLOAD";
Rajeev Kumar969d1b12016-12-20 23:53:20 -08001616 case WOW_REASON_NAN_EVENT_WAKE_HOST:
Dustin Brown72f02252017-01-10 15:34:57 -08001617 return "NAN_EVENT_WAKE_HOST";
1618 case WOW_REASON_DEBUG_TEST:
1619 return "DEBUG_TEST";
Ravi Kumar Bokka05c14e52017-03-27 14:48:23 +05301620 case WOW_REASON_CHIP_POWER_FAILURE_DETECT:
1621 return "CHIP_POWER_FAILURE_DETECT";
Amar Singhal5eb9acb2017-05-26 15:25:27 -07001622 case WOW_REASON_11D_SCAN:
1623 return "11D_SCAN";
Arif Hussain05fb4872018-01-03 16:02:55 -08001624 case WOW_REASON_SAP_OBSS_DETECTION:
1625 return "SAP_OBSS_DETECTION";
1626 case WOW_REASON_BSS_COLOR_COLLISION_DETECT:
1627 return "BSS_COLOR_COLLISION_DETECT";
Dustin Brown72f02252017-01-10 15:34:57 -08001628 default:
1629 return "unknown";
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001630 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001631}
1632
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08001633#ifdef QCA_SUPPORT_CP_STATS
Dustin Brownb1032c22018-05-03 16:21:19 -07001634static bool wma_wow_reason_has_stats(enum wake_reason_e reason)
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08001635{
Dustin Brownb1032c22018-05-03 16:21:19 -07001636 switch (reason) {
1637 case WOW_REASON_ASSOC_REQ_RECV:
1638 case WOW_REASON_DISASSOC_RECVD:
1639 case WOW_REASON_ASSOC_RES_RECV:
1640 case WOW_REASON_REASSOC_REQ_RECV:
1641 case WOW_REASON_REASSOC_RES_RECV:
1642 case WOW_REASON_AUTH_REQ_RECV:
1643 case WOW_REASON_DEAUTH_RECVD:
1644 case WOW_REASON_ACTION_FRAME_RECV:
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08001645 case WOW_REASON_BPF_ALLOW:
1646 case WOW_REASON_PATTERN_MATCH_FOUND:
1647 case WOW_REASON_RA_MATCH:
1648 case WOW_REASON_NLOD:
1649 case WOW_REASON_NLO_SCAN_COMPLETE:
1650 case WOW_REASON_LOW_RSSI:
1651 case WOW_REASON_EXTSCAN:
1652 case WOW_REASON_RSSI_BREACH_EVENT:
1653 case WOW_REASON_OEM_RESPONSE_EVENT:
1654 case WOW_REASON_CHIP_POWER_FAILURE_DETECT:
1655 case WOW_REASON_11D_SCAN:
Dustin Brownb1032c22018-05-03 16:21:19 -07001656 return true;
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08001657 default:
Dustin Brownb1032c22018-05-03 16:21:19 -07001658 return false;
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08001659 }
Dustin Brownb1032c22018-05-03 16:21:19 -07001660}
1661
1662static void wma_inc_wow_stats(t_wma_handle *wma,
1663 WOW_EVENT_INFO_fixed_param *wake_info)
1664{
1665 ucfg_mc_cp_stats_inc_wake_lock_stats(wma->psoc,
1666 wake_info->vdev_id,
1667 wake_info->wake_reason);
1668}
1669
1670static void wma_wow_stats_display(struct wake_lock_stats *stats)
1671{
1672 WMA_LOGA("WLAN wake reason counters:");
1673 WMA_LOGA("uc:%d bc:%d v4_mc:%d v6_mc:%d ra:%d ns:%d na:%d "
1674 "icmp:%d icmpv6:%d",
1675 stats->ucast_wake_up_count,
1676 stats->bcast_wake_up_count,
1677 stats->ipv4_mcast_wake_up_count,
1678 stats->ipv6_mcast_wake_up_count,
1679 stats->ipv6_mcast_ra_stats,
1680 stats->ipv6_mcast_ns_stats,
1681 stats->ipv6_mcast_na_stats,
1682 stats->icmpv4_count,
1683 stats->icmpv6_count);
1684
1685 WMA_LOGA("assoc:%d disassoc:%d assoc_resp:%d reassoc:%d "
1686 "reassoc_resp:%d auth:%d deauth:%d action:%d",
1687 stats->mgmt_assoc,
1688 stats->mgmt_disassoc,
1689 stats->mgmt_assoc_resp,
1690 stats->mgmt_reassoc,
1691 stats->mgmt_reassoc_resp,
1692 stats->mgmt_auth,
1693 stats->mgmt_deauth,
1694 stats->mgmt_action);
1695
1696 WMA_LOGA("pno_match:%d pno_complete:%d gscan:%d "
1697 "low_rssi:%d rssi_breach:%d oem:%d scan_11d:%d",
1698 stats->pno_match_wake_up_count,
1699 stats->pno_complete_wake_up_count,
1700 stats->gscan_wake_up_count,
1701 stats->low_rssi_wake_up_count,
1702 stats->rssi_breach_wake_up_count,
1703 stats->oem_response_wake_up_count,
1704 stats->scan_11d);
1705}
1706
1707static void wma_print_wow_stats(t_wma_handle *wma,
1708 WOW_EVENT_INFO_fixed_param *wake_info)
1709{
1710 struct wlan_objmgr_vdev *vdev;
1711 struct wake_lock_stats stats = {0};
1712
1713 if (!wma_wow_reason_has_stats(wake_info->wake_reason))
1714 return;
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08001715
1716 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(wma->psoc,
1717 wake_info->vdev_id,
1718 WLAN_LEGACY_WMA_ID);
1719 ucfg_mc_cp_stats_get_vdev_wake_lock_stats(vdev, &stats);
1720 wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_WMA_ID);
1721 wma_wow_stats_display(&stats);
1722}
1723#else
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001724/**
Dustin Brown9d797d62017-01-11 16:39:12 -08001725 * wma_wow_stats_display() - display wow wake up stats
1726 * @stats: per vdev stats counters
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001727 *
1728 * Return: none
1729 */
Dustin Brown9d797d62017-01-11 16:39:12 -08001730static void wma_wow_stats_display(struct sir_vdev_wow_stats *stats)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001731{
Sreelakshmi Konamkie1cd51f2016-08-19 16:58:24 +05301732 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 -08001733 stats->ucast,
1734 stats->bcast,
1735 stats->ipv4_mcast,
1736 stats->ipv6_mcast,
1737 stats->ipv6_mcast_ra,
1738 stats->ipv6_mcast_ns,
1739 stats->ipv6_mcast_na,
1740 stats->pno_match,
1741 stats->pno_complete,
1742 stats->gscan,
1743 stats->low_rssi,
1744 stats->rssi_breach,
1745 stats->icmpv4,
1746 stats->icmpv6,
1747 stats->oem_response);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001748}
1749
Dustin Browne2206fb2017-04-20 13:39:25 -07001750static void wma_print_wow_stats(t_wma_handle *wma,
1751 WOW_EVENT_INFO_fixed_param *wake_info)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001752{
Dustin Brown3c89c012017-05-01 12:17:32 -07001753 struct sir_vdev_wow_stats *stats;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001754
Dustin Browne2206fb2017-04-20 13:39:25 -07001755 switch (wake_info->wake_reason) {
1756 case WOW_REASON_BPF_ALLOW:
1757 case WOW_REASON_PATTERN_MATCH_FOUND:
1758 case WOW_REASON_RA_MATCH:
1759 case WOW_REASON_NLOD:
1760 case WOW_REASON_NLO_SCAN_COMPLETE:
1761 case WOW_REASON_LOW_RSSI:
1762 case WOW_REASON_EXTSCAN:
1763 case WOW_REASON_RSSI_BREACH_EVENT:
1764 case WOW_REASON_OEM_RESPONSE_EVENT:
Ravi Kumar Bokka05c14e52017-03-27 14:48:23 +05301765 case WOW_REASON_CHIP_POWER_FAILURE_DETECT:
Amar Singhal5eb9acb2017-05-26 15:25:27 -07001766 case WOW_REASON_11D_SCAN:
Dustin Browne2206fb2017-04-20 13:39:25 -07001767 break;
1768 default:
1769 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001770 }
1771
Dustin Brown3c89c012017-05-01 12:17:32 -07001772 stats = &wma->interfaces[wake_info->vdev_id].wow_stats;
1773 wma_wow_stats_display(stats);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001774}
1775
1776/**
Dustin Brown9d797d62017-01-11 16:39:12 -08001777 * wma_inc_wow_stats() - maintain wow pattern match wake up stats
Dustin Browne2206fb2017-04-20 13:39:25 -07001778 * @wma: wma handle, containing the stats counters
1779 * @wake_info: the wake event information
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001780 *
1781 * Return: none
1782 */
Dustin Browne2206fb2017-04-20 13:39:25 -07001783static void wma_inc_wow_stats(t_wma_handle *wma,
1784 WOW_EVENT_INFO_fixed_param *wake_info)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001785{
Dustin Browne2206fb2017-04-20 13:39:25 -07001786 struct sir_vdev_wow_stats *stats;
Dustin Brown9d797d62017-01-11 16:39:12 -08001787
Dustin Browne2206fb2017-04-20 13:39:25 -07001788 if (wake_info->wake_reason == WOW_REASON_UNSPECIFIED) {
1789 wma->wow_unspecified_wake_count++;
1790 return;
1791 }
Himanshu Agarwal11a08c02016-08-10 15:39:54 +05301792
Dustin Brown3c89c012017-05-01 12:17:32 -07001793 stats = &wma->interfaces[wake_info->vdev_id].wow_stats;
Dustin Browne2206fb2017-04-20 13:39:25 -07001794 switch (wake_info->wake_reason) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001795 case WOW_REASON_RA_MATCH:
Dustin Brown9d797d62017-01-11 16:39:12 -08001796 stats->ipv6_mcast++;
1797 stats->ipv6_mcast_ra++;
1798 stats->icmpv6++;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001799 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001800 case WOW_REASON_NLOD:
Dustin Brown9d797d62017-01-11 16:39:12 -08001801 stats->pno_match++;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001802 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001803 case WOW_REASON_NLO_SCAN_COMPLETE:
Dustin Brown9d797d62017-01-11 16:39:12 -08001804 stats->pno_complete++;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001805 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001806 case WOW_REASON_LOW_RSSI:
Dustin Brown9d797d62017-01-11 16:39:12 -08001807 stats->low_rssi++;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001808 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001809 case WOW_REASON_EXTSCAN:
Dustin Brown9d797d62017-01-11 16:39:12 -08001810 stats->gscan++;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001811 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001812 case WOW_REASON_RSSI_BREACH_EVENT:
Dustin Brown9d797d62017-01-11 16:39:12 -08001813 stats->rssi_breach++;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001814 break;
Selvaraj, Sridhar172cabc2016-07-05 15:19:24 +05301815 case WOW_REASON_OEM_RESPONSE_EVENT:
Dustin Brown9d797d62017-01-11 16:39:12 -08001816 stats->oem_response++;
gaurank kathpalia3a1059e2018-05-07 09:51:05 +05301817 break;
Amar Singhal5eb9acb2017-05-26 15:25:27 -07001818 case WOW_REASON_11D_SCAN:
1819 stats->scan_11d++;
Selvaraj, Sridhar172cabc2016-07-05 15:19:24 +05301820 break;
Ravi Kumar Bokka05c14e52017-03-27 14:48:23 +05301821 case WOW_REASON_CHIP_POWER_FAILURE_DETECT:
1822 stats->pwr_save_fail_detected++;
1823 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001824 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001825}
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08001826#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001827
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001828#ifdef FEATURE_WLAN_EXTSCAN
1829/**
1830 * wma_extscan_get_eventid_from_tlvtag() - map tlv tag to corresponding event id
1831 * @tag: WMI TLV tag
1832 *
1833 * Return:
1834 * 0 if TLV tag is invalid
1835 * else return corresponding WMI event id
1836 */
1837static int wma_extscan_get_eventid_from_tlvtag(uint32_t tag)
1838{
1839 uint32_t event_id;
1840
1841 switch (tag) {
1842 case WMITLV_TAG_STRUC_wmi_extscan_start_stop_event_fixed_param:
1843 event_id = WMI_EXTSCAN_START_STOP_EVENTID;
1844 break;
1845
1846 case WMITLV_TAG_STRUC_wmi_extscan_operation_event_fixed_param:
1847 event_id = WMI_EXTSCAN_OPERATION_EVENTID;
1848 break;
1849
1850 case WMITLV_TAG_STRUC_wmi_extscan_table_usage_event_fixed_param:
1851 event_id = WMI_EXTSCAN_TABLE_USAGE_EVENTID;
1852 break;
1853
1854 case WMITLV_TAG_STRUC_wmi_extscan_cached_results_event_fixed_param:
1855 event_id = WMI_EXTSCAN_CACHED_RESULTS_EVENTID;
1856 break;
1857
1858 case WMITLV_TAG_STRUC_wmi_extscan_wlan_change_results_event_fixed_param:
1859 event_id = WMI_EXTSCAN_WLAN_CHANGE_RESULTS_EVENTID;
1860 break;
1861
1862 case WMITLV_TAG_STRUC_wmi_extscan_hotlist_match_event_fixed_param:
1863 event_id = WMI_EXTSCAN_HOTLIST_MATCH_EVENTID;
1864 break;
1865
1866 case WMITLV_TAG_STRUC_wmi_extscan_capabilities_event_fixed_param:
1867 event_id = WMI_EXTSCAN_CAPABILITIES_EVENTID;
1868 break;
1869
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001870 default:
1871 event_id = 0;
1872 WMA_LOGE("%s: Unknown tag: %d", __func__, tag);
1873 break;
1874 }
1875
1876 WMA_LOGI("%s: For tag %d WMI event 0x%x", __func__, tag, event_id);
1877 return event_id;
1878}
1879#else
1880static int wma_extscan_get_eventid_from_tlvtag(uint32_t tag)
1881{
1882 return 0;
1883}
1884#endif
1885
1886/**
1887 * wow_get_wmi_eventid() - map reason or tlv tag to corresponding event id
1888 * @tag: WMI TLV tag
1889 * @reason: WOW reason
1890 *
1891 * WOW reason type is primarily used to find the ID. If there could be
1892 * multiple events that can be sent as a WOW event with same reason
1893 * then tlv tag is used to identify the corresponding event.
1894 *
1895 * Return:
1896 * 0 if TLV tag/reason is invalid
1897 * else return corresponding WMI event id
1898 */
1899static int wow_get_wmi_eventid(int32_t reason, uint32_t tag)
1900{
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001901 int event_id;
1902
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001903 switch (reason) {
Dustin Browne2206fb2017-04-20 13:39:25 -07001904 case WOW_REASON_AP_ASSOC_LOST:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001905 event_id = WMI_ROAM_EVENTID;
1906 break;
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001907 case WOW_REASON_NLO_SCAN_COMPLETE:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001908 event_id = WMI_NLO_SCAN_COMPLETE_EVENTID;
1909 break;
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001910 case WOW_REASON_CSA_EVENT:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001911 event_id = WMI_CSA_HANDLING_EVENTID;
1912 break;
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001913 case WOW_REASON_LOW_RSSI:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001914 event_id = WMI_ROAM_EVENTID;
1915 break;
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001916 case WOW_REASON_CLIENT_KICKOUT_EVENT:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001917 event_id = WMI_PEER_STA_KICKOUT_EVENTID;
1918 break;
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001919 case WOW_REASON_EXTSCAN:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001920 event_id = wma_extscan_get_eventid_from_tlvtag(tag);
1921 break;
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001922 case WOW_REASON_RSSI_BREACH_EVENT:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001923 event_id = WMI_RSSI_BREACH_EVENTID;
1924 break;
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001925 case WOW_REASON_NAN_EVENT:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001926 event_id = WMI_NAN_EVENTID;
1927 break;
Naveen Rawat17dccbe2016-08-23 17:09:04 -07001928 case WOW_REASON_NAN_DATA:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001929 event_id = wma_ndp_get_eventid_from_tlvtag(tag);
1930 break;
Selvaraj, Sridhar251761a2016-06-25 16:05:15 +05301931 case WOW_REASON_TDLS_CONN_TRACKER_EVENT:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001932 event_id = WOW_TDLS_CONN_TRACKER_EVENT;
1933 break;
Deepak Dhamdhere6d2c97a2017-02-04 22:09:27 -08001934 case WOW_REASON_ROAM_HO:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001935 event_id = WMI_ROAM_EVENTID;
1936 break;
Amar Singhal5eb9acb2017-05-26 15:25:27 -07001937 case WOW_REASON_11D_SCAN:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001938 event_id = WMI_11D_NEW_COUNTRY_EVENTID;
1939 break;
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001940 default:
Dustin Browne2206fb2017-04-20 13:39:25 -07001941 WMA_LOGD(FL("No Event Id for WOW reason %s(%d)"),
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001942 wma_wow_wake_reason_str(reason), reason);
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001943 event_id = 0;
1944 break;
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001945 }
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001946 wlan_roam_debug_log(WMA_INVALID_VDEV_ID, DEBUG_WOW_REASON,
1947 DEBUG_INVALID_PEER_ID, NULL, NULL,
1948 reason, event_id);
1949
1950 return event_id;
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001951}
1952
1953/**
Dustin Brown3c89c012017-05-01 12:17:32 -07001954 * is_piggybacked_event() - Returns true if the given wake reason indicates
1955 * there will be piggybacked TLV event data
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001956 * @reason: WOW reason
1957 *
Dustin Brown3c89c012017-05-01 12:17:32 -07001958 * There are three types of WoW event payloads: none, piggybacked event, and
1959 * network packet. This function returns true for wake reasons that fall into
1960 * the piggybacked event case.
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001961 *
Dustin Brown3c89c012017-05-01 12:17:32 -07001962 * Return: true for piggybacked event data
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001963 */
Dustin Browne2206fb2017-04-20 13:39:25 -07001964static bool is_piggybacked_event(int32_t reason)
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001965{
1966 switch (reason) {
Dustin Browne2206fb2017-04-20 13:39:25 -07001967 case WOW_REASON_AP_ASSOC_LOST:
Krishna Kumaar Natarajane1a59832016-09-07 12:19:24 -07001968 case WOW_REASON_NLO_SCAN_COMPLETE:
1969 case WOW_REASON_CSA_EVENT:
1970 case WOW_REASON_LOW_RSSI:
1971 case WOW_REASON_CLIENT_KICKOUT_EVENT:
1972 case WOW_REASON_EXTSCAN:
1973 case WOW_REASON_RSSI_BREACH_EVENT:
1974 case WOW_REASON_NAN_EVENT:
1975 case WOW_REASON_NAN_DATA:
Dustin Browne2206fb2017-04-20 13:39:25 -07001976 case WOW_REASON_TDLS_CONN_TRACKER_EVENT:
Deepak Dhamdhere6d2c97a2017-02-04 22:09:27 -08001977 case WOW_REASON_ROAM_HO:
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001978 return true;
Krishna Kumaar Natarajane1a59832016-09-07 12:19:24 -07001979 default:
1980 return false;
Krishna Kumaar Natarajan36e5aa02016-07-02 17:44:25 -07001981 }
1982}
1983
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001984/**
Himanshu Agarwal82de9042016-07-20 18:11:03 +05301985 * wma_pkt_proto_subtype_to_string() - to convert proto subtype
1986 * of data packet to string.
1987 * @proto_subtype: proto subtype for data packet
1988 *
1989 * This function returns the string for the proto subtype of
1990 * data packet.
1991 *
1992 * Return: string for proto subtype for data packet
1993 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07001994static const char *
Himanshu Agarwal82de9042016-07-20 18:11:03 +05301995wma_pkt_proto_subtype_to_string(enum qdf_proto_subtype proto_subtype)
1996{
1997 switch (proto_subtype) {
1998 case QDF_PROTO_EAPOL_M1:
1999 return "EAPOL M1";
2000 case QDF_PROTO_EAPOL_M2:
2001 return "EAPOL M2";
2002 case QDF_PROTO_EAPOL_M3:
2003 return "EAPOL M3";
2004 case QDF_PROTO_EAPOL_M4:
2005 return "EAPOL M4";
2006 case QDF_PROTO_DHCP_DISCOVER:
2007 return "DHCP DISCOVER";
2008 case QDF_PROTO_DHCP_REQUEST:
2009 return "DHCP REQUEST";
2010 case QDF_PROTO_DHCP_OFFER:
2011 return "DHCP OFFER";
2012 case QDF_PROTO_DHCP_ACK:
2013 return "DHCP ACK";
2014 case QDF_PROTO_DHCP_NACK:
2015 return "DHCP NACK";
2016 case QDF_PROTO_DHCP_RELEASE:
2017 return "DHCP RELEASE";
2018 case QDF_PROTO_DHCP_INFORM:
2019 return "DHCP INFORM";
2020 case QDF_PROTO_DHCP_DECLINE:
2021 return "DHCP DECLINE";
2022 case QDF_PROTO_ARP_REQ:
2023 return "ARP REQUEST";
2024 case QDF_PROTO_ARP_RES:
2025 return "ARP RESPONSE";
2026 case QDF_PROTO_ICMP_REQ:
2027 return "ICMP REQUEST";
2028 case QDF_PROTO_ICMP_RES:
2029 return "ICMP RESPONSE";
2030 case QDF_PROTO_ICMPV6_REQ:
2031 return "ICMPV6 REQUEST";
2032 case QDF_PROTO_ICMPV6_RES:
2033 return "ICMPV6 RESPONSE";
Himanshu Agarwal471eaef2017-01-31 13:16:52 +05302034 case QDF_PROTO_ICMPV6_RS:
2035 return "ICMPV6 RS";
2036 case QDF_PROTO_ICMPV6_RA:
2037 return "ICMPV6 RA";
2038 case QDF_PROTO_ICMPV6_NS:
2039 return "ICMPV6 NS";
2040 case QDF_PROTO_ICMPV6_NA:
2041 return "ICMPV6 NA";
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302042 case QDF_PROTO_IPV4_UDP:
2043 return "IPV4 UDP Packet";
2044 case QDF_PROTO_IPV4_TCP:
2045 return "IPV4 TCP Packet";
2046 case QDF_PROTO_IPV6_UDP:
2047 return "IPV6 UDP Packet";
2048 case QDF_PROTO_IPV6_TCP:
2049 return "IPV6 TCP Packet";
2050 default:
Dustin Browne2206fb2017-04-20 13:39:25 -07002051 return NULL;
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302052 }
2053}
2054
2055/**
Dustin Brown3c89c012017-05-01 12:17:32 -07002056 * wma_wow_get_pkt_proto_subtype() - get the proto subtype of the packet.
2057 * @data: Pointer to the packet data buffer
2058 * @len: length of the packet data buffer
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302059 *
2060 * Return: proto subtype of the packet.
2061 */
2062static enum qdf_proto_subtype
Dustin Brown3c89c012017-05-01 12:17:32 -07002063wma_wow_get_pkt_proto_subtype(uint8_t *data, uint32_t len)
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302064{
Dustin Browne2206fb2017-04-20 13:39:25 -07002065 uint16_t eth_type;
2066 uint8_t proto_type;
Himanshu Agarwalec51a5a2016-07-20 19:47:26 +05302067
Dustin Browne2206fb2017-04-20 13:39:25 -07002068 if (len < QDF_NBUF_TRAC_ETH_TYPE_OFFSET + 2) {
2069 WMA_LOGE("Malformed ethernet packet: length %u < %d",
2070 len, QDF_NBUF_TRAC_ETH_TYPE_OFFSET + 2);
Himanshu Agarwalec51a5a2016-07-20 19:47:26 +05302071 return QDF_PROTO_INVALID;
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302072 }
2073
Dustin Browne2206fb2017-04-20 13:39:25 -07002074 eth_type = *(uint16_t *)(data + QDF_NBUF_TRAC_ETH_TYPE_OFFSET);
Dustin Brown3c89c012017-05-01 12:17:32 -07002075 eth_type = qdf_cpu_to_be16(eth_type);
Dustin Browne2206fb2017-04-20 13:39:25 -07002076
2077 WMA_LOGD("Ether Type: 0x%04x", eth_type);
2078 switch (eth_type) {
2079 case QDF_NBUF_TRAC_EAPOL_ETH_TYPE:
2080 if (len < WMA_EAPOL_SUBTYPE_GET_MIN_LEN)
2081 return QDF_PROTO_INVALID;
2082
2083 WMA_LOGD("EAPOL Packet");
2084 return qdf_nbuf_data_get_eapol_subtype(data);
2085
2086 case QDF_NBUF_TRAC_ARP_ETH_TYPE:
2087 if (len < WMA_ARP_SUBTYPE_GET_MIN_LEN)
2088 return QDF_PROTO_INVALID;
2089
2090 WMA_LOGD("ARP Packet");
2091 return qdf_nbuf_data_get_arp_subtype(data);
2092
2093 case QDF_NBUF_TRAC_IPV4_ETH_TYPE:
2094 if (len < WMA_IPV4_PROTO_GET_MIN_LEN)
2095 return QDF_PROTO_INVALID;
2096
2097 WMA_LOGD("IPV4 Packet");
2098
2099 proto_type = qdf_nbuf_data_get_ipv4_proto(data);
2100 WMA_LOGD("IPV4_proto_type: %u", proto_type);
2101
2102 switch (proto_type) {
2103 case QDF_NBUF_TRAC_ICMP_TYPE:
2104 if (len < WMA_ICMP_SUBTYPE_GET_MIN_LEN)
2105 return QDF_PROTO_INVALID;
2106
2107 WMA_LOGD("ICMP Packet");
2108 return qdf_nbuf_data_get_icmp_subtype(data);
2109
2110 case QDF_NBUF_TRAC_UDP_TYPE:
2111 if (len < WMA_IS_DHCP_GET_MIN_LEN)
2112 return QDF_PROTO_IPV4_UDP;
2113
2114 if (!qdf_nbuf_data_is_ipv4_dhcp_pkt(data))
2115 return QDF_PROTO_INVALID;
2116
2117 if (len < WMA_DHCP_SUBTYPE_GET_MIN_LEN)
2118 return QDF_PROTO_INVALID;
2119
2120 WMA_LOGD("DHCP Packet");
2121 return qdf_nbuf_data_get_dhcp_subtype(data);
2122
2123 case QDF_NBUF_TRAC_TCP_TYPE:
2124 return QDF_PROTO_IPV4_TCP;
2125
2126 default:
2127 return QDF_PROTO_INVALID;
2128 }
2129
2130 case QDF_NBUF_TRAC_IPV6_ETH_TYPE:
2131 if (len < WMA_IPV6_PROTO_GET_MIN_LEN)
2132 return QDF_PROTO_INVALID;
2133
2134 WMA_LOGD("IPV6 Packet");
2135
2136 proto_type = qdf_nbuf_data_get_ipv6_proto(data);
2137 WMA_LOGD("IPV6_proto_type: %u", proto_type);
2138
2139 switch (proto_type) {
2140 case QDF_NBUF_TRAC_ICMPV6_TYPE:
2141 if (len < WMA_ICMPV6_SUBTYPE_GET_MIN_LEN)
2142 return QDF_PROTO_INVALID;
2143
2144 WMA_LOGD("ICMPV6 Packet");
2145 return qdf_nbuf_data_get_icmpv6_subtype(data);
2146
2147 case QDF_NBUF_TRAC_UDP_TYPE:
2148 return QDF_PROTO_IPV6_UDP;
2149
2150 case QDF_NBUF_TRAC_TCP_TYPE:
2151 return QDF_PROTO_IPV6_TCP;
2152
2153 default:
2154 return QDF_PROTO_INVALID;
2155 }
2156
2157 default:
2158 return QDF_PROTO_INVALID;
2159 }
2160}
2161
Dustin Browne2206fb2017-04-20 13:39:25 -07002162static void wma_log_pkt_eapol(uint8_t *data, uint32_t length)
2163{
2164 uint16_t pkt_len, key_len;
2165
2166 if (length < WMA_EAPOL_INFO_GET_MIN_LEN)
2167 return;
2168
2169 pkt_len = *(uint16_t *)(data + EAPOL_PKT_LEN_OFFSET);
2170 key_len = *(uint16_t *)(data + EAPOL_KEY_LEN_OFFSET);
2171 WMA_LOGD("Pkt_len: %u, Key_len: %u",
Dustin Brown3c89c012017-05-01 12:17:32 -07002172 qdf_cpu_to_be16(pkt_len), qdf_cpu_to_be16(key_len));
Dustin Browne2206fb2017-04-20 13:39:25 -07002173}
2174
2175static void wma_log_pkt_dhcp(uint8_t *data, uint32_t length)
2176{
2177 uint16_t pkt_len;
2178 uint32_t trans_id;
2179
2180 if (length < WMA_DHCP_INFO_GET_MIN_LEN)
2181 return;
2182
2183 pkt_len = *(uint16_t *)(data + DHCP_PKT_LEN_OFFSET);
2184 trans_id = *(uint32_t *)(data + DHCP_TRANSACTION_ID_OFFSET);
2185 WMA_LOGD("Pkt_len: %u, Transaction_id: %u",
Dustin Brown3c89c012017-05-01 12:17:32 -07002186 qdf_cpu_to_be16(pkt_len), qdf_cpu_to_be16(trans_id));
Dustin Browne2206fb2017-04-20 13:39:25 -07002187}
2188
2189static void wma_log_pkt_icmpv4(uint8_t *data, uint32_t length)
2190{
2191 uint16_t pkt_len, seq_num;
2192
2193 if (length < WMA_IPV4_PKT_INFO_GET_MIN_LEN)
2194 return;
2195
2196 pkt_len = *(uint16_t *)(data + IPV4_PKT_LEN_OFFSET);
2197 seq_num = *(uint16_t *)(data + ICMP_SEQ_NUM_OFFSET);
2198 WMA_LOGD("Pkt_len: %u, Seq_num: %u",
Dustin Brown3c89c012017-05-01 12:17:32 -07002199 qdf_cpu_to_be16(pkt_len), qdf_cpu_to_be16(seq_num));
Dustin Browne2206fb2017-04-20 13:39:25 -07002200}
2201
2202static void wma_log_pkt_icmpv6(uint8_t *data, uint32_t length)
2203{
2204 uint16_t pkt_len, seq_num;
2205
2206 if (length < WMA_IPV6_PKT_INFO_GET_MIN_LEN)
2207 return;
2208
2209 pkt_len = *(uint16_t *)(data + IPV6_PKT_LEN_OFFSET);
2210 seq_num = *(uint16_t *)(data + ICMPV6_SEQ_NUM_OFFSET);
2211 WMA_LOGD("Pkt_len: %u, Seq_num: %u",
Dustin Brown3c89c012017-05-01 12:17:32 -07002212 qdf_cpu_to_be16(pkt_len), qdf_cpu_to_be16(seq_num));
Dustin Browne2206fb2017-04-20 13:39:25 -07002213}
2214
2215static void wma_log_pkt_ipv4(uint8_t *data, uint32_t length)
2216{
2217 uint16_t pkt_len, src_port, dst_port;
Sravan Kumar Kairam4402a262017-08-07 10:45:24 +05302218 char *ip_addr;
Dustin Browne2206fb2017-04-20 13:39:25 -07002219
2220 if (length < WMA_IPV4_PKT_INFO_GET_MIN_LEN)
2221 return;
2222
2223 pkt_len = *(uint16_t *)(data + IPV4_PKT_LEN_OFFSET);
Sravan Kumar Kairam4402a262017-08-07 10:45:24 +05302224 ip_addr = (char *)(data + IPV4_SRC_ADDR_OFFSET);
2225 WMA_LOGD("src addr %d:%d:%d:%d", ip_addr[0], ip_addr[1],
2226 ip_addr[2], ip_addr[3]);
2227 ip_addr = (char *)(data + IPV4_DST_ADDR_OFFSET);
2228 WMA_LOGD("dst addr %d:%d:%d:%d", ip_addr[0], ip_addr[1],
2229 ip_addr[2], ip_addr[3]);
Dustin Browne2206fb2017-04-20 13:39:25 -07002230 src_port = *(uint16_t *)(data + IPV4_SRC_PORT_OFFSET);
2231 dst_port = *(uint16_t *)(data + IPV4_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_ipv6(uint8_t *data, uint32_t length)
2239{
2240 uint16_t pkt_len, src_port, dst_port;
Sravan Kumar Kairam4402a262017-08-07 10:45:24 +05302241 char *ip_addr;
Dustin Browne2206fb2017-04-20 13:39:25 -07002242
2243 if (length < WMA_IPV6_PKT_INFO_GET_MIN_LEN)
2244 return;
2245
2246 pkt_len = *(uint16_t *)(data + IPV6_PKT_LEN_OFFSET);
Sravan Kumar Kairam4402a262017-08-07 10:45:24 +05302247 ip_addr = (char *)(data + IPV6_SRC_ADDR_OFFSET);
2248 WMA_LOGD("src addr "IPV6_ADDR_STR, ip_addr[0],
2249 ip_addr[1], ip_addr[2], ip_addr[3], ip_addr[4],
2250 ip_addr[5], ip_addr[6], ip_addr[7], ip_addr[8],
2251 ip_addr[9], ip_addr[10], ip_addr[11],
2252 ip_addr[12], ip_addr[13], ip_addr[14],
2253 ip_addr[15]);
2254 ip_addr = (char *)(data + IPV6_DST_ADDR_OFFSET);
2255 WMA_LOGD("dst addr "IPV6_ADDR_STR, ip_addr[0],
2256 ip_addr[1], ip_addr[2], ip_addr[3], ip_addr[4],
2257 ip_addr[5], ip_addr[6], ip_addr[7], ip_addr[8],
2258 ip_addr[9], ip_addr[10], ip_addr[11],
2259 ip_addr[12], ip_addr[13], ip_addr[14],
2260 ip_addr[15]);
Dustin Browne2206fb2017-04-20 13:39:25 -07002261 src_port = *(uint16_t *)(data + IPV6_SRC_PORT_OFFSET);
2262 dst_port = *(uint16_t *)(data + IPV6_DST_PORT_OFFSET);
Srinivas Girigowdae1be8772018-05-07 16:16:27 -07002263 WMA_LOGI("Pkt_len: %u, src_port: %u, dst_port: %u",
Dustin Brown3c89c012017-05-01 12:17:32 -07002264 qdf_cpu_to_be16(pkt_len),
2265 qdf_cpu_to_be16(src_port),
2266 qdf_cpu_to_be16(dst_port));
Dustin Browne2206fb2017-04-20 13:39:25 -07002267}
2268
2269static void wma_log_pkt_tcpv4(uint8_t *data, uint32_t length)
2270{
2271 uint32_t seq_num;
2272
2273 if (length < WMA_IPV4_PKT_INFO_GET_MIN_LEN)
2274 return;
2275
2276 seq_num = *(uint32_t *)(data + IPV4_TCP_SEQ_NUM_OFFSET);
Dustin Brown3c89c012017-05-01 12:17:32 -07002277 WMA_LOGD("TCP_seq_num: %u", qdf_cpu_to_be16(seq_num));
Dustin Browne2206fb2017-04-20 13:39:25 -07002278}
2279
2280static void wma_log_pkt_tcpv6(uint8_t *data, uint32_t length)
2281{
2282 uint32_t seq_num;
2283
2284 if (length < WMA_IPV6_PKT_INFO_GET_MIN_LEN)
2285 return;
2286
2287 seq_num = *(uint32_t *)(data + IPV6_TCP_SEQ_NUM_OFFSET);
Dustin Brown3c89c012017-05-01 12:17:32 -07002288 WMA_LOGD("TCP_seq_num: %u", qdf_cpu_to_be16(seq_num));
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302289}
2290
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002291#ifdef QCA_SUPPORT_CP_STATS
2292static void wma_wow_inc_wake_lock_stats_by_dst_addr(t_wma_handle *wma,
2293 uint8_t vdev_id,
2294 uint8_t *dest_mac)
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302295{
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002296 ucfg_mc_cp_stats_inc_wake_lock_stats_by_dst_addr(wma->psoc,
2297 vdev_id,
2298 dest_mac);
2299}
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302300
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002301static void wma_wow_inc_wake_lock_stats_by_protocol(t_wma_handle *wma,
2302 uint8_t vdev_id, enum qdf_proto_subtype proto_subtype)
2303{
2304 ucfg_mc_cp_stats_inc_wake_lock_stats_by_protocol(wma->psoc,
2305 vdev_id,
2306 proto_subtype);
2307}
2308#else
2309static void wma_wow_inc_wake_lock_stats_by_dst_addr(t_wma_handle *wma,
2310 uint8_t vdev_id,
2311 uint8_t *dest_mac)
2312{
2313 struct wma_txrx_node *vdev;
2314 struct sir_vdev_wow_stats *stats;
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302315
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002316 vdev = &wma->interfaces[vdev_id];
2317 stats = &vdev->wow_stats;
Dustin Browne2206fb2017-04-20 13:39:25 -07002318
2319 switch (*dest_mac) {
2320 case WMA_BCAST_MAC_ADDR:
2321 stats->bcast++;
2322 break;
2323 case WMA_MCAST_IPV4_MAC_ADDR:
2324 stats->ipv4_mcast++;
2325 break;
2326 case WMA_MCAST_IPV6_MAC_ADDR:
2327 stats->ipv6_mcast++;
2328 break;
2329 default:
2330 stats->ucast++;
Dustin Browne2206fb2017-04-20 13:39:25 -07002331 break;
2332 }
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002333}
2334
2335static void wma_wow_inc_wake_lock_stats_by_protocol(t_wma_handle *wma,
2336 uint8_t vdev_id, enum qdf_proto_subtype proto_subtype)
2337{
2338 struct wma_txrx_node *vdev;
2339 struct sir_vdev_wow_stats *stats;
2340
2341 vdev = &wma->interfaces[vdev_id];
2342 stats = &vdev->wow_stats;
2343
2344 switch (proto_subtype) {
2345 case QDF_PROTO_ICMP_RES:
2346 stats->icmpv4++;
2347 break;
2348 case QDF_PROTO_ICMPV6_REQ:
2349 case QDF_PROTO_ICMPV6_RES:
2350 case QDF_PROTO_ICMPV6_RS:
2351 stats->icmpv6++;
2352 break;
2353 case QDF_PROTO_ICMPV6_RA:
2354 stats->icmpv6++;
2355 stats->ipv6_mcast_ra++;
2356 break;
2357 case QDF_PROTO_ICMPV6_NS:
2358 stats->icmpv6++;
2359 stats->ipv6_mcast_ns++;
2360 break;
2361 case QDF_PROTO_ICMPV6_NA:
2362 stats->icmpv6++;
2363 stats->ipv6_mcast_na++;
2364 break;
2365 default:
2366 break;
2367 }
2368}
2369#endif
2370
2371/**
2372 * wma_wow_parse_data_pkt() - API to parse data buffer for data
2373 * packet that resulted in WOW wakeup.
2374 * @stats: per-vdev stats for tracking packet types
2375 * @data: Pointer to data buffer
2376 * @length: data buffer length
2377 *
2378 * This function parses the data buffer received (first few bytes of
2379 * skb->data) to get information like src mac addr, dst mac addr, packet
2380 * len, seq_num, etc. It also increments stats for different packet types.
2381 *
2382 * Return: void
2383 */
2384static void wma_wow_parse_data_pkt(t_wma_handle *wma,
2385 uint8_t vdev_id, uint8_t *data,
2386 uint32_t length)
2387{
2388 uint8_t *src_mac;
2389 uint8_t *dest_mac;
2390 const char *proto_subtype_name;
2391 enum qdf_proto_subtype proto_subtype;
2392
2393 WMA_LOGD("packet length: %u", length);
2394 if (length < QDF_NBUF_TRAC_IPV4_OFFSET)
2395 return;
2396
2397 src_mac = data + QDF_NBUF_SRC_MAC_OFFSET;
2398 dest_mac = data + QDF_NBUF_DEST_MAC_OFFSET;
Srinivas Girigowdae1be8772018-05-07 16:16:27 -07002399 WMA_LOGI("Src_mac: " MAC_ADDRESS_STR ", Dst_mac: " MAC_ADDRESS_STR,
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002400 MAC_ADDR_ARRAY(src_mac), MAC_ADDR_ARRAY(dest_mac));
2401
2402 wma_wow_inc_wake_lock_stats_by_dst_addr(wma, vdev_id, dest_mac);
Dustin Browne2206fb2017-04-20 13:39:25 -07002403
2404 proto_subtype = wma_wow_get_pkt_proto_subtype(data, length);
2405 proto_subtype_name = wma_pkt_proto_subtype_to_string(proto_subtype);
2406 if (proto_subtype_name)
Srinivas Girigowdae1be8772018-05-07 16:16:27 -07002407 WMA_LOGI("WOW Wakeup: %s rcvd", proto_subtype_name);
Dustin Browne2206fb2017-04-20 13:39:25 -07002408
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302409 switch (proto_subtype) {
2410 case QDF_PROTO_EAPOL_M1:
2411 case QDF_PROTO_EAPOL_M2:
2412 case QDF_PROTO_EAPOL_M3:
2413 case QDF_PROTO_EAPOL_M4:
Dustin Browne2206fb2017-04-20 13:39:25 -07002414 wma_log_pkt_eapol(data, length);
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302415 break;
2416
2417 case QDF_PROTO_DHCP_DISCOVER:
2418 case QDF_PROTO_DHCP_REQUEST:
2419 case QDF_PROTO_DHCP_OFFER:
2420 case QDF_PROTO_DHCP_ACK:
2421 case QDF_PROTO_DHCP_NACK:
2422 case QDF_PROTO_DHCP_RELEASE:
2423 case QDF_PROTO_DHCP_INFORM:
2424 case QDF_PROTO_DHCP_DECLINE:
Dustin Browne2206fb2017-04-20 13:39:25 -07002425 wma_log_pkt_dhcp(data, length);
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302426 break;
2427
2428 case QDF_PROTO_ICMP_REQ:
2429 case QDF_PROTO_ICMP_RES:
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002430 wma_wow_inc_wake_lock_stats_by_protocol(wma, vdev_id,
2431 proto_subtype);
Dustin Browne2206fb2017-04-20 13:39:25 -07002432 wma_log_pkt_icmpv4(data, length);
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302433 break;
2434
2435 case QDF_PROTO_ICMPV6_REQ:
2436 case QDF_PROTO_ICMPV6_RES:
Himanshu Agarwal471eaef2017-01-31 13:16:52 +05302437 case QDF_PROTO_ICMPV6_RS:
2438 case QDF_PROTO_ICMPV6_RA:
2439 case QDF_PROTO_ICMPV6_NS:
2440 case QDF_PROTO_ICMPV6_NA:
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002441 wma_wow_inc_wake_lock_stats_by_protocol(wma, vdev_id,
2442 proto_subtype);
Dustin Browne2206fb2017-04-20 13:39:25 -07002443 wma_log_pkt_icmpv6(data, length);
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302444 break;
2445
2446 case QDF_PROTO_IPV4_UDP:
Dustin Browne2206fb2017-04-20 13:39:25 -07002447 wma_log_pkt_ipv4(data, length);
2448 break;
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302449 case QDF_PROTO_IPV4_TCP:
Dustin Browne2206fb2017-04-20 13:39:25 -07002450 wma_log_pkt_ipv4(data, length);
2451 wma_log_pkt_tcpv4(data, length);
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302452 break;
2453
2454 case QDF_PROTO_IPV6_UDP:
Dustin Browne2206fb2017-04-20 13:39:25 -07002455 wma_log_pkt_ipv6(data, length);
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302456 break;
Dustin Browne2206fb2017-04-20 13:39:25 -07002457 case QDF_PROTO_IPV6_TCP:
2458 wma_log_pkt_ipv6(data, length);
2459 wma_log_pkt_tcpv6(data, length);
2460 break;
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302461 default:
Himanshu Agarwal82de9042016-07-20 18:11:03 +05302462 break;
2463 }
2464}
2465
2466/**
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302467 * wma_wow_dump_mgmt_buffer() - API to parse data buffer for mgmt.
2468 * packet that resulted in WOW wakeup.
2469 * @wow_packet_buffer: Pointer to data buffer
2470 * @buf_len: length of data buffer
2471 *
2472 * This function parses the data buffer received (802.11 header)
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002473 * to get information like src mac addr, dst mac addr, seq_num,
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302474 * frag_num, etc.
2475 *
2476 * Return: void
2477 */
2478static void wma_wow_dump_mgmt_buffer(uint8_t *wow_packet_buffer,
Dustin Browne2206fb2017-04-20 13:39:25 -07002479 uint32_t buf_len)
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302480{
2481 struct ieee80211_frame_addr4 *wh;
2482
Himanshu Agarwalf9515002016-07-20 19:09:10 +05302483 WMA_LOGD("wow_buf_pkt_len: %u", buf_len);
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302484 wh = (struct ieee80211_frame_addr4 *)
Dustin Brownecb7eb92017-04-06 17:00:11 -07002485 (wow_packet_buffer);
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302486 if (buf_len >= sizeof(struct ieee80211_frame)) {
2487 uint8_t to_from_ds, frag_num;
2488 uint32_t seq_num;
2489
2490 WMA_LOGE("RA: " MAC_ADDRESS_STR " TA: " MAC_ADDRESS_STR,
2491 MAC_ADDR_ARRAY(wh->i_addr1),
2492 MAC_ADDR_ARRAY(wh->i_addr2));
2493
Himanshu Agarwalf9515002016-07-20 19:09:10 +05302494 WMA_LOGE("TO_DS: %u, FROM_DS: %u",
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302495 wh->i_fc[1] & IEEE80211_FC1_DIR_TODS,
2496 wh->i_fc[1] & IEEE80211_FC1_DIR_FROMDS);
2497
2498 to_from_ds = wh->i_fc[1] & IEEE80211_FC1_DIR_DSTODS;
2499
2500 switch (to_from_ds) {
2501 case IEEE80211_NO_DS:
2502 WMA_LOGE("BSSID: " MAC_ADDRESS_STR,
2503 MAC_ADDR_ARRAY(wh->i_addr3));
2504 break;
2505 case IEEE80211_TO_DS:
2506 WMA_LOGE("DA: " MAC_ADDRESS_STR,
2507 MAC_ADDR_ARRAY(wh->i_addr3));
2508 break;
2509 case IEEE80211_FROM_DS:
2510 WMA_LOGE("SA: " MAC_ADDRESS_STR,
2511 MAC_ADDR_ARRAY(wh->i_addr3));
2512 break;
2513 case IEEE80211_DS_TO_DS:
2514 if (buf_len >= sizeof(struct ieee80211_frame_addr4))
2515 WMA_LOGE("DA: " MAC_ADDRESS_STR " SA: "
2516 MAC_ADDRESS_STR,
2517 MAC_ADDR_ARRAY(wh->i_addr3),
2518 MAC_ADDR_ARRAY(wh->i_addr4));
2519 break;
2520 }
2521
2522 seq_num = (((*(uint16_t *)wh->i_seq) &
2523 IEEE80211_SEQ_SEQ_MASK) >>
2524 IEEE80211_SEQ_SEQ_SHIFT);
2525 frag_num = (((*(uint16_t *)wh->i_seq) &
2526 IEEE80211_SEQ_FRAG_MASK) >>
2527 IEEE80211_SEQ_FRAG_SHIFT);
2528
Himanshu Agarwalf9515002016-07-20 19:09:10 +05302529 WMA_LOGE("SEQ_NUM: %u, FRAG_NUM: %u",
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302530 seq_num, frag_num);
2531 } else {
2532 WMA_LOGE("Insufficient buffer length for mgmt. packet");
2533 }
2534}
2535
2536/**
Dustin Browne2206fb2017-04-20 13:39:25 -07002537 * wma_acquire_wakelock() - conditionally aquires a wakelock base on wake reason
2538 * @wma: the wma handle with the wakelocks to aquire
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302539 * @wake_reason: wow wakeup reason
2540 *
Dustin Browne2206fb2017-04-20 13:39:25 -07002541 * Return: None
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302542 */
Dustin Browne2206fb2017-04-20 13:39:25 -07002543static void wma_acquire_wow_wakelock(t_wma_handle *wma, int wake_reason)
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302544{
Dustin Browne2206fb2017-04-20 13:39:25 -07002545 qdf_wake_lock_t *wl;
2546 uint32_t ms;
2547
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302548 switch (wake_reason) {
2549 case WOW_REASON_AUTH_REQ_RECV:
Mukul Sharmae44d0542017-05-23 21:50:56 +05302550 wl = &wma->wow_auth_req_wl;
Dustin Browne2206fb2017-04-20 13:39:25 -07002551 ms = WMA_AUTH_REQ_RECV_WAKE_LOCK_TIMEOUT;
2552 break;
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302553 case WOW_REASON_ASSOC_REQ_RECV:
Mukul Sharmae44d0542017-05-23 21:50:56 +05302554 wl = &wma->wow_assoc_req_wl;
Dustin Browne2206fb2017-04-20 13:39:25 -07002555 ms = WMA_ASSOC_REQ_RECV_WAKE_LOCK_DURATION;
2556 break;
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302557 case WOW_REASON_DEAUTH_RECVD:
Mukul Sharmae44d0542017-05-23 21:50:56 +05302558 wl = &wma->wow_deauth_rec_wl;
Dustin Browne2206fb2017-04-20 13:39:25 -07002559 ms = WMA_DEAUTH_RECV_WAKE_LOCK_DURATION;
2560 break;
Himanshu Agarwaldd356df2016-07-20 19:04:39 +05302561 case WOW_REASON_DISASSOC_RECVD:
Mukul Sharmae44d0542017-05-23 21:50:56 +05302562 wl = &wma->wow_disassoc_rec_wl;
Dustin Browne2206fb2017-04-20 13:39:25 -07002563 ms = WMA_DISASSOC_RECV_WAKE_LOCK_DURATION;
2564 break;
yeshwanth sriram guntuka37c09822017-01-24 18:30:15 +05302565 case WOW_REASON_AP_ASSOC_LOST:
Mukul Sharmae44d0542017-05-23 21:50:56 +05302566 wl = &wma->wow_ap_assoc_lost_wl;
Dustin Browne2206fb2017-04-20 13:39:25 -07002567 ms = WMA_BMISS_EVENT_WAKE_LOCK_DURATION;
2568 break;
yeshwanth sriram guntuka37c09822017-01-24 18:30:15 +05302569#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
2570 case WOW_REASON_HOST_AUTO_SHUTDOWN:
Mukul Sharmae44d0542017-05-23 21:50:56 +05302571 wl = &wma->wow_auto_shutdown_wl;
Dustin Browne2206fb2017-04-20 13:39:25 -07002572 ms = WMA_AUTO_SHUTDOWN_WAKE_LOCK_DURATION;
2573 break;
yeshwanth sriram guntuka37c09822017-01-24 18:30:15 +05302574#endif
2575 case WOW_REASON_ROAM_HO:
Mukul Sharmae44d0542017-05-23 21:50:56 +05302576 wl = &wma->roam_ho_wl;
Dustin Browne2206fb2017-04-20 13:39:25 -07002577 ms = WMA_ROAM_HO_WAKE_LOCK_DURATION;
2578 break;
2579 default:
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +05302580 return;
2581 }
2582
Dustin Browne2206fb2017-04-20 13:39:25 -07002583 WMA_LOGA("Holding %d msec wake_lock", ms);
2584 cds_host_diag_log_work(wl, ms, WIFI_POWER_EVENT_WAKELOCK_WOW);
2585 qdf_wake_lock_timeout_acquire(wl, ms);
2586}
2587
2588/**
2589 * wma_wake_reason_ap_assoc_lost() - WOW_REASON_AP_ASSOC_LOST handler
2590 * @wma: Pointer to wma handle
2591 * @event: pointer to piggybacked WMI_ROAM_EVENTID_param_tlvs buffer
2592 * @len: length of the event buffer
2593 *
2594 * Return: Errno
2595 */
2596static int
2597wma_wake_reason_ap_assoc_lost(t_wma_handle *wma, void *event, uint32_t len)
2598{
2599 WMI_ROAM_EVENTID_param_tlvs *event_param;
2600 wmi_roam_event_fixed_param *roam_event;
2601
2602 event_param = event;
2603 if (!event_param) {
2604 WMA_LOGE("AP Assoc Lost event data is null");
2605 return -EINVAL;
2606 }
2607
2608 roam_event = event_param->fixed_param;
2609 WMA_LOGA(FL("Beacon miss indication on vdev %d"), roam_event->vdev_id);
2610
2611 wma_beacon_miss_handler(wma, roam_event->vdev_id, roam_event->rssi);
2612
2613 return 0;
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +05302614}
2615
Dustin Brown9d797d62017-01-11 16:39:12 -08002616static const char *wma_vdev_type_str(uint32_t vdev_type)
2617{
2618 switch (vdev_type) {
2619 case WMI_VDEV_TYPE_AP:
2620 return "AP";
2621 case WMI_VDEV_TYPE_STA:
2622 return "STA";
2623 case WMI_VDEV_TYPE_IBSS:
2624 return "IBSS";
2625 case WMI_VDEV_TYPE_MONITOR:
2626 return "MONITOR";
2627 case WMI_VDEV_TYPE_NAN:
2628 return "NAN";
2629 case WMI_VDEV_TYPE_OCB:
2630 return "OCB";
2631 case WMI_VDEV_TYPE_NDI:
2632 return "NDI";
2633 default:
2634 return "unknown";
2635 }
2636}
2637
Dustin Browne2206fb2017-04-20 13:39:25 -07002638static int wma_wake_event_packet(
2639 t_wma_handle *wma,
2640 WMI_WOW_WAKEUP_HOST_EVENTID_param_tlvs *event_param,
2641 uint32_t length)
2642{
2643 WOW_EVENT_INFO_fixed_param *wake_info;
2644 struct wma_txrx_node *vdev;
2645 uint8_t *packet;
2646 uint32_t packet_len;
2647
Abhinav Kumarb0f99562018-01-24 16:15:30 +05302648 if (event_param->num_wow_packet_buffer <= 4) {
2649 WMA_LOGE("Invalid wow packet buffer from firmware %u",
2650 event_param->num_wow_packet_buffer);
2651 return -EINVAL;
2652 }
Dustin Browne2206fb2017-04-20 13:39:25 -07002653 /* first 4 bytes are the length, followed by the buffer */
2654 packet_len = *(uint32_t *)event_param->wow_packet_buffer;
2655 packet = event_param->wow_packet_buffer + 4;
2656
2657 if (!packet_len) {
2658 WMA_LOGE("Wake event packet is empty");
2659 return 0;
2660 }
2661
Himanshu Agarwale6b49122017-10-13 17:50:11 +05302662 if (packet_len > (event_param->num_wow_packet_buffer - 4)) {
2663 WMA_LOGE("Invalid packet_len from firmware, packet_len: %u, num_wow_packet_buffer: %u",
2664 packet_len,
2665 event_param->num_wow_packet_buffer);
2666 return -EINVAL;
2667 }
2668
Dustin Browne2206fb2017-04-20 13:39:25 -07002669 wake_info = event_param->fixed_param;
2670
2671 switch (wake_info->wake_reason) {
2672 case WOW_REASON_AUTH_REQ_RECV:
2673 case WOW_REASON_ASSOC_REQ_RECV:
2674 case WOW_REASON_DEAUTH_RECVD:
2675 case WOW_REASON_DISASSOC_RECVD:
2676 case WOW_REASON_ASSOC_RES_RECV:
2677 case WOW_REASON_REASSOC_REQ_RECV:
2678 case WOW_REASON_REASSOC_RES_RECV:
2679 case WOW_REASON_BEACON_RECV:
2680 case WOW_REASON_ACTION_FRAME_RECV:
2681 /* management frame case */
2682 wma_wow_dump_mgmt_buffer(packet, packet_len);
2683 break;
2684
2685 case WOW_REASON_BPF_ALLOW:
2686 case WOW_REASON_PATTERN_MATCH_FOUND:
2687 case WOW_REASON_RA_MATCH:
2688 case WOW_REASON_RECV_MAGIC_PATTERN:
2689 WMA_LOGD("Wake event packet:");
2690 qdf_trace_hex_dump(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG,
2691 packet, packet_len);
2692
2693 vdev = &wma->interfaces[wake_info->vdev_id];
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08002694 wma_wow_parse_data_pkt(wma, wake_info->vdev_id,
2695 packet, packet_len);
Dustin Browne2206fb2017-04-20 13:39:25 -07002696 break;
2697
2698 default:
2699 WMA_LOGE("Wake reason %s(%u) is not a packet event",
2700 wma_wow_wake_reason_str(wake_info->wake_reason),
2701 wake_info->wake_reason);
2702 return -EINVAL;
2703 }
2704
2705 return 0;
2706}
2707
2708static int wma_wake_event_no_payload(
2709 t_wma_handle *wma,
2710 WMI_WOW_WAKEUP_HOST_EVENTID_param_tlvs *event_param,
2711 uint32_t length)
2712{
2713 WOW_EVENT_INFO_fixed_param *wake_info = event_param->fixed_param;
2714
2715 switch (wake_info->wake_reason) {
2716 case WOW_REASON_HOST_AUTO_SHUTDOWN:
2717 return wma_wake_reason_auto_shutdown();
2718
2719 case WOW_REASON_NLOD:
2720 return wma_wake_reason_nlod(wma, wake_info->vdev_id);
Dustin Browne2206fb2017-04-20 13:39:25 -07002721
Dustin Brown3c89c012017-05-01 12:17:32 -07002722 default:
2723 return 0;
2724 }
Dustin Browne2206fb2017-04-20 13:39:25 -07002725}
2726
2727static int wma_wake_event_piggybacked(
2728 t_wma_handle *wma,
2729 WMI_WOW_WAKEUP_HOST_EVENTID_param_tlvs *event_param,
2730 uint32_t length)
2731{
Deepak Dhamdhere6d2c97a2017-02-04 22:09:27 -08002732 int errno = 0;
Dustin Browne2206fb2017-04-20 13:39:25 -07002733 void *pb_event;
2734 uint32_t pb_event_len;
2735 uint32_t wake_reason;
2736 uint32_t event_id;
Naveen Rawata600b2e2018-03-29 13:41:18 -07002737 uint8_t *bssid;
2738 uint8_t peer_id;
2739 void *peer, *pdev;
2740 tpDeleteStaContext del_sta_ctx;
2741 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Dustin Browne2206fb2017-04-20 13:39:25 -07002742
2743 /*
2744 * There are "normal" cases where a wake reason that usually contains a
2745 * piggybacked event is empty. In these cases we just want to wake up,
2746 * and no action is needed. Bail out now if that is the case.
2747 */
Abhinav Kumarb0f99562018-01-24 16:15:30 +05302748 if (!event_param->wow_packet_buffer ||
2749 event_param->num_wow_packet_buffer <= 4) {
2750 WMA_LOGE("Invalid wow packet buffer from firmware %u",
2751 event_param->num_wow_packet_buffer);
Dustin Browne2206fb2017-04-20 13:39:25 -07002752 return 0;
Abhinav Kumarb0f99562018-01-24 16:15:30 +05302753 }
Dustin Browne2206fb2017-04-20 13:39:25 -07002754
Naveen Rawata600b2e2018-03-29 13:41:18 -07002755 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
2756 bssid = wma->interfaces[event_param->fixed_param->vdev_id].bssid;
2757 peer = cdp_peer_find_by_addr(soc, pdev, bssid, &peer_id);
Dustin Browne2206fb2017-04-20 13:39:25 -07002758 wake_reason = event_param->fixed_param->wake_reason;
2759
2760 /* parse piggybacked event from param buffer */
2761 {
2762 int ret_code;
2763 uint8_t *pb_event_buf;
2764 uint32_t tag;
2765
2766 /* first 4 bytes are the length, followed by the buffer */
2767 pb_event_len = *(uint32_t *)event_param->wow_packet_buffer;
Himanshu Agarwale6b49122017-10-13 17:50:11 +05302768 if (pb_event_len > (event_param->num_wow_packet_buffer - 4)) {
2769 WMA_LOGE("Invalid pb_event_len from firmware, pb_event_len: %u, num_wow_packet_buffer: %u",
2770 pb_event_len,
2771 event_param->num_wow_packet_buffer);
2772 return -EINVAL;
2773 }
Dustin Browne2206fb2017-04-20 13:39:25 -07002774 pb_event_buf = event_param->wow_packet_buffer + 4;
2775
2776 WMA_LOGD("piggybacked event buffer:");
2777 qdf_trace_hex_dump(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG,
2778 pb_event_buf, pb_event_len);
2779
2780 tag = WMITLV_GET_TLVTAG(WMITLV_GET_HDR(pb_event_buf));
2781 event_id = wow_get_wmi_eventid(wake_reason, tag);
2782 if (!event_id) {
2783 WMA_LOGE(FL("Unable to find Event Id"));
2784 return -EINVAL;
2785 }
2786
2787 ret_code = wmitlv_check_and_pad_event_tlvs(wma, pb_event_buf,
2788 pb_event_len,
2789 event_id, &pb_event);
2790 if (ret_code) {
2791 WMA_LOGE(FL("Bad TLVs; len:%d, event_id:%d, status:%d"),
2792 pb_event_len, event_id, ret_code);
2793 return -EINVAL;
2794 }
2795 }
2796
2797 switch (wake_reason) {
2798 case WOW_REASON_AP_ASSOC_LOST:
2799 errno = wma_wake_reason_ap_assoc_lost(wma, pb_event,
2800 pb_event_len);
2801 break;
2802
2803#ifdef FEATURE_WLAN_SCAN_PNO
2804 case WOW_REASON_NLO_SCAN_COMPLETE:
2805 errno = target_if_nlo_complete_handler(wma, pb_event,
2806 pb_event_len);
2807 break;
2808#endif /* FEATURE_WLAN_SCAN_PNO */
2809
2810 case WOW_REASON_CSA_EVENT:
2811 errno = wma_csa_offload_handler(wma, pb_event, pb_event_len);
2812 break;
2813
Deepak Dhamdhere6d2c97a2017-02-04 22:09:27 -08002814 /*
2815 * WOW_REASON_LOW_RSSI is used for following roaming events -
2816 * WMI_ROAM_REASON_BETTER_AP, WMI_ROAM_REASON_BMISS,
2817 * WMI_ROAM_REASON_SUITABLE_AP will be handled by
2818 * wma_roam_event_callback().
2819 * WOW_REASON_ROAM_HO is associated with
2820 * WMI_ROAM_REASON_HO_FAILED event and it will be handled by
2821 * wma_roam_event_callback().
2822 */
Dustin Browne2206fb2017-04-20 13:39:25 -07002823 case WOW_REASON_LOW_RSSI:
Deepak Dhamdhere6d2c97a2017-02-04 22:09:27 -08002824 case WOW_REASON_ROAM_HO:
Deepak Dhamdheref918d422017-07-06 12:56:29 -07002825 wlan_roam_debug_log(event_param->fixed_param->vdev_id,
2826 DEBUG_WOW_ROAM_EVENT,
2827 DEBUG_INVALID_PEER_ID,
2828 NULL, NULL, wake_reason,
2829 pb_event_len);
Deepak Dhamdhere6d2c97a2017-02-04 22:09:27 -08002830 if (pb_event_len > 0) {
2831 errno = wma_roam_event_callback(wma, pb_event,
2832 pb_event_len);
2833 } else {
2834 /*
2835 * No wow_packet_buffer means a better AP beacon
2836 * will follow in a later event.
2837 */
2838 WMA_LOGD("Host woken up because of better AP beacon");
2839 }
Dustin Browne2206fb2017-04-20 13:39:25 -07002840 break;
2841
2842 case WOW_REASON_CLIENT_KICKOUT_EVENT:
2843 errno = wma_peer_sta_kickout_event_handler(wma, pb_event,
2844 pb_event_len);
2845 break;
2846
2847#ifdef FEATURE_WLAN_EXTSCAN
2848 case WOW_REASON_EXTSCAN:
2849 errno = wma_extscan_wow_event_callback(wma, pb_event,
2850 pb_event_len);
2851 break;
2852#endif
2853
2854 case WOW_REASON_RSSI_BREACH_EVENT:
2855 errno = wma_rssi_breached_event_handler(wma, pb_event,
2856 pb_event_len);
2857 break;
2858
2859 case WOW_REASON_NAN_EVENT:
2860 errno = wma_nan_rsp_event_handler(wma, pb_event, pb_event_len);
2861 break;
2862
2863 case WOW_REASON_NAN_DATA:
2864 errno = wma_ndp_wow_event_callback(wma, pb_event, pb_event_len,
2865 event_id);
2866 break;
2867
2868#ifdef FEATURE_WLAN_TDLS
2869 case WOW_REASON_TDLS_CONN_TRACKER_EVENT:
2870 errno = wma_tdls_event_handler(wma, pb_event, pb_event_len);
2871 break;
2872#endif
Naveen Rawatd7734142017-10-27 10:02:40 -07002873
2874 case WOW_REASON_TIMER_INTR_RECV:
2875 /*
2876 * Right now firmware is not returning any cookie host has
2877 * programmed. So do not check for cookie.
2878 */
2879 WMA_LOGE("WOW_REASON_TIMER_INTR_RECV received, indicating key exchange did not finish. Initiate disconnect");
Arif Hussain157263f2018-10-03 13:07:15 -07002880 del_sta_ctx = qdf_mem_malloc(sizeof(*del_sta_ctx));
2881 if (!del_sta_ctx)
Naveen Rawata600b2e2018-03-29 13:41:18 -07002882 break;
Arif Hussain157263f2018-10-03 13:07:15 -07002883
Naveen Rawata600b2e2018-03-29 13:41:18 -07002884 del_sta_ctx->is_tdls = false;
2885 del_sta_ctx->vdev_id = event_param->fixed_param->vdev_id;
2886 del_sta_ctx->staId = peer_id;
2887 qdf_mem_copy(del_sta_ctx->addr2, bssid, IEEE80211_ADDR_LEN);
2888 qdf_mem_copy(del_sta_ctx->bssId, bssid, IEEE80211_ADDR_LEN);
2889 del_sta_ctx->reasonCode = HAL_DEL_STA_REASON_CODE_KEEP_ALIVE;
2890 wma_send_msg(wma, SIR_LIM_DELETE_STA_CONTEXT_IND, del_sta_ctx,
2891 0);
Naveen Rawatd7734142017-10-27 10:02:40 -07002892 break;
2893
Dustin Browne2206fb2017-04-20 13:39:25 -07002894 default:
2895 WMA_LOGE("Wake reason %s(%u) is not a piggybacked event",
2896 wma_wow_wake_reason_str(wake_reason), wake_reason);
2897 errno = -EINVAL;
2898 break;
2899 }
2900
2901 wmitlv_free_allocated_event_tlvs(event_id, &pb_event);
2902
2903 return errno;
2904}
2905
2906static void wma_wake_event_log_reason(t_wma_handle *wma,
2907 WOW_EVENT_INFO_fixed_param *wake_info)
2908{
Dustin Brown3c89c012017-05-01 12:17:32 -07002909 struct wma_txrx_node *vdev;
Dustin Browne2206fb2017-04-20 13:39:25 -07002910
2911 /* "Unspecified" means APPS triggered wake, else firmware triggered */
2912 if (wake_info->wake_reason != WOW_REASON_UNSPECIFIED) {
Dustin Brown3c89c012017-05-01 12:17:32 -07002913 vdev = &wma->interfaces[wake_info->vdev_id];
Dustin Brown4ea846d2017-06-05 10:56:57 -07002914 WMA_LOGA("WLAN triggered wakeup: %s (%d), vdev: %d (%s)",
Dustin Browne2206fb2017-04-20 13:39:25 -07002915 wma_wow_wake_reason_str(wake_info->wake_reason),
2916 wake_info->wake_reason,
2917 wake_info->vdev_id,
Dustin Brown3c89c012017-05-01 12:17:32 -07002918 wma_vdev_type_str(vdev->type));
Dustin Browne2206fb2017-04-20 13:39:25 -07002919 } else if (!wmi_get_runtime_pm_inprogress(wma->wmi_handle)) {
Dustin Brown4ea846d2017-06-05 10:56:57 -07002920 WMA_LOGA("Non-WLAN triggered wakeup: %s (%d)",
Dustin Browne2206fb2017-04-20 13:39:25 -07002921 wma_wow_wake_reason_str(wake_info->wake_reason),
2922 wake_info->wake_reason);
2923 }
2924
2925 qdf_wow_wakeup_host_event(wake_info->wake_reason);
Yeshwanth Sriram Guntukaa10da362017-10-06 12:57:11 +05302926 qdf_wma_wow_wakeup_stats_event(wma);
Dustin Browne2206fb2017-04-20 13:39:25 -07002927}
2928
Sreelakshmi Konamki58c72432016-11-09 17:06:44 +05302929/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002930 * wma_wow_wakeup_host_event() - wakeup host event handler
2931 * @handle: wma handle
2932 * @event: event data
2933 * @len: buffer length
2934 *
2935 * Handler to catch wow wakeup host event. This event will have
2936 * reason why the firmware has woken the host.
2937 *
Dustin Brownecb7eb92017-04-06 17:00:11 -07002938 * Return: Errno
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002939 */
Dustin Brownecb7eb92017-04-06 17:00:11 -07002940int wma_wow_wakeup_host_event(void *handle, uint8_t *event, uint32_t len)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002941{
Dustin Browne2206fb2017-04-20 13:39:25 -07002942 int errno;
2943 t_wma_handle *wma = handle;
2944 WMI_WOW_WAKEUP_HOST_EVENTID_param_tlvs *event_param;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002945 WOW_EVENT_INFO_fixed_param *wake_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002946
Dustin Browne2206fb2017-04-20 13:39:25 -07002947 event_param = (WMI_WOW_WAKEUP_HOST_EVENTID_param_tlvs *)event;
2948 if (!event_param) {
2949 WMA_LOGE("Wake event data is null");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002950 return -EINVAL;
2951 }
2952
Dustin Browne2206fb2017-04-20 13:39:25 -07002953 wake_info = event_param->fixed_param;
Vignesh Viswanathan1f6e08f2018-01-25 17:45:23 +05302954
2955 if (wake_info->vdev_id >= wma->max_bssid) {
2956 WMA_LOGE("%s: received invalid vdev_id %d",
2957 __func__, wake_info->vdev_id);
2958 return -EINVAL;
2959 }
2960
Dustin Browne2206fb2017-04-20 13:39:25 -07002961 wma_wake_event_log_reason(wma, wake_info);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002962
Mukul Sharma4c60a7e2017-03-06 19:42:18 +05302963 pmo_ucfg_psoc_wakeup_host_event_received(wma->psoc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002964
Dustin Browne2206fb2017-04-20 13:39:25 -07002965 wma_print_wow_stats(wma, wake_info);
Dustin Browne2206fb2017-04-20 13:39:25 -07002966 /* split based on payload type */
2967 if (is_piggybacked_event(wake_info->wake_reason))
2968 errno = wma_wake_event_piggybacked(wma, event_param, len);
2969 else if (event_param->wow_packet_buffer)
2970 errno = wma_wake_event_packet(wma, event_param, len);
Dustin Brown9d797d62017-01-11 16:39:12 -08002971 else
Dustin Browne2206fb2017-04-20 13:39:25 -07002972 errno = wma_wake_event_no_payload(wma, event_param, len);
Dustin Brown9d797d62017-01-11 16:39:12 -08002973
Dustin Browne2206fb2017-04-20 13:39:25 -07002974 wma_inc_wow_stats(wma, wake_info);
2975 wma_print_wow_stats(wma, wake_info);
Dustin Browne2206fb2017-04-20 13:39:25 -07002976 wma_acquire_wow_wakelock(wma, wake_info->wake_reason);
Rajeev Kumar2c892fe2016-08-24 16:17:16 -07002977
Dustin Browne2206fb2017-04-20 13:39:25 -07002978 return errno;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002979}
2980
Will Huang3cd2b7c2017-11-17 13:16:56 +08002981#ifdef FEATURE_WLAN_D0WOW
2982/**
2983 * wma_d0_wow_disable_ack_event() - wakeup host event handler
2984 * @handle: wma handle
2985 * @event: event data
2986 * @len: buffer length
2987 *
2988 * Handler to catch D0-WOW disable ACK event. This event will have
2989 * reason why the firmware has woken the host.
2990 * This is for backward compatible with cld2.0.
2991 *
2992 * Return: 0 for success or error
2993 */
2994int wma_d0_wow_disable_ack_event(void *handle, uint8_t *event, uint32_t len)
2995{
2996 tp_wma_handle wma = (tp_wma_handle)handle;
2997 WMI_D0_WOW_DISABLE_ACK_EVENTID_param_tlvs *param_buf;
2998 wmi_d0_wow_disable_ack_event_fixed_param *resp_data;
2999
3000 param_buf = (WMI_D0_WOW_DISABLE_ACK_EVENTID_param_tlvs *)event;
3001 if (!param_buf) {
3002 WMA_LOGE("Invalid D0-WOW disable ACK event buffer!");
3003 return -EINVAL;
3004 }
3005
3006 resp_data = param_buf->fixed_param;
3007
3008 pmo_ucfg_psoc_wakeup_host_event_received(wma->psoc);
3009
3010 WMA_LOGD("Received D0-WOW disable ACK");
3011
3012 return 0;
3013}
3014#else
3015int wma_d0_wow_disable_ack_event(void *handle, uint8_t *event, uint32_t len)
3016{
3017 return 0;
3018}
3019#endif
3020
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003021/**
3022 * wma_pdev_resume_event_handler() - PDEV resume event handler
3023 * @handle: wma handle
3024 * @event: event data
3025 * @len: buffer length
3026 *
3027 * Return: 0 for success or error
3028 */
3029int wma_pdev_resume_event_handler(void *handle, uint8_t *event, uint32_t len)
3030{
3031 tp_wma_handle wma = (tp_wma_handle) handle;
3032
3033 WMA_LOGA("Received PDEV resume event");
3034
Mukul Sharma4c60a7e2017-03-06 19:42:18 +05303035 pmo_ucfg_psoc_wakeup_host_event_received(wma->psoc);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003036
3037 return 0;
3038}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003039
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003040/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003041 * wma_del_ts_req() - send DELTS request to fw
3042 * @wma: wma handle
3043 * @msg: delts params
3044 *
3045 * Return: none
3046 */
3047void wma_del_ts_req(tp_wma_handle wma, tDelTsParams *msg)
3048{
Pragaspathi Thilagaraj0d1159e2018-08-08 19:00:36 +05303049 if (!wma_is_vdev_valid(msg->sessionId)) {
3050 WMA_LOGE("%s: vdev id:%d is not active ", __func__,
3051 msg->sessionId);
3052 qdf_mem_free(msg);
3053 return;
3054 }
Govind Singhaa64c242016-03-08 11:31:49 +05303055 if (wmi_unified_del_ts_cmd(wma->wmi_handle,
3056 msg->sessionId,
3057 TID_TO_WME_AC(msg->userPrio))) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003058 WMA_LOGP("%s: Failed to send vdev DELTS command", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003059 }
Govind Singhaa64c242016-03-08 11:31:49 +05303060
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003061#ifdef WLAN_FEATURE_ROAM_OFFLOAD
3062 if (msg->setRICparams == true)
3063 wma_set_ric_req(wma, msg, false);
3064#endif /* WLAN_FEATURE_ROAM_OFFLOAD */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303065 qdf_mem_free(msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003066}
3067
3068/**
3069 * wma_aggr_qos_req() - send aggr qos request to fw
3070 * @wma: handle to wma
3071 * @pAggrQosRspMsg - combined struct for all ADD_TS requests.
3072 *
3073 * A function to handle WMA_AGGR_QOS_REQ. This will send out
3074 * ADD_TS requestes to firmware in loop for all the ACs with
3075 * active flow.
3076 *
3077 * Return: none
3078 */
3079void wma_aggr_qos_req(tp_wma_handle wma,
3080 tAggrAddTsParams *pAggrQosRspMsg)
3081{
Govind Singhaa64c242016-03-08 11:31:49 +05303082 wmi_unified_aggr_qos_cmd(wma->wmi_handle,
3083 (struct aggr_add_ts_param *)pAggrQosRspMsg);
Jeff Johnsonc97816c2018-05-12 17:13:23 -07003084 /* send response to upper layers from here only. */
Abhishek Singh2d775fd2017-08-18 10:51:33 +05303085 wma_send_msg_high_priority(wma, WMA_AGGR_QOS_RSP, pAggrQosRspMsg, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003086}
3087
Mahesh Kumar Kalikot Veetil40575112016-09-09 16:57:08 -07003088#ifdef FEATURE_WLAN_ESE
3089/**
3090 * wma_set_tsm_interval() - Set TSM interval
3091 * @req: pointer to ADDTS request
3092 *
3093 * Return: QDF_STATUS_E_FAILURE or QDF_STATUS_SUCCESS
3094 */
3095static QDF_STATUS wma_set_tsm_interval(tAddTsParams *req)
3096{
3097 /*
3098 * msmt_interval is in unit called TU (1 TU = 1024 us)
3099 * max value of msmt_interval cannot make resulting
3100 * interval_milliseconds overflow 32 bit
3101 *
3102 */
3103 uint32_t interval_milliseconds;
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003104 struct cdp_pdev *pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003105
Mahesh Kumar Kalikot Veetil40575112016-09-09 16:57:08 -07003106 if (NULL == pdev) {
3107 WMA_LOGE("%s: Failed to get pdev", __func__);
3108 return QDF_STATUS_E_FAILURE;
3109 }
3110
3111 interval_milliseconds = (req->tsm_interval * 1024) / 1000;
3112
Leo Chang96464902016-10-28 11:10:54 -07003113 cdp_tx_set_compute_interval(cds_get_context(QDF_MODULE_ID_SOC),
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003114 pdev,
3115 interval_milliseconds);
Mahesh Kumar Kalikot Veetil40575112016-09-09 16:57:08 -07003116 return QDF_STATUS_SUCCESS;
3117}
3118#else
3119static inline QDF_STATUS wma_set_tsm_interval(tAddTsParams *req)
3120{
3121 return QDF_STATUS_SUCCESS;
3122}
3123#endif /* FEATURE_WLAN_ESE */
3124
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003125/**
3126 * wma_add_ts_req() - send ADDTS request to fw
3127 * @wma: wma handle
3128 * @msg: ADDTS params
3129 *
3130 * Return: none
3131 */
3132void wma_add_ts_req(tp_wma_handle wma, tAddTsParams *msg)
3133{
Govind Singhaa64c242016-03-08 11:31:49 +05303134 struct add_ts_param cmd = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003135
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003136 msg->status = QDF_STATUS_SUCCESS;
Mahesh Kumar Kalikot Veetil40575112016-09-09 16:57:08 -07003137 if (wma_set_tsm_interval(msg) == QDF_STATUS_SUCCESS) {
Govind Singhaa64c242016-03-08 11:31:49 +05303138
Mahesh Kumar Kalikot Veetil40575112016-09-09 16:57:08 -07003139 cmd.sme_session_id = msg->sme_session_id;
3140 cmd.tspec.tsinfo.traffic.userPrio =
Govind Singhaa64c242016-03-08 11:31:49 +05303141 TID_TO_WME_AC(msg->tspec.tsinfo.traffic.userPrio);
Mahesh Kumar Kalikot Veetil40575112016-09-09 16:57:08 -07003142 cmd.tspec.mediumTime = msg->tspec.mediumTime;
3143 if (wmi_unified_add_ts_cmd(wma->wmi_handle, &cmd))
3144 msg->status = QDF_STATUS_E_FAILURE;
Govind Singhaa64c242016-03-08 11:31:49 +05303145
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003146#ifdef WLAN_FEATURE_ROAM_OFFLOAD
Mahesh Kumar Kalikot Veetil40575112016-09-09 16:57:08 -07003147 if (msg->setRICparams == true)
3148 wma_set_ric_req(wma, msg, true);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003149#endif /* WLAN_FEATURE_ROAM_OFFLOAD */
3150
Mahesh Kumar Kalikot Veetil40575112016-09-09 16:57:08 -07003151 }
Abhishek Singh2d775fd2017-08-18 10:51:33 +05303152 wma_send_msg_high_priority(wma, WMA_ADD_TS_RSP, msg, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003153}
3154
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003155#ifdef FEATURE_WLAN_ESE
3156
3157#define TSM_DELAY_HISTROGRAM_BINS 4
3158/**
3159 * wma_process_tsm_stats_req() - process tsm stats request
3160 * @wma_handler - handle to wma
3161 * @pTsmStatsMsg - TSM stats struct that needs to be populated and
3162 * passed in message.
3163 *
3164 * A parallel function to WMA_ProcessTsmStatsReq for pronto. This
3165 * function fetches stats from data path APIs and post
3166 * WMA_TSM_STATS_RSP msg back to LIM.
3167 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303168 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003169 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303170QDF_STATUS wma_process_tsm_stats_req(tp_wma_handle wma_handler,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003171 void *pTsmStatsMsg)
3172{
3173 uint8_t counter;
3174 uint32_t queue_delay_microsec = 0;
3175 uint32_t tx_delay_microsec = 0;
3176 uint16_t packet_count = 0;
3177 uint16_t packet_loss_count = 0;
3178 tpAniTrafStrmMetrics pTsmMetric = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003179 tpAniGetTsmStatsReq pStats = (tpAniGetTsmStatsReq) pTsmStatsMsg;
3180 tpAniGetTsmStatsRsp pTsmRspParams = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003181 int tid = pStats->tid;
3182 /*
3183 * The number of histrogram bin report by data path api are different
3184 * than required by TSM, hence different (6) size array used
3185 */
3186 uint16_t bin_values[QCA_TX_DELAY_HIST_REPORT_BINS] = { 0, };
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003187 struct cdp_pdev *pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Leo Chang96464902016-10-28 11:10:54 -07003188 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003189
3190 if (NULL == pdev) {
3191 WMA_LOGE("%s: Failed to get pdev", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303192 qdf_mem_free(pTsmStatsMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303193 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003194 }
3195
3196 /* get required values from data path APIs */
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003197 cdp_tx_delay(soc,
3198 pdev,
3199 &queue_delay_microsec,
3200 &tx_delay_microsec, tid);
3201 cdp_tx_delay_hist(soc,
3202 pdev,
3203 bin_values, tid);
3204 cdp_tx_packet_count(soc,
3205 pdev,
3206 &packet_count,
3207 &packet_loss_count, tid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003208
Srinivas Girigowda515a9ef2015-12-11 11:00:48 -08003209 pTsmRspParams = qdf_mem_malloc(sizeof(*pTsmRspParams));
Arif Hussain157263f2018-10-03 13:07:15 -07003210 if (!pTsmRspParams) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303211 QDF_ASSERT(0);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303212 qdf_mem_free(pTsmStatsMsg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303213 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003214 }
3215 pTsmRspParams->staId = pStats->staId;
Jeff Johnsone88dd752018-06-07 22:57:54 -07003216 pTsmRspParams->rc = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003217 pTsmRspParams->tsmStatsReq = pStats;
3218 pTsmMetric = &pTsmRspParams->tsmMetrics;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003219 /* populate pTsmMetric */
3220 pTsmMetric->UplinkPktQueueDly = queue_delay_microsec;
3221 /* store only required number of bin values */
3222 for (counter = 0; counter < TSM_DELAY_HISTROGRAM_BINS; counter++) {
3223 pTsmMetric->UplinkPktQueueDlyHist[counter] =
3224 bin_values[counter];
3225 }
3226 pTsmMetric->UplinkPktTxDly = tx_delay_microsec;
3227 pTsmMetric->UplinkPktLoss = packet_loss_count;
3228 pTsmMetric->UplinkPktCount = packet_count;
3229
3230 /*
3231 * No need to populate roaming delay and roaming count as they are
3232 * being populated just before sending IAPP frame out
3233 */
3234 /* post this message to LIM/PE */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003235 wma_send_msg(wma_handler, WMA_TSM_STATS_RSP, (void *)pTsmRspParams, 0);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303236 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003237}
3238
3239#endif /* FEATURE_WLAN_ESE */
3240
3241/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003242 * wma_process_mcbc_set_filter_req() - process mcbc set filter request
3243 * @wma_handle: wma handle
3244 * @mcbc_param: mcbc params
3245 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303246 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003247 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303248QDF_STATUS wma_process_mcbc_set_filter_req(tp_wma_handle wma_handle,
Anurag Chouhance0dc992016-02-16 18:18:03 +05303249 tSirRcvFltMcAddrList *mcbc_param)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003250{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303251 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003252}
3253
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003254/**
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003255 * wma_process_cesium_enable_ind() - enables cesium functionality in target
3256 * @wma: wma handle
3257 *
3258 * Return: QDF status
3259 */
3260QDF_STATUS wma_process_cesium_enable_ind(tp_wma_handle wma)
3261{
3262 QDF_STATUS ret;
3263 int32_t vdev_id;
3264
3265 vdev_id = wma_find_vdev_by_type(wma, WMI_VDEV_TYPE_IBSS);
3266 if (vdev_id < 0) {
3267 WMA_LOGE("%s: IBSS vdev does not exist could not enable cesium",
3268 __func__);
3269 return QDF_STATUS_E_FAILURE;
3270 }
3271
3272 /* Send enable cesium command to target */
3273 WMA_LOGE("Enable cesium in target for vdevId %d ", vdev_id);
3274 ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
3275 WMI_VDEV_PARAM_ENABLE_RMC, 1);
3276 if (ret) {
3277 WMA_LOGE("Enable cesium failed for vdevId %d", vdev_id);
3278 return QDF_STATUS_E_FAILURE;
3279 }
3280 return QDF_STATUS_SUCCESS;
3281}
3282
3283/**
3284 * wma_process_get_peer_info_req() - sends get peer info cmd to target
3285 * @wma: wma handle
3286 * @preq: get peer info request
3287 *
3288 * Return: QDF status
3289 */
3290QDF_STATUS wma_process_get_peer_info_req
3291 (tp_wma_handle wma, tSirIbssGetPeerInfoReqParams *pReq)
3292{
3293 int32_t ret;
3294 uint8_t *p;
3295 uint16_t len;
3296 wmi_buf_t buf;
3297 int32_t vdev_id;
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003298 struct cdp_pdev *pdev;
Leo Chang96464902016-10-28 11:10:54 -07003299 void *peer;
3300 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003301 uint8_t peer_mac[IEEE80211_ADDR_LEN];
Leo Chang96464902016-10-28 11:10:54 -07003302 uint8_t *peer_mac_raw;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003303 wmi_peer_info_req_cmd_fixed_param *p_get_peer_info_cmd;
3304 uint8_t bcast_mac[IEEE80211_ADDR_LEN] = { 0xff, 0xff, 0xff,
3305 0xff, 0xff, 0xff };
3306
Nishank Aggarwala13b61d2016-12-01 12:53:58 +05303307 if (NULL == soc) {
3308 WMA_LOGE("%s: SOC context is NULL", __func__);
3309 return QDF_STATUS_E_FAILURE;
3310 }
3311
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003312 vdev_id = wma_find_vdev_by_type(wma, WMI_VDEV_TYPE_IBSS);
3313 if (vdev_id < 0) {
3314 WMA_LOGE("%s: IBSS vdev does not exist could not get peer info",
3315 __func__);
3316 return QDF_STATUS_E_FAILURE;
3317 }
3318
3319 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
3320 if (NULL == pdev) {
3321 WMA_LOGE("%s: Failed to get pdev context", __func__);
3322 return QDF_STATUS_E_FAILURE;
3323 }
3324
3325 if (0xFF == pReq->staIdx) {
3326 /*get info for all peers */
3327 qdf_mem_copy(peer_mac, bcast_mac, IEEE80211_ADDR_LEN);
3328 } else {
3329 /*get info for a single peer */
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003330 peer = cdp_peer_find_by_local_id(soc,
3331 pdev, pReq->staIdx);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003332 if (!peer) {
3333 WMA_LOGE("%s: Failed to get peer handle using peer id %d",
3334 __func__, pReq->staIdx);
3335 return QDF_STATUS_E_FAILURE;
3336 }
Leo Chang96464902016-10-28 11:10:54 -07003337 peer_mac_raw = cdp_peer_get_peer_mac_addr(soc, peer);
Nishank Aggarwala13b61d2016-12-01 12:53:58 +05303338 if (peer_mac_raw == NULL) {
3339 WMA_LOGE("peer_mac_raw is NULL");
3340 return QDF_STATUS_E_FAILURE;
3341 }
3342
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003343 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 -07003344 __func__, pReq->staIdx, peer_mac_raw[0],
3345 peer_mac_raw[1], peer_mac_raw[2],
3346 peer_mac_raw[3], peer_mac_raw[4],
3347 peer_mac_raw[5]);
3348 qdf_mem_copy(peer_mac, peer_mac_raw, IEEE80211_ADDR_LEN);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003349 }
3350
3351 len = sizeof(wmi_peer_info_req_cmd_fixed_param);
3352 buf = wmi_buf_alloc(wma->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07003353 if (!buf)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003354 return QDF_STATUS_E_FAILURE;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003355
3356 p = (uint8_t *) wmi_buf_data(buf);
3357 qdf_mem_zero(p, len);
3358 p_get_peer_info_cmd = (wmi_peer_info_req_cmd_fixed_param *) p;
3359
3360 WMITLV_SET_HDR(&p_get_peer_info_cmd->tlv_header,
3361 WMITLV_TAG_STRUC_wmi_peer_info_req_cmd_fixed_param,
3362 WMITLV_GET_STRUCT_TLVLEN
3363 (wmi_peer_info_req_cmd_fixed_param));
3364
3365 p_get_peer_info_cmd->vdev_id = vdev_id;
3366 WMI_CHAR_ARRAY_TO_MAC_ADDR(peer_mac,
3367 &p_get_peer_info_cmd->peer_mac_address);
3368
3369 ret = wmi_unified_cmd_send(wma->wmi_handle, buf, len,
3370 WMI_PEER_INFO_REQ_CMDID);
Dustin Brown2afb6f52016-12-02 14:47:48 -08003371 if (ret != QDF_STATUS_SUCCESS)
3372 wmi_buf_free(buf);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003373
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003374 WMA_LOGE("IBSS get peer info cmd sent len: %d, vdev %d command id: %d, status: %d",
3375 len, vdev_id, WMI_PEER_INFO_REQ_CMDID, ret);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003376
3377 return QDF_STATUS_SUCCESS;
3378}
3379
3380/**
3381 * wma_process_tx_fail_monitor_ind() - sends tx fail monitor cmd to target
3382 * @wma: wma handle
3383 * @pReq: tx fail monitor command params
3384 *
3385 * Return: QDF status
3386 */
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003387QDF_STATUS wma_process_tx_fail_monitor_ind(tp_wma_handle wma,
3388 tAniTXFailMonitorInd *pReq)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003389{
3390 QDF_STATUS ret;
3391 int32_t vdev_id;
3392
3393 vdev_id = wma_find_vdev_by_type(wma, WMI_VDEV_TYPE_IBSS);
3394 if (vdev_id < 0) {
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003395 WMA_LOGE("%s: IBSS vdev does not exist could not send fast tx fail monitor indication message to target",
3396 __func__);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003397 return QDF_STATUS_E_FAILURE;
3398 }
3399
3400 /* Send enable cesium command to target */
3401 WMA_LOGE("send fast tx fail monitor ind cmd target for vdevId %d val %d",
3402 vdev_id, pReq->tx_fail_count);
3403
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003404 if (pReq->tx_fail_count == 0)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003405 wma->hddTxFailCb = NULL;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003406 else
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003407 wma->hddTxFailCb = pReq->txFailIndCallback;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003408 ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
3409 WMI_VDEV_PARAM_SET_IBSS_TX_FAIL_CNT_THR,
3410 pReq->tx_fail_count);
3411 if (ret) {
3412 WMA_LOGE("tx fail monitor failed for vdevId %d", vdev_id);
3413 return QDF_STATUS_E_FAILURE;
3414 }
3415
3416 return QDF_STATUS_SUCCESS;
3417}
3418
Rachit Kankaneee1735c2018-08-02 13:19:34 +05303419#ifdef FEATURE_WLAN_RMC
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003420/**
3421 * wma_process_rmc_enable_ind() - enables RMC functionality in target
3422 * @wma: wma handle
3423 *
3424 * Return: QDF status
3425 */
3426QDF_STATUS wma_process_rmc_enable_ind(tp_wma_handle wma)
3427{
3428 int ret;
3429 uint8_t *p;
3430 uint16_t len;
3431 wmi_buf_t buf;
3432 int32_t vdev_id;
3433 wmi_rmc_set_mode_cmd_fixed_param *p_rmc_enable_cmd;
3434
3435 vdev_id = wma_find_vdev_by_type(wma, WMI_VDEV_TYPE_IBSS);
3436 if (vdev_id < 0) {
3437 WMA_LOGE("%s: IBSS vdev does not exist could not enable RMC",
3438 __func__);
3439 return QDF_STATUS_E_FAILURE;
3440 }
3441
3442 len = sizeof(wmi_rmc_set_mode_cmd_fixed_param);
3443 buf = wmi_buf_alloc(wma->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07003444 if (!buf)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003445 return QDF_STATUS_E_FAILURE;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003446
3447 p = (uint8_t *) wmi_buf_data(buf);
3448 qdf_mem_zero(p, len);
3449 p_rmc_enable_cmd = (wmi_rmc_set_mode_cmd_fixed_param *) p;
3450
3451 WMITLV_SET_HDR(&p_rmc_enable_cmd->tlv_header,
3452 WMITLV_TAG_STRUC_wmi_rmc_set_mode_cmd_fixed_param,
3453 WMITLV_GET_STRUCT_TLVLEN
3454 (wmi_rmc_set_mode_cmd_fixed_param));
3455
3456 p_rmc_enable_cmd->vdev_id = vdev_id;
3457 p_rmc_enable_cmd->enable_rmc = WMI_RMC_MODE_ENABLED;
3458
3459 ret = wmi_unified_cmd_send(wma->wmi_handle, buf, len,
3460 WMI_RMC_SET_MODE_CMDID);
Dustin Brown2afb6f52016-12-02 14:47:48 -08003461 if (ret != QDF_STATUS_SUCCESS)
3462 wmi_buf_free(buf);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003463
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003464 WMA_LOGE("Enable RMC cmd sent len: %d, vdev %d command id: %d, status: %d",
3465 len, vdev_id, WMI_RMC_SET_MODE_CMDID, ret);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003466
3467 return QDF_STATUS_SUCCESS;
3468}
3469
3470/**
3471 * wma_process_rmc_disable_ind() - disables rmc functionality in target
3472 * @wma: wma handle
3473 *
3474 * Return: QDF status
3475 */
3476QDF_STATUS wma_process_rmc_disable_ind(tp_wma_handle wma)
3477{
3478 int ret;
3479 uint8_t *p;
3480 uint16_t len;
3481 wmi_buf_t buf;
3482 int32_t vdev_id;
3483 wmi_rmc_set_mode_cmd_fixed_param *p_rmc_disable_cmd;
3484
3485 vdev_id = wma_find_vdev_by_type(wma, WMI_VDEV_TYPE_IBSS);
3486 if (vdev_id < 0) {
3487 WMA_LOGE("%s: IBSS vdev does not exist could not disable RMC",
3488 __func__);
3489 return QDF_STATUS_E_FAILURE;
3490 }
3491
3492 len = sizeof(wmi_rmc_set_mode_cmd_fixed_param);
3493 buf = wmi_buf_alloc(wma->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07003494 if (!buf)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003495 return QDF_STATUS_E_FAILURE;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003496
3497 p = (uint8_t *) wmi_buf_data(buf);
3498 qdf_mem_zero(p, len);
3499 p_rmc_disable_cmd = (wmi_rmc_set_mode_cmd_fixed_param *) p;
3500
3501 WMITLV_SET_HDR(&p_rmc_disable_cmd->tlv_header,
3502 WMITLV_TAG_STRUC_wmi_rmc_set_mode_cmd_fixed_param,
3503 WMITLV_GET_STRUCT_TLVLEN
3504 (wmi_rmc_set_mode_cmd_fixed_param));
3505
3506 p_rmc_disable_cmd->vdev_id = vdev_id;
3507 p_rmc_disable_cmd->enable_rmc = WMI_RMC_MODE_DISABLED;
3508
3509 ret = wmi_unified_cmd_send(wma->wmi_handle, buf, len,
3510 WMI_RMC_SET_MODE_CMDID);
Dustin Brown2afb6f52016-12-02 14:47:48 -08003511 if (ret != QDF_STATUS_SUCCESS)
3512 wmi_buf_free(buf);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003513
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003514 WMA_LOGE("Disable RMC cmd sent len: %d, vdev %d command id: %d, status: %d",
3515 len, vdev_id, WMI_RMC_SET_MODE_CMDID, ret);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003516
3517 return QDF_STATUS_SUCCESS;
3518}
3519
3520/**
3521 * wma_process_rmc_action_period_ind() - sends RMC action period to target
3522 * @wma: wma handle
3523 *
3524 * Return: QDF status
3525 */
3526QDF_STATUS wma_process_rmc_action_period_ind(tp_wma_handle wma)
3527{
3528 int ret;
3529 uint8_t *p;
3530 uint16_t len;
Dustin Brownecfae9a2016-11-15 13:01:39 -08003531 uint32_t periodicity_msec;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003532 wmi_buf_t buf;
3533 int32_t vdev_id;
3534 wmi_rmc_set_action_period_cmd_fixed_param *p_rmc_cmd;
3535 struct sAniSirGlobal *mac = cds_get_context(QDF_MODULE_ID_PE);
3536
3537 if (NULL == mac) {
3538 WMA_LOGE("%s: MAC mac does not exist", __func__);
3539 return QDF_STATUS_E_FAILURE;
3540 }
3541
3542 vdev_id = wma_find_vdev_by_type(wma, WMI_VDEV_TYPE_IBSS);
3543 if (vdev_id < 0) {
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003544 WMA_LOGE("%s: IBSS vdev does not exist could not send RMC action period to target",
3545 __func__);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003546 return QDF_STATUS_E_FAILURE;
3547 }
3548
3549 len = sizeof(wmi_rmc_set_action_period_cmd_fixed_param);
3550 buf = wmi_buf_alloc(wma->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07003551 if (!buf)
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003552 return QDF_STATUS_E_FAILURE;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003553
3554 p = (uint8_t *) wmi_buf_data(buf);
3555 qdf_mem_zero(p, len);
3556 p_rmc_cmd = (wmi_rmc_set_action_period_cmd_fixed_param *) p;
3557
3558 WMITLV_SET_HDR(&p_rmc_cmd->tlv_header,
3559 WMITLV_TAG_STRUC_wmi_rmc_set_action_period_cmd_fixed_param,
3560 WMITLV_GET_STRUCT_TLVLEN
3561 (wmi_rmc_set_action_period_cmd_fixed_param));
3562
Bala Venkatesh2fde2c62018-09-11 20:33:24 +05303563 periodicity_msec = mac->mlme_cfg->sap_cfg.rmc_action_period_freq;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003564 p_rmc_cmd->vdev_id = vdev_id;
Dustin Brownecfae9a2016-11-15 13:01:39 -08003565 p_rmc_cmd->periodicity_msec = periodicity_msec;
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003566
3567 ret = wmi_unified_cmd_send(wma->wmi_handle, buf, len,
3568 WMI_RMC_SET_ACTION_PERIOD_CMDID);
Dustin Brown2afb6f52016-12-02 14:47:48 -08003569 if (ret != QDF_STATUS_SUCCESS)
3570 wmi_buf_free(buf);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003571
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003572 WMA_LOGE("RMC action period %d cmd sent len: %d, vdev %d command id: %d, status: %d",
3573 periodicity_msec, len, vdev_id, WMI_RMC_SET_ACTION_PERIOD_CMDID,
3574 ret);
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003575
3576 return QDF_STATUS_SUCCESS;
3577}
Rachit Kankaneee1735c2018-08-02 13:19:34 +05303578#endif /* FEATURE_WLAN_RMC */
Rajeev Kumar8e3e2832015-11-06 16:02:54 -08003579
3580/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003581 * wma_process_add_periodic_tx_ptrn_ind - add periodic tx ptrn
3582 * @handle: wma handle
3583 * @pAddPeriodicTxPtrnParams: tx ptrn params
3584 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303585 * Retrun: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003586 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303587QDF_STATUS wma_process_add_periodic_tx_ptrn_ind(WMA_HANDLE handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003588 tSirAddPeriodicTxPtrn *
3589 pAddPeriodicTxPtrnParams)
3590{
3591 tp_wma_handle wma_handle = (tp_wma_handle) handle;
Mohit Khanna0fe61672016-05-19 16:53:39 -07003592 struct periodic_tx_pattern *params_ptr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003593 uint8_t vdev_id;
Mohit Khanna0fe61672016-05-19 16:53:39 -07003594 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003595
3596 if (!wma_handle || !wma_handle->wmi_handle) {
3597 WMA_LOGE("%s: WMA is closed, can not issue fw add pattern cmd",
3598 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303599 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003600 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003601
Mohit Khanna0fe61672016-05-19 16:53:39 -07003602 params_ptr = qdf_mem_malloc(sizeof(*params_ptr));
Arif Hussain157263f2018-10-03 13:07:15 -07003603 if (!params_ptr)
Mohit Khanna0fe61672016-05-19 16:53:39 -07003604 return QDF_STATUS_E_NOMEM;
Mohit Khanna0fe61672016-05-19 16:53:39 -07003605
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003606 if (!wma_find_vdev_by_addr(wma_handle,
Srinivas Girigowda31896552015-11-18 22:59:52 -08003607 pAddPeriodicTxPtrnParams->mac_address.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003608 &vdev_id)) {
3609 WMA_LOGE("%s: Failed to find vdev id for %pM", __func__,
Srinivas Girigowda31896552015-11-18 22:59:52 -08003610 pAddPeriodicTxPtrnParams->mac_address.bytes);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303611 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003612 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003613
Mohit Khanna0fe61672016-05-19 16:53:39 -07003614 params_ptr->ucPtrnId = pAddPeriodicTxPtrnParams->ucPtrnId;
3615 params_ptr->ucPtrnSize = pAddPeriodicTxPtrnParams->ucPtrnSize;
3616 params_ptr->usPtrnIntervalMs =
3617 pAddPeriodicTxPtrnParams->usPtrnIntervalMs;
3618 qdf_mem_copy(&params_ptr->mac_address,
Himanshu Agarwal44195412016-03-09 13:03:54 +05303619 &pAddPeriodicTxPtrnParams->mac_address,
3620 sizeof(struct qdf_mac_addr));
Mohit Khanna0fe61672016-05-19 16:53:39 -07003621 qdf_mem_copy(params_ptr->ucPattern,
3622 pAddPeriodicTxPtrnParams->ucPattern,
3623 params_ptr->ucPtrnSize);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003624
Mohit Khanna0fe61672016-05-19 16:53:39 -07003625 status = wmi_unified_process_add_periodic_tx_ptrn_cmd(
3626 wma_handle->wmi_handle, params_ptr, vdev_id);
3627
3628 qdf_mem_free(params_ptr);
3629 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003630}
3631
3632/**
3633 * wma_process_del_periodic_tx_ptrn_ind - del periodic tx ptrn
3634 * @handle: wma handle
3635 * @pDelPeriodicTxPtrnParams: tx ptrn params
3636 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303637 * Retrun: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003638 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303639QDF_STATUS wma_process_del_periodic_tx_ptrn_ind(WMA_HANDLE handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003640 tSirDelPeriodicTxPtrn *
3641 pDelPeriodicTxPtrnParams)
3642{
3643 tp_wma_handle wma_handle = (tp_wma_handle) handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003644 uint8_t vdev_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003645
3646 if (!wma_handle || !wma_handle->wmi_handle) {
3647 WMA_LOGE("%s: WMA is closed, can not issue Del Pattern cmd",
3648 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303649 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003650 }
Himanshu Agarwal44195412016-03-09 13:03:54 +05303651
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003652 if (!wma_find_vdev_by_addr(wma_handle,
Srinivas Girigowdaa5bba7a2015-11-18 22:44:36 -08003653 pDelPeriodicTxPtrnParams->mac_address.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003654 &vdev_id)) {
3655 WMA_LOGE("%s: Failed to find vdev id for %pM", __func__,
Srinivas Girigowdaa5bba7a2015-11-18 22:44:36 -08003656 pDelPeriodicTxPtrnParams->mac_address.bytes);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303657 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003658 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003659
Himanshu Agarwal44195412016-03-09 13:03:54 +05303660 return wmi_unified_process_del_periodic_tx_ptrn_cmd(
3661 wma_handle->wmi_handle, vdev_id,
3662 pDelPeriodicTxPtrnParams->ucPtrnId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003663}
3664
3665#ifdef WLAN_FEATURE_STATS_EXT
3666/**
3667 * wma_stats_ext_req() - request ext stats from fw
3668 * @wma_ptr: wma handle
3669 * @preq: stats ext params
3670 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303671 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003672 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303673QDF_STATUS wma_stats_ext_req(void *wma_ptr, tpStatsExtRequest preq)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003674{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003675 tp_wma_handle wma = (tp_wma_handle) wma_ptr;
Krishna Kumaar Natarajan1b909d72016-06-06 15:02:18 -07003676 struct stats_ext_params *params;
3677 size_t params_len;
3678 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003679
Himanshu Agarwal44195412016-03-09 13:03:54 +05303680 if (!wma) {
3681 WMA_LOGE("%s: wma handle is NULL", __func__);
3682 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003683 }
3684
Krishna Kumaar Natarajan1b909d72016-06-06 15:02:18 -07003685 params_len = sizeof(*params) + preq->request_data_len;
3686 params = qdf_mem_malloc(params_len);
Arif Hussain157263f2018-10-03 13:07:15 -07003687 if (!params)
Krishna Kumaar Natarajan1b909d72016-06-06 15:02:18 -07003688 return QDF_STATUS_E_NOMEM;
Krishna Kumaar Natarajan1b909d72016-06-06 15:02:18 -07003689
3690 params->vdev_id = preq->vdev_id;
3691 params->request_data_len = preq->request_data_len;
3692 if (preq->request_data_len > 0)
3693 qdf_mem_copy(params->request_data, preq->request_data,
3694 params->request_data_len);
3695
3696 status = wmi_unified_stats_ext_req_cmd(wma->wmi_handle, params);
3697 qdf_mem_free(params);
3698
3699 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003700}
3701
3702#endif /* WLAN_FEATURE_STATS_EXT */
3703
3704#ifdef WLAN_FEATURE_EXTWOW_SUPPORT
3705/**
3706 * wma_send_status_of_ext_wow() - send ext wow status to SME
3707 * @wma: wma handle
3708 * @status: status
3709 *
3710 * Return: none
3711 */
3712static void wma_send_status_of_ext_wow(tp_wma_handle wma, bool status)
3713{
3714 tSirReadyToExtWoWInd *ready_to_extwow;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303715 QDF_STATUS vstatus;
Rajeev Kumarcf7bd802017-04-18 11:11:42 -07003716 struct scheduler_msg message = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003717 uint8_t len;
3718
3719 WMA_LOGD("Posting ready to suspend indication to umac");
3720
3721 len = sizeof(tSirReadyToExtWoWInd);
Arif Hussain157263f2018-10-03 13:07:15 -07003722 ready_to_extwow = qdf_mem_malloc(len);
3723 if (!ready_to_extwow)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003724 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003725
3726 ready_to_extwow->mesgType = eWNI_SME_READY_TO_EXTWOW_IND;
3727 ready_to_extwow->mesgLen = len;
3728 ready_to_extwow->status = status;
3729
Rajeev Kumarb60abe42017-01-21 15:39:31 -08003730 message.type = eWNI_SME_READY_TO_EXTWOW_IND;
3731 message.bodyptr = (void *)ready_to_extwow;
3732 message.bodyval = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003733
gaurank kathpalia00861f02018-08-28 19:16:12 +05303734 vstatus = scheduler_post_message(QDF_MODULE_ID_WMA,
3735 QDF_MODULE_ID_SME,
3736 QDF_MODULE_ID_SME, &message);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303737 if (vstatus != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003738 WMA_LOGE("Failed to post ready to suspend");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303739 qdf_mem_free(ready_to_extwow);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003740 }
3741}
3742
3743/**
3744 * wma_enable_ext_wow() - enable ext wow in fw
3745 * @wma: wma handle
3746 * @params: ext wow params
3747 *
3748 * Return:0 for success or error code
3749 */
Himanshu Agarwal44195412016-03-09 13:03:54 +05303750QDF_STATUS wma_enable_ext_wow(tp_wma_handle wma, tpSirExtWoWParams params)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003751{
Himanshu Agarwal44195412016-03-09 13:03:54 +05303752 struct ext_wow_params wow_params = {0};
3753 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003754
Himanshu Agarwal44195412016-03-09 13:03:54 +05303755 if (!wma) {
3756 WMA_LOGE("%s: wma handle is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303757 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003758 }
3759
Himanshu Agarwal44195412016-03-09 13:03:54 +05303760 wow_params.vdev_id = params->vdev_id;
3761 wow_params.type = (enum wmi_ext_wow_type) params->type;
3762 wow_params.wakeup_pin_num = params->wakeup_pin_num;
3763
3764 status = wmi_unified_enable_ext_wow_cmd(wma->wmi_handle,
3765 &wow_params);
3766 if (QDF_IS_STATUS_ERROR(status))
3767 return status;
3768
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003769 wma_send_status_of_ext_wow(wma, true);
Himanshu Agarwal44195412016-03-09 13:03:54 +05303770 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003771
3772}
3773
3774/**
3775 * wma_set_app_type1_params_in_fw() - set app type1 params in fw
3776 * @wma: wma handle
3777 * @appType1Params: app type1 params
3778 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303779 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003780 */
3781int wma_set_app_type1_params_in_fw(tp_wma_handle wma,
3782 tpSirAppType1Params appType1Params)
3783{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003784 int ret;
3785
Govind Singhaa64c242016-03-08 11:31:49 +05303786 ret = wmi_unified_app_type1_params_in_fw_cmd(wma->wmi_handle,
3787 (struct app_type1_params *)appType1Params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003788 if (ret) {
3789 WMA_LOGE("%s: Failed to set APP TYPE1 PARAMS", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303790 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003791 }
3792
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303793 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003794}
3795
3796/**
3797 * wma_set_app_type2_params_in_fw() - set app type2 params in fw
3798 * @wma: wma handle
3799 * @appType2Params: app type2 params
3800 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303801 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003802 */
Himanshu Agarwal44195412016-03-09 13:03:54 +05303803QDF_STATUS wma_set_app_type2_params_in_fw(tp_wma_handle wma,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003804 tpSirAppType2Params appType2Params)
3805{
Himanshu Agarwal44195412016-03-09 13:03:54 +05303806 struct app_type2_params params = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003807
Himanshu Agarwal44195412016-03-09 13:03:54 +05303808 if (!wma) {
3809 WMA_LOGE("%s: wma handle is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303810 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003811 }
3812
Himanshu Agarwal44195412016-03-09 13:03:54 +05303813 params.vdev_id = appType2Params->vdev_id;
3814 params.rc4_key_len = appType2Params->rc4_key_len;
3815 qdf_mem_copy(params.rc4_key, appType2Params->rc4_key, 16);
3816 params.ip_id = appType2Params->ip_id;
3817 params.ip_device_ip = appType2Params->ip_device_ip;
3818 params.ip_server_ip = appType2Params->ip_server_ip;
3819 params.tcp_src_port = appType2Params->tcp_src_port;
3820 params.tcp_dst_port = appType2Params->tcp_dst_port;
3821 params.tcp_seq = appType2Params->tcp_seq;
3822 params.tcp_ack_seq = appType2Params->tcp_ack_seq;
3823 params.keepalive_init = appType2Params->keepalive_init;
3824 params.keepalive_min = appType2Params->keepalive_min;
3825 params.keepalive_max = appType2Params->keepalive_max;
3826 params.keepalive_inc = appType2Params->keepalive_inc;
3827 params.tcp_tx_timeout_val = appType2Params->tcp_tx_timeout_val;
3828 params.tcp_rx_timeout_val = appType2Params->tcp_rx_timeout_val;
3829 qdf_mem_copy(&params.gateway_mac, &appType2Params->gateway_mac,
3830 sizeof(struct qdf_mac_addr));
3831
3832 return wmi_unified_set_app_type2_params_in_fw_cmd(wma->wmi_handle,
3833 &params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003834}
3835#endif /* WLAN_FEATURE_EXTWOW_SUPPORT */
3836
3837#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
3838/**
3839 * wma_auto_shutdown_event_handler() - process auto shutdown timer trigger
3840 * @handle: wma handle
3841 * @event: event buffer
3842 * @len: buffer length
3843 *
3844 * Return: 0 for success or error code
3845 */
3846int wma_auto_shutdown_event_handler(void *handle, uint8_t *event,
3847 uint32_t len)
3848{
3849 wmi_host_auto_shutdown_event_fixed_param *wmi_auto_sh_evt;
3850 WMI_HOST_AUTO_SHUTDOWN_EVENTID_param_tlvs *param_buf =
3851 (WMI_HOST_AUTO_SHUTDOWN_EVENTID_param_tlvs *)
3852 event;
3853
3854 if (!param_buf || !param_buf->fixed_param) {
3855 WMA_LOGE("%s:%d: Invalid Auto shutdown timer evt", __func__,
3856 __LINE__);
3857 return -EINVAL;
3858 }
3859
3860 wmi_auto_sh_evt = param_buf->fixed_param;
3861
3862 if (wmi_auto_sh_evt->shutdown_reason
3863 != WMI_HOST_AUTO_SHUTDOWN_REASON_TIMER_EXPIRY) {
3864 WMA_LOGE("%s:%d: Invalid Auto shutdown timer evt", __func__,
3865 __LINE__);
3866 return -EINVAL;
3867 }
3868
3869 WMA_LOGD("%s:%d: Auto Shutdown Evt: %d", __func__, __LINE__,
3870 wmi_auto_sh_evt->shutdown_reason);
3871 return wma_post_auto_shutdown_msg();
3872}
3873
3874/**
3875 * wma_set_auto_shutdown_timer_req() - sets auto shutdown timer in firmware
3876 * @wma: wma handle
3877 * @auto_sh_cmd: auto shutdown timer value
3878 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303879 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003880 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303881QDF_STATUS wma_set_auto_shutdown_timer_req(tp_wma_handle wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003882 tSirAutoShutdownCmdParams *
3883 auto_sh_cmd)
3884{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003885 if (auto_sh_cmd == NULL) {
3886 WMA_LOGE("%s : Invalid Autoshutdown cfg cmd", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303887 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003888 }
3889
Himanshu Agarwal44195412016-03-09 13:03:54 +05303890 return wmi_unified_set_auto_shutdown_timer_cmd(wma_handle->wmi_handle,
3891 auto_sh_cmd->timer_val);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003892}
3893#endif /* FEATURE_WLAN_AUTO_SHUTDOWN */
3894
3895#ifdef WLAN_FEATURE_NAN
3896/**
3897 * wma_nan_req() - to send nan request to target
3898 * @wma: wma_handle
3899 * @nan_req: request data which will be non-null
3900 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303901 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003902 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303903QDF_STATUS wma_nan_req(void *wma_ptr, tpNanRequest nan_req)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003904{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003905 tp_wma_handle wma_handle = (tp_wma_handle) wma_ptr;
Krishna Kumaar Natarajan1b909d72016-06-06 15:02:18 -07003906 struct nan_req_params *params;
3907 size_t params_len;
3908 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003909
Himanshu Agarwal44195412016-03-09 13:03:54 +05303910 if (!wma_handle) {
3911 WMA_LOGE("%s: wma handle is NULL", __func__);
3912 return QDF_STATUS_E_FAILURE;
3913 }
Krishna Kumaar Natarajan1b909d72016-06-06 15:02:18 -07003914
3915 params_len = sizeof(*params) + nan_req->request_data_len;
3916 params = qdf_mem_malloc(params_len);
Arif Hussain157263f2018-10-03 13:07:15 -07003917 if (!params)
Krishna Kumaar Natarajan1b909d72016-06-06 15:02:18 -07003918 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003919
Krishna Kumaar Natarajan1b909d72016-06-06 15:02:18 -07003920 params->request_data_len = nan_req->request_data_len;
3921 if (params->request_data_len > 0)
3922 qdf_mem_copy(params->request_data, nan_req->request_data,
3923 params->request_data_len);
Himanshu Agarwal44195412016-03-09 13:03:54 +05303924
Krishna Kumaar Natarajan1b909d72016-06-06 15:02:18 -07003925 status = wmi_unified_nan_req_cmd(wma_handle->wmi_handle, params);
3926 qdf_mem_free(params);
3927
3928 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003929}
3930#endif /* WLAN_FEATURE_NAN */
3931
3932#ifdef DHCP_SERVER_OFFLOAD
3933/**
3934 * wma_process_dhcpserver_offload() - enable DHCP server offload
3935 * @wma_handle: wma handle
3936 * @pDhcpSrvOffloadInfo: DHCP server offload info
3937 *
3938 * Return: 0 for success or error code
3939 */
Himanshu Agarwal44195412016-03-09 13:03:54 +05303940QDF_STATUS wma_process_dhcpserver_offload(tp_wma_handle wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003941 tSirDhcpSrvOffloadInfo *
3942 pDhcpSrvOffloadInfo)
3943{
Himanshu Agarwal44195412016-03-09 13:03:54 +05303944 struct dhcp_offload_info_params params = {0};
3945 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003946
Himanshu Agarwal44195412016-03-09 13:03:54 +05303947 if (!wma_handle) {
3948 WMA_LOGE("%s: wma handle is NULL", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003949 return -EIO;
3950 }
Himanshu Agarwal44195412016-03-09 13:03:54 +05303951
3952 params.vdev_id = pDhcpSrvOffloadInfo->vdev_id;
Jeff Johnson678c52c2017-10-04 19:35:36 -07003953 params.dhcp_offload_enabled =
Himanshu Agarwal44195412016-03-09 13:03:54 +05303954 pDhcpSrvOffloadInfo->dhcpSrvOffloadEnabled;
Jeff Johnson678c52c2017-10-04 19:35:36 -07003955 params.dhcp_client_num = pDhcpSrvOffloadInfo->dhcpClientNum;
3956 params.dhcp_srv_addr = pDhcpSrvOffloadInfo->dhcpSrvIP;
Himanshu Agarwal44195412016-03-09 13:03:54 +05303957
3958 status = wmi_unified_process_dhcpserver_offload_cmd(
3959 wma_handle->wmi_handle, &params);
3960 if (QDF_IS_STATUS_ERROR(status))
3961 return status;
3962
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003963 WMA_LOGD("Set dhcp server offload to vdevId %d",
3964 pDhcpSrvOffloadInfo->vdev_id);
Himanshu Agarwal44195412016-03-09 13:03:54 +05303965 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003966}
3967#endif /* DHCP_SERVER_OFFLOAD */
3968
3969#ifdef WLAN_FEATURE_GPIO_LED_FLASHING
3970/**
3971 * wma_set_led_flashing() - set led flashing in fw
3972 * @wma_handle: wma handle
3973 * @flashing: flashing request
3974 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05303975 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003976 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303977QDF_STATUS wma_set_led_flashing(tp_wma_handle wma_handle,
Jeff Johnson5a6b6602017-10-04 14:44:30 -07003978 struct flashing_req_params *flashing)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003979{
Jeff Johnson5a6b6602017-10-04 14:44:30 -07003980 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003981
3982 if (!wma_handle || !wma_handle->wmi_handle) {
3983 WMA_LOGE(FL("WMA is closed, can not issue cmd"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303984 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003985 }
3986 if (!flashing) {
3987 WMA_LOGE(FL("invalid parameter: flashing"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303988 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003989 }
Govind Singhaa64c242016-03-08 11:31:49 +05303990 status = wmi_unified_set_led_flashing_cmd(wma_handle->wmi_handle,
Jeff Johnson5a6b6602017-10-04 14:44:30 -07003991 flashing);
3992 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003993}
3994#endif /* WLAN_FEATURE_GPIO_LED_FLASHING */
3995
Kabilan Kannanebe01e72018-06-13 01:13:46 -07003996int wma_sar_rsp_evt_handler(ol_scn_t handle, uint8_t *event, uint32_t len)
Kabilan Kannancaa85502018-04-13 18:04:58 -07003997{
Kabilan Kannanebe01e72018-06-13 01:13:46 -07003998 tp_wma_handle wma_handle;
3999 wmi_unified_t wmi_handle;
Kabilan Kannancaa85502018-04-13 18:04:58 -07004000 QDF_STATUS status;
4001
Kabilan Kannanebe01e72018-06-13 01:13:46 -07004002 WMA_LOGD(FL("handle:%pK event:%pK len:%u"), handle, event, len);
4003
4004 wma_handle = handle;
4005 if (!wma_handle) {
4006 WMA_LOGE(FL("NULL wma_handle"));
4007 return QDF_STATUS_E_INVAL;
4008 }
4009
4010 wmi_handle = wma_handle->wmi_handle;
4011 if (!wmi_handle) {
4012 WMA_LOGE(FL("NULL wmi_handle"));
4013 return QDF_STATUS_E_INVAL;
4014 }
4015
4016 status = wmi_unified_extract_sar2_result_event(wmi_handle,
Kabilan Kannancaa85502018-04-13 18:04:58 -07004017 event, len);
4018 if (QDF_IS_STATUS_ERROR(status)) {
4019 WMA_LOGE(FL("Event extract failure: %d"), status);
4020 return -EINVAL;
4021 }
4022
4023 return 0;
4024}
4025
Nirav Shaheb017be2018-02-15 11:20:58 +05304026#ifdef FEATURE_WLAN_CH_AVOID
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004027/**
4028 * wma_process_ch_avoid_update_req() - handles channel avoid update request
4029 * @wma_handle: wma handle
4030 * @ch_avoid_update_req: channel avoid update params
4031 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05304032 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004033 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304034QDF_STATUS wma_process_ch_avoid_update_req(tp_wma_handle wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004035 tSirChAvoidUpdateReq *
4036 ch_avoid_update_req)
4037{
Himanshu Agarwal44195412016-03-09 13:03:54 +05304038 QDF_STATUS status;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004039
Himanshu Agarwal44195412016-03-09 13:03:54 +05304040 if (!wma_handle) {
4041 WMA_LOGE("%s: wma handle is NULL", __func__);
4042 return QDF_STATUS_E_FAILURE;
4043 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004044 if (ch_avoid_update_req == NULL) {
4045 WMA_LOGE("%s : ch_avoid_update_req is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304046 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004047 }
4048
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08004049 WMA_LOGD("%s: WMA --> WMI_CHAN_AVOID_UPDATE", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004050
Himanshu Agarwal44195412016-03-09 13:03:54 +05304051 status = wmi_unified_process_ch_avoid_update_cmd(
4052 wma_handle->wmi_handle);
4053 if (QDF_IS_STATUS_ERROR(status))
4054 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004055
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08004056 WMA_LOGD("%s: WMA --> WMI_CHAN_AVOID_UPDATE sent through WMI",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004057 __func__);
Himanshu Agarwal44195412016-03-09 13:03:54 +05304058 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004059}
Nirav Shaheb017be2018-02-15 11:20:58 +05304060#endif
Kiran Kumar Lokere0751f0e2017-07-21 19:42:36 -07004061
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004062/**
4063 * wma_send_regdomain_info_to_fw() - send regdomain info to fw
4064 * @reg_dmn: reg domain
4065 * @regdmn2G: 2G reg domain
4066 * @regdmn5G: 5G reg domain
4067 * @ctl2G: 2G test limit
4068 * @ctl5G: 5G test limit
4069 *
4070 * Return: none
4071 */
4072void wma_send_regdomain_info_to_fw(uint32_t reg_dmn, uint16_t regdmn2G,
Rajeev Kumar Sirasanagandla873b6d92017-06-06 13:11:17 +05304073 uint16_t regdmn5G, uint8_t ctl2G,
4074 uint8_t ctl5G)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004075{
Anurag Chouhan6d760662016-02-20 16:05:43 +05304076 tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004077 int32_t cck_mask_val = 0;
Govind Singhd76a5b02016-03-08 15:12:14 +05304078 struct pdev_params pdev_param = {0};
Himanshu Agarwal44195412016-03-09 13:03:54 +05304079 QDF_STATUS ret = QDF_STATUS_SUCCESS;
4080 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004081
Amar Singhal50d30752018-04-12 13:44:10 -07004082 WMA_LOGD("reg_dmn: %d regdmn2g: %d regdmn5g :%d ctl2g: %d ctl5g: %d",
4083 reg_dmn, regdmn2G, regdmn5G, ctl2G, ctl5G);
4084
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004085 if (NULL == wma) {
4086 WMA_LOGE("%s: wma context is NULL", __func__);
4087 return;
4088 }
4089
Himanshu Agarwal44195412016-03-09 13:03:54 +05304090 status = wmi_unified_send_regdomain_info_to_fw_cmd(wma->wmi_handle,
4091 reg_dmn, regdmn2G, regdmn5G, ctl2G, ctl5G);
4092 if (status == QDF_STATUS_E_NOMEM)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004093 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004094
Ashish Kumar Dhanotiyabfee5892017-09-19 18:05:21 +05304095 if ((((reg_dmn & ~CTRY_FLAG) == CTRY_JAPAN15) ||
Amar Singhal5f997862016-08-24 13:17:50 -07004096 ((reg_dmn & ~CTRY_FLAG) == CTRY_KOREA_ROC)) &&
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004097 (true == wma->tx_chain_mask_cck))
4098 cck_mask_val = 1;
4099
4100 cck_mask_val |= (wma->self_gen_frm_pwr << 16);
Govind Singhd76a5b02016-03-08 15:12:14 +05304101 pdev_param.param_id = WMI_PDEV_PARAM_TX_CHAIN_MASK_CCK;
4102 pdev_param.param_value = cck_mask_val;
4103 ret = wmi_unified_pdev_param_send(wma->wmi_handle,
4104 &pdev_param,
4105 WMA_WILDCARD_PDEV_ID);
4106
Himanshu Agarwal44195412016-03-09 13:03:54 +05304107 if (QDF_IS_STATUS_ERROR(ret))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004108 WMA_LOGE("failed to set PDEV tx_chain_mask_cck %d",
4109 ret);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004110}
4111
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004112#ifdef FEATURE_WLAN_TDLS
4113/**
4114 * wma_tdls_event_handler() - handle TDLS event
4115 * @handle: wma handle
4116 * @event: event buffer
4117 * @len: buffer length
4118 *
4119 * Return: 0 for success or error code
4120 */
4121int wma_tdls_event_handler(void *handle, uint8_t *event, uint32_t len)
4122{
Frank Liu1a912b22017-09-06 17:47:32 +08004123 /* TODO update with target rx ops */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004124 return 0;
4125}
4126
4127/**
4128 * wma_set_tdls_offchan_mode() - set tdls off channel mode
4129 * @handle: wma handle
4130 * @chan_switch_params: Pointer to tdls channel switch parameter structure
4131 *
4132 * This function sets tdls off channel mode
4133 *
4134 * Return: 0 on success; Negative errno otherwise
4135 */
Himanshu Agarwal44195412016-03-09 13:03:54 +05304136QDF_STATUS wma_set_tdls_offchan_mode(WMA_HANDLE handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004137 tdls_chan_switch_params *chan_switch_params)
4138{
4139 tp_wma_handle wma_handle = (tp_wma_handle) handle;
Himanshu Agarwal44195412016-03-09 13:03:54 +05304140 struct tdls_channel_switch_params params = {0};
4141 QDF_STATUS ret = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004142
4143 if (!wma_handle || !wma_handle->wmi_handle) {
4144 WMA_LOGE(FL(
4145 "WMA is closed, can not issue tdls off channel cmd"
4146 ));
4147 ret = -EINVAL;
4148 goto end;
4149 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004150
Nitesh Shah622d3122017-06-05 17:04:06 +05304151 if (wma_is_roam_synch_in_progress(wma_handle,
4152 chan_switch_params->vdev_id)) {
4153 WMA_LOGE("%s: roaming in progress, reject offchan mode cmd!",
4154 __func__);
4155 ret = -EPERM;
4156 goto end;
4157 }
4158
Himanshu Agarwal44195412016-03-09 13:03:54 +05304159 params.vdev_id = chan_switch_params->vdev_id;
4160 params.tdls_off_ch_bw_offset =
4161 chan_switch_params->tdls_off_ch_bw_offset;
4162 params.tdls_off_ch = chan_switch_params->tdls_off_ch;
4163 params.tdls_sw_mode = chan_switch_params->tdls_sw_mode;
4164 params.oper_class = chan_switch_params->oper_class;
4165 params.is_responder = chan_switch_params->is_responder;
4166 qdf_mem_copy(params.peer_mac_addr, chan_switch_params->peer_mac_addr,
Krunal Soniab793342016-04-22 18:43:20 -07004167 IEEE80211_ADDR_LEN);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004168
Himanshu Agarwal44195412016-03-09 13:03:54 +05304169 ret = wmi_unified_set_tdls_offchan_mode_cmd(wma_handle->wmi_handle,
4170 &params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004171
4172end:
4173 if (chan_switch_params)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304174 qdf_mem_free(chan_switch_params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004175 return ret;
4176}
4177
4178/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004179 * wma_update_tdls_peer_state() - update TDLS peer state
4180 * @handle: wma handle
4181 * @peerStateParams: TDLS peer state params
4182 *
4183 * Return: 0 for success or error code
4184 */
4185int wma_update_tdls_peer_state(WMA_HANDLE handle,
4186 tTdlsPeerStateParams *peerStateParams)
4187{
4188 tp_wma_handle wma_handle = (tp_wma_handle) handle;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004189 uint32_t i;
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004190 struct cdp_pdev *pdev;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004191 uint8_t peer_id;
Leo Chang96464902016-10-28 11:10:54 -07004192 void *peer;
4193 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07004194 uint8_t *peer_mac_addr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004195 int ret = 0;
Kabilan Kannanc89fe712016-07-21 06:57:12 -07004196 uint32_t *ch_mhz = NULL;
Poddar, Siddarth5a91f5b2016-04-28 12:24:10 +05304197 bool restore_last_peer = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004198
4199 if (!wma_handle || !wma_handle->wmi_handle) {
4200 WMA_LOGE("%s: WMA is closed, can not issue cmd", __func__);
4201 ret = -EINVAL;
4202 goto end_tdls_peer_state;
4203 }
4204
Nishank Aggarwala13b61d2016-12-01 12:53:58 +05304205 if (!soc) {
4206 WMA_LOGE("%s: SOC context is NULL", __func__);
4207 ret = -EINVAL;
4208 goto end_tdls_peer_state;
4209 }
4210
Nitesh Shah622d3122017-06-05 17:04:06 +05304211 if (wma_is_roam_synch_in_progress(wma_handle,
4212 peerStateParams->vdevId)) {
4213 WMA_LOGE("%s: roaming in progress, reject peer update cmd!",
4214 __func__);
4215 ret = -EPERM;
4216 goto end_tdls_peer_state;
4217 }
4218
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004219 /* peer capability info is valid only when peer state is connected */
4220 if (WMA_TDLS_PEER_STATE_CONNECTED != peerStateParams->peerState) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304221 qdf_mem_zero(&peerStateParams->peerCap,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004222 sizeof(tTdlsPeerCapParams));
4223 }
4224
Kabilan Kannanc89fe712016-07-21 06:57:12 -07004225 if (peerStateParams->peerCap.peerChanLen) {
4226 ch_mhz = qdf_mem_malloc(sizeof(uint32_t) *
4227 peerStateParams->peerCap.peerChanLen);
Arif Hussain157263f2018-10-03 13:07:15 -07004228 if (!ch_mhz) {
Kabilan Kannanc89fe712016-07-21 06:57:12 -07004229 ret = -ENOMEM;
4230 goto end_tdls_peer_state;
4231 }
Naveen Rawat35804772016-06-27 15:40:28 -07004232 }
4233
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004234 for (i = 0; i < peerStateParams->peerCap.peerChanLen; ++i) {
Govind Singhaa64c242016-03-08 11:31:49 +05304235 ch_mhz[i] =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004236 cds_chan_to_freq(peerStateParams->peerCap.peerChan[i].
4237 chanId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004238 }
4239
Ganesh Kondabattini3bf9efe2017-04-13 19:08:56 +05304240 /* Make sure that peer exists before sending peer state cmd*/
4241 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
4242 if (!pdev) {
4243 WMA_LOGE("%s: Failed to find pdev", __func__);
4244 ret = -EIO;
4245 goto end_tdls_peer_state;
4246 }
4247
4248 peer = cdp_peer_find_by_addr(soc,
4249 pdev,
4250 peerStateParams->peerMacAddr,
4251 &peer_id);
4252 if (!peer) {
4253 WMA_LOGE("%s: Failed to get peer handle using peer mac %pM",
4254 __func__, peerStateParams->peerMacAddr);
4255 ret = -EIO;
4256 goto end_tdls_peer_state;
4257 }
4258
Govind Singhaa64c242016-03-08 11:31:49 +05304259 if (wmi_unified_update_tdls_peer_state_cmd(wma_handle->wmi_handle,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004260 (struct tdls_peer_state_params *)peerStateParams,
4261 ch_mhz)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004262 WMA_LOGE("%s: failed to send tdls peer update state command",
4263 __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004264 ret = -EIO;
4265 goto end_tdls_peer_state;
4266 }
4267
4268 /* in case of teardown, remove peer from fw */
4269 if (WMA_TDLS_PEER_STATE_TEARDOWN == peerStateParams->peerState) {
Leo Chang96464902016-10-28 11:10:54 -07004270 peer_mac_addr = cdp_peer_get_peer_mac_addr(soc, peer);
Nishank Aggarwala13b61d2016-12-01 12:53:58 +05304271 if (peer_mac_addr == NULL) {
4272 WMA_LOGE("peer_mac_addr is NULL");
4273 ret = -EIO;
4274 goto end_tdls_peer_state;
4275 }
4276
Leo Chang96464902016-10-28 11:10:54 -07004277 restore_last_peer = cdp_peer_is_vdev_restore_last_peer(
4278 soc, peer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004279
4280 WMA_LOGD("%s: calling wma_remove_peer for peer " MAC_ADDRESS_STR
4281 " vdevId: %d", __func__,
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07004282 MAC_ADDR_ARRAY(peer_mac_addr),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004283 peerStateParams->vdevId);
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07004284 wma_remove_peer(wma_handle, peer_mac_addr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004285 peerStateParams->vdevId, peer, false);
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004286 cdp_peer_update_last_real_peer(soc,
4287 pdev, peer, &peer_id,
4288 restore_last_peer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004289 }
4290
4291end_tdls_peer_state:
Kabilan Kannanc89fe712016-07-21 06:57:12 -07004292 if (ch_mhz)
4293 qdf_mem_free(ch_mhz);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004294 if (peerStateParams)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304295 qdf_mem_free(peerStateParams);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004296 return ret;
4297}
4298#endif /* FEATURE_WLAN_TDLS */
4299
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004300
4301/*
4302 * wma_process_set_ie_info() - Function to send IE info to firmware
4303 * @wma: Pointer to WMA handle
4304 * @ie_data: Pointer for ie data
4305 *
4306 * This function sends IE information to firmware
4307 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304308 * Return: QDF_STATUS_SUCCESS for success otherwise failure
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004309 *
4310 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304311QDF_STATUS wma_process_set_ie_info(tp_wma_handle wma,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004312 struct vdev_ie_info *ie_info)
4313{
Naveen Rawatb47287a2017-01-05 15:50:52 -08004314 struct wma_txrx_node *interface;
Govind Singhaa64c242016-03-08 11:31:49 +05304315 struct vdev_ie_info_param cmd = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004316
4317 if (!ie_info || !wma) {
4318 WMA_LOGE(FL("input pointer is NULL"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304319 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004320 }
4321
4322 /* Validate the input */
4323 if (ie_info->length <= 0) {
4324 WMA_LOGE(FL("Invalid IE length"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304325 return QDF_STATUS_E_INVAL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004326 }
4327
Pragaspathi Thilagarajf81a8f02018-08-15 21:44:07 +05304328 if (!wma_is_vdev_valid(ie_info->vdev_id)) {
Naveen Rawatb47287a2017-01-05 15:50:52 -08004329 WMA_LOGE(FL("vdev_id: %d is not active"), ie_info->vdev_id);
4330 return QDF_STATUS_E_INVAL;
4331 }
4332
Pragaspathi Thilagaraj0d1159e2018-08-08 19:00:36 +05304333 interface = &wma->interfaces[ie_info->vdev_id];
Govind Singhaa64c242016-03-08 11:31:49 +05304334 cmd.vdev_id = ie_info->vdev_id;
4335 cmd.ie_id = ie_info->ie_id;
4336 cmd.length = ie_info->length;
Naveen Rawat03e8d952016-08-01 15:22:20 -07004337 cmd.band = ie_info->band;
Govind Singhaa64c242016-03-08 11:31:49 +05304338 cmd.data = ie_info->data;
Deepak Dhamdhereb106ae52016-08-10 20:55:30 +05304339 cmd.ie_source = WMA_SET_VDEV_IE_SOURCE_HOST;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004340
Selvaraj, Sridhard1225e62017-03-17 12:56:58 +05304341 WMA_LOGD(FL("vdev id: %d, ie_id: %d, band: %d, len: %d"),
4342 ie_info->vdev_id, ie_info->ie_id, ie_info->band,
4343 ie_info->length);
Naveen Rawat03e8d952016-08-01 15:22:20 -07004344
4345 QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG,
4346 ie_info->data, ie_info->length);
4347
Pragaspathi Thilagaraj0d1159e2018-08-08 19:00:36 +05304348 return wmi_unified_process_set_ie_info_cmd(wma->wmi_handle, &cmd);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004349}
4350
Nachiket Kukade177b5b02018-05-22 20:52:17 +05304351#ifdef FEATURE_WLAN_APF
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304352/**
Nachiket Kukadee547a482018-05-22 16:43:30 +05304353 * wma_get_apf_caps_event_handler() - Event handler for get apf capability
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304354 * @handle: WMA global handle
4355 * @cmd_param_info: command event data
4356 * @len: Length of @cmd_param_info
4357 *
4358 * Return: 0 on Success or Errno on failure
4359 */
Nachiket Kukadee547a482018-05-22 16:43:30 +05304360int wma_get_apf_caps_event_handler(void *handle, u_int8_t *cmd_param_info,
4361 u_int32_t len)
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304362{
4363 WMI_BPF_CAPABILIY_INFO_EVENTID_param_tlvs *param_buf;
4364 wmi_bpf_capability_info_evt_fixed_param *event;
Nachiket Kukadee547a482018-05-22 16:43:30 +05304365 struct sir_apf_get_offload *apf_get_offload;
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304366 tpAniSirGlobal pmac = (tpAniSirGlobal)cds_get_context(
4367 QDF_MODULE_ID_PE);
4368
4369 if (!pmac) {
4370 WMA_LOGE("%s: Invalid pmac", __func__);
4371 return -EINVAL;
4372 }
Nachiket Kukadee547a482018-05-22 16:43:30 +05304373 if (!pmac->sme.apf_get_offload_cb) {
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304374 WMA_LOGE("%s: Callback not registered", __func__);
4375 return -EINVAL;
4376 }
4377
4378 param_buf = (WMI_BPF_CAPABILIY_INFO_EVENTID_param_tlvs *)cmd_param_info;
4379 event = param_buf->fixed_param;
Nachiket Kukadee547a482018-05-22 16:43:30 +05304380 apf_get_offload = qdf_mem_malloc(sizeof(*apf_get_offload));
Arif Hussain157263f2018-10-03 13:07:15 -07004381 if (!apf_get_offload)
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304382 return -ENOMEM;
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304383
Nachiket Kukadee547a482018-05-22 16:43:30 +05304384 apf_get_offload->apf_version = event->bpf_version;
4385 apf_get_offload->max_apf_filters = event->max_bpf_filters;
4386 apf_get_offload->max_bytes_for_apf_inst =
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304387 event->max_bytes_for_bpf_inst;
Nachiket Kukadee547a482018-05-22 16:43:30 +05304388 WMA_LOGD("%s: APF capabilities version: %d max apf filter size: %d",
4389 __func__, apf_get_offload->apf_version,
4390 apf_get_offload->max_bytes_for_apf_inst);
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304391
Nachiket Kukadee547a482018-05-22 16:43:30 +05304392 WMA_LOGD("%s: sending apf capabilities event to hdd", __func__);
4393 pmac->sme.apf_get_offload_cb(pmac->sme.apf_get_offload_context,
4394 apf_get_offload);
4395 qdf_mem_free(apf_get_offload);
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304396 return 0;
4397}
4398
Nachiket Kukadee547a482018-05-22 16:43:30 +05304399QDF_STATUS wma_get_apf_capabilities(tp_wma_handle wma)
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304400{
4401 QDF_STATUS status = QDF_STATUS_SUCCESS;
4402 wmi_bpf_get_capability_cmd_fixed_param *cmd;
4403 wmi_buf_t wmi_buf;
4404 uint32_t len;
4405 u_int8_t *buf_ptr;
4406
4407 if (!wma || !wma->wmi_handle) {
Nachiket Kukadee547a482018-05-22 16:43:30 +05304408 WMA_LOGE(FL("WMA is closed, can not issue get APF capab"));
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304409 return QDF_STATUS_E_INVAL;
4410 }
4411
Nachiket Kukadee547a482018-05-22 16:43:30 +05304412 if (!wmi_service_enabled(wma->wmi_handle, wmi_service_apf_offload)) {
4413 WMA_LOGE(FL("APF cababilities feature bit not enabled"));
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304414 return QDF_STATUS_E_FAILURE;
4415 }
4416
4417 len = sizeof(*cmd);
4418 wmi_buf = wmi_buf_alloc(wma->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07004419 if (!wmi_buf)
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304420 return QDF_STATUS_E_NOMEM;
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304421
4422 buf_ptr = (u_int8_t *) wmi_buf_data(wmi_buf);
4423 cmd = (wmi_bpf_get_capability_cmd_fixed_param *) buf_ptr;
4424 WMITLV_SET_HDR(&cmd->tlv_header,
4425 WMITLV_TAG_STRUC_wmi_bpf_get_capability_cmd_fixed_param,
4426 WMITLV_GET_STRUCT_TLVLEN(
4427 wmi_bpf_get_capability_cmd_fixed_param));
4428
4429 if (wmi_unified_cmd_send(wma->wmi_handle, wmi_buf, len,
Nachiket Kukadee547a482018-05-22 16:43:30 +05304430 WMI_BPF_GET_CAPABILITY_CMDID)) {
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304431 wmi_buf_free(wmi_buf);
4432 return QDF_STATUS_E_FAILURE;
4433 }
4434 return status;
4435}
4436
Nachiket Kukadee547a482018-05-22 16:43:30 +05304437QDF_STATUS wma_set_apf_instructions(tp_wma_handle wma,
4438 struct sir_apf_set_offload *apf_set_offload)
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304439{
4440 wmi_bpf_set_vdev_instructions_cmd_fixed_param *cmd;
4441 wmi_buf_t wmi_buf;
4442 uint32_t len = 0, len_aligned = 0;
4443 u_int8_t *buf_ptr;
4444
4445 if (!wma || !wma->wmi_handle) {
Nachiket Kukadee547a482018-05-22 16:43:30 +05304446 WMA_LOGE("%s: WMA is closed, can not issue set APF capability",
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304447 __func__);
4448 return QDF_STATUS_E_INVAL;
4449 }
4450
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304451 if (!wmi_service_enabled(wma->wmi_handle,
Nachiket Kukadee547a482018-05-22 16:43:30 +05304452 wmi_service_apf_offload)) {
4453 WMA_LOGE(FL("APF offload feature Disabled"));
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304454 return QDF_STATUS_E_NOSUPPORT;
4455 }
4456
Nachiket Kukadee547a482018-05-22 16:43:30 +05304457 if (!apf_set_offload) {
4458 WMA_LOGE("%s: Invalid APF instruction request", __func__);
Rajeev Kumar90016022017-08-22 14:00:48 -07004459 return QDF_STATUS_E_INVAL;
4460 }
4461
Nachiket Kukadee547a482018-05-22 16:43:30 +05304462 if (apf_set_offload->session_id >= wma->max_bssid) {
Rajeev Kumar90016022017-08-22 14:00:48 -07004463 WMA_LOGE(FL("Invalid vdev_id: %d"),
Nachiket Kukadee547a482018-05-22 16:43:30 +05304464 apf_set_offload->session_id);
Rajeev Kumar90016022017-08-22 14:00:48 -07004465 return QDF_STATUS_E_INVAL;
4466 }
4467
Nachiket Kukadee547a482018-05-22 16:43:30 +05304468 if (!wma_is_vdev_up(apf_set_offload->session_id)) {
4469 WMA_LOGE("vdev %d is not up skipping APF offload",
4470 apf_set_offload->session_id);
Rajeev Kumar90016022017-08-22 14:00:48 -07004471 return QDF_STATUS_E_INVAL;
4472 }
4473
Nachiket Kukadee547a482018-05-22 16:43:30 +05304474 if (apf_set_offload->total_length) {
4475 len_aligned = roundup(apf_set_offload->current_length,
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304476 sizeof(A_UINT32));
4477 len = len_aligned + WMI_TLV_HDR_SIZE;
4478 }
4479
4480 len += sizeof(*cmd);
4481 wmi_buf = wmi_buf_alloc(wma->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07004482 if (!wmi_buf)
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304483 return QDF_STATUS_E_NOMEM;
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304484
4485 buf_ptr = (u_int8_t *) wmi_buf_data(wmi_buf);
4486 cmd = (wmi_bpf_set_vdev_instructions_cmd_fixed_param *) buf_ptr;
4487
4488 WMITLV_SET_HDR(&cmd->tlv_header,
4489 WMITLV_TAG_STRUC_wmi_bpf_set_vdev_instructions_cmd_fixed_param,
4490 WMITLV_GET_STRUCT_TLVLEN(
4491 wmi_bpf_set_vdev_instructions_cmd_fixed_param));
Nachiket Kukadee547a482018-05-22 16:43:30 +05304492 cmd->vdev_id = apf_set_offload->session_id;
4493 cmd->filter_id = apf_set_offload->filter_id;
4494 cmd->total_length = apf_set_offload->total_length;
4495 cmd->current_offset = apf_set_offload->current_offset;
4496 cmd->current_length = apf_set_offload->current_length;
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304497
Nachiket Kukadee547a482018-05-22 16:43:30 +05304498 if (apf_set_offload->total_length) {
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304499 buf_ptr +=
4500 sizeof(wmi_bpf_set_vdev_instructions_cmd_fixed_param);
4501 WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_BYTE, len_aligned);
4502 buf_ptr += WMI_TLV_HDR_SIZE;
Nachiket Kukadee547a482018-05-22 16:43:30 +05304503 qdf_mem_copy(buf_ptr, apf_set_offload->program,
4504 apf_set_offload->current_length);
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304505 }
4506
4507 if (wmi_unified_cmd_send(wma->wmi_handle, wmi_buf, len,
Nachiket Kukadee547a482018-05-22 16:43:30 +05304508 WMI_BPF_SET_VDEV_INSTRUCTIONS_CMDID)) {
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304509 wmi_buf_free(wmi_buf);
4510 return QDF_STATUS_E_FAILURE;
4511 }
Nachiket Kukadee547a482018-05-22 16:43:30 +05304512 WMA_LOGD(FL("APF offload enabled in fw"));
Rajeev Kumar90016022017-08-22 14:00:48 -07004513
Arun Khandavalli2476ef52016-04-26 20:19:43 +05304514 return QDF_STATUS_SUCCESS;
4515}
Peng Xu8fdaa492016-06-22 10:20:47 -07004516
Nachiket Kukade177b5b02018-05-22 20:52:17 +05304517QDF_STATUS wma_send_apf_enable_cmd(WMA_HANDLE handle, uint8_t vdev_id,
4518 bool apf_enable)
4519{
4520 QDF_STATUS status = QDF_STATUS_SUCCESS;
4521 tp_wma_handle wma = (tp_wma_handle) handle;
4522
4523 if (!wma || !wma->wmi_handle) {
4524 WMA_LOGE(FL("WMA is closed, can not issue get APF capab"));
4525 return QDF_STATUS_E_INVAL;
4526 }
4527
4528 if (!WMI_SERVICE_IS_ENABLED(wma->wmi_service_bitmap,
4529 WMI_SERVICE_BPF_OFFLOAD)) {
4530 WMA_LOGE(FL("APF cababilities feature bit not enabled"));
4531 return QDF_STATUS_E_FAILURE;
4532 }
4533
4534 status = wmi_unified_send_apf_enable_cmd(wma->wmi_handle, vdev_id,
4535 apf_enable);
4536 if (QDF_IS_STATUS_ERROR(status)) {
4537 WMA_LOGE("Failed to send apf enable/disable cmd");
4538 return QDF_STATUS_E_FAILURE;
4539 }
4540
4541 if (apf_enable)
4542 WMA_LOGD("Sent APF Enable on vdevid: %d", vdev_id);
4543 else
4544 WMA_LOGD("Sent APF Disable on vdevid: %d", vdev_id);
4545
4546 return status;
4547}
4548
4549QDF_STATUS
4550wma_send_apf_write_work_memory_cmd(WMA_HANDLE handle,
4551 struct wmi_apf_write_memory_params
4552 *write_params)
4553{
4554 QDF_STATUS status = QDF_STATUS_SUCCESS;
4555 tp_wma_handle wma = (tp_wma_handle) handle;
4556
4557 if (!wma || !wma->wmi_handle) {
4558 WMA_LOGE(FL("WMA is closed, can not issue write APF mem"));
4559 return QDF_STATUS_E_INVAL;
4560 }
4561
4562 if (!WMI_SERVICE_IS_ENABLED(wma->wmi_service_bitmap,
4563 WMI_SERVICE_BPF_OFFLOAD)) {
4564 WMA_LOGE(FL("APF cababilities feature bit not enabled"));
4565 return QDF_STATUS_E_FAILURE;
4566 }
4567
4568 if (wmi_unified_send_apf_write_work_memory_cmd(wma->wmi_handle,
4569 write_params)) {
4570 WMA_LOGE(FL("Failed to send APF write mem command"));
4571 return QDF_STATUS_E_FAILURE;
4572 }
4573
4574 WMA_LOGD("Sent APF wite mem on vdevid: %d", write_params->vdev_id);
4575 return status;
4576}
4577
4578int wma_apf_read_work_memory_event_handler(void *handle, uint8_t *evt_buf,
4579 uint32_t len)
4580{
4581 tp_wma_handle wma_handle;
4582 wmi_unified_t wmi_handle;
4583 struct wmi_apf_read_memory_resp_event_params evt_params = {0};
4584 QDF_STATUS status;
4585 tpAniSirGlobal pmac = cds_get_context(QDF_MODULE_ID_PE);
4586
Yeshwanth Sriram Guntukacbe61442018-08-23 18:08:44 +05304587 WMA_LOGD(FL("handle:%pK event:%pK len:%u"), handle, evt_buf, len);
Nachiket Kukade177b5b02018-05-22 20:52:17 +05304588
4589 wma_handle = handle;
4590 if (!wma_handle) {
4591 WMA_LOGE(FL("NULL wma_handle"));
4592 return -EINVAL;
4593 }
4594
4595 wmi_handle = wma_handle->wmi_handle;
4596 if (!wmi_handle) {
4597 WMA_LOGE(FL("NULL wmi_handle"));
4598 return -EINVAL;
4599 }
4600
4601 if (!pmac) {
4602 WMA_LOGE(FL("Invalid pmac"));
4603 return -EINVAL;
4604 }
4605
4606 if (!pmac->sme.apf_read_mem_cb) {
4607 WMA_LOGE(FL("Callback not registered"));
4608 return -EINVAL;
4609 }
4610
4611 status = wmi_extract_apf_read_memory_resp_event(wmi_handle,
4612 evt_buf, &evt_params);
4613 if (QDF_IS_STATUS_ERROR(status)) {
4614 WMA_LOGE(FL("Event extract failure: %d"), status);
4615 return -EINVAL;
4616 }
4617
Jeff Johnson6aaaa992018-06-30 10:43:04 -07004618 pmac->sme.apf_read_mem_cb(pmac->hdd_handle, &evt_params);
Nachiket Kukade177b5b02018-05-22 20:52:17 +05304619
4620 return 0;
4621}
4622
4623QDF_STATUS wma_send_apf_read_work_memory_cmd(WMA_HANDLE handle,
4624 struct wmi_apf_read_memory_params
4625 *read_params)
4626{
4627 QDF_STATUS status = QDF_STATUS_SUCCESS;
4628 tp_wma_handle wma = (tp_wma_handle) handle;
4629
4630 if (!wma || !wma->wmi_handle) {
4631 WMA_LOGE(FL("WMA is closed, can not issue read APF memory"));
4632 return QDF_STATUS_E_INVAL;
4633 }
4634
4635 if (!WMI_SERVICE_IS_ENABLED(wma->wmi_service_bitmap,
4636 WMI_SERVICE_BPF_OFFLOAD)) {
4637 WMA_LOGE(FL("APF cababilities feature bit not enabled"));
4638 return QDF_STATUS_E_FAILURE;
4639 }
4640
4641 if (wmi_unified_send_apf_read_work_memory_cmd(wma->wmi_handle,
4642 read_params)) {
4643 WMA_LOGE(FL("Failed to send APF read memory command"));
4644 return QDF_STATUS_E_FAILURE;
4645 }
4646
4647 WMA_LOGD("Sent APF read memory on vdevid: %d", read_params->vdev_id);
4648 return status;
4649}
4650#endif /* FEATURE_WLAN_APF */
4651
Peng Xu8fdaa492016-06-22 10:20:47 -07004652/**
Padma, Santhosh Kumara7119672016-08-16 16:05:14 +05304653 * wma_set_tx_rx_aggregation_size() - sets tx rx aggregation sizes
4654 * @tx_rx_aggregation_size: aggregation size parameters
4655 *
4656 * This function sets tx rx aggregation sizes
4657 *
4658 * Return: VOS_STATUS_SUCCESS on success, error number otherwise
4659 */
4660QDF_STATUS wma_set_tx_rx_aggregation_size(
4661 struct sir_set_tx_rx_aggregation_size *tx_rx_aggregation_size)
4662{
4663 tp_wma_handle wma_handle;
4664 wmi_vdev_set_custom_aggr_size_cmd_fixed_param *cmd;
4665 int32_t len;
4666 wmi_buf_t buf;
4667 u_int8_t *buf_ptr;
4668 int ret;
4669
4670 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
4671
4672 if (!tx_rx_aggregation_size) {
4673 WMA_LOGE("%s: invalid pointer", __func__);
4674 return QDF_STATUS_E_INVAL;
4675 }
4676
4677 if (!wma_handle) {
4678 WMA_LOGE("%s: WMA context is invald!", __func__);
4679 return QDF_STATUS_E_INVAL;
4680 }
4681
4682 len = sizeof(*cmd);
4683 buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07004684 if (!buf)
Padma, Santhosh Kumara7119672016-08-16 16:05:14 +05304685 return QDF_STATUS_E_NOMEM;
Padma, Santhosh Kumara7119672016-08-16 16:05:14 +05304686
4687 buf_ptr = (u_int8_t *) wmi_buf_data(buf);
4688 cmd = (wmi_vdev_set_custom_aggr_size_cmd_fixed_param *) buf_ptr;
Arif Hussain0e246802018-05-01 18:13:44 -07004689 qdf_mem_zero(cmd, sizeof(*cmd));
Padma, Santhosh Kumara7119672016-08-16 16:05:14 +05304690
4691 WMITLV_SET_HDR(&cmd->tlv_header,
4692 WMITLV_TAG_STRUC_wmi_vdev_set_custom_aggr_size_cmd_fixed_param,
4693 WMITLV_GET_STRUCT_TLVLEN(
4694 wmi_vdev_set_custom_aggr_size_cmd_fixed_param));
4695
4696 cmd->vdev_id = tx_rx_aggregation_size->vdev_id;
4697 cmd->tx_aggr_size = tx_rx_aggregation_size->tx_aggregation_size;
4698 cmd->rx_aggr_size = tx_rx_aggregation_size->rx_aggregation_size;
Arif Hussain0e246802018-05-01 18:13:44 -07004699 /* bit 2 (aggr_type): TX Aggregation Type (0=A-MPDU, 1=A-MSDU) */
4700 if (tx_rx_aggregation_size->aggr_type ==
4701 WMI_VDEV_CUSTOM_AGGR_TYPE_AMSDU)
4702 cmd->enable_bitmap |= 0x04;
Padma, Santhosh Kumara7119672016-08-16 16:05:14 +05304703
Arif Hussain0e246802018-05-01 18:13:44 -07004704 WMA_LOGD("tx aggr: %d rx aggr: %d vdev: %d enable_bitmap %d",
4705 cmd->tx_aggr_size, cmd->rx_aggr_size, cmd->vdev_id,
4706 cmd->enable_bitmap);
Padma, Santhosh Kumara7119672016-08-16 16:05:14 +05304707
4708 ret = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
4709 WMI_VDEV_SET_CUSTOM_AGGR_SIZE_CMDID);
4710 if (ret) {
Padma, Santhosh Kumara7119672016-08-16 16:05:14 +05304711 wmi_buf_free(buf);
4712 return QDF_STATUS_E_FAILURE;
4713 }
4714
4715 return QDF_STATUS_SUCCESS;
4716}
4717
Paul Zhangee09f8e2018-04-23 16:11:32 +08004718QDF_STATUS wma_set_tx_rx_aggregation_size_per_ac(
4719 struct sir_set_tx_rx_aggregation_size *tx_rx_aggregation_size)
4720{
4721 tp_wma_handle wma_handle;
4722 wmi_vdev_set_custom_aggr_size_cmd_fixed_param *cmd;
4723 int32_t len;
4724 wmi_buf_t buf;
4725 u_int8_t *buf_ptr;
4726 int ret;
4727 int queue_num;
4728 uint32_t tx_aggr_size[4];
4729
4730 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
4731
4732 if (!tx_rx_aggregation_size) {
4733 WMA_LOGE("%s: invalid pointer", __func__);
4734 return QDF_STATUS_E_INVAL;
4735 }
4736
4737 if (!wma_handle) {
4738 WMA_LOGE("%s: WMA context is invald!", __func__);
4739 return QDF_STATUS_E_INVAL;
4740 }
4741
4742 tx_aggr_size[0] = tx_rx_aggregation_size->tx_aggregation_size_be;
4743 tx_aggr_size[1] = tx_rx_aggregation_size->tx_aggregation_size_bk;
4744 tx_aggr_size[2] = tx_rx_aggregation_size->tx_aggregation_size_vi;
4745 tx_aggr_size[3] = tx_rx_aggregation_size->tx_aggregation_size_vo;
4746
4747 for (queue_num = 0; queue_num < 4; queue_num++) {
4748 if (tx_aggr_size[queue_num] == 0)
4749 continue;
4750
4751 len = sizeof(*cmd);
4752 buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07004753 if (!buf)
Paul Zhangee09f8e2018-04-23 16:11:32 +08004754 return QDF_STATUS_E_NOMEM;
Paul Zhangee09f8e2018-04-23 16:11:32 +08004755
4756 buf_ptr = (u_int8_t *)wmi_buf_data(buf);
4757 cmd = (wmi_vdev_set_custom_aggr_size_cmd_fixed_param *)buf_ptr;
Arif Hussain0e246802018-05-01 18:13:44 -07004758 qdf_mem_zero(cmd, sizeof(*cmd));
Paul Zhangee09f8e2018-04-23 16:11:32 +08004759
4760 WMITLV_SET_HDR(&cmd->tlv_header,
4761 WMITLV_TAG_STRUC_wmi_vdev_set_custom_aggr_size_cmd_fixed_param,
4762 WMITLV_GET_STRUCT_TLVLEN(
4763 wmi_vdev_set_custom_aggr_size_cmd_fixed_param));
4764
4765 cmd->vdev_id = tx_rx_aggregation_size->vdev_id;
4766 cmd->rx_aggr_size =
4767 tx_rx_aggregation_size->rx_aggregation_size;
4768
4769 cmd->tx_aggr_size = tx_aggr_size[queue_num];
4770 /* bit 5: tx_ac_enable, if set, ac bitmap is valid. */
4771 cmd->enable_bitmap = 0x20 | queue_num;
Arif Hussain0e246802018-05-01 18:13:44 -07004772 /* bit 2 (aggr_type): TX Aggregation Type (0=A-MPDU, 1=A-MSDU) */
4773 if (tx_rx_aggregation_size->aggr_type ==
4774 WMI_VDEV_CUSTOM_AGGR_TYPE_AMSDU)
4775 cmd->enable_bitmap |= 0x04;
Paul Zhangee09f8e2018-04-23 16:11:32 +08004776
Arif Hussain0e246802018-05-01 18:13:44 -07004777 WMA_LOGD("queue_num: %d, tx aggr: %d rx aggr: %d vdev: %d, bitmap: %d",
Paul Zhangee09f8e2018-04-23 16:11:32 +08004778 queue_num, cmd->tx_aggr_size,
Arif Hussain0e246802018-05-01 18:13:44 -07004779 cmd->rx_aggr_size, cmd->vdev_id,
4780 cmd->enable_bitmap);
Paul Zhangee09f8e2018-04-23 16:11:32 +08004781
4782 ret = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
4783 WMI_VDEV_SET_CUSTOM_AGGR_SIZE_CMDID);
4784 if (ret) {
Paul Zhangee09f8e2018-04-23 16:11:32 +08004785 wmi_buf_free(buf);
4786 return QDF_STATUS_E_FAILURE;
4787 }
4788 }
4789
4790 return QDF_STATUS_SUCCESS;
4791}
4792
Paul Zhang33fae272018-04-23 16:19:00 +08004793QDF_STATUS wma_set_sw_retry_threshold(
4794 struct sir_set_tx_aggr_sw_retry_threshold *tx_sw_retry_threshold)
4795{
4796 tp_wma_handle wma_handle;
4797 wmi_vdev_set_custom_sw_retry_th_cmd_fixed_param *cmd;
4798 int32_t len;
4799 wmi_buf_t buf;
4800 u_int8_t *buf_ptr;
4801 int ret;
4802 int queue_num;
4803 uint32_t tx_aggr_retry[WMI_AC_MAX];
4804
4805 wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
4806
4807 if (!tx_sw_retry_threshold) {
4808 WMA_LOGE("%s: invalid pointer", __func__);
4809 return QDF_STATUS_E_INVAL;
4810 }
4811
4812 if (!wma_handle) {
4813 WMA_LOGE("%s: WMA context is invald!", __func__);
4814 return QDF_STATUS_E_INVAL;
4815 }
4816
4817 tx_aggr_retry[0] =
4818 tx_sw_retry_threshold->tx_aggr_sw_retry_threshold_be;
4819 tx_aggr_retry[1] =
4820 tx_sw_retry_threshold->tx_aggr_sw_retry_threshold_bk;
4821 tx_aggr_retry[2] =
4822 tx_sw_retry_threshold->tx_aggr_sw_retry_threshold_vi;
4823 tx_aggr_retry[3] =
4824 tx_sw_retry_threshold->tx_aggr_sw_retry_threshold_vo;
4825
4826 for (queue_num = 0; queue_num < WMI_AC_MAX; queue_num++) {
4827 if (tx_aggr_retry[queue_num] == 0)
4828 continue;
4829
4830 len = sizeof(*cmd);
4831 buf = wmi_buf_alloc(wma_handle->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07004832 if (!buf)
Paul Zhang33fae272018-04-23 16:19:00 +08004833 return QDF_STATUS_E_NOMEM;
Paul Zhang33fae272018-04-23 16:19:00 +08004834
4835 buf_ptr = (u_int8_t *)wmi_buf_data(buf);
4836 cmd =
4837 (wmi_vdev_set_custom_sw_retry_th_cmd_fixed_param *)buf_ptr;
4838
4839 WMITLV_SET_HDR(&cmd->tlv_header,
4840 WMITLV_TAG_STRUC_wmi_vdev_set_custom_sw_retry_th_cmd_fixed_param,
4841 WMITLV_GET_STRUCT_TLVLEN(
4842 wmi_vdev_set_custom_sw_retry_th_cmd_fixed_param));
4843
4844 cmd->vdev_id = tx_sw_retry_threshold->vdev_id;
4845 cmd->ac_type = queue_num;
4846 cmd->sw_retry_type = WMI_VDEV_CUSTOM_SW_RETRY_TYPE_AGGR;
4847 cmd->sw_retry_th = tx_aggr_retry[queue_num];
4848
4849 WMA_LOGD("queue: %d type: %d threshold: %d vdev: %d",
4850 queue_num, cmd->sw_retry_type,
4851 cmd->sw_retry_th, cmd->vdev_id);
4852
4853 ret = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, len,
4854 WMI_VDEV_SET_CUSTOM_SW_RETRY_TH_CMDID);
4855 if (ret) {
Paul Zhang33fae272018-04-23 16:19:00 +08004856 wmi_buf_free(buf);
4857 return QDF_STATUS_E_FAILURE;
4858 }
4859 }
4860
4861 return QDF_STATUS_SUCCESS;
4862}
4863
Rachit Kankane026e77a2018-07-31 16:21:09 +05304864#ifdef FEATURE_P2P_LISTEN_OFFLOAD
Padma, Santhosh Kumara7119672016-08-16 16:05:14 +05304865/**
Peng Xu8fdaa492016-06-22 10:20:47 -07004866 * wma_p2p_lo_start() - P2P listen offload start
4867 * @params: p2p listen offload parameters
4868 *
4869 * This function sends WMI command to start P2P listen offload.
4870 *
4871 * Return: QDF_STATUS enumeration
4872 */
4873QDF_STATUS wma_p2p_lo_start(struct sir_p2p_lo_start *params)
4874{
4875 wmi_buf_t buf;
4876 wmi_p2p_lo_start_cmd_fixed_param *cmd;
4877 int32_t len = sizeof(*cmd);
4878 tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA);
4879 uint8_t *buf_ptr;
4880 int ret;
Peng Xu4225c152016-07-14 21:18:14 -07004881 int device_types_len_aligned, probe_resp_len_aligned;
Peng Xu8fdaa492016-06-22 10:20:47 -07004882
4883 if (NULL == wma) {
4884 WMA_LOGE("%s: wma context is NULL", __func__);
4885 return QDF_STATUS_E_INVAL;
4886 }
4887
Peng Xu4225c152016-07-14 21:18:14 -07004888 device_types_len_aligned = qdf_roundup(params->dev_types_len,
4889 sizeof(A_UINT32));
4890 probe_resp_len_aligned = qdf_roundup(params->probe_resp_len,
4891 sizeof(A_UINT32));
4892
4893 len += 2 * WMI_TLV_HDR_SIZE + device_types_len_aligned +
4894 probe_resp_len_aligned;
Peng Xu8fdaa492016-06-22 10:20:47 -07004895
4896 buf = wmi_buf_alloc(wma->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07004897 if (!buf)
Peng Xu8fdaa492016-06-22 10:20:47 -07004898 return QDF_STATUS_E_NOMEM;
Peng Xu8fdaa492016-06-22 10:20:47 -07004899
4900 cmd = (wmi_p2p_lo_start_cmd_fixed_param *)wmi_buf_data(buf);
4901 buf_ptr = (uint8_t *) wmi_buf_data(buf);
4902
4903 WMITLV_SET_HDR(&cmd->tlv_header,
4904 WMITLV_TAG_STRUC_wmi_p2p_lo_start_cmd_fixed_param,
4905 WMITLV_GET_STRUCT_TLVLEN(
4906 wmi_p2p_lo_start_cmd_fixed_param));
4907
4908 cmd->vdev_id = params->vdev_id;
4909 cmd->ctl_flags = params->ctl_flags;
4910 cmd->channel = params->freq;
4911 cmd->period = params->period;
4912 cmd->interval = params->interval;
4913 cmd->count = params->count;
Peng Xu4225c152016-07-14 21:18:14 -07004914 cmd->device_types_len = params->dev_types_len;
4915 cmd->prob_resp_len = params->probe_resp_len;
Peng Xu8fdaa492016-06-22 10:20:47 -07004916
4917 buf_ptr += sizeof(wmi_p2p_lo_start_cmd_fixed_param);
4918 WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_BYTE,
Peng Xu4225c152016-07-14 21:18:14 -07004919 device_types_len_aligned);
Peng Xu8fdaa492016-06-22 10:20:47 -07004920 buf_ptr += WMI_TLV_HDR_SIZE;
4921 qdf_mem_copy(buf_ptr, params->device_types, params->dev_types_len);
4922
Peng Xu4225c152016-07-14 21:18:14 -07004923 buf_ptr += device_types_len_aligned;
4924 WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_BYTE, probe_resp_len_aligned);
Peng Xu8fdaa492016-06-22 10:20:47 -07004925 buf_ptr += WMI_TLV_HDR_SIZE;
4926 qdf_mem_copy(buf_ptr, params->probe_resp_tmplt, params->probe_resp_len);
4927
4928 WMA_LOGI("%s: Sending WMI_P2P_LO_START command, channel=%d, period=%d, interval=%d, count=%d",
4929 __func__, cmd->channel, cmd->period,
4930 cmd->interval, cmd->count);
4931
4932 ret = wmi_unified_cmd_send(wma->wmi_handle,
4933 buf, len,
4934 WMI_P2P_LISTEN_OFFLOAD_START_CMDID);
Arif Hussain157263f2018-10-03 13:07:15 -07004935 if (ret)
Peng Xu8fdaa492016-06-22 10:20:47 -07004936 wmi_buf_free(buf);
Arif Hussain157263f2018-10-03 13:07:15 -07004937 else
4938 WMA_LOGI("%s: Successfully sent WMI_P2P_LO_START", __func__);
Peng Xu8fdaa492016-06-22 10:20:47 -07004939
Peng Xu8fdaa492016-06-22 10:20:47 -07004940 wma->interfaces[params->vdev_id].p2p_lo_in_progress = true;
4941
4942 return ret;
4943}
4944
4945/**
4946 * wma_p2p_lo_stop() - P2P listen offload stop
4947 * @vdev_id: vdev identifier
4948 *
4949 * This function sends WMI command to stop P2P listen offload.
4950 *
4951 * Return: QDF_STATUS enumeration
4952 */
4953QDF_STATUS wma_p2p_lo_stop(u_int32_t vdev_id)
4954{
4955 wmi_buf_t buf;
4956 wmi_p2p_lo_stop_cmd_fixed_param *cmd;
4957 int32_t len;
4958 tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA);
4959 int ret;
4960
4961 if (NULL == wma) {
4962 WMA_LOGE("%s: wma context is NULL", __func__);
4963 return QDF_STATUS_E_INVAL;
4964 }
4965
4966 len = sizeof(*cmd);
4967 buf = wmi_buf_alloc(wma->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07004968 if (!buf)
Peng Xu8fdaa492016-06-22 10:20:47 -07004969 return QDF_STATUS_E_NOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -07004970
Peng Xu8fdaa492016-06-22 10:20:47 -07004971 cmd = (wmi_p2p_lo_stop_cmd_fixed_param *)wmi_buf_data(buf);
4972
4973 WMITLV_SET_HDR(&cmd->tlv_header,
4974 WMITLV_TAG_STRUC_wmi_p2p_lo_stop_cmd_fixed_param,
4975 WMITLV_GET_STRUCT_TLVLEN(
4976 wmi_p2p_lo_stop_cmd_fixed_param));
4977
4978 cmd->vdev_id = vdev_id;
4979
4980 WMA_LOGI("%s: Sending WMI_P2P_LO_STOP command", __func__);
4981
4982 ret = wmi_unified_cmd_send(wma->wmi_handle,
4983 buf, len,
4984 WMI_P2P_LISTEN_OFFLOAD_STOP_CMDID);
Arif Hussain157263f2018-10-03 13:07:15 -07004985 if (ret)
Peng Xu8fdaa492016-06-22 10:20:47 -07004986 wmi_buf_free(buf);
Arif Hussain157263f2018-10-03 13:07:15 -07004987 else
4988 WMA_LOGI("%s: Successfully sent WMI_P2P_LO_STOP", __func__);
Peng Xu8fdaa492016-06-22 10:20:47 -07004989 wma->interfaces[vdev_id].p2p_lo_in_progress = false;
4990
4991 return ret;
4992}
4993
4994/**
4995 * wma_p2p_lo_event_handler() - p2p lo event
4996 * @handle: the WMA handle
4997 * @event_buf: buffer with the event parameters
4998 * @len: length of the buffer
4999 *
5000 * This function receives P2P listen offload stop event from FW and
5001 * pass the event information to upper layer.
5002 *
5003 * Return: 0 on success
5004 */
5005int wma_p2p_lo_event_handler(void *handle, uint8_t *event_buf,
5006 uint32_t len)
5007{
5008 tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA);
5009 struct sir_p2p_lo_event *event;
5010 WMI_P2P_LISTEN_OFFLOAD_STOPPED_EVENTID_param_tlvs *param_tlvs;
5011 wmi_p2p_lo_stopped_event_fixed_param *fix_param;
5012 tpAniSirGlobal p_mac = cds_get_context(QDF_MODULE_ID_PE);
5013
Varun Reddy Yeturuc48ad6e2016-09-09 14:31:58 -07005014 if (!wma) {
5015 WMA_LOGE("%s: Invalid WMA Context", __func__);
5016 return -EINVAL;
5017 }
5018
Peng Xu8fdaa492016-06-22 10:20:47 -07005019 if (!p_mac) {
5020 WMA_LOGE("%s: Invalid p_mac", __func__);
5021 return -EINVAL;
5022 }
5023
5024 if (!p_mac->sme.p2p_lo_event_callback) {
5025 WMA_LOGE("%s: Callback not registered", __func__);
5026 return -EINVAL;
5027 }
5028
5029 param_tlvs = (WMI_P2P_LISTEN_OFFLOAD_STOPPED_EVENTID_param_tlvs *)
5030 event_buf;
5031 fix_param = param_tlvs->fixed_param;
Vignesh Viswanathan18827b02017-10-04 19:03:48 +05305032 if (fix_param->vdev_id >= wma->max_bssid) {
5033 WMA_LOGE("%s: received invalid vdev_id %d",
5034 __func__, fix_param->vdev_id);
5035 return -EINVAL;
5036 }
Peng Xu8fdaa492016-06-22 10:20:47 -07005037 event = qdf_mem_malloc(sizeof(*event));
Arif Hussain157263f2018-10-03 13:07:15 -07005038 if (!event)
Peng Xu8fdaa492016-06-22 10:20:47 -07005039 return -ENOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -07005040
Peng Xu8fdaa492016-06-22 10:20:47 -07005041 event->vdev_id = fix_param->vdev_id;
5042 event->reason_code = fix_param->reason;
5043
Jeff Johnsonf7e36d62018-07-04 21:14:02 -07005044 p_mac->sme.p2p_lo_event_callback(p_mac->sme.p2p_lo_event_context,
5045 event);
Peng Xu8fdaa492016-06-22 10:20:47 -07005046
5047 wma->interfaces[event->vdev_id].p2p_lo_in_progress = false;
5048
5049 return 0;
5050}
Rachit Kankane026e77a2018-07-31 16:21:09 +05305051#endif /* FEATURE_P2P_LISTEN_OFFLOAD */
Padma, Santhosh Kumar5e33beb2016-08-08 19:07:06 +05305052
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08005053#ifndef QCA_SUPPORT_CP_STATS
Padma, Santhosh Kumar5e33beb2016-08-08 19:07:06 +05305054/**
Dustin Brown9d797d62017-01-11 16:39:12 -08005055 * wma_get_wakelock_stats() - Populates wake lock stats
5056 * @stats: non-null wakelock structure to populate
Padma, Santhosh Kumar5e33beb2016-08-08 19:07:06 +05305057 *
5058 * This function collects wake lock stats
5059 *
Dustin Brown9d797d62017-01-11 16:39:12 -08005060 * Return: QDF_STATUS_SUCCESS on success, error value otherwise
Padma, Santhosh Kumar5e33beb2016-08-08 19:07:06 +05305061 */
Dustin Brown9d797d62017-01-11 16:39:12 -08005062QDF_STATUS wma_get_wakelock_stats(struct sir_wake_lock_stats *stats)
Padma, Santhosh Kumar5e33beb2016-08-08 19:07:06 +05305063{
Dustin Brown9d797d62017-01-11 16:39:12 -08005064 t_wma_handle *wma;
5065 struct sir_vdev_wow_stats *vstats;
5066 int i;
Padma, Santhosh Kumar5e33beb2016-08-08 19:07:06 +05305067
Dustin Brown9d797d62017-01-11 16:39:12 -08005068 if (!stats) {
5069 WMA_LOGE("%s: invalid stats pointer", __func__);
Padma, Santhosh Kumar5e33beb2016-08-08 19:07:06 +05305070 return QDF_STATUS_E_INVAL;
5071 }
5072
Dustin Brown9d797d62017-01-11 16:39:12 -08005073 wma = cds_get_context(QDF_MODULE_ID_WMA);
5074 if (!wma) {
5075 WMA_LOGE("%s: invalid WMA context", __func__);
Padma, Santhosh Kumar5e33beb2016-08-08 19:07:06 +05305076 return QDF_STATUS_E_INVAL;
5077 }
5078
Dustin Brown9d797d62017-01-11 16:39:12 -08005079 /* ensure counters are zeroed */
5080 qdf_mem_zero(stats, sizeof(*stats));
5081
5082 /* populate global level stats */
5083 stats->wow_unspecified_wake_up_count = wma->wow_unspecified_wake_count;
5084
5085 /* populate vdev level stats */
5086 for (i = 0; i < wma->max_bssid; ++i) {
5087 if (!wma->interfaces[i].handle)
5088 continue;
5089
5090 vstats = &wma->interfaces[i].wow_stats;
5091
5092 stats->wow_ucast_wake_up_count += vstats->ucast;
5093 stats->wow_bcast_wake_up_count += vstats->bcast;
5094 stats->wow_ipv4_mcast_wake_up_count += vstats->ipv4_mcast;
5095 stats->wow_ipv6_mcast_wake_up_count += vstats->ipv6_mcast;
5096 stats->wow_ipv6_mcast_ra_stats += vstats->ipv6_mcast_ra;
5097 stats->wow_ipv6_mcast_ns_stats += vstats->ipv6_mcast_ns;
5098 stats->wow_ipv6_mcast_na_stats += vstats->ipv6_mcast_na;
5099 stats->wow_icmpv4_count += vstats->icmpv4;
5100 stats->wow_icmpv6_count += vstats->icmpv6;
5101 stats->wow_rssi_breach_wake_up_count += vstats->rssi_breach;
5102 stats->wow_low_rssi_wake_up_count += vstats->low_rssi;
5103 stats->wow_gscan_wake_up_count += vstats->gscan;
5104 stats->wow_pno_complete_wake_up_count += vstats->pno_complete;
5105 stats->wow_pno_match_wake_up_count += vstats->pno_match;
5106 stats->wow_oem_response_wake_up_count += vstats->oem_response;
5107 }
Padma, Santhosh Kumar5e33beb2016-08-08 19:07:06 +05305108
5109 return QDF_STATUS_SUCCESS;
5110}
Naveen Rawat3ff5cff2018-01-29 14:31:16 -08005111#endif
Anurag Chouhanbf5e0e22016-09-12 12:54:09 +05305112
5113/**
5114 * wma_process_fw_test_cmd() - send unit test command to fw.
5115 * @handle: wma handle
5116 * @wma_fwtest: fw test command
5117 *
5118 * This function send fw test command to fw.
5119 *
5120 * Return: none
5121 */
5122void wma_process_fw_test_cmd(WMA_HANDLE handle,
5123 struct set_fwtest_params *wma_fwtest)
5124{
5125 tp_wma_handle wma_handle = (tp_wma_handle) handle;
5126
5127 if (!wma_handle || !wma_handle->wmi_handle) {
5128 WMA_LOGE("%s: WMA is closed, can not issue fw test cmd",
5129 __func__);
5130 return;
5131 }
5132
5133 if (wmi_unified_fw_test_cmd(wma_handle->wmi_handle,
5134 (struct set_fwtest_params *)wma_fwtest)) {
5135 WMA_LOGE("%s: Failed to issue fw test cmd",
5136 __func__);
5137 return;
5138 }
5139}
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +05305140
5141/**
5142 * wma_enable_disable_caevent_ind() - Issue WMI command to enable or
5143 * disable ca event indication
5144 * @wma: wma handler
5145 * @val: boolean value true or false
5146 *
5147 * Return: QDF_STATUS
5148 */
5149QDF_STATUS wma_enable_disable_caevent_ind(tp_wma_handle wma, uint8_t val)
5150{
5151 WMI_CHAN_AVOID_RPT_ALLOW_CMD_fixed_param *cmd;
5152 wmi_buf_t wmi_buf;
5153 uint8_t *buf_ptr;
5154 uint32_t len;
5155
5156 if (!wma || !wma->wmi_handle) {
5157 WMA_LOGE(FL("WMA is closed, can not issue set/clear CA"));
5158 return QDF_STATUS_E_INVAL;
5159 }
5160
5161 len = sizeof(*cmd);
5162 wmi_buf = wmi_buf_alloc(wma->wmi_handle, len);
Arif Hussain157263f2018-10-03 13:07:15 -07005163 if (!wmi_buf)
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +05305164 return QDF_STATUS_E_NOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -07005165
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +05305166 buf_ptr = (uint8_t *) wmi_buf_data(wmi_buf);
5167 cmd = (WMI_CHAN_AVOID_RPT_ALLOW_CMD_fixed_param *) buf_ptr;
5168 WMITLV_SET_HDR(&cmd->tlv_header,
5169 WMITLV_TAG_STRUC_WMI_CHAN_AVOID_RPT_ALLOW_CMD_fixed_param,
5170 WMITLV_GET_STRUCT_TLVLEN(
5171 WMI_CHAN_AVOID_RPT_ALLOW_CMD_fixed_param));
5172 cmd->rpt_allow = val;
5173 if (wmi_unified_cmd_send(wma->wmi_handle, wmi_buf, len,
5174 WMI_CHAN_AVOID_RPT_ALLOW_CMDID)) {
Selvaraj, Sridharebda0f22016-08-29 16:05:23 +05305175 wmi_buf_free(wmi_buf);
5176 return QDF_STATUS_E_FAILURE;
5177 }
5178
5179 return QDF_STATUS_SUCCESS;
5180}
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +05305181
Jeff Johnsonf0e54b02017-12-18 15:22:25 -08005182static wma_sar_cb sar_callback;
5183static void *sar_context;
5184
5185static int wma_sar_event_handler(void *handle, uint8_t *evt_buf, uint32_t len)
5186{
5187 tp_wma_handle wma_handle;
5188 wmi_unified_t wmi_handle;
jiadb17a2972018-01-25 10:02:31 +08005189 struct sar_limit_event *event;
Jeff Johnsonf0e54b02017-12-18 15:22:25 -08005190 wma_sar_cb callback;
5191 QDF_STATUS status;
5192
5193 WMA_LOGI(FL("handle:%pK event:%pK len:%u"), handle, evt_buf, len);
5194
5195 wma_handle = handle;
5196 if (!wma_handle) {
5197 WMA_LOGE(FL("NULL wma_handle"));
5198 return QDF_STATUS_E_INVAL;
5199 }
5200
5201 wmi_handle = wma_handle->wmi_handle;
5202 if (!wmi_handle) {
5203 WMA_LOGE(FL("NULL wmi_handle"));
5204 return QDF_STATUS_E_INVAL;
5205 }
5206
jiadb17a2972018-01-25 10:02:31 +08005207 event = qdf_mem_malloc(sizeof(*event));
Arif Hussain157263f2018-10-03 13:07:15 -07005208 if (!event)
jiadb17a2972018-01-25 10:02:31 +08005209 return QDF_STATUS_E_NOMEM;
jiadb17a2972018-01-25 10:02:31 +08005210
Jeff Johnsonf0e54b02017-12-18 15:22:25 -08005211 status = wmi_unified_extract_sar_limit_event(wmi_handle,
jiadb17a2972018-01-25 10:02:31 +08005212 evt_buf, event);
Jeff Johnsonf0e54b02017-12-18 15:22:25 -08005213 if (QDF_IS_STATUS_ERROR(status)) {
5214 WMA_LOGE(FL("Event extract failure: %d"), status);
jiadb17a2972018-01-25 10:02:31 +08005215 qdf_mem_free(event);
Jeff Johnsonf0e54b02017-12-18 15:22:25 -08005216 return QDF_STATUS_E_INVAL;
5217 }
5218
5219 callback = sar_callback;
5220 sar_callback = NULL;
5221 if (callback)
jiadb17a2972018-01-25 10:02:31 +08005222 callback(sar_context, event);
5223
5224 qdf_mem_free(event);
Jeff Johnsonf0e54b02017-12-18 15:22:25 -08005225
5226 return 0;
5227}
5228
5229QDF_STATUS wma_sar_register_event_handlers(WMA_HANDLE handle)
5230{
5231 tp_wma_handle wma_handle = handle;
5232 wmi_unified_t wmi_handle;
5233
5234 if (!wma_handle) {
5235 WMA_LOGE(FL("NULL wma_handle"));
5236 return QDF_STATUS_E_INVAL;
5237 }
5238
5239 wmi_handle = wma_handle->wmi_handle;
5240 if (!wmi_handle) {
5241 WMA_LOGE(FL("NULL wmi_handle"));
5242 return QDF_STATUS_E_INVAL;
5243 }
5244
5245 return wmi_unified_register_event_handler(wmi_handle,
5246 wmi_sar_get_limits_event_id,
5247 wma_sar_event_handler,
5248 WMA_RX_WORK_CTX);
5249}
5250
5251QDF_STATUS wma_get_sar_limit(WMA_HANDLE handle,
5252 wma_sar_cb callback, void *context)
5253{
5254 tp_wma_handle wma_handle = handle;
5255 wmi_unified_t wmi_handle;
5256 QDF_STATUS status;
5257
5258 if (!wma_handle) {
5259 WMA_LOGE(FL("NULL wma_handle"));
5260 return QDF_STATUS_E_INVAL;
5261 }
5262
5263 wmi_handle = wma_handle->wmi_handle;
5264 if (!wmi_handle) {
5265 WMA_LOGE(FL("NULL wmi_handle"));
5266 return QDF_STATUS_E_INVAL;
5267 }
5268
5269 sar_callback = callback;
5270 sar_context = context;
5271 status = wmi_unified_get_sar_limit_cmd(wmi_handle);
5272 if (QDF_IS_STATUS_ERROR(status)) {
5273 WMA_LOGE(FL("wmi_unified_get_sar_limit_cmd() error: %u"),
5274 status);
5275 sar_callback = NULL;
5276 }
5277
5278 return status;
5279}
5280
Kabilan Kannan3c0a7352016-12-02 18:49:38 -08005281QDF_STATUS wma_set_sar_limit(WMA_HANDLE handle,
5282 struct sar_limit_cmd_params *sar_limit_params)
5283{
5284 int ret;
5285 tp_wma_handle wma = (tp_wma_handle) handle;
5286
5287 if (!wma || !wma->wmi_handle) {
5288 WMA_LOGE("%s: WMA is closed, can not issue set sar limit msg",
5289 __func__);
5290 return QDF_STATUS_E_INVAL;
5291 }
5292
5293 if (sar_limit_params == NULL) {
5294 WMA_LOGE("%s: set sar limit ptr NULL",
5295 __func__);
5296 return QDF_STATUS_E_INVAL;
5297 }
5298
5299 ret = wmi_unified_send_sar_limit_cmd(wma->wmi_handle,
5300 sar_limit_params);
5301
5302 return ret;
5303}
5304
Dundi Raviteja3b637092018-09-12 13:42:50 +05305305QDF_STATUS wma_send_coex_config_cmd(WMA_HANDLE wma_handle,
5306 struct coex_config_params *coex_cfg_params)
5307{
5308 tp_wma_handle wma = (tp_wma_handle)wma_handle;
5309
5310 if (!wma || !wma->wmi_handle) {
5311 WMA_LOGE("%s: WMA is closed, can not issue coex config command",
5312 __func__);
5313 return QDF_STATUS_E_INVAL;
5314 }
5315
5316 if (!coex_cfg_params) {
5317 WMA_LOGE("%s: coex cfg params ptr NULL", __func__);
5318 return QDF_STATUS_E_INVAL;
5319 }
5320
5321 return wmi_unified_send_coex_config_cmd(wma->wmi_handle,
5322 coex_cfg_params);
5323}
5324
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05305325/**
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05305326 * wma_get_arp_stats_handler() - handle arp stats data
5327 * indicated by FW
5328 * @handle: wma context
5329 * @data: event buffer
5330 * @data len: length of event buffer
5331 *
5332 * Return: 0 on success
5333 */
5334int wma_get_arp_stats_handler(void *handle, uint8_t *data,
5335 uint32_t data_len)
5336{
5337 WMI_VDEV_GET_ARP_STAT_EVENTID_param_tlvs *param_buf;
5338 wmi_vdev_get_arp_stats_event_fixed_param *data_event;
Poddar, Siddarth465330e2018-01-08 18:23:54 +05305339 wmi_vdev_get_connectivity_check_stats *connect_stats_event;
5340 uint8_t *buf_ptr;
Naveen Rawat6e45d9a2018-04-27 16:35:59 -07005341 struct rsp_stats rsp = {0};
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05305342 tpAniSirGlobal mac = cds_get_context(QDF_MODULE_ID_PE);
5343
5344 if (!mac) {
5345 WMA_LOGE("%s: Invalid mac context", __func__);
5346 return -EINVAL;
5347 }
5348
5349 if (!mac->sme.get_arp_stats_cb) {
5350 WMA_LOGE("%s: Callback not registered", __func__);
5351 return -EINVAL;
5352 }
5353
5354 if (data == NULL) {
5355 WMA_LOGE("%s: invalid pointer", __func__);
5356 return -EINVAL;
5357 }
5358 param_buf = (WMI_VDEV_GET_ARP_STAT_EVENTID_param_tlvs *)data;
5359 if (!param_buf) {
5360 WMA_LOGE("%s: Invalid get arp stats event", __func__);
5361 return -EINVAL;
5362 }
5363 data_event = param_buf->fixed_param;
5364 if (!data_event) {
5365 WMA_LOGE("%s: Invalid get arp stats data event", __func__);
5366 return -EINVAL;
5367 }
5368 rsp.arp_req_enqueue = data_event->arp_req_enqueue;
5369 rsp.vdev_id = data_event->vdev_id;
5370 rsp.arp_req_tx_success = data_event->arp_req_tx_success;
5371 rsp.arp_req_tx_failure = data_event->arp_req_tx_failure;
5372 rsp.arp_rsp_recvd = data_event->arp_rsp_recvd;
5373 rsp.out_of_order_arp_rsp_drop_cnt =
5374 data_event->out_of_order_arp_rsp_drop_cnt;
5375 rsp.dad_detected = data_event->dad_detected;
5376 rsp.connect_status = data_event->connect_status;
5377 rsp.ba_session_establishment_status =
5378 data_event->ba_session_establishment_status;
5379
Poddar, Siddarth465330e2018-01-08 18:23:54 +05305380 buf_ptr = (uint8_t *)data_event;
5381 buf_ptr = buf_ptr + sizeof(wmi_vdev_get_arp_stats_event_fixed_param) +
5382 WMI_TLV_HDR_SIZE;
5383 connect_stats_event = (wmi_vdev_get_connectivity_check_stats *)buf_ptr;
5384
5385 if (((connect_stats_event->tlv_header & 0xFFFF0000) >> 16 ==
5386 WMITLV_TAG_STRUC_wmi_vdev_get_connectivity_check_stats)) {
5387 rsp.connect_stats_present = true;
5388 rsp.tcp_ack_recvd = connect_stats_event->tcp_ack_recvd;
5389 rsp.icmpv4_rsp_recvd = connect_stats_event->icmpv4_rsp_recvd;
5390 WMA_LOGD("tcp_ack_recvd %d icmpv4_rsp_recvd %d",
5391 connect_stats_event->tcp_ack_recvd,
5392 connect_stats_event->icmpv4_rsp_recvd);
5393 }
5394
Jeff Johnson6aaaa992018-06-30 10:43:04 -07005395 mac->sme.get_arp_stats_cb(mac->hdd_handle, &rsp,
Dundi Raviteja3bcf3a82018-05-22 13:24:18 +05305396 mac->sme.get_arp_stats_context);
Anurag Chouhan3920c0f2017-09-11 17:10:56 +05305397
5398 return 0;
5399}
5400
5401/**
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05305402 * wma_unified_power_debug_stats_event_handler() - WMA handler function to
5403 * handle Power stats event from firmware
5404 * @handle: Pointer to wma handle
5405 * @cmd_param_info: Pointer to Power stats event TLV
5406 * @len: Length of the cmd_param_info
5407 *
5408 * Return: 0 on success, error number otherwise
5409 */
5410#ifdef WLAN_POWER_DEBUGFS
5411int wma_unified_power_debug_stats_event_handler(void *handle,
5412 uint8_t *cmd_param_info, uint32_t len)
5413{
5414 WMI_PDEV_CHIP_POWER_STATS_EVENTID_param_tlvs *param_tlvs;
5415 struct power_stats_response *power_stats_results;
5416 wmi_pdev_chip_power_stats_event_fixed_param *param_buf;
5417 uint32_t power_stats_len, stats_registers_len, *debug_registers;
5418
5419 tpAniSirGlobal mac = (tpAniSirGlobal)cds_get_context(QDF_MODULE_ID_PE);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07005420
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05305421 param_tlvs =
5422 (WMI_PDEV_CHIP_POWER_STATS_EVENTID_param_tlvs *) cmd_param_info;
5423
5424 param_buf = (wmi_pdev_chip_power_stats_event_fixed_param *)
5425 param_tlvs->fixed_param;
5426 if (!mac || !mac->sme.power_stats_resp_callback) {
5427 WMA_LOGD("%s: NULL mac ptr or HDD callback is null", __func__);
5428 return -EINVAL;
5429 }
5430
5431 if (!param_buf) {
5432 WMA_LOGD("%s: NULL power stats event fixed param", __func__);
5433 return -EINVAL;
5434 }
5435
Sandeep Puligilla2f931532017-09-20 16:27:43 -07005436 if (param_buf->num_debug_register > ((WMI_SVC_MSG_MAX_SIZE -
5437 sizeof(wmi_pdev_chip_power_stats_event_fixed_param)) /
Himanshu Agarwal82218792017-12-22 14:00:01 +05305438 sizeof(uint32_t)) ||
5439 param_buf->num_debug_register > param_tlvs->num_debug_registers) {
Sandeep Puligilla2f931532017-09-20 16:27:43 -07005440 WMA_LOGE("excess payload: LEN num_debug_register:%u",
5441 param_buf->num_debug_register);
5442 return -EINVAL;
5443 }
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05305444 debug_registers = param_tlvs->debug_registers;
5445 stats_registers_len =
5446 (sizeof(uint32_t) * param_buf->num_debug_register);
5447 power_stats_len = stats_registers_len + sizeof(*power_stats_results);
5448 power_stats_results = qdf_mem_malloc(power_stats_len);
Arif Hussain157263f2018-10-03 13:07:15 -07005449 if (!power_stats_results)
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05305450 return -ENOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -07005451
Sridhar Selvarajdc400d22016-10-18 17:18:03 +05305452 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",
5453 param_buf->cumulative_sleep_time_ms,
5454 param_buf->cumulative_total_on_time_ms,
5455 param_buf->deep_sleep_enter_counter,
5456 param_buf->last_deep_sleep_enter_tstamp_ms,
5457 param_buf->debug_register_fmt,
5458 param_buf->num_debug_register);
5459
5460 power_stats_results->cumulative_sleep_time_ms
5461 = param_buf->cumulative_sleep_time_ms;
5462 power_stats_results->cumulative_total_on_time_ms
5463 = param_buf->cumulative_total_on_time_ms;
5464 power_stats_results->deep_sleep_enter_counter
5465 = param_buf->deep_sleep_enter_counter;
5466 power_stats_results->last_deep_sleep_enter_tstamp_ms
5467 = param_buf->last_deep_sleep_enter_tstamp_ms;
5468 power_stats_results->debug_register_fmt
5469 = param_buf->debug_register_fmt;
5470 power_stats_results->num_debug_register
5471 = param_buf->num_debug_register;
5472
5473 power_stats_results->debug_registers
5474 = (uint32_t *)(power_stats_results + 1);
5475
5476 qdf_mem_copy(power_stats_results->debug_registers,
5477 debug_registers, stats_registers_len);
5478
5479 mac->sme.power_stats_resp_callback(power_stats_results,
5480 mac->sme.power_debug_stats_context);
5481 qdf_mem_free(power_stats_results);
5482 return 0;
5483}
5484#else
5485int wma_unified_power_debug_stats_event_handler(void *handle,
5486 uint8_t *cmd_param_info, uint32_t len)
5487{
5488 return 0;
5489}
5490#endif
Kapil Gupta4f0c0c12017-02-07 15:21:15 +05305491
5492int wma_chan_info_event_handler(void *handle, uint8_t *event_buf,
5493 uint32_t len)
5494{
5495 tp_wma_handle wma = (tp_wma_handle)handle;
5496 WMI_CHAN_INFO_EVENTID_param_tlvs *param_buf;
5497 wmi_chan_info_event_fixed_param *event;
5498 struct scan_chan_info buf;
5499 tpAniSirGlobal mac = NULL;
gaoleze5108942017-03-31 16:56:42 +08005500 struct lim_channel_status *channel_status;
Kapil Gupta4f0c0c12017-02-07 15:21:15 +05305501
5502 WMA_LOGD("%s: Enter", __func__);
5503
5504 if (wma != NULL && wma->cds_context != NULL)
5505 mac = (tpAniSirGlobal)cds_get_context(QDF_MODULE_ID_PE);
5506
5507 if (!mac) {
5508 WMA_LOGE("%s: Invalid mac context", __func__);
5509 return -EINVAL;
5510 }
5511
5512 WMA_LOGD("%s: monitor:%d", __func__, mac->snr_monitor_enabled);
5513 if (mac->snr_monitor_enabled && mac->chan_info_cb) {
5514 param_buf =
5515 (WMI_CHAN_INFO_EVENTID_param_tlvs *)event_buf;
5516 if (!param_buf) {
5517 WMA_LOGA("%s: Invalid chan info event", __func__);
5518 return -EINVAL;
5519 }
5520
5521 event = param_buf->fixed_param;
5522 if (!event) {
5523 WMA_LOGA("%s: Invalid fixed param", __func__);
5524 return -EINVAL;
5525 }
5526 buf.tx_frame_count = event->tx_frame_cnt;
5527 buf.clock_freq = event->mac_clk_mhz;
5528 buf.cmd_flag = event->cmd_flags;
5529 buf.freq = event->freq;
5530 buf.noise_floor = event->noise_floor;
5531 buf.cycle_count = event->cycle_count;
5532 buf.rx_clear_count = event->rx_clear_count;
5533 mac->chan_info_cb(&buf);
5534 }
5535
gaoleze5108942017-03-31 16:56:42 +08005536 if (mac->sap.acs_with_more_param &&
5537 mac->sme.currDeviceMode == QDF_SAP_MODE) {
5538 param_buf = (WMI_CHAN_INFO_EVENTID_param_tlvs *) event_buf;
5539 if (!param_buf) {
5540 WMA_LOGE("Invalid chan info event buffer");
5541 return -EINVAL;
5542 }
5543 event = param_buf->fixed_param;
Arif Hussain157263f2018-10-03 13:07:15 -07005544 channel_status = qdf_mem_malloc(sizeof(*channel_status));
5545 if (!channel_status)
gaoleze5108942017-03-31 16:56:42 +08005546 return -ENOMEM;
Arif Hussain157263f2018-10-03 13:07:15 -07005547
gaoleze5108942017-03-31 16:56:42 +08005548 WMA_LOGD(FL("freq=%d nf=%d rxcnt=%u cyccnt=%u tx_r=%d tx_t=%d"),
5549 event->freq,
5550 event->noise_floor,
5551 event->rx_clear_count,
5552 event->cycle_count,
5553 event->chan_tx_pwr_range,
5554 event->chan_tx_pwr_tp);
5555
5556 channel_status->channelfreq = event->freq;
5557 channel_status->noise_floor = event->noise_floor;
5558 channel_status->rx_clear_count =
5559 event->rx_clear_count;
5560 channel_status->cycle_count = event->cycle_count;
5561 channel_status->chan_tx_pwr_range =
5562 event->chan_tx_pwr_range;
5563 channel_status->chan_tx_pwr_throughput =
5564 event->chan_tx_pwr_tp;
5565 channel_status->rx_frame_count =
5566 event->rx_frame_count;
5567 channel_status->bss_rx_cycle_count =
5568 event->my_bss_rx_cycle_count;
5569 channel_status->rx_11b_mode_data_duration =
5570 event->rx_11b_mode_data_duration;
5571 channel_status->tx_frame_count = event->tx_frame_cnt;
5572 channel_status->mac_clk_mhz = event->mac_clk_mhz;
5573 channel_status->channel_id =
5574 cds_freq_to_chan(event->freq);
5575 channel_status->cmd_flags =
5576 event->cmd_flags;
5577
5578 wma_send_msg(handle, WMA_RX_CHN_STATUS_EVENT,
5579 (void *)channel_status, 0);
5580 }
5581
Kapil Gupta4f0c0c12017-02-07 15:21:15 +05305582 return 0;
5583}
lifeng66831662017-05-19 16:01:35 +08005584
5585int wma_rx_aggr_failure_event_handler(void *handle, u_int8_t *event_buf,
5586 u_int32_t len)
5587{
5588 WMI_REPORT_RX_AGGR_FAILURE_EVENTID_param_tlvs *param_buf;
5589 struct sir_sme_rx_aggr_hole_ind *rx_aggr_hole_event;
5590 wmi_rx_aggr_failure_event_fixed_param *rx_aggr_failure_info;
5591 wmi_rx_aggr_failure_info *hole_info;
5592 uint32_t i, alloc_len;
5593 tpAniSirGlobal mac;
5594
5595 mac = (tpAniSirGlobal)cds_get_context(QDF_MODULE_ID_PE);
5596 if (!mac || !mac->sme.stats_ext2_cb) {
5597 WMA_LOGD("%s: NULL mac ptr or HDD callback is null", __func__);
5598 return -EINVAL;
5599 }
5600
5601 param_buf = (WMI_REPORT_RX_AGGR_FAILURE_EVENTID_param_tlvs *)event_buf;
5602 if (!param_buf) {
5603 WMA_LOGE("%s: Invalid stats ext event buf", __func__);
5604 return -EINVAL;
5605 }
5606
5607 rx_aggr_failure_info = param_buf->fixed_param;
5608 hole_info = param_buf->failure_info;
5609
Vignesh Viswanathan677e3ec2017-09-27 20:44:27 +05305610 if (rx_aggr_failure_info->num_failure_info > ((WMI_SVC_MSG_MAX_SIZE -
5611 sizeof(*rx_aggr_hole_event)) /
5612 sizeof(rx_aggr_hole_event->hole_info_array[0]))) {
5613 WMA_LOGE("%s: Excess data from WMI num_failure_info %d",
5614 __func__, rx_aggr_failure_info->num_failure_info);
Vignesh Viswanathan677e3ec2017-09-27 20:44:27 +05305615 return -EINVAL;
5616 }
5617
lifeng66831662017-05-19 16:01:35 +08005618 alloc_len = sizeof(*rx_aggr_hole_event) +
5619 (rx_aggr_failure_info->num_failure_info)*
5620 sizeof(rx_aggr_hole_event->hole_info_array[0]);
5621 rx_aggr_hole_event = qdf_mem_malloc(alloc_len);
Arif Hussain157263f2018-10-03 13:07:15 -07005622 if (!rx_aggr_hole_event)
lifeng66831662017-05-19 16:01:35 +08005623 return -ENOMEM;
lifeng66831662017-05-19 16:01:35 +08005624
5625 rx_aggr_hole_event->hole_cnt = rx_aggr_failure_info->num_failure_info;
Abhinav Kumara03659c2017-12-28 15:18:07 +05305626 if (rx_aggr_hole_event->hole_cnt > param_buf->num_failure_info) {
5627 WMA_LOGE("Invalid no of hole count: %d",
5628 rx_aggr_hole_event->hole_cnt);
5629 qdf_mem_free(rx_aggr_hole_event);
5630 return -EINVAL;
5631 }
lifeng66831662017-05-19 16:01:35 +08005632 WMA_LOGD("aggr holes_sum: %d\n",
5633 rx_aggr_failure_info->num_failure_info);
5634 for (i = 0; i < rx_aggr_hole_event->hole_cnt; i++) {
5635 rx_aggr_hole_event->hole_info_array[i] =
5636 hole_info->end_seq - hole_info->start_seq + 1;
5637 WMA_LOGD("aggr_index: %d\tstart_seq: %d\tend_seq: %d\t"
5638 "hole_info: %d mpdu lost",
5639 i, hole_info->start_seq, hole_info->end_seq,
5640 rx_aggr_hole_event->hole_info_array[i]);
5641 hole_info++;
5642 }
5643
Jeff Johnson6aaaa992018-06-30 10:43:04 -07005644 mac->sme.stats_ext2_cb(mac->hdd_handle, rx_aggr_hole_event);
lifeng66831662017-05-19 16:01:35 +08005645 qdf_mem_free(rx_aggr_hole_event);
5646
5647 return 0;
5648}
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +05305649
5650int wma_wlan_bt_activity_evt_handler(void *handle, uint8_t *event, uint32_t len)
5651{
5652 wmi_coex_bt_activity_event_fixed_param *fixed_param;
5653 WMI_WLAN_COEX_BT_ACTIVITY_EVENTID_param_tlvs *param_buf =
5654 (WMI_WLAN_COEX_BT_ACTIVITY_EVENTID_param_tlvs *)event;
5655 struct scheduler_msg sme_msg = {0};
5656 QDF_STATUS qdf_status;
5657
5658 if (!param_buf) {
5659 WMA_LOGE(FL("Invalid BT activity event buffer"));
5660 return -EINVAL;
5661 }
5662
5663 fixed_param = param_buf->fixed_param;
5664 if (!fixed_param) {
5665 WMA_LOGE(FL("Invalid BT activity event fixed param buffer"));
5666 return -EINVAL;
5667 }
5668
5669 WMA_LOGI(FL("Received BT activity event %u"),
5670 fixed_param->coex_profile_evt);
5671
5672 sme_msg.type = eWNI_SME_BT_ACTIVITY_INFO_IND;
5673 sme_msg.bodyptr = NULL;
5674 sme_msg.bodyval = fixed_param->coex_profile_evt;
5675
gaurank kathpalia00861f02018-08-28 19:16:12 +05305676 qdf_status = scheduler_post_message(QDF_MODULE_ID_WMA,
5677 QDF_MODULE_ID_SME,
5678 QDF_MODULE_ID_SME, &sme_msg);
Vidyullatha Kanchanapallybe0ebb32017-03-23 14:36:21 +05305679 if (QDF_IS_STATUS_ERROR(qdf_status)) {
5680 WMA_LOGE(FL("Failed to post msg to SME"));
5681 return -EINVAL;
5682 }
5683
5684 return 0;
5685}
lifengd217d192017-05-09 19:44:16 +08005686
lifengfe6c3e22018-04-03 12:10:04 +08005687int wma_pdev_div_info_evt_handler(void *handle, u_int8_t *event_buf,
lifengd217d192017-05-09 19:44:16 +08005688 u_int32_t len)
5689{
lifengfe6c3e22018-04-03 12:10:04 +08005690 WMI_PDEV_DIV_RSSI_ANTID_EVENTID_param_tlvs *param_buf;
5691 wmi_pdev_div_rssi_antid_event_fixed_param *event;
5692 struct chain_rssi_result chain_rssi_result;
5693 u_int32_t i;
5694 u_int8_t macaddr[IEEE80211_ADDR_LEN];
lifengd217d192017-05-09 19:44:16 +08005695
5696 tpAniSirGlobal pmac = (tpAniSirGlobal)cds_get_context(
5697 QDF_MODULE_ID_PE);
5698 if (!pmac) {
lifengfe6c3e22018-04-03 12:10:04 +08005699 WMA_LOGE(FL("Invalid pmac"));
lifengd217d192017-05-09 19:44:16 +08005700 return -EINVAL;
5701 }
5702
Harprit Chhabada2e2aa692018-10-04 18:28:28 -07005703 if (!pmac->sme.get_chain_rssi_cb) {
5704 WMA_LOGE(FL("Invalid get_chain_rssi_cb"));
5705 return -EINVAL;
5706 }
lifengfe6c3e22018-04-03 12:10:04 +08005707 param_buf = (WMI_PDEV_DIV_RSSI_ANTID_EVENTID_param_tlvs *) event_buf;
lifengd217d192017-05-09 19:44:16 +08005708 if (!param_buf) {
lifengfe6c3e22018-04-03 12:10:04 +08005709 WMA_LOGE(FL("Invalid rssi antid event buffer"));
lifengd217d192017-05-09 19:44:16 +08005710 return -EINVAL;
5711 }
5712
lifengfe6c3e22018-04-03 12:10:04 +08005713 event = param_buf->fixed_param;
5714 if (!event) {
5715 WMA_LOGE(FL("Invalid fixed param"));
5716 return -EINVAL;
lifengd217d192017-05-09 19:44:16 +08005717 }
5718
Pragaspathi Thilagaraj96aff772018-08-29 23:15:31 +05305719 if (event->num_chains_valid > CHAIN_MAX_NUM) {
5720 WMA_LOGE(FL("Invalid num of chains"));
5721 return -EINVAL;
5722 }
5723
lifengfe6c3e22018-04-03 12:10:04 +08005724 WMI_MAC_ADDR_TO_CHAR_ARRAY(&event->macaddr, macaddr);
5725 WMA_LOGD(FL("macaddr: " MAC_ADDRESS_STR), MAC_ADDR_ARRAY(macaddr));
lifengd217d192017-05-09 19:44:16 +08005726
lifengfe6c3e22018-04-03 12:10:04 +08005727 WMA_LOGD(FL("num_chains_valid: %d"), event->num_chains_valid);
5728 chain_rssi_result.num_chains_valid = event->num_chains_valid;
5729
lifengfe6c3e22018-04-03 12:10:04 +08005730 qdf_mem_copy(chain_rssi_result.chain_rssi, event->chain_rssi,
5731 sizeof(event->chain_rssi));
Pragaspathi Thilagaraj96aff772018-08-29 23:15:31 +05305732 for (i = 0; i < event->num_chains_valid; i++) {
5733 WMA_LOGD(FL("chain_rssi: %d, ant_id: %d"),
5734 event->chain_rssi[i], event->ant_id[i]);
lifengfe6c3e22018-04-03 12:10:04 +08005735 chain_rssi_result.chain_rssi[i] += WMA_TGT_NOISE_FLOOR_DBM;
Pragaspathi Thilagaraj96aff772018-08-29 23:15:31 +05305736 }
lifengfe6c3e22018-04-03 12:10:04 +08005737
5738 qdf_mem_copy(chain_rssi_result.ant_id, event->ant_id,
5739 sizeof(event->ant_id));
lifengd217d192017-05-09 19:44:16 +08005740
5741 pmac->sme.get_chain_rssi_cb(pmac->sme.get_chain_rssi_context,
lifengfe6c3e22018-04-03 12:10:04 +08005742 &chain_rssi_result);
lifengd217d192017-05-09 19:44:16 +08005743
5744 return 0;
5745}
Arif Hussainee10f902017-12-27 16:30:17 -08005746
5747int wma_vdev_obss_detection_info_handler(void *handle, uint8_t *event,
5748 uint32_t len)
5749{
5750 tp_wma_handle wma = (tp_wma_handle) handle;
5751 struct wmi_obss_detect_info *obss_detection;
5752 QDF_STATUS status;
5753
5754 if (!event) {
5755 WMA_LOGE("Invalid obss_detection_info event buffer");
5756 return -EINVAL;
5757 }
5758
5759 obss_detection = qdf_mem_malloc(sizeof(*obss_detection));
Arif Hussain157263f2018-10-03 13:07:15 -07005760 if (!obss_detection)
Arif Hussainee10f902017-12-27 16:30:17 -08005761 return -ENOMEM;
Arif Hussainee10f902017-12-27 16:30:17 -08005762
5763 status = wmi_unified_extract_obss_detection_info(wma->wmi_handle,
5764 event, obss_detection);
5765
5766 if (QDF_IS_STATUS_ERROR(status)) {
5767 WMA_LOGE("%s: Failed to extract obss info", __func__);
5768 qdf_mem_free(obss_detection);
5769 return -EINVAL;
5770 }
5771
5772 if (!wma_is_vdev_valid(obss_detection->vdev_id)) {
5773 WMA_LOGE("%s: Invalid vdev id %d", __func__,
5774 obss_detection->vdev_id);
5775 qdf_mem_free(obss_detection);
5776 return -EINVAL;
5777 }
5778
5779 wma_send_msg(wma, WMA_OBSS_DETECTION_INFO, obss_detection, 0);
5780
5781 return 0;
5782}
Arif Hussain05fb4872018-01-03 16:02:55 -08005783
5784int wma_vdev_bss_color_collision_info_handler(void *handle,
5785 uint8_t *event,
5786 uint32_t len)
5787{
5788 tp_wma_handle wma = (tp_wma_handle) handle;
5789 struct wmi_obss_color_collision_info *obss_color_info;
5790 QDF_STATUS status;
5791
5792 if (!event) {
5793 WMA_LOGE("Invalid obss_color_collision event buffer");
5794 return -EINVAL;
5795 }
5796
5797 obss_color_info = qdf_mem_malloc(sizeof(*obss_color_info));
Arif Hussain157263f2018-10-03 13:07:15 -07005798 if (!obss_color_info)
Arif Hussain05fb4872018-01-03 16:02:55 -08005799 return -ENOMEM;
Arif Hussain05fb4872018-01-03 16:02:55 -08005800
5801 status = wmi_unified_extract_obss_color_collision_info(wma->wmi_handle,
5802 event,
5803 obss_color_info);
5804
5805 if (QDF_IS_STATUS_ERROR(status)) {
5806 WMA_LOGE("%s: Failed to extract obss color info", __func__);
5807 qdf_mem_free(obss_color_info);
5808 return -EINVAL;
5809 }
5810
5811 if (!wma_is_vdev_valid(obss_color_info->vdev_id)) {
5812 WMA_LOGE("%s: Invalid vdev id %d", __func__,
5813 obss_color_info->vdev_id);
5814 qdf_mem_free(obss_color_info);
5815 return -EINVAL;
5816 }
5817
5818 wma_send_msg(wma, WMA_OBSS_COLOR_COLLISION_INFO, obss_color_info, 0);
5819
5820 return 0;
5821}