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 
319e01b9f3SPrzemo Firszt #include <linux/rndis.h>
322865d42cSLarry Finger #include "osdep_service.h"
332865d42cSLarry Finger #include "drv_types.h"
342865d42cSLarry Finger #include "wlan_bssdef.h"
352865d42cSLarry Finger #include "wifi.h"
362865d42cSLarry Finger #include "rtl871x_ioctl.h"
372865d42cSLarry Finger #include "rtl871x_ioctl_set.h"
382865d42cSLarry Finger #include "rtl871x_ioctl_rtl.h"
392865d42cSLarry Finger #include "mp_custom_oid.h"
402865d42cSLarry Finger #include "rtl871x_mp.h"
412865d42cSLarry Finger #include "rtl871x_mp_ioctl.h"
422865d42cSLarry Finger 
432865d42cSLarry Finger uint oid_rt_get_signal_quality_hdl(struct oid_par_priv *poid_par_priv)
442865d42cSLarry Finger {
452865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
469e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
479e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
482865d42cSLarry Finger }
492865d42cSLarry Finger 
502865d42cSLarry Finger uint oid_rt_get_small_packet_crc_hdl(struct oid_par_priv *poid_par_priv)
512865d42cSLarry Finger {
522865d42cSLarry Finger 	struct _adapter *padapter = (struct _adapter *)
532865d42cSLarry Finger 				    (poid_par_priv->adapter_context);
542865d42cSLarry Finger 
552865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
569e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
572865d42cSLarry Finger 	if (poid_par_priv->information_buf_len >=  sizeof(u32)) {
582865d42cSLarry Finger 		*(u32 *)poid_par_priv->information_buf =
592865d42cSLarry Finger 				padapter->recvpriv.rx_smallpacket_crcerr;
602865d42cSLarry Finger 		*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
612865d42cSLarry Finger 	} else
629e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_INVALID_LENGTH;
639e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
642865d42cSLarry Finger }
652865d42cSLarry Finger 
662865d42cSLarry Finger uint oid_rt_get_middle_packet_crc_hdl(struct oid_par_priv *poid_par_priv)
672865d42cSLarry Finger {
682865d42cSLarry Finger 	struct _adapter *padapter = (struct _adapter *)
692865d42cSLarry Finger 				    (poid_par_priv->adapter_context);
702865d42cSLarry Finger 
712865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
729e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
732865d42cSLarry Finger 	if (poid_par_priv->information_buf_len >=  sizeof(u32)) {
742865d42cSLarry Finger 		*(u32 *)poid_par_priv->information_buf =
752865d42cSLarry Finger 				padapter->recvpriv.rx_middlepacket_crcerr;
762865d42cSLarry Finger 		*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
772865d42cSLarry Finger 	} else
789e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_INVALID_LENGTH;
799e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
802865d42cSLarry Finger }
812865d42cSLarry Finger 
822865d42cSLarry Finger uint oid_rt_get_large_packet_crc_hdl(struct oid_par_priv *poid_par_priv)
832865d42cSLarry Finger {
842865d42cSLarry Finger 	struct _adapter *padapter = (struct _adapter *)
852865d42cSLarry Finger 				    (poid_par_priv->adapter_context);
862865d42cSLarry Finger 
872865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
889e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
892865d42cSLarry Finger 	if (poid_par_priv->information_buf_len >=  sizeof(u32)) {
902865d42cSLarry Finger 		*(u32 *)poid_par_priv->information_buf =
912865d42cSLarry Finger 				 padapter->recvpriv.rx_largepacket_crcerr;
922865d42cSLarry Finger 		*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
932865d42cSLarry Finger 	} else
949e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_INVALID_LENGTH;
959e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
962865d42cSLarry Finger }
972865d42cSLarry Finger 
982865d42cSLarry Finger uint oid_rt_get_tx_retry_hdl(struct oid_par_priv *poid_par_priv)
992865d42cSLarry Finger {
1002865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
1019e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
1029e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
1032865d42cSLarry Finger }
1042865d42cSLarry Finger 
1052865d42cSLarry Finger uint oid_rt_get_rx_retry_hdl(struct oid_par_priv *poid_par_priv)
1062865d42cSLarry Finger {
1072865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
1089e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
1092865d42cSLarry Finger 	*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
1109e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
1112865d42cSLarry Finger }
1122865d42cSLarry Finger 
1132865d42cSLarry Finger uint oid_rt_get_rx_total_packet_hdl(struct oid_par_priv *poid_par_priv)
1142865d42cSLarry Finger {
1152865d42cSLarry Finger 	struct _adapter *padapter = (struct _adapter *)
1162865d42cSLarry Finger 				    (poid_par_priv->adapter_context);
1172865d42cSLarry Finger 
1182865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
1199e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
1202865d42cSLarry Finger 	if (poid_par_priv->information_buf_len >=  sizeof(u32)) {
1212865d42cSLarry Finger 		*(u32 *)poid_par_priv->information_buf =
1222865d42cSLarry Finger 					 padapter->recvpriv.rx_pkts +
1232865d42cSLarry Finger 					 padapter->recvpriv.rx_drop;
1242865d42cSLarry Finger 		*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
1252865d42cSLarry Finger 	} else
1269e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_INVALID_LENGTH;
1279e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
1282865d42cSLarry Finger }
1292865d42cSLarry Finger 
1302865d42cSLarry Finger uint oid_rt_get_tx_beacon_ok_hdl(struct oid_par_priv *poid_par_priv)
1312865d42cSLarry Finger {
1322865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
1339e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
1349e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
1352865d42cSLarry Finger }
1362865d42cSLarry Finger 
1372865d42cSLarry Finger uint oid_rt_get_tx_beacon_err_hdl(struct oid_par_priv *poid_par_priv)
1382865d42cSLarry Finger {
1392865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
1409e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
1419e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
1422865d42cSLarry Finger }
1432865d42cSLarry Finger 
1442865d42cSLarry Finger uint oid_rt_get_rx_icv_err_hdl(struct oid_par_priv *poid_par_priv)
1452865d42cSLarry Finger {
1462865d42cSLarry Finger 	struct _adapter *padapter = (struct _adapter *)
1472865d42cSLarry Finger 				    (poid_par_priv->adapter_context);
1482865d42cSLarry Finger 
1492865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
1509e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
1512865d42cSLarry Finger 	if (poid_par_priv->information_buf_len >= sizeof(u32)) {
1522865d42cSLarry Finger 		*(uint *)poid_par_priv->information_buf =
1532865d42cSLarry Finger 					 padapter->recvpriv.rx_icv_err;
1542865d42cSLarry Finger 		*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
1552865d42cSLarry Finger 	} else
1569e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_INVALID_LENGTH ;
1579e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
1582865d42cSLarry Finger }
1592865d42cSLarry Finger 
1602865d42cSLarry Finger uint oid_rt_set_encryption_algorithm_hdl(struct oid_par_priv
1612865d42cSLarry Finger 						*poid_par_priv)
1622865d42cSLarry Finger {
1632865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != SET_OID)
1649e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
1659e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
1662865d42cSLarry Finger }
1672865d42cSLarry Finger 
1682865d42cSLarry Finger uint oid_rt_get_preamble_mode_hdl(struct oid_par_priv *poid_par_priv)
1692865d42cSLarry Finger {
1702865d42cSLarry Finger 	struct _adapter *padapter = (struct _adapter *)
1712865d42cSLarry Finger 				    (poid_par_priv->adapter_context);
1722865d42cSLarry Finger 	u32 preamblemode = 0 ;
1732865d42cSLarry Finger 
1742865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
1759e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
1762865d42cSLarry Finger 	if (poid_par_priv->information_buf_len >= sizeof(u32)) {
1772865d42cSLarry Finger 		if (padapter->registrypriv.preamble == PREAMBLE_LONG)
1782865d42cSLarry Finger 			preamblemode = 0;
1792865d42cSLarry Finger 		else if (padapter->registrypriv.preamble == PREAMBLE_AUTO)
1802865d42cSLarry Finger 			preamblemode = 1;
1812865d42cSLarry Finger 		else if (padapter->registrypriv.preamble == PREAMBLE_SHORT)
1822865d42cSLarry Finger 			preamblemode = 2;
1832865d42cSLarry Finger 		*(u32 *)poid_par_priv->information_buf = preamblemode;
1842865d42cSLarry Finger 		*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
1852865d42cSLarry Finger 	} else
1869e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_INVALID_LENGTH;
1879e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
1882865d42cSLarry Finger }
1892865d42cSLarry Finger 
1902865d42cSLarry Finger uint oid_rt_get_ap_ip_hdl(struct oid_par_priv *poid_par_priv)
1912865d42cSLarry Finger {
1922865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
1939e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
1949e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
1952865d42cSLarry Finger }
1962865d42cSLarry Finger 
1972865d42cSLarry Finger uint oid_rt_get_channelplan_hdl(struct oid_par_priv *poid_par_priv)
1982865d42cSLarry Finger {
1992865d42cSLarry Finger 	struct _adapter *padapter = (struct _adapter *)
2002865d42cSLarry Finger 				    (poid_par_priv->adapter_context);
2012865d42cSLarry Finger 	struct eeprom_priv *peeprompriv = &padapter->eeprompriv;
2022865d42cSLarry Finger 
2032865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
2049e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
2052865d42cSLarry Finger 	*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
2062865d42cSLarry Finger 	*(u16 *)poid_par_priv->information_buf = peeprompriv->channel_plan;
2079e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
2082865d42cSLarry Finger }
2092865d42cSLarry Finger 
2102865d42cSLarry Finger uint oid_rt_set_channelplan_hdl(struct oid_par_priv
2112865d42cSLarry Finger 				       *poid_par_priv)
2122865d42cSLarry Finger {
2132865d42cSLarry Finger 	struct _adapter *padapter = (struct _adapter *)
2142865d42cSLarry Finger 				    (poid_par_priv->adapter_context);
2152865d42cSLarry Finger 	struct eeprom_priv *peeprompriv = &padapter->eeprompriv;
2162865d42cSLarry Finger 
2172865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != SET_OID)
2189e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
2192865d42cSLarry Finger 	peeprompriv->channel_plan = *(u16 *)poid_par_priv->information_buf;
2209e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
2212865d42cSLarry Finger }
2222865d42cSLarry Finger 
2232865d42cSLarry Finger uint oid_rt_set_preamble_mode_hdl(struct oid_par_priv
2242865d42cSLarry Finger 					 *poid_par_priv)
2252865d42cSLarry Finger {
2262865d42cSLarry Finger 	struct _adapter *padapter = (struct _adapter *)
2272865d42cSLarry Finger 				    (poid_par_priv->adapter_context);
2282865d42cSLarry Finger 	u32 preamblemode = 0;
2292865d42cSLarry Finger 
2302865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != SET_OID)
2319e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
2322865d42cSLarry Finger 	if (poid_par_priv->information_buf_len >= sizeof(u32)) {
2332865d42cSLarry Finger 		preamblemode = *(u32 *)poid_par_priv->information_buf;
2342865d42cSLarry Finger 		if (preamblemode == 0)
2352865d42cSLarry Finger 			padapter->registrypriv.preamble = PREAMBLE_LONG;
2362865d42cSLarry Finger 		else if (preamblemode == 1)
2372865d42cSLarry Finger 			padapter->registrypriv.preamble = PREAMBLE_AUTO;
2382865d42cSLarry Finger 		else if (preamblemode == 2)
2392865d42cSLarry Finger 			padapter->registrypriv.preamble = PREAMBLE_SHORT;
2402865d42cSLarry Finger 		*(u32 *)poid_par_priv->information_buf = preamblemode;
2412865d42cSLarry Finger 		*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
2422865d42cSLarry Finger 	} else
2439e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_INVALID_LENGTH;
2449e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
2452865d42cSLarry Finger }
2462865d42cSLarry Finger 
2472865d42cSLarry Finger uint oid_rt_set_bcn_intvl_hdl(struct oid_par_priv *poid_par_priv)
2482865d42cSLarry Finger {
2492865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != SET_OID)
2509e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
2519e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
2522865d42cSLarry Finger }
2532865d42cSLarry Finger 
2542865d42cSLarry Finger uint oid_rt_dedicate_probe_hdl(struct oid_par_priv
2552865d42cSLarry Finger 				      *poid_par_priv)
2562865d42cSLarry Finger {
2579e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
2582865d42cSLarry Finger }
2592865d42cSLarry Finger 
2602865d42cSLarry Finger uint oid_rt_get_total_tx_bytes_hdl(struct oid_par_priv
2612865d42cSLarry Finger 					  *poid_par_priv)
2622865d42cSLarry Finger {
2632865d42cSLarry Finger 	struct _adapter *padapter = (struct _adapter *)
2642865d42cSLarry Finger 				    (poid_par_priv->adapter_context);
2652865d42cSLarry Finger 
2662865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
2679e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
2682865d42cSLarry Finger 	if (poid_par_priv->information_buf_len >= sizeof(u32)) {
2692865d42cSLarry Finger 		*(u32 *)poid_par_priv->information_buf =
2702865d42cSLarry Finger 						 padapter->xmitpriv.tx_bytes;
2712865d42cSLarry Finger 		*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
2722865d42cSLarry Finger 	} else
2739e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_INVALID_LENGTH;
2749e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
2752865d42cSLarry Finger }
2762865d42cSLarry Finger 
2772865d42cSLarry Finger uint oid_rt_get_total_rx_bytes_hdl(struct oid_par_priv
2782865d42cSLarry Finger 					  *poid_par_priv)
2792865d42cSLarry Finger {
2802865d42cSLarry Finger 	struct _adapter *padapter = (struct _adapter *)
2812865d42cSLarry Finger 				    (poid_par_priv->adapter_context);
2822865d42cSLarry Finger 
2832865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
2849e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
2852865d42cSLarry Finger 	if (poid_par_priv->information_buf_len >= sizeof(u32)) {
2862865d42cSLarry Finger 		*(u32 *)poid_par_priv->information_buf =
2872865d42cSLarry Finger 					   padapter->recvpriv.rx_bytes;
2882865d42cSLarry Finger 		*poid_par_priv->bytes_rw = poid_par_priv->
2892865d42cSLarry Finger 					   information_buf_len;
2902865d42cSLarry Finger 	} else
2919e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_INVALID_LENGTH;
2929e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
2932865d42cSLarry Finger }
2942865d42cSLarry Finger 
2952865d42cSLarry Finger uint oid_rt_current_tx_power_level_hdl(struct oid_par_priv
2962865d42cSLarry Finger 					      *poid_par_priv)
2972865d42cSLarry Finger {
2989e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
2992865d42cSLarry Finger }
3002865d42cSLarry Finger 
3012865d42cSLarry Finger uint oid_rt_get_enc_key_mismatch_count_hdl(struct oid_par_priv
3022865d42cSLarry Finger 						  *poid_par_priv)
3032865d42cSLarry Finger {
3042865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
3059e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
3069e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
3072865d42cSLarry Finger }
3082865d42cSLarry Finger 
3092865d42cSLarry Finger uint oid_rt_get_enc_key_match_count_hdl(struct oid_par_priv
3102865d42cSLarry Finger 					       *poid_par_priv)
3112865d42cSLarry Finger {
3122865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
3139e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
3149e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
3152865d42cSLarry Finger }
3162865d42cSLarry Finger 
3172865d42cSLarry Finger uint oid_rt_get_channel_hdl(struct oid_par_priv *poid_par_priv)
3182865d42cSLarry Finger {
3192865d42cSLarry Finger 	struct _adapter *padapter = (struct _adapter *)
3202865d42cSLarry Finger 				    (poid_par_priv->adapter_context);
3212865d42cSLarry Finger 	struct	mlme_priv *pmlmepriv = &padapter->mlmepriv;
3222865d42cSLarry Finger 	struct NDIS_802_11_CONFIGURATION *pnic_Config;
3232865d42cSLarry Finger 	u32   channelnum;
3242865d42cSLarry Finger 
3252865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
3269e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
3272865d42cSLarry Finger 	if ((check_fwstate(pmlmepriv, _FW_LINKED) == true) ||
3282865d42cSLarry Finger 	    (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == true))
3292865d42cSLarry Finger 		pnic_Config = &pmlmepriv->cur_network.network.Configuration;
3302865d42cSLarry Finger 	else
3312865d42cSLarry Finger 		pnic_Config = &padapter->registrypriv.dev_network.
3322865d42cSLarry Finger 			      Configuration;
3332865d42cSLarry Finger 	channelnum = pnic_Config->DSConfig;
3342865d42cSLarry Finger 	*(u32 *)poid_par_priv->information_buf = channelnum;
3352865d42cSLarry Finger 	*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
3369e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
3372865d42cSLarry Finger }
3382865d42cSLarry Finger 
3392865d42cSLarry Finger uint oid_rt_get_hardware_radio_off_hdl(struct oid_par_priv
3402865d42cSLarry Finger 			 *poid_par_priv)
3412865d42cSLarry Finger {
3422865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
3439e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
3449e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
3452865d42cSLarry Finger }
3462865d42cSLarry Finger 
3472865d42cSLarry Finger uint oid_rt_get_key_mismatch_hdl(struct oid_par_priv *poid_par_priv)
3482865d42cSLarry Finger {
3492865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
3509e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
3519e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
3522865d42cSLarry Finger }
3532865d42cSLarry Finger 
3542865d42cSLarry Finger uint oid_rt_supported_wireless_mode_hdl(struct oid_par_priv
3552865d42cSLarry Finger 					       *poid_par_priv)
3562865d42cSLarry Finger {
3572865d42cSLarry Finger 	u32 ulInfo = 0;
3582865d42cSLarry Finger 
3592865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
3609e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
3612865d42cSLarry Finger 	if (poid_par_priv->information_buf_len >= sizeof(u32)) {
3622865d42cSLarry Finger 		ulInfo |= 0x0100; /* WIRELESS_MODE_B */
3632865d42cSLarry Finger 		ulInfo |= 0x0200; /* WIRELESS_MODE_G */
3642865d42cSLarry Finger 		ulInfo |= 0x0400; /* WIRELESS_MODE_A */
3652865d42cSLarry Finger 		*(u32 *) poid_par_priv->information_buf = ulInfo;
3662865d42cSLarry Finger 		*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
3672865d42cSLarry Finger 	} else
3689e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_INVALID_LENGTH;
3699e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
3702865d42cSLarry Finger }
3712865d42cSLarry Finger 
3722865d42cSLarry Finger uint oid_rt_get_channel_list_hdl(struct oid_par_priv *poid_par_priv)
3732865d42cSLarry Finger {
3742865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
3759e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
3769e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
3772865d42cSLarry Finger }
3782865d42cSLarry Finger 
3792865d42cSLarry Finger uint oid_rt_get_scan_in_progress_hdl(struct oid_par_priv *poid_par_priv)
3802865d42cSLarry Finger {
3812865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
3829e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
3839e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
3842865d42cSLarry Finger }
3852865d42cSLarry Finger 
3862865d42cSLarry Finger 
3872865d42cSLarry Finger uint oid_rt_forced_data_rate_hdl(struct oid_par_priv *poid_par_priv)
3882865d42cSLarry Finger {
3899e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
3902865d42cSLarry Finger }
3912865d42cSLarry Finger 
3922865d42cSLarry Finger uint oid_rt_wireless_mode_for_scan_list_hdl(struct oid_par_priv
3932865d42cSLarry Finger 						   *poid_par_priv)
3942865d42cSLarry Finger {
3959e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
3962865d42cSLarry Finger }
3972865d42cSLarry Finger 
3982865d42cSLarry Finger uint oid_rt_get_bss_wireless_mode_hdl(struct oid_par_priv
3992865d42cSLarry Finger 					     *poid_par_priv)
4002865d42cSLarry Finger {
4012865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
4029e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
4039e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
4042865d42cSLarry Finger }
4052865d42cSLarry Finger 
4062865d42cSLarry Finger uint oid_rt_scan_with_magic_packet_hdl(struct oid_par_priv
4072865d42cSLarry Finger 					      *poid_par_priv)
4082865d42cSLarry Finger {
4099e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
4102865d42cSLarry Finger }
4112865d42cSLarry Finger 
4122865d42cSLarry Finger uint oid_rt_ap_get_associated_station_list_hdl(struct oid_par_priv
4132865d42cSLarry Finger 						      *poid_par_priv)
4142865d42cSLarry Finger {
4152865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
4169e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
4179e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
4182865d42cSLarry Finger }
4192865d42cSLarry Finger 
4202865d42cSLarry Finger uint oid_rt_ap_switch_into_ap_mode_hdl(struct oid_par_priv*
4212865d42cSLarry Finger 					      poid_par_priv)
4222865d42cSLarry Finger {
4239e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
4242865d42cSLarry Finger }
4252865d42cSLarry Finger 
4262865d42cSLarry Finger uint oid_rt_ap_supported_hdl(struct oid_par_priv *poid_par_priv)
4272865d42cSLarry Finger {
4289e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
4292865d42cSLarry Finger }
4302865d42cSLarry Finger 
4312865d42cSLarry Finger uint oid_rt_ap_set_passphrase_hdl(struct oid_par_priv *poid_par_priv)
4322865d42cSLarry Finger {
4332865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != SET_OID)
4349e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
4359e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
4362865d42cSLarry Finger }
4372865d42cSLarry Finger 
4382865d42cSLarry Finger uint oid_rt_pro_rf_write_registry_hdl(struct oid_par_priv*
4392865d42cSLarry Finger 					     poid_par_priv)
4402865d42cSLarry Finger {
4419e01b9f3SPrzemo Firszt 	uint status = RNDIS_STATUS_SUCCESS;
4422865d42cSLarry Finger 	struct _adapter *Adapter = (struct _adapter *)
4432865d42cSLarry Finger 			(poid_par_priv->adapter_context);
4442865d42cSLarry Finger 
4452865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != SET_OID) /* QUERY_OID */
4469e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
4472865d42cSLarry Finger 	if (poid_par_priv->information_buf_len ==
4482865d42cSLarry Finger 	   (sizeof(unsigned long) * 3)) {
4492865d42cSLarry Finger 		if (!r8712_setrfreg_cmd(Adapter,
4502865d42cSLarry Finger 			*(unsigned char *)poid_par_priv->information_buf,
4512865d42cSLarry Finger 			(unsigned long)(*((unsigned long *)
4522865d42cSLarry Finger 					poid_par_priv->information_buf + 2))))
4539e01b9f3SPrzemo Firszt 			status = RNDIS_STATUS_NOT_ACCEPTED;
4542865d42cSLarry Finger 	} else
4559e01b9f3SPrzemo Firszt 		status = RNDIS_STATUS_INVALID_LENGTH;
4562865d42cSLarry Finger 	return status;
4572865d42cSLarry Finger }
4582865d42cSLarry Finger 
4592865d42cSLarry Finger uint oid_rt_pro_rf_read_registry_hdl(struct oid_par_priv *poid_par_priv)
4602865d42cSLarry Finger {
4619e01b9f3SPrzemo Firszt 	uint status = RNDIS_STATUS_SUCCESS;
4622865d42cSLarry Finger 	struct _adapter *Adapter = (struct _adapter *)
4632865d42cSLarry Finger 			(poid_par_priv->adapter_context);
4642865d42cSLarry Finger 
4652865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != SET_OID) /* QUERY_OID */
4669e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
4672865d42cSLarry Finger 	if (poid_par_priv->information_buf_len == (sizeof(unsigned long)*3)) {
4682865d42cSLarry Finger 		if (Adapter->mppriv.act_in_progress == true)
4699e01b9f3SPrzemo Firszt 			status = RNDIS_STATUS_NOT_ACCEPTED;
4702865d42cSLarry Finger 		else {
4712865d42cSLarry Finger 			/* init workparam */
4722865d42cSLarry Finger 			Adapter->mppriv.act_in_progress = true;
4732865d42cSLarry Finger 			Adapter->mppriv.workparam.bcompleted = false;
4742865d42cSLarry Finger 			Adapter->mppriv.workparam.act_type = MPT_READ_RF;
4752865d42cSLarry Finger 			Adapter->mppriv.workparam.io_offset = *(unsigned long *)
4762865d42cSLarry Finger 						poid_par_priv->information_buf;
4772865d42cSLarry Finger 			Adapter->mppriv.workparam.io_value = 0xcccccccc;
4782865d42cSLarry Finger 
4792865d42cSLarry Finger 		/* RegOffsetValue	- The offset of RF register to read.
4802865d42cSLarry Finger 		 * RegDataWidth	- The data width of RF register to read.
4812865d42cSLarry Finger 		 * RegDataValue	- The value to read.
4822865d42cSLarry Finger 		 * RegOffsetValue = *((unsigned long *)InformationBuffer);
4832865d42cSLarry Finger 		 * RegDataWidth = *((unsigned long *)InformationBuffer+1);
4842865d42cSLarry Finger 		 * RegDataValue =  *((unsigned long *)InformationBuffer+2);
4852865d42cSLarry Finger 		 */
4862865d42cSLarry Finger 			if (!r8712_getrfreg_cmd(Adapter,
4872865d42cSLarry Finger 			    *(unsigned char *)poid_par_priv->information_buf,
4882865d42cSLarry Finger 			    (unsigned char *)&Adapter->mppriv.workparam.
4892865d42cSLarry Finger 			    io_value))
4909e01b9f3SPrzemo Firszt 				status = RNDIS_STATUS_NOT_ACCEPTED;
4912865d42cSLarry Finger 		}
4922865d42cSLarry Finger 	} else
4939e01b9f3SPrzemo Firszt 		status = RNDIS_STATUS_INVALID_LENGTH;
4942865d42cSLarry Finger 	return status;
4952865d42cSLarry Finger }
4962865d42cSLarry Finger 
4972865d42cSLarry Finger enum _CONNECT_STATE_ {
4982865d42cSLarry Finger 	CHECKINGSTATUS,
4992865d42cSLarry Finger 	ASSOCIATED,
5002865d42cSLarry Finger 	ADHOCMODE,
5012865d42cSLarry Finger 	NOTASSOCIATED
5022865d42cSLarry Finger };
5032865d42cSLarry Finger 
5042865d42cSLarry Finger uint oid_rt_get_connect_state_hdl(struct oid_par_priv *poid_par_priv)
5052865d42cSLarry Finger {
5062865d42cSLarry Finger 	struct _adapter *padapter = (struct _adapter *)
5072865d42cSLarry Finger 				     (poid_par_priv->adapter_context);
5082865d42cSLarry Finger 	struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
5092865d42cSLarry Finger 	u32 ulInfo;
5102865d42cSLarry Finger 
5112865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
5129e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
5132865d42cSLarry Finger 	/* nStatus==0	CheckingStatus
5142865d42cSLarry Finger 	 * nStatus==1	Associated
5152865d42cSLarry Finger 	 * nStatus==2	AdHocMode
5162865d42cSLarry Finger 	 * nStatus==3	NotAssociated
5172865d42cSLarry Finger 	 */
5182865d42cSLarry Finger 	if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == true)
5192865d42cSLarry Finger 		ulInfo = CHECKINGSTATUS;
5202865d42cSLarry Finger 	else if (check_fwstate(pmlmepriv, _FW_LINKED) == true)
5212865d42cSLarry Finger 		ulInfo = ASSOCIATED;
5222865d42cSLarry Finger 	else if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == true)
5232865d42cSLarry Finger 		ulInfo = ADHOCMODE;
5242865d42cSLarry Finger 	else
5252865d42cSLarry Finger 		ulInfo = NOTASSOCIATED ;
5262865d42cSLarry Finger 	*(u32 *)poid_par_priv->information_buf = ulInfo;
5272865d42cSLarry Finger 	*poid_par_priv->bytes_rw =  poid_par_priv->information_buf_len;
5289e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
5292865d42cSLarry Finger }
5302865d42cSLarry Finger 
5312865d42cSLarry Finger uint oid_rt_set_default_key_id_hdl(struct oid_par_priv *poid_par_priv)
5322865d42cSLarry Finger {
5332865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != SET_OID)
5349e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
5359e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
5362865d42cSLarry Finger }
537