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