/******************************************************************************
 *
 * Copyright(c) 2007 - 2017 Realtek Corporation.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of version 2 of the GNU General Public License as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
 * more details.
 *
 *****************************************************************************/
#define  _RTW_IOCTL_RTL_C_

#include <drv_types.h>

#ifdef CONFIG_MP_INCLUDED
	#include <rtw_mp_ioctl.h>
#endif

struct oid_obj_priv oid_rtl_seg_01_01[] = {
	{1, &oid_null_function},										/* 0x80 */
	{1, &oid_null_function},										/* 0x81 */
	{1, &oid_null_function},										/* 0x82 */
	{1, &oid_null_function},										/* 0x83 */ /* OID_RT_SET_SNIFFER_MODE */
	{1, &oid_rt_get_signal_quality_hdl},							/* 0x84 */
	{1, &oid_rt_get_small_packet_crc_hdl},						/* 0x85 */
	{1, &oid_rt_get_middle_packet_crc_hdl},						/* 0x86 */
	{1, &oid_rt_get_large_packet_crc_hdl},						/* 0x87 */
	{1, &oid_rt_get_tx_retry_hdl},								/* 0x88 */
	{1, &oid_rt_get_rx_retry_hdl},								/* 0x89 */
	{1, &oid_rt_pro_set_fw_dig_state_hdl},						/* 0x8A */
	{1, &oid_rt_pro_set_fw_ra_state_hdl}	,						/* 0x8B */
	{1, &oid_null_function},										/* 0x8C */
	{1, &oid_null_function},										/* 0x8D */
	{1, &oid_null_function},										/* 0x8E */
	{1, &oid_null_function},										/* 0x8F */
	{1, &oid_rt_get_rx_total_packet_hdl},							/* 0x90 */
	{1, &oid_rt_get_tx_beacon_ok_hdl},							/* 0x91 */
	{1, &oid_rt_get_tx_beacon_err_hdl},							/* 0x92 */
	{1, &oid_rt_get_rx_icv_err_hdl},								/* 0x93 */
	{1, &oid_rt_set_encryption_algorithm_hdl},					/* 0x94 */
	{1, &oid_null_function},										/* 0x95 */
	{1, &oid_rt_get_preamble_mode_hdl},							/* 0x96 */
	{1, &oid_null_function},										/* 0x97 */
	{1, &oid_rt_get_ap_ip_hdl},									/* 0x98 */
	{1, &oid_rt_get_channelplan_hdl},							/* 0x99	 */
	{1, &oid_rt_set_preamble_mode_hdl},	 						/* 0x9A */
	{1, &oid_rt_set_bcn_intvl_hdl},								/* 0x9B */
	{1, &oid_null_function},										/* 0x9C */
	{1, &oid_rt_dedicate_probe_hdl},								/* 0x9D */
	{1, &oid_null_function},										/* 0x9E */
	{1, &oid_null_function},										/* 0x9F */
	{1, &oid_null_function},										/* 0xA0 */
	{1, &oid_null_function},										/* 0xA1 */
	{1, &oid_null_function},										/* 0xA2 */
	{1, &oid_null_function},										/* 0xA3 */
	{1, &oid_null_function},										/* 0xA4 */
	{1, &oid_null_function},										/* 0xA5 */
	{1, &oid_null_function},										/* 0xA6 */
	{1, &oid_rt_get_total_tx_bytes_hdl},							/* 0xA7 */
	{1, &oid_rt_get_total_rx_bytes_hdl},							/* 0xA8 */
	{1, &oid_rt_current_tx_power_level_hdl},						/* 0xA9	 */
	{1, &oid_rt_get_enc_key_mismatch_count_hdl},	 			/* 0xAA */
	{1, &oid_rt_get_enc_key_match_count_hdl},					/* 0xAB */
	{1, &oid_rt_get_channel_hdl},								/* 0xAC */
	{1, &oid_rt_set_channelplan_hdl},								/* 0xAD */
	{1, &oid_rt_get_hardware_radio_off_hdl},						/* 0xAE */
	{1, &oid_null_function},										/* 0xAF */
	{1, &oid_null_function},										/* 0xB0 */
	{1, &oid_null_function},										/* 0xB1 */
	{1, &oid_null_function},										/* 0xB2 */
	{1, &oid_null_function},										/* 0xB3 */
	{1, &oid_rt_get_key_mismatch_hdl},							/* 0xB4 */
	{1, &oid_null_function},										/* 0xB5 */
	{1, &oid_null_function},										/* 0xB6 */
	{1, &oid_null_function},										/* 0xB7 */
	{1, &oid_null_function},										/* 0xB8 */
	{1, &oid_null_function},										/* 0xB9	 */
	{1, &oid_null_function},	 									/* 0xBA */
	{1, &oid_rt_supported_wireless_mode_hdl},					/* 0xBB */
	{1, &oid_rt_get_channel_list_hdl},							/* 0xBC */
	{1, &oid_rt_get_scan_in_progress_hdl},						/* 0xBD */
	{1, &oid_null_function},										/* 0xBE */
	{1, &oid_null_function},										/* 0xBF */
	{1, &oid_null_function},										/* 0xC0 */
	{1, &oid_rt_forced_data_rate_hdl},							/* 0xC1 */
	{1, &oid_rt_wireless_mode_for_scan_list_hdl},					/* 0xC2 */
	{1, &oid_rt_get_bss_wireless_mode_hdl},						/* 0xC3 */
	{1, &oid_rt_scan_with_magic_packet_hdl},					/* 0xC4 */
	{1, &oid_null_function},										/* 0xC5 */
	{1, &oid_null_function},										/* 0xC6 */
	{1, &oid_null_function},										/* 0xC7 */
	{1, &oid_null_function},										/* 0xC8 */
	{1, &oid_null_function},										/* 0xC9	 */
	{1, &oid_null_function},	 									/* 0xCA */
	{1, &oid_null_function},										/* 0xCB */
	{1, &oid_null_function},										/* 0xCC */
	{1, &oid_null_function},										/* 0xCD */
	{1, &oid_null_function},										/* 0xCE */
	{1, &oid_null_function},										/* 0xCF */

};

struct oid_obj_priv oid_rtl_seg_01_03[] = {
	{1, &oid_rt_ap_get_associated_station_list_hdl},				/* 0x00 */
	{1, &oid_null_function},										/* 0x01 */
	{1, &oid_rt_ap_switch_into_ap_mode_hdl},					/* 0x02 */
	{1, &oid_null_function},										/* 0x03 */
	{1, &oid_rt_ap_supported_hdl},								/* 0x04 */
	{1, &oid_rt_ap_set_passphrase_hdl},							/* 0x05 */

};

struct oid_obj_priv oid_rtl_seg_01_11[] = {
	{1, &oid_null_function},					/* 0xC0	OID_RT_PRO_RX_FILTER	 */
	{1, &oid_null_function},					/* 0xC1	OID_CE_USB_WRITE_REGISTRY */
	{1, &oid_null_function},					/* 0xC2	OID_CE_USB_READ_REGISTRY */
	{1, &oid_null_function},					/* 0xC3	OID_RT_PRO_SET_INITIAL_GAIN */
	{1, &oid_null_function},					/* 0xC4	OID_RT_PRO_SET_BB_RF_STANDBY_MODE */
	{1, &oid_null_function},					/* 0xC5	OID_RT_PRO_SET_BB_RF_SHUTDOWN_MODE */
	{1, &oid_null_function},					/* 0xC6	OID_RT_PRO_SET_TX_CHARGE_PUMP */
	{1, &oid_null_function},					/* 0xC7	OID_RT_PRO_SET_RX_CHARGE_PUMP */
	{1, &oid_rt_pro_rf_write_registry_hdl},	/* 0xC8	 */
	{1, &oid_rt_pro_rf_read_registry_hdl},	/* 0xC9	 */
	{1, &oid_null_function}					/* 0xCA	OID_RT_PRO_QUERY_RF_TYPE */

};

struct oid_obj_priv oid_rtl_seg_03_00[] = {
	{1, &oid_null_function},										/* 0x00 */
	{1, &oid_rt_get_connect_state_hdl},							/* 0x01 */
	{1, &oid_null_function},										/* 0x02 */
	{1, &oid_null_function},										/* 0x03 */
	{1, &oid_rt_set_default_key_id_hdl},							/* 0x04 */


};


/* **************  oid_rtl_seg_01_01 section start ************** */

NDIS_STATUS oid_rt_pro_set_fw_dig_state_hdl(struct oid_par_priv *poid_par_priv)
{
	NDIS_STATUS		status = NDIS_STATUS_SUCCESS;
#if 0
	PADAPTER		Adapter = (PADAPTER)(poid_par_priv->adapter_context);
	_irqL			oldirql;


	if (poid_par_priv->type_of_oid != SET_OID) {
		status = NDIS_STATUS_NOT_ACCEPTED;
		return status;
	}

	_irqlevel_changed_(&oldirql, LOWER);
	if (poid_par_priv->information_buf_len >= sizeof(struct setdig_parm)) {
		/* DEBUG_ERR(("===> oid_rt_pro_set_fw_dig_state_hdl. type:0x%02x.\n",*((unsigned char*)poid_par_priv->information_buf )));	 */
		if (!rtw_setfwdig_cmd(Adapter, *((unsigned char *)poid_par_priv->information_buf)))
			status = NDIS_STATUS_NOT_ACCEPTED;

	} else
		status = NDIS_STATUS_NOT_ACCEPTED;
	_irqlevel_changed_(&oldirql, RAISE);
#endif
	return status;
}
/* ----------------------------------------------------------------------------- */
NDIS_STATUS oid_rt_pro_set_fw_ra_state_hdl(struct oid_par_priv *poid_par_priv)
{

	NDIS_STATUS		status = NDIS_STATUS_SUCCESS;
#if 0
	PADAPTER		Adapter = (PADAPTER)(poid_par_priv->adapter_context);
	_irqL			oldirql;

	if (poid_par_priv->type_of_oid != SET_OID) {
		status = NDIS_STATUS_NOT_ACCEPTED;
		return status;
	}


	_irqlevel_changed_(&oldirql, LOWER);

	if (poid_par_priv->information_buf_len >= sizeof(struct setra_parm)) {
		/* DEBUG_ERR(("===> oid_rt_pro_set_fw_ra_state_hdl. type:0x%02x.\n",*((unsigned char*)poid_par_priv->information_buf )));	 */
		if (!rtw_setfwra_cmd(Adapter, *((unsigned char *)poid_par_priv->information_buf)))
			status = NDIS_STATUS_NOT_ACCEPTED;

	} else
		status = NDIS_STATUS_NOT_ACCEPTED;
	_irqlevel_changed_(&oldirql, RAISE);
#endif
	return status;
}
/* ----------------------------------------------------------------------------- */
NDIS_STATUS oid_rt_get_signal_quality_hdl(struct oid_par_priv *poid_par_priv)
{
	NDIS_STATUS		status = NDIS_STATUS_SUCCESS;
	PADAPTER		padapter = (PADAPTER)(poid_par_priv->adapter_context);

	/* DEBUG_ERR(("<**********************oid_rt_get_signal_quality_hdl\n")); */
	if (poid_par_priv->type_of_oid != QUERY_OID) {
		status = NDIS_STATUS_NOT_ACCEPTED;
		return status;
	}

#if 0
	if (pMgntInfo->mAssoc || pMgntInfo->mIbss) {
		ulInfo = pAdapter->RxStats.SignalQuality;
		*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
	} else {
		ulInfo = 0xffffffff; /* It stands for -1 in 4-byte integer. */
	}
	break;
#endif

	return status;
}

/* ------------------------------------------------------------------------------ */

NDIS_STATUS oid_rt_get_small_packet_crc_hdl(struct oid_par_priv *poid_par_priv)
{
	NDIS_STATUS		status = NDIS_STATUS_SUCCESS;
	PADAPTER		padapter = (PADAPTER)(poid_par_priv->adapter_context);

	if (poid_par_priv->type_of_oid != QUERY_OID) {
		status = NDIS_STATUS_NOT_ACCEPTED;
		return status;
	}

	if (poid_par_priv->information_buf_len >=  sizeof(ULONG)) {
		*(ULONG *)poid_par_priv->information_buf = padapter->recvpriv.rx_smallpacket_crcerr;
		*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
	} else
		status = NDIS_STATUS_INVALID_LENGTH;

	return status;
}
/* ------------------------------------------------------------------------------ */
NDIS_STATUS oid_rt_get_middle_packet_crc_hdl(struct oid_par_priv *poid_par_priv)
{
	NDIS_STATUS		status = NDIS_STATUS_SUCCESS;
	PADAPTER		padapter = (PADAPTER)(poid_par_priv->adapter_context);

	if (poid_par_priv->type_of_oid != QUERY_OID) {
		status = NDIS_STATUS_NOT_ACCEPTED;
		return status;
	}

	if (poid_par_priv->information_buf_len >=  sizeof(ULONG)) {
		*(ULONG *)poid_par_priv->information_buf = padapter->recvpriv.rx_middlepacket_crcerr;
		*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
	} else
		status = NDIS_STATUS_INVALID_LENGTH;


	return status;
}
/* ------------------------------------------------------------------------------ */
NDIS_STATUS oid_rt_get_large_packet_crc_hdl(struct oid_par_priv *poid_par_priv)
{
	NDIS_STATUS		status = NDIS_STATUS_SUCCESS;
	PADAPTER		padapter = (PADAPTER)(poid_par_priv->adapter_context);

	if (poid_par_priv->type_of_oid != QUERY_OID) {
		status = NDIS_STATUS_NOT_ACCEPTED;
		return status;
	}

	if (poid_par_priv->information_buf_len >=  sizeof(ULONG)) {
		*(ULONG *)poid_par_priv->information_buf = padapter->recvpriv.rx_largepacket_crcerr;
		*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
	} else
		status = NDIS_STATUS_INVALID_LENGTH;


	return status;
}

/* ------------------------------------------------------------------------------ */
NDIS_STATUS oid_rt_get_tx_retry_hdl(struct oid_par_priv *poid_par_priv)
{
	NDIS_STATUS		status = NDIS_STATUS_SUCCESS;
	PADAPTER		padapter = (PADAPTER)(poid_par_priv->adapter_context);

	if (poid_par_priv->type_of_oid != QUERY_OID) {
		status = NDIS_STATUS_NOT_ACCEPTED;
		return status;
	}

	return status;
}
NDIS_STATUS oid_rt_get_rx_retry_hdl(struct oid_par_priv *poid_par_priv)
{
	NDIS_STATUS		status = NDIS_STATUS_SUCCESS;
	PADAPTER		padapter = (PADAPTER)(poid_par_priv->adapter_context);

	if (poid_par_priv->type_of_oid != QUERY_OID) {
		status = NDIS_STATUS_NOT_ACCEPTED;
		return status;
	}
	*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
	return status;
}
/* ------------------------------------------------------------------------------ */
NDIS_STATUS oid_rt_get_rx_total_packet_hdl(struct oid_par_priv *poid_par_priv)
{
	NDIS_STATUS		status = NDIS_STATUS_SUCCESS;
	PADAPTER		padapter = (PADAPTER)(poid_par_priv->adapter_context);

	if (poid_par_priv->type_of_oid != QUERY_OID) {
		status = NDIS_STATUS_NOT_ACCEPTED;
		return status;
	}
	if (poid_par_priv->information_buf_len >=  sizeof(ULONG)) {
		*(u64 *)poid_par_priv->information_buf = padapter->recvpriv.rx_pkts + padapter->recvpriv.rx_drop;
		*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
	} else
		status = NDIS_STATUS_INVALID_LENGTH;


	return status;
}
/* ------------------------------------------------------------------------------ */
NDIS_STATUS oid_rt_get_tx_beacon_ok_hdl(struct oid_par_priv *poid_par_priv)
{
	NDIS_STATUS		status = NDIS_STATUS_SUCCESS;
	PADAPTER		padapter = (PADAPTER)(poid_par_priv->adapter_context);

	if (poid_par_priv->type_of_oid != QUERY_OID) {
		status = NDIS_STATUS_NOT_ACCEPTED;
		return status;
	}

	return status;
}
NDIS_STATUS oid_rt_get_tx_beacon_err_hdl(struct oid_par_priv *poid_par_priv)
{
	NDIS_STATUS		status = NDIS_STATUS_SUCCESS;
	PADAPTER		padapter = (PADAPTER)(poid_par_priv->adapter_context);

	if (poid_par_priv->type_of_oid != QUERY_OID) {
		status = NDIS_STATUS_NOT_ACCEPTED;
		return status;
	}

	return status;
}
/* ------------------------------------------------------------------------------ */
NDIS_STATUS oid_rt_get_rx_icv_err_hdl(struct oid_par_priv *poid_par_priv)
{
	NDIS_STATUS		status = NDIS_STATUS_SUCCESS;
	PADAPTER		padapter = (PADAPTER)(poid_par_priv->adapter_context);

	if (poid_par_priv->type_of_oid != QUERY_OID) {
		status = NDIS_STATUS_NOT_ACCEPTED;
		return status;
	}
	if (poid_par_priv->information_buf_len >= sizeof(u32)) {
		/* _rtw_memcpy(*(uint *)poid_par_priv->information_buf,padapter->recvpriv.rx_icv_err,sizeof(u32)); */
		*(uint *)poid_par_priv->information_buf = padapter->recvpriv.rx_icv_err;
		*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
	} else
		status = NDIS_STATUS_INVALID_LENGTH ;


	return status;
}
/* ------------------------------------------------------------------------------ */
NDIS_STATUS oid_rt_set_encryption_algorithm_hdl(struct oid_par_priv *poid_par_priv)
{
	NDIS_STATUS		status = NDIS_STATUS_SUCCESS;
	PADAPTER		padapter = (PADAPTER)(poid_par_priv->adapter_context);

	if (poid_par_priv->type_of_oid != SET_OID) {
		status = NDIS_STATUS_NOT_ACCEPTED;
		return status;
	}

	return status;
}
/* ------------------------------------------------------------------------------ */
NDIS_STATUS oid_rt_get_preamble_mode_hdl(struct oid_par_priv *poid_par_priv)
{
	NDIS_STATUS		status = NDIS_STATUS_SUCCESS;
	PADAPTER		padapter = (PADAPTER)(poid_par_priv->adapter_context);
	ULONG			preamblemode = 0 ;

	if (poid_par_priv->type_of_oid != QUERY_OID) {
		status = NDIS_STATUS_NOT_ACCEPTED;
		return status;
	}
	if (poid_par_priv->information_buf_len >= sizeof(ULONG)) {
		if (padapter->registrypriv.preamble == PREAMBLE_LONG)
			preamblemode = 0;
		else if (padapter->registrypriv.preamble == PREAMBLE_AUTO)
			preamblemode = 1;
		else if (padapter->registrypriv.preamble == PREAMBLE_SHORT)
			preamblemode = 2;


		*(ULONG *)poid_par_priv->information_buf = preamblemode ;
		*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
	} else
		status = NDIS_STATUS_INVALID_LENGTH ;
	return status;
}
/* ------------------------------------------------------------------------------ */
NDIS_STATUS oid_rt_get_ap_ip_hdl(struct oid_par_priv *poid_par_priv)
{
	NDIS_STATUS		status = NDIS_STATUS_SUCCESS;
	PADAPTER		padapter = (PADAPTER)(poid_par_priv->adapter_context);

	if (poid_par_priv->type_of_oid != QUERY_OID) {
		status = NDIS_STATUS_NOT_ACCEPTED;
		return status;
	}

	return status;
}

NDIS_STATUS oid_rt_get_channelplan_hdl(struct oid_par_priv *poid_par_priv)
{
	NDIS_STATUS		status = NDIS_STATUS_SUCCESS;
	PADAPTER		padapter = (PADAPTER)(poid_par_priv->adapter_context);
	struct rf_ctl_t *rfctl = adapter_to_rfctl(padapter);

	if (poid_par_priv->type_of_oid != QUERY_OID) {
		status = NDIS_STATUS_NOT_ACCEPTED;
		return status;
	}
	*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
	*(u16 *)poid_par_priv->information_buf = rfctl->ChannelPlan;

	return status;
}
NDIS_STATUS oid_rt_set_channelplan_hdl(struct oid_par_priv *poid_par_priv)
{
	NDIS_STATUS		status = NDIS_STATUS_SUCCESS;
	PADAPTER		padapter = (PADAPTER)(poid_par_priv->adapter_context);
	struct rf_ctl_t *rfctl = adapter_to_rfctl(padapter);

	if (poid_par_priv->type_of_oid != SET_OID) {
		status = NDIS_STATUS_NOT_ACCEPTED;
		return status;
	}

	rfctl->ChannelPlan  = *(u16 *)poid_par_priv->information_buf;

	return status;
}
/* ------------------------------------------------------------------------------ */
NDIS_STATUS oid_rt_set_preamble_mode_hdl(struct oid_par_priv *poid_par_priv)
{
	NDIS_STATUS		status = NDIS_STATUS_SUCCESS;
	PADAPTER		padapter = (PADAPTER)(poid_par_priv->adapter_context);
	ULONG			preamblemode = 0;
	if (poid_par_priv->type_of_oid != SET_OID) {
		status = NDIS_STATUS_NOT_ACCEPTED;
		return status;
	}

	if (poid_par_priv->information_buf_len >= sizeof(ULONG)) {
		preamblemode = *(ULONG *)poid_par_priv->information_buf ;
		if (preamblemode == 0)
			padapter->registrypriv.preamble = PREAMBLE_LONG;
		else if (preamblemode == 1)
			padapter->registrypriv.preamble = PREAMBLE_AUTO;
		else if (preamblemode == 2)
			padapter->registrypriv.preamble = PREAMBLE_SHORT;

		*(ULONG *)poid_par_priv->information_buf = preamblemode ;
		*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
	} else
		status = NDIS_STATUS_INVALID_LENGTH ;

	return status;
}
/* ------------------------------------------------------------------------------ */
NDIS_STATUS oid_rt_set_bcn_intvl_hdl(struct oid_par_priv *poid_par_priv)
{
	NDIS_STATUS		status = NDIS_STATUS_SUCCESS;
	PADAPTER		padapter = (PADAPTER)(poid_par_priv->adapter_context);

	if (poid_par_priv->type_of_oid != SET_OID) {
		status = NDIS_STATUS_NOT_ACCEPTED;
		return status;
	}

	return status;
}
NDIS_STATUS oid_rt_dedicate_probe_hdl(struct oid_par_priv *poid_par_priv)
{
	NDIS_STATUS		status = NDIS_STATUS_SUCCESS;
	PADAPTER		padapter = (PADAPTER)(poid_par_priv->adapter_context);

	return status;
}
/* ------------------------------------------------------------------------------ */
NDIS_STATUS oid_rt_get_total_tx_bytes_hdl(struct oid_par_priv *poid_par_priv)
{
	NDIS_STATUS		status = NDIS_STATUS_SUCCESS;
	PADAPTER		padapter = (PADAPTER)(poid_par_priv->adapter_context);

	if (poid_par_priv->type_of_oid != QUERY_OID) {
		status = NDIS_STATUS_NOT_ACCEPTED;
		return status;
	}
	if (poid_par_priv->information_buf_len >= sizeof(ULONG)) {
		*(u64 *)poid_par_priv->information_buf = padapter->xmitpriv.tx_bytes;
		*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
	} else
		status = NDIS_STATUS_INVALID_LENGTH ;


	return status;
}
/* ------------------------------------------------------------------------------ */
NDIS_STATUS oid_rt_get_total_rx_bytes_hdl(struct oid_par_priv *poid_par_priv)
{
	NDIS_STATUS		status = NDIS_STATUS_SUCCESS;
	PADAPTER		padapter = (PADAPTER)(poid_par_priv->adapter_context);

	if (poid_par_priv->type_of_oid != QUERY_OID) {
		status = NDIS_STATUS_NOT_ACCEPTED;
		return status;
	}
	if (poid_par_priv->information_buf_len >= sizeof(ULONG)) {
		/* _rtw_memcpy(*(uint *)poid_par_priv->information_buf,padapter->recvpriv.rx_icv_err,sizeof(u32)); */
		*(u64 *)poid_par_priv->information_buf = padapter->recvpriv.rx_bytes;
		*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
	} else
		status = NDIS_STATUS_INVALID_LENGTH ;
	return status;
}
/* ------------------------------------------------------------------------------ */
NDIS_STATUS oid_rt_current_tx_power_level_hdl(struct oid_par_priv *poid_par_priv)
{
	NDIS_STATUS		status = NDIS_STATUS_SUCCESS;
	PADAPTER		padapter = (PADAPTER)(poid_par_priv->adapter_context);

	return status;
}
NDIS_STATUS oid_rt_get_enc_key_mismatch_count_hdl(struct oid_par_priv *poid_par_priv)
{
	NDIS_STATUS		status = NDIS_STATUS_SUCCESS;
	PADAPTER		padapter = (PADAPTER)(poid_par_priv->adapter_context);

	if (poid_par_priv->type_of_oid != QUERY_OID) {
		status = NDIS_STATUS_NOT_ACCEPTED;
		return status;
	}

	return status;
}
NDIS_STATUS oid_rt_get_enc_key_match_count_hdl(struct oid_par_priv *poid_par_priv)
{
	NDIS_STATUS		status = NDIS_STATUS_SUCCESS;
	PADAPTER		padapter = (PADAPTER)(poid_par_priv->adapter_context);

	if (poid_par_priv->type_of_oid != QUERY_OID) {
		status = NDIS_STATUS_NOT_ACCEPTED;
		return status;
	}

	return status;
}
NDIS_STATUS oid_rt_get_channel_hdl(struct oid_par_priv *poid_par_priv)
{
	NDIS_STATUS		status = NDIS_STATUS_SUCCESS;
	PADAPTER		padapter = (PADAPTER)(poid_par_priv->adapter_context);
	struct	mlme_priv	*pmlmepriv = &padapter->mlmepriv;
	NDIS_802_11_CONFIGURATION		*pnic_Config;

	ULONG   channelnum;

	if (poid_par_priv->type_of_oid != QUERY_OID) {
		status = NDIS_STATUS_NOT_ACCEPTED;
		return status;
	}

	if ((check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) ||
	    (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE))
		pnic_Config = &pmlmepriv->cur_network.network.Configuration;
	else
		pnic_Config = &padapter->registrypriv.dev_network.Configuration;

	channelnum = pnic_Config->DSConfig;
	*(ULONG *)poid_par_priv->information_buf = channelnum;

	*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;




	return status;
}
NDIS_STATUS oid_rt_get_hardware_radio_off_hdl(struct oid_par_priv *poid_par_priv)
{
	NDIS_STATUS		status = NDIS_STATUS_SUCCESS;
	PADAPTER		padapter = (PADAPTER)(poid_par_priv->adapter_context);

	if (poid_par_priv->type_of_oid != QUERY_OID) {
		status = NDIS_STATUS_NOT_ACCEPTED;
		return status;
	}

	return status;
}
NDIS_STATUS oid_rt_get_key_mismatch_hdl(struct oid_par_priv *poid_par_priv)
{
	NDIS_STATUS		status = NDIS_STATUS_SUCCESS;
	PADAPTER		padapter = (PADAPTER)(poid_par_priv->adapter_context);

	if (poid_par_priv->type_of_oid != QUERY_OID) {
		status = NDIS_STATUS_NOT_ACCEPTED;
		return status;
	}

	return status;
}
NDIS_STATUS oid_rt_supported_wireless_mode_hdl(struct oid_par_priv *poid_par_priv)
{
	NDIS_STATUS		status = NDIS_STATUS_SUCCESS;
	PADAPTER		padapter = (PADAPTER)(poid_par_priv->adapter_context);
	ULONG			ulInfo = 0 ;
	/* DEBUG_ERR(("<**********************oid_rt_supported_wireless_mode_hdl\n"));	 */
	if (poid_par_priv->type_of_oid != QUERY_OID) {
		status = NDIS_STATUS_NOT_ACCEPTED;
		return status;
	}
	if (poid_par_priv->information_buf_len >= sizeof(ULONG)) {
		ulInfo |= 0x0100; /* WIRELESS_MODE_B */
		ulInfo |= 0x0200; /* WIRELESS_MODE_G */
		ulInfo |= 0x0400; /* WIRELESS_MODE_A */

		*(ULONG *) poid_par_priv->information_buf = ulInfo;
		/* DEBUG_ERR(("<===oid_rt_supported_wireless_mode %x\n",ulInfo));	 */
		*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
	} else
		status = NDIS_STATUS_INVALID_LENGTH;

	return status;
}
NDIS_STATUS oid_rt_get_channel_list_hdl(struct oid_par_priv *poid_par_priv)
{
	NDIS_STATUS		status = NDIS_STATUS_SUCCESS;
	PADAPTER		padapter = (PADAPTER)(poid_par_priv->adapter_context);

	if (poid_par_priv->type_of_oid != QUERY_OID) {
		status = NDIS_STATUS_NOT_ACCEPTED;
		return status;
	}

	return status;
}
NDIS_STATUS oid_rt_get_scan_in_progress_hdl(struct oid_par_priv *poid_par_priv)
{
	NDIS_STATUS		status = NDIS_STATUS_SUCCESS;
	PADAPTER		padapter = (PADAPTER)(poid_par_priv->adapter_context);

	if (poid_par_priv->type_of_oid != QUERY_OID) {
		status = NDIS_STATUS_NOT_ACCEPTED;
		return status;
	}

	return status;
}


NDIS_STATUS oid_rt_forced_data_rate_hdl(struct oid_par_priv *poid_par_priv)
{
	NDIS_STATUS		status = NDIS_STATUS_SUCCESS;
	PADAPTER		padapter = (PADAPTER)(poid_par_priv->adapter_context);

	return status;
}
NDIS_STATUS oid_rt_wireless_mode_for_scan_list_hdl(struct oid_par_priv *poid_par_priv)
{
	NDIS_STATUS		status = NDIS_STATUS_SUCCESS;
	PADAPTER		padapter = (PADAPTER)(poid_par_priv->adapter_context);

	return status;
}
NDIS_STATUS oid_rt_get_bss_wireless_mode_hdl(struct oid_par_priv *poid_par_priv)
{
	NDIS_STATUS		status = NDIS_STATUS_SUCCESS;
	PADAPTER		padapter = (PADAPTER)(poid_par_priv->adapter_context);

	if (poid_par_priv->type_of_oid != QUERY_OID) {
		status = NDIS_STATUS_NOT_ACCEPTED;
		return status;
	}

	return status;
}

NDIS_STATUS oid_rt_scan_with_magic_packet_hdl(struct oid_par_priv *poid_par_priv)
{
	NDIS_STATUS		status = NDIS_STATUS_SUCCESS;
	PADAPTER		padapter = (PADAPTER)(poid_par_priv->adapter_context);

	return status;
}
/* **************  oid_rtl_seg_01_01 section end ************** */

/* **************  oid_rtl_seg_01_03 section start ************** */
NDIS_STATUS oid_rt_ap_get_associated_station_list_hdl(struct oid_par_priv *poid_par_priv)
{
	NDIS_STATUS		status = NDIS_STATUS_SUCCESS;
	PADAPTER		padapter = (PADAPTER)(poid_par_priv->adapter_context);

	if (poid_par_priv->type_of_oid != QUERY_OID) {
		status = NDIS_STATUS_NOT_ACCEPTED;
		return status;
	}

	return status;
}
NDIS_STATUS oid_rt_ap_switch_into_ap_mode_hdl(struct oid_par_priv *poid_par_priv)
{
	NDIS_STATUS		status = NDIS_STATUS_SUCCESS;
	PADAPTER		padapter = (PADAPTER)(poid_par_priv->adapter_context);

	return status;
}
NDIS_STATUS oid_rt_ap_supported_hdl(struct oid_par_priv *poid_par_priv)
{
	NDIS_STATUS		status = NDIS_STATUS_SUCCESS;
	PADAPTER		padapter = (PADAPTER)(poid_par_priv->adapter_context);

	return status;
}
NDIS_STATUS oid_rt_ap_set_passphrase_hdl(struct oid_par_priv *poid_par_priv)
{
	NDIS_STATUS		status = NDIS_STATUS_SUCCESS;
	PADAPTER		padapter = (PADAPTER)(poid_par_priv->adapter_context);

	if (poid_par_priv->type_of_oid != SET_OID) {
		status = NDIS_STATUS_NOT_ACCEPTED;
		return status;
	}

	return status;
}

/* **************  oid_rtl_seg_01_03 section end ************** */

/* ****************  oid_rtl_seg_01_11   section start **************** */
NDIS_STATUS oid_rt_pro_rf_write_registry_hdl(struct oid_par_priv *poid_par_priv)
{
	NDIS_STATUS		status = NDIS_STATUS_SUCCESS;
	PADAPTER		Adapter = (PADAPTER)(poid_par_priv->adapter_context);
	_irqL			oldirql;
	/* DEBUG_ERR(("<**********************oid_rt_pro_rf_write_registry_hdl\n")); */
	if (poid_par_priv->type_of_oid != SET_OID) { /* QUERY_OID */
		status = NDIS_STATUS_NOT_ACCEPTED;
		return status;
	}

	_irqlevel_changed_(&oldirql, LOWER);
	if (poid_par_priv->information_buf_len == (sizeof(unsigned long) * 3)) {
		/* RegOffsetValue	- The offset of RF register to write. */
		/* RegDataWidth	- The data width of RF register to write. */
		/* RegDataValue	- The value to write. */
		/* RegOffsetValue = *((unsigned long*)InformationBuffer); */
		/* RegDataWidth = *((unsigned long*)InformationBuffer+1);	   */
		/* RegDataValue =  *((unsigned long*)InformationBuffer+2);	 */
		if (!rtw_setrfreg_cmd(Adapter,
			      *(unsigned char *)poid_par_priv->information_buf,
			(unsigned long)(*((unsigned long *)poid_par_priv->information_buf + 2))))
			status = NDIS_STATUS_NOT_ACCEPTED;

	} else
		status = NDIS_STATUS_INVALID_LENGTH;
	_irqlevel_changed_(&oldirql, RAISE);

	return status;
}

/* ------------------------------------------------------------------------------ */
NDIS_STATUS oid_rt_pro_rf_read_registry_hdl(struct oid_par_priv *poid_par_priv)
{
	NDIS_STATUS		status = NDIS_STATUS_SUCCESS;
#if 0
	PADAPTER		Adapter = (PADAPTER)(poid_par_priv->adapter_context);
	_irqL	oldirql;

	/* DEBUG_ERR(("<**********************oid_rt_pro_rf_read_registry_hdl\n")); */
	if (poid_par_priv->type_of_oid != SET_OID) { /* QUERY_OID */
		status = NDIS_STATUS_NOT_ACCEPTED;
		return status;
	}

	_irqlevel_changed_(&oldirql, LOWER);
	if (poid_par_priv->information_buf_len == (sizeof(unsigned long) * 3)) {
		if (Adapter->mppriv.act_in_progress == _TRUE)
			status = NDIS_STATUS_NOT_ACCEPTED;
		else {
			/* init workparam */
			Adapter->mppriv.act_in_progress = _TRUE;
			Adapter->mppriv.workparam.bcompleted = _FALSE;
			Adapter->mppriv.workparam.act_type = MPT_READ_RF;
			Adapter->mppriv.workparam.io_offset = *(unsigned long *)poid_par_priv->information_buf;
			Adapter->mppriv.workparam.io_value = 0xcccccccc;

			/* RegOffsetValue	- The offset of RF register to read. */
			/* RegDataWidth	- The data width of RF register to read. */
			/* RegDataValue	- The value to read. */
			/* RegOffsetValue = *((unsigned long*)InformationBuffer); */
			/* RegDataWidth = *((unsigned long*)InformationBuffer+1);	   */
			/* RegDataValue =  *((unsigned long*)InformationBuffer+2);	   	 	                   */
			if (!rtw_getrfreg_cmd(Adapter,
				*(unsigned char *)poid_par_priv->information_buf,
				(unsigned char *)&Adapter->mppriv.workparam.io_value))
				status = NDIS_STATUS_NOT_ACCEPTED;
		}


	} else
		status = NDIS_STATUS_INVALID_LENGTH;
	_irqlevel_changed_(&oldirql, RAISE);
#endif
	return status;
}

/* ****************  oid_rtl_seg_01_11   section end****************	 */


/* **************  oid_rtl_seg_03_00 section start **************  */
enum _CONNECT_STATE_ {
	CHECKINGSTATUS,
	ASSOCIATED,
	ADHOCMODE,
	NOTASSOCIATED
};

NDIS_STATUS oid_rt_get_connect_state_hdl(struct oid_par_priv *poid_par_priv)
{
	NDIS_STATUS		status = NDIS_STATUS_SUCCESS;
	PADAPTER		padapter = (PADAPTER)(poid_par_priv->adapter_context);

	struct mlme_priv	*pmlmepriv = &(padapter->mlmepriv);

	ULONG ulInfo;

	if (poid_par_priv->type_of_oid != QUERY_OID) {
		status = NDIS_STATUS_NOT_ACCEPTED;
		return status;
	}

	/* nStatus==0	CheckingStatus */
	/* nStatus==1	Associated */
	/* nStatus==2	AdHocMode */
	/* nStatus==3	NotAssociated */

	if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE)
		ulInfo = CHECKINGSTATUS;
	else if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)
		ulInfo = ASSOCIATED;
	else if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE)
		ulInfo = ADHOCMODE;
	else
		ulInfo = NOTASSOCIATED ;

	*(ULONG *)poid_par_priv->information_buf = ulInfo;
	*poid_par_priv->bytes_rw =  poid_par_priv->information_buf_len;

#if 0
	/* Rearrange the order to let the UI still shows connection when scan is in progress */
	if (pMgntInfo->mAssoc)
		ulInfo = 1;
	else if (pMgntInfo->mIbss)
		ulInfo = 2;
	else if (pMgntInfo->bScanInProgress)
		ulInfo = 0;
	else
		ulInfo = 3;
	ulInfoLen = sizeof(ULONG);
#endif

	return status;
}

NDIS_STATUS oid_rt_set_default_key_id_hdl(struct oid_par_priv *poid_par_priv)
{
	NDIS_STATUS		status = NDIS_STATUS_SUCCESS;
	PADAPTER		padapter = (PADAPTER)(poid_par_priv->adapter_context);

	if (poid_par_priv->type_of_oid != SET_OID) {
		status = NDIS_STATUS_NOT_ACCEPTED;
		return status;
	}

	return status;
}
/* **************  oid_rtl_seg_03_00 section end **************  */
