xref: /OK3568_Linux_fs/kernel/drivers/net/wireless/nxp/mlan/mlan_sta_cmdresp.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /** @file mlan_sta_cmdresp.c
2  *
3  *  @brief This file contains the handling of command
4  *  responses generated by firmware.
5  *
6  *
7  *  Copyright 2008-2022 NXP
8  *
9  *  This software file (the File) is distributed by NXP
10  *  under the terms of the GNU General Public License Version 2, June 1991
11  *  (the License).  You may use, redistribute and/or modify the File in
12  *  accordance with the terms and conditions of the License, a copy of which
13  *  is available by writing to the Free Software Foundation, Inc.,
14  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA or on the
15  *  worldwide web at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
16  *
17  *  THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
18  *  IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
19  *  ARE EXPRESSLY DISCLAIMED.  The License provides additional details about
20  *  this warranty disclaimer.
21  *
22  */
23 
24 /******************************************************
25  * Change log:
26  *   10/21/2008: initial version
27  ******************************************************/
28 
29 #include "mlan.h"
30 #include "mlan_join.h"
31 #include "mlan_util.h"
32 #include "mlan_fw.h"
33 #include "mlan_main.h"
34 #include "mlan_wmm.h"
35 #include "mlan_11n.h"
36 #include "mlan_11ac.h"
37 #include "mlan_11ax.h"
38 #include "mlan_11h.h"
39 #include "mlan_meas.h"
40 
41 /********************************************************
42  *			Local Variables
43  ********************************************************/
44 
45 /********************************************************
46  *			Global Variables
47  ********************************************************/
48 
49 /********************************************************
50  *			Local Functions
51  ********************************************************/
52 /**
53  *  @brief This function handles the command response error for TDLS operation
54  *
55  *  @param pmpriv       A pointer to mlan_private structure
56  *  @param resp         A pointer to HostCmd_DS_COMMAND
57  *
58  *  @return             N/A
59  */
60 static void
wlan_process_cmdreps_error_tdls_operation(mlan_private * pmpriv,HostCmd_DS_COMMAND * resp,mlan_ioctl_req * pioctl_buf)61 wlan_process_cmdreps_error_tdls_operation(mlan_private *pmpriv,
62 					  HostCmd_DS_COMMAND *resp,
63 					  mlan_ioctl_req *pioctl_buf)
64 {
65 	mlan_adapter *pmadapter = pmpriv->adapter;
66 	HostCmd_DS_TDLS_OPER *ptdls_oper_data = &(resp->params.tdls_oper_data);
67 	sta_node *sta_ptr = MNULL;
68 	t_u16 reason;
69 
70 	ENTER();
71 	ptdls_oper_data->tdls_action =
72 		wlan_le16_to_cpu(ptdls_oper_data->tdls_action);
73 	reason = wlan_le16_to_cpu(ptdls_oper_data->reason);
74 	sta_ptr = wlan_get_station_entry(pmpriv, ptdls_oper_data->peer_mac);
75 	switch (ptdls_oper_data->tdls_action) {
76 	case TDLS_CREATE:
77 		/* TDLS create command error */
78 		if (reason != TDLS_LINK_EXISTS && sta_ptr) {
79 			PRINTM(MERROR,
80 			       "TDLS CREATE operation: cmd error reason %d\n",
81 			       reason);
82 			sta_ptr->status = TDLS_SETUP_FAILURE;
83 		}
84 		if (reason == TDLS_LINK_EXISTS && pioctl_buf)
85 			pioctl_buf->status_code = MLAN_STATUS_SUCCESS;
86 		break;
87 	case TDLS_CONFIG:
88 		/* TDLS config command error */
89 		PRINTM(MERROR,
90 		       "TDLS CONFIG operation: command error, reason %d\n",
91 		       reason);
92 		if (sta_ptr)
93 			sta_ptr->status = TDLS_SETUP_FAILURE;
94 		break;
95 	case TDLS_DELETE:
96 		/* TDLS delete command error */
97 		wlan_restore_tdls_packets(pmpriv, ptdls_oper_data->peer_mac,
98 					  TDLS_TEAR_DOWN);
99 		if (sta_ptr) {
100 			/**tdls cs stop*/
101 			if (ISSUPP_EXTCAP_TDLS_CHAN_SWITCH(
102 				    sta_ptr->ExtCap.ext_cap))
103 				wlan_tdls_config(pmpriv, MFALSE);
104 			if (sta_ptr->is_11n_enabled ||
105 			    sta_ptr->is_11ax_enabled) {
106 				wlan_cleanup_reorder_tbl(
107 					pmpriv, ptdls_oper_data->peer_mac);
108 				wlan_11n_cleanup_txbastream_tbl(
109 					pmpriv, ptdls_oper_data->peer_mac);
110 			}
111 			if (sta_ptr->status >= TDLS_SETUP_INPROGRESS)
112 				wlan_delete_station_entry(
113 					pmpriv, ptdls_oper_data->peer_mac);
114 		}
115 		if (wlan_is_station_list_empty(pmpriv) == MTRUE)
116 			pmadapter->tdls_status = TDLS_NOT_SETUP;
117 		else
118 			pmadapter->tdls_status = TDLS_IN_BASE_CHANNEL;
119 
120 		if (reason == TDLS_LINK_NONEXISTENT) {
121 			if (pioctl_buf)
122 				pioctl_buf->status_code = MLAN_STATUS_SUCCESS;
123 		} else {
124 			PRINTM(MERROR,
125 			       "TDLS DELETE operation: cmd error, reason %d\n",
126 			       reason);
127 		}
128 		break;
129 	}
130 	LEAVE();
131 	return;
132 }
133 
134 /**
135  *  @brief This function handles the command response error
136  *
137  *  @param pmpriv       A pointer to mlan_private structure
138  *  @param resp         A pointer to HostCmd_DS_COMMAND
139  *  @param pioctl_buf   A pointer to command buffer
140  *
141  *  @return             N/A
142  */
wlan_process_cmdresp_error(mlan_private * pmpriv,HostCmd_DS_COMMAND * resp,mlan_ioctl_req * pioctl_buf)143 static mlan_status wlan_process_cmdresp_error(mlan_private *pmpriv,
144 					      HostCmd_DS_COMMAND *resp,
145 					      mlan_ioctl_req *pioctl_buf)
146 {
147 	mlan_adapter *pmadapter = pmpriv->adapter;
148 	pmlan_ioctl_req pscan_ioctl_req = MNULL;
149 	mlan_callbacks *pcb = MNULL;
150 	tdls_all_config *tdls_all_cfg = MNULL;
151 	HostCmd_DS_TDLS_CONFIG *ptdls_config_data =
152 		&(resp->params.tdls_config_data);
153 
154 #if defined(USB)
155 	t_s32 i = 0;
156 #endif
157 	mlan_status ret = MLAN_STATUS_FAILURE;
158 
159 	ENTER();
160 	if (resp->command != HostCmd_CMD_WMM_PARAM_CONFIG &&
161 	    resp->command != HostCmd_CMD_CHAN_REGION_CFG)
162 		PRINTM(MERROR, "CMD_RESP: cmd %#x error, result=%#x\n",
163 		       resp->command, resp->result);
164 	if (pioctl_buf)
165 		pioctl_buf->status_code = MLAN_ERROR_FW_CMDRESP;
166 
167 	switch (resp->command) {
168 	case HostCmd_CMD_802_11_PS_MODE_ENH: {
169 		HostCmd_DS_802_11_PS_MODE_ENH *pm = &resp->params.psmode_enh;
170 		PRINTM(MERROR,
171 		       "PS_MODE_ENH command failed: result=0x%x action=0x%X\n",
172 		       resp->result, wlan_le16_to_cpu(pm->action));
173 		/*
174 		 * We do not re-try enter-ps command in ad-hoc mode.
175 		 */
176 		if (wlan_le16_to_cpu(pm->action) == EN_AUTO_PS &&
177 		    (wlan_le16_to_cpu(pm->params.auto_ps.ps_bitmap) &
178 		     BITMAP_STA_PS) &&
179 		    pmpriv->bss_mode == MLAN_BSS_MODE_IBSS)
180 			pmadapter->ps_mode = Wlan802_11PowerModeCAM;
181 	} break;
182 	case HostCmd_CMD_802_11_SCAN_EXT:
183 	case HostCmd_CMD_802_11_SCAN:
184 		/* Cancel all pending scan command */
185 		wlan_flush_scan_queue(pmadapter);
186 
187 		pcb = (pmlan_callbacks)&pmadapter->callbacks;
188 
189 		wlan_request_cmd_lock(pmadapter);
190 		pmadapter->scan_processing = MFALSE;
191 		pscan_ioctl_req = pmadapter->pscan_ioctl_req;
192 		pmadapter->pscan_ioctl_req = MNULL;
193 		/* Need to indicate IOCTL complete */
194 		if (pscan_ioctl_req) {
195 			pscan_ioctl_req->status_code = MLAN_ERROR_NO_ERROR;
196 			/* Indicate ioctl complete */
197 			pcb->moal_ioctl_complete(
198 				pmadapter->pmoal_handle,
199 				(pmlan_ioctl_req)pscan_ioctl_req,
200 				MLAN_STATUS_SUCCESS);
201 		}
202 		wlan_release_cmd_lock(pmadapter);
203 		wlan_recv_event(pmpriv, MLAN_EVENT_ID_DRV_SCAN_REPORT, MNULL);
204 		break;
205 
206 	case HostCmd_CMD_MAC_CONTROL:
207 		break;
208 
209 	case HostCmd_CMD_TDLS_CONFIG:
210 		ptdls_config_data->tdls_info.tdls_action = wlan_le16_to_cpu(
211 			ptdls_config_data->tdls_info.tdls_action);
212 		switch (ptdls_config_data->tdls_info.tdls_action) {
213 		case WLAN_TDLS_SETUP_REQ:
214 			/* TDLS link setup error ;display error in logs */
215 			tdls_all_cfg =
216 				(tdls_all_config *)
217 					ptdls_config_data->tdls_info.tdls_data;
218 			PRINTM(MERROR, "TDLS Setup Failed, error %d\n",
219 			       wlan_le16_to_cpu(tdls_all_cfg->u.tdls_cmd_resp
220 							.reason_code));
221 			break;
222 		case WLAN_TDLS_INIT_CHAN_SWITCH:
223 			tdls_all_cfg =
224 				(tdls_all_config *)
225 					ptdls_config_data->tdls_info.tdls_data;
226 			PRINTM(MERROR,
227 			       "TDLS init channel switch failed," MACSTR
228 			       ": reason=%d\n",
229 			       MAC2STR(tdls_all_cfg->u.tdls_cmd_resp
230 					       .peer_mac_addr),
231 			       wlan_le16_to_cpu(tdls_all_cfg->u.tdls_cmd_resp
232 							.reason_code));
233 			break;
234 		}
235 		break;
236 	case HostCmd_CMD_TDLS_OPERATION:
237 		wlan_process_cmdreps_error_tdls_operation(pmpriv, resp,
238 							  pioctl_buf);
239 		break;
240 	case HostCmd_CMD_PACKET_AGGR_CTRL:
241 #ifdef USB
242 		if (IS_USB(pmadapter->card_type)) {
243 			for (i = 0; i < MAX_USB_TX_PORT_NUM; i++)
244 				pmadapter->pcard_usb->usb_tx_aggr[i]
245 					.aggr_ctrl.enable = MFALSE;
246 			pmadapter->pcard_usb->usb_rx_deaggr.aggr_ctrl.enable =
247 				MFALSE;
248 		}
249 #endif
250 		break;
251 #ifdef USB
252 	case HostCmd_CMD_PACKET_AGGR_OVER_HOST_INTERFACE:
253 		pmadapter->pcard_usb->fw_usb_aggr = MFALSE;
254 		for (i = 0; i < MAX_USB_TX_PORT_NUM; i++)
255 			pmadapter->pcard_usb->usb_tx_aggr[i].aggr_ctrl.enable =
256 				MFALSE;
257 		pmadapter->pcard_usb->usb_rx_deaggr.aggr_ctrl.enable = MFALSE;
258 		break;
259 #endif
260 	case HostCmd_CMD_802_11_ASSOCIATE:
261 		wlan_reset_connect_state(pmpriv, MTRUE);
262 		break;
263 #ifdef SDIO
264 	case HostCmd_CMD_SDIO_SP_RX_AGGR_CFG:
265 		pmadapter->pcard_sd->sdio_rx_aggr_enable = MFALSE;
266 		PRINTM(MMSG, "FW don't support SDIO single port rx aggr\n");
267 		break;
268 #endif
269 
270 	case HostCmd_CMD_MGMT_IE_LIST: {
271 		HostCmd_DS_MGMT_IE_LIST_CFG *pmgmt_ie_list =
272 			&(resp->params.mgmt_ie_list);
273 		t_u16 resp_len = 0, travel_len = 0, index;
274 		mlan_ds_misc_custom_ie *cust_ie = MNULL;
275 		custom_ie *cptr;
276 
277 		if (wlan_le16_to_cpu(pmgmt_ie_list->action) ==
278 		    HostCmd_ACT_GEN_GET)
279 			break;
280 
281 		cust_ie = (mlan_ds_misc_custom_ie *)&pmgmt_ie_list->ds_mgmt_ie;
282 		if (cust_ie) {
283 			cust_ie->type = wlan_le16_to_cpu(cust_ie->type);
284 			resp_len = cust_ie->len =
285 				wlan_le16_to_cpu(cust_ie->len);
286 			travel_len = 0;
287 			/* conversion for index, mask, len */
288 			if (resp_len == sizeof(t_u16))
289 				cust_ie->ie_data_list[0]
290 					.ie_index = wlan_cpu_to_le16(
291 					cust_ie->ie_data_list[0].ie_index);
292 
293 			while (resp_len > sizeof(t_u16)) {
294 				cptr = (custom_ie *)(((t_u8 *)cust_ie
295 							      ->ie_data_list) +
296 						     travel_len);
297 				index = cptr->ie_index =
298 					wlan_le16_to_cpu(cptr->ie_index);
299 				cptr->mgmt_subtype_mask = wlan_le16_to_cpu(
300 					cptr->mgmt_subtype_mask);
301 				cptr->ie_length =
302 					wlan_le16_to_cpu(cptr->ie_length);
303 				travel_len += cptr->ie_length +
304 					      sizeof(custom_ie) - MAX_IE_SIZE;
305 				resp_len -= cptr->ie_length +
306 					    sizeof(custom_ie) - MAX_IE_SIZE;
307 				if ((pmpriv->mgmt_ie[index].mgmt_subtype_mask ==
308 				     cptr->mgmt_subtype_mask) &&
309 				    (pmpriv->mgmt_ie[index].ie_length ==
310 				     cptr->ie_length) &&
311 				    !memcmp(pmpriv->adapter,
312 					    pmpriv->mgmt_ie[index].ie_buffer,
313 					    cptr->ie_buffer, cptr->ie_length)) {
314 					PRINTM(MERROR,
315 					       "set custom ie fail, remove ie index :%d\n",
316 					       index);
317 					memset(pmadapter,
318 					       &pmpriv->mgmt_ie[index], 0,
319 					       sizeof(custom_ie));
320 				}
321 			}
322 		}
323 	} break;
324 	case HostCmd_CMD_ROAM_OFFLOAD:
325 		if (MLAN_STATUS_SUCCESS != wlan_clear_fw_roaming_pmk(pmpriv))
326 			PRINTM(MERROR, "wlan_clear_fw_roaming_pmk fail\n");
327 		pmpriv->adapter->fw_roaming = MFALSE;
328 		PRINTM(MERROR, "FW do not support roaming!\n");
329 		break;
330 	case HostCmd_CMD_CHAN_REGION_CFG:
331 		ret = MLAN_STATUS_SUCCESS;
332 		PRINTM(MCMND, "FW don't support chan region cfg command!\n");
333 		break;
334 #if defined(DRV_EMBEDDED_SUPPLICANT)
335 	case HostCmd_CMD_CRYPTO:
336 		PRINTM(MCMND, "crypto cmd result=0x%x!\n", resp->result);
337 		ret = wlan_ret_crypto(pmpriv, resp, pioctl_buf);
338 		break;
339 #endif
340 	default:
341 		break;
342 	}
343 	/*
344 	 * Handling errors here
345 	 */
346 	wlan_request_cmd_lock(pmadapter);
347 	wlan_insert_cmd_to_free_q(pmadapter, pmadapter->curr_cmd);
348 	pmadapter->curr_cmd = MNULL;
349 	wlan_release_cmd_lock(pmadapter);
350 
351 	LEAVE();
352 	return ret;
353 }
354 
355 /**
356  *  @brief This function handles the command response of RSSI info
357  *
358  *  @param pmpriv       A pointer to mlan_private structure
359  *  @param resp         A pointer to HostCmd_DS_COMMAND
360  *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
361  *
362  *  @return             MLAN_STATUS_SUCCESS
363  */
wlan_ret_802_11_rssi_info_ext(pmlan_private pmpriv,HostCmd_DS_COMMAND * resp,mlan_ioctl_req * pioctl_buf)364 static mlan_status wlan_ret_802_11_rssi_info_ext(pmlan_private pmpriv,
365 						 HostCmd_DS_COMMAND *resp,
366 						 mlan_ioctl_req *pioctl_buf)
367 {
368 	HostCmd_DS_802_11_RSSI_INFO_EXT *prssi_info_rsp =
369 		&resp->params.rssi_info_ext;
370 	mlan_ds_get_signal *signal = MNULL;
371 	mlan_ds_get_info *info = MNULL;
372 	MrvlIEtypes_RSSI_EXT_t *signal_info_tlv = MNULL;
373 	t_u16 tlv_left_len = 0, tlv_num = 0;
374 	t_u16 tlv_id, tlv_len;
375 
376 	ENTER();
377 
378 	/* Need to indicate IOCTL complete */
379 	if (pioctl_buf != MNULL) {
380 		info = (mlan_ds_get_info *)pioctl_buf->pbuf;
381 		signal_info_tlv =
382 			(MrvlIEtypes_RSSI_EXT_t *)(prssi_info_rsp->tlv_buf);
383 		tlv_left_len =
384 			resp->size -
385 			(sizeof(HostCmd_DS_802_11_RSSI_INFO_EXT) + S_DS_GEN);
386 
387 		while (tlv_left_len >= sizeof(MrvlIEtypes_RSSI_EXT_t)) {
388 			tlv_id = wlan_le16_to_cpu(signal_info_tlv->header.type);
389 			tlv_len = wlan_le16_to_cpu(signal_info_tlv->header.len);
390 			if ((tlv_id != TLV_TYPE_RSSI_INFO) ||
391 			    (tlv_len != sizeof(MrvlIEtypes_RSSI_EXT_t) -
392 						sizeof(MrvlIEtypesHeader_t))) {
393 				PRINTM(MERROR,
394 				       "Invalid RSSI INFO TLV, type=%d, len=%d\n",
395 				       tlv_id, tlv_len);
396 				break;
397 			}
398 
399 			signal = (mlan_ds_get_signal *)&info->param
400 					 .signal_ext[tlv_num];
401 			/* PATH ID */
402 			signal->selector =
403 				wlan_le16_to_cpu(signal_info_tlv->path_id);
404 
405 			/* RSSI */
406 			signal->bcn_rssi_last = wlan_le16_to_cpu(
407 				signal_info_tlv->bcn_rssi_last);
408 			signal->bcn_rssi_avg =
409 				wlan_le16_to_cpu(signal_info_tlv->bcn_rssi_avg);
410 			signal->data_rssi_last = wlan_le16_to_cpu(
411 				signal_info_tlv->data_rssi_last);
412 			signal->data_rssi_avg = wlan_le16_to_cpu(
413 				signal_info_tlv->data_rssi_avg);
414 
415 			/* SNR */
416 			signal->bcn_snr_last = CAL_SNR(
417 				wlan_le16_to_cpu(
418 					signal_info_tlv->bcn_rssi_last),
419 				wlan_le16_to_cpu(signal_info_tlv->bcn_nf_last));
420 			signal->bcn_snr_avg = CAL_SNR(
421 				wlan_le16_to_cpu(signal_info_tlv->bcn_rssi_avg),
422 				wlan_le16_to_cpu(signal_info_tlv->bcn_nf_avg));
423 			signal->data_snr_last = CAL_SNR(
424 				wlan_le16_to_cpu(
425 					signal_info_tlv->data_rssi_last),
426 				wlan_le16_to_cpu(
427 					signal_info_tlv->data_nf_last));
428 			signal->data_snr_avg = CAL_SNR(
429 				wlan_le16_to_cpu(
430 					signal_info_tlv->data_rssi_avg),
431 				wlan_le16_to_cpu(signal_info_tlv->data_nf_avg));
432 
433 			/* NF */
434 			signal->bcn_nf_last =
435 				wlan_le16_to_cpu(signal_info_tlv->bcn_nf_last);
436 			signal->bcn_nf_avg =
437 				wlan_le16_to_cpu(signal_info_tlv->bcn_nf_avg);
438 			signal->data_nf_last =
439 				wlan_le16_to_cpu(signal_info_tlv->data_nf_last);
440 			signal->data_nf_avg =
441 				wlan_le16_to_cpu(signal_info_tlv->data_nf_avg);
442 
443 			tlv_left_len -= sizeof(MrvlIEtypes_RSSI_EXT_t);
444 			signal_info_tlv++;
445 			tlv_num++;
446 			if (tlv_num > MAX_PATH_NUM)
447 				break;
448 		}
449 
450 		pioctl_buf->data_read_written =
451 			tlv_num * sizeof(mlan_ds_get_signal) + sizeof(t_u32);
452 	}
453 
454 	LEAVE();
455 	return MLAN_STATUS_SUCCESS;
456 }
457 
458 /**
459  *  @brief This function handles the command response of RSSI info
460  *
461  *  @param pmpriv       A pointer to mlan_private structure
462  *  @param resp         A pointer to HostCmd_DS_COMMAND
463  *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
464  *
465  *  @return             MLAN_STATUS_SUCCESS
466  */
wlan_ret_802_11_rssi_info(pmlan_private pmpriv,HostCmd_DS_COMMAND * resp,mlan_ioctl_req * pioctl_buf)467 static mlan_status wlan_ret_802_11_rssi_info(pmlan_private pmpriv,
468 					     HostCmd_DS_COMMAND *resp,
469 					     mlan_ioctl_req *pioctl_buf)
470 {
471 	HostCmd_DS_802_11_RSSI_INFO_RSP *prssi_info_rsp =
472 		&resp->params.rssi_info_rsp;
473 	mlan_ds_get_info *pget_info = MNULL;
474 	BSSDescriptor_t *pbss_desc;
475 	t_s32 tbl_idx = 0;
476 
477 	ENTER();
478 
479 	pmpriv->data_rssi_last =
480 		wlan_le16_to_cpu(prssi_info_rsp->data_rssi_last);
481 	pmpriv->data_nf_last = wlan_le16_to_cpu(prssi_info_rsp->data_nf_last);
482 
483 	pmpriv->data_rssi_avg = wlan_le16_to_cpu(prssi_info_rsp->data_rssi_avg);
484 	pmpriv->data_nf_avg = wlan_le16_to_cpu(prssi_info_rsp->data_nf_avg);
485 
486 	pmpriv->bcn_rssi_last = wlan_le16_to_cpu(prssi_info_rsp->bcn_rssi_last);
487 	pmpriv->bcn_nf_last = wlan_le16_to_cpu(prssi_info_rsp->bcn_nf_last);
488 
489 	pmpriv->bcn_rssi_avg = wlan_le16_to_cpu(prssi_info_rsp->bcn_rssi_avg);
490 	pmpriv->bcn_nf_avg = wlan_le16_to_cpu(prssi_info_rsp->bcn_nf_avg);
491 
492 	/* Get current BSS info */
493 	pbss_desc = &pmpriv->curr_bss_params.bss_descriptor;
494 	pbss_desc->rssi = -pmpriv->bcn_rssi_avg;
495 	tbl_idx = wlan_find_ssid_in_list(pmpriv, &pbss_desc->ssid,
496 					 pbss_desc->mac_address,
497 					 pmpriv->bss_mode);
498 	if (tbl_idx >= 0) {
499 		pbss_desc = &pmpriv->adapter->pscan_table[tbl_idx];
500 		pbss_desc->rssi = -pmpriv->bcn_rssi_avg;
501 	}
502 
503 	/* Need to indicate IOCTL complete */
504 	if (pioctl_buf != MNULL) {
505 		pget_info = (mlan_ds_get_info *)pioctl_buf->pbuf;
506 
507 		memset(pmpriv->adapter, &pget_info->param.signal, 0,
508 		       sizeof(mlan_ds_get_signal));
509 
510 		pget_info->param.signal.selector = ALL_RSSI_INFO_MASK;
511 
512 		/* RSSI */
513 		pget_info->param.signal.bcn_rssi_last = pmpriv->bcn_rssi_last;
514 		pget_info->param.signal.bcn_rssi_avg = pmpriv->bcn_rssi_avg;
515 		pget_info->param.signal.data_rssi_last = pmpriv->data_rssi_last;
516 		pget_info->param.signal.data_rssi_avg = pmpriv->data_rssi_avg;
517 
518 		/* SNR */
519 		pget_info->param.signal.bcn_snr_last =
520 			CAL_SNR(pmpriv->bcn_rssi_last, pmpriv->bcn_nf_last);
521 		pget_info->param.signal.bcn_snr_avg =
522 			CAL_SNR(pmpriv->bcn_rssi_avg, pmpriv->bcn_nf_avg);
523 		pget_info->param.signal.data_snr_last =
524 			CAL_SNR(pmpriv->data_rssi_last, pmpriv->data_nf_last);
525 		pget_info->param.signal.data_snr_avg =
526 			CAL_SNR(pmpriv->data_rssi_avg, pmpriv->data_nf_avg);
527 
528 		/* NF */
529 		pget_info->param.signal.bcn_nf_last = pmpriv->bcn_nf_last;
530 		pget_info->param.signal.bcn_nf_avg = pmpriv->bcn_nf_avg;
531 		pget_info->param.signal.data_nf_last = pmpriv->data_nf_last;
532 		pget_info->param.signal.data_nf_avg = pmpriv->data_nf_avg;
533 
534 		pioctl_buf->data_read_written = sizeof(mlan_ds_get_info);
535 	}
536 
537 	LEAVE();
538 	return MLAN_STATUS_SUCCESS;
539 }
540 
541 /**
542  *  @brief This function handles the command response of snmp_mib
543  *
544  *  @param pmpriv       A pointer to mlan_private structure
545  *  @param resp         A pointer to HostCmd_DS_COMMAND
546  *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
547  *
548  *  @return             MLAN_STATUS_SUCCESS
549  */
wlan_ret_802_11_snmp_mib(pmlan_private pmpriv,HostCmd_DS_COMMAND * resp,mlan_ioctl_req * pioctl_buf)550 static mlan_status wlan_ret_802_11_snmp_mib(pmlan_private pmpriv,
551 					    HostCmd_DS_COMMAND *resp,
552 					    mlan_ioctl_req *pioctl_buf)
553 {
554 	HostCmd_DS_802_11_SNMP_MIB *psmib = &resp->params.smib;
555 	t_u16 oid = wlan_le16_to_cpu(psmib->oid);
556 	t_u16 query_type = wlan_le16_to_cpu(psmib->query_type);
557 	t_u32 ul_temp;
558 	mlan_ds_snmp_mib *mib = MNULL;
559 
560 	ENTER();
561 
562 	if (pioctl_buf)
563 		mib = (mlan_ds_snmp_mib *)pioctl_buf->pbuf;
564 
565 	PRINTM(MINFO, "SNMP_RESP: value of the oid = 0x%x, query_type=0x%x\n",
566 	       oid, query_type);
567 	PRINTM(MINFO, "SNMP_RESP: Buf size  = 0x%x\n",
568 	       wlan_le16_to_cpu(psmib->buf_size));
569 	if (query_type == HostCmd_ACT_GEN_GET) {
570 		switch (oid) {
571 		case DtimPeriod_i:
572 			ul_temp = psmib->value[0];
573 			PRINTM(MINFO, "SNMP_RESP: DTIM Period =%u\n", ul_temp);
574 			if (mib)
575 				mib->param.dtim_period = ul_temp;
576 			break;
577 		case FragThresh_i:
578 			ul_temp = wlan_le16_to_cpu(*((t_u16 *)(psmib->value)));
579 			PRINTM(MINFO, "SNMP_RESP: FragThsd =%u\n", ul_temp);
580 			if (mib)
581 				mib->param.frag_threshold = ul_temp;
582 			break;
583 
584 		case RtsThresh_i:
585 			ul_temp = wlan_le16_to_cpu(*((t_u16 *)(psmib->value)));
586 			PRINTM(MINFO, "SNMP_RESP: RTSThsd =%u\n", ul_temp);
587 			if (mib)
588 				mib->param.rts_threshold = ul_temp;
589 			break;
590 
591 		case ShortRetryLim_i:
592 			ul_temp = wlan_le16_to_cpu(*((t_u16 *)(psmib->value)));
593 			PRINTM(MINFO, "SNMP_RESP: TxRetryCount=%u\n", ul_temp);
594 			if (mib)
595 				mib->param.retry_count = ul_temp;
596 			break;
597 		case WwsMode_i:
598 			ul_temp = wlan_le16_to_cpu(*((t_u16 *)(psmib->value)));
599 			PRINTM(MINFO, "SNMP_RESP: WWSCfg =%u\n", ul_temp);
600 			if (pioctl_buf)
601 				((mlan_ds_misc_cfg *)pioctl_buf->pbuf)
602 					->param.wws_cfg = ul_temp;
603 			break;
604 		case Thermal_i:
605 			ul_temp = wlan_le32_to_cpu(*((t_u32 *)(psmib->value)));
606 			PRINTM(MINFO, "SNMP_RESP: Thermal =%u\n", ul_temp);
607 			if (pioctl_buf)
608 				((mlan_ds_misc_cfg *)pioctl_buf->pbuf)
609 					->param.thermal = ul_temp;
610 			break;
611 		case NullPktPeriod_i:
612 			ul_temp = psmib->value[0];
613 			PRINTM(MINFO, "SNMP_RESP: Auto NULL Pkt Period =%u\n",
614 			       ul_temp);
615 			break;
616 		default:
617 			break;
618 		}
619 	} else { /* (query_type == HostCmd_ACT_GEN_SET) */
620 		/* Update state for 11d */
621 		if (oid == Dot11D_i) {
622 			ul_temp = wlan_le16_to_cpu(*((t_u16 *)(psmib->value)));
623 			/* Set 11d state to private */
624 			pmpriv->state_11d.enable_11d = ul_temp;
625 			/* Set user enable flag if called from ioctl */
626 			if (pioctl_buf)
627 				pmpriv->state_11d.user_enable_11d = ul_temp;
628 		}
629 		/* Update state for 11h */
630 		if (oid == Dot11H_i) {
631 			ul_temp = wlan_le16_to_cpu(*((t_u16 *)(psmib->value)));
632 			PRINTM(MCMND, "wlan: Dot11H_i=%d\n", ul_temp);
633 			/* Set 11h state to priv */
634 			pmpriv->intf_state_11h.is_11h_active =
635 				(ul_temp & ENABLE_11H_MASK);
636 			/* Set radar_det state to adapter */
637 			pmpriv->adapter->state_11h.is_master_radar_det_active =
638 				(ul_temp & MASTER_RADAR_DET_MASK) ? MTRUE :
639 								    MFALSE;
640 			pmpriv->adapter->state_11h.is_slave_radar_det_active =
641 				(ul_temp & SLAVE_RADAR_DET_MASK) ? MTRUE :
642 								   MFALSE;
643 		}
644 	}
645 
646 	if (pioctl_buf) {
647 		/* Indicate ioctl complete */
648 		pioctl_buf->data_read_written = sizeof(mlan_ds_snmp_mib);
649 	}
650 
651 	LEAVE();
652 	return MLAN_STATUS_SUCCESS;
653 }
654 
655 /**
656  *  @brief This function handles the command response of get_log
657  *
658  *  @param pmpriv       A pointer to mlan_private structure
659  *  @param resp         A pointer to HostCmd_DS_COMMAND
660  *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
661  *
662  *  @return             MLAN_STATUS_SUCCESS
663  */
wlan_ret_get_log(pmlan_private pmpriv,HostCmd_DS_COMMAND * resp,mlan_ioctl_req * pioctl_buf)664 static mlan_status wlan_ret_get_log(pmlan_private pmpriv,
665 				    HostCmd_DS_COMMAND *resp,
666 				    mlan_ioctl_req *pioctl_buf)
667 {
668 	HostCmd_DS_802_11_GET_LOG *pget_log =
669 		(HostCmd_DS_802_11_GET_LOG *)&resp->params.get_log;
670 	mlan_ds_get_info *pget_info = MNULL;
671 	int i = 0;
672 
673 	ENTER();
674 
675 	if (pioctl_buf) {
676 		pget_info = (mlan_ds_get_info *)pioctl_buf->pbuf;
677 		pget_info->param.stats.mcast_tx_frame =
678 			wlan_le32_to_cpu(pget_log->mcast_tx_frame);
679 		pget_info->param.stats.failed =
680 			wlan_le32_to_cpu(pget_log->failed);
681 		pget_info->param.stats.retry =
682 			wlan_le32_to_cpu(pget_log->retry);
683 		pget_info->param.stats.multi_retry =
684 			wlan_le32_to_cpu(pget_log->multiretry);
685 		pget_info->param.stats.frame_dup =
686 			wlan_le32_to_cpu(pget_log->frame_dup);
687 		pget_info->param.stats.rts_success =
688 			wlan_le32_to_cpu(pget_log->rts_success);
689 		pget_info->param.stats.rts_failure =
690 			wlan_le32_to_cpu(pget_log->rts_failure);
691 		pget_info->param.stats.ack_failure =
692 			wlan_le32_to_cpu(pget_log->ack_failure);
693 		pget_info->param.stats.rx_frag =
694 			wlan_le32_to_cpu(pget_log->rx_frag);
695 		pget_info->param.stats.mcast_rx_frame =
696 			wlan_le32_to_cpu(pget_log->mcast_rx_frame);
697 		pget_info->param.stats.fcs_error =
698 			wlan_le32_to_cpu(pget_log->fcs_error);
699 		pget_info->param.stats.tx_frame =
700 			wlan_le32_to_cpu(pget_log->tx_frame);
701 		pget_info->param.stats.wep_icv_error[0] =
702 			wlan_le32_to_cpu(pget_log->wep_icv_err_cnt[0]);
703 		pget_info->param.stats.wep_icv_error[1] =
704 			wlan_le32_to_cpu(pget_log->wep_icv_err_cnt[1]);
705 		pget_info->param.stats.wep_icv_error[2] =
706 			wlan_le32_to_cpu(pget_log->wep_icv_err_cnt[2]);
707 		pget_info->param.stats.wep_icv_error[3] =
708 			wlan_le32_to_cpu(pget_log->wep_icv_err_cnt[3]);
709 		pget_info->param.stats.bcn_rcv_cnt =
710 			wlan_le32_to_cpu(pget_log->bcn_rcv_cnt);
711 		pget_info->param.stats.bcn_miss_cnt =
712 			wlan_le32_to_cpu(pget_log->bcn_miss_cnt);
713 		pget_info->param.stats.amsdu_rx_cnt = pmpriv->amsdu_rx_cnt;
714 		pget_info->param.stats.msdu_in_rx_amsdu_cnt =
715 			pmpriv->msdu_in_rx_amsdu_cnt;
716 		pget_info->param.stats.amsdu_tx_cnt = pmpriv->amsdu_tx_cnt;
717 		pget_info->param.stats.msdu_in_tx_amsdu_cnt =
718 			pmpriv->msdu_in_tx_amsdu_cnt;
719 		pget_info->param.stats.rx_stuck_issue_cnt[0] =
720 			wlan_le32_to_cpu(pget_log->rx_stuck_issue_cnt[0]);
721 		pget_info->param.stats.rx_stuck_issue_cnt[1] =
722 			wlan_le32_to_cpu(pget_log->rx_stuck_issue_cnt[1]);
723 		pget_info->param.stats.rx_stuck_recovery_cnt =
724 			wlan_le32_to_cpu(pget_log->rx_stuck_recovery_cnt);
725 		pget_info->param.stats.rx_stuck_tsf[0] =
726 			wlan_le64_to_cpu(pget_log->rx_stuck_tsf[0]);
727 		pget_info->param.stats.rx_stuck_tsf[1] =
728 			wlan_le64_to_cpu(pget_log->rx_stuck_tsf[1]);
729 		pget_info->param.stats.tx_watchdog_recovery_cnt =
730 			wlan_le32_to_cpu(pget_log->tx_watchdog_recovery_cnt);
731 		pget_info->param.stats.tx_watchdog_tsf[0] =
732 			wlan_le64_to_cpu(pget_log->tx_watchdog_tsf[0]);
733 		pget_info->param.stats.tx_watchdog_tsf[1] =
734 			wlan_le64_to_cpu(pget_log->tx_watchdog_tsf[1]);
735 		pget_info->param.stats.channel_switch_ann_sent =
736 			wlan_le32_to_cpu(pget_log->channel_switch_ann_sent);
737 		pget_info->param.stats.channel_switch_state =
738 			wlan_le32_to_cpu(pget_log->channel_switch_state);
739 		pget_info->param.stats.reg_class =
740 			wlan_le32_to_cpu(pget_log->reg_class);
741 		pget_info->param.stats.channel_number =
742 			wlan_le32_to_cpu(pget_log->channel_number);
743 		pget_info->param.stats.channel_switch_mode =
744 			wlan_le32_to_cpu(pget_log->channel_switch_mode);
745 		pget_info->param.stats.rx_reset_mac_recovery_cnt =
746 			wlan_le32_to_cpu(pget_log->rx_reset_mac_recovery_cnt);
747 		pget_info->param.stats.rx_Isr2_NotDone_Cnt =
748 			wlan_le32_to_cpu(pget_log->rx_Isr2_NotDone_Cnt);
749 		pget_info->param.stats.gdma_abort_cnt =
750 			wlan_le32_to_cpu(pget_log->gdma_abort_cnt);
751 		pget_info->param.stats.g_reset_rx_mac_cnt =
752 			wlan_le32_to_cpu(pget_log->g_reset_rx_mac_cnt);
753 		// Ownership error counters
754 		pget_info->param.stats.dwCtlErrCnt =
755 			wlan_le32_to_cpu(pget_log->dwCtlErrCnt);
756 		pget_info->param.stats.dwBcnErrCnt =
757 			wlan_le32_to_cpu(pget_log->dwBcnErrCnt);
758 		pget_info->param.stats.dwMgtErrCnt =
759 			wlan_le32_to_cpu(pget_log->dwMgtErrCnt);
760 		pget_info->param.stats.dwDatErrCnt =
761 			wlan_le32_to_cpu(pget_log->dwDatErrCnt);
762 		pget_info->param.stats.bigtk_mmeGoodCnt =
763 			wlan_le32_to_cpu(pget_log->bigtk_mmeGoodCnt);
764 		pget_info->param.stats.bigtk_replayErrCnt =
765 			wlan_le32_to_cpu(pget_log->bigtk_replayErrCnt);
766 		pget_info->param.stats.bigtk_micErrCnt =
767 			wlan_le32_to_cpu(pget_log->bigtk_micErrCnt);
768 		pget_info->param.stats.bigtk_mmeNotFoundCnt =
769 			wlan_le32_to_cpu(pget_log->bigtk_mmeNotFoundCnt);
770 
771 		if (pmpriv->adapter->getlog_enable) {
772 			pget_info->param.stats.tx_frag_cnt =
773 				wlan_le32_to_cpu(pget_log->tx_frag_cnt);
774 			for (i = 0; i < 8; i++) {
775 				pget_info->param.stats.qos_tx_frag_cnt[i] =
776 					wlan_le32_to_cpu(
777 						pget_log->qos_tx_frag_cnt[i]);
778 				pget_info->param.stats.qos_failed_cnt[i] =
779 					wlan_le32_to_cpu(
780 						pget_log->qos_failed_cnt[i]);
781 				pget_info->param.stats.qos_retry_cnt[i] =
782 					wlan_le32_to_cpu(
783 						pget_log->qos_retry_cnt[i]);
784 				pget_info->param.stats.qos_multi_retry_cnt[i] =
785 					wlan_le32_to_cpu(
786 						pget_log->qos_multi_retry_cnt[i]);
787 				pget_info->param.stats.qos_frm_dup_cnt[i] =
788 					wlan_le32_to_cpu(
789 						pget_log->qos_frm_dup_cnt[i]);
790 				pget_info->param.stats.qos_rts_suc_cnt[i] =
791 					wlan_le32_to_cpu(
792 						pget_log->qos_rts_suc_cnt[i]);
793 				pget_info->param.stats.qos_rts_failure_cnt[i] =
794 					wlan_le32_to_cpu(
795 						pget_log->qos_rts_failure_cnt[i]);
796 				pget_info->param.stats.qos_ack_failure_cnt[i] =
797 					wlan_le32_to_cpu(
798 						pget_log->qos_ack_failure_cnt[i]);
799 				pget_info->param.stats.qos_rx_frag_cnt[i] =
800 					wlan_le32_to_cpu(
801 						pget_log->qos_rx_frag_cnt[i]);
802 				pget_info->param.stats.qos_tx_frm_cnt[i] =
803 					wlan_le32_to_cpu(
804 						pget_log->qos_tx_frm_cnt[i]);
805 				pget_info->param.stats.qos_discarded_frm_cnt
806 					[i] = wlan_le32_to_cpu(
807 					pget_log->qos_discarded_frm_cnt[i]);
808 				pget_info->param.stats.qos_mpdus_rx_cnt[i] =
809 					wlan_le32_to_cpu(
810 						pget_log->qos_mpdus_rx_cnt[i]);
811 				pget_info->param.stats.qos_retries_rx_cnt[i] =
812 					wlan_le32_to_cpu(
813 						pget_log->qos_retries_rx_cnt[i]);
814 			}
815 			pget_info->param.stats.cmacicv_errors =
816 				wlan_le32_to_cpu(pget_log->cmacicv_errors);
817 			pget_info->param.stats.cmac_replays =
818 				wlan_le32_to_cpu(pget_log->cmac_replays);
819 			pget_info->param.stats.mgmt_ccmp_replays =
820 				wlan_le32_to_cpu(pget_log->mgmt_ccmp_replays);
821 			pget_info->param.stats.tkipicv_errors =
822 				wlan_le32_to_cpu(pget_log->tkipicv_errors);
823 			pget_info->param.stats.tkip_replays =
824 				wlan_le32_to_cpu(pget_log->tkip_replays);
825 			pget_info->param.stats.ccmp_decrypt_errors =
826 				wlan_le32_to_cpu(pget_log->ccmp_decrypt_errors);
827 			pget_info->param.stats.ccmp_replays =
828 				wlan_le32_to_cpu(pget_log->ccmp_replays);
829 			pget_info->param.stats.tx_amsdu_cnt =
830 				wlan_le32_to_cpu(pget_log->tx_amsdu_cnt);
831 			pget_info->param.stats.failed_amsdu_cnt =
832 				wlan_le32_to_cpu(pget_log->failed_amsdu_cnt);
833 			pget_info->param.stats.retry_amsdu_cnt =
834 				wlan_le32_to_cpu(pget_log->retry_amsdu_cnt);
835 			pget_info->param.stats.multi_retry_amsdu_cnt =
836 				wlan_le32_to_cpu(
837 					pget_log->multi_retry_amsdu_cnt);
838 			pget_info->param.stats.tx_octets_in_amsdu_cnt =
839 				wlan_le64_to_cpu(
840 					pget_log->tx_octets_in_amsdu_cnt);
841 			pget_info->param.stats.amsdu_ack_failure_cnt =
842 				wlan_le32_to_cpu(
843 					pget_log->amsdu_ack_failure_cnt);
844 			pget_info->param.stats.rx_amsdu_cnt =
845 				wlan_le32_to_cpu(pget_log->rx_amsdu_cnt);
846 			pget_info->param.stats.rx_octets_in_amsdu_cnt =
847 				wlan_le64_to_cpu(
848 					pget_log->rx_octets_in_amsdu_cnt);
849 			pget_info->param.stats.tx_ampdu_cnt =
850 				wlan_le32_to_cpu(pget_log->tx_ampdu_cnt);
851 			pget_info->param.stats.tx_mpdus_in_ampdu_cnt =
852 				wlan_le32_to_cpu(
853 					pget_log->tx_mpdus_in_ampdu_cnt);
854 			pget_info->param.stats.tx_octets_in_ampdu_cnt =
855 				wlan_le64_to_cpu(
856 					pget_log->tx_octets_in_ampdu_cnt);
857 			pget_info->param.stats.ampdu_rx_cnt =
858 				wlan_le32_to_cpu(pget_log->ampdu_rx_cnt);
859 			pget_info->param.stats.mpdu_in_rx_ampdu_cnt =
860 				wlan_le32_to_cpu(
861 					pget_log->mpdu_in_rx_ampdu_cnt);
862 			pget_info->param.stats.rx_octets_in_ampdu_cnt =
863 				wlan_le64_to_cpu(
864 					pget_log->rx_octets_in_ampdu_cnt);
865 			pget_info->param.stats.ampdu_delimiter_crc_error_cnt =
866 				wlan_le32_to_cpu(
867 					pget_log->ampdu_delimiter_crc_error_cnt);
868 
869 			/* Indicate ioctl complete */
870 			pioctl_buf->data_read_written =
871 				sizeof(mlan_ds_get_info);
872 		} else
873 			pioctl_buf->data_read_written =
874 				sizeof(mlan_ds_get_stats_org) +
875 				sizeof(pget_info->sub_command);
876 	}
877 	LEAVE();
878 	return MLAN_STATUS_SUCCESS;
879 }
880 
881 /**
882  *  @brief Get power level and rate index
883  *
884  *  @param pmpriv       A pointer to mlan_private structure
885  *  @param pdata_buf    Pointer to the data buffer
886  *
887  *  @return             MLAN_STATUS_SUCCESS or MLAN_STATUS_FAILURE
888  */
wlan_get_power_level(pmlan_private pmpriv,void * pdata_buf)889 static mlan_status wlan_get_power_level(pmlan_private pmpriv, void *pdata_buf)
890 {
891 	t_u16 length = 0;
892 	t_s8 max_power = -1, min_power = -1;
893 	MrvlTypes_Power_Group_t *ppg_tlv = MNULL;
894 	Power_Group_t *pg = MNULL;
895 
896 	ENTER();
897 
898 	if (pdata_buf) {
899 		ppg_tlv = (MrvlTypes_Power_Group_t
900 				   *)((t_u8 *)pdata_buf +
901 				      sizeof(HostCmd_DS_TXPWR_CFG));
902 		pg = (Power_Group_t *)((t_u8 *)ppg_tlv +
903 				       sizeof(MrvlTypes_Power_Group_t));
904 		length = ppg_tlv->length;
905 		if (length > 0) {
906 			max_power = pg->power_max;
907 			min_power = pg->power_min;
908 			length -= sizeof(Power_Group_t);
909 		}
910 		while (length) {
911 			pg++;
912 			if (max_power < pg->power_max)
913 				max_power = pg->power_max;
914 			if (min_power > pg->power_min)
915 				min_power = pg->power_min;
916 			length -= sizeof(Power_Group_t);
917 		}
918 		if (ppg_tlv->length > 0) {
919 			pmpriv->min_tx_power_level = min_power;
920 			pmpriv->max_tx_power_level = max_power;
921 		}
922 	} else {
923 		LEAVE();
924 		return MLAN_STATUS_FAILURE;
925 	}
926 
927 	LEAVE();
928 	return MLAN_STATUS_SUCCESS;
929 }
930 
931 /**
932  *  @brief This function handles the command response of tx_power_cfg
933  *
934  *  @param pmpriv       A pointer to mlan_private structure
935  *  @param resp         A pointer to HostCmd_DS_COMMAND
936  *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
937  *
938  *  @return             MLAN_STATUS_SUCCESS
939  */
wlan_ret_tx_power_cfg(pmlan_private pmpriv,HostCmd_DS_COMMAND * resp,mlan_ioctl_req * pioctl_buf)940 static mlan_status wlan_ret_tx_power_cfg(pmlan_private pmpriv,
941 					 HostCmd_DS_COMMAND *resp,
942 					 mlan_ioctl_req *pioctl_buf)
943 {
944 	HostCmd_DS_TXPWR_CFG *ptxp_cfg = &resp->params.txp_cfg;
945 	MrvlTypes_Power_Group_t *ppg_tlv = MNULL;
946 	Power_Group_t *pg = MNULL;
947 	t_u16 action = wlan_le16_to_cpu(ptxp_cfg->action);
948 	mlan_ds_power_cfg *power = MNULL;
949 	mlan_power_group *pwr_grp = MNULL;
950 	t_u8 i = 0;
951 
952 	ENTER();
953 
954 	ppg_tlv = (MrvlTypes_Power_Group_t *)(ptxp_cfg->tlv_buf);
955 	pg = (Power_Group_t *)((t_u8 *)ppg_tlv +
956 			       sizeof(MrvlTypes_Power_Group_t));
957 
958 	switch (action) {
959 	case HostCmd_ACT_GEN_GET:
960 		ppg_tlv->length = wlan_le16_to_cpu(ppg_tlv->length);
961 		if (pmpriv->adapter->hw_status ==
962 		    WlanHardwareStatusInitializing)
963 			wlan_get_power_level(pmpriv, ptxp_cfg);
964 		pmpriv->tx_power_level = (t_s16)pg->power_min;
965 		break;
966 
967 	case HostCmd_ACT_GEN_SET:
968 		if (wlan_le32_to_cpu(ptxp_cfg->mode)) {
969 			if (pg->power_max == pg->power_min)
970 				pmpriv->tx_power_level = (t_s16)pg->power_min;
971 		}
972 		break;
973 
974 	default:
975 		PRINTM(MERROR, "CMD_RESP: unknown command action %d\n", action);
976 		LEAVE();
977 		return MLAN_STATUS_SUCCESS;
978 	}
979 
980 	PRINTM(MINFO, "Current TxPower Level = %d,Max Power=%d, Min Power=%d\n",
981 	       pmpriv->tx_power_level, pmpriv->max_tx_power_level,
982 	       pmpriv->min_tx_power_level);
983 
984 	if (pioctl_buf) {
985 		power = (mlan_ds_power_cfg *)pioctl_buf->pbuf;
986 		if (action == HostCmd_ACT_GEN_GET) {
987 			if (power->sub_command == MLAN_OID_POWER_CFG) {
988 				pioctl_buf->data_read_written =
989 					sizeof(mlan_power_cfg_t) +
990 					MLAN_SUB_COMMAND_SIZE;
991 				power->param.power_cfg.power_level =
992 					pmpriv->tx_power_level;
993 				if (wlan_le32_to_cpu(ptxp_cfg->mode))
994 					power->param.power_cfg.is_power_auto =
995 						0;
996 				else
997 					power->param.power_cfg.is_power_auto =
998 						1;
999 			} else {
1000 				power->param.power_ext.num_pwr_grp = 0;
1001 				i = 0;
1002 				while ((ppg_tlv->length) &&
1003 				       (i < MAX_POWER_GROUP)) {
1004 					pwr_grp = (mlan_power_group *)&power
1005 							  ->param.power_ext
1006 							  .power_group[i];
1007 					pwr_grp->first_rate_ind = 0;
1008 					pwr_grp->last_rate_ind = 0;
1009 					if (pg->modulation_class ==
1010 					    MOD_CLASS_HR_DSSS) {
1011 						pwr_grp->rate_format =
1012 							MLAN_RATE_FORMAT_LG;
1013 						pwr_grp->first_rate_ind =
1014 							pg->first_rate_code;
1015 						pwr_grp->last_rate_ind =
1016 							pg->last_rate_code;
1017 					} else if (pg->modulation_class ==
1018 						   MOD_CLASS_OFDM) {
1019 						pwr_grp->rate_format =
1020 							MLAN_RATE_FORMAT_LG;
1021 						pwr_grp->first_rate_ind =
1022 							MLAN_RATE_INDEX_OFDM0 +
1023 							pg->first_rate_code;
1024 						pwr_grp->last_rate_ind =
1025 							MLAN_RATE_INDEX_OFDM0 +
1026 							pg->last_rate_code;
1027 					} else if (pg->modulation_class ==
1028 						   MOD_CLASS_HT) {
1029 						pwr_grp->rate_format =
1030 							MLAN_RATE_FORMAT_HT;
1031 						pwr_grp->first_rate_ind =
1032 							pg->first_rate_code;
1033 						pwr_grp->last_rate_ind =
1034 							pg->last_rate_code;
1035 					} else if (pg->modulation_class ==
1036 						   MOD_CLASS_VHT) {
1037 						pwr_grp->rate_format =
1038 							MLAN_RATE_FORMAT_VHT;
1039 						pwr_grp->first_rate_ind =
1040 							(pg->first_rate_code) &
1041 							0xF;
1042 						pwr_grp->last_rate_ind =
1043 							(pg->last_rate_code) &
1044 							0xF;
1045 						// pwr_grp->nss = 1 +
1046 						// (pg->first_rate_code >> 4);
1047 						pwr_grp->nss =
1048 							1 +
1049 							(pg->last_rate_code >>
1050 							 4);
1051 					}
1052 					pwr_grp->bandwidth = pg->ht_bandwidth;
1053 					pwr_grp->power_min = pg->power_min;
1054 					pwr_grp->power_max = pg->power_max;
1055 					pwr_grp->power_step = pg->power_step;
1056 					ppg_tlv->length -=
1057 						sizeof(Power_Group_t);
1058 					pg++;
1059 					i++;
1060 				}
1061 				power->param.power_ext.num_pwr_grp = i;
1062 				pioctl_buf->data_read_written =
1063 					sizeof(mlan_power_cfg_ext) +
1064 					MLAN_SUB_COMMAND_SIZE;
1065 			}
1066 		}
1067 	}
1068 
1069 	LEAVE();
1070 	return MLAN_STATUS_SUCCESS;
1071 }
1072 
1073 /**
1074  *  @brief This function handles the command response of rf_tx_power
1075  *
1076  *  @param pmpriv       A pointer to mlan_private structure
1077  *  @param resp         A pointer to HostCmd_DS_COMMAND
1078  *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
1079  *  @return             MLAN_STATUS_SUCCESS
1080  */
wlan_ret_802_11_rf_tx_power(pmlan_private pmpriv,HostCmd_DS_COMMAND * resp,mlan_ioctl_req * pioctl_buf)1081 static mlan_status wlan_ret_802_11_rf_tx_power(pmlan_private pmpriv,
1082 					       HostCmd_DS_COMMAND *resp,
1083 					       mlan_ioctl_req *pioctl_buf)
1084 {
1085 	HostCmd_DS_802_11_RF_TX_POWER *rtp = &resp->params.txp;
1086 	t_u16 action = wlan_le16_to_cpu(rtp->action);
1087 	mlan_ds_power_cfg *power = MNULL;
1088 
1089 	ENTER();
1090 
1091 	pmpriv->tx_power_level = wlan_le16_to_cpu(rtp->current_level);
1092 
1093 	if (action == HostCmd_ACT_GEN_GET) {
1094 		pmpriv->max_tx_power_level = rtp->max_power;
1095 		pmpriv->min_tx_power_level = rtp->min_power;
1096 		if (pioctl_buf) {
1097 			power = (mlan_ds_power_cfg *)pioctl_buf->pbuf;
1098 			if (power->sub_command == MLAN_OID_POWER_CFG) {
1099 				pioctl_buf->data_read_written =
1100 					sizeof(mlan_power_cfg_t) +
1101 					MLAN_SUB_COMMAND_SIZE;
1102 				power->param.power_cfg.power_level =
1103 					pmpriv->tx_power_level;
1104 			}
1105 		}
1106 	}
1107 
1108 	PRINTM(MINFO, "Current TxPower Level = %d,Max Power=%d, Min Power=%d\n",
1109 	       pmpriv->tx_power_level, pmpriv->max_tx_power_level,
1110 	       pmpriv->min_tx_power_level);
1111 
1112 	LEAVE();
1113 	return MLAN_STATUS_SUCCESS;
1114 }
1115 
1116 /**
1117  *  @brief This function handles the command response of sleep_period
1118  *
1119  *  @param pmpriv       A pointer to mlan_private structure
1120  *  @param resp         A pointer to HostCmd_DS_COMMAND
1121  *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
1122  *  @return             MLAN_STATUS_SUCCESS
1123  */
wlan_ret_802_11_sleep_period(pmlan_private pmpriv,HostCmd_DS_COMMAND * resp,mlan_ioctl_req * pioctl_buf)1124 static mlan_status wlan_ret_802_11_sleep_period(pmlan_private pmpriv,
1125 						HostCmd_DS_COMMAND *resp,
1126 						mlan_ioctl_req *pioctl_buf)
1127 {
1128 	HostCmd_DS_802_11_SLEEP_PERIOD *pcmd_sleep_pd = &resp->params.sleep_pd;
1129 	mlan_ds_pm_cfg *pm_cfg = MNULL;
1130 	t_u16 sleep_pd = 0;
1131 
1132 	ENTER();
1133 
1134 	sleep_pd = wlan_le16_to_cpu(pcmd_sleep_pd->sleep_pd);
1135 	if (pioctl_buf) {
1136 		pm_cfg = (mlan_ds_pm_cfg *)pioctl_buf->pbuf;
1137 		pm_cfg->param.sleep_period = (t_u32)sleep_pd;
1138 		pioctl_buf->data_read_written =
1139 			sizeof(pm_cfg->param.sleep_period) +
1140 			MLAN_SUB_COMMAND_SIZE;
1141 	}
1142 	pmpriv->adapter->sleep_period.period = sleep_pd;
1143 	pmpriv->adapter->saved_sleep_period.period = sleep_pd;
1144 
1145 	pmpriv->adapter->pps_uapsd_mode = MFALSE;
1146 	if ((pmpriv->adapter->sleep_period.period != 0) &&
1147 	    (pmpriv->adapter->sleep_period.period !=
1148 	     SLEEP_PERIOD_RESERVED_FF)) {
1149 		pmpriv->adapter->gen_null_pkt = MTRUE;
1150 	} else {
1151 		pmpriv->adapter->delay_null_pkt = MFALSE;
1152 		pmpriv->adapter->gen_null_pkt = MFALSE;
1153 	}
1154 
1155 	LEAVE();
1156 	return MLAN_STATUS_SUCCESS;
1157 }
1158 
1159 /**
1160  *  @brief This function handles the command response of sleep_params
1161  *
1162  *  @param pmpriv       A pointer to mlan_private structure
1163  *  @param resp         A pointer to HostCmd_DS_COMMAND
1164  *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
1165  *  @return             MLAN_STATUS_SUCCESS
1166  */
wlan_ret_802_11_sleep_params(pmlan_private pmpriv,HostCmd_DS_COMMAND * resp,mlan_ioctl_req * pioctl_buf)1167 static mlan_status wlan_ret_802_11_sleep_params(pmlan_private pmpriv,
1168 						HostCmd_DS_COMMAND *resp,
1169 						mlan_ioctl_req *pioctl_buf)
1170 {
1171 	HostCmd_DS_802_11_SLEEP_PARAMS *presp_sp = &resp->params.sleep_param;
1172 	mlan_ds_pm_cfg *pm_cfg = MNULL;
1173 	mlan_ds_sleep_params *psp = MNULL;
1174 	sleep_params_t *psleep_params = &pmpriv->adapter->sleep_params;
1175 
1176 	ENTER();
1177 
1178 	psleep_params->sp_reserved = wlan_le16_to_cpu(presp_sp->reserved);
1179 	psleep_params->sp_error = wlan_le16_to_cpu(presp_sp->error);
1180 	psleep_params->sp_offset = wlan_le16_to_cpu(presp_sp->offset);
1181 	psleep_params->sp_stable_time = wlan_le16_to_cpu(presp_sp->stable_time);
1182 	psleep_params->sp_cal_control = presp_sp->cal_control;
1183 	psleep_params->sp_ext_sleep_clk = presp_sp->external_sleep_clk;
1184 
1185 	if (pioctl_buf) {
1186 		pm_cfg = (mlan_ds_pm_cfg *)pioctl_buf->pbuf;
1187 		psp = (mlan_ds_sleep_params *)&pm_cfg->param.sleep_params;
1188 
1189 		psp->error = (t_u32)psleep_params->sp_error;
1190 		psp->offset = (t_u32)psleep_params->sp_offset;
1191 		psp->stable_time = (t_u32)psleep_params->sp_stable_time;
1192 		psp->cal_control = (t_u32)psleep_params->sp_cal_control;
1193 		psp->ext_sleep_clk = (t_u32)psleep_params->sp_ext_sleep_clk;
1194 		psp->reserved = (t_u32)psleep_params->sp_reserved;
1195 
1196 		pioctl_buf->data_read_written =
1197 			sizeof(pm_cfg->param.sleep_params) +
1198 			MLAN_SUB_COMMAND_SIZE;
1199 	}
1200 
1201 	LEAVE();
1202 	return MLAN_STATUS_SUCCESS;
1203 }
1204 
1205 /**
1206  *  @brief This function handles the command response of multicast_address
1207  *
1208  *  @param pmpriv       A pointer to mlan_private structure
1209  *  @param resp         A pointer to HostCmd_DS_COMMAND
1210  *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
1211  *
1212  *  @return             MLAN_STATUS_SUCCESS
1213  */
wlan_ret_mac_multicast_adr(pmlan_private pmpriv,HostCmd_DS_COMMAND * resp,mlan_ioctl_req * pioctl_buf)1214 static mlan_status wlan_ret_mac_multicast_adr(pmlan_private pmpriv,
1215 					      HostCmd_DS_COMMAND *resp,
1216 					      mlan_ioctl_req *pioctl_buf)
1217 {
1218 	ENTER();
1219 	if (pioctl_buf) {
1220 		pioctl_buf->data_read_written =
1221 			sizeof(mlan_multicast_list) + MLAN_SUB_COMMAND_SIZE;
1222 	}
1223 	LEAVE();
1224 	return MLAN_STATUS_SUCCESS;
1225 }
1226 
1227 /**
1228  *  @brief This function handles the command response of deauthenticate
1229  *
1230  *  @param pmpriv       A pointer to mlan_private structure
1231  *  @param resp         A pointer to HostCmd_DS_COMMAND
1232  *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
1233  *
1234  *  @return             MLAN_STATUS_SUCCESS
1235  */
wlan_ret_802_11_deauthenticate(pmlan_private pmpriv,HostCmd_DS_COMMAND * resp,mlan_ioctl_req * pioctl_buf)1236 static mlan_status wlan_ret_802_11_deauthenticate(pmlan_private pmpriv,
1237 						  HostCmd_DS_COMMAND *resp,
1238 						  mlan_ioctl_req *pioctl_buf)
1239 {
1240 	mlan_adapter *pmadapter = pmpriv->adapter;
1241 	t_u8 event_buf[32];
1242 	mlan_event *pevent = (mlan_event *)event_buf;
1243 	ENTER();
1244 
1245 	pmadapter->dbg.num_cmd_deauth++;
1246 
1247 	if (!memcmp(pmadapter, resp->params.deauth.mac_addr,
1248 		    &pmpriv->curr_bss_params.bss_descriptor.mac_address,
1249 		    sizeof(resp->params.deauth.mac_addr))) {
1250 		wlan_reset_connect_state(pmpriv, MTRUE);
1251 	}
1252 	if (pmpriv->adapter->state_rdh.stage == RDH_STOP_INTFS)
1253 		wlan_11h_radar_detected_callback((t_void *)pmpriv);
1254 	memset(pmadapter, event_buf, 0, sizeof(event_buf));
1255 	pevent->bss_index = pmpriv->bss_index;
1256 	pevent->event_id = MLAN_EVENT_ID_DRV_DISCONNECT_LOGGER;
1257 	pevent->event_len = sizeof(resp->params.deauth.reason_code);
1258 	memcpy_ext(pmpriv->adapter, (t_u8 *)pevent->event_buf,
1259 		   &resp->params.deauth.reason_code, pevent->event_len,
1260 		   pevent->event_len);
1261 	wlan_recv_event(pmpriv, MLAN_EVENT_ID_DRV_DISCONNECT_LOGGER, pevent);
1262 
1263 	LEAVE();
1264 	return MLAN_STATUS_SUCCESS;
1265 }
1266 
1267 /**
1268  *  @brief This function handles the command response of ad_hoc_stop
1269  *
1270  *  @param pmpriv       A pointer to mlan_private structure
1271  *  @param resp         A pointer to HostCmd_DS_COMMAND
1272  *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
1273  *
1274  *  @return        MLAN_STATUS_SUCCESS
1275  */
wlan_ret_802_11_ad_hoc_stop(pmlan_private pmpriv,HostCmd_DS_COMMAND * resp,mlan_ioctl_req * pioctl_buf)1276 static mlan_status wlan_ret_802_11_ad_hoc_stop(pmlan_private pmpriv,
1277 					       HostCmd_DS_COMMAND *resp,
1278 					       mlan_ioctl_req *pioctl_buf)
1279 {
1280 	ENTER();
1281 
1282 	wlan_reset_connect_state(pmpriv, MTRUE);
1283 	if (pmpriv->adapter->state_rdh.stage == RDH_STOP_INTFS)
1284 		wlan_11h_radar_detected_callback((t_void *)pmpriv);
1285 	LEAVE();
1286 	return MLAN_STATUS_SUCCESS;
1287 }
1288 
1289 /**
1290  *  @brief This function handles the command response of key_material
1291  *
1292  *  @param pmpriv       A pointer to mlan_private structure
1293  *  @param resp         A pointer to HostCmd_DS_COMMAND
1294  *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
1295  *
1296  *  @return        MLAN_STATUS_SUCCESS
1297  */
wlan_ret_802_11_key_material(pmlan_private pmpriv,HostCmd_DS_COMMAND * resp,mlan_ioctl_req * pioctl_buf)1298 static mlan_status wlan_ret_802_11_key_material(pmlan_private pmpriv,
1299 						HostCmd_DS_COMMAND *resp,
1300 						mlan_ioctl_req *pioctl_buf)
1301 {
1302 	HostCmd_DS_802_11_KEY_MATERIAL *pkey = &resp->params.key_material;
1303 	mlan_ds_sec_cfg *sec = MNULL;
1304 	t_u8 zero_kek[MLAN_KEK_LEN] = {0};
1305 
1306 	ENTER();
1307 
1308 	if (wlan_le16_to_cpu(pkey->action) == HostCmd_ACT_GEN_SET) {
1309 		if ((wlan_le16_to_cpu(pkey->key_param_set.key_info) &
1310 		     KEY_INFO_TKIP_MCAST)) {
1311 			PRINTM(MINFO, "key: GTK is set\n");
1312 			pmpriv->wpa_is_gtk_set = MTRUE;
1313 			if (pmpriv->port_ctrl_mode == MTRUE) {
1314 				/* GTK is set, open the port */
1315 				PRINTM(MINFO,
1316 				       "GTK_SET: Open port: WPA/WPA2 h-supp mode\n");
1317 				pmpriv->port_open = MTRUE;
1318 			}
1319 			if (memcmp(pmpriv->adapter, pmpriv->gtk_rekey.kek,
1320 				   zero_kek, sizeof(zero_kek)) != 0) {
1321 				wlan_prepare_cmd(
1322 					pmpriv,
1323 					HostCmd_CMD_GTK_REKEY_OFFLOAD_CFG,
1324 					HostCmd_ACT_GEN_SET, 0, MNULL,
1325 					&pmpriv->gtk_rekey);
1326 				memset(pmpriv->adapter, &pmpriv->gtk_rekey, 0,
1327 				       sizeof(mlan_ds_misc_gtk_rekey_data));
1328 			}
1329 			pmpriv->adapter->scan_block = MFALSE;
1330 		}
1331 	} else if (wlan_le16_to_cpu(pkey->action) == HostCmd_ACT_GEN_GET) {
1332 		if (pioctl_buf && (wlan_le16_to_cpu(pkey->key_param_set.type) ==
1333 				   TLV_TYPE_KEY_PARAM_V2)) {
1334 			sec = (mlan_ds_sec_cfg *)pioctl_buf->pbuf;
1335 			memcpy_ext(pmpriv->adapter,
1336 				   sec->param.encrypt_key.mac_addr,
1337 				   pkey->key_param_set.mac_addr,
1338 				   MLAN_MAC_ADDR_LENGTH,
1339 				   sizeof(sec->param.encrypt_key.mac_addr));
1340 			sec->param.encrypt_key.key_index =
1341 				pkey->key_param_set.key_idx;
1342 			PRINTM(MIOCTL,
1343 			       "key_type=%d, key_index=%d, key_info=0x%x " MACSTR
1344 			       "\n",
1345 			       pkey->key_param_set.key_type,
1346 			       pkey->key_param_set.key_idx,
1347 			       wlan_le16_to_cpu(pkey->key_param_set.key_info),
1348 			       MAC2STR(sec->param.encrypt_key.mac_addr));
1349 			switch (pkey->key_param_set.key_type) {
1350 			case KEY_TYPE_ID_WAPI:
1351 				sec->param.encrypt_key.is_wapi_key = MTRUE;
1352 				sec->param.encrypt_key.key_len =
1353 					wlan_le16_to_cpu(
1354 						pkey->key_param_set.key_params
1355 							.wapi.key_len);
1356 				memcpy_ext(
1357 					pmpriv->adapter,
1358 					sec->param.encrypt_key.key_material,
1359 					pkey->key_param_set.key_params.wapi.key,
1360 					sec->param.encrypt_key.key_len,
1361 					sizeof(sec->param.encrypt_key
1362 						       .key_material));
1363 				memcpy_ext(
1364 					pmpriv->adapter,
1365 					sec->param.encrypt_key.pn,
1366 					pkey->key_param_set.key_params.wapi.pn,
1367 					PN_SIZE,
1368 					sizeof(sec->param.encrypt_key.pn));
1369 				break;
1370 			case KEY_TYPE_ID_TKIP:
1371 				sec->param.encrypt_key.key_len =
1372 					wlan_le16_to_cpu(
1373 						pkey->key_param_set.key_params
1374 							.tkip.key_len);
1375 				memcpy_ext(
1376 					pmpriv->adapter,
1377 					sec->param.encrypt_key.key_material,
1378 					pkey->key_param_set.key_params.tkip.key,
1379 					sec->param.encrypt_key.key_len,
1380 					sizeof(sec->param.encrypt_key
1381 						       .key_material));
1382 				memcpy_ext(
1383 					pmpriv->adapter,
1384 					sec->param.encrypt_key.pn,
1385 					pkey->key_param_set.key_params.tkip.pn,
1386 					WPA_PN_SIZE,
1387 					sizeof(sec->param.encrypt_key.pn));
1388 				break;
1389 			case KEY_TYPE_ID_AES:
1390 				sec->param.encrypt_key.key_len =
1391 					wlan_le16_to_cpu(
1392 						pkey->key_param_set.key_params
1393 							.aes.key_len);
1394 				memcpy_ext(
1395 					pmpriv->adapter,
1396 					sec->param.encrypt_key.key_material,
1397 					pkey->key_param_set.key_params.aes.key,
1398 					sec->param.encrypt_key.key_len,
1399 					sizeof(sec->param.encrypt_key
1400 						       .key_material));
1401 				memcpy_ext(
1402 					pmpriv->adapter,
1403 					sec->param.encrypt_key.pn,
1404 					pkey->key_param_set.key_params.aes.pn,
1405 					WPA_PN_SIZE,
1406 					sizeof(sec->param.encrypt_key.pn));
1407 				break;
1408 			case KEY_TYPE_ID_AES_CMAC:
1409 				sec->param.encrypt_key.key_len =
1410 					wlan_le16_to_cpu(
1411 						pkey->key_param_set.key_params
1412 							.cmac_aes.key_len);
1413 				memcpy_ext(pmpriv->adapter,
1414 					   sec->param.encrypt_key.key_material,
1415 					   pkey->key_param_set.key_params
1416 						   .cmac_aes.key,
1417 					   sec->param.encrypt_key.key_len,
1418 					   sizeof(sec->param.encrypt_key
1419 							  .key_material));
1420 				memcpy_ext(pmpriv->adapter,
1421 					   sec->param.encrypt_key.pn,
1422 					   pkey->key_param_set.key_params
1423 						   .cmac_aes.ipn,
1424 					   IGTK_PN_SIZE,
1425 					   sizeof(sec->param.encrypt_key.pn));
1426 				break;
1427 			case KEY_TYPE_ID_WEP:
1428 				sec->param.encrypt_key.key_len =
1429 					wlan_le16_to_cpu(
1430 						pkey->key_param_set.key_params
1431 							.wep.key_len);
1432 				memcpy_ext(
1433 					pmpriv->adapter,
1434 					sec->param.encrypt_key.key_material,
1435 					pkey->key_param_set.key_params.wep.key,
1436 					sec->param.encrypt_key.key_len,
1437 					sizeof(sec->param.encrypt_key
1438 						       .key_material));
1439 				break;
1440 			}
1441 		}
1442 	}
1443 	LEAVE();
1444 	return MLAN_STATUS_SUCCESS;
1445 }
1446 
1447 /**
1448  *  @brief Handle the supplicant profile response
1449  *
1450  *  @param pmpriv       A pointer to mlan_private structure
1451  *  @param resp         A pointer to HostCmd_DS_COMMAND
1452  *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
1453  *
1454  *  @return        MLAN_STATUS_SUCCESS
1455  */
1456 static mlan_status
wlan_ret_802_11_supplicant_profile(pmlan_private pmpriv,HostCmd_DS_COMMAND * resp,mlan_ioctl_req * pioctl_buf)1457 wlan_ret_802_11_supplicant_profile(pmlan_private pmpriv,
1458 				   HostCmd_DS_COMMAND *resp,
1459 				   mlan_ioctl_req *pioctl_buf)
1460 {
1461 	HostCmd_DS_802_11_SUPPLICANT_PROFILE *psup_profile =
1462 		&resp->params.esupplicant_profile;
1463 	MrvlIEtypesHeader_t *head;
1464 	MrvlIEtypes_EncrProto_t *encr_proto_tlv = MNULL;
1465 	MrvlIEtypes_Cipher_t *pcipher_tlv = MNULL;
1466 	mlan_ds_sec_cfg *sec = MNULL;
1467 	t_u8 *tlv;
1468 	int len;
1469 
1470 	ENTER();
1471 
1472 	len = resp->size - S_DS_GEN - sizeof(t_u16);
1473 	tlv = psup_profile->tlv_buf;
1474 	if (pioctl_buf) {
1475 		sec = (mlan_ds_sec_cfg *)pioctl_buf->pbuf;
1476 		while (len > 0) {
1477 			head = (MrvlIEtypesHeader_t *)tlv;
1478 			head->type = wlan_le16_to_cpu(head->type);
1479 			head->len = wlan_le16_to_cpu(head->len);
1480 			switch (head->type) {
1481 			case TLV_TYPE_ENCRYPTION_PROTO:
1482 				encr_proto_tlv =
1483 					(MrvlIEtypes_EncrProto_t *)head;
1484 				sec->param.esupp_mode.rsn_mode =
1485 					wlan_le16_to_cpu(
1486 						encr_proto_tlv->rsn_mode);
1487 				PRINTM(MINFO, "rsn_mode=0x%x\n",
1488 				       sec->param.esupp_mode.rsn_mode);
1489 				break;
1490 			case TLV_TYPE_CIPHER:
1491 				pcipher_tlv = (MrvlIEtypes_Cipher_t *)head;
1492 				sec->param.esupp_mode.act_paircipher =
1493 					pcipher_tlv->pair_cipher;
1494 				sec->param.esupp_mode.act_groupcipher =
1495 					pcipher_tlv->group_cipher;
1496 				PRINTM(MINFO,
1497 				       "paircipher=0x%x, groupcipher=0x%x\n",
1498 				       sec->param.esupp_mode.act_paircipher,
1499 				       sec->param.esupp_mode.act_groupcipher);
1500 				break;
1501 			}
1502 			len -= (head->len - sizeof(MrvlIEtypesHeader_t));
1503 			tlv = tlv + (head->len + sizeof(MrvlIEtypesHeader_t));
1504 		}
1505 	}
1506 
1507 	LEAVE();
1508 	return MLAN_STATUS_SUCCESS;
1509 }
1510 
1511 /**
1512  *  @brief This function handles the command response of rf_channel
1513  *
1514  *  @param pmpriv       A pointer to mlan_private structure
1515  *  @param resp         A pointer to HostCmd_DS_COMMAND
1516  *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
1517  *
1518  *  @return             MLAN_STATUS_SUCCESS
1519  */
wlan_ret_802_11_rf_channel(pmlan_private pmpriv,HostCmd_DS_COMMAND * resp,mlan_ioctl_req * pioctl_buf)1520 static mlan_status wlan_ret_802_11_rf_channel(pmlan_private pmpriv,
1521 					      HostCmd_DS_COMMAND *resp,
1522 					      mlan_ioctl_req *pioctl_buf)
1523 {
1524 	HostCmd_DS_802_11_RF_CHANNEL *prf_channel = &resp->params.rf_channel;
1525 	t_u16 new_channel = wlan_le16_to_cpu(prf_channel->current_channel);
1526 	mlan_ds_bss *bss = MNULL;
1527 
1528 	ENTER();
1529 	if (pmpriv->curr_bss_params.bss_descriptor.channel != new_channel) {
1530 		PRINTM(MINFO, "Channel Switch: %d to %d\n",
1531 		       pmpriv->curr_bss_params.bss_descriptor.channel,
1532 		       new_channel);
1533 		/* Update the channel again */
1534 		pmpriv->curr_bss_params.bss_descriptor.channel = new_channel;
1535 	}
1536 	if (pioctl_buf) {
1537 		bss = (mlan_ds_bss *)pioctl_buf->pbuf;
1538 		bss->param.bss_chan.channel = new_channel;
1539 	}
1540 	LEAVE();
1541 	return MLAN_STATUS_SUCCESS;
1542 }
1543 
1544 /**
1545  *  @brief Handle the ibss_coalescing_status resp
1546  *
1547  *  @param pmpriv       A pointer to mlan_private structure
1548  *  @param resp         A pointer to HostCmd_DS_COMMAND
1549  *
1550  *  @return             MLAN_STATUS_SUCCESS
1551  */
wlan_ret_ibss_coalescing_status(pmlan_private pmpriv,HostCmd_DS_COMMAND * resp)1552 static mlan_status wlan_ret_ibss_coalescing_status(pmlan_private pmpriv,
1553 						   HostCmd_DS_COMMAND *resp)
1554 {
1555 	HostCmd_DS_802_11_IBSS_STATUS *pibss_coal_resp =
1556 		&(resp->params.ibss_coalescing);
1557 	t_u8 zero_mac[MLAN_MAC_ADDR_LENGTH] = {0, 0, 0, 0, 0, 0};
1558 
1559 	ENTER();
1560 
1561 	if (wlan_le16_to_cpu(pibss_coal_resp->action) == HostCmd_ACT_GEN_SET) {
1562 		LEAVE();
1563 		return MLAN_STATUS_SUCCESS;
1564 	}
1565 
1566 	PRINTM(MINFO, "New BSSID " MACSTR "\n",
1567 	       MAC2STR(pibss_coal_resp->bssid));
1568 
1569 	/* If rsp has MNULL BSSID, Just return..... No Action */
1570 	if (!memcmp(pmpriv->adapter, pibss_coal_resp->bssid, zero_mac,
1571 		    MLAN_MAC_ADDR_LENGTH)) {
1572 		PRINTM(MMSG, "New BSSID is MNULL\n");
1573 		LEAVE();
1574 		return MLAN_STATUS_SUCCESS;
1575 	}
1576 
1577 	/* If BSSID is diff, modify current BSS parameters */
1578 	if (memcmp(pmpriv->adapter,
1579 		   pmpriv->curr_bss_params.bss_descriptor.mac_address,
1580 		   pibss_coal_resp->bssid, MLAN_MAC_ADDR_LENGTH)) {
1581 		/* BSSID */
1582 		memcpy_ext(pmpriv->adapter,
1583 			   pmpriv->curr_bss_params.bss_descriptor.mac_address,
1584 			   pibss_coal_resp->bssid, MLAN_MAC_ADDR_LENGTH,
1585 			   sizeof(pmpriv->curr_bss_params.bss_descriptor
1586 					  .mac_address));
1587 
1588 		/* Beacon Interval and ATIM window */
1589 		pmpriv->curr_bss_params.bss_descriptor.beacon_period =
1590 			wlan_le16_to_cpu(pibss_coal_resp->beacon_interval);
1591 		pmpriv->curr_bss_params.bss_descriptor.atim_window =
1592 			wlan_le16_to_cpu(pibss_coal_resp->atim_window);
1593 
1594 		/* ERP Information */
1595 		pmpriv->curr_bss_params.bss_descriptor.erp_flags =
1596 			(t_u8)wlan_le16_to_cpu(
1597 				pibss_coal_resp->use_g_rate_protect);
1598 
1599 		pmpriv->adhoc_state = ADHOC_COALESCED;
1600 	}
1601 
1602 	LEAVE();
1603 	return MLAN_STATUS_SUCCESS;
1604 }
1605 
1606 /**
1607  *  @brief This function handles the command response of MGMT_IE_LIST
1608  *
1609  *  @param pmpriv       A pointer to mlan_private structure
1610  *  @param resp         A pointer to HostCmd_DS_COMMAND
1611  *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
1612  *
1613  *  @return             MLAN_STATUS_SUCCESS
1614  */
wlan_ret_mgmt_ie_list(pmlan_private pmpriv,HostCmd_DS_COMMAND * resp,mlan_ioctl_req * pioctl_buf)1615 static mlan_status wlan_ret_mgmt_ie_list(pmlan_private pmpriv,
1616 					 HostCmd_DS_COMMAND *resp,
1617 					 mlan_ioctl_req *pioctl_buf)
1618 {
1619 	t_u16 resp_len = 0, travel_len = 0;
1620 	int i = 0;
1621 	mlan_ds_misc_cfg *misc = MNULL;
1622 	mlan_ds_misc_custom_ie *cust_ie = MNULL;
1623 	custom_ie *cptr;
1624 	tlvbuf_max_mgmt_ie *max_mgmt_ie = MNULL;
1625 	HostCmd_DS_MGMT_IE_LIST_CFG *pmgmt_ie_list =
1626 		&(resp->params.mgmt_ie_list);
1627 
1628 	ENTER();
1629 
1630 	if (wlan_le16_to_cpu(pmgmt_ie_list->action) == HostCmd_ACT_GEN_SET) {
1631 		if ((pmpriv->adapter->state_rdh.stage == RDH_SET_CUSTOM_IE) ||
1632 		    (pmpriv->adapter->state_rdh.stage == RDH_REM_CUSTOM_IE))
1633 			if (!pmpriv->adapter->ecsa_enable)
1634 				wlan_11h_radar_detected_callback(
1635 					(t_void *)pmpriv);
1636 		LEAVE();
1637 		return MLAN_STATUS_SUCCESS;
1638 	}
1639 
1640 	misc = (mlan_ds_misc_cfg *)pioctl_buf->pbuf;
1641 	cust_ie = (mlan_ds_misc_custom_ie *)&pmgmt_ie_list->ds_mgmt_ie;
1642 	if (cust_ie) {
1643 		cust_ie->type = wlan_le16_to_cpu(cust_ie->type);
1644 		resp_len = cust_ie->len = wlan_le16_to_cpu(cust_ie->len);
1645 		travel_len = 0;
1646 		/* conversion for index, mask, len */
1647 		if (resp_len == sizeof(t_u16))
1648 			cust_ie->ie_data_list[0].ie_index = wlan_cpu_to_le16(
1649 				cust_ie->ie_data_list[0].ie_index);
1650 
1651 		while (resp_len > sizeof(t_u16)) {
1652 			cptr = (custom_ie *)(((t_u8 *)cust_ie->ie_data_list) +
1653 					     travel_len);
1654 			cptr->ie_index = wlan_le16_to_cpu(cptr->ie_index);
1655 			cptr->mgmt_subtype_mask =
1656 				wlan_le16_to_cpu(cptr->mgmt_subtype_mask);
1657 			cptr->ie_length = wlan_le16_to_cpu(cptr->ie_length);
1658 			travel_len += cptr->ie_length + sizeof(custom_ie) -
1659 				      MAX_IE_SIZE;
1660 			resp_len -= cptr->ie_length + sizeof(custom_ie) -
1661 				    MAX_IE_SIZE;
1662 		}
1663 		memcpy_ext(pmpriv->adapter, &misc->param.cust_ie, cust_ie,
1664 			   (cust_ie->len + sizeof(MrvlIEtypesHeader_t)),
1665 			   sizeof(misc->param.cust_ie));
1666 		max_mgmt_ie =
1667 			(tlvbuf_max_mgmt_ie *)((t_u8 *)cust_ie + cust_ie->len +
1668 					       sizeof(MrvlIEtypesHeader_t));
1669 		if (max_mgmt_ie) {
1670 			max_mgmt_ie->type = wlan_le16_to_cpu(max_mgmt_ie->type);
1671 			if (max_mgmt_ie->type == TLV_TYPE_MAX_MGMT_IE) {
1672 				max_mgmt_ie->len =
1673 					wlan_le16_to_cpu(max_mgmt_ie->len);
1674 				max_mgmt_ie->count =
1675 					wlan_le16_to_cpu(max_mgmt_ie->count);
1676 				for (i = 0; i < max_mgmt_ie->count; i++) {
1677 					max_mgmt_ie->info[i]
1678 						.buf_size = wlan_le16_to_cpu(
1679 						max_mgmt_ie->info[i].buf_size);
1680 					max_mgmt_ie->info[i]
1681 						.buf_count = wlan_le16_to_cpu(
1682 						max_mgmt_ie->info[i].buf_count);
1683 				}
1684 				/* Append max_mgmt_ie TLV after custom_ie */
1685 				memcpy_ext(
1686 					pmpriv->adapter,
1687 					(t_u8 *)&misc->param.cust_ie +
1688 						(cust_ie->len +
1689 						 sizeof(MrvlIEtypesHeader_t)),
1690 					max_mgmt_ie,
1691 					max_mgmt_ie->len +
1692 						sizeof(MrvlIEtypesHeader_t),
1693 					sizeof(misc->param.cust_ie) -
1694 						(cust_ie->len +
1695 						 sizeof(MrvlIEtypesHeader_t)));
1696 			}
1697 		}
1698 	}
1699 
1700 	LEAVE();
1701 	return MLAN_STATUS_SUCCESS;
1702 }
1703 
1704 /**
1705  *  @brief This function enable/disable tdls powermode
1706  *
1707  *  @param pmpriv       A pointer to mlan_private structure
1708  *  @param powermode    1--enable, 0--disable
1709  *
1710  *  @return             N/A
1711  */
wlan_set_tdls_powermode(pmlan_private pmpriv,t_u8 powermode)1712 static void wlan_set_tdls_powermode(pmlan_private pmpriv, t_u8 powermode)
1713 {
1714 	ENTER();
1715 
1716 	if (powermode) {
1717 		pmpriv->wmm_qosinfo = DEFAULT_TDLS_WMM_QOS_INFO;
1718 		if (!pmpriv->adapter->sleep_period.period)
1719 			pmpriv->adapter->sleep_period.period =
1720 				DEFAULT_TDLS_SLEEP_PERIOD;
1721 	} else {
1722 		pmpriv->wmm_qosinfo = pmpriv->saved_wmm_qosinfo;
1723 		pmpriv->adapter->sleep_period.period =
1724 			pmpriv->adapter->saved_sleep_period.period;
1725 	}
1726 	pmpriv->adapter->pps_uapsd_mode = MFALSE;
1727 	if ((pmpriv->adapter->sleep_period.period != 0) &&
1728 	    (pmpriv->adapter->sleep_period.period !=
1729 	     SLEEP_PERIOD_RESERVED_FF)) {
1730 		pmpriv->adapter->gen_null_pkt = MTRUE;
1731 	} else {
1732 		pmpriv->adapter->delay_null_pkt = MFALSE;
1733 		pmpriv->adapter->gen_null_pkt = MFALSE;
1734 	}
1735 	LEAVE();
1736 	return;
1737 }
1738 
1739 /**
1740  *  @brief This function handles the command response of TDLS_CONFIG
1741  *
1742  *  @param pmpriv       A pointer to mlan_private structure
1743  *  @param resp         A pointer to HostCmd_DS_COMMAND
1744  *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
1745  *
1746  *  @return             MLAN_STATUS_SUCCESS or MLAN_STATUS_FAILURE
1747  */
wlan_ret_tdls_config(pmlan_private pmpriv,HostCmd_DS_COMMAND * resp,mlan_ioctl_req * pioctl_buf)1748 static mlan_status wlan_ret_tdls_config(pmlan_private pmpriv,
1749 					HostCmd_DS_COMMAND *resp,
1750 					mlan_ioctl_req *pioctl_buf)
1751 {
1752 	t_u8 i = 0;
1753 	t_u16 link_length = 0, final_data_rate = 0;
1754 	mlan_ds_misc_cfg *misc = MNULL;
1755 	tdls_all_config *tdls_all_cfg = MNULL;
1756 	sta_node *sta_ptr = MNULL;
1757 	HostCmd_DS_TDLS_CONFIG *ptdls_config_data =
1758 		&(resp->params.tdls_config_data);
1759 	pmlan_adapter pmadapter = pmpriv->adapter;
1760 	tdls_each_link_status *link_ptr = MNULL;
1761 
1762 	ENTER();
1763 
1764 	ptdls_config_data->tdls_info.tdls_action =
1765 		wlan_le16_to_cpu(ptdls_config_data->tdls_info.tdls_action);
1766 	switch (ptdls_config_data->tdls_info.tdls_action) {
1767 	case WLAN_TDLS_CONFIG:
1768 		misc = (mlan_ds_misc_cfg *)pioctl_buf->pbuf;
1769 		tdls_all_cfg = (tdls_all_config *)
1770 				       ptdls_config_data->tdls_info.tdls_data;
1771 		if (pmpriv->host_tdls_cs_support ||
1772 		    pmpriv->host_tdls_uapsd_support)
1773 			break;
1774 		if (wlan_le16_to_cpu(tdls_all_cfg->u.tdls_config.enable) == 0) {
1775 			PRINTM(MINFO, "TDLS disable successful.\n");
1776 			wlan_delete_station_list(pmpriv);
1777 			pmadapter->tdls_status = TDLS_NOT_SETUP;
1778 			if (pmpriv->saved_wmm_qosinfo)
1779 				pmpriv->wmm_qosinfo = pmpriv->saved_wmm_qosinfo;
1780 			if (pmadapter->saved_sleep_period.period)
1781 				pmadapter->sleep_period.period =
1782 					pmadapter->saved_sleep_period.period;
1783 		}
1784 		break;
1785 
1786 	case WLAN_TDLS_SET_INFO:
1787 		break;
1788 
1789 	case WLAN_TDLS_DISCOVERY_REQ:
1790 		misc = (mlan_ds_misc_cfg *)pioctl_buf->pbuf;
1791 		tdls_all_cfg = (tdls_all_config *)
1792 				       ptdls_config_data->tdls_info.tdls_data;
1793 		tdls_all_cfg->u.tdls_discovery_resp.payload_len =
1794 			wlan_le16_to_cpu(
1795 				tdls_all_cfg->u.tdls_discovery_resp.payload_len);
1796 		tdls_all_cfg->u.tdls_discovery_resp.cap_info = wlan_le16_to_cpu(
1797 			tdls_all_cfg->u.tdls_discovery_resp.cap_info);
1798 		memcpy_ext(pmpriv->adapter, &misc->param.tdls_config,
1799 			   &ptdls_config_data->tdls_info,
1800 			   (resp->size - S_DS_GEN),
1801 			   sizeof(mlan_ds_misc_tdls_config));
1802 		PRINTM(MCMND, "TDLS_DISCOVERY_REQ: " MACSTR "\n",
1803 		       MAC2STR(tdls_all_cfg->u.tdls_discovery_resp
1804 				       .peer_mac_addr));
1805 		break;
1806 
1807 	case WLAN_TDLS_SETUP_REQ:
1808 		/*
1809 		 * TDLS link being setup, block all data for this Peer
1810 		 */
1811 		tdls_all_cfg = (tdls_all_config *)
1812 				       ptdls_config_data->tdls_info.tdls_data;
1813 		PRINTM(MCMND, "TDLS_SETUP_REQ: " MACSTR "\n",
1814 		       MAC2STR(tdls_all_cfg->u.tdls_setup.peer_mac_addr));
1815 		sta_ptr = wlan_get_station_entry(
1816 			pmpriv, tdls_all_cfg->u.tdls_setup.peer_mac_addr);
1817 		if (!sta_ptr) {
1818 			sta_ptr = wlan_add_station_entry(
1819 				pmpriv,
1820 				tdls_all_cfg->u.tdls_setup.peer_mac_addr);
1821 			if (sta_ptr) {
1822 				sta_ptr->status = TDLS_SETUP_INPROGRESS;
1823 				wlan_hold_tdls_packets(
1824 					pmpriv, tdls_all_cfg->u.tdls_setup
1825 							.peer_mac_addr);
1826 			}
1827 		}
1828 		break;
1829 
1830 	case WLAN_TDLS_TEAR_DOWN_REQ:
1831 		/*
1832 		 * TDLS link torn down, open data ports if blocked
1833 		 */
1834 		tdls_all_cfg = (tdls_all_config *)
1835 				       ptdls_config_data->tdls_info.tdls_data;
1836 		wlan_restore_tdls_packets(
1837 			pmpriv, tdls_all_cfg->u.tdls_tear_down.peer_mac_addr,
1838 			TDLS_TEAR_DOWN);
1839 		PRINTM(MCMND, "TDLS_TEARDOWN_REQ: " MACSTR "\n",
1840 		       MAC2STR(tdls_all_cfg->u.tdls_tear_down.peer_mac_addr));
1841 		sta_ptr = wlan_get_station_entry(
1842 			pmpriv, tdls_all_cfg->u.tdls_tear_down.peer_mac_addr);
1843 		if (sta_ptr) {
1844 			if (sta_ptr->is_11n_enabled ||
1845 			    sta_ptr->is_11ax_enabled) {
1846 				wlan_cleanup_reorder_tbl(
1847 					pmpriv, tdls_all_cfg->u.tdls_tear_down
1848 							.peer_mac_addr);
1849 				wlan_11n_cleanup_txbastream_tbl(
1850 					pmpriv, tdls_all_cfg->u.tdls_tear_down
1851 							.peer_mac_addr);
1852 			}
1853 			wlan_delete_station_entry(
1854 				pmpriv,
1855 				tdls_all_cfg->u.tdls_tear_down.peer_mac_addr);
1856 			if (MTRUE == wlan_is_station_list_empty(pmpriv))
1857 				pmadapter->tdls_status = TDLS_NOT_SETUP;
1858 			else
1859 				pmadapter->tdls_status = TDLS_IN_BASE_CHANNEL;
1860 		}
1861 		break;
1862 	case WLAN_TDLS_INIT_CHAN_SWITCH:
1863 		tdls_all_cfg = (tdls_all_config *)
1864 				       ptdls_config_data->tdls_info.tdls_data;
1865 		PRINTM(MCMND,
1866 		       "TDLS_INIT_CHANNEL_SWITCH: " MACSTR
1867 		       " chan=%d periodicity=%d\n",
1868 		       MAC2STR(tdls_all_cfg->u.tdls_chan_switch.peer_mac_addr),
1869 		       (int)tdls_all_cfg->u.tdls_chan_switch.primary_channel,
1870 		       (int)tdls_all_cfg->u.tdls_chan_switch.periodicity);
1871 		break;
1872 
1873 	case WLAN_TDLS_LINK_STATUS:
1874 		misc = (mlan_ds_misc_cfg *)pioctl_buf->pbuf;
1875 		tdls_all_cfg = (tdls_all_config *)
1876 				       ptdls_config_data->tdls_info.tdls_data;
1877 		tdls_all_cfg->u.tdls_link_status_resp.payload_len =
1878 			wlan_le16_to_cpu(tdls_all_cfg->u.tdls_link_status_resp
1879 						 .payload_len);
1880 		link_ptr = tdls_all_cfg->u.tdls_link_status_resp.link_stats;
1881 		for (i = 0;
1882 		     i < tdls_all_cfg->u.tdls_link_status_resp.active_links;
1883 		     i++) {
1884 			link_ptr->active_channel =
1885 				wlan_le32_to_cpu(link_ptr->active_channel);
1886 			link_ptr->data_rssi_last =
1887 				wlan_le16_to_cpu(link_ptr->data_rssi_last);
1888 			link_ptr->data_nf_last =
1889 				wlan_le16_to_cpu(link_ptr->data_nf_last);
1890 			link_ptr->data_rssi_avg =
1891 				wlan_le16_to_cpu(link_ptr->data_rssi_avg);
1892 			link_ptr->data_nf_avg =
1893 				wlan_le16_to_cpu(link_ptr->data_nf_avg);
1894 			link_length = sizeof(tdls_each_link_status) - 1;
1895 			/* adjust as per open or secure network */
1896 			if (link_ptr->link_flags & 0x02) {
1897 				link_ptr->key_lifetime = wlan_le32_to_cpu(
1898 					link_ptr->key_lifetime);
1899 				link_length += link_ptr->key_length;
1900 			} else {
1901 				link_length -=
1902 					sizeof(link_ptr->security_method) +
1903 					sizeof(link_ptr->key_lifetime) +
1904 					sizeof(link_ptr->key_length);
1905 			}
1906 			final_data_rate = (t_u16)wlan_index_to_data_rate(
1907 				pmadapter, link_ptr->u.rate_info.tx_data_rate,
1908 				link_ptr->u.rate_info.tx_rate_htinfo, 0);
1909 			link_ptr->u.final_data_rate = final_data_rate / 2;
1910 
1911 			link_ptr =
1912 				(tdls_each_link_status *)(((t_u8 *)link_ptr) +
1913 							  link_length);
1914 		}
1915 		memcpy_ext(pmpriv->adapter, &misc->param.tdls_config,
1916 			   &ptdls_config_data->tdls_info,
1917 			   (resp->size - S_DS_GEN),
1918 			   sizeof(mlan_ds_misc_tdls_config));
1919 		break;
1920 	case WLAN_TDLS_POWER_MODE:
1921 		misc = (mlan_ds_misc_cfg *)pioctl_buf->pbuf;
1922 		tdls_all_cfg = (tdls_all_config *)
1923 				       ptdls_config_data->tdls_info.tdls_data;
1924 		tdls_all_cfg->u.tdls_power_mode.power_mode = wlan_le16_to_cpu(
1925 			tdls_all_cfg->u.tdls_power_mode.power_mode);
1926 		wlan_set_tdls_powermode(
1927 			pmpriv,
1928 			(t_u8)tdls_all_cfg->u.tdls_power_mode.power_mode);
1929 		break;
1930 	case WLAN_TDLS_STOP_CHAN_SWITCH:
1931 		tdls_all_cfg = (tdls_all_config *)
1932 				       ptdls_config_data->tdls_info.tdls_data;
1933 		PRINTM(MCMND, "TDLS_STOP_CHANNEL_SWITCH: " MACSTR "\n",
1934 		       MAC2STR(tdls_all_cfg->u.tdls_stop_chan_switch
1935 				       .peer_mac_addr));
1936 		break;
1937 	case WLAN_TDLS_CS_PARAMS:
1938 	case WLAN_TDLS_CS_DISABLE:
1939 	case WLAN_TDLS_DEBUG_STOP_RX:
1940 	case WLAN_TDLS_DEBUG_ALLOW_WEAK_SECURITY:
1941 	case WLAN_TDLS_DEBUG_SETUP_SAME_LINK:
1942 	case WLAN_TDLS_DEBUG_FAIL_SETUP_CONFIRM:
1943 	case WLAN_TDLS_DEBUG_WRONG_BSS:
1944 	case WLAN_TDLS_DEBUG_SETUP_PROHIBITED:
1945 	case WLAN_TDLS_DEBUG_HIGHER_LOWER_MAC:
1946 	case WLAN_TDLS_DEBUG_IGNORE_KEY_EXPIRY:
1947 	case WLAN_TDLS_DEBUG_CS_RET_IM:
1948 		break;
1949 	default:
1950 		if (pioctl_buf)
1951 			pioctl_buf->status_code = MLAN_ERROR_CMD_RESP_FAIL;
1952 		LEAVE();
1953 		return MLAN_STATUS_FAILURE;
1954 	}
1955 
1956 	LEAVE();
1957 	return MLAN_STATUS_SUCCESS;
1958 }
1959 
1960 /**
1961  *  @brief This function handles the command response of TDLS_OPERATION
1962  *
1963  *  @param pmpriv       A pointer to mlan_private structure
1964  *  @param resp         A pointer to HostCmd_DS_COMMAND
1965  *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
1966  *
1967  *  @return             MLAN_STATUS_SUCCESS or MLAN_STATUS_FAILURE
1968  */
wlan_ret_tdls_oper(pmlan_private pmpriv,HostCmd_DS_COMMAND * resp,mlan_ioctl_req * pioctl_buf)1969 static mlan_status wlan_ret_tdls_oper(pmlan_private pmpriv,
1970 				      HostCmd_DS_COMMAND *resp,
1971 				      mlan_ioctl_req *pioctl_buf)
1972 {
1973 	HostCmd_DS_TDLS_OPER *ptdls_oper = &(resp->params.tdls_oper_data);
1974 	sta_node *sta_ptr = MNULL;
1975 	t_u16 reason = 0;
1976 	pmlan_adapter pmadapter = pmpriv->adapter;
1977 
1978 	ENTER();
1979 
1980 	ptdls_oper->tdls_action = wlan_le16_to_cpu(ptdls_oper->tdls_action);
1981 
1982 	sta_ptr = wlan_get_station_entry(pmpriv, ptdls_oper->peer_mac);
1983 	reason = wlan_le16_to_cpu(ptdls_oper->reason);
1984 	switch (ptdls_oper->tdls_action) {
1985 	case TDLS_CREATE:
1986 		if (reason) {
1987 			PRINTM(MMSG,
1988 			       "TDLS: create link " MACSTR " fail, reason=%d\n",
1989 			       MAC2STR(ptdls_oper->peer_mac), reason);
1990 			if (reason != TDLS_LINK_EXISTS && sta_ptr)
1991 				sta_ptr->status = TDLS_SETUP_FAILURE;
1992 		} else {
1993 			PRINTM(MMSG, "TDLS: create link " MACSTR " success\n",
1994 			       MAC2STR(ptdls_oper->peer_mac), reason);
1995 		}
1996 		break;
1997 	case TDLS_CONFIG:
1998 		if (reason) {
1999 			PRINTM(MMSG,
2000 			       "TDLS: Config link " MACSTR " fail, reason=%d\n",
2001 			       MAC2STR(ptdls_oper->peer_mac), reason);
2002 			if (sta_ptr)
2003 				sta_ptr->status = TDLS_SETUP_FAILURE;
2004 		} else {
2005 			PRINTM(MMSG, "TDLS: Config link " MACSTR " success\n",
2006 			       MAC2STR(ptdls_oper->peer_mac));
2007 		}
2008 		break;
2009 	case TDLS_DELETE:
2010 		wlan_restore_tdls_packets(pmpriv, ptdls_oper->peer_mac,
2011 					  TDLS_TEAR_DOWN);
2012 		if (sta_ptr) {
2013 			/**tdls cs stop*/
2014 			if (ISSUPP_EXTCAP_TDLS_CHAN_SWITCH(
2015 				    sta_ptr->ExtCap.ext_cap))
2016 				wlan_tdls_config(pmpriv, MFALSE);
2017 			if (sta_ptr->is_11n_enabled ||
2018 			    sta_ptr->is_11ax_enabled) {
2019 				wlan_cleanup_reorder_tbl(pmpriv,
2020 							 ptdls_oper->peer_mac);
2021 				wlan_11n_cleanup_txbastream_tbl(
2022 					pmpriv, ptdls_oper->peer_mac);
2023 			}
2024 			if (sta_ptr->status >= TDLS_SETUP_INPROGRESS)
2025 				wlan_delete_station_entry(pmpriv,
2026 							  ptdls_oper->peer_mac);
2027 		}
2028 		if (MTRUE == wlan_is_station_list_empty(pmpriv))
2029 			pmadapter->tdls_status = TDLS_NOT_SETUP;
2030 		else
2031 			pmadapter->tdls_status = TDLS_IN_BASE_CHANNEL;
2032 
2033 		if (reason)
2034 			PRINTM(MMSG,
2035 			       "TDLS: Delete link " MACSTR " fail, reason=%d\n",
2036 			       MAC2STR(ptdls_oper->peer_mac), reason);
2037 		else
2038 			PRINTM(MMSG, "TDLS: Delete link " MACSTR " success\n",
2039 			       MAC2STR(ptdls_oper->peer_mac));
2040 		break;
2041 	default:
2042 		break;
2043 	}
2044 
2045 	LEAVE();
2046 	return MLAN_STATUS_SUCCESS;
2047 }
2048 
2049 /**
2050  *  @brief This function handles the command response of sysclock
2051  *
2052  *  @param pmpriv       A pointer to mlan_private structure
2053  *  @param resp         A pointer to HostCmd_DS_COMMAND
2054  *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
2055  *
2056  *  @return        MLAN_STATUS_SUCCESS
2057  */
wlan_ret_sysclock_cfg(pmlan_private pmpriv,HostCmd_DS_COMMAND * resp,mlan_ioctl_req * pioctl_buf)2058 static mlan_status wlan_ret_sysclock_cfg(pmlan_private pmpriv,
2059 					 HostCmd_DS_COMMAND *resp,
2060 					 mlan_ioctl_req *pioctl_buf)
2061 {
2062 	mlan_ds_misc_cfg *mis_ccfg = MNULL;
2063 	HostCmd_DS_ECL_SYSTEM_CLOCK_CONFIG *clk_cfg =
2064 		&resp->params.sys_clock_cfg;
2065 	int i = 0;
2066 
2067 	ENTER();
2068 
2069 	if (pioctl_buf) {
2070 		mis_ccfg = (mlan_ds_misc_cfg *)pioctl_buf->pbuf;
2071 		mis_ccfg->param.sys_clock.cur_sys_clk =
2072 			wlan_le16_to_cpu(clk_cfg->cur_sys_clk);
2073 		mis_ccfg->param.sys_clock.sys_clk_type =
2074 			wlan_le16_to_cpu(clk_cfg->sys_clk_type);
2075 		mis_ccfg->param.sys_clock.sys_clk_num =
2076 			wlan_le16_to_cpu(clk_cfg->sys_clk_len) / sizeof(t_u16);
2077 		for (i = 0; i < mis_ccfg->param.sys_clock.sys_clk_num; i++)
2078 			mis_ccfg->param.sys_clock.sys_clk[i] =
2079 				wlan_le16_to_cpu(clk_cfg->sys_clk[i]);
2080 	}
2081 
2082 	LEAVE();
2083 	return MLAN_STATUS_SUCCESS;
2084 }
2085 
2086 /**
2087  *  @brief This function handles the command response of inactivity timeout
2088  *
2089  *  @param pmpriv       A pointer to mlan_private structure
2090  *  @param resp         A pointer to HostCmd_DS_COMMAND
2091  *  @param pioctl_buf   A pointer to command buffer
2092  *
2093  *  @return             MLAN_STATUS_SUCCESS
2094  */
wlan_ret_inactivity_timeout(pmlan_private pmpriv,HostCmd_DS_COMMAND * resp,mlan_ioctl_req * pioctl_buf)2095 static mlan_status wlan_ret_inactivity_timeout(pmlan_private pmpriv,
2096 					       HostCmd_DS_COMMAND *resp,
2097 					       mlan_ioctl_req *pioctl_buf)
2098 {
2099 	mlan_ds_pm_cfg *pmcfg = MNULL;
2100 	mlan_ds_inactivity_to *inac_to = MNULL;
2101 	HostCmd_DS_INACTIVITY_TIMEOUT_EXT *cmd_inac_to =
2102 		(HostCmd_DS_INACTIVITY_TIMEOUT_EXT *)&resp->params.inactivity_to;
2103 
2104 	ENTER();
2105 
2106 	if (pioctl_buf) {
2107 		pmcfg = (mlan_ds_pm_cfg *)pioctl_buf->pbuf;
2108 		inac_to = &pmcfg->param.inactivity_to;
2109 		inac_to->timeout_unit =
2110 			wlan_le16_to_cpu(cmd_inac_to->timeout_unit);
2111 		inac_to->unicast_timeout =
2112 			wlan_le16_to_cpu(cmd_inac_to->unicast_timeout);
2113 		inac_to->mcast_timeout =
2114 			wlan_le16_to_cpu(cmd_inac_to->mcast_timeout);
2115 		inac_to->ps_entry_timeout =
2116 			wlan_le16_to_cpu(cmd_inac_to->ps_entry_timeout);
2117 	}
2118 
2119 	LEAVE();
2120 	return MLAN_STATUS_SUCCESS;
2121 }
2122 
2123 /**
2124  *  @brief This function handles the command response of
2125  *  network monitor
2126  *
2127  *  @param pmpriv       A pointer to mlan_private structure
2128  *  @param resp         A pointer to HostCmd_DS_COMMAND
2129  *  @param pioctl_buf   A pointer to command buffer
2130  *
2131  *  @return             MLAN_STATUS_SUCCESS
2132  */
wlan_ret_net_monitor(pmlan_private pmpriv,HostCmd_DS_COMMAND * resp,mlan_ioctl_req * pioctl_buf)2133 mlan_status wlan_ret_net_monitor(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
2134 				 mlan_ioctl_req *pioctl_buf)
2135 {
2136 	mlan_ds_misc_cfg *pmisc = MNULL;
2137 	mlan_ds_misc_net_monitor *net_mon = MNULL;
2138 	HostCmd_DS_802_11_NET_MONITOR *cmd_net_mon =
2139 		(HostCmd_DS_802_11_NET_MONITOR *)&resp->params.net_mon;
2140 	ChanBandParamSet_t *pchan_band = MNULL;
2141 	t_u16 band_info = 0;
2142 
2143 	ENTER();
2144 
2145 	if (pioctl_buf && (pioctl_buf->action == MLAN_ACT_GET)) {
2146 		pmisc = (mlan_ds_misc_cfg *)pioctl_buf->pbuf;
2147 		net_mon = &pmisc->param.net_mon;
2148 		net_mon->enable_net_mon =
2149 			wlan_le16_to_cpu(cmd_net_mon->enable_net_mon);
2150 		net_mon->filter_flag =
2151 			wlan_le16_to_cpu(cmd_net_mon->filter_flag);
2152 		pchan_band = &cmd_net_mon->monitor_chan.chan_band_param[0];
2153 		/* Band information in the TLV is bits[1:0] */
2154 		band_info = pchan_band->bandcfg.chanBand;
2155 		net_mon->channel = pchan_band->chan_number;
2156 		if (band_info == BAND_2GHZ)
2157 			net_mon->band |= (BAND_B | BAND_G);
2158 		if (band_info == BAND_5GHZ)
2159 			net_mon->band |= BAND_A;
2160 		net_mon->chan_bandwidth =
2161 			GET_SECONDARYCHAN(pchan_band->bandcfg.chan2Offset);
2162 		if (band_info == BAND_2GHZ)
2163 			net_mon->band |= BAND_GN;
2164 		if (band_info == BAND_5GHZ)
2165 			net_mon->band |= BAND_AN;
2166 		if (band_info == BAND_2GHZ)
2167 			net_mon->band |= BAND_GAC;
2168 		if (band_info == BAND_5GHZ)
2169 			net_mon->band |= BAND_AAC;
2170 	}
2171 	pmpriv->adapter->enable_net_mon =
2172 		wlan_le16_to_cpu(cmd_net_mon->enable_net_mon);
2173 
2174 	LEAVE();
2175 	return MLAN_STATUS_SUCCESS;
2176 }
2177 
2178 /**
2179  *  @brief This function handles the command response of
2180  *  subscribe event
2181  *
2182  *  @param pmpriv       A pointer to mlan_private structure
2183  *  @param resp         A pointer to HostCmd_DS_COMMAND
2184  *  @param pioctl_buf   A pointer to command buffer
2185  *
2186  *  @return             MLAN_STATUS_SUCCESS
2187  */
wlan_ret_subscribe_event(pmlan_private pmpriv,HostCmd_DS_COMMAND * resp,mlan_ioctl_req * pioctl_buf)2188 static mlan_status wlan_ret_subscribe_event(pmlan_private pmpriv,
2189 					    HostCmd_DS_COMMAND *resp,
2190 					    mlan_ioctl_req *pioctl_buf)
2191 {
2192 	HostCmd_DS_SUBSCRIBE_EVENT *evt =
2193 		(HostCmd_DS_SUBSCRIBE_EVENT *)&resp->params.subscribe_event;
2194 	mlan_ds_subscribe_evt *sub_evt = MNULL;
2195 	mlan_ds_misc_cfg *misc = MNULL;
2196 
2197 	ENTER();
2198 	if (pioctl_buf && (pioctl_buf->action == MLAN_ACT_GET)) {
2199 		misc = (mlan_ds_misc_cfg *)pioctl_buf->pbuf;
2200 		sub_evt = &misc->param.subscribe_event;
2201 		sub_evt->evt_bitmap = wlan_le16_to_cpu(evt->event_bitmap);
2202 		pioctl_buf->data_read_written = sizeof(mlan_ds_misc_cfg);
2203 	}
2204 	LEAVE();
2205 	return MLAN_STATUS_SUCCESS;
2206 }
2207 
2208 /**
2209  *  @brief This function handles the command response of
2210  *  OTP user data
2211  *
2212  *  @param pmpriv       A pointer to mlan_private structure
2213  *  @param resp         A pointer to HostCmd_DS_COMMAND
2214  *  @param pioctl_buf   A pointer to command buffer
2215  *
2216  *  @return             MLAN_STATUS_SUCCESS
2217  */
wlan_ret_otp_user_data(pmlan_private pmpriv,HostCmd_DS_COMMAND * resp,mlan_ioctl_req * pioctl_buf)2218 static mlan_status wlan_ret_otp_user_data(pmlan_private pmpriv,
2219 					  HostCmd_DS_COMMAND *resp,
2220 					  mlan_ioctl_req *pioctl_buf)
2221 {
2222 	HostCmd_DS_OTP_USER_DATA *cmd_user_data =
2223 		(HostCmd_DS_OTP_USER_DATA *)&resp->params.otp_user_data;
2224 	mlan_ds_misc_otp_user_data *user_data = MNULL;
2225 
2226 	ENTER();
2227 	if (pioctl_buf && (pioctl_buf->action == MLAN_ACT_GET)) {
2228 		user_data = (mlan_ds_misc_otp_user_data *)pioctl_buf->pbuf;
2229 		user_data->user_data_length =
2230 			MIN(MAX_OTP_USER_DATA_LEN,
2231 			    wlan_le16_to_cpu(cmd_user_data->user_data_length));
2232 		memcpy_ext(pmpriv->adapter, user_data->user_data,
2233 			   cmd_user_data->user_data,
2234 			   user_data->user_data_length,
2235 			   sizeof(user_data->user_data));
2236 		pioctl_buf->data_read_written =
2237 			sizeof(mlan_ds_misc_otp_user_data) +
2238 			user_data->user_data_length;
2239 	}
2240 	LEAVE();
2241 	return MLAN_STATUS_SUCCESS;
2242 }
2243 
2244 /**
2245  *  @brief This function handles the command response of
2246  *  fw auto re-connect
2247  *
2248  *  @param pmpriv       A pointer to mlan_private structure
2249  *  @param resp         A pointer to HostCmd_DS_COMMAND
2250  *  @param pioctl_buf   A pointer to command buffer
2251  *
2252  *  @return             MLAN_STATUS_SUCCESS
2253  */
wlan_ret_fw_auto_reconnect(pmlan_private pmpriv,HostCmd_DS_COMMAND * resp,mlan_ioctl_req * pioctl_buf)2254 static mlan_status wlan_ret_fw_auto_reconnect(pmlan_private pmpriv,
2255 					      HostCmd_DS_COMMAND *resp,
2256 					      mlan_ioctl_req *pioctl_buf)
2257 {
2258 	HostCmd_DS_FW_AUTO_RECONNECT *fw_auto_reconnect =
2259 		(HostCmd_DS_FW_AUTO_RECONNECT *)&resp->params
2260 			.fw_auto_reconnect_cmd;
2261 	mlan_ds_misc_cfg *misc = MNULL;
2262 
2263 	ENTER();
2264 
2265 	if (pioctl_buf && (pioctl_buf->action == MLAN_ACT_GET)) {
2266 		misc = (mlan_ds_misc_cfg *)pioctl_buf->pbuf;
2267 		misc->param.fw_auto_reconnect.fw_reconn_counter =
2268 			fw_auto_reconnect->reconnect_counter;
2269 		misc->param.fw_auto_reconnect.fw_reconn_interval =
2270 			fw_auto_reconnect->reconnect_interval;
2271 		misc->param.fw_auto_reconnect.fw_reconn_flags =
2272 			wlan_le16_to_cpu(fw_auto_reconnect->flags);
2273 		pioctl_buf->data_read_written = sizeof(mlan_ds_misc_cfg);
2274 	}
2275 
2276 	LEAVE();
2277 	return MLAN_STATUS_SUCCESS;
2278 }
2279 
2280 #ifdef USB
2281 /**
2282  *  @brief This function handles the command response of
2283  *  packet aggregation
2284  *
2285  *  @param pmpriv       A pointer to mlan_private structure
2286  *  @param resp         A pointer to HostCmd_DS_COMMAND
2287  *  @param pioctl_buf   A pointer to command buffer
2288  *
2289  *  @return             MLAN_STATUS_SUCCESS
2290  */
2291 static mlan_status
wlan_ret_packet_aggr_over_host_interface(pmlan_private pmpriv,HostCmd_DS_COMMAND * resp,mlan_ioctl_req * pioctl_buf)2292 wlan_ret_packet_aggr_over_host_interface(pmlan_private pmpriv,
2293 					 HostCmd_DS_COMMAND *resp,
2294 					 mlan_ioctl_req *pioctl_buf)
2295 {
2296 	mlan_ds_misc_cfg *misc = MNULL;
2297 	HostCmd_DS_PACKET_AGGR_OVER_HOST_INTERFACE *packet_aggr =
2298 		(HostCmd_DS_PACKET_AGGR_OVER_HOST_INTERFACE *)&resp->params
2299 			.packet_aggr;
2300 	MrvlIETypes_USBAggrParam_t *usb_aggr_param_tlv = MNULL;
2301 	mlan_ds_misc_usb_aggr_ctrl *usb_aggr_ctrl = MNULL;
2302 	t_u8 *ptlv_buffer = (t_u8 *)packet_aggr->tlv_buf;
2303 	mlan_adapter *pmadapter = pmpriv->adapter;
2304 	t_u16 tlv = 0;
2305 	int tlv_buf_len = 0;
2306 	t_u8 changed = 0;
2307 #if defined(USB)
2308 	t_s32 i = 0;
2309 #endif
2310 
2311 	ENTER();
2312 
2313 	tlv_buf_len =
2314 		resp->size -
2315 		(sizeof(HostCmd_DS_PACKET_AGGR_OVER_HOST_INTERFACE) + S_DS_GEN);
2316 
2317 	if (!pioctl_buf) {
2318 		LEAVE();
2319 		return MLAN_STATUS_SUCCESS;
2320 	}
2321 	while (tlv_buf_len > 0) {
2322 		changed = 0;
2323 		tlv = (*ptlv_buffer) | (*(ptlv_buffer + 1) << 8);
2324 		switch (tlv) {
2325 		case MRVL_USB_AGGR_PARAM_TLV_ID:
2326 			usb_aggr_param_tlv =
2327 				(MrvlIETypes_USBAggrParam_t *)ptlv_buffer;
2328 			misc = (mlan_ds_misc_cfg *)pioctl_buf->pbuf;
2329 			usb_aggr_ctrl = (mlan_ds_misc_usb_aggr_ctrl *)&(
2330 				misc->param.usb_aggr_params);
2331 			usb_aggr_param_tlv->header.len = wlan_le16_to_cpu(
2332 				usb_aggr_param_tlv->header.len);
2333 			usb_aggr_param_tlv->enable =
2334 				wlan_le16_to_cpu(usb_aggr_param_tlv->enable);
2335 #if defined(USB)
2336 			if (pioctl_buf->action == MLAN_ACT_SET) {
2337 				/* Update the Tx aggregation values in
2338 				 * MLAN */
2339 				for (i = 0; i < MAX_USB_TX_PORT_NUM; i++) {
2340 					pmadapter->pcard_usb->usb_tx_aggr[i]
2341 						.aggr_ctrl.enable =
2342 						usb_aggr_ctrl->tx_aggr_ctrl
2343 							.enable;
2344 					if (pmadapter->pcard_usb->usb_tx_aggr[i]
2345 						    .aggr_ctrl.aggr_mode !=
2346 					    usb_aggr_ctrl->tx_aggr_ctrl
2347 						    .aggr_mode) {
2348 						pmadapter->pcard_usb
2349 							->usb_tx_aggr[i]
2350 							.aggr_ctrl.aggr_mode =
2351 							usb_aggr_ctrl
2352 								->tx_aggr_ctrl
2353 								.aggr_mode;
2354 						changed = 1;
2355 					}
2356 					if (pmadapter->pcard_usb->usb_tx_aggr[i]
2357 						    .aggr_ctrl.aggr_align !=
2358 					    usb_aggr_ctrl->tx_aggr_ctrl
2359 						    .aggr_align) {
2360 						pmadapter->pcard_usb
2361 							->usb_tx_aggr[i]
2362 							.aggr_ctrl.aggr_align =
2363 							usb_aggr_ctrl
2364 								->tx_aggr_ctrl
2365 								.aggr_align;
2366 						changed = 1;
2367 					}
2368 					if (pmadapter->pcard_usb->usb_tx_aggr[i]
2369 						    .aggr_ctrl.aggr_max !=
2370 					    usb_aggr_ctrl->tx_aggr_ctrl
2371 						    .aggr_max) {
2372 						pmadapter->pcard_usb
2373 							->usb_tx_aggr[i]
2374 							.aggr_ctrl.aggr_max =
2375 							usb_aggr_ctrl
2376 								->tx_aggr_ctrl
2377 								.aggr_max;
2378 						changed = 1;
2379 					}
2380 					pmadapter->pcard_usb->usb_tx_aggr[i]
2381 						.aggr_ctrl.aggr_tmo =
2382 						usb_aggr_ctrl->tx_aggr_ctrl
2383 							.aggr_tmo;
2384 				}
2385 			} else {
2386 				if (usb_aggr_param_tlv->enable & MBIT(1))
2387 					usb_aggr_ctrl->tx_aggr_ctrl.enable =
2388 						MTRUE;
2389 				else
2390 					usb_aggr_ctrl->tx_aggr_ctrl.enable =
2391 						MFALSE;
2392 				usb_aggr_ctrl->tx_aggr_ctrl
2393 					.aggr_align = wlan_le16_to_cpu(
2394 					usb_aggr_param_tlv->tx_aggr_align);
2395 				usb_aggr_ctrl->tx_aggr_ctrl.aggr_mode =
2396 					pmadapter->pcard_usb->usb_tx_aggr[0]
2397 						.aggr_ctrl.aggr_mode;
2398 				usb_aggr_ctrl->tx_aggr_ctrl.aggr_max =
2399 					pmadapter->pcard_usb->usb_tx_aggr[0]
2400 						.aggr_ctrl.aggr_max;
2401 				usb_aggr_ctrl->tx_aggr_ctrl.aggr_tmo =
2402 					pmadapter->pcard_usb->usb_tx_aggr[0]
2403 						.aggr_ctrl.aggr_tmo;
2404 			}
2405 			if (changed)
2406 				wlan_reset_usb_tx_aggr(pmadapter);
2407 #endif
2408 
2409 #if defined(USB)
2410 			if (pioctl_buf->action == MLAN_ACT_SET) {
2411 				/* Update the Rx deaggregation values in
2412 				 * MLAN */
2413 				pmadapter->pcard_usb->usb_rx_deaggr.aggr_ctrl
2414 					.enable =
2415 					usb_aggr_ctrl->rx_deaggr_ctrl.enable;
2416 				if (pmadapter->pcard_usb->usb_rx_deaggr
2417 					    .aggr_ctrl.aggr_mode !=
2418 				    usb_aggr_ctrl->rx_deaggr_ctrl.aggr_mode)
2419 					pmadapter->pcard_usb->usb_rx_deaggr
2420 						.aggr_ctrl.aggr_mode =
2421 						usb_aggr_ctrl->rx_deaggr_ctrl
2422 							.aggr_mode;
2423 				if (pmadapter->pcard_usb->usb_rx_deaggr
2424 					    .aggr_ctrl.aggr_align !=
2425 				    usb_aggr_ctrl->rx_deaggr_ctrl.aggr_align)
2426 					pmadapter->pcard_usb->usb_rx_deaggr
2427 						.aggr_ctrl.aggr_align =
2428 						usb_aggr_ctrl->rx_deaggr_ctrl
2429 							.aggr_align;
2430 				if (pmadapter->pcard_usb->usb_rx_deaggr
2431 					    .aggr_ctrl.aggr_max !=
2432 				    usb_aggr_ctrl->rx_deaggr_ctrl.aggr_max)
2433 					pmadapter->pcard_usb->usb_rx_deaggr
2434 						.aggr_ctrl.aggr_max =
2435 						usb_aggr_ctrl->rx_deaggr_ctrl
2436 							.aggr_max;
2437 				pmadapter->pcard_usb->usb_rx_deaggr.aggr_ctrl
2438 					.aggr_tmo =
2439 					usb_aggr_ctrl->rx_deaggr_ctrl.aggr_tmo;
2440 			} else {
2441 				if (usb_aggr_param_tlv->enable & MBIT(0))
2442 					usb_aggr_ctrl->rx_deaggr_ctrl.enable =
2443 						MTRUE;
2444 				else
2445 					usb_aggr_ctrl->rx_deaggr_ctrl.enable =
2446 						MFALSE;
2447 				usb_aggr_ctrl->rx_deaggr_ctrl
2448 					.aggr_mode = wlan_le16_to_cpu(
2449 					usb_aggr_param_tlv->rx_aggr_mode);
2450 				usb_aggr_ctrl->rx_deaggr_ctrl
2451 					.aggr_align = wlan_le16_to_cpu(
2452 					usb_aggr_param_tlv->rx_aggr_align);
2453 				usb_aggr_ctrl->rx_deaggr_ctrl.aggr_max =
2454 					wlan_le16_to_cpu(
2455 						usb_aggr_param_tlv->rx_aggr_max);
2456 				usb_aggr_ctrl->rx_deaggr_ctrl.aggr_tmo =
2457 					wlan_le16_to_cpu(
2458 						usb_aggr_param_tlv->rx_aggr_tmo);
2459 			}
2460 #endif
2461 			ptlv_buffer += usb_aggr_param_tlv->header.len +
2462 				       sizeof(MrvlIEtypesHeader_t);
2463 			tlv_buf_len -= (usb_aggr_param_tlv->header.len +
2464 					sizeof(MrvlIEtypesHeader_t));
2465 			break;
2466 		default:
2467 			break;
2468 		}
2469 	}
2470 
2471 	LEAVE();
2472 	return MLAN_STATUS_SUCCESS;
2473 }
2474 #endif
2475 
2476 /**
2477  *  @brief This function handles the command response of
2478  *  DFS Repeater mode configuration
2479  *
2480  *  @param pmpriv       A pointer to mlan_private structure
2481  *  @param resp         A pointer to HostCmd_DS_COMMAND
2482  *  @param pioctl_buf   A pointer to command buffer
2483  *
2484  *  @return             MLAN_STATUS_SUCCESS
2485  */
wlan_ret_dfs_repeater_cfg(pmlan_private pmpriv,HostCmd_DS_COMMAND * resp,mlan_ioctl_req * pioctl_buf)2486 static mlan_status wlan_ret_dfs_repeater_cfg(pmlan_private pmpriv,
2487 					     HostCmd_DS_COMMAND *resp,
2488 					     mlan_ioctl_req *pioctl_buf)
2489 {
2490 	HostCmd_DS_DFS_REPEATER_MODE *cmd_dfs_repeater =
2491 		&resp->params.dfs_repeater;
2492 	mlan_ds_misc_cfg *misc = MNULL;
2493 	mlan_ds_misc_dfs_repeater *dfs_cfg = MNULL;
2494 
2495 	ENTER();
2496 
2497 	if (pioctl_buf && (pioctl_buf->action == MLAN_ACT_GET)) {
2498 		misc = (mlan_ds_misc_cfg *)pioctl_buf->pbuf;
2499 		dfs_cfg =
2500 			(mlan_ds_misc_dfs_repeater *)&misc->param.dfs_repeater;
2501 		dfs_cfg->mode = wlan_le16_to_cpu(cmd_dfs_repeater->mode);
2502 	}
2503 	if (pioctl_buf && (pioctl_buf->action == MLAN_ACT_SET)) {
2504 		if (wlan_le16_to_cpu(cmd_dfs_repeater->mode) == 1) {
2505 			/* Set dfs_repeater mode to true/enabled
2506 			 * for futher references.
2507 			 */
2508 			pmpriv->adapter->dfs_repeater = MTRUE;
2509 		} else {
2510 			pmpriv->adapter->dfs_repeater = MFALSE;
2511 		}
2512 	}
2513 
2514 	LEAVE();
2515 	return MLAN_STATUS_SUCCESS;
2516 }
2517 
2518 /**
2519  *  @brief This function handles the command response of coalesce config
2520  *
2521  *  @param pmpriv       A pointer to mlan_private structure
2522  *  @param resp         A pointer to HostCmd_DS_COMMAND
2523  *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
2524  *
2525  *  @return             MLAN_STATUS_SUCCESS
2526  */
wlan_ret_coalesce_config(pmlan_private pmpriv,HostCmd_DS_COMMAND * resp,mlan_ioctl_req * pioctl_buf)2527 static mlan_status wlan_ret_coalesce_config(pmlan_private pmpriv,
2528 					    HostCmd_DS_COMMAND *resp,
2529 					    mlan_ioctl_req *pioctl_buf)
2530 {
2531 	ENTER();
2532 	LEAVE();
2533 	return MLAN_STATUS_SUCCESS;
2534 }
2535 
2536 /**
2537  *  @brief This function handles the command response of arb Cfg
2538  *
2539  *  @param pmpriv       A pointer to mlan_private structure
2540  *  @param resp         A pointer to HostCmd_DS_COMMAND
2541  *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
2542  *
2543  *  @return             MLAN_STATUS_SUCCESS
2544  */
wlan_ret_arb_cfg(pmlan_private pmpriv,HostCmd_DS_COMMAND * resp,mlan_ioctl_req * pioctl_buf)2545 mlan_status wlan_ret_arb_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
2546 			     mlan_ioctl_req *pioctl_buf)
2547 {
2548 	HostCmd_DS_CMD_ARB_CONFIG *cfg_cmd =
2549 		(HostCmd_DS_CMD_ARB_CONFIG *)&resp->params.arb_cfg;
2550 	mlan_ds_misc_cfg *misc_cfg = MNULL;
2551 
2552 	ENTER();
2553 
2554 	if (pioctl_buf) {
2555 		misc_cfg = (mlan_ds_misc_cfg *)pioctl_buf->pbuf;
2556 		misc_cfg->param.arb_cfg.arb_mode =
2557 			wlan_le32_to_cpu(cfg_cmd->arb_mode);
2558 	}
2559 	LEAVE();
2560 	return MLAN_STATUS_SUCCESS;
2561 }
2562 
2563 /**
2564  *  @brief This function handles the command response of ipv6 ra offload feature
2565  *
2566  *  @param pmpriv       A pointer to mlan_private structure
2567  *  @param resp         A pointer to HostCmd_DS_COMMAND
2568  *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
2569  *
2570  *  @return             MLAN_STATUS_SUCCESS
2571  */
wlan_ret_ipv6_ra_offload(pmlan_private pmpriv,HostCmd_DS_COMMAND * resp,mlan_ioctl_req * pioctl_buf)2572 mlan_status wlan_ret_ipv6_ra_offload(pmlan_private pmpriv,
2573 				     HostCmd_DS_COMMAND *resp,
2574 				     mlan_ioctl_req *pioctl_buf)
2575 {
2576 	HostCmd_DS_IPV6_RA_OFFLOAD *ipv6_ra_resp =
2577 		&resp->params.ipv6_ra_offload;
2578 	mlan_ds_misc_cfg *misc = MNULL;
2579 	mlan_ds_misc_ipv6_ra_offload *ipv6_ra = MNULL;
2580 
2581 	ENTER();
2582 
2583 	if (pioctl_buf && (pioctl_buf->action == MLAN_ACT_GET)) {
2584 		misc = (mlan_ds_misc_cfg *)pioctl_buf->pbuf;
2585 		ipv6_ra = (mlan_ds_misc_ipv6_ra_offload *)&misc->param
2586 				  .ipv6_ra_offload;
2587 		ipv6_ra->enable = ipv6_ra_resp->enable;
2588 		memcpy_ext(pmpriv->adapter, ipv6_ra->ipv6_addr,
2589 			   ipv6_ra_resp->ipv6_addr_param.ipv6_addr, 16,
2590 			   sizeof(ipv6_ra->ipv6_addr));
2591 	}
2592 
2593 	LEAVE();
2594 	return MLAN_STATUS_SUCCESS;
2595 }
2596 
2597 /**
2598  *  @brief This function handles the command response of sta get band and
2599  * channel
2600  *
2601  *  @param pmpriv       A pointer to mlan_private structure
2602  *  @param resp         A pointer to HostCmd_DS_COMMAND
2603  *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
2604  *
2605  *  @return             MLAN_STATUS_SUCCESS
2606  */
wlan_ret_sta_config(pmlan_private pmpriv,HostCmd_DS_COMMAND * resp,mlan_ioctl_req * pioctl_buf)2607 static mlan_status wlan_ret_sta_config(pmlan_private pmpriv,
2608 				       HostCmd_DS_COMMAND *resp,
2609 				       mlan_ioctl_req *pioctl_buf)
2610 {
2611 	HostCmd_DS_STA_CONFIGURE *cmdrsp_sta_cfg =
2612 		(HostCmd_DS_STA_CONFIGURE *)&resp->params.sta_cfg;
2613 	mlan_ds_bss *bss = MNULL;
2614 	MrvlIEtypes_channel_band_t *tlv_band_channel = MNULL;
2615 
2616 	ENTER();
2617 	if (pioctl_buf) {
2618 		if (pioctl_buf->req_id == MLAN_IOCTL_BSS) {
2619 			bss = (mlan_ds_bss *)pioctl_buf->pbuf;
2620 			if (bss->sub_command == MLAN_OID_BSS_CHAN_INFO) {
2621 				tlv_band_channel =
2622 					(MrvlIEtypes_channel_band_t *)
2623 						cmdrsp_sta_cfg->tlv_buffer;
2624 				bss->param.sta_channel.bandcfg =
2625 					tlv_band_channel->bandcfg;
2626 				bss->param.sta_channel.channel =
2627 					tlv_band_channel->channel;
2628 				bss->param.sta_channel.is_11n_enabled =
2629 					IS_11N_ENABLED(pmpriv);
2630 				if (bss->param.sta_channel.bandcfg.chanWidth ==
2631 				    CHAN_BW_80MHZ)
2632 					bss->param.sta_channel.center_chan =
2633 						wlan_get_center_freq_idx(
2634 							pmpriv, BAND_AAC,
2635 							bss->param.sta_channel
2636 								.channel,
2637 							CHANNEL_BW_80MHZ);
2638 				PRINTM(MCMND,
2639 				       "Get STA channel, band=0x%x, channel=%d, is_11n_enabled=%d center_chan=%d\n",
2640 				       bss->param.sta_channel.bandcfg,
2641 				       bss->param.sta_channel.channel,
2642 				       bss->param.sta_channel.is_11n_enabled,
2643 				       bss->param.sta_channel.center_chan);
2644 
2645 				pioctl_buf->data_read_written =
2646 					sizeof(mlan_ds_bss);
2647 			}
2648 		}
2649 	}
2650 	LEAVE();
2651 	return MLAN_STATUS_SUCCESS;
2652 }
2653 
2654 /**
2655  *  @brief This function clears PMK in fw for fw roaming
2656  *
2657  *  @param pmpriv       A pointer to mlan_private structure
2658  *
2659  *  @return             MLAN_STATUS_SUCCESS
2660  */
wlan_clear_fw_roaming_pmk(pmlan_private pmpriv)2661 mlan_status wlan_clear_fw_roaming_pmk(pmlan_private pmpriv)
2662 {
2663 	mlan_status ret = MLAN_STATUS_SUCCESS;
2664 
2665 	ENTER();
2666 
2667 	ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_SUPPLICANT_PMK,
2668 			       HostCmd_ACT_GEN_REMOVE, 0, MNULL, MNULL);
2669 
2670 	LEAVE();
2671 	return ret;
2672 }
2673 
2674 /**
2675  *  @brief This function handles the command response of enable/disable roaming
2676  * offload to fw
2677  *
2678  *  @param pmpriv       A pointer to mlan_private structure
2679  *  @param resp         A pointer to HostCmd_DS_COMMAND
2680  *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
2681  *
2682  *  @return             MLAN_STATUS_SUCCESS
2683  */
wlan_ret_roam_offload(pmlan_private pmpriv,HostCmd_DS_COMMAND * resp,mlan_ioctl_req * pioctl_buf)2684 static mlan_status wlan_ret_roam_offload(pmlan_private pmpriv,
2685 					 HostCmd_DS_COMMAND *resp,
2686 					 mlan_ioctl_req *pioctl_buf)
2687 {
2688 	HostCmd_DS_ROAM_OFFLOAD *cmdrsp_roam_offload =
2689 		(HostCmd_DS_ROAM_OFFLOAD *)&resp->params.roam_offload;
2690 	mlan_status status = MLAN_STATUS_SUCCESS;
2691 	MrvlIEtypesHeader_t *header = MNULL;
2692 	MrvlIEtypes_fw_roam_enable_t *roam_offload_enable = MNULL;
2693 
2694 	ENTER();
2695 
2696 	if (resp->result == HostCmd_RESULT_OK) {
2697 		header = (MrvlIEtypesHeader_t *)cmdrsp_roam_offload->tlv;
2698 		header->type = wlan_le16_to_cpu(header->type);
2699 		if (header->type == TLV_TYPE_ROAM) {
2700 			roam_offload_enable = (MrvlIEtypes_fw_roam_enable_t *)
2701 						      cmdrsp_roam_offload->tlv;
2702 			if ((t_u8)roam_offload_enable->roam_enable)
2703 				pmpriv->adapter->fw_roaming = MTRUE;
2704 			else {
2705 				pmpriv->adapter->fw_roaming = MFALSE;
2706 				if (MLAN_STATUS_SUCCESS !=
2707 				    wlan_clear_fw_roaming_pmk(pmpriv))
2708 					PRINTM(MERROR,
2709 					       "wlan_clear_fw_roaming_pmk failed\n");
2710 			}
2711 		}
2712 	}
2713 
2714 	LEAVE();
2715 	return status;
2716 }
2717 
2718 /**
2719  *  @brief This function handles the command response of set/get auto tx
2720  *
2721  *  @param pmpriv       A pointer to mlan_private structure
2722  *  @param resp         A pointer to HostCmd_DS_COMMAND
2723  *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
2724  *
2725  *  @return             MLAN_STATUS_SUCCESS
2726  */
wlan_ret_auto_tx(pmlan_private pmpriv,HostCmd_DS_COMMAND * resp,mlan_ioctl_req * pioctl_buf)2727 static mlan_status wlan_ret_auto_tx(pmlan_private pmpriv,
2728 				    HostCmd_DS_COMMAND *resp,
2729 				    mlan_ioctl_req *pioctl_buf)
2730 {
2731 	HostCmd_DS_AUTO_TX *cmdrsp_auto_tx =
2732 		(HostCmd_DS_AUTO_TX *)&resp->params.auto_tx;
2733 	mlan_status status = MLAN_STATUS_SUCCESS;
2734 	MrvlIEtypesHeader_t *header = MNULL;
2735 	mlan_ds_misc_cfg *misc = MNULL;
2736 	t_u16 action;
2737 	t_u16 len = 0;
2738 	MrvlIEtypes_Cloud_Keep_Alive_t *keep_alive_tlv = MNULL;
2739 	MrvlIEtypes_Keep_Alive_Pkt_t *pkt_tlv = MNULL;
2740 	mlan_ds_misc_keep_alive *misc_keep_alive = MNULL;
2741 
2742 	ENTER();
2743 
2744 	action = wlan_le16_to_cpu(cmdrsp_auto_tx->action);
2745 	if (!pioctl_buf) {
2746 		PRINTM(MERROR, "ioctl is null\n");
2747 		LEAVE();
2748 		return MLAN_STATUS_FAILURE;
2749 	}
2750 
2751 	misc = (mlan_ds_misc_cfg *)pioctl_buf->pbuf;
2752 
2753 	if (!misc) {
2754 		PRINTM(MERROR, "misc is null\n");
2755 		LEAVE();
2756 		return MLAN_STATUS_FAILURE;
2757 	}
2758 
2759 	if (resp->result == HostCmd_RESULT_OK) {
2760 		header = (MrvlIEtypesHeader_t *)cmdrsp_auto_tx->tlv_buffer;
2761 		header->type = wlan_le16_to_cpu(header->type);
2762 		len = wlan_le16_to_cpu(header->len);
2763 		if (header->type == TLV_TYPE_CLOUD_KEEP_ALIVE) {
2764 			keep_alive_tlv = (MrvlIEtypes_Cloud_Keep_Alive_t *)
2765 						 cmdrsp_auto_tx->tlv_buffer;
2766 			misc_keep_alive = (mlan_ds_misc_keep_alive *)&misc
2767 						  ->param.keep_alive;
2768 			misc_keep_alive->mkeep_alive_id =
2769 				keep_alive_tlv->keep_alive_id;
2770 			misc_keep_alive->enable = keep_alive_tlv->enable;
2771 			if (((action == HostCmd_ACT_GEN_SET) ||
2772 			     (action == HostCmd_ACT_GEN_RESET)) &&
2773 			    !keep_alive_tlv->enable) {
2774 				len = len -
2775 				      sizeof(keep_alive_tlv->keep_alive_id) -
2776 				      sizeof(keep_alive_tlv->enable);
2777 				if (len > sizeof(MrvlIEtypesHeader_t)) {
2778 					header = (MrvlIEtypesHeader_t *)
2779 							 keep_alive_tlv->tlv;
2780 					header->type =
2781 						wlan_le16_to_cpu(header->type);
2782 					len = wlan_le16_to_cpu(header->len) -
2783 					      sizeof(Eth803Hdr_t);
2784 					if (header->type ==
2785 					    TLV_TYPE_KEEP_ALIVE_PKT) {
2786 						pkt_tlv =
2787 							(MrvlIEtypes_Keep_Alive_Pkt_t
2788 								 *)keep_alive_tlv
2789 								->tlv;
2790 						memcpy_ext(
2791 							pmpriv->adapter,
2792 							misc_keep_alive->dst_mac,
2793 							pkt_tlv->eth_header
2794 								.dest_addr,
2795 							MLAN_MAC_ADDR_LENGTH,
2796 							sizeof(misc_keep_alive
2797 								       ->dst_mac));
2798 						memcpy_ext(
2799 							pmpriv->adapter,
2800 							misc_keep_alive->src_mac,
2801 							pkt_tlv->eth_header
2802 								.src_addr,
2803 							MLAN_MAC_ADDR_LENGTH,
2804 							sizeof(misc_keep_alive
2805 								       ->src_mac));
2806 						memcpy_ext(
2807 							pmpriv->adapter,
2808 							misc_keep_alive->packet,
2809 							pkt_tlv->ip_packet, len,
2810 							sizeof(misc_keep_alive
2811 								       ->packet));
2812 						misc_keep_alive->pkt_len = len;
2813 					}
2814 				}
2815 			}
2816 		}
2817 	}
2818 
2819 	LEAVE();
2820 	return status;
2821 }
2822 
2823 /********************************************************
2824 			Global Functions
2825 ********************************************************/
2826 
2827 /**
2828  *  @brief This function prepares command resp of MFG Continuous Tx
2829  *
2830  *  @param pmpriv       A pointer to mlan_private structure
2831  *  @param resp         A pointer to HostCmd_DS_COMMAND
2832  *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
2833  *
2834  *  @return             MLAN_STATUS_SUCCESS
2835  */
wlan_ret_mfg_tx_cont(pmlan_private pmpriv,HostCmd_DS_COMMAND * resp,mlan_ioctl_req * pioctl_buf)2836 static mlan_status wlan_ret_mfg_tx_cont(pmlan_private pmpriv,
2837 					HostCmd_DS_COMMAND *resp,
2838 					mlan_ioctl_req *pioctl_buf)
2839 {
2840 	mlan_ds_misc_cfg *misc = MNULL;
2841 	struct mfg_cmd_tx_cont *mcmd =
2842 		(struct mfg_cmd_tx_cont *)&resp->params.mfg_tx_cont;
2843 	struct mfg_cmd_tx_cont *cfg = MNULL;
2844 
2845 	ENTER();
2846 	if (!pioctl_buf) {
2847 		LEAVE();
2848 		return MLAN_STATUS_FAILURE;
2849 	}
2850 	misc = (mlan_ds_misc_cfg *)pioctl_buf->pbuf;
2851 	cfg = (struct mfg_cmd_tx_cont *)&misc->param.mfg_tx_cont;
2852 
2853 	cfg->error = wlan_le32_to_cpu(mcmd->error);
2854 	cfg->enable_tx = wlan_le32_to_cpu(mcmd->enable_tx);
2855 	cfg->cw_mode = wlan_le32_to_cpu(mcmd->cw_mode);
2856 	cfg->payload_pattern = wlan_le32_to_cpu(mcmd->payload_pattern);
2857 	cfg->cs_mode = wlan_le32_to_cpu(mcmd->cs_mode);
2858 	cfg->act_sub_ch = wlan_le32_to_cpu(mcmd->act_sub_ch);
2859 	cfg->tx_rate = wlan_le32_to_cpu(mcmd->tx_rate);
2860 
2861 	LEAVE();
2862 	return MLAN_STATUS_SUCCESS;
2863 }
2864 
2865 /**
2866  *  @brief This function prepares command resp of MFG Tx frame
2867  *
2868  *  @param pmpriv       A pointer to mlan_private structure
2869  *  @param resp         A pointer to HostCmd_DS_COMMAND
2870  *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
2871  *
2872  *  @return             MLAN_STATUS_SUCCESS
2873  */
wlan_ret_mfg_tx_frame(pmlan_private pmpriv,HostCmd_DS_COMMAND * resp,mlan_ioctl_req * pioctl_buf)2874 static mlan_status wlan_ret_mfg_tx_frame(pmlan_private pmpriv,
2875 					 HostCmd_DS_COMMAND *resp,
2876 					 mlan_ioctl_req *pioctl_buf)
2877 {
2878 	mlan_ds_misc_cfg *misc = MNULL;
2879 	struct mfg_cmd_tx_frame2 *mcmd =
2880 		(struct mfg_cmd_tx_frame2 *)&resp->params.mfg_tx_frame2;
2881 	struct mfg_cmd_tx_frame2 *cfg = MNULL;
2882 
2883 	ENTER();
2884 	if (!pioctl_buf) {
2885 		LEAVE();
2886 		return MLAN_STATUS_FAILURE;
2887 	}
2888 	misc = (mlan_ds_misc_cfg *)pioctl_buf->pbuf;
2889 	cfg = (struct mfg_cmd_tx_frame2 *)&misc->param.mfg_tx_frame2;
2890 
2891 	cfg->error = wlan_le32_to_cpu(mcmd->error);
2892 	cfg->enable = wlan_le32_to_cpu(mcmd->enable);
2893 	cfg->data_rate = wlan_le32_to_cpu(mcmd->data_rate);
2894 	cfg->frame_pattern = wlan_le32_to_cpu(mcmd->frame_pattern);
2895 	cfg->frame_length = wlan_le32_to_cpu(mcmd->frame_length);
2896 	cfg->adjust_burst_sifs = wlan_le16_to_cpu(mcmd->adjust_burst_sifs);
2897 	cfg->burst_sifs_in_us = wlan_le32_to_cpu(mcmd->burst_sifs_in_us);
2898 	cfg->short_preamble = wlan_le32_to_cpu(mcmd->short_preamble);
2899 	cfg->act_sub_ch = wlan_le32_to_cpu(mcmd->act_sub_ch);
2900 	cfg->short_gi = wlan_le32_to_cpu(mcmd->short_gi);
2901 	cfg->tx_bf = wlan_le32_to_cpu(mcmd->tx_bf);
2902 	cfg->gf_mode = wlan_le32_to_cpu(mcmd->gf_mode);
2903 	cfg->stbc = wlan_le32_to_cpu(mcmd->stbc);
2904 	cfg->NumPkt = wlan_le32_to_cpu(mcmd->NumPkt);
2905 	cfg->MaxPE = wlan_le32_to_cpu(mcmd->MaxPE);
2906 	cfg->BeamChange = wlan_le32_to_cpu(mcmd->BeamChange);
2907 	cfg->Dcm = wlan_le32_to_cpu(mcmd->Dcm);
2908 	cfg->Doppler = wlan_le32_to_cpu(mcmd->Doppler);
2909 	cfg->MidP = wlan_le32_to_cpu(mcmd->MidP);
2910 	cfg->QNum = wlan_le32_to_cpu(mcmd->QNum);
2911 	memcpy_ext(pmpriv->adapter, cfg->bssid, mcmd->bssid,
2912 		   MLAN_MAC_ADDR_LENGTH, sizeof(cfg->bssid));
2913 
2914 	LEAVE();
2915 	return MLAN_STATUS_SUCCESS;
2916 }
2917 
2918 /**
2919  *  @brief This function prepares command resp of MFG HE TB Tx
2920  *
2921  *  @param pmpriv       A pointer to mlan_private structure
2922  *  @param resp         A pointer to HostCmd_DS_COMMAND
2923  *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
2924  *
2925  *  @return             MLAN_STATUS_SUCCESS
2926  */
2927 
wlan_ret_mfg_he_tb_tx(pmlan_private pmpriv,HostCmd_DS_COMMAND * resp,mlan_ioctl_req * pioctl_buf)2928 static mlan_status wlan_ret_mfg_he_tb_tx(pmlan_private pmpriv,
2929 					 HostCmd_DS_COMMAND *resp,
2930 					 mlan_ioctl_req *pioctl_buf)
2931 {
2932 	mlan_ds_misc_cfg *misc = MNULL;
2933 	struct mfg_Cmd_HE_TBTx_t *mcmd =
2934 		(struct mfg_Cmd_HE_TBTx_t *)&resp->params.mfg_he_power;
2935 	struct mfg_Cmd_HE_TBTx_t *cfg = MNULL;
2936 
2937 	ENTER();
2938 	if (!pioctl_buf) {
2939 		LEAVE();
2940 		return MLAN_STATUS_FAILURE;
2941 	}
2942 	misc = (mlan_ds_misc_cfg *)pioctl_buf->pbuf;
2943 	cfg = (struct mfg_Cmd_HE_TBTx_t *)&misc->param.mfg_he_power;
2944 
2945 	cfg->enable = wlan_le16_to_cpu(mcmd->enable);
2946 	cfg->qnum = wlan_le16_to_cpu(mcmd->qnum);
2947 	cfg->aid = wlan_le16_to_cpu(mcmd->aid);
2948 	cfg->axq_mu_timer = wlan_le16_to_cpu(mcmd->axq_mu_timer);
2949 	cfg->tx_power = wlan_le16_to_cpu(mcmd->tx_power);
2950 
2951 	LEAVE();
2952 	return MLAN_STATUS_SUCCESS;
2953 }
2954 
2955 /**
2956  *  @brief This function prepares command resp of MFG Cmd
2957  *
2958  *  @param pmpriv       A pointer to mlan_private structure
2959  *  @param resp         A pointer to HostCmd_DS_COMMAND
2960  *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
2961  *
2962  *  @return             MLAN_STATUS_SUCCESS
2963  */
wlan_ret_mfg(pmlan_private pmpriv,HostCmd_DS_COMMAND * resp,mlan_ioctl_req * pioctl_buf)2964 mlan_status wlan_ret_mfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
2965 			 mlan_ioctl_req *pioctl_buf)
2966 {
2967 	mlan_ds_misc_cfg *misc = MNULL;
2968 	struct mfg_cmd_generic_cfg *mcmd =
2969 		(struct mfg_cmd_generic_cfg *)&resp->params.mfg_generic_cfg;
2970 	struct mfg_cmd_generic_cfg *cfg = MNULL;
2971 	mlan_status ret = MLAN_STATUS_SUCCESS;
2972 
2973 	ENTER();
2974 	if (!pioctl_buf) {
2975 		LEAVE();
2976 		return MLAN_STATUS_FAILURE;
2977 	}
2978 	switch (wlan_le32_to_cpu(mcmd->mfg_cmd)) {
2979 	case MFG_CMD_TX_CONT:
2980 		ret = wlan_ret_mfg_tx_cont(pmpriv, resp, pioctl_buf);
2981 		goto cmd_mfg_done;
2982 	case MFG_CMD_TX_FRAME:
2983 		ret = wlan_ret_mfg_tx_frame(pmpriv, resp, pioctl_buf);
2984 		goto cmd_mfg_done;
2985 	case MFG_CMD_CONFIG_MAC_HE_TB_TX:
2986 		ret = wlan_ret_mfg_he_tb_tx(pmpriv, resp, pioctl_buf);
2987 		goto cmd_mfg_done;
2988 	case MFG_CMD_SET_TEST_MODE:
2989 	case MFG_CMD_UNSET_TEST_MODE:
2990 	case MFG_CMD_TX_ANT:
2991 	case MFG_CMD_RX_ANT:
2992 	case MFG_CMD_RF_CHAN:
2993 	case MFG_CMD_CLR_RX_ERR:
2994 	case MFG_CMD_RF_BAND_AG:
2995 	case MFG_CMD_RF_CHANNELBW:
2996 	case MFG_CMD_RADIO_MODE_CFG:
2997 	case MFG_CMD_RFPWR:
2998 		break;
2999 	default:
3000 		ret = MLAN_STATUS_FAILURE;
3001 		goto cmd_mfg_done;
3002 	}
3003 	misc = (mlan_ds_misc_cfg *)pioctl_buf->pbuf;
3004 	cfg = (struct mfg_cmd_generic_cfg *)&misc->param.mfg_generic_cfg;
3005 
3006 	cfg->error = wlan_le32_to_cpu(mcmd->error);
3007 	cfg->data1 = wlan_le32_to_cpu(mcmd->data1);
3008 	cfg->data2 = wlan_le32_to_cpu(mcmd->data2);
3009 	cfg->data3 = wlan_le32_to_cpu(mcmd->data3);
3010 cmd_mfg_done:
3011 	LEAVE();
3012 	return ret;
3013 }
3014 
3015 /**
3016  *  @brief This function handles the station command response
3017  *
3018  *  @param priv             A pointer to mlan_private structure
3019  *  @param cmdresp_no       cmd no
3020  *  @param pcmd_buf         cmdresp buf
3021  *  @param pioctl           A pointer to ioctl buf
3022  *
3023  *  @return             MLAN_STATUS_SUCCESS or MLAN_STATUS_FAILURE
3024  */
wlan_ops_sta_process_cmdresp(t_void * priv,t_u16 cmdresp_no,t_void * pcmd_buf,t_void * pioctl)3025 mlan_status wlan_ops_sta_process_cmdresp(t_void *priv, t_u16 cmdresp_no,
3026 					 t_void *pcmd_buf, t_void *pioctl)
3027 {
3028 	mlan_status ret = MLAN_STATUS_SUCCESS;
3029 	mlan_private *pmpriv = (mlan_private *)priv;
3030 	HostCmd_DS_COMMAND *resp = (HostCmd_DS_COMMAND *)pcmd_buf;
3031 	mlan_ioctl_req *pioctl_buf = (mlan_ioctl_req *)pioctl;
3032 
3033 	mlan_adapter *pmadapter = pmpriv->adapter;
3034 #ifdef SDIO
3035 	int ctr;
3036 #endif
3037 
3038 	ENTER();
3039 
3040 	/* If the command is not successful, cleanup and return failure */
3041 	if ((resp->result != HostCmd_RESULT_OK)) {
3042 		ret = wlan_process_cmdresp_error(pmpriv, resp, pioctl_buf);
3043 		LEAVE();
3044 		return ret;
3045 	}
3046 	/* Command successful, handle response */
3047 	switch (cmdresp_no) {
3048 	case HostCmd_CMD_GET_HW_SPEC:
3049 		ret = wlan_ret_get_hw_spec(pmpriv, resp, pioctl_buf);
3050 		break;
3051 #ifdef SDIO
3052 	case HostCmd_CMD_SDIO_SP_RX_AGGR_CFG:
3053 		ret = wlan_ret_sdio_rx_aggr_cfg(pmpriv, resp);
3054 		break;
3055 #endif
3056 	case HostCmd_CMD_CFG_DATA:
3057 		ret = wlan_ret_cfg_data(pmpriv, resp, pioctl_buf);
3058 		break;
3059 	case HostCmd_CMD_MAC_CONTROL:
3060 		ret = wlan_ret_mac_control(pmpriv, resp, pioctl_buf);
3061 		break;
3062 	case HostCmd_CMD_802_11_MAC_ADDRESS:
3063 		ret = wlan_ret_802_11_mac_address(pmpriv, resp, pioctl_buf);
3064 		break;
3065 	case HostCmd_CMD_MAC_MULTICAST_ADR:
3066 		ret = wlan_ret_mac_multicast_adr(pmpriv, resp, pioctl_buf);
3067 		break;
3068 	case HostCmd_CMD_TX_RATE_CFG:
3069 		ret = wlan_ret_tx_rate_cfg(pmpriv, resp, pioctl_buf);
3070 		break;
3071 	case HostCmd_CMD_802_11_SCAN:
3072 		ret = wlan_ret_802_11_scan(pmpriv, resp, pioctl_buf);
3073 		pioctl_buf = MNULL;
3074 		pmadapter->curr_cmd->pioctl_buf = MNULL;
3075 		break;
3076 	case HostCmd_CMD_802_11_SCAN_EXT:
3077 		ret = wlan_ret_802_11_scan_ext(pmpriv, resp, pioctl_buf);
3078 		pioctl_buf = MNULL;
3079 		pmadapter->curr_cmd->pioctl_buf = MNULL;
3080 		break;
3081 	case HostCmd_CMD_802_11_BG_SCAN_CONFIG:
3082 		ret = wlan_ret_bgscan_config(pmpriv, resp, pioctl_buf);
3083 		break;
3084 	case HostCmd_CMD_802_11_BG_SCAN_QUERY:
3085 		ret = wlan_ret_802_11_bgscan_query(pmpriv, resp, pioctl_buf);
3086 		wlan_recv_event(pmpriv, MLAN_EVENT_ID_DRV_BGSCAN_RESULT, MNULL);
3087 		PRINTM(MINFO, "CMD_RESP: BG_SCAN result is ready!\n");
3088 		break;
3089 	case HostCmd_CMD_TXPWR_CFG:
3090 		ret = wlan_ret_tx_power_cfg(pmpriv, resp, pioctl_buf);
3091 		break;
3092 
3093 	case HostCmd_CMD_802_11_RF_TX_POWER:
3094 		ret = wlan_ret_802_11_rf_tx_power(pmpriv, resp, pioctl_buf);
3095 		break;
3096 
3097 	case HostCmd_CMD_802_11_PS_MODE_ENH:
3098 		ret = wlan_ret_enh_power_mode(pmpriv, resp, pioctl_buf);
3099 		break;
3100 	case HostCmd_CMD_802_11_HS_CFG_ENH:
3101 		ret = wlan_ret_802_11_hs_cfg(pmpriv, resp, pioctl_buf);
3102 		break;
3103 	case HostCmd_CMD_802_11_SLEEP_PERIOD:
3104 		ret = wlan_ret_802_11_sleep_period(pmpriv, resp, pioctl_buf);
3105 		break;
3106 	case HostCmd_CMD_802_11_SLEEP_PARAMS:
3107 		ret = wlan_ret_802_11_sleep_params(pmpriv, resp, pioctl_buf);
3108 		break;
3109 	case HostCmd_CMD_802_11_ROBUSTCOEX:
3110 		break;
3111 	case HostCmd_CMD_DMCS_CONFIG:
3112 		ret = wlan_ret_dmcs_config(pmpriv, resp, pioctl_buf);
3113 		break;
3114 #if defined(PCIE)
3115 	case HostCmd_CMD_SSU:
3116 		PRINTM(MCMND,
3117 		       "SSU cmdresp:number_of_buffers %d, buffer_size %d rec_len %d\n",
3118 		       resp->params.ssu_params.number_of_buffers,
3119 		       resp->params.ssu_params.buffer_size,
3120 		       resp->params.ssu_params.rec_len);
3121 		break;
3122 #endif
3123 	case HostCmd_CMD_CSI:
3124 		if (resp->params.csi_params.action == CSI_CMD_ENABLE) {
3125 			pmadapter->csi_enabled = 1;
3126 			PRINTM(MCMND, "CSI ENABLE cmdresp\n");
3127 		} else {
3128 			pmadapter->csi_enabled = 0;
3129 			PRINTM(MCMND, "CSI DISABLE cmdresp\n");
3130 		}
3131 		break;
3132 	case HostCmd_CMD_802_11_ASSOCIATE:
3133 		ret = wlan_ret_802_11_associate(pmpriv, resp, pioctl_buf);
3134 		break;
3135 	case HostCmd_CMD_802_11_DEAUTHENTICATE:
3136 	case HostCmd_CMD_802_11_DISASSOCIATE:
3137 		ret = wlan_ret_802_11_deauthenticate(pmpriv, resp, pioctl_buf);
3138 		break;
3139 	case HostCmd_CMD_802_11_AD_HOC_START:
3140 	case HostCmd_CMD_802_11_AD_HOC_JOIN:
3141 		ret = wlan_ret_802_11_ad_hoc(pmpriv, resp, pioctl_buf);
3142 		break;
3143 	case HostCmd_CMD_802_11_AD_HOC_STOP:
3144 		ret = wlan_ret_802_11_ad_hoc_stop(pmpriv, resp, pioctl_buf);
3145 		break;
3146 	case HostCmd_CMD_802_11_GET_LOG:
3147 		ret = wlan_ret_get_log(pmpriv, resp, pioctl_buf);
3148 		break;
3149 	case HostCmd_CMD_802_11_LINK_STATS:
3150 		ret = wlan_ret_get_link_statistic(pmpriv, resp, pioctl_buf);
3151 		break;
3152 	case HostCmd_CMD_RSSI_INFO_EXT:
3153 		ret = wlan_ret_802_11_rssi_info_ext(pmpriv, resp, pioctl_buf);
3154 		break;
3155 	case HostCmd_CMD_RSSI_INFO:
3156 		ret = wlan_ret_802_11_rssi_info(pmpriv, resp, pioctl_buf);
3157 		break;
3158 	case HostCmd_CMD_802_11_SNMP_MIB:
3159 		ret = wlan_ret_802_11_snmp_mib(pmpriv, resp, pioctl_buf);
3160 		break;
3161 	case HostCmd_CMD_802_11_RADIO_CONTROL:
3162 		ret = wlan_ret_802_11_radio_control(pmpriv, resp, pioctl_buf);
3163 		break;
3164 	case HostCmd_CMD_802_11_TX_RATE_QUERY:
3165 		ret = wlan_ret_802_11_tx_rate_query(pmpriv, resp, pioctl_buf);
3166 		break;
3167 	case HostCmd_CMD_802_11_RF_CHANNEL:
3168 		ret = wlan_ret_802_11_rf_channel(pmpriv, resp, pioctl_buf);
3169 		break;
3170 	case HostCmd_CMD_802_11_RF_ANTENNA:
3171 		ret = wlan_ret_802_11_rf_antenna(pmpriv, resp, pioctl_buf);
3172 		break;
3173 	case HostCmd_CMD_CW_MODE_CTRL:
3174 		ret = wlan_ret_cw_mode_ctrl(pmpriv, resp, pioctl_buf);
3175 		break;
3176 	case HostCmd_CMD_VERSION_EXT:
3177 		ret = wlan_ret_ver_ext(pmpriv, resp, pioctl_buf);
3178 		break;
3179 	case HostCmd_CMD_RX_MGMT_IND:
3180 		ret = wlan_ret_rx_mgmt_ind(pmpriv, resp, pioctl_buf);
3181 		break;
3182 	case HostCmd_CMD_FUNC_INIT:
3183 	case HostCmd_CMD_FUNC_SHUTDOWN:
3184 		break;
3185 	case HostCmd_CMD_802_11_KEY_MATERIAL:
3186 		ret = wlan_ret_802_11_key_material(pmpriv, resp, pioctl_buf);
3187 		break;
3188 	case HostCmd_CMD_GTK_REKEY_OFFLOAD_CFG:
3189 		break;
3190 	case HostCmd_CMD_SUPPLICANT_PMK:
3191 		ret = wlan_ret_802_11_supplicant_pmk(pmpriv, resp, pioctl_buf);
3192 		break;
3193 	case HostCmd_CMD_SUPPLICANT_PROFILE:
3194 		ret = wlan_ret_802_11_supplicant_profile(pmpriv, resp,
3195 							 pioctl_buf);
3196 		break;
3197 	case HostCmd_CMD_802_11_EAPOL_PKT:
3198 		break;
3199 	case HostCmd_CMD_802_11D_DOMAIN_INFO:
3200 		ret = wlan_ret_802_11d_domain_info(pmpriv, resp);
3201 		break;
3202 	case HostCmd_CMD_802_11_TPC_ADAPT_REQ:
3203 	case HostCmd_CMD_802_11_TPC_INFO:
3204 	case HostCmd_CMD_802_11_CHAN_SW_ANN:
3205 	case HostCmd_CMD_CHAN_REPORT_REQUEST:
3206 		ret = wlan_11h_cmdresp_process(pmpriv, resp);
3207 		break;
3208 	case HostCmd_CMD_11N_ADDBA_REQ:
3209 		ret = wlan_ret_11n_addba_req(pmpriv, resp);
3210 		break;
3211 	case HostCmd_CMD_11N_DELBA:
3212 		ret = wlan_ret_11n_delba(pmpriv, resp);
3213 		break;
3214 	case HostCmd_CMD_11N_ADDBA_RSP:
3215 		ret = wlan_ret_11n_addba_resp(pmpriv, resp);
3216 		break;
3217 	case HostCmd_CMD_RECONFIGURE_TX_BUFF:
3218 		wlan_set_tx_pause_flag(pmpriv, MFALSE);
3219 
3220 		pmadapter->tx_buf_size =
3221 			(t_u16)wlan_le16_to_cpu(resp->params.tx_buf.buff_size);
3222 #ifdef SDIO
3223 		if (IS_SD(pmadapter->card_type)) {
3224 			pmadapter->tx_buf_size = (pmadapter->tx_buf_size /
3225 						  MLAN_SDIO_BLOCK_SIZE) *
3226 						 MLAN_SDIO_BLOCK_SIZE;
3227 			pmadapter->pcard_sd->mp_end_port = wlan_le16_to_cpu(
3228 				resp->params.tx_buf.mp_end_port);
3229 			pmadapter->pcard_sd->mp_data_port_mask =
3230 				pmadapter->pcard_sd->reg->data_port_mask;
3231 
3232 			for (ctr = 1;
3233 			     ctr <= pmadapter->pcard_sd->max_ports -
3234 					    pmadapter->pcard_sd->mp_end_port;
3235 			     ctr++) {
3236 				pmadapter->pcard_sd->mp_data_port_mask &=
3237 					~(1 << (pmadapter->pcard_sd->max_ports -
3238 						ctr));
3239 			}
3240 
3241 			pmadapter->pcard_sd->curr_wr_port =
3242 				pmadapter->pcard_sd->reg->start_wr_port;
3243 			pmadapter->pcard_sd->mpa_tx.pkt_aggr_limit =
3244 				MIN(pmadapter->pcard_sd->mp_aggr_pkt_limit,
3245 				    (pmadapter->pcard_sd->mp_end_port >> 1));
3246 			PRINTM(MCMND, "end port %d, data port mask %x\n",
3247 			       wlan_le16_to_cpu(
3248 				       resp->params.tx_buf.mp_end_port),
3249 			       pmadapter->pcard_sd->mp_data_port_mask);
3250 		}
3251 #endif
3252 		pmadapter->curr_tx_buf_size = pmadapter->tx_buf_size;
3253 		PRINTM(MCMND, "max_tx_buf_size=%d, tx_buf_size=%d\n",
3254 		       pmadapter->max_tx_buf_size, pmadapter->tx_buf_size);
3255 		break;
3256 	case HostCmd_CMD_AMSDU_AGGR_CTRL:
3257 		ret = wlan_ret_amsdu_aggr_ctrl(pmpriv, resp, pioctl_buf);
3258 		break;
3259 	case HostCmd_CMD_WMM_GET_STATUS:
3260 		ret = wlan_ret_wmm_get_status(
3261 			pmpriv, resp->params.get_wmm_status.queue_status_tlv,
3262 			resp->size - S_DS_GEN);
3263 		break;
3264 	case HostCmd_CMD_WMM_ADDTS_REQ:
3265 		ret = wlan_ret_wmm_addts_req(pmpriv, resp, pioctl_buf);
3266 		break;
3267 	case HostCmd_CMD_WMM_DELTS_REQ:
3268 		ret = wlan_ret_wmm_delts_req(pmpriv, resp, pioctl_buf);
3269 		break;
3270 	case HostCmd_CMD_WMM_QUEUE_CONFIG:
3271 		ret = wlan_ret_wmm_queue_config(pmpriv, resp, pioctl_buf);
3272 		break;
3273 	case HostCmd_CMD_WMM_QUEUE_STATS:
3274 		ret = wlan_ret_wmm_queue_stats(pmpriv, resp, pioctl_buf);
3275 		break;
3276 	case HostCmd_CMD_WMM_TS_STATUS:
3277 		ret = wlan_ret_wmm_ts_status(pmpriv, resp, pioctl_buf);
3278 		break;
3279 	case HostCmd_CMD_WMM_PARAM_CONFIG:
3280 		ret = wlan_ret_wmm_param_config(pmpriv, resp, pioctl_buf);
3281 		break;
3282 	case HostCmd_CMD_802_11_IBSS_COALESCING_STATUS:
3283 		ret = wlan_ret_ibss_coalescing_status(pmpriv, resp);
3284 		break;
3285 	case HostCmd_CMD_MGMT_IE_LIST:
3286 		ret = wlan_ret_mgmt_ie_list(pmpriv, resp, pioctl_buf);
3287 		break;
3288 	case HostCmd_CMD_TDLS_CONFIG:
3289 		ret = wlan_ret_tdls_config(pmpriv, resp, pioctl_buf);
3290 		break;
3291 	case HostCmd_CMD_TDLS_OPERATION:
3292 		ret = wlan_ret_tdls_oper(pmpriv, resp, pioctl_buf);
3293 		break;
3294 	case HostCmd_CMD_11N_CFG:
3295 		ret = wlan_ret_11n_cfg(pmpriv, resp, pioctl_buf);
3296 		break;
3297 	case HostCmd_CMD_11AC_CFG:
3298 		ret = wlan_ret_11ac_cfg(pmpriv, resp, pioctl_buf);
3299 		break;
3300 #if 0
3301 	case HostCmd_CMD_RECONFIGURE_TX_BUFF:
3302 		pmadapter->tx_buf_size = (t_u16)wlan_le16_to_cpu(resp->params.
3303 						tx_buf.buff_size);
3304 		break;
3305 #endif
3306 	case HostCmd_CMD_TX_BF_CFG:
3307 		ret = wlan_ret_tx_bf_cfg(pmpriv, resp, pioctl_buf);
3308 		break;
3309 	case HostCmd_CMD_ECL_SYSTEM_CLOCK_CONFIG:
3310 		ret = wlan_ret_sysclock_cfg(pmpriv, resp, pioctl_buf);
3311 		break;
3312 	case HostCmd_CMD_MAC_REG_ACCESS:
3313 	case HostCmd_CMD_BBP_REG_ACCESS:
3314 	case HostCmd_CMD_RF_REG_ACCESS:
3315 	case HostCmd_CMD_CAU_REG_ACCESS:
3316 	case HostCmd_CMD_TARGET_ACCESS:
3317 	case HostCmd_CMD_802_11_EEPROM_ACCESS:
3318 	case HostCmd_CMD_BCA_REG_ACCESS:
3319 	case HostCmd_CMD_REG_ACCESS:
3320 		ret = wlan_ret_reg_access(pmpriv->adapter, cmdresp_no, resp,
3321 					  pioctl_buf);
3322 		break;
3323 	case HostCmd_CMD_MEM_ACCESS:
3324 		ret = wlan_ret_mem_access(pmpriv, resp, pioctl_buf);
3325 		break;
3326 	case HostCmd_CMD_INACTIVITY_TIMEOUT_EXT:
3327 		ret = wlan_ret_inactivity_timeout(pmpriv, resp, pioctl_buf);
3328 		break;
3329 #if defined(SDIO)
3330 	case HostCmd_CMD_SDIO_GPIO_INT_CONFIG:
3331 		break;
3332 #endif
3333 	case HostCmd_CMD_SET_BSS_MODE:
3334 		break;
3335 	case HostCmd_CMD_MEASUREMENT_REQUEST:
3336 	case HostCmd_CMD_MEASUREMENT_REPORT:
3337 		ret = wlan_meas_cmdresp_process(pmpriv, resp);
3338 		break;
3339 	case HostCmd_CMD_802_11_NET_MONITOR:
3340 		ret = wlan_ret_net_monitor(pmpriv, resp, pioctl_buf);
3341 		break;
3342 #if defined(PCIE)
3343 #if defined(PCIE8997) || defined(PCIE8897)
3344 	case HostCmd_CMD_PCIE_HOST_BUF_DETAILS:
3345 		PRINTM(MINFO, "PCIE host buffer configuration successful.\n");
3346 		break;
3347 #endif
3348 #endif
3349 	case HostCmd_CMD_802_11_REMAIN_ON_CHANNEL:
3350 		ret = wlan_ret_remain_on_channel(pmpriv, resp, pioctl_buf);
3351 		break;
3352 #ifdef WIFI_DIRECT_SUPPORT
3353 	case HOST_CMD_WIFI_DIRECT_MODE_CONFIG:
3354 		ret = wlan_ret_wifi_direct_mode(pmpriv, resp, pioctl_buf);
3355 		break;
3356 #endif
3357 	case HostCmd_CMD_802_11_SUBSCRIBE_EVENT:
3358 		ret = wlan_ret_subscribe_event(pmpriv, resp, pioctl_buf);
3359 		break;
3360 	case HostCmd_CMD_OTP_READ_USER_DATA:
3361 		ret = wlan_ret_otp_user_data(pmpriv, resp, pioctl_buf);
3362 		break;
3363 	case HostCmd_CMD_FW_AUTO_RECONNECT:
3364 		ret = wlan_ret_fw_auto_reconnect(pmpriv, resp, pioctl_buf);
3365 		break;
3366 	case HostCmd_CMD_HS_WAKEUP_REASON:
3367 		ret = wlan_ret_hs_wakeup_reason(pmpriv, resp, pioctl_buf);
3368 		break;
3369 	case HostCmd_CMD_REJECT_ADDBA_REQ:
3370 		ret = wlan_ret_reject_addba_req(pmpriv, resp, pioctl_buf);
3371 		break;
3372 	case HostCmd_CMD_PACKET_AGGR_CTRL:
3373 		ret = wlan_ret_packet_aggr_ctrl(pmpriv, resp, pioctl_buf);
3374 		break;
3375 #ifdef USB
3376 	case HostCmd_CMD_PACKET_AGGR_OVER_HOST_INTERFACE:
3377 		ret = wlan_ret_packet_aggr_over_host_interface(pmpriv, resp,
3378 							       pioctl_buf);
3379 		break;
3380 #endif
3381 #ifdef RX_PACKET_COALESCE
3382 	case HostCmd_CMD_RX_PKT_COALESCE_CFG:
3383 		ret = wlan_ret_rx_pkt_coalesce_cfg(pmpriv, resp, pioctl_buf);
3384 		break;
3385 #endif
3386 	case HostCMD_CONFIG_LOW_POWER_MODE:
3387 		break;
3388 	case HostCmd_DFS_REPEATER_MODE:
3389 		ret = wlan_ret_dfs_repeater_cfg(pmpriv, resp, pioctl_buf);
3390 		break;
3391 	case HostCmd_CMD_COALESCE_CFG:
3392 		ret = wlan_ret_coalesce_config(pmpriv, resp, pioctl_buf);
3393 		break;
3394 	case HostCmd_CMD_MEF_CFG:
3395 		break;
3396 	case HostCmd_DS_GET_SENSOR_TEMP:
3397 		ret = wlan_ret_get_sensor_temp(pmpriv, resp, pioctl_buf);
3398 		break;
3399 	case HostCmd_CMD_802_11_MIMO_SWITCH:
3400 		break;
3401 	case HostCmd_CMD_IPV6_RA_OFFLOAD_CFG:
3402 		ret = wlan_ret_ipv6_ra_offload(pmpriv, resp, pioctl_buf);
3403 		break;
3404 	case HostCmd_CMD_STA_CONFIGURE:
3405 		ret = wlan_ret_sta_config(pmpriv, resp, pioctl_buf);
3406 		break;
3407 	case HOST_CMD_PMIC_CONFIGURE:
3408 		break;
3409 	case HostCmd_CMD_INDEPENDENT_RESET_CFG:
3410 		ret = wlan_ret_ind_rst_cfg(pmpriv, resp, pioctl_buf);
3411 		break;
3412 	case HostCmd_CMD_802_11_PS_INACTIVITY_TIMEOUT:
3413 		break;
3414 	case HostCmd_CMD_ROAM_OFFLOAD:
3415 		ret = wlan_ret_roam_offload(pmpriv, resp, pioctl_buf);
3416 		break;
3417 	case HostCmd_CMD_GET_TSF:
3418 		ret = wlan_ret_get_tsf(pmpriv, resp, pioctl_buf);
3419 		break;
3420 	case HostCmd_CMD_CHAN_REGION_CFG:
3421 		ret = wlan_ret_chan_region_cfg(pmpriv, resp, pioctl_buf);
3422 		break;
3423 	case HostCmd_CMD_AUTO_TX:
3424 		ret = wlan_ret_auto_tx(pmpriv, resp, pioctl_buf);
3425 		break;
3426 	case HOST_CMD_TX_RX_PKT_STATS:
3427 		ret = wlan_ret_tx_rx_pkt_stats(pmpriv, resp, pioctl_buf);
3428 		break;
3429 	case HostCmd_CMD_DYN_BW:
3430 		ret = wlan_ret_dyn_bw(pmpriv, resp, pioctl_buf);
3431 		break;
3432 	case HostCmd_CMD_BOOT_SLEEP:
3433 		ret = wlan_ret_boot_sleep(pmpriv, resp, pioctl_buf);
3434 		break;
3435 #if defined(DRV_EMBEDDED_SUPPLICANT)
3436 	case HostCmd_CMD_CRYPTO:
3437 		ret = wlan_ret_crypto(pmpriv, resp, pioctl_buf);
3438 		break;
3439 #endif
3440 	case HostCmd_CMD_11AX_CFG:
3441 		ret = wlan_ret_11ax_cfg(pmpriv, resp, pioctl_buf);
3442 		break;
3443 	case HostCmd_CMD_11AX_CMD:
3444 		ret = wlan_ret_11ax_cmd(pmpriv, resp, pioctl_buf);
3445 		break;
3446 	case HostCmd_CMD_RANGE_EXT:
3447 		ret = wlan_ret_range_ext(pmpriv, resp, pioctl_buf);
3448 		break;
3449 	case HostCmd_CMD_TWT_CFG:
3450 		break;
3451 	case HOST_CMD_GPIO_TSF_LATCH_PARAM_CONFIG:
3452 		ret = wlan_ret_gpio_tsf_latch(pmpriv, resp, pioctl_buf);
3453 		break;
3454 	case HostCmd_CMD_RX_ABORT_CFG:
3455 		ret = wlan_ret_rxabortcfg(pmpriv, resp, pioctl_buf);
3456 		break;
3457 	case HostCmd_CMD_RX_ABORT_CFG_EXT:
3458 		ret = wlan_ret_rxabortcfg_ext(pmpriv, resp, pioctl_buf);
3459 		break;
3460 	case HostCmd_CMD_ARB_CONFIG:
3461 		ret = wlan_ret_arb_cfg(pmpriv, resp, pioctl_buf);
3462 		break;
3463 	case HostCmd_CMD_TX_AMPDU_PROT_MODE:
3464 		ret = wlan_ret_tx_ampdu_prot_mode(pmpriv, resp, pioctl_buf);
3465 		break;
3466 	case HostCmd_CMD_DOT11MC_UNASSOC_FTM_CFG:
3467 		ret = wlan_ret_dot11mc_unassoc_ftm_cfg(pmpriv, resp,
3468 						       pioctl_buf);
3469 		break;
3470 	case HostCmd_CMD_HAL_PHY_CFG:
3471 		ret = wlan_ret_hal_phy_cfg(pmpriv, resp, pioctl_buf);
3472 		break;
3473 	case HostCmd_CMD_IPS_CONFIG:
3474 		ret = wlan_ret_ips_cfg(pmpriv, resp, pioctl_buf);
3475 		break;
3476 	case HostCmd_CMD_RATE_ADAPT_CFG:
3477 		ret = wlan_ret_rate_adapt_cfg(pmpriv, resp, pioctl_buf);
3478 		break;
3479 	case HostCmd_CMD_CCK_DESENSE_CFG:
3480 		ret = wlan_ret_cck_desense_cfg(pmpriv, resp, pioctl_buf);
3481 		break;
3482 	case HostCmd_CHANNEL_TRPC_CONFIG:
3483 		ret = wlan_ret_get_chan_trpc_config(pmpriv, resp, pioctl_buf);
3484 		break;
3485 	case HostCmd_CMD_LOW_POWER_MODE_CFG:
3486 		ret = wlan_ret_set_get_low_power_mode_cfg(pmpriv, resp,
3487 							  pioctl_buf);
3488 		break;
3489 	case HostCmd_CMD_MFG_COMMAND:
3490 		ret = wlan_ret_mfg(pmpriv, resp, pioctl_buf);
3491 		break;
3492 	case HostCmd_CMD_MC_AGGR_CFG:
3493 		ret = wlan_ret_mc_aggr_cfg(pmpriv, resp, pioctl_buf);
3494 		break;
3495 	case HostCmd_CMD_GET_CH_LOAD:
3496 		ret = wlan_ret_ch_load(pmpriv, resp, pioctl_buf);
3497 		break;
3498 	default:
3499 		PRINTM(MERROR, "CMD_RESP: Unknown command response %#x\n",
3500 		       resp->command);
3501 		break;
3502 	}
3503 
3504 	LEAVE();
3505 	return ret;
3506 }
3507