blob: df94c6d54d93778dfa91d5222a2711188ff09aab [file] [log] [blame]
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001/*
Paul Zhange79e7db2017-01-04 16:37:05 +08002 * Copyright (c) 2013-2017 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"
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -080076#include <cdp_txrx_handle.h>
Mukul Sharma00058692017-01-28 19:04:32 +053077#include "wlan_pmo_ucfg_api.h"
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070078#include "wlan_reg_services_api.h"
Leo Chang96464902016-10-28 11:10:54 -070079
Krishna Kumaar Natarajan0103ef82017-02-17 18:15:56 -080080#include "wma_he.h"
81
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080082/**
83 * wma_find_vdev_by_addr() - find vdev_id from mac address
84 * @wma: wma handle
85 * @addr: mac address
86 * @vdev_id: return vdev_id
87 *
88 * Return: Returns vdev handle or NULL if mac address don't match
89 */
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -080090struct cdp_vdev *wma_find_vdev_by_addr(tp_wma_handle wma, uint8_t *addr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080091 uint8_t *vdev_id)
92{
93 uint8_t i;
94
95 for (i = 0; i < wma->max_bssid; i++) {
Anurag Chouhanc5548422016-02-24 18:33:27 +053096 if (qdf_is_macaddr_equal(
Anurag Chouhan6d760662016-02-20 16:05:43 +053097 (struct qdf_mac_addr *) wma->interfaces[i].addr,
98 (struct qdf_mac_addr *) addr) == true) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080099 *vdev_id = i;
100 return wma->interfaces[i].handle;
101 }
102 }
103 return NULL;
104}
105
106
107/**
108 * wma_is_vdev_in_ap_mode() - check that vdev is in ap mode or not
109 * @wma: wma handle
110 * @vdev_id: vdev id
111 *
112 * Helper function to know whether given vdev id
113 * is in AP mode or not.
114 *
115 * Return: True/False
116 */
117bool wma_is_vdev_in_ap_mode(tp_wma_handle wma, uint8_t vdev_id)
118{
119 struct wma_txrx_node *intf = wma->interfaces;
120
Naveen Rawatf2bd42d2017-06-29 14:51:43 -0700121 if (vdev_id >= wma->max_bssid) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -0700122 WMA_LOGE("%s: Invalid vdev_id %hu", __func__, vdev_id);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530123 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800124 return false;
125 }
126
127 if ((intf[vdev_id].type == WMI_VDEV_TYPE_AP) &&
128 ((intf[vdev_id].sub_type == WMI_UNIFIED_VDEV_SUBTYPE_P2P_GO) ||
129 (intf[vdev_id].sub_type == 0)))
130 return true;
131
132 return false;
133}
134
135#ifdef QCA_IBSS_SUPPORT
136/**
137 * wma_is_vdev_in_ibss_mode() - check that vdev is in ibss mode or not
138 * @wma: wma handle
139 * @vdev_id: vdev id
140 *
141 * Helper function to know whether given vdev id
142 * is in IBSS mode or not.
143 *
144 * Return: True/False
145 */
146bool wma_is_vdev_in_ibss_mode(tp_wma_handle wma, uint8_t vdev_id)
147{
148 struct wma_txrx_node *intf = wma->interfaces;
149
Naveen Rawatf2bd42d2017-06-29 14:51:43 -0700150 if (vdev_id >= wma->max_bssid) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -0700151 WMA_LOGE("%s: Invalid vdev_id %hu", __func__, vdev_id);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530152 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800153 return false;
154 }
155
156 if (intf[vdev_id].type == WMI_VDEV_TYPE_IBSS)
157 return true;
158
159 return false;
160}
161#endif /* QCA_IBSS_SUPPORT */
162
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800163/**
164 * wma_find_vdev_by_bssid() - Get the corresponding vdev_id from BSSID
165 * @wma - wma handle
166 * @vdev_id - vdev ID
167 *
168 * Return: fill vdev_id with appropriate vdev id and return vdev
169 * handle or NULL if not found.
170 */
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -0800171struct cdp_vdev *wma_find_vdev_by_bssid(tp_wma_handle wma, uint8_t *bssid,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800172 uint8_t *vdev_id)
173{
174 int i;
175
176 for (i = 0; i < wma->max_bssid; i++) {
Anurag Chouhanc5548422016-02-24 18:33:27 +0530177 if (qdf_is_macaddr_equal(
Anurag Chouhan6d760662016-02-20 16:05:43 +0530178 (struct qdf_mac_addr *) wma->interfaces[i].bssid,
179 (struct qdf_mac_addr *) bssid) == true) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800180 *vdev_id = i;
181 return wma->interfaces[i].handle;
182 }
183 }
184
185 return NULL;
186}
187
188/**
189 * wma_get_txrx_vdev_type() - return operating mode of vdev
190 * @type: vdev_type
191 *
192 * Return: return operating mode as enum wlan_op_mode type
193 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -0700194static enum wlan_op_mode wma_get_txrx_vdev_type(uint32_t type)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800195{
196 enum wlan_op_mode vdev_type = wlan_op_mode_unknown;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700197
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800198 switch (type) {
199 case WMI_VDEV_TYPE_AP:
200 vdev_type = wlan_op_mode_ap;
201 break;
202 case WMI_VDEV_TYPE_STA:
203 vdev_type = wlan_op_mode_sta;
204 break;
205#ifdef QCA_IBSS_SUPPORT
206 case WMI_VDEV_TYPE_IBSS:
207 vdev_type = wlan_op_mode_ibss;
208 break;
209#endif /* QCA_IBSS_SUPPORT */
210 case WMI_VDEV_TYPE_OCB:
211 vdev_type = wlan_op_mode_ocb;
212 break;
213 case WMI_VDEV_TYPE_MONITOR:
Manjunathappa Prakash0e6e6b52016-04-21 11:48:48 -0700214 vdev_type = wlan_op_mode_monitor;
215 break;
Deepak Dhamdheree2dd5442016-05-27 15:05:51 -0700216 case WMI_VDEV_TYPE_NDI:
217 vdev_type = wlan_op_mode_ndi;
218 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800219 default:
220 WMA_LOGE("Invalid vdev type %u", type);
221 vdev_type = wlan_op_mode_unknown;
222 }
223
224 return vdev_type;
225}
226
227/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800228 * wma_find_req() - find target request for vdev id
229 * @wma: wma handle
230 * @vdev_id: vdev id
231 * @type: request type
232 *
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800233 * Find target request for given vdev id & type of request.
234 * Remove that request from active list.
235 *
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800236 * Return: return target request if found or NULL.
237 */
238static struct wma_target_req *wma_find_req(tp_wma_handle wma,
239 uint8_t vdev_id, uint8_t type)
240{
241 struct wma_target_req *req_msg = NULL;
242 bool found = false;
Anurag Chouhanffb21542016-02-17 14:33:03 +0530243 qdf_list_node_t *node1 = NULL, *node2 = NULL;
244 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800245
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530246 qdf_spin_lock_bh(&wma->wma_hold_req_q_lock);
Anurag Chouhanffb21542016-02-17 14:33:03 +0530247 if (QDF_STATUS_SUCCESS != qdf_list_peek_front(&wma->wma_hold_req_queue,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800248 &node2)) {
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530249 qdf_spin_unlock_bh(&wma->wma_hold_req_q_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800250 WMA_LOGE(FL("unable to get msg node from request queue"));
251 return NULL;
252 }
253
254 do {
255 node1 = node2;
Anurag Chouhanc5548422016-02-24 18:33:27 +0530256 req_msg = qdf_container_of(node1, struct wma_target_req, node);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800257 if (req_msg->vdev_id != vdev_id)
258 continue;
259 if (req_msg->type != type)
260 continue;
261
262 found = true;
Anurag Chouhanffb21542016-02-17 14:33:03 +0530263 status = qdf_list_remove_node(&wma->wma_hold_req_queue, node1);
264 if (QDF_STATUS_SUCCESS != status) {
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530265 qdf_spin_unlock_bh(&wma->wma_hold_req_q_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800266 WMA_LOGD(FL("Failed to remove request for vdev_id %d type %d"),
267 vdev_id, type);
268 return NULL;
269 }
270 break;
Anurag Chouhanffb21542016-02-17 14:33:03 +0530271 } while (QDF_STATUS_SUCCESS ==
272 qdf_list_peek_next(&wma->wma_hold_req_queue, node1,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800273 &node2));
274
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530275 qdf_spin_unlock_bh(&wma->wma_hold_req_q_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800276 if (!found) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800277 WMA_LOGE(FL("target request not found for vdev_id %d type %d"),
278 vdev_id, type);
279 return NULL;
280 }
281
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800282 WMA_LOGD(FL("target request found for vdev id: %d type %d"),
283 vdev_id, type);
284
285 return req_msg;
286}
287
288/**
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800289 * wma_find_remove_req_msgtype() - find and remove request for vdev id
290 * @wma: wma handle
291 * @vdev_id: vdev id
292 * @msg_type: message request type
293 *
294 * Find target request for given vdev id & sub type of request.
295 * Remove the same from active list.
296 *
297 * Return: Success if request found, failure other wise
298 */
299static struct wma_target_req *wma_find_remove_req_msgtype(tp_wma_handle wma,
300 uint8_t vdev_id, uint32_t msg_type)
301{
302 struct wma_target_req *req_msg = NULL;
303 bool found = false;
Anurag Chouhanffb21542016-02-17 14:33:03 +0530304 qdf_list_node_t *node1 = NULL, *node2 = NULL;
305 QDF_STATUS status;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800306
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530307 qdf_spin_lock_bh(&wma->wma_hold_req_q_lock);
Anurag Chouhanffb21542016-02-17 14:33:03 +0530308 if (QDF_STATUS_SUCCESS != qdf_list_peek_front(&wma->wma_hold_req_queue,
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800309 &node2)) {
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530310 qdf_spin_unlock_bh(&wma->wma_hold_req_q_lock);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800311 WMA_LOGE(FL("unable to get msg node from request queue"));
312 return NULL;
313 }
314
315 do {
316 node1 = node2;
Anurag Chouhanc5548422016-02-24 18:33:27 +0530317 req_msg = qdf_container_of(node1, struct wma_target_req, node);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800318 if (req_msg->vdev_id != vdev_id)
319 continue;
320 if (req_msg->msg_type != msg_type)
321 continue;
322
323 found = true;
Anurag Chouhanffb21542016-02-17 14:33:03 +0530324 status = qdf_list_remove_node(&wma->wma_hold_req_queue, node1);
325 if (QDF_STATUS_SUCCESS != status) {
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530326 qdf_spin_unlock_bh(&wma->wma_hold_req_q_lock);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800327 WMA_LOGD(FL("Failed to remove request. vdev_id %d type %d"),
328 vdev_id, msg_type);
329 return NULL;
330 }
331 break;
Anurag Chouhanffb21542016-02-17 14:33:03 +0530332 } while (QDF_STATUS_SUCCESS ==
333 qdf_list_peek_next(&wma->wma_hold_req_queue, node1,
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800334 &node2));
335
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530336 qdf_spin_unlock_bh(&wma->wma_hold_req_q_lock);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800337 if (!found) {
338 WMA_LOGE(FL("target request not found for vdev_id %d type %d"),
339 vdev_id, msg_type);
340 return NULL;
341 }
342
343 WMA_LOGD(FL("target request found for vdev id: %d type %d"),
344 vdev_id, msg_type);
345
346 return req_msg;
347}
348
349
350/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800351 * wma_find_vdev_req() - find target request for vdev id
352 * @wma: wma handle
353 * @vdev_id: vdev id
354 * @type: request type
355 *
356 * Return: return target request if found or NULL.
357 */
358static struct wma_target_req *wma_find_vdev_req(tp_wma_handle wma,
359 uint8_t vdev_id, uint8_t type)
360{
Krishna Kumaar Natarajana5c53bd2015-10-27 11:48:27 -0700361 struct wma_target_req *req_msg = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800362 bool found = false;
Anurag Chouhanffb21542016-02-17 14:33:03 +0530363 qdf_list_node_t *node1 = NULL, *node2 = NULL;
364 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800365
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530366 qdf_spin_lock_bh(&wma->vdev_respq_lock);
Anurag Chouhanffb21542016-02-17 14:33:03 +0530367 if (QDF_STATUS_SUCCESS != qdf_list_peek_front(&wma->vdev_resp_queue,
Krishna Kumaar Natarajana5c53bd2015-10-27 11:48:27 -0700368 &node2)) {
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530369 qdf_spin_unlock_bh(&wma->vdev_respq_lock);
Srinivas Girigowda2b5d47c2017-03-29 00:28:46 -0700370 WMA_LOGD(FL("unable to get target req from vdev resp queue vdev_id: %d type: %d"),
371 vdev_id, type);
Krishna Kumaar Natarajana5c53bd2015-10-27 11:48:27 -0700372 return NULL;
373 }
374
375 do {
376 node1 = node2;
Anurag Chouhanc5548422016-02-24 18:33:27 +0530377 req_msg = qdf_container_of(node1, struct wma_target_req, node);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800378 if (req_msg->vdev_id != vdev_id)
379 continue;
380 if (req_msg->type != type)
381 continue;
382
383 found = true;
Anurag Chouhanffb21542016-02-17 14:33:03 +0530384 status = qdf_list_remove_node(&wma->vdev_resp_queue, node1);
385 if (QDF_STATUS_SUCCESS != status) {
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530386 qdf_spin_unlock_bh(&wma->vdev_respq_lock);
Krishna Kumaar Natarajana5c53bd2015-10-27 11:48:27 -0700387 WMA_LOGD(FL("Failed to target req for vdev_id %d type %d"),
388 vdev_id, type);
389 return NULL;
390 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800391 break;
Anurag Chouhanffb21542016-02-17 14:33:03 +0530392 } while (QDF_STATUS_SUCCESS ==
393 qdf_list_peek_next(&wma->vdev_resp_queue,
Krishna Kumaar Natarajana5c53bd2015-10-27 11:48:27 -0700394 node1, &node2));
395
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530396 qdf_spin_unlock_bh(&wma->vdev_respq_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800397 if (!found) {
Srinivas Girigowda2b5d47c2017-03-29 00:28:46 -0700398 WMA_LOGD(FL("target request not found for vdev_id %d type %d"),
Krishna Kumaar Natarajana5c53bd2015-10-27 11:48:27 -0700399 vdev_id, type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800400 return NULL;
401 }
Krishna Kumaar Natarajana5c53bd2015-10-27 11:48:27 -0700402 WMA_LOGD(FL("target request found for vdev id: %d type %d msg %d"),
403 vdev_id, type, req_msg->msg_type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800404 return req_msg;
405}
406
407/**
Abhishek Singhc614ec42017-04-25 16:17:34 +0530408 * wma_send_del_sta_self_resp() - send del sta self resp to Upper layer
409 * @param: params of del sta resp
410 *
411 * Return: none
412 */
413static inline void wma_send_del_sta_self_resp(struct del_sta_self_params *param)
414{
415 struct scheduler_msg sme_msg = {0};
416 QDF_STATUS status;
417
418 sme_msg.type = eWNI_SME_DEL_STA_SELF_RSP;
419 sme_msg.bodyptr = param;
420
421 status = scheduler_post_msg(QDF_MODULE_ID_SME, &sme_msg);
422 if (!QDF_IS_STATUS_SUCCESS(status)) {
423 WMA_LOGE("Failed to post eWNI_SME_DEL_STA_SELF_RSP");
424 qdf_mem_free(param);
425 }
426}
427
428/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800429 * wma_vdev_detach_callback() - send vdev detach response to upper layer
430 * @ctx: txrx node ptr
431 *
432 * Return: none
433 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -0700434static void wma_vdev_detach_callback(void *ctx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800435{
436 tp_wma_handle wma;
437 struct wma_txrx_node *iface = (struct wma_txrx_node *)ctx;
438 struct del_sta_self_params *param;
439 struct wma_target_req *req_msg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800440
Anurag Chouhan6d760662016-02-20 16:05:43 +0530441 wma = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800442
443 if (!wma || !iface->del_staself_req) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -0700444 WMA_LOGE("%s: wma %p iface %p", __func__, wma,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800445 iface->del_staself_req);
446 return;
447 }
448 param = (struct del_sta_self_params *) iface->del_staself_req;
Sandeep Puligilla88de6fb2016-09-23 17:08:44 -0700449 iface->del_staself_req = NULL;
Srinivas Girigowdada0e8482017-03-19 23:15:45 -0700450 WMA_LOGD("%s: sending eWNI_SME_DEL_STA_SELF_RSP for vdev %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800451 __func__, param->session_id);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800452 if (!WMI_SERVICE_IS_ENABLED(wma->wmi_service_bitmap,
453 WMI_SERVICE_SYNC_DELETE_CMDS)) {
454 req_msg = wma_find_vdev_req(wma, param->session_id,
455 WMA_TARGET_REQ_TYPE_VDEV_DEL);
456 if (req_msg) {
457 WMA_LOGD("%s: Found vdev request for vdev id %d",
458 __func__, param->session_id);
Anurag Chouhan210db072016-02-22 18:42:15 +0530459 qdf_mc_timer_stop(&req_msg->event_timeout);
460 qdf_mc_timer_destroy(&req_msg->event_timeout);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530461 qdf_mem_free(req_msg);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800462 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800463 }
464 if (iface->addBssStaContext)
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530465 qdf_mem_free(iface->addBssStaContext);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800466
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800467
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800468 if (iface->staKeyParams)
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530469 qdf_mem_free(iface->staKeyParams);
Naveen Rawat3c49d192017-03-02 18:43:16 -0800470
471 if (iface->stats_rsp)
472 qdf_mem_free(iface->stats_rsp);
473
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530474 qdf_mem_zero(iface, sizeof(*iface));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530475 param->status = QDF_STATUS_SUCCESS;
Abhishek Singhc614ec42017-04-25 16:17:34 +0530476 wma_send_del_sta_self_resp(param);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800477}
478
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800479
480/**
481 * wma_self_peer_remove() - Self peer remove handler
482 * @wma: wma handle
483 * @del_sta_self_req_param: vdev id
484 * @generate_vdev_rsp: request type
485 *
486 * Return: success if peer delete command sent to firmware, else failure.
487 */
488
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530489static QDF_STATUS wma_self_peer_remove(tp_wma_handle wma_handle,
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800490 struct del_sta_self_params *del_sta_self_req_param,
491 uint8_t generate_vdev_rsp)
492{
Leo Chang96464902016-10-28 11:10:54 -0700493 void *peer;
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -0800494 struct cdp_pdev *pdev;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800495 uint8_t peer_id;
496 uint8_t vdev_id = del_sta_self_req_param->session_id;
497 struct wma_target_req *msg = NULL;
498 struct del_sta_self_rsp_params *sta_self_wmi_rsp;
Leo Chang96464902016-10-28 11:10:54 -0700499 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800500
Srinivas Girigowdada0e8482017-03-19 23:15:45 -0700501 WMA_LOGD("P2P Device: removing self peer %pM",
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800502 del_sta_self_req_param->self_mac_addr);
503
Anurag Chouhan6d760662016-02-20 16:05:43 +0530504 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800505 if (NULL == pdev) {
506 WMA_LOGE("%s: Failed to get pdev", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530507 return QDF_STATUS_E_FAULT;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800508 }
509
Leo Chang96464902016-10-28 11:10:54 -0700510 peer = cdp_peer_find_by_addr(soc, pdev,
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -0800511 del_sta_self_req_param->self_mac_addr,
512 &peer_id);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800513 if (!peer) {
514 WMA_LOGE("%s Failed to find peer %pM", __func__,
515 del_sta_self_req_param->self_mac_addr);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530516 return QDF_STATUS_SUCCESS;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800517 }
518 wma_remove_peer(wma_handle,
519 del_sta_self_req_param->self_mac_addr,
520 vdev_id, peer, false);
521
522 if (WMI_SERVICE_IS_ENABLED(wma_handle->wmi_service_bitmap,
523 WMI_SERVICE_SYNC_DELETE_CMDS)) {
524 sta_self_wmi_rsp =
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530525 qdf_mem_malloc(sizeof(struct del_sta_self_rsp_params));
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800526 if (sta_self_wmi_rsp == NULL) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -0700527 WMA_LOGE(FL("Failed to allocate memory"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530528 return QDF_STATUS_E_NOMEM;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800529 }
530 sta_self_wmi_rsp->self_sta_param = del_sta_self_req_param;
531 sta_self_wmi_rsp->generate_rsp = generate_vdev_rsp;
532 msg = wma_fill_hold_req(wma_handle, vdev_id,
533 WMA_DELETE_STA_REQ,
534 WMA_DEL_P2P_SELF_STA_RSP_START,
535 sta_self_wmi_rsp,
536 WMA_DELETE_STA_TIMEOUT);
537 if (!msg) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -0700538 WMA_LOGE(FL("Failed to allocate request for vdev_id %d"),
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800539 vdev_id);
540 wma_remove_req(wma_handle, vdev_id,
541 WMA_DEL_P2P_SELF_STA_RSP_START);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530542 return QDF_STATUS_E_FAILURE;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800543 }
544 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530545 return QDF_STATUS_SUCCESS;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800546}
547
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530548static QDF_STATUS wma_handle_vdev_detach(tp_wma_handle wma_handle,
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800549 struct del_sta_self_params *del_sta_self_req_param,
550 uint8_t generate_rsp)
551{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530552 QDF_STATUS status = QDF_STATUS_SUCCESS;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800553 uint8_t vdev_id = del_sta_self_req_param->session_id;
554 struct wma_txrx_node *iface = &wma_handle->interfaces[vdev_id];
555 struct wma_target_req *msg = NULL;
Leo Chang96464902016-10-28 11:10:54 -0700556 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800557
Nishank Aggarwala13b61d2016-12-01 12:53:58 +0530558 if (!soc) {
559 WMA_LOGE("%s:SOC context is NULL", __func__);
560 status = QDF_STATUS_E_FAILURE;
561 goto out;
562 }
563
Govind Singhd76a5b02016-03-08 15:12:14 +0530564 status = wmi_unified_vdev_delete_send(wma_handle->wmi_handle, vdev_id);
565 if (QDF_IS_STATUS_ERROR(status)) {
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800566 WMA_LOGE("Unable to remove an interface");
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800567 goto out;
568 }
569
Srinivas Girigowdada0e8482017-03-19 23:15:45 -0700570 WMA_LOGD("vdev_id:%hu vdev_hdl:%p", vdev_id, iface->handle);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800571 if (!generate_rsp) {
572 WMA_LOGE("Call txrx detach w/o callback for vdev %d", vdev_id);
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -0800573 cdp_vdev_detach(soc,
574 iface->handle, NULL, NULL);
Bhargav Shaha89d3b42016-04-20 13:04:56 +0530575 iface->handle = NULL;
576 wma_handle->interfaces[vdev_id].is_vdev_valid = false;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800577 goto out;
578 }
579
580 iface->del_staself_req = del_sta_self_req_param;
581 msg = wma_fill_vdev_req(wma_handle, vdev_id, WMA_DEL_STA_SELF_REQ,
582 WMA_TARGET_REQ_TYPE_VDEV_DEL, iface, 6000);
583 if (!msg) {
584 WMA_LOGE("%s: Failed to fill vdev request for vdev_id %d",
585 __func__, vdev_id);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530586 status = QDF_STATUS_E_NOMEM;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800587 goto out;
588 }
589
590 /* Acquire wake lock only when you expect a response from firmware */
591 if (WMI_SERVICE_IS_ENABLED(wma_handle->wmi_service_bitmap,
592 WMI_SERVICE_SYNC_DELETE_CMDS)) {
Anurag Chouhan01cfa4e2016-09-04 15:10:49 +0530593 cds_host_diag_log_work(&wma_handle->wmi_cmd_rsp_wake_lock,
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800594 WMA_FW_RSP_EVENT_WAKE_LOCK_DURATION,
595 WIFI_POWER_EVENT_WAKELOCK_WMI_CMD_RSP);
Anurag Chouhan01cfa4e2016-09-04 15:10:49 +0530596 qdf_wake_lock_timeout_acquire(
597 &wma_handle->wmi_cmd_rsp_wake_lock,
598 WMA_FW_RSP_EVENT_WAKE_LOCK_DURATION);
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530599 qdf_runtime_pm_prevent_suspend(
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800600 wma_handle->wmi_cmd_rsp_runtime_lock);
601 }
602 WMA_LOGD("Call txrx detach with callback for vdev %d", vdev_id);
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -0800603 cdp_vdev_detach(soc,
604 iface->handle, NULL, NULL);
Bhargav Shaha89d3b42016-04-20 13:04:56 +0530605 iface->handle = NULL;
606 wma_handle->interfaces[vdev_id].is_vdev_valid = false;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800607
608 /*
609 * send the response immediately if WMI_SERVICE_SYNC_DELETE_CMDS
610 * service is not supported by firmware
611 */
612 if (!WMI_SERVICE_IS_ENABLED(wma_handle->wmi_service_bitmap,
613 WMI_SERVICE_SYNC_DELETE_CMDS))
614 wma_vdev_detach_callback(iface);
615 return status;
616out:
617 if (iface->addBssStaContext)
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530618 qdf_mem_free(iface->addBssStaContext);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800619 if (iface->staKeyParams)
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530620 qdf_mem_free(iface->staKeyParams);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530621 qdf_mem_zero(iface, sizeof(*iface));
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800622 del_sta_self_req_param->status = status;
Abhishek Singhc614ec42017-04-25 16:17:34 +0530623 if (generate_rsp)
624 wma_send_del_sta_self_resp(del_sta_self_req_param);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800625 return status;
626}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800627/**
628 * wma_vdev_detach() - send vdev delete command to fw
629 * @wma_handle: wma handle
630 * @pdel_sta_self_req_param: del sta params
631 * @generateRsp: generate Response flag
632 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +0530633 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800634 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530635QDF_STATUS wma_vdev_detach(tp_wma_handle wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800636 struct del_sta_self_params *pdel_sta_self_req_param,
637 uint8_t generateRsp)
638{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530639 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800640 uint8_t vdev_id = pdel_sta_self_req_param->session_id;
641 struct wma_txrx_node *iface = &wma_handle->interfaces[vdev_id];
Kiran Kumar Lokere35577652017-07-14 02:06:56 -0700642 struct wma_target_req *req_msg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800643
Anurag Chouhan8e0ccd32016-02-19 15:30:20 +0530644 if (qdf_atomic_read(&iface->bss_status) == WMA_BSS_STATUS_STARTED) {
Kiran Kumar Lokere35577652017-07-14 02:06:56 -0700645 req_msg = wma_find_vdev_req(wma_handle, vdev_id,
646 WMA_TARGET_REQ_TYPE_VDEV_STOP);
647 if (!req_msg)
648 goto send_fail_rsp;
649 if (req_msg->msg_type != WMA_DELETE_BSS_REQ)
650 goto send_fail_rsp;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800651 WMA_LOGA("BSS is not yet stopped. Defering vdev(vdev id %x) deletion",
652 vdev_id);
653 iface->del_staself_req = pdel_sta_self_req_param;
654 return status;
655 }
656
657 if (!iface->handle) {
658 WMA_LOGE("handle of vdev_id %d is NULL vdev is already freed",
659 vdev_id);
Abhishek Singh7e95dbc2017-07-06 17:57:50 +0530660 pdel_sta_self_req_param->status = status;
661 if (generateRsp) {
662 wma_send_del_sta_self_resp(pdel_sta_self_req_param);
663 } else {
664 qdf_mem_free(pdel_sta_self_req_param);
665 pdel_sta_self_req_param = NULL;
666 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800667 return status;
668 }
669
Selvaraj, Sridhar171e2252016-06-22 22:33:26 +0530670 iface->vdev_active = false;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800671 /* P2P Device */
672 if ((iface->type == WMI_VDEV_TYPE_AP) &&
673 (iface->sub_type == WMI_UNIFIED_VDEV_SUBTYPE_P2P_DEVICE)) {
674 wma_self_peer_remove(wma_handle, pdel_sta_self_req_param,
675 generateRsp);
676 if (!WMI_SERVICE_IS_ENABLED(wma_handle->wmi_service_bitmap,
677 WMI_SERVICE_SYNC_DELETE_CMDS))
678 status = wma_handle_vdev_detach(wma_handle,
679 pdel_sta_self_req_param, generateRsp);
680 } else { /* other than P2P */
681 status = wma_handle_vdev_detach(wma_handle,
682 pdel_sta_self_req_param, generateRsp);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800683 }
684
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800685 return status;
Kiran Kumar Lokere35577652017-07-14 02:06:56 -0700686
687send_fail_rsp:
688 WMA_LOGE("rcvd del_self_sta without del_bss, send fail rsp, vdev_id %d",
689 vdev_id);
690 pdel_sta_self_req_param->status = QDF_STATUS_E_FAILURE;
691 wma_send_del_sta_self_resp(pdel_sta_self_req_param);
692 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800693}
694
695/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800696 * wma_vdev_start_rsp() - send vdev start response to upper layer
697 * @wma: wma handle
698 * @add_bss: add bss params
699 * @resp_event: response params
700 *
701 * Return: none
702 */
703static void wma_vdev_start_rsp(tp_wma_handle wma,
704 tpAddBssParams add_bss,
705 wmi_vdev_start_response_event_fixed_param *
706 resp_event)
707{
708 struct beacon_info *bcn;
Padma, Santhosh Kumar88104612017-04-10 18:49:12 +0530709 struct cdp_pdev *pdev;
710 void *peer = NULL;
711 uint8_t peer_id;
712 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800713
714#ifdef QCA_IBSS_SUPPORT
715 WMA_LOGD("%s: vdev start response received for %s mode", __func__,
716 add_bss->operMode ==
717 BSS_OPERATIONAL_MODE_IBSS ? "IBSS" : "non-IBSS");
718#endif /* QCA_IBSS_SUPPORT */
719
720 if (resp_event->status) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530721 add_bss->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800722 goto send_fail_resp;
723 }
724
725 if ((add_bss->operMode == BSS_OPERATIONAL_MODE_AP)
726#ifdef QCA_IBSS_SUPPORT
727 || (add_bss->operMode == BSS_OPERATIONAL_MODE_IBSS)
728#endif /* QCA_IBSS_SUPPORT */
729 ) {
730 wma->interfaces[resp_event->vdev_id].beacon =
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530731 qdf_mem_malloc(sizeof(struct beacon_info));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800732
733 bcn = wma->interfaces[resp_event->vdev_id].beacon;
734 if (!bcn) {
735 WMA_LOGE("%s: Failed alloc memory for beacon struct",
736 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530737 add_bss->status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800738 goto send_fail_resp;
739 }
Nirav Shahcbc6d722016-03-01 16:24:53 +0530740 bcn->buf = qdf_nbuf_alloc(NULL, WMA_BCN_BUF_MAX_SIZE, 0,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800741 sizeof(uint32_t), 0);
742 if (!bcn->buf) {
743 WMA_LOGE("%s: No memory allocated for beacon buffer",
744 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530745 qdf_mem_free(bcn);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530746 add_bss->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800747 goto send_fail_resp;
748 }
749 bcn->seq_no = MIN_SW_SEQ;
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530750 qdf_spinlock_create(&bcn->lock);
Anurag Chouhan8e0ccd32016-02-19 15:30:20 +0530751 qdf_atomic_set(&wma->interfaces[resp_event->vdev_id].bss_status,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800752 WMA_BSS_STATUS_STARTED);
753 WMA_LOGD("%s: AP mode (type %d subtype %d) BSS is started",
754 __func__, wma->interfaces[resp_event->vdev_id].type,
755 wma->interfaces[resp_event->vdev_id].sub_type);
756
757 WMA_LOGD("%s: Allocated beacon struct %p, template memory %p",
758 __func__, bcn, bcn->buf);
759 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530760 add_bss->status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800761 add_bss->bssIdx = resp_event->vdev_id;
762 add_bss->chainMask = resp_event->chain_mask;
763 if ((2 != resp_event->cfgd_rx_streams) ||
764 (2 != resp_event->cfgd_tx_streams)) {
765 add_bss->nss = 1;
766 }
767 add_bss->smpsMode = host_map_smps_mode(resp_event->smps_mode);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800768send_fail_resp:
Padma, Santhosh Kumar88104612017-04-10 18:49:12 +0530769 if (add_bss->status != QDF_STATUS_SUCCESS) {
770 WMA_LOGE("%s: ADD BSS failure %d", __func__, add_bss->status);
771
772 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
773 if (NULL == pdev)
774 WMA_LOGE("%s: Failed to get pdev", __func__);
775
776 if (pdev)
777 peer = cdp_peer_find_by_addr(soc, pdev,
778 add_bss->bssId, &peer_id);
779 if (!peer)
780 WMA_LOGE("%s Failed to find peer %pM", __func__,
781 add_bss->bssId);
782
783 if (peer)
784 wma_remove_peer(wma, add_bss->bssId,
785 resp_event->vdev_id, peer, false);
786 }
787
Abhishek Singh34c15642017-05-08 16:13:02 +0530788 /* Send vdev stop if vdev start was success */
789 if ((add_bss->status != QDF_STATUS_SUCCESS) &&
790 !resp_event->status)
791 if (wma_send_vdev_stop_to_fw(wma, resp_event->vdev_id))
792 WMA_LOGE("%s: %d Failed to send vdev stop", __func__, __LINE__);
793
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800794 WMA_LOGD("%s: Sending add bss rsp to umac(vdev %d status %d)",
795 __func__, resp_event->vdev_id, add_bss->status);
796 wma_send_msg(wma, WMA_ADD_BSS_RSP, (void *)add_bss, 0);
797}
798
799#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
800/**
801 * wma_find_mcc_ap() - finds if device is operating AP in MCC mode or not
802 * @wma: wma handle.
803 * @vdev_id: vdev ID of device for which MCC has to be checked
804 * @add: flag indicating if current device is added or deleted
805 *
806 * This function parses through all the interfaces in wma and finds if
807 * any of those devces are in MCC mode with AP. If such a vdev is found
808 * involved AP vdevs are sent WDA_UPDATE_Q2Q_IE_IND msg to update their
809 * beacon template to include Q2Q IE.
810 *
811 * Return: none
812 */
Tang Yingying523322d2017-01-17 23:28:43 +0800813static void wma_find_mcc_ap(tp_wma_handle wma, uint8_t vdev_id, bool add)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800814{
815 uint8_t i;
816 uint16_t prev_ch_freq = 0;
817 bool is_ap = false;
818 bool result = false;
819 uint8_t *ap_vdev_ids = NULL;
820 uint8_t num_ch = 0;
821
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530822 ap_vdev_ids = qdf_mem_malloc(wma->max_bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800823 if (!ap_vdev_ids)
824 return;
825
826 for (i = 0; i < wma->max_bssid; i++) {
827 ap_vdev_ids[i] = -1;
828 if (add == false && i == vdev_id)
829 continue;
830
Mukul Sharmaf9047232017-03-02 16:58:56 +0530831 if (wma_is_vdev_up(vdev_id) || (i == vdev_id && add)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800832 if (wma->interfaces[i].type == WMI_VDEV_TYPE_AP) {
833 is_ap = true;
834 ap_vdev_ids[i] = i;
835 }
836
837 if (wma->interfaces[i].mhz != prev_ch_freq) {
838 num_ch++;
839 prev_ch_freq = wma->interfaces[i].mhz;
840 }
841 }
842 }
843
844 if (is_ap && (num_ch > 1))
845 result = true;
846 else
847 result = false;
848
849 wma_send_msg(wma, WMA_UPDATE_Q2Q_IE_IND, (void *)ap_vdev_ids, result);
850}
851#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
852
Deepak Dhamdhered8455ce2016-11-02 13:11:55 -0700853static const wmi_channel_width mode_to_width[MODE_MAX] = {
854 [MODE_11A] = WMI_CHAN_WIDTH_20,
855 [MODE_11G] = WMI_CHAN_WIDTH_20,
856 [MODE_11B] = WMI_CHAN_WIDTH_20,
857 [MODE_11GONLY] = WMI_CHAN_WIDTH_20,
858 [MODE_11NA_HT20] = WMI_CHAN_WIDTH_20,
859 [MODE_11NG_HT20] = WMI_CHAN_WIDTH_20,
860 [MODE_11AC_VHT20] = WMI_CHAN_WIDTH_20,
861 [MODE_11AC_VHT20_2G] = WMI_CHAN_WIDTH_20,
862 [MODE_11NA_HT40] = WMI_CHAN_WIDTH_40,
863 [MODE_11NG_HT40] = WMI_CHAN_WIDTH_40,
864 [MODE_11AC_VHT40] = WMI_CHAN_WIDTH_40,
865 [MODE_11AC_VHT40_2G] = WMI_CHAN_WIDTH_40,
866 [MODE_11AC_VHT80] = WMI_CHAN_WIDTH_80,
867 [MODE_11AC_VHT80_2G] = WMI_CHAN_WIDTH_80,
868#if CONFIG_160MHZ_SUPPORT
869 [MODE_11AC_VHT80_80] = WMI_CHAN_WIDTH_80P80,
870 [MODE_11AC_VHT160] = WMI_CHAN_WIDTH_160,
871#endif
872
873#if SUPPORT_11AX
874 [MODE_11AX_HE20] = WMI_CHAN_WIDTH_20,
875 [MODE_11AX_HE40] = WMI_CHAN_WIDTH_40,
876 [MODE_11AX_HE80] = WMI_CHAN_WIDTH_80,
877 [MODE_11AX_HE80_80] = WMI_CHAN_WIDTH_80P80,
878 [MODE_11AX_HE160] = WMI_CHAN_WIDTH_160,
879 [MODE_11AX_HE20_2G] = WMI_CHAN_WIDTH_20,
880 [MODE_11AX_HE40_2G] = WMI_CHAN_WIDTH_40,
881 [MODE_11AX_HE80_2G] = WMI_CHAN_WIDTH_80,
882#endif
883};
884
885/**
886 * chanmode_to_chanwidth() - get channel width through channel mode
887 * @chanmode: channel phy mode
888 *
889 * Return: channel width
890 */
891static wmi_channel_width chanmode_to_chanwidth(WLAN_PHY_MODE chanmode)
892{
893 wmi_channel_width chan_width;
894
895 if (chanmode >= MODE_11A && chanmode < MODE_MAX)
896 chan_width = mode_to_width[chanmode];
897 else
898 chan_width = WMI_CHAN_WIDTH_20;
899
900 return chan_width;
901}
902
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800903/**
904 * wma_vdev_start_resp_handler() - vdev start response handler
905 * @handle: wma handle
906 * @cmd_param_info: event buffer
907 * @len: buffer length
908 *
909 * Return: 0 for success or error code
910 */
911int wma_vdev_start_resp_handler(void *handle, uint8_t *cmd_param_info,
912 uint32_t len)
913{
914 tp_wma_handle wma = (tp_wma_handle) handle;
915 WMI_VDEV_START_RESP_EVENTID_param_tlvs *param_buf;
916 wmi_vdev_start_response_event_fixed_param *resp_event;
917 struct wma_target_req *req_msg;
918 struct wma_txrx_node *iface;
Govind Singhd76a5b02016-03-08 15:12:14 +0530919 struct vdev_up_params param = {0};
920 QDF_STATUS status;
Deepak Dhamdhered8455ce2016-11-02 13:11:55 -0700921 int err;
922 wmi_channel_width chanwidth;
Govind Singhd76a5b02016-03-08 15:12:14 +0530923
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800924#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
Anurag Chouhan6d760662016-02-20 16:05:43 +0530925 tpAniSirGlobal mac_ctx = cds_get_context(QDF_MODULE_ID_PE);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700926
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800927 if (NULL == mac_ctx) {
Dustin Brown3e619822017-03-17 10:41:56 -0700928 wma_release_wmi_resp_wakelock(wma);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800929 WMA_LOGE("%s: Failed to get mac_ctx", __func__);
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -0700930 policy_mgr_set_do_hw_mode_change_flag(
931 wma->psoc, false);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800932 return -EINVAL;
933 }
934#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
935
936 WMA_LOGD("%s: Enter", __func__);
Dustin Brown3e619822017-03-17 10:41:56 -0700937
938 wma_release_wmi_resp_wakelock(wma);
939
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800940 param_buf = (WMI_VDEV_START_RESP_EVENTID_param_tlvs *) cmd_param_info;
941 if (!param_buf) {
942 WMA_LOGE("Invalid start response event buffer");
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -0700943 policy_mgr_set_do_hw_mode_change_flag(
944 wma->psoc, false);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800945 return -EINVAL;
946 }
947
948 resp_event = param_buf->fixed_param;
949 if (!resp_event) {
950 WMA_LOGE("Invalid start response event buffer");
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -0700951 policy_mgr_set_do_hw_mode_change_flag(
952 wma->psoc, false);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800953 return -EINVAL;
954 }
955
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530956 if (resp_event->status == QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800957 wma->interfaces[resp_event->vdev_id].tx_streams =
958 resp_event->cfgd_tx_streams;
959 wma->interfaces[resp_event->vdev_id].rx_streams =
960 resp_event->cfgd_rx_streams;
961 wma->interfaces[resp_event->vdev_id].chain_mask =
962 resp_event->chain_mask;
Govind Singhefc5ccd2016-04-25 11:11:55 +0530963 if (wma->wlan_resource_config.use_pdev_id) {
964 if (resp_event->pdev_id == WMI_PDEV_ID_SOC) {
965 WMA_LOGE("%s: soc level id received for mac id",
966 __func__);
967 QDF_BUG(0);
968 return -EINVAL;
969 }
970 wma->interfaces[resp_event->vdev_id].mac_id =
971 WMA_PDEV_TO_MAC_MAP(resp_event->pdev_id);
972 } else {
973 wma->interfaces[resp_event->vdev_id].mac_id =
974 resp_event->mac_id;
975 }
976
Srinivas Girigowdada0e8482017-03-19 23:15:45 -0700977 WMA_LOGD("%s: vdev:%d tx ss=%d rx ss=%d chain mask=%d mac=%d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800978 __func__,
979 resp_event->vdev_id,
980 wma->interfaces[resp_event->vdev_id].tx_streams,
981 wma->interfaces[resp_event->vdev_id].rx_streams,
982 wma->interfaces[resp_event->vdev_id].chain_mask,
983 wma->interfaces[resp_event->vdev_id].mac_id);
984 }
985
Selvaraj, Sridhara0083c42016-06-22 22:15:43 +0530986 iface = &wma->interfaces[resp_event->vdev_id];
987
Kiran Kumar Lokere5798bfa2017-04-27 20:49:39 -0700988 req_msg = wma_find_vdev_req(wma, resp_event->vdev_id,
989 WMA_TARGET_REQ_TYPE_VDEV_START);
990
991 if (!req_msg) {
992 WMA_LOGE("%s: Failed to lookup request message for vdev %d",
993 __func__, resp_event->vdev_id);
994 policy_mgr_set_do_hw_mode_change_flag(wma->psoc, false);
995 return -EINVAL;
996 }
997
Naveen Rawatf2bd42d2017-06-29 14:51:43 -0700998 if ((resp_event->vdev_id < wma->max_bssid) &&
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700999 (qdf_atomic_read(
1000 &wma->interfaces[resp_event->vdev_id].vdev_restart_params.hidden_ssid_restart_in_progress))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001001 && (wma_is_vdev_in_ap_mode(wma, resp_event->vdev_id) == true)) {
Kiran Kumar Lokere5798bfa2017-04-27 20:49:39 -07001002 tpHalHiddenSsidVdevRestart hidden_ssid_restart =
1003 (tpHalHiddenSsidVdevRestart)req_msg->user_data;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001004 WMA_LOGE("%s: vdev restart event recevied for hidden ssid set using IOCTL",
1005 __func__);
1006
Govind Singhd76a5b02016-03-08 15:12:14 +05301007 param.vdev_id = resp_event->vdev_id;
1008 param.assoc_id = 0;
Anurag Chouhan8e0ccd32016-02-19 15:30:20 +05301009 qdf_atomic_set(&wma->interfaces[resp_event->vdev_id].
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001010 vdev_restart_params.
1011 hidden_ssid_restart_in_progress, 0);
Kiran Kumar Lokere5798bfa2017-04-27 20:49:39 -07001012
1013 wma_send_msg(wma, WMA_HIDDEN_SSID_RESTART_RSP,
1014 (void *)hidden_ssid_restart, 0);
Selvaraj, Sridhara0083c42016-06-22 22:15:43 +05301015 /*
1016 * Unpause TX queue in SAP case while configuring hidden ssid
1017 * enable or disable, else the data path is paused forever
1018 * causing data packets(starting from DHCP offer) to get stuck
1019 */
Leo Chang96464902016-10-28 11:10:54 -07001020 cdp_fc_vdev_unpause(cds_get_context(QDF_MODULE_ID_SOC),
1021 iface->handle,
Selvaraj, Sridhara0083c42016-06-22 22:15:43 +05301022 OL_TXQ_PAUSE_REASON_VDEV_STOP);
Mukul Sharma6411bb82017-03-01 15:57:07 +05301023 wma_vdev_clear_pause_bit(resp_event->vdev_id, PAUSE_TYPE_HOST);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001024 }
1025
Anurag Chouhan210db072016-02-22 18:42:15 +05301026 qdf_mc_timer_stop(&req_msg->event_timeout);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001027
1028#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301029 if (resp_event->status == QDF_STATUS_SUCCESS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001030 && mac_ctx->sap.sap_channel_avoidance)
1031 wma_find_mcc_ap(wma, resp_event->vdev_id, true);
1032#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
1033
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001034 if (req_msg->msg_type == WMA_CHNL_SWITCH_REQ) {
1035 tpSwitchChannelParams params =
1036 (tpSwitchChannelParams) req_msg->user_data;
1037 if (!params) {
1038 WMA_LOGE("%s: channel switch params is NULL for vdev %d",
1039 __func__, resp_event->vdev_id);
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07001040 policy_mgr_set_do_hw_mode_change_flag(
1041 wma->psoc, false);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001042 return -EINVAL;
1043 }
1044
1045 WMA_LOGD("%s: Send channel switch resp vdev %d status %d",
1046 __func__, resp_event->vdev_id, resp_event->status);
1047 params->chainMask = resp_event->chain_mask;
1048 if ((2 != resp_event->cfgd_rx_streams) ||
1049 (2 != resp_event->cfgd_tx_streams)) {
1050 params->nss = 1;
1051 }
1052 params->smpsMode = host_map_smps_mode(resp_event->smps_mode);
1053 params->status = resp_event->status;
Agrawal Ashish7dd7c592016-02-22 14:25:11 +05301054 if (wma->interfaces[resp_event->vdev_id].is_channel_switch) {
1055 wma->interfaces[resp_event->vdev_id].is_channel_switch =
1056 false;
1057 }
Manjunathappa Prakash0e6e6b52016-04-21 11:48:48 -07001058 if (((resp_event->resp_type == WMI_VDEV_RESTART_RESP_EVENT) &&
Agrawal Ashish7dd7c592016-02-22 14:25:11 +05301059 (iface->type == WMI_VDEV_TYPE_STA)) ||
1060 ((resp_event->resp_type == WMI_VDEV_START_RESP_EVENT) &&
1061 (iface->type == WMI_VDEV_TYPE_MONITOR))) {
Deepak Dhamdhered8455ce2016-11-02 13:11:55 -07001062 err = wma_set_peer_param(wma, iface->bssid,
1063 WMI_PEER_PHYMODE, iface->chanmode,
1064 resp_event->vdev_id);
1065
1066 WMA_LOGD("%s:vdev_id %d chanmode %d status %d",
1067 __func__, resp_event->vdev_id,
1068 iface->chanmode, err);
1069
1070 chanwidth = chanmode_to_chanwidth(iface->chanmode);
1071 err = wma_set_peer_param(wma, iface->bssid,
1072 WMI_PEER_CHWIDTH, chanwidth,
1073 resp_event->vdev_id);
1074
1075 WMA_LOGD("%s:vdev_id %d chanwidth %d status %d",
1076 __func__, resp_event->vdev_id,
1077 chanwidth, err);
1078
Govind Singhd76a5b02016-03-08 15:12:14 +05301079 param.vdev_id = resp_event->vdev_id;
1080 param.assoc_id = iface->aid;
1081 status = wmi_unified_vdev_up_send(wma->wmi_handle,
1082 iface->bssid,
1083 &param);
1084 if (QDF_IS_STATUS_ERROR(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001085 WMA_LOGE("%s:vdev_up failed vdev_id %d",
1086 __func__, resp_event->vdev_id);
Mukul Sharmaf9047232017-03-02 16:58:56 +05301087 wma_vdev_set_mlme_state(wma,
1088 resp_event->vdev_id, WLAN_VDEV_S_STOP);
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07001089 policy_mgr_set_do_hw_mode_change_flag(
1090 wma->psoc, false);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001091 } else {
Mukul Sharmaf9047232017-03-02 16:58:56 +05301092 wma_vdev_set_mlme_state(wma,
1093 resp_event->vdev_id, WLAN_VDEV_S_RUN);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001094 }
1095 }
1096
1097 wma_send_msg(wma, WMA_SWITCH_CHANNEL_RSP, (void *)params, 0);
1098 } else if (req_msg->msg_type == WMA_ADD_BSS_REQ) {
1099 tpAddBssParams bssParams = (tpAddBssParams) req_msg->user_data;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001100
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301101 qdf_mem_copy(iface->bssid, bssParams->bssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001102 IEEE80211_ADDR_LEN);
1103 wma_vdev_start_rsp(wma, bssParams, resp_event);
1104 } else if (req_msg->msg_type == WMA_OCB_SET_CONFIG_CMD) {
Govind Singhd76a5b02016-03-08 15:12:14 +05301105 param.vdev_id = resp_event->vdev_id;
1106 param.assoc_id = iface->aid;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001107 if (wmi_unified_vdev_up_send(wma->wmi_handle,
Govind Singhd76a5b02016-03-08 15:12:14 +05301108 iface->bssid,
1109 &param) != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001110 WMA_LOGE(FL("failed to send vdev up"));
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07001111 policy_mgr_set_do_hw_mode_change_flag(
1112 wma->psoc, false);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001113 return -EEXIST;
1114 }
Mukul Sharmaf9047232017-03-02 16:58:56 +05301115 wma_vdev_set_mlme_state(wma, resp_event->vdev_id,
1116 WLAN_VDEV_S_RUN);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001117 wma_ocb_start_resp_ind_cont(wma);
1118 }
1119
1120 if ((wma->interfaces[resp_event->vdev_id].type == WMI_VDEV_TYPE_AP) &&
Mukul Sharmaf9047232017-03-02 16:58:56 +05301121 wma_is_vdev_up(resp_event->vdev_id))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001122 wma_set_sap_keepalive(wma, resp_event->vdev_id);
1123
Anurag Chouhan210db072016-02-22 18:42:15 +05301124 qdf_mc_timer_destroy(&req_msg->event_timeout);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301125 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001126
1127 return 0;
1128}
1129
Rajeev Kumard9a43cf2017-07-19 14:55:42 -07001130static bool wma_is_vdev_valid(uint32_t vdev_id)
1131{
1132 tp_wma_handle wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
1133
1134 if (NULL == wma_handle)
1135 return false;
1136
1137 return wma_handle->interfaces[vdev_id].vdev_active;
1138}
1139
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001140/**
Govind Singhd76a5b02016-03-08 15:12:14 +05301141 * wma_vdev_set_param() - set per vdev params in fw
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001142 * @wmi_handle: wmi handle
1143 * @if_if: vdev id
1144 * @param_id: parameter id
1145 * @param_value: parameter value
1146 *
Govind Singhd76a5b02016-03-08 15:12:14 +05301147 * Return: QDF_STATUS_SUCCESS for success or error code
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001148 */
Govind Singhd76a5b02016-03-08 15:12:14 +05301149QDF_STATUS
1150wma_vdev_set_param(wmi_unified_t wmi_handle, uint32_t if_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001151 uint32_t param_id, uint32_t param_value)
1152{
Govind Singhd76a5b02016-03-08 15:12:14 +05301153 struct vdev_set_params param = {0};
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001154
Rajeev Kumard9a43cf2017-07-19 14:55:42 -07001155 if (!wma_is_vdev_valid(if_id)) {
1156 WMA_LOGE(FL("vdev_id: %d is not active reject the req: param id %d val %d"),
1157 if_id, param_id, param_value);
1158 QDF_ASSERT(0);
1159 return QDF_STATUS_E_INVAL;
1160 }
1161
Govind Singhd76a5b02016-03-08 15:12:14 +05301162 param.if_id = if_id;
1163 param.param_id = param_id;
1164 param.param_value = param_value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001165
Govind Singhd76a5b02016-03-08 15:12:14 +05301166 return wmi_unified_vdev_set_param_send(wmi_handle, &param);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001167}
1168
1169/**
1170 * wma_set_peer_authorized_cb() - set peer authorized callback function
1171 * @wma_Ctx: wma handle
1172 * @auth_cb: peer authorized callback
1173 *
1174 * Return: none
1175 */
1176void wma_set_peer_authorized_cb(void *wma_ctx, wma_peer_authorized_fp auth_cb)
1177{
1178 tp_wma_handle wma_handle = (tp_wma_handle) wma_ctx;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001179
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001180 wma_handle->peer_authorized_cb = auth_cb;
1181}
1182
1183/**
1184 * wma_set_peer_param() - set peer parameter in fw
1185 * @wma_ctx: wma handle
1186 * @peer_addr: peer mac address
1187 * @param_id: parameter id
1188 * @param_value: parameter value
1189 * @vdev_id: vdev id
1190 *
Govind Singhd76a5b02016-03-08 15:12:14 +05301191 * Return: QDF_STATUS_SUCCESS for success or error code
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001192 */
Govind Singhd76a5b02016-03-08 15:12:14 +05301193QDF_STATUS wma_set_peer_param(void *wma_ctx, uint8_t *peer_addr,
1194 uint32_t param_id, uint32_t param_value,
1195 uint32_t vdev_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001196{
1197 tp_wma_handle wma_handle = (tp_wma_handle) wma_ctx;
Govind Singhd76a5b02016-03-08 15:12:14 +05301198 struct peer_set_params param = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001199 int err;
1200
Govind Singhd76a5b02016-03-08 15:12:14 +05301201 param.vdev_id = vdev_id;
1202 param.param_value = param_value;
1203 param.param_id = param_id;
1204
1205 err = wmi_set_peer_param_send(wma_handle->wmi_handle, peer_addr,
1206 &param);
1207
1208 return err;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001209}
1210
1211/**
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07001212 * wma_remove_peer() - remove peer information from host driver and fw
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001213 * @wma: wma handle
1214 * @bssid: mac address
1215 * @vdev_id: vdev id
1216 * @peer: peer ptr
1217 * @roam_synch_in_progress: roam in progress flag
1218 *
1219 * Return: none
1220 */
1221void wma_remove_peer(tp_wma_handle wma, uint8_t *bssid,
Leo Chang96464902016-10-28 11:10:54 -07001222 uint8_t vdev_id, void *peer,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001223 bool roam_synch_in_progress)
1224{
1225#define PEER_ALL_TID_BITMASK 0xffffffff
1226 uint32_t peer_tid_bitmap = PEER_ALL_TID_BITMASK;
1227 uint8_t *peer_addr = bssid;
Govind Singhd76a5b02016-03-08 15:12:14 +05301228 struct peer_flush_params param = {0};
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07001229 uint8_t *peer_mac_addr;
Leo Chang96464902016-10-28 11:10:54 -07001230 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Govind Singhd76a5b02016-03-08 15:12:14 +05301231
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001232 if (!wma->interfaces[vdev_id].peer_count) {
1233 WMA_LOGE("%s: Can't remove peer with peer_addr %pM vdevid %d peer_count %d",
1234 __func__, bssid, vdev_id,
1235 wma->interfaces[vdev_id].peer_count);
1236 return;
1237 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001238
Nishank Aggarwala13b61d2016-12-01 12:53:58 +05301239 if (!soc) {
1240 WMA_LOGE("%s:SOC context is NULL", __func__);
1241 return;
1242 }
1243
Leo Chang96464902016-10-28 11:10:54 -07001244 peer_mac_addr = cdp_peer_get_peer_mac_addr(soc, peer);
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07001245 if (peer_mac_addr == NULL) {
1246 WMA_LOGE("%s: peer mac addr is NULL, Can't remove peer with peer_addr %pM vdevid %d peer_count %d",
1247 __func__, bssid, vdev_id,
1248 wma->interfaces[vdev_id].peer_count);
1249 return;
1250 }
1251
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001252 if (roam_synch_in_progress)
jge6435f4f2017-01-09 11:35:45 +08001253 goto peer_detach;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001254 /* Flush all TIDs except MGMT TID for this peer in Target */
1255 peer_tid_bitmap &= ~(0x1 << WMI_MGMT_TID);
Govind Singhd76a5b02016-03-08 15:12:14 +05301256 param.peer_tid_bitmap = peer_tid_bitmap;
1257 param.vdev_id = vdev_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001258 wmi_unified_peer_flush_tids_send(wma->wmi_handle, bssid,
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07001259 &param);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001260
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07001261 if (wma_is_vdev_in_ibss_mode(wma, vdev_id)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001262 WMA_LOGD("%s: bssid %pM peer->mac_addr %pM", __func__,
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07001263 bssid, peer_mac_addr);
1264 peer_addr = peer_mac_addr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001265 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001266
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07001267 wmi_unified_peer_delete_send(wma->wmi_handle, peer_addr,
1268 vdev_id);
jge6435f4f2017-01-09 11:35:45 +08001269
1270peer_detach:
Deepak Dhamdhere137b54e2017-01-24 01:05:43 -08001271 WMA_LOGE("%s: Remove peer %p with peer_addr %pM vdevid %d peer_count %d",
1272 __func__, peer, bssid, vdev_id,
1273 wma->interfaces[vdev_id].peer_count);
1274
jge6435f4f2017-01-09 11:35:45 +08001275 if (peer) {
1276 if (roam_synch_in_progress)
1277 cdp_peer_detach_force_delete(soc, peer);
1278 else
1279 cdp_peer_delete(soc, peer);
1280 }
1281
1282 wma->interfaces[vdev_id].peer_count--;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001283#undef PEER_ALL_TID_BITMASK
1284}
1285
1286/**
Abhishek Singh32517ed2017-05-29 14:25:14 +05301287 * wma_find_duplicate_peer_on_other_vdev() - Find if same peer exist
1288 * on other vdevs
1289 * @wma: wma handle
1290 * @pdev: txrx pdev ptr
1291 * @vdev_id: vdev id of vdev on which the peer
1292 * needs to be added
1293 * @peer_mac: peer mac addr which needs to be added
1294 *
1295 * Check if peer with same MAC is present on vdev other then
1296 * the provided vdev_id
1297 *
1298 * Return: true if same peer is present on vdev other then vdev_id
1299 * else return false
1300 */
1301static bool wma_find_duplicate_peer_on_other_vdev(tp_wma_handle wma,
1302 struct cdp_pdev *pdev, uint8_t vdev_id, uint8_t *peer_mac)
1303{
1304 int i;
1305 uint8_t peer_id;
1306 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
1307
1308 for (i = 0; i < wma->max_bssid; i++) {
1309 /* Need to check vdevs other than the vdev_id */
1310 if (vdev_id == i ||
1311 !wma->interfaces[i].handle)
1312 continue;
1313 if (cdp_peer_find_by_addr_and_vdev(soc, pdev,
1314 wma->interfaces[i].handle, peer_mac, &peer_id)) {
1315 WMA_LOGE("%s :Duplicate peer %pM (peer id %d) already exist on vdev %d",
1316 __func__, peer_mac, peer_id, i);
1317 return true;
1318 }
1319 }
1320 return false;
1321}
1322
1323/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001324 * wma_create_peer() - send peer create command to fw
1325 * @wma: wma handle
1326 * @pdev: txrx pdev ptr
1327 * @vdev: txrx vdev ptr
1328 * @peer_addr: peer mac addr
1329 * @peer_type: peer type
1330 * @vdev_id: vdev id
1331 * @roam_synch_in_progress: roam in progress
1332 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301333 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001334 */
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08001335QDF_STATUS wma_create_peer(tp_wma_handle wma, struct cdp_pdev *pdev,
1336 struct cdp_vdev *vdev,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001337 u8 peer_addr[IEEE80211_ADDR_LEN],
1338 uint32_t peer_type, uint8_t vdev_id,
1339 bool roam_synch_in_progress)
1340{
Leo Chang96464902016-10-28 11:10:54 -07001341 void *peer = NULL;
Govind Singhd76a5b02016-03-08 15:12:14 +05301342 struct peer_create_params param = {0};
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07001343 uint8_t *mac_addr_raw;
Leo Chang96464902016-10-28 11:10:54 -07001344 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001345
Abhishek Singh32517ed2017-05-29 14:25:14 +05301346
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001347 if (++wma->interfaces[vdev_id].peer_count >
1348 wma->wlan_resource_config.num_peers) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07001349 WMA_LOGE("%s, the peer count exceeds the limit %d", __func__,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001350 wma->interfaces[vdev_id].peer_count - 1);
1351 goto err;
1352 }
Deepak Dhamdherec47cfe82016-08-22 01:00:13 -07001353
Nishank Aggarwala13b61d2016-12-01 12:53:58 +05301354 if (!soc) {
1355 WMA_LOGE("%s:SOC context is NULL", __func__);
1356 goto err;
1357 }
1358
Abhishek Singh32517ed2017-05-29 14:25:14 +05301359 /*
1360 * Check if peer with same MAC exist on other Vdev, If so avoid
1361 * adding this peer, as it will cause FW to crash.
1362 */
1363 if (wma_find_duplicate_peer_on_other_vdev(wma, pdev,
1364 vdev_id, peer_addr))
1365 goto err;
1366
Dhanashri Atre272fd232016-11-10 16:20:46 -08001367 /* The peer object should be created before sending the WMI peer
1368 * create command to firmware. This is to prevent a race condition
1369 * where the HTT peer map event is received before the peer object
1370 * is created in the data path
1371 */
1372 peer = cdp_peer_create(soc, vdev, peer_addr);
1373 if (!peer) {
1374 WMA_LOGE("%s : Unable to attach peer %pM", __func__, peer_addr);
1375 goto err;
1376 }
1377
Deepak Dhamdheref74d6f82016-09-16 02:47:01 -07001378 if (roam_synch_in_progress) {
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001379 WMA_LOGI("%s: LFR3: Created peer %p with peer_addr %pM vdev_id %d, peer_count - %d",
Mohit Khanna3aee1312016-07-28 19:07:05 -07001380 __func__, peer, peer_addr, vdev_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001381 wma->interfaces[vdev_id].peer_count);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301382 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001383 }
Govind Singhd76a5b02016-03-08 15:12:14 +05301384 param.peer_addr = peer_addr;
1385 param.peer_type = peer_type;
1386 param.vdev_id = vdev_id;
1387 if (wmi_unified_peer_create_send(wma->wmi_handle,
1388 &param) != QDF_STATUS_SUCCESS) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07001389 WMA_LOGE("%s : Unable to create peer in Target", __func__);
Dhanashri Atre272fd232016-11-10 16:20:46 -08001390 cdp_peer_delete(soc, peer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001391 goto err;
1392 }
Dhanashri Atre272fd232016-11-10 16:20:46 -08001393
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07001394 WMA_LOGD("%s: Created peer %p with peer_addr %pM vdev_id %d, peer_count - %d",
Leo Chang96464902016-10-28 11:10:54 -07001395 __func__, peer, peer_addr, vdev_id,
Mohit Khanna3aee1312016-07-28 19:07:05 -07001396 wma->interfaces[vdev_id].peer_count);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001397
Dhanashri Atre272fd232016-11-10 16:20:46 -08001398 cdp_peer_setup(soc, vdev, peer);
1399
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07001400 WMA_LOGD("%s: Initialized peer with peer_addr %pM vdev_id %d",
Dhanashri Atre272fd232016-11-10 16:20:46 -08001401 __func__, peer_addr, vdev_id);
1402
Leo Chang96464902016-10-28 11:10:54 -07001403 mac_addr_raw = cdp_get_vdev_mac_addr(soc, vdev);
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07001404 if (mac_addr_raw == NULL) {
1405 WMA_LOGE("%s: peer mac addr is NULL", __func__);
1406 return QDF_STATUS_E_FAULT;
1407 }
1408
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001409 /* for each remote ibss peer, clear its keys */
1410 if (wma_is_vdev_in_ibss_mode(wma, vdev_id) &&
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07001411 qdf_mem_cmp(peer_addr, mac_addr_raw, IEEE80211_ADDR_LEN)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001412 tSetStaKeyParams key_info;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001413
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001414 WMA_LOGD("%s: remote ibss peer %pM key clearing\n", __func__,
1415 peer_addr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301416 qdf_mem_set(&key_info, sizeof(key_info), 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001417 key_info.smesessionId = vdev_id;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301418 qdf_mem_copy(key_info.peer_macaddr.bytes, peer_addr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001419 IEEE80211_ADDR_LEN);
1420 key_info.sendRsp = false;
1421
1422 wma_set_stakey(wma, &key_info);
1423 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001424
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301425 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001426err:
1427 wma->interfaces[vdev_id].peer_count--;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301428 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001429}
1430
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001431/**
1432 * wma_hidden_ssid_vdev_restart_on_vdev_stop() - restart vdev to set hidden ssid
1433 * @wma_handle: wma handle
1434 * @sessionId: session id
1435 *
1436 * Return: none
1437 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -07001438static void wma_hidden_ssid_vdev_restart_on_vdev_stop(tp_wma_handle wma_handle,
1439 uint8_t sessionId)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001440{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001441 struct wma_txrx_node *intr = wma_handle->interfaces;
Siddarth Poddar17dc4712016-03-09 16:30:27 +05301442 struct hidden_ssid_vdev_restart_params params;
1443 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001444
Siddarth Poddar17dc4712016-03-09 16:30:27 +05301445 params.session_id = sessionId;
1446 params.ssid_len = intr[sessionId].vdev_restart_params.ssid.ssid_len;
1447 qdf_mem_copy(params.ssid,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001448 intr[sessionId].vdev_restart_params.ssid.ssid,
Siddarth Poddar17dc4712016-03-09 16:30:27 +05301449 params.ssid_len);
1450 params.flags = intr[sessionId].vdev_restart_params.flags;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001451 if (intr[sessionId].vdev_restart_params.ssidHidden)
Siddarth Poddar17dc4712016-03-09 16:30:27 +05301452 params.flags |= WMI_UNIFIED_VDEV_START_HIDDEN_SSID;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001453 else
Siddarth Poddar17dc4712016-03-09 16:30:27 +05301454 params.flags &= (0xFFFFFFFE);
1455 params.requestor_id = intr[sessionId].vdev_restart_params.requestor_id;
1456 params.disable_hw_ack =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001457 intr[sessionId].vdev_restart_params.disable_hw_ack;
1458
Siddarth Poddar17dc4712016-03-09 16:30:27 +05301459 params.mhz = intr[sessionId].vdev_restart_params.chan.mhz;
1460 params.band_center_freq1 =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001461 intr[sessionId].vdev_restart_params.chan.band_center_freq1;
Siddarth Poddar17dc4712016-03-09 16:30:27 +05301462 params.band_center_freq2 =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001463 intr[sessionId].vdev_restart_params.chan.band_center_freq2;
Siddarth Poddar17dc4712016-03-09 16:30:27 +05301464 params.info = intr[sessionId].vdev_restart_params.chan.info;
1465 params.reg_info_1 = intr[sessionId].vdev_restart_params.chan.reg_info_1;
1466 params.reg_info_2 = intr[sessionId].vdev_restart_params.chan.reg_info_2;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001467
Siddarth Poddar17dc4712016-03-09 16:30:27 +05301468 status = wmi_unified_hidden_ssid_vdev_restart_send(
1469 wma_handle->wmi_handle, &params);
1470 if (status == QDF_STATUS_E_FAILURE) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001471 WMA_LOGE("%s: Failed to send vdev restart command", __func__);
Anurag Chouhan8e0ccd32016-02-19 15:30:20 +05301472 qdf_atomic_set(&intr[sessionId].vdev_restart_params.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001473 hidden_ssid_restart_in_progress, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001474 }
1475}
1476
1477/**
Liangwei Dong748cb5d2016-09-29 00:56:40 -04001478 * wma_cleanup_target_req_param() - free param memory of target request
1479 * @tgt_req: target request params
1480 *
1481 * Return: none
1482 */
1483static void wma_cleanup_target_req_param(struct wma_target_req *tgt_req)
1484{
1485 if (tgt_req->msg_type == WMA_CHNL_SWITCH_REQ ||
1486 tgt_req->msg_type == WMA_DELETE_BSS_REQ ||
1487 tgt_req->msg_type == WMA_ADD_BSS_REQ) {
1488 qdf_mem_free(tgt_req->user_data);
1489 tgt_req->user_data = NULL;
1490 }
Krishna Kumaar Natarajanfc8c3632017-05-24 17:09:40 -07001491
1492 if (tgt_req->msg_type == WMA_SET_LINK_STATE && tgt_req->user_data) {
1493 tpLinkStateParams params =
1494 (tpLinkStateParams) tgt_req->user_data;
1495 qdf_mem_free(params->callbackArg);
1496 qdf_mem_free(tgt_req->user_data);
1497 tgt_req->user_data = NULL;
1498 }
Liangwei Dong748cb5d2016-09-29 00:56:40 -04001499}
1500
1501/**
Krishna Kumaar Natarajanf24bfc82017-02-07 11:54:05 -08001502 * wma_remove_bss_peer() - remove BSS peer
1503 * @wma: pointer to WMA handle
1504 * @pdev: pointer to PDEV
1505 * @req_msg: pointer to WMA target Request
1506 * @vdev_id: vdev id on which delete BSS request was received
1507 * @params: pointer to Delete BSS params
1508 *
1509 * This function is called on receiving vdev stop response from FW or
1510 * vdev stop response timeout. In case of IBSS/NDI, use vdev's self MAC
1511 * for removing the peer. In case of STA/SAP use bssid passed as part of
1512 * delete STA parameter.
1513 *
1514 * Return: 0 on success, ERROR code on failure
1515 */
1516static int wma_remove_bss_peer(tp_wma_handle wma, void *pdev,
1517 struct wma_target_req *req_msg, uint32_t vdev_id,
1518 tpDeleteBssParams params)
1519{
1520 void *peer, *vdev;
1521 uint8_t peer_id;
1522 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
1523 uint8_t *mac_addr = NULL;
Abhishek Singhe8be9a62017-05-30 12:13:29 +05301524 struct wma_target_req *del_req;
Krishna Kumaar Natarajanf24bfc82017-02-07 11:54:05 -08001525
1526 vdev = cdp_get_vdev_from_vdev_id(soc, pdev, vdev_id);
1527 if (!vdev) {
1528 WMA_LOGE(FL("vdev is NULL for vdev_id = %d"), vdev_id);
1529 wma_cleanup_target_req_param(req_msg);
1530 return -EINVAL;
1531 }
1532
1533 if (wma_is_vdev_in_ibss_mode(wma, vdev_id) ||
1534 WMA_IS_VDEV_IN_NDI_MODE(wma->interfaces, vdev_id)) {
1535 mac_addr = cdp_get_vdev_mac_addr(soc, vdev);
1536 if (!mac_addr) {
1537 WMA_LOGE(FL("mac_addr is NULL for vdev_id = %d"),
1538 vdev_id);
1539 wma_cleanup_target_req_param(req_msg);
1540 return -EINVAL;
1541 }
1542 } else {
1543 mac_addr = params->bssid;
1544 }
1545
1546 peer = cdp_peer_find_by_addr(soc, pdev, mac_addr, &peer_id);
1547 if (!peer) {
1548 WMA_LOGE(FL("peer NULL for vdev_id = %d"), vdev_id);
1549 wma_cleanup_target_req_param(req_msg);
1550 return -EINVAL;
1551 }
1552
1553 wma_remove_peer(wma, mac_addr, vdev_id, peer, false);
Abhishek Singhe8be9a62017-05-30 12:13:29 +05301554 if (WMI_SERVICE_IS_ENABLED(
1555 wma->wmi_service_bitmap,
1556 WMI_SERVICE_SYNC_DELETE_CMDS)) {
1557 WMA_LOGD(FL("Wait for the peer delete. vdev_id %d"),
1558 req_msg->vdev_id);
1559 del_req = wma_fill_hold_req(wma,
1560 req_msg->vdev_id,
1561 WMA_DELETE_STA_REQ,
1562 WMA_DELETE_PEER_RSP,
1563 params,
1564 WMA_DELETE_STA_TIMEOUT);
1565 if (!del_req) {
1566 WMA_LOGE(FL("Failed to allocate request. vdev_id %d"),
1567 req_msg->vdev_id);
1568 params->status = QDF_STATUS_E_NOMEM;
1569 return -EINVAL;
1570 }
1571 }
Krishna Kumaar Natarajanf24bfc82017-02-07 11:54:05 -08001572 return 0;
1573}
1574
Hanumanth Reddy Pothulae87621b2017-04-12 20:53:35 +05301575/*
1576 * get_fw_active_bpf_mode() - convert HDD BPF mode to FW configurable BPF
1577 * mode
1578 * @mode: BPF mode maintained in HDD
1579 *
1580 * Return: FW configurable BP mode
1581 */
1582static enum wmi_host_active_bpf_mode
1583get_fw_active_bpf_mode(enum active_bpf_mode mode)
1584{
1585 switch (mode) {
1586 case ACTIVE_BPF_DISABLED:
1587 return WMI_HOST_ACTIVE_BPF_DISABLED;
1588 case ACTIVE_BPF_ENABLED:
1589 return WMI_HOST_ACTIVE_BPF_ENABLED;
1590 case ACTIVE_BPF_ADAPTIVE:
1591 return WMI_HOST_ACTIVE_BPF_ADAPTIVE;
1592 default:
1593 WMA_LOGE("Invalid Active BPF Mode %d; Using 'disabled'", mode);
1594 return WMI_HOST_ACTIVE_BPF_DISABLED;
1595 }
1596}
1597
Krishna Kumaar Natarajanf24bfc82017-02-07 11:54:05 -08001598/**
Dustin Brown13995f02017-01-12 15:38:42 -08001599 * wma_config_active_bpf_mode() - Config active BPF mode in FW
1600 * @wma: the WMA handle
1601 * @vdev_id: the Id of the vdev for which the configuration should be applied
1602 *
1603 * Return: QDF status
1604 */
1605static QDF_STATUS wma_config_active_bpf_mode(t_wma_handle *wma, uint8_t vdev_id)
1606{
Hanumanth Reddy Pothulae87621b2017-04-12 20:53:35 +05301607 enum wmi_host_active_bpf_mode uc_mode, mcbc_mode;
Dustin Brown13995f02017-01-12 15:38:42 -08001608
Hanumanth Reddy Pothulae87621b2017-04-12 20:53:35 +05301609 uc_mode = get_fw_active_bpf_mode(wma->active_uc_bpf_mode);
1610 mcbc_mode = get_fw_active_bpf_mode(wma->active_mc_bc_bpf_mode);
Dustin Brown13995f02017-01-12 15:38:42 -08001611
Hanumanth Reddy Pothulae87621b2017-04-12 20:53:35 +05301612 WMA_LOGD("Configuring Active BPF Mode UC:%d MC/BC:%d for vdev %u",
1613 uc_mode, mcbc_mode, vdev_id);
Dustin Brown13995f02017-01-12 15:38:42 -08001614
1615 return wmi_unified_set_active_bpf_mode_cmd(wma->wmi_handle, vdev_id,
1616 uc_mode, mcbc_mode);
1617}
1618
Abhishek Singhe8be9a62017-05-30 12:13:29 +05301619#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
1620/**
1621 * wma_check_and_find_mcc_ap() - finds if device is operating AP
1622 * in MCC mode or not
1623 * @wma: wma handle.
1624 * @vdev_id: vdev ID of device for which MCC has to be checked
1625 *
1626 * This function internally calls wma_find_mcc_ap finds if
1627 * device is operating AP in MCC mode or not
1628 *
1629 * Return: none
1630 */
1631static void
1632wma_check_and_find_mcc_ap(tp_wma_handle wma, uint8_t vdev_id)
1633{
1634 tpAniSirGlobal mac_ctx = cds_get_context(QDF_MODULE_ID_PE);
1635
1636 if (NULL == mac_ctx) {
1637 WMA_LOGE("%s: Failed to get mac_ctx", __func__);
1638 return;
1639 }
1640 if (mac_ctx->sap.sap_channel_avoidance)
1641 wma_find_mcc_ap(wma, vdev_id, false);
1642}
1643#else
1644static inline void
1645wma_check_and_find_mcc_ap(tp_wma_handle wma, uint8_t vdev_id)
1646{}
1647#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
1648
1649/**
1650 * wma_send_del_bss_response() - send del bss resp to upper layer
1651 * @wma: wma handle.
1652 * @vdev_id: vdev ID of device for which MCC has to be checked
1653 *
1654 * This function sends del bss resp to upper layer
1655 *
1656 * Return: none
1657 */
1658static void
1659wma_send_del_bss_response(tp_wma_handle wma, struct wma_target_req *req,
1660 uint8_t vdev_id)
1661{
1662 struct wma_txrx_node *iface;
1663 struct beacon_info *bcn;
1664 tpDeleteBssParams params;
1665 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
1666
1667 if (!req) {
1668 WMA_LOGE("%s req is NULL", __func__);
1669 return;
1670 }
1671
1672 iface = &wma->interfaces[vdev_id];
1673 if (!iface->handle) {
1674 WMA_LOGE("%s vdev id %d is already deleted",
1675 __func__, vdev_id);
1676 if (req->user_data)
1677 qdf_mem_free(req->user_data);
1678 req->user_data = NULL;
1679 return;
1680 }
1681 params = (tpDeleteBssParams) req->user_data;
1682
1683 if (wmi_unified_vdev_down_send(wma->wmi_handle,
1684 vdev_id) !=
1685 QDF_STATUS_SUCCESS) {
1686 WMA_LOGE("Failed to send vdev down cmd: vdev %d",
1687 vdev_id);
1688 } else {
1689 wma_vdev_set_mlme_state(wma, vdev_id,
1690 WLAN_VDEV_S_STOP);
1691 wma_check_and_find_mcc_ap(wma, vdev_id);
1692 }
1693
1694 cdp_fc_vdev_flush(soc, iface->handle);
1695 WMA_LOGD("%s, vdev_id: %d, un-pausing tx_ll_queue for VDEV_STOP rsp",
1696 __func__, vdev_id);
1697 cdp_fc_vdev_unpause(soc, iface->handle,
1698 OL_TXQ_PAUSE_REASON_VDEV_STOP);
1699 wma_vdev_clear_pause_bit(vdev_id, PAUSE_TYPE_HOST);
1700 qdf_atomic_set(&iface->bss_status, WMA_BSS_STATUS_STOPPED);
1701 WMA_LOGD("%s: (type %d subtype %d) BSS is stopped",
1702 __func__, iface->type, iface->sub_type);
1703
1704 bcn = wma->interfaces[vdev_id].beacon;
1705 if (bcn) {
1706 WMA_LOGD("%s: Freeing beacon struct %p, template memory %p",
1707 __func__, bcn, bcn->buf);
1708 if (bcn->dma_mapped)
1709 qdf_nbuf_unmap_single(wma->qdf_dev, bcn->buf,
1710 QDF_DMA_TO_DEVICE);
1711 qdf_nbuf_free(bcn->buf);
1712 qdf_mem_free(bcn);
1713 wma->interfaces[vdev_id].beacon = NULL;
1714 }
1715
1716 /* Timeout status means its WMA generated DEL BSS REQ when ADD
1717 * BSS REQ was timed out to stop the VDEV in this case no need
1718 * to send response to UMAC
1719 */
1720 if (params->status == QDF_STATUS_FW_MSG_TIMEDOUT) {
1721 qdf_mem_free(req->user_data);
1722 req->user_data = NULL;
1723 WMA_LOGE("%s: DEL BSS from ADD BSS timeout do not send resp to UMAC (vdev id %x)",
1724 __func__, vdev_id);
1725 } else {
1726 params->status = QDF_STATUS_SUCCESS;
1727 wma_send_msg(wma, WMA_DELETE_BSS_RSP, (void *)params,
1728 0);
1729 }
1730
1731 if (iface->del_staself_req != NULL) {
1732 WMA_LOGA("scheduling defered deletion (vdev id %x)",
1733 vdev_id);
1734 wma_vdev_detach(wma, iface->del_staself_req, 1);
1735 }
1736}
1737
1738
Dustin Brown13995f02017-01-12 15:38:42 -08001739/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001740 * wma_vdev_stop_resp_handler() - vdev stop response handler
1741 * @handle: wma handle
1742 * @cmd_param_info: event buffer
1743 * @len: buffer length
1744 *
1745 * Return: 0 for success or error code
1746 */
1747int wma_vdev_stop_resp_handler(void *handle, uint8_t *cmd_param_info,
1748 u32 len)
1749{
1750 tp_wma_handle wma = (tp_wma_handle) handle;
1751 WMI_VDEV_STOPPED_EVENTID_param_tlvs *param_buf;
1752 wmi_vdev_stopped_event_fixed_param *resp_event;
Kiran Kumar Lokere5798bfa2017-04-27 20:49:39 -07001753 struct wma_target_req *req_msg, *del_req, *new_req_msg;
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08001754 struct cdp_pdev *pdev;
Sandeep Puligilla7da86332016-11-10 16:14:40 -08001755 void *peer;
1756 uint8_t peer_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001757 struct wma_txrx_node *iface;
1758 int32_t status = 0;
Leo Chang96464902016-10-28 11:10:54 -07001759 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Dustin Brownbf6d16b2017-03-03 11:41:05 -08001760
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001761#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
Anurag Chouhan6d760662016-02-20 16:05:43 +05301762 tpAniSirGlobal mac_ctx = cds_get_context(QDF_MODULE_ID_PE);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001763
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001764 if (NULL == mac_ctx) {
Dustin Brown3e619822017-03-17 10:41:56 -07001765 wma_release_wmi_resp_wakelock(wma);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001766 WMA_LOGE("%s: Failed to get mac_ctx", __func__);
1767 return -EINVAL;
1768 }
1769#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
1770
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07001771 WMA_LOGD("%s: Enter", __func__);
Dustin Brown3e619822017-03-17 10:41:56 -07001772
1773 wma_release_wmi_resp_wakelock(wma);
1774
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001775 param_buf = (WMI_VDEV_STOPPED_EVENTID_param_tlvs *) cmd_param_info;
1776 if (!param_buf) {
1777 WMA_LOGE("Invalid event buffer");
1778 return -EINVAL;
1779 }
1780 resp_event = param_buf->fixed_param;
1781
Kiran Kumar Lokere5798bfa2017-04-27 20:49:39 -07001782 req_msg = wma_find_vdev_req(wma, resp_event->vdev_id,
1783 WMA_TARGET_REQ_TYPE_VDEV_STOP);
1784 if (!req_msg) {
1785 WMA_LOGE("%s: Failed to lookup vdev request for vdev id %d",
1786 __func__, resp_event->vdev_id);
1787 return -EINVAL;
1788 }
1789
Naveen Rawatf2bd42d2017-06-29 14:51:43 -07001790 if ((resp_event->vdev_id < wma->max_bssid) &&
Anurag Chouhan8e0ccd32016-02-19 15:30:20 +05301791 (qdf_atomic_read
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001792 (&wma->interfaces[resp_event->vdev_id].vdev_restart_params.
1793 hidden_ssid_restart_in_progress))
1794 && ((wma->interfaces[resp_event->vdev_id].type == WMI_VDEV_TYPE_AP)
1795 && (wma->interfaces[resp_event->vdev_id].sub_type == 0))) {
1796 WMA_LOGE("%s: vdev stop event recevied for hidden ssid set using IOCTL ",
1797 __func__);
Selvaraj, Sridhara0083c42016-06-22 22:15:43 +05301798
Kiran Kumar Lokere5798bfa2017-04-27 20:49:39 -07001799 wma_vdev_set_mlme_state(wma,
1800 resp_event->vdev_id, WLAN_VDEV_S_STOP);
1801 new_req_msg = wma_fill_vdev_req(wma, resp_event->vdev_id,
Selvaraj, Sridhara0083c42016-06-22 22:15:43 +05301802 WMA_HIDDEN_SSID_VDEV_RESTART,
Kiran Kumar Lokere5798bfa2017-04-27 20:49:39 -07001803 WMA_TARGET_REQ_TYPE_VDEV_START,
1804 req_msg->user_data,
Selvaraj, Sridhara0083c42016-06-22 22:15:43 +05301805 WMA_VDEV_START_REQUEST_TIMEOUT);
Kiran Kumar Lokere5798bfa2017-04-27 20:49:39 -07001806 if (!new_req_msg) {
Selvaraj, Sridhara0083c42016-06-22 22:15:43 +05301807 WMA_LOGE("%s: Failed to fill vdev request, vdev_id %d",
1808 __func__, resp_event->vdev_id);
1809 return -EINVAL;
1810 }
1811
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001812 wma_hidden_ssid_vdev_restart_on_vdev_stop(wma,
1813 resp_event->vdev_id);
1814 }
1815
Anurag Chouhan6d760662016-02-20 16:05:43 +05301816 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001817 if (!pdev) {
1818 WMA_LOGE("%s: pdev is NULL", __func__);
1819 status = -EINVAL;
Liangwei Dong748cb5d2016-09-29 00:56:40 -04001820 wma_cleanup_target_req_param(req_msg);
Anurag Chouhan210db072016-02-22 18:42:15 +05301821 qdf_mc_timer_stop(&req_msg->event_timeout);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001822 goto free_req_msg;
1823 }
1824
Anurag Chouhan210db072016-02-22 18:42:15 +05301825 qdf_mc_timer_stop(&req_msg->event_timeout);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001826 if (req_msg->msg_type == WMA_DELETE_BSS_REQ) {
1827 tpDeleteBssParams params =
1828 (tpDeleteBssParams) req_msg->user_data;
Dustin Brownbf6d16b2017-03-03 11:41:05 -08001829
Naveen Rawatf2bd42d2017-06-29 14:51:43 -07001830 if (resp_event->vdev_id >= wma->max_bssid) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001831 WMA_LOGE("%s: Invalid vdev_id %d", __func__,
1832 resp_event->vdev_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001833 }
1834
1835 iface = &wma->interfaces[resp_event->vdev_id];
1836 if (iface->handle == NULL) {
1837 WMA_LOGE("%s vdev id %d is already deleted",
1838 __func__, resp_event->vdev_id);
Liangwei Dong748cb5d2016-09-29 00:56:40 -04001839 wma_cleanup_target_req_param(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001840 status = -EINVAL;
1841 goto free_req_msg;
1842 }
Mukul Sharma8d2d9ec2016-09-08 13:05:35 +05301843
Padma, Santhosh Kumar16dacfb2017-03-21 19:05:40 +05301844 /* CCA is required only for sta interface */
1845 if (iface->type == WMI_VDEV_TYPE_STA)
1846 wma_get_cca_stats(wma, resp_event->vdev_id);
1847
Mukul Sharma8d2d9ec2016-09-08 13:05:35 +05301848 /* Clear arp and ns offload cache */
1849 qdf_mem_zero(&iface->ns_offload_req,
1850 sizeof(iface->ns_offload_req));
1851 qdf_mem_zero(&iface->arp_offload_req,
1852 sizeof(iface->arp_offload_req));
1853
Krishna Kumaar Natarajanf24bfc82017-02-07 11:54:05 -08001854 status = wma_remove_bss_peer(wma, pdev, req_msg,
1855 resp_event->vdev_id, params);
1856 if (status != 0)
1857 goto free_req_msg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001858
Abhishek Singhe8be9a62017-05-30 12:13:29 +05301859 if (WMI_SERVICE_IS_ENABLED(
1860 wma->wmi_service_bitmap,
1861 WMI_SERVICE_SYNC_DELETE_CMDS))
1862 goto free_req_msg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001863
Abhishek Singhe8be9a62017-05-30 12:13:29 +05301864 wma_send_del_bss_response(wma, req_msg, resp_event->vdev_id);
Sandeep Puligilla7da86332016-11-10 16:14:40 -08001865 } else if (req_msg->msg_type == WMA_SET_LINK_STATE) {
1866 tpLinkStateParams params =
1867 (tpLinkStateParams) req_msg->user_data;
1868
1869 peer = cdp_peer_find_by_addr(soc, pdev, params->bssid, &peer_id);
1870 if (peer) {
1871 WMA_LOGP(FL("Deleting peer %pM vdev id %d"),
1872 params->bssid, req_msg->vdev_id);
1873 wma_remove_peer(wma, params->bssid, req_msg->vdev_id,
1874 peer, false);
Sandeep Puligillabbee8172017-04-07 19:26:33 -07001875 if (WMI_SERVICE_IS_ENABLED(wma->wmi_service_bitmap,
1876 WMI_SERVICE_SYNC_DELETE_CMDS)) {
1877 WMA_LOGI(FL("Wait for the peer delete. vdev_id %d"),
1878 req_msg->vdev_id);
1879 del_req = wma_fill_hold_req(wma,
1880 req_msg->vdev_id,
1881 WMA_DELETE_STA_REQ,
1882 WMA_SET_LINK_PEER_RSP,
1883 params,
1884 WMA_DELETE_STA_TIMEOUT);
1885 if (!del_req) {
1886 WMA_LOGE(FL("Failed to allocate request. vdev_id %d"),
1887 req_msg->vdev_id);
1888 params->status = QDF_STATUS_E_NOMEM;
1889 } else {
1890 goto free_req_msg;
1891 }
1892 }
Sandeep Puligilla7da86332016-11-10 16:14:40 -08001893 }
1894 if (wmi_unified_vdev_down_send(wma->wmi_handle,
1895 req_msg->vdev_id) !=
1896 QDF_STATUS_SUCCESS) {
1897 WMA_LOGE("Failed to send vdev down cmd: vdev %d",
1898 req_msg->vdev_id);
1899 }
1900 wma_send_msg(wma, WMA_SET_LINK_STATE_RSP, (void *)params, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001901 }
Krishna Kumaar Natarajanf24bfc82017-02-07 11:54:05 -08001902
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001903free_req_msg:
Anurag Chouhan210db072016-02-22 18:42:15 +05301904 qdf_mc_timer_destroy(&req_msg->event_timeout);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301905 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001906 return status;
1907}
1908
1909/**
1910 * wma_vdev_attach() - create vdev in fw
1911 * @wma_handle: wma handle
1912 * @self_sta_req: self sta request
1913 * @generateRsp: generate response
1914 *
1915 * This function creates vdev in target and
1916 * attach this vdev to txrx module. It also set
1917 * vdev related params to fw.
1918 *
1919 * Return: txrx vdev handle
1920 */
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08001921struct cdp_vdev *wma_vdev_attach(tp_wma_handle wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001922 struct add_sta_self_params *self_sta_req,
1923 uint8_t generateRsp)
1924{
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08001925 struct cdp_vdev *txrx_vdev_handle = NULL;
1926 struct cdp_pdev *txrx_pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001927 enum wlan_op_mode txrx_vdev_type;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301928 QDF_STATUS status = QDF_STATUS_SUCCESS;
Anurag Chouhan6d760662016-02-20 16:05:43 +05301929 struct sAniSirGlobal *mac = cds_get_context(QDF_MODULE_ID_PE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001930 uint32_t cfg_val;
1931 uint16_t val16;
Govind Singhd76a5b02016-03-08 15:12:14 +05301932 QDF_STATUS ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001933 tSirMacHTCapabilityInfo *phtCapInfo;
Rajeev Kumarb60abe42017-01-21 15:39:31 -08001934 struct scheduler_msg sme_msg = { 0 };
Govind Singhd76a5b02016-03-08 15:12:14 +05301935 struct vdev_create_params params = { 0 };
Bhargav Shaha89d3b42016-04-20 13:04:56 +05301936 u_int8_t vdev_id;
Padma, Santhosh Kumara7119672016-08-16 16:05:14 +05301937 struct sir_set_tx_rx_aggregation_size tx_rx_aggregation_size;
Leo Chang96464902016-10-28 11:10:54 -07001938 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001939
1940 if (NULL == mac) {
1941 WMA_LOGE("%s: Failed to get mac", __func__);
1942 goto end;
1943 }
1944
Govind Singhd76a5b02016-03-08 15:12:14 +05301945 params.if_id = self_sta_req->session_id;
1946 params.type = self_sta_req->type;
1947 params.subtype = self_sta_req->sub_type;
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07001948 params.nss_2g = self_sta_req->nss_2g;
1949 params.nss_5g = self_sta_req->nss_5g;
Govind Singhd76a5b02016-03-08 15:12:14 +05301950
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001951 /* Create a vdev in target */
Govind Singhd76a5b02016-03-08 15:12:14 +05301952 status = wmi_unified_vdev_create_send(wma_handle->wmi_handle,
1953 self_sta_req->self_mac_addr,
1954 &params);
1955 if (QDF_IS_STATUS_ERROR(status)) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07001956 WMA_LOGE("%s: Unable to add an interface for ath_dev",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001957 __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001958 goto end;
1959 }
1960
Bhargav Shaha89d3b42016-04-20 13:04:56 +05301961 vdev_id = self_sta_req->session_id;
1962
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001963 txrx_vdev_type = wma_get_txrx_vdev_type(self_sta_req->type);
1964
1965 if (wlan_op_mode_unknown == txrx_vdev_type) {
1966 WMA_LOGE("Failed to get txrx vdev type");
Govind Singhd76a5b02016-03-08 15:12:14 +05301967 wmi_unified_vdev_delete_send(wma_handle->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001968 self_sta_req->session_id);
1969 goto end;
1970 }
1971
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08001972 txrx_vdev_handle = cdp_vdev_attach(soc,
1973 txrx_pdev,
1974 self_sta_req->self_mac_addr,
1975 self_sta_req->session_id,
1976 txrx_vdev_type);
Mukul Sharma6411bb82017-03-01 15:57:07 +05301977 wma_vdev_update_pause_bitmap(self_sta_req->session_id, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001978
Srinivas Girigowdaf2599dd2015-11-16 18:20:46 -08001979 WMA_LOGD("vdev_id %hu, txrx_vdev_handle = %p", self_sta_req->session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001980 txrx_vdev_handle);
1981
1982 if (NULL == txrx_vdev_handle) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07001983 WMA_LOGE("%s: cdp_vdev_attach failed", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301984 status = QDF_STATUS_E_FAILURE;
Govind Singhd76a5b02016-03-08 15:12:14 +05301985 wmi_unified_vdev_delete_send(wma_handle->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001986 self_sta_req->session_id);
1987 goto end;
1988 }
Selvaraj, Sridhar171e2252016-06-22 22:33:26 +05301989 wma_handle->interfaces[self_sta_req->session_id].vdev_active = true;
1990
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001991 wma_handle->interfaces[self_sta_req->session_id].handle =
1992 txrx_vdev_handle;
1993
1994 wma_handle->interfaces[self_sta_req->session_id].ptrn_match_enable =
1995 wma_handle->ptrn_match_enable_all_vdev ? true : false;
1996
1997 if (wlan_cfg_get_int(mac, WNI_CFG_WOWLAN_DEAUTH_ENABLE, &cfg_val)
1998 != eSIR_SUCCESS)
1999 wma_handle->wow.deauth_enable = true;
2000 else
2001 wma_handle->wow.deauth_enable = cfg_val ? true : false;
2002
2003 if (wlan_cfg_get_int(mac, WNI_CFG_WOWLAN_DISASSOC_ENABLE, &cfg_val)
2004 != eSIR_SUCCESS)
2005 wma_handle->wow.disassoc_enable = true;
2006 else
2007 wma_handle->wow.disassoc_enable = cfg_val ? true : false;
2008
2009 if (wlan_cfg_get_int(mac, WNI_CFG_WOWLAN_MAX_MISSED_BEACON, &cfg_val)
2010 != eSIR_SUCCESS)
2011 wma_handle->wow.bmiss_enable = true;
2012 else
2013 wma_handle->wow.bmiss_enable = cfg_val ? true : false;
2014
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302015 qdf_mem_copy(wma_handle->interfaces[self_sta_req->session_id].addr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002016 self_sta_req->self_mac_addr,
2017 sizeof(wma_handle->interfaces[self_sta_req->session_id].
2018 addr));
Padma, Santhosh Kumara7119672016-08-16 16:05:14 +05302019
2020 tx_rx_aggregation_size.tx_aggregation_size =
2021 self_sta_req->tx_aggregation_size;
2022 tx_rx_aggregation_size.rx_aggregation_size =
2023 self_sta_req->rx_aggregation_size;
2024 tx_rx_aggregation_size.vdev_id = self_sta_req->session_id;
2025
2026 status = wma_set_tx_rx_aggregation_size(&tx_rx_aggregation_size);
2027 if (status != QDF_STATUS_SUCCESS)
2028 WMA_LOGE("failed to set aggregation sizes(err=%d)", status);
2029
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002030 switch (self_sta_req->type) {
2031 case WMI_VDEV_TYPE_STA:
2032 if (wlan_cfg_get_int(mac, WNI_CFG_INFRA_STA_KEEP_ALIVE_PERIOD,
2033 &cfg_val) != eSIR_SUCCESS) {
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002034 WMA_LOGE("Failed to get value for WNI_CFG_INFRA_STA_KEEP_ALIVE_PERIOD");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002035 cfg_val = DEFAULT_INFRA_STA_KEEP_ALIVE_PERIOD;
2036 }
2037
2038 wma_set_sta_keep_alive(wma_handle,
2039 self_sta_req->session_id,
2040 SIR_KEEP_ALIVE_NULL_PKT,
2041 cfg_val, NULL, NULL, NULL);
mukul sharma72c8b222015-09-04 17:02:01 +05302042
2043 /* offload STA SA query related params to fwr */
2044 if (WMI_SERVICE_IS_ENABLED(wma_handle->wmi_service_bitmap,
2045 WMI_SERVICE_STA_PMF_OFFLOAD)) {
2046 wma_set_sta_sa_query_param(wma_handle,
2047 self_sta_req->session_id);
2048 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002049 break;
2050 }
2051
2052 wma_handle->interfaces[self_sta_req->session_id].type =
2053 self_sta_req->type;
2054 wma_handle->interfaces[self_sta_req->session_id].sub_type =
2055 self_sta_req->sub_type;
Anurag Chouhan8e0ccd32016-02-19 15:30:20 +05302056 qdf_atomic_init(&wma_handle->interfaces
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002057 [self_sta_req->session_id].bss_status);
2058
2059 if (((self_sta_req->type == WMI_VDEV_TYPE_AP) &&
2060 (self_sta_req->sub_type == WMI_UNIFIED_VDEV_SUBTYPE_P2P_DEVICE)) ||
Manjunathappa Prakash0e6e6b52016-04-21 11:48:48 -07002061 (self_sta_req->type == WMI_VDEV_TYPE_OCB) ||
Deepak Dhamdheree2dd5442016-05-27 15:05:51 -07002062 (self_sta_req->type == WMI_VDEV_TYPE_MONITOR) ||
2063 (self_sta_req->type == WMI_VDEV_TYPE_NDI)) {
Abhishek Singh7e95dbc2017-07-06 17:57:50 +05302064 WMA_LOGD("Creating self peer %pM, vdev_id %hu",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002065 self_sta_req->self_mac_addr, self_sta_req->session_id);
2066 status = wma_create_peer(wma_handle, txrx_pdev,
2067 txrx_vdev_handle,
2068 self_sta_req->self_mac_addr,
2069 WMI_PEER_TYPE_DEFAULT,
2070 self_sta_req->session_id, false);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302071 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002072 WMA_LOGE("%s: Failed to create peer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302073 status = QDF_STATUS_E_FAILURE;
Govind Singhd76a5b02016-03-08 15:12:14 +05302074 wmi_unified_vdev_delete_send(wma_handle->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002075 self_sta_req->session_id);
2076 }
2077 }
2078
Naveen Rawat2b6e3c92017-03-20 13:59:07 -07002079 WMA_LOGD("Setting WMI_VDEV_PARAM_DISCONNECT_TH: %d",
2080 self_sta_req->pkt_err_disconn_th);
2081 ret = wma_vdev_set_param(wma_handle->wmi_handle,
2082 self_sta_req->session_id,
2083 WMI_VDEV_PARAM_DISCONNECT_TH,
2084 self_sta_req->pkt_err_disconn_th);
2085 if (ret)
2086 WMA_LOGE("Failed to set WMI_VDEV_PARAM_DISCONNECT_TH");
2087
Bhargav Shaha89d3b42016-04-20 13:04:56 +05302088 wma_handle->interfaces[vdev_id].is_vdev_valid = true;
Govind Singhd76a5b02016-03-08 15:12:14 +05302089 ret = wma_vdev_set_param(wma_handle->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002090 self_sta_req->session_id,
2091 WMI_VDEV_PARAM_MCC_RTSCTS_PROTECTION_ENABLE,
2092 mac->roam.configParam.mcc_rts_cts_prot_enable);
Govind Singhd76a5b02016-03-08 15:12:14 +05302093 if (QDF_IS_STATUS_ERROR(ret))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002094 WMA_LOGE("Failed to set WMI VDEV MCC_RTSCTS_PROTECTION_ENABLE");
2095
Govind Singhd76a5b02016-03-08 15:12:14 +05302096 ret = wma_vdev_set_param(wma_handle->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002097 self_sta_req->session_id,
2098 WMI_VDEV_PARAM_MCC_BROADCAST_PROBE_ENABLE,
2099 mac->roam.configParam.mcc_bcast_prob_resp_enable);
Govind Singhd76a5b02016-03-08 15:12:14 +05302100 if (QDF_IS_STATUS_ERROR(ret))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002101 WMA_LOGE("Failed to set WMI VDEV MCC_BROADCAST_PROBE_ENABLE");
2102
2103 if (wlan_cfg_get_int(mac, WNI_CFG_RTS_THRESHOLD,
2104 &cfg_val) == eSIR_SUCCESS) {
Govind Singhd76a5b02016-03-08 15:12:14 +05302105 ret = wma_vdev_set_param(wma_handle->wmi_handle,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002106 self_sta_req->session_id,
2107 WMI_VDEV_PARAM_RTS_THRESHOLD,
2108 cfg_val);
Govind Singhd76a5b02016-03-08 15:12:14 +05302109 if (QDF_IS_STATUS_ERROR(ret))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002110 WMA_LOGE("Failed to set WMI_VDEV_PARAM_RTS_THRESHOLD");
2111 } else {
2112 WMA_LOGE("Failed to get value for WNI_CFG_RTS_THRESHOLD, leaving unchanged");
2113 }
2114
2115 if (wlan_cfg_get_int(mac, WNI_CFG_FRAGMENTATION_THRESHOLD,
2116 &cfg_val) == eSIR_SUCCESS) {
Govind Singhd76a5b02016-03-08 15:12:14 +05302117 ret = wma_vdev_set_param(wma_handle->wmi_handle,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002118 self_sta_req->session_id,
2119 WMI_VDEV_PARAM_FRAGMENTATION_THRESHOLD,
2120 cfg_val);
Govind Singhd76a5b02016-03-08 15:12:14 +05302121 if (QDF_IS_STATUS_ERROR(ret))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002122 WMA_LOGE("Failed to set WMI_VDEV_PARAM_FRAGMENTATION_THRESHOLD");
2123 } else {
2124 WMA_LOGE("Failed to get value for WNI_CFG_FRAGMENTATION_THRESHOLD, leaving unchanged");
2125 }
2126
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002127 if (wlan_cfg_get_int(mac, WNI_CFG_HT_CAP_INFO, &cfg_val) ==
2128 eSIR_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002129 val16 = (uint16_t) cfg_val;
2130 phtCapInfo = (tSirMacHTCapabilityInfo *) &cfg_val;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002131
Govind Singhd76a5b02016-03-08 15:12:14 +05302132 ret = wma_vdev_set_param(wma_handle->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002133 self_sta_req->session_id,
2134 WMI_VDEV_PARAM_TX_STBC,
2135 phtCapInfo->txSTBC);
Govind Singhd76a5b02016-03-08 15:12:14 +05302136 if (QDF_IS_STATUS_ERROR(ret))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002137 WMA_LOGE("Failed to set WMI_VDEV_PARAM_TX_STBC");
2138 } else {
2139 WMA_LOGE("Failed to get value of HT_CAP, TX STBC unchanged");
2140 }
Hong Shib90718f2017-02-20 00:57:22 +08002141
2142 wma_set_vdev_mgmt_rate(wma_handle, self_sta_req->session_id);
2143
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002144 /* Initialize roaming offload state */
2145 if ((self_sta_req->type == WMI_VDEV_TYPE_STA) &&
2146 (self_sta_req->sub_type == 0)) {
2147 wma_handle->roam_offload_enabled = true;
Govind Singhd76a5b02016-03-08 15:12:14 +05302148 ret = wma_vdev_set_param(wma_handle->wmi_handle,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002149 self_sta_req->session_id,
2150 WMI_VDEV_PARAM_ROAM_FW_OFFLOAD,
2151 (WMI_ROAM_FW_OFFLOAD_ENABLE_FLAG |
2152 WMI_ROAM_BMISS_FINAL_SCAN_ENABLE_FLAG));
Govind Singhd76a5b02016-03-08 15:12:14 +05302153 if (QDF_IS_STATUS_ERROR(ret))
2154 WMA_LOGE("Failed to set WMI_VDEV_PARAM_ROAM_FW_OFFLOAD");
Selvaraj, Sridhar4f684bb2017-01-19 15:59:23 +05302155
2156 /* Pass down enable/disable bcast probe rsp to FW */
2157 ret = wma_vdev_set_param(
2158 wma_handle->wmi_handle,
2159 self_sta_req->session_id,
2160 WMI_VDEV_PARAM_ENABLE_BCAST_PROBE_RESPONSE,
2161 self_sta_req->enable_bcast_probe_rsp);
2162 if (QDF_IS_STATUS_ERROR(ret))
2163 WMA_LOGE("Failed to set WMI_VDEV_PARAM_ENABLE_BCAST_PROBE_RESPONSE");
2164
Selvaraj, Sridhar97ce6582017-01-20 17:06:34 +05302165 /* Pass down the FILS max channel guard time to FW */
2166 ret = wma_vdev_set_param(
2167 wma_handle->wmi_handle,
2168 self_sta_req->session_id,
2169 WMI_VDEV_PARAM_FILS_MAX_CHANNEL_GUARD_TIME,
2170 self_sta_req->fils_max_chan_guard_time);
2171 if (QDF_IS_STATUS_ERROR(ret))
2172 WMA_LOGE("Failed to set WMI_VDEV_PARAM_FILS_MAX_CHANNEL_GUARD_TIME");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002173 }
2174
2175 /* Initialize BMISS parameters */
2176 if ((self_sta_req->type == WMI_VDEV_TYPE_STA) &&
2177 (self_sta_req->sub_type == 0))
2178 wma_roam_scan_bmiss_cnt(wma_handle,
2179 mac->roam.configParam.neighborRoamConfig.nRoamBmissFirstBcnt,
2180 mac->roam.configParam.neighborRoamConfig.nRoamBmissFinalBcnt,
2181 self_sta_req->session_id);
2182
2183 if (wlan_cfg_get_int(mac, WNI_CFG_ENABLE_MCC_ADAPTIVE_SCHED,
2184 &cfg_val) == eSIR_SUCCESS) {
2185 WMA_LOGD("%s: setting ini value for WNI_CFG_ENABLE_MCC_ADAPTIVE_SCHED: %d",
2186 __func__, cfg_val);
2187 ret = wma_set_enable_disable_mcc_adaptive_scheduler(cfg_val);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302188 if (ret != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002189 WMA_LOGE("Failed to set WNI_CFG_ENABLE_MCC_ADAPTIVE_SCHED");
2190 }
2191 } else {
2192 WMA_LOGE("Failed to get value for WNI_CFG_ENABLE_MCC_ADAPTIVE_SCHED, leaving unchanged");
2193 }
Dustin Brown13995f02017-01-12 15:38:42 -08002194
2195 if (self_sta_req->type == WMI_VDEV_TYPE_STA) {
2196 status = wma_config_active_bpf_mode(wma_handle,
2197 self_sta_req->session_id);
2198 if (QDF_IS_STATUS_ERROR(status))
2199 WMA_LOGE("Failed to configure active BPF mode");
2200 }
2201
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002202end:
2203 self_sta_req->status = status;
2204
2205#ifdef QCA_IBSS_SUPPORT
2206 if (generateRsp)
2207#endif
2208 {
2209 sme_msg.type = eWNI_SME_ADD_STA_SELF_RSP;
2210 sme_msg.bodyptr = self_sta_req;
2211 sme_msg.bodyval = 0;
2212
Rajeev Kumarb60abe42017-01-21 15:39:31 -08002213 status = scheduler_post_msg(QDF_MODULE_ID_SME, &sme_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302214 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002215 WMA_LOGE("Failed to post eWNI_SME_ADD_STA_SELF_RSP");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302216 qdf_mem_free(self_sta_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002217 }
2218 }
2219 return txrx_vdev_handle;
2220}
2221
2222/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002223 * wma_vdev_start() - send vdev start request to fw
2224 * @wma: wma handle
2225 * @req: vdev start params
2226 * @isRestart: isRestart flag
2227 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302228 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002229 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302230QDF_STATUS wma_vdev_start(tp_wma_handle wma,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002231 struct wma_vdev_start_req *req, bool isRestart)
2232{
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302233 struct vdev_start_params params = { 0 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002234 wmi_vdev_start_request_cmd_fixed_param *cmd;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002235 struct wma_txrx_node *intr = wma->interfaces;
2236 tpAniSirGlobal mac_ctx = NULL;
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302237 uint32_t temp_ssid_len = 0;
2238 uint32_t temp_flags = 0;
2239 uint32_t temp_chan_info = 0;
2240 uint32_t temp_reg_info_1 = 0;
2241 uint32_t temp_reg_info_2 = 0;
Kiran Kumar Lokere02b9aa42016-05-26 14:54:49 -07002242 uint16_t bw_val;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002243
Anurag Chouhan6d760662016-02-20 16:05:43 +05302244 mac_ctx = cds_get_context(QDF_MODULE_ID_PE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002245 if (mac_ctx == NULL) {
2246 WMA_LOGE("%s: vdev start failed as mac_ctx is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302247 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002248 }
2249
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002250 WMA_LOGD("%s: Enter isRestart=%d vdev=%d", __func__, isRestart,
2251 req->vdev_id);
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302252 params.vdev_id = req->vdev_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002253
2254 /* Fill channel info */
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302255 params.chan_freq = cds_chan_to_freq(req->chan);
Amar Singhal046eb8a2016-05-05 12:50:15 -07002256 params.chan_mode = wma_chan_phy_mode(req->chan, req->chan_width,
2257 req->dot11_mode);
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302258 intr[params.vdev_id].chanmode = params.chan_mode;
2259 intr[params.vdev_id].ht_capable = req->ht_capable;
2260 intr[params.vdev_id].vht_capable = req->vht_capable;
2261 intr[params.vdev_id].config.gtx_info.gtxRTMask[0] =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002262 CFG_TGT_DEFAULT_GTX_HT_MASK;
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302263 intr[params.vdev_id].config.gtx_info.gtxRTMask[1] =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002264 CFG_TGT_DEFAULT_GTX_VHT_MASK;
Rajeev Kumar Sirasanagandlaaf474742016-09-06 17:54:50 +05302265
2266 if (wlan_cfg_get_int(mac_ctx, WNI_CFG_TGT_GTX_USR_CFG,
2267 &intr[params.vdev_id].config.gtx_info.gtxUsrcfg) != eSIR_SUCCESS) {
2268 intr[params.vdev_id].config.gtx_info.gtxUsrcfg =
2269 WNI_CFG_TGT_GTX_USR_CFG_STADEF;
2270 QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_WARN,
2271 "Failed to get WNI_CFG_TGT_GTX_USR_CFG");
2272 }
2273
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302274 intr[params.vdev_id].config.gtx_info.gtxPERThreshold =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002275 CFG_TGT_DEFAULT_GTX_PER_THRESHOLD;
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302276 intr[params.vdev_id].config.gtx_info.gtxPERMargin =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002277 CFG_TGT_DEFAULT_GTX_PER_MARGIN;
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302278 intr[params.vdev_id].config.gtx_info.gtxTPCstep =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002279 CFG_TGT_DEFAULT_GTX_TPC_STEP;
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302280 intr[params.vdev_id].config.gtx_info.gtxTPCMin =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002281 CFG_TGT_DEFAULT_GTX_TPC_MIN;
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302282 intr[params.vdev_id].config.gtx_info.gtxBWMask =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002283 CFG_TGT_DEFAULT_GTX_BW_MASK;
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302284 intr[params.vdev_id].mhz = params.chan_freq;
Tushnim Bhattacharyya7624a182016-03-30 13:30:46 -07002285 intr[params.vdev_id].chan_width = req->chan_width;
Krishna Kumaar Natarajan0103ef82017-02-17 18:15:56 -08002286 wma_copy_txrxnode_he_ops(&intr[params.vdev_id], req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002287
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302288 temp_chan_info &= 0xffffffc0;
2289 temp_chan_info |= params.chan_mode;
2290
2291 params.band_center_freq1 = params.chan_freq;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002292
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07002293 bw_val = wlan_reg_get_bw_value(req->chan_width);
Kiran Kumar Lokere02b9aa42016-05-26 14:54:49 -07002294 if (20 < bw_val)
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302295 params.band_center_freq1 =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002296 cds_chan_to_freq(req->ch_center_freq_seg0);
Kiran Kumar Lokere02b9aa42016-05-26 14:54:49 -07002297 if (80 < bw_val)
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302298 params.band_center_freq2 =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002299 cds_chan_to_freq(req->ch_center_freq_seg1);
2300 else
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302301 params.band_center_freq2 = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002302
2303 /* Set half or quarter rate WMI flags */
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302304 params.is_half_rate = req->is_half_rate;
2305 params.is_quarter_rate = req->is_quarter_rate;
2306
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002307 if (req->is_half_rate)
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302308 temp_chan_info |= (1 << WMI_CHAN_FLAG_HALF_RATE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002309 else if (req->is_quarter_rate)
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302310 temp_chan_info |= (1 << WMI_CHAN_FLAG_QUARTER_RATE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002311
2312 /*
2313 * If the channel has DFS set, flip on radar reporting.
2314 *
2315 * It may be that this should only be done for IBSS/hostap operation
2316 * as this flag may be interpreted (at some point in the future)
2317 * by the firmware as "oh, and please do radar DETECTION."
2318 *
2319 * If that is ever the case we would insert the decision whether to
2320 * enable the firmware flag here.
2321 */
2322
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302323 params.is_dfs = req->is_dfs;
2324 params.is_restart = isRestart;
Arif Hussain671a1902017-03-17 09:08:32 -07002325 params.cac_duration_ms = req->cac_duration_ms;
2326 params.regdomain = req->dfs_regdomain;
Manjunathappa Prakash0e6e6b52016-04-21 11:48:48 -07002327 if ((QDF_GLOBAL_MONITOR_MODE != cds_get_conparam()) && req->is_dfs) {
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302328 temp_chan_info |= (1 << WMI_CHAN_FLAG_DFS);
2329 params.dis_hw_ack = true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002330
2331 /*
Arif Hussaincd151632017-02-11 16:57:19 -08002332 * If channel is DFS and operating in AP mode,
2333 * set the WMI_CHAN_FLAG_DFS flag.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002334 */
Arif Hussaincd151632017-02-11 16:57:19 -08002335 if (wma_is_vdev_in_ap_mode(wma, params.vdev_id) == true)
2336 params.flag_dfs = WMI_CHAN_FLAG_DFS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002337 }
2338
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302339 params.beacon_intval = req->beacon_intval;
2340 params.dtim_period = req->dtim_period;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002341 /* FIXME: Find out min, max and regulatory power levels */
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302342 params.max_txpow = req->max_txpow;
2343 temp_reg_info_1 &= 0xff00ffff;
2344 temp_reg_info_1 |= ((req->max_txpow&0xff) << 16);
2345
2346 temp_reg_info_2 &= 0xffff00ff;
2347 temp_reg_info_2 |= ((req->max_txpow&0xff)<<8);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002348
2349 /* TODO: Handle regulatory class, max antenna */
2350 if (!isRestart) {
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302351 params.beacon_intval = req->beacon_intval;
2352 params.dtim_period = req->dtim_period;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002353
2354 /* Copy the SSID */
2355 if (req->ssid.length) {
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302356 params.ssid.length = req->ssid.length;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002357 if (req->ssid.length < sizeof(cmd->ssid.ssid))
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302358 temp_ssid_len = req->ssid.length;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002359 else
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302360 temp_ssid_len = sizeof(cmd->ssid.ssid);
2361 qdf_mem_copy(params.ssid.mac_ssid, req->ssid.ssId,
2362 temp_ssid_len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002363 }
2364
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302365 params.hidden_ssid = req->hidden_ssid;
2366 params.pmf_enabled = req->pmf_enabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002367 if (req->hidden_ssid)
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302368 temp_flags |= WMI_UNIFIED_VDEV_START_HIDDEN_SSID;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002369
2370 if (req->pmf_enabled)
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302371 temp_flags |= WMI_UNIFIED_VDEV_START_PMF_ENABLED;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002372 }
2373
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302374 params.num_noa_descriptors = 0;
2375 params.preferred_rx_streams = req->preferred_rx_streams;
2376 params.preferred_tx_streams = req->preferred_tx_streams;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002377
Krishna Kumaar Natarajan0103ef82017-02-17 18:15:56 -08002378 wma_copy_vdev_start_he_ops(&params, req);
2379
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002380 /* Store vdev params in SAP mode which can be used in vdev restart */
2381 if (intr[req->vdev_id].type == WMI_VDEV_TYPE_AP &&
2382 intr[req->vdev_id].sub_type == 0) {
2383 intr[req->vdev_id].vdev_restart_params.vdev_id = req->vdev_id;
2384 intr[req->vdev_id].vdev_restart_params.ssid.ssid_len =
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302385 temp_ssid_len;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302386 qdf_mem_copy(intr[req->vdev_id].vdev_restart_params.ssid.ssid,
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302387 params.ssid.mac_ssid, temp_ssid_len);
2388 intr[req->vdev_id].vdev_restart_params.flags = temp_flags;
2389 intr[req->vdev_id].vdev_restart_params.requestor_id = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002390 intr[req->vdev_id].vdev_restart_params.disable_hw_ack =
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302391 params.dis_hw_ack;
2392 intr[req->vdev_id].vdev_restart_params.chan.mhz =
2393 params.chan_freq;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002394 intr[req->vdev_id].vdev_restart_params.chan.band_center_freq1 =
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302395 params.band_center_freq1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002396 intr[req->vdev_id].vdev_restart_params.chan.band_center_freq2 =
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302397 params.band_center_freq2;
2398 intr[req->vdev_id].vdev_restart_params.chan.info =
2399 temp_chan_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002400 intr[req->vdev_id].vdev_restart_params.chan.reg_info_1 =
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302401 temp_reg_info_1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002402 intr[req->vdev_id].vdev_restart_params.chan.reg_info_2 =
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302403 temp_reg_info_2;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002404 }
2405
2406 if (isRestart) {
2407 /*
2408 * Marking the VDEV UP STATUS to false
2409 * since, VDEV RESTART will do a VDEV DOWN
2410 * in the firmware.
2411 */
Mukul Sharmaf9047232017-03-02 16:58:56 +05302412 wma_vdev_set_mlme_state(wma, params.vdev_id, WLAN_VDEV_S_STOP);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002413 } else {
2414 WMA_LOGD("%s, vdev_id: %d, unpausing tx_ll_queue at VDEV_START",
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302415 __func__, params.vdev_id);
Leo Chang96464902016-10-28 11:10:54 -07002416 cdp_fc_vdev_unpause(cds_get_context(QDF_MODULE_ID_SOC),
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08002417 wma->interfaces[params.vdev_id].handle,
2418 0xffffffff);
Mukul Sharma6411bb82017-03-01 15:57:07 +05302419 wma_vdev_update_pause_bitmap(params.vdev_id, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002420 }
2421
Dustin Brownd5f12942017-03-10 11:06:25 -08002422 return wma_send_vdev_start_to_fw(wma, &params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002423}
2424
2425/**
2426 * wma_peer_assoc_conf_handler() - peer assoc conf handler
2427 * @handle: wma handle
2428 * @cmd_param_info: event buffer
2429 * @len: buffer length
2430 *
2431 * Return: 0 for success or error code
2432 */
2433int wma_peer_assoc_conf_handler(void *handle, uint8_t *cmd_param_info,
2434 uint32_t len)
2435{
2436 tp_wma_handle wma = (tp_wma_handle) handle;
2437 WMI_PEER_ASSOC_CONF_EVENTID_param_tlvs *param_buf;
2438 wmi_peer_assoc_conf_event_fixed_param *event;
2439 struct wma_target_req *req_msg;
2440 uint8_t macaddr[IEEE80211_ADDR_LEN];
2441 int status = 0;
2442
2443 WMA_LOGD(FL("Enter"));
2444 param_buf = (WMI_PEER_ASSOC_CONF_EVENTID_param_tlvs *) cmd_param_info;
2445 if (!param_buf) {
2446 WMA_LOGE("Invalid peer assoc conf event buffer");
2447 return -EINVAL;
2448 }
2449
2450 event = param_buf->fixed_param;
2451 if (!event) {
2452 WMA_LOGE("Invalid peer assoc conf event buffer");
2453 return -EINVAL;
2454 }
2455
2456 WMI_MAC_ADDR_TO_CHAR_ARRAY(&event->peer_macaddr, macaddr);
2457 WMA_LOGD(FL("peer assoc conf for vdev:%d mac=%pM"),
2458 event->vdev_id, macaddr);
2459
2460 req_msg = wma_find_req(wma, event->vdev_id,
2461 WMA_PEER_ASSOC_CNF_START);
2462
2463 if (!req_msg) {
2464 WMA_LOGE(FL("Failed to lookup request message for vdev %d"),
2465 event->vdev_id);
2466 return -EINVAL;
2467 }
2468
Anurag Chouhan210db072016-02-22 18:42:15 +05302469 qdf_mc_timer_stop(&req_msg->event_timeout);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002470
2471 if (req_msg->msg_type == WMA_ADD_STA_REQ) {
2472 tpAddStaParams params = (tpAddStaParams)req_msg->user_data;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002473
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002474 if (!params) {
2475 WMA_LOGE(FL("add STA params is NULL for vdev %d"),
2476 event->vdev_id);
2477 status = -EINVAL;
2478 goto free_req_msg;
2479 }
2480
2481 /* peer assoc conf event means the cmd succeeds */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302482 params->status = QDF_STATUS_SUCCESS;
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08002483 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 -08002484 params->staType, params->smesessionId,
2485 params->assocId, params->bssId, params->staIdx,
2486 params->status);
2487 wma_send_msg(wma, WMA_ADD_STA_RSP, (void *)params, 0);
2488 } else if (req_msg->msg_type == WMA_ADD_BSS_REQ) {
2489 tpAddBssParams params = (tpAddBssParams) req_msg->user_data;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002490
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002491 if (!params) {
2492 WMA_LOGE(FL("add BSS params is NULL for vdev %d"),
2493 event->vdev_id);
2494 status = -EINVAL;
2495 goto free_req_msg;
2496 }
2497
2498 /* peer assoc conf event means the cmd succeeds */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302499 params->status = QDF_STATUS_SUCCESS;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002500 WMA_LOGD(FL("Send ADD BSS RSP: opermode: %d update_bss: %d nw_type: %d bssid: %pM staIdx %d status %d"),
2501 params->operMode,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002502 params->updateBss, params->nwType, params->bssId,
2503 params->staContext.staIdx, params->status);
2504 wma_send_msg(wma, WMA_ADD_BSS_RSP, (void *)params, 0);
2505 } else {
2506 WMA_LOGE(FL("Unhandled request message type: %d"),
2507 req_msg->msg_type);
2508 }
2509
2510free_req_msg:
Anurag Chouhan210db072016-02-22 18:42:15 +05302511 qdf_mc_timer_destroy(&req_msg->event_timeout);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302512 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002513
2514 return status;
2515}
2516
2517/**
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08002518 * wma_vdev_delete_handler() - vdev delete response handler
2519 * @handle: wma handle
2520 * @cmd_param_info: event buffer
2521 * @len: buffer length
2522 *
2523 * Return: 0 for success or error code
2524 */
2525int wma_vdev_delete_handler(void *handle, uint8_t *cmd_param_info,
2526 uint32_t len)
2527{
2528 tp_wma_handle wma = (tp_wma_handle) handle;
2529 WMI_VDEV_DELETE_RESP_EVENTID_param_tlvs *param_buf;
2530 wmi_vdev_delete_cmd_fixed_param *event;
2531 struct wma_target_req *req_msg;
2532 int status = 0;
2533
2534 param_buf = (WMI_VDEV_DELETE_RESP_EVENTID_param_tlvs *)cmd_param_info;
2535 if (!param_buf) {
2536 WMA_LOGE("Invalid vdev delete event buffer");
2537 return -EINVAL;
2538 }
2539
2540 event = (wmi_vdev_delete_cmd_fixed_param *)param_buf->fixed_param;
2541 if (!event) {
2542 WMA_LOGE("Invalid vdev delete event buffer");
2543 return -EINVAL;
2544 }
2545
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07002546 WMA_LOGD("%s Vdev delete resp vdev id %d", __func__, event->vdev_id);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08002547 req_msg = wma_find_vdev_req(wma, event->vdev_id,
2548 WMA_TARGET_REQ_TYPE_VDEV_DEL);
2549 if (!req_msg) {
2550 WMA_LOGD(FL("Vdev delete resp is not handled! vdev id %d"),
2551 event->vdev_id);
2552 return -EINVAL;
2553 }
Anurag Chouhana37b5b72016-02-21 14:53:42 +05302554 qdf_wake_lock_release(&wma->wmi_cmd_rsp_wake_lock,
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08002555 WIFI_POWER_EVENT_WAKELOCK_WMI_CMD_RSP);
Anurag Chouhana37b5b72016-02-21 14:53:42 +05302556 qdf_runtime_pm_allow_suspend(wma->wmi_cmd_rsp_runtime_lock);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08002557 /* Send response to upper layers */
2558 wma_vdev_detach_callback(req_msg->user_data);
Anurag Chouhan210db072016-02-22 18:42:15 +05302559 qdf_mc_timer_stop(&req_msg->event_timeout);
2560 qdf_mc_timer_destroy(&req_msg->event_timeout);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302561 qdf_mem_free(req_msg);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08002562
2563 return status;
2564}
2565
2566/**
2567 * wma_peer_delete_handler() - peer delete response handler
2568 * @handle: wma handle
2569 * @cmd_param_info: event buffer
2570 * @len: buffer length
2571 *
2572 * Return: 0 for success or error code
2573 */
2574int wma_peer_delete_handler(void *handle, uint8_t *cmd_param_info,
2575 uint32_t len)
2576{
2577 tp_wma_handle wma = (tp_wma_handle) handle;
2578 WMI_PEER_DELETE_RESP_EVENTID_param_tlvs *param_buf;
2579 wmi_peer_delete_cmd_fixed_param *event;
2580 struct wma_target_req *req_msg;
2581 tDeleteStaParams *del_sta;
2582 uint8_t macaddr[IEEE80211_ADDR_LEN];
2583 int status = 0;
2584
2585 param_buf = (WMI_PEER_DELETE_RESP_EVENTID_param_tlvs *)cmd_param_info;
2586 if (!param_buf) {
2587 WMA_LOGE("Invalid vdev delete event buffer");
2588 return -EINVAL;
2589 }
2590
2591 event = (wmi_peer_delete_cmd_fixed_param *)param_buf->fixed_param;
2592 if (!event) {
2593 WMA_LOGE("Invalid vdev delete event buffer");
2594 return -EINVAL;
2595 }
2596
2597 WMI_MAC_ADDR_TO_CHAR_ARRAY(&event->peer_macaddr, macaddr);
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07002598 WMA_LOGD(FL("Peer Delete Response, vdev %d Peer %pM"),
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08002599 event->vdev_id, macaddr);
2600 req_msg = wma_find_remove_req_msgtype(wma, event->vdev_id,
2601 WMA_DELETE_STA_REQ);
2602 if (!req_msg) {
2603 WMA_LOGD("Peer Delete response is not handled");
2604 return -EINVAL;
2605 }
2606
Anurag Chouhana37b5b72016-02-21 14:53:42 +05302607 qdf_wake_lock_release(&wma->wmi_cmd_rsp_wake_lock,
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08002608 WIFI_POWER_EVENT_WAKELOCK_WMI_CMD_RSP);
Anurag Chouhana37b5b72016-02-21 14:53:42 +05302609 qdf_runtime_pm_allow_suspend(wma->wmi_cmd_rsp_runtime_lock);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08002610 /* Cleanup timeout handler */
Anurag Chouhan210db072016-02-22 18:42:15 +05302611 qdf_mc_timer_stop(&req_msg->event_timeout);
2612 qdf_mc_timer_destroy(&req_msg->event_timeout);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08002613
2614 if (req_msg->type == WMA_DELETE_STA_RSP_START) {
2615 del_sta = req_msg->user_data;
2616 if (del_sta->respReqd) {
2617 WMA_LOGD(FL("Sending peer del rsp to umac"));
2618 wma_send_msg(wma, WMA_DELETE_STA_RSP,
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302619 (void *)del_sta, QDF_STATUS_SUCCESS);
yeshwanth sriram guntuka945b6212017-03-07 15:56:45 +05302620 } else {
2621 qdf_mem_free(del_sta);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08002622 }
2623 } else if (req_msg->type == WMA_DEL_P2P_SELF_STA_RSP_START) {
2624 struct del_sta_self_rsp_params *data;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002625
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08002626 data = (struct del_sta_self_rsp_params *)req_msg->user_data;
2627 WMA_LOGD(FL("Calling vdev detach handler"));
2628 wma_handle_vdev_detach(wma, data->self_sta_param,
2629 data->generate_rsp);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302630 qdf_mem_free(data);
Sandeep Puligillabbee8172017-04-07 19:26:33 -07002631 } else if (req_msg->type == WMA_SET_LINK_PEER_RSP) {
2632 tpLinkStateParams params =
2633 (tpLinkStateParams) req_msg->user_data;
2634 if (wmi_unified_vdev_down_send(wma->wmi_handle,
2635 req_msg->vdev_id) !=
2636 QDF_STATUS_SUCCESS) {
2637 WMA_LOGE("Failed to send vdev down cmd: vdev %d",
2638 req_msg->vdev_id);
2639 }
2640 wma_send_msg(wma, WMA_SET_LINK_STATE_RSP, (void *)params, 0);
Abhishek Singhe8be9a62017-05-30 12:13:29 +05302641 } else if (req_msg->type == WMA_DELETE_PEER_RSP) {
2642 wma_send_del_bss_response(wma, req_msg, req_msg->vdev_id);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08002643 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302644 qdf_mem_free(req_msg);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08002645 return status;
2646}
2647
Manikandan Mohanb089ed62017-02-13 11:38:14 -08002648static inline bool wma_crash_on_fw_timeout(bool crash_enabled)
2649{
2650 /* Discard FW timeouts and dont crash during SSR */
2651 if (cds_is_driver_recovering())
2652 return false;
2653
Nachiket Kukade8003d252017-03-30 15:55:58 +05302654 if (!cds_is_fw_down())
2655 return false;
2656
Kapil Gupta8c336652017-05-30 16:54:13 +05302657 if (cds_is_driver_unloading())
2658 return false;
2659
Manikandan Mohanb089ed62017-02-13 11:38:14 -08002660 return crash_enabled;
2661}
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08002662
2663/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002664 * wma_hold_req_timer() - wma hold request timeout function
2665 * @data: target request params
2666 *
2667 * Return: none
2668 */
2669void wma_hold_req_timer(void *data)
2670{
2671 tp_wma_handle wma;
2672 struct wma_target_req *tgt_req = (struct wma_target_req *)data;
2673 struct wma_target_req *msg;
2674
Anurag Chouhan6d760662016-02-20 16:05:43 +05302675 wma = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002676 if (NULL == wma) {
2677 WMA_LOGE(FL("Failed to get wma"));
Naveen Rawat0eb3dd02017-04-03 20:18:30 -07002678 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002679 }
2680
2681 WMA_LOGA(FL("request %d is timed out for vdev_id - %d"),
2682 tgt_req->msg_type, tgt_req->vdev_id);
2683 msg = wma_find_req(wma, tgt_req->vdev_id, tgt_req->type);
2684
2685 if (!msg) {
2686 WMA_LOGE(FL("Failed to lookup request message - %d"),
2687 tgt_req->msg_type);
Naveen Rawat0eb3dd02017-04-03 20:18:30 -07002688 /*
2689 * if find request failed, then firmware rsp should have
2690 * consumed the buffer. Do not free.
2691 */
2692 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002693 }
2694
2695 if (tgt_req->msg_type == WMA_ADD_STA_REQ) {
2696 tpAddStaParams params = (tpAddStaParams) tgt_req->user_data;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002697
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302698 params->status = QDF_STATUS_E_TIMEOUT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002699 WMA_LOGA(FL("WMA_ADD_STA_REQ timed out"));
2700 WMA_LOGD(FL("Sending add sta rsp to umac (mac:%pM, status:%d)"),
2701 params->staMac, params->status);
Manikandan Mohanb089ed62017-02-13 11:38:14 -08002702 if (wma_crash_on_fw_timeout(wma->fw_timeout_crash) == true)
2703 QDF_BUG(0);
Sandeep Puligillaafa52892016-10-26 19:03:16 -07002704 else
2705 wma_send_msg(wma, WMA_ADD_STA_RSP, (void *)params, 0);
Krishna Kumaar Natarajanf1d6dee2016-02-11 16:40:43 -08002706 } else if (tgt_req->msg_type == WMA_ADD_BSS_REQ) {
2707 tpAddBssParams params = (tpAddBssParams) tgt_req->user_data;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002708
Krishna Kumaar Natarajanf1d6dee2016-02-11 16:40:43 -08002709 params->status = QDF_STATUS_E_TIMEOUT;
2710 WMA_LOGA(FL("WMA_ADD_BSS_REQ timed out"));
2711 WMA_LOGD(FL("Sending add bss rsp to umac (mac:%pM, status:%d)"),
2712 params->selfMacAddr, params->status);
Manikandan Mohanb089ed62017-02-13 11:38:14 -08002713 if (wma_crash_on_fw_timeout(wma->fw_timeout_crash) == true)
2714 QDF_BUG(0);
Sandeep Puligillaafa52892016-10-26 19:03:16 -07002715 else
2716 wma_send_msg(wma, WMA_ADD_BSS_RSP, (void *)params, 0);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08002717 } else if ((tgt_req->msg_type == WMA_DELETE_STA_REQ) &&
2718 (tgt_req->type == WMA_DELETE_STA_RSP_START)) {
2719 tpDeleteStaParams params =
2720 (tpDeleteStaParams) tgt_req->user_data;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302721 params->status = QDF_STATUS_E_TIMEOUT;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08002722 WMA_LOGE(FL("WMA_DEL_STA_REQ timed out"));
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07002723 WMA_LOGE(FL("Sending del sta rsp to umac (mac:%pM, status:%d)"),
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08002724 params->staMac, params->status);
Sandeep Puligillaafa52892016-10-26 19:03:16 -07002725
Manikandan Mohanb089ed62017-02-13 11:38:14 -08002726 if (wma_crash_on_fw_timeout(wma->fw_timeout_crash) == true) {
2727 QDF_BUG(0);
Sandeep Puligillaafa52892016-10-26 19:03:16 -07002728 } else {
2729 /*
2730 * Assert in development build only.
2731 * Send response in production builds.
2732 */
2733 QDF_ASSERT(0);
2734 wma_send_msg(wma, WMA_DELETE_STA_RSP,
2735 (void *)params, 0);
2736 }
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08002737 } else if ((tgt_req->msg_type == WMA_DELETE_STA_REQ) &&
2738 (tgt_req->type == WMA_DEL_P2P_SELF_STA_RSP_START)) {
Abhishek Singhc614ec42017-04-25 16:17:34 +05302739 struct del_sta_self_rsp_params *del_sta;
2740 del_sta = (struct del_sta_self_rsp_params *)tgt_req->user_data;
2741 del_sta->self_sta_param->status = QDF_STATUS_E_TIMEOUT;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08002742 WMA_LOGA(FL("wma delete sta p2p request timed out"));
Abhishek Singhc614ec42017-04-25 16:17:34 +05302743
2744 if (wma_crash_on_fw_timeout(wma->fw_timeout_crash)) {
2745 QDF_BUG(0);
2746 } else {
2747 if (del_sta->generate_rsp)
2748 wma_send_del_sta_self_resp(
2749 del_sta->self_sta_param);
2750 }
2751 qdf_mem_free(tgt_req->user_data);
Sandeep Puligillabbee8172017-04-07 19:26:33 -07002752 } else if ((tgt_req->msg_type == WMA_DELETE_STA_REQ) &&
2753 (tgt_req->type == WMA_SET_LINK_PEER_RSP)) {
Abhishek Singhc614ec42017-04-25 16:17:34 +05302754 tpLinkStateParams params =
2755 (tpLinkStateParams) tgt_req->user_data;
2756
2757 params->status = false;
Sandeep Puligillabbee8172017-04-07 19:26:33 -07002758 WMA_LOGA(FL("wma delete peer for set link timed out"));
2759 if (wma_crash_on_fw_timeout(wma->fw_timeout_crash) == true)
2760 QDF_BUG(0);
Abhishek Singhc614ec42017-04-25 16:17:34 +05302761 else
2762 wma_send_msg(wma, WMA_SET_LINK_STATE_RSP,
2763 params, 0);
Abhishek Singhe8be9a62017-05-30 12:13:29 +05302764 } else if ((tgt_req->msg_type == WMA_DELETE_STA_REQ) &&
2765 (tgt_req->type == WMA_DELETE_PEER_RSP)) {
Abhishek Singhc614ec42017-04-25 16:17:34 +05302766 tpDeleteBssParams params =
2767 (tpDeleteBssParams) tgt_req->user_data;
2768
2769 params->status = QDF_STATUS_E_TIMEOUT;
2770 WMA_LOGE(FL("wma delete peer for del bss req timed out"));
Abhishek Singhe8be9a62017-05-30 12:13:29 +05302771 if (wma_crash_on_fw_timeout(wma->fw_timeout_crash) == true)
2772 QDF_BUG(0);
Abhishek Singhc614ec42017-04-25 16:17:34 +05302773 else
2774 wma_send_msg(wma, WMA_DELETE_BSS_RSP, params, 0);
Krishna Kumaar Natarajanf1d6dee2016-02-11 16:40:43 -08002775 } else {
2776 WMA_LOGE(FL("Unhandled timeout for msg_type:%d and type:%d"),
2777 tgt_req->msg_type, tgt_req->type);
2778 QDF_BUG(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002779 }
Abhishek Singhc614ec42017-04-25 16:17:34 +05302780 qdf_mem_free(tgt_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002781}
2782
2783/**
2784 * wma_fill_hold_req() - fill wma request
2785 * @wma: wma handle
2786 * @msg_type: message type
2787 * @type: request type
2788 * @params: request params
2789 * @timeout: timeout value
2790 *
2791 * Return: wma_target_req ptr
2792 */
2793struct wma_target_req *wma_fill_hold_req(tp_wma_handle wma,
2794 uint8_t vdev_id,
2795 uint32_t msg_type, uint8_t type,
2796 void *params, uint32_t timeout)
2797{
2798 struct wma_target_req *req;
Anurag Chouhanffb21542016-02-17 14:33:03 +05302799 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002800
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302801 req = qdf_mem_malloc(sizeof(*req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002802 if (!req) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07002803 WMA_LOGE(FL("Failed to allocate memory for msg %d vdev %d"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002804 msg_type, vdev_id);
2805 return NULL;
2806 }
2807
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07002808 WMA_LOGD(FL("vdev_id %d msg %d type %d"), vdev_id, msg_type, type);
Abhishek Singhc614ec42017-04-25 16:17:34 +05302809 qdf_spin_lock_bh(&wma->wma_hold_req_q_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002810 req->vdev_id = vdev_id;
2811 req->msg_type = msg_type;
2812 req->type = type;
2813 req->user_data = params;
Anurag Chouhanffb21542016-02-17 14:33:03 +05302814 status = qdf_list_insert_back(&wma->wma_hold_req_queue, &req->node);
2815 if (QDF_STATUS_SUCCESS != status) {
Anurag Chouhana37b5b72016-02-21 14:53:42 +05302816 qdf_spin_unlock_bh(&wma->wma_hold_req_q_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002817 WMA_LOGE(FL("Failed add request in queue"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302818 qdf_mem_free(req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002819 return NULL;
2820 }
Anurag Chouhana37b5b72016-02-21 14:53:42 +05302821 qdf_spin_unlock_bh(&wma->wma_hold_req_q_lock);
Abhishek Singhc614ec42017-04-25 16:17:34 +05302822 qdf_mc_timer_init(&req->event_timeout, QDF_TIMER_TYPE_SW,
2823 wma_hold_req_timer, req);
2824 qdf_mc_timer_start(&req->event_timeout, timeout);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002825 return req;
2826}
2827
2828/**
2829 * wma_remove_req() - remove request
2830 * @wma: wma handle
2831 * @vdev_id: vdev id
2832 * @type: type
2833 *
2834 * Return: none
2835 */
2836void wma_remove_req(tp_wma_handle wma, uint8_t vdev_id,
2837 uint8_t type)
2838{
2839 struct wma_target_req *req_msg;
2840
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07002841 WMA_LOGD(FL("Remove req for vdev: %d type: %d"), vdev_id, type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002842 req_msg = wma_find_req(wma, vdev_id, type);
2843 if (!req_msg) {
2844 WMA_LOGE(FL("target req not found for vdev: %d type: %d"),
2845 vdev_id, type);
2846 return;
2847 }
2848
Anurag Chouhan210db072016-02-22 18:42:15 +05302849 qdf_mc_timer_stop(&req_msg->event_timeout);
2850 qdf_mc_timer_destroy(&req_msg->event_timeout);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302851 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002852}
2853
2854/**
2855 * wma_vdev_resp_timer() - wma response timeout function
2856 * @data: target request params
2857 *
2858 * Return: none
2859 */
2860void wma_vdev_resp_timer(void *data)
2861{
2862 tp_wma_handle wma;
2863 struct wma_target_req *tgt_req = (struct wma_target_req *)data;
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08002864 struct cdp_pdev *pdev;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002865 struct wma_target_req *msg;
Sandeep Puligilla7da86332016-11-10 16:14:40 -08002866 uint8_t peer_id;
Abhishek Singhc614ec42017-04-25 16:17:34 +05302867 int status;
Sandeep Puligilla7da86332016-11-10 16:14:40 -08002868 void *peer;
Leo Chang96464902016-10-28 11:10:54 -07002869 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002870#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
Anurag Chouhan6d760662016-02-20 16:05:43 +05302871 tpAniSirGlobal mac_ctx = cds_get_context(QDF_MODULE_ID_PE);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002872
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002873 if (NULL == mac_ctx) {
2874 WMA_LOGE("%s: Failed to get mac_ctx", __func__);
Liangwei Dong748cb5d2016-09-29 00:56:40 -04002875 wma_cleanup_target_req_param(tgt_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002876 goto free_tgt_req;
2877 }
2878#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
2879
Anurag Chouhan6d760662016-02-20 16:05:43 +05302880 wma = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002881
2882 if (NULL == wma) {
2883 WMA_LOGE("%s: Failed to get wma", __func__);
Liangwei Dong748cb5d2016-09-29 00:56:40 -04002884 wma_cleanup_target_req_param(tgt_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002885 goto free_tgt_req;
2886 }
2887
Anurag Chouhan6d760662016-02-20 16:05:43 +05302888 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002889
2890 if (NULL == pdev) {
2891 WMA_LOGE("%s: Failed to get pdev", __func__);
Liangwei Dong748cb5d2016-09-29 00:56:40 -04002892 wma_cleanup_target_req_param(tgt_req);
Anurag Chouhan210db072016-02-22 18:42:15 +05302893 qdf_mc_timer_stop(&tgt_req->event_timeout);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002894 goto free_tgt_req;
2895 }
2896
2897 WMA_LOGA("%s: request %d is timed out for vdev_id - %d", __func__,
2898 tgt_req->msg_type, tgt_req->vdev_id);
2899 msg = wma_find_vdev_req(wma, tgt_req->vdev_id, tgt_req->type);
2900
2901 if (!msg) {
2902 WMA_LOGE("%s: Failed to lookup request message - %d",
2903 __func__, tgt_req->msg_type);
Liangwei Dong748cb5d2016-09-29 00:56:40 -04002904 wma_cleanup_target_req_param(tgt_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002905 goto free_tgt_req;
2906 }
2907
2908 if (tgt_req->msg_type == WMA_CHNL_SWITCH_REQ) {
2909 tpSwitchChannelParams params =
2910 (tpSwitchChannelParams) tgt_req->user_data;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302911 params->status = QDF_STATUS_E_TIMEOUT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002912 WMA_LOGA("%s: WMA_SWITCH_CHANNEL_REQ timedout", __func__);
Sandeep Puligillaafa52892016-10-26 19:03:16 -07002913
Nachiket Kukade8003d252017-03-30 15:55:58 +05302914 /*
2915 * Trigger host crash if the flag is set or if the timeout
2916 * is not due to fw down
2917 */
Manikandan Mohanb089ed62017-02-13 11:38:14 -08002918 if (wma_crash_on_fw_timeout(wma->fw_timeout_crash) == true)
2919 QDF_BUG(0);
Sandeep Puligillaafa52892016-10-26 19:03:16 -07002920 else
2921 wma_send_msg(wma, WMA_SWITCH_CHANNEL_RSP,
2922 (void *)params, 0);
Agrawal Ashish7dd7c592016-02-22 14:25:11 +05302923 if (wma->interfaces[tgt_req->vdev_id].is_channel_switch) {
2924 wma->interfaces[tgt_req->vdev_id].is_channel_switch =
2925 false;
2926 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002927 } else if (tgt_req->msg_type == WMA_DELETE_BSS_REQ) {
2928 tpDeleteBssParams params =
2929 (tpDeleteBssParams) tgt_req->user_data;
2930 struct beacon_info *bcn;
2931 struct wma_txrx_node *iface;
2932
Naveen Rawatf2bd42d2017-06-29 14:51:43 -07002933 if (tgt_req->vdev_id >= wma->max_bssid) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002934 WMA_LOGE("%s: Invalid vdev_id %d", __func__,
2935 tgt_req->vdev_id);
Liangwei Dong748cb5d2016-09-29 00:56:40 -04002936 wma_cleanup_target_req_param(tgt_req);
Anurag Chouhan210db072016-02-22 18:42:15 +05302937 qdf_mc_timer_stop(&tgt_req->event_timeout);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002938 goto free_tgt_req;
2939 }
2940
2941 iface = &wma->interfaces[tgt_req->vdev_id];
2942 if (iface->handle == NULL) {
2943 WMA_LOGE("%s vdev id %d is already deleted",
2944 __func__, tgt_req->vdev_id);
Liangwei Dong748cb5d2016-09-29 00:56:40 -04002945 wma_cleanup_target_req_param(tgt_req);
Anurag Chouhan210db072016-02-22 18:42:15 +05302946 qdf_mc_timer_stop(&tgt_req->event_timeout);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002947 goto free_tgt_req;
2948 }
Nachiket Kukade8003d252017-03-30 15:55:58 +05302949 /*
2950 * Trigger host crash if the flag is set or if the timeout
2951 * is not due to fw down
2952 */
Manikandan Mohanb089ed62017-02-13 11:38:14 -08002953 if (wma_crash_on_fw_timeout(wma->fw_timeout_crash) == true) {
2954 QDF_BUG(0);
Prakash Dhavali0b792742016-12-02 17:56:36 -08002955 return;
2956 }
2957
Krishna Kumaar Natarajanf24bfc82017-02-07 11:54:05 -08002958 status = wma_remove_bss_peer(wma, pdev, tgt_req,
2959 tgt_req->vdev_id, params);
2960 if (status != 0)
2961 goto free_tgt_req;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002962
Abhishek Singhe8be9a62017-05-30 12:13:29 +05302963 if (WMI_SERVICE_IS_ENABLED(
2964 wma->wmi_service_bitmap,
2965 WMI_SERVICE_SYNC_DELETE_CMDS))
2966 goto free_tgt_req;
2967
Sandeep Puligilla58c84ef2016-08-21 16:20:33 -07002968 if (wmi_unified_vdev_down_send(wma->wmi_handle,
2969 tgt_req->vdev_id) != QDF_STATUS_SUCCESS) {
2970 WMA_LOGE("Failed to send vdev down cmd: vdev %d",
2971 tgt_req->vdev_id);
2972 } else {
Mukul Sharmaf9047232017-03-02 16:58:56 +05302973 wma_vdev_set_mlme_state(wma, tgt_req->vdev_id,
2974 WLAN_VDEV_S_STOP);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002975#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
Sandeep Puligilla58c84ef2016-08-21 16:20:33 -07002976 if (mac_ctx->sap.sap_channel_avoidance)
2977 wma_find_mcc_ap(wma, tgt_req->vdev_id, false);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002978#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
2979 }
Leo Chang96464902016-10-28 11:10:54 -07002980 cdp_fc_vdev_flush(soc, iface->handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002981 WMA_LOGD("%s, vdev_id: %d, un-pausing tx_ll_queue for WDA_DELETE_BSS_REQ timeout",
2982 __func__, tgt_req->vdev_id);
Leo Chang96464902016-10-28 11:10:54 -07002983 cdp_fc_vdev_unpause(soc, iface->handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002984 OL_TXQ_PAUSE_REASON_VDEV_STOP);
Mukul Sharma6411bb82017-03-01 15:57:07 +05302985 wma_vdev_clear_pause_bit(tgt_req->vdev_id, PAUSE_TYPE_HOST);
Anurag Chouhan8e0ccd32016-02-19 15:30:20 +05302986 qdf_atomic_set(&iface->bss_status, WMA_BSS_STATUS_STOPPED);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002987 WMA_LOGD("%s: (type %d subtype %d) BSS is stopped",
2988 __func__, iface->type, iface->sub_type);
2989
2990 bcn = wma->interfaces[tgt_req->vdev_id].beacon;
2991
2992 if (bcn) {
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002993 WMA_LOGD("%s: Freeing beacon struct %p, template memory %p",
2994 __func__, bcn, bcn->buf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002995 if (bcn->dma_mapped)
Leo Chang96464902016-10-28 11:10:54 -07002996 qdf_nbuf_unmap_single(wma->qdf_dev, bcn->buf,
Anurag Chouhan6d760662016-02-20 16:05:43 +05302997 QDF_DMA_TO_DEVICE);
Nirav Shahcbc6d722016-03-01 16:24:53 +05302998 qdf_nbuf_free(bcn->buf);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302999 qdf_mem_free(bcn);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003000 wma->interfaces[tgt_req->vdev_id].beacon = NULL;
3001 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303002 params->status = QDF_STATUS_E_TIMEOUT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003003 WMA_LOGA("%s: WMA_DELETE_BSS_REQ timedout", __func__);
Prakash Dhavali0b792742016-12-02 17:56:36 -08003004 wma_send_msg(wma, WMA_DELETE_BSS_RSP,
Sandeep Puligillaafa52892016-10-26 19:03:16 -07003005 (void *)params, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003006 if (iface->del_staself_req) {
3007 WMA_LOGA("scheduling defered deletion(vdev id %x)",
3008 tgt_req->vdev_id);
3009 wma_vdev_detach(wma, iface->del_staself_req, 1);
3010 }
3011 } else if (tgt_req->msg_type == WMA_DEL_STA_SELF_REQ) {
3012 struct wma_txrx_node *iface =
3013 (struct wma_txrx_node *)tgt_req->user_data;
3014 struct del_sta_self_params *params =
3015 (struct del_sta_self_params *) iface->del_staself_req;
3016
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003017 if (WMI_SERVICE_IS_ENABLED(wma->wmi_service_bitmap,
3018 WMI_SERVICE_SYNC_DELETE_CMDS)) {
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303019 qdf_wake_lock_release(&wma->wmi_cmd_rsp_wake_lock,
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003020 WIFI_POWER_EVENT_WAKELOCK_WMI_CMD_RSP);
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303021 qdf_runtime_pm_allow_suspend(
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003022 wma->wmi_cmd_rsp_runtime_lock);
3023 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303024 params->status = QDF_STATUS_E_TIMEOUT;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003025
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003026 WMA_LOGA("%s: WMA_DEL_STA_SELF_REQ timedout", __func__);
Abhishek Singhc614ec42017-04-25 16:17:34 +05303027 if (wma_crash_on_fw_timeout(wma->fw_timeout_crash) == true)
Manikandan Mohanb089ed62017-02-13 11:38:14 -08003028 QDF_BUG(0);
Abhishek Singhc614ec42017-04-25 16:17:34 +05303029 else
3030 wma_send_del_sta_self_resp(iface->del_staself_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003031 if (iface->addBssStaContext)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303032 qdf_mem_free(iface->addBssStaContext);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003033 if (iface->staKeyParams)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303034 qdf_mem_free(iface->staKeyParams);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303035 qdf_mem_zero(iface, sizeof(*iface));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003036 } else if (tgt_req->msg_type == WMA_ADD_BSS_REQ) {
3037 tpAddBssParams params = (tpAddBssParams) tgt_req->user_data;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003038
Krishna Kumaar Natarajan06edf7c2016-11-17 12:21:59 -08003039 params->status = QDF_STATUS_E_TIMEOUT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003040 WMA_LOGA("%s: WMA_ADD_BSS_REQ timedout", __func__);
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07003041 WMA_LOGD("%s: bssid %pM vdev_id %d", __func__, params->bssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003042 tgt_req->vdev_id);
Manikandan Mohanb089ed62017-02-13 11:38:14 -08003043 if (wma_crash_on_fw_timeout(wma->fw_timeout_crash) == true) {
3044 QDF_BUG(0);
Sandeep Puligillaafa52892016-10-26 19:03:16 -07003045 } else {
3046 wma_send_msg(wma, WMA_ADD_BSS_RSP, (void *)params, 0);
3047 QDF_ASSERT(0);
3048 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003049 goto free_tgt_req;
Sandeep Puligilla88de6fb2016-09-23 17:08:44 -07003050
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003051 } else if (tgt_req->msg_type == WMA_OCB_SET_CONFIG_CMD) {
3052 struct wma_txrx_node *iface;
3053
3054 WMA_LOGE(FL("Failed to send OCB set config cmd"));
3055 iface = &wma->interfaces[tgt_req->vdev_id];
Mukul Sharmaf9047232017-03-02 16:58:56 +05303056 wma_vdev_set_mlme_state(wma, tgt_req->vdev_id,
3057 WLAN_VDEV_S_STOP);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303058 wma_ocb_set_config_resp(wma, QDF_STATUS_E_TIMEOUT);
Selvaraj, Sridhara0083c42016-06-22 22:15:43 +05303059 } else if (tgt_req->msg_type == WMA_HIDDEN_SSID_VDEV_RESTART) {
3060 WMA_LOGE("Hidden ssid vdev restart Timed Out; vdev_id: %d, type = %d",
3061 tgt_req->vdev_id, tgt_req->type);
Sandeep Puligilla7da86332016-11-10 16:14:40 -08003062 } else if (tgt_req->msg_type == WMA_SET_LINK_STATE) {
3063 tpLinkStateParams params =
3064 (tpLinkStateParams) tgt_req->user_data;
3065
3066 peer = cdp_peer_find_by_addr(soc, pdev, params->bssid, &peer_id);
3067 if (peer) {
3068 WMA_LOGP(FL("Deleting peer %pM vdev id %d"),
3069 params->bssid, tgt_req->vdev_id);
3070 wma_remove_peer(wma, params->bssid, tgt_req->vdev_id,
3071 peer, false);
3072 }
3073 if (wmi_unified_vdev_down_send(wma->wmi_handle,
3074 tgt_req->vdev_id) !=
3075 QDF_STATUS_SUCCESS) {
3076 WMA_LOGE("Failed to send vdev down cmd: vdev %d",
3077 tgt_req->vdev_id);
3078 }
3079 params->status = QDF_STATUS_E_TIMEOUT;
3080 WMA_LOGA("%s: WMA_SET_LINK_STATE timedout vdev %d", __func__,
3081 tgt_req->vdev_id);
3082 wma_send_msg(wma, WMA_SET_LINK_STATE_RSP, (void *)params, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003083 }
3084free_tgt_req:
Anurag Chouhan210db072016-02-22 18:42:15 +05303085 qdf_mc_timer_destroy(&tgt_req->event_timeout);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303086 qdf_mem_free(tgt_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003087}
3088
3089/**
3090 * wma_fill_vdev_req() - fill vdev request
3091 * @wma: wma handle
3092 * @msg_type: message type
3093 * @type: request type
3094 * @params: request params
3095 * @timeout: timeout value
3096 *
3097 * Return: wma_target_req ptr
3098 */
3099struct wma_target_req *wma_fill_vdev_req(tp_wma_handle wma,
3100 uint8_t vdev_id,
3101 uint32_t msg_type, uint8_t type,
3102 void *params, uint32_t timeout)
3103{
3104 struct wma_target_req *req;
Anurag Chouhanffb21542016-02-17 14:33:03 +05303105 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003106
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303107 req = qdf_mem_malloc(sizeof(*req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003108 if (!req) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07003109 WMA_LOGE("%s: Failed to allocate memory for msg %d vdev %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003110 __func__, msg_type, vdev_id);
3111 return NULL;
3112 }
3113
3114 WMA_LOGD("%s: vdev_id %d msg %d", __func__, vdev_id, msg_type);
Abhishek Singhc614ec42017-04-25 16:17:34 +05303115 qdf_spin_lock_bh(&wma->vdev_respq_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003116 req->vdev_id = vdev_id;
3117 req->msg_type = msg_type;
3118 req->type = type;
3119 req->user_data = params;
Anurag Chouhanffb21542016-02-17 14:33:03 +05303120 status = qdf_list_insert_back(&wma->vdev_resp_queue, &req->node);
3121 if (QDF_STATUS_SUCCESS != status) {
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303122 qdf_spin_unlock_bh(&wma->vdev_respq_lock);
Krishna Kumaar Natarajana5c53bd2015-10-27 11:48:27 -07003123 WMA_LOGE(FL("Failed add request in queue for vdev_id %d type %d"),
3124 vdev_id, type);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303125 qdf_mem_free(req);
Krishna Kumaar Natarajana5c53bd2015-10-27 11:48:27 -07003126 return NULL;
3127 }
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303128 qdf_spin_unlock_bh(&wma->vdev_respq_lock);
Abhishek Singhc614ec42017-04-25 16:17:34 +05303129 qdf_mc_timer_init(&req->event_timeout, QDF_TIMER_TYPE_SW,
3130 wma_vdev_resp_timer, req);
3131 qdf_mc_timer_start(&req->event_timeout, timeout);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003132 return req;
3133}
3134
3135/**
3136 * wma_remove_vdev_req() - remove vdev request
3137 * @wma: wma handle
3138 * @vdev_id: vdev id
3139 * @type: type
3140 *
3141 * Return: none
3142 */
3143void wma_remove_vdev_req(tp_wma_handle wma, uint8_t vdev_id,
3144 uint8_t type)
3145{
3146 struct wma_target_req *req_msg;
3147
3148 req_msg = wma_find_vdev_req(wma, vdev_id, type);
3149 if (!req_msg)
3150 return;
3151
Anurag Chouhan210db072016-02-22 18:42:15 +05303152 qdf_mc_timer_stop(&req_msg->event_timeout);
3153 qdf_mc_timer_destroy(&req_msg->event_timeout);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303154 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003155}
3156
3157/**
3158 * wma_vdev_set_bss_params() - BSS set params functions
3159 * @wma: wma handle
3160 * @vdev_id: vdev id
3161 * @beaconInterval: beacon interval
3162 * @dtimPeriod: DTIM period
3163 * @shortSlotTimeSupported: short slot time
3164 * @llbCoexist: llbCoexist
3165 * @maxTxPower: max tx power
3166 *
3167 * Return: none
3168 */
3169static void
3170wma_vdev_set_bss_params(tp_wma_handle wma, int vdev_id,
3171 tSirMacBeaconInterval beaconInterval,
3172 uint8_t dtimPeriod, uint8_t shortSlotTimeSupported,
Amar Singhala297bfa2015-10-15 15:07:29 -07003173 uint8_t llbCoexist, int8_t maxTxPower)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003174{
Govind Singhd76a5b02016-03-08 15:12:14 +05303175 QDF_STATUS ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003176 uint32_t slot_time;
3177 struct wma_txrx_node *intr = wma->interfaces;
3178
3179 /* Beacon Interval setting */
Govind Singhd76a5b02016-03-08 15:12:14 +05303180 ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003181 WMI_VDEV_PARAM_BEACON_INTERVAL,
3182 beaconInterval);
3183
Govind Singhd76a5b02016-03-08 15:12:14 +05303184 if (QDF_IS_STATUS_ERROR(ret))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003185 WMA_LOGE("failed to set WMI_VDEV_PARAM_BEACON_INTERVAL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003186 ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle, vdev_id,
3187 &intr[vdev_id].config.gtx_info);
Govind Singhd76a5b02016-03-08 15:12:14 +05303188 if (QDF_IS_STATUS_ERROR(ret))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003189 WMA_LOGE("failed to set WMI_VDEV_PARAM_DTIM_PERIOD");
Govind Singhd76a5b02016-03-08 15:12:14 +05303190 ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003191 WMI_VDEV_PARAM_DTIM_PERIOD,
3192 dtimPeriod);
Govind Singhd76a5b02016-03-08 15:12:14 +05303193 if (QDF_IS_STATUS_ERROR(ret))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003194 WMA_LOGE("failed to set WMI_VDEV_PARAM_DTIM_PERIOD");
3195
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003196 if (!maxTxPower)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003197 WMA_LOGW("Setting Tx power limit to 0");
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07003198 WMA_LOGD("Set maxTx pwr [WMI_VDEV_PARAM_TX_PWRLIMIT] to %d",
Padma, Santhosh Kumar29df3622016-08-16 19:15:16 +05303199 maxTxPower);
Govind Singhd76a5b02016-03-08 15:12:14 +05303200 ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003201 WMI_VDEV_PARAM_TX_PWRLIMIT,
3202 maxTxPower);
Govind Singhd76a5b02016-03-08 15:12:14 +05303203 if (QDF_IS_STATUS_ERROR(ret))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003204 WMA_LOGE("failed to set WMI_VDEV_PARAM_TX_PWRLIMIT");
3205 else
3206 intr[vdev_id].max_tx_power = maxTxPower;
3207
3208 /* Slot time */
3209 if (shortSlotTimeSupported)
3210 slot_time = WMI_VDEV_SLOT_TIME_SHORT;
3211 else
3212 slot_time = WMI_VDEV_SLOT_TIME_LONG;
3213
Govind Singhd76a5b02016-03-08 15:12:14 +05303214 ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003215 WMI_VDEV_PARAM_SLOT_TIME,
3216 slot_time);
Govind Singhd76a5b02016-03-08 15:12:14 +05303217 if (QDF_IS_STATUS_ERROR(ret))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003218 WMA_LOGE("failed to set WMI_VDEV_PARAM_SLOT_TIME");
3219
3220 /* Initialize protection mode in case of coexistence */
3221 wma_update_protection_mode(wma, vdev_id, llbCoexist);
Krishna Kumaar Natarajan0103ef82017-02-17 18:15:56 -08003222
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003223}
3224
Abhishek Singhcfb44482017-03-10 12:42:37 +05303225#ifdef WLAN_FEATURE_11W
3226static void wma_set_mgmt_frame_protection(tp_wma_handle wma)
3227{
3228 struct pdev_params param = {0};
3229 QDF_STATUS ret;
3230
3231 /*
3232 * when 802.11w PMF is enabled for hw encr/decr
3233 * use hw MFP Qos bits 0x10
3234 */
3235 param.param_id = WMI_PDEV_PARAM_PMF_QOS;
3236 param.param_value = true;
3237 ret = wmi_unified_pdev_param_send(wma->wmi_handle,
3238 &param, WMA_WILDCARD_PDEV_ID);
3239 if (QDF_IS_STATUS_ERROR(ret)) {
3240 WMA_LOGE("%s: Failed to set QOS MFP/PMF (%d)",
3241 __func__, ret);
3242 } else {
3243 WMA_LOGD("%s: QOS MFP/PMF set", __func__);
3244 }
3245}
3246#else
3247static inline void wma_set_mgmt_frame_protection(tp_wma_handle wma)
3248{
3249}
3250#endif /* WLAN_FEATURE_11W */
3251
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003252/**
3253 * wma_add_bss_ap_mode() - process add bss request in ap mode
3254 * @wma: wma handle
3255 * @add_bss: add bss parameters
3256 *
3257 * Return: none
3258 */
3259static void wma_add_bss_ap_mode(tp_wma_handle wma, tpAddBssParams add_bss)
3260{
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003261 struct cdp_pdev *pdev;
3262 struct cdp_vdev *vdev;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003263 struct wma_vdev_start_req req;
Leo Chang96464902016-10-28 11:10:54 -07003264 void *peer;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003265 struct wma_target_req *msg;
3266 uint8_t vdev_id, peer_id;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303267 QDF_STATUS status;
Amar Singhala297bfa2015-10-15 15:07:29 -07003268 int8_t maxTxPower;
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07003269 struct policy_mgr_hw_mode_params hw_mode = {0};
Leo Chang96464902016-10-28 11:10:54 -07003270 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003271
Anurag Chouhan6d760662016-02-20 16:05:43 +05303272 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003273
3274 if (NULL == pdev) {
3275 WMA_LOGE("%s: Failed to get pdev", __func__);
3276 goto send_fail_resp;
3277 }
3278
3279 vdev = wma_find_vdev_by_addr(wma, add_bss->bssId, &vdev_id);
3280 if (!vdev) {
Peng Xu66162de2016-02-11 17:01:20 -08003281 WMA_LOGE("%s: Failed to get vdev handle:"MAC_ADDRESS_STR,
3282 __func__, MAC_ADDR_ARRAY(add_bss->bssId));
3283
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003284 goto send_fail_resp;
3285 }
3286 if (SAP_WPS_DISABLED == add_bss->wps_state)
Mukul Sharma00058692017-01-28 19:04:32 +05303287 pmo_ucfg_disable_wakeup_event(wma->psoc, vdev_id,
3288 (1 << WOW_PROBE_REQ_WPS_IE_EVENT));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003289 wma_set_bss_rate_flags(&wma->interfaces[vdev_id], add_bss);
3290 status = wma_create_peer(wma, pdev, vdev, add_bss->bssId,
3291 WMI_PEER_TYPE_DEFAULT, vdev_id, false);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303292 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003293 WMA_LOGE("%s: Failed to create peer", __func__);
3294 goto send_fail_resp;
3295 }
3296
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003297 peer = cdp_peer_find_by_addr(soc, pdev,
3298 add_bss->bssId, &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003299 if (!peer) {
3300 WMA_LOGE("%s Failed to find peer %pM", __func__,
3301 add_bss->bssId);
3302 goto send_fail_resp;
3303 }
3304 msg = wma_fill_vdev_req(wma, vdev_id, WMA_ADD_BSS_REQ,
3305 WMA_TARGET_REQ_TYPE_VDEV_START, add_bss,
3306 WMA_VDEV_START_REQUEST_TIMEOUT);
3307 if (!msg) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07003308 WMA_LOGE("%s Failed to allocate vdev request vdev_id %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003309 __func__, vdev_id);
3310 goto peer_cleanup;
3311 }
3312
Leo Chang96464902016-10-28 11:10:54 -07003313 add_bss->staContext.staIdx = cdp_peer_get_local_peer_id(soc, peer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003314
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303315 qdf_mem_zero(&req, sizeof(req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003316 req.vdev_id = vdev_id;
3317 req.chan = add_bss->currentOperChannel;
3318 req.chan_width = add_bss->ch_width;
Naveen Rawat64e477e2016-05-20 10:34:56 -07003319
3320 if (add_bss->ch_width == CH_WIDTH_10MHZ)
3321 req.is_half_rate = 1;
3322 else if (add_bss->ch_width == CH_WIDTH_5MHZ)
3323 req.is_quarter_rate = 1;
3324
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003325 req.ch_center_freq_seg0 = add_bss->ch_center_freq_seg0;
3326 req.ch_center_freq_seg1 = add_bss->ch_center_freq_seg1;
3327 req.vht_capable = add_bss->vhtCapable;
Krishna Kumaar Natarajan0103ef82017-02-17 18:15:56 -08003328 wma_update_vdev_he_ops(&req, add_bss);
3329
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003330 req.max_txpow = add_bss->maxTxPower;
3331 maxTxPower = add_bss->maxTxPower;
Abhishek Singhcfb44482017-03-10 12:42:37 +05303332
3333 if (add_bss->rmfEnabled)
3334 wma_set_mgmt_frame_protection(wma);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003335
Krishna Kumaar Natarajanc1ebd992016-11-29 16:20:32 -08003336 req.dot11_mode = add_bss->dot11_mode;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003337 req.beacon_intval = add_bss->beaconInterval;
3338 req.dtim_period = add_bss->dtimPeriod;
3339 req.hidden_ssid = add_bss->bHiddenSSIDEn;
3340 req.is_dfs = add_bss->bSpectrumMgtEnabled;
3341 req.oper_mode = BSS_OPERATIONAL_MODE_AP;
3342 req.ssid.length = add_bss->ssId.length;
Arif Hussain671a1902017-03-17 09:08:32 -07003343 req.cac_duration_ms = add_bss->cac_duration_ms;
3344 req.dfs_regdomain = add_bss->dfs_regdomain;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003345 if (req.ssid.length > 0)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303346 qdf_mem_copy(req.ssid.ssId, add_bss->ssId.ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003347 add_bss->ssId.length);
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07003348 status = policy_mgr_get_current_hw_mode(wma->psoc, &hw_mode);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303349 if (!QDF_IS_STATUS_SUCCESS(status))
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07003350 WMA_LOGE("policy_mgr_get_current_hw_mode failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003351
Paul Zhang42dade02017-05-12 19:20:37 +08003352 if (add_bss->nss == 2) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003353 req.preferred_rx_streams = 2;
3354 req.preferred_tx_streams = 2;
3355 } else {
3356 req.preferred_rx_streams = 1;
3357 req.preferred_tx_streams = 1;
3358 }
3359
3360 status = wma_vdev_start(wma, &req, false);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303361 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003362 wma_remove_vdev_req(wma, vdev_id,
3363 WMA_TARGET_REQ_TYPE_VDEV_START);
3364 goto peer_cleanup;
3365 }
3366
3367 wma_vdev_set_bss_params(wma, vdev_id,
3368 add_bss->beaconInterval, add_bss->dtimPeriod,
3369 add_bss->shortSlotTimeSupported,
3370 add_bss->llbCoexist, maxTxPower);
3371
Krishna Kumaar Natarajan0103ef82017-02-17 18:15:56 -08003372 wma_vdev_set_he_bss_params(wma, vdev_id, &req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003373 return;
3374
3375peer_cleanup:
3376 wma_remove_peer(wma, add_bss->bssId, vdev_id, peer, false);
3377send_fail_resp:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303378 add_bss->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003379 wma_send_msg(wma, WMA_ADD_BSS_RSP, (void *)add_bss, 0);
3380}
3381
3382#ifdef QCA_IBSS_SUPPORT
3383/**
3384 * wma_add_bss_ibss_mode() - process add bss request in IBSS mode
3385 * @wma: wma handle
3386 * @add_bss: add bss parameters
3387 *
3388 * Return: none
3389 */
3390static void wma_add_bss_ibss_mode(tp_wma_handle wma, tpAddBssParams add_bss)
3391{
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003392 struct cdp_pdev *pdev;
3393 struct cdp_vdev *vdev;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003394 struct wma_vdev_start_req req;
Leo Chang96464902016-10-28 11:10:54 -07003395 void *peer = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003396 struct wma_target_req *msg;
3397 uint8_t vdev_id, peer_id;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303398 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003399 tSetBssKeyParams key_info;
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07003400 struct policy_mgr_hw_mode_params hw_mode = {0};
Leo Chang96464902016-10-28 11:10:54 -07003401 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003402
Krunal Soni2c68f232015-10-26 20:52:51 -07003403 vdev = wma_find_vdev_by_addr(wma, add_bss->selfMacAddr, &vdev_id);
3404 if (!vdev) {
3405 WMA_LOGE("%s: vdev not found for vdev id %d.",
3406 __func__, vdev_id);
3407 goto send_fail_resp;
3408 }
3409 WMA_LOGD("%s: add_bss->sessionId = %d", __func__, vdev_id);
Anurag Chouhan6d760662016-02-20 16:05:43 +05303410 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003411
3412 if (NULL == pdev) {
3413 WMA_LOGE("%s: Failed to get pdev", __func__);
3414 goto send_fail_resp;
3415 }
3416 wma_set_bss_rate_flags(&wma->interfaces[vdev_id], add_bss);
3417
Krunal Soni8c37e322016-02-03 16:08:37 -08003418 /* create ibss bss peer */
3419 status = wma_create_peer(wma, pdev, vdev, add_bss->selfMacAddr,
3420 WMI_PEER_TYPE_DEFAULT, vdev_id,
3421 false);
3422 if (status != QDF_STATUS_SUCCESS) {
3423 WMA_LOGE("%s: Failed to create peer", __func__);
3424 goto send_fail_resp;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003425 }
Krunal Soni8c37e322016-02-03 16:08:37 -08003426 WMA_LOGA("IBSS BSS peer created with mac %pM",
3427 add_bss->selfMacAddr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003428
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003429 peer = cdp_peer_find_by_addr(soc, pdev,
3430 add_bss->selfMacAddr, &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003431 if (!peer) {
3432 WMA_LOGE("%s Failed to find peer %pM", __func__,
3433 add_bss->selfMacAddr);
3434 goto send_fail_resp;
3435 }
3436
3437 /* clear leftover ibss keys on bss peer */
3438
3439 WMA_LOGD("%s: ibss bss key clearing", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303440 qdf_mem_set(&key_info, sizeof(key_info), 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003441 key_info.smesessionId = vdev_id;
3442 key_info.numKeys = SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303443 qdf_mem_copy(&wma->ibsskey_info, &key_info, sizeof(tSetBssKeyParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003444
3445 /* start ibss vdev */
3446
3447 add_bss->operMode = BSS_OPERATIONAL_MODE_IBSS;
3448
3449 msg = wma_fill_vdev_req(wma, vdev_id, WMA_ADD_BSS_REQ,
3450 WMA_TARGET_REQ_TYPE_VDEV_START, add_bss,
3451 WMA_VDEV_START_REQUEST_TIMEOUT);
3452 if (!msg) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07003453 WMA_LOGE("%s Failed to allocate vdev request vdev_id %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003454 __func__, vdev_id);
3455 goto peer_cleanup;
3456 }
3457 WMA_LOGD("%s: vdev start request for IBSS enqueued", __func__);
3458
Leo Chang96464902016-10-28 11:10:54 -07003459 add_bss->staContext.staIdx = cdp_peer_get_local_peer_id(soc, peer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003460
3461 /*
3462 * If IBSS Power Save is supported by firmware
3463 * set the IBSS power save params to firmware.
3464 */
3465 if (WMI_SERVICE_IS_ENABLED(wma->wmi_service_bitmap,
3466 WMI_SERVICE_IBSS_PWRSAVE)) {
3467 status = wma_set_ibss_pwrsave_params(wma, vdev_id);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303468 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003469 WMA_LOGE("%s: Failed to Set IBSS Power Save Params to firmware",
3470 __func__);
3471 goto peer_cleanup;
3472 }
3473 }
3474
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303475 qdf_mem_zero(&req, sizeof(req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003476 req.vdev_id = vdev_id;
3477 req.chan = add_bss->currentOperChannel;
3478 req.chan_width = add_bss->ch_width;
3479 req.ch_center_freq_seg0 = add_bss->ch_center_freq_seg0;
3480 req.ch_center_freq_seg1 = add_bss->ch_center_freq_seg1;
3481 req.vht_capable = add_bss->vhtCapable;
3482#if defined WLAN_FEATURE_VOWIF
3483 req.max_txpow = add_bss->maxTxPower;
3484#else
3485 req.max_txpow = 0;
3486#endif /* WLAN_FEATURE_VOWIF */
3487 req.beacon_intval = add_bss->beaconInterval;
3488 req.dtim_period = add_bss->dtimPeriod;
3489 req.hidden_ssid = add_bss->bHiddenSSIDEn;
3490 req.is_dfs = add_bss->bSpectrumMgtEnabled;
3491 req.oper_mode = BSS_OPERATIONAL_MODE_IBSS;
3492 req.ssid.length = add_bss->ssId.length;
3493 if (req.ssid.length > 0)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303494 qdf_mem_copy(req.ssid.ssId, add_bss->ssId.ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003495 add_bss->ssId.length);
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07003496 status = policy_mgr_get_current_hw_mode(wma->psoc, &hw_mode);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303497 if (!QDF_IS_STATUS_SUCCESS(status))
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07003498 WMA_LOGE("policy_mgr_get_current_hw_mode failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003499
Paul Zhang42dade02017-05-12 19:20:37 +08003500 if (add_bss->nss == 2) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003501 req.preferred_rx_streams = 2;
3502 req.preferred_tx_streams = 2;
3503 } else {
3504 req.preferred_rx_streams = 1;
3505 req.preferred_tx_streams = 1;
3506 }
3507
3508 WMA_LOGD("%s: chan %d chan_width %d", __func__, req.chan,
3509 req.chan_width);
3510 WMA_LOGD("%s: ssid = %s", __func__, req.ssid.ssId);
3511
3512 status = wma_vdev_start(wma, &req, false);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303513 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003514 wma_remove_vdev_req(wma, vdev_id,
3515 WMA_TARGET_REQ_TYPE_VDEV_START);
3516 goto peer_cleanup;
3517 }
3518 WMA_LOGD("%s: vdev start request for IBSS sent to target", __func__);
3519
3520 /* Initialize protection mode to no protection */
Govind Singhd76a5b02016-03-08 15:12:14 +05303521 status = wma_vdev_set_param(wma->wmi_handle, vdev_id,
3522 WMI_VDEV_PARAM_PROTECTION_MODE,
3523 IEEE80211_PROT_NONE);
3524 if (QDF_IS_STATUS_ERROR(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003525 WMA_LOGE("Failed to initialize protection mode");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003526
3527 return;
3528
3529peer_cleanup:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003530 if (peer)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003531 wma_remove_peer(wma, add_bss->bssId, vdev_id, peer, false);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003532send_fail_resp:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303533 add_bss->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003534 wma_send_msg(wma, WMA_ADD_BSS_RSP, (void *)add_bss, 0);
3535}
3536#endif /* QCA_IBSS_SUPPORT */
3537
3538/**
3539 * wma_add_bss_sta_mode() - process add bss request in sta mode
3540 * @wma: wma handle
3541 * @add_bss: add bss parameters
3542 *
3543 * Return: none
3544 */
3545static void wma_add_bss_sta_mode(tp_wma_handle wma, tpAddBssParams add_bss)
3546{
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003547 struct cdp_pdev *pdev;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003548 struct wma_vdev_start_req req;
3549 struct wma_target_req *msg;
Leo Chang96464902016-10-28 11:10:54 -07003550 uint8_t vdev_id = 0, peer_id;
3551 void *peer;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303552 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003553 struct wma_txrx_node *iface;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003554 int pps_val = 0;
3555 bool roam_synch_in_progress = false;
Anurag Chouhan6d760662016-02-20 16:05:43 +05303556 tpAniSirGlobal pMac = cds_get_context(QDF_MODULE_ID_PE);
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07003557 struct policy_mgr_hw_mode_params hw_mode = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003558 bool peer_assoc_sent = false;
Leo Chang96464902016-10-28 11:10:54 -07003559 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003560
3561 if (NULL == pMac) {
3562 WMA_LOGE("%s: Unable to get PE context", __func__);
3563 goto send_fail_resp;
3564 }
3565
Anurag Chouhan6d760662016-02-20 16:05:43 +05303566 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003567
3568 if (NULL == pdev) {
3569 WMA_LOGE("%s Failed to get pdev", __func__);
3570 goto send_fail_resp;
3571 }
3572
Leo Chang96464902016-10-28 11:10:54 -07003573 vdev_id = add_bss->staContext.smesessionId;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003574 iface = &wma->interfaces[vdev_id];
3575
3576 wma_set_bss_rate_flags(iface, add_bss);
3577 if (add_bss->operMode) {
3578 /* Save parameters later needed by WMA_ADD_STA_REQ */
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003579 if (iface->addBssStaContext)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303580 qdf_mem_free(iface->addBssStaContext);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303581 iface->addBssStaContext = qdf_mem_malloc(sizeof(tAddStaParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003582 if (!iface->addBssStaContext) {
3583 WMA_LOGE("%s Failed to allocat memory", __func__);
3584 goto send_fail_resp;
3585 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303586 qdf_mem_copy(iface->addBssStaContext, &add_bss->staContext,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003587 sizeof(tAddStaParams));
3588
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003589 if (iface->staKeyParams) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303590 qdf_mem_free(iface->staKeyParams);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003591 iface->staKeyParams = NULL;
3592 }
3593 if (add_bss->extSetStaKeyParamValid) {
3594 iface->staKeyParams =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303595 qdf_mem_malloc(sizeof(tSetStaKeyParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003596 if (!iface->staKeyParams) {
3597 WMA_LOGE("%s Failed to allocat memory",
3598 __func__);
3599 goto send_fail_resp;
3600 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303601 qdf_mem_copy(iface->staKeyParams,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003602 &add_bss->extSetStaKeyParam,
3603 sizeof(tSetStaKeyParams));
3604 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003605 /* Save parameters later needed by WMA_ADD_STA_REQ */
3606 iface->rmfEnabled = add_bss->rmfEnabled;
3607 iface->beaconInterval = add_bss->beaconInterval;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003608 iface->llbCoexist = add_bss->llbCoexist;
3609 iface->shortSlotTimeSupported = add_bss->shortSlotTimeSupported;
3610 iface->nwType = add_bss->nwType;
3611 if (add_bss->nonRoamReassoc) {
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003612 peer = cdp_peer_find_by_addr(soc,
3613 pdev, add_bss->bssId,
3614 &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003615 if (peer) {
3616 add_bss->staContext.staIdx =
Leo Chang96464902016-10-28 11:10:54 -07003617 cdp_peer_get_local_peer_id(soc, peer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003618 goto send_bss_resp;
3619 }
3620 }
3621 if (add_bss->reassocReq) {
3622#if defined(QCA_LL_LEGACY_TX_FLOW_CONTROL) || defined(QCA_LL_TX_FLOW_CONTROL_V2)
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003623 struct cdp_vdev *vdev;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003624#endif
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003625 /* Called in preassoc state. BSSID peer is already
3626 * added by set_linkstate
3627 */
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003628 peer = cdp_peer_find_by_addr(soc,
3629 pdev,
3630 add_bss->bssId,
3631 &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003632 if (!peer) {
3633 WMA_LOGE("%s Failed to find peer %pM", __func__,
3634 add_bss->bssId);
3635 goto send_fail_resp;
3636 }
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08003637 if (wma_is_roam_synch_in_progress(wma, vdev_id)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003638 add_bss->staContext.staIdx =
Leo Chang96464902016-10-28 11:10:54 -07003639 cdp_peer_get_local_peer_id(soc, peer);
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08003640 WMA_LOGD("LFR3:%s: bssid %pM staIdx %d",
3641 __func__, add_bss->bssId,
3642 add_bss->staContext.staIdx);
3643 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003644 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003645 msg = wma_fill_vdev_req(wma, vdev_id, WMA_ADD_BSS_REQ,
3646 WMA_TARGET_REQ_TYPE_VDEV_START,
3647 add_bss,
3648 WMA_VDEV_START_REQUEST_TIMEOUT);
3649 if (!msg) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07003650 WMA_LOGE("%s Failed to allocate vdev request vdev_id %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003651 __func__, vdev_id);
3652 goto peer_cleanup;
3653 }
3654
3655 add_bss->staContext.staIdx =
Leo Chang96464902016-10-28 11:10:54 -07003656 cdp_peer_get_local_peer_id(soc, peer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003657
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303658 qdf_mem_zero(&req, sizeof(req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003659 req.vdev_id = vdev_id;
3660 req.chan = add_bss->currentOperChannel;
3661 req.chan_width = add_bss->ch_width;
Naveen Rawat64e477e2016-05-20 10:34:56 -07003662
3663 if (add_bss->ch_width == CH_WIDTH_10MHZ)
3664 req.is_half_rate = 1;
3665 else if (add_bss->ch_width == CH_WIDTH_5MHZ)
3666 req.is_quarter_rate = 1;
3667
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003668 req.ch_center_freq_seg0 = add_bss->ch_center_freq_seg0;
3669 req.ch_center_freq_seg1 = add_bss->ch_center_freq_seg1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003670 req.max_txpow = add_bss->maxTxPower;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003671 req.beacon_intval = add_bss->beaconInterval;
3672 req.dtim_period = add_bss->dtimPeriod;
3673 req.hidden_ssid = add_bss->bHiddenSSIDEn;
3674 req.is_dfs = add_bss->bSpectrumMgtEnabled;
3675 req.ssid.length = add_bss->ssId.length;
3676 req.oper_mode = BSS_OPERATIONAL_MODE_STA;
3677 if (req.ssid.length > 0)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303678 qdf_mem_copy(req.ssid.ssId, add_bss->ssId.ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003679 add_bss->ssId.length);
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07003680 status = policy_mgr_get_current_hw_mode(wma->psoc,
3681 &hw_mode);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303682 if (!QDF_IS_STATUS_SUCCESS(status))
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07003683 WMA_LOGE("policy_mgr_get_current_hw_mode failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003684
Paul Zhang42dade02017-05-12 19:20:37 +08003685 if (add_bss->nss == 2) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003686 req.preferred_rx_streams = 2;
3687 req.preferred_tx_streams = 2;
3688 } else {
3689 req.preferred_rx_streams = 1;
3690 req.preferred_tx_streams = 1;
3691 }
3692
3693 status = wma_vdev_start(wma, &req, false);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303694 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003695 wma_remove_vdev_req(wma, vdev_id,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003696 WMA_TARGET_REQ_TYPE_VDEV_START);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003697 goto peer_cleanup;
3698 }
3699#if defined(QCA_LL_LEGACY_TX_FLOW_CONTROL) || defined(QCA_LL_TX_FLOW_CONTROL_V2)
3700 vdev = wma_find_vdev_by_id(wma, vdev_id);
3701 if (!vdev) {
3702 WMA_LOGE("%s Invalid txrx vdev", __func__);
3703 goto peer_cleanup;
3704 }
Leo Chang96464902016-10-28 11:10:54 -07003705 cdp_fc_vdev_pause(soc, vdev,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003706 OL_TXQ_PAUSE_REASON_PEER_UNAUTHORIZED);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003707#endif
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003708 /* ADD_BSS_RESP will be deferred to completion of
3709 * VDEV_START
3710 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003711 return;
3712 }
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003713 if (!add_bss->updateBss)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003714 goto send_bss_resp;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003715 /* Update peer state */
3716 if (add_bss->staContext.encryptType == eSIR_ED_NONE) {
3717 WMA_LOGD("%s: Update peer(%pM) state into auth",
3718 __func__, add_bss->bssId);
Leo Chang96464902016-10-28 11:10:54 -07003719 cdp_peer_state_update(soc, pdev, add_bss->bssId,
Dhanashri Atreb08959a2016-03-01 17:28:03 -08003720 OL_TXRX_PEER_STATE_AUTH);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003721 } else {
3722#if defined(QCA_LL_LEGACY_TX_FLOW_CONTROL) || defined(QCA_LL_TX_FLOW_CONTROL_V2)
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003723 struct cdp_vdev *vdev;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003724#endif
3725 WMA_LOGD("%s: Update peer(%pM) state into conn",
3726 __func__, add_bss->bssId);
Leo Chang96464902016-10-28 11:10:54 -07003727 cdp_peer_state_update(soc, pdev, add_bss->bssId,
Dhanashri Atreb08959a2016-03-01 17:28:03 -08003728 OL_TXRX_PEER_STATE_CONN);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003729#if defined(QCA_LL_LEGACY_TX_FLOW_CONTROL) || defined(QCA_LL_TX_FLOW_CONTROL_V2)
Leo Chang96464902016-10-28 11:10:54 -07003730 peer = cdp_peer_find_by_addr(soc, pdev, add_bss->bssId,
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003731 &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003732 if (!peer) {
3733 WMA_LOGE("%s:%d Failed to find peer %pM",
3734 __func__, __LINE__, add_bss->bssId);
3735 goto send_fail_resp;
3736 }
3737
3738 vdev = wma_find_vdev_by_id(wma, vdev_id);
3739 if (!vdev) {
3740 WMA_LOGE("%s Invalid txrx vdev", __func__);
3741 goto peer_cleanup;
3742 }
Leo Chang96464902016-10-28 11:10:54 -07003743 cdp_fc_vdev_pause(soc, vdev,
3744 OL_TXQ_PAUSE_REASON_PEER_UNAUTHORIZED);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003745#endif
3746 }
3747
3748 wmi_unified_send_txbf(wma, &add_bss->staContext);
3749
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003750 pps_val = ((pMac->enable5gEBT << 31) & 0xffff0000) |
3751 (PKT_PWR_SAVE_5G_EBT & 0xffff);
Govind Singhd76a5b02016-03-08 15:12:14 +05303752 status = wma_vdev_set_param(wma->wmi_handle, vdev_id,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003753 WMI_VDEV_PARAM_PACKET_POWERSAVE,
3754 pps_val);
Govind Singhd76a5b02016-03-08 15:12:14 +05303755 if (QDF_IS_STATUS_ERROR(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003756 WMA_LOGE("Failed to send wmi packet power save cmd");
3757 else
Govind Singhd76a5b02016-03-08 15:12:14 +05303758 WMA_LOGD("Sent PKT_PWR_SAVE_5G_EBT cmd to target, val = %x, status = %d",
3759 pps_val, status);
Govind Singhb30d4c02016-03-24 11:01:23 +05303760 wma_send_peer_assoc(wma, add_bss->nwType,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003761 &add_bss->staContext);
3762 peer_assoc_sent = true;
Abhishek Singhcfb44482017-03-10 12:42:37 +05303763
3764 if (add_bss->rmfEnabled)
3765 wma_set_mgmt_frame_protection(wma);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003766
3767 wma_vdev_set_bss_params(wma, add_bss->staContext.smesessionId,
3768 add_bss->beaconInterval,
3769 add_bss->dtimPeriod,
3770 add_bss->shortSlotTimeSupported,
3771 add_bss->llbCoexist,
3772 add_bss->maxTxPower);
3773
3774 /*
3775 * Store the bssid in interface table, bssid will
3776 * be used during group key setting sta mode.
3777 */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303778 qdf_mem_copy(iface->bssid, add_bss->bssId, IEEE80211_ADDR_LEN);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003779
3780 }
3781send_bss_resp:
Manikandan Mohan39accff2017-05-02 16:09:00 -07003782
3783 wma_vdev_set_he_config(wma, vdev_id, add_bss);
Sreelakshmi Konamki0d17c6a2017-06-08 12:58:54 +05303784 if (NULL == cdp_peer_find_by_addr(soc, pdev, add_bss->bssId,
3785 &add_bss->staContext.staIdx))
3786 add_bss->status = QDF_STATUS_E_FAILURE;
3787 else
3788 add_bss->status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003789 add_bss->bssIdx = add_bss->staContext.smesessionId;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303790 qdf_mem_copy(add_bss->staContext.staMac, add_bss->bssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003791 sizeof(add_bss->staContext.staMac));
3792
3793 if (!WMI_SERVICE_IS_ENABLED(wma->wmi_service_bitmap,
3794 WMI_SERVICE_PEER_ASSOC_CONF)) {
3795 WMA_LOGE(FL("WMI_SERVICE_PEER_ASSOC_CONF not enabled"));
3796 goto send_final_rsp;
3797 }
3798
3799 /* In case of reassoc, peer assoc cmd will not be sent */
3800 if (!peer_assoc_sent)
3801 goto send_final_rsp;
3802
3803 msg = wma_fill_hold_req(wma, vdev_id, WMA_ADD_BSS_REQ,
3804 WMA_PEER_ASSOC_CNF_START, add_bss,
3805 WMA_PEER_ASSOC_TIMEOUT);
3806 if (!msg) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07003807 WMA_LOGE(FL("Failed to allocate request for vdev_id %d"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003808 vdev_id);
3809 wma_remove_req(wma, vdev_id, WMA_PEER_ASSOC_CNF_START);
3810 goto peer_cleanup;
3811 }
3812 return;
3813
3814send_final_rsp:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003815 WMA_LOGD("%s: opermode %d update_bss %d nw_type %d bssid %pM staIdx %d status %d",
3816 __func__, add_bss->operMode,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003817 add_bss->updateBss, add_bss->nwType, add_bss->bssId,
3818 add_bss->staContext.staIdx, add_bss->status);
3819 wma_send_msg(wma, WMA_ADD_BSS_RSP, (void *)add_bss, 0);
3820 return;
3821
3822peer_cleanup:
3823 wma_remove_peer(wma, add_bss->bssId, vdev_id, peer,
3824 roam_synch_in_progress);
3825send_fail_resp:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303826 add_bss->status = QDF_STATUS_E_FAILURE;
Sandeep Puligilla2ff3ebe2016-08-31 23:55:07 -07003827 if (!wma_is_roam_synch_in_progress(wma, vdev_id))
3828 wma_send_msg(wma, WMA_ADD_BSS_RSP, (void *)add_bss, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003829}
3830
3831/**
3832 * wma_add_bss() - Add BSS request to fw as per opmode
3833 * @wma: wma handle
3834 * @params: add bss params
3835 *
3836 * Return: none
3837 */
3838void wma_add_bss(tp_wma_handle wma, tpAddBssParams params)
3839{
3840 WMA_LOGD("%s: add_bss_param.halPersona = %d",
3841 __func__, params->halPersona);
3842
3843 switch (params->halPersona) {
3844
Anurag Chouhan6d760662016-02-20 16:05:43 +05303845 case QDF_SAP_MODE:
3846 case QDF_P2P_GO_MODE:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003847 wma_add_bss_ap_mode(wma, params);
3848 break;
3849
3850#ifdef QCA_IBSS_SUPPORT
Anurag Chouhan6d760662016-02-20 16:05:43 +05303851 case QDF_IBSS_MODE:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003852 wma_add_bss_ibss_mode(wma, params);
3853 break;
3854#endif
3855
Deepak Dhamdheree2dd5442016-05-27 15:05:51 -07003856 case QDF_NDI_MODE:
3857 wma_add_bss_ndi_mode(wma, params);
3858 break;
3859
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003860 default:
3861 wma_add_bss_sta_mode(wma, params);
3862 break;
3863 }
3864}
3865
3866/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003867 * wma_add_sta_req_ap_mode() - process add sta request in ap mode
3868 * @wma: wma handle
3869 * @add_sta: add sta params
3870 *
3871 * Return: none
3872 */
3873static void wma_add_sta_req_ap_mode(tp_wma_handle wma, tpAddStaParams add_sta)
3874{
Dhanashri Atreb08959a2016-03-01 17:28:03 -08003875 enum ol_txrx_peer_state state = OL_TXRX_PEER_STATE_CONN;
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003876 struct cdp_pdev *pdev;
3877 struct cdp_vdev *vdev;
Leo Chang96464902016-10-28 11:10:54 -07003878 void *peer;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003879 uint8_t peer_id;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303880 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003881 int32_t ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003882 struct wma_txrx_node *iface = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003883 struct wma_target_req *msg;
3884 bool peer_assoc_cnf = false;
Leo Chang96464902016-10-28 11:10:54 -07003885 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
lifeng13a89d72017-05-10 14:49:29 +08003886 uint32_t mcs_limit, i, j;
3887 uint8_t *rate_pos;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003888
Anurag Chouhan6d760662016-02-20 16:05:43 +05303889 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003890
3891 if (NULL == pdev) {
3892 WMA_LOGE("%s: Failed to find pdev", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303893 add_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003894 goto send_rsp;
3895 }
3896 /* UMAC sends WMA_ADD_STA_REQ msg twice to WMA when the station
3897 * associates. First WMA_ADD_STA_REQ will have staType as
3898 * STA_ENTRY_PEER and second posting will have STA_ENTRY_SELF.
3899 * Peer creation is done in first WMA_ADD_STA_REQ and second
3900 * WMA_ADD_STA_REQ which has STA_ENTRY_SELF is ignored and
3901 * send fake response with success to UMAC. Otherwise UMAC
3902 * will get blocked.
3903 */
3904 if (add_sta->staType != STA_ENTRY_PEER) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303905 add_sta->status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003906 goto send_rsp;
3907 }
3908
3909 vdev = wma_find_vdev_by_id(wma, add_sta->smesessionId);
3910 if (!vdev) {
3911 WMA_LOGE("%s: Failed to find vdev", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303912 add_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003913 goto send_rsp;
3914 }
3915
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07003916 iface = &wma->interfaces[add_sta->smesessionId];
Leo Chang96464902016-10-28 11:10:54 -07003917 peer = cdp_peer_find_by_addr_and_vdev(soc, pdev, vdev,
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003918 add_sta->staMac, &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003919 if (peer) {
3920 wma_remove_peer(wma, add_sta->staMac, add_sta->smesessionId,
3921 peer, false);
3922 WMA_LOGE("%s: Peer already exists, Deleted peer with peer_addr %pM",
3923 __func__, add_sta->staMac);
3924 }
Liangwei Dong7d845112016-09-27 22:24:21 -04003925 /* The code above only checks the peer existence on its own vdev.
3926 * Need to check whether the peer exists on other vDevs because firmware
3927 * can't create the peer if the peer with same MAC address already
3928 * exists on the pDev. As this peer belongs to other vDevs, just return
3929 * here.
3930 */
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003931 peer = cdp_peer_find_by_addr(soc, pdev,
3932 add_sta->staMac, &peer_id);
Liangwei Dong7d845112016-09-27 22:24:21 -04003933 if (peer) {
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003934 WMA_LOGE("%s: My vdev:%p, but Peer exists on other vdev with peer_addr %pM and peer_id %d",
Leo Chang96464902016-10-28 11:10:54 -07003935 __func__, vdev, add_sta->staMac, peer_id);
Liangwei Dong7d845112016-09-27 22:24:21 -04003936 add_sta->status = QDF_STATUS_E_FAILURE;
3937 goto send_rsp;
3938 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003939
3940 status = wma_create_peer(wma, pdev, vdev, add_sta->staMac,
3941 WMI_PEER_TYPE_DEFAULT, add_sta->smesessionId,
3942 false);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303943 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003944 WMA_LOGE("%s: Failed to create peer for %pM",
3945 __func__, add_sta->staMac);
3946 add_sta->status = status;
3947 goto send_rsp;
3948 }
3949
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003950 peer = cdp_peer_find_by_addr_and_vdev(soc, pdev,
3951 vdev,
3952 add_sta->staMac, &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003953 if (!peer) {
3954 WMA_LOGE("%s: Failed to find peer handle using peer mac %pM",
3955 __func__, add_sta->staMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303956 add_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003957 wma_remove_peer(wma, add_sta->staMac, add_sta->smesessionId,
3958 peer, false);
3959 goto send_rsp;
3960 }
3961
3962 wmi_unified_send_txbf(wma, add_sta);
3963
lifeng13a89d72017-05-10 14:49:29 +08003964 /*
3965 * Get MCS limit from ini configure, and map it to rate parameters
3966 * This will limit HT rate upper bound. CFG_CTRL_MASK is used to
3967 * check whether ini config is enabled and CFG_DATA_MASK to get the
3968 * MCS value.
3969 */
3970#define CFG_CTRL_MASK 0xFF00
3971#define CFG_DATA_MASK 0x00FF
3972
3973 if (wlan_cfg_get_int(wma->mac_context, WNI_CFG_SAP_MAX_MCS_DATA,
3974 &mcs_limit) != eSIR_SUCCESS) {
3975 mcs_limit = WNI_CFG_SAP_MAX_MCS_DATA_STADEF;
3976 }
3977
3978 if (mcs_limit & CFG_CTRL_MASK) {
3979 WMA_LOGD("%s: set mcs_limit %x", __func__, mcs_limit);
3980
3981 mcs_limit &= CFG_DATA_MASK;
3982 rate_pos = (u_int8_t *)add_sta->supportedRates.supportedMCSSet;
3983 for (i = 0, j = 0; i < MAX_SUPPORTED_RATES;) {
3984 if (j < mcs_limit / 8) {
3985 rate_pos[j] = 0xff;
3986 j++;
3987 i += 8;
3988 } else if (j < mcs_limit / 8 + 1) {
3989 if (i <= mcs_limit)
3990 rate_pos[i / 8] |= 1 << (i % 8);
3991 else
3992 rate_pos[i / 8] &= ~(1 << (i % 8));
3993 i++;
3994
3995 if (i >= (j + 1) * 8)
3996 j++;
3997 } else {
3998 rate_pos[j++] = 0;
3999 i += 8;
4000 }
4001 }
4002 }
4003
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004004 if (WMI_SERVICE_IS_ENABLED(wma->wmi_service_bitmap,
4005 WMI_SERVICE_PEER_ASSOC_CONF)) {
4006 peer_assoc_cnf = true;
4007 msg = wma_fill_hold_req(wma, add_sta->smesessionId,
4008 WMA_ADD_STA_REQ, WMA_PEER_ASSOC_CNF_START,
4009 add_sta, WMA_PEER_ASSOC_TIMEOUT);
4010 if (!msg) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004011 WMA_LOGE(FL("Failed to alloc request for vdev_id %d"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004012 add_sta->smesessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304013 add_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004014 wma_remove_req(wma, add_sta->smesessionId,
4015 WMA_PEER_ASSOC_CNF_START);
4016 wma_remove_peer(wma, add_sta->staMac,
4017 add_sta->smesessionId, peer, false);
4018 peer_assoc_cnf = false;
4019 goto send_rsp;
4020 }
4021 } else {
4022 WMA_LOGE(FL("WMI_SERVICE_PEER_ASSOC_CONF not enabled"));
4023 }
4024
Govind Singhb30d4c02016-03-24 11:01:23 +05304025 ret = wma_send_peer_assoc(wma, add_sta->nwType, add_sta);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004026 if (ret) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304027 add_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004028 wma_remove_peer(wma, add_sta->staMac, add_sta->smesessionId,
4029 peer, false);
4030 goto send_rsp;
4031 }
4032#ifdef QCA_IBSS_SUPPORT
4033 /*
4034 * In IBSS mode send the peer
4035 * Atim Window length if IBSS
4036 * power save is enabled by the
4037 * firmware.
4038 */
4039 if (wma_is_vdev_in_ibss_mode(wma, add_sta->smesessionId) &&
4040 WMI_SERVICE_IS_ENABLED(wma->wmi_service_bitmap,
4041 WMI_SERVICE_IBSS_PWRSAVE)) {
4042 /*
4043 * If ATIM Window is present in the peer
4044 * beacon then send it to firmware else
4045 * configure Zero ATIM Window length to
4046 * firmware.
4047 */
4048 if (add_sta->atimIePresent) {
4049 wma_set_peer_param(wma, add_sta->staMac,
4050 WMI_PEER_IBSS_ATIM_WINDOW_LENGTH,
4051 add_sta->peerAtimWindowLength,
4052 add_sta->smesessionId);
4053 } else {
4054 wma_set_peer_param(wma, add_sta->staMac,
4055 WMI_PEER_IBSS_ATIM_WINDOW_LENGTH,
4056 0, add_sta->smesessionId);
4057 }
4058 }
4059#endif
4060
Abhishek Singhd7bc9132017-05-17 13:59:04 +05304061 iface->rmfEnabled = add_sta->rmfEnabled;
Abhishek Singhcfb44482017-03-10 12:42:37 +05304062 if (add_sta->rmfEnabled)
4063 wma_set_mgmt_frame_protection(wma);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004064
4065 if (add_sta->uAPSD) {
Govind Singhd76a5b02016-03-08 15:12:14 +05304066 status = wma_set_ap_peer_uapsd(wma, add_sta->smesessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004067 add_sta->staMac,
4068 add_sta->uAPSD, add_sta->maxSPLen);
Govind Singhd76a5b02016-03-08 15:12:14 +05304069 if (QDF_IS_STATUS_ERROR(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004070 WMA_LOGE("Failed to set peer uapsd param for %pM",
4071 add_sta->staMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304072 add_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004073 wma_remove_peer(wma, add_sta->staMac,
4074 add_sta->smesessionId, peer, false);
4075 goto send_rsp;
4076 }
4077 }
4078
4079 WMA_LOGD("%s: Moving peer %pM to state %d",
4080 __func__, add_sta->staMac, state);
Leo Chang96464902016-10-28 11:10:54 -07004081 cdp_peer_state_update(soc, pdev, add_sta->staMac, state);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004082
Leo Chang96464902016-10-28 11:10:54 -07004083 add_sta->staIdx = cdp_peer_get_local_peer_id(soc, peer);
Kanchanapally, Vidyullathae3062812015-05-22 17:28:57 +05304084 add_sta->nss = iface->nss;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304085 add_sta->status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004086send_rsp:
4087 /* Do not send add stat resp when peer assoc cnf is enabled */
4088 if (peer_assoc_cnf) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004089 WMA_LOGD(FL("WMI_SERVICE_PEER_ASSOC_CONF is enabled"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004090 return;
4091 }
4092
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004093 WMA_LOGD(FL("statype %d vdev_id %d aid %d bssid %pM staIdx %d status %d"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004094 add_sta->staType, add_sta->smesessionId,
4095 add_sta->assocId, add_sta->bssId, add_sta->staIdx,
4096 add_sta->status);
4097 wma_send_msg(wma, WMA_ADD_STA_RSP, (void *)add_sta, 0);
4098}
4099
4100#ifdef FEATURE_WLAN_TDLS
Poddar, Siddarth5a91f5b2016-04-28 12:24:10 +05304101
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004102/**
4103 * wma_add_tdls_sta() - process add sta request in TDLS mode
4104 * @wma: wma handle
4105 * @add_sta: add sta params
4106 *
4107 * Return: none
4108 */
4109static void wma_add_tdls_sta(tp_wma_handle wma, tpAddStaParams add_sta)
4110{
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004111 struct cdp_pdev *pdev;
4112 struct cdp_vdev *vdev;
Leo Chang96464902016-10-28 11:10:54 -07004113 void *peer;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004114 uint8_t peer_id;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304115 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004116 int32_t ret;
4117 tTdlsPeerStateParams *peerStateParams;
4118 struct wma_target_req *msg;
4119 bool peer_assoc_cnf = false;
Leo Chang96464902016-10-28 11:10:54 -07004120 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004121
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004122 WMA_LOGD("%s: staType: %d, staIdx: %d, updateSta: %d, bssId: %pM, staMac: %pM",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004123 __func__, add_sta->staType, add_sta->staIdx,
4124 add_sta->updateSta, add_sta->bssId, add_sta->staMac);
4125
Anurag Chouhan6d760662016-02-20 16:05:43 +05304126 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004127
4128 if (NULL == pdev) {
4129 WMA_LOGE("%s: Failed to find pdev", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304130 add_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004131 goto send_rsp;
4132 }
4133
4134 vdev = wma_find_vdev_by_id(wma, add_sta->smesessionId);
4135 if (!vdev) {
4136 WMA_LOGE("%s: Failed to find vdev", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304137 add_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004138 goto send_rsp;
4139 }
4140
Nitesh Shah622d3122017-06-05 17:04:06 +05304141 if (wma_is_roam_synch_in_progress(wma, add_sta->smesessionId)) {
4142 WMA_LOGE("%s: roaming in progress, reject add sta!", __func__);
4143 add_sta->status = QDF_STATUS_E_PERM;
4144 goto send_rsp;
4145 }
4146
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004147 if (0 == add_sta->updateSta) {
4148 /* its a add sta request * */
Poddar, Siddarth5a91f5b2016-04-28 12:24:10 +05304149
Leo Chang96464902016-10-28 11:10:54 -07004150 cdp_peer_copy_mac_addr_raw(soc, vdev, add_sta->bssId);
Poddar, Siddarth5a91f5b2016-04-28 12:24:10 +05304151
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004152 WMA_LOGD("%s: addSta, calling wma_create_peer for %pM, vdev_id %hu",
4153 __func__, add_sta->staMac, add_sta->smesessionId);
4154
4155 status = wma_create_peer(wma, pdev, vdev, add_sta->staMac,
4156 WMI_PEER_TYPE_TDLS,
4157 add_sta->smesessionId, false);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304158 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004159 WMA_LOGE("%s: Failed to create peer for %pM",
4160 __func__, add_sta->staMac);
4161 add_sta->status = status;
4162 goto send_rsp;
4163 }
4164
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004165 peer = cdp_peer_find_by_addr(soc, pdev,
4166 add_sta->staMac,
4167 &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004168 if (!peer) {
4169 WMA_LOGE("%s: addSta, failed to find peer handle for mac %pM",
4170 __func__, add_sta->staMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304171 add_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004172 wma_remove_peer(wma, add_sta->staMac,
4173 add_sta->smesessionId, peer, false);
Poddar, Siddarth5a91f5b2016-04-28 12:24:10 +05304174
Leo Chang96464902016-10-28 11:10:54 -07004175 cdp_peer_add_last_real_peer(soc, pdev, vdev, &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004176 goto send_rsp;
4177 }
4178
Leo Chang96464902016-10-28 11:10:54 -07004179 add_sta->staIdx = cdp_peer_get_local_peer_id(soc, peer);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004180 WMA_LOGD("%s: addSta, after calling cdp_local_peer_id, staIdx: %d, staMac: %pM",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004181 __func__, add_sta->staIdx, add_sta->staMac);
4182
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304183 peerStateParams = qdf_mem_malloc(sizeof(tTdlsPeerStateParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004184 if (!peerStateParams) {
4185 WMA_LOGE
4186 ("%s: Failed to allocate memory for peerStateParams for %pM",
4187 __func__, add_sta->staMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304188 add_sta->status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004189 goto send_rsp;
4190 }
4191
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004192 peerStateParams->peerState = WMI_TDLS_PEER_STATE_PEERING;
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07004193 peerStateParams->vdevId = add_sta->smesessionId;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304194 qdf_mem_copy(&peerStateParams->peerMacAddr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004195 &add_sta->staMac, sizeof(tSirMacAddr));
4196 wma_update_tdls_peer_state(wma, peerStateParams);
4197 } else {
4198 /* its a change sta request * */
4199 peer =
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004200 cdp_peer_find_by_addr(soc, pdev,
4201 add_sta->staMac,
4202 &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004203 if (!peer) {
4204 WMA_LOGE("%s: changeSta,failed to find peer handle for mac %pM",
4205 __func__, add_sta->staMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304206 add_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004207 wma_remove_peer(wma, add_sta->staMac,
4208 add_sta->smesessionId, peer, false);
Poddar, Siddarth5a91f5b2016-04-28 12:24:10 +05304209
Leo Chang96464902016-10-28 11:10:54 -07004210 cdp_peer_add_last_real_peer(soc, pdev, vdev, &peer_id);
Poddar, Siddarth5a91f5b2016-04-28 12:24:10 +05304211
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004212 goto send_rsp;
4213 }
4214
4215 if (WMI_SERVICE_IS_ENABLED(wma->wmi_service_bitmap,
4216 WMI_SERVICE_PEER_ASSOC_CONF)) {
4217 WMA_LOGE(FL("WMI_SERVICE_PEER_ASSOC_CONF is enabled"));
4218 peer_assoc_cnf = true;
4219 msg = wma_fill_hold_req(wma, add_sta->smesessionId,
4220 WMA_ADD_STA_REQ, WMA_PEER_ASSOC_CNF_START,
4221 add_sta, WMA_PEER_ASSOC_TIMEOUT);
4222 if (!msg) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004223 WMA_LOGE(FL("Failed to alloc request for vdev_id %d"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004224 add_sta->smesessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304225 add_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004226 wma_remove_req(wma, add_sta->smesessionId,
4227 WMA_PEER_ASSOC_CNF_START);
4228 wma_remove_peer(wma, add_sta->staMac,
4229 add_sta->smesessionId, peer, false);
4230 peer_assoc_cnf = false;
4231 goto send_rsp;
4232 }
4233 } else {
4234 WMA_LOGE(FL("WMI_SERVICE_PEER_ASSOC_CONF not enabled"));
4235 }
4236
Govind Singhb30d4c02016-03-24 11:01:23 +05304237 WMA_LOGD("%s: changeSta, calling wma_send_peer_assoc",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004238 __func__);
4239
4240 ret =
Govind Singhb30d4c02016-03-24 11:01:23 +05304241 wma_send_peer_assoc(wma, add_sta->nwType, add_sta);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004242 if (ret) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304243 add_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004244 wma_remove_peer(wma, add_sta->staMac,
4245 add_sta->smesessionId, peer, false);
Leo Chang96464902016-10-28 11:10:54 -07004246 cdp_peer_add_last_real_peer(soc, pdev, vdev, &peer_id);
Poddar, Siddarth5a91f5b2016-04-28 12:24:10 +05304247
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004248 goto send_rsp;
4249 }
4250 }
4251
4252send_rsp:
4253 /* Do not send add stat resp when peer assoc cnf is enabled */
4254 if (peer_assoc_cnf)
4255 return;
4256
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004257 WMA_LOGD(FL("statype %d vdev_id %d aid %d bssid %pM staIdx %d status %d"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004258 add_sta->staType, add_sta->smesessionId,
4259 add_sta->assocId, add_sta->bssId, add_sta->staIdx,
4260 add_sta->status);
4261 wma_send_msg(wma, WMA_ADD_STA_RSP, (void *)add_sta, 0);
4262}
4263#endif
4264
4265/**
4266 * wma_add_sta_req_sta_mode() - process add sta request in sta mode
4267 * @wma: wma handle
4268 * @add_sta: add sta params
4269 *
4270 * Return: none
4271 */
4272static void wma_add_sta_req_sta_mode(tp_wma_handle wma, tpAddStaParams params)
4273{
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004274 struct cdp_pdev *pdev;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304275 QDF_STATUS status = QDF_STATUS_SUCCESS;
Leo Chang96464902016-10-28 11:10:54 -07004276 void *peer;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004277 struct wma_txrx_node *iface;
Amar Singhala297bfa2015-10-15 15:07:29 -07004278 int8_t maxTxPower;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004279 int ret = 0;
4280 struct wma_target_req *msg;
4281 bool peer_assoc_cnf = false;
Govind Singhd76a5b02016-03-08 15:12:14 +05304282 struct vdev_up_params param = {0};
Archana Ramachandran20d2e232016-02-11 16:58:40 -08004283 int smps_param;
Leo Chang96464902016-10-28 11:10:54 -07004284 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004285
4286#ifdef FEATURE_WLAN_TDLS
4287 if (STA_ENTRY_TDLS_PEER == params->staType) {
4288 wma_add_tdls_sta(wma, params);
4289 return;
4290 }
4291#endif
4292
Anurag Chouhan6d760662016-02-20 16:05:43 +05304293 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004294
4295 if (NULL == pdev) {
4296 WMA_LOGE("%s: Unable to get pdev", __func__);
4297 goto out;
4298 }
4299
4300 iface = &wma->interfaces[params->smesessionId];
4301 if (params->staType != STA_ENTRY_SELF) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004302 WMA_LOGE("%s: unsupported station type %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004303 __func__, params->staType);
4304 goto out;
4305 }
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004306 peer = cdp_peer_find_by_addr(soc,
4307 pdev,
4308 params->bssId, &params->staIdx);
Sandeep Puligilla2ff3ebe2016-08-31 23:55:07 -07004309 if (peer == NULL) {
4310 WMA_LOGE("%s: Peer is not present vdev id %d for %pM", __func__,
4311 params->smesessionId, params->bssId);
4312 status = QDF_STATUS_E_FAILURE;
4313 goto out;
4314 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004315 if (params->nonRoamReassoc) {
Leo Chang96464902016-10-28 11:10:54 -07004316 cdp_peer_state_update(soc, pdev, params->bssId,
Dhanashri Atreb08959a2016-03-01 17:28:03 -08004317 OL_TXRX_PEER_STATE_AUTH);
Anurag Chouhan8e0ccd32016-02-19 15:30:20 +05304318 qdf_atomic_set(&iface->bss_status, WMA_BSS_STATUS_STARTED);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004319 iface->aid = params->assocId;
4320 goto out;
4321 }
4322
Mukul Sharmaf9047232017-03-02 16:58:56 +05304323 if (wma_is_vdev_up(params->smesessionId)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004324 WMA_LOGE("%s: vdev id %d is already UP for %pM", __func__,
4325 params->smesessionId, params->bssId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304326 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004327 goto out;
4328 }
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07004329
4330 if (peer != NULL &&
Leo Chang96464902016-10-28 11:10:54 -07004331 (cdp_peer_state_get(soc, peer) == OL_TXRX_PEER_STATE_DISC)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004332 /*
4333 * This is the case for reassociation.
4334 * peer state update and peer_assoc is required since it
4335 * was not done by WMA_ADD_BSS_REQ.
4336 */
4337
4338 /* Update peer state */
4339 if (params->encryptType == eSIR_ED_NONE) {
4340 WMA_LOGD("%s: Update peer(%pM) state into auth",
4341 __func__, params->bssId);
Leo Chang96464902016-10-28 11:10:54 -07004342 cdp_peer_state_update(soc, pdev, params->bssId,
Dhanashri Atreb08959a2016-03-01 17:28:03 -08004343 OL_TXRX_PEER_STATE_AUTH);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004344 } else {
4345 WMA_LOGD("%s: Update peer(%pM) state into conn",
4346 __func__, params->bssId);
Leo Chang96464902016-10-28 11:10:54 -07004347 cdp_peer_state_update(soc, pdev, params->bssId,
Dhanashri Atreb08959a2016-03-01 17:28:03 -08004348 OL_TXRX_PEER_STATE_CONN);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004349 }
4350
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08004351 if (wma_is_roam_synch_in_progress(wma, params->smesessionId)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004352 /* iface->nss = params->nss; */
4353 /*In LFR2.0, the following operations are performed as
Govind Singhb30d4c02016-03-24 11:01:23 +05304354 * part of wma_send_peer_assoc. As we are
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004355 * skipping this operation, we are just executing the
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004356 * following which are useful for LFR3.0
4357 */
Leo Chang96464902016-10-28 11:10:54 -07004358 cdp_peer_state_update(soc, pdev, params->bssId,
Dhanashri Atreb08959a2016-03-01 17:28:03 -08004359 OL_TXRX_PEER_STATE_AUTH);
Anurag Chouhan8e0ccd32016-02-19 15:30:20 +05304360 qdf_atomic_set(&iface->bss_status,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004361 WMA_BSS_STATUS_STARTED);
4362 iface->aid = params->assocId;
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004363 WMA_LOGD("LFR3:statype %d vdev %d aid %d bssid %pM",
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08004364 params->staType, params->smesessionId,
4365 params->assocId, params->bssId);
4366 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004367 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004368 wmi_unified_send_txbf(wma, params);
4369
4370 if (WMI_SERVICE_IS_ENABLED(wma->wmi_service_bitmap,
4371 WMI_SERVICE_PEER_ASSOC_CONF)) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004372 WMA_LOGD(FL("WMI_SERVICE_PEER_ASSOC_CONF is enabled"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004373 peer_assoc_cnf = true;
4374 msg = wma_fill_hold_req(wma, params->smesessionId,
4375 WMA_ADD_STA_REQ, WMA_PEER_ASSOC_CNF_START,
4376 params, WMA_PEER_ASSOC_TIMEOUT);
4377 if (!msg) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004378 WMA_LOGD(FL("Failed to alloc request for vdev_id %d"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004379 params->smesessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304380 params->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004381 wma_remove_req(wma, params->smesessionId,
4382 WMA_PEER_ASSOC_CNF_START);
4383 wma_remove_peer(wma, params->staMac,
4384 params->smesessionId, peer, false);
4385 peer_assoc_cnf = false;
4386 goto out;
4387 }
4388 } else {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004389 WMA_LOGD(FL("WMI_SERVICE_PEER_ASSOC_CONF not enabled"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004390 }
4391
Govind Singhb30d4c02016-03-24 11:01:23 +05304392 ret = wma_send_peer_assoc(wma,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004393 iface->nwType,
4394 (tAddStaParams *) iface->addBssStaContext);
4395 if (ret) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304396 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004397 wma_remove_peer(wma, params->bssId,
4398 params->smesessionId, peer, false);
4399 goto out;
4400 }
Abhishek Singhcfb44482017-03-10 12:42:37 +05304401
4402 if (params->rmfEnabled)
4403 wma_set_mgmt_frame_protection(wma);
4404
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004405 /*
4406 * Set the PTK in 11r mode because we already have it.
4407 */
4408 if (iface->staKeyParams) {
4409 wma_set_stakey(wma,
4410 (tpSetStaKeyParams) iface->staKeyParams);
4411 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004412 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004413 maxTxPower = params->maxTxPower;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004414 wma_vdev_set_bss_params(wma, params->smesessionId,
4415 iface->beaconInterval, iface->dtimPeriod,
4416 iface->shortSlotTimeSupported,
4417 iface->llbCoexist, maxTxPower);
4418
4419 params->csaOffloadEnable = 0;
4420 if (WMI_SERVICE_IS_ENABLED(wma->wmi_service_bitmap,
4421 WMI_SERVICE_CSA_OFFLOAD)) {
4422 params->csaOffloadEnable = 1;
Govind Singhd76a5b02016-03-08 15:12:14 +05304423 if (wma_unified_csa_offload_enable(wma, params->smesessionId) <
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004424 0) {
4425 WMA_LOGE("Unable to enable CSA offload for vdev_id:%d",
4426 params->smesessionId);
4427 }
4428 }
4429
4430 if (WMI_SERVICE_IS_ENABLED(wma->wmi_service_bitmap,
4431 WMI_SERVICE_FILTER_IPSEC_NATKEEPALIVE)) {
4432 if (wmi_unified_nat_keepalive_enable(wma, params->smesessionId)
4433 < 0) {
4434 WMA_LOGE("Unable to enable NAT keepalive for vdev_id:%d",
4435 params->smesessionId);
4436 }
4437 }
4438
Govind Singhd76a5b02016-03-08 15:12:14 +05304439 param.vdev_id = params->smesessionId;
4440 param.assoc_id = params->assocId;
4441 if (wmi_unified_vdev_up_send(wma->wmi_handle, params->bssId,
4442 &param) != QDF_STATUS_SUCCESS) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004443 WMA_LOGE("%s: Failed to send vdev up cmd: vdev %d bssid %pM",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004444 __func__, params->smesessionId, params->bssId);
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07004445 policy_mgr_set_do_hw_mode_change_flag(
4446 wma->psoc, false);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304447 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004448 } else {
Hong Shib90718f2017-02-20 00:57:22 +08004449 wma_set_vdev_mgmt_rate(wma, params->smesessionId);
Mukul Sharmaf9047232017-03-02 16:58:56 +05304450 wma_vdev_set_mlme_state(wma, params->smesessionId,
4451 WLAN_VDEV_S_RUN);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004452 }
4453
Anurag Chouhan8e0ccd32016-02-19 15:30:20 +05304454 qdf_atomic_set(&iface->bss_status, WMA_BSS_STATUS_STARTED);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004455 WMA_LOGD("%s: STA mode (type %d subtype %d) BSS is started",
4456 __func__, iface->type, iface->sub_type);
4457 /* Sta is now associated, configure various params */
4458
Archana Ramachandran20d2e232016-02-11 16:58:40 -08004459 /* Send SMPS force command to FW to send the required
4460 * action frame only when SM power save is enbaled in
Archana Ramachandranfec24812016-02-16 16:31:56 -08004461 * from INI. In case dynamic antenna selection, the
4462 * action frames are sent by the chain mask manager
Archana Ramachandran20d2e232016-02-11 16:58:40 -08004463 * In addition to the action frames, The SM power save is
4464 * published in the assoc request HT SMPS IE for both cases.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004465 */
Archana Ramachandranfec24812016-02-16 16:31:56 -08004466 if ((params->enableHtSmps) && (params->send_smps_action)) {
Archana Ramachandran20d2e232016-02-11 16:58:40 -08004467 smps_param = wma_smps_mode_to_force_mode_param(
4468 params->htSmpsconfig);
4469 if (smps_param >= 0) {
Archana Ramachandranfec24812016-02-16 16:31:56 -08004470 WMA_LOGD("%s: Send SMPS force mode: %d",
Archana Ramachandran20d2e232016-02-11 16:58:40 -08004471 __func__, params->htSmpsconfig);
4472 wma_set_mimops(wma, params->smesessionId,
4473 smps_param);
4474 }
4475 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004476
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004477 /* Partial AID match power save, enable when SU bformee */
4478 if (params->enableVhtpAid && params->vhtTxBFCapable)
4479 wma_set_ppsconfig(params->smesessionId,
4480 WMA_VHT_PPS_PAID_MATCH, 1);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004481
4482 /* Enable AMPDU power save, if htCapable/vhtCapable */
4483 if (params->enableAmpduPs && (params->htCapable || params->vhtCapable))
4484 wma_set_ppsconfig(params->smesessionId,
4485 WMA_VHT_PPS_DELIM_CRC_FAIL, 1);
4486 iface->aid = params->assocId;
Kanchanapally, Vidyullathae3062812015-05-22 17:28:57 +05304487 params->nss = iface->nss;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004488out:
4489 /* Do not send add stat resp when peer assoc cnf is enabled */
4490 if (peer_assoc_cnf)
4491 return;
4492
4493 params->status = status;
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004494 WMA_LOGD(FL("statype %d vdev_id %d aid %d bssid %pM staIdx %d status %d"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004495 params->staType, params->smesessionId,
4496 params->assocId, params->bssId, params->staIdx,
4497 params->status);
Sandeep Puligilla2ff3ebe2016-08-31 23:55:07 -07004498 /* Don't send a response during roam sync operation */
4499 if (!wma_is_roam_synch_in_progress(wma, params->smesessionId))
4500 wma_send_msg(wma, WMA_ADD_STA_RSP, (void *)params, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004501}
4502
4503/**
4504 * wma_delete_sta_req_ap_mode() - proces delete sta request from UMAC in AP mode
4505 * @wma: wma handle
4506 * @del_sta: delete sta params
4507 *
4508 * Return: none
4509 */
4510static void wma_delete_sta_req_ap_mode(tp_wma_handle wma,
4511 tpDeleteStaParams del_sta)
4512{
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004513 struct cdp_pdev *pdev;
Leo Chang96464902016-10-28 11:10:54 -07004514 void *peer;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08004515 struct wma_target_req *msg;
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07004516 uint8_t *peer_mac_addr;
Leo Chang96464902016-10-28 11:10:54 -07004517 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004518
Anurag Chouhan6d760662016-02-20 16:05:43 +05304519 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004520
4521 if (NULL == pdev) {
4522 WMA_LOGE("%s: Failed to get pdev", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304523 del_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004524 goto send_del_rsp;
4525 }
4526
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004527 peer = cdp_peer_find_by_local_id(soc,
4528 pdev, del_sta->staIdx);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004529 if (!peer) {
4530 WMA_LOGE("%s: Failed to get peer handle using peer id %d",
4531 __func__, del_sta->staIdx);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304532 del_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004533 goto send_del_rsp;
4534 }
Leo Chang96464902016-10-28 11:10:54 -07004535 peer_mac_addr = cdp_peer_get_peer_mac_addr(soc, peer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004536
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07004537 wma_remove_peer(wma, peer_mac_addr, del_sta->smesessionId, peer,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004538 false);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304539 del_sta->status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004540
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08004541 if (WMI_SERVICE_IS_ENABLED(wma->wmi_service_bitmap,
4542 WMI_SERVICE_SYNC_DELETE_CMDS)) {
4543 msg = wma_fill_hold_req(wma, del_sta->smesessionId,
4544 WMA_DELETE_STA_REQ,
4545 WMA_DELETE_STA_RSP_START, del_sta,
4546 WMA_DELETE_STA_TIMEOUT);
4547 if (!msg) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004548 WMA_LOGE(FL("Failed to allocate request. vdev_id %d"),
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08004549 del_sta->smesessionId);
4550 wma_remove_req(wma, del_sta->smesessionId,
4551 WMA_DELETE_STA_RSP_START);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304552 del_sta->status = QDF_STATUS_E_NOMEM;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08004553 goto send_del_rsp;
4554 }
4555 /*
4556 * Acquire wake lock and bus lock till
4557 * firmware sends the response
4558 */
Anurag Chouhan01cfa4e2016-09-04 15:10:49 +05304559 cds_host_diag_log_work(&wma->wmi_cmd_rsp_wake_lock,
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08004560 WMA_FW_RSP_EVENT_WAKE_LOCK_DURATION,
4561 WIFI_POWER_EVENT_WAKELOCK_WMI_CMD_RSP);
Anurag Chouhan01cfa4e2016-09-04 15:10:49 +05304562 qdf_wake_lock_timeout_acquire(&wma->wmi_cmd_rsp_wake_lock,
4563 WMA_FW_RSP_EVENT_WAKE_LOCK_DURATION);
Anurag Chouhana37b5b72016-02-21 14:53:42 +05304564 qdf_runtime_pm_prevent_suspend(wma->wmi_cmd_rsp_runtime_lock);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08004565 return;
4566 }
4567
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004568send_del_rsp:
4569 if (del_sta->respReqd) {
4570 WMA_LOGD("%s: Sending del rsp to umac (status: %d)",
4571 __func__, del_sta->status);
4572 wma_send_msg(wma, WMA_DELETE_STA_RSP, (void *)del_sta, 0);
4573 }
4574}
4575
4576#ifdef FEATURE_WLAN_TDLS
4577/**
4578 * wma_del_tdls_sta() - proces delete sta request from UMAC in TDLS
4579 * @wma: wma handle
4580 * @del_sta: delete sta params
4581 *
4582 * Return: none
4583 */
4584static void wma_del_tdls_sta(tp_wma_handle wma, tpDeleteStaParams del_sta)
4585{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004586 tTdlsPeerStateParams *peerStateParams;
Padma, Santhosh Kumar4eb79082017-02-24 16:00:20 +05304587 struct wma_target_req *msg;
4588 int status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004589
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304590 peerStateParams = qdf_mem_malloc(sizeof(tTdlsPeerStateParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004591 if (!peerStateParams) {
4592 WMA_LOGE("%s: Failed to allocate memory for peerStateParams for: %pM",
4593 __func__, del_sta->staMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304594 del_sta->status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004595 goto send_del_rsp;
4596 }
4597
Nitesh Shah622d3122017-06-05 17:04:06 +05304598 if (wma_is_roam_synch_in_progress(wma, del_sta->smesessionId)) {
4599 WMA_LOGE("%s: roaming in progress, reject del sta!", __func__);
4600 del_sta->status = QDF_STATUS_E_PERM;
4601 goto send_del_rsp;
4602 }
4603
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004604 peerStateParams->peerState = WMA_TDLS_PEER_STATE_TEARDOWN;
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07004605 peerStateParams->vdevId = del_sta->smesessionId;
Padma, Santhosh Kumar4eb79082017-02-24 16:00:20 +05304606 peerStateParams->resp_reqd = del_sta->respReqd;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304607 qdf_mem_copy(&peerStateParams->peerMacAddr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004608 &del_sta->staMac, sizeof(tSirMacAddr));
4609
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004610 WMA_LOGD("%s: sending tdls_peer_state for peer mac: %pM, peerState: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004611 __func__, peerStateParams->peerMacAddr,
4612 peerStateParams->peerState);
4613
Padma, Santhosh Kumar4eb79082017-02-24 16:00:20 +05304614 status = wma_update_tdls_peer_state(wma, peerStateParams);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004615
Padma, Santhosh Kumar4eb79082017-02-24 16:00:20 +05304616 if (status < 0) {
4617 WMA_LOGE("%s: wma_update_tdls_peer_state returned failure",
4618 __func__);
4619 goto send_del_rsp;
4620 }
4621
4622 if (del_sta->respReqd &&
4623 WMI_SERVICE_IS_ENABLED(wma->wmi_service_bitmap,
4624 WMI_SERVICE_SYNC_DELETE_CMDS)) {
4625 del_sta->status = QDF_STATUS_SUCCESS;
4626 msg = wma_fill_hold_req(wma,
4627 del_sta->smesessionId,
4628 WMA_DELETE_STA_REQ,
4629 WMA_DELETE_STA_RSP_START, del_sta,
4630 WMA_DELETE_STA_TIMEOUT);
4631 if (!msg) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004632 WMA_LOGE(FL("Failed to allocate vdev_id %d"),
Padma, Santhosh Kumar4eb79082017-02-24 16:00:20 +05304633 peerStateParams->vdevId);
4634 wma_remove_req(wma,
4635 peerStateParams->vdevId,
4636 WMA_DELETE_STA_RSP_START);
4637 del_sta->status = QDF_STATUS_E_NOMEM;
4638 goto send_del_rsp;
4639 }
4640 /*
4641 * Acquire wake lock and bus lock till
4642 * firmware sends the response
4643 */
4644 cds_host_diag_log_work(&wma->
4645 wmi_cmd_rsp_wake_lock,
4646 WMA_FW_RSP_EVENT_WAKE_LOCK_DURATION,
4647 WIFI_POWER_EVENT_WAKELOCK_WMI_CMD_RSP);
4648 qdf_wake_lock_timeout_acquire(&wma->
4649 wmi_cmd_rsp_wake_lock,
4650 WMA_FW_RSP_EVENT_WAKE_LOCK_DURATION);
4651 qdf_runtime_pm_prevent_suspend(wma->
4652 wmi_cmd_rsp_runtime_lock);
4653 }
4654
4655 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004656
4657send_del_rsp:
4658 if (del_sta->respReqd) {
4659 WMA_LOGD("%s: Sending del rsp to umac (status: %d)",
4660 __func__, del_sta->status);
4661 wma_send_msg(wma, WMA_DELETE_STA_RSP, (void *)del_sta, 0);
4662 }
4663}
4664#endif
4665
4666/**
4667 * wma_delete_sta_req_sta_mode() - proces delete sta request from UMAC
4668 * @wma: wma handle
4669 * @params: delete sta params
4670 *
4671 * Return: none
4672 */
4673static void wma_delete_sta_req_sta_mode(tp_wma_handle wma,
4674 tpDeleteStaParams params)
4675{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304676 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004677 struct wma_txrx_node *iface;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004678
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004679 iface = &wma->interfaces[params->smesessionId];
4680 iface->uapsd_cached_val = 0;
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08004681 if (wma_is_roam_synch_in_progress(wma, params->smesessionId))
4682 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004683#ifdef FEATURE_WLAN_TDLS
4684 if (STA_ENTRY_TDLS_PEER == params->staType) {
4685 wma_del_tdls_sta(wma, params);
4686 return;
4687 }
4688#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004689 params->status = status;
4690 if (params->respReqd) {
4691 WMA_LOGD("%s: vdev_id %d status %d", __func__,
4692 params->smesessionId, status);
4693 wma_send_msg(wma, WMA_DELETE_STA_RSP, (void *)params, 0);
4694 }
4695}
4696
4697/**
4698 * wma_add_sta() - process add sta request as per opmode
4699 * @wma: wma handle
4700 * @add_Sta: add sta params
4701 *
4702 * Return: none
4703 */
4704void wma_add_sta(tp_wma_handle wma, tpAddStaParams add_sta)
4705{
4706 uint8_t oper_mode = BSS_OPERATIONAL_MODE_STA;
4707
4708 WMA_LOGD("%s: add_sta->sessionId = %d.", __func__,
4709 add_sta->smesessionId);
4710 WMA_LOGD("%s: add_sta->bssId = %x:%x:%x:%x:%x:%x", __func__,
4711 add_sta->bssId[0], add_sta->bssId[1], add_sta->bssId[2],
4712 add_sta->bssId[3], add_sta->bssId[4], add_sta->bssId[5]);
4713
4714 if (wma_is_vdev_in_ap_mode(wma, add_sta->smesessionId))
4715 oper_mode = BSS_OPERATIONAL_MODE_AP;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004716 else if (wma_is_vdev_in_ibss_mode(wma, add_sta->smesessionId))
4717 oper_mode = BSS_OPERATIONAL_MODE_IBSS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004718
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -07004719 if (WMA_IS_VDEV_IN_NDI_MODE(wma->interfaces, add_sta->smesessionId))
4720 oper_mode = BSS_OPERATIONAL_MODE_NDI;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004721 switch (oper_mode) {
4722 case BSS_OPERATIONAL_MODE_STA:
4723 wma_add_sta_req_sta_mode(wma, add_sta);
4724 break;
4725
Houston Hoffman79b4af22015-10-06 12:01:08 -07004726 /* IBSS should share the same code as AP mode */
4727 case BSS_OPERATIONAL_MODE_IBSS:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004728 case BSS_OPERATIONAL_MODE_AP:
Houston Hoffmanf09b50d2016-07-29 15:56:01 -07004729 htc_vote_link_up(wma->htc_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004730 wma_add_sta_req_ap_mode(wma, add_sta);
4731 break;
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -07004732 case BSS_OPERATIONAL_MODE_NDI:
4733 wma_add_sta_ndi_mode(wma, add_sta);
4734 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004735 }
4736
4737#ifdef QCA_IBSS_SUPPORT
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004738 /* adjust heart beat thresold timer value for detecting ibss peer
4739 * departure
4740 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004741 if (oper_mode == BSS_OPERATIONAL_MODE_IBSS)
4742 wma_adjust_ibss_heart_beat_timer(wma, add_sta->smesessionId, 1);
4743#endif
4744
4745}
4746
4747/**
4748 * wma_delete_sta() - process del sta request as per opmode
4749 * @wma: wma handle
4750 * @del_sta: delete sta params
4751 *
4752 * Return: none
4753 */
4754void wma_delete_sta(tp_wma_handle wma, tpDeleteStaParams del_sta)
4755{
4756 uint8_t oper_mode = BSS_OPERATIONAL_MODE_STA;
4757 uint8_t smesession_id = del_sta->smesessionId;
4758 bool rsp_requested = del_sta->respReqd;
4759
4760 if (wma_is_vdev_in_ap_mode(wma, smesession_id))
4761 oper_mode = BSS_OPERATIONAL_MODE_AP;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004762 if (wma_is_vdev_in_ibss_mode(wma, smesession_id)) {
4763 oper_mode = BSS_OPERATIONAL_MODE_IBSS;
4764 WMA_LOGD("%s: to delete sta for IBSS mode", __func__);
4765 }
Deepak Dhamdherea6d2f4c2016-06-04 00:24:52 -07004766 if (del_sta->staType == STA_ENTRY_NDI_PEER)
4767 oper_mode = BSS_OPERATIONAL_MODE_NDI;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004768
Padma, Santhosh Kumarcd35f532016-12-27 12:07:39 +05304769 WMA_LOGD(FL("oper_mode %d"), oper_mode);
4770
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004771 switch (oper_mode) {
4772 case BSS_OPERATIONAL_MODE_STA:
4773 wma_delete_sta_req_sta_mode(wma, del_sta);
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08004774 if (wma_is_roam_synch_in_progress(wma, smesession_id))
4775 return;
Krishna Kumaar Natarajan70133f02016-02-03 14:35:48 -08004776 if (!rsp_requested) {
4777 WMA_LOGD(FL("vdev_id %d status %d"),
4778 del_sta->smesessionId, del_sta->status);
4779 qdf_mem_free(del_sta);
4780 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004781 break;
4782
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004783 case BSS_OPERATIONAL_MODE_IBSS: /* IBSS shares AP code */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004784 case BSS_OPERATIONAL_MODE_AP:
Houston Hoffmanf09b50d2016-07-29 15:56:01 -07004785 htc_vote_link_down(wma->htc_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004786 wma_delete_sta_req_ap_mode(wma, del_sta);
Krishna Kumaar Natarajan70133f02016-02-03 14:35:48 -08004787 /* free the memory here only if sync feature is not enabled */
4788 if (!rsp_requested &&
4789 !WMI_SERVICE_IS_ENABLED(wma->wmi_service_bitmap,
4790 WMI_SERVICE_SYNC_DELETE_CMDS)) {
4791 WMA_LOGD(FL("vdev_id %d status %d"),
4792 del_sta->smesessionId, del_sta->status);
4793 qdf_mem_free(del_sta);
4794 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004795 break;
Deepak Dhamdherea6d2f4c2016-06-04 00:24:52 -07004796 case BSS_OPERATIONAL_MODE_NDI:
4797 wma_delete_sta_req_ndi_mode(wma, del_sta);
4798 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004799 }
4800
4801#ifdef QCA_IBSS_SUPPORT
4802 /* adjust heart beat thresold timer value for
4803 * detecting ibss peer departure
4804 */
4805 if (oper_mode == BSS_OPERATIONAL_MODE_IBSS)
4806 wma_adjust_ibss_heart_beat_timer(wma, smesession_id, -1);
4807#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004808}
4809
4810/**
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07004811 * wma_delete_bss_ho_fail() - process delete bss request for handoff failure
4812 * @wma: wma handle
4813 * @params: del bss parameters
4814 *
4815 * Delete BSS in case of ROAM_HO_FAIL processing is handled separately in
4816 * this routine. It needs to be done without sending any commands to firmware
4817 * because firmware has already stopped and deleted peer and vdev is down.
4818 * Relevent logic is aggregated from other routines. It changes the host
4819 * data structures without sending VDEV_STOP, PEER_FLUSH_TIDS, PEER_DELETE
4820 * and VDEV_DOWN commands to firmware.
4821 *
4822 * Return: none
4823 */
4824void wma_delete_bss_ho_fail(tp_wma_handle wma, tpDeleteBssParams params)
4825{
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004826 struct cdp_pdev *pdev;
Leo Chang96464902016-10-28 11:10:54 -07004827 void *peer = NULL;
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07004828 QDF_STATUS status = QDF_STATUS_SUCCESS;
4829 uint8_t peer_id;
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004830 struct cdp_vdev *txrx_vdev = NULL;
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07004831 struct wma_txrx_node *iface;
Leo Chang96464902016-10-28 11:10:54 -07004832 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07004833
4834 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
4835
4836 if (NULL == pdev) {
4837 WMA_LOGE("%s:Unable to get TXRX context", __func__);
4838 goto fail_del_bss_ho_fail;
4839 }
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07004840
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004841 peer = cdp_peer_find_by_addr(soc,
4842 pdev,
4843 params->bssid, &peer_id);
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07004844 if (!peer) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004845 WMA_LOGE("%s: Failed to find peer %pM", __func__,
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07004846 params->bssid);
4847 status = QDF_STATUS_E_FAILURE;
4848 goto fail_del_bss_ho_fail;
4849 }
4850
4851 iface = &wma->interfaces[params->smesessionId];
4852 if (!iface || !iface->handle) {
4853 WMA_LOGE("%s vdev id %d is already deleted",
4854 __func__, params->smesessionId);
4855 goto fail_del_bss_ho_fail;
4856 }
4857 qdf_mem_zero(iface->bssid, IEEE80211_ADDR_LEN);
4858
4859 txrx_vdev = wma_find_vdev_by_id(wma, params->smesessionId);
4860 if (!txrx_vdev) {
4861 WMA_LOGE("%s:Invalid vdev handle", __func__);
4862 status = QDF_STATUS_E_FAILURE;
4863 goto fail_del_bss_ho_fail;
4864 }
4865
4866 /* Free the allocated stats response buffer for the the session */
4867 if (iface->stats_rsp) {
4868 qdf_mem_free(iface->stats_rsp);
4869 iface->stats_rsp = NULL;
4870 }
4871
4872 if (iface->psnr_req) {
4873 qdf_mem_free(iface->psnr_req);
4874 iface->psnr_req = NULL;
4875 }
4876 qdf_mem_zero(&iface->ns_offload_req,
4877 sizeof(iface->ns_offload_req));
4878 qdf_mem_zero(&iface->arp_offload_req,
4879 sizeof(iface->arp_offload_req));
4880
4881 WMA_LOGD("%s, vdev_id: %d, pausing tx_ll_queue for VDEV_STOP (del_bss)",
4882 __func__, params->smesessionId);
Leo Chang96464902016-10-28 11:10:54 -07004883 cdp_fc_vdev_pause(soc, iface->handle,
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07004884 OL_TXQ_PAUSE_REASON_VDEV_STOP);
Mukul Sharma6411bb82017-03-01 15:57:07 +05304885 wma_vdev_set_pause_bit(params->smesessionId, PAUSE_TYPE_HOST);
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07004886
Leo Chang96464902016-10-28 11:10:54 -07004887 cdp_fc_vdev_flush(soc, iface->handle);
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07004888 WMA_LOGD("%s, vdev_id: %d, un-pausing tx_ll_queue for VDEV_STOP rsp",
4889 __func__, params->smesessionId);
Leo Chang96464902016-10-28 11:10:54 -07004890 cdp_fc_vdev_unpause(soc, iface->handle,
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07004891 OL_TXQ_PAUSE_REASON_VDEV_STOP);
Mukul Sharma6411bb82017-03-01 15:57:07 +05304892 wma_vdev_clear_pause_bit(params->smesessionId, PAUSE_TYPE_HOST);
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07004893 qdf_atomic_set(&iface->bss_status, WMA_BSS_STATUS_STOPPED);
4894 WMA_LOGD("%s: (type %d subtype %d) BSS is stopped",
4895 __func__, iface->type, iface->sub_type);
Mukul Sharmaf9047232017-03-02 16:58:56 +05304896 wma_vdev_set_mlme_state(wma, params->smesessionId, WLAN_VDEV_S_STOP);
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07004897 params->status = QDF_STATUS_SUCCESS;
4898 if (!iface->peer_count) {
4899 WMA_LOGE("%s: Can't remove peer with peer_addr %pM vdevid %d peer_count %d",
4900 __func__, params->bssid, params->smesessionId,
4901 iface->peer_count);
4902 goto fail_del_bss_ho_fail;
4903 }
4904
4905 if (peer)
Dhanashri Atre272fd232016-11-10 16:20:46 -08004906 cdp_peer_delete(soc, peer);
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07004907 iface->peer_count--;
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004908 WMA_LOGI("%s: Removed peer %p with peer_addr %pM vdevid %d peer_count %d",
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07004909 __func__, peer, params->bssid, params->smesessionId,
4910 iface->peer_count);
4911fail_del_bss_ho_fail:
4912 params->status = status;
4913 wma_send_msg(wma, WMA_DELETE_BSS_HO_FAIL_RSP, (void *)params, 0);
4914}
4915
4916/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004917 * wma_delete_bss() - process delete bss request from upper layer
4918 * @wma: wma handle
4919 * @params: del bss parameters
4920 *
4921 * Return: none
4922 */
4923void wma_delete_bss(tp_wma_handle wma, tpDeleteBssParams params)
4924{
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004925 struct cdp_pdev *pdev;
Leo Chang96464902016-10-28 11:10:54 -07004926 void *peer = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004927 struct wma_target_req *msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304928 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004929 uint8_t peer_id;
4930 uint8_t max_wait_iterations = 0;
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004931 struct cdp_vdev *txrx_vdev = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004932 bool roam_synch_in_progress = false;
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07004933 struct wma_txrx_node *iface;
Leo Chang96464902016-10-28 11:10:54 -07004934 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004935
Anurag Chouhan6d760662016-02-20 16:05:43 +05304936 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004937
4938 if (NULL == pdev) {
4939 WMA_LOGE("%s:Unable to get TXRX context", __func__);
4940 goto out;
4941 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004942 if (wma_is_vdev_in_ibss_mode(wma, params->smesessionId))
4943 /* in rome ibss case, self mac is used to create the bss peer */
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004944 peer = cdp_peer_find_by_addr(soc,
4945 pdev,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004946 wma->interfaces[params->smesessionId].addr,
4947 &peer_id);
Deepak Dhamdhere13983f22016-05-31 19:06:09 -07004948 else if (WMA_IS_VDEV_IN_NDI_MODE(wma->interfaces,
4949 params->smesessionId))
4950 /* In ndi case, self mac is used to create the self peer */
Leo Chang96464902016-10-28 11:10:54 -07004951 peer = cdp_peer_find_by_addr(soc, pdev,
Deepak Dhamdhere13983f22016-05-31 19:06:09 -07004952 wma->interfaces[params->smesessionId].addr,
4953 &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004954 else
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004955 peer = cdp_peer_find_by_addr(soc, pdev,
4956 params->bssid,
4957 &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004958
4959 if (!peer) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004960 WMA_LOGE("%s: Failed to find peer %pM", __func__,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004961 params->bssid);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304962 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004963 goto out;
4964 }
4965
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304966 qdf_mem_zero(wma->interfaces[params->smesessionId].bssid,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004967 IEEE80211_ADDR_LEN);
4968
4969 txrx_vdev = wma_find_vdev_by_id(wma, params->smesessionId);
4970 if (!txrx_vdev) {
4971 WMA_LOGE("%s:Invalid vdev handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304972 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004973 goto out;
4974 }
4975
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07004976 iface = &wma->interfaces[params->smesessionId];
4977 if (!iface || !iface->handle) {
4978 WMA_LOGE("%s vdev id %d is already deleted",
4979 __func__, params->smesessionId);
4980 goto out;
4981 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004982 /*Free the allocated stats response buffer for the the session */
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07004983 if (iface->stats_rsp) {
4984 qdf_mem_free(iface->stats_rsp);
4985 iface->stats_rsp = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004986 }
4987
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07004988 if (iface->psnr_req) {
4989 qdf_mem_free(iface->psnr_req);
4990 iface->psnr_req = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004991 }
4992
Leo Chang96464902016-10-28 11:10:54 -07004993 if (wlan_op_mode_ibss == cdp_get_opmode(soc, txrx_vdev))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004994 wma->ibss_started = 0;
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07004995
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08004996 if (wma_is_roam_synch_in_progress(wma, params->smesessionId)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004997 roam_synch_in_progress = true;
4998 WMA_LOGD("LFR3:%s: Setting vdev_up to FALSE for session %d",
4999 __func__, params->smesessionId);
Mukul Sharmaf9047232017-03-02 16:58:56 +05305000 wma_vdev_set_mlme_state(wma, params->smesessionId,
5001 WLAN_VDEV_S_STOP);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005002 goto detach_peer;
5003 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005004 msg = wma_fill_vdev_req(wma, params->smesessionId, WMA_DELETE_BSS_REQ,
5005 WMA_TARGET_REQ_TYPE_VDEV_STOP, params,
5006 WMA_VDEV_STOP_REQUEST_TIMEOUT);
5007 if (!msg) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07005008 WMA_LOGE("%s: Failed to fill vdev request for vdev_id %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005009 __func__, params->smesessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305010 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005011 goto detach_peer;
5012 }
5013
5014 WMA_LOGW(FL("Outstanding msdu packets: %d"),
Leo Chang96464902016-10-28 11:10:54 -07005015 cdp_get_tx_pending(soc, pdev));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005016
5017 max_wait_iterations =
5018 wma->interfaces[params->smesessionId].delay_before_vdev_stop /
5019 WMA_TX_Q_RECHECK_TIMER_WAIT;
5020
Leo Chang96464902016-10-28 11:10:54 -07005021 while (cdp_get_tx_pending(soc, pdev) && max_wait_iterations) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005022 WMA_LOGW(FL("Waiting for outstanding packet to drain."));
Anurag Chouhance0dc992016-02-16 18:18:03 +05305023 qdf_wait_single_event(&wma->tx_queue_empty_event,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005024 WMA_TX_Q_RECHECK_TIMER_MAX_WAIT);
5025 max_wait_iterations--;
5026 }
5027
Leo Chang96464902016-10-28 11:10:54 -07005028 if (cdp_get_tx_pending(soc, pdev)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005029 WMA_LOGW(FL("Outstanding msdu packets before VDEV_STOP : %d"),
Leo Chang96464902016-10-28 11:10:54 -07005030 cdp_get_tx_pending(soc, pdev));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005031 }
5032
5033 WMA_LOGD("%s, vdev_id: %d, pausing tx_ll_queue for VDEV_STOP (del_bss)",
5034 __func__, params->smesessionId);
Mukul Sharma6411bb82017-03-01 15:57:07 +05305035 wma_vdev_set_pause_bit(params->smesessionId, PAUSE_TYPE_HOST);
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08005036 cdp_fc_vdev_pause(soc,
5037 wma->interfaces[params->smesessionId].handle,
5038 OL_TXQ_PAUSE_REASON_VDEV_STOP);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005039
Dustin Brownbf6d16b2017-03-03 11:41:05 -08005040 if (wma_send_vdev_stop_to_fw(wma, params->smesessionId)) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07005041 WMA_LOGE("%s: %d Failed to send vdev stop", __func__, __LINE__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005042 wma_remove_vdev_req(wma, params->smesessionId,
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005043 WMA_TARGET_REQ_TYPE_VDEV_STOP);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305044 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005045 goto detach_peer;
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005046 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005047 WMA_LOGD("%s: bssid %pM vdev_id %d",
5048 __func__, params->bssid, params->smesessionId);
5049 return;
5050detach_peer:
5051 wma_remove_peer(wma, params->bssid, params->smesessionId, peer,
5052 roam_synch_in_progress);
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08005053 if (wma_is_roam_synch_in_progress(wma, params->smesessionId))
5054 return;
5055
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005056out:
5057 params->status = status;
5058 wma_send_msg(wma, WMA_DELETE_BSS_RSP, (void *)params, 0);
5059}
5060
5061/**
5062 * wma_find_ibss_vdev() - This function finds vdev_id based on input type
5063 * @wma: wma handle
5064 * @type: vdev type
5065 *
5066 * Return: vdev id
5067 */
5068int32_t wma_find_vdev_by_type(tp_wma_handle wma, int32_t type)
5069{
5070 int32_t vdev_id = 0;
5071 struct wma_txrx_node *intf = wma->interfaces;
5072
5073 for (vdev_id = 0; vdev_id < wma->max_bssid; vdev_id++) {
5074 if (NULL != intf) {
5075 if (intf[vdev_id].type == type)
5076 return vdev_id;
5077 }
5078 }
5079
5080 return -EFAULT;
5081}
5082
5083/**
5084 * wma_set_vdev_intrabss_fwd() - set intra_fwd value to wni_in.
5085 * @wma_handle: wma handle
5086 * @pdis_intra_fwd: Pointer to DisableIntraBssFwd struct
5087 *
5088 * Return: none
5089 */
5090void wma_set_vdev_intrabss_fwd(tp_wma_handle wma_handle,
5091 tpDisableIntraBssFwd pdis_intra_fwd)
5092{
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08005093 struct cdp_vdev *txrx_vdev;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07005094
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005095 WMA_LOGD("%s:intra_fwd:vdev(%d) intrabss_dis=%s",
5096 __func__, pdis_intra_fwd->sessionId,
5097 (pdis_intra_fwd->disableintrabssfwd ? "true" : "false"));
5098
5099 txrx_vdev = wma_handle->interfaces[pdis_intra_fwd->sessionId].handle;
Leo Chang96464902016-10-28 11:10:54 -07005100 cdp_cfg_vdev_rx_set_intrabss_fwd(cds_get_context(QDF_MODULE_ID_SOC),
5101 txrx_vdev,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005102 pdis_intra_fwd->disableintrabssfwd);
5103}
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07005104
5105void wma_store_pdev(void *wma_ctx, struct wlan_objmgr_pdev *pdev)
5106{
5107 tp_wma_handle wma = (tp_wma_handle)wma_ctx;
5108 QDF_STATUS status;
5109
5110 status = wlan_objmgr_pdev_try_get_ref(pdev, WLAN_LEGACY_WMA_ID);
5111 if (QDF_STATUS_SUCCESS != status) {
5112 wma->pdev = NULL;
5113 return;
5114 }
5115
5116 wma->pdev = pdev;
5117}
5118