12865d42cSLarry Finger /******************************************************************************
22865d42cSLarry Finger  * rtl871x_ioctl_rtl.c
32865d42cSLarry Finger  *
42865d42cSLarry Finger  * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved.
52865d42cSLarry Finger  * Linux device driver for RTL8192SU
62865d42cSLarry Finger  *
72865d42cSLarry Finger  * This program is free software; you can redistribute it and/or modify it
82865d42cSLarry Finger  * under the terms of version 2 of the GNU General Public License as
92865d42cSLarry Finger  * published by the Free Software Foundation.
102865d42cSLarry Finger  *
112865d42cSLarry Finger  * This program is distributed in the hope that it will be useful, but WITHOUT
122865d42cSLarry Finger  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
132865d42cSLarry Finger  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
142865d42cSLarry Finger  * more details.
152865d42cSLarry Finger  *
162865d42cSLarry Finger  * You should have received a copy of the GNU General Public License along with
172865d42cSLarry Finger  * this program; if not, write to the Free Software Foundation, Inc.,
182865d42cSLarry Finger  * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
192865d42cSLarry Finger  *
202865d42cSLarry Finger  * Modifications for inclusion into the Linux staging tree are
212865d42cSLarry Finger  * Copyright(c) 2010 Larry Finger. All rights reserved.
222865d42cSLarry Finger  *
232865d42cSLarry Finger  * Contact information:
242865d42cSLarry Finger  * WLAN FAE <wlanfae@realtek.com>
252865d42cSLarry Finger  * Larry Finger <Larry.Finger@lwfinger.net>
262865d42cSLarry Finger  *
272865d42cSLarry Finger  ******************************************************************************/
282865d42cSLarry Finger 
292865d42cSLarry Finger #define  _RTL871X_IOCTL_RTL_C_
302865d42cSLarry Finger 
312865d42cSLarry Finger #include "osdep_service.h"
322865d42cSLarry Finger #include "drv_types.h"
332865d42cSLarry Finger #include "wlan_bssdef.h"
342865d42cSLarry Finger #include "wifi.h"
352865d42cSLarry Finger #include "rtl871x_ioctl.h"
362865d42cSLarry Finger #include "rtl871x_ioctl_set.h"
372865d42cSLarry Finger #include "rtl871x_ioctl_rtl.h"
382865d42cSLarry Finger #include "mp_custom_oid.h"
392865d42cSLarry Finger #include "rtl871x_mp.h"
402865d42cSLarry Finger #include "rtl871x_mp_ioctl.h"
412865d42cSLarry Finger 
422865d42cSLarry Finger uint oid_rt_get_signal_quality_hdl(struct oid_par_priv *poid_par_priv)
432865d42cSLarry Finger {
442865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
452865d42cSLarry Finger 		return NDIS_STATUS_NOT_ACCEPTED;
462865d42cSLarry Finger 	return NDIS_STATUS_SUCCESS;
472865d42cSLarry Finger }
482865d42cSLarry Finger 
492865d42cSLarry Finger uint oid_rt_get_small_packet_crc_hdl(struct oid_par_priv *poid_par_priv)
502865d42cSLarry Finger {
512865d42cSLarry Finger 	struct _adapter *padapter = (struct _adapter *)
522865d42cSLarry Finger 				    (poid_par_priv->adapter_context);
532865d42cSLarry Finger 
542865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
552865d42cSLarry Finger 		return NDIS_STATUS_NOT_ACCEPTED;
562865d42cSLarry Finger 	if (poid_par_priv->information_buf_len >=  sizeof(u32)) {
572865d42cSLarry Finger 		*(u32 *)poid_par_priv->information_buf =
582865d42cSLarry Finger 				padapter->recvpriv.rx_smallpacket_crcerr;
592865d42cSLarry Finger 		*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
602865d42cSLarry Finger 	} else
612865d42cSLarry Finger 		return NDIS_STATUS_INVALID_LENGTH;
622865d42cSLarry Finger 	return NDIS_STATUS_SUCCESS;
632865d42cSLarry Finger }
642865d42cSLarry Finger 
652865d42cSLarry Finger uint oid_rt_get_middle_packet_crc_hdl(struct oid_par_priv *poid_par_priv)
662865d42cSLarry Finger {
672865d42cSLarry Finger 	struct _adapter *padapter = (struct _adapter *)
682865d42cSLarry Finger 				    (poid_par_priv->adapter_context);
692865d42cSLarry Finger 
702865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
712865d42cSLarry Finger 		return NDIS_STATUS_NOT_ACCEPTED;
722865d42cSLarry Finger 	if (poid_par_priv->information_buf_len >=  sizeof(u32)) {
732865d42cSLarry Finger 		*(u32 *)poid_par_priv->information_buf =
742865d42cSLarry Finger 				padapter->recvpriv.rx_middlepacket_crcerr;
752865d42cSLarry Finger 		*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
762865d42cSLarry Finger 	} else
772865d42cSLarry Finger 		return NDIS_STATUS_INVALID_LENGTH;
782865d42cSLarry Finger 	return NDIS_STATUS_SUCCESS;
792865d42cSLarry Finger }
802865d42cSLarry Finger 
812865d42cSLarry Finger uint oid_rt_get_large_packet_crc_hdl(struct oid_par_priv *poid_par_priv)
822865d42cSLarry Finger {
832865d42cSLarry Finger 	struct _adapter *padapter = (struct _adapter *)
842865d42cSLarry Finger 				    (poid_par_priv->adapter_context);
852865d42cSLarry Finger 
862865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
872865d42cSLarry Finger 		return NDIS_STATUS_NOT_ACCEPTED;
882865d42cSLarry Finger 	if (poid_par_priv->information_buf_len >=  sizeof(u32)) {
892865d42cSLarry Finger 		*(u32 *)poid_par_priv->information_buf =
902865d42cSLarry Finger 				 padapter->recvpriv.rx_largepacket_crcerr;
912865d42cSLarry Finger 		*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
922865d42cSLarry Finger 	} else
932865d42cSLarry Finger 		return NDIS_STATUS_INVALID_LENGTH;
942865d42cSLarry Finger 	return NDIS_STATUS_SUCCESS;
952865d42cSLarry Finger }
962865d42cSLarry Finger 
972865d42cSLarry Finger uint oid_rt_get_tx_retry_hdl(struct oid_par_priv *poid_par_priv)
982865d42cSLarry Finger {
992865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
1002865d42cSLarry Finger 		return NDIS_STATUS_NOT_ACCEPTED;
1012865d42cSLarry Finger 	return NDIS_STATUS_SUCCESS;
1022865d42cSLarry Finger }
1032865d42cSLarry Finger 
1042865d42cSLarry Finger uint oid_rt_get_rx_retry_hdl(struct oid_par_priv *poid_par_priv)
1052865d42cSLarry Finger {
1062865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
1072865d42cSLarry Finger 		return NDIS_STATUS_NOT_ACCEPTED;
1082865d42cSLarry Finger 	*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
1092865d42cSLarry Finger 	return NDIS_STATUS_SUCCESS;
1102865d42cSLarry Finger }
1112865d42cSLarry Finger 
1122865d42cSLarry Finger uint oid_rt_get_rx_total_packet_hdl(struct oid_par_priv *poid_par_priv)
1132865d42cSLarry Finger {
1142865d42cSLarry Finger 	struct _adapter *padapter = (struct _adapter *)
1152865d42cSLarry Finger 				    (poid_par_priv->adapter_context);
1162865d42cSLarry Finger 
1172865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
1182865d42cSLarry Finger 		return NDIS_STATUS_NOT_ACCEPTED;
1192865d42cSLarry Finger 	if (poid_par_priv->information_buf_len >=  sizeof(u32)) {
1202865d42cSLarry Finger 		*(u32 *)poid_par_priv->information_buf =
1212865d42cSLarry Finger 					 padapter->recvpriv.rx_pkts +
1222865d42cSLarry Finger 					 padapter->recvpriv.rx_drop;
1232865d42cSLarry Finger 		*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
1242865d42cSLarry Finger 	} else
1252865d42cSLarry Finger 		return NDIS_STATUS_INVALID_LENGTH;
1262865d42cSLarry Finger 	return NDIS_STATUS_SUCCESS;
1272865d42cSLarry Finger }
1282865d42cSLarry Finger 
1292865d42cSLarry Finger uint oid_rt_get_tx_beacon_ok_hdl(struct oid_par_priv *poid_par_priv)
1302865d42cSLarry Finger {
1312865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
1322865d42cSLarry Finger 		return NDIS_STATUS_NOT_ACCEPTED;
1332865d42cSLarry Finger 	return NDIS_STATUS_SUCCESS;
1342865d42cSLarry Finger }
1352865d42cSLarry Finger 
1362865d42cSLarry Finger uint oid_rt_get_tx_beacon_err_hdl(struct oid_par_priv *poid_par_priv)
1372865d42cSLarry Finger {
1382865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
1392865d42cSLarry Finger 		return NDIS_STATUS_NOT_ACCEPTED;
1402865d42cSLarry Finger 	return NDIS_STATUS_SUCCESS;
1412865d42cSLarry Finger }
1422865d42cSLarry Finger 
1432865d42cSLarry Finger uint oid_rt_get_rx_icv_err_hdl(struct oid_par_priv *poid_par_priv)
1442865d42cSLarry Finger {
1452865d42cSLarry Finger 	struct _adapter *padapter = (struct _adapter *)
1462865d42cSLarry Finger 				    (poid_par_priv->adapter_context);
1472865d42cSLarry Finger 
1482865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
1492865d42cSLarry Finger 		return NDIS_STATUS_NOT_ACCEPTED;
1502865d42cSLarry Finger 	if (poid_par_priv->information_buf_len >= sizeof(u32)) {
1512865d42cSLarry Finger 		*(uint *)poid_par_priv->information_buf =
1522865d42cSLarry Finger 					 padapter->recvpriv.rx_icv_err;
1532865d42cSLarry Finger 		*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
1542865d42cSLarry Finger 	} else
1552865d42cSLarry Finger 		return NDIS_STATUS_INVALID_LENGTH ;
1562865d42cSLarry Finger 	return NDIS_STATUS_SUCCESS;
1572865d42cSLarry Finger }
1582865d42cSLarry Finger 
1592865d42cSLarry Finger uint oid_rt_set_encryption_algorithm_hdl(struct oid_par_priv
1602865d42cSLarry Finger 						*poid_par_priv)
1612865d42cSLarry Finger {
1622865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != SET_OID)
1632865d42cSLarry Finger 		return NDIS_STATUS_NOT_ACCEPTED;
1642865d42cSLarry Finger 	return NDIS_STATUS_SUCCESS;
1652865d42cSLarry Finger }
1662865d42cSLarry Finger 
1672865d42cSLarry Finger uint oid_rt_get_preamble_mode_hdl(struct oid_par_priv *poid_par_priv)
1682865d42cSLarry Finger {
1692865d42cSLarry Finger 	struct _adapter *padapter = (struct _adapter *)
1702865d42cSLarry Finger 				    (poid_par_priv->adapter_context);
1712865d42cSLarry Finger 	u32 preamblemode = 0 ;
1722865d42cSLarry Finger 
1732865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
1742865d42cSLarry Finger 		return NDIS_STATUS_NOT_ACCEPTED;
1752865d42cSLarry Finger 	if (poid_par_priv->information_buf_len >= sizeof(u32)) {
1762865d42cSLarry Finger 		if (padapter->registrypriv.preamble == PREAMBLE_LONG)
1772865d42cSLarry Finger 			preamblemode = 0;
1782865d42cSLarry Finger 		else if (padapter->registrypriv.preamble == PREAMBLE_AUTO)
1792865d42cSLarry Finger 			preamblemode = 1;
1802865d42cSLarry Finger 		else if (padapter->registrypriv.preamble == PREAMBLE_SHORT)
1812865d42cSLarry Finger 			preamblemode = 2;
1822865d42cSLarry Finger 		*(u32 *)poid_par_priv->information_buf = preamblemode;
1832865d42cSLarry Finger 		*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
1842865d42cSLarry Finger 	} else
1852865d42cSLarry Finger 		return NDIS_STATUS_INVALID_LENGTH;
1862865d42cSLarry Finger 	return NDIS_STATUS_SUCCESS;
1872865d42cSLarry Finger }
1882865d42cSLarry Finger 
1892865d42cSLarry Finger uint oid_rt_get_ap_ip_hdl(struct oid_par_priv *poid_par_priv)
1902865d42cSLarry Finger {
1912865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
1922865d42cSLarry Finger 		return NDIS_STATUS_NOT_ACCEPTED;
1932865d42cSLarry Finger 	return NDIS_STATUS_SUCCESS;
1942865d42cSLarry Finger }
1952865d42cSLarry Finger 
1962865d42cSLarry Finger uint oid_rt_get_channelplan_hdl(struct oid_par_priv *poid_par_priv)
1972865d42cSLarry Finger {
1982865d42cSLarry Finger 	struct _adapter *padapter = (struct _adapter *)
1992865d42cSLarry Finger 				    (poid_par_priv->adapter_context);
2002865d42cSLarry Finger 	struct eeprom_priv *peeprompriv = &padapter->eeprompriv;
2012865d42cSLarry Finger 
2022865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
2032865d42cSLarry Finger 		return NDIS_STATUS_NOT_ACCEPTED;
2042865d42cSLarry Finger 	*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
2052865d42cSLarry Finger 	*(u16 *)poid_par_priv->information_buf = peeprompriv->channel_plan;
2062865d42cSLarry Finger 	return NDIS_STATUS_SUCCESS;
2072865d42cSLarry Finger }
2082865d42cSLarry Finger 
2092865d42cSLarry Finger uint oid_rt_set_channelplan_hdl(struct oid_par_priv
2102865d42cSLarry Finger 				       *poid_par_priv)
2112865d42cSLarry Finger {
2122865d42cSLarry Finger 	struct _adapter *padapter = (struct _adapter *)
2132865d42cSLarry Finger 				    (poid_par_priv->adapter_context);
2142865d42cSLarry Finger 	struct eeprom_priv *peeprompriv = &padapter->eeprompriv;
2152865d42cSLarry Finger 
2162865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != SET_OID)
2172865d42cSLarry Finger 		return NDIS_STATUS_NOT_ACCEPTED;
2182865d42cSLarry Finger 	peeprompriv->channel_plan = *(u16 *)poid_par_priv->information_buf;
2192865d42cSLarry Finger 	return NDIS_STATUS_SUCCESS;
2202865d42cSLarry Finger }
2212865d42cSLarry Finger 
2222865d42cSLarry Finger uint oid_rt_set_preamble_mode_hdl(struct oid_par_priv
2232865d42cSLarry Finger 					 *poid_par_priv)
2242865d42cSLarry Finger {
2252865d42cSLarry Finger 	struct _adapter *padapter = (struct _adapter *)
2262865d42cSLarry Finger 				    (poid_par_priv->adapter_context);
2272865d42cSLarry Finger 	u32 preamblemode = 0;
2282865d42cSLarry Finger 
2292865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != SET_OID)
2302865d42cSLarry Finger 		return NDIS_STATUS_NOT_ACCEPTED;
2312865d42cSLarry Finger 	if (poid_par_priv->information_buf_len >= sizeof(u32)) {
2322865d42cSLarry Finger 		preamblemode = *(u32 *)poid_par_priv->information_buf;
2332865d42cSLarry Finger 		if (preamblemode == 0)
2342865d42cSLarry Finger 			padapter->registrypriv.preamble = PREAMBLE_LONG;
2352865d42cSLarry Finger 		else if (preamblemode == 1)
2362865d42cSLarry Finger 			padapter->registrypriv.preamble = PREAMBLE_AUTO;
2372865d42cSLarry Finger 		else if (preamblemode == 2)
2382865d42cSLarry Finger 			padapter->registrypriv.preamble = PREAMBLE_SHORT;
2392865d42cSLarry Finger 		*(u32 *)poid_par_priv->information_buf = preamblemode;
2402865d42cSLarry Finger 		*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
2412865d42cSLarry Finger 	} else
2422865d42cSLarry Finger 		return NDIS_STATUS_INVALID_LENGTH;
2432865d42cSLarry Finger 	return NDIS_STATUS_SUCCESS;
2442865d42cSLarry Finger }
2452865d42cSLarry Finger 
2462865d42cSLarry Finger uint oid_rt_set_bcn_intvl_hdl(struct oid_par_priv *poid_par_priv)
2472865d42cSLarry Finger {
2482865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != SET_OID)
2492865d42cSLarry Finger 		return NDIS_STATUS_NOT_ACCEPTED;
2502865d42cSLarry Finger 	return NDIS_STATUS_SUCCESS;
2512865d42cSLarry Finger }
2522865d42cSLarry Finger 
2532865d42cSLarry Finger uint oid_rt_dedicate_probe_hdl(struct oid_par_priv
2542865d42cSLarry Finger 				      *poid_par_priv)
2552865d42cSLarry Finger {
2562865d42cSLarry Finger 	return NDIS_STATUS_SUCCESS;
2572865d42cSLarry Finger }
2582865d42cSLarry Finger 
2592865d42cSLarry Finger uint oid_rt_get_total_tx_bytes_hdl(struct oid_par_priv
2602865d42cSLarry Finger 					  *poid_par_priv)
2612865d42cSLarry Finger {
2622865d42cSLarry Finger 	struct _adapter *padapter = (struct _adapter *)
2632865d42cSLarry Finger 				    (poid_par_priv->adapter_context);
2642865d42cSLarry Finger 
2652865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
2662865d42cSLarry Finger 		return NDIS_STATUS_NOT_ACCEPTED;
2672865d42cSLarry Finger 	if (poid_par_priv->information_buf_len >= sizeof(u32)) {
2682865d42cSLarry Finger 		*(u32 *)poid_par_priv->information_buf =
2692865d42cSLarry Finger 						 padapter->xmitpriv.tx_bytes;
2702865d42cSLarry Finger 		*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
2712865d42cSLarry Finger 	} else
2722865d42cSLarry Finger 		return NDIS_STATUS_INVALID_LENGTH;
2732865d42cSLarry Finger 	return NDIS_STATUS_SUCCESS;
2742865d42cSLarry Finger }
2752865d42cSLarry Finger 
2762865d42cSLarry Finger uint oid_rt_get_total_rx_bytes_hdl(struct oid_par_priv
2772865d42cSLarry Finger 					  *poid_par_priv)
2782865d42cSLarry Finger {
2792865d42cSLarry Finger 	struct _adapter *padapter = (struct _adapter *)
2802865d42cSLarry Finger 				    (poid_par_priv->adapter_context);
2812865d42cSLarry Finger 
2822865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
2832865d42cSLarry Finger 		return NDIS_STATUS_NOT_ACCEPTED;
2842865d42cSLarry Finger 	if (poid_par_priv->information_buf_len >= sizeof(u32)) {
2852865d42cSLarry Finger 		*(u32 *)poid_par_priv->information_buf =
2862865d42cSLarry Finger 					   padapter->recvpriv.rx_bytes;
2872865d42cSLarry Finger 		*poid_par_priv->bytes_rw = poid_par_priv->
2882865d42cSLarry Finger 					   information_buf_len;
2892865d42cSLarry Finger 	} else
2902865d42cSLarry Finger 		return NDIS_STATUS_INVALID_LENGTH;
2912865d42cSLarry Finger 	return NDIS_STATUS_SUCCESS;
2922865d42cSLarry Finger }
2932865d42cSLarry Finger 
2942865d42cSLarry Finger uint oid_rt_current_tx_power_level_hdl(struct oid_par_priv
2952865d42cSLarry Finger 					      *poid_par_priv)
2962865d42cSLarry Finger {
2972865d42cSLarry Finger 	return NDIS_STATUS_SUCCESS;
2982865d42cSLarry Finger }
2992865d42cSLarry Finger 
3002865d42cSLarry Finger uint oid_rt_get_enc_key_mismatch_count_hdl(struct oid_par_priv
3012865d42cSLarry Finger 						  *poid_par_priv)
3022865d42cSLarry Finger {
3032865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
3042865d42cSLarry Finger 		return NDIS_STATUS_NOT_ACCEPTED;
3052865d42cSLarry Finger 	return NDIS_STATUS_SUCCESS;
3062865d42cSLarry Finger }
3072865d42cSLarry Finger 
3082865d42cSLarry Finger uint oid_rt_get_enc_key_match_count_hdl(struct oid_par_priv
3092865d42cSLarry Finger 					       *poid_par_priv)
3102865d42cSLarry Finger {
3112865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
3122865d42cSLarry Finger 		return NDIS_STATUS_NOT_ACCEPTED;
3132865d42cSLarry Finger 	return NDIS_STATUS_SUCCESS;
3142865d42cSLarry Finger }
3152865d42cSLarry Finger 
3162865d42cSLarry Finger uint oid_rt_get_channel_hdl(struct oid_par_priv *poid_par_priv)
3172865d42cSLarry Finger {
3182865d42cSLarry Finger 	struct _adapter *padapter = (struct _adapter *)
3192865d42cSLarry Finger 				    (poid_par_priv->adapter_context);
3202865d42cSLarry Finger 	struct	mlme_priv *pmlmepriv = &padapter->mlmepriv;
3212865d42cSLarry Finger 	struct NDIS_802_11_CONFIGURATION *pnic_Config;
3222865d42cSLarry Finger 	u32   channelnum;
3232865d42cSLarry Finger 
3242865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
3252865d42cSLarry Finger 		return NDIS_STATUS_NOT_ACCEPTED;
3262865d42cSLarry Finger 	if ((check_fwstate(pmlmepriv, _FW_LINKED) == true) ||
3272865d42cSLarry Finger 	    (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == true))
3282865d42cSLarry Finger 		pnic_Config = &pmlmepriv->cur_network.network.Configuration;
3292865d42cSLarry Finger 	else
3302865d42cSLarry Finger 		pnic_Config = &padapter->registrypriv.dev_network.
3312865d42cSLarry Finger 			      Configuration;
3322865d42cSLarry Finger 	channelnum = pnic_Config->DSConfig;
3332865d42cSLarry Finger 	*(u32 *)poid_par_priv->information_buf = channelnum;
3342865d42cSLarry Finger 	*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
3352865d42cSLarry Finger 	return NDIS_STATUS_SUCCESS;
3362865d42cSLarry Finger }
3372865d42cSLarry Finger 
3382865d42cSLarry Finger uint oid_rt_get_hardware_radio_off_hdl(struct oid_par_priv
3392865d42cSLarry Finger 			 *poid_par_priv)
3402865d42cSLarry Finger {
3412865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
3422865d42cSLarry Finger 		return NDIS_STATUS_NOT_ACCEPTED;
3432865d42cSLarry Finger 	return NDIS_STATUS_SUCCESS;
3442865d42cSLarry Finger }
3452865d42cSLarry Finger 
3462865d42cSLarry Finger uint oid_rt_get_key_mismatch_hdl(struct oid_par_priv *poid_par_priv)
3472865d42cSLarry Finger {
3482865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
3492865d42cSLarry Finger 		return NDIS_STATUS_NOT_ACCEPTED;
3502865d42cSLarry Finger 	return NDIS_STATUS_SUCCESS;
3512865d42cSLarry Finger }
3522865d42cSLarry Finger 
3532865d42cSLarry Finger uint oid_rt_supported_wireless_mode_hdl(struct oid_par_priv
3542865d42cSLarry Finger 					       *poid_par_priv)
3552865d42cSLarry Finger {
3562865d42cSLarry Finger 	u32 ulInfo = 0;
3572865d42cSLarry Finger 
3582865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
3592865d42cSLarry Finger 		return NDIS_STATUS_NOT_ACCEPTED;
3602865d42cSLarry Finger 	if (poid_par_priv->information_buf_len >= sizeof(u32)) {
3612865d42cSLarry Finger 		ulInfo |= 0x0100; /* WIRELESS_MODE_B */
3622865d42cSLarry Finger 		ulInfo |= 0x0200; /* WIRELESS_MODE_G */
3632865d42cSLarry Finger 		ulInfo |= 0x0400; /* WIRELESS_MODE_A */
3642865d42cSLarry Finger 		*(u32 *) poid_par_priv->information_buf = ulInfo;
3652865d42cSLarry Finger 		*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
3662865d42cSLarry Finger 	} else
3672865d42cSLarry Finger 		return NDIS_STATUS_INVALID_LENGTH;
3682865d42cSLarry Finger 	return NDIS_STATUS_SUCCESS;
3692865d42cSLarry Finger }
3702865d42cSLarry Finger 
3712865d42cSLarry Finger uint oid_rt_get_channel_list_hdl(struct oid_par_priv *poid_par_priv)
3722865d42cSLarry Finger {
3732865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
3742865d42cSLarry Finger 		return NDIS_STATUS_NOT_ACCEPTED;
3752865d42cSLarry Finger 	return NDIS_STATUS_SUCCESS;
3762865d42cSLarry Finger }
3772865d42cSLarry Finger 
3782865d42cSLarry Finger uint oid_rt_get_scan_in_progress_hdl(struct oid_par_priv *poid_par_priv)
3792865d42cSLarry Finger {
3802865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
3812865d42cSLarry Finger 		return NDIS_STATUS_NOT_ACCEPTED;
3822865d42cSLarry Finger 	return NDIS_STATUS_SUCCESS;
3832865d42cSLarry Finger }
3842865d42cSLarry Finger 
3852865d42cSLarry Finger 
3862865d42cSLarry Finger uint oid_rt_forced_data_rate_hdl(struct oid_par_priv *poid_par_priv)
3872865d42cSLarry Finger {
3882865d42cSLarry Finger 	return NDIS_STATUS_SUCCESS;
3892865d42cSLarry Finger }
3902865d42cSLarry Finger 
3912865d42cSLarry Finger uint oid_rt_wireless_mode_for_scan_list_hdl(struct oid_par_priv
3922865d42cSLarry Finger 						   *poid_par_priv)
3932865d42cSLarry Finger {
3942865d42cSLarry Finger 	return NDIS_STATUS_SUCCESS;
3952865d42cSLarry Finger }
3962865d42cSLarry Finger 
3972865d42cSLarry Finger uint oid_rt_get_bss_wireless_mode_hdl(struct oid_par_priv
3982865d42cSLarry Finger 					     *poid_par_priv)
3992865d42cSLarry Finger {
4002865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
4012865d42cSLarry Finger 		return NDIS_STATUS_NOT_ACCEPTED;
4022865d42cSLarry Finger 	return NDIS_STATUS_SUCCESS;
4032865d42cSLarry Finger }
4042865d42cSLarry Finger 
4052865d42cSLarry Finger uint oid_rt_scan_with_magic_packet_hdl(struct oid_par_priv
4062865d42cSLarry Finger 					      *poid_par_priv)
4072865d42cSLarry Finger {
4082865d42cSLarry Finger 	return NDIS_STATUS_SUCCESS;
4092865d42cSLarry Finger }
4102865d42cSLarry Finger 
4112865d42cSLarry Finger uint oid_rt_ap_get_associated_station_list_hdl(struct oid_par_priv
4122865d42cSLarry Finger 						      *poid_par_priv)
4132865d42cSLarry Finger {
4142865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
4152865d42cSLarry Finger 		return NDIS_STATUS_NOT_ACCEPTED;
4162865d42cSLarry Finger 	return NDIS_STATUS_SUCCESS;
4172865d42cSLarry Finger }
4182865d42cSLarry Finger 
4192865d42cSLarry Finger uint oid_rt_ap_switch_into_ap_mode_hdl(struct oid_par_priv*
4202865d42cSLarry Finger 					      poid_par_priv)
4212865d42cSLarry Finger {
4222865d42cSLarry Finger 	return NDIS_STATUS_SUCCESS;
4232865d42cSLarry Finger }
4242865d42cSLarry Finger 
4252865d42cSLarry Finger uint oid_rt_ap_supported_hdl(struct oid_par_priv *poid_par_priv)
4262865d42cSLarry Finger {
4272865d42cSLarry Finger 	return NDIS_STATUS_SUCCESS;
4282865d42cSLarry Finger }
4292865d42cSLarry Finger 
4302865d42cSLarry Finger uint oid_rt_ap_set_passphrase_hdl(struct oid_par_priv *poid_par_priv)
4312865d42cSLarry Finger {
4322865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != SET_OID)
4332865d42cSLarry Finger 		return NDIS_STATUS_NOT_ACCEPTED;
4342865d42cSLarry Finger 	return NDIS_STATUS_SUCCESS;
4352865d42cSLarry Finger }
4362865d42cSLarry Finger 
4372865d42cSLarry Finger uint oid_rt_pro_rf_write_registry_hdl(struct oid_par_priv*
4382865d42cSLarry Finger 					     poid_par_priv)
4392865d42cSLarry Finger {
4402865d42cSLarry Finger 	uint status = NDIS_STATUS_SUCCESS;
4412865d42cSLarry Finger 	struct _adapter *Adapter = (struct _adapter *)
4422865d42cSLarry Finger 			(poid_par_priv->adapter_context);
4432865d42cSLarry Finger 
4442865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != SET_OID) /* QUERY_OID */
4452865d42cSLarry Finger 		return NDIS_STATUS_NOT_ACCEPTED;
4462865d42cSLarry Finger 	if (poid_par_priv->information_buf_len ==
4472865d42cSLarry Finger 	   (sizeof(unsigned long) * 3)) {
4482865d42cSLarry Finger 		if (!r8712_setrfreg_cmd(Adapter,
4492865d42cSLarry Finger 			*(unsigned char *)poid_par_priv->information_buf,
4502865d42cSLarry Finger 			(unsigned long)(*((unsigned long *)
4512865d42cSLarry Finger 					poid_par_priv->information_buf + 2))))
4522865d42cSLarry Finger 			status = NDIS_STATUS_NOT_ACCEPTED;
4532865d42cSLarry Finger 	} else
4542865d42cSLarry Finger 		status = NDIS_STATUS_INVALID_LENGTH;
4552865d42cSLarry Finger 	return status;
4562865d42cSLarry Finger }
4572865d42cSLarry Finger 
4582865d42cSLarry Finger uint oid_rt_pro_rf_read_registry_hdl(struct oid_par_priv *poid_par_priv)
4592865d42cSLarry Finger {
4602865d42cSLarry Finger 	uint status = NDIS_STATUS_SUCCESS;
4612865d42cSLarry Finger 	struct _adapter *Adapter = (struct _adapter *)
4622865d42cSLarry Finger 			(poid_par_priv->adapter_context);
4632865d42cSLarry Finger 
4642865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != SET_OID) /* QUERY_OID */
4652865d42cSLarry Finger 		return NDIS_STATUS_NOT_ACCEPTED;
4662865d42cSLarry Finger 	if (poid_par_priv->information_buf_len == (sizeof(unsigned long)*3)) {
4672865d42cSLarry Finger 		if (Adapter->mppriv.act_in_progress == true)
4682865d42cSLarry Finger 			status = NDIS_STATUS_NOT_ACCEPTED;
4692865d42cSLarry Finger 		else {
4702865d42cSLarry Finger 			/* init workparam */
4712865d42cSLarry Finger 			Adapter->mppriv.act_in_progress = true;
4722865d42cSLarry Finger 			Adapter->mppriv.workparam.bcompleted = false;
4732865d42cSLarry Finger 			Adapter->mppriv.workparam.act_type = MPT_READ_RF;
4742865d42cSLarry Finger 			Adapter->mppriv.workparam.io_offset = *(unsigned long *)
4752865d42cSLarry Finger 						poid_par_priv->information_buf;
4762865d42cSLarry Finger 			Adapter->mppriv.workparam.io_value = 0xcccccccc;
4772865d42cSLarry Finger 
4782865d42cSLarry Finger 		/* RegOffsetValue	- The offset of RF register to read.
4792865d42cSLarry Finger 		 * RegDataWidth	- The data width of RF register to read.
4802865d42cSLarry Finger 		 * RegDataValue	- The value to read.
4812865d42cSLarry Finger 		 * RegOffsetValue = *((unsigned long *)InformationBuffer);
4822865d42cSLarry Finger 		 * RegDataWidth = *((unsigned long *)InformationBuffer+1);
4832865d42cSLarry Finger 		 * RegDataValue =  *((unsigned long *)InformationBuffer+2);
4842865d42cSLarry Finger 		 */
4852865d42cSLarry Finger 			if (!r8712_getrfreg_cmd(Adapter,
4862865d42cSLarry Finger 			    *(unsigned char *)poid_par_priv->information_buf,
4872865d42cSLarry Finger 			    (unsigned char *)&Adapter->mppriv.workparam.
4882865d42cSLarry Finger 			    io_value))
4892865d42cSLarry Finger 				status = NDIS_STATUS_NOT_ACCEPTED;
4902865d42cSLarry Finger 		}
4912865d42cSLarry Finger 	} else
4922865d42cSLarry Finger 		status = NDIS_STATUS_INVALID_LENGTH;
4932865d42cSLarry Finger 	return status;
4942865d42cSLarry Finger }
4952865d42cSLarry Finger 
4962865d42cSLarry Finger enum _CONNECT_STATE_{
4972865d42cSLarry Finger 	CHECKINGSTATUS,
4982865d42cSLarry Finger 	ASSOCIATED,
4992865d42cSLarry Finger 	ADHOCMODE,
5002865d42cSLarry Finger 	NOTASSOCIATED
5012865d42cSLarry Finger };
5022865d42cSLarry Finger 
5032865d42cSLarry Finger uint oid_rt_get_connect_state_hdl(struct oid_par_priv *poid_par_priv)
5042865d42cSLarry Finger {
5052865d42cSLarry Finger 	struct _adapter *padapter = (struct _adapter *)
5062865d42cSLarry Finger 				     (poid_par_priv->adapter_context);
5072865d42cSLarry Finger 	struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
5082865d42cSLarry Finger 	u32 ulInfo;
5092865d42cSLarry Finger 
5102865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
5112865d42cSLarry Finger 		return NDIS_STATUS_NOT_ACCEPTED;
5122865d42cSLarry Finger 	/* nStatus==0	CheckingStatus
5132865d42cSLarry Finger 	 * nStatus==1	Associated
5142865d42cSLarry Finger 	 * nStatus==2	AdHocMode
5152865d42cSLarry Finger 	 * nStatus==3	NotAssociated
5162865d42cSLarry Finger 	 */
5172865d42cSLarry Finger 	if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == true)
5182865d42cSLarry Finger 		ulInfo = CHECKINGSTATUS;
5192865d42cSLarry Finger 	else if (check_fwstate(pmlmepriv, _FW_LINKED) == true)
5202865d42cSLarry Finger 		ulInfo = ASSOCIATED;
5212865d42cSLarry Finger 	else if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == true)
5222865d42cSLarry Finger 		ulInfo = ADHOCMODE;
5232865d42cSLarry Finger 	else
5242865d42cSLarry Finger 		ulInfo = NOTASSOCIATED ;
5252865d42cSLarry Finger 	*(u32 *)poid_par_priv->information_buf = ulInfo;
5262865d42cSLarry Finger 	*poid_par_priv->bytes_rw =  poid_par_priv->information_buf_len;
5272865d42cSLarry Finger 	return NDIS_STATUS_SUCCESS;
5282865d42cSLarry Finger }
5292865d42cSLarry Finger 
5302865d42cSLarry Finger uint oid_rt_set_default_key_id_hdl(struct oid_par_priv *poid_par_priv)
5312865d42cSLarry Finger {
5322865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != SET_OID)
5332865d42cSLarry Finger 		return NDIS_STATUS_NOT_ACCEPTED;
5342865d42cSLarry Finger 	return NDIS_STATUS_SUCCESS;
5352865d42cSLarry Finger }
536