blob: b73d8c7b28e71c428ec088565d62e14ff4b06493 [file] [log] [blame]
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001/*
Himanshu Agarwalfc4dab92017-12-28 21:46:29 +05302 * Copyright (c) 2013-2018 The Linux Foundation. All rights reserved.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003 *
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004 * Permission to use, copy, modify, and/or distribute this software for
5 * any purpose with or without fee is hereby granted, provided that the
6 * above copyright notice and this permission notice appear in all
7 * copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16 * PERFORMANCE OF THIS SOFTWARE.
17 */
18
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080019/**
20 * DOC: wma_dev_if.c
21 * This file contains vdev & peer related operations.
22 */
23
24/* Header files */
25
26#include "wma.h"
27#include "wma_api.h"
28#include "cds_api.h"
29#include "wmi_unified_api.h"
30#include "wlan_qct_sys.h"
31#include "wni_api.h"
32#include "ani_global.h"
33#include "wmi_unified.h"
34#include "wni_cfg.h"
35#include "cfg_api.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080036
Nirav Shahcbc6d722016-03-01 16:24:53 +053037#include "qdf_nbuf.h"
Anurag Chouhan6d760662016-02-20 16:05:43 +053038#include "qdf_types.h"
Anurag Chouhan600c3a02016-03-01 10:33:54 +053039#include "qdf_mem.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080040
41#include "wma_types.h"
42#include "lim_api.h"
43#include "lim_session_utils.h"
44
45#include "cds_utils.h"
46
47#if !defined(REMOVE_PKT_LOG)
48#include "pktlog_ac.h"
49#endif /* REMOVE_PKT_LOG */
50
51#include "dbglog_host.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080052#include "csr_api.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080053
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080054#include "wma_internal.h"
55
56#include "wma_ocb.h"
Dhanashri Atreb08959a2016-03-01 17:28:03 -080057#include "cdp_txrx_cfg.h"
58#include "cdp_txrx_flow_ctrl_legacy.h"
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -070059#include <cdp_txrx_peer_ops.h>
60#include <cdp_txrx_cfg.h>
61#include <cdp_txrx_cmn.h>
Leo Chang96464902016-10-28 11:10:54 -070062#include <cdp_txrx_misc.h>
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080063
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -070064#include "wlan_policy_mgr_api.h"
Deepak Dhamdheree2dd5442016-05-27 15:05:51 -070065#include "wma_nan_datapath.h"
Leo Chang96464902016-10-28 11:10:54 -070066#include "wlan_tgt_def_config.h"
bings1f98e9f2018-01-24 16:13:41 +080067#include <wlan_dfs_tgt_api.h>
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -080068#include <cdp_txrx_handle.h>
Mukul Sharma00058692017-01-28 19:04:32 +053069#include "wlan_pmo_ucfg_api.h"
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070070#include "wlan_reg_services_api.h"
Leo Chang96464902016-10-28 11:10:54 -070071
Krishna Kumaar Natarajan0103ef82017-02-17 18:15:56 -080072#include "wma_he.h"
Deepak Dhamdheref918d422017-07-06 12:56:29 -070073#include "wlan_roam_debug.h"
Zhang Qian47e22ce2018-01-04 15:38:38 +080074#include "wlan_ocb_ucfg_api.h"
Sourav Mohapatracf632572018-04-02 11:01:35 +053075#include "init_deinit_lmac.h"
Arunk Khandavallicfde2712018-01-25 11:27:42 +053076#include <target_if.h>
Vignesh Viswanathan21c58cb2018-05-24 15:53:58 +053077#include "wlan_mlme_public_struct.h"
Krishna Kumaar Natarajan0103ef82017-02-17 18:15:56 -080078
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080079/**
80 * wma_find_vdev_by_addr() - find vdev_id from mac address
81 * @wma: wma handle
82 * @addr: mac address
83 * @vdev_id: return vdev_id
84 *
85 * Return: Returns vdev handle or NULL if mac address don't match
86 */
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -080087struct cdp_vdev *wma_find_vdev_by_addr(tp_wma_handle wma, uint8_t *addr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080088 uint8_t *vdev_id)
89{
90 uint8_t i;
91
92 for (i = 0; i < wma->max_bssid; i++) {
Anurag Chouhanc5548422016-02-24 18:33:27 +053093 if (qdf_is_macaddr_equal(
Anurag Chouhan6d760662016-02-20 16:05:43 +053094 (struct qdf_mac_addr *) wma->interfaces[i].addr,
95 (struct qdf_mac_addr *) addr) == true) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080096 *vdev_id = i;
97 return wma->interfaces[i].handle;
98 }
99 }
100 return NULL;
101}
102
103
104/**
105 * wma_is_vdev_in_ap_mode() - check that vdev is in ap mode or not
106 * @wma: wma handle
107 * @vdev_id: vdev id
108 *
109 * Helper function to know whether given vdev id
110 * is in AP mode or not.
111 *
112 * Return: True/False
113 */
114bool wma_is_vdev_in_ap_mode(tp_wma_handle wma, uint8_t vdev_id)
115{
116 struct wma_txrx_node *intf = wma->interfaces;
117
Naveen Rawatf2bd42d2017-06-29 14:51:43 -0700118 if (vdev_id >= wma->max_bssid) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -0700119 WMA_LOGE("%s: Invalid vdev_id %hu", __func__, vdev_id);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530120 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800121 return false;
122 }
123
124 if ((intf[vdev_id].type == WMI_VDEV_TYPE_AP) &&
125 ((intf[vdev_id].sub_type == WMI_UNIFIED_VDEV_SUBTYPE_P2P_GO) ||
126 (intf[vdev_id].sub_type == 0)))
127 return true;
128
129 return false;
130}
131
132#ifdef QCA_IBSS_SUPPORT
133/**
134 * wma_is_vdev_in_ibss_mode() - check that vdev is in ibss mode or not
135 * @wma: wma handle
136 * @vdev_id: vdev id
137 *
138 * Helper function to know whether given vdev id
139 * is in IBSS mode or not.
140 *
141 * Return: True/False
142 */
143bool wma_is_vdev_in_ibss_mode(tp_wma_handle wma, uint8_t vdev_id)
144{
145 struct wma_txrx_node *intf = wma->interfaces;
146
Naveen Rawatf2bd42d2017-06-29 14:51:43 -0700147 if (vdev_id >= wma->max_bssid) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -0700148 WMA_LOGE("%s: Invalid vdev_id %hu", __func__, vdev_id);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530149 QDF_ASSERT(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800150 return false;
151 }
152
153 if (intf[vdev_id].type == WMI_VDEV_TYPE_IBSS)
154 return true;
155
156 return false;
157}
158#endif /* QCA_IBSS_SUPPORT */
159
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800160/**
161 * wma_find_vdev_by_bssid() - Get the corresponding vdev_id from BSSID
162 * @wma - wma handle
163 * @vdev_id - vdev ID
164 *
165 * Return: fill vdev_id with appropriate vdev id and return vdev
166 * handle or NULL if not found.
167 */
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -0800168struct cdp_vdev *wma_find_vdev_by_bssid(tp_wma_handle wma, uint8_t *bssid,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800169 uint8_t *vdev_id)
170{
171 int i;
172
173 for (i = 0; i < wma->max_bssid; i++) {
Anurag Chouhanc5548422016-02-24 18:33:27 +0530174 if (qdf_is_macaddr_equal(
Anurag Chouhan6d760662016-02-20 16:05:43 +0530175 (struct qdf_mac_addr *) wma->interfaces[i].bssid,
176 (struct qdf_mac_addr *) bssid) == true) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800177 *vdev_id = i;
178 return wma->interfaces[i].handle;
179 }
180 }
181
182 return NULL;
183}
184
185/**
186 * wma_get_txrx_vdev_type() - return operating mode of vdev
187 * @type: vdev_type
188 *
189 * Return: return operating mode as enum wlan_op_mode type
190 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -0700191static enum wlan_op_mode wma_get_txrx_vdev_type(uint32_t type)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800192{
193 enum wlan_op_mode vdev_type = wlan_op_mode_unknown;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -0700194
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800195 switch (type) {
196 case WMI_VDEV_TYPE_AP:
197 vdev_type = wlan_op_mode_ap;
198 break;
199 case WMI_VDEV_TYPE_STA:
200 vdev_type = wlan_op_mode_sta;
201 break;
202#ifdef QCA_IBSS_SUPPORT
203 case WMI_VDEV_TYPE_IBSS:
204 vdev_type = wlan_op_mode_ibss;
205 break;
206#endif /* QCA_IBSS_SUPPORT */
207 case WMI_VDEV_TYPE_OCB:
208 vdev_type = wlan_op_mode_ocb;
209 break;
210 case WMI_VDEV_TYPE_MONITOR:
Manjunathappa Prakash0e6e6b52016-04-21 11:48:48 -0700211 vdev_type = wlan_op_mode_monitor;
212 break;
Deepak Dhamdheree2dd5442016-05-27 15:05:51 -0700213 case WMI_VDEV_TYPE_NDI:
214 vdev_type = wlan_op_mode_ndi;
215 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800216 default:
217 WMA_LOGE("Invalid vdev type %u", type);
218 vdev_type = wlan_op_mode_unknown;
219 }
220
221 return vdev_type;
222}
223
224/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800225 * wma_find_req() - find target request for vdev id
226 * @wma: wma handle
227 * @vdev_id: vdev id
228 * @type: request type
229 *
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800230 * Find target request for given vdev id & type of request.
231 * Remove that request from active list.
232 *
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800233 * Return: return target request if found or NULL.
234 */
235static struct wma_target_req *wma_find_req(tp_wma_handle wma,
236 uint8_t vdev_id, uint8_t type)
237{
238 struct wma_target_req *req_msg = NULL;
239 bool found = false;
Anurag Chouhanffb21542016-02-17 14:33:03 +0530240 qdf_list_node_t *node1 = NULL, *node2 = NULL;
241 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800242
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530243 qdf_spin_lock_bh(&wma->wma_hold_req_q_lock);
Anurag Chouhanffb21542016-02-17 14:33:03 +0530244 if (QDF_STATUS_SUCCESS != qdf_list_peek_front(&wma->wma_hold_req_queue,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800245 &node2)) {
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530246 qdf_spin_unlock_bh(&wma->wma_hold_req_q_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800247 WMA_LOGE(FL("unable to get msg node from request queue"));
248 return NULL;
249 }
250
251 do {
252 node1 = node2;
Anurag Chouhanc5548422016-02-24 18:33:27 +0530253 req_msg = qdf_container_of(node1, struct wma_target_req, node);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800254 if (req_msg->vdev_id != vdev_id)
255 continue;
256 if (req_msg->type != type)
257 continue;
258
259 found = true;
Anurag Chouhanffb21542016-02-17 14:33:03 +0530260 status = qdf_list_remove_node(&wma->wma_hold_req_queue, node1);
261 if (QDF_STATUS_SUCCESS != status) {
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530262 qdf_spin_unlock_bh(&wma->wma_hold_req_q_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800263 WMA_LOGD(FL("Failed to remove request for vdev_id %d type %d"),
264 vdev_id, type);
265 return NULL;
266 }
267 break;
Anurag Chouhanffb21542016-02-17 14:33:03 +0530268 } while (QDF_STATUS_SUCCESS ==
269 qdf_list_peek_next(&wma->wma_hold_req_queue, node1,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800270 &node2));
271
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530272 qdf_spin_unlock_bh(&wma->wma_hold_req_q_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800273 if (!found) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800274 WMA_LOGE(FL("target request not found for vdev_id %d type %d"),
275 vdev_id, type);
276 return NULL;
277 }
278
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800279 WMA_LOGD(FL("target request found for vdev id: %d type %d"),
280 vdev_id, type);
281
282 return req_msg;
283}
284
285/**
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800286 * wma_find_remove_req_msgtype() - find and remove request for vdev id
287 * @wma: wma handle
288 * @vdev_id: vdev id
289 * @msg_type: message request type
290 *
291 * Find target request for given vdev id & sub type of request.
292 * Remove the same from active list.
293 *
294 * Return: Success if request found, failure other wise
295 */
296static struct wma_target_req *wma_find_remove_req_msgtype(tp_wma_handle wma,
297 uint8_t vdev_id, uint32_t msg_type)
298{
299 struct wma_target_req *req_msg = NULL;
300 bool found = false;
Anurag Chouhanffb21542016-02-17 14:33:03 +0530301 qdf_list_node_t *node1 = NULL, *node2 = NULL;
302 QDF_STATUS status;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800303
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530304 qdf_spin_lock_bh(&wma->wma_hold_req_q_lock);
Anurag Chouhanffb21542016-02-17 14:33:03 +0530305 if (QDF_STATUS_SUCCESS != qdf_list_peek_front(&wma->wma_hold_req_queue,
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800306 &node2)) {
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530307 qdf_spin_unlock_bh(&wma->wma_hold_req_q_lock);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800308 WMA_LOGE(FL("unable to get msg node from request queue"));
309 return NULL;
310 }
311
312 do {
313 node1 = node2;
Anurag Chouhanc5548422016-02-24 18:33:27 +0530314 req_msg = qdf_container_of(node1, struct wma_target_req, node);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800315 if (req_msg->vdev_id != vdev_id)
316 continue;
317 if (req_msg->msg_type != msg_type)
318 continue;
319
320 found = true;
Anurag Chouhanffb21542016-02-17 14:33:03 +0530321 status = qdf_list_remove_node(&wma->wma_hold_req_queue, node1);
322 if (QDF_STATUS_SUCCESS != status) {
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530323 qdf_spin_unlock_bh(&wma->wma_hold_req_q_lock);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800324 WMA_LOGD(FL("Failed to remove request. vdev_id %d type %d"),
325 vdev_id, msg_type);
326 return NULL;
327 }
328 break;
Anurag Chouhanffb21542016-02-17 14:33:03 +0530329 } while (QDF_STATUS_SUCCESS ==
330 qdf_list_peek_next(&wma->wma_hold_req_queue, node1,
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800331 &node2));
332
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530333 qdf_spin_unlock_bh(&wma->wma_hold_req_q_lock);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800334 if (!found) {
335 WMA_LOGE(FL("target request not found for vdev_id %d type %d"),
336 vdev_id, msg_type);
337 return NULL;
338 }
339
340 WMA_LOGD(FL("target request found for vdev id: %d type %d"),
341 vdev_id, msg_type);
342
343 return req_msg;
344}
345
346
347/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800348 * wma_find_vdev_req() - find target request for vdev id
349 * @wma: wma handle
350 * @vdev_id: vdev id
351 * @type: request type
Kiran Kumar Lokere20804162017-07-17 16:09:04 -0700352 * @remove_req_from_list: flag to indicate remove req or not.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800353 *
354 * Return: return target request if found or NULL.
355 */
356static struct wma_target_req *wma_find_vdev_req(tp_wma_handle wma,
Kiran Kumar Lokere20804162017-07-17 16:09:04 -0700357 uint8_t vdev_id, uint8_t type,
358 bool remove_req_from_list)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800359{
Krishna Kumaar Natarajana5c53bd2015-10-27 11:48:27 -0700360 struct wma_target_req *req_msg = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800361 bool found = false;
Anurag Chouhanffb21542016-02-17 14:33:03 +0530362 qdf_list_node_t *node1 = NULL, *node2 = NULL;
363 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800364
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530365 qdf_spin_lock_bh(&wma->vdev_respq_lock);
Anurag Chouhanffb21542016-02-17 14:33:03 +0530366 if (QDF_STATUS_SUCCESS != qdf_list_peek_front(&wma->vdev_resp_queue,
Krishna Kumaar Natarajana5c53bd2015-10-27 11:48:27 -0700367 &node2)) {
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530368 qdf_spin_unlock_bh(&wma->vdev_respq_lock);
Srinivas Girigowda2b5d47c2017-03-29 00:28:46 -0700369 WMA_LOGD(FL("unable to get target req from vdev resp queue vdev_id: %d type: %d"),
370 vdev_id, type);
Krishna Kumaar Natarajana5c53bd2015-10-27 11:48:27 -0700371 return NULL;
372 }
373
374 do {
375 node1 = node2;
Anurag Chouhanc5548422016-02-24 18:33:27 +0530376 req_msg = qdf_container_of(node1, struct wma_target_req, node);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800377 if (req_msg->vdev_id != vdev_id)
378 continue;
379 if (req_msg->type != type)
380 continue;
381
382 found = true;
Kiran Kumar Lokere20804162017-07-17 16:09:04 -0700383 if (remove_req_from_list) {
384 status = qdf_list_remove_node(&wma->vdev_resp_queue,
385 node1);
386 if (QDF_STATUS_SUCCESS != status) {
387 qdf_spin_unlock_bh(&wma->vdev_respq_lock);
388 WMA_LOGD(FL(
389 "Failed to target req for vdev_id %d type %d"),
390 vdev_id, type);
391 return NULL;
392 }
Krishna Kumaar Natarajana5c53bd2015-10-27 11:48:27 -0700393 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800394 break;
Anurag Chouhanffb21542016-02-17 14:33:03 +0530395 } while (QDF_STATUS_SUCCESS ==
396 qdf_list_peek_next(&wma->vdev_resp_queue,
Krishna Kumaar Natarajana5c53bd2015-10-27 11:48:27 -0700397 node1, &node2));
398
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530399 qdf_spin_unlock_bh(&wma->vdev_respq_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800400 if (!found) {
Srinivas Girigowda2b5d47c2017-03-29 00:28:46 -0700401 WMA_LOGD(FL("target request not found for vdev_id %d type %d"),
Krishna Kumaar Natarajana5c53bd2015-10-27 11:48:27 -0700402 vdev_id, type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800403 return NULL;
404 }
Krishna Kumaar Natarajana5c53bd2015-10-27 11:48:27 -0700405 WMA_LOGD(FL("target request found for vdev id: %d type %d msg %d"),
406 vdev_id, type, req_msg->msg_type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800407 return req_msg;
408}
409
410/**
Abhishek Singhc614ec42017-04-25 16:17:34 +0530411 * wma_send_del_sta_self_resp() - send del sta self resp to Upper layer
412 * @param: params of del sta resp
413 *
414 * Return: none
415 */
416static inline void wma_send_del_sta_self_resp(struct del_sta_self_params *param)
417{
418 struct scheduler_msg sme_msg = {0};
419 QDF_STATUS status;
420
421 sme_msg.type = eWNI_SME_DEL_STA_SELF_RSP;
422 sme_msg.bodyptr = param;
423
424 status = scheduler_post_msg(QDF_MODULE_ID_SME, &sme_msg);
425 if (!QDF_IS_STATUS_SUCCESS(status)) {
426 WMA_LOGE("Failed to post eWNI_SME_DEL_STA_SELF_RSP");
427 qdf_mem_free(param);
428 }
429}
430
431/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800432 * wma_vdev_detach_callback() - send vdev detach response to upper layer
433 * @ctx: txrx node ptr
434 *
435 * Return: none
436 */
Jeff Johnsonc4b47a92016-10-07 12:34:41 -0700437static void wma_vdev_detach_callback(void *ctx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800438{
439 tp_wma_handle wma;
440 struct wma_txrx_node *iface = (struct wma_txrx_node *)ctx;
441 struct del_sta_self_params *param;
442 struct wma_target_req *req_msg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800443
Anurag Chouhan6d760662016-02-20 16:05:43 +0530444 wma = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800445
446 if (!wma || !iface->del_staself_req) {
Jeff Johnsonadba3962017-09-18 08:12:35 -0700447 WMA_LOGE("%s: wma %pK iface %pK", __func__, wma,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800448 iface->del_staself_req);
449 return;
450 }
451 param = (struct del_sta_self_params *) iface->del_staself_req;
Sandeep Puligilla88de6fb2016-09-23 17:08:44 -0700452 iface->del_staself_req = NULL;
Srinivas Girigowdada0e8482017-03-19 23:15:45 -0700453 WMA_LOGD("%s: sending eWNI_SME_DEL_STA_SELF_RSP for vdev %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800454 __func__, param->session_id);
Sourav Mohapatra89c85d12017-12-01 09:17:54 +0530455 if (!wmi_service_enabled(wma->wmi_handle,
456 wmi_service_sync_delete_cmds)) {
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800457 req_msg = wma_find_vdev_req(wma, param->session_id,
Kiran Kumar Lokere20804162017-07-17 16:09:04 -0700458 WMA_TARGET_REQ_TYPE_VDEV_DEL,
459 true);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800460 if (req_msg) {
461 WMA_LOGD("%s: Found vdev request for vdev id %d",
462 __func__, param->session_id);
Anurag Chouhan210db072016-02-22 18:42:15 +0530463 qdf_mc_timer_stop(&req_msg->event_timeout);
464 qdf_mc_timer_destroy(&req_msg->event_timeout);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530465 qdf_mem_free(req_msg);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800466 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800467 }
Naveen Rawat3c49d192017-03-02 18:43:16 -0800468
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +0530469 if (iface->roam_scan_stats_req) {
470 struct sir_roam_scan_stats *roam_scan_stats_req =
471 iface->roam_scan_stats_req;
472
473 iface->roam_scan_stats_req = NULL;
474 qdf_mem_free(roam_scan_stats_req);
475 }
476
Dustin Brownec2c92e2017-07-26 11:13:49 -0700477 wma_vdev_deinit(iface);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530478 qdf_mem_zero(iface, sizeof(*iface));
Dustin Brownec2c92e2017-07-26 11:13:49 -0700479 wma_vdev_init(iface);
480
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530481 param->status = QDF_STATUS_SUCCESS;
Abhishek Singhc614ec42017-04-25 16:17:34 +0530482 wma_send_del_sta_self_resp(param);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800483}
484
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800485
486/**
487 * wma_self_peer_remove() - Self peer remove handler
488 * @wma: wma handle
489 * @del_sta_self_req_param: vdev id
490 * @generate_vdev_rsp: request type
491 *
492 * Return: success if peer delete command sent to firmware, else failure.
493 */
494
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530495static QDF_STATUS wma_self_peer_remove(tp_wma_handle wma_handle,
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800496 struct del_sta_self_params *del_sta_self_req_param,
497 uint8_t generate_vdev_rsp)
498{
Leo Chang96464902016-10-28 11:10:54 -0700499 void *peer;
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -0800500 struct cdp_pdev *pdev;
Krunal Soni1b5debd2018-02-27 15:34:30 -0800501 QDF_STATUS qdf_status;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800502 uint8_t peer_id;
503 uint8_t vdev_id = del_sta_self_req_param->session_id;
504 struct wma_target_req *msg = NULL;
505 struct del_sta_self_rsp_params *sta_self_wmi_rsp;
Leo Chang96464902016-10-28 11:10:54 -0700506 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800507
Srinivas Girigowdada0e8482017-03-19 23:15:45 -0700508 WMA_LOGD("P2P Device: removing self peer %pM",
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800509 del_sta_self_req_param->self_mac_addr);
510
Anurag Chouhan6d760662016-02-20 16:05:43 +0530511 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800512 if (NULL == pdev) {
513 WMA_LOGE("%s: Failed to get pdev", __func__);
Krunal Soni1b5debd2018-02-27 15:34:30 -0800514 qdf_status = QDF_STATUS_E_FAULT;
515 goto error;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800516 }
517
Leo Chang96464902016-10-28 11:10:54 -0700518 peer = cdp_peer_find_by_addr(soc, pdev,
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -0800519 del_sta_self_req_param->self_mac_addr,
520 &peer_id);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800521 if (!peer) {
522 WMA_LOGE("%s Failed to find peer %pM", __func__,
523 del_sta_self_req_param->self_mac_addr);
Krunal Soni40c5e442018-02-28 11:40:15 -0800524 qdf_status = QDF_STATUS_E_FAULT;
Krunal Soni1b5debd2018-02-27 15:34:30 -0800525 goto error;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800526 }
527 wma_remove_peer(wma_handle,
528 del_sta_self_req_param->self_mac_addr,
529 vdev_id, peer, false);
530
Sourav Mohapatra89c85d12017-12-01 09:17:54 +0530531 if (wmi_service_enabled(wma_handle->wmi_handle,
532 wmi_service_sync_delete_cmds)) {
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800533 sta_self_wmi_rsp =
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530534 qdf_mem_malloc(sizeof(struct del_sta_self_rsp_params));
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800535 if (sta_self_wmi_rsp == NULL) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -0700536 WMA_LOGE(FL("Failed to allocate memory"));
Krunal Soni1b5debd2018-02-27 15:34:30 -0800537 qdf_status = QDF_STATUS_E_NOMEM;
538 goto error;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800539 }
540 sta_self_wmi_rsp->self_sta_param = del_sta_self_req_param;
541 sta_self_wmi_rsp->generate_rsp = generate_vdev_rsp;
542 msg = wma_fill_hold_req(wma_handle, vdev_id,
543 WMA_DELETE_STA_REQ,
544 WMA_DEL_P2P_SELF_STA_RSP_START,
545 sta_self_wmi_rsp,
546 WMA_DELETE_STA_TIMEOUT);
547 if (!msg) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -0700548 WMA_LOGE(FL("Failed to allocate request for vdev_id %d"),
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800549 vdev_id);
550 wma_remove_req(wma_handle, vdev_id,
551 WMA_DEL_P2P_SELF_STA_RSP_START);
Krunal Soni1b5debd2018-02-27 15:34:30 -0800552 qdf_status = QDF_STATUS_E_FAILURE;
553 goto error;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800554 }
555 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530556 return QDF_STATUS_SUCCESS;
Krunal Soni1b5debd2018-02-27 15:34:30 -0800557error:
558 return qdf_status;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800559}
560
Jingxiang Gedf9292a2017-12-11 13:30:44 +0800561static void
562wma_cdp_vdev_detach(ol_txrx_soc_handle soc,
563 tp_wma_handle wma_handle,
564 uint8_t vdev_id)
565{
566 struct wma_txrx_node *iface = &wma_handle->interfaces[vdev_id];
567
568 cdp_vdev_detach(soc,
569 iface->handle, NULL, NULL);
570 iface->handle = NULL;
571 iface->is_vdev_valid = false;
572}
573
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530574static QDF_STATUS wma_handle_vdev_detach(tp_wma_handle wma_handle,
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800575 struct del_sta_self_params *del_sta_self_req_param,
576 uint8_t generate_rsp)
577{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530578 QDF_STATUS status = QDF_STATUS_SUCCESS;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800579 uint8_t vdev_id = del_sta_self_req_param->session_id;
580 struct wma_txrx_node *iface = &wma_handle->interfaces[vdev_id];
581 struct wma_target_req *msg = NULL;
Leo Chang96464902016-10-28 11:10:54 -0700582 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800583
Nishank Aggarwala13b61d2016-12-01 12:53:58 +0530584 if (!soc) {
585 WMA_LOGE("%s:SOC context is NULL", __func__);
586 status = QDF_STATUS_E_FAILURE;
587 goto out;
588 }
589
Min Liua9df1ff2018-02-09 02:44:13 +0800590
Govind Singhd76a5b02016-03-08 15:12:14 +0530591 status = wmi_unified_vdev_delete_send(wma_handle->wmi_handle, vdev_id);
592 if (QDF_IS_STATUS_ERROR(status)) {
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800593 WMA_LOGE("Unable to remove an interface");
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800594 goto out;
595 }
596
Jeff Johnsonadba3962017-09-18 08:12:35 -0700597 WMA_LOGD("vdev_id:%hu vdev_hdl:%pK", vdev_id, iface->handle);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800598 if (!generate_rsp) {
599 WMA_LOGE("Call txrx detach w/o callback for vdev %d", vdev_id);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800600 goto out;
601 }
602
603 iface->del_staself_req = del_sta_self_req_param;
604 msg = wma_fill_vdev_req(wma_handle, vdev_id, WMA_DEL_STA_SELF_REQ,
605 WMA_TARGET_REQ_TYPE_VDEV_DEL, iface, 6000);
606 if (!msg) {
607 WMA_LOGE("%s: Failed to fill vdev request for vdev_id %d",
608 __func__, vdev_id);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530609 status = QDF_STATUS_E_NOMEM;
Abhinav Kumar0a846132018-08-09 11:49:46 +0530610 iface->del_staself_req = NULL;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800611 goto out;
612 }
613
614 /* Acquire wake lock only when you expect a response from firmware */
Sourav Mohapatra89c85d12017-12-01 09:17:54 +0530615 if (wmi_service_enabled(wma_handle->wmi_handle,
616 wmi_service_sync_delete_cmds)) {
Dustin Brownec2c92e2017-07-26 11:13:49 -0700617 wma_acquire_wakelock(&wma_handle->wmi_cmd_rsp_wake_lock,
618 WMA_FW_RSP_EVENT_WAKE_LOCK_DURATION);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800619 }
620 WMA_LOGD("Call txrx detach with callback for vdev %d", vdev_id);
Jingxiang Gedf9292a2017-12-11 13:30:44 +0800621 wma_cdp_vdev_detach(soc, wma_handle, vdev_id);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800622
623 /*
624 * send the response immediately if WMI_SERVICE_SYNC_DELETE_CMDS
625 * service is not supported by firmware
626 */
Sourav Mohapatra89c85d12017-12-01 09:17:54 +0530627 if (!wmi_service_enabled(wma_handle->wmi_handle,
628 wmi_service_sync_delete_cmds))
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800629 wma_vdev_detach_callback(iface);
630 return status;
631out:
Jingxiang Gedf9292a2017-12-11 13:30:44 +0800632 WMA_LOGE("Call txrx detach callback for vdev %d, generate_rsp %u",
633 vdev_id, generate_rsp);
634 wma_cdp_vdev_detach(soc, wma_handle, vdev_id);
635
Dustin Brown35b61f62017-08-31 16:03:32 -0700636 wma_vdev_deinit(iface);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530637 qdf_mem_zero(iface, sizeof(*iface));
Dustin Brown35b61f62017-08-31 16:03:32 -0700638 wma_vdev_init(iface);
639
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800640 del_sta_self_req_param->status = status;
Abhishek Singhc614ec42017-04-25 16:17:34 +0530641 if (generate_rsp)
642 wma_send_del_sta_self_resp(del_sta_self_req_param);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800643 return status;
644}
Jiachao Wu2c42c222018-01-15 18:13:19 +0800645
646/**
Vignesh Viswanathan1e175802018-08-28 17:32:37 +0530647 * wma_force_objmgr_vdev_peer_cleanup() - Cleanup ObjMgr Vdev peers during SSR
Jiachao Wu2c42c222018-01-15 18:13:19 +0800648 * @wma_handle: WMA handle
649 * @vdev_id: vdev ID
650 *
651 * Return: none
652 */
Vignesh Viswanathan1e175802018-08-28 17:32:37 +0530653static void wma_force_objmgr_vdev_peer_cleanup(tp_wma_handle wma,
654 uint8_t vdev_id)
Jiachao Wu2c42c222018-01-15 18:13:19 +0800655{
Vignesh Viswanathan1e175802018-08-28 17:32:37 +0530656 struct wma_txrx_node *iface = &wma->interfaces[vdev_id];
657 struct wlan_objmgr_vdev *vdev;
658 struct wlan_objmgr_peer *peer = NULL;
659 struct wlan_objmgr_peer *peer_next = NULL;
660 qdf_list_t *peer_list;
Jiachao Wu2c42c222018-01-15 18:13:19 +0800661
Vignesh Viswanathan1e175802018-08-28 17:32:37 +0530662 WMA_LOGE("%s: SSR: force cleanup peers in vdev(%d)",
663 __func__, vdev_id);
Jiachao Wu2c42c222018-01-15 18:13:19 +0800664 iface->vdev_active = false;
Jiachao Wu641760e2018-01-21 12:11:31 +0800665
Vignesh Viswanathan1e175802018-08-28 17:32:37 +0530666 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(wma->psoc, vdev_id,
667 WLAN_LEGACY_WMA_ID);
Jiachao Wu641760e2018-01-21 12:11:31 +0800668
Jiachao Wu641760e2018-01-21 12:11:31 +0800669 if (!vdev) {
Vignesh Viswanathan1e175802018-08-28 17:32:37 +0530670 WMA_LOGE("Failed to get Objmgr Vdev");
671 return;
Jiachao Wu641760e2018-01-21 12:11:31 +0800672 }
673
Vignesh Viswanathan1e175802018-08-28 17:32:37 +0530674 peer_list = &vdev->vdev_objmgr.wlan_peer_list;
675 if (!peer_list) {
676 WMA_LOGE("%s: peer_list is NULL", __func__);
677 wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_WMA_ID);
678 return;
679 }
Jiachao Wu641760e2018-01-21 12:11:31 +0800680
Vignesh Viswanathan1e175802018-08-28 17:32:37 +0530681 /*
682 * We get refcount for each peer first, logically delete it and
683 * then release the refcount so that the peer is physically
684 * deleted.
685 */
686 peer = wlan_vdev_peer_list_peek_active_head(vdev, peer_list,
687 WLAN_LEGACY_WMA_ID);
688 while (peer) {
689 WMA_LOGD("%s: Deleting Peer %pM",
690 __func__, peer->macaddr);
691 wlan_objmgr_peer_obj_delete(peer);
692 peer_next = wlan_peer_get_next_active_peer_of_vdev(vdev,
693 peer_list, peer, WLAN_LEGACY_WMA_ID);
694 wlan_objmgr_peer_release_ref(peer, WLAN_LEGACY_WMA_ID);
695 peer = peer_next;
696 }
697
698 wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_WMA_ID);
699
700 /* Force delete all the peers, set the wma interface peer_count to 0 */
701 iface->peer_count = 0;
Jiachao Wu2c42c222018-01-15 18:13:19 +0800702}
703
Dustin Brown04823992018-03-29 13:27:01 -0700704static bool wma_vdev_uses_self_peer(uint32_t vdev_type, uint32_t vdev_subtype)
705{
706 switch (vdev_type) {
707 case WMI_VDEV_TYPE_AP:
708 return vdev_subtype == WMI_UNIFIED_VDEV_SUBTYPE_P2P_DEVICE;
709
710 case WMI_VDEV_TYPE_MONITOR:
Dustin Brown04823992018-03-29 13:27:01 -0700711 case WMI_VDEV_TYPE_OCB:
712 return true;
713
714 default:
715 return false;
716 }
717}
718
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800719/**
Bala Venkatesh110b03e2018-07-10 16:02:08 +0530720 * wma_remove_objmgr_peer() - remove objmgr peer information from host driver
721 * @wma: wma handle
722 * @vdev_id: vdev id
723 * @peer_addr: peer mac address
724 *
725 * Return: none
726 */
727static void wma_remove_objmgr_peer(tp_wma_handle wma, uint8_t vdev_id,
728 uint8_t *peer_addr)
729{
730 struct wlan_objmgr_psoc *psoc;
731 struct wlan_objmgr_peer *obj_peer;
732 struct wlan_objmgr_vdev *obj_vdev;
733 struct wlan_objmgr_pdev *obj_pdev;
734 uint8_t pdev_id = 0;
735
736 psoc = wma->psoc;
737 if (!psoc) {
738 WMA_LOGE("%s:PSOC is NULL", __func__);
739 return;
740 }
741
742 obj_vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
743 WLAN_LEGACY_WMA_ID);
744 if (!obj_vdev) {
745 WMA_LOGE("Obj vdev not found. Unable to remove peer");
746 return;
747 }
748 obj_pdev = wlan_vdev_get_pdev(obj_vdev);
749 pdev_id = wlan_objmgr_pdev_get_pdev_id(obj_pdev);
750 obj_peer = wlan_objmgr_get_peer(psoc, pdev_id, peer_addr,
751 WLAN_LEGACY_WMA_ID);
752 if (obj_peer) {
753 wlan_objmgr_peer_obj_delete(obj_peer);
754 /* Unref to decrement ref happened in find_peer */
755 wlan_objmgr_peer_release_ref(obj_peer, WLAN_LEGACY_WMA_ID);
756 WMA_LOGD("Peer %pM deleted", peer_addr);
757 } else {
758 WMA_LOGE("Peer %pM not found", peer_addr);
759 }
760
761 wlan_objmgr_vdev_release_ref(obj_vdev, WLAN_LEGACY_WMA_ID);
762}
763
764/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800765 * wma_vdev_detach() - send vdev delete command to fw
766 * @wma_handle: wma handle
767 * @pdel_sta_self_req_param: del sta params
768 * @generateRsp: generate Response flag
769 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +0530770 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800771 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530772QDF_STATUS wma_vdev_detach(tp_wma_handle wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800773 struct del_sta_self_params *pdel_sta_self_req_param,
774 uint8_t generateRsp)
775{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530776 QDF_STATUS status = QDF_STATUS_SUCCESS;
Vignesh Viswanathan1e175802018-08-28 17:32:37 +0530777 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800778 uint8_t vdev_id = pdel_sta_self_req_param->session_id;
779 struct wma_txrx_node *iface = &wma_handle->interfaces[vdev_id];
Kiran Kumar Lokere35577652017-07-14 02:06:56 -0700780 struct wma_target_req *req_msg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800781
Vignesh Viswanathan74f6fc12018-08-17 15:34:21 +0530782 if (!iface->handle) {
783 WMA_LOGE("handle of vdev_id %d is NULL vdev is already freed",
Jiachao Wu2c42c222018-01-15 18:13:19 +0800784 vdev_id);
785 goto send_rsp;
786 }
787
788 /*
Vignesh Viswanathan1e175802018-08-28 17:32:37 +0530789 * In SSR case or if FW is down we only need to clean up the host.
790 * There is no need to destroy vdev in firmware since it
791 * has already asserted.
792 * Cleanup the ObjMgr Peers for the current vdev and detach the
793 * CDP Vdev.
Jiachao Wu2c42c222018-01-15 18:13:19 +0800794 */
Vignesh Viswanathan74f6fc12018-08-17 15:34:21 +0530795 if (cds_is_driver_recovering() || !cds_is_target_ready()) {
Vignesh Viswanathan1e175802018-08-28 17:32:37 +0530796 wma_force_objmgr_vdev_peer_cleanup(wma_handle, vdev_id);
797 wma_cdp_vdev_detach(soc, wma_handle, vdev_id);
Jiachao Wu2c42c222018-01-15 18:13:19 +0800798 goto send_rsp;
799 }
800
Anurag Chouhan8e0ccd32016-02-19 15:30:20 +0530801 if (qdf_atomic_read(&iface->bss_status) == WMA_BSS_STATUS_STARTED) {
Kiran Kumar Lokere35577652017-07-14 02:06:56 -0700802 req_msg = wma_find_vdev_req(wma_handle, vdev_id,
Kiran Kumar Lokere20804162017-07-17 16:09:04 -0700803 WMA_TARGET_REQ_TYPE_VDEV_STOP, false);
Kiran Kumar Lokere35577652017-07-14 02:06:56 -0700804 if (!req_msg)
805 goto send_fail_rsp;
806 if (req_msg->msg_type != WMA_DELETE_BSS_REQ)
807 goto send_fail_rsp;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800808 WMA_LOGA("BSS is not yet stopped. Defering vdev(vdev id %x) deletion",
809 vdev_id);
810 iface->del_staself_req = pdel_sta_self_req_param;
Abhishek Singh0d74f9e2017-09-26 14:02:42 +0530811 iface->is_del_sta_defered = true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800812 return status;
813 }
Abhishek Singh0d74f9e2017-09-26 14:02:42 +0530814 iface->is_del_sta_defered = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800815
Dustin Brown04823992018-03-29 13:27:01 -0700816 if (wma_vdev_uses_self_peer(iface->type, iface->sub_type)) {
Krunal Soni1b5debd2018-02-27 15:34:30 -0800817 status = wma_self_peer_remove(wma_handle,
818 pdel_sta_self_req_param, generateRsp);
819 if ((status != QDF_STATUS_SUCCESS) && generateRsp) {
820 WMA_LOGE("can't remove selfpeer, send rsp session: %d",
821 vdev_id);
Krunal Soni40c5e442018-02-28 11:40:15 -0800822 if (!cds_is_driver_unloading()) {
823 WMA_LOGE("Trigger recovery for session: %d",
824 vdev_id);
825 goto send_fail_rsp;
826 } else {
827 WMA_LOGE("driver unload, free mem vdev_id: %d",
828 vdev_id);
829 goto send_rsp;
830 }
831 } else if (status != QDF_STATUS_SUCCESS) {
Krunal Soni1b5debd2018-02-27 15:34:30 -0800832 WMA_LOGE("can't remove selfpeer, free msg session: %d",
833 vdev_id);
834 qdf_mem_free(pdel_sta_self_req_param);
835 pdel_sta_self_req_param = NULL;
836 return status;
837 }
Sourav Mohapatra89c85d12017-12-01 09:17:54 +0530838 if (!wmi_service_enabled(wma_handle->wmi_handle,
839 wmi_service_sync_delete_cmds))
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800840 status = wma_handle_vdev_detach(wma_handle,
841 pdel_sta_self_req_param, generateRsp);
Dustin Brown04823992018-03-29 13:27:01 -0700842 } else {
Bala Venkatesh110b03e2018-07-10 16:02:08 +0530843 if (iface->type == WMI_VDEV_TYPE_STA) {
844 wma_remove_objmgr_peer(wma_handle, vdev_id,
845 pdel_sta_self_req_param->self_mac_addr);
846 }
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800847 status = wma_handle_vdev_detach(wma_handle,
848 pdel_sta_self_req_param, generateRsp);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800849 }
850
Arif Hussain380cfc72017-10-31 13:12:04 -0700851 if (QDF_IS_STATUS_SUCCESS(status))
852 iface->vdev_active = false;
853
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800854 return status;
Kiran Kumar Lokere35577652017-07-14 02:06:56 -0700855
856send_fail_rsp:
Dustin Brown83044c22018-08-13 15:00:44 -0700857 WMA_LOGE("rcvd del_self_sta without del_bss; vdev_id:%d", vdev_id);
858 cds_trigger_recovery(QDF_REASON_UNSPECIFIED);
Jiachao Wu2c42c222018-01-15 18:13:19 +0800859 status = QDF_STATUS_E_FAILURE;
Himanshu Agarwalfc4dab92017-12-28 21:46:29 +0530860
Jiachao Wu2c42c222018-01-15 18:13:19 +0800861send_rsp:
862 if (generateRsp) {
863 pdel_sta_self_req_param->status = status;
864 wma_send_del_sta_self_resp(pdel_sta_self_req_param);
865 } else {
866 qdf_mem_free(pdel_sta_self_req_param);
867 pdel_sta_self_req_param = NULL;
868 }
Kiran Kumar Lokere35577652017-07-14 02:06:56 -0700869 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800870}
871
872/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800873 * wma_vdev_start_rsp() - send vdev start response to upper layer
874 * @wma: wma handle
875 * @add_bss: add bss params
876 * @resp_event: response params
877 *
878 * Return: none
879 */
880static void wma_vdev_start_rsp(tp_wma_handle wma,
881 tpAddBssParams add_bss,
882 wmi_vdev_start_response_event_fixed_param *
883 resp_event)
884{
885 struct beacon_info *bcn;
Padma, Santhosh Kumar88104612017-04-10 18:49:12 +0530886 struct cdp_pdev *pdev;
887 void *peer = NULL;
888 uint8_t peer_id;
889 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800890
891#ifdef QCA_IBSS_SUPPORT
892 WMA_LOGD("%s: vdev start response received for %s mode", __func__,
893 add_bss->operMode ==
894 BSS_OPERATIONAL_MODE_IBSS ? "IBSS" : "non-IBSS");
895#endif /* QCA_IBSS_SUPPORT */
896
897 if (resp_event->status) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530898 add_bss->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800899 goto send_fail_resp;
900 }
901
902 if ((add_bss->operMode == BSS_OPERATIONAL_MODE_AP)
903#ifdef QCA_IBSS_SUPPORT
904 || (add_bss->operMode == BSS_OPERATIONAL_MODE_IBSS)
905#endif /* QCA_IBSS_SUPPORT */
906 ) {
907 wma->interfaces[resp_event->vdev_id].beacon =
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530908 qdf_mem_malloc(sizeof(struct beacon_info));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800909
910 bcn = wma->interfaces[resp_event->vdev_id].beacon;
911 if (!bcn) {
912 WMA_LOGE("%s: Failed alloc memory for beacon struct",
913 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530914 add_bss->status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800915 goto send_fail_resp;
916 }
Krunal Sonieb692e32018-08-21 14:54:11 -0700917 bcn->buf = qdf_nbuf_alloc(NULL, SIR_MAX_BEACON_SIZE, 0,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800918 sizeof(uint32_t), 0);
919 if (!bcn->buf) {
920 WMA_LOGE("%s: No memory allocated for beacon buffer",
921 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530922 qdf_mem_free(bcn);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530923 add_bss->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800924 goto send_fail_resp;
925 }
926 bcn->seq_no = MIN_SW_SEQ;
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530927 qdf_spinlock_create(&bcn->lock);
Anurag Chouhan8e0ccd32016-02-19 15:30:20 +0530928 qdf_atomic_set(&wma->interfaces[resp_event->vdev_id].bss_status,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800929 WMA_BSS_STATUS_STARTED);
930 WMA_LOGD("%s: AP mode (type %d subtype %d) BSS is started",
931 __func__, wma->interfaces[resp_event->vdev_id].type,
932 wma->interfaces[resp_event->vdev_id].sub_type);
933
Jeff Johnsonadba3962017-09-18 08:12:35 -0700934 WMA_LOGD("%s: Allocated beacon struct %pK, template memory %pK",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800935 __func__, bcn, bcn->buf);
936 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530937 add_bss->status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800938 add_bss->bssIdx = resp_event->vdev_id;
939 add_bss->chainMask = resp_event->chain_mask;
940 if ((2 != resp_event->cfgd_rx_streams) ||
941 (2 != resp_event->cfgd_tx_streams)) {
942 add_bss->nss = 1;
943 }
944 add_bss->smpsMode = host_map_smps_mode(resp_event->smps_mode);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800945send_fail_resp:
Padma, Santhosh Kumar88104612017-04-10 18:49:12 +0530946 if (add_bss->status != QDF_STATUS_SUCCESS) {
947 WMA_LOGE("%s: ADD BSS failure %d", __func__, add_bss->status);
948
949 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
950 if (NULL == pdev)
951 WMA_LOGE("%s: Failed to get pdev", __func__);
952
953 if (pdev)
954 peer = cdp_peer_find_by_addr(soc, pdev,
955 add_bss->bssId, &peer_id);
956 if (!peer)
957 WMA_LOGE("%s Failed to find peer %pM", __func__,
958 add_bss->bssId);
959
960 if (peer)
961 wma_remove_peer(wma, add_bss->bssId,
962 resp_event->vdev_id, peer, false);
963 }
964
Abhishek Singh34c15642017-05-08 16:13:02 +0530965 /* Send vdev stop if vdev start was success */
966 if ((add_bss->status != QDF_STATUS_SUCCESS) &&
967 !resp_event->status)
968 if (wma_send_vdev_stop_to_fw(wma, resp_event->vdev_id))
969 WMA_LOGE("%s: %d Failed to send vdev stop", __func__, __LINE__);
970
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800971 WMA_LOGD("%s: Sending add bss rsp to umac(vdev %d status %d)",
972 __func__, resp_event->vdev_id, add_bss->status);
Abhishek Singh2d775fd2017-08-18 10:51:33 +0530973 wma_send_msg_high_priority(wma, WMA_ADD_BSS_RSP, (void *)add_bss, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800974}
975
976#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
977/**
978 * wma_find_mcc_ap() - finds if device is operating AP in MCC mode or not
979 * @wma: wma handle.
980 * @vdev_id: vdev ID of device for which MCC has to be checked
981 * @add: flag indicating if current device is added or deleted
982 *
983 * This function parses through all the interfaces in wma and finds if
984 * any of those devces are in MCC mode with AP. If such a vdev is found
985 * involved AP vdevs are sent WDA_UPDATE_Q2Q_IE_IND msg to update their
986 * beacon template to include Q2Q IE.
987 *
988 * Return: none
989 */
Tang Yingying523322d2017-01-17 23:28:43 +0800990static void wma_find_mcc_ap(tp_wma_handle wma, uint8_t vdev_id, bool add)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800991{
992 uint8_t i;
993 uint16_t prev_ch_freq = 0;
994 bool is_ap = false;
995 bool result = false;
996 uint8_t *ap_vdev_ids = NULL;
997 uint8_t num_ch = 0;
998
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530999 ap_vdev_ids = qdf_mem_malloc(wma->max_bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001000 if (!ap_vdev_ids)
1001 return;
1002
1003 for (i = 0; i < wma->max_bssid; i++) {
1004 ap_vdev_ids[i] = -1;
1005 if (add == false && i == vdev_id)
1006 continue;
1007
Mukul Sharmaf9047232017-03-02 16:58:56 +05301008 if (wma_is_vdev_up(vdev_id) || (i == vdev_id && add)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001009 if (wma->interfaces[i].type == WMI_VDEV_TYPE_AP) {
1010 is_ap = true;
1011 ap_vdev_ids[i] = i;
1012 }
1013
1014 if (wma->interfaces[i].mhz != prev_ch_freq) {
1015 num_ch++;
1016 prev_ch_freq = wma->interfaces[i].mhz;
1017 }
1018 }
1019 }
1020
1021 if (is_ap && (num_ch > 1))
1022 result = true;
1023 else
1024 result = false;
1025
1026 wma_send_msg(wma, WMA_UPDATE_Q2Q_IE_IND, (void *)ap_vdev_ids, result);
1027}
1028#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
1029
1030/**
1031 * wma_vdev_start_resp_handler() - vdev start response handler
1032 * @handle: wma handle
1033 * @cmd_param_info: event buffer
1034 * @len: buffer length
1035 *
1036 * Return: 0 for success or error code
1037 */
1038int wma_vdev_start_resp_handler(void *handle, uint8_t *cmd_param_info,
1039 uint32_t len)
1040{
1041 tp_wma_handle wma = (tp_wma_handle) handle;
1042 WMI_VDEV_START_RESP_EVENTID_param_tlvs *param_buf;
1043 wmi_vdev_start_response_event_fixed_param *resp_event;
1044 struct wma_target_req *req_msg;
1045 struct wma_txrx_node *iface;
Govind Singhd76a5b02016-03-08 15:12:14 +05301046 struct vdev_up_params param = {0};
1047 QDF_STATUS status;
Deepak Dhamdhered8455ce2016-11-02 13:11:55 -07001048 int err;
Naveen Rawatf8792bd2017-11-12 21:38:05 -08001049 wmi_host_channel_width chanwidth;
Arunk Khandavallicfde2712018-01-25 11:27:42 +05301050 target_resource_config *wlan_res_cfg;
1051 struct wlan_objmgr_psoc *psoc = wma->psoc;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001052#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
Anurag Chouhan6d760662016-02-20 16:05:43 +05301053 tpAniSirGlobal mac_ctx = cds_get_context(QDF_MODULE_ID_PE);
Arunk Khandavallicfde2712018-01-25 11:27:42 +05301054#endif
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001055
Arunk Khandavallicfde2712018-01-25 11:27:42 +05301056 if (!psoc) {
1057 WMA_LOGE("%s: psoc is NULL", __func__);
1058 return -EINVAL;
1059 }
1060
1061#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001062 if (NULL == mac_ctx) {
1063 WMA_LOGE("%s: Failed to get mac_ctx", __func__);
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07001064 policy_mgr_set_do_hw_mode_change_flag(
Arunk Khandavallicfde2712018-01-25 11:27:42 +05301065 psoc, false);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001066 return -EINVAL;
1067 }
1068#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
1069
1070 WMA_LOGD("%s: Enter", __func__);
Dustin Brown3e619822017-03-17 10:41:56 -07001071
Sourav Mohapatracf632572018-04-02 11:01:35 +05301072 wlan_res_cfg = lmac_get_tgt_res_cfg(psoc);
Arunk Khandavallicfde2712018-01-25 11:27:42 +05301073 if (!wlan_res_cfg) {
1074 WMA_LOGE("%s: Wlan resource config is NULL", __func__);
1075 return -EINVAL;
1076 }
1077
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001078 param_buf = (WMI_VDEV_START_RESP_EVENTID_param_tlvs *) cmd_param_info;
1079 if (!param_buf) {
1080 WMA_LOGE("Invalid start response event buffer");
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07001081 policy_mgr_set_do_hw_mode_change_flag(
1082 wma->psoc, false);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001083 return -EINVAL;
1084 }
1085
1086 resp_event = param_buf->fixed_param;
1087 if (!resp_event) {
1088 WMA_LOGE("Invalid start response event buffer");
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 return -EINVAL;
1092 }
1093
Himanshu Agarwaldfca3d82017-10-06 12:40:27 +05301094 if (resp_event->vdev_id >= wma->max_bssid) {
1095 WMA_LOGE("Invalid vdev id received from firmware");
1096 return -EINVAL;
1097 }
1098
bings1f98e9f2018-01-24 16:13:41 +08001099 if (wma_is_vdev_in_ap_mode(wma, resp_event->vdev_id))
1100 tgt_dfs_radar_enable(wma->pdev, 0, 0);
1101
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301102 if (resp_event->status == QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001103 wma->interfaces[resp_event->vdev_id].tx_streams =
1104 resp_event->cfgd_tx_streams;
1105 wma->interfaces[resp_event->vdev_id].rx_streams =
1106 resp_event->cfgd_rx_streams;
1107 wma->interfaces[resp_event->vdev_id].chain_mask =
1108 resp_event->chain_mask;
Arunk Khandavallicfde2712018-01-25 11:27:42 +05301109 if (wlan_res_cfg->use_pdev_id) {
Govind Singhefc5ccd2016-04-25 11:11:55 +05301110 if (resp_event->pdev_id == WMI_PDEV_ID_SOC) {
1111 WMA_LOGE("%s: soc level id received for mac id",
1112 __func__);
1113 QDF_BUG(0);
1114 return -EINVAL;
1115 }
1116 wma->interfaces[resp_event->vdev_id].mac_id =
1117 WMA_PDEV_TO_MAC_MAP(resp_event->pdev_id);
1118 } else {
1119 wma->interfaces[resp_event->vdev_id].mac_id =
1120 resp_event->mac_id;
1121 }
1122
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07001123 WMA_LOGD("%s: vdev:%d tx ss=%d rx ss=%d chain mask=%d mac=%d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001124 __func__,
1125 resp_event->vdev_id,
1126 wma->interfaces[resp_event->vdev_id].tx_streams,
1127 wma->interfaces[resp_event->vdev_id].rx_streams,
1128 wma->interfaces[resp_event->vdev_id].chain_mask,
1129 wma->interfaces[resp_event->vdev_id].mac_id);
1130 }
1131
Selvaraj, Sridhara0083c42016-06-22 22:15:43 +05301132 iface = &wma->interfaces[resp_event->vdev_id];
1133
Kiran Kumar Lokere5798bfa2017-04-27 20:49:39 -07001134 req_msg = wma_find_vdev_req(wma, resp_event->vdev_id,
Kiran Kumar Lokere20804162017-07-17 16:09:04 -07001135 WMA_TARGET_REQ_TYPE_VDEV_START,
1136 true);
Kiran Kumar Lokere5798bfa2017-04-27 20:49:39 -07001137
1138 if (!req_msg) {
1139 WMA_LOGE("%s: Failed to lookup request message for vdev %d",
1140 __func__, resp_event->vdev_id);
1141 policy_mgr_set_do_hw_mode_change_flag(wma->psoc, false);
1142 return -EINVAL;
1143 }
Abhishek Singhf06214b2018-08-17 12:16:39 +05301144 qdf_mc_timer_stop(&req_msg->event_timeout);
Kiran Kumar Lokere5798bfa2017-04-27 20:49:39 -07001145
Abhishek Singhf06214b2018-08-17 12:16:39 +05301146 if ((qdf_atomic_read(
1147 &wma->interfaces[resp_event->vdev_id].vdev_restart_params.
1148 hidden_ssid_restart_in_progress)) &&
1149 wma_is_vdev_in_ap_mode(wma, resp_event->vdev_id) &&
1150 (req_msg->msg_type == WMA_HIDDEN_SSID_VDEV_RESTART)) {
Kiran Kumar Lokere5798bfa2017-04-27 20:49:39 -07001151 tpHalHiddenSsidVdevRestart hidden_ssid_restart =
1152 (tpHalHiddenSsidVdevRestart)req_msg->user_data;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001153 WMA_LOGE("%s: vdev restart event recevied for hidden ssid set using IOCTL",
1154 __func__);
Anurag Chouhan8e0ccd32016-02-19 15:30:20 +05301155 qdf_atomic_set(&wma->interfaces[resp_event->vdev_id].
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001156 vdev_restart_params.
1157 hidden_ssid_restart_in_progress, 0);
Kiran Kumar Lokere5798bfa2017-04-27 20:49:39 -07001158
1159 wma_send_msg(wma, WMA_HIDDEN_SSID_RESTART_RSP,
1160 (void *)hidden_ssid_restart, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001161 }
1162
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001163#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301164 if (resp_event->status == QDF_STATUS_SUCCESS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001165 && mac_ctx->sap.sap_channel_avoidance)
1166 wma_find_mcc_ap(wma, resp_event->vdev_id, true);
1167#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
1168
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001169 if (req_msg->msg_type == WMA_CHNL_SWITCH_REQ) {
1170 tpSwitchChannelParams params =
1171 (tpSwitchChannelParams) req_msg->user_data;
Krunal Sonia5388a22018-02-12 19:47:44 -08001172
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001173 if (!params) {
1174 WMA_LOGE("%s: channel switch params is NULL for vdev %d",
1175 __func__, resp_event->vdev_id);
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07001176 policy_mgr_set_do_hw_mode_change_flag(
1177 wma->psoc, false);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001178 return -EINVAL;
1179 }
1180
1181 WMA_LOGD("%s: Send channel switch resp vdev %d status %d",
1182 __func__, resp_event->vdev_id, resp_event->status);
1183 params->chainMask = resp_event->chain_mask;
1184 if ((2 != resp_event->cfgd_rx_streams) ||
1185 (2 != resp_event->cfgd_tx_streams)) {
1186 params->nss = 1;
1187 }
1188 params->smpsMode = host_map_smps_mode(resp_event->smps_mode);
1189 params->status = resp_event->status;
Agrawal Ashish7dd7c592016-02-22 14:25:11 +05301190 if (wma->interfaces[resp_event->vdev_id].is_channel_switch) {
1191 wma->interfaces[resp_event->vdev_id].is_channel_switch =
1192 false;
1193 }
Manjunathappa Prakash0e6e6b52016-04-21 11:48:48 -07001194 if (((resp_event->resp_type == WMI_VDEV_RESTART_RESP_EVENT) &&
Krunal Sonia5388a22018-02-12 19:47:44 -08001195 ((iface->type == WMI_VDEV_TYPE_STA) ||
1196 (iface->type == WMI_VDEV_TYPE_MONITOR))) ||
Agrawal Ashish7dd7c592016-02-22 14:25:11 +05301197 ((resp_event->resp_type == WMI_VDEV_START_RESP_EVENT) &&
1198 (iface->type == WMI_VDEV_TYPE_MONITOR))) {
Naveen Rawatd24c1162018-03-07 15:59:31 -08001199 /* for CSA case firmware expects phymode before ch_wd */
1200 err = wma_set_peer_param(wma, iface->bssid,
1201 WMI_PEER_PHYMODE, iface->chanmode,
1202 resp_event->vdev_id);
1203 WMA_LOGD("%s:vdev_id %d chanmode %d status %d",
1204 __func__, resp_event->vdev_id,
1205 iface->chanmode, err);
1206
Naveen Rawatf8792bd2017-11-12 21:38:05 -08001207 chanwidth =
1208 wmi_get_ch_width_from_phy_mode(wma->wmi_handle,
1209 iface->chanmode);
Deepak Dhamdhered8455ce2016-11-02 13:11:55 -07001210 err = wma_set_peer_param(wma, iface->bssid,
1211 WMI_PEER_CHWIDTH, chanwidth,
1212 resp_event->vdev_id);
Deepak Dhamdhered8455ce2016-11-02 13:11:55 -07001213 WMA_LOGD("%s:vdev_id %d chanwidth %d status %d",
1214 __func__, resp_event->vdev_id,
1215 chanwidth, err);
1216
Govind Singhd76a5b02016-03-08 15:12:14 +05301217 param.vdev_id = resp_event->vdev_id;
1218 param.assoc_id = iface->aid;
Dustin Brownec2c92e2017-07-26 11:13:49 -07001219 status = wma_send_vdev_up_to_fw(wma, &param,
1220 iface->bssid);
Govind Singhd76a5b02016-03-08 15:12:14 +05301221 if (QDF_IS_STATUS_ERROR(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001222 WMA_LOGE("%s:vdev_up failed vdev_id %d",
1223 __func__, resp_event->vdev_id);
Mukul Sharmaf9047232017-03-02 16:58:56 +05301224 wma_vdev_set_mlme_state(wma,
1225 resp_event->vdev_id, WLAN_VDEV_S_STOP);
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07001226 policy_mgr_set_do_hw_mode_change_flag(
1227 wma->psoc, false);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001228 } else {
Mukul Sharmaf9047232017-03-02 16:58:56 +05301229 wma_vdev_set_mlme_state(wma,
1230 resp_event->vdev_id, WLAN_VDEV_S_RUN);
Kiran Kumar Lokeref9dc7912017-06-28 18:10:58 -07001231 if (iface->beacon_filter_enabled)
1232 wma_add_beacon_filter(wma,
1233 &iface->beacon_filter);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001234 }
1235 }
1236
Abhishek Singh2d775fd2017-08-18 10:51:33 +05301237 wma_send_msg_high_priority(wma, WMA_SWITCH_CHANNEL_RSP,
1238 (void *)params, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001239 } else if (req_msg->msg_type == WMA_ADD_BSS_REQ) {
1240 tpAddBssParams bssParams = (tpAddBssParams) req_msg->user_data;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001241
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301242 qdf_mem_copy(iface->bssid, bssParams->bssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001243 IEEE80211_ADDR_LEN);
1244 wma_vdev_start_rsp(wma, bssParams, resp_event);
1245 } else if (req_msg->msg_type == WMA_OCB_SET_CONFIG_CMD) {
Govind Singhd76a5b02016-03-08 15:12:14 +05301246 param.vdev_id = resp_event->vdev_id;
1247 param.assoc_id = iface->aid;
Dustin Brownec2c92e2017-07-26 11:13:49 -07001248 if (wma_send_vdev_up_to_fw(wma, &param, iface->bssid) !=
1249 QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001250 WMA_LOGE(FL("failed to send vdev up"));
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07001251 policy_mgr_set_do_hw_mode_change_flag(
1252 wma->psoc, false);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001253 return -EEXIST;
1254 }
Mukul Sharmaf9047232017-03-02 16:58:56 +05301255 wma_vdev_set_mlme_state(wma, resp_event->vdev_id,
1256 WLAN_VDEV_S_RUN);
Zhang Qian47e22ce2018-01-04 15:38:38 +08001257 ucfg_ocb_config_channel(wma->pdev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001258 }
1259
1260 if ((wma->interfaces[resp_event->vdev_id].type == WMI_VDEV_TYPE_AP) &&
Mukul Sharmaf9047232017-03-02 16:58:56 +05301261 wma_is_vdev_up(resp_event->vdev_id))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001262 wma_set_sap_keepalive(wma, resp_event->vdev_id);
1263
Anurag Chouhan210db072016-02-22 18:42:15 +05301264 qdf_mc_timer_destroy(&req_msg->event_timeout);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301265 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001266
1267 return 0;
1268}
1269
Yeshwanth Sriram Guntukad5aae7f2017-11-27 14:33:51 +05301270bool wma_is_vdev_valid(uint32_t vdev_id)
Rajeev Kumard9a43cf2017-07-19 14:55:42 -07001271{
1272 tp_wma_handle wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
1273
Arif Hussain380cfc72017-10-31 13:12:04 -07001274 if (!wma_handle) {
1275 WMA_LOGD("%s: vdev_id: %d, null wma_handle", __func__, vdev_id);
Rajeev Kumard9a43cf2017-07-19 14:55:42 -07001276 return false;
Arif Hussain380cfc72017-10-31 13:12:04 -07001277 }
Rajeev Kumard9a43cf2017-07-19 14:55:42 -07001278
Vignesh Viswanathan9fa8fef2017-12-12 14:45:38 +05301279 /* No of interface are allocated based on max_bssid value */
1280 if (vdev_id >= wma_handle->max_bssid) {
1281 WMA_LOGD("%s: vdev_id: %d is invalid, max_bssid: %d",
1282 __func__, vdev_id, wma_handle->max_bssid);
1283 return false;
1284 }
1285
Arif Hussain380cfc72017-10-31 13:12:04 -07001286 WMA_LOGD("%s: vdev_id: %d, vdev_active: %d, is_vdev_valid %d",
1287 __func__, vdev_id, wma_handle->interfaces[vdev_id].vdev_active,
1288 wma_handle->interfaces[vdev_id].is_vdev_valid);
1289
1290 return wma_handle->interfaces[vdev_id].vdev_active ||
1291 wma_handle->interfaces[vdev_id].is_vdev_valid;
Rajeev Kumard9a43cf2017-07-19 14:55:42 -07001292}
1293
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001294/**
Govind Singhd76a5b02016-03-08 15:12:14 +05301295 * wma_vdev_set_param() - set per vdev params in fw
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001296 * @wmi_handle: wmi handle
Bala Venkatesh110b03e2018-07-10 16:02:08 +05301297 * @if_id: vdev id
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001298 * @param_id: parameter id
1299 * @param_value: parameter value
1300 *
Govind Singhd76a5b02016-03-08 15:12:14 +05301301 * Return: QDF_STATUS_SUCCESS for success or error code
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001302 */
Govind Singhd76a5b02016-03-08 15:12:14 +05301303QDF_STATUS
1304wma_vdev_set_param(wmi_unified_t wmi_handle, uint32_t if_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001305 uint32_t param_id, uint32_t param_value)
1306{
Govind Singhd76a5b02016-03-08 15:12:14 +05301307 struct vdev_set_params param = {0};
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001308
Rajeev Kumard9a43cf2017-07-19 14:55:42 -07001309 if (!wma_is_vdev_valid(if_id)) {
1310 WMA_LOGE(FL("vdev_id: %d is not active reject the req: param id %d val %d"),
1311 if_id, param_id, param_value);
Rajeev Kumard9a43cf2017-07-19 14:55:42 -07001312 return QDF_STATUS_E_INVAL;
1313 }
1314
Govind Singhd76a5b02016-03-08 15:12:14 +05301315 param.if_id = if_id;
1316 param.param_id = param_id;
1317 param.param_value = param_value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001318
Govind Singhd76a5b02016-03-08 15:12:14 +05301319 return wmi_unified_vdev_set_param_send(wmi_handle, &param);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001320}
1321
1322/**
1323 * wma_set_peer_authorized_cb() - set peer authorized callback function
Bala Venkatesh110b03e2018-07-10 16:02:08 +05301324 * @wma_ctx: wma handle
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001325 * @auth_cb: peer authorized callback
1326 *
1327 * Return: none
1328 */
1329void wma_set_peer_authorized_cb(void *wma_ctx, wma_peer_authorized_fp auth_cb)
1330{
1331 tp_wma_handle wma_handle = (tp_wma_handle) wma_ctx;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001332
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001333 wma_handle->peer_authorized_cb = auth_cb;
1334}
1335
1336/**
1337 * wma_set_peer_param() - set peer parameter in fw
1338 * @wma_ctx: wma handle
1339 * @peer_addr: peer mac address
1340 * @param_id: parameter id
1341 * @param_value: parameter value
1342 * @vdev_id: vdev id
1343 *
Govind Singhd76a5b02016-03-08 15:12:14 +05301344 * Return: QDF_STATUS_SUCCESS for success or error code
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001345 */
Govind Singhd76a5b02016-03-08 15:12:14 +05301346QDF_STATUS wma_set_peer_param(void *wma_ctx, uint8_t *peer_addr,
1347 uint32_t param_id, uint32_t param_value,
1348 uint32_t vdev_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001349{
1350 tp_wma_handle wma_handle = (tp_wma_handle) wma_ctx;
Govind Singhd76a5b02016-03-08 15:12:14 +05301351 struct peer_set_params param = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001352 int err;
1353
Govind Singhd76a5b02016-03-08 15:12:14 +05301354 param.vdev_id = vdev_id;
1355 param.param_value = param_value;
1356 param.param_id = param_id;
1357
1358 err = wmi_set_peer_param_send(wma_handle->wmi_handle, peer_addr,
1359 &param);
1360
1361 return err;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001362}
1363
1364/**
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07001365 * wma_remove_peer() - remove peer information from host driver and fw
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001366 * @wma: wma handle
1367 * @bssid: mac address
1368 * @vdev_id: vdev id
1369 * @peer: peer ptr
1370 * @roam_synch_in_progress: roam in progress flag
1371 *
1372 * Return: none
1373 */
1374void wma_remove_peer(tp_wma_handle wma, uint8_t *bssid,
Leo Chang96464902016-10-28 11:10:54 -07001375 uint8_t vdev_id, void *peer,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001376 bool roam_synch_in_progress)
1377{
1378#define PEER_ALL_TID_BITMASK 0xffffffff
1379 uint32_t peer_tid_bitmap = PEER_ALL_TID_BITMASK;
1380 uint8_t *peer_addr = bssid;
gaurank kathpalia89d3c322018-06-21 11:45:32 +05301381 uint8_t peer_mac[QDF_MAC_ADDR_SIZE] = {0};
Govind Singhd76a5b02016-03-08 15:12:14 +05301382 struct peer_flush_params param = {0};
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07001383 uint8_t *peer_mac_addr;
Leo Chang96464902016-10-28 11:10:54 -07001384 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Krunal Soniee5d1ad2018-05-29 15:25:30 -07001385 void *pdev = cds_get_context(QDF_MODULE_ID_TXRX);
1386 void *vdev;
Naveen Rawatf4ada152017-09-05 14:56:12 -07001387 QDF_STATUS qdf_status;
Lin Bai973e6922018-01-08 17:59:19 +08001388 uint32_t bitmap = 1 << CDP_PEER_DELETE_NO_SPECIAL;
Govind Singhd76a5b02016-03-08 15:12:14 +05301389
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001390 if (!wma->interfaces[vdev_id].peer_count) {
1391 WMA_LOGE("%s: Can't remove peer with peer_addr %pM vdevid %d peer_count %d",
1392 __func__, bssid, vdev_id,
1393 wma->interfaces[vdev_id].peer_count);
Himanshu Agarwal074340d2018-06-18 17:02:58 +05301394 QDF_BUG(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001395 return;
1396 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001397
Nishank Aggarwala13b61d2016-12-01 12:53:58 +05301398 if (!soc) {
1399 WMA_LOGE("%s:SOC context is NULL", __func__);
Himanshu Agarwal074340d2018-06-18 17:02:58 +05301400 QDF_BUG(0);
Nishank Aggarwala13b61d2016-12-01 12:53:58 +05301401 return;
1402 }
1403
Sravan Kumar Kairamd431e5b2018-06-12 20:07:29 +05301404 if (!peer) {
1405 WMA_LOGE("%s: PEER is NULL for vdev_id: %d", __func__, vdev_id);
Himanshu Agarwal074340d2018-06-18 17:02:58 +05301406 QDF_BUG(0);
Sravan Kumar Kairamd431e5b2018-06-12 20:07:29 +05301407 return;
1408 }
Leo Chang96464902016-10-28 11:10:54 -07001409 peer_mac_addr = cdp_peer_get_peer_mac_addr(soc, peer);
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07001410 if (peer_mac_addr == NULL) {
1411 WMA_LOGE("%s: peer mac addr is NULL, Can't remove peer with peer_addr %pM vdevid %d peer_count %d",
1412 __func__, bssid, vdev_id,
1413 wma->interfaces[vdev_id].peer_count);
Himanshu Agarwal074340d2018-06-18 17:02:58 +05301414 QDF_BUG(0);
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07001415 return;
1416 }
Mohit Khannab8b6e582018-07-23 11:37:12 -07001417 vdev = cdp_get_vdev_from_vdev_id(soc, pdev, vdev_id);
1418 if (!vdev) {
1419 WMA_LOGE("%s vdev is null for peer peer->mac_addr %pM",
1420 __func__, peer_mac_addr);
1421 QDF_BUG(0);
1422 return;
1423 }
1424
1425 cdp_peer_teardown(soc, vdev, peer);
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07001426
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001427 if (roam_synch_in_progress)
jge6435f4f2017-01-09 11:35:45 +08001428 goto peer_detach;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001429 /* Flush all TIDs except MGMT TID for this peer in Target */
1430 peer_tid_bitmap &= ~(0x1 << WMI_MGMT_TID);
Govind Singhd76a5b02016-03-08 15:12:14 +05301431 param.peer_tid_bitmap = peer_tid_bitmap;
1432 param.vdev_id = vdev_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001433 wmi_unified_peer_flush_tids_send(wma->wmi_handle, bssid,
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07001434 &param);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001435
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07001436 if (wma_is_vdev_in_ibss_mode(wma, vdev_id)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001437 WMA_LOGD("%s: bssid %pM peer->mac_addr %pM", __func__,
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07001438 bssid, peer_mac_addr);
1439 peer_addr = peer_mac_addr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001440 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001441
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001442 /* peer->ref_cnt is not visible in WMA */
1443 wlan_roam_debug_log(vdev_id, DEBUG_PEER_DELETE_SEND,
1444 DEBUG_INVALID_PEER_ID, peer_addr, peer,
1445 0, 0);
Naveen Rawatf4ada152017-09-05 14:56:12 -07001446 qdf_status = wmi_unified_peer_delete_send(wma->wmi_handle, peer_addr,
1447 vdev_id);
1448 if (QDF_IS_STATUS_ERROR(qdf_status)) {
1449 WMA_LOGE("%s Peer delete could not be sent to firmware %d",
1450 __func__, qdf_status);
Lin Bai973e6922018-01-08 17:59:19 +08001451 /* Clear default bit and set to NOT_START_UNMAP */
1452 bitmap = 1 << CDP_PEER_DO_NOT_START_UNMAP_TIMER;
Naveen Rawatf4ada152017-09-05 14:56:12 -07001453 }
jge6435f4f2017-01-09 11:35:45 +08001454
1455peer_detach:
Sravan Kumar Kairamd431e5b2018-06-12 20:07:29 +05301456 WMA_LOGD("%s: vdev %pK is detaching %pK with peer_addr %pM vdevid %d peer_count %d",
gaurank kathpalia89d3c322018-06-21 11:45:32 +05301457 __func__, vdev, peer, peer_mac_addr, vdev_id,
1458 wma->interfaces[vdev_id].peer_count);
1459 /* Copy peer mac to find and delete objmgr peer */
1460 qdf_mem_copy(peer_mac, peer_mac_addr, QDF_MAC_ADDR_SIZE);
Krunal Sonid90ed4e2018-06-28 14:27:35 -07001461 if (roam_synch_in_progress &&
1462 is_cdp_peer_detach_force_delete_supported(soc)) {
1463 WMA_LOGD("%s: LFR3: trigger force delete for peer %pM",
1464 __func__, peer_mac_addr);
Sravan Kumar Kairamd431e5b2018-06-12 20:07:29 +05301465 cdp_peer_detach_force_delete(soc, peer);
Krunal Sonid90ed4e2018-06-28 14:27:35 -07001466 } else {
1467 if (roam_synch_in_progress) {
1468 WMA_LOGD("%s: LFR3: normal peer delete for peer %pM",
1469 __func__, peer_mac_addr);
1470 }
Sravan Kumar Kairamd431e5b2018-06-12 20:07:29 +05301471 cdp_peer_delete(soc, peer, bitmap);
Krunal Sonid90ed4e2018-06-28 14:27:35 -07001472 }
jge6435f4f2017-01-09 11:35:45 +08001473
gaurank kathpalia89d3c322018-06-21 11:45:32 +05301474 wma_remove_objmgr_peer(wma, vdev_id, peer_mac);
1475
jge6435f4f2017-01-09 11:35:45 +08001476 wma->interfaces[vdev_id].peer_count--;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001477#undef PEER_ALL_TID_BITMASK
1478}
1479
1480/**
Abhishek Singh32517ed2017-05-29 14:25:14 +05301481 * wma_find_duplicate_peer_on_other_vdev() - Find if same peer exist
1482 * on other vdevs
1483 * @wma: wma handle
1484 * @pdev: txrx pdev ptr
1485 * @vdev_id: vdev id of vdev on which the peer
1486 * needs to be added
1487 * @peer_mac: peer mac addr which needs to be added
1488 *
1489 * Check if peer with same MAC is present on vdev other then
1490 * the provided vdev_id
1491 *
1492 * Return: true if same peer is present on vdev other then vdev_id
1493 * else return false
1494 */
1495static bool wma_find_duplicate_peer_on_other_vdev(tp_wma_handle wma,
1496 struct cdp_pdev *pdev, uint8_t vdev_id, uint8_t *peer_mac)
1497{
1498 int i;
1499 uint8_t peer_id;
1500 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
1501
1502 for (i = 0; i < wma->max_bssid; i++) {
1503 /* Need to check vdevs other than the vdev_id */
1504 if (vdev_id == i ||
1505 !wma->interfaces[i].handle)
1506 continue;
1507 if (cdp_peer_find_by_addr_and_vdev(soc, pdev,
1508 wma->interfaces[i].handle, peer_mac, &peer_id)) {
1509 WMA_LOGE("%s :Duplicate peer %pM (peer id %d) already exist on vdev %d",
1510 __func__, peer_mac, peer_id, i);
1511 return true;
1512 }
1513 }
1514 return false;
1515}
1516
1517/**
gaurank kathpalia89d3c322018-06-21 11:45:32 +05301518 * wma_get_peer_type() - Determine the type of peer(eg. STA/AP) and return it
1519 * @wma: wma handle
1520 * @vdev_id: vdev id
Bala Venkatesh110b03e2018-07-10 16:02:08 +05301521 * @peer_addr: peer mac address
1522 * @wma_peer_type: wma peer type
gaurank kathpalia89d3c322018-06-21 11:45:32 +05301523 *
1524 * Return: Peer type
1525 */
Bala Venkatesh110b03e2018-07-10 16:02:08 +05301526static int wma_get_obj_mgr_peer_type(tp_wma_handle wma, uint8_t vdev_id,
1527 uint8_t *peer_addr, uint32_t wma_peer_type)
gaurank kathpalia89d3c322018-06-21 11:45:32 +05301528
1529{
1530 uint32_t obj_peer_type = 0;
1531
1532 WMA_LOGD("vdev id %d vdev type %d vdev subtype %d peer addr %pM vdev addr %pM",
1533 vdev_id, wma->interfaces[vdev_id].type,
1534 wma->interfaces[vdev_id].sub_type, peer_addr,
1535 wma->interfaces[vdev_id].addr);
1536
Bala Venkatesh110b03e2018-07-10 16:02:08 +05301537 if (wma_peer_type == WMI_PEER_TYPE_TDLS)
1538 return WLAN_PEER_TDLS;
1539
gaurank kathpalia89d3c322018-06-21 11:45:32 +05301540 if (!qdf_mem_cmp(wma->interfaces[vdev_id].addr, peer_addr,
1541 IEEE80211_ADDR_LEN)) {
1542 obj_peer_type = WLAN_PEER_SELF;
1543 } else if (wma->interfaces[vdev_id].type == WMI_VDEV_TYPE_STA) {
1544 if (wma->interfaces[vdev_id].sub_type ==
1545 WMI_UNIFIED_VDEV_SUBTYPE_P2P_CLIENT)
1546 obj_peer_type = WLAN_PEER_P2P_GO;
1547 else
1548 obj_peer_type = WLAN_PEER_AP;
1549 } else if (wma->interfaces[vdev_id].type == WMI_VDEV_TYPE_AP) {
1550 if (wma->interfaces[vdev_id].sub_type ==
1551 WMI_UNIFIED_VDEV_SUBTYPE_P2P_GO)
1552 obj_peer_type = WLAN_PEER_P2P_CLI;
1553 else
1554 obj_peer_type = WLAN_PEER_STA;
1555 } else if (wma->interfaces[vdev_id].type == WMI_VDEV_TYPE_IBSS) {
1556 obj_peer_type = WLAN_PEER_IBSS;
1557 } else if (wma->interfaces[vdev_id].type == WMI_VDEV_TYPE_NDI) {
1558 obj_peer_type = WLAN_PEER_NDP;
1559 } else {
1560 WMA_LOGE("Couldnt find peertype for type %d and sub type %d",
1561 wma->interfaces[vdev_id].type,
1562 wma->interfaces[vdev_id].sub_type);
1563 }
1564
1565 return obj_peer_type;
1566
1567}
1568
1569/**
1570 * wma_create_objmgr_peer() - create objmgr peer information in host driver
1571 * @wma: wma handle
1572 * @vdev_id: vdev id
Bala Venkatesh110b03e2018-07-10 16:02:08 +05301573 * @peer_addr: peer mac address
1574 * @wma_peer_type: peer type
gaurank kathpalia89d3c322018-06-21 11:45:32 +05301575 *
1576 * Return: objmgr peer pointer
1577 */
1578
1579static struct wlan_objmgr_peer *wma_create_objmgr_peer(tp_wma_handle wma,
Bala Venkatesh110b03e2018-07-10 16:02:08 +05301580 uint8_t vdev_id,
1581 uint8_t *peer_addr,
1582 uint32_t wma_peer_type)
gaurank kathpalia89d3c322018-06-21 11:45:32 +05301583{
1584 uint32_t obj_peer_type = 0;
1585 struct wlan_objmgr_peer *obj_peer = NULL;
1586 struct wlan_objmgr_vdev *obj_vdev = NULL;
1587 struct wlan_objmgr_psoc *psoc = wma->psoc;
1588
Bala Venkatesh110b03e2018-07-10 16:02:08 +05301589 obj_peer_type = wma_get_obj_mgr_peer_type(wma, vdev_id, peer_addr,
1590 wma_peer_type);
gaurank kathpalia89d3c322018-06-21 11:45:32 +05301591 if (!obj_peer_type) {
1592 WMA_LOGE("Invalid obj peer type. Unable to create peer %d",
1593 obj_peer_type);
1594 return NULL;
1595 }
1596
1597 /* Create obj_mgr peer */
1598 obj_vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
1599 WLAN_LEGACY_WMA_ID);
1600
1601 if (!obj_vdev) {
1602 WMA_LOGE("Invalid obj vdev. Unable to create peer %d",
1603 obj_peer_type);
1604 return NULL;
1605 }
1606
1607 obj_peer = wlan_objmgr_peer_obj_create(obj_vdev, obj_peer_type,
1608 peer_addr);
1609 wlan_objmgr_vdev_release_ref(obj_vdev, WLAN_LEGACY_WMA_ID);
1610 if (obj_peer)
1611 WMA_LOGD("Peer %pM added successfully! Type: %d", peer_addr,
1612 obj_peer_type);
1613
1614 return obj_peer;
1615
1616}
1617/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001618 * wma_create_peer() - send peer create command to fw
1619 * @wma: wma handle
1620 * @pdev: txrx pdev ptr
1621 * @vdev: txrx vdev ptr
1622 * @peer_addr: peer mac addr
1623 * @peer_type: peer type
1624 * @vdev_id: vdev id
1625 * @roam_synch_in_progress: roam in progress
1626 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301627 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001628 */
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08001629QDF_STATUS wma_create_peer(tp_wma_handle wma, struct cdp_pdev *pdev,
1630 struct cdp_vdev *vdev,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001631 u8 peer_addr[IEEE80211_ADDR_LEN],
1632 uint32_t peer_type, uint8_t vdev_id,
1633 bool roam_synch_in_progress)
1634{
Leo Chang96464902016-10-28 11:10:54 -07001635 void *peer = NULL;
Govind Singhd76a5b02016-03-08 15:12:14 +05301636 struct peer_create_params param = {0};
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07001637 uint8_t *mac_addr_raw;
Arunk Khandavallicfde2712018-01-25 11:27:42 +05301638 void *dp_soc = cds_get_context(QDF_MODULE_ID_SOC);
1639 struct wlan_objmgr_psoc *psoc = wma->psoc;
1640 target_resource_config *wlan_res_cfg;
gaurank kathpalia89d3c322018-06-21 11:45:32 +05301641 struct wlan_objmgr_peer *obj_peer = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001642
Pragaspathi Thilagaraj1e0e6db2018-08-05 19:02:07 +05301643 if (!cds_is_target_ready()) {
1644 WMA_LOGE(FL("target not ready, drop the request"));
1645 return QDF_STATUS_E_BUSY;
1646 }
1647
Arunk Khandavallicfde2712018-01-25 11:27:42 +05301648 if (!psoc) {
1649 WMA_LOGE("%s: psoc is NULL", __func__);
1650 return QDF_STATUS_E_INVAL;
1651 }
1652
Sourav Mohapatracf632572018-04-02 11:01:35 +05301653 wlan_res_cfg = lmac_get_tgt_res_cfg(psoc);
Arunk Khandavallicfde2712018-01-25 11:27:42 +05301654 if (!wlan_res_cfg) {
1655 WMA_LOGE("%s: psoc target res cfg is null", __func__);
1656 return QDF_STATUS_E_INVAL;
1657 }
Abhishek Singh32517ed2017-05-29 14:25:14 +05301658
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001659 if (++wma->interfaces[vdev_id].peer_count >
Arunk Khandavallicfde2712018-01-25 11:27:42 +05301660 wlan_res_cfg->num_peers) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07001661 WMA_LOGE("%s, the peer count exceeds the limit %d", __func__,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001662 wma->interfaces[vdev_id].peer_count - 1);
1663 goto err;
1664 }
Deepak Dhamdherec47cfe82016-08-22 01:00:13 -07001665
Arunk Khandavallicfde2712018-01-25 11:27:42 +05301666 if (!dp_soc) {
1667 WMA_LOGE("%s:DP SOC context is NULL", __func__);
Nishank Aggarwala13b61d2016-12-01 12:53:58 +05301668 goto err;
1669 }
1670
Abhishek Singh32517ed2017-05-29 14:25:14 +05301671 /*
1672 * Check if peer with same MAC exist on other Vdev, If so avoid
1673 * adding this peer, as it will cause FW to crash.
1674 */
1675 if (wma_find_duplicate_peer_on_other_vdev(wma, pdev,
1676 vdev_id, peer_addr))
1677 goto err;
1678
Bala Venkatesh110b03e2018-07-10 16:02:08 +05301679 obj_peer = wma_create_objmgr_peer(wma, vdev_id, peer_addr, peer_type);
gaurank kathpalia89d3c322018-06-21 11:45:32 +05301680 if (!obj_peer)
1681 goto err;
1682
Dhanashri Atre272fd232016-11-10 16:20:46 -08001683 /* The peer object should be created before sending the WMI peer
1684 * create command to firmware. This is to prevent a race condition
1685 * where the HTT peer map event is received before the peer object
1686 * is created in the data path
1687 */
Sravan Kumar Kairamc273afd2018-05-28 12:12:28 +05301688 peer = cdp_peer_create(dp_soc, vdev, peer_addr,
1689 (struct cdp_ctrl_objmgr_peer *)obj_peer);
Dhanashri Atre272fd232016-11-10 16:20:46 -08001690 if (!peer) {
1691 WMA_LOGE("%s : Unable to attach peer %pM", __func__, peer_addr);
gaurank kathpalia89d3c322018-06-21 11:45:32 +05301692 wlan_objmgr_peer_obj_delete(obj_peer);
Dhanashri Atre272fd232016-11-10 16:20:46 -08001693 goto err;
1694 }
Sravan Kumar Kairamd431e5b2018-06-12 20:07:29 +05301695 WMA_LOGD("%s: vdev %pK is attaching peer:%pK peer_addr %pM to vdev_id %d, peer_count - %d",
Krunal Soniee5d1ad2018-05-29 15:25:30 -07001696 __func__, vdev, peer, peer_addr, vdev_id,
1697 wma->interfaces[vdev_id].peer_count);
Dhanashri Atre272fd232016-11-10 16:20:46 -08001698
Sravan Kumar Kairamc273afd2018-05-28 12:12:28 +05301699 wlan_peer_set_dp_handle(obj_peer, peer);
1700
Deepak Dhamdheref74d6f82016-09-16 02:47:01 -07001701 if (roam_synch_in_progress) {
Abhinav Kumar50d4dc72018-06-15 16:35:50 +05301702 WMA_LOGD("%s: LFR3: Created peer %pK with peer_addr %pM vdev_id %d, peer_count - %d",
Mohit Khanna3aee1312016-07-28 19:07:05 -07001703 __func__, peer, peer_addr, vdev_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001704 wma->interfaces[vdev_id].peer_count);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301705 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001706 }
Govind Singhd76a5b02016-03-08 15:12:14 +05301707 param.peer_addr = peer_addr;
1708 param.peer_type = peer_type;
1709 param.vdev_id = vdev_id;
1710 if (wmi_unified_peer_create_send(wma->wmi_handle,
1711 &param) != QDF_STATUS_SUCCESS) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07001712 WMA_LOGE("%s : Unable to create peer in Target", __func__);
Sravan Kumar Kairamd431e5b2018-06-12 20:07:29 +05301713 cdp_peer_delete(dp_soc, peer,
1714 1 << CDP_PEER_DO_NOT_START_UNMAP_TIMER);
gaurank kathpalia89d3c322018-06-21 11:45:32 +05301715 wlan_objmgr_peer_obj_delete(obj_peer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001716 goto err;
1717 }
Dhanashri Atre272fd232016-11-10 16:20:46 -08001718
Jeff Johnsonadba3962017-09-18 08:12:35 -07001719 WMA_LOGD("%s: Created peer %pK with peer_addr %pM vdev_id %d, peer_count - %d",
Leo Chang96464902016-10-28 11:10:54 -07001720 __func__, peer, peer_addr, vdev_id,
Mohit Khanna3aee1312016-07-28 19:07:05 -07001721 wma->interfaces[vdev_id].peer_count);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001722
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001723 wlan_roam_debug_log(vdev_id, DEBUG_PEER_CREATE_SEND,
1724 DEBUG_INVALID_PEER_ID, peer_addr, peer, 0, 0);
Arunk Khandavallicfde2712018-01-25 11:27:42 +05301725 cdp_peer_setup(dp_soc, vdev, peer);
Dhanashri Atre272fd232016-11-10 16:20:46 -08001726
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07001727 WMA_LOGD("%s: Initialized peer with peer_addr %pM vdev_id %d",
Dhanashri Atre272fd232016-11-10 16:20:46 -08001728 __func__, peer_addr, vdev_id);
1729
Arunk Khandavallicfde2712018-01-25 11:27:42 +05301730 mac_addr_raw = cdp_get_vdev_mac_addr(dp_soc, vdev);
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07001731 if (mac_addr_raw == NULL) {
1732 WMA_LOGE("%s: peer mac addr is NULL", __func__);
1733 return QDF_STATUS_E_FAULT;
1734 }
1735
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001736 /* for each remote ibss peer, clear its keys */
1737 if (wma_is_vdev_in_ibss_mode(wma, vdev_id) &&
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07001738 qdf_mem_cmp(peer_addr, mac_addr_raw, IEEE80211_ADDR_LEN)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001739 tSetStaKeyParams key_info;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001740
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001741 WMA_LOGD("%s: remote ibss peer %pM key clearing\n", __func__,
1742 peer_addr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301743 qdf_mem_set(&key_info, sizeof(key_info), 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001744 key_info.smesessionId = vdev_id;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301745 qdf_mem_copy(key_info.peer_macaddr.bytes, peer_addr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001746 IEEE80211_ADDR_LEN);
1747 key_info.sendRsp = false;
1748
1749 wma_set_stakey(wma, &key_info);
1750 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001751
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301752 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001753err:
1754 wma->interfaces[vdev_id].peer_count--;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301755 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001756}
1757
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001758/**
Liangwei Dong748cb5d2016-09-29 00:56:40 -04001759 * wma_cleanup_target_req_param() - free param memory of target request
1760 * @tgt_req: target request params
1761 *
1762 * Return: none
1763 */
1764static void wma_cleanup_target_req_param(struct wma_target_req *tgt_req)
1765{
1766 if (tgt_req->msg_type == WMA_CHNL_SWITCH_REQ ||
1767 tgt_req->msg_type == WMA_DELETE_BSS_REQ ||
1768 tgt_req->msg_type == WMA_ADD_BSS_REQ) {
1769 qdf_mem_free(tgt_req->user_data);
1770 tgt_req->user_data = NULL;
1771 }
Krishna Kumaar Natarajanfc8c3632017-05-24 17:09:40 -07001772
1773 if (tgt_req->msg_type == WMA_SET_LINK_STATE && tgt_req->user_data) {
1774 tpLinkStateParams params =
1775 (tpLinkStateParams) tgt_req->user_data;
1776 qdf_mem_free(params->callbackArg);
Pragaspathi Thilagaraj210362a2018-07-31 19:08:19 +05301777 params->callbackArg = NULL;
Krishna Kumaar Natarajanfc8c3632017-05-24 17:09:40 -07001778 qdf_mem_free(tgt_req->user_data);
1779 tgt_req->user_data = NULL;
1780 }
Liangwei Dong748cb5d2016-09-29 00:56:40 -04001781}
1782
1783/**
Krishna Kumaar Natarajanf24bfc82017-02-07 11:54:05 -08001784 * wma_remove_bss_peer() - remove BSS peer
1785 * @wma: pointer to WMA handle
1786 * @pdev: pointer to PDEV
1787 * @req_msg: pointer to WMA target Request
1788 * @vdev_id: vdev id on which delete BSS request was received
1789 * @params: pointer to Delete BSS params
1790 *
1791 * This function is called on receiving vdev stop response from FW or
1792 * vdev stop response timeout. In case of IBSS/NDI, use vdev's self MAC
1793 * for removing the peer. In case of STA/SAP use bssid passed as part of
1794 * delete STA parameter.
1795 *
1796 * Return: 0 on success, ERROR code on failure
1797 */
1798static int wma_remove_bss_peer(tp_wma_handle wma, void *pdev,
1799 struct wma_target_req *req_msg, uint32_t vdev_id,
1800 tpDeleteBssParams params)
1801{
1802 void *peer, *vdev;
1803 uint8_t peer_id;
1804 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
1805 uint8_t *mac_addr = NULL;
Abhishek Singhe8be9a62017-05-30 12:13:29 +05301806 struct wma_target_req *del_req;
Kabilan Kannan3618a752018-06-10 23:44:32 -07001807 int ret_value = 0;
Krishna Kumaar Natarajanf24bfc82017-02-07 11:54:05 -08001808
1809 vdev = cdp_get_vdev_from_vdev_id(soc, pdev, vdev_id);
1810 if (!vdev) {
1811 WMA_LOGE(FL("vdev is NULL for vdev_id = %d"), vdev_id);
1812 wma_cleanup_target_req_param(req_msg);
1813 return -EINVAL;
1814 }
1815
1816 if (wma_is_vdev_in_ibss_mode(wma, vdev_id) ||
1817 WMA_IS_VDEV_IN_NDI_MODE(wma->interfaces, vdev_id)) {
1818 mac_addr = cdp_get_vdev_mac_addr(soc, vdev);
1819 if (!mac_addr) {
1820 WMA_LOGE(FL("mac_addr is NULL for vdev_id = %d"),
1821 vdev_id);
1822 wma_cleanup_target_req_param(req_msg);
1823 return -EINVAL;
1824 }
1825 } else {
1826 mac_addr = params->bssid;
1827 }
1828
Kabilan Kannan3618a752018-06-10 23:44:32 -07001829 peer = cdp_peer_get_ref_by_addr(soc, pdev, mac_addr,
1830 &peer_id,
Manjunathappa Prakash1253c3d2018-08-22 15:52:14 -07001831 PEER_DEBUG_ID_WMA_DEL_BSS);
Krishna Kumaar Natarajanf24bfc82017-02-07 11:54:05 -08001832 if (!peer) {
1833 WMA_LOGE(FL("peer NULL for vdev_id = %d"), vdev_id);
1834 wma_cleanup_target_req_param(req_msg);
1835 return -EINVAL;
1836 }
1837
1838 wma_remove_peer(wma, mac_addr, vdev_id, peer, false);
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05301839 if (wmi_service_enabled(
1840 wma->wmi_handle,
1841 wmi_service_sync_delete_cmds)) {
Abhishek Singhe8be9a62017-05-30 12:13:29 +05301842 WMA_LOGD(FL("Wait for the peer delete. vdev_id %d"),
1843 req_msg->vdev_id);
1844 del_req = wma_fill_hold_req(wma,
1845 req_msg->vdev_id,
1846 WMA_DELETE_STA_REQ,
1847 WMA_DELETE_PEER_RSP,
1848 params,
1849 WMA_DELETE_STA_TIMEOUT);
1850 if (!del_req) {
1851 WMA_LOGE(FL("Failed to allocate request. vdev_id %d"),
1852 req_msg->vdev_id);
1853 params->status = QDF_STATUS_E_NOMEM;
Kabilan Kannan3618a752018-06-10 23:44:32 -07001854 ret_value = -EINVAL;
Abhishek Singhe8be9a62017-05-30 12:13:29 +05301855 }
1856 }
Kabilan Kannan3618a752018-06-10 23:44:32 -07001857 if (peer)
1858 cdp_peer_release_ref(soc, peer,
Manjunathappa Prakash1253c3d2018-08-22 15:52:14 -07001859 PEER_DEBUG_ID_WMA_DEL_BSS);
Kabilan Kannan3618a752018-06-10 23:44:32 -07001860 return ret_value;
Krishna Kumaar Natarajanf24bfc82017-02-07 11:54:05 -08001861}
1862
Nachiket Kukade177b5b02018-05-22 20:52:17 +05301863#ifdef FEATURE_WLAN_APF
Hanumanth Reddy Pothulae87621b2017-04-12 20:53:35 +05301864/*
Nachiket Kukadee547a482018-05-22 16:43:30 +05301865 * get_fw_active_apf_mode() - convert HDD APF mode to FW configurable APF
Hanumanth Reddy Pothulae87621b2017-04-12 20:53:35 +05301866 * mode
Nachiket Kukadee547a482018-05-22 16:43:30 +05301867 * @mode: APF mode maintained in HDD
Hanumanth Reddy Pothulae87621b2017-04-12 20:53:35 +05301868 *
1869 * Return: FW configurable BP mode
1870 */
Nachiket Kukadee547a482018-05-22 16:43:30 +05301871static enum wmi_host_active_apf_mode
1872get_fw_active_apf_mode(enum active_apf_mode mode)
Hanumanth Reddy Pothulae87621b2017-04-12 20:53:35 +05301873{
1874 switch (mode) {
Nachiket Kukadee547a482018-05-22 16:43:30 +05301875 case ACTIVE_APF_DISABLED:
1876 return WMI_HOST_ACTIVE_APF_DISABLED;
1877 case ACTIVE_APF_ENABLED:
1878 return WMI_HOST_ACTIVE_APF_ENABLED;
1879 case ACTIVE_APF_ADAPTIVE:
1880 return WMI_HOST_ACTIVE_APF_ADAPTIVE;
Hanumanth Reddy Pothulae87621b2017-04-12 20:53:35 +05301881 default:
Nachiket Kukadee547a482018-05-22 16:43:30 +05301882 WMA_LOGE("Invalid Active APF Mode %d; Using 'disabled'", mode);
1883 return WMI_HOST_ACTIVE_APF_DISABLED;
Hanumanth Reddy Pothulae87621b2017-04-12 20:53:35 +05301884 }
1885}
1886
Krishna Kumaar Natarajanf24bfc82017-02-07 11:54:05 -08001887/**
Nachiket Kukadee547a482018-05-22 16:43:30 +05301888 * wma_config_active_apf_mode() - Config active APF mode in FW
Dustin Brown13995f02017-01-12 15:38:42 -08001889 * @wma: the WMA handle
1890 * @vdev_id: the Id of the vdev for which the configuration should be applied
1891 *
1892 * Return: QDF status
1893 */
Nachiket Kukadee547a482018-05-22 16:43:30 +05301894static QDF_STATUS wma_config_active_apf_mode(t_wma_handle *wma, uint8_t vdev_id)
Dustin Brown13995f02017-01-12 15:38:42 -08001895{
Nachiket Kukadee547a482018-05-22 16:43:30 +05301896 enum wmi_host_active_apf_mode uc_mode, mcbc_mode;
Dustin Brown13995f02017-01-12 15:38:42 -08001897
Nachiket Kukadee547a482018-05-22 16:43:30 +05301898 uc_mode = get_fw_active_apf_mode(wma->active_uc_apf_mode);
1899 mcbc_mode = get_fw_active_apf_mode(wma->active_mc_bc_apf_mode);
Dustin Brown13995f02017-01-12 15:38:42 -08001900
Nachiket Kukadee547a482018-05-22 16:43:30 +05301901 WMA_LOGD("Configuring Active APF Mode UC:%d MC/BC:%d for vdev %u",
1902 uc_mode, mcbc_mode, vdev_id);
Dustin Brown13995f02017-01-12 15:38:42 -08001903
Nachiket Kukadee547a482018-05-22 16:43:30 +05301904 return wmi_unified_set_active_apf_mode_cmd(wma->wmi_handle, vdev_id,
Dustin Brown13995f02017-01-12 15:38:42 -08001905 uc_mode, mcbc_mode);
1906}
Nachiket Kukade177b5b02018-05-22 20:52:17 +05301907#else /* FEATURE_WLAN_APF */
1908static QDF_STATUS wma_config_active_apf_mode(t_wma_handle *wma, uint8_t vdev_id)
1909{
1910 return QDF_STATUS_SUCCESS;
1911}
1912#endif /* FEATURE_WLAN_APF */
Dustin Brown13995f02017-01-12 15:38:42 -08001913
Abhishek Singhe8be9a62017-05-30 12:13:29 +05301914#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
1915/**
1916 * wma_check_and_find_mcc_ap() - finds if device is operating AP
1917 * in MCC mode or not
1918 * @wma: wma handle.
1919 * @vdev_id: vdev ID of device for which MCC has to be checked
1920 *
1921 * This function internally calls wma_find_mcc_ap finds if
1922 * device is operating AP in MCC mode or not
1923 *
1924 * Return: none
1925 */
1926static void
1927wma_check_and_find_mcc_ap(tp_wma_handle wma, uint8_t vdev_id)
1928{
1929 tpAniSirGlobal mac_ctx = cds_get_context(QDF_MODULE_ID_PE);
1930
1931 if (NULL == mac_ctx) {
1932 WMA_LOGE("%s: Failed to get mac_ctx", __func__);
1933 return;
1934 }
1935 if (mac_ctx->sap.sap_channel_avoidance)
1936 wma_find_mcc_ap(wma, vdev_id, false);
1937}
1938#else
1939static inline void
1940wma_check_and_find_mcc_ap(tp_wma_handle wma, uint8_t vdev_id)
1941{}
1942#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
1943
1944/**
1945 * wma_send_del_bss_response() - send del bss resp to upper layer
1946 * @wma: wma handle.
1947 * @vdev_id: vdev ID of device for which MCC has to be checked
1948 *
1949 * This function sends del bss resp to upper layer
1950 *
1951 * Return: none
1952 */
1953static void
1954wma_send_del_bss_response(tp_wma_handle wma, struct wma_target_req *req,
1955 uint8_t vdev_id)
1956{
1957 struct wma_txrx_node *iface;
1958 struct beacon_info *bcn;
1959 tpDeleteBssParams params;
1960 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
1961
1962 if (!req) {
1963 WMA_LOGE("%s req is NULL", __func__);
1964 return;
1965 }
1966
1967 iface = &wma->interfaces[vdev_id];
1968 if (!iface->handle) {
1969 WMA_LOGE("%s vdev id %d is already deleted",
1970 __func__, vdev_id);
1971 if (req->user_data)
1972 qdf_mem_free(req->user_data);
1973 req->user_data = NULL;
1974 return;
1975 }
Abhishek Singhe8be9a62017-05-30 12:13:29 +05301976
Dustin Brownec2c92e2017-07-26 11:13:49 -07001977 params = (tpDeleteBssParams)req->user_data;
1978 if (wma_send_vdev_down_to_fw(wma, vdev_id) != QDF_STATUS_SUCCESS) {
1979 WMA_LOGE("Failed to send vdev down cmd: vdev %d", vdev_id);
Abhishek Singhe8be9a62017-05-30 12:13:29 +05301980 } else {
Dustin Brownec2c92e2017-07-26 11:13:49 -07001981 wma_vdev_set_mlme_state(wma, vdev_id, WLAN_VDEV_S_STOP);
Abhishek Singhe8be9a62017-05-30 12:13:29 +05301982 wma_check_and_find_mcc_ap(wma, vdev_id);
1983 }
1984
1985 cdp_fc_vdev_flush(soc, iface->handle);
1986 WMA_LOGD("%s, vdev_id: %d, un-pausing tx_ll_queue for VDEV_STOP rsp",
1987 __func__, vdev_id);
1988 cdp_fc_vdev_unpause(soc, iface->handle,
1989 OL_TXQ_PAUSE_REASON_VDEV_STOP);
1990 wma_vdev_clear_pause_bit(vdev_id, PAUSE_TYPE_HOST);
1991 qdf_atomic_set(&iface->bss_status, WMA_BSS_STATUS_STOPPED);
1992 WMA_LOGD("%s: (type %d subtype %d) BSS is stopped",
1993 __func__, iface->type, iface->sub_type);
1994
1995 bcn = wma->interfaces[vdev_id].beacon;
1996 if (bcn) {
Jeff Johnsonadba3962017-09-18 08:12:35 -07001997 WMA_LOGD("%s: Freeing beacon struct %pK, template memory %pK",
Abhishek Singhe8be9a62017-05-30 12:13:29 +05301998 __func__, bcn, bcn->buf);
1999 if (bcn->dma_mapped)
2000 qdf_nbuf_unmap_single(wma->qdf_dev, bcn->buf,
2001 QDF_DMA_TO_DEVICE);
Anurag Chouhan47cb1712018-06-25 12:05:15 +05302002 qdf_nbuf_free(bcn->buf);
2003 qdf_mem_free(bcn);
2004 wma->interfaces[vdev_id].beacon = NULL;
Abhishek Singhe8be9a62017-05-30 12:13:29 +05302005 }
2006
2007 /* Timeout status means its WMA generated DEL BSS REQ when ADD
2008 * BSS REQ was timed out to stop the VDEV in this case no need
2009 * to send response to UMAC
2010 */
2011 if (params->status == QDF_STATUS_FW_MSG_TIMEDOUT) {
2012 qdf_mem_free(req->user_data);
2013 req->user_data = NULL;
2014 WMA_LOGE("%s: DEL BSS from ADD BSS timeout do not send resp to UMAC (vdev id %x)",
2015 __func__, vdev_id);
2016 } else {
2017 params->status = QDF_STATUS_SUCCESS;
Abhishek Singh2d775fd2017-08-18 10:51:33 +05302018 wma_send_msg_high_priority(wma, WMA_DELETE_BSS_RSP,
2019 (void *)params, 0);
Abhishek Singhe8be9a62017-05-30 12:13:29 +05302020 }
2021
Abhishek Singh0d74f9e2017-09-26 14:02:42 +05302022 if (iface->del_staself_req && iface->is_del_sta_defered) {
2023 iface->is_del_sta_defered = false;
Abhishek Singhe8be9a62017-05-30 12:13:29 +05302024 WMA_LOGA("scheduling defered deletion (vdev id %x)",
2025 vdev_id);
2026 wma_vdev_detach(wma, iface->del_staself_req, 1);
2027 }
2028}
2029
Dustin Brown13995f02017-01-12 15:38:42 -08002030/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002031 * wma_vdev_stop_resp_handler() - vdev stop response handler
2032 * @handle: wma handle
2033 * @cmd_param_info: event buffer
2034 * @len: buffer length
2035 *
2036 * Return: 0 for success or error code
2037 */
2038int wma_vdev_stop_resp_handler(void *handle, uint8_t *cmd_param_info,
2039 u32 len)
2040{
2041 tp_wma_handle wma = (tp_wma_handle) handle;
2042 WMI_VDEV_STOPPED_EVENTID_param_tlvs *param_buf;
2043 wmi_vdev_stopped_event_fixed_param *resp_event;
Abhishek Singhf06214b2018-08-17 12:16:39 +05302044 struct wma_target_req *req_msg, *del_req;
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08002045 struct cdp_pdev *pdev;
Kabilan Kannan3618a752018-06-10 23:44:32 -07002046 void *peer = NULL;
Sandeep Puligilla7da86332016-11-10 16:14:40 -08002047 uint8_t peer_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002048 struct wma_txrx_node *iface;
2049 int32_t status = 0;
Leo Chang96464902016-10-28 11:10:54 -07002050 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Dustin Brownbf6d16b2017-03-03 11:41:05 -08002051
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07002052 WMA_LOGD("%s: Enter", __func__);
Dustin Brown3e619822017-03-17 10:41:56 -07002053
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002054 param_buf = (WMI_VDEV_STOPPED_EVENTID_param_tlvs *) cmd_param_info;
2055 if (!param_buf) {
2056 WMA_LOGE("Invalid event buffer");
2057 return -EINVAL;
2058 }
Dustin Brownec2c92e2017-07-26 11:13:49 -07002059
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002060 resp_event = param_buf->fixed_param;
Vignesh Viswanathan08ad8a02018-02-14 18:00:01 +05302061
2062 if (resp_event->vdev_id >= wma->max_bssid) {
2063 WMA_LOGE("%s: Invalid vdev_id %d from FW",
2064 __func__, resp_event->vdev_id);
2065 return -EINVAL;
2066 }
2067
Dustin Brownec2c92e2017-07-26 11:13:49 -07002068 iface = &wma->interfaces[resp_event->vdev_id];
Naveen Rawata600b2e2018-03-29 13:41:18 -07002069
2070 /* vdev in stopped state, no more waiting for key */
2071 iface->is_waiting_for_key = false;
2072
Vignesh Viswanathan2fa5e2d2018-05-31 12:37:07 +05302073 /*
2074 * Reset the rmfEnabled as there might be MGMT action frames
2075 * sent on this vdev before the next session is established.
2076 */
2077 if (iface->rmfEnabled) {
2078 iface->rmfEnabled = 0;
2079 WMA_LOGD(FL("Reset rmfEnabled for vdev %d"),
2080 resp_event->vdev_id);
2081 }
2082
Dustin Brownec2c92e2017-07-26 11:13:49 -07002083 wma_release_wakelock(&iface->vdev_stop_wakelock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002084
Kiran Kumar Lokere5798bfa2017-04-27 20:49:39 -07002085 req_msg = wma_find_vdev_req(wma, resp_event->vdev_id,
Kiran Kumar Lokere20804162017-07-17 16:09:04 -07002086 WMA_TARGET_REQ_TYPE_VDEV_STOP, true);
Kiran Kumar Lokere5798bfa2017-04-27 20:49:39 -07002087 if (!req_msg) {
2088 WMA_LOGE("%s: Failed to lookup vdev request for vdev id %d",
2089 __func__, resp_event->vdev_id);
2090 return -EINVAL;
2091 }
2092
Anurag Chouhan6d760662016-02-20 16:05:43 +05302093 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002094 if (!pdev) {
2095 WMA_LOGE("%s: pdev is NULL", __func__);
2096 status = -EINVAL;
Liangwei Dong748cb5d2016-09-29 00:56:40 -04002097 wma_cleanup_target_req_param(req_msg);
Anurag Chouhan210db072016-02-22 18:42:15 +05302098 qdf_mc_timer_stop(&req_msg->event_timeout);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002099 goto free_req_msg;
2100 }
2101
Anurag Chouhan210db072016-02-22 18:42:15 +05302102 qdf_mc_timer_stop(&req_msg->event_timeout);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002103 if (req_msg->msg_type == WMA_DELETE_BSS_REQ) {
2104 tpDeleteBssParams params =
2105 (tpDeleteBssParams) req_msg->user_data;
Dustin Brownbf6d16b2017-03-03 11:41:05 -08002106
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002107 if (iface->handle == NULL) {
2108 WMA_LOGE("%s vdev id %d is already deleted",
2109 __func__, resp_event->vdev_id);
Liangwei Dong748cb5d2016-09-29 00:56:40 -04002110 wma_cleanup_target_req_param(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002111 status = -EINVAL;
2112 goto free_req_msg;
2113 }
Mukul Sharma8d2d9ec2016-09-08 13:05:35 +05302114
Padma, Santhosh Kumar16dacfb2017-03-21 19:05:40 +05302115 /* CCA is required only for sta interface */
2116 if (iface->type == WMI_VDEV_TYPE_STA)
2117 wma_get_cca_stats(wma, resp_event->vdev_id);
2118
Mukul Sharma8d2d9ec2016-09-08 13:05:35 +05302119 /* Clear arp and ns offload cache */
2120 qdf_mem_zero(&iface->ns_offload_req,
2121 sizeof(iface->ns_offload_req));
2122 qdf_mem_zero(&iface->arp_offload_req,
2123 sizeof(iface->arp_offload_req));
2124
Krishna Kumaar Natarajanf24bfc82017-02-07 11:54:05 -08002125 status = wma_remove_bss_peer(wma, pdev, req_msg,
2126 resp_event->vdev_id, params);
2127 if (status != 0)
2128 goto free_req_msg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002129
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05302130 if (wmi_service_enabled(
2131 wma->wmi_handle,
2132 wmi_service_sync_delete_cmds))
Abhishek Singhe8be9a62017-05-30 12:13:29 +05302133 goto free_req_msg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002134
Abhishek Singhe8be9a62017-05-30 12:13:29 +05302135 wma_send_del_bss_response(wma, req_msg, resp_event->vdev_id);
Sandeep Puligilla7da86332016-11-10 16:14:40 -08002136 } else if (req_msg->msg_type == WMA_SET_LINK_STATE) {
2137 tpLinkStateParams params =
2138 (tpLinkStateParams) req_msg->user_data;
2139
Kabilan Kannan3618a752018-06-10 23:44:32 -07002140 peer = cdp_peer_get_ref_by_addr(soc, pdev, params->bssid,
Manjunathappa Prakash1253c3d2018-08-22 15:52:14 -07002141 &peer_id,
2142 PEER_DEBUG_ID_WMA_VDEV_STOP_RESP);
Sandeep Puligilla7da86332016-11-10 16:14:40 -08002143 if (peer) {
2144 WMA_LOGP(FL("Deleting peer %pM vdev id %d"),
2145 params->bssid, req_msg->vdev_id);
2146 wma_remove_peer(wma, params->bssid, req_msg->vdev_id,
2147 peer, false);
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05302148 if (wmi_service_enabled(wma->wmi_handle,
2149 wmi_service_sync_delete_cmds)) {
Sandeep Puligillabbee8172017-04-07 19:26:33 -07002150 WMA_LOGI(FL("Wait for the peer delete. vdev_id %d"),
2151 req_msg->vdev_id);
2152 del_req = wma_fill_hold_req(wma,
2153 req_msg->vdev_id,
2154 WMA_DELETE_STA_REQ,
2155 WMA_SET_LINK_PEER_RSP,
2156 params,
2157 WMA_DELETE_STA_TIMEOUT);
2158 if (!del_req) {
2159 WMA_LOGE(FL("Failed to allocate request. vdev_id %d"),
2160 req_msg->vdev_id);
2161 params->status = QDF_STATUS_E_NOMEM;
2162 } else {
2163 goto free_req_msg;
2164 }
2165 }
Sandeep Puligilla7da86332016-11-10 16:14:40 -08002166 }
Dustin Brownec2c92e2017-07-26 11:13:49 -07002167 if (wma_send_vdev_down_to_fw(wma, req_msg->vdev_id) !=
2168 QDF_STATUS_SUCCESS) {
Sandeep Puligilla7da86332016-11-10 16:14:40 -08002169 WMA_LOGE("Failed to send vdev down cmd: vdev %d",
2170 req_msg->vdev_id);
2171 }
2172 wma_send_msg(wma, WMA_SET_LINK_STATE_RSP, (void *)params, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002173 }
Krishna Kumaar Natarajanf24bfc82017-02-07 11:54:05 -08002174
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002175free_req_msg:
Kabilan Kannan3618a752018-06-10 23:44:32 -07002176 if (peer)
2177 cdp_peer_release_ref(soc, peer,
Manjunathappa Prakash1253c3d2018-08-22 15:52:14 -07002178 PEER_DEBUG_ID_WMA_VDEV_STOP_RESP);
Anurag Chouhan210db072016-02-22 18:42:15 +05302179 qdf_mc_timer_destroy(&req_msg->event_timeout);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302180 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002181 return status;
2182}
2183
2184/**
2185 * wma_vdev_attach() - create vdev in fw
2186 * @wma_handle: wma handle
2187 * @self_sta_req: self sta request
2188 * @generateRsp: generate response
2189 *
2190 * This function creates vdev in target and
2191 * attach this vdev to txrx module. It also set
2192 * vdev related params to fw.
2193 *
2194 * Return: txrx vdev handle
2195 */
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08002196struct cdp_vdev *wma_vdev_attach(tp_wma_handle wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002197 struct add_sta_self_params *self_sta_req,
2198 uint8_t generateRsp)
2199{
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08002200 struct cdp_vdev *txrx_vdev_handle = NULL;
2201 struct cdp_pdev *txrx_pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002202 enum wlan_op_mode txrx_vdev_type;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302203 QDF_STATUS status = QDF_STATUS_SUCCESS;
Anurag Chouhan6d760662016-02-20 16:05:43 +05302204 struct sAniSirGlobal *mac = cds_get_context(QDF_MODULE_ID_PE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002205 uint32_t cfg_val;
Govind Singhd76a5b02016-03-08 15:12:14 +05302206 QDF_STATUS ret;
Vignesh Viswanathan21c58cb2018-05-24 15:53:58 +05302207 struct mlme_ht_capabilities_info *ht_cap_info;
Rajeev Kumarb60abe42017-01-21 15:39:31 -08002208 struct scheduler_msg sme_msg = { 0 };
Govind Singhd76a5b02016-03-08 15:12:14 +05302209 struct vdev_create_params params = { 0 };
Bhargav Shaha89d3b42016-04-20 13:04:56 +05302210 u_int8_t vdev_id;
Padma, Santhosh Kumara7119672016-08-16 16:05:14 +05302211 struct sir_set_tx_rx_aggregation_size tx_rx_aggregation_size;
Paul Zhang33fae272018-04-23 16:19:00 +08002212 struct sir_set_tx_aggr_sw_retry_threshold tx_aggr_sw_retry_threshold;
Leo Chang96464902016-10-28 11:10:54 -07002213 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Bala Venkatesh110b03e2018-07-10 16:02:08 +05302214 struct wlan_objmgr_peer *obj_peer;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002215
Arif Hussain0e246802018-05-01 18:13:44 -07002216 qdf_mem_zero(&tx_rx_aggregation_size, sizeof(tx_rx_aggregation_size));
Varun Reddy Yeturu30c24b72017-07-31 14:25:54 -07002217 WMA_LOGD("mac %pM, vdev_id %hu, type %d, sub_type %d, nss 2g %d, 5g %d",
2218 self_sta_req->self_mac_addr, self_sta_req->session_id,
2219 self_sta_req->type, self_sta_req->sub_type,
2220 self_sta_req->nss_2g, self_sta_req->nss_5g);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002221 if (NULL == mac) {
2222 WMA_LOGE("%s: Failed to get mac", __func__);
2223 goto end;
2224 }
Arif Hussain380cfc72017-10-31 13:12:04 -07002225
2226 vdev_id = self_sta_req->session_id;
2227 if (wma_is_vdev_valid(vdev_id)) {
2228 WMA_LOGE("%s: vdev %d already active", __func__, vdev_id);
Varun Reddy Yeturu30c24b72017-07-31 14:25:54 -07002229 goto end;
2230 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002231
Govind Singhd76a5b02016-03-08 15:12:14 +05302232 params.if_id = self_sta_req->session_id;
2233 params.type = self_sta_req->type;
2234 params.subtype = self_sta_req->sub_type;
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07002235 params.nss_2g = self_sta_req->nss_2g;
2236 params.nss_5g = self_sta_req->nss_5g;
Govind Singhd76a5b02016-03-08 15:12:14 +05302237
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002238 /* Create a vdev in target */
Govind Singhd76a5b02016-03-08 15:12:14 +05302239 status = wmi_unified_vdev_create_send(wma_handle->wmi_handle,
2240 self_sta_req->self_mac_addr,
2241 &params);
2242 if (QDF_IS_STATUS_ERROR(status)) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07002243 WMA_LOGE("%s: Unable to add an interface for ath_dev",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002244 __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002245 goto end;
2246 }
2247
2248 txrx_vdev_type = wma_get_txrx_vdev_type(self_sta_req->type);
2249
2250 if (wlan_op_mode_unknown == txrx_vdev_type) {
2251 WMA_LOGE("Failed to get txrx vdev type");
Govind Singhd76a5b02016-03-08 15:12:14 +05302252 wmi_unified_vdev_delete_send(wma_handle->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002253 self_sta_req->session_id);
2254 goto end;
2255 }
2256
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08002257 txrx_vdev_handle = cdp_vdev_attach(soc,
2258 txrx_pdev,
2259 self_sta_req->self_mac_addr,
2260 self_sta_req->session_id,
2261 txrx_vdev_type);
Mukul Sharma6411bb82017-03-01 15:57:07 +05302262 wma_vdev_update_pause_bitmap(self_sta_req->session_id, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002263
Jeff Johnsonadba3962017-09-18 08:12:35 -07002264 WMA_LOGD("vdev_id %hu, txrx_vdev_handle = %pK", self_sta_req->session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002265 txrx_vdev_handle);
2266
2267 if (NULL == txrx_vdev_handle) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07002268 WMA_LOGE("%s: cdp_vdev_attach failed", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302269 status = QDF_STATUS_E_FAILURE;
Govind Singhd76a5b02016-03-08 15:12:14 +05302270 wmi_unified_vdev_delete_send(wma_handle->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002271 self_sta_req->session_id);
2272 goto end;
2273 }
Selvaraj, Sridhar171e2252016-06-22 22:33:26 +05302274 wma_handle->interfaces[self_sta_req->session_id].vdev_active = true;
2275
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002276 wma_handle->interfaces[self_sta_req->session_id].handle =
2277 txrx_vdev_handle;
2278
2279 wma_handle->interfaces[self_sta_req->session_id].ptrn_match_enable =
2280 wma_handle->ptrn_match_enable_all_vdev ? true : false;
2281
2282 if (wlan_cfg_get_int(mac, WNI_CFG_WOWLAN_DEAUTH_ENABLE, &cfg_val)
Jeff Johnsone88dd752018-06-07 22:57:54 -07002283 != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002284 wma_handle->wow.deauth_enable = true;
2285 else
2286 wma_handle->wow.deauth_enable = cfg_val ? true : false;
2287
2288 if (wlan_cfg_get_int(mac, WNI_CFG_WOWLAN_DISASSOC_ENABLE, &cfg_val)
Jeff Johnsone88dd752018-06-07 22:57:54 -07002289 != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002290 wma_handle->wow.disassoc_enable = true;
2291 else
2292 wma_handle->wow.disassoc_enable = cfg_val ? true : false;
2293
2294 if (wlan_cfg_get_int(mac, WNI_CFG_WOWLAN_MAX_MISSED_BEACON, &cfg_val)
Jeff Johnsone88dd752018-06-07 22:57:54 -07002295 != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002296 wma_handle->wow.bmiss_enable = true;
2297 else
2298 wma_handle->wow.bmiss_enable = cfg_val ? true : false;
2299
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302300 qdf_mem_copy(wma_handle->interfaces[self_sta_req->session_id].addr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002301 self_sta_req->self_mac_addr,
2302 sizeof(wma_handle->interfaces[self_sta_req->session_id].
2303 addr));
Padma, Santhosh Kumara7119672016-08-16 16:05:14 +05302304
2305 tx_rx_aggregation_size.tx_aggregation_size =
2306 self_sta_req->tx_aggregation_size;
2307 tx_rx_aggregation_size.rx_aggregation_size =
2308 self_sta_req->rx_aggregation_size;
2309 tx_rx_aggregation_size.vdev_id = self_sta_req->session_id;
Arif Hussain0e246802018-05-01 18:13:44 -07002310 tx_rx_aggregation_size.aggr_type = WMI_VDEV_CUSTOM_AGGR_TYPE_AMPDU;
Padma, Santhosh Kumara7119672016-08-16 16:05:14 +05302311
2312 status = wma_set_tx_rx_aggregation_size(&tx_rx_aggregation_size);
2313 if (status != QDF_STATUS_SUCCESS)
2314 WMA_LOGE("failed to set aggregation sizes(err=%d)", status);
2315
Paul Zhangee09f8e2018-04-23 16:11:32 +08002316 tx_rx_aggregation_size.tx_aggregation_size_be =
2317 self_sta_req->tx_aggregation_size_be;
2318 tx_rx_aggregation_size.tx_aggregation_size_bk =
2319 self_sta_req->tx_aggregation_size_bk;
2320 tx_rx_aggregation_size.tx_aggregation_size_vi =
2321 self_sta_req->tx_aggregation_size_vi;
2322 tx_rx_aggregation_size.tx_aggregation_size_vo =
2323 self_sta_req->tx_aggregation_size_vo;
2324
Paul Zhang33fae272018-04-23 16:19:00 +08002325 tx_aggr_sw_retry_threshold.tx_aggr_sw_retry_threshold_be =
2326 self_sta_req->tx_aggr_sw_retry_threshold_be;
2327 tx_aggr_sw_retry_threshold.tx_aggr_sw_retry_threshold_bk =
2328 self_sta_req->tx_aggr_sw_retry_threshold_bk;
2329 tx_aggr_sw_retry_threshold.tx_aggr_sw_retry_threshold_vi =
2330 self_sta_req->tx_aggr_sw_retry_threshold_vi;
2331 tx_aggr_sw_retry_threshold.tx_aggr_sw_retry_threshold_vo =
2332 self_sta_req->tx_aggr_sw_retry_threshold_vo;
2333 tx_aggr_sw_retry_threshold.vdev_id = self_sta_req->session_id;
2334
2335
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002336 switch (self_sta_req->type) {
2337 case WMI_VDEV_TYPE_STA:
Paul Zhangee09f8e2018-04-23 16:11:32 +08002338 status = wma_set_tx_rx_aggregation_size_per_ac(
2339 &tx_rx_aggregation_size);
2340 if (status != QDF_STATUS_SUCCESS)
2341 WMA_LOGE("failed to set aggr sizes per ac(err=%d)",
2342 status);
2343
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002344 if (wlan_cfg_get_int(mac, WNI_CFG_INFRA_STA_KEEP_ALIVE_PERIOD,
Jeff Johnsone88dd752018-06-07 22:57:54 -07002345 &cfg_val) != QDF_STATUS_SUCCESS) {
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002346 WMA_LOGE("Failed to get value for WNI_CFG_INFRA_STA_KEEP_ALIVE_PERIOD");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002347 cfg_val = DEFAULT_INFRA_STA_KEEP_ALIVE_PERIOD;
2348 }
2349
2350 wma_set_sta_keep_alive(wma_handle,
2351 self_sta_req->session_id,
2352 SIR_KEEP_ALIVE_NULL_PKT,
2353 cfg_val, NULL, NULL, NULL);
mukul sharma72c8b222015-09-04 17:02:01 +05302354
2355 /* offload STA SA query related params to fwr */
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05302356 if (wmi_service_enabled(wma_handle->wmi_handle,
2357 wmi_service_sta_pmf_offload)) {
mukul sharma72c8b222015-09-04 17:02:01 +05302358 wma_set_sta_sa_query_param(wma_handle,
2359 self_sta_req->session_id);
2360 }
Paul Zhang33fae272018-04-23 16:19:00 +08002361
2362 status = wma_set_sw_retry_threshold(
2363 &tx_aggr_sw_retry_threshold);
2364 if (status != QDF_STATUS_SUCCESS)
2365 WMA_LOGE("failed to set retry threshold(err=%d)",
2366 status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002367 break;
2368 }
2369
2370 wma_handle->interfaces[self_sta_req->session_id].type =
2371 self_sta_req->type;
2372 wma_handle->interfaces[self_sta_req->session_id].sub_type =
2373 self_sta_req->sub_type;
Anurag Chouhan8e0ccd32016-02-19 15:30:20 +05302374 qdf_atomic_init(&wma_handle->interfaces
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002375 [self_sta_req->session_id].bss_status);
2376
Dustin Brown04823992018-03-29 13:27:01 -07002377 if (wma_vdev_uses_self_peer(self_sta_req->type,
2378 self_sta_req->sub_type)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002379 status = wma_create_peer(wma_handle, txrx_pdev,
2380 txrx_vdev_handle,
2381 self_sta_req->self_mac_addr,
2382 WMI_PEER_TYPE_DEFAULT,
2383 self_sta_req->session_id, false);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302384 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002385 WMA_LOGE("%s: Failed to create peer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302386 status = QDF_STATUS_E_FAILURE;
Govind Singhd76a5b02016-03-08 15:12:14 +05302387 wmi_unified_vdev_delete_send(wma_handle->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002388 self_sta_req->session_id);
Arunk Khandavalli15745052018-08-21 15:40:12 +05302389 goto end;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002390 }
Bala Venkatesh110b03e2018-07-10 16:02:08 +05302391 } else if (self_sta_req->type == WMI_VDEV_TYPE_STA) {
2392 obj_peer = wma_create_objmgr_peer(wma_handle,
2393 vdev_id,
2394 self_sta_req->self_mac_addr,
2395 WMI_PEER_TYPE_DEFAULT);
2396 if (!obj_peer) {
2397 WMA_LOGE("%s: Failed to create obj mgr peer for self sta",
2398 __func__);
2399 goto end;
2400 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002401 }
2402
Naveen Rawat2b6e3c92017-03-20 13:59:07 -07002403 WMA_LOGD("Setting WMI_VDEV_PARAM_DISCONNECT_TH: %d",
2404 self_sta_req->pkt_err_disconn_th);
2405 ret = wma_vdev_set_param(wma_handle->wmi_handle,
2406 self_sta_req->session_id,
2407 WMI_VDEV_PARAM_DISCONNECT_TH,
2408 self_sta_req->pkt_err_disconn_th);
2409 if (ret)
2410 WMA_LOGE("Failed to set WMI_VDEV_PARAM_DISCONNECT_TH");
2411
Bhargav Shaha89d3b42016-04-20 13:04:56 +05302412 wma_handle->interfaces[vdev_id].is_vdev_valid = true;
Govind Singhd76a5b02016-03-08 15:12:14 +05302413 ret = wma_vdev_set_param(wma_handle->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002414 self_sta_req->session_id,
2415 WMI_VDEV_PARAM_MCC_RTSCTS_PROTECTION_ENABLE,
2416 mac->roam.configParam.mcc_rts_cts_prot_enable);
Govind Singhd76a5b02016-03-08 15:12:14 +05302417 if (QDF_IS_STATUS_ERROR(ret))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002418 WMA_LOGE("Failed to set WMI VDEV MCC_RTSCTS_PROTECTION_ENABLE");
2419
Govind Singhd76a5b02016-03-08 15:12:14 +05302420 ret = wma_vdev_set_param(wma_handle->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002421 self_sta_req->session_id,
2422 WMI_VDEV_PARAM_MCC_BROADCAST_PROBE_ENABLE,
2423 mac->roam.configParam.mcc_bcast_prob_resp_enable);
Govind Singhd76a5b02016-03-08 15:12:14 +05302424 if (QDF_IS_STATUS_ERROR(ret))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002425 WMA_LOGE("Failed to set WMI VDEV MCC_BROADCAST_PROBE_ENABLE");
2426
2427 if (wlan_cfg_get_int(mac, WNI_CFG_RTS_THRESHOLD,
Jeff Johnsone88dd752018-06-07 22:57:54 -07002428 &cfg_val) == QDF_STATUS_SUCCESS) {
Govind Singhd76a5b02016-03-08 15:12:14 +05302429 ret = wma_vdev_set_param(wma_handle->wmi_handle,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002430 self_sta_req->session_id,
2431 WMI_VDEV_PARAM_RTS_THRESHOLD,
2432 cfg_val);
Govind Singhd76a5b02016-03-08 15:12:14 +05302433 if (QDF_IS_STATUS_ERROR(ret))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002434 WMA_LOGE("Failed to set WMI_VDEV_PARAM_RTS_THRESHOLD");
2435 } else {
2436 WMA_LOGE("Failed to get value for WNI_CFG_RTS_THRESHOLD, leaving unchanged");
2437 }
2438
2439 if (wlan_cfg_get_int(mac, WNI_CFG_FRAGMENTATION_THRESHOLD,
Jeff Johnsone88dd752018-06-07 22:57:54 -07002440 &cfg_val) == QDF_STATUS_SUCCESS) {
Govind Singhd76a5b02016-03-08 15:12:14 +05302441 ret = wma_vdev_set_param(wma_handle->wmi_handle,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002442 self_sta_req->session_id,
2443 WMI_VDEV_PARAM_FRAGMENTATION_THRESHOLD,
2444 cfg_val);
Govind Singhd76a5b02016-03-08 15:12:14 +05302445 if (QDF_IS_STATUS_ERROR(ret))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002446 WMA_LOGE("Failed to set WMI_VDEV_PARAM_FRAGMENTATION_THRESHOLD");
2447 } else {
2448 WMA_LOGE("Failed to get value for WNI_CFG_FRAGMENTATION_THRESHOLD, leaving unchanged");
2449 }
2450
Vignesh Viswanathan21c58cb2018-05-24 15:53:58 +05302451 ht_cap_info = &mac->mlme_cfg->ht_caps.ht_cap_info;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002452
Vignesh Viswanathan21c58cb2018-05-24 15:53:58 +05302453 ret = wma_vdev_set_param(wma_handle->wmi_handle,
2454 self_sta_req->session_id,
2455 WMI_VDEV_PARAM_TX_STBC,
Vignesh Viswanathan78182502018-08-06 15:13:30 +05302456 ht_cap_info->tx_stbc);
Vignesh Viswanathan21c58cb2018-05-24 15:53:58 +05302457 if (QDF_IS_STATUS_ERROR(ret))
2458 WMA_LOGE("Failed to set WMI_VDEV_PARAM_TX_STBC");
Hong Shib90718f2017-02-20 00:57:22 +08002459
2460 wma_set_vdev_mgmt_rate(wma_handle, self_sta_req->session_id);
2461
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002462 /* Initialize roaming offload state */
2463 if ((self_sta_req->type == WMI_VDEV_TYPE_STA) &&
2464 (self_sta_req->sub_type == 0)) {
2465 wma_handle->roam_offload_enabled = true;
Govind Singhd76a5b02016-03-08 15:12:14 +05302466 ret = wma_vdev_set_param(wma_handle->wmi_handle,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002467 self_sta_req->session_id,
2468 WMI_VDEV_PARAM_ROAM_FW_OFFLOAD,
2469 (WMI_ROAM_FW_OFFLOAD_ENABLE_FLAG |
2470 WMI_ROAM_BMISS_FINAL_SCAN_ENABLE_FLAG));
Govind Singhd76a5b02016-03-08 15:12:14 +05302471 if (QDF_IS_STATUS_ERROR(ret))
2472 WMA_LOGE("Failed to set WMI_VDEV_PARAM_ROAM_FW_OFFLOAD");
Selvaraj, Sridhar4f684bb2017-01-19 15:59:23 +05302473
2474 /* Pass down enable/disable bcast probe rsp to FW */
2475 ret = wma_vdev_set_param(
2476 wma_handle->wmi_handle,
2477 self_sta_req->session_id,
2478 WMI_VDEV_PARAM_ENABLE_BCAST_PROBE_RESPONSE,
2479 self_sta_req->enable_bcast_probe_rsp);
2480 if (QDF_IS_STATUS_ERROR(ret))
2481 WMA_LOGE("Failed to set WMI_VDEV_PARAM_ENABLE_BCAST_PROBE_RESPONSE");
2482
Selvaraj, Sridhar97ce6582017-01-20 17:06:34 +05302483 /* Pass down the FILS max channel guard time to FW */
2484 ret = wma_vdev_set_param(
2485 wma_handle->wmi_handle,
2486 self_sta_req->session_id,
2487 WMI_VDEV_PARAM_FILS_MAX_CHANNEL_GUARD_TIME,
2488 self_sta_req->fils_max_chan_guard_time);
2489 if (QDF_IS_STATUS_ERROR(ret))
2490 WMA_LOGE("Failed to set WMI_VDEV_PARAM_FILS_MAX_CHANNEL_GUARD_TIME");
Sridhar Selvaraj87309212017-06-28 17:41:50 +05302491
2492 /* Pass down the Probe Request tx delay(in ms) to FW */
2493 ret = wma_vdev_set_param(
2494 wma_handle->wmi_handle,
2495 self_sta_req->session_id,
2496 WMI_VDEV_PARAM_PROBE_DELAY,
2497 PROBE_REQ_TX_DELAY);
2498 if (QDF_IS_STATUS_ERROR(ret))
2499 WMA_LOGE("Failed to set WMI_VDEV_PARAM_PROBE_DELAY");
2500
2501 /* Pass down the probe request tx time gap(in ms) to FW */
2502 ret = wma_vdev_set_param(
2503 wma_handle->wmi_handle,
2504 self_sta_req->session_id,
2505 WMI_VDEV_PARAM_REPEAT_PROBE_TIME,
2506 PROBE_REQ_TX_TIME_GAP);
2507 if (QDF_IS_STATUS_ERROR(ret))
2508 WMA_LOGE("Failed to set WMI_VDEV_PARAM_REPEAT_PROBE_TIME");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002509 }
2510
Yeshwanth Sriram Guntuka2ba6fe92017-10-04 14:40:45 +05302511 if ((self_sta_req->type == WMI_VDEV_TYPE_STA ||
2512 self_sta_req->type == WMI_VDEV_TYPE_AP) &&
2513 self_sta_req->sub_type == 0) {
2514 ret = wma_vdev_set_param(wma_handle->wmi_handle,
2515 self_sta_req->session_id,
2516 WMI_VDEV_PARAM_ENABLE_DISABLE_OCE_FEATURES,
2517 self_sta_req->oce_feature_bitmap);
2518 if (QDF_IS_STATUS_ERROR(ret))
2519 WMA_LOGE("Failed to set WMI_VDEV_PARAM_ENABLE_DISABLE_OCE_FEATURES");
2520 }
2521
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002522 /* Initialize BMISS parameters */
2523 if ((self_sta_req->type == WMI_VDEV_TYPE_STA) &&
2524 (self_sta_req->sub_type == 0))
2525 wma_roam_scan_bmiss_cnt(wma_handle,
2526 mac->roam.configParam.neighborRoamConfig.nRoamBmissFirstBcnt,
2527 mac->roam.configParam.neighborRoamConfig.nRoamBmissFinalBcnt,
2528 self_sta_req->session_id);
2529
2530 if (wlan_cfg_get_int(mac, WNI_CFG_ENABLE_MCC_ADAPTIVE_SCHED,
Jeff Johnsone88dd752018-06-07 22:57:54 -07002531 &cfg_val) == QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002532 WMA_LOGD("%s: setting ini value for WNI_CFG_ENABLE_MCC_ADAPTIVE_SCHED: %d",
2533 __func__, cfg_val);
2534 ret = wma_set_enable_disable_mcc_adaptive_scheduler(cfg_val);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302535 if (ret != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002536 WMA_LOGE("Failed to set WNI_CFG_ENABLE_MCC_ADAPTIVE_SCHED");
2537 }
2538 } else {
2539 WMA_LOGE("Failed to get value for WNI_CFG_ENABLE_MCC_ADAPTIVE_SCHED, leaving unchanged");
2540 }
Dustin Brown13995f02017-01-12 15:38:42 -08002541
2542 if (self_sta_req->type == WMI_VDEV_TYPE_STA) {
Nachiket Kukadee547a482018-05-22 16:43:30 +05302543 status = wma_config_active_apf_mode(wma_handle,
Dustin Brown13995f02017-01-12 15:38:42 -08002544 self_sta_req->session_id);
2545 if (QDF_IS_STATUS_ERROR(status))
Nachiket Kukadee547a482018-05-22 16:43:30 +05302546 WMA_LOGE("Failed to configure active APF mode");
Dustin Brown13995f02017-01-12 15:38:42 -08002547 }
2548
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002549end:
2550 self_sta_req->status = status;
2551
2552#ifdef QCA_IBSS_SUPPORT
2553 if (generateRsp)
2554#endif
2555 {
2556 sme_msg.type = eWNI_SME_ADD_STA_SELF_RSP;
2557 sme_msg.bodyptr = self_sta_req;
2558 sme_msg.bodyval = 0;
2559
Rajeev Kumarb60abe42017-01-21 15:39:31 -08002560 status = scheduler_post_msg(QDF_MODULE_ID_SME, &sme_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302561 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002562 WMA_LOGE("Failed to post eWNI_SME_ADD_STA_SELF_RSP");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302563 qdf_mem_free(self_sta_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002564 }
2565 }
2566 return txrx_vdev_handle;
2567}
2568
Jiachao Wu712d4fd2017-08-23 16:52:34 +08002569uint32_t wma_get_bcn_rate_code(uint16_t rate)
2570{
2571 /* rate in multiples of 100 Kbps */
2572 switch (rate) {
2573 case WMA_BEACON_TX_RATE_1_M:
2574 return WMI_BCN_TX_RATE_CODE_1_M;
2575 case WMA_BEACON_TX_RATE_2_M:
2576 return WMI_BCN_TX_RATE_CODE_2_M;
2577 case WMA_BEACON_TX_RATE_5_5_M:
2578 return WMI_BCN_TX_RATE_CODE_5_5_M;
2579 case WMA_BEACON_TX_RATE_11_M:
2580 return WMI_BCN_TX_RATE_CODE_11M;
2581 case WMA_BEACON_TX_RATE_6_M:
2582 return WMI_BCN_TX_RATE_CODE_6_M;
2583 case WMA_BEACON_TX_RATE_9_M:
2584 return WMI_BCN_TX_RATE_CODE_9_M;
2585 case WMA_BEACON_TX_RATE_12_M:
2586 return WMI_BCN_TX_RATE_CODE_12_M;
2587 case WMA_BEACON_TX_RATE_18_M:
2588 return WMI_BCN_TX_RATE_CODE_18_M;
2589 case WMA_BEACON_TX_RATE_24_M:
2590 return WMI_BCN_TX_RATE_CODE_24_M;
2591 case WMA_BEACON_TX_RATE_36_M:
2592 return WMI_BCN_TX_RATE_CODE_36_M;
2593 case WMA_BEACON_TX_RATE_48_M:
2594 return WMI_BCN_TX_RATE_CODE_48_M;
2595 case WMA_BEACON_TX_RATE_54_M:
2596 return WMI_BCN_TX_RATE_CODE_54_M;
2597 default:
2598 return WMI_BCN_TX_RATE_CODE_1_M;
2599 }
2600}
2601
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002602/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002603 * wma_vdev_start() - send vdev start request to fw
2604 * @wma: wma handle
2605 * @req: vdev start params
2606 * @isRestart: isRestart flag
2607 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302608 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002609 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302610QDF_STATUS wma_vdev_start(tp_wma_handle wma,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002611 struct wma_vdev_start_req *req, bool isRestart)
2612{
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302613 struct vdev_start_params params = { 0 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002614 wmi_vdev_start_request_cmd_fixed_param *cmd;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002615 struct wma_txrx_node *intr = wma->interfaces;
2616 tpAniSirGlobal mac_ctx = NULL;
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302617 uint32_t temp_ssid_len = 0;
2618 uint32_t temp_flags = 0;
2619 uint32_t temp_chan_info = 0;
2620 uint32_t temp_reg_info_1 = 0;
2621 uint32_t temp_reg_info_2 = 0;
Kiran Kumar Lokere02b9aa42016-05-26 14:54:49 -07002622 uint16_t bw_val;
Himanshu Agarwalfc4dab92017-12-28 21:46:29 +05302623 struct wma_txrx_node *iface = &wma->interfaces[req->vdev_id];
2624 struct wma_target_req *req_msg;
Kabilan Kannan43d051f2018-01-04 17:54:34 -08002625 uint32_t chan_mode;
Kiran Kumar Lokere05a0658a2018-02-01 21:34:27 -08002626 enum phy_ch_width ch_width;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002627
Anurag Chouhan6d760662016-02-20 16:05:43 +05302628 mac_ctx = cds_get_context(QDF_MODULE_ID_PE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002629 if (mac_ctx == NULL) {
2630 WMA_LOGE("%s: vdev start failed as mac_ctx is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302631 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002632 }
2633
Naveen Rawatb4ea70f2018-03-23 17:10:01 -07002634 if (req->chan == 0) {
2635 WMA_LOGE("%s: invalid channel: %d", __func__, req->chan);
2636 QDF_ASSERT(0);
2637 return QDF_STATUS_E_INVAL;
2638 }
2639
Kiran Kumar Lokere05a0658a2018-02-01 21:34:27 -08002640 params.band_center_freq1 = cds_chan_to_freq(req->chan);
2641 ch_width = req->chan_width;
2642 bw_val = wlan_reg_get_bw_value(req->chan_width);
2643 if (20 < bw_val) {
2644 if (req->ch_center_freq_seg0) {
2645 params.band_center_freq1 =
2646 cds_chan_to_freq(req->ch_center_freq_seg0);
2647 } else {
2648 WMA_LOGE("%s: invalid cntr_freq for bw %d, drop to 20",
2649 __func__, bw_val);
2650 params.band_center_freq1 = cds_chan_to_freq(req->chan);
2651 ch_width = CH_WIDTH_20MHZ;
2652 bw_val = 20;
2653 }
2654 }
2655 if (80 < bw_val) {
2656 if (req->ch_center_freq_seg1) {
2657 params.band_center_freq2 =
2658 cds_chan_to_freq(req->ch_center_freq_seg1);
2659 } else {
2660 WMA_LOGE("%s: invalid cntr_freq for bw %d, drop to 80",
2661 __func__, bw_val);
2662 params.band_center_freq2 = 0;
2663 ch_width = CH_WIDTH_80MHZ;
2664 }
2665 } else {
2666 params.band_center_freq2 = 0;
2667 }
2668 chan_mode = wma_chan_phy_mode(req->chan, ch_width,
2669 req->dot11_mode);
Kabilan Kannan43d051f2018-01-04 17:54:34 -08002670
2671 if (chan_mode == MODE_UNKNOWN) {
2672 WMA_LOGE("%s: invalid phy mode!", __func__);
2673 return QDF_STATUS_E_FAILURE;
2674 }
2675
Kiran Kumar Lokere05a0658a2018-02-01 21:34:27 -08002676 if (!params.band_center_freq1) {
2677 WMA_LOGE("%s: invalid center freq1", __func__);
2678 return QDF_STATUS_E_FAILURE;
2679 }
2680
2681 if (((ch_width == CH_WIDTH_160MHZ) || (ch_width == CH_WIDTH_80P80MHZ))
2682 && !params.band_center_freq2) {
2683 WMA_LOGE("%s: invalid center freq2 for 160MHz", __func__);
2684 return QDF_STATUS_E_FAILURE;
2685 }
2686 /* Fill channel info */
2687 params.chan_freq = cds_chan_to_freq(req->chan);
2688 params.chan_mode = chan_mode;
2689
Zhu Jianmin4bf615e2018-05-23 19:52:46 +08002690 /* For Rome, only supports LFR2, not LFR3, for reassoc, need send vdev
2691 * start cmd to F/W while vdev started first, then send reassoc frame
2692 */
Himanshu Agarwalfc4dab92017-12-28 21:46:29 +05302693 if (!isRestart &&
Zhu Jianmin4bf615e2018-05-23 19:52:46 +08002694 qdf_atomic_read(&iface->bss_status) == WMA_BSS_STATUS_STARTED &&
2695 wmi_service_enabled(wma->wmi_handle, wmi_service_roam_ho_offload)) {
Himanshu Agarwalfc4dab92017-12-28 21:46:29 +05302696 req_msg = wma_find_vdev_req(wma, req->vdev_id,
2697 WMA_TARGET_REQ_TYPE_VDEV_STOP,
2698 false);
2699 if (!req_msg || req_msg->msg_type != WMA_DELETE_BSS_REQ) {
Dustin Brown83044c22018-08-13 15:00:44 -07002700 WMA_LOGE("BSS is in started state before vdev start");
2701 cds_trigger_recovery(QDF_REASON_UNSPECIFIED);
Himanshu Agarwalfc4dab92017-12-28 21:46:29 +05302702 }
2703 }
2704
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002705 WMA_LOGD("%s: Enter isRestart=%d vdev=%d", __func__, isRestart,
2706 req->vdev_id);
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302707 params.vdev_id = req->vdev_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002708
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302709 intr[params.vdev_id].chanmode = params.chan_mode;
2710 intr[params.vdev_id].ht_capable = req->ht_capable;
2711 intr[params.vdev_id].vht_capable = req->vht_capable;
2712 intr[params.vdev_id].config.gtx_info.gtxRTMask[0] =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002713 CFG_TGT_DEFAULT_GTX_HT_MASK;
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302714 intr[params.vdev_id].config.gtx_info.gtxRTMask[1] =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002715 CFG_TGT_DEFAULT_GTX_VHT_MASK;
Rajeev Kumar Sirasanagandlaaf474742016-09-06 17:54:50 +05302716
2717 if (wlan_cfg_get_int(mac_ctx, WNI_CFG_TGT_GTX_USR_CFG,
Jeff Johnsone88dd752018-06-07 22:57:54 -07002718 &intr[params.vdev_id].config.gtx_info.gtxUsrcfg)
2719 != QDF_STATUS_SUCCESS) {
Rajeev Kumar Sirasanagandlaaf474742016-09-06 17:54:50 +05302720 intr[params.vdev_id].config.gtx_info.gtxUsrcfg =
2721 WNI_CFG_TGT_GTX_USR_CFG_STADEF;
2722 QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_WARN,
2723 "Failed to get WNI_CFG_TGT_GTX_USR_CFG");
2724 }
2725
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302726 intr[params.vdev_id].config.gtx_info.gtxPERThreshold =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002727 CFG_TGT_DEFAULT_GTX_PER_THRESHOLD;
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302728 intr[params.vdev_id].config.gtx_info.gtxPERMargin =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002729 CFG_TGT_DEFAULT_GTX_PER_MARGIN;
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302730 intr[params.vdev_id].config.gtx_info.gtxTPCstep =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002731 CFG_TGT_DEFAULT_GTX_TPC_STEP;
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302732 intr[params.vdev_id].config.gtx_info.gtxTPCMin =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002733 CFG_TGT_DEFAULT_GTX_TPC_MIN;
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302734 intr[params.vdev_id].config.gtx_info.gtxBWMask =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002735 CFG_TGT_DEFAULT_GTX_BW_MASK;
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302736 intr[params.vdev_id].mhz = params.chan_freq;
Kiran Kumar Lokere05a0658a2018-02-01 21:34:27 -08002737 intr[params.vdev_id].chan_width = ch_width;
Yeshwanth Sriram Guntukaa3f8d572018-03-14 11:10:23 +05302738 intr[params.vdev_id].channel = req->chan;
Krishna Kumaar Natarajan0103ef82017-02-17 18:15:56 -08002739 wma_copy_txrxnode_he_ops(&intr[params.vdev_id], req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002740
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302741 temp_chan_info &= 0xffffffc0;
2742 temp_chan_info |= params.chan_mode;
2743
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002744 /* Set half or quarter rate WMI flags */
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302745 params.is_half_rate = req->is_half_rate;
2746 params.is_quarter_rate = req->is_quarter_rate;
2747
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002748 if (req->is_half_rate)
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302749 temp_chan_info |= (1 << WMI_CHAN_FLAG_HALF_RATE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002750 else if (req->is_quarter_rate)
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302751 temp_chan_info |= (1 << WMI_CHAN_FLAG_QUARTER_RATE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002752
2753 /*
2754 * If the channel has DFS set, flip on radar reporting.
2755 *
2756 * It may be that this should only be done for IBSS/hostap operation
2757 * as this flag may be interpreted (at some point in the future)
2758 * by the firmware as "oh, and please do radar DETECTION."
2759 *
2760 * If that is ever the case we would insert the decision whether to
2761 * enable the firmware flag here.
2762 */
2763
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302764 params.is_dfs = req->is_dfs;
2765 params.is_restart = isRestart;
Arif Hussain671a1902017-03-17 09:08:32 -07002766 params.cac_duration_ms = req->cac_duration_ms;
2767 params.regdomain = req->dfs_regdomain;
Manjunathappa Prakash0e6e6b52016-04-21 11:48:48 -07002768 if ((QDF_GLOBAL_MONITOR_MODE != cds_get_conparam()) && req->is_dfs) {
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302769 temp_chan_info |= (1 << WMI_CHAN_FLAG_DFS);
2770 params.dis_hw_ack = true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002771
2772 /*
Arif Hussaincd151632017-02-11 16:57:19 -08002773 * If channel is DFS and operating in AP mode,
2774 * set the WMI_CHAN_FLAG_DFS flag.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002775 */
Arif Hussaincd151632017-02-11 16:57:19 -08002776 if (wma_is_vdev_in_ap_mode(wma, params.vdev_id) == true)
2777 params.flag_dfs = WMI_CHAN_FLAG_DFS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002778 }
2779
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302780 params.beacon_intval = req->beacon_intval;
2781 params.dtim_period = req->dtim_period;
Jiachao Wu712d4fd2017-08-23 16:52:34 +08002782
2783 if (req->beacon_tx_rate) {
2784 WMA_LOGD("%s: beacon tx rate [%hu * 100 Kbps]",
2785 __func__, req->beacon_tx_rate);
2786 temp_flags |= WMI_UNIFIED_VDEV_START_BCN_TX_RATE_PRESENT;
2787 /*
2788 * beacon_tx_rate is in multiples of 100 Kbps.
2789 * Convert the data rate to hw rate code.
2790 */
2791 params.bcn_tx_rate_code =
2792 wma_get_bcn_rate_code(req->beacon_tx_rate);
2793 }
2794
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002795 /* FIXME: Find out min, max and regulatory power levels */
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302796 params.max_txpow = req->max_txpow;
2797 temp_reg_info_1 &= 0xff00ffff;
2798 temp_reg_info_1 |= ((req->max_txpow&0xff) << 16);
2799
2800 temp_reg_info_2 &= 0xffff00ff;
2801 temp_reg_info_2 |= ((req->max_txpow&0xff)<<8);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002802
2803 /* TODO: Handle regulatory class, max antenna */
2804 if (!isRestart) {
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302805 params.beacon_intval = req->beacon_intval;
2806 params.dtim_period = req->dtim_period;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002807
2808 /* Copy the SSID */
2809 if (req->ssid.length) {
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302810 params.ssid.length = req->ssid.length;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002811 if (req->ssid.length < sizeof(cmd->ssid.ssid))
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302812 temp_ssid_len = req->ssid.length;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002813 else
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302814 temp_ssid_len = sizeof(cmd->ssid.ssid);
2815 qdf_mem_copy(params.ssid.mac_ssid, req->ssid.ssId,
2816 temp_ssid_len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002817 }
2818
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302819 params.pmf_enabled = req->pmf_enabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002820 if (req->pmf_enabled)
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302821 temp_flags |= WMI_UNIFIED_VDEV_START_PMF_ENABLED;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002822 }
2823
gaurank kathpalia1b42e8d2017-12-15 15:44:06 +05302824 params.hidden_ssid = req->hidden_ssid;
2825 if (req->hidden_ssid)
2826 temp_flags |= WMI_UNIFIED_VDEV_START_HIDDEN_SSID;
2827
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302828 params.num_noa_descriptors = 0;
2829 params.preferred_rx_streams = req->preferred_rx_streams;
2830 params.preferred_tx_streams = req->preferred_tx_streams;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002831
Krishna Kumaar Natarajan0103ef82017-02-17 18:15:56 -08002832 wma_copy_vdev_start_he_ops(&params, req);
2833
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002834 /* Store vdev params in SAP mode which can be used in vdev restart */
2835 if (intr[req->vdev_id].type == WMI_VDEV_TYPE_AP &&
2836 intr[req->vdev_id].sub_type == 0) {
2837 intr[req->vdev_id].vdev_restart_params.vdev_id = req->vdev_id;
2838 intr[req->vdev_id].vdev_restart_params.ssid.ssid_len =
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302839 temp_ssid_len;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302840 qdf_mem_copy(intr[req->vdev_id].vdev_restart_params.ssid.ssid,
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302841 params.ssid.mac_ssid, temp_ssid_len);
2842 intr[req->vdev_id].vdev_restart_params.flags = temp_flags;
2843 intr[req->vdev_id].vdev_restart_params.requestor_id = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002844 intr[req->vdev_id].vdev_restart_params.disable_hw_ack =
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302845 params.dis_hw_ack;
2846 intr[req->vdev_id].vdev_restart_params.chan.mhz =
2847 params.chan_freq;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002848 intr[req->vdev_id].vdev_restart_params.chan.band_center_freq1 =
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302849 params.band_center_freq1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002850 intr[req->vdev_id].vdev_restart_params.chan.band_center_freq2 =
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302851 params.band_center_freq2;
2852 intr[req->vdev_id].vdev_restart_params.chan.info =
2853 temp_chan_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002854 intr[req->vdev_id].vdev_restart_params.chan.reg_info_1 =
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302855 temp_reg_info_1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002856 intr[req->vdev_id].vdev_restart_params.chan.reg_info_2 =
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302857 temp_reg_info_2;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002858 }
2859
2860 if (isRestart) {
2861 /*
2862 * Marking the VDEV UP STATUS to false
2863 * since, VDEV RESTART will do a VDEV DOWN
2864 * in the firmware.
2865 */
Mukul Sharmaf9047232017-03-02 16:58:56 +05302866 wma_vdev_set_mlme_state(wma, params.vdev_id, WLAN_VDEV_S_STOP);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002867 } else {
2868 WMA_LOGD("%s, vdev_id: %d, unpausing tx_ll_queue at VDEV_START",
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302869 __func__, params.vdev_id);
Leo Chang96464902016-10-28 11:10:54 -07002870 cdp_fc_vdev_unpause(cds_get_context(QDF_MODULE_ID_SOC),
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08002871 wma->interfaces[params.vdev_id].handle,
2872 0xffffffff);
Mukul Sharma6411bb82017-03-01 15:57:07 +05302873 wma_vdev_update_pause_bitmap(params.vdev_id, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002874 }
2875
Dustin Brownd5f12942017-03-10 11:06:25 -08002876 return wma_send_vdev_start_to_fw(wma, &params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002877}
2878
2879/**
2880 * wma_peer_assoc_conf_handler() - peer assoc conf handler
2881 * @handle: wma handle
2882 * @cmd_param_info: event buffer
2883 * @len: buffer length
2884 *
2885 * Return: 0 for success or error code
2886 */
2887int wma_peer_assoc_conf_handler(void *handle, uint8_t *cmd_param_info,
2888 uint32_t len)
2889{
2890 tp_wma_handle wma = (tp_wma_handle) handle;
2891 WMI_PEER_ASSOC_CONF_EVENTID_param_tlvs *param_buf;
2892 wmi_peer_assoc_conf_event_fixed_param *event;
2893 struct wma_target_req *req_msg;
2894 uint8_t macaddr[IEEE80211_ADDR_LEN];
2895 int status = 0;
2896
2897 WMA_LOGD(FL("Enter"));
2898 param_buf = (WMI_PEER_ASSOC_CONF_EVENTID_param_tlvs *) cmd_param_info;
2899 if (!param_buf) {
2900 WMA_LOGE("Invalid peer assoc conf event buffer");
2901 return -EINVAL;
2902 }
2903
2904 event = param_buf->fixed_param;
2905 if (!event) {
2906 WMA_LOGE("Invalid peer assoc conf event buffer");
2907 return -EINVAL;
2908 }
2909
2910 WMI_MAC_ADDR_TO_CHAR_ARRAY(&event->peer_macaddr, macaddr);
2911 WMA_LOGD(FL("peer assoc conf for vdev:%d mac=%pM"),
2912 event->vdev_id, macaddr);
2913
2914 req_msg = wma_find_req(wma, event->vdev_id,
2915 WMA_PEER_ASSOC_CNF_START);
2916
2917 if (!req_msg) {
2918 WMA_LOGE(FL("Failed to lookup request message for vdev %d"),
2919 event->vdev_id);
2920 return -EINVAL;
2921 }
2922
Anurag Chouhan210db072016-02-22 18:42:15 +05302923 qdf_mc_timer_stop(&req_msg->event_timeout);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002924
2925 if (req_msg->msg_type == WMA_ADD_STA_REQ) {
2926 tpAddStaParams params = (tpAddStaParams)req_msg->user_data;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002927
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002928 if (!params) {
2929 WMA_LOGE(FL("add STA params is NULL for vdev %d"),
2930 event->vdev_id);
2931 status = -EINVAL;
2932 goto free_req_msg;
2933 }
2934
2935 /* peer assoc conf event means the cmd succeeds */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302936 params->status = QDF_STATUS_SUCCESS;
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08002937 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 -08002938 params->staType, params->smesessionId,
2939 params->assocId, params->bssId, params->staIdx,
2940 params->status);
Abhishek Singh2d775fd2017-08-18 10:51:33 +05302941 wma_send_msg_high_priority(wma, WMA_ADD_STA_RSP,
2942 (void *)params, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002943 } else if (req_msg->msg_type == WMA_ADD_BSS_REQ) {
2944 tpAddBssParams params = (tpAddBssParams) req_msg->user_data;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002945
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002946 if (!params) {
2947 WMA_LOGE(FL("add BSS params is NULL for vdev %d"),
2948 event->vdev_id);
2949 status = -EINVAL;
2950 goto free_req_msg;
2951 }
2952
2953 /* peer assoc conf event means the cmd succeeds */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302954 params->status = QDF_STATUS_SUCCESS;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002955 WMA_LOGD(FL("Send ADD BSS RSP: opermode: %d update_bss: %d nw_type: %d bssid: %pM staIdx %d status %d"),
2956 params->operMode,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002957 params->updateBss, params->nwType, params->bssId,
2958 params->staContext.staIdx, params->status);
Abhishek Singh2d775fd2017-08-18 10:51:33 +05302959 wma_send_msg_high_priority(wma, WMA_ADD_BSS_RSP,
2960 (void *)params, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002961 } else {
2962 WMA_LOGE(FL("Unhandled request message type: %d"),
2963 req_msg->msg_type);
2964 }
2965
2966free_req_msg:
Anurag Chouhan210db072016-02-22 18:42:15 +05302967 qdf_mc_timer_destroy(&req_msg->event_timeout);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302968 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002969
2970 return status;
2971}
2972
2973/**
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08002974 * wma_vdev_delete_handler() - vdev delete response handler
2975 * @handle: wma handle
2976 * @cmd_param_info: event buffer
2977 * @len: buffer length
2978 *
2979 * Return: 0 for success or error code
2980 */
2981int wma_vdev_delete_handler(void *handle, uint8_t *cmd_param_info,
2982 uint32_t len)
2983{
2984 tp_wma_handle wma = (tp_wma_handle) handle;
2985 WMI_VDEV_DELETE_RESP_EVENTID_param_tlvs *param_buf;
2986 wmi_vdev_delete_cmd_fixed_param *event;
2987 struct wma_target_req *req_msg;
2988 int status = 0;
2989
2990 param_buf = (WMI_VDEV_DELETE_RESP_EVENTID_param_tlvs *)cmd_param_info;
2991 if (!param_buf) {
2992 WMA_LOGE("Invalid vdev delete event buffer");
2993 return -EINVAL;
2994 }
2995
2996 event = (wmi_vdev_delete_cmd_fixed_param *)param_buf->fixed_param;
2997 if (!event) {
2998 WMA_LOGE("Invalid vdev delete event buffer");
2999 return -EINVAL;
3000 }
3001
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07003002 WMA_LOGD("%s Vdev delete resp vdev id %d", __func__, event->vdev_id);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003003 req_msg = wma_find_vdev_req(wma, event->vdev_id,
Kiran Kumar Lokere20804162017-07-17 16:09:04 -07003004 WMA_TARGET_REQ_TYPE_VDEV_DEL, true);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003005 if (!req_msg) {
3006 WMA_LOGD(FL("Vdev delete resp is not handled! vdev id %d"),
3007 event->vdev_id);
3008 return -EINVAL;
3009 }
Abhishek Singh1d1d3e32018-03-01 17:30:48 +05303010 qdf_mc_timer_stop(&req_msg->event_timeout);
3011 qdf_mc_timer_destroy(&req_msg->event_timeout);
Dustin Brownec2c92e2017-07-26 11:13:49 -07003012
3013 wma_release_wakelock(&wma->wmi_cmd_rsp_wake_lock);
3014
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003015 /* Send response to upper layers */
3016 wma_vdev_detach_callback(req_msg->user_data);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303017 qdf_mem_free(req_msg);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003018
3019 return status;
3020}
3021
3022/**
3023 * wma_peer_delete_handler() - peer delete response handler
3024 * @handle: wma handle
3025 * @cmd_param_info: event buffer
3026 * @len: buffer length
3027 *
3028 * Return: 0 for success or error code
3029 */
3030int wma_peer_delete_handler(void *handle, uint8_t *cmd_param_info,
3031 uint32_t len)
3032{
3033 tp_wma_handle wma = (tp_wma_handle) handle;
3034 WMI_PEER_DELETE_RESP_EVENTID_param_tlvs *param_buf;
3035 wmi_peer_delete_cmd_fixed_param *event;
3036 struct wma_target_req *req_msg;
3037 tDeleteStaParams *del_sta;
3038 uint8_t macaddr[IEEE80211_ADDR_LEN];
3039 int status = 0;
3040
3041 param_buf = (WMI_PEER_DELETE_RESP_EVENTID_param_tlvs *)cmd_param_info;
3042 if (!param_buf) {
3043 WMA_LOGE("Invalid vdev delete event buffer");
3044 return -EINVAL;
3045 }
3046
3047 event = (wmi_peer_delete_cmd_fixed_param *)param_buf->fixed_param;
3048 if (!event) {
3049 WMA_LOGE("Invalid vdev delete event buffer");
3050 return -EINVAL;
3051 }
3052
3053 WMI_MAC_ADDR_TO_CHAR_ARRAY(&event->peer_macaddr, macaddr);
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07003054 WMA_LOGD(FL("Peer Delete Response, vdev %d Peer %pM"),
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003055 event->vdev_id, macaddr);
Deepak Dhamdheref918d422017-07-06 12:56:29 -07003056 wlan_roam_debug_log(event->vdev_id, DEBUG_PEER_DELETE_RESP,
3057 DEBUG_INVALID_PEER_ID, macaddr, NULL, 0, 0);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003058 req_msg = wma_find_remove_req_msgtype(wma, event->vdev_id,
3059 WMA_DELETE_STA_REQ);
3060 if (!req_msg) {
3061 WMA_LOGD("Peer Delete response is not handled");
3062 return -EINVAL;
3063 }
3064
Dustin Brownec2c92e2017-07-26 11:13:49 -07003065 wma_release_wakelock(&wma->wmi_cmd_rsp_wake_lock);
3066
3067 /* Cleanup timeout handler */
Anurag Chouhan210db072016-02-22 18:42:15 +05303068 qdf_mc_timer_stop(&req_msg->event_timeout);
3069 qdf_mc_timer_destroy(&req_msg->event_timeout);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003070
3071 if (req_msg->type == WMA_DELETE_STA_RSP_START) {
3072 del_sta = req_msg->user_data;
3073 if (del_sta->respReqd) {
3074 WMA_LOGD(FL("Sending peer del rsp to umac"));
Abhishek Singh2d775fd2017-08-18 10:51:33 +05303075 wma_send_msg_high_priority(wma, WMA_DELETE_STA_RSP,
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303076 (void *)del_sta, QDF_STATUS_SUCCESS);
yeshwanth sriram guntuka945b6212017-03-07 15:56:45 +05303077 } else {
3078 qdf_mem_free(del_sta);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003079 }
3080 } else if (req_msg->type == WMA_DEL_P2P_SELF_STA_RSP_START) {
3081 struct del_sta_self_rsp_params *data;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003082
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003083 data = (struct del_sta_self_rsp_params *)req_msg->user_data;
3084 WMA_LOGD(FL("Calling vdev detach handler"));
3085 wma_handle_vdev_detach(wma, data->self_sta_param,
3086 data->generate_rsp);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303087 qdf_mem_free(data);
Sandeep Puligillabbee8172017-04-07 19:26:33 -07003088 } else if (req_msg->type == WMA_SET_LINK_PEER_RSP) {
3089 tpLinkStateParams params =
3090 (tpLinkStateParams) req_msg->user_data;
Dustin Brownec2c92e2017-07-26 11:13:49 -07003091 if (wma_send_vdev_down_to_fw(wma, req_msg->vdev_id) !=
3092 QDF_STATUS_SUCCESS) {
Sandeep Puligillabbee8172017-04-07 19:26:33 -07003093 WMA_LOGE("Failed to send vdev down cmd: vdev %d",
3094 req_msg->vdev_id);
3095 }
3096 wma_send_msg(wma, WMA_SET_LINK_STATE_RSP, (void *)params, 0);
Abhishek Singhe8be9a62017-05-30 12:13:29 +05303097 } else if (req_msg->type == WMA_DELETE_PEER_RSP) {
3098 wma_send_del_bss_response(wma, req_msg, req_msg->vdev_id);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003099 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303100 qdf_mem_free(req_msg);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003101 return status;
3102}
3103
Dustin Brown83044c22018-08-13 15:00:44 -07003104static void wma_trigger_recovery_assert_on_fw_timeout(uint16_t wma_msg)
Himanshu Agarwal1230ee02018-05-04 00:31:12 +05303105{
Dustin Brown83044c22018-08-13 15:00:44 -07003106 WMA_LOGE("%s timed out, triggering recovery",
3107 mac_trace_get_wma_msg_string(wma_msg));
3108 cds_trigger_recovery(QDF_REASON_UNSPECIFIED);
Himanshu Agarwal1230ee02018-05-04 00:31:12 +05303109}
3110
Manikandan Mohanb089ed62017-02-13 11:38:14 -08003111static inline bool wma_crash_on_fw_timeout(bool crash_enabled)
3112{
3113 /* Discard FW timeouts and dont crash during SSR */
3114 if (cds_is_driver_recovering())
3115 return false;
3116
Sandeep Puligilla5ac6bd22017-10-17 12:33:56 -07003117 /* Firmware is down send failure response */
3118 if (cds_is_fw_down())
Nachiket Kukade8003d252017-03-30 15:55:58 +05303119 return false;
3120
Kapil Gupta8c336652017-05-30 16:54:13 +05303121 if (cds_is_driver_unloading())
3122 return false;
3123
Manikandan Mohanb089ed62017-02-13 11:38:14 -08003124 return crash_enabled;
3125}
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003126
3127/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003128 * wma_hold_req_timer() - wma hold request timeout function
3129 * @data: target request params
3130 *
3131 * Return: none
3132 */
3133void wma_hold_req_timer(void *data)
3134{
3135 tp_wma_handle wma;
3136 struct wma_target_req *tgt_req = (struct wma_target_req *)data;
3137 struct wma_target_req *msg;
3138
Anurag Chouhan6d760662016-02-20 16:05:43 +05303139 wma = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003140 if (NULL == wma) {
3141 WMA_LOGE(FL("Failed to get wma"));
Naveen Rawat0eb3dd02017-04-03 20:18:30 -07003142 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003143 }
3144
3145 WMA_LOGA(FL("request %d is timed out for vdev_id - %d"),
3146 tgt_req->msg_type, tgt_req->vdev_id);
3147 msg = wma_find_req(wma, tgt_req->vdev_id, tgt_req->type);
3148
3149 if (!msg) {
3150 WMA_LOGE(FL("Failed to lookup request message - %d"),
3151 tgt_req->msg_type);
Naveen Rawat0eb3dd02017-04-03 20:18:30 -07003152 /*
3153 * if find request failed, then firmware rsp should have
3154 * consumed the buffer. Do not free.
3155 */
3156 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003157 }
3158
3159 if (tgt_req->msg_type == WMA_ADD_STA_REQ) {
3160 tpAddStaParams params = (tpAddStaParams) tgt_req->user_data;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003161
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303162 params->status = QDF_STATUS_E_TIMEOUT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003163 WMA_LOGA(FL("WMA_ADD_STA_REQ timed out"));
3164 WMA_LOGD(FL("Sending add sta rsp to umac (mac:%pM, status:%d)"),
3165 params->staMac, params->status);
Himanshu Agarwal1230ee02018-05-04 00:31:12 +05303166 if (wma_crash_on_fw_timeout(wma->fw_timeout_crash) == true) {
3167 wma_trigger_recovery_assert_on_fw_timeout(
3168 WMA_ADD_STA_REQ);
3169 } else {
Abhishek Singh2d775fd2017-08-18 10:51:33 +05303170 wma_send_msg_high_priority(wma, WMA_ADD_STA_RSP,
3171 (void *)params, 0);
Himanshu Agarwal1230ee02018-05-04 00:31:12 +05303172 }
Krishna Kumaar Natarajanf1d6dee2016-02-11 16:40:43 -08003173 } else if (tgt_req->msg_type == WMA_ADD_BSS_REQ) {
3174 tpAddBssParams params = (tpAddBssParams) tgt_req->user_data;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003175
Krishna Kumaar Natarajanf1d6dee2016-02-11 16:40:43 -08003176 params->status = QDF_STATUS_E_TIMEOUT;
3177 WMA_LOGA(FL("WMA_ADD_BSS_REQ timed out"));
3178 WMA_LOGD(FL("Sending add bss rsp to umac (mac:%pM, status:%d)"),
3179 params->selfMacAddr, params->status);
Himanshu Agarwal1230ee02018-05-04 00:31:12 +05303180 if (wma_crash_on_fw_timeout(wma->fw_timeout_crash) == true) {
3181 wma_trigger_recovery_assert_on_fw_timeout(
3182 WMA_ADD_BSS_REQ);
3183 } else {
Abhishek Singh2d775fd2017-08-18 10:51:33 +05303184 wma_send_msg_high_priority(wma, WMA_ADD_BSS_RSP,
3185 (void *)params, 0);
Himanshu Agarwal1230ee02018-05-04 00:31:12 +05303186 }
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003187 } else if ((tgt_req->msg_type == WMA_DELETE_STA_REQ) &&
3188 (tgt_req->type == WMA_DELETE_STA_RSP_START)) {
3189 tpDeleteStaParams params =
3190 (tpDeleteStaParams) tgt_req->user_data;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303191 params->status = QDF_STATUS_E_TIMEOUT;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003192 WMA_LOGE(FL("WMA_DEL_STA_REQ timed out"));
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07003193 WMA_LOGE(FL("Sending del sta rsp to umac (mac:%pM, status:%d)"),
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003194 params->staMac, params->status);
Sandeep Puligillaafa52892016-10-26 19:03:16 -07003195
Manikandan Mohanb089ed62017-02-13 11:38:14 -08003196 if (wma_crash_on_fw_timeout(wma->fw_timeout_crash) == true) {
Himanshu Agarwal1230ee02018-05-04 00:31:12 +05303197 wma_trigger_recovery_assert_on_fw_timeout(
3198 WMA_DELETE_STA_REQ);
Sandeep Puligillaafa52892016-10-26 19:03:16 -07003199 } else {
3200 /*
3201 * Assert in development build only.
3202 * Send response in production builds.
3203 */
3204 QDF_ASSERT(0);
Abhishek Singh2d775fd2017-08-18 10:51:33 +05303205 wma_send_msg_high_priority(wma, WMA_DELETE_STA_RSP,
Sandeep Puligillaafa52892016-10-26 19:03:16 -07003206 (void *)params, 0);
3207 }
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003208 } else if ((tgt_req->msg_type == WMA_DELETE_STA_REQ) &&
3209 (tgt_req->type == WMA_DEL_P2P_SELF_STA_RSP_START)) {
Abhishek Singhc614ec42017-04-25 16:17:34 +05303210 struct del_sta_self_rsp_params *del_sta;
Srinivas Girigowda4d65ebe2017-10-13 21:41:42 -07003211
Abhishek Singhc614ec42017-04-25 16:17:34 +05303212 del_sta = (struct del_sta_self_rsp_params *)tgt_req->user_data;
3213 del_sta->self_sta_param->status = QDF_STATUS_E_TIMEOUT;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003214 WMA_LOGA(FL("wma delete sta p2p request timed out"));
Abhishek Singhc614ec42017-04-25 16:17:34 +05303215
3216 if (wma_crash_on_fw_timeout(wma->fw_timeout_crash)) {
Himanshu Agarwal1230ee02018-05-04 00:31:12 +05303217 wma_trigger_recovery_assert_on_fw_timeout(
3218 WMA_DELETE_STA_REQ);
Abhishek Singhc614ec42017-04-25 16:17:34 +05303219 } else {
3220 if (del_sta->generate_rsp)
3221 wma_send_del_sta_self_resp(
3222 del_sta->self_sta_param);
3223 }
3224 qdf_mem_free(tgt_req->user_data);
Sandeep Puligillabbee8172017-04-07 19:26:33 -07003225 } else if ((tgt_req->msg_type == WMA_DELETE_STA_REQ) &&
3226 (tgt_req->type == WMA_SET_LINK_PEER_RSP)) {
Abhishek Singhc614ec42017-04-25 16:17:34 +05303227 tpLinkStateParams params =
3228 (tpLinkStateParams) tgt_req->user_data;
3229
3230 params->status = false;
Sandeep Puligillabbee8172017-04-07 19:26:33 -07003231 WMA_LOGA(FL("wma delete peer for set link timed out"));
Himanshu Agarwal1230ee02018-05-04 00:31:12 +05303232 if (wma_crash_on_fw_timeout(wma->fw_timeout_crash) == true) {
3233 wma_trigger_recovery_assert_on_fw_timeout(
3234 WMA_DELETE_STA_REQ);
3235 } else {
Abhishek Singhc614ec42017-04-25 16:17:34 +05303236 wma_send_msg(wma, WMA_SET_LINK_STATE_RSP,
3237 params, 0);
Himanshu Agarwal1230ee02018-05-04 00:31:12 +05303238 }
Abhishek Singhe8be9a62017-05-30 12:13:29 +05303239 } else if ((tgt_req->msg_type == WMA_DELETE_STA_REQ) &&
3240 (tgt_req->type == WMA_DELETE_PEER_RSP)) {
Abhishek Singhc614ec42017-04-25 16:17:34 +05303241 tpDeleteBssParams params =
3242 (tpDeleteBssParams) tgt_req->user_data;
3243
3244 params->status = QDF_STATUS_E_TIMEOUT;
3245 WMA_LOGE(FL("wma delete peer for del bss req timed out"));
Himanshu Agarwal1230ee02018-05-04 00:31:12 +05303246 if (wma_crash_on_fw_timeout(wma->fw_timeout_crash) == true) {
3247 wma_trigger_recovery_assert_on_fw_timeout(
3248 WMA_DELETE_STA_REQ);
3249 } else {
Abhishek Singh2d775fd2017-08-18 10:51:33 +05303250 wma_send_msg_high_priority(wma, WMA_DELETE_BSS_RSP,
3251 params, 0);
Himanshu Agarwal1230ee02018-05-04 00:31:12 +05303252 }
Tushnim Bhattacharyya86294892017-10-25 16:29:11 -07003253 } else if ((tgt_req->msg_type == SIR_HAL_PDEV_SET_HW_MODE) &&
3254 (tgt_req->type == WMA_PDEV_SET_HW_MODE_RESP)) {
3255 struct sir_set_hw_mode_resp *params =
3256 qdf_mem_malloc(sizeof(*params));
3257
3258 WMA_LOGE(FL("set hw mode req timed out"));
3259
3260 if (!params)
3261 WMA_LOGE("%s: Memory allocation failed", __func__);
3262 else {
3263 params->status = SET_HW_MODE_STATUS_ECANCELED;
3264 params->cfgd_hw_mode_index = 0;
3265 params->num_vdev_mac_entries = 0;
3266
3267 if (wma_crash_on_fw_timeout(wma->fw_timeout_crash) == true)
3268 QDF_BUG(0);
3269 else
3270 wma_send_msg_high_priority(wma,
3271 SIR_HAL_PDEV_SET_HW_MODE_RESP, params, 0);
3272 }
Krishna Kumaar Natarajanf1d6dee2016-02-11 16:40:43 -08003273 } else {
3274 WMA_LOGE(FL("Unhandled timeout for msg_type:%d and type:%d"),
3275 tgt_req->msg_type, tgt_req->type);
3276 QDF_BUG(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003277 }
Abhishek Singh07b97852017-08-01 11:10:07 +05303278 qdf_mc_timer_destroy(&tgt_req->event_timeout);
Abhishek Singhc614ec42017-04-25 16:17:34 +05303279 qdf_mem_free(tgt_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003280}
3281
3282/**
3283 * wma_fill_hold_req() - fill wma request
3284 * @wma: wma handle
3285 * @msg_type: message type
3286 * @type: request type
3287 * @params: request params
3288 * @timeout: timeout value
3289 *
3290 * Return: wma_target_req ptr
3291 */
3292struct wma_target_req *wma_fill_hold_req(tp_wma_handle wma,
3293 uint8_t vdev_id,
3294 uint32_t msg_type, uint8_t type,
3295 void *params, uint32_t timeout)
3296{
3297 struct wma_target_req *req;
Anurag Chouhanffb21542016-02-17 14:33:03 +05303298 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003299
Yeshwanth Sriram Guntuka25fa2c02018-08-01 15:31:10 +05303300 if (!cds_is_target_ready()) {
3301 WMA_LOGE("target not ready, drop the request");
3302 return NULL;
3303 }
3304
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303305 req = qdf_mem_malloc(sizeof(*req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003306 if (!req) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07003307 WMA_LOGE(FL("Failed to allocate memory for msg %d vdev %d"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003308 msg_type, vdev_id);
3309 return NULL;
3310 }
3311
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07003312 WMA_LOGD(FL("vdev_id %d msg %d type %d"), vdev_id, msg_type, type);
Abhishek Singhc614ec42017-04-25 16:17:34 +05303313 qdf_spin_lock_bh(&wma->wma_hold_req_q_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003314 req->vdev_id = vdev_id;
3315 req->msg_type = msg_type;
3316 req->type = type;
3317 req->user_data = params;
Anurag Chouhanffb21542016-02-17 14:33:03 +05303318 status = qdf_list_insert_back(&wma->wma_hold_req_queue, &req->node);
3319 if (QDF_STATUS_SUCCESS != status) {
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303320 qdf_spin_unlock_bh(&wma->wma_hold_req_q_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003321 WMA_LOGE(FL("Failed add request in queue"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303322 qdf_mem_free(req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003323 return NULL;
3324 }
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303325 qdf_spin_unlock_bh(&wma->wma_hold_req_q_lock);
Abhishek Singhc614ec42017-04-25 16:17:34 +05303326 qdf_mc_timer_init(&req->event_timeout, QDF_TIMER_TYPE_SW,
3327 wma_hold_req_timer, req);
3328 qdf_mc_timer_start(&req->event_timeout, timeout);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003329 return req;
3330}
3331
3332/**
3333 * wma_remove_req() - remove request
3334 * @wma: wma handle
3335 * @vdev_id: vdev id
3336 * @type: type
3337 *
3338 * Return: none
3339 */
3340void wma_remove_req(tp_wma_handle wma, uint8_t vdev_id,
3341 uint8_t type)
3342{
3343 struct wma_target_req *req_msg;
3344
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07003345 WMA_LOGD(FL("Remove req for vdev: %d type: %d"), vdev_id, type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003346 req_msg = wma_find_req(wma, vdev_id, type);
3347 if (!req_msg) {
3348 WMA_LOGE(FL("target req not found for vdev: %d type: %d"),
3349 vdev_id, type);
3350 return;
3351 }
3352
Anurag Chouhan210db072016-02-22 18:42:15 +05303353 qdf_mc_timer_stop(&req_msg->event_timeout);
3354 qdf_mc_timer_destroy(&req_msg->event_timeout);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303355 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003356}
3357
3358/**
3359 * wma_vdev_resp_timer() - wma response timeout function
3360 * @data: target request params
3361 *
3362 * Return: none
3363 */
3364void wma_vdev_resp_timer(void *data)
3365{
3366 tp_wma_handle wma;
3367 struct wma_target_req *tgt_req = (struct wma_target_req *)data;
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003368 struct cdp_pdev *pdev;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003369 struct wma_target_req *msg;
Sandeep Puligilla7da86332016-11-10 16:14:40 -08003370 uint8_t peer_id;
Abhishek Singhc614ec42017-04-25 16:17:34 +05303371 int status;
Sandeep Puligilla7da86332016-11-10 16:14:40 -08003372 void *peer;
Leo Chang96464902016-10-28 11:10:54 -07003373 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003374#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
Wu Gao30f65eb2017-08-09 19:56:10 +08003375 tpAniSirGlobal mac_ctx;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003376#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
3377
Anurag Chouhan6d760662016-02-20 16:05:43 +05303378 wma = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003379
3380 if (NULL == wma) {
3381 WMA_LOGE("%s: Failed to get wma", __func__);
Liangwei Dong748cb5d2016-09-29 00:56:40 -04003382 wma_cleanup_target_req_param(tgt_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003383 goto free_tgt_req;
3384 }
3385
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003386 WMA_LOGA("%s: request %d is timed out for vdev_id - %d", __func__,
3387 tgt_req->msg_type, tgt_req->vdev_id);
Kiran Kumar Lokere20804162017-07-17 16:09:04 -07003388 msg = wma_find_vdev_req(wma, tgt_req->vdev_id, tgt_req->type, true);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003389
3390 if (!msg) {
3391 WMA_LOGE("%s: Failed to lookup request message - %d",
3392 __func__, tgt_req->msg_type);
Houston Hoffmanb4558eb2017-05-18 15:07:51 -07003393 return;
3394 }
3395
3396 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
3397
3398 if (NULL == pdev) {
3399 WMA_LOGE("%s: Failed to get pdev", __func__);
Liangwei Dong748cb5d2016-09-29 00:56:40 -04003400 wma_cleanup_target_req_param(tgt_req);
Houston Hoffmanb4558eb2017-05-18 15:07:51 -07003401 qdf_mc_timer_stop(&tgt_req->event_timeout);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003402 goto free_tgt_req;
3403 }
3404
Wu Gao30f65eb2017-08-09 19:56:10 +08003405#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
3406 mac_ctx = cds_get_context(QDF_MODULE_ID_PE);
3407 if (!mac_ctx) {
3408 WMA_LOGE("%s: Failed to get mac_ctx", __func__);
3409 wma_cleanup_target_req_param(tgt_req);
3410 goto free_tgt_req;
3411 }
3412#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
3413
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003414 if (tgt_req->msg_type == WMA_CHNL_SWITCH_REQ) {
3415 tpSwitchChannelParams params =
3416 (tpSwitchChannelParams) tgt_req->user_data;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303417 params->status = QDF_STATUS_E_TIMEOUT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003418 WMA_LOGA("%s: WMA_SWITCH_CHANNEL_REQ timedout", __func__);
Sandeep Puligillaafa52892016-10-26 19:03:16 -07003419
Nachiket Kukade8003d252017-03-30 15:55:58 +05303420 /*
3421 * Trigger host crash if the flag is set or if the timeout
3422 * is not due to fw down
3423 */
Himanshu Agarwal1230ee02018-05-04 00:31:12 +05303424 if (wma_crash_on_fw_timeout(wma->fw_timeout_crash) == true) {
3425 wma_trigger_recovery_assert_on_fw_timeout(
3426 WMA_CHNL_SWITCH_REQ);
3427 } else {
Abhishek Singh2d775fd2017-08-18 10:51:33 +05303428 wma_send_msg_high_priority(wma, WMA_SWITCH_CHANNEL_RSP,
Sandeep Puligillaafa52892016-10-26 19:03:16 -07003429 (void *)params, 0);
Himanshu Agarwal1230ee02018-05-04 00:31:12 +05303430 }
Agrawal Ashish7dd7c592016-02-22 14:25:11 +05303431 if (wma->interfaces[tgt_req->vdev_id].is_channel_switch) {
3432 wma->interfaces[tgt_req->vdev_id].is_channel_switch =
3433 false;
3434 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003435 } else if (tgt_req->msg_type == WMA_DELETE_BSS_REQ) {
3436 tpDeleteBssParams params =
3437 (tpDeleteBssParams) tgt_req->user_data;
3438 struct beacon_info *bcn;
3439 struct wma_txrx_node *iface;
3440
Naveen Rawatf2bd42d2017-06-29 14:51:43 -07003441 if (tgt_req->vdev_id >= wma->max_bssid) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003442 WMA_LOGE("%s: Invalid vdev_id %d", __func__,
3443 tgt_req->vdev_id);
Liangwei Dong748cb5d2016-09-29 00:56:40 -04003444 wma_cleanup_target_req_param(tgt_req);
Anurag Chouhan210db072016-02-22 18:42:15 +05303445 qdf_mc_timer_stop(&tgt_req->event_timeout);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003446 goto free_tgt_req;
3447 }
3448
3449 iface = &wma->interfaces[tgt_req->vdev_id];
3450 if (iface->handle == NULL) {
3451 WMA_LOGE("%s vdev id %d is already deleted",
3452 __func__, tgt_req->vdev_id);
Liangwei Dong748cb5d2016-09-29 00:56:40 -04003453 wma_cleanup_target_req_param(tgt_req);
Anurag Chouhan210db072016-02-22 18:42:15 +05303454 qdf_mc_timer_stop(&tgt_req->event_timeout);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003455 goto free_tgt_req;
3456 }
Nachiket Kukade8003d252017-03-30 15:55:58 +05303457 /*
3458 * Trigger host crash if the flag is set or if the timeout
3459 * is not due to fw down
3460 */
Manikandan Mohanb089ed62017-02-13 11:38:14 -08003461 if (wma_crash_on_fw_timeout(wma->fw_timeout_crash) == true) {
Himanshu Agarwal1230ee02018-05-04 00:31:12 +05303462 wma_trigger_recovery_assert_on_fw_timeout(
3463 WMA_DELETE_BSS_REQ);
Prakash Dhavali0b792742016-12-02 17:56:36 -08003464 return;
3465 }
3466
Krishna Kumaar Natarajanf24bfc82017-02-07 11:54:05 -08003467 status = wma_remove_bss_peer(wma, pdev, tgt_req,
3468 tgt_req->vdev_id, params);
3469 if (status != 0)
3470 goto free_tgt_req;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003471
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05303472 if (wmi_service_enabled(
3473 wma->wmi_handle,
3474 wmi_service_sync_delete_cmds))
Abhishek Singhe8be9a62017-05-30 12:13:29 +05303475 goto free_tgt_req;
3476
Dustin Brownec2c92e2017-07-26 11:13:49 -07003477 if (wma_send_vdev_down_to_fw(wma, tgt_req->vdev_id) !=
3478 QDF_STATUS_SUCCESS) {
Sandeep Puligilla58c84ef2016-08-21 16:20:33 -07003479 WMA_LOGE("Failed to send vdev down cmd: vdev %d",
3480 tgt_req->vdev_id);
3481 } else {
Mukul Sharmaf9047232017-03-02 16:58:56 +05303482 wma_vdev_set_mlme_state(wma, tgt_req->vdev_id,
3483 WLAN_VDEV_S_STOP);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003484#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
Sandeep Puligilla58c84ef2016-08-21 16:20:33 -07003485 if (mac_ctx->sap.sap_channel_avoidance)
3486 wma_find_mcc_ap(wma, tgt_req->vdev_id, false);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003487#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
3488 }
Leo Chang96464902016-10-28 11:10:54 -07003489 cdp_fc_vdev_flush(soc, iface->handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003490 WMA_LOGD("%s, vdev_id: %d, un-pausing tx_ll_queue for WDA_DELETE_BSS_REQ timeout",
3491 __func__, tgt_req->vdev_id);
Leo Chang96464902016-10-28 11:10:54 -07003492 cdp_fc_vdev_unpause(soc, iface->handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003493 OL_TXQ_PAUSE_REASON_VDEV_STOP);
Mukul Sharma6411bb82017-03-01 15:57:07 +05303494 wma_vdev_clear_pause_bit(tgt_req->vdev_id, PAUSE_TYPE_HOST);
Anurag Chouhan8e0ccd32016-02-19 15:30:20 +05303495 qdf_atomic_set(&iface->bss_status, WMA_BSS_STATUS_STOPPED);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003496 WMA_LOGD("%s: (type %d subtype %d) BSS is stopped",
3497 __func__, iface->type, iface->sub_type);
3498
3499 bcn = wma->interfaces[tgt_req->vdev_id].beacon;
3500
3501 if (bcn) {
Jeff Johnsonadba3962017-09-18 08:12:35 -07003502 WMA_LOGD("%s: Freeing beacon struct %pK, template memory %pK",
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003503 __func__, bcn, bcn->buf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003504 if (bcn->dma_mapped)
Leo Chang96464902016-10-28 11:10:54 -07003505 qdf_nbuf_unmap_single(wma->qdf_dev, bcn->buf,
Anurag Chouhan6d760662016-02-20 16:05:43 +05303506 QDF_DMA_TO_DEVICE);
Nirav Shahcbc6d722016-03-01 16:24:53 +05303507 qdf_nbuf_free(bcn->buf);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303508 qdf_mem_free(bcn);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003509 wma->interfaces[tgt_req->vdev_id].beacon = NULL;
3510 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303511 params->status = QDF_STATUS_E_TIMEOUT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003512 WMA_LOGA("%s: WMA_DELETE_BSS_REQ timedout", __func__);
Abhishek Singh2d775fd2017-08-18 10:51:33 +05303513 wma_send_msg_high_priority(wma, WMA_DELETE_BSS_RSP,
3514 (void *)params, 0);
Abhishek Singh0d74f9e2017-09-26 14:02:42 +05303515 if (iface->del_staself_req && iface->is_del_sta_defered) {
3516 iface->is_del_sta_defered = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003517 WMA_LOGA("scheduling defered deletion(vdev id %x)",
3518 tgt_req->vdev_id);
3519 wma_vdev_detach(wma, iface->del_staself_req, 1);
3520 }
3521 } else if (tgt_req->msg_type == WMA_DEL_STA_SELF_REQ) {
3522 struct wma_txrx_node *iface =
3523 (struct wma_txrx_node *)tgt_req->user_data;
3524 struct del_sta_self_params *params =
3525 (struct del_sta_self_params *) iface->del_staself_req;
3526
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05303527 if (wmi_service_enabled(wma->wmi_handle,
3528 wmi_service_sync_delete_cmds)) {
Dustin Brownec2c92e2017-07-26 11:13:49 -07003529 wma_release_wakelock(&wma->wmi_cmd_rsp_wake_lock);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003530 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303531 params->status = QDF_STATUS_E_TIMEOUT;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003532
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003533 WMA_LOGA("%s: WMA_DEL_STA_SELF_REQ timedout", __func__);
Abhishek Singh0ac37442018-05-02 21:07:57 +05303534
Himanshu Agarwal1230ee02018-05-04 00:31:12 +05303535 if (wma_crash_on_fw_timeout(wma->fw_timeout_crash) == true) {
3536 wma_trigger_recovery_assert_on_fw_timeout(
3537 WMA_DEL_STA_SELF_REQ);
Abhishek Singh0ac37442018-05-02 21:07:57 +05303538 } else if (!cds_is_driver_unloading() &&
3539 (cds_is_fw_down() || cds_is_driver_recovering())) {
3540 qdf_mem_free(iface->del_staself_req);
3541 iface->del_staself_req = NULL;
Himanshu Agarwal1230ee02018-05-04 00:31:12 +05303542 } else {
Abhishek Singhc614ec42017-04-25 16:17:34 +05303543 wma_send_del_sta_self_resp(iface->del_staself_req);
Abhinav Kumar0a846132018-08-09 11:49:46 +05303544 iface->del_staself_req = NULL;
Abhishek Singh0ac37442018-05-02 21:07:57 +05303545 }
Dustin Brown35b61f62017-08-31 16:03:32 -07003546
3547 wma_vdev_deinit(iface);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303548 qdf_mem_zero(iface, sizeof(*iface));
Dustin Brown35b61f62017-08-31 16:03:32 -07003549 wma_vdev_init(iface);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003550 } else if (tgt_req->msg_type == WMA_ADD_BSS_REQ) {
3551 tpAddBssParams params = (tpAddBssParams) tgt_req->user_data;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003552
Krishna Kumaar Natarajan06edf7c2016-11-17 12:21:59 -08003553 params->status = QDF_STATUS_E_TIMEOUT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003554 WMA_LOGA("%s: WMA_ADD_BSS_REQ timedout", __func__);
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07003555 WMA_LOGD("%s: bssid %pM vdev_id %d", __func__, params->bssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003556 tgt_req->vdev_id);
Manikandan Mohanb089ed62017-02-13 11:38:14 -08003557 if (wma_crash_on_fw_timeout(wma->fw_timeout_crash) == true) {
Himanshu Agarwal1230ee02018-05-04 00:31:12 +05303558 wma_trigger_recovery_assert_on_fw_timeout(
3559 WMA_ADD_BSS_REQ);
Sandeep Puligillaafa52892016-10-26 19:03:16 -07003560 } else {
Min Liuf2bc4852018-08-03 17:10:28 +08003561 peer = cdp_peer_find_by_addr(soc, pdev, params->bssId,
3562 &peer_id);
3563 if (peer)
3564 wma_remove_peer(wma, params->bssId,
3565 tgt_req->vdev_id, peer, false);
3566 else
3567 WMA_LOGE("%s: Failed to find peer", __func__);
3568
Abhishek Singh2d775fd2017-08-18 10:51:33 +05303569 wma_send_msg_high_priority(wma, WMA_ADD_BSS_RSP,
3570 (void *)params, 0);
Sandeep Puligillaafa52892016-10-26 19:03:16 -07003571 QDF_ASSERT(0);
3572 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003573 goto free_tgt_req;
Sandeep Puligilla88de6fb2016-09-23 17:08:44 -07003574
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003575 } else if (tgt_req->msg_type == WMA_OCB_SET_CONFIG_CMD) {
3576 struct wma_txrx_node *iface;
3577
3578 WMA_LOGE(FL("Failed to send OCB set config cmd"));
3579 iface = &wma->interfaces[tgt_req->vdev_id];
Mukul Sharmaf9047232017-03-02 16:58:56 +05303580 wma_vdev_set_mlme_state(wma, tgt_req->vdev_id,
3581 WLAN_VDEV_S_STOP);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303582 wma_ocb_set_config_resp(wma, QDF_STATUS_E_TIMEOUT);
Selvaraj, Sridhara0083c42016-06-22 22:15:43 +05303583 } else if (tgt_req->msg_type == WMA_HIDDEN_SSID_VDEV_RESTART) {
Abhishek Singhf06214b2018-08-17 12:16:39 +05303584 if ((qdf_atomic_read(
3585 &wma->interfaces[tgt_req->vdev_id].vdev_restart_params.
3586 hidden_ssid_restart_in_progress)) &&
3587 wma_is_vdev_in_ap_mode(wma, tgt_req->vdev_id)) {
3588
3589 WMA_LOGE("Hidden ssid vdev restart Timed Out; vdev_id: %d, type = %d",
3590 tgt_req->vdev_id, tgt_req->type);
3591 qdf_atomic_set(&wma->interfaces[tgt_req->vdev_id].
3592 vdev_restart_params.
3593 hidden_ssid_restart_in_progress, 0);
3594 qdf_mem_free(tgt_req->user_data);
3595 }
Sandeep Puligilla7da86332016-11-10 16:14:40 -08003596 } else if (tgt_req->msg_type == WMA_SET_LINK_STATE) {
3597 tpLinkStateParams params =
3598 (tpLinkStateParams) tgt_req->user_data;
3599
3600 peer = cdp_peer_find_by_addr(soc, pdev, params->bssid, &peer_id);
3601 if (peer) {
3602 WMA_LOGP(FL("Deleting peer %pM vdev id %d"),
3603 params->bssid, tgt_req->vdev_id);
3604 wma_remove_peer(wma, params->bssid, tgt_req->vdev_id,
3605 peer, false);
3606 }
Dustin Brownec2c92e2017-07-26 11:13:49 -07003607 if (wma_send_vdev_down_to_fw(wma, tgt_req->vdev_id) !=
3608 QDF_STATUS_SUCCESS) {
Sandeep Puligilla7da86332016-11-10 16:14:40 -08003609 WMA_LOGE("Failed to send vdev down cmd: vdev %d",
3610 tgt_req->vdev_id);
3611 }
3612 params->status = QDF_STATUS_E_TIMEOUT;
3613 WMA_LOGA("%s: WMA_SET_LINK_STATE timedout vdev %d", __func__,
3614 tgt_req->vdev_id);
3615 wma_send_msg(wma, WMA_SET_LINK_STATE_RSP, (void *)params, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003616 }
3617free_tgt_req:
Anurag Chouhan210db072016-02-22 18:42:15 +05303618 qdf_mc_timer_destroy(&tgt_req->event_timeout);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303619 qdf_mem_free(tgt_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003620}
3621
3622/**
3623 * wma_fill_vdev_req() - fill vdev request
3624 * @wma: wma handle
3625 * @msg_type: message type
3626 * @type: request type
3627 * @params: request params
3628 * @timeout: timeout value
3629 *
3630 * Return: wma_target_req ptr
3631 */
3632struct wma_target_req *wma_fill_vdev_req(tp_wma_handle wma,
3633 uint8_t vdev_id,
3634 uint32_t msg_type, uint8_t type,
3635 void *params, uint32_t timeout)
3636{
3637 struct wma_target_req *req;
Anurag Chouhanffb21542016-02-17 14:33:03 +05303638 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003639
Yeshwanth Sriram Guntuka25fa2c02018-08-01 15:31:10 +05303640 if (!cds_is_target_ready()) {
3641 WMA_LOGE("target not ready, drop the request");
3642 return NULL;
3643 }
3644
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303645 req = qdf_mem_malloc(sizeof(*req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003646 if (!req) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07003647 WMA_LOGE("%s: Failed to allocate memory for msg %d vdev %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003648 __func__, msg_type, vdev_id);
3649 return NULL;
3650 }
3651
3652 WMA_LOGD("%s: vdev_id %d msg %d", __func__, vdev_id, msg_type);
Abhishek Singhc614ec42017-04-25 16:17:34 +05303653 qdf_spin_lock_bh(&wma->vdev_respq_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003654 req->vdev_id = vdev_id;
3655 req->msg_type = msg_type;
3656 req->type = type;
3657 req->user_data = params;
Anurag Chouhanffb21542016-02-17 14:33:03 +05303658 status = qdf_list_insert_back(&wma->vdev_resp_queue, &req->node);
3659 if (QDF_STATUS_SUCCESS != status) {
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303660 qdf_spin_unlock_bh(&wma->vdev_respq_lock);
Krishna Kumaar Natarajana5c53bd2015-10-27 11:48:27 -07003661 WMA_LOGE(FL("Failed add request in queue for vdev_id %d type %d"),
3662 vdev_id, type);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303663 qdf_mem_free(req);
Krishna Kumaar Natarajana5c53bd2015-10-27 11:48:27 -07003664 return NULL;
3665 }
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303666 qdf_spin_unlock_bh(&wma->vdev_respq_lock);
Abhishek Singhc614ec42017-04-25 16:17:34 +05303667 qdf_mc_timer_init(&req->event_timeout, QDF_TIMER_TYPE_SW,
3668 wma_vdev_resp_timer, req);
3669 qdf_mc_timer_start(&req->event_timeout, timeout);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003670 return req;
3671}
3672
3673/**
3674 * wma_remove_vdev_req() - remove vdev request
3675 * @wma: wma handle
3676 * @vdev_id: vdev id
3677 * @type: type
3678 *
3679 * Return: none
3680 */
3681void wma_remove_vdev_req(tp_wma_handle wma, uint8_t vdev_id,
3682 uint8_t type)
3683{
3684 struct wma_target_req *req_msg;
3685
Kiran Kumar Lokere20804162017-07-17 16:09:04 -07003686 req_msg = wma_find_vdev_req(wma, vdev_id, type, true);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003687 if (!req_msg)
3688 return;
3689
Anurag Chouhan210db072016-02-22 18:42:15 +05303690 qdf_mc_timer_stop(&req_msg->event_timeout);
3691 qdf_mc_timer_destroy(&req_msg->event_timeout);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303692 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003693}
3694
3695/**
3696 * wma_vdev_set_bss_params() - BSS set params functions
3697 * @wma: wma handle
3698 * @vdev_id: vdev id
3699 * @beaconInterval: beacon interval
3700 * @dtimPeriod: DTIM period
3701 * @shortSlotTimeSupported: short slot time
3702 * @llbCoexist: llbCoexist
3703 * @maxTxPower: max tx power
3704 *
3705 * Return: none
3706 */
3707static void
3708wma_vdev_set_bss_params(tp_wma_handle wma, int vdev_id,
3709 tSirMacBeaconInterval beaconInterval,
3710 uint8_t dtimPeriod, uint8_t shortSlotTimeSupported,
Amar Singhala297bfa2015-10-15 15:07:29 -07003711 uint8_t llbCoexist, int8_t maxTxPower)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003712{
Govind Singhd76a5b02016-03-08 15:12:14 +05303713 QDF_STATUS ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003714 uint32_t slot_time;
3715 struct wma_txrx_node *intr = wma->interfaces;
3716
3717 /* Beacon Interval setting */
Govind Singhd76a5b02016-03-08 15:12:14 +05303718 ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003719 WMI_VDEV_PARAM_BEACON_INTERVAL,
3720 beaconInterval);
3721
Govind Singhd76a5b02016-03-08 15:12:14 +05303722 if (QDF_IS_STATUS_ERROR(ret))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003723 WMA_LOGE("failed to set WMI_VDEV_PARAM_BEACON_INTERVAL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003724 ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle, vdev_id,
3725 &intr[vdev_id].config.gtx_info);
Govind Singhd76a5b02016-03-08 15:12:14 +05303726 if (QDF_IS_STATUS_ERROR(ret))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003727 WMA_LOGE("failed to set WMI_VDEV_PARAM_DTIM_PERIOD");
Govind Singhd76a5b02016-03-08 15:12:14 +05303728 ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003729 WMI_VDEV_PARAM_DTIM_PERIOD,
3730 dtimPeriod);
Kiran Kumar Lokere6d3a30d2018-01-15 18:18:29 -08003731 intr[vdev_id].dtimPeriod = dtimPeriod;
Govind Singhd76a5b02016-03-08 15:12:14 +05303732 if (QDF_IS_STATUS_ERROR(ret))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003733 WMA_LOGE("failed to set WMI_VDEV_PARAM_DTIM_PERIOD");
3734
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003735 if (!maxTxPower)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003736 WMA_LOGW("Setting Tx power limit to 0");
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07003737 WMA_LOGD("Set maxTx pwr [WMI_VDEV_PARAM_TX_PWRLIMIT] to %d",
Padma, Santhosh Kumar29df3622016-08-16 19:15:16 +05303738 maxTxPower);
Govind Singhd76a5b02016-03-08 15:12:14 +05303739 ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003740 WMI_VDEV_PARAM_TX_PWRLIMIT,
3741 maxTxPower);
Govind Singhd76a5b02016-03-08 15:12:14 +05303742 if (QDF_IS_STATUS_ERROR(ret))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003743 WMA_LOGE("failed to set WMI_VDEV_PARAM_TX_PWRLIMIT");
3744 else
3745 intr[vdev_id].max_tx_power = maxTxPower;
3746
3747 /* Slot time */
3748 if (shortSlotTimeSupported)
3749 slot_time = WMI_VDEV_SLOT_TIME_SHORT;
3750 else
3751 slot_time = WMI_VDEV_SLOT_TIME_LONG;
3752
Govind Singhd76a5b02016-03-08 15:12:14 +05303753 ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003754 WMI_VDEV_PARAM_SLOT_TIME,
3755 slot_time);
Govind Singhd76a5b02016-03-08 15:12:14 +05303756 if (QDF_IS_STATUS_ERROR(ret))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003757 WMA_LOGE("failed to set WMI_VDEV_PARAM_SLOT_TIME");
3758
3759 /* Initialize protection mode in case of coexistence */
3760 wma_update_protection_mode(wma, vdev_id, llbCoexist);
Krishna Kumaar Natarajan0103ef82017-02-17 18:15:56 -08003761
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003762}
3763
Abhishek Singhcfb44482017-03-10 12:42:37 +05303764#ifdef WLAN_FEATURE_11W
3765static void wma_set_mgmt_frame_protection(tp_wma_handle wma)
3766{
3767 struct pdev_params param = {0};
3768 QDF_STATUS ret;
3769
3770 /*
3771 * when 802.11w PMF is enabled for hw encr/decr
3772 * use hw MFP Qos bits 0x10
3773 */
3774 param.param_id = WMI_PDEV_PARAM_PMF_QOS;
3775 param.param_value = true;
3776 ret = wmi_unified_pdev_param_send(wma->wmi_handle,
3777 &param, WMA_WILDCARD_PDEV_ID);
3778 if (QDF_IS_STATUS_ERROR(ret)) {
3779 WMA_LOGE("%s: Failed to set QOS MFP/PMF (%d)",
3780 __func__, ret);
3781 } else {
3782 WMA_LOGD("%s: QOS MFP/PMF set", __func__);
3783 }
3784}
3785#else
3786static inline void wma_set_mgmt_frame_protection(tp_wma_handle wma)
3787{
3788}
3789#endif /* WLAN_FEATURE_11W */
3790
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003791/**
3792 * wma_add_bss_ap_mode() - process add bss request in ap mode
3793 * @wma: wma handle
3794 * @add_bss: add bss parameters
3795 *
3796 * Return: none
3797 */
3798static void wma_add_bss_ap_mode(tp_wma_handle wma, tpAddBssParams add_bss)
3799{
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003800 struct cdp_pdev *pdev;
3801 struct cdp_vdev *vdev;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003802 struct wma_vdev_start_req req;
Leo Chang96464902016-10-28 11:10:54 -07003803 void *peer;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003804 struct wma_target_req *msg;
3805 uint8_t vdev_id, peer_id;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303806 QDF_STATUS status;
Amar Singhala297bfa2015-10-15 15:07:29 -07003807 int8_t maxTxPower;
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07003808 struct policy_mgr_hw_mode_params hw_mode = {0};
Leo Chang96464902016-10-28 11:10:54 -07003809 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003810
Anurag Chouhan6d760662016-02-20 16:05:43 +05303811 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003812
3813 if (NULL == pdev) {
3814 WMA_LOGE("%s: Failed to get pdev", __func__);
3815 goto send_fail_resp;
3816 }
3817
3818 vdev = wma_find_vdev_by_addr(wma, add_bss->bssId, &vdev_id);
3819 if (!vdev) {
Peng Xu66162de2016-02-11 17:01:20 -08003820 WMA_LOGE("%s: Failed to get vdev handle:"MAC_ADDRESS_STR,
3821 __func__, MAC_ADDR_ARRAY(add_bss->bssId));
3822
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003823 goto send_fail_resp;
3824 }
3825 if (SAP_WPS_DISABLED == add_bss->wps_state)
Mukul Sharma00058692017-01-28 19:04:32 +05303826 pmo_ucfg_disable_wakeup_event(wma->psoc, vdev_id,
Nachiket Kukade107f6392018-05-25 19:15:16 +05303827 WOW_PROBE_REQ_WPS_IE_EVENT);
Naveen Rawatfa2a1002018-05-17 16:06:37 -07003828 wma_set_bss_rate_flags(wma, vdev_id, add_bss);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003829 status = wma_create_peer(wma, pdev, vdev, add_bss->bssId,
3830 WMI_PEER_TYPE_DEFAULT, vdev_id, false);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303831 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003832 WMA_LOGE("%s: Failed to create peer", __func__);
3833 goto send_fail_resp;
3834 }
3835
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003836 peer = cdp_peer_find_by_addr(soc, pdev,
3837 add_bss->bssId, &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003838 if (!peer) {
3839 WMA_LOGE("%s Failed to find peer %pM", __func__,
3840 add_bss->bssId);
3841 goto send_fail_resp;
3842 }
3843 msg = wma_fill_vdev_req(wma, vdev_id, WMA_ADD_BSS_REQ,
3844 WMA_TARGET_REQ_TYPE_VDEV_START, add_bss,
3845 WMA_VDEV_START_REQUEST_TIMEOUT);
3846 if (!msg) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07003847 WMA_LOGE("%s Failed to allocate vdev request vdev_id %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003848 __func__, vdev_id);
3849 goto peer_cleanup;
3850 }
3851
Leo Chang96464902016-10-28 11:10:54 -07003852 add_bss->staContext.staIdx = cdp_peer_get_local_peer_id(soc, peer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003853
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303854 qdf_mem_zero(&req, sizeof(req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003855 req.vdev_id = vdev_id;
3856 req.chan = add_bss->currentOperChannel;
3857 req.chan_width = add_bss->ch_width;
Himanshu Agarwalf5c5b102018-05-22 20:13:57 +05303858 req.dot11_mode = add_bss->dot11_mode;
Naveen Rawat64e477e2016-05-20 10:34:56 -07003859
3860 if (add_bss->ch_width == CH_WIDTH_10MHZ)
3861 req.is_half_rate = 1;
3862 else if (add_bss->ch_width == CH_WIDTH_5MHZ)
3863 req.is_quarter_rate = 1;
3864
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003865 req.ch_center_freq_seg0 = add_bss->ch_center_freq_seg0;
3866 req.ch_center_freq_seg1 = add_bss->ch_center_freq_seg1;
3867 req.vht_capable = add_bss->vhtCapable;
Krishna Kumaar Natarajan0103ef82017-02-17 18:15:56 -08003868 wma_update_vdev_he_ops(&req, add_bss);
3869
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003870 req.max_txpow = add_bss->maxTxPower;
3871 maxTxPower = add_bss->maxTxPower;
Abhishek Singhcfb44482017-03-10 12:42:37 +05303872
3873 if (add_bss->rmfEnabled)
3874 wma_set_mgmt_frame_protection(wma);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003875
Krishna Kumaar Natarajanc1ebd992016-11-29 16:20:32 -08003876 req.dot11_mode = add_bss->dot11_mode;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003877 req.beacon_intval = add_bss->beaconInterval;
3878 req.dtim_period = add_bss->dtimPeriod;
Jiachao Wu712d4fd2017-08-23 16:52:34 +08003879 req.beacon_tx_rate = add_bss->beacon_tx_rate;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003880 req.hidden_ssid = add_bss->bHiddenSSIDEn;
3881 req.is_dfs = add_bss->bSpectrumMgtEnabled;
3882 req.oper_mode = BSS_OPERATIONAL_MODE_AP;
3883 req.ssid.length = add_bss->ssId.length;
Arif Hussain671a1902017-03-17 09:08:32 -07003884 req.cac_duration_ms = add_bss->cac_duration_ms;
3885 req.dfs_regdomain = add_bss->dfs_regdomain;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003886 if (req.ssid.length > 0)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303887 qdf_mem_copy(req.ssid.ssId, add_bss->ssId.ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003888 add_bss->ssId.length);
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07003889 status = policy_mgr_get_current_hw_mode(wma->psoc, &hw_mode);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303890 if (!QDF_IS_STATUS_SUCCESS(status))
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07003891 WMA_LOGE("policy_mgr_get_current_hw_mode failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003892
Paul Zhang42dade02017-05-12 19:20:37 +08003893 if (add_bss->nss == 2) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003894 req.preferred_rx_streams = 2;
3895 req.preferred_tx_streams = 2;
3896 } else {
3897 req.preferred_rx_streams = 1;
3898 req.preferred_tx_streams = 1;
3899 }
3900
3901 status = wma_vdev_start(wma, &req, false);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303902 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003903 wma_remove_vdev_req(wma, vdev_id,
3904 WMA_TARGET_REQ_TYPE_VDEV_START);
3905 goto peer_cleanup;
3906 }
3907
3908 wma_vdev_set_bss_params(wma, vdev_id,
3909 add_bss->beaconInterval, add_bss->dtimPeriod,
3910 add_bss->shortSlotTimeSupported,
3911 add_bss->llbCoexist, maxTxPower);
3912
Krishna Kumaar Natarajan0103ef82017-02-17 18:15:56 -08003913 wma_vdev_set_he_bss_params(wma, vdev_id, &req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003914 return;
3915
3916peer_cleanup:
3917 wma_remove_peer(wma, add_bss->bssId, vdev_id, peer, false);
3918send_fail_resp:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303919 add_bss->status = QDF_STATUS_E_FAILURE;
Abhishek Singh2d775fd2017-08-18 10:51:33 +05303920 wma_send_msg_high_priority(wma, WMA_ADD_BSS_RSP, (void *)add_bss, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003921}
3922
3923#ifdef QCA_IBSS_SUPPORT
3924/**
3925 * wma_add_bss_ibss_mode() - process add bss request in IBSS mode
3926 * @wma: wma handle
3927 * @add_bss: add bss parameters
3928 *
3929 * Return: none
3930 */
3931static void wma_add_bss_ibss_mode(tp_wma_handle wma, tpAddBssParams add_bss)
3932{
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003933 struct cdp_pdev *pdev;
3934 struct cdp_vdev *vdev;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003935 struct wma_vdev_start_req req;
Leo Chang96464902016-10-28 11:10:54 -07003936 void *peer = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003937 struct wma_target_req *msg;
3938 uint8_t vdev_id, peer_id;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303939 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003940 tSetBssKeyParams key_info;
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07003941 struct policy_mgr_hw_mode_params hw_mode = {0};
Leo Chang96464902016-10-28 11:10:54 -07003942 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003943
Krunal Soni2c68f232015-10-26 20:52:51 -07003944 vdev = wma_find_vdev_by_addr(wma, add_bss->selfMacAddr, &vdev_id);
3945 if (!vdev) {
3946 WMA_LOGE("%s: vdev not found for vdev id %d.",
3947 __func__, vdev_id);
3948 goto send_fail_resp;
3949 }
3950 WMA_LOGD("%s: add_bss->sessionId = %d", __func__, vdev_id);
Anurag Chouhan6d760662016-02-20 16:05:43 +05303951 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003952
3953 if (NULL == pdev) {
3954 WMA_LOGE("%s: Failed to get pdev", __func__);
3955 goto send_fail_resp;
3956 }
Naveen Rawatfa2a1002018-05-17 16:06:37 -07003957 wma_set_bss_rate_flags(wma, vdev_id, add_bss);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003958
Krunal Soni8c37e322016-02-03 16:08:37 -08003959 /* create ibss bss peer */
3960 status = wma_create_peer(wma, pdev, vdev, add_bss->selfMacAddr,
3961 WMI_PEER_TYPE_DEFAULT, vdev_id,
3962 false);
3963 if (status != QDF_STATUS_SUCCESS) {
3964 WMA_LOGE("%s: Failed to create peer", __func__);
3965 goto send_fail_resp;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003966 }
Krunal Soni8c37e322016-02-03 16:08:37 -08003967 WMA_LOGA("IBSS BSS peer created with mac %pM",
3968 add_bss->selfMacAddr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003969
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003970 peer = cdp_peer_find_by_addr(soc, pdev,
3971 add_bss->selfMacAddr, &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003972 if (!peer) {
3973 WMA_LOGE("%s Failed to find peer %pM", __func__,
3974 add_bss->selfMacAddr);
3975 goto send_fail_resp;
3976 }
3977
3978 /* clear leftover ibss keys on bss peer */
3979
3980 WMA_LOGD("%s: ibss bss key clearing", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303981 qdf_mem_set(&key_info, sizeof(key_info), 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003982 key_info.smesessionId = vdev_id;
3983 key_info.numKeys = SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303984 qdf_mem_copy(&wma->ibsskey_info, &key_info, sizeof(tSetBssKeyParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003985
3986 /* start ibss vdev */
3987
3988 add_bss->operMode = BSS_OPERATIONAL_MODE_IBSS;
3989
3990 msg = wma_fill_vdev_req(wma, vdev_id, WMA_ADD_BSS_REQ,
3991 WMA_TARGET_REQ_TYPE_VDEV_START, add_bss,
3992 WMA_VDEV_START_REQUEST_TIMEOUT);
3993 if (!msg) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07003994 WMA_LOGE("%s Failed to allocate vdev request vdev_id %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003995 __func__, vdev_id);
3996 goto peer_cleanup;
3997 }
3998 WMA_LOGD("%s: vdev start request for IBSS enqueued", __func__);
3999
Leo Chang96464902016-10-28 11:10:54 -07004000 add_bss->staContext.staIdx = cdp_peer_get_local_peer_id(soc, peer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004001
4002 /*
4003 * If IBSS Power Save is supported by firmware
4004 * set the IBSS power save params to firmware.
4005 */
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304006 if (wmi_service_enabled(wma->wmi_handle,
4007 wmi_service_ibss_pwrsave)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004008 status = wma_set_ibss_pwrsave_params(wma, vdev_id);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304009 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004010 WMA_LOGE("%s: Failed to Set IBSS Power Save Params to firmware",
4011 __func__);
4012 goto peer_cleanup;
4013 }
4014 }
4015
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304016 qdf_mem_zero(&req, sizeof(req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004017 req.vdev_id = vdev_id;
4018 req.chan = add_bss->currentOperChannel;
4019 req.chan_width = add_bss->ch_width;
4020 req.ch_center_freq_seg0 = add_bss->ch_center_freq_seg0;
4021 req.ch_center_freq_seg1 = add_bss->ch_center_freq_seg1;
4022 req.vht_capable = add_bss->vhtCapable;
4023#if defined WLAN_FEATURE_VOWIF
4024 req.max_txpow = add_bss->maxTxPower;
4025#else
4026 req.max_txpow = 0;
4027#endif /* WLAN_FEATURE_VOWIF */
4028 req.beacon_intval = add_bss->beaconInterval;
4029 req.dtim_period = add_bss->dtimPeriod;
4030 req.hidden_ssid = add_bss->bHiddenSSIDEn;
4031 req.is_dfs = add_bss->bSpectrumMgtEnabled;
4032 req.oper_mode = BSS_OPERATIONAL_MODE_IBSS;
4033 req.ssid.length = add_bss->ssId.length;
4034 if (req.ssid.length > 0)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304035 qdf_mem_copy(req.ssid.ssId, add_bss->ssId.ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004036 add_bss->ssId.length);
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07004037 status = policy_mgr_get_current_hw_mode(wma->psoc, &hw_mode);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304038 if (!QDF_IS_STATUS_SUCCESS(status))
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07004039 WMA_LOGE("policy_mgr_get_current_hw_mode failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004040
Paul Zhang42dade02017-05-12 19:20:37 +08004041 if (add_bss->nss == 2) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004042 req.preferred_rx_streams = 2;
4043 req.preferred_tx_streams = 2;
4044 } else {
4045 req.preferred_rx_streams = 1;
4046 req.preferred_tx_streams = 1;
4047 }
4048
4049 WMA_LOGD("%s: chan %d chan_width %d", __func__, req.chan,
4050 req.chan_width);
4051 WMA_LOGD("%s: ssid = %s", __func__, req.ssid.ssId);
4052
4053 status = wma_vdev_start(wma, &req, false);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304054 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004055 wma_remove_vdev_req(wma, vdev_id,
4056 WMA_TARGET_REQ_TYPE_VDEV_START);
4057 goto peer_cleanup;
4058 }
4059 WMA_LOGD("%s: vdev start request for IBSS sent to target", __func__);
4060
4061 /* Initialize protection mode to no protection */
Govind Singhd76a5b02016-03-08 15:12:14 +05304062 status = wma_vdev_set_param(wma->wmi_handle, vdev_id,
4063 WMI_VDEV_PARAM_PROTECTION_MODE,
4064 IEEE80211_PROT_NONE);
4065 if (QDF_IS_STATUS_ERROR(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004066 WMA_LOGE("Failed to initialize protection mode");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004067
4068 return;
4069
4070peer_cleanup:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004071 if (peer)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004072 wma_remove_peer(wma, add_bss->bssId, vdev_id, peer, false);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004073send_fail_resp:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304074 add_bss->status = QDF_STATUS_E_FAILURE;
Abhishek Singh2d775fd2017-08-18 10:51:33 +05304075 wma_send_msg_high_priority(wma, WMA_ADD_BSS_RSP, (void *)add_bss, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004076}
4077#endif /* QCA_IBSS_SUPPORT */
4078
4079/**
4080 * wma_add_bss_sta_mode() - process add bss request in sta mode
4081 * @wma: wma handle
4082 * @add_bss: add bss parameters
4083 *
4084 * Return: none
4085 */
4086static void wma_add_bss_sta_mode(tp_wma_handle wma, tpAddBssParams add_bss)
4087{
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004088 struct cdp_pdev *pdev;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004089 struct wma_vdev_start_req req;
4090 struct wma_target_req *msg;
Leo Chang96464902016-10-28 11:10:54 -07004091 uint8_t vdev_id = 0, peer_id;
Amar Singhal4c3fbb42018-01-02 13:20:28 -08004092 void *peer = NULL;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304093 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004094 struct wma_txrx_node *iface;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004095 int pps_val = 0;
4096 bool roam_synch_in_progress = false;
Anurag Chouhan6d760662016-02-20 16:05:43 +05304097 tpAniSirGlobal pMac = cds_get_context(QDF_MODULE_ID_PE);
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07004098 struct policy_mgr_hw_mode_params hw_mode = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004099 bool peer_assoc_sent = false;
Leo Chang96464902016-10-28 11:10:54 -07004100 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004101
4102 if (NULL == pMac) {
4103 WMA_LOGE("%s: Unable to get PE context", __func__);
4104 goto send_fail_resp;
4105 }
4106
Anurag Chouhan6d760662016-02-20 16:05:43 +05304107 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004108
4109 if (NULL == pdev) {
4110 WMA_LOGE("%s Failed to get pdev", __func__);
4111 goto send_fail_resp;
4112 }
4113
Leo Chang96464902016-10-28 11:10:54 -07004114 vdev_id = add_bss->staContext.smesessionId;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004115 iface = &wma->interfaces[vdev_id];
4116
Naveen Rawatfa2a1002018-05-17 16:06:37 -07004117 wma_set_bss_rate_flags(wma, vdev_id, add_bss);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004118 if (add_bss->operMode) {
4119 /* Save parameters later needed by WMA_ADD_STA_REQ */
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004120 if (iface->addBssStaContext)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304121 qdf_mem_free(iface->addBssStaContext);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304122 iface->addBssStaContext = qdf_mem_malloc(sizeof(tAddStaParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004123 if (!iface->addBssStaContext) {
4124 WMA_LOGE("%s Failed to allocat memory", __func__);
4125 goto send_fail_resp;
4126 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304127 qdf_mem_copy(iface->addBssStaContext, &add_bss->staContext,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004128 sizeof(tAddStaParams));
4129
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004130 if (iface->staKeyParams) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304131 qdf_mem_free(iface->staKeyParams);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004132 iface->staKeyParams = NULL;
4133 }
4134 if (add_bss->extSetStaKeyParamValid) {
4135 iface->staKeyParams =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304136 qdf_mem_malloc(sizeof(tSetStaKeyParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004137 if (!iface->staKeyParams) {
4138 WMA_LOGE("%s Failed to allocat memory",
4139 __func__);
4140 goto send_fail_resp;
4141 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304142 qdf_mem_copy(iface->staKeyParams,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004143 &add_bss->extSetStaKeyParam,
4144 sizeof(tSetStaKeyParams));
4145 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004146 /* Save parameters later needed by WMA_ADD_STA_REQ */
4147 iface->rmfEnabled = add_bss->rmfEnabled;
4148 iface->beaconInterval = add_bss->beaconInterval;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004149 iface->llbCoexist = add_bss->llbCoexist;
4150 iface->shortSlotTimeSupported = add_bss->shortSlotTimeSupported;
4151 iface->nwType = add_bss->nwType;
4152 if (add_bss->nonRoamReassoc) {
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004153 peer = cdp_peer_find_by_addr(soc,
4154 pdev, add_bss->bssId,
4155 &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004156 if (peer) {
4157 add_bss->staContext.staIdx =
Leo Chang96464902016-10-28 11:10:54 -07004158 cdp_peer_get_local_peer_id(soc, peer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004159 goto send_bss_resp;
4160 }
4161 }
4162 if (add_bss->reassocReq) {
4163#if defined(QCA_LL_LEGACY_TX_FLOW_CONTROL) || defined(QCA_LL_TX_FLOW_CONTROL_V2)
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004164 struct cdp_vdev *vdev;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004165#endif
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004166 /* Called in preassoc state. BSSID peer is already
4167 * added by set_linkstate
4168 */
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004169 peer = cdp_peer_find_by_addr(soc,
4170 pdev,
4171 add_bss->bssId,
4172 &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004173 if (!peer) {
4174 WMA_LOGE("%s Failed to find peer %pM", __func__,
4175 add_bss->bssId);
4176 goto send_fail_resp;
4177 }
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08004178 if (wma_is_roam_synch_in_progress(wma, vdev_id)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004179 add_bss->staContext.staIdx =
Leo Chang96464902016-10-28 11:10:54 -07004180 cdp_peer_get_local_peer_id(soc, peer);
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08004181 WMA_LOGD("LFR3:%s: bssid %pM staIdx %d",
4182 __func__, add_bss->bssId,
4183 add_bss->staContext.staIdx);
4184 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004185 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004186 msg = wma_fill_vdev_req(wma, vdev_id, WMA_ADD_BSS_REQ,
4187 WMA_TARGET_REQ_TYPE_VDEV_START,
4188 add_bss,
4189 WMA_VDEV_START_REQUEST_TIMEOUT);
4190 if (!msg) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004191 WMA_LOGE("%s Failed to allocate vdev request vdev_id %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004192 __func__, vdev_id);
4193 goto peer_cleanup;
4194 }
4195
4196 add_bss->staContext.staIdx =
Leo Chang96464902016-10-28 11:10:54 -07004197 cdp_peer_get_local_peer_id(soc, peer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004198
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304199 qdf_mem_zero(&req, sizeof(req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004200 req.vdev_id = vdev_id;
4201 req.chan = add_bss->currentOperChannel;
4202 req.chan_width = add_bss->ch_width;
Naveen Rawat64e477e2016-05-20 10:34:56 -07004203
4204 if (add_bss->ch_width == CH_WIDTH_10MHZ)
4205 req.is_half_rate = 1;
4206 else if (add_bss->ch_width == CH_WIDTH_5MHZ)
4207 req.is_quarter_rate = 1;
4208
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004209 req.ch_center_freq_seg0 = add_bss->ch_center_freq_seg0;
4210 req.ch_center_freq_seg1 = add_bss->ch_center_freq_seg1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004211 req.max_txpow = add_bss->maxTxPower;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004212 req.beacon_intval = add_bss->beaconInterval;
4213 req.dtim_period = add_bss->dtimPeriod;
4214 req.hidden_ssid = add_bss->bHiddenSSIDEn;
4215 req.is_dfs = add_bss->bSpectrumMgtEnabled;
4216 req.ssid.length = add_bss->ssId.length;
4217 req.oper_mode = BSS_OPERATIONAL_MODE_STA;
4218 if (req.ssid.length > 0)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304219 qdf_mem_copy(req.ssid.ssId, add_bss->ssId.ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004220 add_bss->ssId.length);
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07004221 status = policy_mgr_get_current_hw_mode(wma->psoc,
4222 &hw_mode);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304223 if (!QDF_IS_STATUS_SUCCESS(status))
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07004224 WMA_LOGE("policy_mgr_get_current_hw_mode failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004225
Paul Zhang42dade02017-05-12 19:20:37 +08004226 if (add_bss->nss == 2) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004227 req.preferred_rx_streams = 2;
4228 req.preferred_tx_streams = 2;
4229 } else {
4230 req.preferred_rx_streams = 1;
4231 req.preferred_tx_streams = 1;
4232 }
4233
4234 status = wma_vdev_start(wma, &req, false);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304235 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004236 wma_remove_vdev_req(wma, vdev_id,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004237 WMA_TARGET_REQ_TYPE_VDEV_START);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004238 goto peer_cleanup;
4239 }
4240#if defined(QCA_LL_LEGACY_TX_FLOW_CONTROL) || defined(QCA_LL_TX_FLOW_CONTROL_V2)
4241 vdev = wma_find_vdev_by_id(wma, vdev_id);
4242 if (!vdev) {
4243 WMA_LOGE("%s Invalid txrx vdev", __func__);
4244 goto peer_cleanup;
4245 }
Leo Chang96464902016-10-28 11:10:54 -07004246 cdp_fc_vdev_pause(soc, vdev,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004247 OL_TXQ_PAUSE_REASON_PEER_UNAUTHORIZED);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004248#endif
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004249 /* ADD_BSS_RESP will be deferred to completion of
4250 * VDEV_START
4251 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004252 return;
4253 }
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004254 if (!add_bss->updateBss)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004255 goto send_bss_resp;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004256 /* Update peer state */
4257 if (add_bss->staContext.encryptType == eSIR_ED_NONE) {
4258 WMA_LOGD("%s: Update peer(%pM) state into auth",
4259 __func__, add_bss->bssId);
Leo Chang96464902016-10-28 11:10:54 -07004260 cdp_peer_state_update(soc, pdev, add_bss->bssId,
Dhanashri Atreb08959a2016-03-01 17:28:03 -08004261 OL_TXRX_PEER_STATE_AUTH);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004262 } else {
4263#if defined(QCA_LL_LEGACY_TX_FLOW_CONTROL) || defined(QCA_LL_TX_FLOW_CONTROL_V2)
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004264 struct cdp_vdev *vdev;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004265#endif
4266 WMA_LOGD("%s: Update peer(%pM) state into conn",
4267 __func__, add_bss->bssId);
Leo Chang96464902016-10-28 11:10:54 -07004268 cdp_peer_state_update(soc, pdev, add_bss->bssId,
Dhanashri Atreb08959a2016-03-01 17:28:03 -08004269 OL_TXRX_PEER_STATE_CONN);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004270#if defined(QCA_LL_LEGACY_TX_FLOW_CONTROL) || defined(QCA_LL_TX_FLOW_CONTROL_V2)
Leo Chang96464902016-10-28 11:10:54 -07004271 peer = cdp_peer_find_by_addr(soc, pdev, add_bss->bssId,
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004272 &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004273 if (!peer) {
4274 WMA_LOGE("%s:%d Failed to find peer %pM",
4275 __func__, __LINE__, add_bss->bssId);
4276 goto send_fail_resp;
4277 }
4278
4279 vdev = wma_find_vdev_by_id(wma, vdev_id);
4280 if (!vdev) {
4281 WMA_LOGE("%s Invalid txrx vdev", __func__);
4282 goto peer_cleanup;
4283 }
Leo Chang96464902016-10-28 11:10:54 -07004284 cdp_fc_vdev_pause(soc, vdev,
4285 OL_TXQ_PAUSE_REASON_PEER_UNAUTHORIZED);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004286#endif
4287 }
4288
4289 wmi_unified_send_txbf(wma, &add_bss->staContext);
4290
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004291 pps_val = ((pMac->enable5gEBT << 31) & 0xffff0000) |
4292 (PKT_PWR_SAVE_5G_EBT & 0xffff);
Govind Singhd76a5b02016-03-08 15:12:14 +05304293 status = wma_vdev_set_param(wma->wmi_handle, vdev_id,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004294 WMI_VDEV_PARAM_PACKET_POWERSAVE,
4295 pps_val);
Govind Singhd76a5b02016-03-08 15:12:14 +05304296 if (QDF_IS_STATUS_ERROR(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004297 WMA_LOGE("Failed to send wmi packet power save cmd");
4298 else
Govind Singhd76a5b02016-03-08 15:12:14 +05304299 WMA_LOGD("Sent PKT_PWR_SAVE_5G_EBT cmd to target, val = %x, status = %d",
4300 pps_val, status);
Sandeep Puligillac3588e52018-08-07 16:00:41 -07004301 status = wma_send_peer_assoc(wma, add_bss->nwType,
4302 &add_bss->staContext);
4303 if (QDF_IS_STATUS_ERROR(status)) {
4304 WMA_LOGE("Failed to send peer assoc status:%d", status);
4305 goto peer_cleanup;
4306 }
4307 peer_assoc_sent = true;
Naveen Rawata600b2e2018-03-29 13:41:18 -07004308
Sandeep Puligillac3588e52018-08-07 16:00:41 -07004309 /* we just had peer assoc, so install key will be done later */
Naveen Rawata600b2e2018-03-29 13:41:18 -07004310 if (add_bss->staContext.encryptType != eSIR_ED_NONE)
4311 iface->is_waiting_for_key = true;
4312
Abhishek Singhcfb44482017-03-10 12:42:37 +05304313 if (add_bss->rmfEnabled)
4314 wma_set_mgmt_frame_protection(wma);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004315
4316 wma_vdev_set_bss_params(wma, add_bss->staContext.smesessionId,
4317 add_bss->beaconInterval,
4318 add_bss->dtimPeriod,
4319 add_bss->shortSlotTimeSupported,
4320 add_bss->llbCoexist,
4321 add_bss->maxTxPower);
4322
4323 /*
4324 * Store the bssid in interface table, bssid will
4325 * be used during group key setting sta mode.
4326 */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304327 qdf_mem_copy(iface->bssid, add_bss->bssId, IEEE80211_ADDR_LEN);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004328
4329 }
4330send_bss_resp:
Manikandan Mohan39accff2017-05-02 16:09:00 -07004331
4332 wma_vdev_set_he_config(wma, vdev_id, add_bss);
Sreelakshmi Konamki0d17c6a2017-06-08 12:58:54 +05304333 if (NULL == cdp_peer_find_by_addr(soc, pdev, add_bss->bssId,
4334 &add_bss->staContext.staIdx))
4335 add_bss->status = QDF_STATUS_E_FAILURE;
4336 else
4337 add_bss->status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004338 add_bss->bssIdx = add_bss->staContext.smesessionId;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304339 qdf_mem_copy(add_bss->staContext.staMac, add_bss->bssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004340 sizeof(add_bss->staContext.staMac));
4341
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304342 if (!wmi_service_enabled(wma->wmi_handle,
4343 wmi_service_peer_assoc_conf)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004344 WMA_LOGE(FL("WMI_SERVICE_PEER_ASSOC_CONF not enabled"));
4345 goto send_final_rsp;
4346 }
4347
4348 /* In case of reassoc, peer assoc cmd will not be sent */
4349 if (!peer_assoc_sent)
4350 goto send_final_rsp;
4351
4352 msg = wma_fill_hold_req(wma, vdev_id, WMA_ADD_BSS_REQ,
4353 WMA_PEER_ASSOC_CNF_START, add_bss,
4354 WMA_PEER_ASSOC_TIMEOUT);
4355 if (!msg) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004356 WMA_LOGE(FL("Failed to allocate request for vdev_id %d"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004357 vdev_id);
4358 wma_remove_req(wma, vdev_id, WMA_PEER_ASSOC_CNF_START);
4359 goto peer_cleanup;
4360 }
4361 return;
4362
4363send_final_rsp:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004364 WMA_LOGD("%s: opermode %d update_bss %d nw_type %d bssid %pM staIdx %d status %d",
4365 __func__, add_bss->operMode,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004366 add_bss->updateBss, add_bss->nwType, add_bss->bssId,
4367 add_bss->staContext.staIdx, add_bss->status);
Abhishek Singh2d775fd2017-08-18 10:51:33 +05304368 wma_send_msg_high_priority(wma, WMA_ADD_BSS_RSP, (void *)add_bss, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004369 return;
4370
4371peer_cleanup:
Amar Singhal4c3fbb42018-01-02 13:20:28 -08004372 if (peer)
4373 wma_remove_peer(wma, add_bss->bssId, vdev_id, peer,
4374 roam_synch_in_progress);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004375send_fail_resp:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304376 add_bss->status = QDF_STATUS_E_FAILURE;
Sandeep Puligilla2ff3ebe2016-08-31 23:55:07 -07004377 if (!wma_is_roam_synch_in_progress(wma, vdev_id))
Abhishek Singh2d775fd2017-08-18 10:51:33 +05304378 wma_send_msg_high_priority(wma, WMA_ADD_BSS_RSP,
4379 (void *)add_bss, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004380}
4381
4382/**
4383 * wma_add_bss() - Add BSS request to fw as per opmode
4384 * @wma: wma handle
4385 * @params: add bss params
4386 *
4387 * Return: none
4388 */
4389void wma_add_bss(tp_wma_handle wma, tpAddBssParams params)
4390{
4391 WMA_LOGD("%s: add_bss_param.halPersona = %d",
4392 __func__, params->halPersona);
4393
4394 switch (params->halPersona) {
4395
Anurag Chouhan6d760662016-02-20 16:05:43 +05304396 case QDF_SAP_MODE:
4397 case QDF_P2P_GO_MODE:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004398 wma_add_bss_ap_mode(wma, params);
4399 break;
4400
4401#ifdef QCA_IBSS_SUPPORT
Anurag Chouhan6d760662016-02-20 16:05:43 +05304402 case QDF_IBSS_MODE:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004403 wma_add_bss_ibss_mode(wma, params);
4404 break;
4405#endif
4406
Deepak Dhamdheree2dd5442016-05-27 15:05:51 -07004407 case QDF_NDI_MODE:
4408 wma_add_bss_ndi_mode(wma, params);
4409 break;
4410
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004411 default:
4412 wma_add_bss_sta_mode(wma, params);
4413 break;
4414 }
4415}
4416
4417/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004418 * wma_add_sta_req_ap_mode() - process add sta request in ap mode
4419 * @wma: wma handle
4420 * @add_sta: add sta params
4421 *
4422 * Return: none
4423 */
4424static void wma_add_sta_req_ap_mode(tp_wma_handle wma, tpAddStaParams add_sta)
4425{
Dhanashri Atreb08959a2016-03-01 17:28:03 -08004426 enum ol_txrx_peer_state state = OL_TXRX_PEER_STATE_CONN;
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004427 struct cdp_pdev *pdev;
4428 struct cdp_vdev *vdev;
Leo Chang96464902016-10-28 11:10:54 -07004429 void *peer;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004430 uint8_t peer_id;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304431 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004432 int32_t ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004433 struct wma_txrx_node *iface = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004434 struct wma_target_req *msg;
4435 bool peer_assoc_cnf = false;
Leo Chang96464902016-10-28 11:10:54 -07004436 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Karthik Kantamneni22dd0f62018-08-07 14:53:50 +05304437 uint32_t i, j;
4438 uint16_t mcs_limit;
lifeng13a89d72017-05-10 14:49:29 +08004439 uint8_t *rate_pos;
Karthik Kantamneni22dd0f62018-08-07 14:53:50 +05304440 struct sAniSirGlobal *mac = (struct sAniSirGlobal *)wma->mac_context;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004441
Anurag Chouhan6d760662016-02-20 16:05:43 +05304442 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004443
4444 if (NULL == pdev) {
4445 WMA_LOGE("%s: Failed to find pdev", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304446 add_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004447 goto send_rsp;
4448 }
4449 /* UMAC sends WMA_ADD_STA_REQ msg twice to WMA when the station
4450 * associates. First WMA_ADD_STA_REQ will have staType as
4451 * STA_ENTRY_PEER and second posting will have STA_ENTRY_SELF.
4452 * Peer creation is done in first WMA_ADD_STA_REQ and second
4453 * WMA_ADD_STA_REQ which has STA_ENTRY_SELF is ignored and
4454 * send fake response with success to UMAC. Otherwise UMAC
4455 * will get blocked.
4456 */
4457 if (add_sta->staType != STA_ENTRY_PEER) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304458 add_sta->status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004459 goto send_rsp;
4460 }
4461
4462 vdev = wma_find_vdev_by_id(wma, add_sta->smesessionId);
4463 if (!vdev) {
4464 WMA_LOGE("%s: Failed to find vdev", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304465 add_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004466 goto send_rsp;
4467 }
4468
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07004469 iface = &wma->interfaces[add_sta->smesessionId];
Leo Chang96464902016-10-28 11:10:54 -07004470 peer = cdp_peer_find_by_addr_and_vdev(soc, pdev, vdev,
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004471 add_sta->staMac, &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004472 if (peer) {
4473 wma_remove_peer(wma, add_sta->staMac, add_sta->smesessionId,
4474 peer, false);
4475 WMA_LOGE("%s: Peer already exists, Deleted peer with peer_addr %pM",
4476 __func__, add_sta->staMac);
4477 }
Liangwei Dong7d845112016-09-27 22:24:21 -04004478 /* The code above only checks the peer existence on its own vdev.
4479 * Need to check whether the peer exists on other vDevs because firmware
4480 * can't create the peer if the peer with same MAC address already
4481 * exists on the pDev. As this peer belongs to other vDevs, just return
4482 * here.
4483 */
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004484 peer = cdp_peer_find_by_addr(soc, pdev,
4485 add_sta->staMac, &peer_id);
Liangwei Dong7d845112016-09-27 22:24:21 -04004486 if (peer) {
Jeff Johnsonadba3962017-09-18 08:12:35 -07004487 WMA_LOGE("%s: My vdev:%pK, but Peer exists on other vdev with peer_addr %pM and peer_id %d",
Leo Chang96464902016-10-28 11:10:54 -07004488 __func__, vdev, add_sta->staMac, peer_id);
Liangwei Dong7d845112016-09-27 22:24:21 -04004489 add_sta->status = QDF_STATUS_E_FAILURE;
4490 goto send_rsp;
4491 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004492
4493 status = wma_create_peer(wma, pdev, vdev, add_sta->staMac,
4494 WMI_PEER_TYPE_DEFAULT, add_sta->smesessionId,
4495 false);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304496 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004497 WMA_LOGE("%s: Failed to create peer for %pM",
4498 __func__, add_sta->staMac);
4499 add_sta->status = status;
4500 goto send_rsp;
4501 }
4502
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004503 peer = cdp_peer_find_by_addr_and_vdev(soc, pdev,
4504 vdev,
4505 add_sta->staMac, &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004506 if (!peer) {
4507 WMA_LOGE("%s: Failed to find peer handle using peer mac %pM",
4508 __func__, add_sta->staMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304509 add_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004510 wma_remove_peer(wma, add_sta->staMac, add_sta->smesessionId,
4511 peer, false);
4512 goto send_rsp;
4513 }
4514
4515 wmi_unified_send_txbf(wma, add_sta);
4516
lifeng13a89d72017-05-10 14:49:29 +08004517 /*
4518 * Get MCS limit from ini configure, and map it to rate parameters
4519 * This will limit HT rate upper bound. CFG_CTRL_MASK is used to
4520 * check whether ini config is enabled and CFG_DATA_MASK to get the
4521 * MCS value.
4522 */
4523#define CFG_CTRL_MASK 0xFF00
4524#define CFG_DATA_MASK 0x00FF
4525
Karthik Kantamneni22dd0f62018-08-07 14:53:50 +05304526 mcs_limit = mac->mlme_cfg->rates.sap_max_mcs_txdata;
lifeng13a89d72017-05-10 14:49:29 +08004527
4528 if (mcs_limit & CFG_CTRL_MASK) {
4529 WMA_LOGD("%s: set mcs_limit %x", __func__, mcs_limit);
4530
4531 mcs_limit &= CFG_DATA_MASK;
4532 rate_pos = (u_int8_t *)add_sta->supportedRates.supportedMCSSet;
4533 for (i = 0, j = 0; i < MAX_SUPPORTED_RATES;) {
4534 if (j < mcs_limit / 8) {
4535 rate_pos[j] = 0xff;
4536 j++;
4537 i += 8;
4538 } else if (j < mcs_limit / 8 + 1) {
4539 if (i <= mcs_limit)
4540 rate_pos[i / 8] |= 1 << (i % 8);
4541 else
4542 rate_pos[i / 8] &= ~(1 << (i % 8));
4543 i++;
4544
4545 if (i >= (j + 1) * 8)
4546 j++;
4547 } else {
4548 rate_pos[j++] = 0;
4549 i += 8;
4550 }
4551 }
4552 }
4553
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304554 if (wmi_service_enabled(wma->wmi_handle,
4555 wmi_service_peer_assoc_conf)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004556 peer_assoc_cnf = true;
4557 msg = wma_fill_hold_req(wma, add_sta->smesessionId,
4558 WMA_ADD_STA_REQ, WMA_PEER_ASSOC_CNF_START,
4559 add_sta, WMA_PEER_ASSOC_TIMEOUT);
4560 if (!msg) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004561 WMA_LOGE(FL("Failed to alloc request for vdev_id %d"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004562 add_sta->smesessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304563 add_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004564 wma_remove_req(wma, add_sta->smesessionId,
4565 WMA_PEER_ASSOC_CNF_START);
4566 wma_remove_peer(wma, add_sta->staMac,
4567 add_sta->smesessionId, peer, false);
4568 peer_assoc_cnf = false;
4569 goto send_rsp;
4570 }
4571 } else {
4572 WMA_LOGE(FL("WMI_SERVICE_PEER_ASSOC_CONF not enabled"));
4573 }
4574
Govind Singhb30d4c02016-03-24 11:01:23 +05304575 ret = wma_send_peer_assoc(wma, add_sta->nwType, add_sta);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004576 if (ret) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304577 add_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004578 wma_remove_peer(wma, add_sta->staMac, add_sta->smesessionId,
4579 peer, false);
4580 goto send_rsp;
4581 }
4582#ifdef QCA_IBSS_SUPPORT
4583 /*
4584 * In IBSS mode send the peer
4585 * Atim Window length if IBSS
4586 * power save is enabled by the
4587 * firmware.
4588 */
4589 if (wma_is_vdev_in_ibss_mode(wma, add_sta->smesessionId) &&
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304590 wmi_service_enabled(wma->wmi_handle,
4591 wmi_service_ibss_pwrsave)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004592 /*
4593 * If ATIM Window is present in the peer
4594 * beacon then send it to firmware else
4595 * configure Zero ATIM Window length to
4596 * firmware.
4597 */
4598 if (add_sta->atimIePresent) {
4599 wma_set_peer_param(wma, add_sta->staMac,
4600 WMI_PEER_IBSS_ATIM_WINDOW_LENGTH,
4601 add_sta->peerAtimWindowLength,
4602 add_sta->smesessionId);
4603 } else {
4604 wma_set_peer_param(wma, add_sta->staMac,
4605 WMI_PEER_IBSS_ATIM_WINDOW_LENGTH,
4606 0, add_sta->smesessionId);
4607 }
4608 }
4609#endif
4610
Abhishek Singhd7bc9132017-05-17 13:59:04 +05304611 iface->rmfEnabled = add_sta->rmfEnabled;
Abhishek Singhcfb44482017-03-10 12:42:37 +05304612 if (add_sta->rmfEnabled)
4613 wma_set_mgmt_frame_protection(wma);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004614
4615 if (add_sta->uAPSD) {
Govind Singhd76a5b02016-03-08 15:12:14 +05304616 status = wma_set_ap_peer_uapsd(wma, add_sta->smesessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004617 add_sta->staMac,
4618 add_sta->uAPSD, add_sta->maxSPLen);
Govind Singhd76a5b02016-03-08 15:12:14 +05304619 if (QDF_IS_STATUS_ERROR(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004620 WMA_LOGE("Failed to set peer uapsd param for %pM",
4621 add_sta->staMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304622 add_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004623 wma_remove_peer(wma, add_sta->staMac,
4624 add_sta->smesessionId, peer, false);
4625 goto send_rsp;
4626 }
4627 }
4628
4629 WMA_LOGD("%s: Moving peer %pM to state %d",
4630 __func__, add_sta->staMac, state);
Leo Chang96464902016-10-28 11:10:54 -07004631 cdp_peer_state_update(soc, pdev, add_sta->staMac, state);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004632
Leo Chang96464902016-10-28 11:10:54 -07004633 add_sta->staIdx = cdp_peer_get_local_peer_id(soc, peer);
Kanchanapally, Vidyullathae3062812015-05-22 17:28:57 +05304634 add_sta->nss = iface->nss;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304635 add_sta->status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004636send_rsp:
4637 /* Do not send add stat resp when peer assoc cnf is enabled */
4638 if (peer_assoc_cnf) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004639 WMA_LOGD(FL("WMI_SERVICE_PEER_ASSOC_CONF is enabled"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004640 return;
4641 }
4642
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004643 WMA_LOGD(FL("statype %d vdev_id %d aid %d bssid %pM staIdx %d status %d"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004644 add_sta->staType, add_sta->smesessionId,
4645 add_sta->assocId, add_sta->bssId, add_sta->staIdx,
4646 add_sta->status);
Abhishek Singh2d775fd2017-08-18 10:51:33 +05304647 wma_send_msg_high_priority(wma, WMA_ADD_STA_RSP, (void *)add_sta, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004648}
4649
4650#ifdef FEATURE_WLAN_TDLS
Poddar, Siddarth5a91f5b2016-04-28 12:24:10 +05304651
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004652/**
4653 * wma_add_tdls_sta() - process add sta request in TDLS mode
4654 * @wma: wma handle
4655 * @add_sta: add sta params
4656 *
4657 * Return: none
4658 */
4659static void wma_add_tdls_sta(tp_wma_handle wma, tpAddStaParams add_sta)
4660{
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004661 struct cdp_pdev *pdev;
4662 struct cdp_vdev *vdev;
Leo Chang96464902016-10-28 11:10:54 -07004663 void *peer;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004664 uint8_t peer_id;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304665 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004666 int32_t ret;
4667 tTdlsPeerStateParams *peerStateParams;
4668 struct wma_target_req *msg;
4669 bool peer_assoc_cnf = false;
Leo Chang96464902016-10-28 11:10:54 -07004670 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004671
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004672 WMA_LOGD("%s: staType: %d, staIdx: %d, updateSta: %d, bssId: %pM, staMac: %pM",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004673 __func__, add_sta->staType, add_sta->staIdx,
4674 add_sta->updateSta, add_sta->bssId, add_sta->staMac);
4675
Anurag Chouhan6d760662016-02-20 16:05:43 +05304676 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004677
4678 if (NULL == pdev) {
4679 WMA_LOGE("%s: Failed to find pdev", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304680 add_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004681 goto send_rsp;
4682 }
4683
4684 vdev = wma_find_vdev_by_id(wma, add_sta->smesessionId);
4685 if (!vdev) {
4686 WMA_LOGE("%s: Failed to find vdev", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304687 add_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004688 goto send_rsp;
4689 }
4690
Nitesh Shah622d3122017-06-05 17:04:06 +05304691 if (wma_is_roam_synch_in_progress(wma, add_sta->smesessionId)) {
4692 WMA_LOGE("%s: roaming in progress, reject add sta!", __func__);
4693 add_sta->status = QDF_STATUS_E_PERM;
4694 goto send_rsp;
4695 }
4696
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004697 if (0 == add_sta->updateSta) {
4698 /* its a add sta request * */
Poddar, Siddarth5a91f5b2016-04-28 12:24:10 +05304699
Leo Chang96464902016-10-28 11:10:54 -07004700 cdp_peer_copy_mac_addr_raw(soc, vdev, add_sta->bssId);
Poddar, Siddarth5a91f5b2016-04-28 12:24:10 +05304701
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004702 WMA_LOGD("%s: addSta, calling wma_create_peer for %pM, vdev_id %hu",
4703 __func__, add_sta->staMac, add_sta->smesessionId);
4704
4705 status = wma_create_peer(wma, pdev, vdev, add_sta->staMac,
4706 WMI_PEER_TYPE_TDLS,
4707 add_sta->smesessionId, false);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304708 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004709 WMA_LOGE("%s: Failed to create peer for %pM",
4710 __func__, add_sta->staMac);
4711 add_sta->status = status;
4712 goto send_rsp;
4713 }
4714
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004715 peer = cdp_peer_find_by_addr(soc, pdev,
4716 add_sta->staMac,
4717 &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004718 if (!peer) {
4719 WMA_LOGE("%s: addSta, failed to find peer handle for mac %pM",
4720 __func__, add_sta->staMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304721 add_sta->status = QDF_STATUS_E_FAILURE;
Leo Chang96464902016-10-28 11:10:54 -07004722 cdp_peer_add_last_real_peer(soc, pdev, vdev, &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004723 goto send_rsp;
4724 }
4725
Leo Chang96464902016-10-28 11:10:54 -07004726 add_sta->staIdx = cdp_peer_get_local_peer_id(soc, peer);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004727 WMA_LOGD("%s: addSta, after calling cdp_local_peer_id, staIdx: %d, staMac: %pM",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004728 __func__, add_sta->staIdx, add_sta->staMac);
4729
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304730 peerStateParams = qdf_mem_malloc(sizeof(tTdlsPeerStateParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004731 if (!peerStateParams) {
4732 WMA_LOGE
4733 ("%s: Failed to allocate memory for peerStateParams for %pM",
4734 __func__, add_sta->staMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304735 add_sta->status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004736 goto send_rsp;
4737 }
4738
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004739 peerStateParams->peerState = WMI_TDLS_PEER_STATE_PEERING;
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07004740 peerStateParams->vdevId = add_sta->smesessionId;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304741 qdf_mem_copy(&peerStateParams->peerMacAddr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004742 &add_sta->staMac, sizeof(tSirMacAddr));
4743 wma_update_tdls_peer_state(wma, peerStateParams);
4744 } else {
4745 /* its a change sta request * */
4746 peer =
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004747 cdp_peer_find_by_addr(soc, pdev,
4748 add_sta->staMac,
4749 &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004750 if (!peer) {
4751 WMA_LOGE("%s: changeSta,failed to find peer handle for mac %pM",
4752 __func__, add_sta->staMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304753 add_sta->status = QDF_STATUS_E_FAILURE;
Poddar, Siddarth5a91f5b2016-04-28 12:24:10 +05304754
Leo Chang96464902016-10-28 11:10:54 -07004755 cdp_peer_add_last_real_peer(soc, pdev, vdev, &peer_id);
Poddar, Siddarth5a91f5b2016-04-28 12:24:10 +05304756
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004757 goto send_rsp;
4758 }
4759
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304760 if (wmi_service_enabled(wma->wmi_handle,
4761 wmi_service_peer_assoc_conf)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004762 WMA_LOGE(FL("WMI_SERVICE_PEER_ASSOC_CONF is enabled"));
4763 peer_assoc_cnf = true;
4764 msg = wma_fill_hold_req(wma, add_sta->smesessionId,
4765 WMA_ADD_STA_REQ, WMA_PEER_ASSOC_CNF_START,
4766 add_sta, WMA_PEER_ASSOC_TIMEOUT);
4767 if (!msg) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004768 WMA_LOGE(FL("Failed to alloc request for vdev_id %d"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004769 add_sta->smesessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304770 add_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004771 wma_remove_req(wma, add_sta->smesessionId,
4772 WMA_PEER_ASSOC_CNF_START);
4773 wma_remove_peer(wma, add_sta->staMac,
4774 add_sta->smesessionId, peer, false);
4775 peer_assoc_cnf = false;
4776 goto send_rsp;
4777 }
4778 } else {
4779 WMA_LOGE(FL("WMI_SERVICE_PEER_ASSOC_CONF not enabled"));
4780 }
4781
Govind Singhb30d4c02016-03-24 11:01:23 +05304782 WMA_LOGD("%s: changeSta, calling wma_send_peer_assoc",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004783 __func__);
4784
4785 ret =
Govind Singhb30d4c02016-03-24 11:01:23 +05304786 wma_send_peer_assoc(wma, add_sta->nwType, add_sta);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004787 if (ret) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304788 add_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004789 wma_remove_peer(wma, add_sta->staMac,
4790 add_sta->smesessionId, peer, false);
Leo Chang96464902016-10-28 11:10:54 -07004791 cdp_peer_add_last_real_peer(soc, pdev, vdev, &peer_id);
Poddar, Siddarth5a91f5b2016-04-28 12:24:10 +05304792
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004793 goto send_rsp;
4794 }
4795 }
4796
4797send_rsp:
4798 /* Do not send add stat resp when peer assoc cnf is enabled */
4799 if (peer_assoc_cnf)
4800 return;
4801
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004802 WMA_LOGD(FL("statype %d vdev_id %d aid %d bssid %pM staIdx %d status %d"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004803 add_sta->staType, add_sta->smesessionId,
4804 add_sta->assocId, add_sta->bssId, add_sta->staIdx,
4805 add_sta->status);
Abhishek Singh2d775fd2017-08-18 10:51:33 +05304806 wma_send_msg_high_priority(wma, WMA_ADD_STA_RSP, (void *)add_sta, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004807}
4808#endif
4809
4810/**
Jeff Johnsonc97816c2018-05-12 17:13:23 -07004811 * wma_send_bss_color_change_enable() - send bss color change enable cmd.
Arif Hussain05fb4872018-01-03 16:02:55 -08004812 * @wma: wma handle
4813 * @params: add sta params
4814 *
4815 * Send bss color change command to firmware, to enable firmware to update
4816 * internally if any change in bss color in advertised by associated AP.
4817 *
4818 * Return: none
4819 */
4820#ifdef WLAN_FEATURE_11AX
4821static void wma_send_bss_color_change_enable(tp_wma_handle wma,
4822 tpAddStaParams params)
4823{
4824 QDF_STATUS status;
4825 uint32_t vdev_id = params->smesessionId;
4826
4827 if (!params->he_capable) {
4828 WMA_LOGD("%s: he_capable is not set for vdev_id:%d",
4829 __func__, vdev_id);
4830 return;
4831 }
4832
4833 status = wmi_unified_send_bss_color_change_enable_cmd(wma->wmi_handle,
4834 vdev_id,
4835 true);
4836 if (QDF_IS_STATUS_ERROR(status)) {
4837 WMA_LOGE("Failed to enable bss color change offload, vdev:%d",
4838 vdev_id);
4839 }
4840
4841 return;
4842}
4843#else
4844static void wma_send_bss_color_change_enable(tp_wma_handle wma,
4845 tpAddStaParams params)
4846{
4847}
4848#endif
4849
4850/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004851 * wma_add_sta_req_sta_mode() - process add sta request in sta mode
4852 * @wma: wma handle
Arif Hussain05fb4872018-01-03 16:02:55 -08004853 * @params: add sta params
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004854 *
4855 * Return: none
4856 */
4857static void wma_add_sta_req_sta_mode(tp_wma_handle wma, tpAddStaParams params)
4858{
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004859 struct cdp_pdev *pdev;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304860 QDF_STATUS status = QDF_STATUS_SUCCESS;
Leo Chang96464902016-10-28 11:10:54 -07004861 void *peer;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004862 struct wma_txrx_node *iface;
Amar Singhala297bfa2015-10-15 15:07:29 -07004863 int8_t maxTxPower;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004864 int ret = 0;
4865 struct wma_target_req *msg;
4866 bool peer_assoc_cnf = false;
Govind Singhd76a5b02016-03-08 15:12:14 +05304867 struct vdev_up_params param = {0};
Archana Ramachandran20d2e232016-02-11 16:58:40 -08004868 int smps_param;
Leo Chang96464902016-10-28 11:10:54 -07004869 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004870
4871#ifdef FEATURE_WLAN_TDLS
4872 if (STA_ENTRY_TDLS_PEER == params->staType) {
4873 wma_add_tdls_sta(wma, params);
4874 return;
4875 }
4876#endif
4877
Anurag Chouhan6d760662016-02-20 16:05:43 +05304878 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004879
4880 if (NULL == pdev) {
4881 WMA_LOGE("%s: Unable to get pdev", __func__);
4882 goto out;
4883 }
4884
4885 iface = &wma->interfaces[params->smesessionId];
4886 if (params->staType != STA_ENTRY_SELF) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004887 WMA_LOGE("%s: unsupported station type %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004888 __func__, params->staType);
4889 goto out;
4890 }
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004891 peer = cdp_peer_find_by_addr(soc,
4892 pdev,
4893 params->bssId, &params->staIdx);
Sandeep Puligilla2ff3ebe2016-08-31 23:55:07 -07004894 if (peer == NULL) {
4895 WMA_LOGE("%s: Peer is not present vdev id %d for %pM", __func__,
4896 params->smesessionId, params->bssId);
4897 status = QDF_STATUS_E_FAILURE;
4898 goto out;
4899 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004900 if (params->nonRoamReassoc) {
Leo Chang96464902016-10-28 11:10:54 -07004901 cdp_peer_state_update(soc, pdev, params->bssId,
Dhanashri Atreb08959a2016-03-01 17:28:03 -08004902 OL_TXRX_PEER_STATE_AUTH);
Anurag Chouhan8e0ccd32016-02-19 15:30:20 +05304903 qdf_atomic_set(&iface->bss_status, WMA_BSS_STATUS_STARTED);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004904 iface->aid = params->assocId;
4905 goto out;
4906 }
4907
Mukul Sharmaf9047232017-03-02 16:58:56 +05304908 if (wma_is_vdev_up(params->smesessionId)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004909 WMA_LOGE("%s: vdev id %d is already UP for %pM", __func__,
4910 params->smesessionId, params->bssId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304911 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004912 goto out;
4913 }
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07004914
4915 if (peer != NULL &&
Leo Chang96464902016-10-28 11:10:54 -07004916 (cdp_peer_state_get(soc, peer) == OL_TXRX_PEER_STATE_DISC)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004917 /*
4918 * This is the case for reassociation.
4919 * peer state update and peer_assoc is required since it
4920 * was not done by WMA_ADD_BSS_REQ.
4921 */
4922
4923 /* Update peer state */
4924 if (params->encryptType == eSIR_ED_NONE) {
4925 WMA_LOGD("%s: Update peer(%pM) state into auth",
4926 __func__, params->bssId);
Leo Chang96464902016-10-28 11:10:54 -07004927 cdp_peer_state_update(soc, pdev, params->bssId,
Dhanashri Atreb08959a2016-03-01 17:28:03 -08004928 OL_TXRX_PEER_STATE_AUTH);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004929 } else {
4930 WMA_LOGD("%s: Update peer(%pM) state into conn",
4931 __func__, params->bssId);
Leo Chang96464902016-10-28 11:10:54 -07004932 cdp_peer_state_update(soc, pdev, params->bssId,
Dhanashri Atreb08959a2016-03-01 17:28:03 -08004933 OL_TXRX_PEER_STATE_CONN);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004934 }
4935
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08004936 if (wma_is_roam_synch_in_progress(wma, params->smesessionId)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004937 /* iface->nss = params->nss; */
4938 /*In LFR2.0, the following operations are performed as
Govind Singhb30d4c02016-03-24 11:01:23 +05304939 * part of wma_send_peer_assoc. As we are
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004940 * skipping this operation, we are just executing the
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004941 * following which are useful for LFR3.0
4942 */
Leo Chang96464902016-10-28 11:10:54 -07004943 cdp_peer_state_update(soc, pdev, params->bssId,
Dhanashri Atreb08959a2016-03-01 17:28:03 -08004944 OL_TXRX_PEER_STATE_AUTH);
Anurag Chouhan8e0ccd32016-02-19 15:30:20 +05304945 qdf_atomic_set(&iface->bss_status,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004946 WMA_BSS_STATUS_STARTED);
4947 iface->aid = params->assocId;
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004948 WMA_LOGD("LFR3:statype %d vdev %d aid %d bssid %pM",
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08004949 params->staType, params->smesessionId,
4950 params->assocId, params->bssId);
4951 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004952 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004953 wmi_unified_send_txbf(wma, params);
4954
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304955 if (wmi_service_enabled(wma->wmi_handle,
4956 wmi_service_peer_assoc_conf)) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004957 WMA_LOGD(FL("WMI_SERVICE_PEER_ASSOC_CONF is enabled"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004958 peer_assoc_cnf = true;
4959 msg = wma_fill_hold_req(wma, params->smesessionId,
4960 WMA_ADD_STA_REQ, WMA_PEER_ASSOC_CNF_START,
4961 params, WMA_PEER_ASSOC_TIMEOUT);
4962 if (!msg) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004963 WMA_LOGD(FL("Failed to alloc request for vdev_id %d"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004964 params->smesessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304965 params->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004966 wma_remove_req(wma, params->smesessionId,
4967 WMA_PEER_ASSOC_CNF_START);
4968 wma_remove_peer(wma, params->staMac,
4969 params->smesessionId, peer, false);
4970 peer_assoc_cnf = false;
4971 goto out;
4972 }
4973 } else {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004974 WMA_LOGD(FL("WMI_SERVICE_PEER_ASSOC_CONF not enabled"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004975 }
4976
Govind Singhb30d4c02016-03-24 11:01:23 +05304977 ret = wma_send_peer_assoc(wma,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004978 iface->nwType,
4979 (tAddStaParams *) iface->addBssStaContext);
4980 if (ret) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304981 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004982 wma_remove_peer(wma, params->bssId,
4983 params->smesessionId, peer, false);
4984 goto out;
4985 }
Abhishek Singhcfb44482017-03-10 12:42:37 +05304986
4987 if (params->rmfEnabled)
4988 wma_set_mgmt_frame_protection(wma);
4989
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004990 /*
4991 * Set the PTK in 11r mode because we already have it.
4992 */
4993 if (iface->staKeyParams) {
4994 wma_set_stakey(wma,
4995 (tpSetStaKeyParams) iface->staKeyParams);
4996 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004997 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004998 maxTxPower = params->maxTxPower;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004999 wma_vdev_set_bss_params(wma, params->smesessionId,
5000 iface->beaconInterval, iface->dtimPeriod,
5001 iface->shortSlotTimeSupported,
5002 iface->llbCoexist, maxTxPower);
5003
5004 params->csaOffloadEnable = 0;
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05305005 if (wmi_service_enabled(wma->wmi_handle,
5006 wmi_service_csa_offload)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005007 params->csaOffloadEnable = 1;
Govind Singhd76a5b02016-03-08 15:12:14 +05305008 if (wma_unified_csa_offload_enable(wma, params->smesessionId) <
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005009 0) {
5010 WMA_LOGE("Unable to enable CSA offload for vdev_id:%d",
5011 params->smesessionId);
5012 }
5013 }
5014
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05305015 if (wmi_service_enabled(wma->wmi_handle,
Jeff Johnson75873e92018-06-30 18:08:06 -07005016 wmi_service_filter_ipsec_natkeepalive)) {
5017 if (wmi_unified_nat_keepalive_en_cmd(wma->wmi_handle,
5018 params->smesessionId)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005019 WMA_LOGE("Unable to enable NAT keepalive for vdev_id:%d",
5020 params->smesessionId);
5021 }
5022 }
5023
Govind Singhd76a5b02016-03-08 15:12:14 +05305024 param.vdev_id = params->smesessionId;
5025 param.assoc_id = params->assocId;
Dustin Brownec2c92e2017-07-26 11:13:49 -07005026 if (wma_send_vdev_up_to_fw(wma, &param, params->bssId) !=
5027 QDF_STATUS_SUCCESS) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07005028 WMA_LOGE("%s: Failed to send vdev up cmd: vdev %d bssid %pM",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005029 __func__, params->smesessionId, params->bssId);
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07005030 policy_mgr_set_do_hw_mode_change_flag(
5031 wma->psoc, false);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305032 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005033 } else {
Hong Shib90718f2017-02-20 00:57:22 +08005034 wma_set_vdev_mgmt_rate(wma, params->smesessionId);
Mukul Sharmaf9047232017-03-02 16:58:56 +05305035 wma_vdev_set_mlme_state(wma, params->smesessionId,
5036 WLAN_VDEV_S_RUN);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005037 }
5038
Anurag Chouhan8e0ccd32016-02-19 15:30:20 +05305039 qdf_atomic_set(&iface->bss_status, WMA_BSS_STATUS_STARTED);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005040 WMA_LOGD("%s: STA mode (type %d subtype %d) BSS is started",
5041 __func__, iface->type, iface->sub_type);
5042 /* Sta is now associated, configure various params */
5043
Archana Ramachandran20d2e232016-02-11 16:58:40 -08005044 /* Send SMPS force command to FW to send the required
5045 * action frame only when SM power save is enbaled in
Archana Ramachandranfec24812016-02-16 16:31:56 -08005046 * from INI. In case dynamic antenna selection, the
5047 * action frames are sent by the chain mask manager
Archana Ramachandran20d2e232016-02-11 16:58:40 -08005048 * In addition to the action frames, The SM power save is
5049 * published in the assoc request HT SMPS IE for both cases.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005050 */
Archana Ramachandranfec24812016-02-16 16:31:56 -08005051 if ((params->enableHtSmps) && (params->send_smps_action)) {
Archana Ramachandran20d2e232016-02-11 16:58:40 -08005052 smps_param = wma_smps_mode_to_force_mode_param(
5053 params->htSmpsconfig);
5054 if (smps_param >= 0) {
Archana Ramachandranfec24812016-02-16 16:31:56 -08005055 WMA_LOGD("%s: Send SMPS force mode: %d",
Archana Ramachandran20d2e232016-02-11 16:58:40 -08005056 __func__, params->htSmpsconfig);
5057 wma_set_mimops(wma, params->smesessionId,
5058 smps_param);
5059 }
5060 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005061
Arif Hussain05fb4872018-01-03 16:02:55 -08005062 wma_send_bss_color_change_enable(wma, params);
5063
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005064 /* Partial AID match power save, enable when SU bformee */
5065 if (params->enableVhtpAid && params->vhtTxBFCapable)
5066 wma_set_ppsconfig(params->smesessionId,
5067 WMA_VHT_PPS_PAID_MATCH, 1);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005068
5069 /* Enable AMPDU power save, if htCapable/vhtCapable */
5070 if (params->enableAmpduPs && (params->htCapable || params->vhtCapable))
5071 wma_set_ppsconfig(params->smesessionId,
5072 WMA_VHT_PPS_DELIM_CRC_FAIL, 1);
Krunal Sonib39a0282018-08-30 17:22:25 -07005073 if (wmi_service_enabled(wma->wmi_handle,
5074 wmi_service_listen_interval_offload_support)) {
Krunal Soni1fd496d2018-02-02 01:25:19 -08005075 WMA_LOGD("%s: listen interval offload enabled, setting params",
5076 __func__);
5077 status = wma_vdev_set_param(wma->wmi_handle,
5078 params->smesessionId,
5079 WMI_VDEV_PARAM_MAX_LI_OF_MODDTIM,
5080 wma->staMaxLIModDtim);
5081 if (status != QDF_STATUS_SUCCESS) {
5082 WMA_LOGE(FL("can't set MAX_LI for session: %d"),
5083 params->smesessionId);
5084 }
5085 status = wma_vdev_set_param(wma->wmi_handle,
5086 params->smesessionId,
5087 WMI_VDEV_PARAM_DYNDTIM_CNT,
5088 wma->staDynamicDtim);
5089 if (status != QDF_STATUS_SUCCESS) {
5090 WMA_LOGE(FL("can't set DYNDTIM_CNT for session: %d"),
5091 params->smesessionId);
5092 }
5093 status = wma_vdev_set_param(wma->wmi_handle,
5094 params->smesessionId,
5095 WMI_VDEV_PARAM_MODDTIM_CNT,
5096 wma->staModDtim);
5097 if (status != QDF_STATUS_SUCCESS) {
5098 WMA_LOGE(FL("can't set DTIM_CNT for session: %d"),
5099 params->smesessionId);
5100 }
5101
5102 } else {
5103 WMA_LOGD("%s: listen interval offload is not set",
5104 __func__);
5105 }
5106
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005107 iface->aid = params->assocId;
Kanchanapally, Vidyullathae3062812015-05-22 17:28:57 +05305108 params->nss = iface->nss;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005109out:
5110 /* Do not send add stat resp when peer assoc cnf is enabled */
5111 if (peer_assoc_cnf)
5112 return;
5113
5114 params->status = status;
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07005115 WMA_LOGD(FL("statype %d vdev_id %d aid %d bssid %pM staIdx %d status %d"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005116 params->staType, params->smesessionId,
5117 params->assocId, params->bssId, params->staIdx,
5118 params->status);
Sandeep Puligilla2ff3ebe2016-08-31 23:55:07 -07005119 /* Don't send a response during roam sync operation */
5120 if (!wma_is_roam_synch_in_progress(wma, params->smesessionId))
Abhishek Singh2d775fd2017-08-18 10:51:33 +05305121 wma_send_msg_high_priority(wma, WMA_ADD_STA_RSP,
5122 (void *)params, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005123}
5124
5125/**
Jeff Johnsonc97816c2018-05-12 17:13:23 -07005126 * wma_delete_sta_req_ap_mode() - process delete sta request from UMAC in AP mode
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005127 * @wma: wma handle
5128 * @del_sta: delete sta params
5129 *
5130 * Return: none
5131 */
5132static void wma_delete_sta_req_ap_mode(tp_wma_handle wma,
5133 tpDeleteStaParams del_sta)
5134{
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08005135 struct cdp_pdev *pdev;
Leo Chang96464902016-10-28 11:10:54 -07005136 void *peer;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08005137 struct wma_target_req *msg;
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07005138 uint8_t *peer_mac_addr;
Leo Chang96464902016-10-28 11:10:54 -07005139 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005140
Anurag Chouhan6d760662016-02-20 16:05:43 +05305141 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005142
5143 if (NULL == pdev) {
5144 WMA_LOGE("%s: Failed to get pdev", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305145 del_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005146 goto send_del_rsp;
5147 }
5148
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08005149 peer = cdp_peer_find_by_local_id(soc,
5150 pdev, del_sta->staIdx);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005151 if (!peer) {
5152 WMA_LOGE("%s: Failed to get peer handle using peer id %d",
5153 __func__, del_sta->staIdx);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305154 del_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005155 goto send_del_rsp;
5156 }
Leo Chang96464902016-10-28 11:10:54 -07005157 peer_mac_addr = cdp_peer_get_peer_mac_addr(soc, peer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005158
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07005159 wma_remove_peer(wma, peer_mac_addr, del_sta->smesessionId, peer,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005160 false);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305161 del_sta->status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005162
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05305163 if (wmi_service_enabled(wma->wmi_handle,
5164 wmi_service_sync_delete_cmds)) {
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08005165 msg = wma_fill_hold_req(wma, del_sta->smesessionId,
5166 WMA_DELETE_STA_REQ,
5167 WMA_DELETE_STA_RSP_START, del_sta,
5168 WMA_DELETE_STA_TIMEOUT);
5169 if (!msg) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07005170 WMA_LOGE(FL("Failed to allocate request. vdev_id %d"),
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08005171 del_sta->smesessionId);
5172 wma_remove_req(wma, del_sta->smesessionId,
5173 WMA_DELETE_STA_RSP_START);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305174 del_sta->status = QDF_STATUS_E_NOMEM;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08005175 goto send_del_rsp;
5176 }
Dustin Brownec2c92e2017-07-26 11:13:49 -07005177
5178 wma_acquire_wakelock(&wma->wmi_cmd_rsp_wake_lock,
5179 WMA_FW_RSP_EVENT_WAKE_LOCK_DURATION);
5180
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08005181 return;
5182 }
5183
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005184send_del_rsp:
5185 if (del_sta->respReqd) {
5186 WMA_LOGD("%s: Sending del rsp to umac (status: %d)",
5187 __func__, del_sta->status);
Abhishek Singh2d775fd2017-08-18 10:51:33 +05305188 wma_send_msg_high_priority(wma, WMA_DELETE_STA_RSP,
5189 (void *)del_sta, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005190 }
5191}
5192
5193#ifdef FEATURE_WLAN_TDLS
5194/**
Jeff Johnsonc97816c2018-05-12 17:13:23 -07005195 * wma_del_tdls_sta() - process delete sta request from UMAC in TDLS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005196 * @wma: wma handle
5197 * @del_sta: delete sta params
5198 *
5199 * Return: none
5200 */
5201static void wma_del_tdls_sta(tp_wma_handle wma, tpDeleteStaParams del_sta)
5202{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005203 tTdlsPeerStateParams *peerStateParams;
Padma, Santhosh Kumar4eb79082017-02-24 16:00:20 +05305204 struct wma_target_req *msg;
5205 int status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005206
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305207 peerStateParams = qdf_mem_malloc(sizeof(tTdlsPeerStateParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005208 if (!peerStateParams) {
5209 WMA_LOGE("%s: Failed to allocate memory for peerStateParams for: %pM",
5210 __func__, del_sta->staMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305211 del_sta->status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005212 goto send_del_rsp;
5213 }
5214
Nitesh Shah622d3122017-06-05 17:04:06 +05305215 if (wma_is_roam_synch_in_progress(wma, del_sta->smesessionId)) {
5216 WMA_LOGE("%s: roaming in progress, reject del sta!", __func__);
5217 del_sta->status = QDF_STATUS_E_PERM;
5218 goto send_del_rsp;
5219 }
5220
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005221 peerStateParams->peerState = WMA_TDLS_PEER_STATE_TEARDOWN;
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07005222 peerStateParams->vdevId = del_sta->smesessionId;
Padma, Santhosh Kumar4eb79082017-02-24 16:00:20 +05305223 peerStateParams->resp_reqd = del_sta->respReqd;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305224 qdf_mem_copy(&peerStateParams->peerMacAddr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005225 &del_sta->staMac, sizeof(tSirMacAddr));
5226
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07005227 WMA_LOGD("%s: sending tdls_peer_state for peer mac: %pM, peerState: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005228 __func__, peerStateParams->peerMacAddr,
5229 peerStateParams->peerState);
5230
Padma, Santhosh Kumar4eb79082017-02-24 16:00:20 +05305231 status = wma_update_tdls_peer_state(wma, peerStateParams);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005232
Padma, Santhosh Kumar4eb79082017-02-24 16:00:20 +05305233 if (status < 0) {
5234 WMA_LOGE("%s: wma_update_tdls_peer_state returned failure",
5235 __func__);
5236 goto send_del_rsp;
5237 }
5238
5239 if (del_sta->respReqd &&
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05305240 wmi_service_enabled(wma->wmi_handle,
5241 wmi_service_sync_delete_cmds)) {
Padma, Santhosh Kumar4eb79082017-02-24 16:00:20 +05305242 del_sta->status = QDF_STATUS_SUCCESS;
5243 msg = wma_fill_hold_req(wma,
5244 del_sta->smesessionId,
5245 WMA_DELETE_STA_REQ,
5246 WMA_DELETE_STA_RSP_START, del_sta,
5247 WMA_DELETE_STA_TIMEOUT);
5248 if (!msg) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07005249 WMA_LOGE(FL("Failed to allocate vdev_id %d"),
Pragaspathi Thilagaraj78474342018-04-11 17:09:28 +05305250 del_sta->smesessionId);
Padma, Santhosh Kumar4eb79082017-02-24 16:00:20 +05305251 wma_remove_req(wma,
Pragaspathi Thilagaraj78474342018-04-11 17:09:28 +05305252 del_sta->smesessionId,
Padma, Santhosh Kumar4eb79082017-02-24 16:00:20 +05305253 WMA_DELETE_STA_RSP_START);
5254 del_sta->status = QDF_STATUS_E_NOMEM;
5255 goto send_del_rsp;
5256 }
Dustin Brownec2c92e2017-07-26 11:13:49 -07005257
5258 wma_acquire_wakelock(&wma->wmi_cmd_rsp_wake_lock,
Padma, Santhosh Kumar4eb79082017-02-24 16:00:20 +05305259 WMA_FW_RSP_EVENT_WAKE_LOCK_DURATION);
Padma, Santhosh Kumar4eb79082017-02-24 16:00:20 +05305260 }
5261
5262 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005263
5264send_del_rsp:
5265 if (del_sta->respReqd) {
5266 WMA_LOGD("%s: Sending del rsp to umac (status: %d)",
5267 __func__, del_sta->status);
Abhishek Singh2d775fd2017-08-18 10:51:33 +05305268 wma_send_msg_high_priority(wma, WMA_DELETE_STA_RSP,
5269 (void *)del_sta, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005270 }
5271}
5272#endif
5273
5274/**
Jeff Johnsonc97816c2018-05-12 17:13:23 -07005275 * wma_delete_sta_req_sta_mode() - process delete sta request from UMAC
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005276 * @wma: wma handle
5277 * @params: delete sta params
5278 *
5279 * Return: none
5280 */
5281static void wma_delete_sta_req_sta_mode(tp_wma_handle wma,
5282 tpDeleteStaParams params)
5283{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305284 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005285 struct wma_txrx_node *iface;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07005286
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005287 iface = &wma->interfaces[params->smesessionId];
5288 iface->uapsd_cached_val = 0;
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08005289 if (wma_is_roam_synch_in_progress(wma, params->smesessionId))
5290 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005291#ifdef FEATURE_WLAN_TDLS
5292 if (STA_ENTRY_TDLS_PEER == params->staType) {
5293 wma_del_tdls_sta(wma, params);
5294 return;
5295 }
5296#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005297 params->status = status;
5298 if (params->respReqd) {
5299 WMA_LOGD("%s: vdev_id %d status %d", __func__,
5300 params->smesessionId, status);
Abhishek Singh2d775fd2017-08-18 10:51:33 +05305301 wma_send_msg_high_priority(wma, WMA_DELETE_STA_RSP,
5302 (void *)params, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005303 }
5304}
5305
5306/**
5307 * wma_add_sta() - process add sta request as per opmode
5308 * @wma: wma handle
5309 * @add_Sta: add sta params
5310 *
5311 * Return: none
5312 */
5313void wma_add_sta(tp_wma_handle wma, tpAddStaParams add_sta)
5314{
5315 uint8_t oper_mode = BSS_OPERATIONAL_MODE_STA;
Arunk Khandavallia6305a32018-01-25 11:19:18 +05305316 void *htc_handle;
5317
Sourav Mohapatracf632572018-04-02 11:01:35 +05305318 htc_handle = lmac_get_htc_hdl(wma->psoc);
Arunk Khandavallia6305a32018-01-25 11:19:18 +05305319 if (!htc_handle) {
5320 WMA_LOGE(":%sHTC handle is NULL:%d", __func__, __LINE__);
5321 return;
5322 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005323
5324 WMA_LOGD("%s: add_sta->sessionId = %d.", __func__,
5325 add_sta->smesessionId);
5326 WMA_LOGD("%s: add_sta->bssId = %x:%x:%x:%x:%x:%x", __func__,
5327 add_sta->bssId[0], add_sta->bssId[1], add_sta->bssId[2],
5328 add_sta->bssId[3], add_sta->bssId[4], add_sta->bssId[5]);
5329
5330 if (wma_is_vdev_in_ap_mode(wma, add_sta->smesessionId))
5331 oper_mode = BSS_OPERATIONAL_MODE_AP;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005332 else if (wma_is_vdev_in_ibss_mode(wma, add_sta->smesessionId))
5333 oper_mode = BSS_OPERATIONAL_MODE_IBSS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005334
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -07005335 if (WMA_IS_VDEV_IN_NDI_MODE(wma->interfaces, add_sta->smesessionId))
5336 oper_mode = BSS_OPERATIONAL_MODE_NDI;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005337 switch (oper_mode) {
5338 case BSS_OPERATIONAL_MODE_STA:
5339 wma_add_sta_req_sta_mode(wma, add_sta);
5340 break;
5341
Houston Hoffman79b4af22015-10-06 12:01:08 -07005342 /* IBSS should share the same code as AP mode */
5343 case BSS_OPERATIONAL_MODE_IBSS:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005344 case BSS_OPERATIONAL_MODE_AP:
Arunk Khandavallia6305a32018-01-25 11:19:18 +05305345 htc_vote_link_up(htc_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005346 wma_add_sta_req_ap_mode(wma, add_sta);
5347 break;
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -07005348 case BSS_OPERATIONAL_MODE_NDI:
5349 wma_add_sta_ndi_mode(wma, add_sta);
5350 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005351 }
5352
5353#ifdef QCA_IBSS_SUPPORT
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07005354 /* adjust heart beat thresold timer value for detecting ibss peer
5355 * departure
5356 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005357 if (oper_mode == BSS_OPERATIONAL_MODE_IBSS)
5358 wma_adjust_ibss_heart_beat_timer(wma, add_sta->smesessionId, 1);
5359#endif
5360
5361}
5362
5363/**
5364 * wma_delete_sta() - process del sta request as per opmode
5365 * @wma: wma handle
5366 * @del_sta: delete sta params
5367 *
5368 * Return: none
5369 */
5370void wma_delete_sta(tp_wma_handle wma, tpDeleteStaParams del_sta)
5371{
5372 uint8_t oper_mode = BSS_OPERATIONAL_MODE_STA;
5373 uint8_t smesession_id = del_sta->smesessionId;
5374 bool rsp_requested = del_sta->respReqd;
Arunk Khandavallia6305a32018-01-25 11:19:18 +05305375 void *htc_handle;
5376
Sourav Mohapatracf632572018-04-02 11:01:35 +05305377 htc_handle = lmac_get_htc_hdl(wma->psoc);
Arunk Khandavallia6305a32018-01-25 11:19:18 +05305378 if (!htc_handle) {
5379 WMA_LOGE(":%sHTC handle is NULL:%d", __func__, __LINE__);
5380 return;
5381 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005382
5383 if (wma_is_vdev_in_ap_mode(wma, smesession_id))
5384 oper_mode = BSS_OPERATIONAL_MODE_AP;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005385 if (wma_is_vdev_in_ibss_mode(wma, smesession_id)) {
5386 oper_mode = BSS_OPERATIONAL_MODE_IBSS;
5387 WMA_LOGD("%s: to delete sta for IBSS mode", __func__);
5388 }
Deepak Dhamdherea6d2f4c2016-06-04 00:24:52 -07005389 if (del_sta->staType == STA_ENTRY_NDI_PEER)
5390 oper_mode = BSS_OPERATIONAL_MODE_NDI;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005391
Padma, Santhosh Kumarcd35f532016-12-27 12:07:39 +05305392 WMA_LOGD(FL("oper_mode %d"), oper_mode);
5393
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005394 switch (oper_mode) {
5395 case BSS_OPERATIONAL_MODE_STA:
5396 wma_delete_sta_req_sta_mode(wma, del_sta);
Varun Reddy Yeturu33894272017-10-27 15:37:31 -07005397 if (wma_is_roam_synch_in_progress(wma, smesession_id)) {
5398 WMA_LOGD(FL("LFR3: Del STA on vdev_id %d"),
5399 del_sta->smesessionId);
5400 qdf_mem_free(del_sta);
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08005401 return;
Varun Reddy Yeturu33894272017-10-27 15:37:31 -07005402 }
Krishna Kumaar Natarajan70133f02016-02-03 14:35:48 -08005403 if (!rsp_requested) {
5404 WMA_LOGD(FL("vdev_id %d status %d"),
5405 del_sta->smesessionId, del_sta->status);
5406 qdf_mem_free(del_sta);
5407 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005408 break;
5409
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005410 case BSS_OPERATIONAL_MODE_IBSS: /* IBSS shares AP code */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005411 case BSS_OPERATIONAL_MODE_AP:
Arunk Khandavallia6305a32018-01-25 11:19:18 +05305412 htc_vote_link_down(htc_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005413 wma_delete_sta_req_ap_mode(wma, del_sta);
Krishna Kumaar Natarajan70133f02016-02-03 14:35:48 -08005414 /* free the memory here only if sync feature is not enabled */
5415 if (!rsp_requested &&
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05305416 !wmi_service_enabled(wma->wmi_handle,
5417 wmi_service_sync_delete_cmds)) {
Krishna Kumaar Natarajan70133f02016-02-03 14:35:48 -08005418 WMA_LOGD(FL("vdev_id %d status %d"),
5419 del_sta->smesessionId, del_sta->status);
5420 qdf_mem_free(del_sta);
Krunal Sonie50ff452017-10-11 18:23:55 -07005421 } else if (!rsp_requested &&
5422 (del_sta->status != QDF_STATUS_SUCCESS)) {
5423 WMA_LOGD(FL("Release del_sta mem vdev_id %d status %d"),
5424 del_sta->smesessionId, del_sta->status);
5425 qdf_mem_free(del_sta);
Krishna Kumaar Natarajan70133f02016-02-03 14:35:48 -08005426 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005427 break;
Deepak Dhamdherea6d2f4c2016-06-04 00:24:52 -07005428 case BSS_OPERATIONAL_MODE_NDI:
5429 wma_delete_sta_req_ndi_mode(wma, del_sta);
5430 break;
Varun Reddy Yeturu33894272017-10-27 15:37:31 -07005431 default:
5432 WMA_LOGE(FL("Incorrect oper mode %d"), oper_mode);
5433 qdf_mem_free(del_sta);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005434 }
5435
5436#ifdef QCA_IBSS_SUPPORT
5437 /* adjust heart beat thresold timer value for
5438 * detecting ibss peer departure
5439 */
5440 if (oper_mode == BSS_OPERATIONAL_MODE_IBSS)
5441 wma_adjust_ibss_heart_beat_timer(wma, smesession_id, -1);
5442#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005443}
5444
5445/**
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005446 * wma_delete_bss_ho_fail() - process delete bss request for handoff failure
5447 * @wma: wma handle
5448 * @params: del bss parameters
5449 *
5450 * Delete BSS in case of ROAM_HO_FAIL processing is handled separately in
5451 * this routine. It needs to be done without sending any commands to firmware
5452 * because firmware has already stopped and deleted peer and vdev is down.
Jeff Johnsonc97816c2018-05-12 17:13:23 -07005453 * Relevant logic is aggregated from other routines. It changes the host
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005454 * data structures without sending VDEV_STOP, PEER_FLUSH_TIDS, PEER_DELETE
5455 * and VDEV_DOWN commands to firmware.
5456 *
5457 * Return: none
5458 */
5459void wma_delete_bss_ho_fail(tp_wma_handle wma, tpDeleteBssParams params)
5460{
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08005461 struct cdp_pdev *pdev;
Leo Chang96464902016-10-28 11:10:54 -07005462 void *peer = NULL;
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005463 QDF_STATUS status = QDF_STATUS_SUCCESS;
5464 uint8_t peer_id;
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08005465 struct cdp_vdev *txrx_vdev = NULL;
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005466 struct wma_txrx_node *iface;
Leo Chang96464902016-10-28 11:10:54 -07005467 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005468
5469 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
5470
5471 if (NULL == pdev) {
5472 WMA_LOGE("%s:Unable to get TXRX context", __func__);
5473 goto fail_del_bss_ho_fail;
5474 }
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005475
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08005476 peer = cdp_peer_find_by_addr(soc,
5477 pdev,
5478 params->bssid, &peer_id);
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005479 if (!peer) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07005480 WMA_LOGE("%s: Failed to find peer %pM", __func__,
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005481 params->bssid);
5482 status = QDF_STATUS_E_FAILURE;
5483 goto fail_del_bss_ho_fail;
5484 }
5485
5486 iface = &wma->interfaces[params->smesessionId];
5487 if (!iface || !iface->handle) {
5488 WMA_LOGE("%s vdev id %d is already deleted",
5489 __func__, params->smesessionId);
5490 goto fail_del_bss_ho_fail;
5491 }
5492 qdf_mem_zero(iface->bssid, IEEE80211_ADDR_LEN);
5493
5494 txrx_vdev = wma_find_vdev_by_id(wma, params->smesessionId);
5495 if (!txrx_vdev) {
5496 WMA_LOGE("%s:Invalid vdev handle", __func__);
5497 status = QDF_STATUS_E_FAILURE;
5498 goto fail_del_bss_ho_fail;
5499 }
5500
5501 /* Free the allocated stats response buffer for the the session */
5502 if (iface->stats_rsp) {
5503 qdf_mem_free(iface->stats_rsp);
5504 iface->stats_rsp = NULL;
5505 }
5506
5507 if (iface->psnr_req) {
5508 qdf_mem_free(iface->psnr_req);
5509 iface->psnr_req = NULL;
5510 }
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +05305511
5512 if (iface->rcpi_req) {
5513 struct sme_rcpi_req *rcpi_req = iface->rcpi_req;
5514
5515 iface->rcpi_req = NULL;
5516 qdf_mem_free(rcpi_req);
5517 }
5518
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +05305519 if (iface->roam_scan_stats_req) {
5520 struct sir_roam_scan_stats *roam_scan_stats_req =
5521 iface->roam_scan_stats_req;
5522
5523 iface->roam_scan_stats_req = NULL;
5524 qdf_mem_free(roam_scan_stats_req);
5525 }
5526
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005527 qdf_mem_zero(&iface->ns_offload_req,
5528 sizeof(iface->ns_offload_req));
5529 qdf_mem_zero(&iface->arp_offload_req,
5530 sizeof(iface->arp_offload_req));
5531
5532 WMA_LOGD("%s, vdev_id: %d, pausing tx_ll_queue for VDEV_STOP (del_bss)",
5533 __func__, params->smesessionId);
Leo Chang96464902016-10-28 11:10:54 -07005534 cdp_fc_vdev_pause(soc, iface->handle,
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005535 OL_TXQ_PAUSE_REASON_VDEV_STOP);
Mukul Sharma6411bb82017-03-01 15:57:07 +05305536 wma_vdev_set_pause_bit(params->smesessionId, PAUSE_TYPE_HOST);
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005537
Leo Chang96464902016-10-28 11:10:54 -07005538 cdp_fc_vdev_flush(soc, iface->handle);
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005539 WMA_LOGD("%s, vdev_id: %d, un-pausing tx_ll_queue for VDEV_STOP rsp",
5540 __func__, params->smesessionId);
Leo Chang96464902016-10-28 11:10:54 -07005541 cdp_fc_vdev_unpause(soc, iface->handle,
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005542 OL_TXQ_PAUSE_REASON_VDEV_STOP);
Mukul Sharma6411bb82017-03-01 15:57:07 +05305543 wma_vdev_clear_pause_bit(params->smesessionId, PAUSE_TYPE_HOST);
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005544 qdf_atomic_set(&iface->bss_status, WMA_BSS_STATUS_STOPPED);
5545 WMA_LOGD("%s: (type %d subtype %d) BSS is stopped",
5546 __func__, iface->type, iface->sub_type);
Mukul Sharmaf9047232017-03-02 16:58:56 +05305547 wma_vdev_set_mlme_state(wma, params->smesessionId, WLAN_VDEV_S_STOP);
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005548 params->status = QDF_STATUS_SUCCESS;
5549 if (!iface->peer_count) {
5550 WMA_LOGE("%s: Can't remove peer with peer_addr %pM vdevid %d peer_count %d",
5551 __func__, params->bssid, params->smesessionId,
5552 iface->peer_count);
5553 goto fail_del_bss_ho_fail;
5554 }
5555
Sravan Kumar Kairamd431e5b2018-06-12 20:07:29 +05305556 if (peer) {
5557 WMA_LOGD("%s: vdev %pK is detaching peer:%pK peer_addr %pM to vdev_id %d, peer_count - %d",
5558 __func__, txrx_vdev, peer, params->bssid,
5559 params->smesessionId, iface->peer_count);
Lin Bai973e6922018-01-08 17:59:19 +08005560 cdp_peer_delete(soc, peer, 1 << CDP_PEER_DELETE_NO_SPECIAL);
gaurank kathpalia89d3c322018-06-21 11:45:32 +05305561 wma_remove_objmgr_peer(wma, params->smesessionId,
5562 params->bssid);
Sravan Kumar Kairamd431e5b2018-06-12 20:07:29 +05305563 }
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005564 iface->peer_count--;
Vignesh Viswanathanba40f4b2018-06-26 14:20:27 +05305565
Jeff Johnsonadba3962017-09-18 08:12:35 -07005566 WMA_LOGI("%s: Removed peer %pK with peer_addr %pM vdevid %d peer_count %d",
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005567 __func__, peer, params->bssid, params->smesessionId,
5568 iface->peer_count);
5569fail_del_bss_ho_fail:
5570 params->status = status;
Abhishek Singh2d775fd2017-08-18 10:51:33 +05305571 wma_send_msg_high_priority(wma, WMA_DELETE_BSS_HO_FAIL_RSP,
5572 (void *)params, 0);
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005573}
5574
Sandeep Puligillaf22263c2017-08-28 13:15:15 -07005575/**
5576 * wma_wait_tx_complete() - Wait till tx packets are drained
5577 * @wma: wma handle
5578 * @session_id: vdev id
5579 *
5580 * Return: none
5581 */
5582static void wma_wait_tx_complete(tp_wma_handle wma,
5583 uint32_t session_id)
5584{
5585 struct cdp_pdev *pdev;
5586 uint8_t max_wait_iterations = 0;
5587 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
5588
5589 if (!wma->interfaces[session_id].is_vdev_valid) {
5590 WMA_LOGE("%s: Vdev is not valid: %d",
5591 __func__, session_id);
5592 return;
5593 }
5594
5595 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Varun Reddy Yeturu81d0b372017-09-19 14:41:19 -07005596 if (pdev == NULL) {
5597 WMA_LOGE("%s: pdev is not valid: %d",
5598 __func__, session_id);
5599 return;
5600 }
Sandeep Puligillaf22263c2017-08-28 13:15:15 -07005601 max_wait_iterations =
5602 wma->interfaces[session_id].delay_before_vdev_stop /
5603 WMA_TX_Q_RECHECK_TIMER_WAIT;
5604
5605 while (cdp_get_tx_pending(soc, pdev) && max_wait_iterations) {
5606 WMA_LOGW(FL("Waiting for outstanding packet to drain."));
Nachiket Kukade0396b732017-11-14 16:35:16 +05305607 qdf_wait_for_event_completion(&wma->tx_queue_empty_event,
Sandeep Puligillaf22263c2017-08-28 13:15:15 -07005608 WMA_TX_Q_RECHECK_TIMER_WAIT);
5609 max_wait_iterations--;
5610 }
5611}
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005612/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005613 * wma_delete_bss() - process delete bss request from upper layer
5614 * @wma: wma handle
5615 * @params: del bss parameters
5616 *
5617 * Return: none
5618 */
5619void wma_delete_bss(tp_wma_handle wma, tpDeleteBssParams params)
5620{
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08005621 struct cdp_pdev *pdev;
Leo Chang96464902016-10-28 11:10:54 -07005622 void *peer = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005623 struct wma_target_req *msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305624 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005625 uint8_t peer_id;
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08005626 struct cdp_vdev *txrx_vdev = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005627 bool roam_synch_in_progress = false;
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005628 struct wma_txrx_node *iface;
Leo Chang96464902016-10-28 11:10:54 -07005629 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005630
Anurag Chouhan6d760662016-02-20 16:05:43 +05305631 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005632
5633 if (NULL == pdev) {
5634 WMA_LOGE("%s:Unable to get TXRX context", __func__);
5635 goto out;
5636 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005637 if (wma_is_vdev_in_ibss_mode(wma, params->smesessionId))
5638 /* in rome ibss case, self mac is used to create the bss peer */
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08005639 peer = cdp_peer_find_by_addr(soc,
5640 pdev,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005641 wma->interfaces[params->smesessionId].addr,
5642 &peer_id);
Deepak Dhamdhere13983f22016-05-31 19:06:09 -07005643 else if (WMA_IS_VDEV_IN_NDI_MODE(wma->interfaces,
5644 params->smesessionId))
5645 /* In ndi case, self mac is used to create the self peer */
Leo Chang96464902016-10-28 11:10:54 -07005646 peer = cdp_peer_find_by_addr(soc, pdev,
Deepak Dhamdhere13983f22016-05-31 19:06:09 -07005647 wma->interfaces[params->smesessionId].addr,
5648 &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005649 else
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08005650 peer = cdp_peer_find_by_addr(soc, pdev,
5651 params->bssid,
5652 &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005653
5654 if (!peer) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07005655 WMA_LOGE("%s: Failed to find peer %pM", __func__,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005656 params->bssid);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305657 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005658 goto out;
5659 }
5660
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305661 qdf_mem_zero(wma->interfaces[params->smesessionId].bssid,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005662 IEEE80211_ADDR_LEN);
5663
5664 txrx_vdev = wma_find_vdev_by_id(wma, params->smesessionId);
5665 if (!txrx_vdev) {
5666 WMA_LOGE("%s:Invalid vdev handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305667 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005668 goto out;
5669 }
5670
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005671 iface = &wma->interfaces[params->smesessionId];
5672 if (!iface || !iface->handle) {
5673 WMA_LOGE("%s vdev id %d is already deleted",
5674 __func__, params->smesessionId);
5675 goto out;
5676 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005677 /*Free the allocated stats response buffer for the the session */
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005678 if (iface->stats_rsp) {
5679 qdf_mem_free(iface->stats_rsp);
5680 iface->stats_rsp = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005681 }
5682
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005683 if (iface->psnr_req) {
5684 qdf_mem_free(iface->psnr_req);
5685 iface->psnr_req = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005686 }
5687
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +05305688 if (iface->rcpi_req) {
5689 struct sme_rcpi_req *rcpi_req = iface->rcpi_req;
5690
5691 iface->rcpi_req = NULL;
5692 qdf_mem_free(rcpi_req);
5693 }
5694
Rajeev Kumar Sirasanagandla4f20b672018-03-12 13:52:50 +05305695 if (iface->roam_scan_stats_req) {
5696 struct sir_roam_scan_stats *roam_scan_stats_req =
5697 iface->roam_scan_stats_req;
5698
5699 iface->roam_scan_stats_req = NULL;
5700 qdf_mem_free(roam_scan_stats_req);
5701 }
5702
Leo Chang96464902016-10-28 11:10:54 -07005703 if (wlan_op_mode_ibss == cdp_get_opmode(soc, txrx_vdev))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005704 wma->ibss_started = 0;
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07005705
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08005706 if (wma_is_roam_synch_in_progress(wma, params->smesessionId)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005707 roam_synch_in_progress = true;
5708 WMA_LOGD("LFR3:%s: Setting vdev_up to FALSE for session %d",
5709 __func__, params->smesessionId);
Mukul Sharmaf9047232017-03-02 16:58:56 +05305710 wma_vdev_set_mlme_state(wma, params->smesessionId,
5711 WLAN_VDEV_S_STOP);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005712 goto detach_peer;
5713 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005714 msg = wma_fill_vdev_req(wma, params->smesessionId, WMA_DELETE_BSS_REQ,
5715 WMA_TARGET_REQ_TYPE_VDEV_STOP, params,
5716 WMA_VDEV_STOP_REQUEST_TIMEOUT);
5717 if (!msg) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07005718 WMA_LOGE("%s: Failed to fill vdev request for vdev_id %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005719 __func__, params->smesessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305720 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005721 goto detach_peer;
5722 }
5723
Yeshwanth Sriram Guntukacbe61442018-08-23 18:08:44 +05305724 WMA_LOGD(FL("Outstanding msdu packets: %d"),
Leo Chang96464902016-10-28 11:10:54 -07005725 cdp_get_tx_pending(soc, pdev));
Sandeep Puligillaf22263c2017-08-28 13:15:15 -07005726 wma_wait_tx_complete(wma, params->smesessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005727
Leo Chang96464902016-10-28 11:10:54 -07005728 if (cdp_get_tx_pending(soc, pdev)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005729 WMA_LOGW(FL("Outstanding msdu packets before VDEV_STOP : %d"),
Leo Chang96464902016-10-28 11:10:54 -07005730 cdp_get_tx_pending(soc, pdev));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005731 }
5732
5733 WMA_LOGD("%s, vdev_id: %d, pausing tx_ll_queue for VDEV_STOP (del_bss)",
5734 __func__, params->smesessionId);
Mukul Sharma6411bb82017-03-01 15:57:07 +05305735 wma_vdev_set_pause_bit(params->smesessionId, PAUSE_TYPE_HOST);
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08005736 cdp_fc_vdev_pause(soc,
5737 wma->interfaces[params->smesessionId].handle,
5738 OL_TXQ_PAUSE_REASON_VDEV_STOP);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005739
Dustin Brownbf6d16b2017-03-03 11:41:05 -08005740 if (wma_send_vdev_stop_to_fw(wma, params->smesessionId)) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07005741 WMA_LOGE("%s: %d Failed to send vdev stop", __func__, __LINE__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005742 wma_remove_vdev_req(wma, params->smesessionId,
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005743 WMA_TARGET_REQ_TYPE_VDEV_STOP);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305744 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005745 goto detach_peer;
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005746 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005747 WMA_LOGD("%s: bssid %pM vdev_id %d",
5748 __func__, params->bssid, params->smesessionId);
5749 return;
5750detach_peer:
5751 wma_remove_peer(wma, params->bssid, params->smesessionId, peer,
5752 roam_synch_in_progress);
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08005753 if (wma_is_roam_synch_in_progress(wma, params->smesessionId))
5754 return;
5755
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005756out:
5757 params->status = status;
Abhishek Singh2d775fd2017-08-18 10:51:33 +05305758 wma_send_msg_high_priority(wma, WMA_DELETE_BSS_RSP, (void *)params, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005759}
5760
5761/**
5762 * wma_find_ibss_vdev() - This function finds vdev_id based on input type
5763 * @wma: wma handle
5764 * @type: vdev type
5765 *
5766 * Return: vdev id
5767 */
5768int32_t wma_find_vdev_by_type(tp_wma_handle wma, int32_t type)
5769{
5770 int32_t vdev_id = 0;
5771 struct wma_txrx_node *intf = wma->interfaces;
5772
5773 for (vdev_id = 0; vdev_id < wma->max_bssid; vdev_id++) {
5774 if (NULL != intf) {
5775 if (intf[vdev_id].type == type)
5776 return vdev_id;
5777 }
5778 }
5779
5780 return -EFAULT;
5781}
5782
5783/**
5784 * wma_set_vdev_intrabss_fwd() - set intra_fwd value to wni_in.
5785 * @wma_handle: wma handle
5786 * @pdis_intra_fwd: Pointer to DisableIntraBssFwd struct
5787 *
5788 * Return: none
5789 */
5790void wma_set_vdev_intrabss_fwd(tp_wma_handle wma_handle,
5791 tpDisableIntraBssFwd pdis_intra_fwd)
5792{
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08005793 struct cdp_vdev *txrx_vdev;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07005794
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005795 WMA_LOGD("%s:intra_fwd:vdev(%d) intrabss_dis=%s",
5796 __func__, pdis_intra_fwd->sessionId,
5797 (pdis_intra_fwd->disableintrabssfwd ? "true" : "false"));
5798
5799 txrx_vdev = wma_handle->interfaces[pdis_intra_fwd->sessionId].handle;
Leo Chang96464902016-10-28 11:10:54 -07005800 cdp_cfg_vdev_rx_set_intrabss_fwd(cds_get_context(QDF_MODULE_ID_SOC),
5801 txrx_vdev,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005802 pdis_intra_fwd->disableintrabssfwd);
5803}
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07005804
5805void wma_store_pdev(void *wma_ctx, struct wlan_objmgr_pdev *pdev)
5806{
5807 tp_wma_handle wma = (tp_wma_handle)wma_ctx;
5808 QDF_STATUS status;
5809
5810 status = wlan_objmgr_pdev_try_get_ref(pdev, WLAN_LEGACY_WMA_ID);
5811 if (QDF_STATUS_SUCCESS != status) {
5812 wma->pdev = NULL;
5813 return;
5814 }
5815
5816 wma->pdev = pdev;
5817}
5818
lifeng7c607dd2017-02-21 21:16:49 +08005819/**
5820 * wma_vdev_reset_beacon_interval_timer() - reset beacon interval back
5821 * to its original value after the channel switch.
5822 *
5823 * @data: data
5824 *
5825 * Return: void
5826 */
5827static void wma_vdev_reset_beacon_interval_timer(void *data)
5828{
5829 tp_wma_handle wma;
5830 struct wma_beacon_interval_reset_req *req =
5831 (struct wma_beacon_interval_reset_req *)data;
5832 uint16_t beacon_interval = req->interval;
5833 uint8_t vdev_id = req->vdev_id;
5834
5835 wma = (tp_wma_handle)cds_get_context(QDF_MODULE_ID_WMA);
5836 if (NULL == wma) {
5837 WMA_LOGE("%s: Failed to get wma", __func__);
5838 goto end;
5839 }
5840
5841 /* Change the beacon interval back to its original value */
5842 WMA_LOGE("%s: Change beacon interval back to %d",
5843 __func__, beacon_interval);
5844 wma_update_beacon_interval(wma, vdev_id, beacon_interval);
5845
5846end:
5847 qdf_timer_stop(&req->event_timeout);
5848 qdf_timer_free(&req->event_timeout);
5849 qdf_mem_free(req);
5850}
5851
5852int wma_fill_beacon_interval_reset_req(tp_wma_handle wma, uint8_t vdev_id,
5853 uint16_t beacon_interval, uint32_t timeout)
5854{
5855 struct wma_beacon_interval_reset_req *req;
5856
5857 req = qdf_mem_malloc(sizeof(*req));
5858 if (!req) {
5859 WMA_LOGE("%s: Failed to allocate memory for beacon_interval_reset_req vdev %d",
5860 __func__, vdev_id);
5861 return -ENOMEM;
5862 }
5863
5864 WMA_LOGD("%s: vdev_id %d ", __func__, vdev_id);
5865 req->vdev_id = vdev_id;
5866 req->interval = beacon_interval;
5867 qdf_timer_init(NULL, &req->event_timeout,
5868 wma_vdev_reset_beacon_interval_timer, req, QDF_TIMER_TYPE_SW);
5869 qdf_timer_start(&req->event_timeout, timeout);
5870
5871 return 0;
5872}
Paul Zhang99fe8842017-12-08 14:43:46 +08005873
5874QDF_STATUS wma_set_wlm_latency_level(void *wma_ptr,
5875 struct wlm_latency_level_param *latency_params)
5876{
5877 QDF_STATUS ret;
5878 tp_wma_handle wma = (tp_wma_handle)wma_ptr;
5879
5880 WMA_LOGD("%s: set latency level %d, flags flag 0x%x",
5881 __func__, latency_params->wlm_latency_level,
5882 latency_params->wlm_latency_flags);
5883
5884 ret = wmi_unified_wlm_latency_level_cmd(wma->wmi_handle,
5885 latency_params);
5886 if (QDF_IS_STATUS_ERROR(ret))
5887 WMA_LOGW("Failed to set latency level");
5888
5889 return ret;
5890}