blob: 41fda58d1204c61127b735649fb86f0467f14697 [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
Dustin Brownec2c92e2017-07-26 11:13:49 -0700469 wma_vdev_deinit(iface);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530470 qdf_mem_zero(iface, sizeof(*iface));
Dustin Brownec2c92e2017-07-26 11:13:49 -0700471 wma_vdev_init(iface);
472
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530473 param->status = QDF_STATUS_SUCCESS;
Abhishek Singhc614ec42017-04-25 16:17:34 +0530474 wma_send_del_sta_self_resp(param);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800475}
476
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800477
478/**
479 * wma_self_peer_remove() - Self peer remove handler
480 * @wma: wma handle
481 * @del_sta_self_req_param: vdev id
482 * @generate_vdev_rsp: request type
483 *
484 * Return: success if peer delete command sent to firmware, else failure.
485 */
486
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530487static QDF_STATUS wma_self_peer_remove(tp_wma_handle wma_handle,
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800488 struct del_sta_self_params *del_sta_self_req_param,
489 uint8_t generate_vdev_rsp)
490{
Leo Chang96464902016-10-28 11:10:54 -0700491 void *peer;
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -0800492 struct cdp_pdev *pdev;
Krunal Soni1b5debd2018-02-27 15:34:30 -0800493 QDF_STATUS qdf_status;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800494 uint8_t peer_id;
495 uint8_t vdev_id = del_sta_self_req_param->session_id;
496 struct wma_target_req *msg = NULL;
497 struct del_sta_self_rsp_params *sta_self_wmi_rsp;
Leo Chang96464902016-10-28 11:10:54 -0700498 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800499
Srinivas Girigowdada0e8482017-03-19 23:15:45 -0700500 WMA_LOGD("P2P Device: removing self peer %pM",
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800501 del_sta_self_req_param->self_mac_addr);
502
Anurag Chouhan6d760662016-02-20 16:05:43 +0530503 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800504 if (NULL == pdev) {
505 WMA_LOGE("%s: Failed to get pdev", __func__);
Krunal Soni1b5debd2018-02-27 15:34:30 -0800506 qdf_status = QDF_STATUS_E_FAULT;
507 goto error;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800508 }
509
Leo Chang96464902016-10-28 11:10:54 -0700510 peer = cdp_peer_find_by_addr(soc, pdev,
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -0800511 del_sta_self_req_param->self_mac_addr,
512 &peer_id);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800513 if (!peer) {
514 WMA_LOGE("%s Failed to find peer %pM", __func__,
515 del_sta_self_req_param->self_mac_addr);
Krunal Soni40c5e442018-02-28 11:40:15 -0800516 qdf_status = QDF_STATUS_E_FAULT;
Krunal Soni1b5debd2018-02-27 15:34:30 -0800517 goto error;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800518 }
519 wma_remove_peer(wma_handle,
520 del_sta_self_req_param->self_mac_addr,
521 vdev_id, peer, false);
522
Sourav Mohapatra89c85d12017-12-01 09:17:54 +0530523 if (wmi_service_enabled(wma_handle->wmi_handle,
524 wmi_service_sync_delete_cmds)) {
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800525 sta_self_wmi_rsp =
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530526 qdf_mem_malloc(sizeof(struct del_sta_self_rsp_params));
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800527 if (sta_self_wmi_rsp == NULL) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -0700528 WMA_LOGE(FL("Failed to allocate memory"));
Krunal Soni1b5debd2018-02-27 15:34:30 -0800529 qdf_status = QDF_STATUS_E_NOMEM;
530 goto error;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800531 }
532 sta_self_wmi_rsp->self_sta_param = del_sta_self_req_param;
533 sta_self_wmi_rsp->generate_rsp = generate_vdev_rsp;
534 msg = wma_fill_hold_req(wma_handle, vdev_id,
535 WMA_DELETE_STA_REQ,
536 WMA_DEL_P2P_SELF_STA_RSP_START,
537 sta_self_wmi_rsp,
538 WMA_DELETE_STA_TIMEOUT);
539 if (!msg) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -0700540 WMA_LOGE(FL("Failed to allocate request for vdev_id %d"),
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800541 vdev_id);
542 wma_remove_req(wma_handle, vdev_id,
543 WMA_DEL_P2P_SELF_STA_RSP_START);
Krunal Soni1b5debd2018-02-27 15:34:30 -0800544 qdf_status = QDF_STATUS_E_FAILURE;
545 goto error;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800546 }
547 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530548 return QDF_STATUS_SUCCESS;
Krunal Soni1b5debd2018-02-27 15:34:30 -0800549error:
550 return qdf_status;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800551}
552
Jingxiang Gedf9292a2017-12-11 13:30:44 +0800553static void
554wma_cdp_vdev_detach(ol_txrx_soc_handle soc,
555 tp_wma_handle wma_handle,
556 uint8_t vdev_id)
557{
558 struct wma_txrx_node *iface = &wma_handle->interfaces[vdev_id];
559
560 cdp_vdev_detach(soc,
561 iface->handle, NULL, NULL);
562 iface->handle = NULL;
563 iface->is_vdev_valid = false;
564}
565
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530566static QDF_STATUS wma_handle_vdev_detach(tp_wma_handle wma_handle,
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800567 struct del_sta_self_params *del_sta_self_req_param,
568 uint8_t generate_rsp)
569{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530570 QDF_STATUS status = QDF_STATUS_SUCCESS;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800571 uint8_t vdev_id = del_sta_self_req_param->session_id;
572 struct wma_txrx_node *iface = &wma_handle->interfaces[vdev_id];
573 struct wma_target_req *msg = NULL;
Leo Chang96464902016-10-28 11:10:54 -0700574 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800575
Nishank Aggarwala13b61d2016-12-01 12:53:58 +0530576 if (!soc) {
577 WMA_LOGE("%s:SOC context is NULL", __func__);
578 status = QDF_STATUS_E_FAILURE;
579 goto out;
580 }
581
Min Liua9df1ff2018-02-09 02:44:13 +0800582
Govind Singhd76a5b02016-03-08 15:12:14 +0530583 status = wmi_unified_vdev_delete_send(wma_handle->wmi_handle, vdev_id);
584 if (QDF_IS_STATUS_ERROR(status)) {
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800585 WMA_LOGE("Unable to remove an interface");
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800586 goto out;
587 }
588
Jeff Johnsonadba3962017-09-18 08:12:35 -0700589 WMA_LOGD("vdev_id:%hu vdev_hdl:%pK", vdev_id, iface->handle);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800590 if (!generate_rsp) {
591 WMA_LOGE("Call txrx detach w/o callback for vdev %d", vdev_id);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800592 goto out;
593 }
594
595 iface->del_staself_req = del_sta_self_req_param;
596 msg = wma_fill_vdev_req(wma_handle, vdev_id, WMA_DEL_STA_SELF_REQ,
597 WMA_TARGET_REQ_TYPE_VDEV_DEL, iface, 6000);
598 if (!msg) {
599 WMA_LOGE("%s: Failed to fill vdev request for vdev_id %d",
600 __func__, vdev_id);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530601 status = QDF_STATUS_E_NOMEM;
Abhinav Kumar0a846132018-08-09 11:49:46 +0530602 iface->del_staself_req = NULL;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800603 goto out;
604 }
605
606 /* Acquire wake lock only when you expect a response from firmware */
Sourav Mohapatra89c85d12017-12-01 09:17:54 +0530607 if (wmi_service_enabled(wma_handle->wmi_handle,
608 wmi_service_sync_delete_cmds)) {
Dustin Brownec2c92e2017-07-26 11:13:49 -0700609 wma_acquire_wakelock(&wma_handle->wmi_cmd_rsp_wake_lock,
610 WMA_FW_RSP_EVENT_WAKE_LOCK_DURATION);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800611 }
612 WMA_LOGD("Call txrx detach with callback for vdev %d", vdev_id);
Jingxiang Gedf9292a2017-12-11 13:30:44 +0800613 wma_cdp_vdev_detach(soc, wma_handle, vdev_id);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800614
615 /*
616 * send the response immediately if WMI_SERVICE_SYNC_DELETE_CMDS
617 * service is not supported by firmware
618 */
Sourav Mohapatra89c85d12017-12-01 09:17:54 +0530619 if (!wmi_service_enabled(wma_handle->wmi_handle,
620 wmi_service_sync_delete_cmds))
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800621 wma_vdev_detach_callback(iface);
622 return status;
623out:
Jingxiang Gedf9292a2017-12-11 13:30:44 +0800624 WMA_LOGE("Call txrx detach callback for vdev %d, generate_rsp %u",
625 vdev_id, generate_rsp);
626 wma_cdp_vdev_detach(soc, wma_handle, vdev_id);
627
Dustin Brown35b61f62017-08-31 16:03:32 -0700628 wma_vdev_deinit(iface);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530629 qdf_mem_zero(iface, sizeof(*iface));
Dustin Brown35b61f62017-08-31 16:03:32 -0700630 wma_vdev_init(iface);
631
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800632 del_sta_self_req_param->status = status;
Abhishek Singhc614ec42017-04-25 16:17:34 +0530633 if (generate_rsp)
634 wma_send_del_sta_self_resp(del_sta_self_req_param);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800635 return status;
636}
Jiachao Wu2c42c222018-01-15 18:13:19 +0800637
638/**
Jiachao Wu641760e2018-01-21 12:11:31 +0800639 * wma_peer_remove_for_vdev_callback() - remove peer for vdev when SSR
640 * @handle: wma handle
641 * @bssid: mac address
642 * @vdev_id: vdev id
643 * @peer: peer ptr
644 *
645 * Wapper wma_remove_peer for callback, this function will remove peer
646 * without waiting for peer unmap event.
647 * Return: none
648 */
649static void wma_peer_remove_for_vdev_callback(void *handle, uint8_t *bssid,
650 uint8_t vdev_id, void *peer)
651{
652 wma_remove_peer(handle, bssid, vdev_id, peer, true);
653}
654
655/**
Jiachao Wu2c42c222018-01-15 18:13:19 +0800656 * wma_force_vdev_cleanup() - Cleanup vdev resource when SSR
657 * @wma_handle: WMA handle
658 * @vdev_id: vdev ID
659 *
660 * Return: none
661 */
662static void wma_force_vdev_cleanup(tp_wma_handle wma_handle, uint8_t vdev_id)
663{
664 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
665 struct wma_txrx_node *iface = &wma_handle->interfaces[vdev_id];
Jiachao Wu641760e2018-01-21 12:11:31 +0800666 struct cdp_pdev *pdev;
667 struct cdp_vdev *vdev;
Jiachao Wu2c42c222018-01-15 18:13:19 +0800668
669 WMA_LOGE("SSR: force cleanup vdev(%d) resouce", vdev_id);
670 iface->vdev_active = false;
Jiachao Wu641760e2018-01-21 12:11:31 +0800671
672 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
673 if (!pdev) {
674 WMA_LOGE("%s: Failed to get pdev", __func__);
675 goto VDEV_DETACH;
676 }
677
678 vdev = cdp_get_vdev_from_vdev_id(soc, pdev, vdev_id);
679 if (!vdev) {
680 WMA_LOGE("%s: Failed to get vdev (%d)", __func__, vdev_id);
681 goto VDEV_DETACH;
682 }
683
684 /* force remove all peer for vdev */
685 cdp_peer_remove_for_vdev_no_lock(soc, vdev,
686 wma_peer_remove_for_vdev_callback,
687 wma_handle);
688
689VDEV_DETACH:
Jiachao Wu2c42c222018-01-15 18:13:19 +0800690 wma_cdp_vdev_detach(soc, wma_handle, vdev_id);
691}
692
Dustin Brown04823992018-03-29 13:27:01 -0700693static bool wma_vdev_uses_self_peer(uint32_t vdev_type, uint32_t vdev_subtype)
694{
695 switch (vdev_type) {
696 case WMI_VDEV_TYPE_AP:
697 return vdev_subtype == WMI_UNIFIED_VDEV_SUBTYPE_P2P_DEVICE;
698
699 case WMI_VDEV_TYPE_MONITOR:
Dustin Brown04823992018-03-29 13:27:01 -0700700 case WMI_VDEV_TYPE_OCB:
701 return true;
702
703 default:
704 return false;
705 }
706}
707
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800708/**
Bala Venkatesh110b03e2018-07-10 16:02:08 +0530709 * wma_remove_objmgr_peer() - remove objmgr peer information from host driver
710 * @wma: wma handle
711 * @vdev_id: vdev id
712 * @peer_addr: peer mac address
713 *
714 * Return: none
715 */
716static void wma_remove_objmgr_peer(tp_wma_handle wma, uint8_t vdev_id,
717 uint8_t *peer_addr)
718{
719 struct wlan_objmgr_psoc *psoc;
720 struct wlan_objmgr_peer *obj_peer;
721 struct wlan_objmgr_vdev *obj_vdev;
722 struct wlan_objmgr_pdev *obj_pdev;
723 uint8_t pdev_id = 0;
724
725 psoc = wma->psoc;
726 if (!psoc) {
727 WMA_LOGE("%s:PSOC is NULL", __func__);
728 return;
729 }
730
731 obj_vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
732 WLAN_LEGACY_WMA_ID);
733 if (!obj_vdev) {
734 WMA_LOGE("Obj vdev not found. Unable to remove peer");
735 return;
736 }
737 obj_pdev = wlan_vdev_get_pdev(obj_vdev);
738 pdev_id = wlan_objmgr_pdev_get_pdev_id(obj_pdev);
739 obj_peer = wlan_objmgr_get_peer(psoc, pdev_id, peer_addr,
740 WLAN_LEGACY_WMA_ID);
741 if (obj_peer) {
742 wlan_objmgr_peer_obj_delete(obj_peer);
743 /* Unref to decrement ref happened in find_peer */
744 wlan_objmgr_peer_release_ref(obj_peer, WLAN_LEGACY_WMA_ID);
745 WMA_LOGD("Peer %pM deleted", peer_addr);
746 } else {
747 WMA_LOGE("Peer %pM not found", peer_addr);
748 }
749
750 wlan_objmgr_vdev_release_ref(obj_vdev, WLAN_LEGACY_WMA_ID);
751}
752
753/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800754 * wma_vdev_detach() - send vdev delete command to fw
755 * @wma_handle: wma handle
756 * @pdel_sta_self_req_param: del sta params
757 * @generateRsp: generate Response flag
758 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +0530759 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800760 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530761QDF_STATUS wma_vdev_detach(tp_wma_handle wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800762 struct del_sta_self_params *pdel_sta_self_req_param,
763 uint8_t generateRsp)
764{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530765 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800766 uint8_t vdev_id = pdel_sta_self_req_param->session_id;
767 struct wma_txrx_node *iface = &wma_handle->interfaces[vdev_id];
Kiran Kumar Lokere35577652017-07-14 02:06:56 -0700768 struct wma_target_req *req_msg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800769
Vignesh Viswanathan74f6fc12018-08-17 15:34:21 +0530770 if (!iface->handle) {
771 WMA_LOGE("handle of vdev_id %d is NULL vdev is already freed",
Jiachao Wu2c42c222018-01-15 18:13:19 +0800772 vdev_id);
773 goto send_rsp;
774 }
775
776 /*
Vignesh Viswanathan74f6fc12018-08-17 15:34:21 +0530777 * In SSR case or if FW is down, there is no need to destroy vdev in
778 * firmware since it has already asserted.
Jiachao Wu2c42c222018-01-15 18:13:19 +0800779 */
Vignesh Viswanathan74f6fc12018-08-17 15:34:21 +0530780 if (cds_is_driver_recovering() || !cds_is_target_ready()) {
Jiachao Wu2c42c222018-01-15 18:13:19 +0800781 wma_force_vdev_cleanup(wma_handle, vdev_id);
Bala Venkatesh110b03e2018-07-10 16:02:08 +0530782 /* Delete objmgr self peer of STA as part of SSR. */
783 if (iface->type == WMI_VDEV_TYPE_STA) {
784 wma_remove_objmgr_peer(wma_handle, vdev_id,
785 pdel_sta_self_req_param->self_mac_addr);
786 }
Jiachao Wu2c42c222018-01-15 18:13:19 +0800787 goto send_rsp;
788 }
789
Anurag Chouhan8e0ccd32016-02-19 15:30:20 +0530790 if (qdf_atomic_read(&iface->bss_status) == WMA_BSS_STATUS_STARTED) {
Kiran Kumar Lokere35577652017-07-14 02:06:56 -0700791 req_msg = wma_find_vdev_req(wma_handle, vdev_id,
Kiran Kumar Lokere20804162017-07-17 16:09:04 -0700792 WMA_TARGET_REQ_TYPE_VDEV_STOP, false);
Kiran Kumar Lokere35577652017-07-14 02:06:56 -0700793 if (!req_msg)
794 goto send_fail_rsp;
795 if (req_msg->msg_type != WMA_DELETE_BSS_REQ)
796 goto send_fail_rsp;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800797 WMA_LOGA("BSS is not yet stopped. Defering vdev(vdev id %x) deletion",
798 vdev_id);
799 iface->del_staself_req = pdel_sta_self_req_param;
Abhishek Singh0d74f9e2017-09-26 14:02:42 +0530800 iface->is_del_sta_defered = true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800801 return status;
802 }
Abhishek Singh0d74f9e2017-09-26 14:02:42 +0530803 iface->is_del_sta_defered = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800804
Dustin Brown04823992018-03-29 13:27:01 -0700805 if (wma_vdev_uses_self_peer(iface->type, iface->sub_type)) {
Krunal Soni1b5debd2018-02-27 15:34:30 -0800806 status = wma_self_peer_remove(wma_handle,
807 pdel_sta_self_req_param, generateRsp);
808 if ((status != QDF_STATUS_SUCCESS) && generateRsp) {
809 WMA_LOGE("can't remove selfpeer, send rsp session: %d",
810 vdev_id);
Krunal Soni40c5e442018-02-28 11:40:15 -0800811 if (!cds_is_driver_unloading()) {
812 WMA_LOGE("Trigger recovery for session: %d",
813 vdev_id);
814 goto send_fail_rsp;
815 } else {
816 WMA_LOGE("driver unload, free mem vdev_id: %d",
817 vdev_id);
818 goto send_rsp;
819 }
820 } else if (status != QDF_STATUS_SUCCESS) {
Krunal Soni1b5debd2018-02-27 15:34:30 -0800821 WMA_LOGE("can't remove selfpeer, free msg session: %d",
822 vdev_id);
823 qdf_mem_free(pdel_sta_self_req_param);
824 pdel_sta_self_req_param = NULL;
825 return status;
826 }
Sourav Mohapatra89c85d12017-12-01 09:17:54 +0530827 if (!wmi_service_enabled(wma_handle->wmi_handle,
828 wmi_service_sync_delete_cmds))
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800829 status = wma_handle_vdev_detach(wma_handle,
830 pdel_sta_self_req_param, generateRsp);
Dustin Brown04823992018-03-29 13:27:01 -0700831 } else {
Bala Venkatesh110b03e2018-07-10 16:02:08 +0530832 if (iface->type == WMI_VDEV_TYPE_STA) {
833 wma_remove_objmgr_peer(wma_handle, vdev_id,
834 pdel_sta_self_req_param->self_mac_addr);
835 }
Sandeep Puligilla19ddda22016-01-05 12:18:02 -0800836 status = wma_handle_vdev_detach(wma_handle,
837 pdel_sta_self_req_param, generateRsp);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800838 }
839
Arif Hussain380cfc72017-10-31 13:12:04 -0700840 if (QDF_IS_STATUS_SUCCESS(status))
841 iface->vdev_active = false;
842
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800843 return status;
Kiran Kumar Lokere35577652017-07-14 02:06:56 -0700844
845send_fail_rsp:
Dustin Brown83044c22018-08-13 15:00:44 -0700846 WMA_LOGE("rcvd del_self_sta without del_bss; vdev_id:%d", vdev_id);
847 cds_trigger_recovery(QDF_REASON_UNSPECIFIED);
Jiachao Wu2c42c222018-01-15 18:13:19 +0800848 status = QDF_STATUS_E_FAILURE;
Himanshu Agarwalfc4dab92017-12-28 21:46:29 +0530849
Jiachao Wu2c42c222018-01-15 18:13:19 +0800850send_rsp:
851 if (generateRsp) {
852 pdel_sta_self_req_param->status = status;
853 wma_send_del_sta_self_resp(pdel_sta_self_req_param);
854 } else {
855 qdf_mem_free(pdel_sta_self_req_param);
856 pdel_sta_self_req_param = NULL;
857 }
Kiran Kumar Lokere35577652017-07-14 02:06:56 -0700858 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800859}
860
861/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800862 * wma_vdev_start_rsp() - send vdev start response to upper layer
863 * @wma: wma handle
864 * @add_bss: add bss params
865 * @resp_event: response params
866 *
867 * Return: none
868 */
869static void wma_vdev_start_rsp(tp_wma_handle wma,
870 tpAddBssParams add_bss,
871 wmi_vdev_start_response_event_fixed_param *
872 resp_event)
873{
874 struct beacon_info *bcn;
Padma, Santhosh Kumar88104612017-04-10 18:49:12 +0530875 struct cdp_pdev *pdev;
876 void *peer = NULL;
877 uint8_t peer_id;
878 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800879
880#ifdef QCA_IBSS_SUPPORT
881 WMA_LOGD("%s: vdev start response received for %s mode", __func__,
882 add_bss->operMode ==
883 BSS_OPERATIONAL_MODE_IBSS ? "IBSS" : "non-IBSS");
884#endif /* QCA_IBSS_SUPPORT */
885
886 if (resp_event->status) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530887 add_bss->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800888 goto send_fail_resp;
889 }
890
891 if ((add_bss->operMode == BSS_OPERATIONAL_MODE_AP)
892#ifdef QCA_IBSS_SUPPORT
893 || (add_bss->operMode == BSS_OPERATIONAL_MODE_IBSS)
894#endif /* QCA_IBSS_SUPPORT */
895 ) {
896 wma->interfaces[resp_event->vdev_id].beacon =
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530897 qdf_mem_malloc(sizeof(struct beacon_info));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800898
899 bcn = wma->interfaces[resp_event->vdev_id].beacon;
900 if (!bcn) {
901 WMA_LOGE("%s: Failed alloc memory for beacon struct",
902 __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530903 add_bss->status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800904 goto send_fail_resp;
905 }
Nirav Shahcbc6d722016-03-01 16:24:53 +0530906 bcn->buf = qdf_nbuf_alloc(NULL, WMA_BCN_BUF_MAX_SIZE, 0,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800907 sizeof(uint32_t), 0);
908 if (!bcn->buf) {
909 WMA_LOGE("%s: No memory allocated for beacon buffer",
910 __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530911 qdf_mem_free(bcn);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530912 add_bss->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800913 goto send_fail_resp;
914 }
915 bcn->seq_no = MIN_SW_SEQ;
Anurag Chouhana37b5b72016-02-21 14:53:42 +0530916 qdf_spinlock_create(&bcn->lock);
Anurag Chouhan8e0ccd32016-02-19 15:30:20 +0530917 qdf_atomic_set(&wma->interfaces[resp_event->vdev_id].bss_status,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800918 WMA_BSS_STATUS_STARTED);
919 WMA_LOGD("%s: AP mode (type %d subtype %d) BSS is started",
920 __func__, wma->interfaces[resp_event->vdev_id].type,
921 wma->interfaces[resp_event->vdev_id].sub_type);
922
Jeff Johnsonadba3962017-09-18 08:12:35 -0700923 WMA_LOGD("%s: Allocated beacon struct %pK, template memory %pK",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800924 __func__, bcn, bcn->buf);
925 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530926 add_bss->status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800927 add_bss->bssIdx = resp_event->vdev_id;
928 add_bss->chainMask = resp_event->chain_mask;
929 if ((2 != resp_event->cfgd_rx_streams) ||
930 (2 != resp_event->cfgd_tx_streams)) {
931 add_bss->nss = 1;
932 }
933 add_bss->smpsMode = host_map_smps_mode(resp_event->smps_mode);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800934send_fail_resp:
Padma, Santhosh Kumar88104612017-04-10 18:49:12 +0530935 if (add_bss->status != QDF_STATUS_SUCCESS) {
936 WMA_LOGE("%s: ADD BSS failure %d", __func__, add_bss->status);
937
938 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
939 if (NULL == pdev)
940 WMA_LOGE("%s: Failed to get pdev", __func__);
941
942 if (pdev)
943 peer = cdp_peer_find_by_addr(soc, pdev,
944 add_bss->bssId, &peer_id);
945 if (!peer)
946 WMA_LOGE("%s Failed to find peer %pM", __func__,
947 add_bss->bssId);
948
949 if (peer)
950 wma_remove_peer(wma, add_bss->bssId,
951 resp_event->vdev_id, peer, false);
952 }
953
Abhishek Singh34c15642017-05-08 16:13:02 +0530954 /* Send vdev stop if vdev start was success */
955 if ((add_bss->status != QDF_STATUS_SUCCESS) &&
956 !resp_event->status)
957 if (wma_send_vdev_stop_to_fw(wma, resp_event->vdev_id))
958 WMA_LOGE("%s: %d Failed to send vdev stop", __func__, __LINE__);
959
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800960 WMA_LOGD("%s: Sending add bss rsp to umac(vdev %d status %d)",
961 __func__, resp_event->vdev_id, add_bss->status);
Abhishek Singh2d775fd2017-08-18 10:51:33 +0530962 wma_send_msg_high_priority(wma, WMA_ADD_BSS_RSP, (void *)add_bss, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800963}
964
965#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
966/**
967 * wma_find_mcc_ap() - finds if device is operating AP in MCC mode or not
968 * @wma: wma handle.
969 * @vdev_id: vdev ID of device for which MCC has to be checked
970 * @add: flag indicating if current device is added or deleted
971 *
972 * This function parses through all the interfaces in wma and finds if
973 * any of those devces are in MCC mode with AP. If such a vdev is found
974 * involved AP vdevs are sent WDA_UPDATE_Q2Q_IE_IND msg to update their
975 * beacon template to include Q2Q IE.
976 *
977 * Return: none
978 */
Tang Yingying523322d2017-01-17 23:28:43 +0800979static void wma_find_mcc_ap(tp_wma_handle wma, uint8_t vdev_id, bool add)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800980{
981 uint8_t i;
982 uint16_t prev_ch_freq = 0;
983 bool is_ap = false;
984 bool result = false;
985 uint8_t *ap_vdev_ids = NULL;
986 uint8_t num_ch = 0;
987
Anurag Chouhan600c3a02016-03-01 10:33:54 +0530988 ap_vdev_ids = qdf_mem_malloc(wma->max_bssid);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800989 if (!ap_vdev_ids)
990 return;
991
992 for (i = 0; i < wma->max_bssid; i++) {
993 ap_vdev_ids[i] = -1;
994 if (add == false && i == vdev_id)
995 continue;
996
Mukul Sharmaf9047232017-03-02 16:58:56 +0530997 if (wma_is_vdev_up(vdev_id) || (i == vdev_id && add)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800998 if (wma->interfaces[i].type == WMI_VDEV_TYPE_AP) {
999 is_ap = true;
1000 ap_vdev_ids[i] = i;
1001 }
1002
1003 if (wma->interfaces[i].mhz != prev_ch_freq) {
1004 num_ch++;
1005 prev_ch_freq = wma->interfaces[i].mhz;
1006 }
1007 }
1008 }
1009
1010 if (is_ap && (num_ch > 1))
1011 result = true;
1012 else
1013 result = false;
1014
1015 wma_send_msg(wma, WMA_UPDATE_Q2Q_IE_IND, (void *)ap_vdev_ids, result);
1016}
1017#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
1018
1019/**
1020 * wma_vdev_start_resp_handler() - vdev start response handler
1021 * @handle: wma handle
1022 * @cmd_param_info: event buffer
1023 * @len: buffer length
1024 *
1025 * Return: 0 for success or error code
1026 */
1027int wma_vdev_start_resp_handler(void *handle, uint8_t *cmd_param_info,
1028 uint32_t len)
1029{
1030 tp_wma_handle wma = (tp_wma_handle) handle;
1031 WMI_VDEV_START_RESP_EVENTID_param_tlvs *param_buf;
1032 wmi_vdev_start_response_event_fixed_param *resp_event;
1033 struct wma_target_req *req_msg;
1034 struct wma_txrx_node *iface;
Govind Singhd76a5b02016-03-08 15:12:14 +05301035 struct vdev_up_params param = {0};
1036 QDF_STATUS status;
Deepak Dhamdhered8455ce2016-11-02 13:11:55 -07001037 int err;
Naveen Rawatf8792bd2017-11-12 21:38:05 -08001038 wmi_host_channel_width chanwidth;
Arunk Khandavallicfde2712018-01-25 11:27:42 +05301039 target_resource_config *wlan_res_cfg;
1040 struct wlan_objmgr_psoc *psoc = wma->psoc;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001041#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
Anurag Chouhan6d760662016-02-20 16:05:43 +05301042 tpAniSirGlobal mac_ctx = cds_get_context(QDF_MODULE_ID_PE);
Arunk Khandavallicfde2712018-01-25 11:27:42 +05301043#endif
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001044
Arunk Khandavallicfde2712018-01-25 11:27:42 +05301045 if (!psoc) {
1046 WMA_LOGE("%s: psoc is NULL", __func__);
1047 return -EINVAL;
1048 }
1049
1050#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001051 if (NULL == mac_ctx) {
1052 WMA_LOGE("%s: Failed to get mac_ctx", __func__);
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07001053 policy_mgr_set_do_hw_mode_change_flag(
Arunk Khandavallicfde2712018-01-25 11:27:42 +05301054 psoc, false);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001055 return -EINVAL;
1056 }
1057#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
1058
1059 WMA_LOGD("%s: Enter", __func__);
Dustin Brown3e619822017-03-17 10:41:56 -07001060
Sourav Mohapatracf632572018-04-02 11:01:35 +05301061 wlan_res_cfg = lmac_get_tgt_res_cfg(psoc);
Arunk Khandavallicfde2712018-01-25 11:27:42 +05301062 if (!wlan_res_cfg) {
1063 WMA_LOGE("%s: Wlan resource config is NULL", __func__);
1064 return -EINVAL;
1065 }
1066
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001067 param_buf = (WMI_VDEV_START_RESP_EVENTID_param_tlvs *) cmd_param_info;
1068 if (!param_buf) {
1069 WMA_LOGE("Invalid start response event buffer");
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07001070 policy_mgr_set_do_hw_mode_change_flag(
1071 wma->psoc, false);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001072 return -EINVAL;
1073 }
1074
1075 resp_event = param_buf->fixed_param;
1076 if (!resp_event) {
1077 WMA_LOGE("Invalid start response event buffer");
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07001078 policy_mgr_set_do_hw_mode_change_flag(
1079 wma->psoc, false);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001080 return -EINVAL;
1081 }
1082
Himanshu Agarwaldfca3d82017-10-06 12:40:27 +05301083 if (resp_event->vdev_id >= wma->max_bssid) {
1084 WMA_LOGE("Invalid vdev id received from firmware");
1085 return -EINVAL;
1086 }
1087
bings1f98e9f2018-01-24 16:13:41 +08001088 if (wma_is_vdev_in_ap_mode(wma, resp_event->vdev_id))
1089 tgt_dfs_radar_enable(wma->pdev, 0, 0);
1090
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301091 if (resp_event->status == QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001092 wma->interfaces[resp_event->vdev_id].tx_streams =
1093 resp_event->cfgd_tx_streams;
1094 wma->interfaces[resp_event->vdev_id].rx_streams =
1095 resp_event->cfgd_rx_streams;
1096 wma->interfaces[resp_event->vdev_id].chain_mask =
1097 resp_event->chain_mask;
Arunk Khandavallicfde2712018-01-25 11:27:42 +05301098 if (wlan_res_cfg->use_pdev_id) {
Govind Singhefc5ccd2016-04-25 11:11:55 +05301099 if (resp_event->pdev_id == WMI_PDEV_ID_SOC) {
1100 WMA_LOGE("%s: soc level id received for mac id",
1101 __func__);
1102 QDF_BUG(0);
1103 return -EINVAL;
1104 }
1105 wma->interfaces[resp_event->vdev_id].mac_id =
1106 WMA_PDEV_TO_MAC_MAP(resp_event->pdev_id);
1107 } else {
1108 wma->interfaces[resp_event->vdev_id].mac_id =
1109 resp_event->mac_id;
1110 }
1111
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07001112 WMA_LOGD("%s: vdev:%d tx ss=%d rx ss=%d chain mask=%d mac=%d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001113 __func__,
1114 resp_event->vdev_id,
1115 wma->interfaces[resp_event->vdev_id].tx_streams,
1116 wma->interfaces[resp_event->vdev_id].rx_streams,
1117 wma->interfaces[resp_event->vdev_id].chain_mask,
1118 wma->interfaces[resp_event->vdev_id].mac_id);
1119 }
1120
Selvaraj, Sridhara0083c42016-06-22 22:15:43 +05301121 iface = &wma->interfaces[resp_event->vdev_id];
1122
Kiran Kumar Lokere5798bfa2017-04-27 20:49:39 -07001123 req_msg = wma_find_vdev_req(wma, resp_event->vdev_id,
Kiran Kumar Lokere20804162017-07-17 16:09:04 -07001124 WMA_TARGET_REQ_TYPE_VDEV_START,
1125 true);
Kiran Kumar Lokere5798bfa2017-04-27 20:49:39 -07001126
1127 if (!req_msg) {
1128 WMA_LOGE("%s: Failed to lookup request message for vdev %d",
1129 __func__, resp_event->vdev_id);
1130 policy_mgr_set_do_hw_mode_change_flag(wma->psoc, false);
1131 return -EINVAL;
1132 }
Abhishek Singhf06214b2018-08-17 12:16:39 +05301133 qdf_mc_timer_stop(&req_msg->event_timeout);
Kiran Kumar Lokere5798bfa2017-04-27 20:49:39 -07001134
Abhishek Singhf06214b2018-08-17 12:16:39 +05301135 if ((qdf_atomic_read(
1136 &wma->interfaces[resp_event->vdev_id].vdev_restart_params.
1137 hidden_ssid_restart_in_progress)) &&
1138 wma_is_vdev_in_ap_mode(wma, resp_event->vdev_id) &&
1139 (req_msg->msg_type == WMA_HIDDEN_SSID_VDEV_RESTART)) {
Kiran Kumar Lokere5798bfa2017-04-27 20:49:39 -07001140 tpHalHiddenSsidVdevRestart hidden_ssid_restart =
1141 (tpHalHiddenSsidVdevRestart)req_msg->user_data;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001142 WMA_LOGE("%s: vdev restart event recevied for hidden ssid set using IOCTL",
1143 __func__);
Anurag Chouhan8e0ccd32016-02-19 15:30:20 +05301144 qdf_atomic_set(&wma->interfaces[resp_event->vdev_id].
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001145 vdev_restart_params.
1146 hidden_ssid_restart_in_progress, 0);
Kiran Kumar Lokere5798bfa2017-04-27 20:49:39 -07001147
1148 wma_send_msg(wma, WMA_HIDDEN_SSID_RESTART_RSP,
1149 (void *)hidden_ssid_restart, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001150 }
1151
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001152#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301153 if (resp_event->status == QDF_STATUS_SUCCESS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001154 && mac_ctx->sap.sap_channel_avoidance)
1155 wma_find_mcc_ap(wma, resp_event->vdev_id, true);
1156#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
1157
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001158 if (req_msg->msg_type == WMA_CHNL_SWITCH_REQ) {
1159 tpSwitchChannelParams params =
1160 (tpSwitchChannelParams) req_msg->user_data;
Krunal Sonia5388a22018-02-12 19:47:44 -08001161
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001162 if (!params) {
1163 WMA_LOGE("%s: channel switch params is NULL for vdev %d",
1164 __func__, resp_event->vdev_id);
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07001165 policy_mgr_set_do_hw_mode_change_flag(
1166 wma->psoc, false);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001167 return -EINVAL;
1168 }
1169
1170 WMA_LOGD("%s: Send channel switch resp vdev %d status %d",
1171 __func__, resp_event->vdev_id, resp_event->status);
1172 params->chainMask = resp_event->chain_mask;
1173 if ((2 != resp_event->cfgd_rx_streams) ||
1174 (2 != resp_event->cfgd_tx_streams)) {
1175 params->nss = 1;
1176 }
1177 params->smpsMode = host_map_smps_mode(resp_event->smps_mode);
1178 params->status = resp_event->status;
Agrawal Ashish7dd7c592016-02-22 14:25:11 +05301179 if (wma->interfaces[resp_event->vdev_id].is_channel_switch) {
1180 wma->interfaces[resp_event->vdev_id].is_channel_switch =
1181 false;
1182 }
Manjunathappa Prakash0e6e6b52016-04-21 11:48:48 -07001183 if (((resp_event->resp_type == WMI_VDEV_RESTART_RESP_EVENT) &&
Krunal Sonia5388a22018-02-12 19:47:44 -08001184 ((iface->type == WMI_VDEV_TYPE_STA) ||
1185 (iface->type == WMI_VDEV_TYPE_MONITOR))) ||
Agrawal Ashish7dd7c592016-02-22 14:25:11 +05301186 ((resp_event->resp_type == WMI_VDEV_START_RESP_EVENT) &&
1187 (iface->type == WMI_VDEV_TYPE_MONITOR))) {
Naveen Rawatd24c1162018-03-07 15:59:31 -08001188 /* for CSA case firmware expects phymode before ch_wd */
1189 err = wma_set_peer_param(wma, iface->bssid,
1190 WMI_PEER_PHYMODE, iface->chanmode,
1191 resp_event->vdev_id);
1192 WMA_LOGD("%s:vdev_id %d chanmode %d status %d",
1193 __func__, resp_event->vdev_id,
1194 iface->chanmode, err);
1195
Naveen Rawatf8792bd2017-11-12 21:38:05 -08001196 chanwidth =
1197 wmi_get_ch_width_from_phy_mode(wma->wmi_handle,
1198 iface->chanmode);
Deepak Dhamdhered8455ce2016-11-02 13:11:55 -07001199 err = wma_set_peer_param(wma, iface->bssid,
1200 WMI_PEER_CHWIDTH, chanwidth,
1201 resp_event->vdev_id);
Deepak Dhamdhered8455ce2016-11-02 13:11:55 -07001202 WMA_LOGD("%s:vdev_id %d chanwidth %d status %d",
1203 __func__, resp_event->vdev_id,
1204 chanwidth, err);
1205
Govind Singhd76a5b02016-03-08 15:12:14 +05301206 param.vdev_id = resp_event->vdev_id;
1207 param.assoc_id = iface->aid;
Dustin Brownec2c92e2017-07-26 11:13:49 -07001208 status = wma_send_vdev_up_to_fw(wma, &param,
1209 iface->bssid);
Govind Singhd76a5b02016-03-08 15:12:14 +05301210 if (QDF_IS_STATUS_ERROR(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001211 WMA_LOGE("%s:vdev_up failed vdev_id %d",
1212 __func__, resp_event->vdev_id);
Mukul Sharmaf9047232017-03-02 16:58:56 +05301213 wma_vdev_set_mlme_state(wma,
1214 resp_event->vdev_id, WLAN_VDEV_S_STOP);
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07001215 policy_mgr_set_do_hw_mode_change_flag(
1216 wma->psoc, false);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001217 } else {
Mukul Sharmaf9047232017-03-02 16:58:56 +05301218 wma_vdev_set_mlme_state(wma,
1219 resp_event->vdev_id, WLAN_VDEV_S_RUN);
Kiran Kumar Lokeref9dc7912017-06-28 18:10:58 -07001220 if (iface->beacon_filter_enabled)
1221 wma_add_beacon_filter(wma,
1222 &iface->beacon_filter);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001223 }
1224 }
1225
Abhishek Singh2d775fd2017-08-18 10:51:33 +05301226 wma_send_msg_high_priority(wma, WMA_SWITCH_CHANNEL_RSP,
1227 (void *)params, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001228 } else if (req_msg->msg_type == WMA_ADD_BSS_REQ) {
1229 tpAddBssParams bssParams = (tpAddBssParams) req_msg->user_data;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001230
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301231 qdf_mem_copy(iface->bssid, bssParams->bssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001232 IEEE80211_ADDR_LEN);
1233 wma_vdev_start_rsp(wma, bssParams, resp_event);
1234 } else if (req_msg->msg_type == WMA_OCB_SET_CONFIG_CMD) {
Govind Singhd76a5b02016-03-08 15:12:14 +05301235 param.vdev_id = resp_event->vdev_id;
1236 param.assoc_id = iface->aid;
Dustin Brownec2c92e2017-07-26 11:13:49 -07001237 if (wma_send_vdev_up_to_fw(wma, &param, iface->bssid) !=
1238 QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001239 WMA_LOGE(FL("failed to send vdev up"));
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07001240 policy_mgr_set_do_hw_mode_change_flag(
1241 wma->psoc, false);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001242 return -EEXIST;
1243 }
Mukul Sharmaf9047232017-03-02 16:58:56 +05301244 wma_vdev_set_mlme_state(wma, resp_event->vdev_id,
1245 WLAN_VDEV_S_RUN);
Zhang Qian47e22ce2018-01-04 15:38:38 +08001246 ucfg_ocb_config_channel(wma->pdev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001247 }
1248
1249 if ((wma->interfaces[resp_event->vdev_id].type == WMI_VDEV_TYPE_AP) &&
Mukul Sharmaf9047232017-03-02 16:58:56 +05301250 wma_is_vdev_up(resp_event->vdev_id))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001251 wma_set_sap_keepalive(wma, resp_event->vdev_id);
1252
Anurag Chouhan210db072016-02-22 18:42:15 +05301253 qdf_mc_timer_destroy(&req_msg->event_timeout);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301254 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001255
1256 return 0;
1257}
1258
Yeshwanth Sriram Guntukad5aae7f2017-11-27 14:33:51 +05301259bool wma_is_vdev_valid(uint32_t vdev_id)
Rajeev Kumard9a43cf2017-07-19 14:55:42 -07001260{
1261 tp_wma_handle wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
1262
Arif Hussain380cfc72017-10-31 13:12:04 -07001263 if (!wma_handle) {
1264 WMA_LOGD("%s: vdev_id: %d, null wma_handle", __func__, vdev_id);
Rajeev Kumard9a43cf2017-07-19 14:55:42 -07001265 return false;
Arif Hussain380cfc72017-10-31 13:12:04 -07001266 }
Rajeev Kumard9a43cf2017-07-19 14:55:42 -07001267
Vignesh Viswanathan9fa8fef2017-12-12 14:45:38 +05301268 /* No of interface are allocated based on max_bssid value */
1269 if (vdev_id >= wma_handle->max_bssid) {
1270 WMA_LOGD("%s: vdev_id: %d is invalid, max_bssid: %d",
1271 __func__, vdev_id, wma_handle->max_bssid);
1272 return false;
1273 }
1274
Arif Hussain380cfc72017-10-31 13:12:04 -07001275 WMA_LOGD("%s: vdev_id: %d, vdev_active: %d, is_vdev_valid %d",
1276 __func__, vdev_id, wma_handle->interfaces[vdev_id].vdev_active,
1277 wma_handle->interfaces[vdev_id].is_vdev_valid);
1278
1279 return wma_handle->interfaces[vdev_id].vdev_active ||
1280 wma_handle->interfaces[vdev_id].is_vdev_valid;
Rajeev Kumard9a43cf2017-07-19 14:55:42 -07001281}
1282
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001283/**
Govind Singhd76a5b02016-03-08 15:12:14 +05301284 * wma_vdev_set_param() - set per vdev params in fw
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001285 * @wmi_handle: wmi handle
Bala Venkatesh110b03e2018-07-10 16:02:08 +05301286 * @if_id: vdev id
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001287 * @param_id: parameter id
1288 * @param_value: parameter value
1289 *
Govind Singhd76a5b02016-03-08 15:12:14 +05301290 * Return: QDF_STATUS_SUCCESS for success or error code
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001291 */
Govind Singhd76a5b02016-03-08 15:12:14 +05301292QDF_STATUS
1293wma_vdev_set_param(wmi_unified_t wmi_handle, uint32_t if_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001294 uint32_t param_id, uint32_t param_value)
1295{
Govind Singhd76a5b02016-03-08 15:12:14 +05301296 struct vdev_set_params param = {0};
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001297
Rajeev Kumard9a43cf2017-07-19 14:55:42 -07001298 if (!wma_is_vdev_valid(if_id)) {
1299 WMA_LOGE(FL("vdev_id: %d is not active reject the req: param id %d val %d"),
1300 if_id, param_id, param_value);
Rajeev Kumard9a43cf2017-07-19 14:55:42 -07001301 return QDF_STATUS_E_INVAL;
1302 }
1303
Govind Singhd76a5b02016-03-08 15:12:14 +05301304 param.if_id = if_id;
1305 param.param_id = param_id;
1306 param.param_value = param_value;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001307
Govind Singhd76a5b02016-03-08 15:12:14 +05301308 return wmi_unified_vdev_set_param_send(wmi_handle, &param);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001309}
1310
1311/**
1312 * wma_set_peer_authorized_cb() - set peer authorized callback function
Bala Venkatesh110b03e2018-07-10 16:02:08 +05301313 * @wma_ctx: wma handle
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001314 * @auth_cb: peer authorized callback
1315 *
1316 * Return: none
1317 */
1318void wma_set_peer_authorized_cb(void *wma_ctx, wma_peer_authorized_fp auth_cb)
1319{
1320 tp_wma_handle wma_handle = (tp_wma_handle) wma_ctx;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001321
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001322 wma_handle->peer_authorized_cb = auth_cb;
1323}
1324
1325/**
1326 * wma_set_peer_param() - set peer parameter in fw
1327 * @wma_ctx: wma handle
1328 * @peer_addr: peer mac address
1329 * @param_id: parameter id
1330 * @param_value: parameter value
1331 * @vdev_id: vdev id
1332 *
Govind Singhd76a5b02016-03-08 15:12:14 +05301333 * Return: QDF_STATUS_SUCCESS for success or error code
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001334 */
Govind Singhd76a5b02016-03-08 15:12:14 +05301335QDF_STATUS wma_set_peer_param(void *wma_ctx, uint8_t *peer_addr,
1336 uint32_t param_id, uint32_t param_value,
1337 uint32_t vdev_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001338{
1339 tp_wma_handle wma_handle = (tp_wma_handle) wma_ctx;
Govind Singhd76a5b02016-03-08 15:12:14 +05301340 struct peer_set_params param = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001341 int err;
1342
Govind Singhd76a5b02016-03-08 15:12:14 +05301343 param.vdev_id = vdev_id;
1344 param.param_value = param_value;
1345 param.param_id = param_id;
1346
1347 err = wmi_set_peer_param_send(wma_handle->wmi_handle, peer_addr,
1348 &param);
1349
1350 return err;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001351}
1352
1353/**
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07001354 * wma_remove_peer() - remove peer information from host driver and fw
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001355 * @wma: wma handle
1356 * @bssid: mac address
1357 * @vdev_id: vdev id
1358 * @peer: peer ptr
1359 * @roam_synch_in_progress: roam in progress flag
1360 *
1361 * Return: none
1362 */
1363void wma_remove_peer(tp_wma_handle wma, uint8_t *bssid,
Leo Chang96464902016-10-28 11:10:54 -07001364 uint8_t vdev_id, void *peer,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001365 bool roam_synch_in_progress)
1366{
1367#define PEER_ALL_TID_BITMASK 0xffffffff
1368 uint32_t peer_tid_bitmap = PEER_ALL_TID_BITMASK;
1369 uint8_t *peer_addr = bssid;
gaurank kathpalia89d3c322018-06-21 11:45:32 +05301370 uint8_t peer_mac[QDF_MAC_ADDR_SIZE] = {0};
Govind Singhd76a5b02016-03-08 15:12:14 +05301371 struct peer_flush_params param = {0};
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07001372 uint8_t *peer_mac_addr;
Leo Chang96464902016-10-28 11:10:54 -07001373 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Krunal Soniee5d1ad2018-05-29 15:25:30 -07001374 void *pdev = cds_get_context(QDF_MODULE_ID_TXRX);
1375 void *vdev;
Naveen Rawatf4ada152017-09-05 14:56:12 -07001376 QDF_STATUS qdf_status;
Lin Bai973e6922018-01-08 17:59:19 +08001377 uint32_t bitmap = 1 << CDP_PEER_DELETE_NO_SPECIAL;
Govind Singhd76a5b02016-03-08 15:12:14 +05301378
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001379 if (!wma->interfaces[vdev_id].peer_count) {
1380 WMA_LOGE("%s: Can't remove peer with peer_addr %pM vdevid %d peer_count %d",
1381 __func__, bssid, vdev_id,
1382 wma->interfaces[vdev_id].peer_count);
Himanshu Agarwal074340d2018-06-18 17:02:58 +05301383 QDF_BUG(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001384 return;
1385 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001386
Nishank Aggarwala13b61d2016-12-01 12:53:58 +05301387 if (!soc) {
1388 WMA_LOGE("%s:SOC context is NULL", __func__);
Himanshu Agarwal074340d2018-06-18 17:02:58 +05301389 QDF_BUG(0);
Nishank Aggarwala13b61d2016-12-01 12:53:58 +05301390 return;
1391 }
1392
Sravan Kumar Kairamd431e5b2018-06-12 20:07:29 +05301393 if (!peer) {
1394 WMA_LOGE("%s: PEER is NULL for vdev_id: %d", __func__, vdev_id);
Himanshu Agarwal074340d2018-06-18 17:02:58 +05301395 QDF_BUG(0);
Sravan Kumar Kairamd431e5b2018-06-12 20:07:29 +05301396 return;
1397 }
Leo Chang96464902016-10-28 11:10:54 -07001398 peer_mac_addr = cdp_peer_get_peer_mac_addr(soc, peer);
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07001399 if (peer_mac_addr == NULL) {
1400 WMA_LOGE("%s: peer mac addr is NULL, Can't remove peer with peer_addr %pM vdevid %d peer_count %d",
1401 __func__, bssid, vdev_id,
1402 wma->interfaces[vdev_id].peer_count);
Himanshu Agarwal074340d2018-06-18 17:02:58 +05301403 QDF_BUG(0);
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07001404 return;
1405 }
Mohit Khannab8b6e582018-07-23 11:37:12 -07001406 vdev = cdp_get_vdev_from_vdev_id(soc, pdev, vdev_id);
1407 if (!vdev) {
1408 WMA_LOGE("%s vdev is null for peer peer->mac_addr %pM",
1409 __func__, peer_mac_addr);
1410 QDF_BUG(0);
1411 return;
1412 }
1413
1414 cdp_peer_teardown(soc, vdev, peer);
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07001415
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001416 if (roam_synch_in_progress)
jge6435f4f2017-01-09 11:35:45 +08001417 goto peer_detach;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001418 /* Flush all TIDs except MGMT TID for this peer in Target */
1419 peer_tid_bitmap &= ~(0x1 << WMI_MGMT_TID);
Govind Singhd76a5b02016-03-08 15:12:14 +05301420 param.peer_tid_bitmap = peer_tid_bitmap;
1421 param.vdev_id = vdev_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001422 wmi_unified_peer_flush_tids_send(wma->wmi_handle, bssid,
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07001423 &param);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001424
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07001425 if (wma_is_vdev_in_ibss_mode(wma, vdev_id)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001426 WMA_LOGD("%s: bssid %pM peer->mac_addr %pM", __func__,
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07001427 bssid, peer_mac_addr);
1428 peer_addr = peer_mac_addr;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001429 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001430
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001431 /* peer->ref_cnt is not visible in WMA */
1432 wlan_roam_debug_log(vdev_id, DEBUG_PEER_DELETE_SEND,
1433 DEBUG_INVALID_PEER_ID, peer_addr, peer,
1434 0, 0);
Naveen Rawatf4ada152017-09-05 14:56:12 -07001435 qdf_status = wmi_unified_peer_delete_send(wma->wmi_handle, peer_addr,
1436 vdev_id);
1437 if (QDF_IS_STATUS_ERROR(qdf_status)) {
1438 WMA_LOGE("%s Peer delete could not be sent to firmware %d",
1439 __func__, qdf_status);
Lin Bai973e6922018-01-08 17:59:19 +08001440 /* Clear default bit and set to NOT_START_UNMAP */
1441 bitmap = 1 << CDP_PEER_DO_NOT_START_UNMAP_TIMER;
Naveen Rawatf4ada152017-09-05 14:56:12 -07001442 }
jge6435f4f2017-01-09 11:35:45 +08001443
1444peer_detach:
Sravan Kumar Kairamd431e5b2018-06-12 20:07:29 +05301445 WMA_LOGD("%s: vdev %pK is detaching %pK with peer_addr %pM vdevid %d peer_count %d",
gaurank kathpalia89d3c322018-06-21 11:45:32 +05301446 __func__, vdev, peer, peer_mac_addr, vdev_id,
1447 wma->interfaces[vdev_id].peer_count);
1448 /* Copy peer mac to find and delete objmgr peer */
1449 qdf_mem_copy(peer_mac, peer_mac_addr, QDF_MAC_ADDR_SIZE);
Krunal Sonid90ed4e2018-06-28 14:27:35 -07001450 if (roam_synch_in_progress &&
1451 is_cdp_peer_detach_force_delete_supported(soc)) {
1452 WMA_LOGD("%s: LFR3: trigger force delete for peer %pM",
1453 __func__, peer_mac_addr);
Sravan Kumar Kairamd431e5b2018-06-12 20:07:29 +05301454 cdp_peer_detach_force_delete(soc, peer);
Krunal Sonid90ed4e2018-06-28 14:27:35 -07001455 } else {
1456 if (roam_synch_in_progress) {
1457 WMA_LOGD("%s: LFR3: normal peer delete for peer %pM",
1458 __func__, peer_mac_addr);
1459 }
Sravan Kumar Kairamd431e5b2018-06-12 20:07:29 +05301460 cdp_peer_delete(soc, peer, bitmap);
Krunal Sonid90ed4e2018-06-28 14:27:35 -07001461 }
jge6435f4f2017-01-09 11:35:45 +08001462
gaurank kathpalia89d3c322018-06-21 11:45:32 +05301463 wma_remove_objmgr_peer(wma, vdev_id, peer_mac);
1464
jge6435f4f2017-01-09 11:35:45 +08001465 wma->interfaces[vdev_id].peer_count--;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001466#undef PEER_ALL_TID_BITMASK
1467}
1468
1469/**
Abhishek Singh32517ed2017-05-29 14:25:14 +05301470 * wma_find_duplicate_peer_on_other_vdev() - Find if same peer exist
1471 * on other vdevs
1472 * @wma: wma handle
1473 * @pdev: txrx pdev ptr
1474 * @vdev_id: vdev id of vdev on which the peer
1475 * needs to be added
1476 * @peer_mac: peer mac addr which needs to be added
1477 *
1478 * Check if peer with same MAC is present on vdev other then
1479 * the provided vdev_id
1480 *
1481 * Return: true if same peer is present on vdev other then vdev_id
1482 * else return false
1483 */
1484static bool wma_find_duplicate_peer_on_other_vdev(tp_wma_handle wma,
1485 struct cdp_pdev *pdev, uint8_t vdev_id, uint8_t *peer_mac)
1486{
1487 int i;
1488 uint8_t peer_id;
1489 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
1490
1491 for (i = 0; i < wma->max_bssid; i++) {
1492 /* Need to check vdevs other than the vdev_id */
1493 if (vdev_id == i ||
1494 !wma->interfaces[i].handle)
1495 continue;
1496 if (cdp_peer_find_by_addr_and_vdev(soc, pdev,
1497 wma->interfaces[i].handle, peer_mac, &peer_id)) {
1498 WMA_LOGE("%s :Duplicate peer %pM (peer id %d) already exist on vdev %d",
1499 __func__, peer_mac, peer_id, i);
1500 return true;
1501 }
1502 }
1503 return false;
1504}
1505
1506/**
gaurank kathpalia89d3c322018-06-21 11:45:32 +05301507 * wma_get_peer_type() - Determine the type of peer(eg. STA/AP) and return it
1508 * @wma: wma handle
1509 * @vdev_id: vdev id
Bala Venkatesh110b03e2018-07-10 16:02:08 +05301510 * @peer_addr: peer mac address
1511 * @wma_peer_type: wma peer type
gaurank kathpalia89d3c322018-06-21 11:45:32 +05301512 *
1513 * Return: Peer type
1514 */
Bala Venkatesh110b03e2018-07-10 16:02:08 +05301515static int wma_get_obj_mgr_peer_type(tp_wma_handle wma, uint8_t vdev_id,
1516 uint8_t *peer_addr, uint32_t wma_peer_type)
gaurank kathpalia89d3c322018-06-21 11:45:32 +05301517
1518{
1519 uint32_t obj_peer_type = 0;
1520
1521 WMA_LOGD("vdev id %d vdev type %d vdev subtype %d peer addr %pM vdev addr %pM",
1522 vdev_id, wma->interfaces[vdev_id].type,
1523 wma->interfaces[vdev_id].sub_type, peer_addr,
1524 wma->interfaces[vdev_id].addr);
1525
Bala Venkatesh110b03e2018-07-10 16:02:08 +05301526 if (wma_peer_type == WMI_PEER_TYPE_TDLS)
1527 return WLAN_PEER_TDLS;
1528
gaurank kathpalia89d3c322018-06-21 11:45:32 +05301529 if (!qdf_mem_cmp(wma->interfaces[vdev_id].addr, peer_addr,
1530 IEEE80211_ADDR_LEN)) {
1531 obj_peer_type = WLAN_PEER_SELF;
1532 } else if (wma->interfaces[vdev_id].type == WMI_VDEV_TYPE_STA) {
1533 if (wma->interfaces[vdev_id].sub_type ==
1534 WMI_UNIFIED_VDEV_SUBTYPE_P2P_CLIENT)
1535 obj_peer_type = WLAN_PEER_P2P_GO;
1536 else
1537 obj_peer_type = WLAN_PEER_AP;
1538 } else if (wma->interfaces[vdev_id].type == WMI_VDEV_TYPE_AP) {
1539 if (wma->interfaces[vdev_id].sub_type ==
1540 WMI_UNIFIED_VDEV_SUBTYPE_P2P_GO)
1541 obj_peer_type = WLAN_PEER_P2P_CLI;
1542 else
1543 obj_peer_type = WLAN_PEER_STA;
1544 } else if (wma->interfaces[vdev_id].type == WMI_VDEV_TYPE_IBSS) {
1545 obj_peer_type = WLAN_PEER_IBSS;
1546 } else if (wma->interfaces[vdev_id].type == WMI_VDEV_TYPE_NDI) {
1547 obj_peer_type = WLAN_PEER_NDP;
1548 } else {
1549 WMA_LOGE("Couldnt find peertype for type %d and sub type %d",
1550 wma->interfaces[vdev_id].type,
1551 wma->interfaces[vdev_id].sub_type);
1552 }
1553
1554 return obj_peer_type;
1555
1556}
1557
1558/**
1559 * wma_create_objmgr_peer() - create objmgr peer information in host driver
1560 * @wma: wma handle
1561 * @vdev_id: vdev id
Bala Venkatesh110b03e2018-07-10 16:02:08 +05301562 * @peer_addr: peer mac address
1563 * @wma_peer_type: peer type
gaurank kathpalia89d3c322018-06-21 11:45:32 +05301564 *
1565 * Return: objmgr peer pointer
1566 */
1567
1568static struct wlan_objmgr_peer *wma_create_objmgr_peer(tp_wma_handle wma,
Bala Venkatesh110b03e2018-07-10 16:02:08 +05301569 uint8_t vdev_id,
1570 uint8_t *peer_addr,
1571 uint32_t wma_peer_type)
gaurank kathpalia89d3c322018-06-21 11:45:32 +05301572{
1573 uint32_t obj_peer_type = 0;
1574 struct wlan_objmgr_peer *obj_peer = NULL;
1575 struct wlan_objmgr_vdev *obj_vdev = NULL;
1576 struct wlan_objmgr_psoc *psoc = wma->psoc;
1577
Bala Venkatesh110b03e2018-07-10 16:02:08 +05301578 obj_peer_type = wma_get_obj_mgr_peer_type(wma, vdev_id, peer_addr,
1579 wma_peer_type);
gaurank kathpalia89d3c322018-06-21 11:45:32 +05301580 if (!obj_peer_type) {
1581 WMA_LOGE("Invalid obj peer type. Unable to create peer %d",
1582 obj_peer_type);
1583 return NULL;
1584 }
1585
1586 /* Create obj_mgr peer */
1587 obj_vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
1588 WLAN_LEGACY_WMA_ID);
1589
1590 if (!obj_vdev) {
1591 WMA_LOGE("Invalid obj vdev. Unable to create peer %d",
1592 obj_peer_type);
1593 return NULL;
1594 }
1595
1596 obj_peer = wlan_objmgr_peer_obj_create(obj_vdev, obj_peer_type,
1597 peer_addr);
1598 wlan_objmgr_vdev_release_ref(obj_vdev, WLAN_LEGACY_WMA_ID);
1599 if (obj_peer)
1600 WMA_LOGD("Peer %pM added successfully! Type: %d", peer_addr,
1601 obj_peer_type);
1602
1603 return obj_peer;
1604
1605}
1606/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001607 * wma_create_peer() - send peer create command to fw
1608 * @wma: wma handle
1609 * @pdev: txrx pdev ptr
1610 * @vdev: txrx vdev ptr
1611 * @peer_addr: peer mac addr
1612 * @peer_type: peer type
1613 * @vdev_id: vdev id
1614 * @roam_synch_in_progress: roam in progress
1615 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301616 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001617 */
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08001618QDF_STATUS wma_create_peer(tp_wma_handle wma, struct cdp_pdev *pdev,
1619 struct cdp_vdev *vdev,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001620 u8 peer_addr[IEEE80211_ADDR_LEN],
1621 uint32_t peer_type, uint8_t vdev_id,
1622 bool roam_synch_in_progress)
1623{
Leo Chang96464902016-10-28 11:10:54 -07001624 void *peer = NULL;
Govind Singhd76a5b02016-03-08 15:12:14 +05301625 struct peer_create_params param = {0};
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07001626 uint8_t *mac_addr_raw;
Arunk Khandavallicfde2712018-01-25 11:27:42 +05301627 void *dp_soc = cds_get_context(QDF_MODULE_ID_SOC);
1628 struct wlan_objmgr_psoc *psoc = wma->psoc;
1629 target_resource_config *wlan_res_cfg;
gaurank kathpalia89d3c322018-06-21 11:45:32 +05301630 struct wlan_objmgr_peer *obj_peer = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001631
Pragaspathi Thilagaraj1e0e6db2018-08-05 19:02:07 +05301632 if (!cds_is_target_ready()) {
1633 WMA_LOGE(FL("target not ready, drop the request"));
1634 return QDF_STATUS_E_BUSY;
1635 }
1636
Arunk Khandavallicfde2712018-01-25 11:27:42 +05301637 if (!psoc) {
1638 WMA_LOGE("%s: psoc is NULL", __func__);
1639 return QDF_STATUS_E_INVAL;
1640 }
1641
Sourav Mohapatracf632572018-04-02 11:01:35 +05301642 wlan_res_cfg = lmac_get_tgt_res_cfg(psoc);
Arunk Khandavallicfde2712018-01-25 11:27:42 +05301643 if (!wlan_res_cfg) {
1644 WMA_LOGE("%s: psoc target res cfg is null", __func__);
1645 return QDF_STATUS_E_INVAL;
1646 }
Abhishek Singh32517ed2017-05-29 14:25:14 +05301647
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001648 if (++wma->interfaces[vdev_id].peer_count >
Arunk Khandavallicfde2712018-01-25 11:27:42 +05301649 wlan_res_cfg->num_peers) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07001650 WMA_LOGE("%s, the peer count exceeds the limit %d", __func__,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001651 wma->interfaces[vdev_id].peer_count - 1);
1652 goto err;
1653 }
Deepak Dhamdherec47cfe82016-08-22 01:00:13 -07001654
Arunk Khandavallicfde2712018-01-25 11:27:42 +05301655 if (!dp_soc) {
1656 WMA_LOGE("%s:DP SOC context is NULL", __func__);
Nishank Aggarwala13b61d2016-12-01 12:53:58 +05301657 goto err;
1658 }
1659
Abhishek Singh32517ed2017-05-29 14:25:14 +05301660 /*
1661 * Check if peer with same MAC exist on other Vdev, If so avoid
1662 * adding this peer, as it will cause FW to crash.
1663 */
1664 if (wma_find_duplicate_peer_on_other_vdev(wma, pdev,
1665 vdev_id, peer_addr))
1666 goto err;
1667
Bala Venkatesh110b03e2018-07-10 16:02:08 +05301668 obj_peer = wma_create_objmgr_peer(wma, vdev_id, peer_addr, peer_type);
gaurank kathpalia89d3c322018-06-21 11:45:32 +05301669 if (!obj_peer)
1670 goto err;
1671
Dhanashri Atre272fd232016-11-10 16:20:46 -08001672 /* The peer object should be created before sending the WMI peer
1673 * create command to firmware. This is to prevent a race condition
1674 * where the HTT peer map event is received before the peer object
1675 * is created in the data path
1676 */
Sravan Kumar Kairamc273afd2018-05-28 12:12:28 +05301677 peer = cdp_peer_create(dp_soc, vdev, peer_addr,
1678 (struct cdp_ctrl_objmgr_peer *)obj_peer);
Dhanashri Atre272fd232016-11-10 16:20:46 -08001679 if (!peer) {
1680 WMA_LOGE("%s : Unable to attach peer %pM", __func__, peer_addr);
gaurank kathpalia89d3c322018-06-21 11:45:32 +05301681 wlan_objmgr_peer_obj_delete(obj_peer);
Dhanashri Atre272fd232016-11-10 16:20:46 -08001682 goto err;
1683 }
Sravan Kumar Kairamd431e5b2018-06-12 20:07:29 +05301684 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 -07001685 __func__, vdev, peer, peer_addr, vdev_id,
1686 wma->interfaces[vdev_id].peer_count);
Dhanashri Atre272fd232016-11-10 16:20:46 -08001687
Sravan Kumar Kairamc273afd2018-05-28 12:12:28 +05301688 wlan_peer_set_dp_handle(obj_peer, peer);
1689
Deepak Dhamdheref74d6f82016-09-16 02:47:01 -07001690 if (roam_synch_in_progress) {
Abhinav Kumar50d4dc72018-06-15 16:35:50 +05301691 WMA_LOGD("%s: LFR3: Created peer %pK with peer_addr %pM vdev_id %d, peer_count - %d",
Mohit Khanna3aee1312016-07-28 19:07:05 -07001692 __func__, peer, peer_addr, vdev_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001693 wma->interfaces[vdev_id].peer_count);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301694 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001695 }
Govind Singhd76a5b02016-03-08 15:12:14 +05301696 param.peer_addr = peer_addr;
1697 param.peer_type = peer_type;
1698 param.vdev_id = vdev_id;
1699 if (wmi_unified_peer_create_send(wma->wmi_handle,
1700 &param) != QDF_STATUS_SUCCESS) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07001701 WMA_LOGE("%s : Unable to create peer in Target", __func__);
Sravan Kumar Kairamd431e5b2018-06-12 20:07:29 +05301702 cdp_peer_delete(dp_soc, peer,
1703 1 << CDP_PEER_DO_NOT_START_UNMAP_TIMER);
gaurank kathpalia89d3c322018-06-21 11:45:32 +05301704 wlan_objmgr_peer_obj_delete(obj_peer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001705 goto err;
1706 }
Dhanashri Atre272fd232016-11-10 16:20:46 -08001707
Jeff Johnsonadba3962017-09-18 08:12:35 -07001708 WMA_LOGD("%s: Created peer %pK with peer_addr %pM vdev_id %d, peer_count - %d",
Leo Chang96464902016-10-28 11:10:54 -07001709 __func__, peer, peer_addr, vdev_id,
Mohit Khanna3aee1312016-07-28 19:07:05 -07001710 wma->interfaces[vdev_id].peer_count);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001711
Deepak Dhamdheref918d422017-07-06 12:56:29 -07001712 wlan_roam_debug_log(vdev_id, DEBUG_PEER_CREATE_SEND,
1713 DEBUG_INVALID_PEER_ID, peer_addr, peer, 0, 0);
Arunk Khandavallicfde2712018-01-25 11:27:42 +05301714 cdp_peer_setup(dp_soc, vdev, peer);
Dhanashri Atre272fd232016-11-10 16:20:46 -08001715
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07001716 WMA_LOGD("%s: Initialized peer with peer_addr %pM vdev_id %d",
Dhanashri Atre272fd232016-11-10 16:20:46 -08001717 __func__, peer_addr, vdev_id);
1718
Arunk Khandavallicfde2712018-01-25 11:27:42 +05301719 mac_addr_raw = cdp_get_vdev_mac_addr(dp_soc, vdev);
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07001720 if (mac_addr_raw == NULL) {
1721 WMA_LOGE("%s: peer mac addr is NULL", __func__);
1722 return QDF_STATUS_E_FAULT;
1723 }
1724
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001725 /* for each remote ibss peer, clear its keys */
1726 if (wma_is_vdev_in_ibss_mode(wma, vdev_id) &&
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07001727 qdf_mem_cmp(peer_addr, mac_addr_raw, IEEE80211_ADDR_LEN)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001728 tSetStaKeyParams key_info;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07001729
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001730 WMA_LOGD("%s: remote ibss peer %pM key clearing\n", __func__,
1731 peer_addr);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301732 qdf_mem_set(&key_info, sizeof(key_info), 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001733 key_info.smesessionId = vdev_id;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301734 qdf_mem_copy(key_info.peer_macaddr.bytes, peer_addr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001735 IEEE80211_ADDR_LEN);
1736 key_info.sendRsp = false;
1737
1738 wma_set_stakey(wma, &key_info);
1739 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001740
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301741 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001742err:
1743 wma->interfaces[vdev_id].peer_count--;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301744 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001745}
1746
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001747/**
Liangwei Dong748cb5d2016-09-29 00:56:40 -04001748 * wma_cleanup_target_req_param() - free param memory of target request
1749 * @tgt_req: target request params
1750 *
1751 * Return: none
1752 */
1753static void wma_cleanup_target_req_param(struct wma_target_req *tgt_req)
1754{
1755 if (tgt_req->msg_type == WMA_CHNL_SWITCH_REQ ||
1756 tgt_req->msg_type == WMA_DELETE_BSS_REQ ||
1757 tgt_req->msg_type == WMA_ADD_BSS_REQ) {
1758 qdf_mem_free(tgt_req->user_data);
1759 tgt_req->user_data = NULL;
1760 }
Krishna Kumaar Natarajanfc8c3632017-05-24 17:09:40 -07001761
1762 if (tgt_req->msg_type == WMA_SET_LINK_STATE && tgt_req->user_data) {
1763 tpLinkStateParams params =
1764 (tpLinkStateParams) tgt_req->user_data;
1765 qdf_mem_free(params->callbackArg);
Pragaspathi Thilagaraj210362a2018-07-31 19:08:19 +05301766 params->callbackArg = NULL;
Krishna Kumaar Natarajanfc8c3632017-05-24 17:09:40 -07001767 qdf_mem_free(tgt_req->user_data);
1768 tgt_req->user_data = NULL;
1769 }
Liangwei Dong748cb5d2016-09-29 00:56:40 -04001770}
1771
1772/**
Krishna Kumaar Natarajanf24bfc82017-02-07 11:54:05 -08001773 * wma_remove_bss_peer() - remove BSS peer
1774 * @wma: pointer to WMA handle
1775 * @pdev: pointer to PDEV
1776 * @req_msg: pointer to WMA target Request
1777 * @vdev_id: vdev id on which delete BSS request was received
1778 * @params: pointer to Delete BSS params
1779 *
1780 * This function is called on receiving vdev stop response from FW or
1781 * vdev stop response timeout. In case of IBSS/NDI, use vdev's self MAC
1782 * for removing the peer. In case of STA/SAP use bssid passed as part of
1783 * delete STA parameter.
1784 *
1785 * Return: 0 on success, ERROR code on failure
1786 */
1787static int wma_remove_bss_peer(tp_wma_handle wma, void *pdev,
1788 struct wma_target_req *req_msg, uint32_t vdev_id,
1789 tpDeleteBssParams params)
1790{
1791 void *peer, *vdev;
1792 uint8_t peer_id;
1793 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
1794 uint8_t *mac_addr = NULL;
Abhishek Singhe8be9a62017-05-30 12:13:29 +05301795 struct wma_target_req *del_req;
Kabilan Kannan3618a752018-06-10 23:44:32 -07001796 int ret_value = 0;
Krishna Kumaar Natarajanf24bfc82017-02-07 11:54:05 -08001797
1798 vdev = cdp_get_vdev_from_vdev_id(soc, pdev, vdev_id);
1799 if (!vdev) {
1800 WMA_LOGE(FL("vdev is NULL for vdev_id = %d"), vdev_id);
1801 wma_cleanup_target_req_param(req_msg);
1802 return -EINVAL;
1803 }
1804
1805 if (wma_is_vdev_in_ibss_mode(wma, vdev_id) ||
1806 WMA_IS_VDEV_IN_NDI_MODE(wma->interfaces, vdev_id)) {
1807 mac_addr = cdp_get_vdev_mac_addr(soc, vdev);
1808 if (!mac_addr) {
1809 WMA_LOGE(FL("mac_addr is NULL for vdev_id = %d"),
1810 vdev_id);
1811 wma_cleanup_target_req_param(req_msg);
1812 return -EINVAL;
1813 }
1814 } else {
1815 mac_addr = params->bssid;
1816 }
1817
Kabilan Kannan3618a752018-06-10 23:44:32 -07001818 peer = cdp_peer_get_ref_by_addr(soc, pdev, mac_addr,
1819 &peer_id,
1820 PEER_DEBUG_ID_OL_INTERNAL);
Krishna Kumaar Natarajanf24bfc82017-02-07 11:54:05 -08001821 if (!peer) {
1822 WMA_LOGE(FL("peer NULL for vdev_id = %d"), vdev_id);
1823 wma_cleanup_target_req_param(req_msg);
1824 return -EINVAL;
1825 }
1826
1827 wma_remove_peer(wma, mac_addr, vdev_id, peer, false);
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05301828 if (wmi_service_enabled(
1829 wma->wmi_handle,
1830 wmi_service_sync_delete_cmds)) {
Abhishek Singhe8be9a62017-05-30 12:13:29 +05301831 WMA_LOGD(FL("Wait for the peer delete. vdev_id %d"),
1832 req_msg->vdev_id);
1833 del_req = wma_fill_hold_req(wma,
1834 req_msg->vdev_id,
1835 WMA_DELETE_STA_REQ,
1836 WMA_DELETE_PEER_RSP,
1837 params,
1838 WMA_DELETE_STA_TIMEOUT);
1839 if (!del_req) {
1840 WMA_LOGE(FL("Failed to allocate request. vdev_id %d"),
1841 req_msg->vdev_id);
1842 params->status = QDF_STATUS_E_NOMEM;
Kabilan Kannan3618a752018-06-10 23:44:32 -07001843 ret_value = -EINVAL;
Abhishek Singhe8be9a62017-05-30 12:13:29 +05301844 }
1845 }
Kabilan Kannan3618a752018-06-10 23:44:32 -07001846 if (peer)
1847 cdp_peer_release_ref(soc, peer,
1848 PEER_DEBUG_ID_OL_INTERNAL);
1849 return ret_value;
Krishna Kumaar Natarajanf24bfc82017-02-07 11:54:05 -08001850}
1851
Nachiket Kukade177b5b02018-05-22 20:52:17 +05301852#ifdef FEATURE_WLAN_APF
Hanumanth Reddy Pothulae87621b2017-04-12 20:53:35 +05301853/*
Nachiket Kukadee547a482018-05-22 16:43:30 +05301854 * get_fw_active_apf_mode() - convert HDD APF mode to FW configurable APF
Hanumanth Reddy Pothulae87621b2017-04-12 20:53:35 +05301855 * mode
Nachiket Kukadee547a482018-05-22 16:43:30 +05301856 * @mode: APF mode maintained in HDD
Hanumanth Reddy Pothulae87621b2017-04-12 20:53:35 +05301857 *
1858 * Return: FW configurable BP mode
1859 */
Nachiket Kukadee547a482018-05-22 16:43:30 +05301860static enum wmi_host_active_apf_mode
1861get_fw_active_apf_mode(enum active_apf_mode mode)
Hanumanth Reddy Pothulae87621b2017-04-12 20:53:35 +05301862{
1863 switch (mode) {
Nachiket Kukadee547a482018-05-22 16:43:30 +05301864 case ACTIVE_APF_DISABLED:
1865 return WMI_HOST_ACTIVE_APF_DISABLED;
1866 case ACTIVE_APF_ENABLED:
1867 return WMI_HOST_ACTIVE_APF_ENABLED;
1868 case ACTIVE_APF_ADAPTIVE:
1869 return WMI_HOST_ACTIVE_APF_ADAPTIVE;
Hanumanth Reddy Pothulae87621b2017-04-12 20:53:35 +05301870 default:
Nachiket Kukadee547a482018-05-22 16:43:30 +05301871 WMA_LOGE("Invalid Active APF Mode %d; Using 'disabled'", mode);
1872 return WMI_HOST_ACTIVE_APF_DISABLED;
Hanumanth Reddy Pothulae87621b2017-04-12 20:53:35 +05301873 }
1874}
1875
Krishna Kumaar Natarajanf24bfc82017-02-07 11:54:05 -08001876/**
Nachiket Kukadee547a482018-05-22 16:43:30 +05301877 * wma_config_active_apf_mode() - Config active APF mode in FW
Dustin Brown13995f02017-01-12 15:38:42 -08001878 * @wma: the WMA handle
1879 * @vdev_id: the Id of the vdev for which the configuration should be applied
1880 *
1881 * Return: QDF status
1882 */
Nachiket Kukadee547a482018-05-22 16:43:30 +05301883static QDF_STATUS wma_config_active_apf_mode(t_wma_handle *wma, uint8_t vdev_id)
Dustin Brown13995f02017-01-12 15:38:42 -08001884{
Nachiket Kukadee547a482018-05-22 16:43:30 +05301885 enum wmi_host_active_apf_mode uc_mode, mcbc_mode;
Dustin Brown13995f02017-01-12 15:38:42 -08001886
Nachiket Kukadee547a482018-05-22 16:43:30 +05301887 uc_mode = get_fw_active_apf_mode(wma->active_uc_apf_mode);
1888 mcbc_mode = get_fw_active_apf_mode(wma->active_mc_bc_apf_mode);
Dustin Brown13995f02017-01-12 15:38:42 -08001889
Nachiket Kukadee547a482018-05-22 16:43:30 +05301890 WMA_LOGD("Configuring Active APF Mode UC:%d MC/BC:%d for vdev %u",
1891 uc_mode, mcbc_mode, vdev_id);
Dustin Brown13995f02017-01-12 15:38:42 -08001892
Nachiket Kukadee547a482018-05-22 16:43:30 +05301893 return wmi_unified_set_active_apf_mode_cmd(wma->wmi_handle, vdev_id,
Dustin Brown13995f02017-01-12 15:38:42 -08001894 uc_mode, mcbc_mode);
1895}
Nachiket Kukade177b5b02018-05-22 20:52:17 +05301896#else /* FEATURE_WLAN_APF */
1897static QDF_STATUS wma_config_active_apf_mode(t_wma_handle *wma, uint8_t vdev_id)
1898{
1899 return QDF_STATUS_SUCCESS;
1900}
1901#endif /* FEATURE_WLAN_APF */
Dustin Brown13995f02017-01-12 15:38:42 -08001902
Abhishek Singhe8be9a62017-05-30 12:13:29 +05301903#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
1904/**
1905 * wma_check_and_find_mcc_ap() - finds if device is operating AP
1906 * in MCC mode or not
1907 * @wma: wma handle.
1908 * @vdev_id: vdev ID of device for which MCC has to be checked
1909 *
1910 * This function internally calls wma_find_mcc_ap finds if
1911 * device is operating AP in MCC mode or not
1912 *
1913 * Return: none
1914 */
1915static void
1916wma_check_and_find_mcc_ap(tp_wma_handle wma, uint8_t vdev_id)
1917{
1918 tpAniSirGlobal mac_ctx = cds_get_context(QDF_MODULE_ID_PE);
1919
1920 if (NULL == mac_ctx) {
1921 WMA_LOGE("%s: Failed to get mac_ctx", __func__);
1922 return;
1923 }
1924 if (mac_ctx->sap.sap_channel_avoidance)
1925 wma_find_mcc_ap(wma, vdev_id, false);
1926}
1927#else
1928static inline void
1929wma_check_and_find_mcc_ap(tp_wma_handle wma, uint8_t vdev_id)
1930{}
1931#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
1932
1933/**
1934 * wma_send_del_bss_response() - send del bss resp to upper layer
1935 * @wma: wma handle.
1936 * @vdev_id: vdev ID of device for which MCC has to be checked
1937 *
1938 * This function sends del bss resp to upper layer
1939 *
1940 * Return: none
1941 */
1942static void
1943wma_send_del_bss_response(tp_wma_handle wma, struct wma_target_req *req,
1944 uint8_t vdev_id)
1945{
1946 struct wma_txrx_node *iface;
1947 struct beacon_info *bcn;
1948 tpDeleteBssParams params;
1949 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
1950
1951 if (!req) {
1952 WMA_LOGE("%s req is NULL", __func__);
1953 return;
1954 }
1955
1956 iface = &wma->interfaces[vdev_id];
1957 if (!iface->handle) {
1958 WMA_LOGE("%s vdev id %d is already deleted",
1959 __func__, vdev_id);
1960 if (req->user_data)
1961 qdf_mem_free(req->user_data);
1962 req->user_data = NULL;
1963 return;
1964 }
Abhishek Singhe8be9a62017-05-30 12:13:29 +05301965
Dustin Brownec2c92e2017-07-26 11:13:49 -07001966 params = (tpDeleteBssParams)req->user_data;
1967 if (wma_send_vdev_down_to_fw(wma, vdev_id) != QDF_STATUS_SUCCESS) {
1968 WMA_LOGE("Failed to send vdev down cmd: vdev %d", vdev_id);
Abhishek Singhe8be9a62017-05-30 12:13:29 +05301969 } else {
Dustin Brownec2c92e2017-07-26 11:13:49 -07001970 wma_vdev_set_mlme_state(wma, vdev_id, WLAN_VDEV_S_STOP);
Abhishek Singhe8be9a62017-05-30 12:13:29 +05301971 wma_check_and_find_mcc_ap(wma, vdev_id);
1972 }
1973
1974 cdp_fc_vdev_flush(soc, iface->handle);
1975 WMA_LOGD("%s, vdev_id: %d, un-pausing tx_ll_queue for VDEV_STOP rsp",
1976 __func__, vdev_id);
1977 cdp_fc_vdev_unpause(soc, iface->handle,
1978 OL_TXQ_PAUSE_REASON_VDEV_STOP);
1979 wma_vdev_clear_pause_bit(vdev_id, PAUSE_TYPE_HOST);
1980 qdf_atomic_set(&iface->bss_status, WMA_BSS_STATUS_STOPPED);
1981 WMA_LOGD("%s: (type %d subtype %d) BSS is stopped",
1982 __func__, iface->type, iface->sub_type);
1983
1984 bcn = wma->interfaces[vdev_id].beacon;
1985 if (bcn) {
Jeff Johnsonadba3962017-09-18 08:12:35 -07001986 WMA_LOGD("%s: Freeing beacon struct %pK, template memory %pK",
Abhishek Singhe8be9a62017-05-30 12:13:29 +05301987 __func__, bcn, bcn->buf);
1988 if (bcn->dma_mapped)
1989 qdf_nbuf_unmap_single(wma->qdf_dev, bcn->buf,
1990 QDF_DMA_TO_DEVICE);
Anurag Chouhan47cb1712018-06-25 12:05:15 +05301991 qdf_nbuf_free(bcn->buf);
1992 qdf_mem_free(bcn);
1993 wma->interfaces[vdev_id].beacon = NULL;
Abhishek Singhe8be9a62017-05-30 12:13:29 +05301994 }
1995
1996 /* Timeout status means its WMA generated DEL BSS REQ when ADD
1997 * BSS REQ was timed out to stop the VDEV in this case no need
1998 * to send response to UMAC
1999 */
2000 if (params->status == QDF_STATUS_FW_MSG_TIMEDOUT) {
2001 qdf_mem_free(req->user_data);
2002 req->user_data = NULL;
2003 WMA_LOGE("%s: DEL BSS from ADD BSS timeout do not send resp to UMAC (vdev id %x)",
2004 __func__, vdev_id);
2005 } else {
2006 params->status = QDF_STATUS_SUCCESS;
Abhishek Singh2d775fd2017-08-18 10:51:33 +05302007 wma_send_msg_high_priority(wma, WMA_DELETE_BSS_RSP,
2008 (void *)params, 0);
Abhishek Singhe8be9a62017-05-30 12:13:29 +05302009 }
2010
Abhishek Singh0d74f9e2017-09-26 14:02:42 +05302011 if (iface->del_staself_req && iface->is_del_sta_defered) {
2012 iface->is_del_sta_defered = false;
Abhishek Singhe8be9a62017-05-30 12:13:29 +05302013 WMA_LOGA("scheduling defered deletion (vdev id %x)",
2014 vdev_id);
2015 wma_vdev_detach(wma, iface->del_staself_req, 1);
2016 }
2017}
2018
Dustin Brown13995f02017-01-12 15:38:42 -08002019/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002020 * wma_vdev_stop_resp_handler() - vdev stop response handler
2021 * @handle: wma handle
2022 * @cmd_param_info: event buffer
2023 * @len: buffer length
2024 *
2025 * Return: 0 for success or error code
2026 */
2027int wma_vdev_stop_resp_handler(void *handle, uint8_t *cmd_param_info,
2028 u32 len)
2029{
2030 tp_wma_handle wma = (tp_wma_handle) handle;
2031 WMI_VDEV_STOPPED_EVENTID_param_tlvs *param_buf;
2032 wmi_vdev_stopped_event_fixed_param *resp_event;
Abhishek Singhf06214b2018-08-17 12:16:39 +05302033 struct wma_target_req *req_msg, *del_req;
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08002034 struct cdp_pdev *pdev;
Kabilan Kannan3618a752018-06-10 23:44:32 -07002035 void *peer = NULL;
Sandeep Puligilla7da86332016-11-10 16:14:40 -08002036 uint8_t peer_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002037 struct wma_txrx_node *iface;
2038 int32_t status = 0;
Leo Chang96464902016-10-28 11:10:54 -07002039 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Dustin Brownbf6d16b2017-03-03 11:41:05 -08002040
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07002041 WMA_LOGD("%s: Enter", __func__);
Dustin Brown3e619822017-03-17 10:41:56 -07002042
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002043 param_buf = (WMI_VDEV_STOPPED_EVENTID_param_tlvs *) cmd_param_info;
2044 if (!param_buf) {
2045 WMA_LOGE("Invalid event buffer");
2046 return -EINVAL;
2047 }
Dustin Brownec2c92e2017-07-26 11:13:49 -07002048
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002049 resp_event = param_buf->fixed_param;
Vignesh Viswanathan08ad8a02018-02-14 18:00:01 +05302050
2051 if (resp_event->vdev_id >= wma->max_bssid) {
2052 WMA_LOGE("%s: Invalid vdev_id %d from FW",
2053 __func__, resp_event->vdev_id);
2054 return -EINVAL;
2055 }
2056
Dustin Brownec2c92e2017-07-26 11:13:49 -07002057 iface = &wma->interfaces[resp_event->vdev_id];
Naveen Rawata600b2e2018-03-29 13:41:18 -07002058
2059 /* vdev in stopped state, no more waiting for key */
2060 iface->is_waiting_for_key = false;
2061
Vignesh Viswanathan2fa5e2d2018-05-31 12:37:07 +05302062 /*
2063 * Reset the rmfEnabled as there might be MGMT action frames
2064 * sent on this vdev before the next session is established.
2065 */
2066 if (iface->rmfEnabled) {
2067 iface->rmfEnabled = 0;
2068 WMA_LOGD(FL("Reset rmfEnabled for vdev %d"),
2069 resp_event->vdev_id);
2070 }
2071
Dustin Brownec2c92e2017-07-26 11:13:49 -07002072 wma_release_wakelock(&iface->vdev_stop_wakelock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002073
Kiran Kumar Lokere5798bfa2017-04-27 20:49:39 -07002074 req_msg = wma_find_vdev_req(wma, resp_event->vdev_id,
Kiran Kumar Lokere20804162017-07-17 16:09:04 -07002075 WMA_TARGET_REQ_TYPE_VDEV_STOP, true);
Kiran Kumar Lokere5798bfa2017-04-27 20:49:39 -07002076 if (!req_msg) {
2077 WMA_LOGE("%s: Failed to lookup vdev request for vdev id %d",
2078 __func__, resp_event->vdev_id);
2079 return -EINVAL;
2080 }
2081
Anurag Chouhan6d760662016-02-20 16:05:43 +05302082 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002083 if (!pdev) {
2084 WMA_LOGE("%s: pdev is NULL", __func__);
2085 status = -EINVAL;
Liangwei Dong748cb5d2016-09-29 00:56:40 -04002086 wma_cleanup_target_req_param(req_msg);
Anurag Chouhan210db072016-02-22 18:42:15 +05302087 qdf_mc_timer_stop(&req_msg->event_timeout);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002088 goto free_req_msg;
2089 }
2090
Anurag Chouhan210db072016-02-22 18:42:15 +05302091 qdf_mc_timer_stop(&req_msg->event_timeout);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002092 if (req_msg->msg_type == WMA_DELETE_BSS_REQ) {
2093 tpDeleteBssParams params =
2094 (tpDeleteBssParams) req_msg->user_data;
Dustin Brownbf6d16b2017-03-03 11:41:05 -08002095
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002096 if (iface->handle == NULL) {
2097 WMA_LOGE("%s vdev id %d is already deleted",
2098 __func__, resp_event->vdev_id);
Liangwei Dong748cb5d2016-09-29 00:56:40 -04002099 wma_cleanup_target_req_param(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002100 status = -EINVAL;
2101 goto free_req_msg;
2102 }
Mukul Sharma8d2d9ec2016-09-08 13:05:35 +05302103
Padma, Santhosh Kumar16dacfb2017-03-21 19:05:40 +05302104 /* CCA is required only for sta interface */
2105 if (iface->type == WMI_VDEV_TYPE_STA)
2106 wma_get_cca_stats(wma, resp_event->vdev_id);
2107
Mukul Sharma8d2d9ec2016-09-08 13:05:35 +05302108 /* Clear arp and ns offload cache */
2109 qdf_mem_zero(&iface->ns_offload_req,
2110 sizeof(iface->ns_offload_req));
2111 qdf_mem_zero(&iface->arp_offload_req,
2112 sizeof(iface->arp_offload_req));
2113
Krishna Kumaar Natarajanf24bfc82017-02-07 11:54:05 -08002114 status = wma_remove_bss_peer(wma, pdev, req_msg,
2115 resp_event->vdev_id, params);
2116 if (status != 0)
2117 goto free_req_msg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002118
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05302119 if (wmi_service_enabled(
2120 wma->wmi_handle,
2121 wmi_service_sync_delete_cmds))
Abhishek Singhe8be9a62017-05-30 12:13:29 +05302122 goto free_req_msg;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002123
Abhishek Singhe8be9a62017-05-30 12:13:29 +05302124 wma_send_del_bss_response(wma, req_msg, resp_event->vdev_id);
Sandeep Puligilla7da86332016-11-10 16:14:40 -08002125 } else if (req_msg->msg_type == WMA_SET_LINK_STATE) {
2126 tpLinkStateParams params =
2127 (tpLinkStateParams) req_msg->user_data;
2128
Kabilan Kannan3618a752018-06-10 23:44:32 -07002129 peer = cdp_peer_get_ref_by_addr(soc, pdev, params->bssid,
2130 &peer_id,
2131 PEER_DEBUG_ID_OL_INTERNAL);
Sandeep Puligilla7da86332016-11-10 16:14:40 -08002132 if (peer) {
2133 WMA_LOGP(FL("Deleting peer %pM vdev id %d"),
2134 params->bssid, req_msg->vdev_id);
2135 wma_remove_peer(wma, params->bssid, req_msg->vdev_id,
2136 peer, false);
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05302137 if (wmi_service_enabled(wma->wmi_handle,
2138 wmi_service_sync_delete_cmds)) {
Sandeep Puligillabbee8172017-04-07 19:26:33 -07002139 WMA_LOGI(FL("Wait for the peer delete. vdev_id %d"),
2140 req_msg->vdev_id);
2141 del_req = wma_fill_hold_req(wma,
2142 req_msg->vdev_id,
2143 WMA_DELETE_STA_REQ,
2144 WMA_SET_LINK_PEER_RSP,
2145 params,
2146 WMA_DELETE_STA_TIMEOUT);
2147 if (!del_req) {
2148 WMA_LOGE(FL("Failed to allocate request. vdev_id %d"),
2149 req_msg->vdev_id);
2150 params->status = QDF_STATUS_E_NOMEM;
2151 } else {
2152 goto free_req_msg;
2153 }
2154 }
Sandeep Puligilla7da86332016-11-10 16:14:40 -08002155 }
Dustin Brownec2c92e2017-07-26 11:13:49 -07002156 if (wma_send_vdev_down_to_fw(wma, req_msg->vdev_id) !=
2157 QDF_STATUS_SUCCESS) {
Sandeep Puligilla7da86332016-11-10 16:14:40 -08002158 WMA_LOGE("Failed to send vdev down cmd: vdev %d",
2159 req_msg->vdev_id);
2160 }
2161 wma_send_msg(wma, WMA_SET_LINK_STATE_RSP, (void *)params, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002162 }
Krishna Kumaar Natarajanf24bfc82017-02-07 11:54:05 -08002163
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002164free_req_msg:
Kabilan Kannan3618a752018-06-10 23:44:32 -07002165 if (peer)
2166 cdp_peer_release_ref(soc, peer,
2167 PEER_DEBUG_ID_OL_INTERNAL);
Anurag Chouhan210db072016-02-22 18:42:15 +05302168 qdf_mc_timer_destroy(&req_msg->event_timeout);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302169 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002170 return status;
2171}
2172
2173/**
2174 * wma_vdev_attach() - create vdev in fw
2175 * @wma_handle: wma handle
2176 * @self_sta_req: self sta request
2177 * @generateRsp: generate response
2178 *
2179 * This function creates vdev in target and
2180 * attach this vdev to txrx module. It also set
2181 * vdev related params to fw.
2182 *
2183 * Return: txrx vdev handle
2184 */
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08002185struct cdp_vdev *wma_vdev_attach(tp_wma_handle wma_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002186 struct add_sta_self_params *self_sta_req,
2187 uint8_t generateRsp)
2188{
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08002189 struct cdp_vdev *txrx_vdev_handle = NULL;
2190 struct cdp_pdev *txrx_pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002191 enum wlan_op_mode txrx_vdev_type;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302192 QDF_STATUS status = QDF_STATUS_SUCCESS;
Anurag Chouhan6d760662016-02-20 16:05:43 +05302193 struct sAniSirGlobal *mac = cds_get_context(QDF_MODULE_ID_PE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002194 uint32_t cfg_val;
Govind Singhd76a5b02016-03-08 15:12:14 +05302195 QDF_STATUS ret;
Vignesh Viswanathan21c58cb2018-05-24 15:53:58 +05302196 struct mlme_ht_capabilities_info *ht_cap_info;
Rajeev Kumarb60abe42017-01-21 15:39:31 -08002197 struct scheduler_msg sme_msg = { 0 };
Govind Singhd76a5b02016-03-08 15:12:14 +05302198 struct vdev_create_params params = { 0 };
Bhargav Shaha89d3b42016-04-20 13:04:56 +05302199 u_int8_t vdev_id;
Padma, Santhosh Kumara7119672016-08-16 16:05:14 +05302200 struct sir_set_tx_rx_aggregation_size tx_rx_aggregation_size;
Paul Zhang33fae272018-04-23 16:19:00 +08002201 struct sir_set_tx_aggr_sw_retry_threshold tx_aggr_sw_retry_threshold;
Leo Chang96464902016-10-28 11:10:54 -07002202 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Bala Venkatesh110b03e2018-07-10 16:02:08 +05302203 struct wlan_objmgr_peer *obj_peer;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002204
Arif Hussain0e246802018-05-01 18:13:44 -07002205 qdf_mem_zero(&tx_rx_aggregation_size, sizeof(tx_rx_aggregation_size));
Varun Reddy Yeturu30c24b72017-07-31 14:25:54 -07002206 WMA_LOGD("mac %pM, vdev_id %hu, type %d, sub_type %d, nss 2g %d, 5g %d",
2207 self_sta_req->self_mac_addr, self_sta_req->session_id,
2208 self_sta_req->type, self_sta_req->sub_type,
2209 self_sta_req->nss_2g, self_sta_req->nss_5g);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002210 if (NULL == mac) {
2211 WMA_LOGE("%s: Failed to get mac", __func__);
2212 goto end;
2213 }
Arif Hussain380cfc72017-10-31 13:12:04 -07002214
2215 vdev_id = self_sta_req->session_id;
2216 if (wma_is_vdev_valid(vdev_id)) {
2217 WMA_LOGE("%s: vdev %d already active", __func__, vdev_id);
Varun Reddy Yeturu30c24b72017-07-31 14:25:54 -07002218 goto end;
2219 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002220
Govind Singhd76a5b02016-03-08 15:12:14 +05302221 params.if_id = self_sta_req->session_id;
2222 params.type = self_sta_req->type;
2223 params.subtype = self_sta_req->sub_type;
Kiran Kumar Lokere666bf852016-05-02 12:23:02 -07002224 params.nss_2g = self_sta_req->nss_2g;
2225 params.nss_5g = self_sta_req->nss_5g;
Govind Singhd76a5b02016-03-08 15:12:14 +05302226
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002227 /* Create a vdev in target */
Govind Singhd76a5b02016-03-08 15:12:14 +05302228 status = wmi_unified_vdev_create_send(wma_handle->wmi_handle,
2229 self_sta_req->self_mac_addr,
2230 &params);
2231 if (QDF_IS_STATUS_ERROR(status)) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07002232 WMA_LOGE("%s: Unable to add an interface for ath_dev",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002233 __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002234 goto end;
2235 }
2236
2237 txrx_vdev_type = wma_get_txrx_vdev_type(self_sta_req->type);
2238
2239 if (wlan_op_mode_unknown == txrx_vdev_type) {
2240 WMA_LOGE("Failed to get txrx vdev type");
Govind Singhd76a5b02016-03-08 15:12:14 +05302241 wmi_unified_vdev_delete_send(wma_handle->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002242 self_sta_req->session_id);
2243 goto end;
2244 }
2245
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08002246 txrx_vdev_handle = cdp_vdev_attach(soc,
2247 txrx_pdev,
2248 self_sta_req->self_mac_addr,
2249 self_sta_req->session_id,
2250 txrx_vdev_type);
Mukul Sharma6411bb82017-03-01 15:57:07 +05302251 wma_vdev_update_pause_bitmap(self_sta_req->session_id, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002252
Jeff Johnsonadba3962017-09-18 08:12:35 -07002253 WMA_LOGD("vdev_id %hu, txrx_vdev_handle = %pK", self_sta_req->session_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002254 txrx_vdev_handle);
2255
2256 if (NULL == txrx_vdev_handle) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07002257 WMA_LOGE("%s: cdp_vdev_attach failed", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302258 status = QDF_STATUS_E_FAILURE;
Govind Singhd76a5b02016-03-08 15:12:14 +05302259 wmi_unified_vdev_delete_send(wma_handle->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002260 self_sta_req->session_id);
2261 goto end;
2262 }
Selvaraj, Sridhar171e2252016-06-22 22:33:26 +05302263 wma_handle->interfaces[self_sta_req->session_id].vdev_active = true;
2264
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002265 wma_handle->interfaces[self_sta_req->session_id].handle =
2266 txrx_vdev_handle;
2267
2268 wma_handle->interfaces[self_sta_req->session_id].ptrn_match_enable =
2269 wma_handle->ptrn_match_enable_all_vdev ? true : false;
2270
2271 if (wlan_cfg_get_int(mac, WNI_CFG_WOWLAN_DEAUTH_ENABLE, &cfg_val)
Jeff Johnsone88dd752018-06-07 22:57:54 -07002272 != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002273 wma_handle->wow.deauth_enable = true;
2274 else
2275 wma_handle->wow.deauth_enable = cfg_val ? true : false;
2276
2277 if (wlan_cfg_get_int(mac, WNI_CFG_WOWLAN_DISASSOC_ENABLE, &cfg_val)
Jeff Johnsone88dd752018-06-07 22:57:54 -07002278 != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002279 wma_handle->wow.disassoc_enable = true;
2280 else
2281 wma_handle->wow.disassoc_enable = cfg_val ? true : false;
2282
2283 if (wlan_cfg_get_int(mac, WNI_CFG_WOWLAN_MAX_MISSED_BEACON, &cfg_val)
Jeff Johnsone88dd752018-06-07 22:57:54 -07002284 != QDF_STATUS_SUCCESS)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002285 wma_handle->wow.bmiss_enable = true;
2286 else
2287 wma_handle->wow.bmiss_enable = cfg_val ? true : false;
2288
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302289 qdf_mem_copy(wma_handle->interfaces[self_sta_req->session_id].addr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002290 self_sta_req->self_mac_addr,
2291 sizeof(wma_handle->interfaces[self_sta_req->session_id].
2292 addr));
Padma, Santhosh Kumara7119672016-08-16 16:05:14 +05302293
2294 tx_rx_aggregation_size.tx_aggregation_size =
2295 self_sta_req->tx_aggregation_size;
2296 tx_rx_aggregation_size.rx_aggregation_size =
2297 self_sta_req->rx_aggregation_size;
2298 tx_rx_aggregation_size.vdev_id = self_sta_req->session_id;
Arif Hussain0e246802018-05-01 18:13:44 -07002299 tx_rx_aggregation_size.aggr_type = WMI_VDEV_CUSTOM_AGGR_TYPE_AMPDU;
Padma, Santhosh Kumara7119672016-08-16 16:05:14 +05302300
2301 status = wma_set_tx_rx_aggregation_size(&tx_rx_aggregation_size);
2302 if (status != QDF_STATUS_SUCCESS)
2303 WMA_LOGE("failed to set aggregation sizes(err=%d)", status);
2304
Paul Zhangee09f8e2018-04-23 16:11:32 +08002305 tx_rx_aggregation_size.tx_aggregation_size_be =
2306 self_sta_req->tx_aggregation_size_be;
2307 tx_rx_aggregation_size.tx_aggregation_size_bk =
2308 self_sta_req->tx_aggregation_size_bk;
2309 tx_rx_aggregation_size.tx_aggregation_size_vi =
2310 self_sta_req->tx_aggregation_size_vi;
2311 tx_rx_aggregation_size.tx_aggregation_size_vo =
2312 self_sta_req->tx_aggregation_size_vo;
2313
Paul Zhang33fae272018-04-23 16:19:00 +08002314 tx_aggr_sw_retry_threshold.tx_aggr_sw_retry_threshold_be =
2315 self_sta_req->tx_aggr_sw_retry_threshold_be;
2316 tx_aggr_sw_retry_threshold.tx_aggr_sw_retry_threshold_bk =
2317 self_sta_req->tx_aggr_sw_retry_threshold_bk;
2318 tx_aggr_sw_retry_threshold.tx_aggr_sw_retry_threshold_vi =
2319 self_sta_req->tx_aggr_sw_retry_threshold_vi;
2320 tx_aggr_sw_retry_threshold.tx_aggr_sw_retry_threshold_vo =
2321 self_sta_req->tx_aggr_sw_retry_threshold_vo;
2322 tx_aggr_sw_retry_threshold.vdev_id = self_sta_req->session_id;
2323
2324
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002325 switch (self_sta_req->type) {
2326 case WMI_VDEV_TYPE_STA:
Paul Zhangee09f8e2018-04-23 16:11:32 +08002327 status = wma_set_tx_rx_aggregation_size_per_ac(
2328 &tx_rx_aggregation_size);
2329 if (status != QDF_STATUS_SUCCESS)
2330 WMA_LOGE("failed to set aggr sizes per ac(err=%d)",
2331 status);
2332
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002333 if (wlan_cfg_get_int(mac, WNI_CFG_INFRA_STA_KEEP_ALIVE_PERIOD,
Jeff Johnsone88dd752018-06-07 22:57:54 -07002334 &cfg_val) != QDF_STATUS_SUCCESS) {
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002335 WMA_LOGE("Failed to get value for WNI_CFG_INFRA_STA_KEEP_ALIVE_PERIOD");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002336 cfg_val = DEFAULT_INFRA_STA_KEEP_ALIVE_PERIOD;
2337 }
2338
2339 wma_set_sta_keep_alive(wma_handle,
2340 self_sta_req->session_id,
2341 SIR_KEEP_ALIVE_NULL_PKT,
2342 cfg_val, NULL, NULL, NULL);
mukul sharma72c8b222015-09-04 17:02:01 +05302343
2344 /* offload STA SA query related params to fwr */
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05302345 if (wmi_service_enabled(wma_handle->wmi_handle,
2346 wmi_service_sta_pmf_offload)) {
mukul sharma72c8b222015-09-04 17:02:01 +05302347 wma_set_sta_sa_query_param(wma_handle,
2348 self_sta_req->session_id);
2349 }
Paul Zhang33fae272018-04-23 16:19:00 +08002350
2351 status = wma_set_sw_retry_threshold(
2352 &tx_aggr_sw_retry_threshold);
2353 if (status != QDF_STATUS_SUCCESS)
2354 WMA_LOGE("failed to set retry threshold(err=%d)",
2355 status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002356 break;
2357 }
2358
2359 wma_handle->interfaces[self_sta_req->session_id].type =
2360 self_sta_req->type;
2361 wma_handle->interfaces[self_sta_req->session_id].sub_type =
2362 self_sta_req->sub_type;
Anurag Chouhan8e0ccd32016-02-19 15:30:20 +05302363 qdf_atomic_init(&wma_handle->interfaces
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002364 [self_sta_req->session_id].bss_status);
2365
Dustin Brown04823992018-03-29 13:27:01 -07002366 if (wma_vdev_uses_self_peer(self_sta_req->type,
2367 self_sta_req->sub_type)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002368 status = wma_create_peer(wma_handle, txrx_pdev,
2369 txrx_vdev_handle,
2370 self_sta_req->self_mac_addr,
2371 WMI_PEER_TYPE_DEFAULT,
2372 self_sta_req->session_id, false);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302373 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002374 WMA_LOGE("%s: Failed to create peer", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302375 status = QDF_STATUS_E_FAILURE;
Govind Singhd76a5b02016-03-08 15:12:14 +05302376 wmi_unified_vdev_delete_send(wma_handle->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002377 self_sta_req->session_id);
2378 }
Bala Venkatesh110b03e2018-07-10 16:02:08 +05302379 } else if (self_sta_req->type == WMI_VDEV_TYPE_STA) {
2380 obj_peer = wma_create_objmgr_peer(wma_handle,
2381 vdev_id,
2382 self_sta_req->self_mac_addr,
2383 WMI_PEER_TYPE_DEFAULT);
2384 if (!obj_peer) {
2385 WMA_LOGE("%s: Failed to create obj mgr peer for self sta",
2386 __func__);
2387 goto end;
2388 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002389 }
2390
Naveen Rawat2b6e3c92017-03-20 13:59:07 -07002391 WMA_LOGD("Setting WMI_VDEV_PARAM_DISCONNECT_TH: %d",
2392 self_sta_req->pkt_err_disconn_th);
2393 ret = wma_vdev_set_param(wma_handle->wmi_handle,
2394 self_sta_req->session_id,
2395 WMI_VDEV_PARAM_DISCONNECT_TH,
2396 self_sta_req->pkt_err_disconn_th);
2397 if (ret)
2398 WMA_LOGE("Failed to set WMI_VDEV_PARAM_DISCONNECT_TH");
2399
Bhargav Shaha89d3b42016-04-20 13:04:56 +05302400 wma_handle->interfaces[vdev_id].is_vdev_valid = true;
Govind Singhd76a5b02016-03-08 15:12:14 +05302401 ret = wma_vdev_set_param(wma_handle->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002402 self_sta_req->session_id,
2403 WMI_VDEV_PARAM_MCC_RTSCTS_PROTECTION_ENABLE,
2404 mac->roam.configParam.mcc_rts_cts_prot_enable);
Govind Singhd76a5b02016-03-08 15:12:14 +05302405 if (QDF_IS_STATUS_ERROR(ret))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002406 WMA_LOGE("Failed to set WMI VDEV MCC_RTSCTS_PROTECTION_ENABLE");
2407
Govind Singhd76a5b02016-03-08 15:12:14 +05302408 ret = wma_vdev_set_param(wma_handle->wmi_handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002409 self_sta_req->session_id,
2410 WMI_VDEV_PARAM_MCC_BROADCAST_PROBE_ENABLE,
2411 mac->roam.configParam.mcc_bcast_prob_resp_enable);
Govind Singhd76a5b02016-03-08 15:12:14 +05302412 if (QDF_IS_STATUS_ERROR(ret))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002413 WMA_LOGE("Failed to set WMI VDEV MCC_BROADCAST_PROBE_ENABLE");
2414
2415 if (wlan_cfg_get_int(mac, WNI_CFG_RTS_THRESHOLD,
Jeff Johnsone88dd752018-06-07 22:57:54 -07002416 &cfg_val) == QDF_STATUS_SUCCESS) {
Govind Singhd76a5b02016-03-08 15:12:14 +05302417 ret = wma_vdev_set_param(wma_handle->wmi_handle,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002418 self_sta_req->session_id,
2419 WMI_VDEV_PARAM_RTS_THRESHOLD,
2420 cfg_val);
Govind Singhd76a5b02016-03-08 15:12:14 +05302421 if (QDF_IS_STATUS_ERROR(ret))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002422 WMA_LOGE("Failed to set WMI_VDEV_PARAM_RTS_THRESHOLD");
2423 } else {
2424 WMA_LOGE("Failed to get value for WNI_CFG_RTS_THRESHOLD, leaving unchanged");
2425 }
2426
2427 if (wlan_cfg_get_int(mac, WNI_CFG_FRAGMENTATION_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_FRAGMENTATION_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_FRAGMENTATION_THRESHOLD");
2435 } else {
2436 WMA_LOGE("Failed to get value for WNI_CFG_FRAGMENTATION_THRESHOLD, leaving unchanged");
2437 }
2438
Vignesh Viswanathan21c58cb2018-05-24 15:53:58 +05302439 ht_cap_info = &mac->mlme_cfg->ht_caps.ht_cap_info;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002440
Vignesh Viswanathan21c58cb2018-05-24 15:53:58 +05302441 ret = wma_vdev_set_param(wma_handle->wmi_handle,
2442 self_sta_req->session_id,
2443 WMI_VDEV_PARAM_TX_STBC,
2444 ht_cap_info->txSTBC);
2445 if (QDF_IS_STATUS_ERROR(ret))
2446 WMA_LOGE("Failed to set WMI_VDEV_PARAM_TX_STBC");
Hong Shib90718f2017-02-20 00:57:22 +08002447
2448 wma_set_vdev_mgmt_rate(wma_handle, self_sta_req->session_id);
2449
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002450 /* Initialize roaming offload state */
2451 if ((self_sta_req->type == WMI_VDEV_TYPE_STA) &&
2452 (self_sta_req->sub_type == 0)) {
2453 wma_handle->roam_offload_enabled = true;
Govind Singhd76a5b02016-03-08 15:12:14 +05302454 ret = wma_vdev_set_param(wma_handle->wmi_handle,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002455 self_sta_req->session_id,
2456 WMI_VDEV_PARAM_ROAM_FW_OFFLOAD,
2457 (WMI_ROAM_FW_OFFLOAD_ENABLE_FLAG |
2458 WMI_ROAM_BMISS_FINAL_SCAN_ENABLE_FLAG));
Govind Singhd76a5b02016-03-08 15:12:14 +05302459 if (QDF_IS_STATUS_ERROR(ret))
2460 WMA_LOGE("Failed to set WMI_VDEV_PARAM_ROAM_FW_OFFLOAD");
Selvaraj, Sridhar4f684bb2017-01-19 15:59:23 +05302461
2462 /* Pass down enable/disable bcast probe rsp to FW */
2463 ret = wma_vdev_set_param(
2464 wma_handle->wmi_handle,
2465 self_sta_req->session_id,
2466 WMI_VDEV_PARAM_ENABLE_BCAST_PROBE_RESPONSE,
2467 self_sta_req->enable_bcast_probe_rsp);
2468 if (QDF_IS_STATUS_ERROR(ret))
2469 WMA_LOGE("Failed to set WMI_VDEV_PARAM_ENABLE_BCAST_PROBE_RESPONSE");
2470
Selvaraj, Sridhar97ce6582017-01-20 17:06:34 +05302471 /* Pass down the FILS max channel guard time to FW */
2472 ret = wma_vdev_set_param(
2473 wma_handle->wmi_handle,
2474 self_sta_req->session_id,
2475 WMI_VDEV_PARAM_FILS_MAX_CHANNEL_GUARD_TIME,
2476 self_sta_req->fils_max_chan_guard_time);
2477 if (QDF_IS_STATUS_ERROR(ret))
2478 WMA_LOGE("Failed to set WMI_VDEV_PARAM_FILS_MAX_CHANNEL_GUARD_TIME");
Sridhar Selvaraj87309212017-06-28 17:41:50 +05302479
2480 /* Pass down the Probe Request tx delay(in ms) to FW */
2481 ret = wma_vdev_set_param(
2482 wma_handle->wmi_handle,
2483 self_sta_req->session_id,
2484 WMI_VDEV_PARAM_PROBE_DELAY,
2485 PROBE_REQ_TX_DELAY);
2486 if (QDF_IS_STATUS_ERROR(ret))
2487 WMA_LOGE("Failed to set WMI_VDEV_PARAM_PROBE_DELAY");
2488
2489 /* Pass down the probe request tx time gap(in ms) to FW */
2490 ret = wma_vdev_set_param(
2491 wma_handle->wmi_handle,
2492 self_sta_req->session_id,
2493 WMI_VDEV_PARAM_REPEAT_PROBE_TIME,
2494 PROBE_REQ_TX_TIME_GAP);
2495 if (QDF_IS_STATUS_ERROR(ret))
2496 WMA_LOGE("Failed to set WMI_VDEV_PARAM_REPEAT_PROBE_TIME");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002497 }
2498
Yeshwanth Sriram Guntuka2ba6fe92017-10-04 14:40:45 +05302499 if ((self_sta_req->type == WMI_VDEV_TYPE_STA ||
2500 self_sta_req->type == WMI_VDEV_TYPE_AP) &&
2501 self_sta_req->sub_type == 0) {
2502 ret = wma_vdev_set_param(wma_handle->wmi_handle,
2503 self_sta_req->session_id,
2504 WMI_VDEV_PARAM_ENABLE_DISABLE_OCE_FEATURES,
2505 self_sta_req->oce_feature_bitmap);
2506 if (QDF_IS_STATUS_ERROR(ret))
2507 WMA_LOGE("Failed to set WMI_VDEV_PARAM_ENABLE_DISABLE_OCE_FEATURES");
2508 }
2509
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002510 /* Initialize BMISS parameters */
2511 if ((self_sta_req->type == WMI_VDEV_TYPE_STA) &&
2512 (self_sta_req->sub_type == 0))
2513 wma_roam_scan_bmiss_cnt(wma_handle,
2514 mac->roam.configParam.neighborRoamConfig.nRoamBmissFirstBcnt,
2515 mac->roam.configParam.neighborRoamConfig.nRoamBmissFinalBcnt,
2516 self_sta_req->session_id);
2517
2518 if (wlan_cfg_get_int(mac, WNI_CFG_ENABLE_MCC_ADAPTIVE_SCHED,
Jeff Johnsone88dd752018-06-07 22:57:54 -07002519 &cfg_val) == QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002520 WMA_LOGD("%s: setting ini value for WNI_CFG_ENABLE_MCC_ADAPTIVE_SCHED: %d",
2521 __func__, cfg_val);
2522 ret = wma_set_enable_disable_mcc_adaptive_scheduler(cfg_val);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302523 if (ret != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002524 WMA_LOGE("Failed to set WNI_CFG_ENABLE_MCC_ADAPTIVE_SCHED");
2525 }
2526 } else {
2527 WMA_LOGE("Failed to get value for WNI_CFG_ENABLE_MCC_ADAPTIVE_SCHED, leaving unchanged");
2528 }
Dustin Brown13995f02017-01-12 15:38:42 -08002529
2530 if (self_sta_req->type == WMI_VDEV_TYPE_STA) {
Nachiket Kukadee547a482018-05-22 16:43:30 +05302531 status = wma_config_active_apf_mode(wma_handle,
Dustin Brown13995f02017-01-12 15:38:42 -08002532 self_sta_req->session_id);
2533 if (QDF_IS_STATUS_ERROR(status))
Nachiket Kukadee547a482018-05-22 16:43:30 +05302534 WMA_LOGE("Failed to configure active APF mode");
Dustin Brown13995f02017-01-12 15:38:42 -08002535 }
2536
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002537end:
2538 self_sta_req->status = status;
2539
2540#ifdef QCA_IBSS_SUPPORT
2541 if (generateRsp)
2542#endif
2543 {
2544 sme_msg.type = eWNI_SME_ADD_STA_SELF_RSP;
2545 sme_msg.bodyptr = self_sta_req;
2546 sme_msg.bodyval = 0;
2547
Rajeev Kumarb60abe42017-01-21 15:39:31 -08002548 status = scheduler_post_msg(QDF_MODULE_ID_SME, &sme_msg);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302549 if (!QDF_IS_STATUS_SUCCESS(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002550 WMA_LOGE("Failed to post eWNI_SME_ADD_STA_SELF_RSP");
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302551 qdf_mem_free(self_sta_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002552 }
2553 }
2554 return txrx_vdev_handle;
2555}
2556
Jiachao Wu712d4fd2017-08-23 16:52:34 +08002557uint32_t wma_get_bcn_rate_code(uint16_t rate)
2558{
2559 /* rate in multiples of 100 Kbps */
2560 switch (rate) {
2561 case WMA_BEACON_TX_RATE_1_M:
2562 return WMI_BCN_TX_RATE_CODE_1_M;
2563 case WMA_BEACON_TX_RATE_2_M:
2564 return WMI_BCN_TX_RATE_CODE_2_M;
2565 case WMA_BEACON_TX_RATE_5_5_M:
2566 return WMI_BCN_TX_RATE_CODE_5_5_M;
2567 case WMA_BEACON_TX_RATE_11_M:
2568 return WMI_BCN_TX_RATE_CODE_11M;
2569 case WMA_BEACON_TX_RATE_6_M:
2570 return WMI_BCN_TX_RATE_CODE_6_M;
2571 case WMA_BEACON_TX_RATE_9_M:
2572 return WMI_BCN_TX_RATE_CODE_9_M;
2573 case WMA_BEACON_TX_RATE_12_M:
2574 return WMI_BCN_TX_RATE_CODE_12_M;
2575 case WMA_BEACON_TX_RATE_18_M:
2576 return WMI_BCN_TX_RATE_CODE_18_M;
2577 case WMA_BEACON_TX_RATE_24_M:
2578 return WMI_BCN_TX_RATE_CODE_24_M;
2579 case WMA_BEACON_TX_RATE_36_M:
2580 return WMI_BCN_TX_RATE_CODE_36_M;
2581 case WMA_BEACON_TX_RATE_48_M:
2582 return WMI_BCN_TX_RATE_CODE_48_M;
2583 case WMA_BEACON_TX_RATE_54_M:
2584 return WMI_BCN_TX_RATE_CODE_54_M;
2585 default:
2586 return WMI_BCN_TX_RATE_CODE_1_M;
2587 }
2588}
2589
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002590/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002591 * wma_vdev_start() - send vdev start request to fw
2592 * @wma: wma handle
2593 * @req: vdev start params
2594 * @isRestart: isRestart flag
2595 *
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302596 * Return: QDF status
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002597 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302598QDF_STATUS wma_vdev_start(tp_wma_handle wma,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002599 struct wma_vdev_start_req *req, bool isRestart)
2600{
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302601 struct vdev_start_params params = { 0 };
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002602 wmi_vdev_start_request_cmd_fixed_param *cmd;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002603 struct wma_txrx_node *intr = wma->interfaces;
2604 tpAniSirGlobal mac_ctx = NULL;
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302605 uint32_t temp_ssid_len = 0;
2606 uint32_t temp_flags = 0;
2607 uint32_t temp_chan_info = 0;
2608 uint32_t temp_reg_info_1 = 0;
2609 uint32_t temp_reg_info_2 = 0;
Kiran Kumar Lokere02b9aa42016-05-26 14:54:49 -07002610 uint16_t bw_val;
Himanshu Agarwalfc4dab92017-12-28 21:46:29 +05302611 struct wma_txrx_node *iface = &wma->interfaces[req->vdev_id];
2612 struct wma_target_req *req_msg;
Kabilan Kannan43d051f2018-01-04 17:54:34 -08002613 uint32_t chan_mode;
Kiran Kumar Lokere05a0658a2018-02-01 21:34:27 -08002614 enum phy_ch_width ch_width;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002615
Anurag Chouhan6d760662016-02-20 16:05:43 +05302616 mac_ctx = cds_get_context(QDF_MODULE_ID_PE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002617 if (mac_ctx == NULL) {
2618 WMA_LOGE("%s: vdev start failed as mac_ctx is NULL", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302619 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002620 }
2621
Naveen Rawatb4ea70f2018-03-23 17:10:01 -07002622 if (req->chan == 0) {
2623 WMA_LOGE("%s: invalid channel: %d", __func__, req->chan);
2624 QDF_ASSERT(0);
2625 return QDF_STATUS_E_INVAL;
2626 }
2627
Kiran Kumar Lokere05a0658a2018-02-01 21:34:27 -08002628 params.band_center_freq1 = cds_chan_to_freq(req->chan);
2629 ch_width = req->chan_width;
2630 bw_val = wlan_reg_get_bw_value(req->chan_width);
2631 if (20 < bw_val) {
2632 if (req->ch_center_freq_seg0) {
2633 params.band_center_freq1 =
2634 cds_chan_to_freq(req->ch_center_freq_seg0);
2635 } else {
2636 WMA_LOGE("%s: invalid cntr_freq for bw %d, drop to 20",
2637 __func__, bw_val);
2638 params.band_center_freq1 = cds_chan_to_freq(req->chan);
2639 ch_width = CH_WIDTH_20MHZ;
2640 bw_val = 20;
2641 }
2642 }
2643 if (80 < bw_val) {
2644 if (req->ch_center_freq_seg1) {
2645 params.band_center_freq2 =
2646 cds_chan_to_freq(req->ch_center_freq_seg1);
2647 } else {
2648 WMA_LOGE("%s: invalid cntr_freq for bw %d, drop to 80",
2649 __func__, bw_val);
2650 params.band_center_freq2 = 0;
2651 ch_width = CH_WIDTH_80MHZ;
2652 }
2653 } else {
2654 params.band_center_freq2 = 0;
2655 }
2656 chan_mode = wma_chan_phy_mode(req->chan, ch_width,
2657 req->dot11_mode);
Kabilan Kannan43d051f2018-01-04 17:54:34 -08002658
2659 if (chan_mode == MODE_UNKNOWN) {
2660 WMA_LOGE("%s: invalid phy mode!", __func__);
2661 return QDF_STATUS_E_FAILURE;
2662 }
2663
Kiran Kumar Lokere05a0658a2018-02-01 21:34:27 -08002664 if (!params.band_center_freq1) {
2665 WMA_LOGE("%s: invalid center freq1", __func__);
2666 return QDF_STATUS_E_FAILURE;
2667 }
2668
2669 if (((ch_width == CH_WIDTH_160MHZ) || (ch_width == CH_WIDTH_80P80MHZ))
2670 && !params.band_center_freq2) {
2671 WMA_LOGE("%s: invalid center freq2 for 160MHz", __func__);
2672 return QDF_STATUS_E_FAILURE;
2673 }
2674 /* Fill channel info */
2675 params.chan_freq = cds_chan_to_freq(req->chan);
2676 params.chan_mode = chan_mode;
2677
Zhu Jianmin4bf615e2018-05-23 19:52:46 +08002678 /* For Rome, only supports LFR2, not LFR3, for reassoc, need send vdev
2679 * start cmd to F/W while vdev started first, then send reassoc frame
2680 */
Himanshu Agarwalfc4dab92017-12-28 21:46:29 +05302681 if (!isRestart &&
Zhu Jianmin4bf615e2018-05-23 19:52:46 +08002682 qdf_atomic_read(&iface->bss_status) == WMA_BSS_STATUS_STARTED &&
2683 wmi_service_enabled(wma->wmi_handle, wmi_service_roam_ho_offload)) {
Himanshu Agarwalfc4dab92017-12-28 21:46:29 +05302684 req_msg = wma_find_vdev_req(wma, req->vdev_id,
2685 WMA_TARGET_REQ_TYPE_VDEV_STOP,
2686 false);
2687 if (!req_msg || req_msg->msg_type != WMA_DELETE_BSS_REQ) {
Dustin Brown83044c22018-08-13 15:00:44 -07002688 WMA_LOGE("BSS is in started state before vdev start");
2689 cds_trigger_recovery(QDF_REASON_UNSPECIFIED);
Himanshu Agarwalfc4dab92017-12-28 21:46:29 +05302690 }
2691 }
2692
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002693 WMA_LOGD("%s: Enter isRestart=%d vdev=%d", __func__, isRestart,
2694 req->vdev_id);
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302695 params.vdev_id = req->vdev_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002696
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302697 intr[params.vdev_id].chanmode = params.chan_mode;
2698 intr[params.vdev_id].ht_capable = req->ht_capable;
2699 intr[params.vdev_id].vht_capable = req->vht_capable;
2700 intr[params.vdev_id].config.gtx_info.gtxRTMask[0] =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002701 CFG_TGT_DEFAULT_GTX_HT_MASK;
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302702 intr[params.vdev_id].config.gtx_info.gtxRTMask[1] =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002703 CFG_TGT_DEFAULT_GTX_VHT_MASK;
Rajeev Kumar Sirasanagandlaaf474742016-09-06 17:54:50 +05302704
2705 if (wlan_cfg_get_int(mac_ctx, WNI_CFG_TGT_GTX_USR_CFG,
Jeff Johnsone88dd752018-06-07 22:57:54 -07002706 &intr[params.vdev_id].config.gtx_info.gtxUsrcfg)
2707 != QDF_STATUS_SUCCESS) {
Rajeev Kumar Sirasanagandlaaf474742016-09-06 17:54:50 +05302708 intr[params.vdev_id].config.gtx_info.gtxUsrcfg =
2709 WNI_CFG_TGT_GTX_USR_CFG_STADEF;
2710 QDF_TRACE(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_WARN,
2711 "Failed to get WNI_CFG_TGT_GTX_USR_CFG");
2712 }
2713
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302714 intr[params.vdev_id].config.gtx_info.gtxPERThreshold =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002715 CFG_TGT_DEFAULT_GTX_PER_THRESHOLD;
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302716 intr[params.vdev_id].config.gtx_info.gtxPERMargin =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002717 CFG_TGT_DEFAULT_GTX_PER_MARGIN;
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302718 intr[params.vdev_id].config.gtx_info.gtxTPCstep =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002719 CFG_TGT_DEFAULT_GTX_TPC_STEP;
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302720 intr[params.vdev_id].config.gtx_info.gtxTPCMin =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002721 CFG_TGT_DEFAULT_GTX_TPC_MIN;
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302722 intr[params.vdev_id].config.gtx_info.gtxBWMask =
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002723 CFG_TGT_DEFAULT_GTX_BW_MASK;
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302724 intr[params.vdev_id].mhz = params.chan_freq;
Kiran Kumar Lokere05a0658a2018-02-01 21:34:27 -08002725 intr[params.vdev_id].chan_width = ch_width;
Yeshwanth Sriram Guntukaa3f8d572018-03-14 11:10:23 +05302726 intr[params.vdev_id].channel = req->chan;
Krishna Kumaar Natarajan0103ef82017-02-17 18:15:56 -08002727 wma_copy_txrxnode_he_ops(&intr[params.vdev_id], req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002728
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302729 temp_chan_info &= 0xffffffc0;
2730 temp_chan_info |= params.chan_mode;
2731
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002732 /* Set half or quarter rate WMI flags */
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302733 params.is_half_rate = req->is_half_rate;
2734 params.is_quarter_rate = req->is_quarter_rate;
2735
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002736 if (req->is_half_rate)
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302737 temp_chan_info |= (1 << WMI_CHAN_FLAG_HALF_RATE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002738 else if (req->is_quarter_rate)
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302739 temp_chan_info |= (1 << WMI_CHAN_FLAG_QUARTER_RATE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002740
2741 /*
2742 * If the channel has DFS set, flip on radar reporting.
2743 *
2744 * It may be that this should only be done for IBSS/hostap operation
2745 * as this flag may be interpreted (at some point in the future)
2746 * by the firmware as "oh, and please do radar DETECTION."
2747 *
2748 * If that is ever the case we would insert the decision whether to
2749 * enable the firmware flag here.
2750 */
2751
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302752 params.is_dfs = req->is_dfs;
2753 params.is_restart = isRestart;
Arif Hussain671a1902017-03-17 09:08:32 -07002754 params.cac_duration_ms = req->cac_duration_ms;
2755 params.regdomain = req->dfs_regdomain;
Manjunathappa Prakash0e6e6b52016-04-21 11:48:48 -07002756 if ((QDF_GLOBAL_MONITOR_MODE != cds_get_conparam()) && req->is_dfs) {
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302757 temp_chan_info |= (1 << WMI_CHAN_FLAG_DFS);
2758 params.dis_hw_ack = true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002759
2760 /*
Arif Hussaincd151632017-02-11 16:57:19 -08002761 * If channel is DFS and operating in AP mode,
2762 * set the WMI_CHAN_FLAG_DFS flag.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002763 */
Arif Hussaincd151632017-02-11 16:57:19 -08002764 if (wma_is_vdev_in_ap_mode(wma, params.vdev_id) == true)
2765 params.flag_dfs = WMI_CHAN_FLAG_DFS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002766 }
2767
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302768 params.beacon_intval = req->beacon_intval;
2769 params.dtim_period = req->dtim_period;
Jiachao Wu712d4fd2017-08-23 16:52:34 +08002770
2771 if (req->beacon_tx_rate) {
2772 WMA_LOGD("%s: beacon tx rate [%hu * 100 Kbps]",
2773 __func__, req->beacon_tx_rate);
2774 temp_flags |= WMI_UNIFIED_VDEV_START_BCN_TX_RATE_PRESENT;
2775 /*
2776 * beacon_tx_rate is in multiples of 100 Kbps.
2777 * Convert the data rate to hw rate code.
2778 */
2779 params.bcn_tx_rate_code =
2780 wma_get_bcn_rate_code(req->beacon_tx_rate);
2781 }
2782
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002783 /* FIXME: Find out min, max and regulatory power levels */
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302784 params.max_txpow = req->max_txpow;
2785 temp_reg_info_1 &= 0xff00ffff;
2786 temp_reg_info_1 |= ((req->max_txpow&0xff) << 16);
2787
2788 temp_reg_info_2 &= 0xffff00ff;
2789 temp_reg_info_2 |= ((req->max_txpow&0xff)<<8);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002790
2791 /* TODO: Handle regulatory class, max antenna */
2792 if (!isRestart) {
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302793 params.beacon_intval = req->beacon_intval;
2794 params.dtim_period = req->dtim_period;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002795
2796 /* Copy the SSID */
2797 if (req->ssid.length) {
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302798 params.ssid.length = req->ssid.length;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002799 if (req->ssid.length < sizeof(cmd->ssid.ssid))
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302800 temp_ssid_len = req->ssid.length;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002801 else
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302802 temp_ssid_len = sizeof(cmd->ssid.ssid);
2803 qdf_mem_copy(params.ssid.mac_ssid, req->ssid.ssId,
2804 temp_ssid_len);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002805 }
2806
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302807 params.pmf_enabled = req->pmf_enabled;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002808 if (req->pmf_enabled)
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302809 temp_flags |= WMI_UNIFIED_VDEV_START_PMF_ENABLED;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002810 }
2811
gaurank kathpalia1b42e8d2017-12-15 15:44:06 +05302812 params.hidden_ssid = req->hidden_ssid;
2813 if (req->hidden_ssid)
2814 temp_flags |= WMI_UNIFIED_VDEV_START_HIDDEN_SSID;
2815
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302816 params.num_noa_descriptors = 0;
2817 params.preferred_rx_streams = req->preferred_rx_streams;
2818 params.preferred_tx_streams = req->preferred_tx_streams;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002819
Krishna Kumaar Natarajan0103ef82017-02-17 18:15:56 -08002820 wma_copy_vdev_start_he_ops(&params, req);
2821
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002822 /* Store vdev params in SAP mode which can be used in vdev restart */
2823 if (intr[req->vdev_id].type == WMI_VDEV_TYPE_AP &&
2824 intr[req->vdev_id].sub_type == 0) {
2825 intr[req->vdev_id].vdev_restart_params.vdev_id = req->vdev_id;
2826 intr[req->vdev_id].vdev_restart_params.ssid.ssid_len =
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302827 temp_ssid_len;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302828 qdf_mem_copy(intr[req->vdev_id].vdev_restart_params.ssid.ssid,
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302829 params.ssid.mac_ssid, temp_ssid_len);
2830 intr[req->vdev_id].vdev_restart_params.flags = temp_flags;
2831 intr[req->vdev_id].vdev_restart_params.requestor_id = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002832 intr[req->vdev_id].vdev_restart_params.disable_hw_ack =
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302833 params.dis_hw_ack;
2834 intr[req->vdev_id].vdev_restart_params.chan.mhz =
2835 params.chan_freq;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002836 intr[req->vdev_id].vdev_restart_params.chan.band_center_freq1 =
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302837 params.band_center_freq1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002838 intr[req->vdev_id].vdev_restart_params.chan.band_center_freq2 =
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302839 params.band_center_freq2;
2840 intr[req->vdev_id].vdev_restart_params.chan.info =
2841 temp_chan_info;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002842 intr[req->vdev_id].vdev_restart_params.chan.reg_info_1 =
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302843 temp_reg_info_1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002844 intr[req->vdev_id].vdev_restart_params.chan.reg_info_2 =
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302845 temp_reg_info_2;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002846 }
2847
2848 if (isRestart) {
2849 /*
2850 * Marking the VDEV UP STATUS to false
2851 * since, VDEV RESTART will do a VDEV DOWN
2852 * in the firmware.
2853 */
Mukul Sharmaf9047232017-03-02 16:58:56 +05302854 wma_vdev_set_mlme_state(wma, params.vdev_id, WLAN_VDEV_S_STOP);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002855 } else {
2856 WMA_LOGD("%s, vdev_id: %d, unpausing tx_ll_queue at VDEV_START",
Siddarth Poddar17dc4712016-03-09 16:30:27 +05302857 __func__, params.vdev_id);
Leo Chang96464902016-10-28 11:10:54 -07002858 cdp_fc_vdev_unpause(cds_get_context(QDF_MODULE_ID_SOC),
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08002859 wma->interfaces[params.vdev_id].handle,
2860 0xffffffff);
Mukul Sharma6411bb82017-03-01 15:57:07 +05302861 wma_vdev_update_pause_bitmap(params.vdev_id, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002862 }
2863
Dustin Brownd5f12942017-03-10 11:06:25 -08002864 return wma_send_vdev_start_to_fw(wma, &params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002865}
2866
2867/**
2868 * wma_peer_assoc_conf_handler() - peer assoc conf handler
2869 * @handle: wma handle
2870 * @cmd_param_info: event buffer
2871 * @len: buffer length
2872 *
2873 * Return: 0 for success or error code
2874 */
2875int wma_peer_assoc_conf_handler(void *handle, uint8_t *cmd_param_info,
2876 uint32_t len)
2877{
2878 tp_wma_handle wma = (tp_wma_handle) handle;
2879 WMI_PEER_ASSOC_CONF_EVENTID_param_tlvs *param_buf;
2880 wmi_peer_assoc_conf_event_fixed_param *event;
2881 struct wma_target_req *req_msg;
2882 uint8_t macaddr[IEEE80211_ADDR_LEN];
2883 int status = 0;
2884
2885 WMA_LOGD(FL("Enter"));
2886 param_buf = (WMI_PEER_ASSOC_CONF_EVENTID_param_tlvs *) cmd_param_info;
2887 if (!param_buf) {
2888 WMA_LOGE("Invalid peer assoc conf event buffer");
2889 return -EINVAL;
2890 }
2891
2892 event = param_buf->fixed_param;
2893 if (!event) {
2894 WMA_LOGE("Invalid peer assoc conf event buffer");
2895 return -EINVAL;
2896 }
2897
2898 WMI_MAC_ADDR_TO_CHAR_ARRAY(&event->peer_macaddr, macaddr);
2899 WMA_LOGD(FL("peer assoc conf for vdev:%d mac=%pM"),
2900 event->vdev_id, macaddr);
2901
2902 req_msg = wma_find_req(wma, event->vdev_id,
2903 WMA_PEER_ASSOC_CNF_START);
2904
2905 if (!req_msg) {
2906 WMA_LOGE(FL("Failed to lookup request message for vdev %d"),
2907 event->vdev_id);
2908 return -EINVAL;
2909 }
2910
Anurag Chouhan210db072016-02-22 18:42:15 +05302911 qdf_mc_timer_stop(&req_msg->event_timeout);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002912
2913 if (req_msg->msg_type == WMA_ADD_STA_REQ) {
2914 tpAddStaParams params = (tpAddStaParams)req_msg->user_data;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002915
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002916 if (!params) {
2917 WMA_LOGE(FL("add STA params is NULL for vdev %d"),
2918 event->vdev_id);
2919 status = -EINVAL;
2920 goto free_req_msg;
2921 }
2922
2923 /* peer assoc conf event means the cmd succeeds */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302924 params->status = QDF_STATUS_SUCCESS;
Srinivas Girigowdaf1472122017-03-09 15:44:12 -08002925 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 -08002926 params->staType, params->smesessionId,
2927 params->assocId, params->bssId, params->staIdx,
2928 params->status);
Abhishek Singh2d775fd2017-08-18 10:51:33 +05302929 wma_send_msg_high_priority(wma, WMA_ADD_STA_RSP,
2930 (void *)params, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002931 } else if (req_msg->msg_type == WMA_ADD_BSS_REQ) {
2932 tpAddBssParams params = (tpAddBssParams) req_msg->user_data;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002933
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002934 if (!params) {
2935 WMA_LOGE(FL("add BSS params is NULL for vdev %d"),
2936 event->vdev_id);
2937 status = -EINVAL;
2938 goto free_req_msg;
2939 }
2940
2941 /* peer assoc conf event means the cmd succeeds */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302942 params->status = QDF_STATUS_SUCCESS;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07002943 WMA_LOGD(FL("Send ADD BSS RSP: opermode: %d update_bss: %d nw_type: %d bssid: %pM staIdx %d status %d"),
2944 params->operMode,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002945 params->updateBss, params->nwType, params->bssId,
2946 params->staContext.staIdx, params->status);
Abhishek Singh2d775fd2017-08-18 10:51:33 +05302947 wma_send_msg_high_priority(wma, WMA_ADD_BSS_RSP,
2948 (void *)params, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002949 } else {
2950 WMA_LOGE(FL("Unhandled request message type: %d"),
2951 req_msg->msg_type);
2952 }
2953
2954free_req_msg:
Anurag Chouhan210db072016-02-22 18:42:15 +05302955 qdf_mc_timer_destroy(&req_msg->event_timeout);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302956 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002957
2958 return status;
2959}
2960
2961/**
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08002962 * wma_vdev_delete_handler() - vdev delete response handler
2963 * @handle: wma handle
2964 * @cmd_param_info: event buffer
2965 * @len: buffer length
2966 *
2967 * Return: 0 for success or error code
2968 */
2969int wma_vdev_delete_handler(void *handle, uint8_t *cmd_param_info,
2970 uint32_t len)
2971{
2972 tp_wma_handle wma = (tp_wma_handle) handle;
2973 WMI_VDEV_DELETE_RESP_EVENTID_param_tlvs *param_buf;
2974 wmi_vdev_delete_cmd_fixed_param *event;
2975 struct wma_target_req *req_msg;
2976 int status = 0;
2977
2978 param_buf = (WMI_VDEV_DELETE_RESP_EVENTID_param_tlvs *)cmd_param_info;
2979 if (!param_buf) {
2980 WMA_LOGE("Invalid vdev delete event buffer");
2981 return -EINVAL;
2982 }
2983
2984 event = (wmi_vdev_delete_cmd_fixed_param *)param_buf->fixed_param;
2985 if (!event) {
2986 WMA_LOGE("Invalid vdev delete event buffer");
2987 return -EINVAL;
2988 }
2989
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07002990 WMA_LOGD("%s Vdev delete resp vdev id %d", __func__, event->vdev_id);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08002991 req_msg = wma_find_vdev_req(wma, event->vdev_id,
Kiran Kumar Lokere20804162017-07-17 16:09:04 -07002992 WMA_TARGET_REQ_TYPE_VDEV_DEL, true);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08002993 if (!req_msg) {
2994 WMA_LOGD(FL("Vdev delete resp is not handled! vdev id %d"),
2995 event->vdev_id);
2996 return -EINVAL;
2997 }
Abhishek Singh1d1d3e32018-03-01 17:30:48 +05302998 qdf_mc_timer_stop(&req_msg->event_timeout);
2999 qdf_mc_timer_destroy(&req_msg->event_timeout);
Dustin Brownec2c92e2017-07-26 11:13:49 -07003000
3001 wma_release_wakelock(&wma->wmi_cmd_rsp_wake_lock);
3002
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003003 /* Send response to upper layers */
3004 wma_vdev_detach_callback(req_msg->user_data);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303005 qdf_mem_free(req_msg);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003006
3007 return status;
3008}
3009
3010/**
3011 * wma_peer_delete_handler() - peer delete response handler
3012 * @handle: wma handle
3013 * @cmd_param_info: event buffer
3014 * @len: buffer length
3015 *
3016 * Return: 0 for success or error code
3017 */
3018int wma_peer_delete_handler(void *handle, uint8_t *cmd_param_info,
3019 uint32_t len)
3020{
3021 tp_wma_handle wma = (tp_wma_handle) handle;
3022 WMI_PEER_DELETE_RESP_EVENTID_param_tlvs *param_buf;
3023 wmi_peer_delete_cmd_fixed_param *event;
3024 struct wma_target_req *req_msg;
3025 tDeleteStaParams *del_sta;
3026 uint8_t macaddr[IEEE80211_ADDR_LEN];
3027 int status = 0;
3028
3029 param_buf = (WMI_PEER_DELETE_RESP_EVENTID_param_tlvs *)cmd_param_info;
3030 if (!param_buf) {
3031 WMA_LOGE("Invalid vdev delete event buffer");
3032 return -EINVAL;
3033 }
3034
3035 event = (wmi_peer_delete_cmd_fixed_param *)param_buf->fixed_param;
3036 if (!event) {
3037 WMA_LOGE("Invalid vdev delete event buffer");
3038 return -EINVAL;
3039 }
3040
3041 WMI_MAC_ADDR_TO_CHAR_ARRAY(&event->peer_macaddr, macaddr);
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07003042 WMA_LOGD(FL("Peer Delete Response, vdev %d Peer %pM"),
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003043 event->vdev_id, macaddr);
Deepak Dhamdheref918d422017-07-06 12:56:29 -07003044 wlan_roam_debug_log(event->vdev_id, DEBUG_PEER_DELETE_RESP,
3045 DEBUG_INVALID_PEER_ID, macaddr, NULL, 0, 0);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003046 req_msg = wma_find_remove_req_msgtype(wma, event->vdev_id,
3047 WMA_DELETE_STA_REQ);
3048 if (!req_msg) {
3049 WMA_LOGD("Peer Delete response is not handled");
3050 return -EINVAL;
3051 }
3052
Dustin Brownec2c92e2017-07-26 11:13:49 -07003053 wma_release_wakelock(&wma->wmi_cmd_rsp_wake_lock);
3054
3055 /* Cleanup timeout handler */
Anurag Chouhan210db072016-02-22 18:42:15 +05303056 qdf_mc_timer_stop(&req_msg->event_timeout);
3057 qdf_mc_timer_destroy(&req_msg->event_timeout);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003058
3059 if (req_msg->type == WMA_DELETE_STA_RSP_START) {
3060 del_sta = req_msg->user_data;
3061 if (del_sta->respReqd) {
3062 WMA_LOGD(FL("Sending peer del rsp to umac"));
Abhishek Singh2d775fd2017-08-18 10:51:33 +05303063 wma_send_msg_high_priority(wma, WMA_DELETE_STA_RSP,
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303064 (void *)del_sta, QDF_STATUS_SUCCESS);
yeshwanth sriram guntuka945b6212017-03-07 15:56:45 +05303065 } else {
3066 qdf_mem_free(del_sta);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003067 }
3068 } else if (req_msg->type == WMA_DEL_P2P_SELF_STA_RSP_START) {
3069 struct del_sta_self_rsp_params *data;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003070
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003071 data = (struct del_sta_self_rsp_params *)req_msg->user_data;
3072 WMA_LOGD(FL("Calling vdev detach handler"));
3073 wma_handle_vdev_detach(wma, data->self_sta_param,
3074 data->generate_rsp);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303075 qdf_mem_free(data);
Sandeep Puligillabbee8172017-04-07 19:26:33 -07003076 } else if (req_msg->type == WMA_SET_LINK_PEER_RSP) {
3077 tpLinkStateParams params =
3078 (tpLinkStateParams) req_msg->user_data;
Dustin Brownec2c92e2017-07-26 11:13:49 -07003079 if (wma_send_vdev_down_to_fw(wma, req_msg->vdev_id) !=
3080 QDF_STATUS_SUCCESS) {
Sandeep Puligillabbee8172017-04-07 19:26:33 -07003081 WMA_LOGE("Failed to send vdev down cmd: vdev %d",
3082 req_msg->vdev_id);
3083 }
3084 wma_send_msg(wma, WMA_SET_LINK_STATE_RSP, (void *)params, 0);
Abhishek Singhe8be9a62017-05-30 12:13:29 +05303085 } else if (req_msg->type == WMA_DELETE_PEER_RSP) {
3086 wma_send_del_bss_response(wma, req_msg, req_msg->vdev_id);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003087 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303088 qdf_mem_free(req_msg);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003089 return status;
3090}
3091
Dustin Brown83044c22018-08-13 15:00:44 -07003092static void wma_trigger_recovery_assert_on_fw_timeout(uint16_t wma_msg)
Himanshu Agarwal1230ee02018-05-04 00:31:12 +05303093{
Dustin Brown83044c22018-08-13 15:00:44 -07003094 WMA_LOGE("%s timed out, triggering recovery",
3095 mac_trace_get_wma_msg_string(wma_msg));
3096 cds_trigger_recovery(QDF_REASON_UNSPECIFIED);
Himanshu Agarwal1230ee02018-05-04 00:31:12 +05303097}
3098
Manikandan Mohanb089ed62017-02-13 11:38:14 -08003099static inline bool wma_crash_on_fw_timeout(bool crash_enabled)
3100{
3101 /* Discard FW timeouts and dont crash during SSR */
3102 if (cds_is_driver_recovering())
3103 return false;
3104
Sandeep Puligilla5ac6bd22017-10-17 12:33:56 -07003105 /* Firmware is down send failure response */
3106 if (cds_is_fw_down())
Nachiket Kukade8003d252017-03-30 15:55:58 +05303107 return false;
3108
Kapil Gupta8c336652017-05-30 16:54:13 +05303109 if (cds_is_driver_unloading())
3110 return false;
3111
Manikandan Mohanb089ed62017-02-13 11:38:14 -08003112 return crash_enabled;
3113}
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003114
3115/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003116 * wma_hold_req_timer() - wma hold request timeout function
3117 * @data: target request params
3118 *
3119 * Return: none
3120 */
3121void wma_hold_req_timer(void *data)
3122{
3123 tp_wma_handle wma;
3124 struct wma_target_req *tgt_req = (struct wma_target_req *)data;
3125 struct wma_target_req *msg;
3126
Anurag Chouhan6d760662016-02-20 16:05:43 +05303127 wma = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003128 if (NULL == wma) {
3129 WMA_LOGE(FL("Failed to get wma"));
Naveen Rawat0eb3dd02017-04-03 20:18:30 -07003130 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003131 }
3132
3133 WMA_LOGA(FL("request %d is timed out for vdev_id - %d"),
3134 tgt_req->msg_type, tgt_req->vdev_id);
3135 msg = wma_find_req(wma, tgt_req->vdev_id, tgt_req->type);
3136
3137 if (!msg) {
3138 WMA_LOGE(FL("Failed to lookup request message - %d"),
3139 tgt_req->msg_type);
Naveen Rawat0eb3dd02017-04-03 20:18:30 -07003140 /*
3141 * if find request failed, then firmware rsp should have
3142 * consumed the buffer. Do not free.
3143 */
3144 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003145 }
3146
3147 if (tgt_req->msg_type == WMA_ADD_STA_REQ) {
3148 tpAddStaParams params = (tpAddStaParams) tgt_req->user_data;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003149
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303150 params->status = QDF_STATUS_E_TIMEOUT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003151 WMA_LOGA(FL("WMA_ADD_STA_REQ timed out"));
3152 WMA_LOGD(FL("Sending add sta rsp to umac (mac:%pM, status:%d)"),
3153 params->staMac, params->status);
Himanshu Agarwal1230ee02018-05-04 00:31:12 +05303154 if (wma_crash_on_fw_timeout(wma->fw_timeout_crash) == true) {
3155 wma_trigger_recovery_assert_on_fw_timeout(
3156 WMA_ADD_STA_REQ);
3157 } else {
Abhishek Singh2d775fd2017-08-18 10:51:33 +05303158 wma_send_msg_high_priority(wma, WMA_ADD_STA_RSP,
3159 (void *)params, 0);
Himanshu Agarwal1230ee02018-05-04 00:31:12 +05303160 }
Krishna Kumaar Natarajanf1d6dee2016-02-11 16:40:43 -08003161 } else if (tgt_req->msg_type == WMA_ADD_BSS_REQ) {
3162 tpAddBssParams params = (tpAddBssParams) tgt_req->user_data;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003163
Krishna Kumaar Natarajanf1d6dee2016-02-11 16:40:43 -08003164 params->status = QDF_STATUS_E_TIMEOUT;
3165 WMA_LOGA(FL("WMA_ADD_BSS_REQ timed out"));
3166 WMA_LOGD(FL("Sending add bss rsp to umac (mac:%pM, status:%d)"),
3167 params->selfMacAddr, params->status);
Himanshu Agarwal1230ee02018-05-04 00:31:12 +05303168 if (wma_crash_on_fw_timeout(wma->fw_timeout_crash) == true) {
3169 wma_trigger_recovery_assert_on_fw_timeout(
3170 WMA_ADD_BSS_REQ);
3171 } else {
Abhishek Singh2d775fd2017-08-18 10:51:33 +05303172 wma_send_msg_high_priority(wma, WMA_ADD_BSS_RSP,
3173 (void *)params, 0);
Himanshu Agarwal1230ee02018-05-04 00:31:12 +05303174 }
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003175 } else if ((tgt_req->msg_type == WMA_DELETE_STA_REQ) &&
3176 (tgt_req->type == WMA_DELETE_STA_RSP_START)) {
3177 tpDeleteStaParams params =
3178 (tpDeleteStaParams) tgt_req->user_data;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303179 params->status = QDF_STATUS_E_TIMEOUT;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003180 WMA_LOGE(FL("WMA_DEL_STA_REQ timed out"));
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07003181 WMA_LOGE(FL("Sending del sta rsp to umac (mac:%pM, status:%d)"),
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003182 params->staMac, params->status);
Sandeep Puligillaafa52892016-10-26 19:03:16 -07003183
Manikandan Mohanb089ed62017-02-13 11:38:14 -08003184 if (wma_crash_on_fw_timeout(wma->fw_timeout_crash) == true) {
Himanshu Agarwal1230ee02018-05-04 00:31:12 +05303185 wma_trigger_recovery_assert_on_fw_timeout(
3186 WMA_DELETE_STA_REQ);
Sandeep Puligillaafa52892016-10-26 19:03:16 -07003187 } else {
3188 /*
3189 * Assert in development build only.
3190 * Send response in production builds.
3191 */
3192 QDF_ASSERT(0);
Abhishek Singh2d775fd2017-08-18 10:51:33 +05303193 wma_send_msg_high_priority(wma, WMA_DELETE_STA_RSP,
Sandeep Puligillaafa52892016-10-26 19:03:16 -07003194 (void *)params, 0);
3195 }
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003196 } else if ((tgt_req->msg_type == WMA_DELETE_STA_REQ) &&
3197 (tgt_req->type == WMA_DEL_P2P_SELF_STA_RSP_START)) {
Abhishek Singhc614ec42017-04-25 16:17:34 +05303198 struct del_sta_self_rsp_params *del_sta;
Srinivas Girigowda4d65ebe2017-10-13 21:41:42 -07003199
Abhishek Singhc614ec42017-04-25 16:17:34 +05303200 del_sta = (struct del_sta_self_rsp_params *)tgt_req->user_data;
3201 del_sta->self_sta_param->status = QDF_STATUS_E_TIMEOUT;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003202 WMA_LOGA(FL("wma delete sta p2p request timed out"));
Abhishek Singhc614ec42017-04-25 16:17:34 +05303203
3204 if (wma_crash_on_fw_timeout(wma->fw_timeout_crash)) {
Himanshu Agarwal1230ee02018-05-04 00:31:12 +05303205 wma_trigger_recovery_assert_on_fw_timeout(
3206 WMA_DELETE_STA_REQ);
Abhishek Singhc614ec42017-04-25 16:17:34 +05303207 } else {
3208 if (del_sta->generate_rsp)
3209 wma_send_del_sta_self_resp(
3210 del_sta->self_sta_param);
3211 }
3212 qdf_mem_free(tgt_req->user_data);
Sandeep Puligillabbee8172017-04-07 19:26:33 -07003213 } else if ((tgt_req->msg_type == WMA_DELETE_STA_REQ) &&
3214 (tgt_req->type == WMA_SET_LINK_PEER_RSP)) {
Abhishek Singhc614ec42017-04-25 16:17:34 +05303215 tpLinkStateParams params =
3216 (tpLinkStateParams) tgt_req->user_data;
3217
3218 params->status = false;
Sandeep Puligillabbee8172017-04-07 19:26:33 -07003219 WMA_LOGA(FL("wma delete peer for set link timed out"));
Himanshu Agarwal1230ee02018-05-04 00:31:12 +05303220 if (wma_crash_on_fw_timeout(wma->fw_timeout_crash) == true) {
3221 wma_trigger_recovery_assert_on_fw_timeout(
3222 WMA_DELETE_STA_REQ);
3223 } else {
Abhishek Singhc614ec42017-04-25 16:17:34 +05303224 wma_send_msg(wma, WMA_SET_LINK_STATE_RSP,
3225 params, 0);
Himanshu Agarwal1230ee02018-05-04 00:31:12 +05303226 }
Abhishek Singhe8be9a62017-05-30 12:13:29 +05303227 } else if ((tgt_req->msg_type == WMA_DELETE_STA_REQ) &&
3228 (tgt_req->type == WMA_DELETE_PEER_RSP)) {
Abhishek Singhc614ec42017-04-25 16:17:34 +05303229 tpDeleteBssParams params =
3230 (tpDeleteBssParams) tgt_req->user_data;
3231
3232 params->status = QDF_STATUS_E_TIMEOUT;
3233 WMA_LOGE(FL("wma delete peer for del bss req timed out"));
Himanshu Agarwal1230ee02018-05-04 00:31:12 +05303234 if (wma_crash_on_fw_timeout(wma->fw_timeout_crash) == true) {
3235 wma_trigger_recovery_assert_on_fw_timeout(
3236 WMA_DELETE_STA_REQ);
3237 } else {
Abhishek Singh2d775fd2017-08-18 10:51:33 +05303238 wma_send_msg_high_priority(wma, WMA_DELETE_BSS_RSP,
3239 params, 0);
Himanshu Agarwal1230ee02018-05-04 00:31:12 +05303240 }
Tushnim Bhattacharyya86294892017-10-25 16:29:11 -07003241 } else if ((tgt_req->msg_type == SIR_HAL_PDEV_SET_HW_MODE) &&
3242 (tgt_req->type == WMA_PDEV_SET_HW_MODE_RESP)) {
3243 struct sir_set_hw_mode_resp *params =
3244 qdf_mem_malloc(sizeof(*params));
3245
3246 WMA_LOGE(FL("set hw mode req timed out"));
3247
3248 if (!params)
3249 WMA_LOGE("%s: Memory allocation failed", __func__);
3250 else {
3251 params->status = SET_HW_MODE_STATUS_ECANCELED;
3252 params->cfgd_hw_mode_index = 0;
3253 params->num_vdev_mac_entries = 0;
3254
3255 if (wma_crash_on_fw_timeout(wma->fw_timeout_crash) == true)
3256 QDF_BUG(0);
3257 else
3258 wma_send_msg_high_priority(wma,
3259 SIR_HAL_PDEV_SET_HW_MODE_RESP, params, 0);
3260 }
Krishna Kumaar Natarajanf1d6dee2016-02-11 16:40:43 -08003261 } else {
3262 WMA_LOGE(FL("Unhandled timeout for msg_type:%d and type:%d"),
3263 tgt_req->msg_type, tgt_req->type);
3264 QDF_BUG(0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003265 }
Abhishek Singh07b97852017-08-01 11:10:07 +05303266 qdf_mc_timer_destroy(&tgt_req->event_timeout);
Abhishek Singhc614ec42017-04-25 16:17:34 +05303267 qdf_mem_free(tgt_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003268}
3269
3270/**
3271 * wma_fill_hold_req() - fill wma request
3272 * @wma: wma handle
3273 * @msg_type: message type
3274 * @type: request type
3275 * @params: request params
3276 * @timeout: timeout value
3277 *
3278 * Return: wma_target_req ptr
3279 */
3280struct wma_target_req *wma_fill_hold_req(tp_wma_handle wma,
3281 uint8_t vdev_id,
3282 uint32_t msg_type, uint8_t type,
3283 void *params, uint32_t timeout)
3284{
3285 struct wma_target_req *req;
Anurag Chouhanffb21542016-02-17 14:33:03 +05303286 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003287
Yeshwanth Sriram Guntuka25fa2c02018-08-01 15:31:10 +05303288 if (!cds_is_target_ready()) {
3289 WMA_LOGE("target not ready, drop the request");
3290 return NULL;
3291 }
3292
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303293 req = qdf_mem_malloc(sizeof(*req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003294 if (!req) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07003295 WMA_LOGE(FL("Failed to allocate memory for msg %d vdev %d"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003296 msg_type, vdev_id);
3297 return NULL;
3298 }
3299
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07003300 WMA_LOGD(FL("vdev_id %d msg %d type %d"), vdev_id, msg_type, type);
Abhishek Singhc614ec42017-04-25 16:17:34 +05303301 qdf_spin_lock_bh(&wma->wma_hold_req_q_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003302 req->vdev_id = vdev_id;
3303 req->msg_type = msg_type;
3304 req->type = type;
3305 req->user_data = params;
Anurag Chouhanffb21542016-02-17 14:33:03 +05303306 status = qdf_list_insert_back(&wma->wma_hold_req_queue, &req->node);
3307 if (QDF_STATUS_SUCCESS != status) {
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303308 qdf_spin_unlock_bh(&wma->wma_hold_req_q_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003309 WMA_LOGE(FL("Failed add request in queue"));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303310 qdf_mem_free(req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003311 return NULL;
3312 }
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303313 qdf_spin_unlock_bh(&wma->wma_hold_req_q_lock);
Abhishek Singhc614ec42017-04-25 16:17:34 +05303314 qdf_mc_timer_init(&req->event_timeout, QDF_TIMER_TYPE_SW,
3315 wma_hold_req_timer, req);
3316 qdf_mc_timer_start(&req->event_timeout, timeout);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003317 return req;
3318}
3319
3320/**
3321 * wma_remove_req() - remove request
3322 * @wma: wma handle
3323 * @vdev_id: vdev id
3324 * @type: type
3325 *
3326 * Return: none
3327 */
3328void wma_remove_req(tp_wma_handle wma, uint8_t vdev_id,
3329 uint8_t type)
3330{
3331 struct wma_target_req *req_msg;
3332
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07003333 WMA_LOGD(FL("Remove req for vdev: %d type: %d"), vdev_id, type);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003334 req_msg = wma_find_req(wma, vdev_id, type);
3335 if (!req_msg) {
3336 WMA_LOGE(FL("target req not found for vdev: %d type: %d"),
3337 vdev_id, type);
3338 return;
3339 }
3340
Anurag Chouhan210db072016-02-22 18:42:15 +05303341 qdf_mc_timer_stop(&req_msg->event_timeout);
3342 qdf_mc_timer_destroy(&req_msg->event_timeout);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303343 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003344}
3345
3346/**
3347 * wma_vdev_resp_timer() - wma response timeout function
3348 * @data: target request params
3349 *
3350 * Return: none
3351 */
3352void wma_vdev_resp_timer(void *data)
3353{
3354 tp_wma_handle wma;
3355 struct wma_target_req *tgt_req = (struct wma_target_req *)data;
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003356 struct cdp_pdev *pdev;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003357 struct wma_target_req *msg;
Sandeep Puligilla7da86332016-11-10 16:14:40 -08003358 uint8_t peer_id;
Abhishek Singhc614ec42017-04-25 16:17:34 +05303359 int status;
Sandeep Puligilla7da86332016-11-10 16:14:40 -08003360 void *peer;
Leo Chang96464902016-10-28 11:10:54 -07003361 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003362#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
Wu Gao30f65eb2017-08-09 19:56:10 +08003363 tpAniSirGlobal mac_ctx;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003364#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
3365
Anurag Chouhan6d760662016-02-20 16:05:43 +05303366 wma = cds_get_context(QDF_MODULE_ID_WMA);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003367
3368 if (NULL == wma) {
3369 WMA_LOGE("%s: Failed to get wma", __func__);
Liangwei Dong748cb5d2016-09-29 00:56:40 -04003370 wma_cleanup_target_req_param(tgt_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003371 goto free_tgt_req;
3372 }
3373
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003374 WMA_LOGA("%s: request %d is timed out for vdev_id - %d", __func__,
3375 tgt_req->msg_type, tgt_req->vdev_id);
Kiran Kumar Lokere20804162017-07-17 16:09:04 -07003376 msg = wma_find_vdev_req(wma, tgt_req->vdev_id, tgt_req->type, true);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003377
3378 if (!msg) {
3379 WMA_LOGE("%s: Failed to lookup request message - %d",
3380 __func__, tgt_req->msg_type);
Houston Hoffmanb4558eb2017-05-18 15:07:51 -07003381 return;
3382 }
3383
3384 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
3385
3386 if (NULL == pdev) {
3387 WMA_LOGE("%s: Failed to get pdev", __func__);
Liangwei Dong748cb5d2016-09-29 00:56:40 -04003388 wma_cleanup_target_req_param(tgt_req);
Houston Hoffmanb4558eb2017-05-18 15:07:51 -07003389 qdf_mc_timer_stop(&tgt_req->event_timeout);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003390 goto free_tgt_req;
3391 }
3392
Wu Gao30f65eb2017-08-09 19:56:10 +08003393#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
3394 mac_ctx = cds_get_context(QDF_MODULE_ID_PE);
3395 if (!mac_ctx) {
3396 WMA_LOGE("%s: Failed to get mac_ctx", __func__);
3397 wma_cleanup_target_req_param(tgt_req);
3398 goto free_tgt_req;
3399 }
3400#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
3401
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003402 if (tgt_req->msg_type == WMA_CHNL_SWITCH_REQ) {
3403 tpSwitchChannelParams params =
3404 (tpSwitchChannelParams) tgt_req->user_data;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303405 params->status = QDF_STATUS_E_TIMEOUT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003406 WMA_LOGA("%s: WMA_SWITCH_CHANNEL_REQ timedout", __func__);
Sandeep Puligillaafa52892016-10-26 19:03:16 -07003407
Nachiket Kukade8003d252017-03-30 15:55:58 +05303408 /*
3409 * Trigger host crash if the flag is set or if the timeout
3410 * is not due to fw down
3411 */
Himanshu Agarwal1230ee02018-05-04 00:31:12 +05303412 if (wma_crash_on_fw_timeout(wma->fw_timeout_crash) == true) {
3413 wma_trigger_recovery_assert_on_fw_timeout(
3414 WMA_CHNL_SWITCH_REQ);
3415 } else {
Abhishek Singh2d775fd2017-08-18 10:51:33 +05303416 wma_send_msg_high_priority(wma, WMA_SWITCH_CHANNEL_RSP,
Sandeep Puligillaafa52892016-10-26 19:03:16 -07003417 (void *)params, 0);
Himanshu Agarwal1230ee02018-05-04 00:31:12 +05303418 }
Agrawal Ashish7dd7c592016-02-22 14:25:11 +05303419 if (wma->interfaces[tgt_req->vdev_id].is_channel_switch) {
3420 wma->interfaces[tgt_req->vdev_id].is_channel_switch =
3421 false;
3422 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003423 } else if (tgt_req->msg_type == WMA_DELETE_BSS_REQ) {
3424 tpDeleteBssParams params =
3425 (tpDeleteBssParams) tgt_req->user_data;
3426 struct beacon_info *bcn;
3427 struct wma_txrx_node *iface;
3428
Naveen Rawatf2bd42d2017-06-29 14:51:43 -07003429 if (tgt_req->vdev_id >= wma->max_bssid) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003430 WMA_LOGE("%s: Invalid vdev_id %d", __func__,
3431 tgt_req->vdev_id);
Liangwei Dong748cb5d2016-09-29 00:56:40 -04003432 wma_cleanup_target_req_param(tgt_req);
Anurag Chouhan210db072016-02-22 18:42:15 +05303433 qdf_mc_timer_stop(&tgt_req->event_timeout);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003434 goto free_tgt_req;
3435 }
3436
3437 iface = &wma->interfaces[tgt_req->vdev_id];
3438 if (iface->handle == NULL) {
3439 WMA_LOGE("%s vdev id %d is already deleted",
3440 __func__, tgt_req->vdev_id);
Liangwei Dong748cb5d2016-09-29 00:56:40 -04003441 wma_cleanup_target_req_param(tgt_req);
Anurag Chouhan210db072016-02-22 18:42:15 +05303442 qdf_mc_timer_stop(&tgt_req->event_timeout);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003443 goto free_tgt_req;
3444 }
Nachiket Kukade8003d252017-03-30 15:55:58 +05303445 /*
3446 * Trigger host crash if the flag is set or if the timeout
3447 * is not due to fw down
3448 */
Manikandan Mohanb089ed62017-02-13 11:38:14 -08003449 if (wma_crash_on_fw_timeout(wma->fw_timeout_crash) == true) {
Himanshu Agarwal1230ee02018-05-04 00:31:12 +05303450 wma_trigger_recovery_assert_on_fw_timeout(
3451 WMA_DELETE_BSS_REQ);
Prakash Dhavali0b792742016-12-02 17:56:36 -08003452 return;
3453 }
3454
Krishna Kumaar Natarajanf24bfc82017-02-07 11:54:05 -08003455 status = wma_remove_bss_peer(wma, pdev, tgt_req,
3456 tgt_req->vdev_id, params);
3457 if (status != 0)
3458 goto free_tgt_req;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003459
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05303460 if (wmi_service_enabled(
3461 wma->wmi_handle,
3462 wmi_service_sync_delete_cmds))
Abhishek Singhe8be9a62017-05-30 12:13:29 +05303463 goto free_tgt_req;
3464
Dustin Brownec2c92e2017-07-26 11:13:49 -07003465 if (wma_send_vdev_down_to_fw(wma, tgt_req->vdev_id) !=
3466 QDF_STATUS_SUCCESS) {
Sandeep Puligilla58c84ef2016-08-21 16:20:33 -07003467 WMA_LOGE("Failed to send vdev down cmd: vdev %d",
3468 tgt_req->vdev_id);
3469 } else {
Mukul Sharmaf9047232017-03-02 16:58:56 +05303470 wma_vdev_set_mlme_state(wma, tgt_req->vdev_id,
3471 WLAN_VDEV_S_STOP);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003472#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
Sandeep Puligilla58c84ef2016-08-21 16:20:33 -07003473 if (mac_ctx->sap.sap_channel_avoidance)
3474 wma_find_mcc_ap(wma, tgt_req->vdev_id, false);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003475#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
3476 }
Leo Chang96464902016-10-28 11:10:54 -07003477 cdp_fc_vdev_flush(soc, iface->handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003478 WMA_LOGD("%s, vdev_id: %d, un-pausing tx_ll_queue for WDA_DELETE_BSS_REQ timeout",
3479 __func__, tgt_req->vdev_id);
Leo Chang96464902016-10-28 11:10:54 -07003480 cdp_fc_vdev_unpause(soc, iface->handle,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003481 OL_TXQ_PAUSE_REASON_VDEV_STOP);
Mukul Sharma6411bb82017-03-01 15:57:07 +05303482 wma_vdev_clear_pause_bit(tgt_req->vdev_id, PAUSE_TYPE_HOST);
Anurag Chouhan8e0ccd32016-02-19 15:30:20 +05303483 qdf_atomic_set(&iface->bss_status, WMA_BSS_STATUS_STOPPED);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003484 WMA_LOGD("%s: (type %d subtype %d) BSS is stopped",
3485 __func__, iface->type, iface->sub_type);
3486
3487 bcn = wma->interfaces[tgt_req->vdev_id].beacon;
3488
3489 if (bcn) {
Jeff Johnsonadba3962017-09-18 08:12:35 -07003490 WMA_LOGD("%s: Freeing beacon struct %pK, template memory %pK",
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003491 __func__, bcn, bcn->buf);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003492 if (bcn->dma_mapped)
Leo Chang96464902016-10-28 11:10:54 -07003493 qdf_nbuf_unmap_single(wma->qdf_dev, bcn->buf,
Anurag Chouhan6d760662016-02-20 16:05:43 +05303494 QDF_DMA_TO_DEVICE);
Nirav Shahcbc6d722016-03-01 16:24:53 +05303495 qdf_nbuf_free(bcn->buf);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303496 qdf_mem_free(bcn);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003497 wma->interfaces[tgt_req->vdev_id].beacon = NULL;
3498 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303499 params->status = QDF_STATUS_E_TIMEOUT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003500 WMA_LOGA("%s: WMA_DELETE_BSS_REQ timedout", __func__);
Abhishek Singh2d775fd2017-08-18 10:51:33 +05303501 wma_send_msg_high_priority(wma, WMA_DELETE_BSS_RSP,
3502 (void *)params, 0);
Abhishek Singh0d74f9e2017-09-26 14:02:42 +05303503 if (iface->del_staself_req && iface->is_del_sta_defered) {
3504 iface->is_del_sta_defered = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003505 WMA_LOGA("scheduling defered deletion(vdev id %x)",
3506 tgt_req->vdev_id);
3507 wma_vdev_detach(wma, iface->del_staself_req, 1);
3508 }
3509 } else if (tgt_req->msg_type == WMA_DEL_STA_SELF_REQ) {
3510 struct wma_txrx_node *iface =
3511 (struct wma_txrx_node *)tgt_req->user_data;
3512 struct del_sta_self_params *params =
3513 (struct del_sta_self_params *) iface->del_staself_req;
3514
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05303515 if (wmi_service_enabled(wma->wmi_handle,
3516 wmi_service_sync_delete_cmds)) {
Dustin Brownec2c92e2017-07-26 11:13:49 -07003517 wma_release_wakelock(&wma->wmi_cmd_rsp_wake_lock);
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003518 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303519 params->status = QDF_STATUS_E_TIMEOUT;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08003520
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003521 WMA_LOGA("%s: WMA_DEL_STA_SELF_REQ timedout", __func__);
Abhishek Singh0ac37442018-05-02 21:07:57 +05303522
Himanshu Agarwal1230ee02018-05-04 00:31:12 +05303523 if (wma_crash_on_fw_timeout(wma->fw_timeout_crash) == true) {
3524 wma_trigger_recovery_assert_on_fw_timeout(
3525 WMA_DEL_STA_SELF_REQ);
Abhishek Singh0ac37442018-05-02 21:07:57 +05303526 } else if (!cds_is_driver_unloading() &&
3527 (cds_is_fw_down() || cds_is_driver_recovering())) {
3528 qdf_mem_free(iface->del_staself_req);
3529 iface->del_staself_req = NULL;
Himanshu Agarwal1230ee02018-05-04 00:31:12 +05303530 } else {
Abhishek Singhc614ec42017-04-25 16:17:34 +05303531 wma_send_del_sta_self_resp(iface->del_staself_req);
Abhinav Kumar0a846132018-08-09 11:49:46 +05303532 iface->del_staself_req = NULL;
Abhishek Singh0ac37442018-05-02 21:07:57 +05303533 }
Dustin Brown35b61f62017-08-31 16:03:32 -07003534
3535 wma_vdev_deinit(iface);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303536 qdf_mem_zero(iface, sizeof(*iface));
Dustin Brown35b61f62017-08-31 16:03:32 -07003537 wma_vdev_init(iface);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003538 } else if (tgt_req->msg_type == WMA_ADD_BSS_REQ) {
3539 tpAddBssParams params = (tpAddBssParams) tgt_req->user_data;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003540
Krishna Kumaar Natarajan06edf7c2016-11-17 12:21:59 -08003541 params->status = QDF_STATUS_E_TIMEOUT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003542 WMA_LOGA("%s: WMA_ADD_BSS_REQ timedout", __func__);
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07003543 WMA_LOGD("%s: bssid %pM vdev_id %d", __func__, params->bssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003544 tgt_req->vdev_id);
Manikandan Mohanb089ed62017-02-13 11:38:14 -08003545 if (wma_crash_on_fw_timeout(wma->fw_timeout_crash) == true) {
Himanshu Agarwal1230ee02018-05-04 00:31:12 +05303546 wma_trigger_recovery_assert_on_fw_timeout(
3547 WMA_ADD_BSS_REQ);
Sandeep Puligillaafa52892016-10-26 19:03:16 -07003548 } else {
Min Liuf2bc4852018-08-03 17:10:28 +08003549 peer = cdp_peer_find_by_addr(soc, pdev, params->bssId,
3550 &peer_id);
3551 if (peer)
3552 wma_remove_peer(wma, params->bssId,
3553 tgt_req->vdev_id, peer, false);
3554 else
3555 WMA_LOGE("%s: Failed to find peer", __func__);
3556
Abhishek Singh2d775fd2017-08-18 10:51:33 +05303557 wma_send_msg_high_priority(wma, WMA_ADD_BSS_RSP,
3558 (void *)params, 0);
Sandeep Puligillaafa52892016-10-26 19:03:16 -07003559 QDF_ASSERT(0);
3560 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003561 goto free_tgt_req;
Sandeep Puligilla88de6fb2016-09-23 17:08:44 -07003562
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003563 } else if (tgt_req->msg_type == WMA_OCB_SET_CONFIG_CMD) {
3564 struct wma_txrx_node *iface;
3565
3566 WMA_LOGE(FL("Failed to send OCB set config cmd"));
3567 iface = &wma->interfaces[tgt_req->vdev_id];
Mukul Sharmaf9047232017-03-02 16:58:56 +05303568 wma_vdev_set_mlme_state(wma, tgt_req->vdev_id,
3569 WLAN_VDEV_S_STOP);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303570 wma_ocb_set_config_resp(wma, QDF_STATUS_E_TIMEOUT);
Selvaraj, Sridhara0083c42016-06-22 22:15:43 +05303571 } else if (tgt_req->msg_type == WMA_HIDDEN_SSID_VDEV_RESTART) {
Abhishek Singhf06214b2018-08-17 12:16:39 +05303572 if ((qdf_atomic_read(
3573 &wma->interfaces[tgt_req->vdev_id].vdev_restart_params.
3574 hidden_ssid_restart_in_progress)) &&
3575 wma_is_vdev_in_ap_mode(wma, tgt_req->vdev_id)) {
3576
3577 WMA_LOGE("Hidden ssid vdev restart Timed Out; vdev_id: %d, type = %d",
3578 tgt_req->vdev_id, tgt_req->type);
3579 qdf_atomic_set(&wma->interfaces[tgt_req->vdev_id].
3580 vdev_restart_params.
3581 hidden_ssid_restart_in_progress, 0);
3582 qdf_mem_free(tgt_req->user_data);
3583 }
Sandeep Puligilla7da86332016-11-10 16:14:40 -08003584 } else if (tgt_req->msg_type == WMA_SET_LINK_STATE) {
3585 tpLinkStateParams params =
3586 (tpLinkStateParams) tgt_req->user_data;
3587
3588 peer = cdp_peer_find_by_addr(soc, pdev, params->bssid, &peer_id);
3589 if (peer) {
3590 WMA_LOGP(FL("Deleting peer %pM vdev id %d"),
3591 params->bssid, tgt_req->vdev_id);
3592 wma_remove_peer(wma, params->bssid, tgt_req->vdev_id,
3593 peer, false);
3594 }
Dustin Brownec2c92e2017-07-26 11:13:49 -07003595 if (wma_send_vdev_down_to_fw(wma, tgt_req->vdev_id) !=
3596 QDF_STATUS_SUCCESS) {
Sandeep Puligilla7da86332016-11-10 16:14:40 -08003597 WMA_LOGE("Failed to send vdev down cmd: vdev %d",
3598 tgt_req->vdev_id);
3599 }
3600 params->status = QDF_STATUS_E_TIMEOUT;
3601 WMA_LOGA("%s: WMA_SET_LINK_STATE timedout vdev %d", __func__,
3602 tgt_req->vdev_id);
3603 wma_send_msg(wma, WMA_SET_LINK_STATE_RSP, (void *)params, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003604 }
3605free_tgt_req:
Anurag Chouhan210db072016-02-22 18:42:15 +05303606 qdf_mc_timer_destroy(&tgt_req->event_timeout);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303607 qdf_mem_free(tgt_req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003608}
3609
3610/**
3611 * wma_fill_vdev_req() - fill vdev request
3612 * @wma: wma handle
3613 * @msg_type: message type
3614 * @type: request type
3615 * @params: request params
3616 * @timeout: timeout value
3617 *
3618 * Return: wma_target_req ptr
3619 */
3620struct wma_target_req *wma_fill_vdev_req(tp_wma_handle wma,
3621 uint8_t vdev_id,
3622 uint32_t msg_type, uint8_t type,
3623 void *params, uint32_t timeout)
3624{
3625 struct wma_target_req *req;
Anurag Chouhanffb21542016-02-17 14:33:03 +05303626 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003627
Yeshwanth Sriram Guntuka25fa2c02018-08-01 15:31:10 +05303628 if (!cds_is_target_ready()) {
3629 WMA_LOGE("target not ready, drop the request");
3630 return NULL;
3631 }
3632
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303633 req = qdf_mem_malloc(sizeof(*req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003634 if (!req) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07003635 WMA_LOGE("%s: Failed to allocate memory for msg %d vdev %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003636 __func__, msg_type, vdev_id);
3637 return NULL;
3638 }
3639
3640 WMA_LOGD("%s: vdev_id %d msg %d", __func__, vdev_id, msg_type);
Abhishek Singhc614ec42017-04-25 16:17:34 +05303641 qdf_spin_lock_bh(&wma->vdev_respq_lock);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003642 req->vdev_id = vdev_id;
3643 req->msg_type = msg_type;
3644 req->type = type;
3645 req->user_data = params;
Anurag Chouhanffb21542016-02-17 14:33:03 +05303646 status = qdf_list_insert_back(&wma->vdev_resp_queue, &req->node);
3647 if (QDF_STATUS_SUCCESS != status) {
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303648 qdf_spin_unlock_bh(&wma->vdev_respq_lock);
Krishna Kumaar Natarajana5c53bd2015-10-27 11:48:27 -07003649 WMA_LOGE(FL("Failed add request in queue for vdev_id %d type %d"),
3650 vdev_id, type);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303651 qdf_mem_free(req);
Krishna Kumaar Natarajana5c53bd2015-10-27 11:48:27 -07003652 return NULL;
3653 }
Anurag Chouhana37b5b72016-02-21 14:53:42 +05303654 qdf_spin_unlock_bh(&wma->vdev_respq_lock);
Abhishek Singhc614ec42017-04-25 16:17:34 +05303655 qdf_mc_timer_init(&req->event_timeout, QDF_TIMER_TYPE_SW,
3656 wma_vdev_resp_timer, req);
3657 qdf_mc_timer_start(&req->event_timeout, timeout);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003658 return req;
3659}
3660
3661/**
3662 * wma_remove_vdev_req() - remove vdev request
3663 * @wma: wma handle
3664 * @vdev_id: vdev id
3665 * @type: type
3666 *
3667 * Return: none
3668 */
3669void wma_remove_vdev_req(tp_wma_handle wma, uint8_t vdev_id,
3670 uint8_t type)
3671{
3672 struct wma_target_req *req_msg;
3673
Kiran Kumar Lokere20804162017-07-17 16:09:04 -07003674 req_msg = wma_find_vdev_req(wma, vdev_id, type, true);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003675 if (!req_msg)
3676 return;
3677
Anurag Chouhan210db072016-02-22 18:42:15 +05303678 qdf_mc_timer_stop(&req_msg->event_timeout);
3679 qdf_mc_timer_destroy(&req_msg->event_timeout);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303680 qdf_mem_free(req_msg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003681}
3682
3683/**
3684 * wma_vdev_set_bss_params() - BSS set params functions
3685 * @wma: wma handle
3686 * @vdev_id: vdev id
3687 * @beaconInterval: beacon interval
3688 * @dtimPeriod: DTIM period
3689 * @shortSlotTimeSupported: short slot time
3690 * @llbCoexist: llbCoexist
3691 * @maxTxPower: max tx power
3692 *
3693 * Return: none
3694 */
3695static void
3696wma_vdev_set_bss_params(tp_wma_handle wma, int vdev_id,
3697 tSirMacBeaconInterval beaconInterval,
3698 uint8_t dtimPeriod, uint8_t shortSlotTimeSupported,
Amar Singhala297bfa2015-10-15 15:07:29 -07003699 uint8_t llbCoexist, int8_t maxTxPower)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003700{
Govind Singhd76a5b02016-03-08 15:12:14 +05303701 QDF_STATUS ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003702 uint32_t slot_time;
3703 struct wma_txrx_node *intr = wma->interfaces;
3704
3705 /* Beacon Interval setting */
Govind Singhd76a5b02016-03-08 15:12:14 +05303706 ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003707 WMI_VDEV_PARAM_BEACON_INTERVAL,
3708 beaconInterval);
3709
Govind Singhd76a5b02016-03-08 15:12:14 +05303710 if (QDF_IS_STATUS_ERROR(ret))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003711 WMA_LOGE("failed to set WMI_VDEV_PARAM_BEACON_INTERVAL");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003712 ret = wmi_unified_vdev_set_gtx_cfg_send(wma->wmi_handle, vdev_id,
3713 &intr[vdev_id].config.gtx_info);
Govind Singhd76a5b02016-03-08 15:12:14 +05303714 if (QDF_IS_STATUS_ERROR(ret))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003715 WMA_LOGE("failed to set WMI_VDEV_PARAM_DTIM_PERIOD");
Govind Singhd76a5b02016-03-08 15:12:14 +05303716 ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003717 WMI_VDEV_PARAM_DTIM_PERIOD,
3718 dtimPeriod);
Kiran Kumar Lokere6d3a30d2018-01-15 18:18:29 -08003719 intr[vdev_id].dtimPeriod = dtimPeriod;
Govind Singhd76a5b02016-03-08 15:12:14 +05303720 if (QDF_IS_STATUS_ERROR(ret))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003721 WMA_LOGE("failed to set WMI_VDEV_PARAM_DTIM_PERIOD");
3722
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07003723 if (!maxTxPower)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003724 WMA_LOGW("Setting Tx power limit to 0");
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07003725 WMA_LOGD("Set maxTx pwr [WMI_VDEV_PARAM_TX_PWRLIMIT] to %d",
Padma, Santhosh Kumar29df3622016-08-16 19:15:16 +05303726 maxTxPower);
Govind Singhd76a5b02016-03-08 15:12:14 +05303727 ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003728 WMI_VDEV_PARAM_TX_PWRLIMIT,
3729 maxTxPower);
Govind Singhd76a5b02016-03-08 15:12:14 +05303730 if (QDF_IS_STATUS_ERROR(ret))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003731 WMA_LOGE("failed to set WMI_VDEV_PARAM_TX_PWRLIMIT");
3732 else
3733 intr[vdev_id].max_tx_power = maxTxPower;
3734
3735 /* Slot time */
3736 if (shortSlotTimeSupported)
3737 slot_time = WMI_VDEV_SLOT_TIME_SHORT;
3738 else
3739 slot_time = WMI_VDEV_SLOT_TIME_LONG;
3740
Govind Singhd76a5b02016-03-08 15:12:14 +05303741 ret = wma_vdev_set_param(wma->wmi_handle, vdev_id,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003742 WMI_VDEV_PARAM_SLOT_TIME,
3743 slot_time);
Govind Singhd76a5b02016-03-08 15:12:14 +05303744 if (QDF_IS_STATUS_ERROR(ret))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003745 WMA_LOGE("failed to set WMI_VDEV_PARAM_SLOT_TIME");
3746
3747 /* Initialize protection mode in case of coexistence */
3748 wma_update_protection_mode(wma, vdev_id, llbCoexist);
Krishna Kumaar Natarajan0103ef82017-02-17 18:15:56 -08003749
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003750}
3751
Abhishek Singhcfb44482017-03-10 12:42:37 +05303752#ifdef WLAN_FEATURE_11W
3753static void wma_set_mgmt_frame_protection(tp_wma_handle wma)
3754{
3755 struct pdev_params param = {0};
3756 QDF_STATUS ret;
3757
3758 /*
3759 * when 802.11w PMF is enabled for hw encr/decr
3760 * use hw MFP Qos bits 0x10
3761 */
3762 param.param_id = WMI_PDEV_PARAM_PMF_QOS;
3763 param.param_value = true;
3764 ret = wmi_unified_pdev_param_send(wma->wmi_handle,
3765 &param, WMA_WILDCARD_PDEV_ID);
3766 if (QDF_IS_STATUS_ERROR(ret)) {
3767 WMA_LOGE("%s: Failed to set QOS MFP/PMF (%d)",
3768 __func__, ret);
3769 } else {
3770 WMA_LOGD("%s: QOS MFP/PMF set", __func__);
3771 }
3772}
3773#else
3774static inline void wma_set_mgmt_frame_protection(tp_wma_handle wma)
3775{
3776}
3777#endif /* WLAN_FEATURE_11W */
3778
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003779/**
3780 * wma_add_bss_ap_mode() - process add bss request in ap mode
3781 * @wma: wma handle
3782 * @add_bss: add bss parameters
3783 *
3784 * Return: none
3785 */
3786static void wma_add_bss_ap_mode(tp_wma_handle wma, tpAddBssParams add_bss)
3787{
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003788 struct cdp_pdev *pdev;
3789 struct cdp_vdev *vdev;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003790 struct wma_vdev_start_req req;
Leo Chang96464902016-10-28 11:10:54 -07003791 void *peer;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003792 struct wma_target_req *msg;
3793 uint8_t vdev_id, peer_id;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303794 QDF_STATUS status;
Amar Singhala297bfa2015-10-15 15:07:29 -07003795 int8_t maxTxPower;
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07003796 struct policy_mgr_hw_mode_params hw_mode = {0};
Leo Chang96464902016-10-28 11:10:54 -07003797 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003798
Anurag Chouhan6d760662016-02-20 16:05:43 +05303799 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003800
3801 if (NULL == pdev) {
3802 WMA_LOGE("%s: Failed to get pdev", __func__);
3803 goto send_fail_resp;
3804 }
3805
3806 vdev = wma_find_vdev_by_addr(wma, add_bss->bssId, &vdev_id);
3807 if (!vdev) {
Peng Xu66162de2016-02-11 17:01:20 -08003808 WMA_LOGE("%s: Failed to get vdev handle:"MAC_ADDRESS_STR,
3809 __func__, MAC_ADDR_ARRAY(add_bss->bssId));
3810
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003811 goto send_fail_resp;
3812 }
3813 if (SAP_WPS_DISABLED == add_bss->wps_state)
Mukul Sharma00058692017-01-28 19:04:32 +05303814 pmo_ucfg_disable_wakeup_event(wma->psoc, vdev_id,
Nachiket Kukade107f6392018-05-25 19:15:16 +05303815 WOW_PROBE_REQ_WPS_IE_EVENT);
Naveen Rawatfa2a1002018-05-17 16:06:37 -07003816 wma_set_bss_rate_flags(wma, vdev_id, add_bss);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003817 status = wma_create_peer(wma, pdev, vdev, add_bss->bssId,
3818 WMI_PEER_TYPE_DEFAULT, vdev_id, false);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303819 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003820 WMA_LOGE("%s: Failed to create peer", __func__);
3821 goto send_fail_resp;
3822 }
3823
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003824 peer = cdp_peer_find_by_addr(soc, pdev,
3825 add_bss->bssId, &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003826 if (!peer) {
3827 WMA_LOGE("%s Failed to find peer %pM", __func__,
3828 add_bss->bssId);
3829 goto send_fail_resp;
3830 }
3831 msg = wma_fill_vdev_req(wma, vdev_id, WMA_ADD_BSS_REQ,
3832 WMA_TARGET_REQ_TYPE_VDEV_START, add_bss,
3833 WMA_VDEV_START_REQUEST_TIMEOUT);
3834 if (!msg) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07003835 WMA_LOGE("%s Failed to allocate vdev request vdev_id %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003836 __func__, vdev_id);
3837 goto peer_cleanup;
3838 }
3839
Leo Chang96464902016-10-28 11:10:54 -07003840 add_bss->staContext.staIdx = cdp_peer_get_local_peer_id(soc, peer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003841
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303842 qdf_mem_zero(&req, sizeof(req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003843 req.vdev_id = vdev_id;
3844 req.chan = add_bss->currentOperChannel;
3845 req.chan_width = add_bss->ch_width;
Himanshu Agarwalf5c5b102018-05-22 20:13:57 +05303846 req.dot11_mode = add_bss->dot11_mode;
Naveen Rawat64e477e2016-05-20 10:34:56 -07003847
3848 if (add_bss->ch_width == CH_WIDTH_10MHZ)
3849 req.is_half_rate = 1;
3850 else if (add_bss->ch_width == CH_WIDTH_5MHZ)
3851 req.is_quarter_rate = 1;
3852
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003853 req.ch_center_freq_seg0 = add_bss->ch_center_freq_seg0;
3854 req.ch_center_freq_seg1 = add_bss->ch_center_freq_seg1;
3855 req.vht_capable = add_bss->vhtCapable;
Krishna Kumaar Natarajan0103ef82017-02-17 18:15:56 -08003856 wma_update_vdev_he_ops(&req, add_bss);
3857
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003858 req.max_txpow = add_bss->maxTxPower;
3859 maxTxPower = add_bss->maxTxPower;
Abhishek Singhcfb44482017-03-10 12:42:37 +05303860
3861 if (add_bss->rmfEnabled)
3862 wma_set_mgmt_frame_protection(wma);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003863
Krishna Kumaar Natarajanc1ebd992016-11-29 16:20:32 -08003864 req.dot11_mode = add_bss->dot11_mode;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003865 req.beacon_intval = add_bss->beaconInterval;
3866 req.dtim_period = add_bss->dtimPeriod;
Jiachao Wu712d4fd2017-08-23 16:52:34 +08003867 req.beacon_tx_rate = add_bss->beacon_tx_rate;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003868 req.hidden_ssid = add_bss->bHiddenSSIDEn;
3869 req.is_dfs = add_bss->bSpectrumMgtEnabled;
3870 req.oper_mode = BSS_OPERATIONAL_MODE_AP;
3871 req.ssid.length = add_bss->ssId.length;
Arif Hussain671a1902017-03-17 09:08:32 -07003872 req.cac_duration_ms = add_bss->cac_duration_ms;
3873 req.dfs_regdomain = add_bss->dfs_regdomain;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003874 if (req.ssid.length > 0)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303875 qdf_mem_copy(req.ssid.ssId, add_bss->ssId.ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003876 add_bss->ssId.length);
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07003877 status = policy_mgr_get_current_hw_mode(wma->psoc, &hw_mode);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303878 if (!QDF_IS_STATUS_SUCCESS(status))
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07003879 WMA_LOGE("policy_mgr_get_current_hw_mode failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003880
Paul Zhang42dade02017-05-12 19:20:37 +08003881 if (add_bss->nss == 2) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003882 req.preferred_rx_streams = 2;
3883 req.preferred_tx_streams = 2;
3884 } else {
3885 req.preferred_rx_streams = 1;
3886 req.preferred_tx_streams = 1;
3887 }
3888
3889 status = wma_vdev_start(wma, &req, false);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303890 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003891 wma_remove_vdev_req(wma, vdev_id,
3892 WMA_TARGET_REQ_TYPE_VDEV_START);
3893 goto peer_cleanup;
3894 }
3895
3896 wma_vdev_set_bss_params(wma, vdev_id,
3897 add_bss->beaconInterval, add_bss->dtimPeriod,
3898 add_bss->shortSlotTimeSupported,
3899 add_bss->llbCoexist, maxTxPower);
3900
Krishna Kumaar Natarajan0103ef82017-02-17 18:15:56 -08003901 wma_vdev_set_he_bss_params(wma, vdev_id, &req);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003902 return;
3903
3904peer_cleanup:
3905 wma_remove_peer(wma, add_bss->bssId, vdev_id, peer, false);
3906send_fail_resp:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303907 add_bss->status = QDF_STATUS_E_FAILURE;
Abhishek Singh2d775fd2017-08-18 10:51:33 +05303908 wma_send_msg_high_priority(wma, WMA_ADD_BSS_RSP, (void *)add_bss, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003909}
3910
3911#ifdef QCA_IBSS_SUPPORT
3912/**
3913 * wma_add_bss_ibss_mode() - process add bss request in IBSS mode
3914 * @wma: wma handle
3915 * @add_bss: add bss parameters
3916 *
3917 * Return: none
3918 */
3919static void wma_add_bss_ibss_mode(tp_wma_handle wma, tpAddBssParams add_bss)
3920{
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003921 struct cdp_pdev *pdev;
3922 struct cdp_vdev *vdev;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003923 struct wma_vdev_start_req req;
Leo Chang96464902016-10-28 11:10:54 -07003924 void *peer = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003925 struct wma_target_req *msg;
3926 uint8_t vdev_id, peer_id;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303927 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003928 tSetBssKeyParams key_info;
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07003929 struct policy_mgr_hw_mode_params hw_mode = {0};
Leo Chang96464902016-10-28 11:10:54 -07003930 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003931
Krunal Soni2c68f232015-10-26 20:52:51 -07003932 vdev = wma_find_vdev_by_addr(wma, add_bss->selfMacAddr, &vdev_id);
3933 if (!vdev) {
3934 WMA_LOGE("%s: vdev not found for vdev id %d.",
3935 __func__, vdev_id);
3936 goto send_fail_resp;
3937 }
3938 WMA_LOGD("%s: add_bss->sessionId = %d", __func__, vdev_id);
Anurag Chouhan6d760662016-02-20 16:05:43 +05303939 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003940
3941 if (NULL == pdev) {
3942 WMA_LOGE("%s: Failed to get pdev", __func__);
3943 goto send_fail_resp;
3944 }
Naveen Rawatfa2a1002018-05-17 16:06:37 -07003945 wma_set_bss_rate_flags(wma, vdev_id, add_bss);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003946
Krunal Soni8c37e322016-02-03 16:08:37 -08003947 /* create ibss bss peer */
3948 status = wma_create_peer(wma, pdev, vdev, add_bss->selfMacAddr,
3949 WMI_PEER_TYPE_DEFAULT, vdev_id,
3950 false);
3951 if (status != QDF_STATUS_SUCCESS) {
3952 WMA_LOGE("%s: Failed to create peer", __func__);
3953 goto send_fail_resp;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003954 }
Krunal Soni8c37e322016-02-03 16:08:37 -08003955 WMA_LOGA("IBSS BSS peer created with mac %pM",
3956 add_bss->selfMacAddr);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003957
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08003958 peer = cdp_peer_find_by_addr(soc, pdev,
3959 add_bss->selfMacAddr, &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003960 if (!peer) {
3961 WMA_LOGE("%s Failed to find peer %pM", __func__,
3962 add_bss->selfMacAddr);
3963 goto send_fail_resp;
3964 }
3965
3966 /* clear leftover ibss keys on bss peer */
3967
3968 WMA_LOGD("%s: ibss bss key clearing", __func__);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303969 qdf_mem_set(&key_info, sizeof(key_info), 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003970 key_info.smesessionId = vdev_id;
3971 key_info.numKeys = SIR_MAC_MAX_NUM_OF_DEFAULT_KEYS;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303972 qdf_mem_copy(&wma->ibsskey_info, &key_info, sizeof(tSetBssKeyParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003973
3974 /* start ibss vdev */
3975
3976 add_bss->operMode = BSS_OPERATIONAL_MODE_IBSS;
3977
3978 msg = wma_fill_vdev_req(wma, vdev_id, WMA_ADD_BSS_REQ,
3979 WMA_TARGET_REQ_TYPE_VDEV_START, add_bss,
3980 WMA_VDEV_START_REQUEST_TIMEOUT);
3981 if (!msg) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07003982 WMA_LOGE("%s Failed to allocate vdev request vdev_id %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003983 __func__, vdev_id);
3984 goto peer_cleanup;
3985 }
3986 WMA_LOGD("%s: vdev start request for IBSS enqueued", __func__);
3987
Leo Chang96464902016-10-28 11:10:54 -07003988 add_bss->staContext.staIdx = cdp_peer_get_local_peer_id(soc, peer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003989
3990 /*
3991 * If IBSS Power Save is supported by firmware
3992 * set the IBSS power save params to firmware.
3993 */
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05303994 if (wmi_service_enabled(wma->wmi_handle,
3995 wmi_service_ibss_pwrsave)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003996 status = wma_set_ibss_pwrsave_params(wma, vdev_id);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303997 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003998 WMA_LOGE("%s: Failed to Set IBSS Power Save Params to firmware",
3999 __func__);
4000 goto peer_cleanup;
4001 }
4002 }
4003
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304004 qdf_mem_zero(&req, sizeof(req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004005 req.vdev_id = vdev_id;
4006 req.chan = add_bss->currentOperChannel;
4007 req.chan_width = add_bss->ch_width;
4008 req.ch_center_freq_seg0 = add_bss->ch_center_freq_seg0;
4009 req.ch_center_freq_seg1 = add_bss->ch_center_freq_seg1;
4010 req.vht_capable = add_bss->vhtCapable;
4011#if defined WLAN_FEATURE_VOWIF
4012 req.max_txpow = add_bss->maxTxPower;
4013#else
4014 req.max_txpow = 0;
4015#endif /* WLAN_FEATURE_VOWIF */
4016 req.beacon_intval = add_bss->beaconInterval;
4017 req.dtim_period = add_bss->dtimPeriod;
4018 req.hidden_ssid = add_bss->bHiddenSSIDEn;
4019 req.is_dfs = add_bss->bSpectrumMgtEnabled;
4020 req.oper_mode = BSS_OPERATIONAL_MODE_IBSS;
4021 req.ssid.length = add_bss->ssId.length;
4022 if (req.ssid.length > 0)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304023 qdf_mem_copy(req.ssid.ssId, add_bss->ssId.ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004024 add_bss->ssId.length);
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07004025 status = policy_mgr_get_current_hw_mode(wma->psoc, &hw_mode);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304026 if (!QDF_IS_STATUS_SUCCESS(status))
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07004027 WMA_LOGE("policy_mgr_get_current_hw_mode failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004028
Paul Zhang42dade02017-05-12 19:20:37 +08004029 if (add_bss->nss == 2) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004030 req.preferred_rx_streams = 2;
4031 req.preferred_tx_streams = 2;
4032 } else {
4033 req.preferred_rx_streams = 1;
4034 req.preferred_tx_streams = 1;
4035 }
4036
4037 WMA_LOGD("%s: chan %d chan_width %d", __func__, req.chan,
4038 req.chan_width);
4039 WMA_LOGD("%s: ssid = %s", __func__, req.ssid.ssId);
4040
4041 status = wma_vdev_start(wma, &req, false);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304042 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004043 wma_remove_vdev_req(wma, vdev_id,
4044 WMA_TARGET_REQ_TYPE_VDEV_START);
4045 goto peer_cleanup;
4046 }
4047 WMA_LOGD("%s: vdev start request for IBSS sent to target", __func__);
4048
4049 /* Initialize protection mode to no protection */
Govind Singhd76a5b02016-03-08 15:12:14 +05304050 status = wma_vdev_set_param(wma->wmi_handle, vdev_id,
4051 WMI_VDEV_PARAM_PROTECTION_MODE,
4052 IEEE80211_PROT_NONE);
4053 if (QDF_IS_STATUS_ERROR(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004054 WMA_LOGE("Failed to initialize protection mode");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004055
4056 return;
4057
4058peer_cleanup:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004059 if (peer)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004060 wma_remove_peer(wma, add_bss->bssId, vdev_id, peer, false);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004061send_fail_resp:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304062 add_bss->status = QDF_STATUS_E_FAILURE;
Abhishek Singh2d775fd2017-08-18 10:51:33 +05304063 wma_send_msg_high_priority(wma, WMA_ADD_BSS_RSP, (void *)add_bss, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004064}
4065#endif /* QCA_IBSS_SUPPORT */
4066
4067/**
4068 * wma_add_bss_sta_mode() - process add bss request in sta mode
4069 * @wma: wma handle
4070 * @add_bss: add bss parameters
4071 *
4072 * Return: none
4073 */
4074static void wma_add_bss_sta_mode(tp_wma_handle wma, tpAddBssParams add_bss)
4075{
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004076 struct cdp_pdev *pdev;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004077 struct wma_vdev_start_req req;
4078 struct wma_target_req *msg;
Leo Chang96464902016-10-28 11:10:54 -07004079 uint8_t vdev_id = 0, peer_id;
Amar Singhal4c3fbb42018-01-02 13:20:28 -08004080 void *peer = NULL;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304081 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004082 struct wma_txrx_node *iface;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004083 int pps_val = 0;
4084 bool roam_synch_in_progress = false;
Anurag Chouhan6d760662016-02-20 16:05:43 +05304085 tpAniSirGlobal pMac = cds_get_context(QDF_MODULE_ID_PE);
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07004086 struct policy_mgr_hw_mode_params hw_mode = {0};
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004087 bool peer_assoc_sent = false;
Leo Chang96464902016-10-28 11:10:54 -07004088 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004089
4090 if (NULL == pMac) {
4091 WMA_LOGE("%s: Unable to get PE context", __func__);
4092 goto send_fail_resp;
4093 }
4094
Anurag Chouhan6d760662016-02-20 16:05:43 +05304095 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004096
4097 if (NULL == pdev) {
4098 WMA_LOGE("%s Failed to get pdev", __func__);
4099 goto send_fail_resp;
4100 }
4101
Leo Chang96464902016-10-28 11:10:54 -07004102 vdev_id = add_bss->staContext.smesessionId;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004103 iface = &wma->interfaces[vdev_id];
4104
Naveen Rawatfa2a1002018-05-17 16:06:37 -07004105 wma_set_bss_rate_flags(wma, vdev_id, add_bss);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004106 if (add_bss->operMode) {
4107 /* Save parameters later needed by WMA_ADD_STA_REQ */
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004108 if (iface->addBssStaContext)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304109 qdf_mem_free(iface->addBssStaContext);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304110 iface->addBssStaContext = qdf_mem_malloc(sizeof(tAddStaParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004111 if (!iface->addBssStaContext) {
4112 WMA_LOGE("%s Failed to allocat memory", __func__);
4113 goto send_fail_resp;
4114 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304115 qdf_mem_copy(iface->addBssStaContext, &add_bss->staContext,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004116 sizeof(tAddStaParams));
4117
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004118 if (iface->staKeyParams) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304119 qdf_mem_free(iface->staKeyParams);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004120 iface->staKeyParams = NULL;
4121 }
4122 if (add_bss->extSetStaKeyParamValid) {
4123 iface->staKeyParams =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304124 qdf_mem_malloc(sizeof(tSetStaKeyParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004125 if (!iface->staKeyParams) {
4126 WMA_LOGE("%s Failed to allocat memory",
4127 __func__);
4128 goto send_fail_resp;
4129 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304130 qdf_mem_copy(iface->staKeyParams,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004131 &add_bss->extSetStaKeyParam,
4132 sizeof(tSetStaKeyParams));
4133 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004134 /* Save parameters later needed by WMA_ADD_STA_REQ */
4135 iface->rmfEnabled = add_bss->rmfEnabled;
4136 iface->beaconInterval = add_bss->beaconInterval;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004137 iface->llbCoexist = add_bss->llbCoexist;
4138 iface->shortSlotTimeSupported = add_bss->shortSlotTimeSupported;
4139 iface->nwType = add_bss->nwType;
4140 if (add_bss->nonRoamReassoc) {
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004141 peer = cdp_peer_find_by_addr(soc,
4142 pdev, add_bss->bssId,
4143 &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004144 if (peer) {
4145 add_bss->staContext.staIdx =
Leo Chang96464902016-10-28 11:10:54 -07004146 cdp_peer_get_local_peer_id(soc, peer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004147 goto send_bss_resp;
4148 }
4149 }
4150 if (add_bss->reassocReq) {
4151#if defined(QCA_LL_LEGACY_TX_FLOW_CONTROL) || defined(QCA_LL_TX_FLOW_CONTROL_V2)
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004152 struct cdp_vdev *vdev;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004153#endif
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004154 /* Called in preassoc state. BSSID peer is already
4155 * added by set_linkstate
4156 */
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004157 peer = cdp_peer_find_by_addr(soc,
4158 pdev,
4159 add_bss->bssId,
4160 &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004161 if (!peer) {
4162 WMA_LOGE("%s Failed to find peer %pM", __func__,
4163 add_bss->bssId);
4164 goto send_fail_resp;
4165 }
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08004166 if (wma_is_roam_synch_in_progress(wma, vdev_id)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004167 add_bss->staContext.staIdx =
Leo Chang96464902016-10-28 11:10:54 -07004168 cdp_peer_get_local_peer_id(soc, peer);
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08004169 WMA_LOGD("LFR3:%s: bssid %pM staIdx %d",
4170 __func__, add_bss->bssId,
4171 add_bss->staContext.staIdx);
4172 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004173 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004174 msg = wma_fill_vdev_req(wma, vdev_id, WMA_ADD_BSS_REQ,
4175 WMA_TARGET_REQ_TYPE_VDEV_START,
4176 add_bss,
4177 WMA_VDEV_START_REQUEST_TIMEOUT);
4178 if (!msg) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004179 WMA_LOGE("%s Failed to allocate vdev request vdev_id %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004180 __func__, vdev_id);
4181 goto peer_cleanup;
4182 }
4183
4184 add_bss->staContext.staIdx =
Leo Chang96464902016-10-28 11:10:54 -07004185 cdp_peer_get_local_peer_id(soc, peer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004186
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304187 qdf_mem_zero(&req, sizeof(req));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004188 req.vdev_id = vdev_id;
4189 req.chan = add_bss->currentOperChannel;
4190 req.chan_width = add_bss->ch_width;
Naveen Rawat64e477e2016-05-20 10:34:56 -07004191
4192 if (add_bss->ch_width == CH_WIDTH_10MHZ)
4193 req.is_half_rate = 1;
4194 else if (add_bss->ch_width == CH_WIDTH_5MHZ)
4195 req.is_quarter_rate = 1;
4196
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004197 req.ch_center_freq_seg0 = add_bss->ch_center_freq_seg0;
4198 req.ch_center_freq_seg1 = add_bss->ch_center_freq_seg1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004199 req.max_txpow = add_bss->maxTxPower;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004200 req.beacon_intval = add_bss->beaconInterval;
4201 req.dtim_period = add_bss->dtimPeriod;
4202 req.hidden_ssid = add_bss->bHiddenSSIDEn;
4203 req.is_dfs = add_bss->bSpectrumMgtEnabled;
4204 req.ssid.length = add_bss->ssId.length;
4205 req.oper_mode = BSS_OPERATIONAL_MODE_STA;
4206 if (req.ssid.length > 0)
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304207 qdf_mem_copy(req.ssid.ssId, add_bss->ssId.ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004208 add_bss->ssId.length);
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07004209 status = policy_mgr_get_current_hw_mode(wma->psoc,
4210 &hw_mode);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304211 if (!QDF_IS_STATUS_SUCCESS(status))
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07004212 WMA_LOGE("policy_mgr_get_current_hw_mode failed");
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004213
Paul Zhang42dade02017-05-12 19:20:37 +08004214 if (add_bss->nss == 2) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004215 req.preferred_rx_streams = 2;
4216 req.preferred_tx_streams = 2;
4217 } else {
4218 req.preferred_rx_streams = 1;
4219 req.preferred_tx_streams = 1;
4220 }
4221
4222 status = wma_vdev_start(wma, &req, false);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304223 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004224 wma_remove_vdev_req(wma, vdev_id,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004225 WMA_TARGET_REQ_TYPE_VDEV_START);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004226 goto peer_cleanup;
4227 }
4228#if defined(QCA_LL_LEGACY_TX_FLOW_CONTROL) || defined(QCA_LL_TX_FLOW_CONTROL_V2)
4229 vdev = wma_find_vdev_by_id(wma, vdev_id);
4230 if (!vdev) {
4231 WMA_LOGE("%s Invalid txrx vdev", __func__);
4232 goto peer_cleanup;
4233 }
Leo Chang96464902016-10-28 11:10:54 -07004234 cdp_fc_vdev_pause(soc, vdev,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004235 OL_TXQ_PAUSE_REASON_PEER_UNAUTHORIZED);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004236#endif
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004237 /* ADD_BSS_RESP will be deferred to completion of
4238 * VDEV_START
4239 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004240 return;
4241 }
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004242 if (!add_bss->updateBss)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004243 goto send_bss_resp;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004244 /* Update peer state */
4245 if (add_bss->staContext.encryptType == eSIR_ED_NONE) {
4246 WMA_LOGD("%s: Update peer(%pM) state into auth",
4247 __func__, add_bss->bssId);
Leo Chang96464902016-10-28 11:10:54 -07004248 cdp_peer_state_update(soc, pdev, add_bss->bssId,
Dhanashri Atreb08959a2016-03-01 17:28:03 -08004249 OL_TXRX_PEER_STATE_AUTH);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004250 } else {
4251#if defined(QCA_LL_LEGACY_TX_FLOW_CONTROL) || defined(QCA_LL_TX_FLOW_CONTROL_V2)
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004252 struct cdp_vdev *vdev;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004253#endif
4254 WMA_LOGD("%s: Update peer(%pM) state into conn",
4255 __func__, add_bss->bssId);
Leo Chang96464902016-10-28 11:10:54 -07004256 cdp_peer_state_update(soc, pdev, add_bss->bssId,
Dhanashri Atreb08959a2016-03-01 17:28:03 -08004257 OL_TXRX_PEER_STATE_CONN);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004258#if defined(QCA_LL_LEGACY_TX_FLOW_CONTROL) || defined(QCA_LL_TX_FLOW_CONTROL_V2)
Leo Chang96464902016-10-28 11:10:54 -07004259 peer = cdp_peer_find_by_addr(soc, pdev, add_bss->bssId,
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004260 &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004261 if (!peer) {
4262 WMA_LOGE("%s:%d Failed to find peer %pM",
4263 __func__, __LINE__, add_bss->bssId);
4264 goto send_fail_resp;
4265 }
4266
4267 vdev = wma_find_vdev_by_id(wma, vdev_id);
4268 if (!vdev) {
4269 WMA_LOGE("%s Invalid txrx vdev", __func__);
4270 goto peer_cleanup;
4271 }
Leo Chang96464902016-10-28 11:10:54 -07004272 cdp_fc_vdev_pause(soc, vdev,
4273 OL_TXQ_PAUSE_REASON_PEER_UNAUTHORIZED);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004274#endif
4275 }
4276
4277 wmi_unified_send_txbf(wma, &add_bss->staContext);
4278
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004279 pps_val = ((pMac->enable5gEBT << 31) & 0xffff0000) |
4280 (PKT_PWR_SAVE_5G_EBT & 0xffff);
Govind Singhd76a5b02016-03-08 15:12:14 +05304281 status = wma_vdev_set_param(wma->wmi_handle, vdev_id,
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004282 WMI_VDEV_PARAM_PACKET_POWERSAVE,
4283 pps_val);
Govind Singhd76a5b02016-03-08 15:12:14 +05304284 if (QDF_IS_STATUS_ERROR(status))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004285 WMA_LOGE("Failed to send wmi packet power save cmd");
4286 else
Govind Singhd76a5b02016-03-08 15:12:14 +05304287 WMA_LOGD("Sent PKT_PWR_SAVE_5G_EBT cmd to target, val = %x, status = %d",
4288 pps_val, status);
Sandeep Puligillac3588e52018-08-07 16:00:41 -07004289 status = wma_send_peer_assoc(wma, add_bss->nwType,
4290 &add_bss->staContext);
4291 if (QDF_IS_STATUS_ERROR(status)) {
4292 WMA_LOGE("Failed to send peer assoc status:%d", status);
4293 goto peer_cleanup;
4294 }
4295 peer_assoc_sent = true;
Naveen Rawata600b2e2018-03-29 13:41:18 -07004296
Sandeep Puligillac3588e52018-08-07 16:00:41 -07004297 /* we just had peer assoc, so install key will be done later */
Naveen Rawata600b2e2018-03-29 13:41:18 -07004298 if (add_bss->staContext.encryptType != eSIR_ED_NONE)
4299 iface->is_waiting_for_key = true;
4300
Abhishek Singhcfb44482017-03-10 12:42:37 +05304301 if (add_bss->rmfEnabled)
4302 wma_set_mgmt_frame_protection(wma);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004303
4304 wma_vdev_set_bss_params(wma, add_bss->staContext.smesessionId,
4305 add_bss->beaconInterval,
4306 add_bss->dtimPeriod,
4307 add_bss->shortSlotTimeSupported,
4308 add_bss->llbCoexist,
4309 add_bss->maxTxPower);
4310
4311 /*
4312 * Store the bssid in interface table, bssid will
4313 * be used during group key setting sta mode.
4314 */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304315 qdf_mem_copy(iface->bssid, add_bss->bssId, IEEE80211_ADDR_LEN);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004316
4317 }
4318send_bss_resp:
Manikandan Mohan39accff2017-05-02 16:09:00 -07004319
4320 wma_vdev_set_he_config(wma, vdev_id, add_bss);
Sreelakshmi Konamki0d17c6a2017-06-08 12:58:54 +05304321 if (NULL == cdp_peer_find_by_addr(soc, pdev, add_bss->bssId,
4322 &add_bss->staContext.staIdx))
4323 add_bss->status = QDF_STATUS_E_FAILURE;
4324 else
4325 add_bss->status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004326 add_bss->bssIdx = add_bss->staContext.smesessionId;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304327 qdf_mem_copy(add_bss->staContext.staMac, add_bss->bssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004328 sizeof(add_bss->staContext.staMac));
4329
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304330 if (!wmi_service_enabled(wma->wmi_handle,
4331 wmi_service_peer_assoc_conf)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004332 WMA_LOGE(FL("WMI_SERVICE_PEER_ASSOC_CONF not enabled"));
4333 goto send_final_rsp;
4334 }
4335
4336 /* In case of reassoc, peer assoc cmd will not be sent */
4337 if (!peer_assoc_sent)
4338 goto send_final_rsp;
4339
4340 msg = wma_fill_hold_req(wma, vdev_id, WMA_ADD_BSS_REQ,
4341 WMA_PEER_ASSOC_CNF_START, add_bss,
4342 WMA_PEER_ASSOC_TIMEOUT);
4343 if (!msg) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004344 WMA_LOGE(FL("Failed to allocate request for vdev_id %d"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004345 vdev_id);
4346 wma_remove_req(wma, vdev_id, WMA_PEER_ASSOC_CNF_START);
4347 goto peer_cleanup;
4348 }
4349 return;
4350
4351send_final_rsp:
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004352 WMA_LOGD("%s: opermode %d update_bss %d nw_type %d bssid %pM staIdx %d status %d",
4353 __func__, add_bss->operMode,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004354 add_bss->updateBss, add_bss->nwType, add_bss->bssId,
4355 add_bss->staContext.staIdx, add_bss->status);
Abhishek Singh2d775fd2017-08-18 10:51:33 +05304356 wma_send_msg_high_priority(wma, WMA_ADD_BSS_RSP, (void *)add_bss, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004357 return;
4358
4359peer_cleanup:
Amar Singhal4c3fbb42018-01-02 13:20:28 -08004360 if (peer)
4361 wma_remove_peer(wma, add_bss->bssId, vdev_id, peer,
4362 roam_synch_in_progress);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004363send_fail_resp:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304364 add_bss->status = QDF_STATUS_E_FAILURE;
Sandeep Puligilla2ff3ebe2016-08-31 23:55:07 -07004365 if (!wma_is_roam_synch_in_progress(wma, vdev_id))
Abhishek Singh2d775fd2017-08-18 10:51:33 +05304366 wma_send_msg_high_priority(wma, WMA_ADD_BSS_RSP,
4367 (void *)add_bss, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004368}
4369
4370/**
4371 * wma_add_bss() - Add BSS request to fw as per opmode
4372 * @wma: wma handle
4373 * @params: add bss params
4374 *
4375 * Return: none
4376 */
4377void wma_add_bss(tp_wma_handle wma, tpAddBssParams params)
4378{
4379 WMA_LOGD("%s: add_bss_param.halPersona = %d",
4380 __func__, params->halPersona);
4381
4382 switch (params->halPersona) {
4383
Anurag Chouhan6d760662016-02-20 16:05:43 +05304384 case QDF_SAP_MODE:
4385 case QDF_P2P_GO_MODE:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004386 wma_add_bss_ap_mode(wma, params);
4387 break;
4388
4389#ifdef QCA_IBSS_SUPPORT
Anurag Chouhan6d760662016-02-20 16:05:43 +05304390 case QDF_IBSS_MODE:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004391 wma_add_bss_ibss_mode(wma, params);
4392 break;
4393#endif
4394
Deepak Dhamdheree2dd5442016-05-27 15:05:51 -07004395 case QDF_NDI_MODE:
4396 wma_add_bss_ndi_mode(wma, params);
4397 break;
4398
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004399 default:
4400 wma_add_bss_sta_mode(wma, params);
4401 break;
4402 }
4403}
4404
4405/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004406 * wma_add_sta_req_ap_mode() - process add sta request in ap mode
4407 * @wma: wma handle
4408 * @add_sta: add sta params
4409 *
4410 * Return: none
4411 */
4412static void wma_add_sta_req_ap_mode(tp_wma_handle wma, tpAddStaParams add_sta)
4413{
Dhanashri Atreb08959a2016-03-01 17:28:03 -08004414 enum ol_txrx_peer_state state = OL_TXRX_PEER_STATE_CONN;
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004415 struct cdp_pdev *pdev;
4416 struct cdp_vdev *vdev;
Leo Chang96464902016-10-28 11:10:54 -07004417 void *peer;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004418 uint8_t peer_id;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304419 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004420 int32_t ret;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004421 struct wma_txrx_node *iface = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004422 struct wma_target_req *msg;
4423 bool peer_assoc_cnf = false;
Leo Chang96464902016-10-28 11:10:54 -07004424 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
lifeng13a89d72017-05-10 14:49:29 +08004425 uint32_t mcs_limit, i, j;
4426 uint8_t *rate_pos;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004427
Anurag Chouhan6d760662016-02-20 16:05:43 +05304428 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004429
4430 if (NULL == pdev) {
4431 WMA_LOGE("%s: Failed to find pdev", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304432 add_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004433 goto send_rsp;
4434 }
4435 /* UMAC sends WMA_ADD_STA_REQ msg twice to WMA when the station
4436 * associates. First WMA_ADD_STA_REQ will have staType as
4437 * STA_ENTRY_PEER and second posting will have STA_ENTRY_SELF.
4438 * Peer creation is done in first WMA_ADD_STA_REQ and second
4439 * WMA_ADD_STA_REQ which has STA_ENTRY_SELF is ignored and
4440 * send fake response with success to UMAC. Otherwise UMAC
4441 * will get blocked.
4442 */
4443 if (add_sta->staType != STA_ENTRY_PEER) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304444 add_sta->status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004445 goto send_rsp;
4446 }
4447
4448 vdev = wma_find_vdev_by_id(wma, add_sta->smesessionId);
4449 if (!vdev) {
4450 WMA_LOGE("%s: Failed to find vdev", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304451 add_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004452 goto send_rsp;
4453 }
4454
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07004455 iface = &wma->interfaces[add_sta->smesessionId];
Leo Chang96464902016-10-28 11:10:54 -07004456 peer = cdp_peer_find_by_addr_and_vdev(soc, pdev, vdev,
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004457 add_sta->staMac, &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004458 if (peer) {
4459 wma_remove_peer(wma, add_sta->staMac, add_sta->smesessionId,
4460 peer, false);
4461 WMA_LOGE("%s: Peer already exists, Deleted peer with peer_addr %pM",
4462 __func__, add_sta->staMac);
4463 }
Liangwei Dong7d845112016-09-27 22:24:21 -04004464 /* The code above only checks the peer existence on its own vdev.
4465 * Need to check whether the peer exists on other vDevs because firmware
4466 * can't create the peer if the peer with same MAC address already
4467 * exists on the pDev. As this peer belongs to other vDevs, just return
4468 * here.
4469 */
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004470 peer = cdp_peer_find_by_addr(soc, pdev,
4471 add_sta->staMac, &peer_id);
Liangwei Dong7d845112016-09-27 22:24:21 -04004472 if (peer) {
Jeff Johnsonadba3962017-09-18 08:12:35 -07004473 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 -07004474 __func__, vdev, add_sta->staMac, peer_id);
Liangwei Dong7d845112016-09-27 22:24:21 -04004475 add_sta->status = QDF_STATUS_E_FAILURE;
4476 goto send_rsp;
4477 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004478
4479 status = wma_create_peer(wma, pdev, vdev, add_sta->staMac,
4480 WMI_PEER_TYPE_DEFAULT, add_sta->smesessionId,
4481 false);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304482 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004483 WMA_LOGE("%s: Failed to create peer for %pM",
4484 __func__, add_sta->staMac);
4485 add_sta->status = status;
4486 goto send_rsp;
4487 }
4488
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004489 peer = cdp_peer_find_by_addr_and_vdev(soc, pdev,
4490 vdev,
4491 add_sta->staMac, &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004492 if (!peer) {
4493 WMA_LOGE("%s: Failed to find peer handle using peer mac %pM",
4494 __func__, add_sta->staMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304495 add_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004496 wma_remove_peer(wma, add_sta->staMac, add_sta->smesessionId,
4497 peer, false);
4498 goto send_rsp;
4499 }
4500
4501 wmi_unified_send_txbf(wma, add_sta);
4502
lifeng13a89d72017-05-10 14:49:29 +08004503 /*
4504 * Get MCS limit from ini configure, and map it to rate parameters
4505 * This will limit HT rate upper bound. CFG_CTRL_MASK is used to
4506 * check whether ini config is enabled and CFG_DATA_MASK to get the
4507 * MCS value.
4508 */
4509#define CFG_CTRL_MASK 0xFF00
4510#define CFG_DATA_MASK 0x00FF
4511
4512 if (wlan_cfg_get_int(wma->mac_context, WNI_CFG_SAP_MAX_MCS_DATA,
Jeff Johnsone88dd752018-06-07 22:57:54 -07004513 &mcs_limit) != QDF_STATUS_SUCCESS) {
lifeng13a89d72017-05-10 14:49:29 +08004514 mcs_limit = WNI_CFG_SAP_MAX_MCS_DATA_STADEF;
4515 }
4516
4517 if (mcs_limit & CFG_CTRL_MASK) {
4518 WMA_LOGD("%s: set mcs_limit %x", __func__, mcs_limit);
4519
4520 mcs_limit &= CFG_DATA_MASK;
4521 rate_pos = (u_int8_t *)add_sta->supportedRates.supportedMCSSet;
4522 for (i = 0, j = 0; i < MAX_SUPPORTED_RATES;) {
4523 if (j < mcs_limit / 8) {
4524 rate_pos[j] = 0xff;
4525 j++;
4526 i += 8;
4527 } else if (j < mcs_limit / 8 + 1) {
4528 if (i <= mcs_limit)
4529 rate_pos[i / 8] |= 1 << (i % 8);
4530 else
4531 rate_pos[i / 8] &= ~(1 << (i % 8));
4532 i++;
4533
4534 if (i >= (j + 1) * 8)
4535 j++;
4536 } else {
4537 rate_pos[j++] = 0;
4538 i += 8;
4539 }
4540 }
4541 }
4542
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304543 if (wmi_service_enabled(wma->wmi_handle,
4544 wmi_service_peer_assoc_conf)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004545 peer_assoc_cnf = true;
4546 msg = wma_fill_hold_req(wma, add_sta->smesessionId,
4547 WMA_ADD_STA_REQ, WMA_PEER_ASSOC_CNF_START,
4548 add_sta, WMA_PEER_ASSOC_TIMEOUT);
4549 if (!msg) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004550 WMA_LOGE(FL("Failed to alloc request for vdev_id %d"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004551 add_sta->smesessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304552 add_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004553 wma_remove_req(wma, add_sta->smesessionId,
4554 WMA_PEER_ASSOC_CNF_START);
4555 wma_remove_peer(wma, add_sta->staMac,
4556 add_sta->smesessionId, peer, false);
4557 peer_assoc_cnf = false;
4558 goto send_rsp;
4559 }
4560 } else {
4561 WMA_LOGE(FL("WMI_SERVICE_PEER_ASSOC_CONF not enabled"));
4562 }
4563
Govind Singhb30d4c02016-03-24 11:01:23 +05304564 ret = wma_send_peer_assoc(wma, add_sta->nwType, add_sta);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004565 if (ret) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304566 add_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004567 wma_remove_peer(wma, add_sta->staMac, add_sta->smesessionId,
4568 peer, false);
4569 goto send_rsp;
4570 }
4571#ifdef QCA_IBSS_SUPPORT
4572 /*
4573 * In IBSS mode send the peer
4574 * Atim Window length if IBSS
4575 * power save is enabled by the
4576 * firmware.
4577 */
4578 if (wma_is_vdev_in_ibss_mode(wma, add_sta->smesessionId) &&
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304579 wmi_service_enabled(wma->wmi_handle,
4580 wmi_service_ibss_pwrsave)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004581 /*
4582 * If ATIM Window is present in the peer
4583 * beacon then send it to firmware else
4584 * configure Zero ATIM Window length to
4585 * firmware.
4586 */
4587 if (add_sta->atimIePresent) {
4588 wma_set_peer_param(wma, add_sta->staMac,
4589 WMI_PEER_IBSS_ATIM_WINDOW_LENGTH,
4590 add_sta->peerAtimWindowLength,
4591 add_sta->smesessionId);
4592 } else {
4593 wma_set_peer_param(wma, add_sta->staMac,
4594 WMI_PEER_IBSS_ATIM_WINDOW_LENGTH,
4595 0, add_sta->smesessionId);
4596 }
4597 }
4598#endif
4599
Abhishek Singhd7bc9132017-05-17 13:59:04 +05304600 iface->rmfEnabled = add_sta->rmfEnabled;
Abhishek Singhcfb44482017-03-10 12:42:37 +05304601 if (add_sta->rmfEnabled)
4602 wma_set_mgmt_frame_protection(wma);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004603
4604 if (add_sta->uAPSD) {
Govind Singhd76a5b02016-03-08 15:12:14 +05304605 status = wma_set_ap_peer_uapsd(wma, add_sta->smesessionId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004606 add_sta->staMac,
4607 add_sta->uAPSD, add_sta->maxSPLen);
Govind Singhd76a5b02016-03-08 15:12:14 +05304608 if (QDF_IS_STATUS_ERROR(status)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004609 WMA_LOGE("Failed to set peer uapsd param for %pM",
4610 add_sta->staMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304611 add_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004612 wma_remove_peer(wma, add_sta->staMac,
4613 add_sta->smesessionId, peer, false);
4614 goto send_rsp;
4615 }
4616 }
4617
4618 WMA_LOGD("%s: Moving peer %pM to state %d",
4619 __func__, add_sta->staMac, state);
Leo Chang96464902016-10-28 11:10:54 -07004620 cdp_peer_state_update(soc, pdev, add_sta->staMac, state);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004621
Leo Chang96464902016-10-28 11:10:54 -07004622 add_sta->staIdx = cdp_peer_get_local_peer_id(soc, peer);
Kanchanapally, Vidyullathae3062812015-05-22 17:28:57 +05304623 add_sta->nss = iface->nss;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304624 add_sta->status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004625send_rsp:
4626 /* Do not send add stat resp when peer assoc cnf is enabled */
4627 if (peer_assoc_cnf) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004628 WMA_LOGD(FL("WMI_SERVICE_PEER_ASSOC_CONF is enabled"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004629 return;
4630 }
4631
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004632 WMA_LOGD(FL("statype %d vdev_id %d aid %d bssid %pM staIdx %d status %d"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004633 add_sta->staType, add_sta->smesessionId,
4634 add_sta->assocId, add_sta->bssId, add_sta->staIdx,
4635 add_sta->status);
Abhishek Singh2d775fd2017-08-18 10:51:33 +05304636 wma_send_msg_high_priority(wma, WMA_ADD_STA_RSP, (void *)add_sta, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004637}
4638
4639#ifdef FEATURE_WLAN_TDLS
Poddar, Siddarth5a91f5b2016-04-28 12:24:10 +05304640
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004641/**
4642 * wma_add_tdls_sta() - process add sta request in TDLS mode
4643 * @wma: wma handle
4644 * @add_sta: add sta params
4645 *
4646 * Return: none
4647 */
4648static void wma_add_tdls_sta(tp_wma_handle wma, tpAddStaParams add_sta)
4649{
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004650 struct cdp_pdev *pdev;
4651 struct cdp_vdev *vdev;
Leo Chang96464902016-10-28 11:10:54 -07004652 void *peer;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004653 uint8_t peer_id;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304654 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004655 int32_t ret;
4656 tTdlsPeerStateParams *peerStateParams;
4657 struct wma_target_req *msg;
4658 bool peer_assoc_cnf = false;
Leo Chang96464902016-10-28 11:10:54 -07004659 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004660
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004661 WMA_LOGD("%s: staType: %d, staIdx: %d, updateSta: %d, bssId: %pM, staMac: %pM",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004662 __func__, add_sta->staType, add_sta->staIdx,
4663 add_sta->updateSta, add_sta->bssId, add_sta->staMac);
4664
Anurag Chouhan6d760662016-02-20 16:05:43 +05304665 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004666
4667 if (NULL == pdev) {
4668 WMA_LOGE("%s: Failed to find pdev", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304669 add_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004670 goto send_rsp;
4671 }
4672
4673 vdev = wma_find_vdev_by_id(wma, add_sta->smesessionId);
4674 if (!vdev) {
4675 WMA_LOGE("%s: Failed to find vdev", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304676 add_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004677 goto send_rsp;
4678 }
4679
Nitesh Shah622d3122017-06-05 17:04:06 +05304680 if (wma_is_roam_synch_in_progress(wma, add_sta->smesessionId)) {
4681 WMA_LOGE("%s: roaming in progress, reject add sta!", __func__);
4682 add_sta->status = QDF_STATUS_E_PERM;
4683 goto send_rsp;
4684 }
4685
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004686 if (0 == add_sta->updateSta) {
4687 /* its a add sta request * */
Poddar, Siddarth5a91f5b2016-04-28 12:24:10 +05304688
Leo Chang96464902016-10-28 11:10:54 -07004689 cdp_peer_copy_mac_addr_raw(soc, vdev, add_sta->bssId);
Poddar, Siddarth5a91f5b2016-04-28 12:24:10 +05304690
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004691 WMA_LOGD("%s: addSta, calling wma_create_peer for %pM, vdev_id %hu",
4692 __func__, add_sta->staMac, add_sta->smesessionId);
4693
4694 status = wma_create_peer(wma, pdev, vdev, add_sta->staMac,
4695 WMI_PEER_TYPE_TDLS,
4696 add_sta->smesessionId, false);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304697 if (status != QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004698 WMA_LOGE("%s: Failed to create peer for %pM",
4699 __func__, add_sta->staMac);
4700 add_sta->status = status;
4701 goto send_rsp;
4702 }
4703
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004704 peer = cdp_peer_find_by_addr(soc, pdev,
4705 add_sta->staMac,
4706 &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004707 if (!peer) {
4708 WMA_LOGE("%s: addSta, failed to find peer handle for mac %pM",
4709 __func__, add_sta->staMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304710 add_sta->status = QDF_STATUS_E_FAILURE;
Leo Chang96464902016-10-28 11:10:54 -07004711 cdp_peer_add_last_real_peer(soc, pdev, vdev, &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004712 goto send_rsp;
4713 }
4714
Leo Chang96464902016-10-28 11:10:54 -07004715 add_sta->staIdx = cdp_peer_get_local_peer_id(soc, peer);
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004716 WMA_LOGD("%s: addSta, after calling cdp_local_peer_id, staIdx: %d, staMac: %pM",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004717 __func__, add_sta->staIdx, add_sta->staMac);
4718
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304719 peerStateParams = qdf_mem_malloc(sizeof(tTdlsPeerStateParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004720 if (!peerStateParams) {
4721 WMA_LOGE
4722 ("%s: Failed to allocate memory for peerStateParams for %pM",
4723 __func__, add_sta->staMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304724 add_sta->status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004725 goto send_rsp;
4726 }
4727
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004728 peerStateParams->peerState = WMI_TDLS_PEER_STATE_PEERING;
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07004729 peerStateParams->vdevId = add_sta->smesessionId;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304730 qdf_mem_copy(&peerStateParams->peerMacAddr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004731 &add_sta->staMac, sizeof(tSirMacAddr));
4732 wma_update_tdls_peer_state(wma, peerStateParams);
4733 } else {
4734 /* its a change sta request * */
4735 peer =
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004736 cdp_peer_find_by_addr(soc, pdev,
4737 add_sta->staMac,
4738 &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004739 if (!peer) {
4740 WMA_LOGE("%s: changeSta,failed to find peer handle for mac %pM",
4741 __func__, add_sta->staMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304742 add_sta->status = QDF_STATUS_E_FAILURE;
Poddar, Siddarth5a91f5b2016-04-28 12:24:10 +05304743
Leo Chang96464902016-10-28 11:10:54 -07004744 cdp_peer_add_last_real_peer(soc, pdev, vdev, &peer_id);
Poddar, Siddarth5a91f5b2016-04-28 12:24:10 +05304745
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004746 goto send_rsp;
4747 }
4748
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304749 if (wmi_service_enabled(wma->wmi_handle,
4750 wmi_service_peer_assoc_conf)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004751 WMA_LOGE(FL("WMI_SERVICE_PEER_ASSOC_CONF is enabled"));
4752 peer_assoc_cnf = true;
4753 msg = wma_fill_hold_req(wma, add_sta->smesessionId,
4754 WMA_ADD_STA_REQ, WMA_PEER_ASSOC_CNF_START,
4755 add_sta, WMA_PEER_ASSOC_TIMEOUT);
4756 if (!msg) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004757 WMA_LOGE(FL("Failed to alloc request for vdev_id %d"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004758 add_sta->smesessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304759 add_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004760 wma_remove_req(wma, add_sta->smesessionId,
4761 WMA_PEER_ASSOC_CNF_START);
4762 wma_remove_peer(wma, add_sta->staMac,
4763 add_sta->smesessionId, peer, false);
4764 peer_assoc_cnf = false;
4765 goto send_rsp;
4766 }
4767 } else {
4768 WMA_LOGE(FL("WMI_SERVICE_PEER_ASSOC_CONF not enabled"));
4769 }
4770
Govind Singhb30d4c02016-03-24 11:01:23 +05304771 WMA_LOGD("%s: changeSta, calling wma_send_peer_assoc",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004772 __func__);
4773
4774 ret =
Govind Singhb30d4c02016-03-24 11:01:23 +05304775 wma_send_peer_assoc(wma, add_sta->nwType, add_sta);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004776 if (ret) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304777 add_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004778 wma_remove_peer(wma, add_sta->staMac,
4779 add_sta->smesessionId, peer, false);
Leo Chang96464902016-10-28 11:10:54 -07004780 cdp_peer_add_last_real_peer(soc, pdev, vdev, &peer_id);
Poddar, Siddarth5a91f5b2016-04-28 12:24:10 +05304781
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004782 goto send_rsp;
4783 }
4784 }
4785
4786send_rsp:
4787 /* Do not send add stat resp when peer assoc cnf is enabled */
4788 if (peer_assoc_cnf)
4789 return;
4790
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004791 WMA_LOGD(FL("statype %d vdev_id %d aid %d bssid %pM staIdx %d status %d"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004792 add_sta->staType, add_sta->smesessionId,
4793 add_sta->assocId, add_sta->bssId, add_sta->staIdx,
4794 add_sta->status);
Abhishek Singh2d775fd2017-08-18 10:51:33 +05304795 wma_send_msg_high_priority(wma, WMA_ADD_STA_RSP, (void *)add_sta, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004796}
4797#endif
4798
4799/**
Jeff Johnsonc97816c2018-05-12 17:13:23 -07004800 * wma_send_bss_color_change_enable() - send bss color change enable cmd.
Arif Hussain05fb4872018-01-03 16:02:55 -08004801 * @wma: wma handle
4802 * @params: add sta params
4803 *
4804 * Send bss color change command to firmware, to enable firmware to update
4805 * internally if any change in bss color in advertised by associated AP.
4806 *
4807 * Return: none
4808 */
4809#ifdef WLAN_FEATURE_11AX
4810static void wma_send_bss_color_change_enable(tp_wma_handle wma,
4811 tpAddStaParams params)
4812{
4813 QDF_STATUS status;
4814 uint32_t vdev_id = params->smesessionId;
4815
4816 if (!params->he_capable) {
4817 WMA_LOGD("%s: he_capable is not set for vdev_id:%d",
4818 __func__, vdev_id);
4819 return;
4820 }
4821
4822 status = wmi_unified_send_bss_color_change_enable_cmd(wma->wmi_handle,
4823 vdev_id,
4824 true);
4825 if (QDF_IS_STATUS_ERROR(status)) {
4826 WMA_LOGE("Failed to enable bss color change offload, vdev:%d",
4827 vdev_id);
4828 }
4829
4830 return;
4831}
4832#else
4833static void wma_send_bss_color_change_enable(tp_wma_handle wma,
4834 tpAddStaParams params)
4835{
4836}
4837#endif
4838
4839/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004840 * wma_add_sta_req_sta_mode() - process add sta request in sta mode
4841 * @wma: wma handle
Arif Hussain05fb4872018-01-03 16:02:55 -08004842 * @params: add sta params
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004843 *
4844 * Return: none
4845 */
4846static void wma_add_sta_req_sta_mode(tp_wma_handle wma, tpAddStaParams params)
4847{
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004848 struct cdp_pdev *pdev;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304849 QDF_STATUS status = QDF_STATUS_SUCCESS;
Leo Chang96464902016-10-28 11:10:54 -07004850 void *peer;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004851 struct wma_txrx_node *iface;
Amar Singhala297bfa2015-10-15 15:07:29 -07004852 int8_t maxTxPower;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004853 int ret = 0;
4854 struct wma_target_req *msg;
4855 bool peer_assoc_cnf = false;
Govind Singhd76a5b02016-03-08 15:12:14 +05304856 struct vdev_up_params param = {0};
Archana Ramachandran20d2e232016-02-11 16:58:40 -08004857 int smps_param;
Leo Chang96464902016-10-28 11:10:54 -07004858 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004859
4860#ifdef FEATURE_WLAN_TDLS
4861 if (STA_ENTRY_TDLS_PEER == params->staType) {
4862 wma_add_tdls_sta(wma, params);
4863 return;
4864 }
4865#endif
4866
Anurag Chouhan6d760662016-02-20 16:05:43 +05304867 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004868
4869 if (NULL == pdev) {
4870 WMA_LOGE("%s: Unable to get pdev", __func__);
4871 goto out;
4872 }
4873
4874 iface = &wma->interfaces[params->smesessionId];
4875 if (params->staType != STA_ENTRY_SELF) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004876 WMA_LOGE("%s: unsupported station type %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004877 __func__, params->staType);
4878 goto out;
4879 }
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08004880 peer = cdp_peer_find_by_addr(soc,
4881 pdev,
4882 params->bssId, &params->staIdx);
Sandeep Puligilla2ff3ebe2016-08-31 23:55:07 -07004883 if (peer == NULL) {
4884 WMA_LOGE("%s: Peer is not present vdev id %d for %pM", __func__,
4885 params->smesessionId, params->bssId);
4886 status = QDF_STATUS_E_FAILURE;
4887 goto out;
4888 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004889 if (params->nonRoamReassoc) {
Leo Chang96464902016-10-28 11:10:54 -07004890 cdp_peer_state_update(soc, pdev, params->bssId,
Dhanashri Atreb08959a2016-03-01 17:28:03 -08004891 OL_TXRX_PEER_STATE_AUTH);
Anurag Chouhan8e0ccd32016-02-19 15:30:20 +05304892 qdf_atomic_set(&iface->bss_status, WMA_BSS_STATUS_STARTED);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004893 iface->aid = params->assocId;
4894 goto out;
4895 }
4896
Mukul Sharmaf9047232017-03-02 16:58:56 +05304897 if (wma_is_vdev_up(params->smesessionId)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004898 WMA_LOGE("%s: vdev id %d is already UP for %pM", __func__,
4899 params->smesessionId, params->bssId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304900 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004901 goto out;
4902 }
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07004903
4904 if (peer != NULL &&
Leo Chang96464902016-10-28 11:10:54 -07004905 (cdp_peer_state_get(soc, peer) == OL_TXRX_PEER_STATE_DISC)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004906 /*
4907 * This is the case for reassociation.
4908 * peer state update and peer_assoc is required since it
4909 * was not done by WMA_ADD_BSS_REQ.
4910 */
4911
4912 /* Update peer state */
4913 if (params->encryptType == eSIR_ED_NONE) {
4914 WMA_LOGD("%s: Update peer(%pM) state into auth",
4915 __func__, params->bssId);
Leo Chang96464902016-10-28 11:10:54 -07004916 cdp_peer_state_update(soc, pdev, params->bssId,
Dhanashri Atreb08959a2016-03-01 17:28:03 -08004917 OL_TXRX_PEER_STATE_AUTH);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004918 } else {
4919 WMA_LOGD("%s: Update peer(%pM) state into conn",
4920 __func__, params->bssId);
Leo Chang96464902016-10-28 11:10:54 -07004921 cdp_peer_state_update(soc, pdev, params->bssId,
Dhanashri Atreb08959a2016-03-01 17:28:03 -08004922 OL_TXRX_PEER_STATE_CONN);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004923 }
4924
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08004925 if (wma_is_roam_synch_in_progress(wma, params->smesessionId)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004926 /* iface->nss = params->nss; */
4927 /*In LFR2.0, the following operations are performed as
Govind Singhb30d4c02016-03-24 11:01:23 +05304928 * part of wma_send_peer_assoc. As we are
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004929 * skipping this operation, we are just executing the
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07004930 * following which are useful for LFR3.0
4931 */
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_AUTH);
Anurag Chouhan8e0ccd32016-02-19 15:30:20 +05304934 qdf_atomic_set(&iface->bss_status,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004935 WMA_BSS_STATUS_STARTED);
4936 iface->aid = params->assocId;
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004937 WMA_LOGD("LFR3:statype %d vdev %d aid %d bssid %pM",
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08004938 params->staType, params->smesessionId,
4939 params->assocId, params->bssId);
4940 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004941 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004942 wmi_unified_send_txbf(wma, params);
4943
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304944 if (wmi_service_enabled(wma->wmi_handle,
4945 wmi_service_peer_assoc_conf)) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004946 WMA_LOGD(FL("WMI_SERVICE_PEER_ASSOC_CONF is enabled"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004947 peer_assoc_cnf = true;
4948 msg = wma_fill_hold_req(wma, params->smesessionId,
4949 WMA_ADD_STA_REQ, WMA_PEER_ASSOC_CNF_START,
4950 params, WMA_PEER_ASSOC_TIMEOUT);
4951 if (!msg) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004952 WMA_LOGD(FL("Failed to alloc request for vdev_id %d"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004953 params->smesessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304954 params->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004955 wma_remove_req(wma, params->smesessionId,
4956 WMA_PEER_ASSOC_CNF_START);
4957 wma_remove_peer(wma, params->staMac,
4958 params->smesessionId, peer, false);
4959 peer_assoc_cnf = false;
4960 goto out;
4961 }
4962 } else {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07004963 WMA_LOGD(FL("WMI_SERVICE_PEER_ASSOC_CONF not enabled"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004964 }
4965
Govind Singhb30d4c02016-03-24 11:01:23 +05304966 ret = wma_send_peer_assoc(wma,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004967 iface->nwType,
4968 (tAddStaParams *) iface->addBssStaContext);
4969 if (ret) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304970 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004971 wma_remove_peer(wma, params->bssId,
4972 params->smesessionId, peer, false);
4973 goto out;
4974 }
Abhishek Singhcfb44482017-03-10 12:42:37 +05304975
4976 if (params->rmfEnabled)
4977 wma_set_mgmt_frame_protection(wma);
4978
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004979 /*
4980 * Set the PTK in 11r mode because we already have it.
4981 */
4982 if (iface->staKeyParams) {
4983 wma_set_stakey(wma,
4984 (tpSetStaKeyParams) iface->staKeyParams);
4985 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004986 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004987 maxTxPower = params->maxTxPower;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004988 wma_vdev_set_bss_params(wma, params->smesessionId,
4989 iface->beaconInterval, iface->dtimPeriod,
4990 iface->shortSlotTimeSupported,
4991 iface->llbCoexist, maxTxPower);
4992
4993 params->csaOffloadEnable = 0;
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05304994 if (wmi_service_enabled(wma->wmi_handle,
4995 wmi_service_csa_offload)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004996 params->csaOffloadEnable = 1;
Govind Singhd76a5b02016-03-08 15:12:14 +05304997 if (wma_unified_csa_offload_enable(wma, params->smesessionId) <
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004998 0) {
4999 WMA_LOGE("Unable to enable CSA offload for vdev_id:%d",
5000 params->smesessionId);
5001 }
5002 }
5003
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05305004 if (wmi_service_enabled(wma->wmi_handle,
Jeff Johnson75873e92018-06-30 18:08:06 -07005005 wmi_service_filter_ipsec_natkeepalive)) {
5006 if (wmi_unified_nat_keepalive_en_cmd(wma->wmi_handle,
5007 params->smesessionId)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005008 WMA_LOGE("Unable to enable NAT keepalive for vdev_id:%d",
5009 params->smesessionId);
5010 }
5011 }
5012
Govind Singhd76a5b02016-03-08 15:12:14 +05305013 param.vdev_id = params->smesessionId;
5014 param.assoc_id = params->assocId;
Dustin Brownec2c92e2017-07-26 11:13:49 -07005015 if (wma_send_vdev_up_to_fw(wma, &param, params->bssId) !=
5016 QDF_STATUS_SUCCESS) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07005017 WMA_LOGE("%s: Failed to send vdev up cmd: vdev %d bssid %pM",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005018 __func__, params->smesessionId, params->bssId);
Tushnim Bhattacharyya51258a72017-03-13 12:55:02 -07005019 policy_mgr_set_do_hw_mode_change_flag(
5020 wma->psoc, false);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305021 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005022 } else {
Hong Shib90718f2017-02-20 00:57:22 +08005023 wma_set_vdev_mgmt_rate(wma, params->smesessionId);
Mukul Sharmaf9047232017-03-02 16:58:56 +05305024 wma_vdev_set_mlme_state(wma, params->smesessionId,
5025 WLAN_VDEV_S_RUN);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005026 }
5027
Anurag Chouhan8e0ccd32016-02-19 15:30:20 +05305028 qdf_atomic_set(&iface->bss_status, WMA_BSS_STATUS_STARTED);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005029 WMA_LOGD("%s: STA mode (type %d subtype %d) BSS is started",
5030 __func__, iface->type, iface->sub_type);
5031 /* Sta is now associated, configure various params */
5032
Archana Ramachandran20d2e232016-02-11 16:58:40 -08005033 /* Send SMPS force command to FW to send the required
5034 * action frame only when SM power save is enbaled in
Archana Ramachandranfec24812016-02-16 16:31:56 -08005035 * from INI. In case dynamic antenna selection, the
5036 * action frames are sent by the chain mask manager
Archana Ramachandran20d2e232016-02-11 16:58:40 -08005037 * In addition to the action frames, The SM power save is
5038 * published in the assoc request HT SMPS IE for both cases.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005039 */
Archana Ramachandranfec24812016-02-16 16:31:56 -08005040 if ((params->enableHtSmps) && (params->send_smps_action)) {
Archana Ramachandran20d2e232016-02-11 16:58:40 -08005041 smps_param = wma_smps_mode_to_force_mode_param(
5042 params->htSmpsconfig);
5043 if (smps_param >= 0) {
Archana Ramachandranfec24812016-02-16 16:31:56 -08005044 WMA_LOGD("%s: Send SMPS force mode: %d",
Archana Ramachandran20d2e232016-02-11 16:58:40 -08005045 __func__, params->htSmpsconfig);
5046 wma_set_mimops(wma, params->smesessionId,
5047 smps_param);
5048 }
5049 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005050
Arif Hussain05fb4872018-01-03 16:02:55 -08005051 wma_send_bss_color_change_enable(wma, params);
5052
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005053 /* Partial AID match power save, enable when SU bformee */
5054 if (params->enableVhtpAid && params->vhtTxBFCapable)
5055 wma_set_ppsconfig(params->smesessionId,
5056 WMA_VHT_PPS_PAID_MATCH, 1);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005057
5058 /* Enable AMPDU power save, if htCapable/vhtCapable */
5059 if (params->enableAmpduPs && (params->htCapable || params->vhtCapable))
5060 wma_set_ppsconfig(params->smesessionId,
5061 WMA_VHT_PPS_DELIM_CRC_FAIL, 1);
Krunal Soni1fd496d2018-02-02 01:25:19 -08005062 if (WMI_SERVICE_EXT_IS_ENABLED(wma->wmi_service_bitmap,
5063 wma->wmi_service_ext_bitmap,
5064 WMI_SERVICE_LISTEN_INTERVAL_OFFLOAD_SUPPORT)) {
5065 WMA_LOGD("%s: listen interval offload enabled, setting params",
5066 __func__);
5067 status = wma_vdev_set_param(wma->wmi_handle,
5068 params->smesessionId,
5069 WMI_VDEV_PARAM_MAX_LI_OF_MODDTIM,
5070 wma->staMaxLIModDtim);
5071 if (status != QDF_STATUS_SUCCESS) {
5072 WMA_LOGE(FL("can't set MAX_LI for session: %d"),
5073 params->smesessionId);
5074 }
5075 status = wma_vdev_set_param(wma->wmi_handle,
5076 params->smesessionId,
5077 WMI_VDEV_PARAM_DYNDTIM_CNT,
5078 wma->staDynamicDtim);
5079 if (status != QDF_STATUS_SUCCESS) {
5080 WMA_LOGE(FL("can't set DYNDTIM_CNT for session: %d"),
5081 params->smesessionId);
5082 }
5083 status = wma_vdev_set_param(wma->wmi_handle,
5084 params->smesessionId,
5085 WMI_VDEV_PARAM_MODDTIM_CNT,
5086 wma->staModDtim);
5087 if (status != QDF_STATUS_SUCCESS) {
5088 WMA_LOGE(FL("can't set DTIM_CNT for session: %d"),
5089 params->smesessionId);
5090 }
5091
5092 } else {
5093 WMA_LOGD("%s: listen interval offload is not set",
5094 __func__);
5095 }
5096
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005097 iface->aid = params->assocId;
Kanchanapally, Vidyullathae3062812015-05-22 17:28:57 +05305098 params->nss = iface->nss;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005099out:
5100 /* Do not send add stat resp when peer assoc cnf is enabled */
5101 if (peer_assoc_cnf)
5102 return;
5103
5104 params->status = status;
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07005105 WMA_LOGD(FL("statype %d vdev_id %d aid %d bssid %pM staIdx %d status %d"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005106 params->staType, params->smesessionId,
5107 params->assocId, params->bssId, params->staIdx,
5108 params->status);
Sandeep Puligilla2ff3ebe2016-08-31 23:55:07 -07005109 /* Don't send a response during roam sync operation */
5110 if (!wma_is_roam_synch_in_progress(wma, params->smesessionId))
Abhishek Singh2d775fd2017-08-18 10:51:33 +05305111 wma_send_msg_high_priority(wma, WMA_ADD_STA_RSP,
5112 (void *)params, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005113}
5114
5115/**
Jeff Johnsonc97816c2018-05-12 17:13:23 -07005116 * wma_delete_sta_req_ap_mode() - process delete sta request from UMAC in AP mode
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005117 * @wma: wma handle
5118 * @del_sta: delete sta params
5119 *
5120 * Return: none
5121 */
5122static void wma_delete_sta_req_ap_mode(tp_wma_handle wma,
5123 tpDeleteStaParams del_sta)
5124{
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08005125 struct cdp_pdev *pdev;
Leo Chang96464902016-10-28 11:10:54 -07005126 void *peer;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08005127 struct wma_target_req *msg;
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07005128 uint8_t *peer_mac_addr;
Leo Chang96464902016-10-28 11:10:54 -07005129 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005130
Anurag Chouhan6d760662016-02-20 16:05:43 +05305131 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005132
5133 if (NULL == pdev) {
5134 WMA_LOGE("%s: Failed to get pdev", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305135 del_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005136 goto send_del_rsp;
5137 }
5138
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08005139 peer = cdp_peer_find_by_local_id(soc,
5140 pdev, del_sta->staIdx);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005141 if (!peer) {
5142 WMA_LOGE("%s: Failed to get peer handle using peer id %d",
5143 __func__, del_sta->staIdx);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305144 del_sta->status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005145 goto send_del_rsp;
5146 }
Leo Chang96464902016-10-28 11:10:54 -07005147 peer_mac_addr = cdp_peer_get_peer_mac_addr(soc, peer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005148
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07005149 wma_remove_peer(wma, peer_mac_addr, del_sta->smesessionId, peer,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005150 false);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305151 del_sta->status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005152
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05305153 if (wmi_service_enabled(wma->wmi_handle,
5154 wmi_service_sync_delete_cmds)) {
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08005155 msg = wma_fill_hold_req(wma, del_sta->smesessionId,
5156 WMA_DELETE_STA_REQ,
5157 WMA_DELETE_STA_RSP_START, del_sta,
5158 WMA_DELETE_STA_TIMEOUT);
5159 if (!msg) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07005160 WMA_LOGE(FL("Failed to allocate request. vdev_id %d"),
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08005161 del_sta->smesessionId);
5162 wma_remove_req(wma, del_sta->smesessionId,
5163 WMA_DELETE_STA_RSP_START);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305164 del_sta->status = QDF_STATUS_E_NOMEM;
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08005165 goto send_del_rsp;
5166 }
Dustin Brownec2c92e2017-07-26 11:13:49 -07005167
5168 wma_acquire_wakelock(&wma->wmi_cmd_rsp_wake_lock,
5169 WMA_FW_RSP_EVENT_WAKE_LOCK_DURATION);
5170
Sandeep Puligilla19ddda22016-01-05 12:18:02 -08005171 return;
5172 }
5173
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005174send_del_rsp:
5175 if (del_sta->respReqd) {
5176 WMA_LOGD("%s: Sending del rsp to umac (status: %d)",
5177 __func__, del_sta->status);
Abhishek Singh2d775fd2017-08-18 10:51:33 +05305178 wma_send_msg_high_priority(wma, WMA_DELETE_STA_RSP,
5179 (void *)del_sta, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005180 }
5181}
5182
5183#ifdef FEATURE_WLAN_TDLS
5184/**
Jeff Johnsonc97816c2018-05-12 17:13:23 -07005185 * wma_del_tdls_sta() - process delete sta request from UMAC in TDLS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005186 * @wma: wma handle
5187 * @del_sta: delete sta params
5188 *
5189 * Return: none
5190 */
5191static void wma_del_tdls_sta(tp_wma_handle wma, tpDeleteStaParams del_sta)
5192{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005193 tTdlsPeerStateParams *peerStateParams;
Padma, Santhosh Kumar4eb79082017-02-24 16:00:20 +05305194 struct wma_target_req *msg;
5195 int status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005196
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305197 peerStateParams = qdf_mem_malloc(sizeof(tTdlsPeerStateParams));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005198 if (!peerStateParams) {
5199 WMA_LOGE("%s: Failed to allocate memory for peerStateParams for: %pM",
5200 __func__, del_sta->staMac);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305201 del_sta->status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005202 goto send_del_rsp;
5203 }
5204
Nitesh Shah622d3122017-06-05 17:04:06 +05305205 if (wma_is_roam_synch_in_progress(wma, del_sta->smesessionId)) {
5206 WMA_LOGE("%s: roaming in progress, reject del sta!", __func__);
5207 del_sta->status = QDF_STATUS_E_PERM;
5208 goto send_del_rsp;
5209 }
5210
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005211 peerStateParams->peerState = WMA_TDLS_PEER_STATE_TEARDOWN;
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07005212 peerStateParams->vdevId = del_sta->smesessionId;
Padma, Santhosh Kumar4eb79082017-02-24 16:00:20 +05305213 peerStateParams->resp_reqd = del_sta->respReqd;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305214 qdf_mem_copy(&peerStateParams->peerMacAddr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005215 &del_sta->staMac, sizeof(tSirMacAddr));
5216
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07005217 WMA_LOGD("%s: sending tdls_peer_state for peer mac: %pM, peerState: %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005218 __func__, peerStateParams->peerMacAddr,
5219 peerStateParams->peerState);
5220
Padma, Santhosh Kumar4eb79082017-02-24 16:00:20 +05305221 status = wma_update_tdls_peer_state(wma, peerStateParams);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005222
Padma, Santhosh Kumar4eb79082017-02-24 16:00:20 +05305223 if (status < 0) {
5224 WMA_LOGE("%s: wma_update_tdls_peer_state returned failure",
5225 __func__);
5226 goto send_del_rsp;
5227 }
5228
5229 if (del_sta->respReqd &&
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05305230 wmi_service_enabled(wma->wmi_handle,
5231 wmi_service_sync_delete_cmds)) {
Padma, Santhosh Kumar4eb79082017-02-24 16:00:20 +05305232 del_sta->status = QDF_STATUS_SUCCESS;
5233 msg = wma_fill_hold_req(wma,
5234 del_sta->smesessionId,
5235 WMA_DELETE_STA_REQ,
5236 WMA_DELETE_STA_RSP_START, del_sta,
5237 WMA_DELETE_STA_TIMEOUT);
5238 if (!msg) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07005239 WMA_LOGE(FL("Failed to allocate vdev_id %d"),
Pragaspathi Thilagaraj78474342018-04-11 17:09:28 +05305240 del_sta->smesessionId);
Padma, Santhosh Kumar4eb79082017-02-24 16:00:20 +05305241 wma_remove_req(wma,
Pragaspathi Thilagaraj78474342018-04-11 17:09:28 +05305242 del_sta->smesessionId,
Padma, Santhosh Kumar4eb79082017-02-24 16:00:20 +05305243 WMA_DELETE_STA_RSP_START);
5244 del_sta->status = QDF_STATUS_E_NOMEM;
5245 goto send_del_rsp;
5246 }
Dustin Brownec2c92e2017-07-26 11:13:49 -07005247
5248 wma_acquire_wakelock(&wma->wmi_cmd_rsp_wake_lock,
Padma, Santhosh Kumar4eb79082017-02-24 16:00:20 +05305249 WMA_FW_RSP_EVENT_WAKE_LOCK_DURATION);
Padma, Santhosh Kumar4eb79082017-02-24 16:00:20 +05305250 }
5251
5252 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005253
5254send_del_rsp:
5255 if (del_sta->respReqd) {
5256 WMA_LOGD("%s: Sending del rsp to umac (status: %d)",
5257 __func__, del_sta->status);
Abhishek Singh2d775fd2017-08-18 10:51:33 +05305258 wma_send_msg_high_priority(wma, WMA_DELETE_STA_RSP,
5259 (void *)del_sta, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005260 }
5261}
5262#endif
5263
5264/**
Jeff Johnsonc97816c2018-05-12 17:13:23 -07005265 * wma_delete_sta_req_sta_mode() - process delete sta request from UMAC
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005266 * @wma: wma handle
5267 * @params: delete sta params
5268 *
5269 * Return: none
5270 */
5271static void wma_delete_sta_req_sta_mode(tp_wma_handle wma,
5272 tpDeleteStaParams params)
5273{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305274 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005275 struct wma_txrx_node *iface;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07005276
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005277 iface = &wma->interfaces[params->smesessionId];
5278 iface->uapsd_cached_val = 0;
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08005279 if (wma_is_roam_synch_in_progress(wma, params->smesessionId))
5280 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005281#ifdef FEATURE_WLAN_TDLS
5282 if (STA_ENTRY_TDLS_PEER == params->staType) {
5283 wma_del_tdls_sta(wma, params);
5284 return;
5285 }
5286#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005287 params->status = status;
5288 if (params->respReqd) {
5289 WMA_LOGD("%s: vdev_id %d status %d", __func__,
5290 params->smesessionId, status);
Abhishek Singh2d775fd2017-08-18 10:51:33 +05305291 wma_send_msg_high_priority(wma, WMA_DELETE_STA_RSP,
5292 (void *)params, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005293 }
5294}
5295
5296/**
5297 * wma_add_sta() - process add sta request as per opmode
5298 * @wma: wma handle
5299 * @add_Sta: add sta params
5300 *
5301 * Return: none
5302 */
5303void wma_add_sta(tp_wma_handle wma, tpAddStaParams add_sta)
5304{
5305 uint8_t oper_mode = BSS_OPERATIONAL_MODE_STA;
Arunk Khandavallia6305a32018-01-25 11:19:18 +05305306 void *htc_handle;
5307
Sourav Mohapatracf632572018-04-02 11:01:35 +05305308 htc_handle = lmac_get_htc_hdl(wma->psoc);
Arunk Khandavallia6305a32018-01-25 11:19:18 +05305309 if (!htc_handle) {
5310 WMA_LOGE(":%sHTC handle is NULL:%d", __func__, __LINE__);
5311 return;
5312 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005313
5314 WMA_LOGD("%s: add_sta->sessionId = %d.", __func__,
5315 add_sta->smesessionId);
5316 WMA_LOGD("%s: add_sta->bssId = %x:%x:%x:%x:%x:%x", __func__,
5317 add_sta->bssId[0], add_sta->bssId[1], add_sta->bssId[2],
5318 add_sta->bssId[3], add_sta->bssId[4], add_sta->bssId[5]);
5319
5320 if (wma_is_vdev_in_ap_mode(wma, add_sta->smesessionId))
5321 oper_mode = BSS_OPERATIONAL_MODE_AP;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005322 else if (wma_is_vdev_in_ibss_mode(wma, add_sta->smesessionId))
5323 oper_mode = BSS_OPERATIONAL_MODE_IBSS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005324
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -07005325 if (WMA_IS_VDEV_IN_NDI_MODE(wma->interfaces, add_sta->smesessionId))
5326 oper_mode = BSS_OPERATIONAL_MODE_NDI;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005327 switch (oper_mode) {
5328 case BSS_OPERATIONAL_MODE_STA:
5329 wma_add_sta_req_sta_mode(wma, add_sta);
5330 break;
5331
Houston Hoffman79b4af22015-10-06 12:01:08 -07005332 /* IBSS should share the same code as AP mode */
5333 case BSS_OPERATIONAL_MODE_IBSS:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005334 case BSS_OPERATIONAL_MODE_AP:
Arunk Khandavallia6305a32018-01-25 11:19:18 +05305335 htc_vote_link_up(htc_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005336 wma_add_sta_req_ap_mode(wma, add_sta);
5337 break;
Deepak Dhamdhere0f076bd2016-06-02 11:29:21 -07005338 case BSS_OPERATIONAL_MODE_NDI:
5339 wma_add_sta_ndi_mode(wma, add_sta);
5340 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005341 }
5342
5343#ifdef QCA_IBSS_SUPPORT
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07005344 /* adjust heart beat thresold timer value for detecting ibss peer
5345 * departure
5346 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005347 if (oper_mode == BSS_OPERATIONAL_MODE_IBSS)
5348 wma_adjust_ibss_heart_beat_timer(wma, add_sta->smesessionId, 1);
5349#endif
5350
5351}
5352
5353/**
5354 * wma_delete_sta() - process del sta request as per opmode
5355 * @wma: wma handle
5356 * @del_sta: delete sta params
5357 *
5358 * Return: none
5359 */
5360void wma_delete_sta(tp_wma_handle wma, tpDeleteStaParams del_sta)
5361{
5362 uint8_t oper_mode = BSS_OPERATIONAL_MODE_STA;
5363 uint8_t smesession_id = del_sta->smesessionId;
5364 bool rsp_requested = del_sta->respReqd;
Arunk Khandavallia6305a32018-01-25 11:19:18 +05305365 void *htc_handle;
5366
Sourav Mohapatracf632572018-04-02 11:01:35 +05305367 htc_handle = lmac_get_htc_hdl(wma->psoc);
Arunk Khandavallia6305a32018-01-25 11:19:18 +05305368 if (!htc_handle) {
5369 WMA_LOGE(":%sHTC handle is NULL:%d", __func__, __LINE__);
5370 return;
5371 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005372
5373 if (wma_is_vdev_in_ap_mode(wma, smesession_id))
5374 oper_mode = BSS_OPERATIONAL_MODE_AP;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005375 if (wma_is_vdev_in_ibss_mode(wma, smesession_id)) {
5376 oper_mode = BSS_OPERATIONAL_MODE_IBSS;
5377 WMA_LOGD("%s: to delete sta for IBSS mode", __func__);
5378 }
Deepak Dhamdherea6d2f4c2016-06-04 00:24:52 -07005379 if (del_sta->staType == STA_ENTRY_NDI_PEER)
5380 oper_mode = BSS_OPERATIONAL_MODE_NDI;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005381
Padma, Santhosh Kumarcd35f532016-12-27 12:07:39 +05305382 WMA_LOGD(FL("oper_mode %d"), oper_mode);
5383
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005384 switch (oper_mode) {
5385 case BSS_OPERATIONAL_MODE_STA:
5386 wma_delete_sta_req_sta_mode(wma, del_sta);
Varun Reddy Yeturu33894272017-10-27 15:37:31 -07005387 if (wma_is_roam_synch_in_progress(wma, smesession_id)) {
5388 WMA_LOGD(FL("LFR3: Del STA on vdev_id %d"),
5389 del_sta->smesessionId);
5390 qdf_mem_free(del_sta);
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08005391 return;
Varun Reddy Yeturu33894272017-10-27 15:37:31 -07005392 }
Krishna Kumaar Natarajan70133f02016-02-03 14:35:48 -08005393 if (!rsp_requested) {
5394 WMA_LOGD(FL("vdev_id %d status %d"),
5395 del_sta->smesessionId, del_sta->status);
5396 qdf_mem_free(del_sta);
5397 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005398 break;
5399
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005400 case BSS_OPERATIONAL_MODE_IBSS: /* IBSS shares AP code */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005401 case BSS_OPERATIONAL_MODE_AP:
Arunk Khandavallia6305a32018-01-25 11:19:18 +05305402 htc_vote_link_down(htc_handle);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005403 wma_delete_sta_req_ap_mode(wma, del_sta);
Krishna Kumaar Natarajan70133f02016-02-03 14:35:48 -08005404 /* free the memory here only if sync feature is not enabled */
5405 if (!rsp_requested &&
Sourav Mohapatra89c85d12017-12-01 09:17:54 +05305406 !wmi_service_enabled(wma->wmi_handle,
5407 wmi_service_sync_delete_cmds)) {
Krishna Kumaar Natarajan70133f02016-02-03 14:35:48 -08005408 WMA_LOGD(FL("vdev_id %d status %d"),
5409 del_sta->smesessionId, del_sta->status);
5410 qdf_mem_free(del_sta);
Krunal Sonie50ff452017-10-11 18:23:55 -07005411 } else if (!rsp_requested &&
5412 (del_sta->status != QDF_STATUS_SUCCESS)) {
5413 WMA_LOGD(FL("Release del_sta mem vdev_id %d status %d"),
5414 del_sta->smesessionId, del_sta->status);
5415 qdf_mem_free(del_sta);
Krishna Kumaar Natarajan70133f02016-02-03 14:35:48 -08005416 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005417 break;
Deepak Dhamdherea6d2f4c2016-06-04 00:24:52 -07005418 case BSS_OPERATIONAL_MODE_NDI:
5419 wma_delete_sta_req_ndi_mode(wma, del_sta);
5420 break;
Varun Reddy Yeturu33894272017-10-27 15:37:31 -07005421 default:
5422 WMA_LOGE(FL("Incorrect oper mode %d"), oper_mode);
5423 qdf_mem_free(del_sta);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005424 }
5425
5426#ifdef QCA_IBSS_SUPPORT
5427 /* adjust heart beat thresold timer value for
5428 * detecting ibss peer departure
5429 */
5430 if (oper_mode == BSS_OPERATIONAL_MODE_IBSS)
5431 wma_adjust_ibss_heart_beat_timer(wma, smesession_id, -1);
5432#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005433}
5434
5435/**
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005436 * wma_delete_bss_ho_fail() - process delete bss request for handoff failure
5437 * @wma: wma handle
5438 * @params: del bss parameters
5439 *
5440 * Delete BSS in case of ROAM_HO_FAIL processing is handled separately in
5441 * this routine. It needs to be done without sending any commands to firmware
5442 * because firmware has already stopped and deleted peer and vdev is down.
Jeff Johnsonc97816c2018-05-12 17:13:23 -07005443 * Relevant logic is aggregated from other routines. It changes the host
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005444 * data structures without sending VDEV_STOP, PEER_FLUSH_TIDS, PEER_DELETE
5445 * and VDEV_DOWN commands to firmware.
5446 *
5447 * Return: none
5448 */
5449void wma_delete_bss_ho_fail(tp_wma_handle wma, tpDeleteBssParams params)
5450{
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08005451 struct cdp_pdev *pdev;
Leo Chang96464902016-10-28 11:10:54 -07005452 void *peer = NULL;
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005453 QDF_STATUS status = QDF_STATUS_SUCCESS;
5454 uint8_t peer_id;
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08005455 struct cdp_vdev *txrx_vdev = NULL;
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005456 struct wma_txrx_node *iface;
Leo Chang96464902016-10-28 11:10:54 -07005457 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005458
5459 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
5460
5461 if (NULL == pdev) {
5462 WMA_LOGE("%s:Unable to get TXRX context", __func__);
5463 goto fail_del_bss_ho_fail;
5464 }
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005465
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08005466 peer = cdp_peer_find_by_addr(soc,
5467 pdev,
5468 params->bssid, &peer_id);
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005469 if (!peer) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07005470 WMA_LOGE("%s: Failed to find peer %pM", __func__,
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005471 params->bssid);
5472 status = QDF_STATUS_E_FAILURE;
5473 goto fail_del_bss_ho_fail;
5474 }
5475
5476 iface = &wma->interfaces[params->smesessionId];
5477 if (!iface || !iface->handle) {
5478 WMA_LOGE("%s vdev id %d is already deleted",
5479 __func__, params->smesessionId);
5480 goto fail_del_bss_ho_fail;
5481 }
5482 qdf_mem_zero(iface->bssid, IEEE80211_ADDR_LEN);
5483
5484 txrx_vdev = wma_find_vdev_by_id(wma, params->smesessionId);
5485 if (!txrx_vdev) {
5486 WMA_LOGE("%s:Invalid vdev handle", __func__);
5487 status = QDF_STATUS_E_FAILURE;
5488 goto fail_del_bss_ho_fail;
5489 }
5490
5491 /* Free the allocated stats response buffer for the the session */
5492 if (iface->stats_rsp) {
5493 qdf_mem_free(iface->stats_rsp);
5494 iface->stats_rsp = NULL;
5495 }
5496
5497 if (iface->psnr_req) {
5498 qdf_mem_free(iface->psnr_req);
5499 iface->psnr_req = NULL;
5500 }
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +05305501
5502 if (iface->rcpi_req) {
5503 struct sme_rcpi_req *rcpi_req = iface->rcpi_req;
5504
5505 iface->rcpi_req = NULL;
5506 qdf_mem_free(rcpi_req);
5507 }
5508
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005509 qdf_mem_zero(&iface->ns_offload_req,
5510 sizeof(iface->ns_offload_req));
5511 qdf_mem_zero(&iface->arp_offload_req,
5512 sizeof(iface->arp_offload_req));
5513
5514 WMA_LOGD("%s, vdev_id: %d, pausing tx_ll_queue for VDEV_STOP (del_bss)",
5515 __func__, params->smesessionId);
Leo Chang96464902016-10-28 11:10:54 -07005516 cdp_fc_vdev_pause(soc, iface->handle,
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005517 OL_TXQ_PAUSE_REASON_VDEV_STOP);
Mukul Sharma6411bb82017-03-01 15:57:07 +05305518 wma_vdev_set_pause_bit(params->smesessionId, PAUSE_TYPE_HOST);
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005519
Leo Chang96464902016-10-28 11:10:54 -07005520 cdp_fc_vdev_flush(soc, iface->handle);
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005521 WMA_LOGD("%s, vdev_id: %d, un-pausing tx_ll_queue for VDEV_STOP rsp",
5522 __func__, params->smesessionId);
Leo Chang96464902016-10-28 11:10:54 -07005523 cdp_fc_vdev_unpause(soc, iface->handle,
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005524 OL_TXQ_PAUSE_REASON_VDEV_STOP);
Mukul Sharma6411bb82017-03-01 15:57:07 +05305525 wma_vdev_clear_pause_bit(params->smesessionId, PAUSE_TYPE_HOST);
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005526 qdf_atomic_set(&iface->bss_status, WMA_BSS_STATUS_STOPPED);
5527 WMA_LOGD("%s: (type %d subtype %d) BSS is stopped",
5528 __func__, iface->type, iface->sub_type);
Mukul Sharmaf9047232017-03-02 16:58:56 +05305529 wma_vdev_set_mlme_state(wma, params->smesessionId, WLAN_VDEV_S_STOP);
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005530 params->status = QDF_STATUS_SUCCESS;
5531 if (!iface->peer_count) {
5532 WMA_LOGE("%s: Can't remove peer with peer_addr %pM vdevid %d peer_count %d",
5533 __func__, params->bssid, params->smesessionId,
5534 iface->peer_count);
5535 goto fail_del_bss_ho_fail;
5536 }
5537
Sravan Kumar Kairamd431e5b2018-06-12 20:07:29 +05305538 if (peer) {
5539 WMA_LOGD("%s: vdev %pK is detaching peer:%pK peer_addr %pM to vdev_id %d, peer_count - %d",
5540 __func__, txrx_vdev, peer, params->bssid,
5541 params->smesessionId, iface->peer_count);
Lin Bai973e6922018-01-08 17:59:19 +08005542 cdp_peer_delete(soc, peer, 1 << CDP_PEER_DELETE_NO_SPECIAL);
gaurank kathpalia89d3c322018-06-21 11:45:32 +05305543 wma_remove_objmgr_peer(wma, params->smesessionId,
5544 params->bssid);
Sravan Kumar Kairamd431e5b2018-06-12 20:07:29 +05305545 }
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005546 iface->peer_count--;
Vignesh Viswanathanba40f4b2018-06-26 14:20:27 +05305547
Jeff Johnsonadba3962017-09-18 08:12:35 -07005548 WMA_LOGI("%s: Removed peer %pK with peer_addr %pM vdevid %d peer_count %d",
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005549 __func__, peer, params->bssid, params->smesessionId,
5550 iface->peer_count);
5551fail_del_bss_ho_fail:
5552 params->status = status;
Abhishek Singh2d775fd2017-08-18 10:51:33 +05305553 wma_send_msg_high_priority(wma, WMA_DELETE_BSS_HO_FAIL_RSP,
5554 (void *)params, 0);
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005555}
5556
Sandeep Puligillaf22263c2017-08-28 13:15:15 -07005557/**
5558 * wma_wait_tx_complete() - Wait till tx packets are drained
5559 * @wma: wma handle
5560 * @session_id: vdev id
5561 *
5562 * Return: none
5563 */
5564static void wma_wait_tx_complete(tp_wma_handle wma,
5565 uint32_t session_id)
5566{
5567 struct cdp_pdev *pdev;
5568 uint8_t max_wait_iterations = 0;
5569 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
5570
5571 if (!wma->interfaces[session_id].is_vdev_valid) {
5572 WMA_LOGE("%s: Vdev is not valid: %d",
5573 __func__, session_id);
5574 return;
5575 }
5576
5577 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Varun Reddy Yeturu81d0b372017-09-19 14:41:19 -07005578 if (pdev == NULL) {
5579 WMA_LOGE("%s: pdev is not valid: %d",
5580 __func__, session_id);
5581 return;
5582 }
Sandeep Puligillaf22263c2017-08-28 13:15:15 -07005583 max_wait_iterations =
5584 wma->interfaces[session_id].delay_before_vdev_stop /
5585 WMA_TX_Q_RECHECK_TIMER_WAIT;
5586
5587 while (cdp_get_tx_pending(soc, pdev) && max_wait_iterations) {
5588 WMA_LOGW(FL("Waiting for outstanding packet to drain."));
Nachiket Kukade0396b732017-11-14 16:35:16 +05305589 qdf_wait_for_event_completion(&wma->tx_queue_empty_event,
Sandeep Puligillaf22263c2017-08-28 13:15:15 -07005590 WMA_TX_Q_RECHECK_TIMER_WAIT);
5591 max_wait_iterations--;
5592 }
5593}
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005594/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005595 * wma_delete_bss() - process delete bss request from upper layer
5596 * @wma: wma handle
5597 * @params: del bss parameters
5598 *
5599 * Return: none
5600 */
5601void wma_delete_bss(tp_wma_handle wma, tpDeleteBssParams params)
5602{
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08005603 struct cdp_pdev *pdev;
Leo Chang96464902016-10-28 11:10:54 -07005604 void *peer = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005605 struct wma_target_req *msg;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305606 QDF_STATUS status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005607 uint8_t peer_id;
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08005608 struct cdp_vdev *txrx_vdev = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005609 bool roam_synch_in_progress = false;
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005610 struct wma_txrx_node *iface;
Leo Chang96464902016-10-28 11:10:54 -07005611 void *soc = cds_get_context(QDF_MODULE_ID_SOC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005612
Anurag Chouhan6d760662016-02-20 16:05:43 +05305613 pdev = cds_get_context(QDF_MODULE_ID_TXRX);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005614
5615 if (NULL == pdev) {
5616 WMA_LOGE("%s:Unable to get TXRX context", __func__);
5617 goto out;
5618 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005619 if (wma_is_vdev_in_ibss_mode(wma, params->smesessionId))
5620 /* in rome ibss case, self mac is used to create the bss peer */
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08005621 peer = cdp_peer_find_by_addr(soc,
5622 pdev,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005623 wma->interfaces[params->smesessionId].addr,
5624 &peer_id);
Deepak Dhamdhere13983f22016-05-31 19:06:09 -07005625 else if (WMA_IS_VDEV_IN_NDI_MODE(wma->interfaces,
5626 params->smesessionId))
5627 /* In ndi case, self mac is used to create the self peer */
Leo Chang96464902016-10-28 11:10:54 -07005628 peer = cdp_peer_find_by_addr(soc, pdev,
Deepak Dhamdhere13983f22016-05-31 19:06:09 -07005629 wma->interfaces[params->smesessionId].addr,
5630 &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005631 else
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08005632 peer = cdp_peer_find_by_addr(soc, pdev,
5633 params->bssid,
5634 &peer_id);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005635
5636 if (!peer) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07005637 WMA_LOGE("%s: Failed to find peer %pM", __func__,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005638 params->bssid);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305639 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005640 goto out;
5641 }
5642
Anurag Chouhan600c3a02016-03-01 10:33:54 +05305643 qdf_mem_zero(wma->interfaces[params->smesessionId].bssid,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005644 IEEE80211_ADDR_LEN);
5645
5646 txrx_vdev = wma_find_vdev_by_id(wma, params->smesessionId);
5647 if (!txrx_vdev) {
5648 WMA_LOGE("%s:Invalid vdev handle", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305649 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005650 goto out;
5651 }
5652
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005653 iface = &wma->interfaces[params->smesessionId];
5654 if (!iface || !iface->handle) {
5655 WMA_LOGE("%s vdev id %d is already deleted",
5656 __func__, params->smesessionId);
5657 goto out;
5658 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005659 /*Free the allocated stats response buffer for the the session */
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005660 if (iface->stats_rsp) {
5661 qdf_mem_free(iface->stats_rsp);
5662 iface->stats_rsp = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005663 }
5664
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005665 if (iface->psnr_req) {
5666 qdf_mem_free(iface->psnr_req);
5667 iface->psnr_req = NULL;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005668 }
5669
Rajeev Kumar Sirasanagandla996e5292016-11-22 21:20:33 +05305670 if (iface->rcpi_req) {
5671 struct sme_rcpi_req *rcpi_req = iface->rcpi_req;
5672
5673 iface->rcpi_req = NULL;
5674 qdf_mem_free(rcpi_req);
5675 }
5676
Leo Chang96464902016-10-28 11:10:54 -07005677 if (wlan_op_mode_ibss == cdp_get_opmode(soc, txrx_vdev))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005678 wma->ibss_started = 0;
Manjunathappa Prakash10d357a2016-03-31 19:20:49 -07005679
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08005680 if (wma_is_roam_synch_in_progress(wma, params->smesessionId)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005681 roam_synch_in_progress = true;
5682 WMA_LOGD("LFR3:%s: Setting vdev_up to FALSE for session %d",
5683 __func__, params->smesessionId);
Mukul Sharmaf9047232017-03-02 16:58:56 +05305684 wma_vdev_set_mlme_state(wma, params->smesessionId,
5685 WLAN_VDEV_S_STOP);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005686 goto detach_peer;
5687 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005688 msg = wma_fill_vdev_req(wma, params->smesessionId, WMA_DELETE_BSS_REQ,
5689 WMA_TARGET_REQ_TYPE_VDEV_STOP, params,
5690 WMA_VDEV_STOP_REQUEST_TIMEOUT);
5691 if (!msg) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07005692 WMA_LOGE("%s: Failed to fill vdev request for vdev_id %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005693 __func__, params->smesessionId);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305694 status = QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005695 goto detach_peer;
5696 }
5697
5698 WMA_LOGW(FL("Outstanding msdu packets: %d"),
Leo Chang96464902016-10-28 11:10:54 -07005699 cdp_get_tx_pending(soc, pdev));
Sandeep Puligillaf22263c2017-08-28 13:15:15 -07005700 wma_wait_tx_complete(wma, params->smesessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005701
Leo Chang96464902016-10-28 11:10:54 -07005702 if (cdp_get_tx_pending(soc, pdev)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005703 WMA_LOGW(FL("Outstanding msdu packets before VDEV_STOP : %d"),
Leo Chang96464902016-10-28 11:10:54 -07005704 cdp_get_tx_pending(soc, pdev));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005705 }
5706
5707 WMA_LOGD("%s, vdev_id: %d, pausing tx_ll_queue for VDEV_STOP (del_bss)",
5708 __func__, params->smesessionId);
Mukul Sharma6411bb82017-03-01 15:57:07 +05305709 wma_vdev_set_pause_bit(params->smesessionId, PAUSE_TYPE_HOST);
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08005710 cdp_fc_vdev_pause(soc,
5711 wma->interfaces[params->smesessionId].handle,
5712 OL_TXQ_PAUSE_REASON_VDEV_STOP);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005713
Dustin Brownbf6d16b2017-03-03 11:41:05 -08005714 if (wma_send_vdev_stop_to_fw(wma, params->smesessionId)) {
Srinivas Girigowdada0e8482017-03-19 23:15:45 -07005715 WMA_LOGE("%s: %d Failed to send vdev stop", __func__, __LINE__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005716 wma_remove_vdev_req(wma, params->smesessionId,
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005717 WMA_TARGET_REQ_TYPE_VDEV_STOP);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305718 status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005719 goto detach_peer;
Deepak Dhamdhere2dae1bd2016-10-27 10:58:29 -07005720 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005721 WMA_LOGD("%s: bssid %pM vdev_id %d",
5722 __func__, params->bssid, params->smesessionId);
5723 return;
5724detach_peer:
5725 wma_remove_peer(wma, params->bssid, params->smesessionId, peer,
5726 roam_synch_in_progress);
Varun Reddy Yeturud5939f82015-12-24 18:14:02 -08005727 if (wma_is_roam_synch_in_progress(wma, params->smesessionId))
5728 return;
5729
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005730out:
5731 params->status = status;
Abhishek Singh2d775fd2017-08-18 10:51:33 +05305732 wma_send_msg_high_priority(wma, WMA_DELETE_BSS_RSP, (void *)params, 0);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005733}
5734
5735/**
5736 * wma_find_ibss_vdev() - This function finds vdev_id based on input type
5737 * @wma: wma handle
5738 * @type: vdev type
5739 *
5740 * Return: vdev id
5741 */
5742int32_t wma_find_vdev_by_type(tp_wma_handle wma, int32_t type)
5743{
5744 int32_t vdev_id = 0;
5745 struct wma_txrx_node *intf = wma->interfaces;
5746
5747 for (vdev_id = 0; vdev_id < wma->max_bssid; vdev_id++) {
5748 if (NULL != intf) {
5749 if (intf[vdev_id].type == type)
5750 return vdev_id;
5751 }
5752 }
5753
5754 return -EFAULT;
5755}
5756
5757/**
5758 * wma_set_vdev_intrabss_fwd() - set intra_fwd value to wni_in.
5759 * @wma_handle: wma handle
5760 * @pdis_intra_fwd: Pointer to DisableIntraBssFwd struct
5761 *
5762 * Return: none
5763 */
5764void wma_set_vdev_intrabss_fwd(tp_wma_handle wma_handle,
5765 tpDisableIntraBssFwd pdis_intra_fwd)
5766{
Venkata Sharath Chandra Manchala0d44d452016-11-23 17:48:15 -08005767 struct cdp_vdev *txrx_vdev;
Manikandan Mohan1dd8b5d2017-04-18 15:54:09 -07005768
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005769 WMA_LOGD("%s:intra_fwd:vdev(%d) intrabss_dis=%s",
5770 __func__, pdis_intra_fwd->sessionId,
5771 (pdis_intra_fwd->disableintrabssfwd ? "true" : "false"));
5772
5773 txrx_vdev = wma_handle->interfaces[pdis_intra_fwd->sessionId].handle;
Leo Chang96464902016-10-28 11:10:54 -07005774 cdp_cfg_vdev_rx_set_intrabss_fwd(cds_get_context(QDF_MODULE_ID_SOC),
5775 txrx_vdev,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005776 pdis_intra_fwd->disableintrabssfwd);
5777}
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07005778
5779void wma_store_pdev(void *wma_ctx, struct wlan_objmgr_pdev *pdev)
5780{
5781 tp_wma_handle wma = (tp_wma_handle)wma_ctx;
5782 QDF_STATUS status;
5783
5784 status = wlan_objmgr_pdev_try_get_ref(pdev, WLAN_LEGACY_WMA_ID);
5785 if (QDF_STATUS_SUCCESS != status) {
5786 wma->pdev = NULL;
5787 return;
5788 }
5789
5790 wma->pdev = pdev;
5791}
5792
lifeng7c607dd2017-02-21 21:16:49 +08005793/**
5794 * wma_vdev_reset_beacon_interval_timer() - reset beacon interval back
5795 * to its original value after the channel switch.
5796 *
5797 * @data: data
5798 *
5799 * Return: void
5800 */
5801static void wma_vdev_reset_beacon_interval_timer(void *data)
5802{
5803 tp_wma_handle wma;
5804 struct wma_beacon_interval_reset_req *req =
5805 (struct wma_beacon_interval_reset_req *)data;
5806 uint16_t beacon_interval = req->interval;
5807 uint8_t vdev_id = req->vdev_id;
5808
5809 wma = (tp_wma_handle)cds_get_context(QDF_MODULE_ID_WMA);
5810 if (NULL == wma) {
5811 WMA_LOGE("%s: Failed to get wma", __func__);
5812 goto end;
5813 }
5814
5815 /* Change the beacon interval back to its original value */
5816 WMA_LOGE("%s: Change beacon interval back to %d",
5817 __func__, beacon_interval);
5818 wma_update_beacon_interval(wma, vdev_id, beacon_interval);
5819
5820end:
5821 qdf_timer_stop(&req->event_timeout);
5822 qdf_timer_free(&req->event_timeout);
5823 qdf_mem_free(req);
5824}
5825
5826int wma_fill_beacon_interval_reset_req(tp_wma_handle wma, uint8_t vdev_id,
5827 uint16_t beacon_interval, uint32_t timeout)
5828{
5829 struct wma_beacon_interval_reset_req *req;
5830
5831 req = qdf_mem_malloc(sizeof(*req));
5832 if (!req) {
5833 WMA_LOGE("%s: Failed to allocate memory for beacon_interval_reset_req vdev %d",
5834 __func__, vdev_id);
5835 return -ENOMEM;
5836 }
5837
5838 WMA_LOGD("%s: vdev_id %d ", __func__, vdev_id);
5839 req->vdev_id = vdev_id;
5840 req->interval = beacon_interval;
5841 qdf_timer_init(NULL, &req->event_timeout,
5842 wma_vdev_reset_beacon_interval_timer, req, QDF_TIMER_TYPE_SW);
5843 qdf_timer_start(&req->event_timeout, timeout);
5844
5845 return 0;
5846}
Paul Zhang99fe8842017-12-08 14:43:46 +08005847
5848QDF_STATUS wma_set_wlm_latency_level(void *wma_ptr,
5849 struct wlm_latency_level_param *latency_params)
5850{
5851 QDF_STATUS ret;
5852 tp_wma_handle wma = (tp_wma_handle)wma_ptr;
5853
5854 WMA_LOGD("%s: set latency level %d, flags flag 0x%x",
5855 __func__, latency_params->wlm_latency_level,
5856 latency_params->wlm_latency_flags);
5857
5858 ret = wmi_unified_wlm_latency_level_cmd(wma->wmi_handle,
5859 latency_params);
5860 if (QDF_IS_STATUS_ERROR(ret))
5861 WMA_LOGW("Failed to set latency level");
5862
5863 return ret;
5864}