blob: 08121ab5e61e7d23cbad9fc3e004bedfd79b121c [file] [log] [blame]
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001/*
Himanshu Agarwalfc4dab92017-12-28 21:46:29 +05302 * Copyright (c) 2013-2018 The Linux Foundation. All rights reserved.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003 *
4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5 *
6 *
7 * Permission to use, copy, modify, and/or distribute this software for
8 * any purpose with or without fee is hereby granted, provided that the
9 * above copyright notice and this permission notice appear in all
10 * copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 * PERFORMANCE OF THIS SOFTWARE.
20 */
21
22/*
23 * This file was originally distributed by Qualcomm Atheros, Inc.
24 * under proprietary terms before Copyright ownership was assigned
25 * to the Linux Foundation.
26 */
27
28/**
29 * DOC: wma_dev_if.c
30 * This file contains vdev & peer related operations.
31 */
32
33/* Header files */
34
35#include "wma.h"
36#include "wma_api.h"
37#include "cds_api.h"
38#include "wmi_unified_api.h"
39#include "wlan_qct_sys.h"
40#include "wni_api.h"
41#include "ani_global.h"
42#include "wmi_unified.h"
43#include "wni_cfg.h"
44#include "cfg_api.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080045
Nirav Shahcbc6d722016-03-01 16:24:53 +053046#include "qdf_nbuf.h"
Anurag Chouhan6d760662016-02-20 16:05:43 +053047#include "qdf_types.h"
Anurag Chouhan600c3a02016-03-01 10:33:54 +053048#include "qdf_mem.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080049
50#include "wma_types.h"
51#include "lim_api.h"
52#include "lim_session_utils.h"
53
54#include "cds_utils.h"
55
56#if !defined(REMOVE_PKT_LOG)
57#include "pktlog_ac.h"
58#endif /* REMOVE_PKT_LOG */
59
60#include "dbglog_host.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080061#include "csr_api.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080062
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080063#include "wma_internal.h"
64
65#include "wma_ocb.h"
Dhanashri Atreb08959a2016-03-01 17:28:03 -080066#include "cdp_txrx_cfg.h"
67#include "cdp_txrx_flow_ctrl_legacy.h"
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -070068#include <cdp_txrx_peer_ops.h>
69#include <cdp_txrx_cfg.h>
70#include <cdp_txrx_cmn.h>
Leo Chang96464902016-10-28 11:10:54 -070071#include <cdp_txrx_misc.h>
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080072
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -070073#include "wlan_policy_mgr_api.h"
Deepak Dhamdheree2dd5442016-05-27 15:05:51 -070074#include "wma_nan_datapath.h"
Leo Chang96464902016-10-28 11:10:54 -070075#include "wlan_tgt_def_config.h"
bings1f98e9f2018-01-24 16:13:41 +080076#include <wlan_dfs_tgt_api.h>
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -080077#include <cdp_txrx_handle.h>
Mukul Sharma00058692017-01-28 19:04:32 +053078#include "wlan_pmo_ucfg_api.h"
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070079#include "wlan_reg_services_api.h"
Leo Chang96464902016-10-28 11:10:54 -070080
Krishna Kumaar Natarajan0103ef82017-02-17 18:15:56 -080081#include "wma_he.h"
Deepak Dhamdheref918d422017-07-06 12:56:29 -070082#include "wlan_roam_debug.h"
Zhang Qian47e22ce2018-01-04 15:38:38 +080083#include "wlan_ocb_ucfg_api.h"
Krishna Kumaar Natarajan0103ef82017-02-17 18:15:56 -080084
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080085/**
86 * wma_find_vdev_by_addr() - find vdev_id from mac address
87 * @wma: wma handle
88 * @addr: mac address
89 * @vdev_id: return vdev_id
90 *
91 * Return: Returns vdev handle or NULL if mac address don't match
92 */
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -080093struct cdp_vdev *wma_find_vdev_by_addr(tp_wma_handle wma, uint8_t *addr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080094 uint8_t *vdev_id)
95{
96 uint8_t i;
97
98 for (i = 0; i < wma->max_bssid; i++) {
Anurag Chouhanc5548422016-02-24 18:33:27 +053099 if (qdf_is_macaddr_equal(
Anurag Chouhan6d760662016-02-20 16:05:43 +0530100 (struct qdf_mac_addr *) wma->interfaces[i].addr,
101 (struct qdf_mac_addr *) addr) == true) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800102 *vdev_id = i;
103 return wma->interfaces[i].handle;
104 }
105 }
106 return NULL;
107}
108
109
110/**
111 * wma_is_vdev_in_ap_mode() - check that vdev is in ap mode or not
112 * @wma: wma handle
113 * @vdev_id: vdev id
114 *
115 * Helper function to know whether given vdev id
116 * is in AP mode or not.
117 *
118 * Return: True/False
119 */
120bool wma_is_vdev_in_ap_mode(tp_wma_handle wma, uint8_t vdev_id)
121{
122 struct wma_txrx_node *intf = wma->interfaces;
123
Naveen Rawatf2bd42d2017-06-29 14:51:43 -0700124 if (vdev_id >= wma->max_bssid) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -0700125 WMA_LOGE("%s: Invalid vdev_id %hu", __func__, vdev_id);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530126 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800127 return false;
128 }
129
130 if ((intf[vdev_id].type == WMI_VDEV_TYPE_AP) &&
131 ((intf[vdev_id].sub_type == WMI_UNIFIED_VDEV_SUBTYPE_P2P_GO) ||
132 (intf[vdev_id].sub_type == 0)))
133 return true;
134
135 return false;
136}
137
138#ifdef QCA_IBSS_SUPPORT
139/**
140 * wma_is_vdev_in_ibss_mode() - check that vdev is in ibss mode or not
141 * @wma: wma handle
142 * @vdev_id: vdev id
143 *
144 * Helper function to know whether given vdev id
145 * is in IBSS mode or not.
146 *
147 * Return: True/False
148 */
149bool wma_is_vdev_in_ibss_mode(tp_wma_handle wma, uint8_t vdev_id)
150{
151 struct wma_txrx_node *intf = wma->interfaces;
152
Naveen Rawatf2bd42d2017-06-29 14:51:43 -0700153 if (vdev_id >= wma->max_bssid) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -0700154 WMA_LOGE("%s: Invalid vdev_id %hu", __func__, vdev_id);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530155 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800156 return false;
157 }
158
159 if (intf[vdev_id].type == WMI_VDEV_TYPE_IBSS)
160 return true;
161
162 return false;
163}
164#endif /* QCA_IBSS_SUPPORT */
165
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800166/**
167 * wma_find_vdev_by_bssid() - Get the corresponding vdev_id from BSSID
168 * @wma - wma handle
169 * @vdev_id - vdev ID
170 *
171 * Return: fill vdev_id with appropriate vdev id and return vdev
172 * handle or NULL if not found.
173 */
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -0800174struct cdp_vdev *wma_find_vdev_by_bssid(tp_wma_handle wma, uint8_t *bssid,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800175 uint8_t *vdev_id)
176{
177 int i;
178
179 for (i = 0; i < wma->max_bssid; i++) {
Anurag Chouhanc5548422016-02-24 18:33:27 +0530180 if (qdf_is_macaddr_equal(
Anurag Chouhan6d760662016-02-20 16:05:43 +0530181 (struct qdf_mac_addr *) wma->interfaces[i].bssid,
182 (struct qdf_mac_addr *) bssid) == true) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800183 *vdev_id = i;
184 return wma->interfaces[i].handle;
185 }
186 }
187
188 return NULL;
189}
190
191/**
192 * wma_get_txrx_vdev_type() - return operating mode of vdev
193 * @type: vdev_type
194 *
195 * Return: return operating mode as enum wlan_op_mode type
196 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -0700197static enum wlan_op_mode wma_get_txrx_vdev_type(uint32_t type)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800198{
199 enum wlan_op_mode vdev_type = wlan_op_mode_unknown;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700200
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800201 switch (type) {
202 case WMI_VDEV_TYPE_AP:
203 vdev_type = wlan_op_mode_ap;
204 break;
205 case WMI_VDEV_TYPE_STA:
206 vdev_type = wlan_op_mode_sta;
207 break;
208#ifdef QCA_IBSS_SUPPORT
209 case WMI_VDEV_TYPE_IBSS:
210 vdev_type = wlan_op_mode_ibss;
211 break;
212#endif /* QCA_IBSS_SUPPORT */
213 case WMI_VDEV_TYPE_OCB:
214 vdev_type = wlan_op_mode_ocb;
215 break;
216 case WMI_VDEV_TYPE_MONITOR:
Manjunathappa Prakash0e6e6b52016-04-21 11:48:48 -0700217 vdev_type = wlan_op_mode_monitor;
218 break;
Deepak Dhamdheree2dd5442016-05-27 15:05:51 -0700219 case WMI_VDEV_TYPE_NDI:
220 vdev_type = wlan_op_mode_ndi;
221 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800222 default:
223 WMA_LOGE("Invalid vdev type %u", type);
224 vdev_type = wlan_op_mode_unknown;
225 }
226
227 return vdev_type;
228}
229
230/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800231 * wma_find_req() - find target request for vdev id
232 * @wma: wma handle
233 * @vdev_id: vdev id
234 * @type: request type
235 *
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800236 * Find target request for given vdev id & type of request.
237 * Remove that request from active list.
238 *
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800239 * Return: return target request if found or NULL.
240 */
241static struct wma_target_req *wma_find_req(tp_wma_handle wma,
242 uint8_t vdev_id, uint8_t type)
243{
244 struct wma_target_req *req_msg = NULL;
245 bool found = false;
Anurag Chouhanffb21542016-02-17 14:33:03 +0530246 qdf_list_node_t *node1 = NULL, *node2 = NULL;
247 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800248
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530249 qdf_spin_lock_bh(&wma->wma_hold_req_q_lock);
Anurag Chouhanffb21542016-02-17 14:33:03 +0530250 if (QDF_STATUS_SUCCESS != qdf_list_peek_front(&wma->wma_hold_req_queue,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800251 &node2)) {
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530252 qdf_spin_unlock_bh(&wma->wma_hold_req_q_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800253 WMA_LOGE(FL("unable to get msg node from request queue"));
254 return NULL;
255 }
256
257 do {
258 node1 = node2;
Anurag Chouhanc5548422016-02-24 18:33:27 +0530259 req_msg = qdf_container_of(node1, struct wma_target_req, node);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800260 if (req_msg->vdev_id != vdev_id)
261 continue;
262 if (req_msg->type != type)
263 continue;
264
265 found = true;
Anurag Chouhanffb21542016-02-17 14:33:03 +0530266 status = qdf_list_remove_node(&wma->wma_hold_req_queue, node1);
267 if (QDF_STATUS_SUCCESS != status) {
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530268 qdf_spin_unlock_bh(&wma->wma_hold_req_q_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800269 WMA_LOGD(FL("Failed to remove request for vdev_id %d type %d"),
270 vdev_id, type);
271 return NULL;
272 }
273 break;
Anurag Chouhanffb21542016-02-17 14:33:03 +0530274 } while (QDF_STATUS_SUCCESS ==
275 qdf_list_peek_next(&wma->wma_hold_req_queue, node1,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800276 &node2));
277
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530278 qdf_spin_unlock_bh(&wma->wma_hold_req_q_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800279 if (!found) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800280 WMA_LOGE(FL("target request not found for vdev_id %d type %d"),
281 vdev_id, type);
282 return NULL;
283 }
284
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800285 WMA_LOGD(FL("target request found for vdev id: %d type %d"),
286 vdev_id, type);
287
288 return req_msg;
289}
290
291/**
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800292 * wma_find_remove_req_msgtype() - find and remove request for vdev id
293 * @wma: wma handle
294 * @vdev_id: vdev id
295 * @msg_type: message request type
296 *
297 * Find target request for given vdev id & sub type of request.
298 * Remove the same from active list.
299 *
300 * Return: Success if request found, failure other wise
301 */
302static struct wma_target_req *wma_find_remove_req_msgtype(tp_wma_handle wma,
303 uint8_t vdev_id, uint32_t msg_type)
304{
305 struct wma_target_req *req_msg = NULL;
306 bool found = false;
Anurag Chouhanffb21542016-02-17 14:33:03 +0530307 qdf_list_node_t *node1 = NULL, *node2 = NULL;
308 QDF_STATUS status;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800309
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530310 qdf_spin_lock_bh(&wma->wma_hold_req_q_lock);
Anurag Chouhanffb21542016-02-17 14:33:03 +0530311 if (QDF_STATUS_SUCCESS != qdf_list_peek_front(&wma->wma_hold_req_queue,
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800312 &node2)) {
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530313 qdf_spin_unlock_bh(&wma->wma_hold_req_q_lock);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800314 WMA_LOGE(FL("unable to get msg node from request queue"));
315 return NULL;
316 }
317
318 do {
319 node1 = node2;
Anurag Chouhanc5548422016-02-24 18:33:27 +0530320 req_msg = qdf_container_of(node1, struct wma_target_req, node);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800321 if (req_msg->vdev_id != vdev_id)
322 continue;
323 if (req_msg->msg_type != msg_type)
324 continue;
325
326 found = true;
Anurag Chouhanffb21542016-02-17 14:33:03 +0530327 status = qdf_list_remove_node(&wma->wma_hold_req_queue, node1);
328 if (QDF_STATUS_SUCCESS != status) {
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530329 qdf_spin_unlock_bh(&wma->wma_hold_req_q_lock);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800330 WMA_LOGD(FL("Failed to remove request. vdev_id %d type %d"),
331 vdev_id, msg_type);
332 return NULL;
333 }
334 break;
Anurag Chouhanffb21542016-02-17 14:33:03 +0530335 } while (QDF_STATUS_SUCCESS ==
336 qdf_list_peek_next(&wma->wma_hold_req_queue, node1,
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800337 &node2));
338
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530339 qdf_spin_unlock_bh(&wma->wma_hold_req_q_lock);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800340 if (!found) {
341 WMA_LOGE(FL("target request not found for vdev_id %d type %d"),
342 vdev_id, msg_type);
343 return NULL;
344 }
345
346 WMA_LOGD(FL("target request found for vdev id: %d type %d"),
347 vdev_id, msg_type);
348
349 return req_msg;
350}
351
352
353/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800354 * wma_find_vdev_req() - find target request for vdev id
355 * @wma: wma handle
356 * @vdev_id: vdev id
357 * @type: request type
Kiran Kumar Lokere20804162017-07-17 16:09:04 -0700358 * @remove_req_from_list: flag to indicate remove req or not.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800359 *
360 * Return: return target request if found or NULL.
361 */
362static struct wma_target_req *wma_find_vdev_req(tp_wma_handle wma,
Kiran Kumar Lokere20804162017-07-17 16:09:04 -0700363 uint8_t vdev_id, uint8_t type,
364 bool remove_req_from_list)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800365{
Krishna Kumaar Natarajana5c53bd2015-10-27 11:48:27 -0700366 struct wma_target_req *req_msg = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800367 bool found = false;
Anurag Chouhanffb21542016-02-17 14:33:03 +0530368 qdf_list_node_t *node1 = NULL, *node2 = NULL;
369 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800370
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530371 qdf_spin_lock_bh(&wma->vdev_respq_lock);
Anurag Chouhanffb21542016-02-17 14:33:03 +0530372 if (QDF_STATUS_SUCCESS != qdf_list_peek_front(&wma->vdev_resp_queue,
Krishna Kumaar Natarajana5c53bd2015-10-27 11:48:27 -0700373 &node2)) {
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530374 qdf_spin_unlock_bh(&wma->vdev_respq_lock);
Srinivas Girigowda2b5d47c2017-03-29 00:28:46 -0700375 WMA_LOGD(FL("unable to get target req from vdev resp queue vdev_id: %d type: %d"),
376 vdev_id, type);
Krishna Kumaar Natarajana5c53bd2015-10-27 11:48:27 -0700377 return NULL;
378 }
379
380 do {
381 node1 = node2;
Anurag Chouhanc5548422016-02-24 18:33:27 +0530382 req_msg = qdf_container_of(node1, struct wma_target_req, node);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800383 if (req_msg->vdev_id != vdev_id)
384 continue;
385 if (req_msg->type != type)
386 continue;
387
388 found = true;
Kiran Kumar Lokere20804162017-07-17 16:09:04 -0700389 if (remove_req_from_list) {
390 status = qdf_list_remove_node(&wma->vdev_resp_queue,
391 node1);
392 if (QDF_STATUS_SUCCESS != status) {
393 qdf_spin_unlock_bh(&wma->vdev_respq_lock);
394 WMA_LOGD(FL(
395 "Failed to target req for vdev_id %d type %d"),
396 vdev_id, type);
397 return NULL;
398 }
Krishna Kumaar Natarajana5c53bd2015-10-27 11:48:27 -0700399 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800400 break;
Anurag Chouhanffb21542016-02-17 14:33:03 +0530401 } while (QDF_STATUS_SUCCESS ==
402 qdf_list_peek_next(&wma->vdev_resp_queue,
Krishna Kumaar Natarajana5c53bd2015-10-27 11:48:27 -0700403 node1, &node2));
404
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530405 qdf_spin_unlock_bh(&wma->vdev_respq_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800406 if (!found) {
Srinivas Girigowda2b5d47c2017-03-29 00:28:46 -0700407 WMA_LOGD(FL("target request not found for vdev_id %d type %d"),
Krishna Kumaar Natarajana5c53bd2015-10-27 11:48:27 -0700408 vdev_id, type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800409 return NULL;
410 }
Krishna Kumaar Natarajana5c53bd2015-10-27 11:48:27 -0700411 WMA_LOGD(FL("target request found for vdev id: %d type %d msg %d"),
412 vdev_id, type, req_msg->msg_type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800413 return req_msg;
414}
415
416/**
Abhishek Singhc614ec42017-04-25 16:17:34 +0530417 * wma_send_del_sta_self_resp() - send del sta self resp to Upper layer
418 * @param: params of del sta resp
419 *
420 * Return: none
421 */
422static inline void wma_send_del_sta_self_resp(struct del_sta_self_params *param)
423{
424 struct scheduler_msg sme_msg = {0};
425 QDF_STATUS status;
426
427 sme_msg.type = eWNI_SME_DEL_STA_SELF_RSP;
428 sme_msg.bodyptr = param;
429
430 status = scheduler_post_msg(QDF_MODULE_ID_SME, &sme_msg);
431 if (!QDF_IS_STATUS_SUCCESS(status)) {
432 WMA_LOGE("Failed to post eWNI_SME_DEL_STA_SELF_RSP");
433 qdf_mem_free(param);
434 }
435}
436
437/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800438 * wma_vdev_detach_callback() - send vdev detach response to upper layer
439 * @ctx: txrx node ptr
440 *
441 * Return: none
442 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -0700443static void wma_vdev_detach_callback(void *ctx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800444{
445 tp_wma_handle wma;
446 struct wma_txrx_node *iface = (struct wma_txrx_node *)ctx;
447 struct del_sta_self_params *param;
448 struct wma_target_req *req_msg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800449
Anurag Chouhan6d760662016-02-20 16:05:43 +0530450 wma = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800451
452 if (!wma || !iface->del_staself_req) {
Jeff Johnsonadba3962017-09-18 08:12:35 -0700453 WMA_LOGE("%s: wma %pK iface %pK", __func__, wma,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800454 iface->del_staself_req);
455 return;
456 }
457 param = (struct del_sta_self_params *) iface->del_staself_req;
Sandeep Puligilla88de6fb2016-09-23 17:08:44 -0700458 iface->del_staself_req = NULL;
Srinivas Girigowdada0e8482017-03-19 23:15:45 -0700459 WMA_LOGD("%s: sending eWNI_SME_DEL_STA_SELF_RSP for vdev %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800460 __func__, param->session_id);
Sourav Mohapatra89c85d12017-12-01 09:17:54 +0530461 if (!wmi_service_enabled(wma->wmi_handle,
462 wmi_service_sync_delete_cmds)) {
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800463 req_msg = wma_find_vdev_req(wma, param->session_id,
Kiran Kumar Lokere20804162017-07-17 16:09:04 -0700464 WMA_TARGET_REQ_TYPE_VDEV_DEL,
465 true);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800466 if (req_msg) {
467 WMA_LOGD("%s: Found vdev request for vdev id %d",
468 __func__, param->session_id);
Anurag Chouhan210db072016-02-22 18:42:15 +0530469 qdf_mc_timer_stop(&req_msg->event_timeout);
470 qdf_mc_timer_destroy(&req_msg->event_timeout);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530471 qdf_mem_free(req_msg);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800472 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800473 }
474 if (iface->addBssStaContext)
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530475 qdf_mem_free(iface->addBssStaContext);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800476
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800477
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800478 if (iface->staKeyParams)
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530479 qdf_mem_free(iface->staKeyParams);
Naveen Rawat3c49d192017-03-02 18:43:16 -0800480
481 if (iface->stats_rsp)
482 qdf_mem_free(iface->stats_rsp);
483
Dustin Brownec2c92e2017-07-26 11:13:49 -0700484 wma_vdev_deinit(iface);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530485 qdf_mem_zero(iface, sizeof(*iface));
Dustin Brownec2c92e2017-07-26 11:13:49 -0700486 wma_vdev_init(iface);
487
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530488 param->status = QDF_STATUS_SUCCESS;
Abhishek Singhc614ec42017-04-25 16:17:34 +0530489 wma_send_del_sta_self_resp(param);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800490}
491
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800492
493/**
494 * wma_self_peer_remove() - Self peer remove handler
495 * @wma: wma handle
496 * @del_sta_self_req_param: vdev id
497 * @generate_vdev_rsp: request type
498 *
499 * Return: success if peer delete command sent to firmware, else failure.
500 */
501
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530502static QDF_STATUS wma_self_peer_remove(tp_wma_handle wma_handle,
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800503 struct del_sta_self_params *del_sta_self_req_param,
504 uint8_t generate_vdev_rsp)
505{
Leo Chang96464902016-10-28 11:10:54 -0700506 void *peer;
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -0800507 struct cdp_pdev *pdev;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800508 uint8_t peer_id;
509 uint8_t vdev_id = del_sta_self_req_param->session_id;
510 struct wma_target_req *msg = NULL;
511 struct del_sta_self_rsp_params *sta_self_wmi_rsp;
Leo Chang96464902016-10-28 11:10:54 -0700512 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800513
Srinivas Girigowdada0e8482017-03-19 23:15:45 -0700514 WMA_LOGD("P2P Device: removing self peer %pM",
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800515 del_sta_self_req_param->self_mac_addr);
516
Anurag Chouhan6d760662016-02-20 16:05:43 +0530517 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800518 if (NULL == pdev) {
519 WMA_LOGE("%s: Failed to get pdev", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530520 return QDF_STATUS_E_FAULT;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800521 }
522
Leo Chang96464902016-10-28 11:10:54 -0700523 peer = cdp_peer_find_by_addr(soc, pdev,
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -0800524 del_sta_self_req_param->self_mac_addr,
525 &peer_id);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800526 if (!peer) {
527 WMA_LOGE("%s Failed to find peer %pM", __func__,
528 del_sta_self_req_param->self_mac_addr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530529 return QDF_STATUS_SUCCESS;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800530 }
531 wma_remove_peer(wma_handle,
532 del_sta_self_req_param->self_mac_addr,
533 vdev_id, peer, false);
534
Sourav Mohapatra89c85d12017-12-01 09:17:54 +0530535 if (wmi_service_enabled(wma_handle->wmi_handle,
536 wmi_service_sync_delete_cmds)) {
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800537 sta_self_wmi_rsp =
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530538 qdf_mem_malloc(sizeof(struct del_sta_self_rsp_params));
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800539 if (sta_self_wmi_rsp == NULL) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -0700540 WMA_LOGE(FL("Failed to allocate memory"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530541 return QDF_STATUS_E_NOMEM;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800542 }
543 sta_self_wmi_rsp->self_sta_param = del_sta_self_req_param;
544 sta_self_wmi_rsp->generate_rsp = generate_vdev_rsp;
545 msg = wma_fill_hold_req(wma_handle, vdev_id,
546 WMA_DELETE_STA_REQ,
547 WMA_DEL_P2P_SELF_STA_RSP_START,
548 sta_self_wmi_rsp,
549 WMA_DELETE_STA_TIMEOUT);
550 if (!msg) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -0700551 WMA_LOGE(FL("Failed to allocate request for vdev_id %d"),
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800552 vdev_id);
553 wma_remove_req(wma_handle, vdev_id,
554 WMA_DEL_P2P_SELF_STA_RSP_START);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530555 return QDF_STATUS_E_FAILURE;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800556 }
557 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530558 return QDF_STATUS_SUCCESS;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800559}
560
Jingxiang Gedf9292a2017-12-11 13:30:44 +0800561static void
562wma_cdp_vdev_detach(ol_txrx_soc_handle soc,
563 tp_wma_handle wma_handle,
564 uint8_t vdev_id)
565{
566 struct wma_txrx_node *iface = &wma_handle->interfaces[vdev_id];
567
568 cdp_vdev_detach(soc,
569 iface->handle, NULL, NULL);
570 iface->handle = NULL;
571 iface->is_vdev_valid = false;
572}
573
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530574static QDF_STATUS wma_handle_vdev_detach(tp_wma_handle wma_handle,
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800575 struct del_sta_self_params *del_sta_self_req_param,
576 uint8_t generate_rsp)
577{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530578 QDF_STATUS status = QDF_STATUS_SUCCESS;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800579 uint8_t vdev_id = del_sta_self_req_param->session_id;
580 struct wma_txrx_node *iface = &wma_handle->interfaces[vdev_id];
581 struct wma_target_req *msg = NULL;
Leo Chang96464902016-10-28 11:10:54 -0700582 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800583
Nishank Aggarwala13b61d2016-12-01 12:53:58 +0530584 if (!soc) {
585 WMA_LOGE("%s:SOC context is NULL", __func__);
586 status = QDF_STATUS_E_FAILURE;
587 goto out;
588 }
589
Govind Singhd76a5b02016-03-08 15:12:14 +0530590 status = wmi_unified_vdev_delete_send(wma_handle->wmi_handle, vdev_id);
591 if (QDF_IS_STATUS_ERROR(status)) {
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800592 WMA_LOGE("Unable to remove an interface");
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800593 goto out;
594 }
595
Jeff Johnsonadba3962017-09-18 08:12:35 -0700596 WMA_LOGD("vdev_id:%hu vdev_hdl:%pK", vdev_id, iface->handle);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800597 if (!generate_rsp) {
598 WMA_LOGE("Call txrx detach w/o callback for vdev %d", vdev_id);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800599 goto out;
600 }
601
602 iface->del_staself_req = del_sta_self_req_param;
603 msg = wma_fill_vdev_req(wma_handle, vdev_id, WMA_DEL_STA_SELF_REQ,
604 WMA_TARGET_REQ_TYPE_VDEV_DEL, iface, 6000);
605 if (!msg) {
606 WMA_LOGE("%s: Failed to fill vdev request for vdev_id %d",
607 __func__, vdev_id);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530608 status = QDF_STATUS_E_NOMEM;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800609 goto out;
610 }
611
612 /* Acquire wake lock only when you expect a response from firmware */
Sourav Mohapatra89c85d12017-12-01 09:17:54 +0530613 if (wmi_service_enabled(wma_handle->wmi_handle,
614 wmi_service_sync_delete_cmds)) {
Dustin Brownec2c92e2017-07-26 11:13:49 -0700615 wma_acquire_wakelock(&wma_handle->wmi_cmd_rsp_wake_lock,
616 WMA_FW_RSP_EVENT_WAKE_LOCK_DURATION);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800617 }
618 WMA_LOGD("Call txrx detach with callback for vdev %d", vdev_id);
Jingxiang Gedf9292a2017-12-11 13:30:44 +0800619 wma_cdp_vdev_detach(soc, wma_handle, vdev_id);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800620
621 /*
622 * send the response immediately if WMI_SERVICE_SYNC_DELETE_CMDS
623 * service is not supported by firmware
624 */
Sourav Mohapatra89c85d12017-12-01 09:17:54 +0530625 if (!wmi_service_enabled(wma_handle->wmi_handle,
626 wmi_service_sync_delete_cmds))
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800627 wma_vdev_detach_callback(iface);
628 return status;
629out:
Jingxiang Gedf9292a2017-12-11 13:30:44 +0800630 WMA_LOGE("Call txrx detach callback for vdev %d, generate_rsp %u",
631 vdev_id, generate_rsp);
632 wma_cdp_vdev_detach(soc, wma_handle, vdev_id);
633
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800634 if (iface->addBssStaContext)
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530635 qdf_mem_free(iface->addBssStaContext);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800636 if (iface->staKeyParams)
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530637 qdf_mem_free(iface->staKeyParams);
Dustin Brown35b61f62017-08-31 16:03:32 -0700638
639 wma_vdev_deinit(iface);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530640 qdf_mem_zero(iface, sizeof(*iface));
Dustin Brown35b61f62017-08-31 16:03:32 -0700641 wma_vdev_init(iface);
642
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800643 del_sta_self_req_param->status = status;
Abhishek Singhc614ec42017-04-25 16:17:34 +0530644 if (generate_rsp)
645 wma_send_del_sta_self_resp(del_sta_self_req_param);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800646 return status;
647}
Jiachao Wu2c42c222018-01-15 18:13:19 +0800648
649/**
650 * wma_force_vdev_cleanup() - Cleanup vdev resource when SSR
651 * @wma_handle: WMA handle
652 * @vdev_id: vdev ID
653 *
654 * Return: none
655 */
656static void wma_force_vdev_cleanup(tp_wma_handle wma_handle, uint8_t vdev_id)
657{
658 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
659 struct wma_txrx_node *iface = &wma_handle->interfaces[vdev_id];
660
661 WMA_LOGE("SSR: force cleanup vdev(%d) resouce", vdev_id);
662 iface->vdev_active = false;
663 wma_cdp_vdev_detach(soc, wma_handle, vdev_id);
664}
665
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800666/**
667 * wma_vdev_detach() - send vdev delete command to fw
668 * @wma_handle: wma handle
669 * @pdel_sta_self_req_param: del sta params
670 * @generateRsp: generate Response flag
671 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +0530672 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800673 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530674QDF_STATUS wma_vdev_detach(tp_wma_handle wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800675 struct del_sta_self_params *pdel_sta_self_req_param,
676 uint8_t generateRsp)
677{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530678 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800679 uint8_t vdev_id = pdel_sta_self_req_param->session_id;
680 struct wma_txrx_node *iface = &wma_handle->interfaces[vdev_id];
Kiran Kumar Lokere35577652017-07-14 02:06:56 -0700681 struct wma_target_req *req_msg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800682
Jiachao Wu2c42c222018-01-15 18:13:19 +0800683 if (!iface->handle) {
684 WMA_LOGE("handle of vdev_id %d is NULL vdev is already freed",
685 vdev_id);
686 goto send_rsp;
687 }
688
689 /*
690 * In SSR case, there is no need to destroy vdev in firmware since
691 * it has already asserted.
692 */
693 if (cds_is_driver_recovering()) {
694 wma_force_vdev_cleanup(wma_handle, vdev_id);
695 goto send_rsp;
696 }
697
Anurag Chouhan8e0ccd32016-02-19 15:30:20 +0530698 if (qdf_atomic_read(&iface->bss_status) == WMA_BSS_STATUS_STARTED) {
Kiran Kumar Lokere35577652017-07-14 02:06:56 -0700699 req_msg = wma_find_vdev_req(wma_handle, vdev_id,
Kiran Kumar Lokere20804162017-07-17 16:09:04 -0700700 WMA_TARGET_REQ_TYPE_VDEV_STOP, false);
Kiran Kumar Lokere35577652017-07-14 02:06:56 -0700701 if (!req_msg)
702 goto send_fail_rsp;
703 if (req_msg->msg_type != WMA_DELETE_BSS_REQ)
704 goto send_fail_rsp;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800705 WMA_LOGA("BSS is not yet stopped. Defering vdev(vdev id %x) deletion",
706 vdev_id);
707 iface->del_staself_req = pdel_sta_self_req_param;
Abhishek Singh0d74f9e2017-09-26 14:02:42 +0530708 iface->is_del_sta_defered = true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800709 return status;
710 }
Abhishek Singh0d74f9e2017-09-26 14:02:42 +0530711 iface->is_del_sta_defered = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800712
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800713 /* P2P Device */
714 if ((iface->type == WMI_VDEV_TYPE_AP) &&
715 (iface->sub_type == WMI_UNIFIED_VDEV_SUBTYPE_P2P_DEVICE)) {
716 wma_self_peer_remove(wma_handle, pdel_sta_self_req_param,
717 generateRsp);
Sourav Mohapatra89c85d12017-12-01 09:17:54 +0530718 if (!wmi_service_enabled(wma_handle->wmi_handle,
719 wmi_service_sync_delete_cmds))
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800720 status = wma_handle_vdev_detach(wma_handle,
721 pdel_sta_self_req_param, generateRsp);
722 } else { /* other than P2P */
723 status = wma_handle_vdev_detach(wma_handle,
724 pdel_sta_self_req_param, generateRsp);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800725 }
726
Arif Hussain380cfc72017-10-31 13:12:04 -0700727 if (QDF_IS_STATUS_SUCCESS(status))
728 iface->vdev_active = false;
729
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800730 return status;
Kiran Kumar Lokere35577652017-07-14 02:06:56 -0700731
732send_fail_rsp:
Himanshu Agarwalfc4dab92017-12-28 21:46:29 +0530733 if (!cds_is_driver_recovering()) {
734 if (cds_is_self_recovery_enabled()) {
735 WMA_LOGE("rcvd del_self_sta without del_bss, trigger recovery, vdev_id %d",
736 vdev_id);
737 cds_trigger_recovery(QDF_REASON_UNSPECIFIED);
738 } else {
739 WMA_LOGE("rcvd del_self_sta without del_bss, BUG_ON(), vdev_id %d",
740 vdev_id);
741 QDF_BUG(0);
742 }
743 }
Jiachao Wu2c42c222018-01-15 18:13:19 +0800744 status = QDF_STATUS_E_FAILURE;
Himanshu Agarwalfc4dab92017-12-28 21:46:29 +0530745
Jiachao Wu2c42c222018-01-15 18:13:19 +0800746send_rsp:
747 if (generateRsp) {
748 pdel_sta_self_req_param->status = status;
749 wma_send_del_sta_self_resp(pdel_sta_self_req_param);
750 } else {
751 qdf_mem_free(pdel_sta_self_req_param);
752 pdel_sta_self_req_param = NULL;
753 }
Kiran Kumar Lokere35577652017-07-14 02:06:56 -0700754 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800755}
756
757/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800758 * wma_vdev_start_rsp() - send vdev start response to upper layer
759 * @wma: wma handle
760 * @add_bss: add bss params
761 * @resp_event: response params
762 *
763 * Return: none
764 */
765static void wma_vdev_start_rsp(tp_wma_handle wma,
766 tpAddBssParams add_bss,
767 wmi_vdev_start_response_event_fixed_param *
768 resp_event)
769{
770 struct beacon_info *bcn;
Padma, Santhosh Kumar88104612017-04-10 18:49:12 +0530771 struct cdp_pdev *pdev;
772 void *peer = NULL;
773 uint8_t peer_id;
774 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800775
776#ifdef QCA_IBSS_SUPPORT
777 WMA_LOGD("%s: vdev start response received for %s mode", __func__,
778 add_bss->operMode ==
779 BSS_OPERATIONAL_MODE_IBSS ? "IBSS" : "non-IBSS");
780#endif /* QCA_IBSS_SUPPORT */
781
782 if (resp_event->status) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530783 add_bss->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800784 goto send_fail_resp;
785 }
786
787 if ((add_bss->operMode == BSS_OPERATIONAL_MODE_AP)
788#ifdef QCA_IBSS_SUPPORT
789 || (add_bss->operMode == BSS_OPERATIONAL_MODE_IBSS)
790#endif /* QCA_IBSS_SUPPORT */
791 ) {
792 wma->interfaces[resp_event->vdev_id].beacon =
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530793 qdf_mem_malloc(sizeof(struct beacon_info));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800794
795 bcn = wma->interfaces[resp_event->vdev_id].beacon;
796 if (!bcn) {
797 WMA_LOGE("%s: Failed alloc memory for beacon struct",
798 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530799 add_bss->status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800800 goto send_fail_resp;
801 }
Nirav Shahcbc6d722016-03-01 16:24:53 +0530802 bcn->buf = qdf_nbuf_alloc(NULL, WMA_BCN_BUF_MAX_SIZE, 0,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800803 sizeof(uint32_t), 0);
804 if (!bcn->buf) {
805 WMA_LOGE("%s: No memory allocated for beacon buffer",
806 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530807 qdf_mem_free(bcn);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530808 add_bss->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800809 goto send_fail_resp;
810 }
811 bcn->seq_no = MIN_SW_SEQ;
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530812 qdf_spinlock_create(&bcn->lock);
Anurag Chouhan8e0ccd32016-02-19 15:30:20 +0530813 qdf_atomic_set(&wma->interfaces[resp_event->vdev_id].bss_status,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800814 WMA_BSS_STATUS_STARTED);
815 WMA_LOGD("%s: AP mode (type %d subtype %d) BSS is started",
816 __func__, wma->interfaces[resp_event->vdev_id].type,
817 wma->interfaces[resp_event->vdev_id].sub_type);
818
Jeff Johnsonadba3962017-09-18 08:12:35 -0700819 WMA_LOGD("%s: Allocated beacon struct %pK, template memory %pK",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800820 __func__, bcn, bcn->buf);
821 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530822 add_bss->status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800823 add_bss->bssIdx = resp_event->vdev_id;
824 add_bss->chainMask = resp_event->chain_mask;
825 if ((2 != resp_event->cfgd_rx_streams) ||
826 (2 != resp_event->cfgd_tx_streams)) {
827 add_bss->nss = 1;
828 }
829 add_bss->smpsMode = host_map_smps_mode(resp_event->smps_mode);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800830send_fail_resp:
Padma, Santhosh Kumar88104612017-04-10 18:49:12 +0530831 if (add_bss->status != QDF_STATUS_SUCCESS) {
832 WMA_LOGE("%s: ADD BSS failure %d", __func__, add_bss->status);
833
834 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
835 if (NULL == pdev)
836 WMA_LOGE("%s: Failed to get pdev", __func__);
837
838 if (pdev)
839 peer = cdp_peer_find_by_addr(soc, pdev,
840 add_bss->bssId, &peer_id);
841 if (!peer)
842 WMA_LOGE("%s Failed to find peer %pM", __func__,
843 add_bss->bssId);
844
845 if (peer)
846 wma_remove_peer(wma, add_bss->bssId,
847 resp_event->vdev_id, peer, false);
848 }
849
Abhishek Singh34c15642017-05-08 16:13:02 +0530850 /* Send vdev stop if vdev start was success */
851 if ((add_bss->status != QDF_STATUS_SUCCESS) &&
852 !resp_event->status)
853 if (wma_send_vdev_stop_to_fw(wma, resp_event->vdev_id))
854 WMA_LOGE("%s: %d Failed to send vdev stop", __func__, __LINE__);
855
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800856 WMA_LOGD("%s: Sending add bss rsp to umac(vdev %d status %d)",
857 __func__, resp_event->vdev_id, add_bss->status);
Abhishek Singh2d775fd2017-08-18 10:51:33 +0530858 wma_send_msg_high_priority(wma, WMA_ADD_BSS_RSP, (void *)add_bss, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800859}
860
861#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
862/**
863 * wma_find_mcc_ap() - finds if device is operating AP in MCC mode or not
864 * @wma: wma handle.
865 * @vdev_id: vdev ID of device for which MCC has to be checked
866 * @add: flag indicating if current device is added or deleted
867 *
868 * This function parses through all the interfaces in wma and finds if
869 * any of those devces are in MCC mode with AP. If such a vdev is found
870 * involved AP vdevs are sent WDA_UPDATE_Q2Q_IE_IND msg to update their
871 * beacon template to include Q2Q IE.
872 *
873 * Return: none
874 */
Tang Yingying523322d2017-01-17 23:28:43 +0800875static void wma_find_mcc_ap(tp_wma_handle wma, uint8_t vdev_id, bool add)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800876{
877 uint8_t i;
878 uint16_t prev_ch_freq = 0;
879 bool is_ap = false;
880 bool result = false;
881 uint8_t *ap_vdev_ids = NULL;
882 uint8_t num_ch = 0;
883
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530884 ap_vdev_ids = qdf_mem_malloc(wma->max_bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800885 if (!ap_vdev_ids)
886 return;
887
888 for (i = 0; i < wma->max_bssid; i++) {
889 ap_vdev_ids[i] = -1;
890 if (add == false && i == vdev_id)
891 continue;
892
Mukul Sharmaf9047232017-03-02 16:58:56 +0530893 if (wma_is_vdev_up(vdev_id) || (i == vdev_id && add)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800894 if (wma->interfaces[i].type == WMI_VDEV_TYPE_AP) {
895 is_ap = true;
896 ap_vdev_ids[i] = i;
897 }
898
899 if (wma->interfaces[i].mhz != prev_ch_freq) {
900 num_ch++;
901 prev_ch_freq = wma->interfaces[i].mhz;
902 }
903 }
904 }
905
906 if (is_ap && (num_ch > 1))
907 result = true;
908 else
909 result = false;
910
911 wma_send_msg(wma, WMA_UPDATE_Q2Q_IE_IND, (void *)ap_vdev_ids, result);
912}
913#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
914
Deepak Dhamdhered8455ce2016-11-02 13:11:55 -0700915static const wmi_channel_width mode_to_width[MODE_MAX] = {
916 [MODE_11A] = WMI_CHAN_WIDTH_20,
917 [MODE_11G] = WMI_CHAN_WIDTH_20,
918 [MODE_11B] = WMI_CHAN_WIDTH_20,
919 [MODE_11GONLY] = WMI_CHAN_WIDTH_20,
920 [MODE_11NA_HT20] = WMI_CHAN_WIDTH_20,
921 [MODE_11NG_HT20] = WMI_CHAN_WIDTH_20,
922 [MODE_11AC_VHT20] = WMI_CHAN_WIDTH_20,
923 [MODE_11AC_VHT20_2G] = WMI_CHAN_WIDTH_20,
924 [MODE_11NA_HT40] = WMI_CHAN_WIDTH_40,
925 [MODE_11NG_HT40] = WMI_CHAN_WIDTH_40,
926 [MODE_11AC_VHT40] = WMI_CHAN_WIDTH_40,
927 [MODE_11AC_VHT40_2G] = WMI_CHAN_WIDTH_40,
928 [MODE_11AC_VHT80] = WMI_CHAN_WIDTH_80,
929 [MODE_11AC_VHT80_2G] = WMI_CHAN_WIDTH_80,
930#if CONFIG_160MHZ_SUPPORT
931 [MODE_11AC_VHT80_80] = WMI_CHAN_WIDTH_80P80,
932 [MODE_11AC_VHT160] = WMI_CHAN_WIDTH_160,
933#endif
934
935#if SUPPORT_11AX
936 [MODE_11AX_HE20] = WMI_CHAN_WIDTH_20,
937 [MODE_11AX_HE40] = WMI_CHAN_WIDTH_40,
938 [MODE_11AX_HE80] = WMI_CHAN_WIDTH_80,
939 [MODE_11AX_HE80_80] = WMI_CHAN_WIDTH_80P80,
940 [MODE_11AX_HE160] = WMI_CHAN_WIDTH_160,
941 [MODE_11AX_HE20_2G] = WMI_CHAN_WIDTH_20,
942 [MODE_11AX_HE40_2G] = WMI_CHAN_WIDTH_40,
943 [MODE_11AX_HE80_2G] = WMI_CHAN_WIDTH_80,
944#endif
945};
946
947/**
948 * chanmode_to_chanwidth() - get channel width through channel mode
949 * @chanmode: channel phy mode
950 *
951 * Return: channel width
952 */
953static wmi_channel_width chanmode_to_chanwidth(WLAN_PHY_MODE chanmode)
954{
955 wmi_channel_width chan_width;
956
957 if (chanmode >= MODE_11A && chanmode < MODE_MAX)
958 chan_width = mode_to_width[chanmode];
959 else
960 chan_width = WMI_CHAN_WIDTH_20;
961
962 return chan_width;
963}
964
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800965/**
966 * wma_vdev_start_resp_handler() - vdev start response handler
967 * @handle: wma handle
968 * @cmd_param_info: event buffer
969 * @len: buffer length
970 *
971 * Return: 0 for success or error code
972 */
973int wma_vdev_start_resp_handler(void *handle, uint8_t *cmd_param_info,
974 uint32_t len)
975{
976 tp_wma_handle wma = (tp_wma_handle) handle;
977 WMI_VDEV_START_RESP_EVENTID_param_tlvs *param_buf;
978 wmi_vdev_start_response_event_fixed_param *resp_event;
979 struct wma_target_req *req_msg;
980 struct wma_txrx_node *iface;
Govind Singhd76a5b02016-03-08 15:12:14 +0530981 struct vdev_up_params param = {0};
982 QDF_STATUS status;
Deepak Dhamdhered8455ce2016-11-02 13:11:55 -0700983 int err;
984 wmi_channel_width chanwidth;
Govind Singhd76a5b02016-03-08 15:12:14 +0530985
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800986#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
Anurag Chouhan6d760662016-02-20 16:05:43 +0530987 tpAniSirGlobal mac_ctx = cds_get_context(QDF_MODULE_ID_PE);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700988
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800989 if (NULL == mac_ctx) {
990 WMA_LOGE("%s: Failed to get mac_ctx", __func__);
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -0700991 policy_mgr_set_do_hw_mode_change_flag(
992 wma->psoc, false);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800993 return -EINVAL;
994 }
995#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
996
997 WMA_LOGD("%s: Enter", __func__);
Dustin Brown3e619822017-03-17 10:41:56 -0700998
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800999 param_buf = (WMI_VDEV_START_RESP_EVENTID_param_tlvs *) cmd_param_info;
1000 if (!param_buf) {
1001 WMA_LOGE("Invalid start response event buffer");
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07001002 policy_mgr_set_do_hw_mode_change_flag(
1003 wma->psoc, false);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001004 return -EINVAL;
1005 }
1006
1007 resp_event = param_buf->fixed_param;
1008 if (!resp_event) {
1009 WMA_LOGE("Invalid start response event buffer");
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07001010 policy_mgr_set_do_hw_mode_change_flag(
1011 wma->psoc, false);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001012 return -EINVAL;
1013 }
1014
Himanshu Agarwaldfca3d82017-10-06 12:40:27 +05301015 if (resp_event->vdev_id >= wma->max_bssid) {
1016 WMA_LOGE("Invalid vdev id received from firmware");
1017 return -EINVAL;
1018 }
1019
bings1f98e9f2018-01-24 16:13:41 +08001020 if (wma_is_vdev_in_ap_mode(wma, resp_event->vdev_id))
1021 tgt_dfs_radar_enable(wma->pdev, 0, 0);
1022
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301023 if (resp_event->status == QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001024 wma->interfaces[resp_event->vdev_id].tx_streams =
1025 resp_event->cfgd_tx_streams;
1026 wma->interfaces[resp_event->vdev_id].rx_streams =
1027 resp_event->cfgd_rx_streams;
1028 wma->interfaces[resp_event->vdev_id].chain_mask =
1029 resp_event->chain_mask;
Govind Singhefc5ccd2016-04-25 11:11:55 +05301030 if (wma->wlan_resource_config.use_pdev_id) {
1031 if (resp_event->pdev_id == WMI_PDEV_ID_SOC) {
1032 WMA_LOGE("%s: soc level id received for mac id",
1033 __func__);
1034 QDF_BUG(0);
1035 return -EINVAL;
1036 }
1037 wma->interfaces[resp_event->vdev_id].mac_id =
1038 WMA_PDEV_TO_MAC_MAP(resp_event->pdev_id);
1039 } else {
1040 wma->interfaces[resp_event->vdev_id].mac_id =
1041 resp_event->mac_id;
1042 }
1043
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07001044 WMA_LOGD("%s: vdev:%d tx ss=%d rx ss=%d chain mask=%d mac=%d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001045 __func__,
1046 resp_event->vdev_id,
1047 wma->interfaces[resp_event->vdev_id].tx_streams,
1048 wma->interfaces[resp_event->vdev_id].rx_streams,
1049 wma->interfaces[resp_event->vdev_id].chain_mask,
1050 wma->interfaces[resp_event->vdev_id].mac_id);
1051 }
1052
Selvaraj, Sridhara0083c42016-06-22 22:15:43 +05301053 iface = &wma->interfaces[resp_event->vdev_id];
1054
Kiran Kumar Lokere5798bfa2017-04-27 20:49:39 -07001055 req_msg = wma_find_vdev_req(wma, resp_event->vdev_id,
Kiran Kumar Lokere20804162017-07-17 16:09:04 -07001056 WMA_TARGET_REQ_TYPE_VDEV_START,
1057 true);
Kiran Kumar Lokere5798bfa2017-04-27 20:49:39 -07001058
1059 if (!req_msg) {
1060 WMA_LOGE("%s: Failed to lookup request message for vdev %d",
1061 __func__, resp_event->vdev_id);
1062 policy_mgr_set_do_hw_mode_change_flag(wma->psoc, false);
1063 return -EINVAL;
1064 }
1065
Naveen Rawatf2bd42d2017-06-29 14:51:43 -07001066 if ((resp_event->vdev_id < wma->max_bssid) &&
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001067 (qdf_atomic_read(
1068 &wma->interfaces[resp_event->vdev_id].vdev_restart_params.hidden_ssid_restart_in_progress))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001069 && (wma_is_vdev_in_ap_mode(wma, resp_event->vdev_id) == true)) {
Kiran Kumar Lokere5798bfa2017-04-27 20:49:39 -07001070 tpHalHiddenSsidVdevRestart hidden_ssid_restart =
1071 (tpHalHiddenSsidVdevRestart)req_msg->user_data;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001072 WMA_LOGE("%s: vdev restart event recevied for hidden ssid set using IOCTL",
1073 __func__);
1074
Govind Singhd76a5b02016-03-08 15:12:14 +05301075 param.vdev_id = resp_event->vdev_id;
1076 param.assoc_id = 0;
Anurag Chouhan8e0ccd32016-02-19 15:30:20 +05301077 qdf_atomic_set(&wma->interfaces[resp_event->vdev_id].
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001078 vdev_restart_params.
1079 hidden_ssid_restart_in_progress, 0);
Kiran Kumar Lokere5798bfa2017-04-27 20:49:39 -07001080
1081 wma_send_msg(wma, WMA_HIDDEN_SSID_RESTART_RSP,
1082 (void *)hidden_ssid_restart, 0);
Selvaraj, Sridhara0083c42016-06-22 22:15:43 +05301083 /*
1084 * Unpause TX queue in SAP case while configuring hidden ssid
1085 * enable or disable, else the data path is paused forever
1086 * causing data packets(starting from DHCP offer) to get stuck
1087 */
Leo Chang96464902016-10-28 11:10:54 -07001088 cdp_fc_vdev_unpause(cds_get_context(QDF_MODULE_ID_SOC),
1089 iface->handle,
Selvaraj, Sridhara0083c42016-06-22 22:15:43 +05301090 OL_TXQ_PAUSE_REASON_VDEV_STOP);
Mukul Sharma6411bb82017-03-01 15:57:07 +05301091 wma_vdev_clear_pause_bit(resp_event->vdev_id, PAUSE_TYPE_HOST);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001092 }
1093
Anurag Chouhan210db072016-02-22 18:42:15 +05301094 qdf_mc_timer_stop(&req_msg->event_timeout);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001095
1096#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301097 if (resp_event->status == QDF_STATUS_SUCCESS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001098 && mac_ctx->sap.sap_channel_avoidance)
1099 wma_find_mcc_ap(wma, resp_event->vdev_id, true);
1100#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
1101
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001102 if (req_msg->msg_type == WMA_CHNL_SWITCH_REQ) {
1103 tpSwitchChannelParams params =
1104 (tpSwitchChannelParams) req_msg->user_data;
1105 if (!params) {
1106 WMA_LOGE("%s: channel switch params is NULL for vdev %d",
1107 __func__, resp_event->vdev_id);
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07001108 policy_mgr_set_do_hw_mode_change_flag(
1109 wma->psoc, false);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001110 return -EINVAL;
1111 }
1112
1113 WMA_LOGD("%s: Send channel switch resp vdev %d status %d",
1114 __func__, resp_event->vdev_id, resp_event->status);
1115 params->chainMask = resp_event->chain_mask;
1116 if ((2 != resp_event->cfgd_rx_streams) ||
1117 (2 != resp_event->cfgd_tx_streams)) {
1118 params->nss = 1;
1119 }
1120 params->smpsMode = host_map_smps_mode(resp_event->smps_mode);
1121 params->status = resp_event->status;
Agrawal Ashish7dd7c592016-02-22 14:25:11 +05301122 if (wma->interfaces[resp_event->vdev_id].is_channel_switch) {
1123 wma->interfaces[resp_event->vdev_id].is_channel_switch =
1124 false;
1125 }
Manjunathappa Prakash0e6e6b52016-04-21 11:48:48 -07001126 if (((resp_event->resp_type == WMI_VDEV_RESTART_RESP_EVENT) &&
Agrawal Ashish7dd7c592016-02-22 14:25:11 +05301127 (iface->type == WMI_VDEV_TYPE_STA)) ||
1128 ((resp_event->resp_type == WMI_VDEV_START_RESP_EVENT) &&
1129 (iface->type == WMI_VDEV_TYPE_MONITOR))) {
Deepak Dhamdhered8455ce2016-11-02 13:11:55 -07001130 err = wma_set_peer_param(wma, iface->bssid,
1131 WMI_PEER_PHYMODE, iface->chanmode,
1132 resp_event->vdev_id);
1133
1134 WMA_LOGD("%s:vdev_id %d chanmode %d status %d",
1135 __func__, resp_event->vdev_id,
1136 iface->chanmode, err);
1137
1138 chanwidth = chanmode_to_chanwidth(iface->chanmode);
1139 err = wma_set_peer_param(wma, iface->bssid,
1140 WMI_PEER_CHWIDTH, chanwidth,
1141 resp_event->vdev_id);
1142
1143 WMA_LOGD("%s:vdev_id %d chanwidth %d status %d",
1144 __func__, resp_event->vdev_id,
1145 chanwidth, err);
1146
Govind Singhd76a5b02016-03-08 15:12:14 +05301147 param.vdev_id = resp_event->vdev_id;
1148 param.assoc_id = iface->aid;
Dustin Brownec2c92e2017-07-26 11:13:49 -07001149 status = wma_send_vdev_up_to_fw(wma, &param,
1150 iface->bssid);
Govind Singhd76a5b02016-03-08 15:12:14 +05301151 if (QDF_IS_STATUS_ERROR(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001152 WMA_LOGE("%s:vdev_up failed vdev_id %d",
1153 __func__, resp_event->vdev_id);
Mukul Sharmaf9047232017-03-02 16:58:56 +05301154 wma_vdev_set_mlme_state(wma,
1155 resp_event->vdev_id, WLAN_VDEV_S_STOP);
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07001156 policy_mgr_set_do_hw_mode_change_flag(
1157 wma->psoc, false);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001158 } else {
Mukul Sharmaf9047232017-03-02 16:58:56 +05301159 wma_vdev_set_mlme_state(wma,
1160 resp_event->vdev_id, WLAN_VDEV_S_RUN);
Kiran Kumar Lokeref9dc7912017-06-28 18:10:58 -07001161 if (iface->beacon_filter_enabled)
1162 wma_add_beacon_filter(wma,
1163 &iface->beacon_filter);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001164 }
1165 }
1166
Abhishek Singh2d775fd2017-08-18 10:51:33 +05301167 wma_send_msg_high_priority(wma, WMA_SWITCH_CHANNEL_RSP,
1168 (void *)params, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001169 } else if (req_msg->msg_type == WMA_ADD_BSS_REQ) {
1170 tpAddBssParams bssParams = (tpAddBssParams) req_msg->user_data;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001171
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301172 qdf_mem_copy(iface->bssid, bssParams->bssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001173 IEEE80211_ADDR_LEN);
1174 wma_vdev_start_rsp(wma, bssParams, resp_event);
1175 } else if (req_msg->msg_type == WMA_OCB_SET_CONFIG_CMD) {
Govind Singhd76a5b02016-03-08 15:12:14 +05301176 param.vdev_id = resp_event->vdev_id;
1177 param.assoc_id = iface->aid;
Dustin Brownec2c92e2017-07-26 11:13:49 -07001178 if (wma_send_vdev_up_to_fw(wma, &param, iface->bssid) !=
1179 QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001180 WMA_LOGE(FL("failed to send vdev up"));
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07001181 policy_mgr_set_do_hw_mode_change_flag(
1182 wma->psoc, false);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001183 return -EEXIST;
1184 }
Mukul Sharmaf9047232017-03-02 16:58:56 +05301185 wma_vdev_set_mlme_state(wma, resp_event->vdev_id,
1186 WLAN_VDEV_S_RUN);
Zhang Qian47e22ce2018-01-04 15:38:38 +08001187 ucfg_ocb_config_channel(wma->pdev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001188 }
1189
1190 if ((wma->interfaces[resp_event->vdev_id].type == WMI_VDEV_TYPE_AP) &&
Mukul Sharmaf9047232017-03-02 16:58:56 +05301191 wma_is_vdev_up(resp_event->vdev_id))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001192 wma_set_sap_keepalive(wma, resp_event->vdev_id);
1193
Anurag Chouhan210db072016-02-22 18:42:15 +05301194 qdf_mc_timer_destroy(&req_msg->event_timeout);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301195 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001196
1197 return 0;
1198}
1199
Yeshwanth Sriram Guntukad5aae7f2017-11-27 14:33:51 +05301200bool wma_is_vdev_valid(uint32_t vdev_id)
Rajeev Kumard9a43cf2017-07-19 14:55:42 -07001201{
1202 tp_wma_handle wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
1203
Arif Hussain380cfc72017-10-31 13:12:04 -07001204 if (!wma_handle) {
1205 WMA_LOGD("%s: vdev_id: %d, null wma_handle", __func__, vdev_id);
Rajeev Kumard9a43cf2017-07-19 14:55:42 -07001206 return false;
Arif Hussain380cfc72017-10-31 13:12:04 -07001207 }
Rajeev Kumard9a43cf2017-07-19 14:55:42 -07001208
Vignesh Viswanathan9fa8fef2017-12-12 14:45:38 +05301209 /* No of interface are allocated based on max_bssid value */
1210 if (vdev_id >= wma_handle->max_bssid) {
1211 WMA_LOGD("%s: vdev_id: %d is invalid, max_bssid: %d",
1212 __func__, vdev_id, wma_handle->max_bssid);
1213 return false;
1214 }
1215
Arif Hussain380cfc72017-10-31 13:12:04 -07001216 WMA_LOGD("%s: vdev_id: %d, vdev_active: %d, is_vdev_valid %d",
1217 __func__, vdev_id, wma_handle->interfaces[vdev_id].vdev_active,
1218 wma_handle->interfaces[vdev_id].is_vdev_valid);
1219
1220 return wma_handle->interfaces[vdev_id].vdev_active ||
1221 wma_handle->interfaces[vdev_id].is_vdev_valid;
Rajeev Kumard9a43cf2017-07-19 14:55:42 -07001222}
1223
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001224/**
Govind Singhd76a5b02016-03-08 15:12:14 +05301225 * wma_vdev_set_param() - set per vdev params in fw
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001226 * @wmi_handle: wmi handle
1227 * @if_if: vdev id
1228 * @param_id: parameter id
1229 * @param_value: parameter value
1230 *
Govind Singhd76a5b02016-03-08 15:12:14 +05301231 * Return: QDF_STATUS_SUCCESS for success or error code
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001232 */
Govind Singhd76a5b02016-03-08 15:12:14 +05301233QDF_STATUS
1234wma_vdev_set_param(wmi_unified_t wmi_handle, uint32_t if_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001235 uint32_t param_id, uint32_t param_value)
1236{
Govind Singhd76a5b02016-03-08 15:12:14 +05301237 struct vdev_set_params param = {0};
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001238
Rajeev Kumard9a43cf2017-07-19 14:55:42 -07001239 if (!wma_is_vdev_valid(if_id)) {
1240 WMA_LOGE(FL("vdev_id: %d is not active reject the req: param id %d val %d"),
1241 if_id, param_id, param_value);
Rajeev Kumard9a43cf2017-07-19 14:55:42 -07001242 return QDF_STATUS_E_INVAL;
1243 }
1244
Govind Singhd76a5b02016-03-08 15:12:14 +05301245 param.if_id = if_id;
1246 param.param_id = param_id;
1247 param.param_value = param_value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001248
Govind Singhd76a5b02016-03-08 15:12:14 +05301249 return wmi_unified_vdev_set_param_send(wmi_handle, &param);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001250}
1251
1252/**
1253 * wma_set_peer_authorized_cb() - set peer authorized callback function
1254 * @wma_Ctx: wma handle
1255 * @auth_cb: peer authorized callback
1256 *
1257 * Return: none
1258 */
1259void wma_set_peer_authorized_cb(void *wma_ctx, wma_peer_authorized_fp auth_cb)
1260{
1261 tp_wma_handle wma_handle = (tp_wma_handle) wma_ctx;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001262
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001263 wma_handle->peer_authorized_cb = auth_cb;
1264}
1265
1266/**
1267 * wma_set_peer_param() - set peer parameter in fw
1268 * @wma_ctx: wma handle
1269 * @peer_addr: peer mac address
1270 * @param_id: parameter id
1271 * @param_value: parameter value
1272 * @vdev_id: vdev id
1273 *
Govind Singhd76a5b02016-03-08 15:12:14 +05301274 * Return: QDF_STATUS_SUCCESS for success or error code
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001275 */
Govind Singhd76a5b02016-03-08 15:12:14 +05301276QDF_STATUS wma_set_peer_param(void *wma_ctx, uint8_t *peer_addr,
1277 uint32_t param_id, uint32_t param_value,
1278 uint32_t vdev_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001279{
1280 tp_wma_handle wma_handle = (tp_wma_handle) wma_ctx;
Govind Singhd76a5b02016-03-08 15:12:14 +05301281 struct peer_set_params param = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001282 int err;
1283
Govind Singhd76a5b02016-03-08 15:12:14 +05301284 param.vdev_id = vdev_id;
1285 param.param_value = param_value;
1286 param.param_id = param_id;
1287
1288 err = wmi_set_peer_param_send(wma_handle->wmi_handle, peer_addr,
1289 &param);
1290
1291 return err;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001292}
1293
1294/**
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07001295 * wma_remove_peer() - remove peer information from host driver and fw
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001296 * @wma: wma handle
1297 * @bssid: mac address
1298 * @vdev_id: vdev id
1299 * @peer: peer ptr
1300 * @roam_synch_in_progress: roam in progress flag
1301 *
1302 * Return: none
1303 */
1304void wma_remove_peer(tp_wma_handle wma, uint8_t *bssid,
Leo Chang96464902016-10-28 11:10:54 -07001305 uint8_t vdev_id, void *peer,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001306 bool roam_synch_in_progress)
1307{
1308#define PEER_ALL_TID_BITMASK 0xffffffff
1309 uint32_t peer_tid_bitmap = PEER_ALL_TID_BITMASK;
1310 uint8_t *peer_addr = bssid;
Govind Singhd76a5b02016-03-08 15:12:14 +05301311 struct peer_flush_params param = {0};
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07001312 uint8_t *peer_mac_addr;
Leo Chang96464902016-10-28 11:10:54 -07001313 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Naveen Rawatf4ada152017-09-05 14:56:12 -07001314 QDF_STATUS qdf_status;
Lin Bai973e6922018-01-08 17:59:19 +08001315 uint32_t bitmap = 1 << CDP_PEER_DELETE_NO_SPECIAL;
Govind Singhd76a5b02016-03-08 15:12:14 +05301316
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001317 if (!wma->interfaces[vdev_id].peer_count) {
1318 WMA_LOGE("%s: Can't remove peer with peer_addr %pM vdevid %d peer_count %d",
1319 __func__, bssid, vdev_id,
1320 wma->interfaces[vdev_id].peer_count);
1321 return;
1322 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001323
Nishank Aggarwala13b61d2016-12-01 12:53:58 +05301324 if (!soc) {
1325 WMA_LOGE("%s:SOC context is NULL", __func__);
1326 return;
1327 }
1328
Leo Chang96464902016-10-28 11:10:54 -07001329 peer_mac_addr = cdp_peer_get_peer_mac_addr(soc, peer);
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07001330 if (peer_mac_addr == NULL) {
1331 WMA_LOGE("%s: peer mac addr is NULL, Can't remove peer with peer_addr %pM vdevid %d peer_count %d",
1332 __func__, bssid, vdev_id,
1333 wma->interfaces[vdev_id].peer_count);
1334 return;
1335 }
1336
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001337 if (roam_synch_in_progress)
jge6435f4f2017-01-09 11:35:45 +08001338 goto peer_detach;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001339 /* Flush all TIDs except MGMT TID for this peer in Target */
1340 peer_tid_bitmap &= ~(0x1 << WMI_MGMT_TID);
Govind Singhd76a5b02016-03-08 15:12:14 +05301341 param.peer_tid_bitmap = peer_tid_bitmap;
1342 param.vdev_id = vdev_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001343 wmi_unified_peer_flush_tids_send(wma->wmi_handle, bssid,
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07001344 &param);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001345
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07001346 if (wma_is_vdev_in_ibss_mode(wma, vdev_id)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001347 WMA_LOGD("%s: bssid %pM peer->mac_addr %pM", __func__,
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07001348 bssid, peer_mac_addr);
1349 peer_addr = peer_mac_addr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001350 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001351
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001352 /* peer->ref_cnt is not visible in WMA */
1353 wlan_roam_debug_log(vdev_id, DEBUG_PEER_DELETE_SEND,
1354 DEBUG_INVALID_PEER_ID, peer_addr, peer,
1355 0, 0);
Naveen Rawatf4ada152017-09-05 14:56:12 -07001356 qdf_status = wmi_unified_peer_delete_send(wma->wmi_handle, peer_addr,
1357 vdev_id);
1358 if (QDF_IS_STATUS_ERROR(qdf_status)) {
1359 WMA_LOGE("%s Peer delete could not be sent to firmware %d",
1360 __func__, qdf_status);
Lin Bai973e6922018-01-08 17:59:19 +08001361 /* Clear default bit and set to NOT_START_UNMAP */
1362 bitmap = 1 << CDP_PEER_DO_NOT_START_UNMAP_TIMER;
Naveen Rawatf4ada152017-09-05 14:56:12 -07001363 }
jge6435f4f2017-01-09 11:35:45 +08001364
1365peer_detach:
Jeff Johnsonadba3962017-09-18 08:12:35 -07001366 WMA_LOGE("%s: Remove peer %pK with peer_addr %pM vdevid %d peer_count %d",
Deepak Dhamdhere137b54e2017-01-24 01:05:43 -08001367 __func__, peer, bssid, vdev_id,
1368 wma->interfaces[vdev_id].peer_count);
1369
jge6435f4f2017-01-09 11:35:45 +08001370 if (peer) {
1371 if (roam_synch_in_progress)
1372 cdp_peer_detach_force_delete(soc, peer);
1373 else
Naveen Rawatf4ada152017-09-05 14:56:12 -07001374 cdp_peer_delete(soc, peer, bitmap);
jge6435f4f2017-01-09 11:35:45 +08001375 }
1376
1377 wma->interfaces[vdev_id].peer_count--;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001378#undef PEER_ALL_TID_BITMASK
1379}
1380
1381/**
Abhishek Singh32517ed2017-05-29 14:25:14 +05301382 * wma_find_duplicate_peer_on_other_vdev() - Find if same peer exist
1383 * on other vdevs
1384 * @wma: wma handle
1385 * @pdev: txrx pdev ptr
1386 * @vdev_id: vdev id of vdev on which the peer
1387 * needs to be added
1388 * @peer_mac: peer mac addr which needs to be added
1389 *
1390 * Check if peer with same MAC is present on vdev other then
1391 * the provided vdev_id
1392 *
1393 * Return: true if same peer is present on vdev other then vdev_id
1394 * else return false
1395 */
1396static bool wma_find_duplicate_peer_on_other_vdev(tp_wma_handle wma,
1397 struct cdp_pdev *pdev, uint8_t vdev_id, uint8_t *peer_mac)
1398{
1399 int i;
1400 uint8_t peer_id;
1401 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
1402
1403 for (i = 0; i < wma->max_bssid; i++) {
1404 /* Need to check vdevs other than the vdev_id */
1405 if (vdev_id == i ||
1406 !wma->interfaces[i].handle)
1407 continue;
1408 if (cdp_peer_find_by_addr_and_vdev(soc, pdev,
1409 wma->interfaces[i].handle, peer_mac, &peer_id)) {
1410 WMA_LOGE("%s :Duplicate peer %pM (peer id %d) already exist on vdev %d",
1411 __func__, peer_mac, peer_id, i);
1412 return true;
1413 }
1414 }
1415 return false;
1416}
1417
1418/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001419 * wma_create_peer() - send peer create command to fw
1420 * @wma: wma handle
1421 * @pdev: txrx pdev ptr
1422 * @vdev: txrx vdev ptr
1423 * @peer_addr: peer mac addr
1424 * @peer_type: peer type
1425 * @vdev_id: vdev id
1426 * @roam_synch_in_progress: roam in progress
1427 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301428 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001429 */
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08001430QDF_STATUS wma_create_peer(tp_wma_handle wma, struct cdp_pdev *pdev,
1431 struct cdp_vdev *vdev,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001432 u8 peer_addr[IEEE80211_ADDR_LEN],
1433 uint32_t peer_type, uint8_t vdev_id,
1434 bool roam_synch_in_progress)
1435{
Leo Chang96464902016-10-28 11:10:54 -07001436 void *peer = NULL;
Govind Singhd76a5b02016-03-08 15:12:14 +05301437 struct peer_create_params param = {0};
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07001438 uint8_t *mac_addr_raw;
Leo Chang96464902016-10-28 11:10:54 -07001439 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001440
Abhishek Singh32517ed2017-05-29 14:25:14 +05301441
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001442 if (++wma->interfaces[vdev_id].peer_count >
1443 wma->wlan_resource_config.num_peers) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07001444 WMA_LOGE("%s, the peer count exceeds the limit %d", __func__,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001445 wma->interfaces[vdev_id].peer_count - 1);
1446 goto err;
1447 }
Deepak Dhamdherec47cfe82016-08-22 01:00:13 -07001448
Nishank Aggarwala13b61d2016-12-01 12:53:58 +05301449 if (!soc) {
1450 WMA_LOGE("%s:SOC context is NULL", __func__);
1451 goto err;
1452 }
1453
Abhishek Singh32517ed2017-05-29 14:25:14 +05301454 /*
1455 * Check if peer with same MAC exist on other Vdev, If so avoid
1456 * adding this peer, as it will cause FW to crash.
1457 */
1458 if (wma_find_duplicate_peer_on_other_vdev(wma, pdev,
1459 vdev_id, peer_addr))
1460 goto err;
1461
Dhanashri Atre272fd232016-11-10 16:20:46 -08001462 /* The peer object should be created before sending the WMI peer
1463 * create command to firmware. This is to prevent a race condition
1464 * where the HTT peer map event is received before the peer object
1465 * is created in the data path
1466 */
1467 peer = cdp_peer_create(soc, vdev, peer_addr);
1468 if (!peer) {
1469 WMA_LOGE("%s : Unable to attach peer %pM", __func__, peer_addr);
1470 goto err;
1471 }
1472
Deepak Dhamdheref74d6f82016-09-16 02:47:01 -07001473 if (roam_synch_in_progress) {
Jeff Johnsonadba3962017-09-18 08:12:35 -07001474 WMA_LOGI("%s: LFR3: Created peer %pK with peer_addr %pM vdev_id %d, peer_count - %d",
Mohit Khanna3aee1312016-07-28 19:07:05 -07001475 __func__, peer, peer_addr, vdev_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001476 wma->interfaces[vdev_id].peer_count);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301477 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001478 }
Govind Singhd76a5b02016-03-08 15:12:14 +05301479 param.peer_addr = peer_addr;
1480 param.peer_type = peer_type;
1481 param.vdev_id = vdev_id;
1482 if (wmi_unified_peer_create_send(wma->wmi_handle,
1483 &param) != QDF_STATUS_SUCCESS) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07001484 WMA_LOGE("%s : Unable to create peer in Target", __func__);
Lin Bai973e6922018-01-08 17:59:19 +08001485 cdp_peer_delete(soc, peer,
1486 1 << CDP_PEER_DO_NOT_START_UNMAP_TIMER);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001487 goto err;
1488 }
Dhanashri Atre272fd232016-11-10 16:20:46 -08001489
Jeff Johnsonadba3962017-09-18 08:12:35 -07001490 WMA_LOGD("%s: Created peer %pK with peer_addr %pM vdev_id %d, peer_count - %d",
Leo Chang96464902016-10-28 11:10:54 -07001491 __func__, peer, peer_addr, vdev_id,
Mohit Khanna3aee1312016-07-28 19:07:05 -07001492 wma->interfaces[vdev_id].peer_count);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001493
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001494 wlan_roam_debug_log(vdev_id, DEBUG_PEER_CREATE_SEND,
1495 DEBUG_INVALID_PEER_ID, peer_addr, peer, 0, 0);
Dhanashri Atre272fd232016-11-10 16:20:46 -08001496 cdp_peer_setup(soc, vdev, peer);
1497
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07001498 WMA_LOGD("%s: Initialized peer with peer_addr %pM vdev_id %d",
Dhanashri Atre272fd232016-11-10 16:20:46 -08001499 __func__, peer_addr, vdev_id);
1500
Leo Chang96464902016-10-28 11:10:54 -07001501 mac_addr_raw = cdp_get_vdev_mac_addr(soc, vdev);
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07001502 if (mac_addr_raw == NULL) {
1503 WMA_LOGE("%s: peer mac addr is NULL", __func__);
1504 return QDF_STATUS_E_FAULT;
1505 }
1506
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001507 /* for each remote ibss peer, clear its keys */
1508 if (wma_is_vdev_in_ibss_mode(wma, vdev_id) &&
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07001509 qdf_mem_cmp(peer_addr, mac_addr_raw, IEEE80211_ADDR_LEN)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001510 tSetStaKeyParams key_info;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001511
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001512 WMA_LOGD("%s: remote ibss peer %pM key clearing\n", __func__,
1513 peer_addr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301514 qdf_mem_set(&key_info, sizeof(key_info), 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001515 key_info.smesessionId = vdev_id;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301516 qdf_mem_copy(key_info.peer_macaddr.bytes, peer_addr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001517 IEEE80211_ADDR_LEN);
1518 key_info.sendRsp = false;
1519
1520 wma_set_stakey(wma, &key_info);
1521 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001522
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301523 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001524err:
1525 wma->interfaces[vdev_id].peer_count--;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301526 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001527}
1528
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001529/**
1530 * wma_hidden_ssid_vdev_restart_on_vdev_stop() - restart vdev to set hidden ssid
1531 * @wma_handle: wma handle
1532 * @sessionId: session id
1533 *
1534 * Return: none
1535 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07001536static void wma_hidden_ssid_vdev_restart_on_vdev_stop(tp_wma_handle wma_handle,
1537 uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001538{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001539 struct wma_txrx_node *intr = wma_handle->interfaces;
Siddarth Poddar17dc4712016-03-09 16:30:27 +05301540 struct hidden_ssid_vdev_restart_params params;
1541 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001542
Siddarth Poddar17dc4712016-03-09 16:30:27 +05301543 params.session_id = sessionId;
1544 params.ssid_len = intr[sessionId].vdev_restart_params.ssid.ssid_len;
1545 qdf_mem_copy(params.ssid,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001546 intr[sessionId].vdev_restart_params.ssid.ssid,
Siddarth Poddar17dc4712016-03-09 16:30:27 +05301547 params.ssid_len);
1548 params.flags = intr[sessionId].vdev_restart_params.flags;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001549 if (intr[sessionId].vdev_restart_params.ssidHidden)
Siddarth Poddar17dc4712016-03-09 16:30:27 +05301550 params.flags |= WMI_UNIFIED_VDEV_START_HIDDEN_SSID;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001551 else
Siddarth Poddar17dc4712016-03-09 16:30:27 +05301552 params.flags &= (0xFFFFFFFE);
1553 params.requestor_id = intr[sessionId].vdev_restart_params.requestor_id;
1554 params.disable_hw_ack =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001555 intr[sessionId].vdev_restart_params.disable_hw_ack;
1556
Siddarth Poddar17dc4712016-03-09 16:30:27 +05301557 params.mhz = intr[sessionId].vdev_restart_params.chan.mhz;
1558 params.band_center_freq1 =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001559 intr[sessionId].vdev_restart_params.chan.band_center_freq1;
Siddarth Poddar17dc4712016-03-09 16:30:27 +05301560 params.band_center_freq2 =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001561 intr[sessionId].vdev_restart_params.chan.band_center_freq2;
Siddarth Poddar17dc4712016-03-09 16:30:27 +05301562 params.info = intr[sessionId].vdev_restart_params.chan.info;
1563 params.reg_info_1 = intr[sessionId].vdev_restart_params.chan.reg_info_1;
1564 params.reg_info_2 = intr[sessionId].vdev_restart_params.chan.reg_info_2;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001565
Siddarth Poddar17dc4712016-03-09 16:30:27 +05301566 status = wmi_unified_hidden_ssid_vdev_restart_send(
1567 wma_handle->wmi_handle, &params);
1568 if (status == QDF_STATUS_E_FAILURE) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001569 WMA_LOGE("%s: Failed to send vdev restart command", __func__);
Anurag Chouhan8e0ccd32016-02-19 15:30:20 +05301570 qdf_atomic_set(&intr[sessionId].vdev_restart_params.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001571 hidden_ssid_restart_in_progress, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001572 }
1573}
1574
1575/**
Liangwei Dong748cb5d2016-09-29 00:56:40 -04001576 * wma_cleanup_target_req_param() - free param memory of target request
1577 * @tgt_req: target request params
1578 *
1579 * Return: none
1580 */
1581static void wma_cleanup_target_req_param(struct wma_target_req *tgt_req)
1582{
1583 if (tgt_req->msg_type == WMA_CHNL_SWITCH_REQ ||
1584 tgt_req->msg_type == WMA_DELETE_BSS_REQ ||
1585 tgt_req->msg_type == WMA_ADD_BSS_REQ) {
1586 qdf_mem_free(tgt_req->user_data);
1587 tgt_req->user_data = NULL;
1588 }
Krishna Kumaar Natarajanfc8c3632017-05-24 17:09:40 -07001589
1590 if (tgt_req->msg_type == WMA_SET_LINK_STATE && tgt_req->user_data) {
1591 tpLinkStateParams params =
1592 (tpLinkStateParams) tgt_req->user_data;
1593 qdf_mem_free(params->callbackArg);
1594 qdf_mem_free(tgt_req->user_data);
1595 tgt_req->user_data = NULL;
1596 }
Liangwei Dong748cb5d2016-09-29 00:56:40 -04001597}
1598
1599/**
Krishna Kumaar Natarajanf24bfc82017-02-07 11:54:05 -08001600 * wma_remove_bss_peer() - remove BSS peer
1601 * @wma: pointer to WMA handle
1602 * @pdev: pointer to PDEV
1603 * @req_msg: pointer to WMA target Request
1604 * @vdev_id: vdev id on which delete BSS request was received
1605 * @params: pointer to Delete BSS params
1606 *
1607 * This function is called on receiving vdev stop response from FW or
1608 * vdev stop response timeout. In case of IBSS/NDI, use vdev's self MAC
1609 * for removing the peer. In case of STA/SAP use bssid passed as part of
1610 * delete STA parameter.
1611 *
1612 * Return: 0 on success, ERROR code on failure
1613 */
1614static int wma_remove_bss_peer(tp_wma_handle wma, void *pdev,
1615 struct wma_target_req *req_msg, uint32_t vdev_id,
1616 tpDeleteBssParams params)
1617{
1618 void *peer, *vdev;
1619 uint8_t peer_id;
1620 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
1621 uint8_t *mac_addr = NULL;
Abhishek Singhe8be9a62017-05-30 12:13:29 +05301622 struct wma_target_req *del_req;
Krishna Kumaar Natarajanf24bfc82017-02-07 11:54:05 -08001623
1624 vdev = cdp_get_vdev_from_vdev_id(soc, pdev, vdev_id);
1625 if (!vdev) {
1626 WMA_LOGE(FL("vdev is NULL for vdev_id = %d"), vdev_id);
1627 wma_cleanup_target_req_param(req_msg);
1628 return -EINVAL;
1629 }
1630
1631 if (wma_is_vdev_in_ibss_mode(wma, vdev_id) ||
1632 WMA_IS_VDEV_IN_NDI_MODE(wma->interfaces, vdev_id)) {
1633 mac_addr = cdp_get_vdev_mac_addr(soc, vdev);
1634 if (!mac_addr) {
1635 WMA_LOGE(FL("mac_addr is NULL for vdev_id = %d"),
1636 vdev_id);
1637 wma_cleanup_target_req_param(req_msg);
1638 return -EINVAL;
1639 }
1640 } else {
1641 mac_addr = params->bssid;
1642 }
1643
1644 peer = cdp_peer_find_by_addr(soc, pdev, mac_addr, &peer_id);
1645 if (!peer) {
1646 WMA_LOGE(FL("peer NULL for vdev_id = %d"), vdev_id);
1647 wma_cleanup_target_req_param(req_msg);
1648 return -EINVAL;
1649 }
1650
1651 wma_remove_peer(wma, mac_addr, vdev_id, peer, false);
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05301652 if (wmi_service_enabled(
1653 wma->wmi_handle,
1654 wmi_service_sync_delete_cmds)) {
Abhishek Singhe8be9a62017-05-30 12:13:29 +05301655 WMA_LOGD(FL("Wait for the peer delete. vdev_id %d"),
1656 req_msg->vdev_id);
1657 del_req = wma_fill_hold_req(wma,
1658 req_msg->vdev_id,
1659 WMA_DELETE_STA_REQ,
1660 WMA_DELETE_PEER_RSP,
1661 params,
1662 WMA_DELETE_STA_TIMEOUT);
1663 if (!del_req) {
1664 WMA_LOGE(FL("Failed to allocate request. vdev_id %d"),
1665 req_msg->vdev_id);
1666 params->status = QDF_STATUS_E_NOMEM;
1667 return -EINVAL;
1668 }
1669 }
Krishna Kumaar Natarajanf24bfc82017-02-07 11:54:05 -08001670 return 0;
1671}
1672
Hanumanth Reddy Pothulae87621b2017-04-12 20:53:35 +05301673/*
1674 * get_fw_active_bpf_mode() - convert HDD BPF mode to FW configurable BPF
1675 * mode
1676 * @mode: BPF mode maintained in HDD
1677 *
1678 * Return: FW configurable BP mode
1679 */
1680static enum wmi_host_active_bpf_mode
1681get_fw_active_bpf_mode(enum active_bpf_mode mode)
1682{
1683 switch (mode) {
1684 case ACTIVE_BPF_DISABLED:
1685 return WMI_HOST_ACTIVE_BPF_DISABLED;
1686 case ACTIVE_BPF_ENABLED:
1687 return WMI_HOST_ACTIVE_BPF_ENABLED;
1688 case ACTIVE_BPF_ADAPTIVE:
1689 return WMI_HOST_ACTIVE_BPF_ADAPTIVE;
1690 default:
1691 WMA_LOGE("Invalid Active BPF Mode %d; Using 'disabled'", mode);
1692 return WMI_HOST_ACTIVE_BPF_DISABLED;
1693 }
1694}
1695
Krishna Kumaar Natarajanf24bfc82017-02-07 11:54:05 -08001696/**
Dustin Brown13995f02017-01-12 15:38:42 -08001697 * wma_config_active_bpf_mode() - Config active BPF mode in FW
1698 * @wma: the WMA handle
1699 * @vdev_id: the Id of the vdev for which the configuration should be applied
1700 *
1701 * Return: QDF status
1702 */
1703static QDF_STATUS wma_config_active_bpf_mode(t_wma_handle *wma, uint8_t vdev_id)
1704{
Hanumanth Reddy Pothulae87621b2017-04-12 20:53:35 +05301705 enum wmi_host_active_bpf_mode uc_mode, mcbc_mode;
Dustin Brown13995f02017-01-12 15:38:42 -08001706
Hanumanth Reddy Pothulae87621b2017-04-12 20:53:35 +05301707 uc_mode = get_fw_active_bpf_mode(wma->active_uc_bpf_mode);
1708 mcbc_mode = get_fw_active_bpf_mode(wma->active_mc_bc_bpf_mode);
Dustin Brown13995f02017-01-12 15:38:42 -08001709
Hanumanth Reddy Pothulae87621b2017-04-12 20:53:35 +05301710 WMA_LOGD("Configuring Active BPF Mode UC:%d MC/BC:%d for vdev %u",
1711 uc_mode, mcbc_mode, vdev_id);
Dustin Brown13995f02017-01-12 15:38:42 -08001712
1713 return wmi_unified_set_active_bpf_mode_cmd(wma->wmi_handle, vdev_id,
1714 uc_mode, mcbc_mode);
1715}
1716
Abhishek Singhe8be9a62017-05-30 12:13:29 +05301717#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
1718/**
1719 * wma_check_and_find_mcc_ap() - finds if device is operating AP
1720 * in MCC mode or not
1721 * @wma: wma handle.
1722 * @vdev_id: vdev ID of device for which MCC has to be checked
1723 *
1724 * This function internally calls wma_find_mcc_ap finds if
1725 * device is operating AP in MCC mode or not
1726 *
1727 * Return: none
1728 */
1729static void
1730wma_check_and_find_mcc_ap(tp_wma_handle wma, uint8_t vdev_id)
1731{
1732 tpAniSirGlobal mac_ctx = cds_get_context(QDF_MODULE_ID_PE);
1733
1734 if (NULL == mac_ctx) {
1735 WMA_LOGE("%s: Failed to get mac_ctx", __func__);
1736 return;
1737 }
1738 if (mac_ctx->sap.sap_channel_avoidance)
1739 wma_find_mcc_ap(wma, vdev_id, false);
1740}
1741#else
1742static inline void
1743wma_check_and_find_mcc_ap(tp_wma_handle wma, uint8_t vdev_id)
1744{}
1745#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
1746
1747/**
1748 * wma_send_del_bss_response() - send del bss resp to upper layer
1749 * @wma: wma handle.
1750 * @vdev_id: vdev ID of device for which MCC has to be checked
1751 *
1752 * This function sends del bss resp to upper layer
1753 *
1754 * Return: none
1755 */
1756static void
1757wma_send_del_bss_response(tp_wma_handle wma, struct wma_target_req *req,
1758 uint8_t vdev_id)
1759{
1760 struct wma_txrx_node *iface;
1761 struct beacon_info *bcn;
1762 tpDeleteBssParams params;
1763 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
1764
1765 if (!req) {
1766 WMA_LOGE("%s req is NULL", __func__);
1767 return;
1768 }
1769
1770 iface = &wma->interfaces[vdev_id];
1771 if (!iface->handle) {
1772 WMA_LOGE("%s vdev id %d is already deleted",
1773 __func__, vdev_id);
1774 if (req->user_data)
1775 qdf_mem_free(req->user_data);
1776 req->user_data = NULL;
1777 return;
1778 }
Abhishek Singhe8be9a62017-05-30 12:13:29 +05301779
Dustin Brownec2c92e2017-07-26 11:13:49 -07001780 params = (tpDeleteBssParams)req->user_data;
1781 if (wma_send_vdev_down_to_fw(wma, vdev_id) != QDF_STATUS_SUCCESS) {
1782 WMA_LOGE("Failed to send vdev down cmd: vdev %d", vdev_id);
Abhishek Singhe8be9a62017-05-30 12:13:29 +05301783 } else {
Dustin Brownec2c92e2017-07-26 11:13:49 -07001784 wma_vdev_set_mlme_state(wma, vdev_id, WLAN_VDEV_S_STOP);
Abhishek Singhe8be9a62017-05-30 12:13:29 +05301785 wma_check_and_find_mcc_ap(wma, vdev_id);
1786 }
1787
1788 cdp_fc_vdev_flush(soc, iface->handle);
1789 WMA_LOGD("%s, vdev_id: %d, un-pausing tx_ll_queue for VDEV_STOP rsp",
1790 __func__, vdev_id);
1791 cdp_fc_vdev_unpause(soc, iface->handle,
1792 OL_TXQ_PAUSE_REASON_VDEV_STOP);
1793 wma_vdev_clear_pause_bit(vdev_id, PAUSE_TYPE_HOST);
1794 qdf_atomic_set(&iface->bss_status, WMA_BSS_STATUS_STOPPED);
1795 WMA_LOGD("%s: (type %d subtype %d) BSS is stopped",
1796 __func__, iface->type, iface->sub_type);
1797
1798 bcn = wma->interfaces[vdev_id].beacon;
1799 if (bcn) {
Jeff Johnsonadba3962017-09-18 08:12:35 -07001800 WMA_LOGD("%s: Freeing beacon struct %pK, template memory %pK",
Abhishek Singhe8be9a62017-05-30 12:13:29 +05301801 __func__, bcn, bcn->buf);
1802 if (bcn->dma_mapped)
1803 qdf_nbuf_unmap_single(wma->qdf_dev, bcn->buf,
1804 QDF_DMA_TO_DEVICE);
1805 qdf_nbuf_free(bcn->buf);
1806 qdf_mem_free(bcn);
1807 wma->interfaces[vdev_id].beacon = NULL;
1808 }
1809
1810 /* Timeout status means its WMA generated DEL BSS REQ when ADD
1811 * BSS REQ was timed out to stop the VDEV in this case no need
1812 * to send response to UMAC
1813 */
1814 if (params->status == QDF_STATUS_FW_MSG_TIMEDOUT) {
1815 qdf_mem_free(req->user_data);
1816 req->user_data = NULL;
1817 WMA_LOGE("%s: DEL BSS from ADD BSS timeout do not send resp to UMAC (vdev id %x)",
1818 __func__, vdev_id);
1819 } else {
1820 params->status = QDF_STATUS_SUCCESS;
Abhishek Singh2d775fd2017-08-18 10:51:33 +05301821 wma_send_msg_high_priority(wma, WMA_DELETE_BSS_RSP,
1822 (void *)params, 0);
Abhishek Singhe8be9a62017-05-30 12:13:29 +05301823 }
1824
Abhishek Singh0d74f9e2017-09-26 14:02:42 +05301825 if (iface->del_staself_req && iface->is_del_sta_defered) {
1826 iface->is_del_sta_defered = false;
Abhishek Singhe8be9a62017-05-30 12:13:29 +05301827 WMA_LOGA("scheduling defered deletion (vdev id %x)",
1828 vdev_id);
1829 wma_vdev_detach(wma, iface->del_staself_req, 1);
1830 }
1831}
1832
1833
Dustin Brown13995f02017-01-12 15:38:42 -08001834/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001835 * wma_vdev_stop_resp_handler() - vdev stop response handler
1836 * @handle: wma handle
1837 * @cmd_param_info: event buffer
1838 * @len: buffer length
1839 *
1840 * Return: 0 for success or error code
1841 */
1842int wma_vdev_stop_resp_handler(void *handle, uint8_t *cmd_param_info,
1843 u32 len)
1844{
1845 tp_wma_handle wma = (tp_wma_handle) handle;
1846 WMI_VDEV_STOPPED_EVENTID_param_tlvs *param_buf;
1847 wmi_vdev_stopped_event_fixed_param *resp_event;
Kiran Kumar Lokere5798bfa2017-04-27 20:49:39 -07001848 struct wma_target_req *req_msg, *del_req, *new_req_msg;
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08001849 struct cdp_pdev *pdev;
Sandeep Puligilla7da86332016-11-10 16:14:40 -08001850 void *peer;
1851 uint8_t peer_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001852 struct wma_txrx_node *iface;
1853 int32_t status = 0;
Leo Chang96464902016-10-28 11:10:54 -07001854 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Dustin Brownbf6d16b2017-03-03 11:41:05 -08001855
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07001856 WMA_LOGD("%s: Enter", __func__);
Dustin Brown3e619822017-03-17 10:41:56 -07001857
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001858 param_buf = (WMI_VDEV_STOPPED_EVENTID_param_tlvs *) cmd_param_info;
1859 if (!param_buf) {
1860 WMA_LOGE("Invalid event buffer");
1861 return -EINVAL;
1862 }
Dustin Brownec2c92e2017-07-26 11:13:49 -07001863
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001864 resp_event = param_buf->fixed_param;
Dustin Brownec2c92e2017-07-26 11:13:49 -07001865 iface = &wma->interfaces[resp_event->vdev_id];
1866 wma_release_wakelock(&iface->vdev_stop_wakelock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001867
Kiran Kumar Lokere5798bfa2017-04-27 20:49:39 -07001868 req_msg = wma_find_vdev_req(wma, resp_event->vdev_id,
Kiran Kumar Lokere20804162017-07-17 16:09:04 -07001869 WMA_TARGET_REQ_TYPE_VDEV_STOP, true);
Kiran Kumar Lokere5798bfa2017-04-27 20:49:39 -07001870 if (!req_msg) {
1871 WMA_LOGE("%s: Failed to lookup vdev request for vdev id %d",
1872 __func__, resp_event->vdev_id);
1873 return -EINVAL;
1874 }
1875
Naveen Rawatf2bd42d2017-06-29 14:51:43 -07001876 if ((resp_event->vdev_id < wma->max_bssid) &&
Anurag Chouhan8e0ccd32016-02-19 15:30:20 +05301877 (qdf_atomic_read
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001878 (&wma->interfaces[resp_event->vdev_id].vdev_restart_params.
1879 hidden_ssid_restart_in_progress))
1880 && ((wma->interfaces[resp_event->vdev_id].type == WMI_VDEV_TYPE_AP)
1881 && (wma->interfaces[resp_event->vdev_id].sub_type == 0))) {
1882 WMA_LOGE("%s: vdev stop event recevied for hidden ssid set using IOCTL ",
1883 __func__);
Selvaraj, Sridhara0083c42016-06-22 22:15:43 +05301884
Kiran Kumar Lokere5798bfa2017-04-27 20:49:39 -07001885 wma_vdev_set_mlme_state(wma,
1886 resp_event->vdev_id, WLAN_VDEV_S_STOP);
1887 new_req_msg = wma_fill_vdev_req(wma, resp_event->vdev_id,
Selvaraj, Sridhara0083c42016-06-22 22:15:43 +05301888 WMA_HIDDEN_SSID_VDEV_RESTART,
Kiran Kumar Lokere5798bfa2017-04-27 20:49:39 -07001889 WMA_TARGET_REQ_TYPE_VDEV_START,
1890 req_msg->user_data,
Selvaraj, Sridhara0083c42016-06-22 22:15:43 +05301891 WMA_VDEV_START_REQUEST_TIMEOUT);
Kiran Kumar Lokere5798bfa2017-04-27 20:49:39 -07001892 if (!new_req_msg) {
Selvaraj, Sridhara0083c42016-06-22 22:15:43 +05301893 WMA_LOGE("%s: Failed to fill vdev request, vdev_id %d",
1894 __func__, resp_event->vdev_id);
1895 return -EINVAL;
1896 }
1897
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001898 wma_hidden_ssid_vdev_restart_on_vdev_stop(wma,
1899 resp_event->vdev_id);
1900 }
1901
Anurag Chouhan6d760662016-02-20 16:05:43 +05301902 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001903 if (!pdev) {
1904 WMA_LOGE("%s: pdev is NULL", __func__);
1905 status = -EINVAL;
Liangwei Dong748cb5d2016-09-29 00:56:40 -04001906 wma_cleanup_target_req_param(req_msg);
Anurag Chouhan210db072016-02-22 18:42:15 +05301907 qdf_mc_timer_stop(&req_msg->event_timeout);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001908 goto free_req_msg;
1909 }
1910
Anurag Chouhan210db072016-02-22 18:42:15 +05301911 qdf_mc_timer_stop(&req_msg->event_timeout);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001912 if (req_msg->msg_type == WMA_DELETE_BSS_REQ) {
1913 tpDeleteBssParams params =
1914 (tpDeleteBssParams) req_msg->user_data;
Dustin Brownbf6d16b2017-03-03 11:41:05 -08001915
Naveen Rawatf2bd42d2017-06-29 14:51:43 -07001916 if (resp_event->vdev_id >= wma->max_bssid) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001917 WMA_LOGE("%s: Invalid vdev_id %d", __func__,
1918 resp_event->vdev_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001919 }
1920
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001921 if (iface->handle == NULL) {
1922 WMA_LOGE("%s vdev id %d is already deleted",
1923 __func__, resp_event->vdev_id);
Liangwei Dong748cb5d2016-09-29 00:56:40 -04001924 wma_cleanup_target_req_param(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001925 status = -EINVAL;
1926 goto free_req_msg;
1927 }
Mukul Sharma8d2d9ec2016-09-08 13:05:35 +05301928
Padma, Santhosh Kumar16dacfb2017-03-21 19:05:40 +05301929 /* CCA is required only for sta interface */
1930 if (iface->type == WMI_VDEV_TYPE_STA)
1931 wma_get_cca_stats(wma, resp_event->vdev_id);
1932
Mukul Sharma8d2d9ec2016-09-08 13:05:35 +05301933 /* Clear arp and ns offload cache */
1934 qdf_mem_zero(&iface->ns_offload_req,
1935 sizeof(iface->ns_offload_req));
1936 qdf_mem_zero(&iface->arp_offload_req,
1937 sizeof(iface->arp_offload_req));
1938
Krishna Kumaar Natarajanf24bfc82017-02-07 11:54:05 -08001939 status = wma_remove_bss_peer(wma, pdev, req_msg,
1940 resp_event->vdev_id, params);
1941 if (status != 0)
1942 goto free_req_msg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001943
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05301944 if (wmi_service_enabled(
1945 wma->wmi_handle,
1946 wmi_service_sync_delete_cmds))
Abhishek Singhe8be9a62017-05-30 12:13:29 +05301947 goto free_req_msg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001948
Abhishek Singhe8be9a62017-05-30 12:13:29 +05301949 wma_send_del_bss_response(wma, req_msg, resp_event->vdev_id);
Sandeep Puligilla7da86332016-11-10 16:14:40 -08001950 } else if (req_msg->msg_type == WMA_SET_LINK_STATE) {
1951 tpLinkStateParams params =
1952 (tpLinkStateParams) req_msg->user_data;
1953
1954 peer = cdp_peer_find_by_addr(soc, pdev, params->bssid, &peer_id);
1955 if (peer) {
1956 WMA_LOGP(FL("Deleting peer %pM vdev id %d"),
1957 params->bssid, req_msg->vdev_id);
1958 wma_remove_peer(wma, params->bssid, req_msg->vdev_id,
1959 peer, false);
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05301960 if (wmi_service_enabled(wma->wmi_handle,
1961 wmi_service_sync_delete_cmds)) {
Sandeep Puligillabbee8172017-04-07 19:26:33 -07001962 WMA_LOGI(FL("Wait for the peer delete. vdev_id %d"),
1963 req_msg->vdev_id);
1964 del_req = wma_fill_hold_req(wma,
1965 req_msg->vdev_id,
1966 WMA_DELETE_STA_REQ,
1967 WMA_SET_LINK_PEER_RSP,
1968 params,
1969 WMA_DELETE_STA_TIMEOUT);
1970 if (!del_req) {
1971 WMA_LOGE(FL("Failed to allocate request. vdev_id %d"),
1972 req_msg->vdev_id);
1973 params->status = QDF_STATUS_E_NOMEM;
1974 } else {
1975 goto free_req_msg;
1976 }
1977 }
Sandeep Puligilla7da86332016-11-10 16:14:40 -08001978 }
Dustin Brownec2c92e2017-07-26 11:13:49 -07001979 if (wma_send_vdev_down_to_fw(wma, req_msg->vdev_id) !=
1980 QDF_STATUS_SUCCESS) {
Sandeep Puligilla7da86332016-11-10 16:14:40 -08001981 WMA_LOGE("Failed to send vdev down cmd: vdev %d",
1982 req_msg->vdev_id);
1983 }
1984 wma_send_msg(wma, WMA_SET_LINK_STATE_RSP, (void *)params, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001985 }
Krishna Kumaar Natarajanf24bfc82017-02-07 11:54:05 -08001986
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001987free_req_msg:
Anurag Chouhan210db072016-02-22 18:42:15 +05301988 qdf_mc_timer_destroy(&req_msg->event_timeout);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301989 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001990 return status;
1991}
1992
1993/**
1994 * wma_vdev_attach() - create vdev in fw
1995 * @wma_handle: wma handle
1996 * @self_sta_req: self sta request
1997 * @generateRsp: generate response
1998 *
1999 * This function creates vdev in target and
2000 * attach this vdev to txrx module. It also set
2001 * vdev related params to fw.
2002 *
2003 * Return: txrx vdev handle
2004 */
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08002005struct cdp_vdev *wma_vdev_attach(tp_wma_handle wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002006 struct add_sta_self_params *self_sta_req,
2007 uint8_t generateRsp)
2008{
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08002009 struct cdp_vdev *txrx_vdev_handle = NULL;
2010 struct cdp_pdev *txrx_pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002011 enum wlan_op_mode txrx_vdev_type;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302012 QDF_STATUS status = QDF_STATUS_SUCCESS;
Anurag Chouhan6d760662016-02-20 16:05:43 +05302013 struct sAniSirGlobal *mac = cds_get_context(QDF_MODULE_ID_PE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002014 uint32_t cfg_val;
2015 uint16_t val16;
Govind Singhd76a5b02016-03-08 15:12:14 +05302016 QDF_STATUS ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002017 tSirMacHTCapabilityInfo *phtCapInfo;
Rajeev Kumarb60abe42017-01-21 15:39:31 -08002018 struct scheduler_msg sme_msg = { 0 };
Govind Singhd76a5b02016-03-08 15:12:14 +05302019 struct vdev_create_params params = { 0 };
Bhargav Shaha89d3b42016-04-20 13:04:56 +05302020 u_int8_t vdev_id;
Padma, Santhosh Kumara7119672016-08-16 16:05:14 +05302021 struct sir_set_tx_rx_aggregation_size tx_rx_aggregation_size;
Leo Chang96464902016-10-28 11:10:54 -07002022 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002023
Varun Reddy Yeturu30c24b72017-07-31 14:25:54 -07002024 WMA_LOGD("mac %pM, vdev_id %hu, type %d, sub_type %d, nss 2g %d, 5g %d",
2025 self_sta_req->self_mac_addr, self_sta_req->session_id,
2026 self_sta_req->type, self_sta_req->sub_type,
2027 self_sta_req->nss_2g, self_sta_req->nss_5g);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002028 if (NULL == mac) {
2029 WMA_LOGE("%s: Failed to get mac", __func__);
2030 goto end;
2031 }
Arif Hussain380cfc72017-10-31 13:12:04 -07002032
2033 vdev_id = self_sta_req->session_id;
2034 if (wma_is_vdev_valid(vdev_id)) {
2035 WMA_LOGE("%s: vdev %d already active", __func__, vdev_id);
Varun Reddy Yeturu30c24b72017-07-31 14:25:54 -07002036 goto end;
2037 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002038
Govind Singhd76a5b02016-03-08 15:12:14 +05302039 params.if_id = self_sta_req->session_id;
2040 params.type = self_sta_req->type;
2041 params.subtype = self_sta_req->sub_type;
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07002042 params.nss_2g = self_sta_req->nss_2g;
2043 params.nss_5g = self_sta_req->nss_5g;
Govind Singhd76a5b02016-03-08 15:12:14 +05302044
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002045 /* Create a vdev in target */
Govind Singhd76a5b02016-03-08 15:12:14 +05302046 status = wmi_unified_vdev_create_send(wma_handle->wmi_handle,
2047 self_sta_req->self_mac_addr,
2048 &params);
2049 if (QDF_IS_STATUS_ERROR(status)) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07002050 WMA_LOGE("%s: Unable to add an interface for ath_dev",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002051 __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002052 goto end;
2053 }
2054
2055 txrx_vdev_type = wma_get_txrx_vdev_type(self_sta_req->type);
2056
2057 if (wlan_op_mode_unknown == txrx_vdev_type) {
2058 WMA_LOGE("Failed to get txrx vdev type");
Govind Singhd76a5b02016-03-08 15:12:14 +05302059 wmi_unified_vdev_delete_send(wma_handle->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002060 self_sta_req->session_id);
2061 goto end;
2062 }
2063
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08002064 txrx_vdev_handle = cdp_vdev_attach(soc,
2065 txrx_pdev,
2066 self_sta_req->self_mac_addr,
2067 self_sta_req->session_id,
2068 txrx_vdev_type);
Mukul Sharma6411bb82017-03-01 15:57:07 +05302069 wma_vdev_update_pause_bitmap(self_sta_req->session_id, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002070
Jeff Johnsonadba3962017-09-18 08:12:35 -07002071 WMA_LOGD("vdev_id %hu, txrx_vdev_handle = %pK", self_sta_req->session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002072 txrx_vdev_handle);
2073
2074 if (NULL == txrx_vdev_handle) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07002075 WMA_LOGE("%s: cdp_vdev_attach failed", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302076 status = QDF_STATUS_E_FAILURE;
Govind Singhd76a5b02016-03-08 15:12:14 +05302077 wmi_unified_vdev_delete_send(wma_handle->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002078 self_sta_req->session_id);
2079 goto end;
2080 }
Selvaraj, Sridhar171e2252016-06-22 22:33:26 +05302081 wma_handle->interfaces[self_sta_req->session_id].vdev_active = true;
2082
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002083 wma_handle->interfaces[self_sta_req->session_id].handle =
2084 txrx_vdev_handle;
2085
2086 wma_handle->interfaces[self_sta_req->session_id].ptrn_match_enable =
2087 wma_handle->ptrn_match_enable_all_vdev ? true : false;
2088
2089 if (wlan_cfg_get_int(mac, WNI_CFG_WOWLAN_DEAUTH_ENABLE, &cfg_val)
2090 != eSIR_SUCCESS)
2091 wma_handle->wow.deauth_enable = true;
2092 else
2093 wma_handle->wow.deauth_enable = cfg_val ? true : false;
2094
2095 if (wlan_cfg_get_int(mac, WNI_CFG_WOWLAN_DISASSOC_ENABLE, &cfg_val)
2096 != eSIR_SUCCESS)
2097 wma_handle->wow.disassoc_enable = true;
2098 else
2099 wma_handle->wow.disassoc_enable = cfg_val ? true : false;
2100
2101 if (wlan_cfg_get_int(mac, WNI_CFG_WOWLAN_MAX_MISSED_BEACON, &cfg_val)
2102 != eSIR_SUCCESS)
2103 wma_handle->wow.bmiss_enable = true;
2104 else
2105 wma_handle->wow.bmiss_enable = cfg_val ? true : false;
2106
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302107 qdf_mem_copy(wma_handle->interfaces[self_sta_req->session_id].addr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002108 self_sta_req->self_mac_addr,
2109 sizeof(wma_handle->interfaces[self_sta_req->session_id].
2110 addr));
Padma, Santhosh Kumara7119672016-08-16 16:05:14 +05302111
2112 tx_rx_aggregation_size.tx_aggregation_size =
2113 self_sta_req->tx_aggregation_size;
2114 tx_rx_aggregation_size.rx_aggregation_size =
2115 self_sta_req->rx_aggregation_size;
2116 tx_rx_aggregation_size.vdev_id = self_sta_req->session_id;
2117
2118 status = wma_set_tx_rx_aggregation_size(&tx_rx_aggregation_size);
2119 if (status != QDF_STATUS_SUCCESS)
2120 WMA_LOGE("failed to set aggregation sizes(err=%d)", status);
2121
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002122 switch (self_sta_req->type) {
2123 case WMI_VDEV_TYPE_STA:
2124 if (wlan_cfg_get_int(mac, WNI_CFG_INFRA_STA_KEEP_ALIVE_PERIOD,
2125 &cfg_val) != eSIR_SUCCESS) {
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002126 WMA_LOGE("Failed to get value for WNI_CFG_INFRA_STA_KEEP_ALIVE_PERIOD");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002127 cfg_val = DEFAULT_INFRA_STA_KEEP_ALIVE_PERIOD;
2128 }
2129
2130 wma_set_sta_keep_alive(wma_handle,
2131 self_sta_req->session_id,
2132 SIR_KEEP_ALIVE_NULL_PKT,
2133 cfg_val, NULL, NULL, NULL);
mukul sharma72c8b222015-09-04 17:02:01 +05302134
2135 /* offload STA SA query related params to fwr */
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05302136 if (wmi_service_enabled(wma_handle->wmi_handle,
2137 wmi_service_sta_pmf_offload)) {
mukul sharma72c8b222015-09-04 17:02:01 +05302138 wma_set_sta_sa_query_param(wma_handle,
2139 self_sta_req->session_id);
2140 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002141 break;
2142 }
2143
2144 wma_handle->interfaces[self_sta_req->session_id].type =
2145 self_sta_req->type;
2146 wma_handle->interfaces[self_sta_req->session_id].sub_type =
2147 self_sta_req->sub_type;
Anurag Chouhan8e0ccd32016-02-19 15:30:20 +05302148 qdf_atomic_init(&wma_handle->interfaces
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002149 [self_sta_req->session_id].bss_status);
2150
2151 if (((self_sta_req->type == WMI_VDEV_TYPE_AP) &&
2152 (self_sta_req->sub_type == WMI_UNIFIED_VDEV_SUBTYPE_P2P_DEVICE)) ||
Manjunathappa Prakash0e6e6b52016-04-21 11:48:48 -07002153 (self_sta_req->type == WMI_VDEV_TYPE_OCB) ||
Deepak Dhamdheree2dd5442016-05-27 15:05:51 -07002154 (self_sta_req->type == WMI_VDEV_TYPE_MONITOR) ||
2155 (self_sta_req->type == WMI_VDEV_TYPE_NDI)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002156 status = wma_create_peer(wma_handle, txrx_pdev,
2157 txrx_vdev_handle,
2158 self_sta_req->self_mac_addr,
2159 WMI_PEER_TYPE_DEFAULT,
2160 self_sta_req->session_id, false);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302161 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002162 WMA_LOGE("%s: Failed to create peer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302163 status = QDF_STATUS_E_FAILURE;
Govind Singhd76a5b02016-03-08 15:12:14 +05302164 wmi_unified_vdev_delete_send(wma_handle->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002165 self_sta_req->session_id);
2166 }
2167 }
2168
Naveen Rawat2b6e3c92017-03-20 13:59:07 -07002169 WMA_LOGD("Setting WMI_VDEV_PARAM_DISCONNECT_TH: %d",
2170 self_sta_req->pkt_err_disconn_th);
2171 ret = wma_vdev_set_param(wma_handle->wmi_handle,
2172 self_sta_req->session_id,
2173 WMI_VDEV_PARAM_DISCONNECT_TH,
2174 self_sta_req->pkt_err_disconn_th);
2175 if (ret)
2176 WMA_LOGE("Failed to set WMI_VDEV_PARAM_DISCONNECT_TH");
2177
Bhargav Shaha89d3b42016-04-20 13:04:56 +05302178 wma_handle->interfaces[vdev_id].is_vdev_valid = true;
Govind Singhd76a5b02016-03-08 15:12:14 +05302179 ret = wma_vdev_set_param(wma_handle->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002180 self_sta_req->session_id,
2181 WMI_VDEV_PARAM_MCC_RTSCTS_PROTECTION_ENABLE,
2182 mac->roam.configParam.mcc_rts_cts_prot_enable);
Govind Singhd76a5b02016-03-08 15:12:14 +05302183 if (QDF_IS_STATUS_ERROR(ret))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002184 WMA_LOGE("Failed to set WMI VDEV MCC_RTSCTS_PROTECTION_ENABLE");
2185
Govind Singhd76a5b02016-03-08 15:12:14 +05302186 ret = wma_vdev_set_param(wma_handle->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002187 self_sta_req->session_id,
2188 WMI_VDEV_PARAM_MCC_BROADCAST_PROBE_ENABLE,
2189 mac->roam.configParam.mcc_bcast_prob_resp_enable);
Govind Singhd76a5b02016-03-08 15:12:14 +05302190 if (QDF_IS_STATUS_ERROR(ret))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002191 WMA_LOGE("Failed to set WMI VDEV MCC_BROADCAST_PROBE_ENABLE");
2192
2193 if (wlan_cfg_get_int(mac, WNI_CFG_RTS_THRESHOLD,
2194 &cfg_val) == eSIR_SUCCESS) {
Govind Singhd76a5b02016-03-08 15:12:14 +05302195 ret = wma_vdev_set_param(wma_handle->wmi_handle,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002196 self_sta_req->session_id,
2197 WMI_VDEV_PARAM_RTS_THRESHOLD,
2198 cfg_val);
Govind Singhd76a5b02016-03-08 15:12:14 +05302199 if (QDF_IS_STATUS_ERROR(ret))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002200 WMA_LOGE("Failed to set WMI_VDEV_PARAM_RTS_THRESHOLD");
2201 } else {
2202 WMA_LOGE("Failed to get value for WNI_CFG_RTS_THRESHOLD, leaving unchanged");
2203 }
2204
2205 if (wlan_cfg_get_int(mac, WNI_CFG_FRAGMENTATION_THRESHOLD,
2206 &cfg_val) == eSIR_SUCCESS) {
Govind Singhd76a5b02016-03-08 15:12:14 +05302207 ret = wma_vdev_set_param(wma_handle->wmi_handle,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002208 self_sta_req->session_id,
2209 WMI_VDEV_PARAM_FRAGMENTATION_THRESHOLD,
2210 cfg_val);
Govind Singhd76a5b02016-03-08 15:12:14 +05302211 if (QDF_IS_STATUS_ERROR(ret))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002212 WMA_LOGE("Failed to set WMI_VDEV_PARAM_FRAGMENTATION_THRESHOLD");
2213 } else {
2214 WMA_LOGE("Failed to get value for WNI_CFG_FRAGMENTATION_THRESHOLD, leaving unchanged");
2215 }
2216
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002217 if (wlan_cfg_get_int(mac, WNI_CFG_HT_CAP_INFO, &cfg_val) ==
2218 eSIR_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002219 val16 = (uint16_t) cfg_val;
2220 phtCapInfo = (tSirMacHTCapabilityInfo *) &cfg_val;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002221
Govind Singhd76a5b02016-03-08 15:12:14 +05302222 ret = wma_vdev_set_param(wma_handle->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002223 self_sta_req->session_id,
2224 WMI_VDEV_PARAM_TX_STBC,
2225 phtCapInfo->txSTBC);
Govind Singhd76a5b02016-03-08 15:12:14 +05302226 if (QDF_IS_STATUS_ERROR(ret))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002227 WMA_LOGE("Failed to set WMI_VDEV_PARAM_TX_STBC");
2228 } else {
2229 WMA_LOGE("Failed to get value of HT_CAP, TX STBC unchanged");
2230 }
Hong Shib90718f2017-02-20 00:57:22 +08002231
2232 wma_set_vdev_mgmt_rate(wma_handle, self_sta_req->session_id);
2233
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002234 /* Initialize roaming offload state */
2235 if ((self_sta_req->type == WMI_VDEV_TYPE_STA) &&
2236 (self_sta_req->sub_type == 0)) {
2237 wma_handle->roam_offload_enabled = true;
Govind Singhd76a5b02016-03-08 15:12:14 +05302238 ret = wma_vdev_set_param(wma_handle->wmi_handle,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002239 self_sta_req->session_id,
2240 WMI_VDEV_PARAM_ROAM_FW_OFFLOAD,
2241 (WMI_ROAM_FW_OFFLOAD_ENABLE_FLAG |
2242 WMI_ROAM_BMISS_FINAL_SCAN_ENABLE_FLAG));
Govind Singhd76a5b02016-03-08 15:12:14 +05302243 if (QDF_IS_STATUS_ERROR(ret))
2244 WMA_LOGE("Failed to set WMI_VDEV_PARAM_ROAM_FW_OFFLOAD");
Selvaraj, Sridhar4f684bb2017-01-19 15:59:23 +05302245
2246 /* Pass down enable/disable bcast probe rsp to FW */
2247 ret = wma_vdev_set_param(
2248 wma_handle->wmi_handle,
2249 self_sta_req->session_id,
2250 WMI_VDEV_PARAM_ENABLE_BCAST_PROBE_RESPONSE,
2251 self_sta_req->enable_bcast_probe_rsp);
2252 if (QDF_IS_STATUS_ERROR(ret))
2253 WMA_LOGE("Failed to set WMI_VDEV_PARAM_ENABLE_BCAST_PROBE_RESPONSE");
2254
Selvaraj, Sridhar97ce6582017-01-20 17:06:34 +05302255 /* Pass down the FILS max channel guard time to FW */
2256 ret = wma_vdev_set_param(
2257 wma_handle->wmi_handle,
2258 self_sta_req->session_id,
2259 WMI_VDEV_PARAM_FILS_MAX_CHANNEL_GUARD_TIME,
2260 self_sta_req->fils_max_chan_guard_time);
2261 if (QDF_IS_STATUS_ERROR(ret))
2262 WMA_LOGE("Failed to set WMI_VDEV_PARAM_FILS_MAX_CHANNEL_GUARD_TIME");
Sridhar Selvaraj87309212017-06-28 17:41:50 +05302263
2264 /* Pass down the Probe Request tx delay(in ms) to FW */
2265 ret = wma_vdev_set_param(
2266 wma_handle->wmi_handle,
2267 self_sta_req->session_id,
2268 WMI_VDEV_PARAM_PROBE_DELAY,
2269 PROBE_REQ_TX_DELAY);
2270 if (QDF_IS_STATUS_ERROR(ret))
2271 WMA_LOGE("Failed to set WMI_VDEV_PARAM_PROBE_DELAY");
2272
2273 /* Pass down the probe request tx time gap(in ms) to FW */
2274 ret = wma_vdev_set_param(
2275 wma_handle->wmi_handle,
2276 self_sta_req->session_id,
2277 WMI_VDEV_PARAM_REPEAT_PROBE_TIME,
2278 PROBE_REQ_TX_TIME_GAP);
2279 if (QDF_IS_STATUS_ERROR(ret))
2280 WMA_LOGE("Failed to set WMI_VDEV_PARAM_REPEAT_PROBE_TIME");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002281 }
2282
Yeshwanth Sriram Guntuka2ba6fe92017-10-04 14:40:45 +05302283 if ((self_sta_req->type == WMI_VDEV_TYPE_STA ||
2284 self_sta_req->type == WMI_VDEV_TYPE_AP) &&
2285 self_sta_req->sub_type == 0) {
2286 ret = wma_vdev_set_param(wma_handle->wmi_handle,
2287 self_sta_req->session_id,
2288 WMI_VDEV_PARAM_ENABLE_DISABLE_OCE_FEATURES,
2289 self_sta_req->oce_feature_bitmap);
2290 if (QDF_IS_STATUS_ERROR(ret))
2291 WMA_LOGE("Failed to set WMI_VDEV_PARAM_ENABLE_DISABLE_OCE_FEATURES");
2292 }
2293
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002294 /* Initialize BMISS parameters */
2295 if ((self_sta_req->type == WMI_VDEV_TYPE_STA) &&
2296 (self_sta_req->sub_type == 0))
2297 wma_roam_scan_bmiss_cnt(wma_handle,
2298 mac->roam.configParam.neighborRoamConfig.nRoamBmissFirstBcnt,
2299 mac->roam.configParam.neighborRoamConfig.nRoamBmissFinalBcnt,
2300 self_sta_req->session_id);
2301
2302 if (wlan_cfg_get_int(mac, WNI_CFG_ENABLE_MCC_ADAPTIVE_SCHED,
2303 &cfg_val) == eSIR_SUCCESS) {
2304 WMA_LOGD("%s: setting ini value for WNI_CFG_ENABLE_MCC_ADAPTIVE_SCHED: %d",
2305 __func__, cfg_val);
2306 ret = wma_set_enable_disable_mcc_adaptive_scheduler(cfg_val);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302307 if (ret != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002308 WMA_LOGE("Failed to set WNI_CFG_ENABLE_MCC_ADAPTIVE_SCHED");
2309 }
2310 } else {
2311 WMA_LOGE("Failed to get value for WNI_CFG_ENABLE_MCC_ADAPTIVE_SCHED, leaving unchanged");
2312 }
Dustin Brown13995f02017-01-12 15:38:42 -08002313
2314 if (self_sta_req->type == WMI_VDEV_TYPE_STA) {
2315 status = wma_config_active_bpf_mode(wma_handle,
2316 self_sta_req->session_id);
2317 if (QDF_IS_STATUS_ERROR(status))
2318 WMA_LOGE("Failed to configure active BPF mode");
2319 }
2320
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002321end:
2322 self_sta_req->status = status;
2323
2324#ifdef QCA_IBSS_SUPPORT
2325 if (generateRsp)
2326#endif
2327 {
2328 sme_msg.type = eWNI_SME_ADD_STA_SELF_RSP;
2329 sme_msg.bodyptr = self_sta_req;
2330 sme_msg.bodyval = 0;
2331
Rajeev Kumarb60abe42017-01-21 15:39:31 -08002332 status = scheduler_post_msg(QDF_MODULE_ID_SME, &sme_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302333 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002334 WMA_LOGE("Failed to post eWNI_SME_ADD_STA_SELF_RSP");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302335 qdf_mem_free(self_sta_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002336 }
2337 }
2338 return txrx_vdev_handle;
2339}
2340
Jiachao Wu712d4fd2017-08-23 16:52:34 +08002341uint32_t wma_get_bcn_rate_code(uint16_t rate)
2342{
2343 /* rate in multiples of 100 Kbps */
2344 switch (rate) {
2345 case WMA_BEACON_TX_RATE_1_M:
2346 return WMI_BCN_TX_RATE_CODE_1_M;
2347 case WMA_BEACON_TX_RATE_2_M:
2348 return WMI_BCN_TX_RATE_CODE_2_M;
2349 case WMA_BEACON_TX_RATE_5_5_M:
2350 return WMI_BCN_TX_RATE_CODE_5_5_M;
2351 case WMA_BEACON_TX_RATE_11_M:
2352 return WMI_BCN_TX_RATE_CODE_11M;
2353 case WMA_BEACON_TX_RATE_6_M:
2354 return WMI_BCN_TX_RATE_CODE_6_M;
2355 case WMA_BEACON_TX_RATE_9_M:
2356 return WMI_BCN_TX_RATE_CODE_9_M;
2357 case WMA_BEACON_TX_RATE_12_M:
2358 return WMI_BCN_TX_RATE_CODE_12_M;
2359 case WMA_BEACON_TX_RATE_18_M:
2360 return WMI_BCN_TX_RATE_CODE_18_M;
2361 case WMA_BEACON_TX_RATE_24_M:
2362 return WMI_BCN_TX_RATE_CODE_24_M;
2363 case WMA_BEACON_TX_RATE_36_M:
2364 return WMI_BCN_TX_RATE_CODE_36_M;
2365 case WMA_BEACON_TX_RATE_48_M:
2366 return WMI_BCN_TX_RATE_CODE_48_M;
2367 case WMA_BEACON_TX_RATE_54_M:
2368 return WMI_BCN_TX_RATE_CODE_54_M;
2369 default:
2370 return WMI_BCN_TX_RATE_CODE_1_M;
2371 }
2372}
2373
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002374/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002375 * wma_vdev_start() - send vdev start request to fw
2376 * @wma: wma handle
2377 * @req: vdev start params
2378 * @isRestart: isRestart flag
2379 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302380 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002381 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302382QDF_STATUS wma_vdev_start(tp_wma_handle wma,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002383 struct wma_vdev_start_req *req, bool isRestart)
2384{
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302385 struct vdev_start_params params = { 0 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002386 wmi_vdev_start_request_cmd_fixed_param *cmd;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002387 struct wma_txrx_node *intr = wma->interfaces;
2388 tpAniSirGlobal mac_ctx = NULL;
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302389 uint32_t temp_ssid_len = 0;
2390 uint32_t temp_flags = 0;
2391 uint32_t temp_chan_info = 0;
2392 uint32_t temp_reg_info_1 = 0;
2393 uint32_t temp_reg_info_2 = 0;
Kiran Kumar Lokere02b9aa42016-05-26 14:54:49 -07002394 uint16_t bw_val;
Himanshu Agarwalfc4dab92017-12-28 21:46:29 +05302395 struct wma_txrx_node *iface = &wma->interfaces[req->vdev_id];
2396 struct wma_target_req *req_msg;
Kabilan Kannan43d051f2018-01-04 17:54:34 -08002397 uint32_t chan_mode;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002398
Anurag Chouhan6d760662016-02-20 16:05:43 +05302399 mac_ctx = cds_get_context(QDF_MODULE_ID_PE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002400 if (mac_ctx == NULL) {
2401 WMA_LOGE("%s: vdev start failed as mac_ctx is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302402 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002403 }
2404
Kabilan Kannan43d051f2018-01-04 17:54:34 -08002405 chan_mode = wma_chan_phy_mode(req->chan, req->chan_width,
2406 req->dot11_mode);
2407
2408 if (chan_mode == MODE_UNKNOWN) {
2409 WMA_LOGE("%s: invalid phy mode!", __func__);
2410 return QDF_STATUS_E_FAILURE;
2411 }
2412
Himanshu Agarwalfc4dab92017-12-28 21:46:29 +05302413 if (!isRestart &&
2414 qdf_atomic_read(&iface->bss_status) == WMA_BSS_STATUS_STARTED) {
2415 req_msg = wma_find_vdev_req(wma, req->vdev_id,
2416 WMA_TARGET_REQ_TYPE_VDEV_STOP,
2417 false);
2418 if (!req_msg || req_msg->msg_type != WMA_DELETE_BSS_REQ) {
2419 if (!cds_is_driver_recovering()) {
2420 if (cds_is_self_recovery_enabled()) {
2421 WMA_LOGE("BSS is in started state before vdev start, trigger recovery");
2422 cds_trigger_recovery(
2423 QDF_REASON_UNSPECIFIED);
2424 } else {
2425 WMA_LOGE("BSS is in started state before vdev start, BUG_ON()");
2426 QDF_BUG(0);
2427 }
2428 }
2429 }
2430 }
2431
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002432 WMA_LOGD("%s: Enter isRestart=%d vdev=%d", __func__, isRestart,
2433 req->vdev_id);
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302434 params.vdev_id = req->vdev_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002435
2436 /* Fill channel info */
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302437 params.chan_freq = cds_chan_to_freq(req->chan);
Kabilan Kannan43d051f2018-01-04 17:54:34 -08002438 params.chan_mode = chan_mode;
2439
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302440 intr[params.vdev_id].chanmode = params.chan_mode;
2441 intr[params.vdev_id].ht_capable = req->ht_capable;
2442 intr[params.vdev_id].vht_capable = req->vht_capable;
2443 intr[params.vdev_id].config.gtx_info.gtxRTMask[0] =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002444 CFG_TGT_DEFAULT_GTX_HT_MASK;
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302445 intr[params.vdev_id].config.gtx_info.gtxRTMask[1] =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002446 CFG_TGT_DEFAULT_GTX_VHT_MASK;
Rajeev Kumar Sirasanagandlaaf474742016-09-06 17:54:50 +05302447
2448 if (wlan_cfg_get_int(mac_ctx, WNI_CFG_TGT_GTX_USR_CFG,
2449 &intr[params.vdev_id].config.gtx_info.gtxUsrcfg) != eSIR_SUCCESS) {
2450 intr[params.vdev_id].config.gtx_info.gtxUsrcfg =
2451 WNI_CFG_TGT_GTX_USR_CFG_STADEF;
2452 QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_WARN,
2453 "Failed to get WNI_CFG_TGT_GTX_USR_CFG");
2454 }
2455
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302456 intr[params.vdev_id].config.gtx_info.gtxPERThreshold =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002457 CFG_TGT_DEFAULT_GTX_PER_THRESHOLD;
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302458 intr[params.vdev_id].config.gtx_info.gtxPERMargin =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002459 CFG_TGT_DEFAULT_GTX_PER_MARGIN;
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302460 intr[params.vdev_id].config.gtx_info.gtxTPCstep =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002461 CFG_TGT_DEFAULT_GTX_TPC_STEP;
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302462 intr[params.vdev_id].config.gtx_info.gtxTPCMin =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002463 CFG_TGT_DEFAULT_GTX_TPC_MIN;
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302464 intr[params.vdev_id].config.gtx_info.gtxBWMask =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002465 CFG_TGT_DEFAULT_GTX_BW_MASK;
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302466 intr[params.vdev_id].mhz = params.chan_freq;
Tushnim Bhattacharyya7624a182016-03-30 13:30:46 -07002467 intr[params.vdev_id].chan_width = req->chan_width;
Krishna Kumaar Natarajan0103ef82017-02-17 18:15:56 -08002468 wma_copy_txrxnode_he_ops(&intr[params.vdev_id], req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002469
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302470 temp_chan_info &= 0xffffffc0;
2471 temp_chan_info |= params.chan_mode;
2472
2473 params.band_center_freq1 = params.chan_freq;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002474
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07002475 bw_val = wlan_reg_get_bw_value(req->chan_width);
Kiran Kumar Lokere02b9aa42016-05-26 14:54:49 -07002476 if (20 < bw_val)
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302477 params.band_center_freq1 =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002478 cds_chan_to_freq(req->ch_center_freq_seg0);
Kiran Kumar Lokere02b9aa42016-05-26 14:54:49 -07002479 if (80 < bw_val)
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302480 params.band_center_freq2 =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002481 cds_chan_to_freq(req->ch_center_freq_seg1);
2482 else
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302483 params.band_center_freq2 = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002484
2485 /* Set half or quarter rate WMI flags */
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302486 params.is_half_rate = req->is_half_rate;
2487 params.is_quarter_rate = req->is_quarter_rate;
2488
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002489 if (req->is_half_rate)
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302490 temp_chan_info |= (1 << WMI_CHAN_FLAG_HALF_RATE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002491 else if (req->is_quarter_rate)
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302492 temp_chan_info |= (1 << WMI_CHAN_FLAG_QUARTER_RATE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002493
2494 /*
2495 * If the channel has DFS set, flip on radar reporting.
2496 *
2497 * It may be that this should only be done for IBSS/hostap operation
2498 * as this flag may be interpreted (at some point in the future)
2499 * by the firmware as "oh, and please do radar DETECTION."
2500 *
2501 * If that is ever the case we would insert the decision whether to
2502 * enable the firmware flag here.
2503 */
2504
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302505 params.is_dfs = req->is_dfs;
2506 params.is_restart = isRestart;
Arif Hussain671a1902017-03-17 09:08:32 -07002507 params.cac_duration_ms = req->cac_duration_ms;
2508 params.regdomain = req->dfs_regdomain;
Manjunathappa Prakash0e6e6b52016-04-21 11:48:48 -07002509 if ((QDF_GLOBAL_MONITOR_MODE != cds_get_conparam()) && req->is_dfs) {
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302510 temp_chan_info |= (1 << WMI_CHAN_FLAG_DFS);
2511 params.dis_hw_ack = true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002512
2513 /*
Arif Hussaincd151632017-02-11 16:57:19 -08002514 * If channel is DFS and operating in AP mode,
2515 * set the WMI_CHAN_FLAG_DFS flag.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002516 */
Arif Hussaincd151632017-02-11 16:57:19 -08002517 if (wma_is_vdev_in_ap_mode(wma, params.vdev_id) == true)
2518 params.flag_dfs = WMI_CHAN_FLAG_DFS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002519 }
2520
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302521 params.beacon_intval = req->beacon_intval;
2522 params.dtim_period = req->dtim_period;
Jiachao Wu712d4fd2017-08-23 16:52:34 +08002523
2524 if (req->beacon_tx_rate) {
2525 WMA_LOGD("%s: beacon tx rate [%hu * 100 Kbps]",
2526 __func__, req->beacon_tx_rate);
2527 temp_flags |= WMI_UNIFIED_VDEV_START_BCN_TX_RATE_PRESENT;
2528 /*
2529 * beacon_tx_rate is in multiples of 100 Kbps.
2530 * Convert the data rate to hw rate code.
2531 */
2532 params.bcn_tx_rate_code =
2533 wma_get_bcn_rate_code(req->beacon_tx_rate);
2534 }
2535
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002536 /* FIXME: Find out min, max and regulatory power levels */
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302537 params.max_txpow = req->max_txpow;
2538 temp_reg_info_1 &= 0xff00ffff;
2539 temp_reg_info_1 |= ((req->max_txpow&0xff) << 16);
2540
2541 temp_reg_info_2 &= 0xffff00ff;
2542 temp_reg_info_2 |= ((req->max_txpow&0xff)<<8);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002543
2544 /* TODO: Handle regulatory class, max antenna */
2545 if (!isRestart) {
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302546 params.beacon_intval = req->beacon_intval;
2547 params.dtim_period = req->dtim_period;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002548
2549 /* Copy the SSID */
2550 if (req->ssid.length) {
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302551 params.ssid.length = req->ssid.length;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002552 if (req->ssid.length < sizeof(cmd->ssid.ssid))
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302553 temp_ssid_len = req->ssid.length;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002554 else
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302555 temp_ssid_len = sizeof(cmd->ssid.ssid);
2556 qdf_mem_copy(params.ssid.mac_ssid, req->ssid.ssId,
2557 temp_ssid_len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002558 }
2559
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302560 params.pmf_enabled = req->pmf_enabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002561 if (req->pmf_enabled)
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302562 temp_flags |= WMI_UNIFIED_VDEV_START_PMF_ENABLED;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002563 }
2564
gaurank kathpalia1b42e8d2017-12-15 15:44:06 +05302565 params.hidden_ssid = req->hidden_ssid;
2566 if (req->hidden_ssid)
2567 temp_flags |= WMI_UNIFIED_VDEV_START_HIDDEN_SSID;
2568
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302569 params.num_noa_descriptors = 0;
2570 params.preferred_rx_streams = req->preferred_rx_streams;
2571 params.preferred_tx_streams = req->preferred_tx_streams;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002572
Krishna Kumaar Natarajan0103ef82017-02-17 18:15:56 -08002573 wma_copy_vdev_start_he_ops(&params, req);
2574
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002575 /* Store vdev params in SAP mode which can be used in vdev restart */
2576 if (intr[req->vdev_id].type == WMI_VDEV_TYPE_AP &&
2577 intr[req->vdev_id].sub_type == 0) {
2578 intr[req->vdev_id].vdev_restart_params.vdev_id = req->vdev_id;
2579 intr[req->vdev_id].vdev_restart_params.ssid.ssid_len =
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302580 temp_ssid_len;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302581 qdf_mem_copy(intr[req->vdev_id].vdev_restart_params.ssid.ssid,
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302582 params.ssid.mac_ssid, temp_ssid_len);
2583 intr[req->vdev_id].vdev_restart_params.flags = temp_flags;
2584 intr[req->vdev_id].vdev_restart_params.requestor_id = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002585 intr[req->vdev_id].vdev_restart_params.disable_hw_ack =
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302586 params.dis_hw_ack;
2587 intr[req->vdev_id].vdev_restart_params.chan.mhz =
2588 params.chan_freq;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002589 intr[req->vdev_id].vdev_restart_params.chan.band_center_freq1 =
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302590 params.band_center_freq1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002591 intr[req->vdev_id].vdev_restart_params.chan.band_center_freq2 =
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302592 params.band_center_freq2;
2593 intr[req->vdev_id].vdev_restart_params.chan.info =
2594 temp_chan_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002595 intr[req->vdev_id].vdev_restart_params.chan.reg_info_1 =
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302596 temp_reg_info_1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002597 intr[req->vdev_id].vdev_restart_params.chan.reg_info_2 =
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302598 temp_reg_info_2;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002599 }
2600
2601 if (isRestart) {
2602 /*
2603 * Marking the VDEV UP STATUS to false
2604 * since, VDEV RESTART will do a VDEV DOWN
2605 * in the firmware.
2606 */
Mukul Sharmaf9047232017-03-02 16:58:56 +05302607 wma_vdev_set_mlme_state(wma, params.vdev_id, WLAN_VDEV_S_STOP);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002608 } else {
2609 WMA_LOGD("%s, vdev_id: %d, unpausing tx_ll_queue at VDEV_START",
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302610 __func__, params.vdev_id);
Leo Chang96464902016-10-28 11:10:54 -07002611 cdp_fc_vdev_unpause(cds_get_context(QDF_MODULE_ID_SOC),
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08002612 wma->interfaces[params.vdev_id].handle,
2613 0xffffffff);
Mukul Sharma6411bb82017-03-01 15:57:07 +05302614 wma_vdev_update_pause_bitmap(params.vdev_id, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002615 }
2616
Dustin Brownd5f12942017-03-10 11:06:25 -08002617 return wma_send_vdev_start_to_fw(wma, &params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002618}
2619
2620/**
2621 * wma_peer_assoc_conf_handler() - peer assoc conf handler
2622 * @handle: wma handle
2623 * @cmd_param_info: event buffer
2624 * @len: buffer length
2625 *
2626 * Return: 0 for success or error code
2627 */
2628int wma_peer_assoc_conf_handler(void *handle, uint8_t *cmd_param_info,
2629 uint32_t len)
2630{
2631 tp_wma_handle wma = (tp_wma_handle) handle;
2632 WMI_PEER_ASSOC_CONF_EVENTID_param_tlvs *param_buf;
2633 wmi_peer_assoc_conf_event_fixed_param *event;
2634 struct wma_target_req *req_msg;
2635 uint8_t macaddr[IEEE80211_ADDR_LEN];
2636 int status = 0;
2637
2638 WMA_LOGD(FL("Enter"));
2639 param_buf = (WMI_PEER_ASSOC_CONF_EVENTID_param_tlvs *) cmd_param_info;
2640 if (!param_buf) {
2641 WMA_LOGE("Invalid peer assoc conf event buffer");
2642 return -EINVAL;
2643 }
2644
2645 event = param_buf->fixed_param;
2646 if (!event) {
2647 WMA_LOGE("Invalid peer assoc conf event buffer");
2648 return -EINVAL;
2649 }
2650
2651 WMI_MAC_ADDR_TO_CHAR_ARRAY(&event->peer_macaddr, macaddr);
2652 WMA_LOGD(FL("peer assoc conf for vdev:%d mac=%pM"),
2653 event->vdev_id, macaddr);
2654
2655 req_msg = wma_find_req(wma, event->vdev_id,
2656 WMA_PEER_ASSOC_CNF_START);
2657
2658 if (!req_msg) {
2659 WMA_LOGE(FL("Failed to lookup request message for vdev %d"),
2660 event->vdev_id);
2661 return -EINVAL;
2662 }
2663
Anurag Chouhan210db072016-02-22 18:42:15 +05302664 qdf_mc_timer_stop(&req_msg->event_timeout);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002665
2666 if (req_msg->msg_type == WMA_ADD_STA_REQ) {
2667 tpAddStaParams params = (tpAddStaParams)req_msg->user_data;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002668
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002669 if (!params) {
2670 WMA_LOGE(FL("add STA params is NULL for vdev %d"),
2671 event->vdev_id);
2672 status = -EINVAL;
2673 goto free_req_msg;
2674 }
2675
2676 /* peer assoc conf event means the cmd succeeds */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302677 params->status = QDF_STATUS_SUCCESS;
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08002678 WMA_LOGD(FL("Send ADD_STA_RSP: statype %d vdev_id %d aid %d bssid %pM staIdx %d status %d"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002679 params->staType, params->smesessionId,
2680 params->assocId, params->bssId, params->staIdx,
2681 params->status);
Abhishek Singh2d775fd2017-08-18 10:51:33 +05302682 wma_send_msg_high_priority(wma, WMA_ADD_STA_RSP,
2683 (void *)params, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002684 } else if (req_msg->msg_type == WMA_ADD_BSS_REQ) {
2685 tpAddBssParams params = (tpAddBssParams) req_msg->user_data;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002686
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002687 if (!params) {
2688 WMA_LOGE(FL("add BSS params is NULL for vdev %d"),
2689 event->vdev_id);
2690 status = -EINVAL;
2691 goto free_req_msg;
2692 }
2693
2694 /* peer assoc conf event means the cmd succeeds */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302695 params->status = QDF_STATUS_SUCCESS;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002696 WMA_LOGD(FL("Send ADD BSS RSP: opermode: %d update_bss: %d nw_type: %d bssid: %pM staIdx %d status %d"),
2697 params->operMode,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002698 params->updateBss, params->nwType, params->bssId,
2699 params->staContext.staIdx, params->status);
Abhishek Singh2d775fd2017-08-18 10:51:33 +05302700 wma_send_msg_high_priority(wma, WMA_ADD_BSS_RSP,
2701 (void *)params, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002702 } else {
2703 WMA_LOGE(FL("Unhandled request message type: %d"),
2704 req_msg->msg_type);
2705 }
2706
2707free_req_msg:
Anurag Chouhan210db072016-02-22 18:42:15 +05302708 qdf_mc_timer_destroy(&req_msg->event_timeout);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302709 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002710
2711 return status;
2712}
2713
2714/**
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08002715 * wma_vdev_delete_handler() - vdev delete response handler
2716 * @handle: wma handle
2717 * @cmd_param_info: event buffer
2718 * @len: buffer length
2719 *
2720 * Return: 0 for success or error code
2721 */
2722int wma_vdev_delete_handler(void *handle, uint8_t *cmd_param_info,
2723 uint32_t len)
2724{
2725 tp_wma_handle wma = (tp_wma_handle) handle;
2726 WMI_VDEV_DELETE_RESP_EVENTID_param_tlvs *param_buf;
2727 wmi_vdev_delete_cmd_fixed_param *event;
2728 struct wma_target_req *req_msg;
2729 int status = 0;
2730
2731 param_buf = (WMI_VDEV_DELETE_RESP_EVENTID_param_tlvs *)cmd_param_info;
2732 if (!param_buf) {
2733 WMA_LOGE("Invalid vdev delete event buffer");
2734 return -EINVAL;
2735 }
2736
2737 event = (wmi_vdev_delete_cmd_fixed_param *)param_buf->fixed_param;
2738 if (!event) {
2739 WMA_LOGE("Invalid vdev delete event buffer");
2740 return -EINVAL;
2741 }
2742
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07002743 WMA_LOGD("%s Vdev delete resp vdev id %d", __func__, event->vdev_id);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08002744 req_msg = wma_find_vdev_req(wma, event->vdev_id,
Kiran Kumar Lokere20804162017-07-17 16:09:04 -07002745 WMA_TARGET_REQ_TYPE_VDEV_DEL, true);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08002746 if (!req_msg) {
2747 WMA_LOGD(FL("Vdev delete resp is not handled! vdev id %d"),
2748 event->vdev_id);
2749 return -EINVAL;
2750 }
Dustin Brownec2c92e2017-07-26 11:13:49 -07002751
2752 wma_release_wakelock(&wma->wmi_cmd_rsp_wake_lock);
2753
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08002754 /* Send response to upper layers */
2755 wma_vdev_detach_callback(req_msg->user_data);
Anurag Chouhan210db072016-02-22 18:42:15 +05302756 qdf_mc_timer_stop(&req_msg->event_timeout);
2757 qdf_mc_timer_destroy(&req_msg->event_timeout);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302758 qdf_mem_free(req_msg);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08002759
2760 return status;
2761}
2762
2763/**
2764 * wma_peer_delete_handler() - peer delete response handler
2765 * @handle: wma handle
2766 * @cmd_param_info: event buffer
2767 * @len: buffer length
2768 *
2769 * Return: 0 for success or error code
2770 */
2771int wma_peer_delete_handler(void *handle, uint8_t *cmd_param_info,
2772 uint32_t len)
2773{
2774 tp_wma_handle wma = (tp_wma_handle) handle;
2775 WMI_PEER_DELETE_RESP_EVENTID_param_tlvs *param_buf;
2776 wmi_peer_delete_cmd_fixed_param *event;
2777 struct wma_target_req *req_msg;
2778 tDeleteStaParams *del_sta;
2779 uint8_t macaddr[IEEE80211_ADDR_LEN];
2780 int status = 0;
2781
2782 param_buf = (WMI_PEER_DELETE_RESP_EVENTID_param_tlvs *)cmd_param_info;
2783 if (!param_buf) {
2784 WMA_LOGE("Invalid vdev delete event buffer");
2785 return -EINVAL;
2786 }
2787
2788 event = (wmi_peer_delete_cmd_fixed_param *)param_buf->fixed_param;
2789 if (!event) {
2790 WMA_LOGE("Invalid vdev delete event buffer");
2791 return -EINVAL;
2792 }
2793
2794 WMI_MAC_ADDR_TO_CHAR_ARRAY(&event->peer_macaddr, macaddr);
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07002795 WMA_LOGD(FL("Peer Delete Response, vdev %d Peer %pM"),
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08002796 event->vdev_id, macaddr);
Deepak Dhamdheref918d422017-07-06 12:56:29 -07002797 wlan_roam_debug_log(event->vdev_id, DEBUG_PEER_DELETE_RESP,
2798 DEBUG_INVALID_PEER_ID, macaddr, NULL, 0, 0);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08002799 req_msg = wma_find_remove_req_msgtype(wma, event->vdev_id,
2800 WMA_DELETE_STA_REQ);
2801 if (!req_msg) {
2802 WMA_LOGD("Peer Delete response is not handled");
2803 return -EINVAL;
2804 }
2805
Dustin Brownec2c92e2017-07-26 11:13:49 -07002806 wma_release_wakelock(&wma->wmi_cmd_rsp_wake_lock);
2807
2808 /* Cleanup timeout handler */
Anurag Chouhan210db072016-02-22 18:42:15 +05302809 qdf_mc_timer_stop(&req_msg->event_timeout);
2810 qdf_mc_timer_destroy(&req_msg->event_timeout);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08002811
2812 if (req_msg->type == WMA_DELETE_STA_RSP_START) {
2813 del_sta = req_msg->user_data;
2814 if (del_sta->respReqd) {
2815 WMA_LOGD(FL("Sending peer del rsp to umac"));
Abhishek Singh2d775fd2017-08-18 10:51:33 +05302816 wma_send_msg_high_priority(wma, WMA_DELETE_STA_RSP,
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302817 (void *)del_sta, QDF_STATUS_SUCCESS);
yeshwanth sriram guntuka945b6212017-03-07 15:56:45 +05302818 } else {
2819 qdf_mem_free(del_sta);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08002820 }
2821 } else if (req_msg->type == WMA_DEL_P2P_SELF_STA_RSP_START) {
2822 struct del_sta_self_rsp_params *data;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002823
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08002824 data = (struct del_sta_self_rsp_params *)req_msg->user_data;
2825 WMA_LOGD(FL("Calling vdev detach handler"));
2826 wma_handle_vdev_detach(wma, data->self_sta_param,
2827 data->generate_rsp);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302828 qdf_mem_free(data);
Sandeep Puligillabbee8172017-04-07 19:26:33 -07002829 } else if (req_msg->type == WMA_SET_LINK_PEER_RSP) {
2830 tpLinkStateParams params =
2831 (tpLinkStateParams) req_msg->user_data;
Dustin Brownec2c92e2017-07-26 11:13:49 -07002832 if (wma_send_vdev_down_to_fw(wma, req_msg->vdev_id) !=
2833 QDF_STATUS_SUCCESS) {
Sandeep Puligillabbee8172017-04-07 19:26:33 -07002834 WMA_LOGE("Failed to send vdev down cmd: vdev %d",
2835 req_msg->vdev_id);
2836 }
2837 wma_send_msg(wma, WMA_SET_LINK_STATE_RSP, (void *)params, 0);
Abhishek Singhe8be9a62017-05-30 12:13:29 +05302838 } else if (req_msg->type == WMA_DELETE_PEER_RSP) {
2839 wma_send_del_bss_response(wma, req_msg, req_msg->vdev_id);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08002840 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302841 qdf_mem_free(req_msg);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08002842 return status;
2843}
2844
Manikandan Mohanb089ed62017-02-13 11:38:14 -08002845static inline bool wma_crash_on_fw_timeout(bool crash_enabled)
2846{
2847 /* Discard FW timeouts and dont crash during SSR */
2848 if (cds_is_driver_recovering())
2849 return false;
2850
Sandeep Puligilla5ac6bd22017-10-17 12:33:56 -07002851 /* Firmware is down send failure response */
2852 if (cds_is_fw_down())
Nachiket Kukade8003d252017-03-30 15:55:58 +05302853 return false;
2854
Kapil Gupta8c336652017-05-30 16:54:13 +05302855 if (cds_is_driver_unloading())
2856 return false;
2857
Manikandan Mohanb089ed62017-02-13 11:38:14 -08002858 return crash_enabled;
2859}
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08002860
2861/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002862 * wma_hold_req_timer() - wma hold request timeout function
2863 * @data: target request params
2864 *
2865 * Return: none
2866 */
2867void wma_hold_req_timer(void *data)
2868{
2869 tp_wma_handle wma;
2870 struct wma_target_req *tgt_req = (struct wma_target_req *)data;
2871 struct wma_target_req *msg;
2872
Anurag Chouhan6d760662016-02-20 16:05:43 +05302873 wma = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002874 if (NULL == wma) {
2875 WMA_LOGE(FL("Failed to get wma"));
Naveen Rawat0eb3dd02017-04-03 20:18:30 -07002876 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002877 }
2878
2879 WMA_LOGA(FL("request %d is timed out for vdev_id - %d"),
2880 tgt_req->msg_type, tgt_req->vdev_id);
2881 msg = wma_find_req(wma, tgt_req->vdev_id, tgt_req->type);
2882
2883 if (!msg) {
2884 WMA_LOGE(FL("Failed to lookup request message - %d"),
2885 tgt_req->msg_type);
Naveen Rawat0eb3dd02017-04-03 20:18:30 -07002886 /*
2887 * if find request failed, then firmware rsp should have
2888 * consumed the buffer. Do not free.
2889 */
2890 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002891 }
2892
2893 if (tgt_req->msg_type == WMA_ADD_STA_REQ) {
2894 tpAddStaParams params = (tpAddStaParams) tgt_req->user_data;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002895
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302896 params->status = QDF_STATUS_E_TIMEOUT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002897 WMA_LOGA(FL("WMA_ADD_STA_REQ timed out"));
2898 WMA_LOGD(FL("Sending add sta rsp to umac (mac:%pM, status:%d)"),
2899 params->staMac, params->status);
Manikandan Mohanb089ed62017-02-13 11:38:14 -08002900 if (wma_crash_on_fw_timeout(wma->fw_timeout_crash) == true)
2901 QDF_BUG(0);
Sandeep Puligillaafa52892016-10-26 19:03:16 -07002902 else
Abhishek Singh2d775fd2017-08-18 10:51:33 +05302903 wma_send_msg_high_priority(wma, WMA_ADD_STA_RSP,
2904 (void *)params, 0);
Krishna Kumaar Natarajanf1d6dee2016-02-11 16:40:43 -08002905 } else if (tgt_req->msg_type == WMA_ADD_BSS_REQ) {
2906 tpAddBssParams params = (tpAddBssParams) tgt_req->user_data;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002907
Krishna Kumaar Natarajanf1d6dee2016-02-11 16:40:43 -08002908 params->status = QDF_STATUS_E_TIMEOUT;
2909 WMA_LOGA(FL("WMA_ADD_BSS_REQ timed out"));
2910 WMA_LOGD(FL("Sending add bss rsp to umac (mac:%pM, status:%d)"),
2911 params->selfMacAddr, params->status);
Manikandan Mohanb089ed62017-02-13 11:38:14 -08002912 if (wma_crash_on_fw_timeout(wma->fw_timeout_crash) == true)
2913 QDF_BUG(0);
Sandeep Puligillaafa52892016-10-26 19:03:16 -07002914 else
Abhishek Singh2d775fd2017-08-18 10:51:33 +05302915 wma_send_msg_high_priority(wma, WMA_ADD_BSS_RSP,
2916 (void *)params, 0);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08002917 } else if ((tgt_req->msg_type == WMA_DELETE_STA_REQ) &&
2918 (tgt_req->type == WMA_DELETE_STA_RSP_START)) {
2919 tpDeleteStaParams params =
2920 (tpDeleteStaParams) tgt_req->user_data;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302921 params->status = QDF_STATUS_E_TIMEOUT;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08002922 WMA_LOGE(FL("WMA_DEL_STA_REQ timed out"));
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07002923 WMA_LOGE(FL("Sending del sta rsp to umac (mac:%pM, status:%d)"),
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08002924 params->staMac, params->status);
Sandeep Puligillaafa52892016-10-26 19:03:16 -07002925
Manikandan Mohanb089ed62017-02-13 11:38:14 -08002926 if (wma_crash_on_fw_timeout(wma->fw_timeout_crash) == true) {
2927 QDF_BUG(0);
Sandeep Puligillaafa52892016-10-26 19:03:16 -07002928 } else {
2929 /*
2930 * Assert in development build only.
2931 * Send response in production builds.
2932 */
2933 QDF_ASSERT(0);
Abhishek Singh2d775fd2017-08-18 10:51:33 +05302934 wma_send_msg_high_priority(wma, WMA_DELETE_STA_RSP,
Sandeep Puligillaafa52892016-10-26 19:03:16 -07002935 (void *)params, 0);
2936 }
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08002937 } else if ((tgt_req->msg_type == WMA_DELETE_STA_REQ) &&
2938 (tgt_req->type == WMA_DEL_P2P_SELF_STA_RSP_START)) {
Abhishek Singhc614ec42017-04-25 16:17:34 +05302939 struct del_sta_self_rsp_params *del_sta;
Srinivas Girigowda4d65ebe2017-10-13 21:41:42 -07002940
Abhishek Singhc614ec42017-04-25 16:17:34 +05302941 del_sta = (struct del_sta_self_rsp_params *)tgt_req->user_data;
2942 del_sta->self_sta_param->status = QDF_STATUS_E_TIMEOUT;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08002943 WMA_LOGA(FL("wma delete sta p2p request timed out"));
Abhishek Singhc614ec42017-04-25 16:17:34 +05302944
2945 if (wma_crash_on_fw_timeout(wma->fw_timeout_crash)) {
2946 QDF_BUG(0);
2947 } else {
2948 if (del_sta->generate_rsp)
2949 wma_send_del_sta_self_resp(
2950 del_sta->self_sta_param);
2951 }
2952 qdf_mem_free(tgt_req->user_data);
Sandeep Puligillabbee8172017-04-07 19:26:33 -07002953 } else if ((tgt_req->msg_type == WMA_DELETE_STA_REQ) &&
2954 (tgt_req->type == WMA_SET_LINK_PEER_RSP)) {
Abhishek Singhc614ec42017-04-25 16:17:34 +05302955 tpLinkStateParams params =
2956 (tpLinkStateParams) tgt_req->user_data;
2957
2958 params->status = false;
Sandeep Puligillabbee8172017-04-07 19:26:33 -07002959 WMA_LOGA(FL("wma delete peer for set link timed out"));
2960 if (wma_crash_on_fw_timeout(wma->fw_timeout_crash) == true)
2961 QDF_BUG(0);
Abhishek Singhc614ec42017-04-25 16:17:34 +05302962 else
2963 wma_send_msg(wma, WMA_SET_LINK_STATE_RSP,
2964 params, 0);
Abhishek Singhe8be9a62017-05-30 12:13:29 +05302965 } else if ((tgt_req->msg_type == WMA_DELETE_STA_REQ) &&
2966 (tgt_req->type == WMA_DELETE_PEER_RSP)) {
Abhishek Singhc614ec42017-04-25 16:17:34 +05302967 tpDeleteBssParams params =
2968 (tpDeleteBssParams) tgt_req->user_data;
2969
2970 params->status = QDF_STATUS_E_TIMEOUT;
2971 WMA_LOGE(FL("wma delete peer for del bss req timed out"));
Abhishek Singhe8be9a62017-05-30 12:13:29 +05302972 if (wma_crash_on_fw_timeout(wma->fw_timeout_crash) == true)
2973 QDF_BUG(0);
Abhishek Singhc614ec42017-04-25 16:17:34 +05302974 else
Abhishek Singh2d775fd2017-08-18 10:51:33 +05302975 wma_send_msg_high_priority(wma, WMA_DELETE_BSS_RSP,
2976 params, 0);
Tushnim Bhattacharyya86294892017-10-25 16:29:11 -07002977 } else if ((tgt_req->msg_type == SIR_HAL_PDEV_SET_HW_MODE) &&
2978 (tgt_req->type == WMA_PDEV_SET_HW_MODE_RESP)) {
2979 struct sir_set_hw_mode_resp *params =
2980 qdf_mem_malloc(sizeof(*params));
2981
2982 WMA_LOGE(FL("set hw mode req timed out"));
2983
2984 if (!params)
2985 WMA_LOGE("%s: Memory allocation failed", __func__);
2986 else {
2987 params->status = SET_HW_MODE_STATUS_ECANCELED;
2988 params->cfgd_hw_mode_index = 0;
2989 params->num_vdev_mac_entries = 0;
2990
2991 if (wma_crash_on_fw_timeout(wma->fw_timeout_crash) == true)
2992 QDF_BUG(0);
2993 else
2994 wma_send_msg_high_priority(wma,
2995 SIR_HAL_PDEV_SET_HW_MODE_RESP, params, 0);
2996 }
Krishna Kumaar Natarajanf1d6dee2016-02-11 16:40:43 -08002997 } else {
2998 WMA_LOGE(FL("Unhandled timeout for msg_type:%d and type:%d"),
2999 tgt_req->msg_type, tgt_req->type);
3000 QDF_BUG(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003001 }
Abhishek Singh07b97852017-08-01 11:10:07 +05303002 qdf_mc_timer_destroy(&tgt_req->event_timeout);
Abhishek Singhc614ec42017-04-25 16:17:34 +05303003 qdf_mem_free(tgt_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003004}
3005
3006/**
3007 * wma_fill_hold_req() - fill wma request
3008 * @wma: wma handle
3009 * @msg_type: message type
3010 * @type: request type
3011 * @params: request params
3012 * @timeout: timeout value
3013 *
3014 * Return: wma_target_req ptr
3015 */
3016struct wma_target_req *wma_fill_hold_req(tp_wma_handle wma,
3017 uint8_t vdev_id,
3018 uint32_t msg_type, uint8_t type,
3019 void *params, uint32_t timeout)
3020{
3021 struct wma_target_req *req;
Anurag Chouhanffb21542016-02-17 14:33:03 +05303022 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003023
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303024 req = qdf_mem_malloc(sizeof(*req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003025 if (!req) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07003026 WMA_LOGE(FL("Failed to allocate memory for msg %d vdev %d"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003027 msg_type, vdev_id);
3028 return NULL;
3029 }
3030
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07003031 WMA_LOGD(FL("vdev_id %d msg %d type %d"), vdev_id, msg_type, type);
Abhishek Singhc614ec42017-04-25 16:17:34 +05303032 qdf_spin_lock_bh(&wma->wma_hold_req_q_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003033 req->vdev_id = vdev_id;
3034 req->msg_type = msg_type;
3035 req->type = type;
3036 req->user_data = params;
Anurag Chouhanffb21542016-02-17 14:33:03 +05303037 status = qdf_list_insert_back(&wma->wma_hold_req_queue, &req->node);
3038 if (QDF_STATUS_SUCCESS != status) {
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303039 qdf_spin_unlock_bh(&wma->wma_hold_req_q_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003040 WMA_LOGE(FL("Failed add request in queue"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303041 qdf_mem_free(req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003042 return NULL;
3043 }
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303044 qdf_spin_unlock_bh(&wma->wma_hold_req_q_lock);
Abhishek Singhc614ec42017-04-25 16:17:34 +05303045 qdf_mc_timer_init(&req->event_timeout, QDF_TIMER_TYPE_SW,
3046 wma_hold_req_timer, req);
3047 qdf_mc_timer_start(&req->event_timeout, timeout);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003048 return req;
3049}
3050
3051/**
3052 * wma_remove_req() - remove request
3053 * @wma: wma handle
3054 * @vdev_id: vdev id
3055 * @type: type
3056 *
3057 * Return: none
3058 */
3059void wma_remove_req(tp_wma_handle wma, uint8_t vdev_id,
3060 uint8_t type)
3061{
3062 struct wma_target_req *req_msg;
3063
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07003064 WMA_LOGD(FL("Remove req for vdev: %d type: %d"), vdev_id, type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003065 req_msg = wma_find_req(wma, vdev_id, type);
3066 if (!req_msg) {
3067 WMA_LOGE(FL("target req not found for vdev: %d type: %d"),
3068 vdev_id, type);
3069 return;
3070 }
3071
Anurag Chouhan210db072016-02-22 18:42:15 +05303072 qdf_mc_timer_stop(&req_msg->event_timeout);
3073 qdf_mc_timer_destroy(&req_msg->event_timeout);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303074 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003075}
3076
3077/**
3078 * wma_vdev_resp_timer() - wma response timeout function
3079 * @data: target request params
3080 *
3081 * Return: none
3082 */
3083void wma_vdev_resp_timer(void *data)
3084{
3085 tp_wma_handle wma;
3086 struct wma_target_req *tgt_req = (struct wma_target_req *)data;
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003087 struct cdp_pdev *pdev;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003088 struct wma_target_req *msg;
Sandeep Puligilla7da86332016-11-10 16:14:40 -08003089 uint8_t peer_id;
Abhishek Singhc614ec42017-04-25 16:17:34 +05303090 int status;
Sandeep Puligilla7da86332016-11-10 16:14:40 -08003091 void *peer;
Leo Chang96464902016-10-28 11:10:54 -07003092 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003093#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
Wu Gao30f65eb2017-08-09 19:56:10 +08003094 tpAniSirGlobal mac_ctx;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003095#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
3096
Anurag Chouhan6d760662016-02-20 16:05:43 +05303097 wma = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003098
3099 if (NULL == wma) {
3100 WMA_LOGE("%s: Failed to get wma", __func__);
Liangwei Dong748cb5d2016-09-29 00:56:40 -04003101 wma_cleanup_target_req_param(tgt_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003102 goto free_tgt_req;
3103 }
3104
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003105 WMA_LOGA("%s: request %d is timed out for vdev_id - %d", __func__,
3106 tgt_req->msg_type, tgt_req->vdev_id);
Kiran Kumar Lokere20804162017-07-17 16:09:04 -07003107 msg = wma_find_vdev_req(wma, tgt_req->vdev_id, tgt_req->type, true);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003108
3109 if (!msg) {
3110 WMA_LOGE("%s: Failed to lookup request message - %d",
3111 __func__, tgt_req->msg_type);
Houston Hoffmanb4558eb2017-05-18 15:07:51 -07003112 return;
3113 }
3114
3115 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
3116
3117 if (NULL == pdev) {
3118 WMA_LOGE("%s: Failed to get pdev", __func__);
Liangwei Dong748cb5d2016-09-29 00:56:40 -04003119 wma_cleanup_target_req_param(tgt_req);
Houston Hoffmanb4558eb2017-05-18 15:07:51 -07003120 qdf_mc_timer_stop(&tgt_req->event_timeout);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003121 goto free_tgt_req;
3122 }
3123
Wu Gao30f65eb2017-08-09 19:56:10 +08003124#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
3125 mac_ctx = cds_get_context(QDF_MODULE_ID_PE);
3126 if (!mac_ctx) {
3127 WMA_LOGE("%s: Failed to get mac_ctx", __func__);
3128 wma_cleanup_target_req_param(tgt_req);
3129 goto free_tgt_req;
3130 }
3131#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
3132
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003133 if (tgt_req->msg_type == WMA_CHNL_SWITCH_REQ) {
3134 tpSwitchChannelParams params =
3135 (tpSwitchChannelParams) tgt_req->user_data;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303136 params->status = QDF_STATUS_E_TIMEOUT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003137 WMA_LOGA("%s: WMA_SWITCH_CHANNEL_REQ timedout", __func__);
Sandeep Puligillaafa52892016-10-26 19:03:16 -07003138
Nachiket Kukade8003d252017-03-30 15:55:58 +05303139 /*
3140 * Trigger host crash if the flag is set or if the timeout
3141 * is not due to fw down
3142 */
Manikandan Mohanb089ed62017-02-13 11:38:14 -08003143 if (wma_crash_on_fw_timeout(wma->fw_timeout_crash) == true)
3144 QDF_BUG(0);
Sandeep Puligillaafa52892016-10-26 19:03:16 -07003145 else
Abhishek Singh2d775fd2017-08-18 10:51:33 +05303146 wma_send_msg_high_priority(wma, WMA_SWITCH_CHANNEL_RSP,
Sandeep Puligillaafa52892016-10-26 19:03:16 -07003147 (void *)params, 0);
Agrawal Ashish7dd7c592016-02-22 14:25:11 +05303148 if (wma->interfaces[tgt_req->vdev_id].is_channel_switch) {
3149 wma->interfaces[tgt_req->vdev_id].is_channel_switch =
3150 false;
3151 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003152 } else if (tgt_req->msg_type == WMA_DELETE_BSS_REQ) {
3153 tpDeleteBssParams params =
3154 (tpDeleteBssParams) tgt_req->user_data;
3155 struct beacon_info *bcn;
3156 struct wma_txrx_node *iface;
3157
Naveen Rawatf2bd42d2017-06-29 14:51:43 -07003158 if (tgt_req->vdev_id >= wma->max_bssid) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003159 WMA_LOGE("%s: Invalid vdev_id %d", __func__,
3160 tgt_req->vdev_id);
Liangwei Dong748cb5d2016-09-29 00:56:40 -04003161 wma_cleanup_target_req_param(tgt_req);
Anurag Chouhan210db072016-02-22 18:42:15 +05303162 qdf_mc_timer_stop(&tgt_req->event_timeout);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003163 goto free_tgt_req;
3164 }
3165
3166 iface = &wma->interfaces[tgt_req->vdev_id];
3167 if (iface->handle == NULL) {
3168 WMA_LOGE("%s vdev id %d is already deleted",
3169 __func__, tgt_req->vdev_id);
Liangwei Dong748cb5d2016-09-29 00:56:40 -04003170 wma_cleanup_target_req_param(tgt_req);
Anurag Chouhan210db072016-02-22 18:42:15 +05303171 qdf_mc_timer_stop(&tgt_req->event_timeout);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003172 goto free_tgt_req;
3173 }
Nachiket Kukade8003d252017-03-30 15:55:58 +05303174 /*
3175 * Trigger host crash if the flag is set or if the timeout
3176 * is not due to fw down
3177 */
Manikandan Mohanb089ed62017-02-13 11:38:14 -08003178 if (wma_crash_on_fw_timeout(wma->fw_timeout_crash) == true) {
3179 QDF_BUG(0);
Prakash Dhavali0b792742016-12-02 17:56:36 -08003180 return;
3181 }
3182
Krishna Kumaar Natarajanf24bfc82017-02-07 11:54:05 -08003183 status = wma_remove_bss_peer(wma, pdev, tgt_req,
3184 tgt_req->vdev_id, params);
3185 if (status != 0)
3186 goto free_tgt_req;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003187
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05303188 if (wmi_service_enabled(
3189 wma->wmi_handle,
3190 wmi_service_sync_delete_cmds))
Abhishek Singhe8be9a62017-05-30 12:13:29 +05303191 goto free_tgt_req;
3192
Dustin Brownec2c92e2017-07-26 11:13:49 -07003193 if (wma_send_vdev_down_to_fw(wma, tgt_req->vdev_id) !=
3194 QDF_STATUS_SUCCESS) {
Sandeep Puligilla58c84ef2016-08-21 16:20:33 -07003195 WMA_LOGE("Failed to send vdev down cmd: vdev %d",
3196 tgt_req->vdev_id);
3197 } else {
Mukul Sharmaf9047232017-03-02 16:58:56 +05303198 wma_vdev_set_mlme_state(wma, tgt_req->vdev_id,
3199 WLAN_VDEV_S_STOP);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003200#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
Sandeep Puligilla58c84ef2016-08-21 16:20:33 -07003201 if (mac_ctx->sap.sap_channel_avoidance)
3202 wma_find_mcc_ap(wma, tgt_req->vdev_id, false);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003203#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
3204 }
Leo Chang96464902016-10-28 11:10:54 -07003205 cdp_fc_vdev_flush(soc, iface->handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003206 WMA_LOGD("%s, vdev_id: %d, un-pausing tx_ll_queue for WDA_DELETE_BSS_REQ timeout",
3207 __func__, tgt_req->vdev_id);
Leo Chang96464902016-10-28 11:10:54 -07003208 cdp_fc_vdev_unpause(soc, iface->handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003209 OL_TXQ_PAUSE_REASON_VDEV_STOP);
Mukul Sharma6411bb82017-03-01 15:57:07 +05303210 wma_vdev_clear_pause_bit(tgt_req->vdev_id, PAUSE_TYPE_HOST);
Anurag Chouhan8e0ccd32016-02-19 15:30:20 +05303211 qdf_atomic_set(&iface->bss_status, WMA_BSS_STATUS_STOPPED);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003212 WMA_LOGD("%s: (type %d subtype %d) BSS is stopped",
3213 __func__, iface->type, iface->sub_type);
3214
3215 bcn = wma->interfaces[tgt_req->vdev_id].beacon;
3216
3217 if (bcn) {
Jeff Johnsonadba3962017-09-18 08:12:35 -07003218 WMA_LOGD("%s: Freeing beacon struct %pK, template memory %pK",
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003219 __func__, bcn, bcn->buf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003220 if (bcn->dma_mapped)
Leo Chang96464902016-10-28 11:10:54 -07003221 qdf_nbuf_unmap_single(wma->qdf_dev, bcn->buf,
Anurag Chouhan6d760662016-02-20 16:05:43 +05303222 QDF_DMA_TO_DEVICE);
Nirav Shahcbc6d722016-03-01 16:24:53 +05303223 qdf_nbuf_free(bcn->buf);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303224 qdf_mem_free(bcn);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003225 wma->interfaces[tgt_req->vdev_id].beacon = NULL;
3226 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303227 params->status = QDF_STATUS_E_TIMEOUT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003228 WMA_LOGA("%s: WMA_DELETE_BSS_REQ timedout", __func__);
Abhishek Singh2d775fd2017-08-18 10:51:33 +05303229 wma_send_msg_high_priority(wma, WMA_DELETE_BSS_RSP,
3230 (void *)params, 0);
Abhishek Singh0d74f9e2017-09-26 14:02:42 +05303231 if (iface->del_staself_req && iface->is_del_sta_defered) {
3232 iface->is_del_sta_defered = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003233 WMA_LOGA("scheduling defered deletion(vdev id %x)",
3234 tgt_req->vdev_id);
3235 wma_vdev_detach(wma, iface->del_staself_req, 1);
3236 }
3237 } else if (tgt_req->msg_type == WMA_DEL_STA_SELF_REQ) {
3238 struct wma_txrx_node *iface =
3239 (struct wma_txrx_node *)tgt_req->user_data;
3240 struct del_sta_self_params *params =
3241 (struct del_sta_self_params *) iface->del_staself_req;
3242
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05303243 if (wmi_service_enabled(wma->wmi_handle,
3244 wmi_service_sync_delete_cmds)) {
Dustin Brownec2c92e2017-07-26 11:13:49 -07003245 wma_release_wakelock(&wma->wmi_cmd_rsp_wake_lock);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003246 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303247 params->status = QDF_STATUS_E_TIMEOUT;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003248
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003249 WMA_LOGA("%s: WMA_DEL_STA_SELF_REQ timedout", __func__);
Abhishek Singhc614ec42017-04-25 16:17:34 +05303250 if (wma_crash_on_fw_timeout(wma->fw_timeout_crash) == true)
Manikandan Mohanb089ed62017-02-13 11:38:14 -08003251 QDF_BUG(0);
Abhishek Singhc614ec42017-04-25 16:17:34 +05303252 else
3253 wma_send_del_sta_self_resp(iface->del_staself_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003254 if (iface->addBssStaContext)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303255 qdf_mem_free(iface->addBssStaContext);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003256 if (iface->staKeyParams)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303257 qdf_mem_free(iface->staKeyParams);
Dustin Brown35b61f62017-08-31 16:03:32 -07003258
3259 wma_vdev_deinit(iface);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303260 qdf_mem_zero(iface, sizeof(*iface));
Dustin Brown35b61f62017-08-31 16:03:32 -07003261 wma_vdev_init(iface);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003262 } else if (tgt_req->msg_type == WMA_ADD_BSS_REQ) {
3263 tpAddBssParams params = (tpAddBssParams) tgt_req->user_data;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003264
Krishna Kumaar Natarajan06edf7c2016-11-17 12:21:59 -08003265 params->status = QDF_STATUS_E_TIMEOUT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003266 WMA_LOGA("%s: WMA_ADD_BSS_REQ timedout", __func__);
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07003267 WMA_LOGD("%s: bssid %pM vdev_id %d", __func__, params->bssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003268 tgt_req->vdev_id);
Manikandan Mohanb089ed62017-02-13 11:38:14 -08003269 if (wma_crash_on_fw_timeout(wma->fw_timeout_crash) == true) {
3270 QDF_BUG(0);
Sandeep Puligillaafa52892016-10-26 19:03:16 -07003271 } else {
Abhishek Singh2d775fd2017-08-18 10:51:33 +05303272 wma_send_msg_high_priority(wma, WMA_ADD_BSS_RSP,
3273 (void *)params, 0);
Sandeep Puligillaafa52892016-10-26 19:03:16 -07003274 QDF_ASSERT(0);
3275 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003276 goto free_tgt_req;
Sandeep Puligilla88de6fb2016-09-23 17:08:44 -07003277
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003278 } else if (tgt_req->msg_type == WMA_OCB_SET_CONFIG_CMD) {
3279 struct wma_txrx_node *iface;
3280
3281 WMA_LOGE(FL("Failed to send OCB set config cmd"));
3282 iface = &wma->interfaces[tgt_req->vdev_id];
Mukul Sharmaf9047232017-03-02 16:58:56 +05303283 wma_vdev_set_mlme_state(wma, tgt_req->vdev_id,
3284 WLAN_VDEV_S_STOP);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303285 wma_ocb_set_config_resp(wma, QDF_STATUS_E_TIMEOUT);
Selvaraj, Sridhara0083c42016-06-22 22:15:43 +05303286 } else if (tgt_req->msg_type == WMA_HIDDEN_SSID_VDEV_RESTART) {
3287 WMA_LOGE("Hidden ssid vdev restart Timed Out; vdev_id: %d, type = %d",
3288 tgt_req->vdev_id, tgt_req->type);
Sandeep Puligilla7da86332016-11-10 16:14:40 -08003289 } else if (tgt_req->msg_type == WMA_SET_LINK_STATE) {
3290 tpLinkStateParams params =
3291 (tpLinkStateParams) tgt_req->user_data;
3292
3293 peer = cdp_peer_find_by_addr(soc, pdev, params->bssid, &peer_id);
3294 if (peer) {
3295 WMA_LOGP(FL("Deleting peer %pM vdev id %d"),
3296 params->bssid, tgt_req->vdev_id);
3297 wma_remove_peer(wma, params->bssid, tgt_req->vdev_id,
3298 peer, false);
3299 }
Dustin Brownec2c92e2017-07-26 11:13:49 -07003300 if (wma_send_vdev_down_to_fw(wma, tgt_req->vdev_id) !=
3301 QDF_STATUS_SUCCESS) {
Sandeep Puligilla7da86332016-11-10 16:14:40 -08003302 WMA_LOGE("Failed to send vdev down cmd: vdev %d",
3303 tgt_req->vdev_id);
3304 }
3305 params->status = QDF_STATUS_E_TIMEOUT;
3306 WMA_LOGA("%s: WMA_SET_LINK_STATE timedout vdev %d", __func__,
3307 tgt_req->vdev_id);
3308 wma_send_msg(wma, WMA_SET_LINK_STATE_RSP, (void *)params, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003309 }
3310free_tgt_req:
Anurag Chouhan210db072016-02-22 18:42:15 +05303311 qdf_mc_timer_destroy(&tgt_req->event_timeout);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303312 qdf_mem_free(tgt_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003313}
3314
3315/**
3316 * wma_fill_vdev_req() - fill vdev request
3317 * @wma: wma handle
3318 * @msg_type: message type
3319 * @type: request type
3320 * @params: request params
3321 * @timeout: timeout value
3322 *
3323 * Return: wma_target_req ptr
3324 */
3325struct wma_target_req *wma_fill_vdev_req(tp_wma_handle wma,
3326 uint8_t vdev_id,
3327 uint32_t msg_type, uint8_t type,
3328 void *params, uint32_t timeout)
3329{
3330 struct wma_target_req *req;
Anurag Chouhanffb21542016-02-17 14:33:03 +05303331 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003332
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303333 req = qdf_mem_malloc(sizeof(*req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003334 if (!req) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07003335 WMA_LOGE("%s: Failed to allocate memory for msg %d vdev %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003336 __func__, msg_type, vdev_id);
3337 return NULL;
3338 }
3339
3340 WMA_LOGD("%s: vdev_id %d msg %d", __func__, vdev_id, msg_type);
Abhishek Singhc614ec42017-04-25 16:17:34 +05303341 qdf_spin_lock_bh(&wma->vdev_respq_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003342 req->vdev_id = vdev_id;
3343 req->msg_type = msg_type;
3344 req->type = type;
3345 req->user_data = params;
Anurag Chouhanffb21542016-02-17 14:33:03 +05303346 status = qdf_list_insert_back(&wma->vdev_resp_queue, &req->node);
3347 if (QDF_STATUS_SUCCESS != status) {
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303348 qdf_spin_unlock_bh(&wma->vdev_respq_lock);
Krishna Kumaar Natarajana5c53bd2015-10-27 11:48:27 -07003349 WMA_LOGE(FL("Failed add request in queue for vdev_id %d type %d"),
3350 vdev_id, type);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303351 qdf_mem_free(req);
Krishna Kumaar Natarajana5c53bd2015-10-27 11:48:27 -07003352 return NULL;
3353 }
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303354 qdf_spin_unlock_bh(&wma->vdev_respq_lock);
Abhishek Singhc614ec42017-04-25 16:17:34 +05303355 qdf_mc_timer_init(&req->event_timeout, QDF_TIMER_TYPE_SW,
3356 wma_vdev_resp_timer, req);
3357 qdf_mc_timer_start(&req->event_timeout, timeout);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003358 return req;
3359}
3360
3361/**
3362 * wma_remove_vdev_req() - remove vdev request
3363 * @wma: wma handle
3364 * @vdev_id: vdev id
3365 * @type: type
3366 *
3367 * Return: none
3368 */
3369void wma_remove_vdev_req(tp_wma_handle wma, uint8_t vdev_id,
3370 uint8_t type)
3371{
3372 struct wma_target_req *req_msg;
3373
Kiran Kumar Lokere20804162017-07-17 16:09:04 -07003374 req_msg = wma_find_vdev_req(wma, vdev_id, type, true);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003375 if (!req_msg)
3376 return;
3377
Anurag Chouhan210db072016-02-22 18:42:15 +05303378 qdf_mc_timer_stop(&req_msg->event_timeout);
3379 qdf_mc_timer_destroy(&req_msg->event_timeout);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303380 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003381}
3382
3383/**
3384 * wma_vdev_set_bss_params() - BSS set params functions
3385 * @wma: wma handle
3386 * @vdev_id: vdev id
3387 * @beaconInterval: beacon interval
3388 * @dtimPeriod: DTIM period
3389 * @shortSlotTimeSupported: short slot time
3390 * @llbCoexist: llbCoexist
3391 * @maxTxPower: max tx power
3392 *
3393 * Return: none
3394 */
3395static void
3396wma_vdev_set_bss_params(tp_wma_handle wma, int vdev_id,
3397 tSirMacBeaconInterval beaconInterval,
3398 uint8_t dtimPeriod, uint8_t shortSlotTimeSupported,
Amar Singhala297bfa2015-10-15 15:07:29 -07003399 uint8_t llbCoexist, int8_t maxTxPower)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003400{
Govind Singhd76a5b02016-03-08 15:12:14 +05303401 QDF_STATUS ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003402 uint32_t slot_time;
3403 struct wma_txrx_node *intr = wma->interfaces;
3404
3405 /* Beacon Interval setting */
Govind Singhd76a5b02016-03-08 15:12:14 +05303406 ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003407 WMI_VDEV_PARAM_BEACON_INTERVAL,
3408 beaconInterval);
3409
Govind Singhd76a5b02016-03-08 15:12:14 +05303410 if (QDF_IS_STATUS_ERROR(ret))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003411 WMA_LOGE("failed to set WMI_VDEV_PARAM_BEACON_INTERVAL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003412 ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle, vdev_id,
3413 &intr[vdev_id].config.gtx_info);
Govind Singhd76a5b02016-03-08 15:12:14 +05303414 if (QDF_IS_STATUS_ERROR(ret))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003415 WMA_LOGE("failed to set WMI_VDEV_PARAM_DTIM_PERIOD");
Govind Singhd76a5b02016-03-08 15:12:14 +05303416 ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003417 WMI_VDEV_PARAM_DTIM_PERIOD,
3418 dtimPeriod);
Govind Singhd76a5b02016-03-08 15:12:14 +05303419 if (QDF_IS_STATUS_ERROR(ret))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003420 WMA_LOGE("failed to set WMI_VDEV_PARAM_DTIM_PERIOD");
3421
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003422 if (!maxTxPower)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003423 WMA_LOGW("Setting Tx power limit to 0");
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07003424 WMA_LOGD("Set maxTx pwr [WMI_VDEV_PARAM_TX_PWRLIMIT] to %d",
Padma, Santhosh Kumar29df3622016-08-16 19:15:16 +05303425 maxTxPower);
Govind Singhd76a5b02016-03-08 15:12:14 +05303426 ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003427 WMI_VDEV_PARAM_TX_PWRLIMIT,
3428 maxTxPower);
Govind Singhd76a5b02016-03-08 15:12:14 +05303429 if (QDF_IS_STATUS_ERROR(ret))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003430 WMA_LOGE("failed to set WMI_VDEV_PARAM_TX_PWRLIMIT");
3431 else
3432 intr[vdev_id].max_tx_power = maxTxPower;
3433
3434 /* Slot time */
3435 if (shortSlotTimeSupported)
3436 slot_time = WMI_VDEV_SLOT_TIME_SHORT;
3437 else
3438 slot_time = WMI_VDEV_SLOT_TIME_LONG;
3439
Govind Singhd76a5b02016-03-08 15:12:14 +05303440 ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003441 WMI_VDEV_PARAM_SLOT_TIME,
3442 slot_time);
Govind Singhd76a5b02016-03-08 15:12:14 +05303443 if (QDF_IS_STATUS_ERROR(ret))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003444 WMA_LOGE("failed to set WMI_VDEV_PARAM_SLOT_TIME");
3445
3446 /* Initialize protection mode in case of coexistence */
3447 wma_update_protection_mode(wma, vdev_id, llbCoexist);
Krishna Kumaar Natarajan0103ef82017-02-17 18:15:56 -08003448
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003449}
3450
Abhishek Singhcfb44482017-03-10 12:42:37 +05303451#ifdef WLAN_FEATURE_11W
3452static void wma_set_mgmt_frame_protection(tp_wma_handle wma)
3453{
3454 struct pdev_params param = {0};
3455 QDF_STATUS ret;
3456
3457 /*
3458 * when 802.11w PMF is enabled for hw encr/decr
3459 * use hw MFP Qos bits 0x10
3460 */
3461 param.param_id = WMI_PDEV_PARAM_PMF_QOS;
3462 param.param_value = true;
3463 ret = wmi_unified_pdev_param_send(wma->wmi_handle,
3464 &param, WMA_WILDCARD_PDEV_ID);
3465 if (QDF_IS_STATUS_ERROR(ret)) {
3466 WMA_LOGE("%s: Failed to set QOS MFP/PMF (%d)",
3467 __func__, ret);
3468 } else {
3469 WMA_LOGD("%s: QOS MFP/PMF set", __func__);
3470 }
3471}
3472#else
3473static inline void wma_set_mgmt_frame_protection(tp_wma_handle wma)
3474{
3475}
3476#endif /* WLAN_FEATURE_11W */
3477
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003478/**
3479 * wma_add_bss_ap_mode() - process add bss request in ap mode
3480 * @wma: wma handle
3481 * @add_bss: add bss parameters
3482 *
3483 * Return: none
3484 */
3485static void wma_add_bss_ap_mode(tp_wma_handle wma, tpAddBssParams add_bss)
3486{
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003487 struct cdp_pdev *pdev;
3488 struct cdp_vdev *vdev;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003489 struct wma_vdev_start_req req;
Leo Chang96464902016-10-28 11:10:54 -07003490 void *peer;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003491 struct wma_target_req *msg;
3492 uint8_t vdev_id, peer_id;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303493 QDF_STATUS status;
Amar Singhala297bfa2015-10-15 15:07:29 -07003494 int8_t maxTxPower;
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07003495 struct policy_mgr_hw_mode_params hw_mode = {0};
Leo Chang96464902016-10-28 11:10:54 -07003496 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003497
Anurag Chouhan6d760662016-02-20 16:05:43 +05303498 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003499
3500 if (NULL == pdev) {
3501 WMA_LOGE("%s: Failed to get pdev", __func__);
3502 goto send_fail_resp;
3503 }
3504
3505 vdev = wma_find_vdev_by_addr(wma, add_bss->bssId, &vdev_id);
3506 if (!vdev) {
Peng Xu66162de2016-02-11 17:01:20 -08003507 WMA_LOGE("%s: Failed to get vdev handle:"MAC_ADDRESS_STR,
3508 __func__, MAC_ADDR_ARRAY(add_bss->bssId));
3509
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003510 goto send_fail_resp;
3511 }
3512 if (SAP_WPS_DISABLED == add_bss->wps_state)
Mukul Sharma00058692017-01-28 19:04:32 +05303513 pmo_ucfg_disable_wakeup_event(wma->psoc, vdev_id,
3514 (1 << WOW_PROBE_REQ_WPS_IE_EVENT));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003515 wma_set_bss_rate_flags(&wma->interfaces[vdev_id], add_bss);
3516 status = wma_create_peer(wma, pdev, vdev, add_bss->bssId,
3517 WMI_PEER_TYPE_DEFAULT, vdev_id, false);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303518 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003519 WMA_LOGE("%s: Failed to create peer", __func__);
3520 goto send_fail_resp;
3521 }
3522
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003523 peer = cdp_peer_find_by_addr(soc, pdev,
3524 add_bss->bssId, &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003525 if (!peer) {
3526 WMA_LOGE("%s Failed to find peer %pM", __func__,
3527 add_bss->bssId);
3528 goto send_fail_resp;
3529 }
3530 msg = wma_fill_vdev_req(wma, vdev_id, WMA_ADD_BSS_REQ,
3531 WMA_TARGET_REQ_TYPE_VDEV_START, add_bss,
3532 WMA_VDEV_START_REQUEST_TIMEOUT);
3533 if (!msg) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07003534 WMA_LOGE("%s Failed to allocate vdev request vdev_id %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003535 __func__, vdev_id);
3536 goto peer_cleanup;
3537 }
3538
Leo Chang96464902016-10-28 11:10:54 -07003539 add_bss->staContext.staIdx = cdp_peer_get_local_peer_id(soc, peer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003540
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303541 qdf_mem_zero(&req, sizeof(req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003542 req.vdev_id = vdev_id;
3543 req.chan = add_bss->currentOperChannel;
3544 req.chan_width = add_bss->ch_width;
Naveen Rawat64e477e2016-05-20 10:34:56 -07003545
3546 if (add_bss->ch_width == CH_WIDTH_10MHZ)
3547 req.is_half_rate = 1;
3548 else if (add_bss->ch_width == CH_WIDTH_5MHZ)
3549 req.is_quarter_rate = 1;
3550
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003551 req.ch_center_freq_seg0 = add_bss->ch_center_freq_seg0;
3552 req.ch_center_freq_seg1 = add_bss->ch_center_freq_seg1;
3553 req.vht_capable = add_bss->vhtCapable;
Krishna Kumaar Natarajan0103ef82017-02-17 18:15:56 -08003554 wma_update_vdev_he_ops(&req, add_bss);
3555
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003556 req.max_txpow = add_bss->maxTxPower;
3557 maxTxPower = add_bss->maxTxPower;
Abhishek Singhcfb44482017-03-10 12:42:37 +05303558
3559 if (add_bss->rmfEnabled)
3560 wma_set_mgmt_frame_protection(wma);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003561
Krishna Kumaar Natarajanc1ebd992016-11-29 16:20:32 -08003562 req.dot11_mode = add_bss->dot11_mode;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003563 req.beacon_intval = add_bss->beaconInterval;
3564 req.dtim_period = add_bss->dtimPeriod;
Jiachao Wu712d4fd2017-08-23 16:52:34 +08003565 req.beacon_tx_rate = add_bss->beacon_tx_rate;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003566 req.hidden_ssid = add_bss->bHiddenSSIDEn;
3567 req.is_dfs = add_bss->bSpectrumMgtEnabled;
3568 req.oper_mode = BSS_OPERATIONAL_MODE_AP;
3569 req.ssid.length = add_bss->ssId.length;
Arif Hussain671a1902017-03-17 09:08:32 -07003570 req.cac_duration_ms = add_bss->cac_duration_ms;
3571 req.dfs_regdomain = add_bss->dfs_regdomain;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003572 if (req.ssid.length > 0)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303573 qdf_mem_copy(req.ssid.ssId, add_bss->ssId.ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003574 add_bss->ssId.length);
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07003575 status = policy_mgr_get_current_hw_mode(wma->psoc, &hw_mode);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303576 if (!QDF_IS_STATUS_SUCCESS(status))
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07003577 WMA_LOGE("policy_mgr_get_current_hw_mode failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003578
Paul Zhang42dade02017-05-12 19:20:37 +08003579 if (add_bss->nss == 2) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003580 req.preferred_rx_streams = 2;
3581 req.preferred_tx_streams = 2;
3582 } else {
3583 req.preferred_rx_streams = 1;
3584 req.preferred_tx_streams = 1;
3585 }
3586
3587 status = wma_vdev_start(wma, &req, false);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303588 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003589 wma_remove_vdev_req(wma, vdev_id,
3590 WMA_TARGET_REQ_TYPE_VDEV_START);
3591 goto peer_cleanup;
3592 }
3593
3594 wma_vdev_set_bss_params(wma, vdev_id,
3595 add_bss->beaconInterval, add_bss->dtimPeriod,
3596 add_bss->shortSlotTimeSupported,
3597 add_bss->llbCoexist, maxTxPower);
3598
Krishna Kumaar Natarajan0103ef82017-02-17 18:15:56 -08003599 wma_vdev_set_he_bss_params(wma, vdev_id, &req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003600 return;
3601
3602peer_cleanup:
3603 wma_remove_peer(wma, add_bss->bssId, vdev_id, peer, false);
3604send_fail_resp:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303605 add_bss->status = QDF_STATUS_E_FAILURE;
Abhishek Singh2d775fd2017-08-18 10:51:33 +05303606 wma_send_msg_high_priority(wma, WMA_ADD_BSS_RSP, (void *)add_bss, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003607}
3608
3609#ifdef QCA_IBSS_SUPPORT
3610/**
3611 * wma_add_bss_ibss_mode() - process add bss request in IBSS mode
3612 * @wma: wma handle
3613 * @add_bss: add bss parameters
3614 *
3615 * Return: none
3616 */
3617static void wma_add_bss_ibss_mode(tp_wma_handle wma, tpAddBssParams add_bss)
3618{
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003619 struct cdp_pdev *pdev;
3620 struct cdp_vdev *vdev;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003621 struct wma_vdev_start_req req;
Leo Chang96464902016-10-28 11:10:54 -07003622 void *peer = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003623 struct wma_target_req *msg;
3624 uint8_t vdev_id, peer_id;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303625 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003626 tSetBssKeyParams key_info;
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07003627 struct policy_mgr_hw_mode_params hw_mode = {0};
Leo Chang96464902016-10-28 11:10:54 -07003628 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003629
Krunal Soni2c68f232015-10-26 20:52:51 -07003630 vdev = wma_find_vdev_by_addr(wma, add_bss->selfMacAddr, &vdev_id);
3631 if (!vdev) {
3632 WMA_LOGE("%s: vdev not found for vdev id %d.",
3633 __func__, vdev_id);
3634 goto send_fail_resp;
3635 }
3636 WMA_LOGD("%s: add_bss->sessionId = %d", __func__, vdev_id);
Anurag Chouhan6d760662016-02-20 16:05:43 +05303637 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003638
3639 if (NULL == pdev) {
3640 WMA_LOGE("%s: Failed to get pdev", __func__);
3641 goto send_fail_resp;
3642 }
3643 wma_set_bss_rate_flags(&wma->interfaces[vdev_id], add_bss);
3644
Krunal Soni8c37e322016-02-03 16:08:37 -08003645 /* create ibss bss peer */
3646 status = wma_create_peer(wma, pdev, vdev, add_bss->selfMacAddr,
3647 WMI_PEER_TYPE_DEFAULT, vdev_id,
3648 false);
3649 if (status != QDF_STATUS_SUCCESS) {
3650 WMA_LOGE("%s: Failed to create peer", __func__);
3651 goto send_fail_resp;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003652 }
Krunal Soni8c37e322016-02-03 16:08:37 -08003653 WMA_LOGA("IBSS BSS peer created with mac %pM",
3654 add_bss->selfMacAddr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003655
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003656 peer = cdp_peer_find_by_addr(soc, pdev,
3657 add_bss->selfMacAddr, &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003658 if (!peer) {
3659 WMA_LOGE("%s Failed to find peer %pM", __func__,
3660 add_bss->selfMacAddr);
3661 goto send_fail_resp;
3662 }
3663
3664 /* clear leftover ibss keys on bss peer */
3665
3666 WMA_LOGD("%s: ibss bss key clearing", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303667 qdf_mem_set(&key_info, sizeof(key_info), 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003668 key_info.smesessionId = vdev_id;
3669 key_info.numKeys = SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303670 qdf_mem_copy(&wma->ibsskey_info, &key_info, sizeof(tSetBssKeyParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003671
3672 /* start ibss vdev */
3673
3674 add_bss->operMode = BSS_OPERATIONAL_MODE_IBSS;
3675
3676 msg = wma_fill_vdev_req(wma, vdev_id, WMA_ADD_BSS_REQ,
3677 WMA_TARGET_REQ_TYPE_VDEV_START, add_bss,
3678 WMA_VDEV_START_REQUEST_TIMEOUT);
3679 if (!msg) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07003680 WMA_LOGE("%s Failed to allocate vdev request vdev_id %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003681 __func__, vdev_id);
3682 goto peer_cleanup;
3683 }
3684 WMA_LOGD("%s: vdev start request for IBSS enqueued", __func__);
3685
Leo Chang96464902016-10-28 11:10:54 -07003686 add_bss->staContext.staIdx = cdp_peer_get_local_peer_id(soc, peer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003687
3688 /*
3689 * If IBSS Power Save is supported by firmware
3690 * set the IBSS power save params to firmware.
3691 */
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05303692 if (wmi_service_enabled(wma->wmi_handle,
3693 wmi_service_ibss_pwrsave)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003694 status = wma_set_ibss_pwrsave_params(wma, vdev_id);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303695 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003696 WMA_LOGE("%s: Failed to Set IBSS Power Save Params to firmware",
3697 __func__);
3698 goto peer_cleanup;
3699 }
3700 }
3701
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303702 qdf_mem_zero(&req, sizeof(req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003703 req.vdev_id = vdev_id;
3704 req.chan = add_bss->currentOperChannel;
3705 req.chan_width = add_bss->ch_width;
3706 req.ch_center_freq_seg0 = add_bss->ch_center_freq_seg0;
3707 req.ch_center_freq_seg1 = add_bss->ch_center_freq_seg1;
3708 req.vht_capable = add_bss->vhtCapable;
3709#if defined WLAN_FEATURE_VOWIF
3710 req.max_txpow = add_bss->maxTxPower;
3711#else
3712 req.max_txpow = 0;
3713#endif /* WLAN_FEATURE_VOWIF */
3714 req.beacon_intval = add_bss->beaconInterval;
3715 req.dtim_period = add_bss->dtimPeriod;
3716 req.hidden_ssid = add_bss->bHiddenSSIDEn;
3717 req.is_dfs = add_bss->bSpectrumMgtEnabled;
3718 req.oper_mode = BSS_OPERATIONAL_MODE_IBSS;
3719 req.ssid.length = add_bss->ssId.length;
3720 if (req.ssid.length > 0)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303721 qdf_mem_copy(req.ssid.ssId, add_bss->ssId.ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003722 add_bss->ssId.length);
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07003723 status = policy_mgr_get_current_hw_mode(wma->psoc, &hw_mode);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303724 if (!QDF_IS_STATUS_SUCCESS(status))
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07003725 WMA_LOGE("policy_mgr_get_current_hw_mode failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003726
Paul Zhang42dade02017-05-12 19:20:37 +08003727 if (add_bss->nss == 2) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003728 req.preferred_rx_streams = 2;
3729 req.preferred_tx_streams = 2;
3730 } else {
3731 req.preferred_rx_streams = 1;
3732 req.preferred_tx_streams = 1;
3733 }
3734
3735 WMA_LOGD("%s: chan %d chan_width %d", __func__, req.chan,
3736 req.chan_width);
3737 WMA_LOGD("%s: ssid = %s", __func__, req.ssid.ssId);
3738
3739 status = wma_vdev_start(wma, &req, false);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303740 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003741 wma_remove_vdev_req(wma, vdev_id,
3742 WMA_TARGET_REQ_TYPE_VDEV_START);
3743 goto peer_cleanup;
3744 }
3745 WMA_LOGD("%s: vdev start request for IBSS sent to target", __func__);
3746
3747 /* Initialize protection mode to no protection */
Govind Singhd76a5b02016-03-08 15:12:14 +05303748 status = wma_vdev_set_param(wma->wmi_handle, vdev_id,
3749 WMI_VDEV_PARAM_PROTECTION_MODE,
3750 IEEE80211_PROT_NONE);
3751 if (QDF_IS_STATUS_ERROR(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003752 WMA_LOGE("Failed to initialize protection mode");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003753
3754 return;
3755
3756peer_cleanup:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003757 if (peer)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003758 wma_remove_peer(wma, add_bss->bssId, vdev_id, peer, false);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003759send_fail_resp:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303760 add_bss->status = QDF_STATUS_E_FAILURE;
Abhishek Singh2d775fd2017-08-18 10:51:33 +05303761 wma_send_msg_high_priority(wma, WMA_ADD_BSS_RSP, (void *)add_bss, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003762}
3763#endif /* QCA_IBSS_SUPPORT */
3764
3765/**
3766 * wma_add_bss_sta_mode() - process add bss request in sta mode
3767 * @wma: wma handle
3768 * @add_bss: add bss parameters
3769 *
3770 * Return: none
3771 */
3772static void wma_add_bss_sta_mode(tp_wma_handle wma, tpAddBssParams add_bss)
3773{
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003774 struct cdp_pdev *pdev;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003775 struct wma_vdev_start_req req;
3776 struct wma_target_req *msg;
Leo Chang96464902016-10-28 11:10:54 -07003777 uint8_t vdev_id = 0, peer_id;
Amar Singhal4c3fbb42018-01-02 13:20:28 -08003778 void *peer = NULL;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303779 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003780 struct wma_txrx_node *iface;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003781 int pps_val = 0;
3782 bool roam_synch_in_progress = false;
Anurag Chouhan6d760662016-02-20 16:05:43 +05303783 tpAniSirGlobal pMac = cds_get_context(QDF_MODULE_ID_PE);
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07003784 struct policy_mgr_hw_mode_params hw_mode = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003785 bool peer_assoc_sent = false;
Leo Chang96464902016-10-28 11:10:54 -07003786 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003787
3788 if (NULL == pMac) {
3789 WMA_LOGE("%s: Unable to get PE context", __func__);
3790 goto send_fail_resp;
3791 }
3792
Anurag Chouhan6d760662016-02-20 16:05:43 +05303793 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003794
3795 if (NULL == pdev) {
3796 WMA_LOGE("%s Failed to get pdev", __func__);
3797 goto send_fail_resp;
3798 }
3799
Leo Chang96464902016-10-28 11:10:54 -07003800 vdev_id = add_bss->staContext.smesessionId;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003801 iface = &wma->interfaces[vdev_id];
3802
3803 wma_set_bss_rate_flags(iface, add_bss);
3804 if (add_bss->operMode) {
3805 /* Save parameters later needed by WMA_ADD_STA_REQ */
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003806 if (iface->addBssStaContext)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303807 qdf_mem_free(iface->addBssStaContext);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303808 iface->addBssStaContext = qdf_mem_malloc(sizeof(tAddStaParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003809 if (!iface->addBssStaContext) {
3810 WMA_LOGE("%s Failed to allocat memory", __func__);
3811 goto send_fail_resp;
3812 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303813 qdf_mem_copy(iface->addBssStaContext, &add_bss->staContext,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003814 sizeof(tAddStaParams));
3815
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003816 if (iface->staKeyParams) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303817 qdf_mem_free(iface->staKeyParams);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003818 iface->staKeyParams = NULL;
3819 }
3820 if (add_bss->extSetStaKeyParamValid) {
3821 iface->staKeyParams =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303822 qdf_mem_malloc(sizeof(tSetStaKeyParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003823 if (!iface->staKeyParams) {
3824 WMA_LOGE("%s Failed to allocat memory",
3825 __func__);
3826 goto send_fail_resp;
3827 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303828 qdf_mem_copy(iface->staKeyParams,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003829 &add_bss->extSetStaKeyParam,
3830 sizeof(tSetStaKeyParams));
3831 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003832 /* Save parameters later needed by WMA_ADD_STA_REQ */
3833 iface->rmfEnabled = add_bss->rmfEnabled;
3834 iface->beaconInterval = add_bss->beaconInterval;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003835 iface->llbCoexist = add_bss->llbCoexist;
3836 iface->shortSlotTimeSupported = add_bss->shortSlotTimeSupported;
3837 iface->nwType = add_bss->nwType;
3838 if (add_bss->nonRoamReassoc) {
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003839 peer = cdp_peer_find_by_addr(soc,
3840 pdev, add_bss->bssId,
3841 &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003842 if (peer) {
3843 add_bss->staContext.staIdx =
Leo Chang96464902016-10-28 11:10:54 -07003844 cdp_peer_get_local_peer_id(soc, peer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003845 goto send_bss_resp;
3846 }
3847 }
3848 if (add_bss->reassocReq) {
3849#if defined(QCA_LL_LEGACY_TX_FLOW_CONTROL) || defined(QCA_LL_TX_FLOW_CONTROL_V2)
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003850 struct cdp_vdev *vdev;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003851#endif
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003852 /* Called in preassoc state. BSSID peer is already
3853 * added by set_linkstate
3854 */
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003855 peer = cdp_peer_find_by_addr(soc,
3856 pdev,
3857 add_bss->bssId,
3858 &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003859 if (!peer) {
3860 WMA_LOGE("%s Failed to find peer %pM", __func__,
3861 add_bss->bssId);
3862 goto send_fail_resp;
3863 }
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08003864 if (wma_is_roam_synch_in_progress(wma, vdev_id)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003865 add_bss->staContext.staIdx =
Leo Chang96464902016-10-28 11:10:54 -07003866 cdp_peer_get_local_peer_id(soc, peer);
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08003867 WMA_LOGD("LFR3:%s: bssid %pM staIdx %d",
3868 __func__, add_bss->bssId,
3869 add_bss->staContext.staIdx);
3870 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003871 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003872 msg = wma_fill_vdev_req(wma, vdev_id, WMA_ADD_BSS_REQ,
3873 WMA_TARGET_REQ_TYPE_VDEV_START,
3874 add_bss,
3875 WMA_VDEV_START_REQUEST_TIMEOUT);
3876 if (!msg) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07003877 WMA_LOGE("%s Failed to allocate vdev request vdev_id %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003878 __func__, vdev_id);
3879 goto peer_cleanup;
3880 }
3881
3882 add_bss->staContext.staIdx =
Leo Chang96464902016-10-28 11:10:54 -07003883 cdp_peer_get_local_peer_id(soc, peer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003884
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303885 qdf_mem_zero(&req, sizeof(req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003886 req.vdev_id = vdev_id;
3887 req.chan = add_bss->currentOperChannel;
3888 req.chan_width = add_bss->ch_width;
Naveen Rawat64e477e2016-05-20 10:34:56 -07003889
3890 if (add_bss->ch_width == CH_WIDTH_10MHZ)
3891 req.is_half_rate = 1;
3892 else if (add_bss->ch_width == CH_WIDTH_5MHZ)
3893 req.is_quarter_rate = 1;
3894
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003895 req.ch_center_freq_seg0 = add_bss->ch_center_freq_seg0;
3896 req.ch_center_freq_seg1 = add_bss->ch_center_freq_seg1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003897 req.max_txpow = add_bss->maxTxPower;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003898 req.beacon_intval = add_bss->beaconInterval;
3899 req.dtim_period = add_bss->dtimPeriod;
3900 req.hidden_ssid = add_bss->bHiddenSSIDEn;
3901 req.is_dfs = add_bss->bSpectrumMgtEnabled;
3902 req.ssid.length = add_bss->ssId.length;
3903 req.oper_mode = BSS_OPERATIONAL_MODE_STA;
3904 if (req.ssid.length > 0)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303905 qdf_mem_copy(req.ssid.ssId, add_bss->ssId.ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003906 add_bss->ssId.length);
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07003907 status = policy_mgr_get_current_hw_mode(wma->psoc,
3908 &hw_mode);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303909 if (!QDF_IS_STATUS_SUCCESS(status))
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07003910 WMA_LOGE("policy_mgr_get_current_hw_mode failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003911
Paul Zhang42dade02017-05-12 19:20:37 +08003912 if (add_bss->nss == 2) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003913 req.preferred_rx_streams = 2;
3914 req.preferred_tx_streams = 2;
3915 } else {
3916 req.preferred_rx_streams = 1;
3917 req.preferred_tx_streams = 1;
3918 }
3919
3920 status = wma_vdev_start(wma, &req, false);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303921 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003922 wma_remove_vdev_req(wma, vdev_id,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003923 WMA_TARGET_REQ_TYPE_VDEV_START);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003924 goto peer_cleanup;
3925 }
3926#if defined(QCA_LL_LEGACY_TX_FLOW_CONTROL) || defined(QCA_LL_TX_FLOW_CONTROL_V2)
3927 vdev = wma_find_vdev_by_id(wma, vdev_id);
3928 if (!vdev) {
3929 WMA_LOGE("%s Invalid txrx vdev", __func__);
3930 goto peer_cleanup;
3931 }
Leo Chang96464902016-10-28 11:10:54 -07003932 cdp_fc_vdev_pause(soc, vdev,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003933 OL_TXQ_PAUSE_REASON_PEER_UNAUTHORIZED);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003934#endif
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003935 /* ADD_BSS_RESP will be deferred to completion of
3936 * VDEV_START
3937 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003938 return;
3939 }
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003940 if (!add_bss->updateBss)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003941 goto send_bss_resp;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003942 /* Update peer state */
3943 if (add_bss->staContext.encryptType == eSIR_ED_NONE) {
3944 WMA_LOGD("%s: Update peer(%pM) state into auth",
3945 __func__, add_bss->bssId);
Leo Chang96464902016-10-28 11:10:54 -07003946 cdp_peer_state_update(soc, pdev, add_bss->bssId,
Dhanashri Atreb08959a2016-03-01 17:28:03 -08003947 OL_TXRX_PEER_STATE_AUTH);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003948 } else {
3949#if defined(QCA_LL_LEGACY_TX_FLOW_CONTROL) || defined(QCA_LL_TX_FLOW_CONTROL_V2)
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003950 struct cdp_vdev *vdev;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003951#endif
3952 WMA_LOGD("%s: Update peer(%pM) state into conn",
3953 __func__, add_bss->bssId);
Leo Chang96464902016-10-28 11:10:54 -07003954 cdp_peer_state_update(soc, pdev, add_bss->bssId,
Dhanashri Atreb08959a2016-03-01 17:28:03 -08003955 OL_TXRX_PEER_STATE_CONN);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003956#if defined(QCA_LL_LEGACY_TX_FLOW_CONTROL) || defined(QCA_LL_TX_FLOW_CONTROL_V2)
Leo Chang96464902016-10-28 11:10:54 -07003957 peer = cdp_peer_find_by_addr(soc, pdev, add_bss->bssId,
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003958 &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003959 if (!peer) {
3960 WMA_LOGE("%s:%d Failed to find peer %pM",
3961 __func__, __LINE__, add_bss->bssId);
3962 goto send_fail_resp;
3963 }
3964
3965 vdev = wma_find_vdev_by_id(wma, vdev_id);
3966 if (!vdev) {
3967 WMA_LOGE("%s Invalid txrx vdev", __func__);
3968 goto peer_cleanup;
3969 }
Leo Chang96464902016-10-28 11:10:54 -07003970 cdp_fc_vdev_pause(soc, vdev,
3971 OL_TXQ_PAUSE_REASON_PEER_UNAUTHORIZED);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003972#endif
3973 }
3974
3975 wmi_unified_send_txbf(wma, &add_bss->staContext);
3976
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003977 pps_val = ((pMac->enable5gEBT << 31) & 0xffff0000) |
3978 (PKT_PWR_SAVE_5G_EBT & 0xffff);
Govind Singhd76a5b02016-03-08 15:12:14 +05303979 status = wma_vdev_set_param(wma->wmi_handle, vdev_id,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003980 WMI_VDEV_PARAM_PACKET_POWERSAVE,
3981 pps_val);
Govind Singhd76a5b02016-03-08 15:12:14 +05303982 if (QDF_IS_STATUS_ERROR(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003983 WMA_LOGE("Failed to send wmi packet power save cmd");
3984 else
Govind Singhd76a5b02016-03-08 15:12:14 +05303985 WMA_LOGD("Sent PKT_PWR_SAVE_5G_EBT cmd to target, val = %x, status = %d",
3986 pps_val, status);
Govind Singhb30d4c02016-03-24 11:01:23 +05303987 wma_send_peer_assoc(wma, add_bss->nwType,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003988 &add_bss->staContext);
Naveen Rawatd7734142017-10-27 10:02:40 -07003989 /* we just had peer assoc, so install key will be done later */
3990 iface->is_waiting_for_key = true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003991 peer_assoc_sent = true;
Abhishek Singhcfb44482017-03-10 12:42:37 +05303992
3993 if (add_bss->rmfEnabled)
3994 wma_set_mgmt_frame_protection(wma);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003995
3996 wma_vdev_set_bss_params(wma, add_bss->staContext.smesessionId,
3997 add_bss->beaconInterval,
3998 add_bss->dtimPeriod,
3999 add_bss->shortSlotTimeSupported,
4000 add_bss->llbCoexist,
4001 add_bss->maxTxPower);
4002
4003 /*
4004 * Store the bssid in interface table, bssid will
4005 * be used during group key setting sta mode.
4006 */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304007 qdf_mem_copy(iface->bssid, add_bss->bssId, IEEE80211_ADDR_LEN);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004008
4009 }
4010send_bss_resp:
Manikandan Mohan39accff2017-05-02 16:09:00 -07004011
4012 wma_vdev_set_he_config(wma, vdev_id, add_bss);
Sreelakshmi Konamki0d17c6a2017-06-08 12:58:54 +05304013 if (NULL == cdp_peer_find_by_addr(soc, pdev, add_bss->bssId,
4014 &add_bss->staContext.staIdx))
4015 add_bss->status = QDF_STATUS_E_FAILURE;
4016 else
4017 add_bss->status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004018 add_bss->bssIdx = add_bss->staContext.smesessionId;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304019 qdf_mem_copy(add_bss->staContext.staMac, add_bss->bssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004020 sizeof(add_bss->staContext.staMac));
4021
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304022 if (!wmi_service_enabled(wma->wmi_handle,
4023 wmi_service_peer_assoc_conf)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004024 WMA_LOGE(FL("WMI_SERVICE_PEER_ASSOC_CONF not enabled"));
4025 goto send_final_rsp;
4026 }
4027
4028 /* In case of reassoc, peer assoc cmd will not be sent */
4029 if (!peer_assoc_sent)
4030 goto send_final_rsp;
4031
4032 msg = wma_fill_hold_req(wma, vdev_id, WMA_ADD_BSS_REQ,
4033 WMA_PEER_ASSOC_CNF_START, add_bss,
4034 WMA_PEER_ASSOC_TIMEOUT);
4035 if (!msg) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004036 WMA_LOGE(FL("Failed to allocate request for vdev_id %d"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004037 vdev_id);
4038 wma_remove_req(wma, vdev_id, WMA_PEER_ASSOC_CNF_START);
4039 goto peer_cleanup;
4040 }
4041 return;
4042
4043send_final_rsp:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004044 WMA_LOGD("%s: opermode %d update_bss %d nw_type %d bssid %pM staIdx %d status %d",
4045 __func__, add_bss->operMode,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004046 add_bss->updateBss, add_bss->nwType, add_bss->bssId,
4047 add_bss->staContext.staIdx, add_bss->status);
Abhishek Singh2d775fd2017-08-18 10:51:33 +05304048 wma_send_msg_high_priority(wma, WMA_ADD_BSS_RSP, (void *)add_bss, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004049 return;
4050
4051peer_cleanup:
Amar Singhal4c3fbb42018-01-02 13:20:28 -08004052 if (peer)
4053 wma_remove_peer(wma, add_bss->bssId, vdev_id, peer,
4054 roam_synch_in_progress);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004055send_fail_resp:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304056 add_bss->status = QDF_STATUS_E_FAILURE;
Sandeep Puligilla2ff3ebe2016-08-31 23:55:07 -07004057 if (!wma_is_roam_synch_in_progress(wma, vdev_id))
Abhishek Singh2d775fd2017-08-18 10:51:33 +05304058 wma_send_msg_high_priority(wma, WMA_ADD_BSS_RSP,
4059 (void *)add_bss, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004060}
4061
4062/**
4063 * wma_add_bss() - Add BSS request to fw as per opmode
4064 * @wma: wma handle
4065 * @params: add bss params
4066 *
4067 * Return: none
4068 */
4069void wma_add_bss(tp_wma_handle wma, tpAddBssParams params)
4070{
4071 WMA_LOGD("%s: add_bss_param.halPersona = %d",
4072 __func__, params->halPersona);
4073
4074 switch (params->halPersona) {
4075
Anurag Chouhan6d760662016-02-20 16:05:43 +05304076 case QDF_SAP_MODE:
4077 case QDF_P2P_GO_MODE:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004078 wma_add_bss_ap_mode(wma, params);
4079 break;
4080
4081#ifdef QCA_IBSS_SUPPORT
Anurag Chouhan6d760662016-02-20 16:05:43 +05304082 case QDF_IBSS_MODE:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004083 wma_add_bss_ibss_mode(wma, params);
4084 break;
4085#endif
4086
Deepak Dhamdheree2dd5442016-05-27 15:05:51 -07004087 case QDF_NDI_MODE:
4088 wma_add_bss_ndi_mode(wma, params);
4089 break;
4090
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004091 default:
4092 wma_add_bss_sta_mode(wma, params);
4093 break;
4094 }
4095}
4096
4097/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004098 * wma_add_sta_req_ap_mode() - process add sta request in ap mode
4099 * @wma: wma handle
4100 * @add_sta: add sta params
4101 *
4102 * Return: none
4103 */
4104static void wma_add_sta_req_ap_mode(tp_wma_handle wma, tpAddStaParams add_sta)
4105{
Dhanashri Atreb08959a2016-03-01 17:28:03 -08004106 enum ol_txrx_peer_state state = OL_TXRX_PEER_STATE_CONN;
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004107 struct cdp_pdev *pdev;
4108 struct cdp_vdev *vdev;
Leo Chang96464902016-10-28 11:10:54 -07004109 void *peer;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004110 uint8_t peer_id;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304111 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004112 int32_t ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004113 struct wma_txrx_node *iface = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004114 struct wma_target_req *msg;
4115 bool peer_assoc_cnf = false;
Leo Chang96464902016-10-28 11:10:54 -07004116 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
lifeng13a89d72017-05-10 14:49:29 +08004117 uint32_t mcs_limit, i, j;
4118 uint8_t *rate_pos;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004119
Anurag Chouhan6d760662016-02-20 16:05:43 +05304120 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004121
4122 if (NULL == pdev) {
4123 WMA_LOGE("%s: Failed to find pdev", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304124 add_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004125 goto send_rsp;
4126 }
4127 /* UMAC sends WMA_ADD_STA_REQ msg twice to WMA when the station
4128 * associates. First WMA_ADD_STA_REQ will have staType as
4129 * STA_ENTRY_PEER and second posting will have STA_ENTRY_SELF.
4130 * Peer creation is done in first WMA_ADD_STA_REQ and second
4131 * WMA_ADD_STA_REQ which has STA_ENTRY_SELF is ignored and
4132 * send fake response with success to UMAC. Otherwise UMAC
4133 * will get blocked.
4134 */
4135 if (add_sta->staType != STA_ENTRY_PEER) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304136 add_sta->status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004137 goto send_rsp;
4138 }
4139
4140 vdev = wma_find_vdev_by_id(wma, add_sta->smesessionId);
4141 if (!vdev) {
4142 WMA_LOGE("%s: Failed to find vdev", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304143 add_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004144 goto send_rsp;
4145 }
4146
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07004147 iface = &wma->interfaces[add_sta->smesessionId];
Leo Chang96464902016-10-28 11:10:54 -07004148 peer = cdp_peer_find_by_addr_and_vdev(soc, pdev, vdev,
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004149 add_sta->staMac, &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004150 if (peer) {
4151 wma_remove_peer(wma, add_sta->staMac, add_sta->smesessionId,
4152 peer, false);
4153 WMA_LOGE("%s: Peer already exists, Deleted peer with peer_addr %pM",
4154 __func__, add_sta->staMac);
4155 }
Liangwei Dong7d845112016-09-27 22:24:21 -04004156 /* The code above only checks the peer existence on its own vdev.
4157 * Need to check whether the peer exists on other vDevs because firmware
4158 * can't create the peer if the peer with same MAC address already
4159 * exists on the pDev. As this peer belongs to other vDevs, just return
4160 * here.
4161 */
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004162 peer = cdp_peer_find_by_addr(soc, pdev,
4163 add_sta->staMac, &peer_id);
Liangwei Dong7d845112016-09-27 22:24:21 -04004164 if (peer) {
Jeff Johnsonadba3962017-09-18 08:12:35 -07004165 WMA_LOGE("%s: My vdev:%pK, but Peer exists on other vdev with peer_addr %pM and peer_id %d",
Leo Chang96464902016-10-28 11:10:54 -07004166 __func__, vdev, add_sta->staMac, peer_id);
Liangwei Dong7d845112016-09-27 22:24:21 -04004167 add_sta->status = QDF_STATUS_E_FAILURE;
4168 goto send_rsp;
4169 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004170
4171 status = wma_create_peer(wma, pdev, vdev, add_sta->staMac,
4172 WMI_PEER_TYPE_DEFAULT, add_sta->smesessionId,
4173 false);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304174 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004175 WMA_LOGE("%s: Failed to create peer for %pM",
4176 __func__, add_sta->staMac);
4177 add_sta->status = status;
4178 goto send_rsp;
4179 }
4180
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004181 peer = cdp_peer_find_by_addr_and_vdev(soc, pdev,
4182 vdev,
4183 add_sta->staMac, &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004184 if (!peer) {
4185 WMA_LOGE("%s: Failed to find peer handle using peer mac %pM",
4186 __func__, add_sta->staMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304187 add_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004188 wma_remove_peer(wma, add_sta->staMac, add_sta->smesessionId,
4189 peer, false);
4190 goto send_rsp;
4191 }
4192
4193 wmi_unified_send_txbf(wma, add_sta);
4194
lifeng13a89d72017-05-10 14:49:29 +08004195 /*
4196 * Get MCS limit from ini configure, and map it to rate parameters
4197 * This will limit HT rate upper bound. CFG_CTRL_MASK is used to
4198 * check whether ini config is enabled and CFG_DATA_MASK to get the
4199 * MCS value.
4200 */
4201#define CFG_CTRL_MASK 0xFF00
4202#define CFG_DATA_MASK 0x00FF
4203
4204 if (wlan_cfg_get_int(wma->mac_context, WNI_CFG_SAP_MAX_MCS_DATA,
4205 &mcs_limit) != eSIR_SUCCESS) {
4206 mcs_limit = WNI_CFG_SAP_MAX_MCS_DATA_STADEF;
4207 }
4208
4209 if (mcs_limit & CFG_CTRL_MASK) {
4210 WMA_LOGD("%s: set mcs_limit %x", __func__, mcs_limit);
4211
4212 mcs_limit &= CFG_DATA_MASK;
4213 rate_pos = (u_int8_t *)add_sta->supportedRates.supportedMCSSet;
4214 for (i = 0, j = 0; i < MAX_SUPPORTED_RATES;) {
4215 if (j < mcs_limit / 8) {
4216 rate_pos[j] = 0xff;
4217 j++;
4218 i += 8;
4219 } else if (j < mcs_limit / 8 + 1) {
4220 if (i <= mcs_limit)
4221 rate_pos[i / 8] |= 1 << (i % 8);
4222 else
4223 rate_pos[i / 8] &= ~(1 << (i % 8));
4224 i++;
4225
4226 if (i >= (j + 1) * 8)
4227 j++;
4228 } else {
4229 rate_pos[j++] = 0;
4230 i += 8;
4231 }
4232 }
4233 }
4234
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304235 if (wmi_service_enabled(wma->wmi_handle,
4236 wmi_service_peer_assoc_conf)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004237 peer_assoc_cnf = true;
4238 msg = wma_fill_hold_req(wma, add_sta->smesessionId,
4239 WMA_ADD_STA_REQ, WMA_PEER_ASSOC_CNF_START,
4240 add_sta, WMA_PEER_ASSOC_TIMEOUT);
4241 if (!msg) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004242 WMA_LOGE(FL("Failed to alloc request for vdev_id %d"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004243 add_sta->smesessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304244 add_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004245 wma_remove_req(wma, add_sta->smesessionId,
4246 WMA_PEER_ASSOC_CNF_START);
4247 wma_remove_peer(wma, add_sta->staMac,
4248 add_sta->smesessionId, peer, false);
4249 peer_assoc_cnf = false;
4250 goto send_rsp;
4251 }
4252 } else {
4253 WMA_LOGE(FL("WMI_SERVICE_PEER_ASSOC_CONF not enabled"));
4254 }
4255
Govind Singhb30d4c02016-03-24 11:01:23 +05304256 ret = wma_send_peer_assoc(wma, add_sta->nwType, add_sta);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004257 if (ret) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304258 add_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004259 wma_remove_peer(wma, add_sta->staMac, add_sta->smesessionId,
4260 peer, false);
4261 goto send_rsp;
4262 }
4263#ifdef QCA_IBSS_SUPPORT
4264 /*
4265 * In IBSS mode send the peer
4266 * Atim Window length if IBSS
4267 * power save is enabled by the
4268 * firmware.
4269 */
4270 if (wma_is_vdev_in_ibss_mode(wma, add_sta->smesessionId) &&
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304271 wmi_service_enabled(wma->wmi_handle,
4272 wmi_service_ibss_pwrsave)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004273 /*
4274 * If ATIM Window is present in the peer
4275 * beacon then send it to firmware else
4276 * configure Zero ATIM Window length to
4277 * firmware.
4278 */
4279 if (add_sta->atimIePresent) {
4280 wma_set_peer_param(wma, add_sta->staMac,
4281 WMI_PEER_IBSS_ATIM_WINDOW_LENGTH,
4282 add_sta->peerAtimWindowLength,
4283 add_sta->smesessionId);
4284 } else {
4285 wma_set_peer_param(wma, add_sta->staMac,
4286 WMI_PEER_IBSS_ATIM_WINDOW_LENGTH,
4287 0, add_sta->smesessionId);
4288 }
4289 }
4290#endif
4291
Abhishek Singhd7bc9132017-05-17 13:59:04 +05304292 iface->rmfEnabled = add_sta->rmfEnabled;
Abhishek Singhcfb44482017-03-10 12:42:37 +05304293 if (add_sta->rmfEnabled)
4294 wma_set_mgmt_frame_protection(wma);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004295
4296 if (add_sta->uAPSD) {
Govind Singhd76a5b02016-03-08 15:12:14 +05304297 status = wma_set_ap_peer_uapsd(wma, add_sta->smesessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004298 add_sta->staMac,
4299 add_sta->uAPSD, add_sta->maxSPLen);
Govind Singhd76a5b02016-03-08 15:12:14 +05304300 if (QDF_IS_STATUS_ERROR(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004301 WMA_LOGE("Failed to set peer uapsd param for %pM",
4302 add_sta->staMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304303 add_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004304 wma_remove_peer(wma, add_sta->staMac,
4305 add_sta->smesessionId, peer, false);
4306 goto send_rsp;
4307 }
4308 }
4309
4310 WMA_LOGD("%s: Moving peer %pM to state %d",
4311 __func__, add_sta->staMac, state);
Leo Chang96464902016-10-28 11:10:54 -07004312 cdp_peer_state_update(soc, pdev, add_sta->staMac, state);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004313
Leo Chang96464902016-10-28 11:10:54 -07004314 add_sta->staIdx = cdp_peer_get_local_peer_id(soc, peer);
Kanchanapally, Vidyullathae3062812015-05-22 17:28:57 +05304315 add_sta->nss = iface->nss;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304316 add_sta->status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004317send_rsp:
4318 /* Do not send add stat resp when peer assoc cnf is enabled */
4319 if (peer_assoc_cnf) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004320 WMA_LOGD(FL("WMI_SERVICE_PEER_ASSOC_CONF is enabled"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004321 return;
4322 }
4323
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004324 WMA_LOGD(FL("statype %d vdev_id %d aid %d bssid %pM staIdx %d status %d"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004325 add_sta->staType, add_sta->smesessionId,
4326 add_sta->assocId, add_sta->bssId, add_sta->staIdx,
4327 add_sta->status);
Abhishek Singh2d775fd2017-08-18 10:51:33 +05304328 wma_send_msg_high_priority(wma, WMA_ADD_STA_RSP, (void *)add_sta, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004329}
4330
4331#ifdef FEATURE_WLAN_TDLS
Poddar, Siddarth5a91f5b2016-04-28 12:24:10 +05304332
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004333/**
4334 * wma_add_tdls_sta() - process add sta request in TDLS mode
4335 * @wma: wma handle
4336 * @add_sta: add sta params
4337 *
4338 * Return: none
4339 */
4340static void wma_add_tdls_sta(tp_wma_handle wma, tpAddStaParams add_sta)
4341{
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004342 struct cdp_pdev *pdev;
4343 struct cdp_vdev *vdev;
Leo Chang96464902016-10-28 11:10:54 -07004344 void *peer;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004345 uint8_t peer_id;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304346 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004347 int32_t ret;
4348 tTdlsPeerStateParams *peerStateParams;
4349 struct wma_target_req *msg;
4350 bool peer_assoc_cnf = false;
Leo Chang96464902016-10-28 11:10:54 -07004351 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004352
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004353 WMA_LOGD("%s: staType: %d, staIdx: %d, updateSta: %d, bssId: %pM, staMac: %pM",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004354 __func__, add_sta->staType, add_sta->staIdx,
4355 add_sta->updateSta, add_sta->bssId, add_sta->staMac);
4356
Anurag Chouhan6d760662016-02-20 16:05:43 +05304357 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004358
4359 if (NULL == pdev) {
4360 WMA_LOGE("%s: Failed to find pdev", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304361 add_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004362 goto send_rsp;
4363 }
4364
4365 vdev = wma_find_vdev_by_id(wma, add_sta->smesessionId);
4366 if (!vdev) {
4367 WMA_LOGE("%s: Failed to find vdev", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304368 add_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004369 goto send_rsp;
4370 }
4371
Nitesh Shah622d3122017-06-05 17:04:06 +05304372 if (wma_is_roam_synch_in_progress(wma, add_sta->smesessionId)) {
4373 WMA_LOGE("%s: roaming in progress, reject add sta!", __func__);
4374 add_sta->status = QDF_STATUS_E_PERM;
4375 goto send_rsp;
4376 }
4377
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004378 if (0 == add_sta->updateSta) {
4379 /* its a add sta request * */
Poddar, Siddarth5a91f5b2016-04-28 12:24:10 +05304380
Leo Chang96464902016-10-28 11:10:54 -07004381 cdp_peer_copy_mac_addr_raw(soc, vdev, add_sta->bssId);
Poddar, Siddarth5a91f5b2016-04-28 12:24:10 +05304382
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004383 WMA_LOGD("%s: addSta, calling wma_create_peer for %pM, vdev_id %hu",
4384 __func__, add_sta->staMac, add_sta->smesessionId);
4385
4386 status = wma_create_peer(wma, pdev, vdev, add_sta->staMac,
4387 WMI_PEER_TYPE_TDLS,
4388 add_sta->smesessionId, false);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304389 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004390 WMA_LOGE("%s: Failed to create peer for %pM",
4391 __func__, add_sta->staMac);
4392 add_sta->status = status;
4393 goto send_rsp;
4394 }
4395
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004396 peer = cdp_peer_find_by_addr(soc, pdev,
4397 add_sta->staMac,
4398 &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004399 if (!peer) {
4400 WMA_LOGE("%s: addSta, failed to find peer handle for mac %pM",
4401 __func__, add_sta->staMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304402 add_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004403 wma_remove_peer(wma, add_sta->staMac,
4404 add_sta->smesessionId, peer, false);
Poddar, Siddarth5a91f5b2016-04-28 12:24:10 +05304405
Leo Chang96464902016-10-28 11:10:54 -07004406 cdp_peer_add_last_real_peer(soc, pdev, vdev, &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004407 goto send_rsp;
4408 }
4409
Leo Chang96464902016-10-28 11:10:54 -07004410 add_sta->staIdx = cdp_peer_get_local_peer_id(soc, peer);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004411 WMA_LOGD("%s: addSta, after calling cdp_local_peer_id, staIdx: %d, staMac: %pM",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004412 __func__, add_sta->staIdx, add_sta->staMac);
4413
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304414 peerStateParams = qdf_mem_malloc(sizeof(tTdlsPeerStateParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004415 if (!peerStateParams) {
4416 WMA_LOGE
4417 ("%s: Failed to allocate memory for peerStateParams for %pM",
4418 __func__, add_sta->staMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304419 add_sta->status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004420 goto send_rsp;
4421 }
4422
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004423 peerStateParams->peerState = WMI_TDLS_PEER_STATE_PEERING;
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07004424 peerStateParams->vdevId = add_sta->smesessionId;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304425 qdf_mem_copy(&peerStateParams->peerMacAddr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004426 &add_sta->staMac, sizeof(tSirMacAddr));
4427 wma_update_tdls_peer_state(wma, peerStateParams);
4428 } else {
4429 /* its a change sta request * */
4430 peer =
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004431 cdp_peer_find_by_addr(soc, pdev,
4432 add_sta->staMac,
4433 &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004434 if (!peer) {
4435 WMA_LOGE("%s: changeSta,failed to find peer handle for mac %pM",
4436 __func__, add_sta->staMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304437 add_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004438 wma_remove_peer(wma, add_sta->staMac,
4439 add_sta->smesessionId, peer, false);
Poddar, Siddarth5a91f5b2016-04-28 12:24:10 +05304440
Leo Chang96464902016-10-28 11:10:54 -07004441 cdp_peer_add_last_real_peer(soc, pdev, vdev, &peer_id);
Poddar, Siddarth5a91f5b2016-04-28 12:24:10 +05304442
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004443 goto send_rsp;
4444 }
4445
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304446 if (wmi_service_enabled(wma->wmi_handle,
4447 wmi_service_peer_assoc_conf)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004448 WMA_LOGE(FL("WMI_SERVICE_PEER_ASSOC_CONF is enabled"));
4449 peer_assoc_cnf = true;
4450 msg = wma_fill_hold_req(wma, add_sta->smesessionId,
4451 WMA_ADD_STA_REQ, WMA_PEER_ASSOC_CNF_START,
4452 add_sta, WMA_PEER_ASSOC_TIMEOUT);
4453 if (!msg) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004454 WMA_LOGE(FL("Failed to alloc request for vdev_id %d"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004455 add_sta->smesessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304456 add_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004457 wma_remove_req(wma, add_sta->smesessionId,
4458 WMA_PEER_ASSOC_CNF_START);
4459 wma_remove_peer(wma, add_sta->staMac,
4460 add_sta->smesessionId, peer, false);
4461 peer_assoc_cnf = false;
4462 goto send_rsp;
4463 }
4464 } else {
4465 WMA_LOGE(FL("WMI_SERVICE_PEER_ASSOC_CONF not enabled"));
4466 }
4467
Govind Singhb30d4c02016-03-24 11:01:23 +05304468 WMA_LOGD("%s: changeSta, calling wma_send_peer_assoc",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004469 __func__);
4470
4471 ret =
Govind Singhb30d4c02016-03-24 11:01:23 +05304472 wma_send_peer_assoc(wma, add_sta->nwType, add_sta);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004473 if (ret) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304474 add_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004475 wma_remove_peer(wma, add_sta->staMac,
4476 add_sta->smesessionId, peer, false);
Leo Chang96464902016-10-28 11:10:54 -07004477 cdp_peer_add_last_real_peer(soc, pdev, vdev, &peer_id);
Poddar, Siddarth5a91f5b2016-04-28 12:24:10 +05304478
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004479 goto send_rsp;
4480 }
4481 }
4482
4483send_rsp:
4484 /* Do not send add stat resp when peer assoc cnf is enabled */
4485 if (peer_assoc_cnf)
4486 return;
4487
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004488 WMA_LOGD(FL("statype %d vdev_id %d aid %d bssid %pM staIdx %d status %d"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004489 add_sta->staType, add_sta->smesessionId,
4490 add_sta->assocId, add_sta->bssId, add_sta->staIdx,
4491 add_sta->status);
Abhishek Singh2d775fd2017-08-18 10:51:33 +05304492 wma_send_msg_high_priority(wma, WMA_ADD_STA_RSP, (void *)add_sta, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004493}
4494#endif
4495
4496/**
4497 * wma_add_sta_req_sta_mode() - process add sta request in sta mode
4498 * @wma: wma handle
4499 * @add_sta: add sta params
4500 *
4501 * Return: none
4502 */
4503static void wma_add_sta_req_sta_mode(tp_wma_handle wma, tpAddStaParams params)
4504{
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004505 struct cdp_pdev *pdev;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304506 QDF_STATUS status = QDF_STATUS_SUCCESS;
Leo Chang96464902016-10-28 11:10:54 -07004507 void *peer;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004508 struct wma_txrx_node *iface;
Amar Singhala297bfa2015-10-15 15:07:29 -07004509 int8_t maxTxPower;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004510 int ret = 0;
4511 struct wma_target_req *msg;
4512 bool peer_assoc_cnf = false;
Govind Singhd76a5b02016-03-08 15:12:14 +05304513 struct vdev_up_params param = {0};
Archana Ramachandran20d2e232016-02-11 16:58:40 -08004514 int smps_param;
Leo Chang96464902016-10-28 11:10:54 -07004515 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004516
4517#ifdef FEATURE_WLAN_TDLS
4518 if (STA_ENTRY_TDLS_PEER == params->staType) {
4519 wma_add_tdls_sta(wma, params);
4520 return;
4521 }
4522#endif
4523
Anurag Chouhan6d760662016-02-20 16:05:43 +05304524 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004525
4526 if (NULL == pdev) {
4527 WMA_LOGE("%s: Unable to get pdev", __func__);
4528 goto out;
4529 }
4530
4531 iface = &wma->interfaces[params->smesessionId];
4532 if (params->staType != STA_ENTRY_SELF) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004533 WMA_LOGE("%s: unsupported station type %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004534 __func__, params->staType);
4535 goto out;
4536 }
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004537 peer = cdp_peer_find_by_addr(soc,
4538 pdev,
4539 params->bssId, &params->staIdx);
Sandeep Puligilla2ff3ebe2016-08-31 23:55:07 -07004540 if (peer == NULL) {
4541 WMA_LOGE("%s: Peer is not present vdev id %d for %pM", __func__,
4542 params->smesessionId, params->bssId);
4543 status = QDF_STATUS_E_FAILURE;
4544 goto out;
4545 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004546 if (params->nonRoamReassoc) {
Leo Chang96464902016-10-28 11:10:54 -07004547 cdp_peer_state_update(soc, pdev, params->bssId,
Dhanashri Atreb08959a2016-03-01 17:28:03 -08004548 OL_TXRX_PEER_STATE_AUTH);
Anurag Chouhan8e0ccd32016-02-19 15:30:20 +05304549 qdf_atomic_set(&iface->bss_status, WMA_BSS_STATUS_STARTED);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004550 iface->aid = params->assocId;
4551 goto out;
4552 }
4553
Mukul Sharmaf9047232017-03-02 16:58:56 +05304554 if (wma_is_vdev_up(params->smesessionId)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004555 WMA_LOGE("%s: vdev id %d is already UP for %pM", __func__,
4556 params->smesessionId, params->bssId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304557 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004558 goto out;
4559 }
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07004560
4561 if (peer != NULL &&
Leo Chang96464902016-10-28 11:10:54 -07004562 (cdp_peer_state_get(soc, peer) == OL_TXRX_PEER_STATE_DISC)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004563 /*
4564 * This is the case for reassociation.
4565 * peer state update and peer_assoc is required since it
4566 * was not done by WMA_ADD_BSS_REQ.
4567 */
4568
4569 /* Update peer state */
4570 if (params->encryptType == eSIR_ED_NONE) {
4571 WMA_LOGD("%s: Update peer(%pM) state into auth",
4572 __func__, params->bssId);
Leo Chang96464902016-10-28 11:10:54 -07004573 cdp_peer_state_update(soc, pdev, params->bssId,
Dhanashri Atreb08959a2016-03-01 17:28:03 -08004574 OL_TXRX_PEER_STATE_AUTH);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004575 } else {
4576 WMA_LOGD("%s: Update peer(%pM) state into conn",
4577 __func__, params->bssId);
Leo Chang96464902016-10-28 11:10:54 -07004578 cdp_peer_state_update(soc, pdev, params->bssId,
Dhanashri Atreb08959a2016-03-01 17:28:03 -08004579 OL_TXRX_PEER_STATE_CONN);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004580 }
4581
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08004582 if (wma_is_roam_synch_in_progress(wma, params->smesessionId)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004583 /* iface->nss = params->nss; */
4584 /*In LFR2.0, the following operations are performed as
Govind Singhb30d4c02016-03-24 11:01:23 +05304585 * part of wma_send_peer_assoc. As we are
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004586 * skipping this operation, we are just executing the
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004587 * following which are useful for LFR3.0
4588 */
Leo Chang96464902016-10-28 11:10:54 -07004589 cdp_peer_state_update(soc, pdev, params->bssId,
Dhanashri Atreb08959a2016-03-01 17:28:03 -08004590 OL_TXRX_PEER_STATE_AUTH);
Anurag Chouhan8e0ccd32016-02-19 15:30:20 +05304591 qdf_atomic_set(&iface->bss_status,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004592 WMA_BSS_STATUS_STARTED);
4593 iface->aid = params->assocId;
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004594 WMA_LOGD("LFR3:statype %d vdev %d aid %d bssid %pM",
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08004595 params->staType, params->smesessionId,
4596 params->assocId, params->bssId);
4597 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004598 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004599 wmi_unified_send_txbf(wma, params);
4600
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304601 if (wmi_service_enabled(wma->wmi_handle,
4602 wmi_service_peer_assoc_conf)) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004603 WMA_LOGD(FL("WMI_SERVICE_PEER_ASSOC_CONF is enabled"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004604 peer_assoc_cnf = true;
4605 msg = wma_fill_hold_req(wma, params->smesessionId,
4606 WMA_ADD_STA_REQ, WMA_PEER_ASSOC_CNF_START,
4607 params, WMA_PEER_ASSOC_TIMEOUT);
4608 if (!msg) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004609 WMA_LOGD(FL("Failed to alloc request for vdev_id %d"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004610 params->smesessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304611 params->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004612 wma_remove_req(wma, params->smesessionId,
4613 WMA_PEER_ASSOC_CNF_START);
4614 wma_remove_peer(wma, params->staMac,
4615 params->smesessionId, peer, false);
4616 peer_assoc_cnf = false;
4617 goto out;
4618 }
4619 } else {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004620 WMA_LOGD(FL("WMI_SERVICE_PEER_ASSOC_CONF not enabled"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004621 }
4622
Govind Singhb30d4c02016-03-24 11:01:23 +05304623 ret = wma_send_peer_assoc(wma,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004624 iface->nwType,
4625 (tAddStaParams *) iface->addBssStaContext);
4626 if (ret) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304627 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004628 wma_remove_peer(wma, params->bssId,
4629 params->smesessionId, peer, false);
4630 goto out;
4631 }
Abhishek Singhcfb44482017-03-10 12:42:37 +05304632
4633 if (params->rmfEnabled)
4634 wma_set_mgmt_frame_protection(wma);
4635
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004636 /*
4637 * Set the PTK in 11r mode because we already have it.
4638 */
4639 if (iface->staKeyParams) {
4640 wma_set_stakey(wma,
4641 (tpSetStaKeyParams) iface->staKeyParams);
4642 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004643 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004644 maxTxPower = params->maxTxPower;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004645 wma_vdev_set_bss_params(wma, params->smesessionId,
4646 iface->beaconInterval, iface->dtimPeriod,
4647 iface->shortSlotTimeSupported,
4648 iface->llbCoexist, maxTxPower);
4649
4650 params->csaOffloadEnable = 0;
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304651 if (wmi_service_enabled(wma->wmi_handle,
4652 wmi_service_csa_offload)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004653 params->csaOffloadEnable = 1;
Govind Singhd76a5b02016-03-08 15:12:14 +05304654 if (wma_unified_csa_offload_enable(wma, params->smesessionId) <
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004655 0) {
4656 WMA_LOGE("Unable to enable CSA offload for vdev_id:%d",
4657 params->smesessionId);
4658 }
4659 }
4660
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304661 if (wmi_service_enabled(wma->wmi_handle,
4662 wmi_service_filter_ipsec_natkeepalive)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004663 if (wmi_unified_nat_keepalive_enable(wma, params->smesessionId)
4664 < 0) {
4665 WMA_LOGE("Unable to enable NAT keepalive for vdev_id:%d",
4666 params->smesessionId);
4667 }
4668 }
4669
Govind Singhd76a5b02016-03-08 15:12:14 +05304670 param.vdev_id = params->smesessionId;
4671 param.assoc_id = params->assocId;
Dustin Brownec2c92e2017-07-26 11:13:49 -07004672 if (wma_send_vdev_up_to_fw(wma, &param, params->bssId) !=
4673 QDF_STATUS_SUCCESS) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004674 WMA_LOGE("%s: Failed to send vdev up cmd: vdev %d bssid %pM",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004675 __func__, params->smesessionId, params->bssId);
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07004676 policy_mgr_set_do_hw_mode_change_flag(
4677 wma->psoc, false);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304678 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004679 } else {
Hong Shib90718f2017-02-20 00:57:22 +08004680 wma_set_vdev_mgmt_rate(wma, params->smesessionId);
Mukul Sharmaf9047232017-03-02 16:58:56 +05304681 wma_vdev_set_mlme_state(wma, params->smesessionId,
4682 WLAN_VDEV_S_RUN);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004683 }
4684
Anurag Chouhan8e0ccd32016-02-19 15:30:20 +05304685 qdf_atomic_set(&iface->bss_status, WMA_BSS_STATUS_STARTED);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004686 WMA_LOGD("%s: STA mode (type %d subtype %d) BSS is started",
4687 __func__, iface->type, iface->sub_type);
4688 /* Sta is now associated, configure various params */
4689
Archana Ramachandran20d2e232016-02-11 16:58:40 -08004690 /* Send SMPS force command to FW to send the required
4691 * action frame only when SM power save is enbaled in
Archana Ramachandranfec24812016-02-16 16:31:56 -08004692 * from INI. In case dynamic antenna selection, the
4693 * action frames are sent by the chain mask manager
Archana Ramachandran20d2e232016-02-11 16:58:40 -08004694 * In addition to the action frames, The SM power save is
4695 * published in the assoc request HT SMPS IE for both cases.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004696 */
Archana Ramachandranfec24812016-02-16 16:31:56 -08004697 if ((params->enableHtSmps) && (params->send_smps_action)) {
Archana Ramachandran20d2e232016-02-11 16:58:40 -08004698 smps_param = wma_smps_mode_to_force_mode_param(
4699 params->htSmpsconfig);
4700 if (smps_param >= 0) {
Archana Ramachandranfec24812016-02-16 16:31:56 -08004701 WMA_LOGD("%s: Send SMPS force mode: %d",
Archana Ramachandran20d2e232016-02-11 16:58:40 -08004702 __func__, params->htSmpsconfig);
4703 wma_set_mimops(wma, params->smesessionId,
4704 smps_param);
4705 }
4706 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004707
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004708 /* Partial AID match power save, enable when SU bformee */
4709 if (params->enableVhtpAid && params->vhtTxBFCapable)
4710 wma_set_ppsconfig(params->smesessionId,
4711 WMA_VHT_PPS_PAID_MATCH, 1);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004712
4713 /* Enable AMPDU power save, if htCapable/vhtCapable */
4714 if (params->enableAmpduPs && (params->htCapable || params->vhtCapable))
4715 wma_set_ppsconfig(params->smesessionId,
4716 WMA_VHT_PPS_DELIM_CRC_FAIL, 1);
4717 iface->aid = params->assocId;
Kanchanapally, Vidyullathae3062812015-05-22 17:28:57 +05304718 params->nss = iface->nss;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004719out:
4720 /* Do not send add stat resp when peer assoc cnf is enabled */
4721 if (peer_assoc_cnf)
4722 return;
4723
4724 params->status = status;
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004725 WMA_LOGD(FL("statype %d vdev_id %d aid %d bssid %pM staIdx %d status %d"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004726 params->staType, params->smesessionId,
4727 params->assocId, params->bssId, params->staIdx,
4728 params->status);
Sandeep Puligilla2ff3ebe2016-08-31 23:55:07 -07004729 /* Don't send a response during roam sync operation */
4730 if (!wma_is_roam_synch_in_progress(wma, params->smesessionId))
Abhishek Singh2d775fd2017-08-18 10:51:33 +05304731 wma_send_msg_high_priority(wma, WMA_ADD_STA_RSP,
4732 (void *)params, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004733}
4734
4735/**
4736 * wma_delete_sta_req_ap_mode() - proces delete sta request from UMAC in AP mode
4737 * @wma: wma handle
4738 * @del_sta: delete sta params
4739 *
4740 * Return: none
4741 */
4742static void wma_delete_sta_req_ap_mode(tp_wma_handle wma,
4743 tpDeleteStaParams del_sta)
4744{
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004745 struct cdp_pdev *pdev;
Leo Chang96464902016-10-28 11:10:54 -07004746 void *peer;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08004747 struct wma_target_req *msg;
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07004748 uint8_t *peer_mac_addr;
Leo Chang96464902016-10-28 11:10:54 -07004749 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004750
Anurag Chouhan6d760662016-02-20 16:05:43 +05304751 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004752
4753 if (NULL == pdev) {
4754 WMA_LOGE("%s: Failed to get pdev", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304755 del_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004756 goto send_del_rsp;
4757 }
4758
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004759 peer = cdp_peer_find_by_local_id(soc,
4760 pdev, del_sta->staIdx);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004761 if (!peer) {
4762 WMA_LOGE("%s: Failed to get peer handle using peer id %d",
4763 __func__, del_sta->staIdx);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304764 del_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004765 goto send_del_rsp;
4766 }
Leo Chang96464902016-10-28 11:10:54 -07004767 peer_mac_addr = cdp_peer_get_peer_mac_addr(soc, peer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004768
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07004769 wma_remove_peer(wma, peer_mac_addr, del_sta->smesessionId, peer,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004770 false);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304771 del_sta->status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004772
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304773 if (wmi_service_enabled(wma->wmi_handle,
4774 wmi_service_sync_delete_cmds)) {
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08004775 msg = wma_fill_hold_req(wma, del_sta->smesessionId,
4776 WMA_DELETE_STA_REQ,
4777 WMA_DELETE_STA_RSP_START, del_sta,
4778 WMA_DELETE_STA_TIMEOUT);
4779 if (!msg) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004780 WMA_LOGE(FL("Failed to allocate request. vdev_id %d"),
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08004781 del_sta->smesessionId);
4782 wma_remove_req(wma, del_sta->smesessionId,
4783 WMA_DELETE_STA_RSP_START);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304784 del_sta->status = QDF_STATUS_E_NOMEM;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08004785 goto send_del_rsp;
4786 }
Dustin Brownec2c92e2017-07-26 11:13:49 -07004787
4788 wma_acquire_wakelock(&wma->wmi_cmd_rsp_wake_lock,
4789 WMA_FW_RSP_EVENT_WAKE_LOCK_DURATION);
4790
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08004791 return;
4792 }
4793
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004794send_del_rsp:
4795 if (del_sta->respReqd) {
4796 WMA_LOGD("%s: Sending del rsp to umac (status: %d)",
4797 __func__, del_sta->status);
Abhishek Singh2d775fd2017-08-18 10:51:33 +05304798 wma_send_msg_high_priority(wma, WMA_DELETE_STA_RSP,
4799 (void *)del_sta, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004800 }
4801}
4802
4803#ifdef FEATURE_WLAN_TDLS
4804/**
4805 * wma_del_tdls_sta() - proces delete sta request from UMAC in TDLS
4806 * @wma: wma handle
4807 * @del_sta: delete sta params
4808 *
4809 * Return: none
4810 */
4811static void wma_del_tdls_sta(tp_wma_handle wma, tpDeleteStaParams del_sta)
4812{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004813 tTdlsPeerStateParams *peerStateParams;
Padma, Santhosh Kumar4eb79082017-02-24 16:00:20 +05304814 struct wma_target_req *msg;
4815 int status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004816
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304817 peerStateParams = qdf_mem_malloc(sizeof(tTdlsPeerStateParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004818 if (!peerStateParams) {
4819 WMA_LOGE("%s: Failed to allocate memory for peerStateParams for: %pM",
4820 __func__, del_sta->staMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304821 del_sta->status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004822 goto send_del_rsp;
4823 }
4824
Nitesh Shah622d3122017-06-05 17:04:06 +05304825 if (wma_is_roam_synch_in_progress(wma, del_sta->smesessionId)) {
4826 WMA_LOGE("%s: roaming in progress, reject del sta!", __func__);
4827 del_sta->status = QDF_STATUS_E_PERM;
4828 goto send_del_rsp;
4829 }
4830
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004831 peerStateParams->peerState = WMA_TDLS_PEER_STATE_TEARDOWN;
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07004832 peerStateParams->vdevId = del_sta->smesessionId;
Padma, Santhosh Kumar4eb79082017-02-24 16:00:20 +05304833 peerStateParams->resp_reqd = del_sta->respReqd;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304834 qdf_mem_copy(&peerStateParams->peerMacAddr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004835 &del_sta->staMac, sizeof(tSirMacAddr));
4836
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004837 WMA_LOGD("%s: sending tdls_peer_state for peer mac: %pM, peerState: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004838 __func__, peerStateParams->peerMacAddr,
4839 peerStateParams->peerState);
4840
Padma, Santhosh Kumar4eb79082017-02-24 16:00:20 +05304841 status = wma_update_tdls_peer_state(wma, peerStateParams);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004842
Padma, Santhosh Kumar4eb79082017-02-24 16:00:20 +05304843 if (status < 0) {
4844 WMA_LOGE("%s: wma_update_tdls_peer_state returned failure",
4845 __func__);
4846 goto send_del_rsp;
4847 }
4848
4849 if (del_sta->respReqd &&
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304850 wmi_service_enabled(wma->wmi_handle,
4851 wmi_service_sync_delete_cmds)) {
Padma, Santhosh Kumar4eb79082017-02-24 16:00:20 +05304852 del_sta->status = QDF_STATUS_SUCCESS;
4853 msg = wma_fill_hold_req(wma,
4854 del_sta->smesessionId,
4855 WMA_DELETE_STA_REQ,
4856 WMA_DELETE_STA_RSP_START, del_sta,
4857 WMA_DELETE_STA_TIMEOUT);
4858 if (!msg) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004859 WMA_LOGE(FL("Failed to allocate vdev_id %d"),
Padma, Santhosh Kumar4eb79082017-02-24 16:00:20 +05304860 peerStateParams->vdevId);
4861 wma_remove_req(wma,
4862 peerStateParams->vdevId,
4863 WMA_DELETE_STA_RSP_START);
4864 del_sta->status = QDF_STATUS_E_NOMEM;
4865 goto send_del_rsp;
4866 }
Dustin Brownec2c92e2017-07-26 11:13:49 -07004867
4868 wma_acquire_wakelock(&wma->wmi_cmd_rsp_wake_lock,
Padma, Santhosh Kumar4eb79082017-02-24 16:00:20 +05304869 WMA_FW_RSP_EVENT_WAKE_LOCK_DURATION);
Padma, Santhosh Kumar4eb79082017-02-24 16:00:20 +05304870 }
4871
4872 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004873
4874send_del_rsp:
4875 if (del_sta->respReqd) {
4876 WMA_LOGD("%s: Sending del rsp to umac (status: %d)",
4877 __func__, del_sta->status);
Abhishek Singh2d775fd2017-08-18 10:51:33 +05304878 wma_send_msg_high_priority(wma, WMA_DELETE_STA_RSP,
4879 (void *)del_sta, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004880 }
4881}
4882#endif
4883
4884/**
4885 * wma_delete_sta_req_sta_mode() - proces delete sta request from UMAC
4886 * @wma: wma handle
4887 * @params: delete sta params
4888 *
4889 * Return: none
4890 */
4891static void wma_delete_sta_req_sta_mode(tp_wma_handle wma,
4892 tpDeleteStaParams params)
4893{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304894 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004895 struct wma_txrx_node *iface;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004896
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004897 iface = &wma->interfaces[params->smesessionId];
4898 iface->uapsd_cached_val = 0;
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08004899 if (wma_is_roam_synch_in_progress(wma, params->smesessionId))
4900 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004901#ifdef FEATURE_WLAN_TDLS
4902 if (STA_ENTRY_TDLS_PEER == params->staType) {
4903 wma_del_tdls_sta(wma, params);
4904 return;
4905 }
4906#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004907 params->status = status;
4908 if (params->respReqd) {
4909 WMA_LOGD("%s: vdev_id %d status %d", __func__,
4910 params->smesessionId, status);
Abhishek Singh2d775fd2017-08-18 10:51:33 +05304911 wma_send_msg_high_priority(wma, WMA_DELETE_STA_RSP,
4912 (void *)params, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004913 }
4914}
4915
4916/**
4917 * wma_add_sta() - process add sta request as per opmode
4918 * @wma: wma handle
4919 * @add_Sta: add sta params
4920 *
4921 * Return: none
4922 */
4923void wma_add_sta(tp_wma_handle wma, tpAddStaParams add_sta)
4924{
4925 uint8_t oper_mode = BSS_OPERATIONAL_MODE_STA;
4926
4927 WMA_LOGD("%s: add_sta->sessionId = %d.", __func__,
4928 add_sta->smesessionId);
4929 WMA_LOGD("%s: add_sta->bssId = %x:%x:%x:%x:%x:%x", __func__,
4930 add_sta->bssId[0], add_sta->bssId[1], add_sta->bssId[2],
4931 add_sta->bssId[3], add_sta->bssId[4], add_sta->bssId[5]);
4932
4933 if (wma_is_vdev_in_ap_mode(wma, add_sta->smesessionId))
4934 oper_mode = BSS_OPERATIONAL_MODE_AP;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004935 else if (wma_is_vdev_in_ibss_mode(wma, add_sta->smesessionId))
4936 oper_mode = BSS_OPERATIONAL_MODE_IBSS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004937
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -07004938 if (WMA_IS_VDEV_IN_NDI_MODE(wma->interfaces, add_sta->smesessionId))
4939 oper_mode = BSS_OPERATIONAL_MODE_NDI;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004940 switch (oper_mode) {
4941 case BSS_OPERATIONAL_MODE_STA:
4942 wma_add_sta_req_sta_mode(wma, add_sta);
4943 break;
4944
Houston Hoffman79b4af22015-10-06 12:01:08 -07004945 /* IBSS should share the same code as AP mode */
4946 case BSS_OPERATIONAL_MODE_IBSS:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004947 case BSS_OPERATIONAL_MODE_AP:
Houston Hoffmanf09b50d2016-07-29 15:56:01 -07004948 htc_vote_link_up(wma->htc_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004949 wma_add_sta_req_ap_mode(wma, add_sta);
4950 break;
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -07004951 case BSS_OPERATIONAL_MODE_NDI:
4952 wma_add_sta_ndi_mode(wma, add_sta);
4953 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004954 }
4955
4956#ifdef QCA_IBSS_SUPPORT
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004957 /* adjust heart beat thresold timer value for detecting ibss peer
4958 * departure
4959 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004960 if (oper_mode == BSS_OPERATIONAL_MODE_IBSS)
4961 wma_adjust_ibss_heart_beat_timer(wma, add_sta->smesessionId, 1);
4962#endif
4963
4964}
4965
4966/**
4967 * wma_delete_sta() - process del sta request as per opmode
4968 * @wma: wma handle
4969 * @del_sta: delete sta params
4970 *
4971 * Return: none
4972 */
4973void wma_delete_sta(tp_wma_handle wma, tpDeleteStaParams del_sta)
4974{
4975 uint8_t oper_mode = BSS_OPERATIONAL_MODE_STA;
4976 uint8_t smesession_id = del_sta->smesessionId;
4977 bool rsp_requested = del_sta->respReqd;
4978
4979 if (wma_is_vdev_in_ap_mode(wma, smesession_id))
4980 oper_mode = BSS_OPERATIONAL_MODE_AP;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004981 if (wma_is_vdev_in_ibss_mode(wma, smesession_id)) {
4982 oper_mode = BSS_OPERATIONAL_MODE_IBSS;
4983 WMA_LOGD("%s: to delete sta for IBSS mode", __func__);
4984 }
Deepak Dhamdherea6d2f4c2016-06-04 00:24:52 -07004985 if (del_sta->staType == STA_ENTRY_NDI_PEER)
4986 oper_mode = BSS_OPERATIONAL_MODE_NDI;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004987
Padma, Santhosh Kumarcd35f532016-12-27 12:07:39 +05304988 WMA_LOGD(FL("oper_mode %d"), oper_mode);
4989
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004990 switch (oper_mode) {
4991 case BSS_OPERATIONAL_MODE_STA:
4992 wma_delete_sta_req_sta_mode(wma, del_sta);
Varun Reddy Yeturu33894272017-10-27 15:37:31 -07004993 if (wma_is_roam_synch_in_progress(wma, smesession_id)) {
4994 WMA_LOGD(FL("LFR3: Del STA on vdev_id %d"),
4995 del_sta->smesessionId);
4996 qdf_mem_free(del_sta);
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08004997 return;
Varun Reddy Yeturu33894272017-10-27 15:37:31 -07004998 }
Krishna Kumaar Natarajan70133f02016-02-03 14:35:48 -08004999 if (!rsp_requested) {
5000 WMA_LOGD(FL("vdev_id %d status %d"),
5001 del_sta->smesessionId, del_sta->status);
5002 qdf_mem_free(del_sta);
5003 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005004 break;
5005
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005006 case BSS_OPERATIONAL_MODE_IBSS: /* IBSS shares AP code */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005007 case BSS_OPERATIONAL_MODE_AP:
Houston Hoffmanf09b50d2016-07-29 15:56:01 -07005008 htc_vote_link_down(wma->htc_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005009 wma_delete_sta_req_ap_mode(wma, del_sta);
Krishna Kumaar Natarajan70133f02016-02-03 14:35:48 -08005010 /* free the memory here only if sync feature is not enabled */
5011 if (!rsp_requested &&
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05305012 !wmi_service_enabled(wma->wmi_handle,
5013 wmi_service_sync_delete_cmds)) {
Krishna Kumaar Natarajan70133f02016-02-03 14:35:48 -08005014 WMA_LOGD(FL("vdev_id %d status %d"),
5015 del_sta->smesessionId, del_sta->status);
5016 qdf_mem_free(del_sta);
Krunal Sonie50ff452017-10-11 18:23:55 -07005017 } else if (!rsp_requested &&
5018 (del_sta->status != QDF_STATUS_SUCCESS)) {
5019 WMA_LOGD(FL("Release del_sta mem vdev_id %d status %d"),
5020 del_sta->smesessionId, del_sta->status);
5021 qdf_mem_free(del_sta);
Krishna Kumaar Natarajan70133f02016-02-03 14:35:48 -08005022 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005023 break;
Deepak Dhamdherea6d2f4c2016-06-04 00:24:52 -07005024 case BSS_OPERATIONAL_MODE_NDI:
5025 wma_delete_sta_req_ndi_mode(wma, del_sta);
5026 break;
Varun Reddy Yeturu33894272017-10-27 15:37:31 -07005027 default:
5028 WMA_LOGE(FL("Incorrect oper mode %d"), oper_mode);
5029 qdf_mem_free(del_sta);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005030 }
5031
5032#ifdef QCA_IBSS_SUPPORT
5033 /* adjust heart beat thresold timer value for
5034 * detecting ibss peer departure
5035 */
5036 if (oper_mode == BSS_OPERATIONAL_MODE_IBSS)
5037 wma_adjust_ibss_heart_beat_timer(wma, smesession_id, -1);
5038#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005039}
5040
5041/**
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005042 * wma_delete_bss_ho_fail() - process delete bss request for handoff failure
5043 * @wma: wma handle
5044 * @params: del bss parameters
5045 *
5046 * Delete BSS in case of ROAM_HO_FAIL processing is handled separately in
5047 * this routine. It needs to be done without sending any commands to firmware
5048 * because firmware has already stopped and deleted peer and vdev is down.
5049 * Relevent logic is aggregated from other routines. It changes the host
5050 * data structures without sending VDEV_STOP, PEER_FLUSH_TIDS, PEER_DELETE
5051 * and VDEV_DOWN commands to firmware.
5052 *
5053 * Return: none
5054 */
5055void wma_delete_bss_ho_fail(tp_wma_handle wma, tpDeleteBssParams params)
5056{
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08005057 struct cdp_pdev *pdev;
Leo Chang96464902016-10-28 11:10:54 -07005058 void *peer = NULL;
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005059 QDF_STATUS status = QDF_STATUS_SUCCESS;
5060 uint8_t peer_id;
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08005061 struct cdp_vdev *txrx_vdev = NULL;
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005062 struct wma_txrx_node *iface;
Leo Chang96464902016-10-28 11:10:54 -07005063 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005064
5065 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
5066
5067 if (NULL == pdev) {
5068 WMA_LOGE("%s:Unable to get TXRX context", __func__);
5069 goto fail_del_bss_ho_fail;
5070 }
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005071
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08005072 peer = cdp_peer_find_by_addr(soc,
5073 pdev,
5074 params->bssid, &peer_id);
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005075 if (!peer) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07005076 WMA_LOGE("%s: Failed to find peer %pM", __func__,
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005077 params->bssid);
5078 status = QDF_STATUS_E_FAILURE;
5079 goto fail_del_bss_ho_fail;
5080 }
5081
5082 iface = &wma->interfaces[params->smesessionId];
5083 if (!iface || !iface->handle) {
5084 WMA_LOGE("%s vdev id %d is already deleted",
5085 __func__, params->smesessionId);
5086 goto fail_del_bss_ho_fail;
5087 }
5088 qdf_mem_zero(iface->bssid, IEEE80211_ADDR_LEN);
5089
5090 txrx_vdev = wma_find_vdev_by_id(wma, params->smesessionId);
5091 if (!txrx_vdev) {
5092 WMA_LOGE("%s:Invalid vdev handle", __func__);
5093 status = QDF_STATUS_E_FAILURE;
5094 goto fail_del_bss_ho_fail;
5095 }
5096
5097 /* Free the allocated stats response buffer for the the session */
5098 if (iface->stats_rsp) {
5099 qdf_mem_free(iface->stats_rsp);
5100 iface->stats_rsp = NULL;
5101 }
5102
5103 if (iface->psnr_req) {
5104 qdf_mem_free(iface->psnr_req);
5105 iface->psnr_req = NULL;
5106 }
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +05305107
5108 if (iface->rcpi_req) {
5109 struct sme_rcpi_req *rcpi_req = iface->rcpi_req;
5110
5111 iface->rcpi_req = NULL;
5112 qdf_mem_free(rcpi_req);
5113 }
5114
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005115 qdf_mem_zero(&iface->ns_offload_req,
5116 sizeof(iface->ns_offload_req));
5117 qdf_mem_zero(&iface->arp_offload_req,
5118 sizeof(iface->arp_offload_req));
5119
5120 WMA_LOGD("%s, vdev_id: %d, pausing tx_ll_queue for VDEV_STOP (del_bss)",
5121 __func__, params->smesessionId);
Leo Chang96464902016-10-28 11:10:54 -07005122 cdp_fc_vdev_pause(soc, iface->handle,
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005123 OL_TXQ_PAUSE_REASON_VDEV_STOP);
Mukul Sharma6411bb82017-03-01 15:57:07 +05305124 wma_vdev_set_pause_bit(params->smesessionId, PAUSE_TYPE_HOST);
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005125
Leo Chang96464902016-10-28 11:10:54 -07005126 cdp_fc_vdev_flush(soc, iface->handle);
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005127 WMA_LOGD("%s, vdev_id: %d, un-pausing tx_ll_queue for VDEV_STOP rsp",
5128 __func__, params->smesessionId);
Leo Chang96464902016-10-28 11:10:54 -07005129 cdp_fc_vdev_unpause(soc, iface->handle,
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005130 OL_TXQ_PAUSE_REASON_VDEV_STOP);
Mukul Sharma6411bb82017-03-01 15:57:07 +05305131 wma_vdev_clear_pause_bit(params->smesessionId, PAUSE_TYPE_HOST);
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005132 qdf_atomic_set(&iface->bss_status, WMA_BSS_STATUS_STOPPED);
5133 WMA_LOGD("%s: (type %d subtype %d) BSS is stopped",
5134 __func__, iface->type, iface->sub_type);
Mukul Sharmaf9047232017-03-02 16:58:56 +05305135 wma_vdev_set_mlme_state(wma, params->smesessionId, WLAN_VDEV_S_STOP);
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005136 params->status = QDF_STATUS_SUCCESS;
5137 if (!iface->peer_count) {
5138 WMA_LOGE("%s: Can't remove peer with peer_addr %pM vdevid %d peer_count %d",
5139 __func__, params->bssid, params->smesessionId,
5140 iface->peer_count);
5141 goto fail_del_bss_ho_fail;
5142 }
5143
5144 if (peer)
Lin Bai973e6922018-01-08 17:59:19 +08005145 cdp_peer_delete(soc, peer, 1 << CDP_PEER_DELETE_NO_SPECIAL);
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005146 iface->peer_count--;
Jeff Johnsonadba3962017-09-18 08:12:35 -07005147 WMA_LOGI("%s: Removed peer %pK with peer_addr %pM vdevid %d peer_count %d",
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005148 __func__, peer, params->bssid, params->smesessionId,
5149 iface->peer_count);
5150fail_del_bss_ho_fail:
5151 params->status = status;
Abhishek Singh2d775fd2017-08-18 10:51:33 +05305152 wma_send_msg_high_priority(wma, WMA_DELETE_BSS_HO_FAIL_RSP,
5153 (void *)params, 0);
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005154}
5155
Sandeep Puligillaf22263c2017-08-28 13:15:15 -07005156#ifdef WLAN_FEATURE_HOST_ROAM
5157/**
5158 * wma_wait_tx_complete() - Wait till tx packets are drained
5159 * @wma: wma handle
5160 * @session_id: vdev id
5161 *
5162 * Return: none
5163 */
5164static void wma_wait_tx_complete(tp_wma_handle wma,
5165 uint32_t session_id)
5166{
5167 struct cdp_pdev *pdev;
5168 uint8_t max_wait_iterations = 0;
5169 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
5170
5171 if (!wma->interfaces[session_id].is_vdev_valid) {
5172 WMA_LOGE("%s: Vdev is not valid: %d",
5173 __func__, session_id);
5174 return;
5175 }
5176
5177 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Varun Reddy Yeturu81d0b372017-09-19 14:41:19 -07005178 if (pdev == NULL) {
5179 WMA_LOGE("%s: pdev is not valid: %d",
5180 __func__, session_id);
5181 return;
5182 }
Sandeep Puligillaf22263c2017-08-28 13:15:15 -07005183 max_wait_iterations =
5184 wma->interfaces[session_id].delay_before_vdev_stop /
5185 WMA_TX_Q_RECHECK_TIMER_WAIT;
5186
5187 while (cdp_get_tx_pending(soc, pdev) && max_wait_iterations) {
5188 WMA_LOGW(FL("Waiting for outstanding packet to drain."));
Nachiket Kukade0396b732017-11-14 16:35:16 +05305189 qdf_wait_for_event_completion(&wma->tx_queue_empty_event,
Sandeep Puligillaf22263c2017-08-28 13:15:15 -07005190 WMA_TX_Q_RECHECK_TIMER_WAIT);
5191 max_wait_iterations--;
5192 }
5193}
5194#else
Paul Zhangc3fc0a82018-01-09 16:38:20 +08005195static void wma_wait_tx_complete(tp_wma_handle wma,
5196 uint32_t session_id)
Sandeep Puligillaf22263c2017-08-28 13:15:15 -07005197{
5198}
5199#endif
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005200/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005201 * wma_delete_bss() - process delete bss request from upper layer
5202 * @wma: wma handle
5203 * @params: del bss parameters
5204 *
5205 * Return: none
5206 */
5207void wma_delete_bss(tp_wma_handle wma, tpDeleteBssParams params)
5208{
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08005209 struct cdp_pdev *pdev;
Leo Chang96464902016-10-28 11:10:54 -07005210 void *peer = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005211 struct wma_target_req *msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305212 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005213 uint8_t peer_id;
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08005214 struct cdp_vdev *txrx_vdev = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005215 bool roam_synch_in_progress = false;
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005216 struct wma_txrx_node *iface;
Leo Chang96464902016-10-28 11:10:54 -07005217 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005218
Anurag Chouhan6d760662016-02-20 16:05:43 +05305219 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005220
5221 if (NULL == pdev) {
5222 WMA_LOGE("%s:Unable to get TXRX context", __func__);
5223 goto out;
5224 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005225 if (wma_is_vdev_in_ibss_mode(wma, params->smesessionId))
5226 /* in rome ibss case, self mac is used to create the bss peer */
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08005227 peer = cdp_peer_find_by_addr(soc,
5228 pdev,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005229 wma->interfaces[params->smesessionId].addr,
5230 &peer_id);
Deepak Dhamdhere13983f22016-05-31 19:06:09 -07005231 else if (WMA_IS_VDEV_IN_NDI_MODE(wma->interfaces,
5232 params->smesessionId))
5233 /* In ndi case, self mac is used to create the self peer */
Leo Chang96464902016-10-28 11:10:54 -07005234 peer = cdp_peer_find_by_addr(soc, pdev,
Deepak Dhamdhere13983f22016-05-31 19:06:09 -07005235 wma->interfaces[params->smesessionId].addr,
5236 &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005237 else
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08005238 peer = cdp_peer_find_by_addr(soc, pdev,
5239 params->bssid,
5240 &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005241
5242 if (!peer) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07005243 WMA_LOGE("%s: Failed to find peer %pM", __func__,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005244 params->bssid);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305245 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005246 goto out;
5247 }
5248
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305249 qdf_mem_zero(wma->interfaces[params->smesessionId].bssid,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005250 IEEE80211_ADDR_LEN);
5251
5252 txrx_vdev = wma_find_vdev_by_id(wma, params->smesessionId);
5253 if (!txrx_vdev) {
5254 WMA_LOGE("%s:Invalid vdev handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305255 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005256 goto out;
5257 }
5258
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005259 iface = &wma->interfaces[params->smesessionId];
5260 if (!iface || !iface->handle) {
5261 WMA_LOGE("%s vdev id %d is already deleted",
5262 __func__, params->smesessionId);
5263 goto out;
5264 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005265 /*Free the allocated stats response buffer for the the session */
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005266 if (iface->stats_rsp) {
5267 qdf_mem_free(iface->stats_rsp);
5268 iface->stats_rsp = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005269 }
5270
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005271 if (iface->psnr_req) {
5272 qdf_mem_free(iface->psnr_req);
5273 iface->psnr_req = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005274 }
5275
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +05305276 if (iface->rcpi_req) {
5277 struct sme_rcpi_req *rcpi_req = iface->rcpi_req;
5278
5279 iface->rcpi_req = NULL;
5280 qdf_mem_free(rcpi_req);
5281 }
5282
Leo Chang96464902016-10-28 11:10:54 -07005283 if (wlan_op_mode_ibss == cdp_get_opmode(soc, txrx_vdev))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005284 wma->ibss_started = 0;
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07005285
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08005286 if (wma_is_roam_synch_in_progress(wma, params->smesessionId)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005287 roam_synch_in_progress = true;
5288 WMA_LOGD("LFR3:%s: Setting vdev_up to FALSE for session %d",
5289 __func__, params->smesessionId);
Mukul Sharmaf9047232017-03-02 16:58:56 +05305290 wma_vdev_set_mlme_state(wma, params->smesessionId,
5291 WLAN_VDEV_S_STOP);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005292 goto detach_peer;
5293 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005294 msg = wma_fill_vdev_req(wma, params->smesessionId, WMA_DELETE_BSS_REQ,
5295 WMA_TARGET_REQ_TYPE_VDEV_STOP, params,
5296 WMA_VDEV_STOP_REQUEST_TIMEOUT);
5297 if (!msg) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07005298 WMA_LOGE("%s: Failed to fill vdev request for vdev_id %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005299 __func__, params->smesessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305300 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005301 goto detach_peer;
5302 }
5303
5304 WMA_LOGW(FL("Outstanding msdu packets: %d"),
Leo Chang96464902016-10-28 11:10:54 -07005305 cdp_get_tx_pending(soc, pdev));
Sandeep Puligillaf22263c2017-08-28 13:15:15 -07005306 wma_wait_tx_complete(wma, params->smesessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005307
Leo Chang96464902016-10-28 11:10:54 -07005308 if (cdp_get_tx_pending(soc, pdev)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005309 WMA_LOGW(FL("Outstanding msdu packets before VDEV_STOP : %d"),
Leo Chang96464902016-10-28 11:10:54 -07005310 cdp_get_tx_pending(soc, pdev));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005311 }
5312
5313 WMA_LOGD("%s, vdev_id: %d, pausing tx_ll_queue for VDEV_STOP (del_bss)",
5314 __func__, params->smesessionId);
Mukul Sharma6411bb82017-03-01 15:57:07 +05305315 wma_vdev_set_pause_bit(params->smesessionId, PAUSE_TYPE_HOST);
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08005316 cdp_fc_vdev_pause(soc,
5317 wma->interfaces[params->smesessionId].handle,
5318 OL_TXQ_PAUSE_REASON_VDEV_STOP);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005319
Dustin Brownbf6d16b2017-03-03 11:41:05 -08005320 if (wma_send_vdev_stop_to_fw(wma, params->smesessionId)) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07005321 WMA_LOGE("%s: %d Failed to send vdev stop", __func__, __LINE__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005322 wma_remove_vdev_req(wma, params->smesessionId,
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005323 WMA_TARGET_REQ_TYPE_VDEV_STOP);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305324 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005325 goto detach_peer;
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005326 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005327 WMA_LOGD("%s: bssid %pM vdev_id %d",
5328 __func__, params->bssid, params->smesessionId);
5329 return;
5330detach_peer:
5331 wma_remove_peer(wma, params->bssid, params->smesessionId, peer,
5332 roam_synch_in_progress);
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08005333 if (wma_is_roam_synch_in_progress(wma, params->smesessionId))
5334 return;
5335
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005336out:
5337 params->status = status;
Abhishek Singh2d775fd2017-08-18 10:51:33 +05305338 wma_send_msg_high_priority(wma, WMA_DELETE_BSS_RSP, (void *)params, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005339}
5340
5341/**
5342 * wma_find_ibss_vdev() - This function finds vdev_id based on input type
5343 * @wma: wma handle
5344 * @type: vdev type
5345 *
5346 * Return: vdev id
5347 */
5348int32_t wma_find_vdev_by_type(tp_wma_handle wma, int32_t type)
5349{
5350 int32_t vdev_id = 0;
5351 struct wma_txrx_node *intf = wma->interfaces;
5352
5353 for (vdev_id = 0; vdev_id < wma->max_bssid; vdev_id++) {
5354 if (NULL != intf) {
5355 if (intf[vdev_id].type == type)
5356 return vdev_id;
5357 }
5358 }
5359
5360 return -EFAULT;
5361}
5362
5363/**
5364 * wma_set_vdev_intrabss_fwd() - set intra_fwd value to wni_in.
5365 * @wma_handle: wma handle
5366 * @pdis_intra_fwd: Pointer to DisableIntraBssFwd struct
5367 *
5368 * Return: none
5369 */
5370void wma_set_vdev_intrabss_fwd(tp_wma_handle wma_handle,
5371 tpDisableIntraBssFwd pdis_intra_fwd)
5372{
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08005373 struct cdp_vdev *txrx_vdev;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07005374
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005375 WMA_LOGD("%s:intra_fwd:vdev(%d) intrabss_dis=%s",
5376 __func__, pdis_intra_fwd->sessionId,
5377 (pdis_intra_fwd->disableintrabssfwd ? "true" : "false"));
5378
5379 txrx_vdev = wma_handle->interfaces[pdis_intra_fwd->sessionId].handle;
Leo Chang96464902016-10-28 11:10:54 -07005380 cdp_cfg_vdev_rx_set_intrabss_fwd(cds_get_context(QDF_MODULE_ID_SOC),
5381 txrx_vdev,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005382 pdis_intra_fwd->disableintrabssfwd);
5383}
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07005384
5385void wma_store_pdev(void *wma_ctx, struct wlan_objmgr_pdev *pdev)
5386{
5387 tp_wma_handle wma = (tp_wma_handle)wma_ctx;
5388 QDF_STATUS status;
5389
5390 status = wlan_objmgr_pdev_try_get_ref(pdev, WLAN_LEGACY_WMA_ID);
5391 if (QDF_STATUS_SUCCESS != status) {
5392 wma->pdev = NULL;
5393 return;
5394 }
5395
5396 wma->pdev = pdev;
5397}
5398
lifeng7c607dd2017-02-21 21:16:49 +08005399/**
5400 * wma_vdev_reset_beacon_interval_timer() - reset beacon interval back
5401 * to its original value after the channel switch.
5402 *
5403 * @data: data
5404 *
5405 * Return: void
5406 */
5407static void wma_vdev_reset_beacon_interval_timer(void *data)
5408{
5409 tp_wma_handle wma;
5410 struct wma_beacon_interval_reset_req *req =
5411 (struct wma_beacon_interval_reset_req *)data;
5412 uint16_t beacon_interval = req->interval;
5413 uint8_t vdev_id = req->vdev_id;
5414
5415 wma = (tp_wma_handle)cds_get_context(QDF_MODULE_ID_WMA);
5416 if (NULL == wma) {
5417 WMA_LOGE("%s: Failed to get wma", __func__);
5418 goto end;
5419 }
5420
5421 /* Change the beacon interval back to its original value */
5422 WMA_LOGE("%s: Change beacon interval back to %d",
5423 __func__, beacon_interval);
5424 wma_update_beacon_interval(wma, vdev_id, beacon_interval);
5425
5426end:
5427 qdf_timer_stop(&req->event_timeout);
5428 qdf_timer_free(&req->event_timeout);
5429 qdf_mem_free(req);
5430}
5431
5432int wma_fill_beacon_interval_reset_req(tp_wma_handle wma, uint8_t vdev_id,
5433 uint16_t beacon_interval, uint32_t timeout)
5434{
5435 struct wma_beacon_interval_reset_req *req;
5436
5437 req = qdf_mem_malloc(sizeof(*req));
5438 if (!req) {
5439 WMA_LOGE("%s: Failed to allocate memory for beacon_interval_reset_req vdev %d",
5440 __func__, vdev_id);
5441 return -ENOMEM;
5442 }
5443
5444 WMA_LOGD("%s: vdev_id %d ", __func__, vdev_id);
5445 req->vdev_id = vdev_id;
5446 req->interval = beacon_interval;
5447 qdf_timer_init(NULL, &req->event_timeout,
5448 wma_vdev_reset_beacon_interval_timer, req, QDF_TIMER_TYPE_SW);
5449 qdf_timer_start(&req->event_timeout, timeout);
5450
5451 return 0;
5452}
Paul Zhang99fe8842017-12-08 14:43:46 +08005453
5454QDF_STATUS wma_set_wlm_latency_level(void *wma_ptr,
5455 struct wlm_latency_level_param *latency_params)
5456{
5457 QDF_STATUS ret;
5458 tp_wma_handle wma = (tp_wma_handle)wma_ptr;
5459
5460 WMA_LOGD("%s: set latency level %d, flags flag 0x%x",
5461 __func__, latency_params->wlm_latency_level,
5462 latency_params->wlm_latency_flags);
5463
5464 ret = wmi_unified_wlm_latency_level_cmd(wma->wmi_handle,
5465 latency_params);
5466 if (QDF_IS_STATUS_ERROR(ret))
5467 WMA_LOGW("Failed to set latency level");
5468
5469 return ret;
5470}