/** @file mlan_sta_cmdresp.c
 *
 *  @brief This file contains the handling of command
 *  responses generated by firmware.
 *
 *
 *  Copyright 2008-2021 NXP
 *
 *  This software file (the File) is distributed by NXP
 *  under the terms of the GNU General Public License Version 2, June 1991
 *  (the License).  You may use, redistribute and/or modify the File in
 *  accordance with the terms and conditions of the License, a copy of which
 *  is available by writing to the Free Software Foundation, Inc.,
 *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA or on the
 *  worldwide web at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
 *
 *  THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
 *  IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
 *  ARE EXPRESSLY DISCLAIMED.  The License provides additional details about
 *  this warranty disclaimer.
 *
 */

/******************************************************
 * Change log:
 *   10/21/2008: initial version
 ******************************************************/

#include "mlan.h"
#include "mlan_join.h"
#include "mlan_util.h"
#include "mlan_fw.h"
#include "mlan_main.h"
#include "mlan_wmm.h"
#include "mlan_11n.h"
#include "mlan_11ac.h"
#include "mlan_11ax.h"
#include "mlan_11h.h"
#include "mlan_meas.h"

/********************************************************
 *			Local Variables
 ********************************************************/

/********************************************************
 *			Global Variables
 ********************************************************/

/********************************************************
 *			Local Functions
 ********************************************************/
/**
 *  @brief This function handles the command response error for TDLS operation
 *
 *  @param pmpriv       A pointer to mlan_private structure
 *  @param resp         A pointer to HostCmd_DS_COMMAND
 *
 *  @return             N/A
 */
static void
wlan_process_cmdreps_error_tdls_operation(mlan_private *pmpriv,
					  HostCmd_DS_COMMAND *resp,
					  mlan_ioctl_req *pioctl_buf)
{
	mlan_adapter *pmadapter = pmpriv->adapter;
	HostCmd_DS_TDLS_OPER *ptdls_oper_data = &(resp->params.tdls_oper_data);
	sta_node *sta_ptr = MNULL;
	t_u16 reason;

	ENTER();
	ptdls_oper_data->tdls_action =
		wlan_le16_to_cpu(ptdls_oper_data->tdls_action);
	reason = wlan_le16_to_cpu(ptdls_oper_data->reason);
	sta_ptr = wlan_get_station_entry(pmpriv, ptdls_oper_data->peer_mac);
	switch (ptdls_oper_data->tdls_action) {
	case TDLS_CREATE:
		/* TDLS create command error */
		if (reason != TDLS_LINK_EXISTS && sta_ptr) {
			PRINTM(MERROR,
			       "TDLS CREATE operation: cmd error reason %d\n",
			       reason);
			sta_ptr->status = TDLS_SETUP_FAILURE;
		}
		if (reason == TDLS_LINK_EXISTS && pioctl_buf)
			pioctl_buf->status_code = MLAN_STATUS_SUCCESS;
		break;
	case TDLS_CONFIG:
		/* TDLS config command error */
		PRINTM(MERROR,
		       "TDLS CONFIG operation: command error, reason %d\n",
		       reason);
		if (sta_ptr)
			sta_ptr->status = TDLS_SETUP_FAILURE;
		break;
	case TDLS_DELETE:
		/* TDLS delete command error */
		wlan_restore_tdls_packets(pmpriv, ptdls_oper_data->peer_mac,
					  TDLS_TEAR_DOWN);
		if (sta_ptr) {
			/**tdls cs stop*/
			if (ISSUPP_EXTCAP_TDLS_CHAN_SWITCH
			    (sta_ptr->ExtCap.ext_cap))
				wlan_tdls_config(pmpriv, MFALSE);
			if (sta_ptr->is_11n_enabled) {
				wlan_cleanup_reorder_tbl(pmpriv,
							 ptdls_oper_data->
							 peer_mac);
				wlan_11n_cleanup_txbastream_tbl(pmpriv,
								ptdls_oper_data->
								peer_mac);
			}
			if (sta_ptr->status >= TDLS_SETUP_INPROGRESS)
				wlan_delete_station_entry(pmpriv,
							  ptdls_oper_data->
							  peer_mac);
		}
		if (wlan_is_station_list_empty(pmpriv) == MTRUE)
			pmadapter->tdls_status = TDLS_NOT_SETUP;
		else
			pmadapter->tdls_status = TDLS_IN_BASE_CHANNEL;

		if (reason == TDLS_LINK_NONEXISTENT) {
			if (pioctl_buf)
				pioctl_buf->status_code = MLAN_STATUS_SUCCESS;
		} else {
			PRINTM(MERROR,
			       "TDLS DELETE operation: cmd error, reason %d\n",
			       reason);
		}
		break;
	}
	LEAVE();
	return;
}

/**
 *  @brief This function handles the command response error
 *
 *  @param pmpriv       A pointer to mlan_private structure
 *  @param resp         A pointer to HostCmd_DS_COMMAND
 *  @param pioctl_buf   A pointer to command buffer
 *
 *  @return             N/A
 */
static mlan_status
wlan_process_cmdresp_error(mlan_private *pmpriv,
			   HostCmd_DS_COMMAND *resp, mlan_ioctl_req *pioctl_buf)
{
	mlan_adapter *pmadapter = pmpriv->adapter;
	pmlan_ioctl_req pscan_ioctl_req = MNULL;
	mlan_callbacks *pcb = MNULL;
	tdls_all_config *tdls_all_cfg = MNULL;
	HostCmd_DS_TDLS_CONFIG *ptdls_config_data =
		&(resp->params.tdls_config_data);

#if defined(USB)
	t_s32 i = 0;
#endif
	mlan_status ret = MLAN_STATUS_FAILURE;

	ENTER();
	if (resp->command != HostCmd_CMD_WMM_PARAM_CONFIG
	    && resp->command != HostCmd_CMD_CHAN_REGION_CFG)
		PRINTM(MERROR, "CMD_RESP: cmd %#x error, result=%#x\n",
		       resp->command, resp->result);
	if (pioctl_buf)
		pioctl_buf->status_code = MLAN_ERROR_FW_CMDRESP;

	switch (resp->command) {
	case HostCmd_CMD_802_11_PS_MODE_ENH:{
			HostCmd_DS_802_11_PS_MODE_ENH *pm =
				&resp->params.psmode_enh;
			PRINTM(MERROR,
			       "PS_MODE_ENH command failed: result=0x%x action=0x%X\n",
			       resp->result, wlan_le16_to_cpu(pm->action));
			/*
			 * We do not re-try enter-ps command in ad-hoc mode.
			 */
			if (wlan_le16_to_cpu(pm->action) == EN_AUTO_PS &&
			    (wlan_le16_to_cpu(pm->params.auto_ps.ps_bitmap) &
			     BITMAP_STA_PS) &&
			    pmpriv->bss_mode == MLAN_BSS_MODE_IBSS)
				pmadapter->ps_mode = Wlan802_11PowerModeCAM;
		}
		break;
	case HostCmd_CMD_802_11_SCAN_EXT:
	case HostCmd_CMD_802_11_SCAN:
		/* Cancel all pending scan command */
		wlan_flush_scan_queue(pmadapter);

		pcb = (pmlan_callbacks)&pmadapter->callbacks;

		wlan_request_cmd_lock(pmadapter);
		pmadapter->scan_processing = MFALSE;
		pscan_ioctl_req = pmadapter->pscan_ioctl_req;
		pmadapter->pscan_ioctl_req = MNULL;
		/* Need to indicate IOCTL complete */
		if (pscan_ioctl_req) {
			pscan_ioctl_req->status_code = MLAN_ERROR_CMD_SCAN_FAIL;
			/* Indicate ioctl complete */
			pcb->moal_ioctl_complete(pmadapter->pmoal_handle,
						 (pmlan_ioctl_req)
						 pscan_ioctl_req,
						 MLAN_STATUS_FAILURE);
		}
		wlan_release_cmd_lock(pmadapter);
		wlan_recv_event(pmpriv, MLAN_EVENT_ID_DRV_SCAN_REPORT, MNULL);
		break;

	case HostCmd_CMD_MAC_CONTROL:
		break;

	case HostCmd_CMD_TDLS_CONFIG:
		ptdls_config_data->tdls_info.tdls_action =
			wlan_le16_to_cpu(ptdls_config_data->tdls_info.
					 tdls_action);
		switch (ptdls_config_data->tdls_info.tdls_action) {
		case WLAN_TDLS_SETUP_REQ:
			/* TDLS link setup error ;display error in logs */
			tdls_all_cfg = (tdls_all_config *)
				ptdls_config_data->tdls_info.tdls_data;
			PRINTM(MERROR, "TDLS Setup Failed, error %d\n",
			       wlan_le16_to_cpu(tdls_all_cfg->u.tdls_cmd_resp.
						reason_code));
			break;
		case WLAN_TDLS_INIT_CHAN_SWITCH:
			tdls_all_cfg = (tdls_all_config *)
				ptdls_config_data->tdls_info.tdls_data;
			PRINTM(MERROR,
			       "TDLS init channel switch failed," MACSTR
			       ": reason=%d\n",
			       MAC2STR(tdls_all_cfg->u.tdls_cmd_resp.
				       peer_mac_addr),
			       wlan_le16_to_cpu(tdls_all_cfg->u.tdls_cmd_resp.
						reason_code));
			break;
		}
		break;
	case HostCmd_CMD_TDLS_OPERATION:
		wlan_process_cmdreps_error_tdls_operation(pmpriv, resp,
							  pioctl_buf);
		break;
	case HostCmd_CMD_PACKET_AGGR_CTRL:
#ifdef USB
		if (IS_USB(pmadapter->card_type)) {
			for (i = 0; i < MAX_USB_TX_PORT_NUM; i++)
				pmadapter->pcard_usb->usb_tx_aggr[i]
					.aggr_ctrl.enable = MFALSE;
			pmadapter->pcard_usb->usb_rx_deaggr.aggr_ctrl.enable =
				MFALSE;
		}
#endif
		break;
#ifdef USB
	case HostCmd_CMD_PACKET_AGGR_OVER_HOST_INTERFACE:
		pmadapter->pcard_usb->fw_usb_aggr = MFALSE;
		for (i = 0; i < MAX_USB_TX_PORT_NUM; i++)
			pmadapter->pcard_usb->usb_tx_aggr[i].aggr_ctrl.enable =
				MFALSE;
		pmadapter->pcard_usb->usb_rx_deaggr.aggr_ctrl.enable = MFALSE;
		break;
#endif
	case HostCmd_CMD_802_11_ASSOCIATE:
		wlan_reset_connect_state(pmpriv, MTRUE);
		break;
#ifdef SDIO
	case HostCmd_CMD_SDIO_SP_RX_AGGR_CFG:
		pmadapter->pcard_sd->sdio_rx_aggr_enable = MFALSE;
		PRINTM(MMSG, "FW don't support SDIO single port rx aggr\n");
		break;
#endif

	case HostCmd_CMD_MGMT_IE_LIST:{
			HostCmd_DS_MGMT_IE_LIST_CFG *pmgmt_ie_list =
				&(resp->params.mgmt_ie_list);
			t_u16 resp_len = 0, travel_len = 0, index;
			mlan_ds_misc_custom_ie *cust_ie = MNULL;
			custom_ie *cptr;

			if (wlan_le16_to_cpu(pmgmt_ie_list->action) ==
			    HostCmd_ACT_GEN_GET)
				break;

			cust_ie =
				(mlan_ds_misc_custom_ie *)&pmgmt_ie_list->
				ds_mgmt_ie;
			if (cust_ie) {
				cust_ie->type = wlan_le16_to_cpu(cust_ie->type);
				resp_len = cust_ie->len =
					wlan_le16_to_cpu(cust_ie->len);
				travel_len = 0;
				/* conversion for index, mask, len */
				if (resp_len == sizeof(t_u16))
					cust_ie->ie_data_list[0]
						.ie_index =
						wlan_cpu_to_le16(cust_ie->
								 ie_data_list
								 [0].ie_index);

				while (resp_len > sizeof(t_u16)) {
					cptr = (custom_ie
						*)(((t_u8 *)cust_ie->
						    ie_data_list) + travel_len);
					index = cptr->ie_index =
						wlan_le16_to_cpu(cptr->
								 ie_index);
					cptr->mgmt_subtype_mask =
						wlan_le16_to_cpu(cptr->
								 mgmt_subtype_mask);
					cptr->ie_length =
						wlan_le16_to_cpu(cptr->
								 ie_length);
					travel_len +=
						cptr->ie_length +
						sizeof(custom_ie) - MAX_IE_SIZE;
					resp_len -=
						cptr->ie_length +
						sizeof(custom_ie) - MAX_IE_SIZE;
					if ((pmpriv->mgmt_ie[index].
					     mgmt_subtype_mask ==
					     cptr->mgmt_subtype_mask) &&
					    (pmpriv->mgmt_ie[index].ie_length ==
					     cptr->ie_length) &&
					    !memcmp(pmpriv->adapter,
						    pmpriv->mgmt_ie[index].
						    ie_buffer, cptr->ie_buffer,
						    cptr->ie_length)) {
						PRINTM(MERROR,
						       "set custom ie fail, remove ie index :%d\n",
						       index);
						memset(pmadapter,
						       &pmpriv->mgmt_ie[index],
						       0, sizeof(custom_ie));
					}
				}
			}
		} break;
	case HostCmd_CMD_CHAN_REGION_CFG:
		ret = MLAN_STATUS_SUCCESS;
		PRINTM(MCMND, "FW don't support chan region cfg command!\n");
		break;
#if defined(DRV_EMBEDDED_SUPPLICANT)
	case HostCmd_CMD_CRYPTO:
		PRINTM(MCMND, "crypto cmd result=0x%x!\n", resp->result);
		ret = wlan_ret_crypto(pmpriv, resp, pioctl_buf);
		break;
#endif
	default:
		break;
	}
	/*
	 * Handling errors here
	 */
	wlan_request_cmd_lock(pmadapter);
	wlan_insert_cmd_to_free_q(pmadapter, pmadapter->curr_cmd);
	pmadapter->curr_cmd = MNULL;
	wlan_release_cmd_lock(pmadapter);

	LEAVE();
	return ret;
}

/**
 *  @brief This function handles the command response of RSSI info
 *
 *  @param pmpriv       A pointer to mlan_private structure
 *  @param resp         A pointer to HostCmd_DS_COMMAND
 *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
 *
 *  @return             MLAN_STATUS_SUCCESS
 */
static mlan_status
wlan_ret_802_11_rssi_info_ext(pmlan_private pmpriv,
			      HostCmd_DS_COMMAND *resp,
			      mlan_ioctl_req *pioctl_buf)
{
	HostCmd_DS_802_11_RSSI_INFO_EXT *prssi_info_rsp =
		&resp->params.rssi_info_ext;
	mlan_ds_get_signal *signal = MNULL;
	mlan_ds_get_info *info = MNULL;
	MrvlIEtypes_RSSI_EXT_t *signal_info_tlv = MNULL;
	t_u16 tlv_left_len = 0, tlv_num = 0;
	t_u16 tlv_id, tlv_len;

	ENTER();

	/* Need to indicate IOCTL complete */
	if (pioctl_buf != MNULL) {
		info = (mlan_ds_get_info *)pioctl_buf->pbuf;
		signal_info_tlv =
			(MrvlIEtypes_RSSI_EXT_t *) (prssi_info_rsp->tlv_buf);
		tlv_left_len =
			resp->size -
			(sizeof(HostCmd_DS_802_11_RSSI_INFO_EXT) + S_DS_GEN);

		while (tlv_left_len >= sizeof(MrvlIEtypes_RSSI_EXT_t)) {
			tlv_id = wlan_le16_to_cpu(signal_info_tlv->header.type);
			tlv_len = wlan_le16_to_cpu(signal_info_tlv->header.len);
			if ((tlv_id != TLV_TYPE_RSSI_INFO) ||
			    (tlv_len != sizeof(MrvlIEtypes_RSSI_EXT_t) -
			     sizeof(MrvlIEtypesHeader_t))) {
				PRINTM(MERROR,
				       "Invalid RSSI INFO TLV, type=%d, len=%d\n",
				       tlv_id, tlv_len);
				break;
			}

			signal = (mlan_ds_get_signal *)&info->param.
				signal_ext[tlv_num];
			/* PATH ID */
			signal->selector =
				wlan_le16_to_cpu(signal_info_tlv->path_id);

			/* RSSI */
			signal->bcn_rssi_last =
				wlan_le16_to_cpu(signal_info_tlv->
						 bcn_rssi_last);
			signal->bcn_rssi_avg =
				wlan_le16_to_cpu(signal_info_tlv->bcn_rssi_avg);
			signal->data_rssi_last =
				wlan_le16_to_cpu(signal_info_tlv->
						 data_rssi_last);
			signal->data_rssi_avg =
				wlan_le16_to_cpu(signal_info_tlv->
						 data_rssi_avg);

			/* SNR */
			signal->bcn_snr_last =
				CAL_SNR(wlan_le16_to_cpu
					(signal_info_tlv->bcn_rssi_last),
					wlan_le16_to_cpu(signal_info_tlv->
							 bcn_nf_last));
			signal->bcn_snr_avg =
				CAL_SNR(wlan_le16_to_cpu
					(signal_info_tlv->bcn_rssi_avg),
					wlan_le16_to_cpu(signal_info_tlv->
							 bcn_nf_avg));
			signal->data_snr_last =
				CAL_SNR(wlan_le16_to_cpu
					(signal_info_tlv->data_rssi_last),
					wlan_le16_to_cpu(signal_info_tlv->
							 data_nf_last));
			signal->data_snr_avg =
				CAL_SNR(wlan_le16_to_cpu
					(signal_info_tlv->data_rssi_avg),
					wlan_le16_to_cpu(signal_info_tlv->
							 data_nf_avg));

			/* NF */
			signal->bcn_nf_last =
				wlan_le16_to_cpu(signal_info_tlv->bcn_nf_last);
			signal->bcn_nf_avg =
				wlan_le16_to_cpu(signal_info_tlv->bcn_nf_avg);
			signal->data_nf_last =
				wlan_le16_to_cpu(signal_info_tlv->data_nf_last);
			signal->data_nf_avg =
				wlan_le16_to_cpu(signal_info_tlv->data_nf_avg);

			tlv_left_len -= sizeof(MrvlIEtypes_RSSI_EXT_t);
			signal_info_tlv++;
			tlv_num++;
			if (tlv_num > MAX_PATH_NUM)
				break;
		}

		pioctl_buf->data_read_written =
			tlv_num * sizeof(mlan_ds_get_signal) + sizeof(t_u32);
	}

	LEAVE();
	return MLAN_STATUS_SUCCESS;
}

/**
 *  @brief This function handles the command response of RSSI info
 *
 *  @param pmpriv       A pointer to mlan_private structure
 *  @param resp         A pointer to HostCmd_DS_COMMAND
 *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
 *
 *  @return             MLAN_STATUS_SUCCESS
 */
static mlan_status
wlan_ret_802_11_rssi_info(pmlan_private pmpriv,
			  HostCmd_DS_COMMAND *resp, mlan_ioctl_req *pioctl_buf)
{
	HostCmd_DS_802_11_RSSI_INFO_RSP *prssi_info_rsp =
		&resp->params.rssi_info_rsp;
	mlan_ds_get_info *pget_info = MNULL;
	BSSDescriptor_t *pbss_desc;
	t_s32 tbl_idx = 0;

	ENTER();

	pmpriv->data_rssi_last =
		wlan_le16_to_cpu(prssi_info_rsp->data_rssi_last);
	pmpriv->data_nf_last = wlan_le16_to_cpu(prssi_info_rsp->data_nf_last);

	pmpriv->data_rssi_avg = wlan_le16_to_cpu(prssi_info_rsp->data_rssi_avg);
	pmpriv->data_nf_avg = wlan_le16_to_cpu(prssi_info_rsp->data_nf_avg);

	pmpriv->bcn_rssi_last = wlan_le16_to_cpu(prssi_info_rsp->bcn_rssi_last);
	pmpriv->bcn_nf_last = wlan_le16_to_cpu(prssi_info_rsp->bcn_nf_last);

	pmpriv->bcn_rssi_avg = wlan_le16_to_cpu(prssi_info_rsp->bcn_rssi_avg);
	pmpriv->bcn_nf_avg = wlan_le16_to_cpu(prssi_info_rsp->bcn_nf_avg);

	/* Get current BSS info */
	pbss_desc = &pmpriv->curr_bss_params.bss_descriptor;
	pbss_desc->rssi = -pmpriv->bcn_rssi_avg;
	tbl_idx = wlan_find_ssid_in_list(pmpriv, &pbss_desc->ssid,
					 pbss_desc->mac_address,
					 pmpriv->bss_mode);
	if (tbl_idx >= 0) {
		pbss_desc = &pmpriv->adapter->pscan_table[tbl_idx];
		pbss_desc->rssi = -pmpriv->bcn_rssi_avg;
	}

	/* Need to indicate IOCTL complete */
	if (pioctl_buf != MNULL) {
		pget_info = (mlan_ds_get_info *)pioctl_buf->pbuf;

		memset(pmpriv->adapter, &pget_info->param.signal, 0,
		       sizeof(mlan_ds_get_signal));

		pget_info->param.signal.selector = ALL_RSSI_INFO_MASK;

		/* RSSI */
		pget_info->param.signal.bcn_rssi_last = pmpriv->bcn_rssi_last;
		pget_info->param.signal.bcn_rssi_avg = pmpriv->bcn_rssi_avg;
		pget_info->param.signal.data_rssi_last = pmpriv->data_rssi_last;
		pget_info->param.signal.data_rssi_avg = pmpriv->data_rssi_avg;

		/* SNR */
		pget_info->param.signal.bcn_snr_last =
			CAL_SNR(pmpriv->bcn_rssi_last, pmpriv->bcn_nf_last);
		pget_info->param.signal.bcn_snr_avg =
			CAL_SNR(pmpriv->bcn_rssi_avg, pmpriv->bcn_nf_avg);
		pget_info->param.signal.data_snr_last =
			CAL_SNR(pmpriv->data_rssi_last, pmpriv->data_nf_last);
		pget_info->param.signal.data_snr_avg =
			CAL_SNR(pmpriv->data_rssi_avg, pmpriv->data_nf_avg);

		/* NF */
		pget_info->param.signal.bcn_nf_last = pmpriv->bcn_nf_last;
		pget_info->param.signal.bcn_nf_avg = pmpriv->bcn_nf_avg;
		pget_info->param.signal.data_nf_last = pmpriv->data_nf_last;
		pget_info->param.signal.data_nf_avg = pmpriv->data_nf_avg;

		pioctl_buf->data_read_written = sizeof(mlan_ds_get_info);
	}

	LEAVE();
	return MLAN_STATUS_SUCCESS;
}

/**
 *  @brief This function handles the command response of snmp_mib
 *
 *  @param pmpriv       A pointer to mlan_private structure
 *  @param resp         A pointer to HostCmd_DS_COMMAND
 *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
 *
 *  @return             MLAN_STATUS_SUCCESS
 */
static mlan_status
wlan_ret_802_11_snmp_mib(pmlan_private pmpriv,
			 HostCmd_DS_COMMAND *resp, mlan_ioctl_req *pioctl_buf)
{
	HostCmd_DS_802_11_SNMP_MIB *psmib = &resp->params.smib;
	t_u16 oid = wlan_le16_to_cpu(psmib->oid);
	t_u16 query_type = wlan_le16_to_cpu(psmib->query_type);
	t_u32 ul_temp;
	mlan_ds_snmp_mib *mib = MNULL;

	ENTER();

	if (pioctl_buf)
		mib = (mlan_ds_snmp_mib *)pioctl_buf->pbuf;

	PRINTM(MINFO, "SNMP_RESP: value of the oid = 0x%x, query_type=0x%x\n",
	       oid, query_type);
	PRINTM(MINFO, "SNMP_RESP: Buf size  = 0x%x\n",
	       wlan_le16_to_cpu(psmib->buf_size));
	if (query_type == HostCmd_ACT_GEN_GET) {
		switch (oid) {
		case DtimPeriod_i:
			ul_temp = psmib->value[0];
			PRINTM(MINFO, "SNMP_RESP: DTIM Period =%u\n", ul_temp);
			if (mib)
				mib->param.dtim_period = ul_temp;
			break;
		case FragThresh_i:
			ul_temp = wlan_le16_to_cpu(*((t_u16 *)(psmib->value)));
			PRINTM(MINFO, "SNMP_RESP: FragThsd =%u\n", ul_temp);
			if (mib)
				mib->param.frag_threshold = ul_temp;
			break;

		case RtsThresh_i:
			ul_temp = wlan_le16_to_cpu(*((t_u16 *)(psmib->value)));
			PRINTM(MINFO, "SNMP_RESP: RTSThsd =%u\n", ul_temp);
			if (mib)
				mib->param.rts_threshold = ul_temp;
			break;

		case ShortRetryLim_i:
			ul_temp = wlan_le16_to_cpu(*((t_u16 *)(psmib->value)));
			PRINTM(MINFO, "SNMP_RESP: TxRetryCount=%u\n", ul_temp);
			if (mib)
				mib->param.retry_count = ul_temp;
			break;
		case WwsMode_i:
			ul_temp = wlan_le16_to_cpu(*((t_u16 *)(psmib->value)));
			PRINTM(MINFO, "SNMP_RESP: WWSCfg =%u\n", ul_temp);
			if (pioctl_buf)
				((mlan_ds_misc_cfg *)pioctl_buf->pbuf)
					->param.wws_cfg = ul_temp;
			break;
		case Thermal_i:
			ul_temp = wlan_le32_to_cpu(*((t_u32 *)(psmib->value)));
			PRINTM(MINFO, "SNMP_RESP: Thermal =%u\n", ul_temp);
			if (pioctl_buf)
				((mlan_ds_misc_cfg *)pioctl_buf->pbuf)
					->param.thermal = ul_temp;
			break;
		case NullPktPeriod_i:
			ul_temp = psmib->value[0];
			PRINTM(MINFO, "SNMP_RESP: Auto NULL Pkt Period =%u\n",
			       ul_temp);
			break;
		default:
			break;
		}
	} else {		/* (query_type == HostCmd_ACT_GEN_SET) */
		/* Update state for 11d */
		if (oid == Dot11D_i) {
			ul_temp = wlan_le16_to_cpu(*((t_u16 *)(psmib->value)));
			/* Set 11d state to private */
			pmpriv->state_11d.enable_11d = ul_temp;
			/* Set user enable flag if called from ioctl */
			if (pioctl_buf)
				pmpriv->state_11d.user_enable_11d = ul_temp;
		}
		/* Update state for 11h */
		if (oid == Dot11H_i) {
			ul_temp = wlan_le16_to_cpu(*((t_u16 *)(psmib->value)));
			/* Set 11h state to priv */
			pmpriv->intf_state_11h.is_11h_active =
				(ul_temp & ENABLE_11H_MASK);
			/* Set radar_det state to adapter */
			pmpriv->adapter->state_11h.is_master_radar_det_active =
				(ul_temp & MASTER_RADAR_DET_MASK) ? MTRUE :
				MFALSE;
			pmpriv->adapter->state_11h.is_slave_radar_det_active =
				(ul_temp & SLAVE_RADAR_DET_MASK) ? MTRUE :
				MFALSE;
		}
	}

	if (pioctl_buf) {
		/* Indicate ioctl complete */
		pioctl_buf->data_read_written = sizeof(mlan_ds_snmp_mib);
	}

	LEAVE();
	return MLAN_STATUS_SUCCESS;
}

/**
 *  @brief This function handles the command response of get_log
 *
 *  @param pmpriv       A pointer to mlan_private structure
 *  @param resp         A pointer to HostCmd_DS_COMMAND
 *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
 *
 *  @return             MLAN_STATUS_SUCCESS
 */
static mlan_status
wlan_ret_get_log(pmlan_private pmpriv,
		 HostCmd_DS_COMMAND *resp, mlan_ioctl_req *pioctl_buf)
{
	HostCmd_DS_802_11_GET_LOG *pget_log =
		(HostCmd_DS_802_11_GET_LOG *)&resp->params.get_log;
	mlan_ds_get_info *pget_info = MNULL;
	int i = 0;

	ENTER();

	if (pioctl_buf) {
		pget_info = (mlan_ds_get_info *)pioctl_buf->pbuf;
		pget_info->param.stats.mcast_tx_frame =
			wlan_le32_to_cpu(pget_log->mcast_tx_frame);
		pget_info->param.stats.failed =
			wlan_le32_to_cpu(pget_log->failed);
		pget_info->param.stats.retry =
			wlan_le32_to_cpu(pget_log->retry);
		pget_info->param.stats.multi_retry =
			wlan_le32_to_cpu(pget_log->multiretry);
		pget_info->param.stats.frame_dup =
			wlan_le32_to_cpu(pget_log->frame_dup);
		pget_info->param.stats.rts_success =
			wlan_le32_to_cpu(pget_log->rts_success);
		pget_info->param.stats.rts_failure =
			wlan_le32_to_cpu(pget_log->rts_failure);
		pget_info->param.stats.ack_failure =
			wlan_le32_to_cpu(pget_log->ack_failure);
		pget_info->param.stats.rx_frag =
			wlan_le32_to_cpu(pget_log->rx_frag);
		pget_info->param.stats.mcast_rx_frame =
			wlan_le32_to_cpu(pget_log->mcast_rx_frame);
		pget_info->param.stats.fcs_error =
			wlan_le32_to_cpu(pget_log->fcs_error);
		pget_info->param.stats.tx_frame =
			wlan_le32_to_cpu(pget_log->tx_frame);
		pget_info->param.stats.wep_icv_error[0] =
			wlan_le32_to_cpu(pget_log->wep_icv_err_cnt[0]);
		pget_info->param.stats.wep_icv_error[1] =
			wlan_le32_to_cpu(pget_log->wep_icv_err_cnt[1]);
		pget_info->param.stats.wep_icv_error[2] =
			wlan_le32_to_cpu(pget_log->wep_icv_err_cnt[2]);
		pget_info->param.stats.wep_icv_error[3] =
			wlan_le32_to_cpu(pget_log->wep_icv_err_cnt[3]);
		pget_info->param.stats.bcn_rcv_cnt =
			wlan_le32_to_cpu(pget_log->bcn_rcv_cnt);
		pget_info->param.stats.bcn_miss_cnt =
			wlan_le32_to_cpu(pget_log->bcn_miss_cnt);
		pget_info->param.stats.amsdu_rx_cnt = pmpriv->amsdu_rx_cnt;
		pget_info->param.stats.msdu_in_rx_amsdu_cnt =
			pmpriv->msdu_in_rx_amsdu_cnt;
		pget_info->param.stats.amsdu_tx_cnt = pmpriv->amsdu_tx_cnt;
		pget_info->param.stats.msdu_in_tx_amsdu_cnt =
			pmpriv->msdu_in_tx_amsdu_cnt;
		pget_info->param.stats.rx_stuck_issue_cnt[0] =
			wlan_le32_to_cpu(pget_log->rx_stuck_issue_cnt[0]);
		pget_info->param.stats.rx_stuck_issue_cnt[1] =
			wlan_le32_to_cpu(pget_log->rx_stuck_issue_cnt[1]);
		pget_info->param.stats.rx_stuck_recovery_cnt =
			wlan_le32_to_cpu(pget_log->rx_stuck_recovery_cnt);
		pget_info->param.stats.rx_stuck_tsf[0] =
			wlan_le64_to_cpu(pget_log->rx_stuck_tsf[0]);
		pget_info->param.stats.rx_stuck_tsf[1] =
			wlan_le64_to_cpu(pget_log->rx_stuck_tsf[1]);
		pget_info->param.stats.tx_watchdog_recovery_cnt =
			wlan_le32_to_cpu(pget_log->tx_watchdog_recovery_cnt);
		pget_info->param.stats.tx_watchdog_tsf[0] =
			wlan_le64_to_cpu(pget_log->tx_watchdog_tsf[0]);
		pget_info->param.stats.tx_watchdog_tsf[1] =
			wlan_le64_to_cpu(pget_log->tx_watchdog_tsf[1]);
		pget_info->param.stats.channel_switch_ann_sent =
			wlan_le32_to_cpu(pget_log->channel_switch_ann_sent);
		pget_info->param.stats.channel_switch_state =
			wlan_le32_to_cpu(pget_log->channel_switch_state);
		pget_info->param.stats.reg_class =
			wlan_le32_to_cpu(pget_log->reg_class);
		pget_info->param.stats.channel_number =
			wlan_le32_to_cpu(pget_log->channel_number);
		pget_info->param.stats.channel_switch_mode =
			wlan_le32_to_cpu(pget_log->channel_switch_mode);
		pget_info->param.stats.rx_reset_mac_recovery_cnt =
			wlan_le32_to_cpu(pget_log->rx_reset_mac_recovery_cnt);
		pget_info->param.stats.rx_Isr2_NotDone_Cnt =
			wlan_le32_to_cpu(pget_log->rx_Isr2_NotDone_Cnt);
		pget_info->param.stats.gdma_abort_cnt =
			wlan_le32_to_cpu(pget_log->gdma_abort_cnt);
		pget_info->param.stats.g_reset_rx_mac_cnt =
			wlan_le32_to_cpu(pget_log->g_reset_rx_mac_cnt);
		//Ownership error counters
		pget_info->param.stats.dwCtlErrCnt =
			wlan_le32_to_cpu(pget_log->dwCtlErrCnt);
		pget_info->param.stats.dwBcnErrCnt =
			wlan_le32_to_cpu(pget_log->dwBcnErrCnt);
		pget_info->param.stats.dwMgtErrCnt =
			wlan_le32_to_cpu(pget_log->dwMgtErrCnt);
		pget_info->param.stats.dwDatErrCnt =
			wlan_le32_to_cpu(pget_log->dwDatErrCnt);
		pget_info->param.stats.bigtk_mmeGoodCnt =
			wlan_le32_to_cpu(pget_log->bigtk_mmeGoodCnt);
		pget_info->param.stats.bigtk_replayErrCnt =
			wlan_le32_to_cpu(pget_log->bigtk_replayErrCnt);
		pget_info->param.stats.bigtk_micErrCnt =
			wlan_le32_to_cpu(pget_log->bigtk_micErrCnt);
		pget_info->param.stats.bigtk_mmeNotFoundCnt =
			wlan_le32_to_cpu(pget_log->bigtk_mmeNotFoundCnt);

		if (pmpriv->adapter->getlog_enable) {
			pget_info->param.stats.tx_frag_cnt =
				wlan_le32_to_cpu(pget_log->tx_frag_cnt);
			for (i = 0; i < 8; i++) {
				pget_info->param.stats.qos_tx_frag_cnt[i] =
					wlan_le32_to_cpu(pget_log->
							 qos_tx_frag_cnt[i]);
				pget_info->param.stats.qos_failed_cnt[i] =
					wlan_le32_to_cpu(pget_log->
							 qos_failed_cnt[i]);
				pget_info->param.stats.qos_retry_cnt[i] =
					wlan_le32_to_cpu(pget_log->
							 qos_retry_cnt[i]);
				pget_info->param.stats.qos_multi_retry_cnt[i] =
					wlan_le32_to_cpu(pget_log->
							 qos_multi_retry_cnt
							 [i]);
				pget_info->param.stats.qos_frm_dup_cnt[i] =
					wlan_le32_to_cpu(pget_log->
							 qos_frm_dup_cnt[i]);
				pget_info->param.stats.qos_rts_suc_cnt[i] =
					wlan_le32_to_cpu(pget_log->
							 qos_rts_suc_cnt[i]);
				pget_info->param.stats.qos_rts_failure_cnt[i] =
					wlan_le32_to_cpu(pget_log->
							 qos_rts_failure_cnt
							 [i]);
				pget_info->param.stats.qos_ack_failure_cnt[i] =
					wlan_le32_to_cpu(pget_log->
							 qos_ack_failure_cnt
							 [i]);
				pget_info->param.stats.qos_rx_frag_cnt[i] =
					wlan_le32_to_cpu(pget_log->
							 qos_rx_frag_cnt[i]);
				pget_info->param.stats.qos_tx_frm_cnt[i] =
					wlan_le32_to_cpu(pget_log->
							 qos_tx_frm_cnt[i]);
				pget_info->param.stats.
					qos_discarded_frm_cnt[i] =
					wlan_le32_to_cpu(pget_log->
							 qos_discarded_frm_cnt
							 [i]);
				pget_info->param.stats.qos_mpdus_rx_cnt[i] =
					wlan_le32_to_cpu(pget_log->
							 qos_mpdus_rx_cnt[i]);
				pget_info->param.stats.qos_retries_rx_cnt[i] =
					wlan_le32_to_cpu(pget_log->
							 qos_retries_rx_cnt[i]);
			}
			pget_info->param.stats.cmacicv_errors =
				wlan_le32_to_cpu(pget_log->cmacicv_errors);
			pget_info->param.stats.cmac_replays =
				wlan_le32_to_cpu(pget_log->cmac_replays);
			pget_info->param.stats.mgmt_ccmp_replays =
				wlan_le32_to_cpu(pget_log->mgmt_ccmp_replays);
			pget_info->param.stats.tkipicv_errors =
				wlan_le32_to_cpu(pget_log->tkipicv_errors);
			pget_info->param.stats.tkip_replays =
				wlan_le32_to_cpu(pget_log->tkip_replays);
			pget_info->param.stats.ccmp_decrypt_errors =
				wlan_le32_to_cpu(pget_log->ccmp_decrypt_errors);
			pget_info->param.stats.ccmp_replays =
				wlan_le32_to_cpu(pget_log->ccmp_replays);
			pget_info->param.stats.tx_amsdu_cnt =
				wlan_le32_to_cpu(pget_log->tx_amsdu_cnt);
			pget_info->param.stats.failed_amsdu_cnt =
				wlan_le32_to_cpu(pget_log->failed_amsdu_cnt);
			pget_info->param.stats.retry_amsdu_cnt =
				wlan_le32_to_cpu(pget_log->retry_amsdu_cnt);
			pget_info->param.stats.multi_retry_amsdu_cnt =
				wlan_le32_to_cpu(pget_log->
						 multi_retry_amsdu_cnt);
			pget_info->param.stats.tx_octets_in_amsdu_cnt =
				wlan_le64_to_cpu(pget_log->
						 tx_octets_in_amsdu_cnt);
			pget_info->param.stats.amsdu_ack_failure_cnt =
				wlan_le32_to_cpu(pget_log->
						 amsdu_ack_failure_cnt);
			pget_info->param.stats.rx_amsdu_cnt =
				wlan_le32_to_cpu(pget_log->rx_amsdu_cnt);
			pget_info->param.stats.rx_octets_in_amsdu_cnt =
				wlan_le64_to_cpu(pget_log->
						 rx_octets_in_amsdu_cnt);
			pget_info->param.stats.tx_ampdu_cnt =
				wlan_le32_to_cpu(pget_log->tx_ampdu_cnt);
			pget_info->param.stats.tx_mpdus_in_ampdu_cnt =
				wlan_le32_to_cpu(pget_log->
						 tx_mpdus_in_ampdu_cnt);
			pget_info->param.stats.tx_octets_in_ampdu_cnt =
				wlan_le64_to_cpu(pget_log->
						 tx_octets_in_ampdu_cnt);
			pget_info->param.stats.ampdu_rx_cnt =
				wlan_le32_to_cpu(pget_log->ampdu_rx_cnt);
			pget_info->param.stats.mpdu_in_rx_ampdu_cnt =
				wlan_le32_to_cpu(pget_log->
						 mpdu_in_rx_ampdu_cnt);
			pget_info->param.stats.rx_octets_in_ampdu_cnt =
				wlan_le64_to_cpu(pget_log->
						 rx_octets_in_ampdu_cnt);
			pget_info->param.stats.ampdu_delimiter_crc_error_cnt =
				wlan_le32_to_cpu(pget_log->
						 ampdu_delimiter_crc_error_cnt);

			/* Indicate ioctl complete */
			pioctl_buf->data_read_written =
				sizeof(mlan_ds_get_info);
		} else
			pioctl_buf->data_read_written =
				sizeof(mlan_ds_get_stats_org) +
				sizeof(pget_info->sub_command);
	}
	LEAVE();
	return MLAN_STATUS_SUCCESS;
}

/**
 *  @brief Get power level and rate index
 *
 *  @param pmpriv       A pointer to mlan_private structure
 *  @param pdata_buf    Pointer to the data buffer
 *
 *  @return             MLAN_STATUS_SUCCESS or MLAN_STATUS_FAILURE
 */
static mlan_status
wlan_get_power_level(pmlan_private pmpriv, void *pdata_buf)
{
	t_u16 length = 0;
	t_s8 max_power = -1, min_power = -1;
	MrvlTypes_Power_Group_t *ppg_tlv = MNULL;
	Power_Group_t *pg = MNULL;

	ENTER();

	if (pdata_buf) {
		ppg_tlv = (MrvlTypes_Power_Group_t
			   *)((t_u8 *)pdata_buf + sizeof(HostCmd_DS_TXPWR_CFG));
		pg = (Power_Group_t *)((t_u8 *)ppg_tlv +
				       sizeof(MrvlTypes_Power_Group_t));
		length = ppg_tlv->length;
		if (length > 0) {
			max_power = pg->power_max;
			min_power = pg->power_min;
			length -= sizeof(Power_Group_t);
		}
		while (length) {
			pg++;
			if (max_power < pg->power_max)
				max_power = pg->power_max;
			if (min_power > pg->power_min)
				min_power = pg->power_min;
			length -= sizeof(Power_Group_t);
		}
		if (ppg_tlv->length > 0) {
			pmpriv->min_tx_power_level = min_power;
			pmpriv->max_tx_power_level = max_power;
		}
	} else {
		LEAVE();
		return MLAN_STATUS_FAILURE;
	}

	LEAVE();
	return MLAN_STATUS_SUCCESS;
}

/**
 *  @brief This function handles the command response of tx_power_cfg
 *
 *  @param pmpriv       A pointer to mlan_private structure
 *  @param resp         A pointer to HostCmd_DS_COMMAND
 *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
 *
 *  @return             MLAN_STATUS_SUCCESS
 */
static mlan_status
wlan_ret_tx_power_cfg(pmlan_private pmpriv,
		      HostCmd_DS_COMMAND *resp, mlan_ioctl_req *pioctl_buf)
{
	HostCmd_DS_TXPWR_CFG *ptxp_cfg = &resp->params.txp_cfg;
	MrvlTypes_Power_Group_t *ppg_tlv = MNULL;
	Power_Group_t *pg = MNULL;
	t_u16 action = wlan_le16_to_cpu(ptxp_cfg->action);
	mlan_ds_power_cfg *power = MNULL;
	mlan_power_group *pwr_grp = MNULL;
	t_u8 i = 0;

	ENTER();

	ppg_tlv = (MrvlTypes_Power_Group_t *)(ptxp_cfg->tlv_buf);
	pg = (Power_Group_t *)((t_u8 *)ppg_tlv +
			       sizeof(MrvlTypes_Power_Group_t));

	switch (action) {
	case HostCmd_ACT_GEN_GET:
		ppg_tlv->length = wlan_le16_to_cpu(ppg_tlv->length);
		if (pmpriv->adapter->hw_status ==
		    WlanHardwareStatusInitializing)
			wlan_get_power_level(pmpriv, ptxp_cfg);
		pmpriv->tx_power_level = (t_s16)pg->power_min;
		break;

	case HostCmd_ACT_GEN_SET:
		if (wlan_le32_to_cpu(ptxp_cfg->mode)) {
			if (pg->power_max == pg->power_min)
				pmpriv->tx_power_level = (t_s16)pg->power_min;
		}
		break;

	default:
		PRINTM(MERROR, "CMD_RESP: unknown command action %d\n", action);
		LEAVE();
		return MLAN_STATUS_SUCCESS;
	}

	PRINTM(MINFO, "Current TxPower Level = %d,Max Power=%d, Min Power=%d\n",
	       pmpriv->tx_power_level, pmpriv->max_tx_power_level,
	       pmpriv->min_tx_power_level);

	if (pioctl_buf) {
		power = (mlan_ds_power_cfg *)pioctl_buf->pbuf;
		if (action == HostCmd_ACT_GEN_GET) {
			if (power->sub_command == MLAN_OID_POWER_CFG) {
				pioctl_buf->data_read_written =
					sizeof(mlan_power_cfg_t) +
					MLAN_SUB_COMMAND_SIZE;
				power->param.power_cfg.power_level =
					pmpriv->tx_power_level;
				if (wlan_le32_to_cpu(ptxp_cfg->mode))
					power->param.power_cfg.is_power_auto =
						0;
				else
					power->param.power_cfg.is_power_auto =
						1;
			} else {
				power->param.power_ext.num_pwr_grp = 0;
				i = 0;
				while ((ppg_tlv->length) &&
				       (i < MAX_POWER_GROUP)) {
					pwr_grp =
						(mlan_power_group *)&power->
						param.power_ext.power_group[i];
					pwr_grp->first_rate_ind = 0;
					pwr_grp->last_rate_ind = 0;
					if (pg->modulation_class ==
					    MOD_CLASS_HR_DSSS) {
						pwr_grp->rate_format =
							MLAN_RATE_FORMAT_LG;
						pwr_grp->first_rate_ind =
							pg->first_rate_code;
						pwr_grp->last_rate_ind =
							pg->last_rate_code;
					} else if (pg->modulation_class ==
						   MOD_CLASS_OFDM) {
						pwr_grp->rate_format =
							MLAN_RATE_FORMAT_LG;
						pwr_grp->first_rate_ind =
							MLAN_RATE_INDEX_OFDM0 +
							pg->first_rate_code;
						pwr_grp->last_rate_ind =
							MLAN_RATE_INDEX_OFDM0 +
							pg->last_rate_code;
					} else if (pg->modulation_class ==
						   MOD_CLASS_HT) {
						pwr_grp->rate_format =
							MLAN_RATE_FORMAT_HT;
						pwr_grp->first_rate_ind =
							pg->first_rate_code;
						pwr_grp->last_rate_ind =
							pg->last_rate_code;
					} else if (pg->modulation_class ==
						   MOD_CLASS_VHT) {
						pwr_grp->rate_format =
							MLAN_RATE_FORMAT_VHT;
						pwr_grp->first_rate_ind =
							(pg->first_rate_code) &
							0xF;
						pwr_grp->last_rate_ind =
							(pg->last_rate_code) &
							0xF;
						// pwr_grp->nss = 1 +
						// (pg->first_rate_code >> 4);
						pwr_grp->nss =
							1 +
							(pg->last_rate_code >>
							 4);
					}
					pwr_grp->bandwidth = pg->ht_bandwidth;
					pwr_grp->power_min = pg->power_min;
					pwr_grp->power_max = pg->power_max;
					pwr_grp->power_step = pg->power_step;
					ppg_tlv->length -=
						sizeof(Power_Group_t);
					pg++;
					i++;
				}
				power->param.power_ext.num_pwr_grp = i;
				pioctl_buf->data_read_written =
					sizeof(mlan_power_cfg_ext) +
					MLAN_SUB_COMMAND_SIZE;
			}
		}
	}

	LEAVE();
	return MLAN_STATUS_SUCCESS;
}

/**
 *  @brief This function handles the command response of rf_tx_power
 *
 *  @param pmpriv       A pointer to mlan_private structure
 *  @param resp         A pointer to HostCmd_DS_COMMAND
 *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
 *  @return             MLAN_STATUS_SUCCESS
 */
static mlan_status
wlan_ret_802_11_rf_tx_power(pmlan_private pmpriv,
			    HostCmd_DS_COMMAND *resp,
			    mlan_ioctl_req *pioctl_buf)
{
	HostCmd_DS_802_11_RF_TX_POWER *rtp = &resp->params.txp;
	t_u16 action = wlan_le16_to_cpu(rtp->action);
	mlan_ds_power_cfg *power = MNULL;

	ENTER();

	pmpriv->tx_power_level = wlan_le16_to_cpu(rtp->current_level);

	if (action == HostCmd_ACT_GEN_GET) {
		pmpriv->max_tx_power_level = rtp->max_power;
		pmpriv->min_tx_power_level = rtp->min_power;
		if (pioctl_buf) {
			power = (mlan_ds_power_cfg *)pioctl_buf->pbuf;
			if (power->sub_command == MLAN_OID_POWER_CFG) {
				pioctl_buf->data_read_written =
					sizeof(mlan_power_cfg_t) +
					MLAN_SUB_COMMAND_SIZE;
				power->param.power_cfg.power_level =
					pmpriv->tx_power_level;
			}
		}
	}

	PRINTM(MINFO, "Current TxPower Level = %d,Max Power=%d, Min Power=%d\n",
	       pmpriv->tx_power_level, pmpriv->max_tx_power_level,
	       pmpriv->min_tx_power_level);

	LEAVE();
	return MLAN_STATUS_SUCCESS;
}

/**
 *  @brief This function handles the command response of sleep_period
 *
 *  @param pmpriv       A pointer to mlan_private structure
 *  @param resp         A pointer to HostCmd_DS_COMMAND
 *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
 *  @return             MLAN_STATUS_SUCCESS
 */
static mlan_status
wlan_ret_802_11_sleep_period(pmlan_private pmpriv,
			     HostCmd_DS_COMMAND *resp,
			     mlan_ioctl_req *pioctl_buf)
{
	HostCmd_DS_802_11_SLEEP_PERIOD *pcmd_sleep_pd = &resp->params.sleep_pd;
	mlan_ds_pm_cfg *pm_cfg = MNULL;
	t_u16 sleep_pd = 0;

	ENTER();

	sleep_pd = wlan_le16_to_cpu(pcmd_sleep_pd->sleep_pd);
	if (pioctl_buf) {
		pm_cfg = (mlan_ds_pm_cfg *)pioctl_buf->pbuf;
		pm_cfg->param.sleep_period = (t_u32)sleep_pd;
		pioctl_buf->data_read_written =
			sizeof(pm_cfg->param.sleep_period) +
			MLAN_SUB_COMMAND_SIZE;
	}
	pmpriv->adapter->sleep_period.period = sleep_pd;
	pmpriv->adapter->saved_sleep_period.period = sleep_pd;

	pmpriv->adapter->pps_uapsd_mode = MFALSE;
	if ((pmpriv->adapter->sleep_period.period != 0) &&
	    (pmpriv->adapter->sleep_period.period !=
	     SLEEP_PERIOD_RESERVED_FF)) {
		pmpriv->adapter->gen_null_pkt = MTRUE;
	} else {
		pmpriv->adapter->delay_null_pkt = MFALSE;
		pmpriv->adapter->gen_null_pkt = MFALSE;
	}

	LEAVE();
	return MLAN_STATUS_SUCCESS;
}

/**
 *  @brief This function handles the command response of sleep_params
 *
 *  @param pmpriv       A pointer to mlan_private structure
 *  @param resp         A pointer to HostCmd_DS_COMMAND
 *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
 *  @return             MLAN_STATUS_SUCCESS
 */
static mlan_status
wlan_ret_802_11_sleep_params(pmlan_private pmpriv,
			     HostCmd_DS_COMMAND *resp,
			     mlan_ioctl_req *pioctl_buf)
{
	HostCmd_DS_802_11_SLEEP_PARAMS *presp_sp = &resp->params.sleep_param;
	mlan_ds_pm_cfg *pm_cfg = MNULL;
	mlan_ds_sleep_params *psp = MNULL;
	sleep_params_t *psleep_params = &pmpriv->adapter->sleep_params;

	ENTER();

	psleep_params->sp_reserved = wlan_le16_to_cpu(presp_sp->reserved);
	psleep_params->sp_error = wlan_le16_to_cpu(presp_sp->error);
	psleep_params->sp_offset = wlan_le16_to_cpu(presp_sp->offset);
	psleep_params->sp_stable_time = wlan_le16_to_cpu(presp_sp->stable_time);
	psleep_params->sp_cal_control = presp_sp->cal_control;
	psleep_params->sp_ext_sleep_clk = presp_sp->external_sleep_clk;

	if (pioctl_buf) {
		pm_cfg = (mlan_ds_pm_cfg *)pioctl_buf->pbuf;
		psp = (mlan_ds_sleep_params *)&pm_cfg->param.sleep_params;

		psp->error = (t_u32)psleep_params->sp_error;
		psp->offset = (t_u32)psleep_params->sp_offset;
		psp->stable_time = (t_u32)psleep_params->sp_stable_time;
		psp->cal_control = (t_u32)psleep_params->sp_cal_control;
		psp->ext_sleep_clk = (t_u32)psleep_params->sp_ext_sleep_clk;
		psp->reserved = (t_u32)psleep_params->sp_reserved;

		pioctl_buf->data_read_written =
			sizeof(pm_cfg->param.sleep_params) +
			MLAN_SUB_COMMAND_SIZE;
	}

	LEAVE();
	return MLAN_STATUS_SUCCESS;
}

/**
 *  @brief This function handles the command response of multicast_address
 *
 *  @param pmpriv       A pointer to mlan_private structure
 *  @param resp         A pointer to HostCmd_DS_COMMAND
 *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
 *
 *  @return             MLAN_STATUS_SUCCESS
 */
static mlan_status
wlan_ret_mac_multicast_adr(pmlan_private pmpriv,
			   HostCmd_DS_COMMAND *resp, mlan_ioctl_req *pioctl_buf)
{
	ENTER();
	if (pioctl_buf) {
		pioctl_buf->data_read_written =
			sizeof(mlan_multicast_list) + MLAN_SUB_COMMAND_SIZE;
	}
	LEAVE();
	return MLAN_STATUS_SUCCESS;
}

/**
 *  @brief This function handles the command response of deauthenticate
 *
 *  @param pmpriv       A pointer to mlan_private structure
 *  @param resp         A pointer to HostCmd_DS_COMMAND
 *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
 *
 *  @return             MLAN_STATUS_SUCCESS
 */
static mlan_status
wlan_ret_802_11_deauthenticate(pmlan_private pmpriv,
			       HostCmd_DS_COMMAND *resp,
			       mlan_ioctl_req *pioctl_buf)
{
	mlan_adapter *pmadapter = pmpriv->adapter;
	t_u8 event_buf[32];
	mlan_event *pevent = (mlan_event *)event_buf;
	ENTER();

	pmadapter->dbg.num_cmd_deauth++;

	if (!memcmp(pmadapter, resp->params.deauth.mac_addr,
		    &pmpriv->curr_bss_params.bss_descriptor.mac_address,
		    sizeof(resp->params.deauth.mac_addr))) {
		wlan_reset_connect_state(pmpriv, MTRUE);

	}
	if (pmpriv->adapter->state_rdh.stage == RDH_STOP_INTFS)
		wlan_11h_radar_detected_callback((t_void *)pmpriv);
	memset(pmadapter, event_buf, 0, sizeof(event_buf));
	pevent->bss_index = pmpriv->bss_index;
	pevent->event_id = MLAN_EVENT_ID_DRV_DISCONNECT_LOGGER;
	pevent->event_len = sizeof(resp->params.deauth.reason_code);
	memcpy_ext(pmpriv->adapter, (t_u8 *)pevent->event_buf,
		   &resp->params.deauth.reason_code, pevent->event_len,
		   pevent->event_len);
	wlan_recv_event(pmpriv, MLAN_EVENT_ID_DRV_DISCONNECT_LOGGER, pevent);

	LEAVE();
	return MLAN_STATUS_SUCCESS;
}

/**
 *  @brief This function handles the command response of ad_hoc_stop
 *
 *  @param pmpriv       A pointer to mlan_private structure
 *  @param resp         A pointer to HostCmd_DS_COMMAND
 *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
 *
 *  @return        MLAN_STATUS_SUCCESS
 */
static mlan_status
wlan_ret_802_11_ad_hoc_stop(pmlan_private pmpriv,
			    HostCmd_DS_COMMAND *resp,
			    mlan_ioctl_req *pioctl_buf)
{
	ENTER();

	wlan_reset_connect_state(pmpriv, MTRUE);
	if (pmpriv->adapter->state_rdh.stage == RDH_STOP_INTFS)
		wlan_11h_radar_detected_callback((t_void *)pmpriv);
	LEAVE();
	return MLAN_STATUS_SUCCESS;
}

/**
 *  @brief This function handles the command response of key_material
 *
 *  @param pmpriv       A pointer to mlan_private structure
 *  @param resp         A pointer to HostCmd_DS_COMMAND
 *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
 *
 *  @return        MLAN_STATUS_SUCCESS
 */
static mlan_status
wlan_ret_802_11_key_material(pmlan_private pmpriv,
			     HostCmd_DS_COMMAND *resp,
			     mlan_ioctl_req *pioctl_buf)
{
	HostCmd_DS_802_11_KEY_MATERIAL *pkey = &resp->params.key_material;
	mlan_ds_sec_cfg *sec = MNULL;
	t_u8 zero_kek[MLAN_KEK_LEN] = { 0 };

	ENTER();

	if (wlan_le16_to_cpu(pkey->action) == HostCmd_ACT_GEN_SET) {
		if ((wlan_le16_to_cpu(pkey->key_param_set.key_info) &
		     KEY_INFO_TKIP_MCAST)) {
			PRINTM(MINFO, "key: GTK is set\n");
			pmpriv->wpa_is_gtk_set = MTRUE;
			if (pmpriv->port_ctrl_mode == MTRUE) {
				/* GTK is set, open the port */
				PRINTM(MINFO,
				       "GTK_SET: Open port: WPA/WPA2 h-supp mode\n");
				pmpriv->port_open = MTRUE;
			}
			if (memcmp(pmpriv->adapter, pmpriv->gtk_rekey.kek,
				   zero_kek, sizeof(zero_kek)) != 0) {
				wlan_prepare_cmd(pmpriv,
						 HostCmd_CMD_GTK_REKEY_OFFLOAD_CFG,
						 HostCmd_ACT_GEN_SET, 0, MNULL,
						 &pmpriv->gtk_rekey);
				memset(pmpriv->adapter, &pmpriv->gtk_rekey, 0,
				       sizeof(mlan_ds_misc_gtk_rekey_data));
			}
			pmpriv->adapter->scan_block = MFALSE;
		}
	} else if (wlan_le16_to_cpu(pkey->action) == HostCmd_ACT_GEN_GET) {
		if (pioctl_buf && (wlan_le16_to_cpu(pkey->key_param_set.type) ==
				   TLV_TYPE_KEY_PARAM_V2)) {
			sec = (mlan_ds_sec_cfg *)pioctl_buf->pbuf;
			memcpy_ext(pmpriv->adapter,
				   sec->param.encrypt_key.mac_addr,
				   pkey->key_param_set.mac_addr,
				   MLAN_MAC_ADDR_LENGTH,
				   sizeof(sec->param.encrypt_key.mac_addr));
			sec->param.encrypt_key.key_index =
				pkey->key_param_set.key_idx;
			PRINTM(MIOCTL,
			       "key_type=%d, key_index=%d, key_info=0x%x "
			       MACSTR "\n", pkey->key_param_set.key_type,
			       pkey->key_param_set.key_idx,
			       wlan_le16_to_cpu(pkey->key_param_set.key_info),
			       MAC2STR(sec->param.encrypt_key.mac_addr));
			switch (pkey->key_param_set.key_type) {
			case KEY_TYPE_ID_WAPI:
				sec->param.encrypt_key.is_wapi_key = MTRUE;
				sec->param.encrypt_key.key_len =
					wlan_le16_to_cpu(pkey->key_param_set.
							 key_params.wapi.
							 key_len);
				memcpy_ext(pmpriv->adapter,
					   sec->param.encrypt_key.key_material,
					   pkey->key_param_set.key_params.wapi.
					   key, sec->param.encrypt_key.key_len,
					   sizeof(sec->param.encrypt_key.
						  key_material));
				memcpy_ext(pmpriv->adapter,
					   sec->param.encrypt_key.pn,
					   pkey->key_param_set.key_params.wapi.
					   pn, PN_SIZE,
					   sizeof(sec->param.encrypt_key.pn));
				break;
			case KEY_TYPE_ID_TKIP:
				sec->param.encrypt_key.key_len =
					wlan_le16_to_cpu(pkey->key_param_set.
							 key_params.tkip.
							 key_len);
				memcpy_ext(pmpriv->adapter,
					   sec->param.encrypt_key.key_material,
					   pkey->key_param_set.key_params.tkip.
					   key, sec->param.encrypt_key.key_len,
					   sizeof(sec->param.encrypt_key.
						  key_material));
				memcpy_ext(pmpriv->adapter,
					   sec->param.encrypt_key.pn,
					   pkey->key_param_set.key_params.tkip.
					   pn, WPA_PN_SIZE,
					   sizeof(sec->param.encrypt_key.pn));
				break;
			case KEY_TYPE_ID_AES:
				sec->param.encrypt_key.key_len =
					wlan_le16_to_cpu(pkey->key_param_set.
							 key_params.aes.
							 key_len);
				memcpy_ext(pmpriv->adapter,
					   sec->param.encrypt_key.key_material,
					   pkey->key_param_set.key_params.aes.
					   key, sec->param.encrypt_key.key_len,
					   sizeof(sec->param.encrypt_key.
						  key_material));
				memcpy_ext(pmpriv->adapter,
					   sec->param.encrypt_key.pn,
					   pkey->key_param_set.key_params.aes.
					   pn, WPA_PN_SIZE,
					   sizeof(sec->param.encrypt_key.pn));
				break;
			case KEY_TYPE_ID_AES_CMAC:
				sec->param.encrypt_key.key_len =
					wlan_le16_to_cpu(pkey->key_param_set.
							 key_params.cmac_aes.
							 key_len);
				memcpy_ext(pmpriv->adapter,
					   sec->param.encrypt_key.key_material,
					   pkey->key_param_set.key_params.
					   cmac_aes.key,
					   sec->param.encrypt_key.key_len,
					   sizeof(sec->param.encrypt_key.
						  key_material));
				memcpy_ext(pmpriv->adapter,
					   sec->param.encrypt_key.pn,
					   pkey->key_param_set.key_params.
					   cmac_aes.ipn, IGTK_PN_SIZE,
					   sizeof(sec->param.encrypt_key.pn));
				break;
			case KEY_TYPE_ID_WEP:
				sec->param.encrypt_key.key_len =
					wlan_le16_to_cpu(pkey->key_param_set.
							 key_params.wep.
							 key_len);
				memcpy_ext(pmpriv->adapter,
					   sec->param.encrypt_key.key_material,
					   pkey->key_param_set.key_params.wep.
					   key, sec->param.encrypt_key.key_len,
					   sizeof(sec->param.encrypt_key.
						  key_material));
				break;
			}
		}
	}
	LEAVE();
	return MLAN_STATUS_SUCCESS;
}

/**
 *  @brief Handle the supplicant profile response
 *
 *  @param pmpriv       A pointer to mlan_private structure
 *  @param resp         A pointer to HostCmd_DS_COMMAND
 *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
 *
 *  @return        MLAN_STATUS_SUCCESS
 */
static mlan_status
wlan_ret_802_11_supplicant_profile(pmlan_private pmpriv,
				   HostCmd_DS_COMMAND *resp,
				   mlan_ioctl_req *pioctl_buf)
{
	HostCmd_DS_802_11_SUPPLICANT_PROFILE *psup_profile =
		&resp->params.esupplicant_profile;
	MrvlIEtypesHeader_t *head;
	MrvlIEtypes_EncrProto_t *encr_proto_tlv = MNULL;
	MrvlIEtypes_Cipher_t *pcipher_tlv = MNULL;
	mlan_ds_sec_cfg *sec = MNULL;
	t_u8 *tlv;
	int len;

	ENTER();

	len = resp->size - S_DS_GEN - sizeof(t_u16);
	tlv = psup_profile->tlv_buf;
	if (pioctl_buf) {
		sec = (mlan_ds_sec_cfg *)pioctl_buf->pbuf;
		while (len > 0) {
			head = (MrvlIEtypesHeader_t *)tlv;
			head->type = wlan_le16_to_cpu(head->type);
			head->len = wlan_le16_to_cpu(head->len);
			switch (head->type) {
			case TLV_TYPE_ENCRYPTION_PROTO:
				encr_proto_tlv =
					(MrvlIEtypes_EncrProto_t *)head;
				sec->param.esupp_mode.rsn_mode =
					wlan_le16_to_cpu(encr_proto_tlv->
							 rsn_mode);
				PRINTM(MINFO, "rsn_mode=0x%x\n",
				       sec->param.esupp_mode.rsn_mode);
				break;
			case TLV_TYPE_CIPHER:
				pcipher_tlv = (MrvlIEtypes_Cipher_t *)head;
				sec->param.esupp_mode.act_paircipher =
					pcipher_tlv->pair_cipher;
				sec->param.esupp_mode.act_groupcipher =
					pcipher_tlv->group_cipher;
				PRINTM(MINFO,
				       "paircipher=0x%x, groupcipher=0x%x\n",
				       sec->param.esupp_mode.act_paircipher,
				       sec->param.esupp_mode.act_groupcipher);
				break;
			}
			len -= (head->len - sizeof(MrvlIEtypesHeader_t));
			tlv = tlv + (head->len + sizeof(MrvlIEtypesHeader_t));
		}
	}

	LEAVE();
	return MLAN_STATUS_SUCCESS;
}

/**
 *  @brief This function handles the command response of rf_channel
 *
 *  @param pmpriv       A pointer to mlan_private structure
 *  @param resp         A pointer to HostCmd_DS_COMMAND
 *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
 *
 *  @return             MLAN_STATUS_SUCCESS
 */
static mlan_status
wlan_ret_802_11_rf_channel(pmlan_private pmpriv,
			   HostCmd_DS_COMMAND *resp, mlan_ioctl_req *pioctl_buf)
{
	HostCmd_DS_802_11_RF_CHANNEL *prf_channel = &resp->params.rf_channel;
	t_u16 new_channel = wlan_le16_to_cpu(prf_channel->current_channel);
	mlan_ds_bss *bss = MNULL;

	ENTER();
	if (pmpriv->curr_bss_params.bss_descriptor.channel != new_channel) {
		PRINTM(MINFO, "Channel Switch: %d to %d\n",
		       pmpriv->curr_bss_params.bss_descriptor.channel,
		       new_channel);
		/* Update the channel again */
		pmpriv->curr_bss_params.bss_descriptor.channel = new_channel;
	}
	if (pioctl_buf) {
		bss = (mlan_ds_bss *)pioctl_buf->pbuf;
		bss->param.bss_chan.channel = new_channel;
	}
	LEAVE();
	return MLAN_STATUS_SUCCESS;
}

/**
 *  @brief Handle the ibss_coalescing_status resp
 *
 *  @param pmpriv       A pointer to mlan_private structure
 *  @param resp         A pointer to HostCmd_DS_COMMAND
 *
 *  @return             MLAN_STATUS_SUCCESS
 */
static mlan_status
wlan_ret_ibss_coalescing_status(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp)
{
	HostCmd_DS_802_11_IBSS_STATUS *pibss_coal_resp =
		&(resp->params.ibss_coalescing);
	t_u8 zero_mac[MLAN_MAC_ADDR_LENGTH] = { 0, 0, 0, 0, 0, 0 };

	ENTER();

	if (wlan_le16_to_cpu(pibss_coal_resp->action) == HostCmd_ACT_GEN_SET) {
		LEAVE();
		return MLAN_STATUS_SUCCESS;
	}

	PRINTM(MINFO, "New BSSID " MACSTR "\n",
	       MAC2STR(pibss_coal_resp->bssid));

	/* If rsp has MNULL BSSID, Just return..... No Action */
	if (!memcmp(pmpriv->adapter, pibss_coal_resp->bssid, zero_mac,
		    MLAN_MAC_ADDR_LENGTH)) {
		PRINTM(MMSG, "New BSSID is MNULL\n");
		LEAVE();
		return MLAN_STATUS_SUCCESS;
	}

	/* If BSSID is diff, modify current BSS parameters */
	if (memcmp(pmpriv->adapter,
		   pmpriv->curr_bss_params.bss_descriptor.mac_address,
		   pibss_coal_resp->bssid, MLAN_MAC_ADDR_LENGTH)) {
		/* BSSID */
		memcpy_ext(pmpriv->adapter,
			   pmpriv->curr_bss_params.bss_descriptor.mac_address,
			   pibss_coal_resp->bssid, MLAN_MAC_ADDR_LENGTH,
			   sizeof(pmpriv->curr_bss_params.bss_descriptor.
				  mac_address));

		/* Beacon Interval and ATIM window */
		pmpriv->curr_bss_params.bss_descriptor.beacon_period =
			wlan_le16_to_cpu(pibss_coal_resp->beacon_interval);
		pmpriv->curr_bss_params.bss_descriptor.atim_window =
			wlan_le16_to_cpu(pibss_coal_resp->atim_window);

		/* ERP Information */
		pmpriv->curr_bss_params.bss_descriptor.erp_flags =
			(t_u8)wlan_le16_to_cpu(pibss_coal_resp->
					       use_g_rate_protect);

		pmpriv->adhoc_state = ADHOC_COALESCED;
	}

	LEAVE();
	return MLAN_STATUS_SUCCESS;
}

/**
 *  @brief This function handles the command response of MGMT_IE_LIST
 *
 *  @param pmpriv       A pointer to mlan_private structure
 *  @param resp         A pointer to HostCmd_DS_COMMAND
 *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
 *
 *  @return             MLAN_STATUS_SUCCESS
 */
static mlan_status
wlan_ret_mgmt_ie_list(pmlan_private pmpriv,
		      HostCmd_DS_COMMAND *resp, mlan_ioctl_req *pioctl_buf)
{
	t_u16 resp_len = 0, travel_len = 0;
	int i = 0;
	mlan_ds_misc_cfg *misc = MNULL;
	mlan_ds_misc_custom_ie *cust_ie = MNULL;
	custom_ie *cptr;
	tlvbuf_max_mgmt_ie *max_mgmt_ie = MNULL;
	HostCmd_DS_MGMT_IE_LIST_CFG *pmgmt_ie_list =
		&(resp->params.mgmt_ie_list);

	ENTER();

	if (wlan_le16_to_cpu(pmgmt_ie_list->action) == HostCmd_ACT_GEN_SET) {
		if ((pmpriv->adapter->state_rdh.stage == RDH_SET_CUSTOM_IE) ||
		    (pmpriv->adapter->state_rdh.stage == RDH_REM_CUSTOM_IE))
			if (!pmpriv->adapter->ecsa_enable)
				wlan_11h_radar_detected_callback((t_void *)
								 pmpriv);
		LEAVE();
		return MLAN_STATUS_SUCCESS;
	}

	misc = (mlan_ds_misc_cfg *)pioctl_buf->pbuf;
	cust_ie = (mlan_ds_misc_custom_ie *)&pmgmt_ie_list->ds_mgmt_ie;
	if (cust_ie) {
		cust_ie->type = wlan_le16_to_cpu(cust_ie->type);
		resp_len = cust_ie->len = wlan_le16_to_cpu(cust_ie->len);
		travel_len = 0;
		/* conversion for index, mask, len */
		if (resp_len == sizeof(t_u16))
			cust_ie->ie_data_list[0].ie_index =
				wlan_cpu_to_le16(cust_ie->ie_data_list[0].
						 ie_index);

		while (resp_len > sizeof(t_u16)) {
			cptr = (custom_ie *)(((t_u8 *)cust_ie->ie_data_list) +
					     travel_len);
			cptr->ie_index = wlan_le16_to_cpu(cptr->ie_index);
			cptr->mgmt_subtype_mask =
				wlan_le16_to_cpu(cptr->mgmt_subtype_mask);
			cptr->ie_length = wlan_le16_to_cpu(cptr->ie_length);
			travel_len += cptr->ie_length + sizeof(custom_ie) -
				MAX_IE_SIZE;
			resp_len -= cptr->ie_length + sizeof(custom_ie) -
				MAX_IE_SIZE;
		}
		memcpy_ext(pmpriv->adapter, &misc->param.cust_ie, cust_ie,
			   (cust_ie->len + sizeof(MrvlIEtypesHeader_t)),
			   sizeof(misc->param.cust_ie));
		max_mgmt_ie =
			(tlvbuf_max_mgmt_ie *)((t_u8 *)cust_ie + cust_ie->len +
					       sizeof(MrvlIEtypesHeader_t));
		if (max_mgmt_ie) {
			max_mgmt_ie->type = wlan_le16_to_cpu(max_mgmt_ie->type);
			if (max_mgmt_ie->type == TLV_TYPE_MAX_MGMT_IE) {
				max_mgmt_ie->len =
					wlan_le16_to_cpu(max_mgmt_ie->len);
				max_mgmt_ie->count =
					wlan_le16_to_cpu(max_mgmt_ie->count);
				for (i = 0; i < max_mgmt_ie->count; i++) {
					max_mgmt_ie->info[i]
						.buf_size =
						wlan_le16_to_cpu(max_mgmt_ie->
								 info[i].
								 buf_size);
					max_mgmt_ie->info[i]
						.buf_count =
						wlan_le16_to_cpu(max_mgmt_ie->
								 info[i].
								 buf_count);
				}
				/* Append max_mgmt_ie TLV after custom_ie */
				memcpy_ext(pmpriv->adapter,
					   (t_u8 *)&misc->param.cust_ie +
					   (cust_ie->len +
					    sizeof(MrvlIEtypesHeader_t)),
					   max_mgmt_ie,
					   max_mgmt_ie->len +
					   sizeof(MrvlIEtypesHeader_t),
					   sizeof(misc->param.cust_ie) -
					   (cust_ie->len +
					    sizeof(MrvlIEtypesHeader_t)));
			}
		}
	}

	LEAVE();
	return MLAN_STATUS_SUCCESS;
}

/**
 *  @brief This function enable/disable tdls powermode
 *
 *  @param pmpriv       A pointer to mlan_private structure
 *  @param powermode    1--enable, 0--disable
 *
 *  @return             N/A
 */
static void
wlan_set_tdls_powermode(pmlan_private pmpriv, t_u8 powermode)
{
	ENTER();

	if (powermode) {
		pmpriv->wmm_qosinfo = DEFAULT_TDLS_WMM_QOS_INFO;
		if (!pmpriv->adapter->sleep_period.period)
			pmpriv->adapter->sleep_period.period =
				DEFAULT_TDLS_SLEEP_PERIOD;
	} else {
		pmpriv->wmm_qosinfo = pmpriv->saved_wmm_qosinfo;
		pmpriv->adapter->sleep_period.period =
			pmpriv->adapter->saved_sleep_period.period;
	}
	pmpriv->adapter->pps_uapsd_mode = MFALSE;
	if ((pmpriv->adapter->sleep_period.period != 0) &&
	    (pmpriv->adapter->sleep_period.period !=
	     SLEEP_PERIOD_RESERVED_FF)) {
		pmpriv->adapter->gen_null_pkt = MTRUE;
	} else {
		pmpriv->adapter->delay_null_pkt = MFALSE;
		pmpriv->adapter->gen_null_pkt = MFALSE;
	}
	LEAVE();
	return;
}

/**
 *  @brief This function handles the command response of TDLS_CONFIG
 *
 *  @param pmpriv       A pointer to mlan_private structure
 *  @param resp         A pointer to HostCmd_DS_COMMAND
 *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
 *
 *  @return             MLAN_STATUS_SUCCESS or MLAN_STATUS_FAILURE
 */
static mlan_status
wlan_ret_tdls_config(pmlan_private pmpriv,
		     HostCmd_DS_COMMAND *resp, mlan_ioctl_req *pioctl_buf)
{
	t_u8 i = 0;
	t_u16 link_length = 0, final_data_rate = 0;
	mlan_ds_misc_cfg *misc = MNULL;
	tdls_all_config *tdls_all_cfg = MNULL;
	sta_node *sta_ptr = MNULL;
	HostCmd_DS_TDLS_CONFIG *ptdls_config_data =
		&(resp->params.tdls_config_data);
	pmlan_adapter pmadapter = pmpriv->adapter;
	tdls_each_link_status *link_ptr = MNULL;

	ENTER();

	ptdls_config_data->tdls_info.tdls_action =
		wlan_le16_to_cpu(ptdls_config_data->tdls_info.tdls_action);
	switch (ptdls_config_data->tdls_info.tdls_action) {
	case WLAN_TDLS_CONFIG:
		misc = (mlan_ds_misc_cfg *)pioctl_buf->pbuf;
		tdls_all_cfg = (tdls_all_config *)
			ptdls_config_data->tdls_info.tdls_data;
		if (pmpriv->host_tdls_cs_support ||
		    pmpriv->host_tdls_uapsd_support)
			break;
		if (wlan_le16_to_cpu(tdls_all_cfg->u.tdls_config.enable) == 0) {
			PRINTM(MINFO, "TDLS disable successful.\n");
			wlan_delete_station_list(pmpriv);
			pmadapter->tdls_status = TDLS_NOT_SETUP;
			if (pmpriv->saved_wmm_qosinfo)
				pmpriv->wmm_qosinfo = pmpriv->saved_wmm_qosinfo;
			if (pmadapter->saved_sleep_period.period)
				pmadapter->sleep_period.period =
					pmadapter->saved_sleep_period.period;
		}
		break;

	case WLAN_TDLS_SET_INFO:
		break;

	case WLAN_TDLS_DISCOVERY_REQ:
		misc = (mlan_ds_misc_cfg *)pioctl_buf->pbuf;
		tdls_all_cfg = (tdls_all_config *)
			ptdls_config_data->tdls_info.tdls_data;
		tdls_all_cfg->u.tdls_discovery_resp.payload_len =
			wlan_le16_to_cpu(tdls_all_cfg->u.tdls_discovery_resp.
					 payload_len);
		tdls_all_cfg->u.tdls_discovery_resp.cap_info =
			wlan_le16_to_cpu(tdls_all_cfg->u.tdls_discovery_resp.
					 cap_info);
		memcpy_ext(pmpriv->adapter, &misc->param.tdls_config,
			   &ptdls_config_data->tdls_info,
			   (resp->size - S_DS_GEN),
			   sizeof(mlan_ds_misc_tdls_config));
		PRINTM(MCMND, "TDLS_DISCOVERY_REQ: " MACSTR "\n",
		       MAC2STR(tdls_all_cfg->u.tdls_discovery_resp
			       .peer_mac_addr));
		break;

	case WLAN_TDLS_SETUP_REQ:
		/*
		 * TDLS link being setup, block all data for this Peer
		 */
		tdls_all_cfg = (tdls_all_config *)
			ptdls_config_data->tdls_info.tdls_data;
		PRINTM(MCMND, "TDLS_SETUP_REQ: " MACSTR "\n",
		       MAC2STR(tdls_all_cfg->u.tdls_setup.peer_mac_addr));
		sta_ptr =
			wlan_get_station_entry(pmpriv,
					       tdls_all_cfg->u.tdls_setup.
					       peer_mac_addr);
		if (!sta_ptr) {
			sta_ptr = wlan_add_station_entry(pmpriv,
							 tdls_all_cfg->u.
							 tdls_setup.
							 peer_mac_addr);
			if (sta_ptr) {
				sta_ptr->status = TDLS_SETUP_INPROGRESS;
				wlan_hold_tdls_packets(pmpriv,
						       tdls_all_cfg->u.
						       tdls_setup.
						       peer_mac_addr);
			}
		}
		break;

	case WLAN_TDLS_TEAR_DOWN_REQ:
		/*
		 * TDLS link torn down, open data ports if blocked
		 */
		tdls_all_cfg = (tdls_all_config *)
			ptdls_config_data->tdls_info.tdls_data;
		wlan_restore_tdls_packets(pmpriv,
					  tdls_all_cfg->u.tdls_tear_down.
					  peer_mac_addr, TDLS_TEAR_DOWN);
		PRINTM(MCMND, "TDLS_TEARDOWN_REQ: " MACSTR "\n",
		       MAC2STR(tdls_all_cfg->u.tdls_tear_down.peer_mac_addr));
		sta_ptr =
			wlan_get_station_entry(pmpriv,
					       tdls_all_cfg->u.tdls_tear_down.
					       peer_mac_addr);
		if (sta_ptr) {
			if (sta_ptr->is_11n_enabled) {
				wlan_cleanup_reorder_tbl(pmpriv,
							 tdls_all_cfg->u.
							 tdls_tear_down.
							 peer_mac_addr);
				wlan_11n_cleanup_txbastream_tbl(pmpriv,
								tdls_all_cfg->u.
								tdls_tear_down.
								peer_mac_addr);
			}
			wlan_delete_station_entry(pmpriv,
						  tdls_all_cfg->u.
						  tdls_tear_down.peer_mac_addr);
			if (MTRUE == wlan_is_station_list_empty(pmpriv))
				pmadapter->tdls_status = TDLS_NOT_SETUP;
			else
				pmadapter->tdls_status = TDLS_IN_BASE_CHANNEL;
		}
		break;
	case WLAN_TDLS_INIT_CHAN_SWITCH:
		tdls_all_cfg = (tdls_all_config *)
			ptdls_config_data->tdls_info.tdls_data;
		PRINTM(MCMND,
		       "TDLS_INIT_CHANNEL_SWITCH: " MACSTR
		       " chan=%d periodicity=%d\n",
		       MAC2STR(tdls_all_cfg->u.tdls_chan_switch.peer_mac_addr),
		       (int)tdls_all_cfg->u.tdls_chan_switch.primary_channel,
		       (int)tdls_all_cfg->u.tdls_chan_switch.periodicity);
		break;

	case WLAN_TDLS_LINK_STATUS:
		misc = (mlan_ds_misc_cfg *)pioctl_buf->pbuf;
		tdls_all_cfg = (tdls_all_config *)
			ptdls_config_data->tdls_info.tdls_data;
		tdls_all_cfg->u.tdls_link_status_resp.payload_len =
			wlan_le16_to_cpu(tdls_all_cfg->u.tdls_link_status_resp
					 .payload_len);
		link_ptr = tdls_all_cfg->u.tdls_link_status_resp.link_stats;
		for (i = 0;
		     i < tdls_all_cfg->u.tdls_link_status_resp.active_links;
		     i++) {
			link_ptr->active_channel =
				wlan_le32_to_cpu(link_ptr->active_channel);
			link_ptr->data_rssi_last =
				wlan_le16_to_cpu(link_ptr->data_rssi_last);
			link_ptr->data_nf_last =
				wlan_le16_to_cpu(link_ptr->data_nf_last);
			link_ptr->data_rssi_avg =
				wlan_le16_to_cpu(link_ptr->data_rssi_avg);
			link_ptr->data_nf_avg =
				wlan_le16_to_cpu(link_ptr->data_nf_avg);
			link_length = sizeof(tdls_each_link_status) - 1;
			/* adjust as per open or secure network */
			if (link_ptr->link_flags & 0x02) {
				link_ptr->key_lifetime =
					wlan_le32_to_cpu(link_ptr->
							 key_lifetime);
				link_length += link_ptr->key_length;
			} else {
				link_length -=
					sizeof(link_ptr->security_method) +
					sizeof(link_ptr->key_lifetime) +
					sizeof(link_ptr->key_length);
			}
			final_data_rate =
				(t_u16)wlan_index_to_data_rate(pmadapter,
							       link_ptr->u.
							       rate_info.
							       tx_data_rate,
							       link_ptr->u.
							       rate_info.
							       tx_rate_htinfo,
							       0);
			link_ptr->u.final_data_rate = final_data_rate / 2;

			link_ptr =
				(tdls_each_link_status *)(((t_u8 *)link_ptr) +
							  link_length);
		}
		memcpy_ext(pmpriv->adapter, &misc->param.tdls_config,
			   &ptdls_config_data->tdls_info,
			   (resp->size - S_DS_GEN),
			   sizeof(mlan_ds_misc_tdls_config));
		break;
	case WLAN_TDLS_POWER_MODE:
		misc = (mlan_ds_misc_cfg *)pioctl_buf->pbuf;
		tdls_all_cfg = (tdls_all_config *)
			ptdls_config_data->tdls_info.tdls_data;
		tdls_all_cfg->u.tdls_power_mode.power_mode =
			wlan_le16_to_cpu(tdls_all_cfg->u.tdls_power_mode.
					 power_mode);
		wlan_set_tdls_powermode(pmpriv,
					(t_u8)tdls_all_cfg->u.tdls_power_mode.
					power_mode);
		break;
	case WLAN_TDLS_STOP_CHAN_SWITCH:
		tdls_all_cfg = (tdls_all_config *)
			ptdls_config_data->tdls_info.tdls_data;
		PRINTM(MCMND, "TDLS_STOP_CHANNEL_SWITCH: " MACSTR "\n",
		       MAC2STR(tdls_all_cfg->u.tdls_stop_chan_switch.
			       peer_mac_addr));
		break;
	case WLAN_TDLS_CS_PARAMS:
	case WLAN_TDLS_CS_DISABLE:
	case WLAN_TDLS_DEBUG_STOP_RX:
	case WLAN_TDLS_DEBUG_ALLOW_WEAK_SECURITY:
	case WLAN_TDLS_DEBUG_SETUP_SAME_LINK:
	case WLAN_TDLS_DEBUG_FAIL_SETUP_CONFIRM:
	case WLAN_TDLS_DEBUG_WRONG_BSS:
	case WLAN_TDLS_DEBUG_SETUP_PROHIBITED:
	case WLAN_TDLS_DEBUG_HIGHER_LOWER_MAC:
	case WLAN_TDLS_DEBUG_IGNORE_KEY_EXPIRY:
	case WLAN_TDLS_DEBUG_CS_RET_IM:
		break;
	default:
		if (pioctl_buf)
			pioctl_buf->status_code = MLAN_ERROR_CMD_RESP_FAIL;
		LEAVE();
		return MLAN_STATUS_FAILURE;
	}

	LEAVE();
	return MLAN_STATUS_SUCCESS;
}

/**
 *  @brief This function handles the command response of TDLS_OPERATION
 *
 *  @param pmpriv       A pointer to mlan_private structure
 *  @param resp         A pointer to HostCmd_DS_COMMAND
 *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
 *
 *  @return             MLAN_STATUS_SUCCESS or MLAN_STATUS_FAILURE
 */
static mlan_status
wlan_ret_tdls_oper(pmlan_private pmpriv,
		   HostCmd_DS_COMMAND *resp, mlan_ioctl_req *pioctl_buf)
{
	HostCmd_DS_TDLS_OPER *ptdls_oper = &(resp->params.tdls_oper_data);
	sta_node *sta_ptr = MNULL;
	t_u16 reason = 0;
	pmlan_adapter pmadapter = pmpriv->adapter;

	ENTER();

	ptdls_oper->tdls_action = wlan_le16_to_cpu(ptdls_oper->tdls_action);

	sta_ptr = wlan_get_station_entry(pmpriv, ptdls_oper->peer_mac);
	reason = wlan_le16_to_cpu(ptdls_oper->reason);
	switch (ptdls_oper->tdls_action) {
	case TDLS_CREATE:
		if (reason) {
			PRINTM(MMSG,
			       "TDLS: create link " MACSTR " fail, reason=%d\n",
			       MAC2STR(ptdls_oper->peer_mac), reason);
			if (reason != TDLS_LINK_EXISTS && sta_ptr)
				sta_ptr->status = TDLS_SETUP_FAILURE;
		} else {
			PRINTM(MMSG, "TDLS: create link " MACSTR " success\n",
			       MAC2STR(ptdls_oper->peer_mac), reason);
		}
		break;
	case TDLS_CONFIG:
		if (reason) {
			PRINTM(MMSG,
			       "TDLS: Config link " MACSTR " fail, reason=%d\n",
			       MAC2STR(ptdls_oper->peer_mac), reason);
			if (sta_ptr)
				sta_ptr->status = TDLS_SETUP_FAILURE;
		} else {
			PRINTM(MMSG, "TDLS: Config link " MACSTR " success\n",
			       MAC2STR(ptdls_oper->peer_mac));
		}
		break;
	case TDLS_DELETE:
		wlan_restore_tdls_packets(pmpriv, ptdls_oper->peer_mac,
					  TDLS_TEAR_DOWN);
		if (sta_ptr) {
			/**tdls cs stop*/
			if (ISSUPP_EXTCAP_TDLS_CHAN_SWITCH
			    (sta_ptr->ExtCap.ext_cap))
				wlan_tdls_config(pmpriv, MFALSE);
			if (sta_ptr->is_11n_enabled) {
				wlan_cleanup_reorder_tbl(pmpriv,
							 ptdls_oper->peer_mac);
				wlan_11n_cleanup_txbastream_tbl(pmpriv,
								ptdls_oper->
								peer_mac);
			}
			if (sta_ptr->status >= TDLS_SETUP_INPROGRESS)
				wlan_delete_station_entry(pmpriv,
							  ptdls_oper->peer_mac);
		}
		if (MTRUE == wlan_is_station_list_empty(pmpriv))
			pmadapter->tdls_status = TDLS_NOT_SETUP;
		else
			pmadapter->tdls_status = TDLS_IN_BASE_CHANNEL;

		if (reason)
			PRINTM(MMSG,
			       "TDLS: Delete link " MACSTR " fail, reason=%d\n",
			       MAC2STR(ptdls_oper->peer_mac), reason);
		else
			PRINTM(MMSG, "TDLS: Delete link " MACSTR " success\n",
			       MAC2STR(ptdls_oper->peer_mac));
		break;
	default:
		break;
	}

	LEAVE();
	return MLAN_STATUS_SUCCESS;
}

/**
 *  @brief This function handles the command response of sysclock
 *
 *  @param pmpriv       A pointer to mlan_private structure
 *  @param resp         A pointer to HostCmd_DS_COMMAND
 *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
 *
 *  @return        MLAN_STATUS_SUCCESS
 */
static mlan_status
wlan_ret_sysclock_cfg(pmlan_private pmpriv,
		      HostCmd_DS_COMMAND *resp, mlan_ioctl_req *pioctl_buf)
{
	mlan_ds_misc_cfg *mis_ccfg = MNULL;
	HostCmd_DS_ECL_SYSTEM_CLOCK_CONFIG *clk_cfg =
		&resp->params.sys_clock_cfg;
	int i = 0;

	ENTER();

	if (pioctl_buf) {
		mis_ccfg = (mlan_ds_misc_cfg *)pioctl_buf->pbuf;
		mis_ccfg->param.sys_clock.cur_sys_clk =
			wlan_le16_to_cpu(clk_cfg->cur_sys_clk);
		mis_ccfg->param.sys_clock.sys_clk_type =
			wlan_le16_to_cpu(clk_cfg->sys_clk_type);
		mis_ccfg->param.sys_clock.sys_clk_num =
			wlan_le16_to_cpu(clk_cfg->sys_clk_len) / sizeof(t_u16);
		for (i = 0; i < mis_ccfg->param.sys_clock.sys_clk_num; i++)
			mis_ccfg->param.sys_clock.sys_clk[i] =
				wlan_le16_to_cpu(clk_cfg->sys_clk[i]);
	}

	LEAVE();
	return MLAN_STATUS_SUCCESS;
}

/**
 *  @brief This function handles the command response of inactivity timeout
 *
 *  @param pmpriv       A pointer to mlan_private structure
 *  @param resp         A pointer to HostCmd_DS_COMMAND
 *  @param pioctl_buf   A pointer to command buffer
 *
 *  @return             MLAN_STATUS_SUCCESS
 */
static mlan_status
wlan_ret_inactivity_timeout(pmlan_private pmpriv,
			    HostCmd_DS_COMMAND *resp,
			    mlan_ioctl_req *pioctl_buf)
{
	mlan_ds_pm_cfg *pmcfg = MNULL;
	mlan_ds_inactivity_to *inac_to = MNULL;
	HostCmd_DS_INACTIVITY_TIMEOUT_EXT *cmd_inac_to =
		(HostCmd_DS_INACTIVITY_TIMEOUT_EXT *)
		&resp->params.inactivity_to;

	ENTER();

	if (pioctl_buf) {
		pmcfg = (mlan_ds_pm_cfg *)pioctl_buf->pbuf;
		inac_to = &pmcfg->param.inactivity_to;
		inac_to->timeout_unit =
			wlan_le16_to_cpu(cmd_inac_to->timeout_unit);
		inac_to->unicast_timeout =
			wlan_le16_to_cpu(cmd_inac_to->unicast_timeout);
		inac_to->mcast_timeout =
			wlan_le16_to_cpu(cmd_inac_to->mcast_timeout);
		inac_to->ps_entry_timeout =
			wlan_le16_to_cpu(cmd_inac_to->ps_entry_timeout);
	}

	LEAVE();
	return MLAN_STATUS_SUCCESS;
}

/**
 *  @brief This function handles the command response of
 *  subscribe event
 *
 *  @param pmpriv       A pointer to mlan_private structure
 *  @param resp         A pointer to HostCmd_DS_COMMAND
 *  @param pioctl_buf   A pointer to command buffer
 *
 *  @return             MLAN_STATUS_SUCCESS
 */
static mlan_status
wlan_ret_subscribe_event(pmlan_private pmpriv,
			 HostCmd_DS_COMMAND *resp, mlan_ioctl_req *pioctl_buf)
{
	HostCmd_DS_SUBSCRIBE_EVENT *evt =
		(HostCmd_DS_SUBSCRIBE_EVENT *)&resp->params.subscribe_event;
	mlan_ds_subscribe_evt *sub_evt = MNULL;
	mlan_ds_misc_cfg *misc = MNULL;

	ENTER();
	if (pioctl_buf && (pioctl_buf->action == MLAN_ACT_GET)) {
		misc = (mlan_ds_misc_cfg *)pioctl_buf->pbuf;
		sub_evt = &misc->param.subscribe_event;
		sub_evt->evt_bitmap = wlan_le16_to_cpu(evt->event_bitmap);
		pioctl_buf->data_read_written = sizeof(mlan_ds_misc_cfg);
	}
	LEAVE();
	return MLAN_STATUS_SUCCESS;
}

/**
 *  @brief This function handles the command response of
 *  OTP user data
 *
 *  @param pmpriv       A pointer to mlan_private structure
 *  @param resp         A pointer to HostCmd_DS_COMMAND
 *  @param pioctl_buf   A pointer to command buffer
 *
 *  @return             MLAN_STATUS_SUCCESS
 */
static mlan_status
wlan_ret_otp_user_data(pmlan_private pmpriv,
		       HostCmd_DS_COMMAND *resp, mlan_ioctl_req *pioctl_buf)
{
	HostCmd_DS_OTP_USER_DATA *cmd_user_data =
		(HostCmd_DS_OTP_USER_DATA *)&resp->params.otp_user_data;
	mlan_ds_misc_otp_user_data *user_data = MNULL;

	ENTER();
	if (pioctl_buf && (pioctl_buf->action == MLAN_ACT_GET)) {
		user_data = (mlan_ds_misc_otp_user_data *)pioctl_buf->pbuf;
		user_data->user_data_length =
			MIN(MAX_OTP_USER_DATA_LEN,
			    wlan_le16_to_cpu(cmd_user_data->user_data_length));
		memcpy_ext(pmpriv->adapter, user_data->user_data,
			   cmd_user_data->user_data,
			   user_data->user_data_length,
			   sizeof(user_data->user_data));
		pioctl_buf->data_read_written =
			sizeof(mlan_ds_misc_otp_user_data) +
			user_data->user_data_length;
	}
	LEAVE();
	return MLAN_STATUS_SUCCESS;
}

#ifdef USB
/**
 *  @brief This function handles the command response of
 *  packet aggregation
 *
 *  @param pmpriv       A pointer to mlan_private structure
 *  @param resp         A pointer to HostCmd_DS_COMMAND
 *  @param pioctl_buf   A pointer to command buffer
 *
 *  @return             MLAN_STATUS_SUCCESS
 */
static mlan_status
wlan_ret_packet_aggr_over_host_interface(pmlan_private pmpriv,
					 HostCmd_DS_COMMAND *resp,
					 mlan_ioctl_req *pioctl_buf)
{
	mlan_ds_misc_cfg *misc = MNULL;
	HostCmd_DS_PACKET_AGGR_OVER_HOST_INTERFACE *packet_aggr =
		(HostCmd_DS_PACKET_AGGR_OVER_HOST_INTERFACE *)&resp->params.
		packet_aggr;
	MrvlIETypes_USBAggrParam_t *usb_aggr_param_tlv = MNULL;
	mlan_ds_misc_usb_aggr_ctrl *usb_aggr_ctrl = MNULL;
	t_u8 *ptlv_buffer = (t_u8 *)packet_aggr->tlv_buf;
	mlan_adapter *pmadapter = pmpriv->adapter;
	t_u16 tlv = 0;
	int tlv_buf_len = 0;
	t_u8 changed = 0;
#if defined(USB)
	t_s32 i = 0;
#endif

	ENTER();

	tlv_buf_len =
		resp->size -
		(sizeof(HostCmd_DS_PACKET_AGGR_OVER_HOST_INTERFACE) + S_DS_GEN);

	if (!pioctl_buf) {
		LEAVE();
		return MLAN_STATUS_SUCCESS;
	}
	while (tlv_buf_len > 0) {
		changed = 0;
		tlv = (*ptlv_buffer) | (*(ptlv_buffer + 1) << 8);
		switch (tlv) {
		case MRVL_USB_AGGR_PARAM_TLV_ID:
			usb_aggr_param_tlv = (MrvlIETypes_USBAggrParam_t *)
				ptlv_buffer;
			misc = (mlan_ds_misc_cfg *)pioctl_buf->pbuf;
			usb_aggr_ctrl =
				(mlan_ds_misc_usb_aggr_ctrl *)&(misc->param.
								usb_aggr_params);
			usb_aggr_param_tlv->header.len =
				wlan_le16_to_cpu(usb_aggr_param_tlv->header.
						 len);
			usb_aggr_param_tlv->enable =
				wlan_le16_to_cpu(usb_aggr_param_tlv->enable);
#if defined(USB)
			if (pioctl_buf->action == MLAN_ACT_SET) {
				/* Update the Tx aggregation values in
				 * MLAN */
				for (i = 0; i < MAX_USB_TX_PORT_NUM; i++) {
					pmadapter->pcard_usb->usb_tx_aggr[i]
					.aggr_ctrl.enable =
						usb_aggr_ctrl->tx_aggr_ctrl.
						enable;
					if (pmadapter->pcard_usb->usb_tx_aggr[i]
					    .aggr_ctrl.aggr_mode !=
					    usb_aggr_ctrl->tx_aggr_ctrl.
					    aggr_mode) {
						pmadapter->pcard_usb->
							usb_tx_aggr[i]
							.aggr_ctrl.aggr_mode = usb_aggr_ctrl
						->tx_aggr_ctrl.aggr_mode;
						changed = 1;
					}
					if (pmadapter->pcard_usb->usb_tx_aggr[i]
					    .aggr_ctrl.aggr_align !=
					    usb_aggr_ctrl->tx_aggr_ctrl.
					    aggr_align) {
						pmadapter->pcard_usb->
							usb_tx_aggr[i]
							.aggr_ctrl.aggr_align = usb_aggr_ctrl
						->tx_aggr_ctrl.aggr_align;
						changed = 1;
					}
					if (pmadapter->pcard_usb->usb_tx_aggr[i]
					    .aggr_ctrl.aggr_max !=
					    usb_aggr_ctrl->tx_aggr_ctrl.
					    aggr_max) {
						pmadapter->pcard_usb->
							usb_tx_aggr[i]
							.aggr_ctrl.aggr_max = usb_aggr_ctrl
						->tx_aggr_ctrl.aggr_max;
						changed = 1;
					}
					pmadapter->pcard_usb->usb_tx_aggr[i]
						.aggr_ctrl.aggr_tmo = usb_aggr_ctrl
					->tx_aggr_ctrl.aggr_tmo;
				}
			} else {
				if (usb_aggr_param_tlv->enable & MBIT(1))
					usb_aggr_ctrl->tx_aggr_ctrl.enable =
						MTRUE;
				else
					usb_aggr_ctrl->tx_aggr_ctrl.enable =
						MFALSE;
				usb_aggr_ctrl->tx_aggr_ctrl.aggr_align =
					wlan_le16_to_cpu(usb_aggr_param_tlv->
							 tx_aggr_align);
				usb_aggr_ctrl->tx_aggr_ctrl.aggr_mode =
					pmadapter->pcard_usb->usb_tx_aggr[0]
					.aggr_ctrl.aggr_mode;
				usb_aggr_ctrl->tx_aggr_ctrl.aggr_max =
					pmadapter->pcard_usb->usb_tx_aggr[0]
					.aggr_ctrl.aggr_max;
				usb_aggr_ctrl->tx_aggr_ctrl.aggr_tmo =
					pmadapter->pcard_usb->usb_tx_aggr[0]
					.aggr_ctrl.aggr_tmo;
			}
			if (changed)
				wlan_reset_usb_tx_aggr(pmadapter);
#endif

#if defined(USB)
			if (pioctl_buf->action == MLAN_ACT_SET) {
				/* Update the Rx deaggregation values in
				 * MLAN */
				pmadapter->pcard_usb->usb_rx_deaggr.aggr_ctrl.
					enable =
					usb_aggr_ctrl->rx_deaggr_ctrl.enable;
				if (pmadapter->pcard_usb->usb_rx_deaggr.
				    aggr_ctrl.aggr_mode !=
				    usb_aggr_ctrl->rx_deaggr_ctrl.aggr_mode)
					pmadapter->pcard_usb->usb_rx_deaggr.
						aggr_ctrl.aggr_mode =
						usb_aggr_ctrl
					->rx_deaggr_ctrl.aggr_mode;
				if (pmadapter->pcard_usb->usb_rx_deaggr.
				    aggr_ctrl.aggr_align !=
				    usb_aggr_ctrl->rx_deaggr_ctrl.aggr_align)
					pmadapter->pcard_usb->usb_rx_deaggr.
						aggr_ctrl.aggr_align =
						usb_aggr_ctrl
					->rx_deaggr_ctrl.aggr_align;
				if (pmadapter->pcard_usb->usb_rx_deaggr.
				    aggr_ctrl.aggr_max !=
				    usb_aggr_ctrl->rx_deaggr_ctrl.aggr_max)
					pmadapter->pcard_usb->usb_rx_deaggr.
						aggr_ctrl.aggr_max =
						usb_aggr_ctrl
					->rx_deaggr_ctrl.aggr_max;
				pmadapter->pcard_usb->usb_rx_deaggr.aggr_ctrl.
					aggr_tmo =
					usb_aggr_ctrl->rx_deaggr_ctrl.aggr_tmo;
			} else {
				if (usb_aggr_param_tlv->enable & MBIT(0))
					usb_aggr_ctrl->rx_deaggr_ctrl.enable =
						MTRUE;
				else
					usb_aggr_ctrl->rx_deaggr_ctrl.enable =
						MFALSE;
				usb_aggr_ctrl->rx_deaggr_ctrl.aggr_mode =
					wlan_le16_to_cpu(usb_aggr_param_tlv->
							 rx_aggr_mode);
				usb_aggr_ctrl->rx_deaggr_ctrl.aggr_align =
					wlan_le16_to_cpu(usb_aggr_param_tlv->
							 rx_aggr_align);
				usb_aggr_ctrl->rx_deaggr_ctrl.aggr_max =
					wlan_le16_to_cpu(usb_aggr_param_tlv->
							 rx_aggr_max);
				usb_aggr_ctrl->rx_deaggr_ctrl.aggr_tmo =
					wlan_le16_to_cpu(usb_aggr_param_tlv->
							 rx_aggr_tmo);
			}
#endif
			ptlv_buffer += usb_aggr_param_tlv->header.len +
				sizeof(MrvlIEtypesHeader_t);
			tlv_buf_len -= (usb_aggr_param_tlv->header.len +
					sizeof(MrvlIEtypesHeader_t));
			break;
		default:
			break;
		}
	}

	LEAVE();
	return MLAN_STATUS_SUCCESS;
}
#endif

/**
 *  @brief This function handles the command response of
 *  DFS Repeater mode configuration
 *
 *  @param pmpriv       A pointer to mlan_private structure
 *  @param resp         A pointer to HostCmd_DS_COMMAND
 *  @param pioctl_buf   A pointer to command buffer
 *
 *  @return             MLAN_STATUS_SUCCESS
 */
static mlan_status
wlan_ret_dfs_repeater_cfg(pmlan_private pmpriv,
			  HostCmd_DS_COMMAND *resp, mlan_ioctl_req *pioctl_buf)
{
	HostCmd_DS_DFS_REPEATER_MODE *cmd_dfs_repeater =
		&resp->params.dfs_repeater;
	mlan_ds_misc_cfg *misc = MNULL;
	mlan_ds_misc_dfs_repeater *dfs_cfg = MNULL;

	ENTER();

	if (pioctl_buf && (pioctl_buf->action == MLAN_ACT_GET)) {
		misc = (mlan_ds_misc_cfg *)pioctl_buf->pbuf;
		dfs_cfg =
			(mlan_ds_misc_dfs_repeater *)&misc->param.dfs_repeater;
		dfs_cfg->mode = wlan_le16_to_cpu(cmd_dfs_repeater->mode);
	}
	if (pioctl_buf && (pioctl_buf->action == MLAN_ACT_SET)) {
		if (wlan_le16_to_cpu(cmd_dfs_repeater->mode) == 1) {
			/* Set dfs_repeater mode to true/enabled
			 * for futher references.
			 */
			pmpriv->adapter->dfs_repeater = MTRUE;
		} else {
			pmpriv->adapter->dfs_repeater = MFALSE;
		}
	}

	LEAVE();
	return MLAN_STATUS_SUCCESS;
}

/**
 *  @brief This function handles the command response of coalesce config
 *
 *  @param pmpriv       A pointer to mlan_private structure
 *  @param resp         A pointer to HostCmd_DS_COMMAND
 *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
 *
 *  @return             MLAN_STATUS_SUCCESS
 */
static mlan_status
wlan_ret_coalesce_config(pmlan_private pmpriv,
			 HostCmd_DS_COMMAND *resp, mlan_ioctl_req *pioctl_buf)
{
	ENTER();
	LEAVE();
	return MLAN_STATUS_SUCCESS;
}

static mlan_status
wlan_ret_get_sensor_temp(pmlan_private pmpriv,
			 const HostCmd_DS_COMMAND *resp,
			 mlan_ioctl_req *pioctl_buf)
{
	mlan_ds_misc_cfg *pcfg = MNULL;
	const HostCmd_DS_SENSOR_TEMP *pSensorT = &resp->params.temp_sensor;

	ENTER();

	if (pioctl_buf) {
		pcfg = (mlan_ds_misc_cfg *)pioctl_buf->pbuf;
		pcfg->param.sensor_temp.temperature =
			wlan_le32_to_cpu(pSensorT->temperature);
		PRINTM(MCMND, "get SOC temperature %u C \n",
		       pSensorT->temperature);
	}

	LEAVE();
	return MLAN_STATUS_SUCCESS;
}

/**
 *  @brief This function handles the command response of arb Cfg
 *
 *  @param pmpriv       A pointer to mlan_private structure
 *  @param resp         A pointer to HostCmd_DS_COMMAND
 *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
 *
 *  @return             MLAN_STATUS_SUCCESS
 */
mlan_status
wlan_ret_arb_cfg(pmlan_private pmpriv,
		 HostCmd_DS_COMMAND *resp, mlan_ioctl_req *pioctl_buf)
{
	HostCmd_DS_CMD_ARB_CONFIG *cfg_cmd =
		(HostCmd_DS_CMD_ARB_CONFIG *) & resp->params.arb_cfg;
	mlan_ds_misc_cfg *misc_cfg = MNULL;

	ENTER();

	if (pioctl_buf) {
		misc_cfg = (mlan_ds_misc_cfg *)pioctl_buf->pbuf;
		misc_cfg->param.arb_cfg.arb_mode =
			wlan_le32_to_cpu(cfg_cmd->arb_mode);
	}
	LEAVE();
	return MLAN_STATUS_SUCCESS;
}

/**
 *  @brief This function handles the command response of ipv6 ra offload feature
 *
 *  @param pmpriv       A pointer to mlan_private structure
 *  @param resp         A pointer to HostCmd_DS_COMMAND
 *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
 *
 *  @return             MLAN_STATUS_SUCCESS
 */
mlan_status
wlan_ret_ipv6_ra_offload(pmlan_private pmpriv,
			 HostCmd_DS_COMMAND *resp, mlan_ioctl_req *pioctl_buf)
{
	HostCmd_DS_IPV6_RA_OFFLOAD *ipv6_ra_resp =
		&resp->params.ipv6_ra_offload;
	mlan_ds_misc_cfg *misc = MNULL;
	mlan_ds_misc_ipv6_ra_offload *ipv6_ra = MNULL;

	ENTER();

	if (pioctl_buf && (pioctl_buf->action == MLAN_ACT_GET)) {
		misc = (mlan_ds_misc_cfg *)pioctl_buf->pbuf;
		ipv6_ra =
			(mlan_ds_misc_ipv6_ra_offload *) & misc->param.
			ipv6_ra_offload;
		ipv6_ra->enable = ipv6_ra_resp->enable;
		memcpy_ext(pmpriv->adapter, ipv6_ra->ipv6_addr,
			   ipv6_ra_resp->ipv6_addr_param.ipv6_addr, 16,
			   sizeof(ipv6_ra->ipv6_addr));
	}

	LEAVE();
	return MLAN_STATUS_SUCCESS;
}

/**
 *  @brief This function handles the command response of sta get band and
 * channel
 *
 *  @param pmpriv       A pointer to mlan_private structure
 *  @param resp         A pointer to HostCmd_DS_COMMAND
 *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
 *
 *  @return             MLAN_STATUS_SUCCESS
 */
static mlan_status
wlan_ret_sta_config(pmlan_private pmpriv,
		    HostCmd_DS_COMMAND *resp, mlan_ioctl_req *pioctl_buf)
{
	HostCmd_DS_STA_CONFIGURE *cmdrsp_sta_cfg =
		(HostCmd_DS_STA_CONFIGURE *) & resp->params.sta_cfg;
	mlan_ds_bss *bss = MNULL;
	MrvlIEtypes_channel_band_t *tlv_band_channel = MNULL;

	ENTER();
	if (pioctl_buf) {
		if (pioctl_buf->req_id == MLAN_IOCTL_BSS) {
			bss = (mlan_ds_bss *)pioctl_buf->pbuf;
			if (bss->sub_command == MLAN_OID_BSS_CHAN_INFO) {
				tlv_band_channel =
					(MrvlIEtypes_channel_band_t *)
					cmdrsp_sta_cfg->tlv_buffer;
				bss->param.sta_channel.bandcfg =
					tlv_band_channel->bandcfg;
				bss->param.sta_channel.channel =
					tlv_band_channel->channel;
				bss->param.sta_channel.is_11n_enabled =
					IS_11N_ENABLED(pmpriv);
				if (bss->param.sta_channel.bandcfg.chanWidth ==
				    CHAN_BW_80MHZ)
					bss->param.sta_channel.center_chan =
						wlan_get_center_freq_idx(pmpriv,
									 BAND_AAC,
									 bss->
									 param.
									 sta_channel.
									 channel,
									 CHANNEL_BW_80MHZ);
				PRINTM(MCMND,
				       "Get STA channel, band=0x%x, channel=%d, is_11n_enabled=%d center_chan=%d\n",
				       bss->param.sta_channel.bandcfg,
				       bss->param.sta_channel.channel,
				       bss->param.sta_channel.is_11n_enabled,
				       bss->param.sta_channel.center_chan);

				pioctl_buf->data_read_written =
					sizeof(mlan_ds_bss);
			}
		}
	}
	LEAVE();
	return MLAN_STATUS_SUCCESS;
}

/**
 *  @brief This function handles the command response of set/get auto tx
 *
 *  @param pmpriv       A pointer to mlan_private structure
 *  @param resp         A pointer to HostCmd_DS_COMMAND
 *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
 *
 *  @return             MLAN_STATUS_SUCCESS
 */
static mlan_status
wlan_ret_auto_tx(pmlan_private pmpriv,
		 HostCmd_DS_COMMAND *resp, mlan_ioctl_req *pioctl_buf)
{
	HostCmd_DS_AUTO_TX *cmdrsp_auto_tx =
		(HostCmd_DS_AUTO_TX *) & resp->params.auto_tx;
	mlan_status status = MLAN_STATUS_SUCCESS;
	MrvlIEtypesHeader_t *header = MNULL;
	mlan_ds_misc_cfg *misc = MNULL;
	t_u16 action;
	t_u16 len = 0;
	MrvlIEtypes_Cloud_Keep_Alive_t *keep_alive_tlv = MNULL;
	MrvlIEtypes_Keep_Alive_Pkt_t *pkt_tlv = MNULL;
	mlan_ds_misc_keep_alive *misc_keep_alive = MNULL;

	ENTER();

	action = wlan_le16_to_cpu(cmdrsp_auto_tx->action);
	if (!pioctl_buf) {
		PRINTM(MERROR, "ioctl is null\n");
		LEAVE();
		return MLAN_STATUS_FAILURE;
	}

	misc = (mlan_ds_misc_cfg *)pioctl_buf->pbuf;

	if (!misc) {
		PRINTM(MERROR, "misc is null\n");
		LEAVE();
		return MLAN_STATUS_FAILURE;
	}

	if (resp->result == HostCmd_RESULT_OK) {
		header = (MrvlIEtypesHeader_t *)cmdrsp_auto_tx->tlv_buffer;
		header->type = wlan_le16_to_cpu(header->type);
		len = wlan_le16_to_cpu(header->len);
		if (header->type == TLV_TYPE_CLOUD_KEEP_ALIVE) {
			keep_alive_tlv = (MrvlIEtypes_Cloud_Keep_Alive_t *)
				cmdrsp_auto_tx->tlv_buffer;
			misc_keep_alive =
				(mlan_ds_misc_keep_alive *) & misc->param.
				keep_alive;
			misc_keep_alive->mkeep_alive_id =
				keep_alive_tlv->keep_alive_id;
			misc_keep_alive->enable = keep_alive_tlv->enable;
			if (((action == HostCmd_ACT_GEN_SET) ||
			     (action == HostCmd_ACT_GEN_RESET)) &&
			    !keep_alive_tlv->enable) {
				len = len -
					sizeof(keep_alive_tlv->keep_alive_id) -
					sizeof(keep_alive_tlv->enable);
				if (len > sizeof(MrvlIEtypesHeader_t)) {
					header = (MrvlIEtypesHeader_t *)
						keep_alive_tlv->tlv;
					header->type =
						wlan_le16_to_cpu(header->type);
					len = wlan_le16_to_cpu(header->len) -
						sizeof(Eth803Hdr_t);
					if (header->type ==
					    TLV_TYPE_KEEP_ALIVE_PKT) {
						pkt_tlv =
							(MrvlIEtypes_Keep_Alive_Pkt_t
							 *) keep_alive_tlv->tlv;
						memcpy_ext(pmpriv->adapter,
							   misc_keep_alive->
							   dst_mac,
							   pkt_tlv->eth_header.
							   dest_addr,
							   MLAN_MAC_ADDR_LENGTH,
							   sizeof
							   (misc_keep_alive->
							    dst_mac));
						memcpy_ext(pmpriv->adapter,
							   misc_keep_alive->
							   src_mac,
							   pkt_tlv->eth_header.
							   src_addr,
							   MLAN_MAC_ADDR_LENGTH,
							   sizeof
							   (misc_keep_alive->
							    src_mac));
						memcpy_ext(pmpriv->adapter,
							   misc_keep_alive->
							   packet,
							   pkt_tlv->ip_packet,
							   len,
							   sizeof
							   (misc_keep_alive->
							    packet));
						misc_keep_alive->pkt_len = len;
					}
				}
			}
		}
	}

	LEAVE();
	return status;
}

/********************************************************
			Global Functions
********************************************************/

/**
 *  @brief This function prepares command resp of MFG Continuous Tx
 *
 *  @param pmpriv       A pointer to mlan_private structure
 *  @param resp         A pointer to HostCmd_DS_COMMAND
 *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
 *
 *  @return             MLAN_STATUS_SUCCESS
 */
static mlan_status
wlan_ret_mfg_tx_cont(pmlan_private pmpriv,
		     HostCmd_DS_COMMAND *resp, mlan_ioctl_req *pioctl_buf)
{
	mlan_ds_misc_cfg *misc = MNULL;
	struct mfg_cmd_tx_cont *mcmd = (struct mfg_cmd_tx_cont
					*)&resp->params.mfg_tx_cont;
	struct mfg_cmd_tx_cont *cfg = MNULL;

	ENTER();
	if (!pioctl_buf) {
		LEAVE();
		return MLAN_STATUS_FAILURE;
	}
	misc = (mlan_ds_misc_cfg *)pioctl_buf->pbuf;
	cfg = (struct mfg_cmd_tx_cont *)&misc->param.mfg_tx_cont;

	cfg->error = wlan_le32_to_cpu(mcmd->error);
	cfg->enable_tx = wlan_le32_to_cpu(mcmd->enable_tx);
	cfg->cw_mode = wlan_le32_to_cpu(mcmd->cw_mode);
	cfg->payload_pattern = wlan_le32_to_cpu(mcmd->payload_pattern);
	cfg->cs_mode = wlan_le32_to_cpu(mcmd->cs_mode);
	cfg->act_sub_ch = wlan_le32_to_cpu(mcmd->act_sub_ch);
	cfg->tx_rate = wlan_le32_to_cpu(mcmd->tx_rate);

	LEAVE();
	return MLAN_STATUS_SUCCESS;
}

/**
 *  @brief This function prepares command resp of MFG Tx frame
 *
 *  @param pmpriv       A pointer to mlan_private structure
 *  @param resp         A pointer to HostCmd_DS_COMMAND
 *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
 *
 *  @return             MLAN_STATUS_SUCCESS
 */
static mlan_status
wlan_ret_mfg_tx_frame(pmlan_private pmpriv,
		      HostCmd_DS_COMMAND *resp, mlan_ioctl_req *pioctl_buf)
{
	mlan_ds_misc_cfg *misc = MNULL;
	struct mfg_cmd_tx_frame2 *mcmd = (struct mfg_cmd_tx_frame2
					  *)&resp->params.mfg_tx_frame2;
	struct mfg_cmd_tx_frame2 *cfg = MNULL;

	ENTER();
	if (!pioctl_buf) {
		LEAVE();
		return MLAN_STATUS_FAILURE;
	}
	misc = (mlan_ds_misc_cfg *)pioctl_buf->pbuf;
	cfg = (struct mfg_cmd_tx_frame2 *)&misc->param.mfg_tx_frame2;

	cfg->error = wlan_le32_to_cpu(mcmd->error);
	cfg->enable = wlan_le32_to_cpu(mcmd->enable);
	cfg->data_rate = wlan_le32_to_cpu(mcmd->data_rate);
	cfg->frame_pattern = wlan_le32_to_cpu(mcmd->frame_pattern);
	cfg->frame_length = wlan_le32_to_cpu(mcmd->frame_length);
	cfg->adjust_burst_sifs = wlan_le16_to_cpu(mcmd->adjust_burst_sifs);
	cfg->burst_sifs_in_us = wlan_le32_to_cpu(mcmd->burst_sifs_in_us);
	cfg->short_preamble = wlan_le32_to_cpu(mcmd->short_preamble);
	cfg->act_sub_ch = wlan_le32_to_cpu(mcmd->act_sub_ch);
	cfg->short_gi = wlan_le32_to_cpu(mcmd->short_gi);
	cfg->tx_bf = wlan_le32_to_cpu(mcmd->tx_bf);
	cfg->gf_mode = wlan_le32_to_cpu(mcmd->gf_mode);
	cfg->stbc = wlan_le32_to_cpu(mcmd->stbc);
	cfg->NumPkt = wlan_le32_to_cpu(mcmd->NumPkt);
	cfg->MaxPE = wlan_le32_to_cpu(mcmd->MaxPE);
	cfg->BeamChange = wlan_le32_to_cpu(mcmd->BeamChange);
	cfg->Dcm = wlan_le32_to_cpu(mcmd->Dcm);
	cfg->Doppler = wlan_le32_to_cpu(mcmd->Doppler);
	cfg->MidP = wlan_le32_to_cpu(mcmd->MidP);
	cfg->QNum = wlan_le32_to_cpu(mcmd->QNum);
	memcpy_ext(pmpriv->adapter, cfg->bssid, mcmd->bssid,
		   MLAN_MAC_ADDR_LENGTH, sizeof(cfg->bssid));

	LEAVE();
	return MLAN_STATUS_SUCCESS;
}

/**
 *  @brief This function prepares command resp of MFG HE TB Tx
 *
 *  @param pmpriv       A pointer to mlan_private structure
 *  @param resp         A pointer to HostCmd_DS_COMMAND
 *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
 *
 *  @return             MLAN_STATUS_SUCCESS
 */

static mlan_status
wlan_ret_mfg_he_tb_tx(pmlan_private pmpriv,
		      HostCmd_DS_COMMAND *resp, mlan_ioctl_req *pioctl_buf)
{
	mlan_ds_misc_cfg *misc = MNULL;
	struct mfg_Cmd_HE_TBTx_t *mcmd = (struct mfg_Cmd_HE_TBTx_t
					  *)&resp->params.mfg_he_power;
	struct mfg_Cmd_HE_TBTx_t *cfg = MNULL;

	ENTER();
	if (!pioctl_buf) {
		LEAVE();
		return MLAN_STATUS_FAILURE;
	}
	misc = (mlan_ds_misc_cfg *)pioctl_buf->pbuf;
	cfg = (struct mfg_Cmd_HE_TBTx_t *)&misc->param.mfg_he_power;

	cfg->enable = wlan_le16_to_cpu(mcmd->enable);
	cfg->qnum = wlan_le16_to_cpu(mcmd->qnum);
	cfg->aid = wlan_le16_to_cpu(mcmd->aid);
	cfg->axq_mu_timer = wlan_le16_to_cpu(mcmd->axq_mu_timer);
	cfg->tx_power = wlan_le16_to_cpu(mcmd->tx_power);

	LEAVE();
	return MLAN_STATUS_SUCCESS;

}

/**
 *  @brief This function prepares command resp of MFG Cmd
 *
 *  @param pmpriv       A pointer to mlan_private structure
 *  @param resp         A pointer to HostCmd_DS_COMMAND
 *  @param pioctl_buf   A pointer to mlan_ioctl_req structure
 *
 *  @return             MLAN_STATUS_SUCCESS
 */
mlan_status
wlan_ret_mfg(pmlan_private pmpriv,
	     HostCmd_DS_COMMAND *resp, mlan_ioctl_req *pioctl_buf)
{
	mlan_ds_misc_cfg *misc = MNULL;
	struct mfg_cmd_generic_cfg *mcmd = (struct mfg_cmd_generic_cfg
					    *)&resp->params.mfg_generic_cfg;
	struct mfg_cmd_generic_cfg *cfg = MNULL;
	mlan_status ret = MLAN_STATUS_SUCCESS;

	ENTER();
	if (!pioctl_buf) {
		LEAVE();
		return MLAN_STATUS_FAILURE;
	}
	switch (wlan_le32_to_cpu(mcmd->mfg_cmd)) {
	case MFG_CMD_TX_CONT:
		ret = wlan_ret_mfg_tx_cont(pmpriv, resp, pioctl_buf);
		goto cmd_mfg_done;
	case MFG_CMD_TX_FRAME:
		ret = wlan_ret_mfg_tx_frame(pmpriv, resp, pioctl_buf);
		goto cmd_mfg_done;
	case MFG_CMD_CONFIG_MAC_HE_TB_TX:
		ret = wlan_ret_mfg_he_tb_tx(pmpriv, resp, pioctl_buf);
		goto cmd_mfg_done;
	case MFG_CMD_SET_TEST_MODE:
	case MFG_CMD_UNSET_TEST_MODE:
	case MFG_CMD_TX_ANT:
	case MFG_CMD_RX_ANT:
	case MFG_CMD_RF_CHAN:
	case MFG_CMD_CLR_RX_ERR:
	case MFG_CMD_RF_BAND_AG:
	case MFG_CMD_RF_CHANNELBW:
	case MFG_CMD_RADIO_MODE_CFG:
	case MFG_CMD_RFPWR:
		break;
	default:
		ret = MLAN_STATUS_FAILURE;
		goto cmd_mfg_done;
	}
	misc = (mlan_ds_misc_cfg *)pioctl_buf->pbuf;
	cfg = (struct mfg_cmd_generic_cfg *)&misc->param.mfg_generic_cfg;

	cfg->error = wlan_le32_to_cpu(mcmd->error);
	cfg->data1 = wlan_le32_to_cpu(mcmd->data1);
	cfg->data2 = wlan_le32_to_cpu(mcmd->data2);
	cfg->data3 = wlan_le32_to_cpu(mcmd->data3);
cmd_mfg_done:
	LEAVE();
	return ret;
}

/**
 *  @brief This function handles the station command response
 *
 *  @param priv             A pointer to mlan_private structure
 *  @param cmdresp_no       cmd no
 *  @param pcmd_buf         cmdresp buf
 *  @param pioctl           A pointer to ioctl buf
 *
 *  @return             MLAN_STATUS_SUCCESS or MLAN_STATUS_FAILURE
 */
mlan_status
wlan_ops_sta_process_cmdresp(t_void *priv, t_u16 cmdresp_no,
			     t_void *pcmd_buf, t_void *pioctl)
{
	mlan_status ret = MLAN_STATUS_SUCCESS;
	mlan_private *pmpriv = (mlan_private *)priv;
	HostCmd_DS_COMMAND *resp = (HostCmd_DS_COMMAND *)pcmd_buf;
	mlan_ioctl_req *pioctl_buf = (mlan_ioctl_req *)pioctl;

	mlan_adapter *pmadapter = pmpriv->adapter;
#ifdef SDIO
	int ctr;
#endif

	ENTER();

	/* If the command is not successful, cleanup and return failure */
	if ((resp->result != HostCmd_RESULT_OK)
		) {
		ret = wlan_process_cmdresp_error(pmpriv, resp, pioctl_buf);
		LEAVE();
		return ret;
	}
	/* Command successful, handle response */
	switch (cmdresp_no) {
	case HostCmd_CMD_GET_HW_SPEC:
		ret = wlan_ret_get_hw_spec(pmpriv, resp, pioctl_buf);
		break;
#ifdef SDIO
	case HostCmd_CMD_SDIO_SP_RX_AGGR_CFG:
		ret = wlan_ret_sdio_rx_aggr_cfg(pmpriv, resp);
		break;
#endif
	case HostCmd_CMD_CFG_DATA:
		ret = wlan_ret_cfg_data(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_MAC_CONTROL:
		ret = wlan_ret_mac_control(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_802_11_MAC_ADDRESS:
		ret = wlan_ret_802_11_mac_address(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_MAC_MULTICAST_ADR:
		ret = wlan_ret_mac_multicast_adr(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_TX_RATE_CFG:
		ret = wlan_ret_tx_rate_cfg(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_802_11_SCAN:
		ret = wlan_ret_802_11_scan(pmpriv, resp, pioctl_buf);
		pioctl_buf = MNULL;
		pmadapter->curr_cmd->pioctl_buf = MNULL;
		break;
	case HostCmd_CMD_802_11_SCAN_EXT:
		ret = wlan_ret_802_11_scan_ext(pmpriv, resp, pioctl_buf);
		pioctl_buf = MNULL;
		pmadapter->curr_cmd->pioctl_buf = MNULL;
		break;
	case HostCmd_CMD_802_11_BG_SCAN_CONFIG:
		ret = wlan_ret_bgscan_config(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_802_11_BG_SCAN_QUERY:
		ret = wlan_ret_802_11_bgscan_query(pmpriv, resp, pioctl_buf);
		wlan_recv_event(pmpriv, MLAN_EVENT_ID_DRV_BGSCAN_RESULT, MNULL);
		PRINTM(MINFO, "CMD_RESP: BG_SCAN result is ready!\n");
		break;
	case HostCmd_CMD_TXPWR_CFG:
		ret = wlan_ret_tx_power_cfg(pmpriv, resp, pioctl_buf);
		break;

	case HostCmd_CMD_802_11_RF_TX_POWER:
		ret = wlan_ret_802_11_rf_tx_power(pmpriv, resp, pioctl_buf);
		break;

	case HostCmd_CMD_802_11_PS_MODE_ENH:
		ret = wlan_ret_enh_power_mode(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_802_11_HS_CFG_ENH:
		ret = wlan_ret_802_11_hs_cfg(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_802_11_SLEEP_PERIOD:
		ret = wlan_ret_802_11_sleep_period(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_802_11_SLEEP_PARAMS:
		ret = wlan_ret_802_11_sleep_params(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_802_11_ROBUSTCOEX:
		break;
	case HostCmd_CMD_DMCS_CONFIG:
		ret = wlan_ret_dmcs_config(pmpriv, resp, pioctl_buf);
		break;
#if defined(PCIE)
	case HostCmd_CMD_SSU:
		PRINTM(MCMND,
		       "SSU cmdresp:number_of_buffers %d, buffer_size %d rec_len %d\n",
		       resp->params.ssu_params.number_of_buffers,
		       resp->params.ssu_params.buffer_size,
		       resp->params.ssu_params.rec_len);
		break;
#endif
	case HostCmd_CMD_802_11_ASSOCIATE:
		ret = wlan_ret_802_11_associate(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_802_11_DEAUTHENTICATE:
	case HostCmd_CMD_802_11_DISASSOCIATE:
		ret = wlan_ret_802_11_deauthenticate(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_802_11_AD_HOC_START:
	case HostCmd_CMD_802_11_AD_HOC_JOIN:
		ret = wlan_ret_802_11_ad_hoc(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_802_11_AD_HOC_STOP:
		ret = wlan_ret_802_11_ad_hoc_stop(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_802_11_GET_LOG:
		ret = wlan_ret_get_log(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_802_11_LINK_STATS:
		ret = wlan_ret_get_link_statistic(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_RSSI_INFO_EXT:
		ret = wlan_ret_802_11_rssi_info_ext(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_RSSI_INFO:
		ret = wlan_ret_802_11_rssi_info(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_802_11_SNMP_MIB:
		ret = wlan_ret_802_11_snmp_mib(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_802_11_RADIO_CONTROL:
		ret = wlan_ret_802_11_radio_control(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_802_11_TX_RATE_QUERY:
		ret = wlan_ret_802_11_tx_rate_query(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_802_11_RF_CHANNEL:
		ret = wlan_ret_802_11_rf_channel(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_802_11_RF_ANTENNA:
		ret = wlan_ret_802_11_rf_antenna(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_CW_MODE_CTRL:
		ret = wlan_ret_cw_mode_ctrl(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_VERSION_EXT:
		ret = wlan_ret_ver_ext(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_RX_MGMT_IND:
		ret = wlan_ret_rx_mgmt_ind(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_FUNC_INIT:
	case HostCmd_CMD_FUNC_SHUTDOWN:
		break;
	case HostCmd_CMD_802_11_KEY_MATERIAL:
		ret = wlan_ret_802_11_key_material(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_GTK_REKEY_OFFLOAD_CFG:
		break;
	case HostCmd_CMD_SUPPLICANT_PMK:
		ret = wlan_ret_802_11_supplicant_pmk(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_SUPPLICANT_PROFILE:
		ret = wlan_ret_802_11_supplicant_profile(pmpriv, resp,
							 pioctl_buf);
		break;
	case HostCmd_CMD_802_11_EAPOL_PKT:
		break;
	case HostCmd_CMD_802_11D_DOMAIN_INFO:
		ret = wlan_ret_802_11d_domain_info(pmpriv, resp);
		break;
	case HostCmd_CMD_802_11_TPC_ADAPT_REQ:
	case HostCmd_CMD_802_11_TPC_INFO:
	case HostCmd_CMD_802_11_CHAN_SW_ANN:
	case HostCmd_CMD_CHAN_REPORT_REQUEST:
		ret = wlan_11h_cmdresp_process(pmpriv, resp);
		break;
	case HostCmd_CMD_11N_ADDBA_REQ:
		ret = wlan_ret_11n_addba_req(pmpriv, resp);
		break;
	case HostCmd_CMD_11N_DELBA:
		ret = wlan_ret_11n_delba(pmpriv, resp);
		break;
	case HostCmd_CMD_11N_ADDBA_RSP:
		ret = wlan_ret_11n_addba_resp(pmpriv, resp);
		break;
	case HostCmd_CMD_RECONFIGURE_TX_BUFF:
		wlan_set_tx_pause_flag(pmpriv, MFALSE);

		pmadapter->tx_buf_size =
			(t_u16)wlan_le16_to_cpu(resp->params.tx_buf.buff_size);
#ifdef SDIO
		if (IS_SD(pmadapter->card_type)) {
			pmadapter->tx_buf_size = (pmadapter->tx_buf_size /
						  MLAN_SDIO_BLOCK_SIZE) *
				MLAN_SDIO_BLOCK_SIZE;
			pmadapter->pcard_sd->mp_end_port =
				wlan_le16_to_cpu(resp->params.tx_buf.
						 mp_end_port);
			pmadapter->pcard_sd->mp_data_port_mask =
				pmadapter->pcard_sd->reg->data_port_mask;

			for (ctr = 1;
			     ctr <=
			     pmadapter->pcard_sd->max_ports -
			     pmadapter->pcard_sd->mp_end_port; ctr++) {
				pmadapter->pcard_sd->mp_data_port_mask &=
					~(1 <<
					  (pmadapter->pcard_sd->max_ports -
					   ctr));
			}

			pmadapter->pcard_sd->curr_wr_port =
				pmadapter->pcard_sd->reg->start_wr_port;
			pmadapter->pcard_sd->mpa_tx.pkt_aggr_limit =
				MIN(pmadapter->pcard_sd->mp_aggr_pkt_limit,
				    (pmadapter->pcard_sd->mp_end_port >> 1));
			PRINTM(MCMND, "end port %d, data port mask %x\n",
			       wlan_le16_to_cpu(resp->params.tx_buf.
						mp_end_port),
			       pmadapter->pcard_sd->mp_data_port_mask);
		}
#endif
		pmadapter->curr_tx_buf_size = pmadapter->tx_buf_size;
		PRINTM(MCMND, "max_tx_buf_size=%d, tx_buf_size=%d\n",
		       pmadapter->max_tx_buf_size, pmadapter->tx_buf_size);
		break;
	case HostCmd_CMD_AMSDU_AGGR_CTRL:
		ret = wlan_ret_amsdu_aggr_ctrl(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_WMM_GET_STATUS:
		ret = wlan_ret_wmm_get_status(pmpriv,
					      resp->params.get_wmm_status.
					      queue_status_tlv,
					      resp->size - S_DS_GEN);
		break;
	case HostCmd_CMD_WMM_ADDTS_REQ:
		ret = wlan_ret_wmm_addts_req(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_WMM_DELTS_REQ:
		ret = wlan_ret_wmm_delts_req(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_WMM_QUEUE_CONFIG:
		ret = wlan_ret_wmm_queue_config(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_WMM_QUEUE_STATS:
		ret = wlan_ret_wmm_queue_stats(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_WMM_TS_STATUS:
		ret = wlan_ret_wmm_ts_status(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_WMM_PARAM_CONFIG:
		ret = wlan_ret_wmm_param_config(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_802_11_IBSS_COALESCING_STATUS:
		ret = wlan_ret_ibss_coalescing_status(pmpriv, resp);
		break;
	case HostCmd_CMD_MGMT_IE_LIST:
		ret = wlan_ret_mgmt_ie_list(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_TDLS_CONFIG:
		ret = wlan_ret_tdls_config(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_TDLS_OPERATION:
		ret = wlan_ret_tdls_oper(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_11N_CFG:
		ret = wlan_ret_11n_cfg(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_11AC_CFG:
		ret = wlan_ret_11ac_cfg(pmpriv, resp, pioctl_buf);
		break;
#if 0
	case HostCmd_CMD_RECONFIGURE_TX_BUFF:
		pmadapter->tx_buf_size =
			(t_u16)wlan_le16_to_cpu(resp->params.tx_buf.buff_size);
		break;
#endif
	case HostCmd_CMD_TX_BF_CFG:
		ret = wlan_ret_tx_bf_cfg(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_ECL_SYSTEM_CLOCK_CONFIG:
		ret = wlan_ret_sysclock_cfg(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_MAC_REG_ACCESS:
	case HostCmd_CMD_BBP_REG_ACCESS:
	case HostCmd_CMD_RF_REG_ACCESS:
	case HostCmd_CMD_CAU_REG_ACCESS:
	case HostCmd_CMD_TARGET_ACCESS:
	case HostCmd_CMD_802_11_EEPROM_ACCESS:
	case HostCmd_CMD_BCA_REG_ACCESS:
		ret = wlan_ret_reg_access(pmpriv->adapter, cmdresp_no, resp,
					  pioctl_buf);
		break;
	case HostCmd_CMD_MEM_ACCESS:
		ret = wlan_ret_mem_access(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_INACTIVITY_TIMEOUT_EXT:
		ret = wlan_ret_inactivity_timeout(pmpriv, resp, pioctl_buf);
		break;
#if defined(SDIO)
	case HostCmd_CMD_SDIO_GPIO_INT_CONFIG:
		break;
#endif
	case HostCmd_CMD_SET_BSS_MODE:
		break;
	case HostCmd_CMD_MEASUREMENT_REQUEST:
	case HostCmd_CMD_MEASUREMENT_REPORT:
		ret = wlan_meas_cmdresp_process(pmpriv, resp);
		break;
#if defined(PCIE)
#if defined(PCIE8997) || defined(PCIE8897)
	case HostCmd_CMD_PCIE_HOST_BUF_DETAILS:
		PRINTM(MINFO, "PCIE host buffer configuration successful.\n");
		break;
#endif
#endif
	case HostCmd_CMD_802_11_REMAIN_ON_CHANNEL:
		ret = wlan_ret_remain_on_channel(pmpriv, resp, pioctl_buf);
		break;
#ifdef WIFI_DIRECT_SUPPORT
	case HOST_CMD_WIFI_DIRECT_MODE_CONFIG:
		ret = wlan_ret_wifi_direct_mode(pmpriv, resp, pioctl_buf);
		break;
#endif
	case HostCmd_CMD_802_11_SUBSCRIBE_EVENT:
		ret = wlan_ret_subscribe_event(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_OTP_READ_USER_DATA:
		ret = wlan_ret_otp_user_data(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_HS_WAKEUP_REASON:
		ret = wlan_ret_hs_wakeup_reason(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_REJECT_ADDBA_REQ:
		ret = wlan_ret_reject_addba_req(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_PACKET_AGGR_CTRL:
		ret = wlan_ret_packet_aggr_ctrl(pmpriv, resp, pioctl_buf);
		break;
#ifdef USB
	case HostCmd_CMD_PACKET_AGGR_OVER_HOST_INTERFACE:
		ret = wlan_ret_packet_aggr_over_host_interface(pmpriv, resp,
							       pioctl_buf);
		break;
#endif
#ifdef RX_PACKET_COALESCE
	case HostCmd_CMD_RX_PKT_COALESCE_CFG:
		ret = wlan_ret_rx_pkt_coalesce_cfg(pmpriv, resp, pioctl_buf);
		break;
#endif
	case HostCMD_CONFIG_LOW_POWER_MODE:
		break;
	case HostCmd_DFS_REPEATER_MODE:
		ret = wlan_ret_dfs_repeater_cfg(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_COALESCE_CFG:
		ret = wlan_ret_coalesce_config(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_MEF_CFG:
		break;
	case HostCmd_DS_GET_SENSOR_TEMP:
		ret = wlan_ret_get_sensor_temp(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_802_11_MIMO_SWITCH:
		break;
	case HostCmd_CMD_IPV6_RA_OFFLOAD_CFG:
		ret = wlan_ret_ipv6_ra_offload(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_STA_CONFIGURE:
		ret = wlan_ret_sta_config(pmpriv, resp, pioctl_buf);
		break;
	case HOST_CMD_PMIC_CONFIGURE:
		break;
	case HostCmd_CMD_INDEPENDENT_RESET_CFG:
		ret = wlan_ret_ind_rst_cfg(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_802_11_PS_INACTIVITY_TIMEOUT:
		break;
	case HostCmd_CMD_GET_TSF:
		ret = wlan_ret_get_tsf(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_CHAN_REGION_CFG:
		ret = wlan_ret_chan_region_cfg(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_AUTO_TX:
		ret = wlan_ret_auto_tx(pmpriv, resp, pioctl_buf);
		break;
	case HOST_CMD_TX_RX_PKT_STATS:
		ret = wlan_ret_tx_rx_pkt_stats(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_DYN_BW:
		ret = wlan_ret_dyn_bw(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_BOOT_SLEEP:
		ret = wlan_ret_boot_sleep(pmpriv, resp, pioctl_buf);
		break;
#if defined(DRV_EMBEDDED_SUPPLICANT)
	case HostCmd_CMD_CRYPTO:
		ret = wlan_ret_crypto(pmpriv, resp, pioctl_buf);
		break;
#endif
	case HostCmd_CMD_11AX_CFG:
		ret = wlan_ret_11ax_cfg(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_11AX_CMD:
		ret = wlan_ret_11ax_cmd(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_RANGE_EXT:
		ret = wlan_ret_range_ext(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_TWT_CFG:
		break;
	case HOST_CMD_GPIO_TSF_LATCH_PARAM_CONFIG:
		ret = wlan_ret_gpio_tsf_latch(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_RX_ABORT_CFG:
		ret = wlan_ret_rxabortcfg(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_RX_ABORT_CFG_EXT:
		ret = wlan_ret_rxabortcfg_ext(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_ARB_CONFIG:
		ret = wlan_ret_arb_cfg(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_TX_AMPDU_PROT_MODE:
		ret = wlan_ret_tx_ampdu_prot_mode(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_DOT11MC_UNASSOC_FTM_CFG:
		ret = wlan_ret_dot11mc_unassoc_ftm_cfg(pmpriv, resp,
						       pioctl_buf);
		break;
	case HostCmd_CMD_HAL_PHY_CFG:
		ret = wlan_ret_hal_phy_cfg(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_RATE_ADAPT_CFG:
		ret = wlan_ret_rate_adapt_cfg(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_CCK_DESENSE_CFG:
		ret = wlan_ret_cck_desense_cfg(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CHANNEL_TRPC_CONFIG:
		ret = wlan_ret_get_chan_trpc_config(pmpriv, resp, pioctl_buf);
		break;
	case HostCmd_CMD_LOW_POWER_MODE_CFG:
		ret = wlan_ret_set_get_low_power_mode_cfg(pmpriv, resp,
							  pioctl_buf);
		break;
	case HostCmd_CMD_MFG_COMMAND:
		ret = wlan_ret_mfg(pmpriv, resp, pioctl_buf);
		break;
	default:
		PRINTM(MERROR, "CMD_RESP: Unknown command response %#x\n",
		       resp->command);
		break;
	}

	LEAVE();
	return ret;
}
