1e24c1f86SMichael Straube // SPDX-License-Identifier: GPL-2.0
22865d42cSLarry Finger /******************************************************************************
32865d42cSLarry Finger  * rtl871x_ioctl_rtl.c
42865d42cSLarry Finger  *
52865d42cSLarry Finger  * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved.
62865d42cSLarry Finger  * Linux device driver for RTL8192SU
72865d42cSLarry Finger  *
82865d42cSLarry Finger  * Modifications for inclusion into the Linux staging tree are
92865d42cSLarry Finger  * Copyright(c) 2010 Larry Finger. All rights reserved.
102865d42cSLarry Finger  *
112865d42cSLarry Finger  * Contact information:
122865d42cSLarry Finger  * WLAN FAE <wlanfae@realtek.com>
132865d42cSLarry Finger  * Larry Finger <Larry.Finger@lwfinger.net>
142865d42cSLarry Finger  *
152865d42cSLarry Finger  ******************************************************************************/
162865d42cSLarry Finger 
172865d42cSLarry Finger #define  _RTL871X_IOCTL_RTL_C_
182865d42cSLarry Finger 
199e01b9f3SPrzemo Firszt #include <linux/rndis.h>
202865d42cSLarry Finger #include "osdep_service.h"
212865d42cSLarry Finger #include "drv_types.h"
222865d42cSLarry Finger #include "wlan_bssdef.h"
232865d42cSLarry Finger #include "wifi.h"
242865d42cSLarry Finger #include "rtl871x_ioctl.h"
252865d42cSLarry Finger #include "rtl871x_ioctl_set.h"
262865d42cSLarry Finger #include "rtl871x_ioctl_rtl.h"
272865d42cSLarry Finger #include "mp_custom_oid.h"
282865d42cSLarry Finger #include "rtl871x_mp.h"
292865d42cSLarry Finger #include "rtl871x_mp_ioctl.h"
302865d42cSLarry Finger 
oid_rt_get_signal_quality_hdl(struct oid_par_priv * poid_par_priv)312865d42cSLarry Finger uint oid_rt_get_signal_quality_hdl(struct oid_par_priv *poid_par_priv)
322865d42cSLarry Finger {
332865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
349e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
359e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
362865d42cSLarry Finger }
372865d42cSLarry Finger 
oid_rt_get_small_packet_crc_hdl(struct oid_par_priv * poid_par_priv)382865d42cSLarry Finger uint oid_rt_get_small_packet_crc_hdl(struct oid_par_priv *poid_par_priv)
392865d42cSLarry Finger {
40eaf0e796SLucas Tanure 	struct _adapter *padapter = poid_par_priv->adapter_context;
412865d42cSLarry Finger 
422865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
439e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
442865d42cSLarry Finger 	if (poid_par_priv->information_buf_len >=  sizeof(u32)) {
452865d42cSLarry Finger 		*(u32 *)poid_par_priv->information_buf =
462865d42cSLarry Finger 				padapter->recvpriv.rx_smallpacket_crcerr;
472865d42cSLarry Finger 		*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
48168a2c10SLuis de Bethencourt 	} else {
499e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_INVALID_LENGTH;
50168a2c10SLuis de Bethencourt 	}
519e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
522865d42cSLarry Finger }
532865d42cSLarry Finger 
oid_rt_get_middle_packet_crc_hdl(struct oid_par_priv * poid_par_priv)542865d42cSLarry Finger uint oid_rt_get_middle_packet_crc_hdl(struct oid_par_priv *poid_par_priv)
552865d42cSLarry Finger {
56eaf0e796SLucas Tanure 	struct _adapter *padapter = poid_par_priv->adapter_context;
572865d42cSLarry Finger 
582865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
599e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
602865d42cSLarry Finger 	if (poid_par_priv->information_buf_len >=  sizeof(u32)) {
612865d42cSLarry Finger 		*(u32 *)poid_par_priv->information_buf =
622865d42cSLarry Finger 				padapter->recvpriv.rx_middlepacket_crcerr;
632865d42cSLarry Finger 		*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
64168a2c10SLuis de Bethencourt 	} else {
659e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_INVALID_LENGTH;
66168a2c10SLuis de Bethencourt 	}
679e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
682865d42cSLarry Finger }
692865d42cSLarry Finger 
oid_rt_get_large_packet_crc_hdl(struct oid_par_priv * poid_par_priv)702865d42cSLarry Finger uint oid_rt_get_large_packet_crc_hdl(struct oid_par_priv *poid_par_priv)
712865d42cSLarry Finger {
72eaf0e796SLucas Tanure 	struct _adapter *padapter = poid_par_priv->adapter_context;
732865d42cSLarry Finger 
742865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
759e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
762865d42cSLarry Finger 	if (poid_par_priv->information_buf_len >=  sizeof(u32)) {
772865d42cSLarry Finger 		*(u32 *)poid_par_priv->information_buf =
782865d42cSLarry Finger 				 padapter->recvpriv.rx_largepacket_crcerr;
792865d42cSLarry Finger 		*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
80168a2c10SLuis de Bethencourt 	} else {
819e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_INVALID_LENGTH;
82168a2c10SLuis de Bethencourt 	}
839e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
842865d42cSLarry Finger }
852865d42cSLarry Finger 
oid_rt_get_tx_retry_hdl(struct oid_par_priv * poid_par_priv)862865d42cSLarry Finger uint oid_rt_get_tx_retry_hdl(struct oid_par_priv *poid_par_priv)
872865d42cSLarry Finger {
882865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
899e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
909e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
912865d42cSLarry Finger }
922865d42cSLarry Finger 
oid_rt_get_rx_retry_hdl(struct oid_par_priv * poid_par_priv)932865d42cSLarry Finger uint oid_rt_get_rx_retry_hdl(struct oid_par_priv *poid_par_priv)
942865d42cSLarry Finger {
952865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
969e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
972865d42cSLarry Finger 	*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
989e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
992865d42cSLarry Finger }
1002865d42cSLarry Finger 
oid_rt_get_rx_total_packet_hdl(struct oid_par_priv * poid_par_priv)1012865d42cSLarry Finger uint oid_rt_get_rx_total_packet_hdl(struct oid_par_priv *poid_par_priv)
1022865d42cSLarry Finger {
103eaf0e796SLucas Tanure 	struct _adapter *padapter = poid_par_priv->adapter_context;
1042865d42cSLarry Finger 
1052865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
1069e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
1072865d42cSLarry Finger 	if (poid_par_priv->information_buf_len >=  sizeof(u32)) {
1082865d42cSLarry Finger 		*(u32 *)poid_par_priv->information_buf =
1092865d42cSLarry Finger 					 padapter->recvpriv.rx_pkts +
1102865d42cSLarry Finger 					 padapter->recvpriv.rx_drop;
1112865d42cSLarry Finger 		*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
112168a2c10SLuis de Bethencourt 	} else {
1139e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_INVALID_LENGTH;
114168a2c10SLuis de Bethencourt 	}
1159e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
1162865d42cSLarry Finger }
1172865d42cSLarry Finger 
oid_rt_get_tx_beacon_ok_hdl(struct oid_par_priv * poid_par_priv)1182865d42cSLarry Finger uint oid_rt_get_tx_beacon_ok_hdl(struct oid_par_priv *poid_par_priv)
1192865d42cSLarry Finger {
1202865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
1219e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
1229e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
1232865d42cSLarry Finger }
1242865d42cSLarry Finger 
oid_rt_get_tx_beacon_err_hdl(struct oid_par_priv * poid_par_priv)1252865d42cSLarry Finger uint oid_rt_get_tx_beacon_err_hdl(struct oid_par_priv *poid_par_priv)
1262865d42cSLarry Finger {
1272865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
1289e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
1299e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
1302865d42cSLarry Finger }
1312865d42cSLarry Finger 
oid_rt_get_rx_icv_err_hdl(struct oid_par_priv * poid_par_priv)1322865d42cSLarry Finger uint oid_rt_get_rx_icv_err_hdl(struct oid_par_priv *poid_par_priv)
1332865d42cSLarry Finger {
134eaf0e796SLucas Tanure 	struct _adapter *padapter = poid_par_priv->adapter_context;
1352865d42cSLarry Finger 
1362865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
1379e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
1382865d42cSLarry Finger 	if (poid_par_priv->information_buf_len >= sizeof(u32)) {
1392865d42cSLarry Finger 		*(uint *)poid_par_priv->information_buf =
1402865d42cSLarry Finger 					 padapter->recvpriv.rx_icv_err;
1412865d42cSLarry Finger 		*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
142168a2c10SLuis de Bethencourt 	} else {
1439e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_INVALID_LENGTH;
144168a2c10SLuis de Bethencourt 	}
1459e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
1462865d42cSLarry Finger }
1472865d42cSLarry Finger 
oid_rt_set_encryption_algorithm_hdl(struct oid_par_priv * poid_par_priv)1482865d42cSLarry Finger uint oid_rt_set_encryption_algorithm_hdl(struct oid_par_priv
1492865d42cSLarry Finger 						*poid_par_priv)
1502865d42cSLarry Finger {
1512865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != SET_OID)
1529e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
1539e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
1542865d42cSLarry Finger }
1552865d42cSLarry Finger 
oid_rt_get_preamble_mode_hdl(struct oid_par_priv * poid_par_priv)1562865d42cSLarry Finger uint oid_rt_get_preamble_mode_hdl(struct oid_par_priv *poid_par_priv)
1572865d42cSLarry Finger {
158eaf0e796SLucas Tanure 	struct _adapter *padapter = poid_par_priv->adapter_context;
1592865d42cSLarry Finger 	u32 preamblemode = 0;
1602865d42cSLarry Finger 
1612865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
1629e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
1632865d42cSLarry Finger 	if (poid_par_priv->information_buf_len >= sizeof(u32)) {
1642865d42cSLarry Finger 		if (padapter->registrypriv.preamble == PREAMBLE_LONG)
1652865d42cSLarry Finger 			preamblemode = 0;
1662865d42cSLarry Finger 		else if (padapter->registrypriv.preamble == PREAMBLE_AUTO)
1672865d42cSLarry Finger 			preamblemode = 1;
1682865d42cSLarry Finger 		else if (padapter->registrypriv.preamble == PREAMBLE_SHORT)
1692865d42cSLarry Finger 			preamblemode = 2;
1702865d42cSLarry Finger 		*(u32 *)poid_par_priv->information_buf = preamblemode;
1712865d42cSLarry Finger 		*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
172168a2c10SLuis de Bethencourt 	} else {
1739e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_INVALID_LENGTH;
174168a2c10SLuis de Bethencourt 	}
1759e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
1762865d42cSLarry Finger }
1772865d42cSLarry Finger 
oid_rt_get_ap_ip_hdl(struct oid_par_priv * poid_par_priv)1782865d42cSLarry Finger uint oid_rt_get_ap_ip_hdl(struct oid_par_priv *poid_par_priv)
1792865d42cSLarry Finger {
1802865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
1819e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
1829e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
1832865d42cSLarry Finger }
1842865d42cSLarry Finger 
oid_rt_get_channelplan_hdl(struct oid_par_priv * poid_par_priv)1852865d42cSLarry Finger uint oid_rt_get_channelplan_hdl(struct oid_par_priv *poid_par_priv)
1862865d42cSLarry Finger {
187eaf0e796SLucas Tanure 	struct _adapter *padapter = poid_par_priv->adapter_context;
1882865d42cSLarry Finger 	struct eeprom_priv *peeprompriv = &padapter->eeprompriv;
1892865d42cSLarry Finger 
1902865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
1919e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
1922865d42cSLarry Finger 	*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
1932865d42cSLarry Finger 	*(u16 *)poid_par_priv->information_buf = peeprompriv->channel_plan;
1949e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
1952865d42cSLarry Finger }
1962865d42cSLarry Finger 
oid_rt_set_channelplan_hdl(struct oid_par_priv * poid_par_priv)1972865d42cSLarry Finger uint oid_rt_set_channelplan_hdl(struct oid_par_priv
1982865d42cSLarry Finger 				       *poid_par_priv)
1992865d42cSLarry Finger {
200eaf0e796SLucas Tanure 	struct _adapter *padapter = poid_par_priv->adapter_context;
2012865d42cSLarry Finger 	struct eeprom_priv *peeprompriv = &padapter->eeprompriv;
2022865d42cSLarry Finger 
2032865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != SET_OID)
2049e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
2052865d42cSLarry Finger 	peeprompriv->channel_plan = *(u16 *)poid_par_priv->information_buf;
2069e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
2072865d42cSLarry Finger }
2082865d42cSLarry Finger 
oid_rt_set_preamble_mode_hdl(struct oid_par_priv * poid_par_priv)2092865d42cSLarry Finger uint oid_rt_set_preamble_mode_hdl(struct oid_par_priv
2102865d42cSLarry Finger 					 *poid_par_priv)
2112865d42cSLarry Finger {
212eaf0e796SLucas Tanure 	struct _adapter *padapter = poid_par_priv->adapter_context;
2132865d42cSLarry Finger 	u32 preamblemode = 0;
2142865d42cSLarry Finger 
2152865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != SET_OID)
2169e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
2172865d42cSLarry Finger 	if (poid_par_priv->information_buf_len >= sizeof(u32)) {
2182865d42cSLarry Finger 		preamblemode = *(u32 *)poid_par_priv->information_buf;
2192865d42cSLarry Finger 		if (preamblemode == 0)
2202865d42cSLarry Finger 			padapter->registrypriv.preamble = PREAMBLE_LONG;
2212865d42cSLarry Finger 		else if (preamblemode == 1)
2222865d42cSLarry Finger 			padapter->registrypriv.preamble = PREAMBLE_AUTO;
2232865d42cSLarry Finger 		else if (preamblemode == 2)
2242865d42cSLarry Finger 			padapter->registrypriv.preamble = PREAMBLE_SHORT;
2252865d42cSLarry Finger 		*(u32 *)poid_par_priv->information_buf = preamblemode;
2262865d42cSLarry Finger 		*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
227168a2c10SLuis de Bethencourt 	} else {
2289e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_INVALID_LENGTH;
229168a2c10SLuis de Bethencourt 	}
2309e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
2312865d42cSLarry Finger }
2322865d42cSLarry Finger 
oid_rt_set_bcn_intvl_hdl(struct oid_par_priv * poid_par_priv)2332865d42cSLarry Finger uint oid_rt_set_bcn_intvl_hdl(struct oid_par_priv *poid_par_priv)
2342865d42cSLarry Finger {
2352865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != SET_OID)
2369e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
2379e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
2382865d42cSLarry Finger }
2392865d42cSLarry Finger 
oid_rt_dedicate_probe_hdl(struct oid_par_priv * poid_par_priv)2402865d42cSLarry Finger uint oid_rt_dedicate_probe_hdl(struct oid_par_priv
2412865d42cSLarry Finger 				      *poid_par_priv)
2422865d42cSLarry Finger {
2439e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
2442865d42cSLarry Finger }
2452865d42cSLarry Finger 
oid_rt_get_total_tx_bytes_hdl(struct oid_par_priv * poid_par_priv)2462865d42cSLarry Finger uint oid_rt_get_total_tx_bytes_hdl(struct oid_par_priv
2472865d42cSLarry Finger 					  *poid_par_priv)
2482865d42cSLarry Finger {
249eaf0e796SLucas Tanure 	struct _adapter *padapter = poid_par_priv->adapter_context;
2502865d42cSLarry Finger 
2512865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
2529e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
2532865d42cSLarry Finger 	if (poid_par_priv->information_buf_len >= sizeof(u32)) {
2542865d42cSLarry Finger 		*(u32 *)poid_par_priv->information_buf =
2552865d42cSLarry Finger 						 padapter->xmitpriv.tx_bytes;
2562865d42cSLarry Finger 		*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
257168a2c10SLuis de Bethencourt 	} else {
2589e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_INVALID_LENGTH;
259168a2c10SLuis de Bethencourt 	}
2609e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
2612865d42cSLarry Finger }
2622865d42cSLarry Finger 
oid_rt_get_total_rx_bytes_hdl(struct oid_par_priv * poid_par_priv)2632865d42cSLarry Finger uint oid_rt_get_total_rx_bytes_hdl(struct oid_par_priv
2642865d42cSLarry Finger 					  *poid_par_priv)
2652865d42cSLarry Finger {
266eaf0e796SLucas Tanure 	struct _adapter *padapter = poid_par_priv->adapter_context;
2672865d42cSLarry Finger 
2682865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
2699e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
2702865d42cSLarry Finger 	if (poid_par_priv->information_buf_len >= sizeof(u32)) {
2712865d42cSLarry Finger 		*(u32 *)poid_par_priv->information_buf =
2722865d42cSLarry Finger 					   padapter->recvpriv.rx_bytes;
27350d94eacSDing-Chi Wang 		*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
274168a2c10SLuis de Bethencourt 	} else {
2759e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_INVALID_LENGTH;
276168a2c10SLuis de Bethencourt 	}
2779e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
2782865d42cSLarry Finger }
2792865d42cSLarry Finger 
oid_rt_current_tx_power_level_hdl(struct oid_par_priv * poid_par_priv)2802865d42cSLarry Finger uint oid_rt_current_tx_power_level_hdl(struct oid_par_priv
2812865d42cSLarry Finger 					      *poid_par_priv)
2822865d42cSLarry Finger {
2839e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
2842865d42cSLarry Finger }
2852865d42cSLarry Finger 
oid_rt_get_enc_key_mismatch_count_hdl(struct oid_par_priv * poid_par_priv)2862865d42cSLarry Finger uint oid_rt_get_enc_key_mismatch_count_hdl(struct oid_par_priv
2872865d42cSLarry Finger 						  *poid_par_priv)
2882865d42cSLarry Finger {
2892865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
2909e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
2919e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
2922865d42cSLarry Finger }
2932865d42cSLarry Finger 
oid_rt_get_enc_key_match_count_hdl(struct oid_par_priv * poid_par_priv)2942865d42cSLarry Finger uint oid_rt_get_enc_key_match_count_hdl(struct oid_par_priv
2952865d42cSLarry Finger 					       *poid_par_priv)
2962865d42cSLarry Finger {
2972865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
2989e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
2999e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
3002865d42cSLarry Finger }
3012865d42cSLarry Finger 
oid_rt_get_channel_hdl(struct oid_par_priv * poid_par_priv)3022865d42cSLarry Finger uint oid_rt_get_channel_hdl(struct oid_par_priv *poid_par_priv)
3032865d42cSLarry Finger {
304eaf0e796SLucas Tanure 	struct _adapter *padapter = poid_par_priv->adapter_context;
3052865d42cSLarry Finger 	struct	mlme_priv *pmlmepriv = &padapter->mlmepriv;
3062865d42cSLarry Finger 	struct NDIS_802_11_CONFIGURATION *pnic_Config;
3072865d42cSLarry Finger 	u32   channelnum;
3082865d42cSLarry Finger 
3092865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
3109e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
3111ca96884SLuis de Bethencourt 	if (check_fwstate(pmlmepriv, _FW_LINKED) ||
3121ca96884SLuis de Bethencourt 	    check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE))
3132865d42cSLarry Finger 		pnic_Config = &pmlmepriv->cur_network.network.Configuration;
3142865d42cSLarry Finger 	else
31550d94eacSDing-Chi Wang 		pnic_Config = &padapter->registrypriv.dev_network.Configuration;
3162865d42cSLarry Finger 	channelnum = pnic_Config->DSConfig;
3172865d42cSLarry Finger 	*(u32 *)poid_par_priv->information_buf = channelnum;
3182865d42cSLarry Finger 	*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
3199e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
3202865d42cSLarry Finger }
3212865d42cSLarry Finger 
oid_rt_get_hardware_radio_off_hdl(struct oid_par_priv * poid_par_priv)3222865d42cSLarry Finger uint oid_rt_get_hardware_radio_off_hdl(struct oid_par_priv
3232865d42cSLarry Finger 			 *poid_par_priv)
3242865d42cSLarry Finger {
3252865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
3269e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
3279e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
3282865d42cSLarry Finger }
3292865d42cSLarry Finger 
oid_rt_get_key_mismatch_hdl(struct oid_par_priv * poid_par_priv)3302865d42cSLarry Finger uint oid_rt_get_key_mismatch_hdl(struct oid_par_priv *poid_par_priv)
3312865d42cSLarry Finger {
3322865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
3339e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
3349e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
3352865d42cSLarry Finger }
3362865d42cSLarry Finger 
oid_rt_supported_wireless_mode_hdl(struct oid_par_priv * poid_par_priv)3372865d42cSLarry Finger uint oid_rt_supported_wireless_mode_hdl(struct oid_par_priv
3382865d42cSLarry Finger 					       *poid_par_priv)
3392865d42cSLarry Finger {
3402865d42cSLarry Finger 	u32 ulInfo = 0;
3412865d42cSLarry Finger 
3422865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
3439e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
3442865d42cSLarry Finger 	if (poid_par_priv->information_buf_len >= sizeof(u32)) {
3452865d42cSLarry Finger 		ulInfo |= 0x0100; /* WIRELESS_MODE_B */
3462865d42cSLarry Finger 		ulInfo |= 0x0200; /* WIRELESS_MODE_G */
3472865d42cSLarry Finger 		ulInfo |= 0x0400; /* WIRELESS_MODE_A */
3482865d42cSLarry Finger 		*(u32 *) poid_par_priv->information_buf = ulInfo;
3492865d42cSLarry Finger 		*poid_par_priv->bytes_rw = poid_par_priv->information_buf_len;
350168a2c10SLuis de Bethencourt 	} else {
3519e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_INVALID_LENGTH;
352168a2c10SLuis de Bethencourt 	}
3539e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
3542865d42cSLarry Finger }
3552865d42cSLarry Finger 
oid_rt_get_channel_list_hdl(struct oid_par_priv * poid_par_priv)3562865d42cSLarry Finger uint oid_rt_get_channel_list_hdl(struct oid_par_priv *poid_par_priv)
3572865d42cSLarry Finger {
3582865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
3599e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
3609e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
3612865d42cSLarry Finger }
3622865d42cSLarry Finger 
oid_rt_get_scan_in_progress_hdl(struct oid_par_priv * poid_par_priv)3632865d42cSLarry Finger uint oid_rt_get_scan_in_progress_hdl(struct oid_par_priv *poid_par_priv)
3642865d42cSLarry Finger {
3652865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
3669e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
3679e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
3682865d42cSLarry Finger }
3692865d42cSLarry Finger 
oid_rt_forced_data_rate_hdl(struct oid_par_priv * poid_par_priv)3702865d42cSLarry Finger uint oid_rt_forced_data_rate_hdl(struct oid_par_priv *poid_par_priv)
3712865d42cSLarry Finger {
3729e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
3732865d42cSLarry Finger }
3742865d42cSLarry Finger 
oid_rt_wireless_mode_for_scan_list_hdl(struct oid_par_priv * poid_par_priv)3752865d42cSLarry Finger uint oid_rt_wireless_mode_for_scan_list_hdl(struct oid_par_priv
3762865d42cSLarry Finger 						   *poid_par_priv)
3772865d42cSLarry Finger {
3789e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
3792865d42cSLarry Finger }
3802865d42cSLarry Finger 
oid_rt_get_bss_wireless_mode_hdl(struct oid_par_priv * poid_par_priv)3812865d42cSLarry Finger uint oid_rt_get_bss_wireless_mode_hdl(struct oid_par_priv
3822865d42cSLarry Finger 					     *poid_par_priv)
3832865d42cSLarry Finger {
3842865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
3859e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
3869e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
3872865d42cSLarry Finger }
3882865d42cSLarry Finger 
oid_rt_scan_with_magic_packet_hdl(struct oid_par_priv * poid_par_priv)3892865d42cSLarry Finger uint oid_rt_scan_with_magic_packet_hdl(struct oid_par_priv
3902865d42cSLarry Finger 					      *poid_par_priv)
3912865d42cSLarry Finger {
3929e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
3932865d42cSLarry Finger }
3942865d42cSLarry Finger 
oid_rt_ap_get_associated_station_list_hdl(struct oid_par_priv * poid_par_priv)3952865d42cSLarry Finger uint oid_rt_ap_get_associated_station_list_hdl(struct oid_par_priv
3962865d42cSLarry Finger 						      *poid_par_priv)
3972865d42cSLarry Finger {
3982865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
3999e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
4009e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
4012865d42cSLarry Finger }
4022865d42cSLarry Finger 
oid_rt_ap_switch_into_ap_mode_hdl(struct oid_par_priv * poid_par_priv)4032865d42cSLarry Finger uint oid_rt_ap_switch_into_ap_mode_hdl(struct oid_par_priv*
4042865d42cSLarry Finger 					      poid_par_priv)
4052865d42cSLarry Finger {
4069e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
4072865d42cSLarry Finger }
4082865d42cSLarry Finger 
oid_rt_ap_supported_hdl(struct oid_par_priv * poid_par_priv)4092865d42cSLarry Finger uint oid_rt_ap_supported_hdl(struct oid_par_priv *poid_par_priv)
4102865d42cSLarry Finger {
4119e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
4122865d42cSLarry Finger }
4132865d42cSLarry Finger 
oid_rt_ap_set_passphrase_hdl(struct oid_par_priv * poid_par_priv)4142865d42cSLarry Finger uint oid_rt_ap_set_passphrase_hdl(struct oid_par_priv *poid_par_priv)
4152865d42cSLarry Finger {
4162865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != SET_OID)
4179e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
4189e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
4192865d42cSLarry Finger }
4202865d42cSLarry Finger 
oid_rt_pro_rf_write_registry_hdl(struct oid_par_priv * poid_par_priv)4212865d42cSLarry Finger uint oid_rt_pro_rf_write_registry_hdl(struct oid_par_priv*
4222865d42cSLarry Finger 					     poid_par_priv)
4232865d42cSLarry Finger {
4249e01b9f3SPrzemo Firszt 	uint status = RNDIS_STATUS_SUCCESS;
425eaf0e796SLucas Tanure 	struct _adapter *Adapter = poid_par_priv->adapter_context;
4262865d42cSLarry Finger 
4272865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != SET_OID) /* QUERY_OID */
4289e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
4292865d42cSLarry Finger 	if (poid_par_priv->information_buf_len ==
4302865d42cSLarry Finger 	   (sizeof(unsigned long) * 3)) {
431a5dedb5cSNishka Dasgupta 		if (r8712_setrfreg_cmd(Adapter,
4322865d42cSLarry Finger 			*(unsigned char *)poid_par_priv->information_buf,
4332865d42cSLarry Finger 			(unsigned long)(*((unsigned long *)
4342865d42cSLarry Finger 					poid_par_priv->information_buf + 2))))
4359e01b9f3SPrzemo Firszt 			status = RNDIS_STATUS_NOT_ACCEPTED;
436168a2c10SLuis de Bethencourt 	} else {
4379e01b9f3SPrzemo Firszt 		status = RNDIS_STATUS_INVALID_LENGTH;
438168a2c10SLuis de Bethencourt 	}
4392865d42cSLarry Finger 	return status;
4402865d42cSLarry Finger }
4412865d42cSLarry Finger 
oid_rt_pro_rf_read_registry_hdl(struct oid_par_priv * poid_par_priv)4422865d42cSLarry Finger uint oid_rt_pro_rf_read_registry_hdl(struct oid_par_priv *poid_par_priv)
4432865d42cSLarry Finger {
4449e01b9f3SPrzemo Firszt 	uint status = RNDIS_STATUS_SUCCESS;
445eaf0e796SLucas Tanure 	struct _adapter *Adapter = poid_par_priv->adapter_context;
4462865d42cSLarry Finger 
4472865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != SET_OID) /* QUERY_OID */
4489e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
4494ef2de5aSLuis de Bethencourt 	if (poid_par_priv->information_buf_len == (sizeof(unsigned long) *
4504ef2de5aSLuis de Bethencourt 						   3)) {
451168a2c10SLuis de Bethencourt 		if (Adapter->mppriv.act_in_progress) {
4529e01b9f3SPrzemo Firszt 			status = RNDIS_STATUS_NOT_ACCEPTED;
453168a2c10SLuis de Bethencourt 		} else {
4542865d42cSLarry Finger 			/* init workparam */
4552865d42cSLarry Finger 			Adapter->mppriv.act_in_progress = true;
4562865d42cSLarry Finger 			Adapter->mppriv.workparam.bcompleted = false;
4572865d42cSLarry Finger 			Adapter->mppriv.workparam.act_type = MPT_READ_RF;
4582865d42cSLarry Finger 			Adapter->mppriv.workparam.io_offset = *(unsigned long *)
4592865d42cSLarry Finger 						poid_par_priv->information_buf;
4602865d42cSLarry Finger 			Adapter->mppriv.workparam.io_value = 0xcccccccc;
4612865d42cSLarry Finger 
4622865d42cSLarry Finger 		/* RegOffsetValue	- The offset of RF register to read.
4632865d42cSLarry Finger 		 * RegDataWidth	- The data width of RF register to read.
4642865d42cSLarry Finger 		 * RegDataValue	- The value to read.
4652865d42cSLarry Finger 		 * RegOffsetValue = *((unsigned long *)InformationBuffer);
4662865d42cSLarry Finger 		 * RegDataWidth = *((unsigned long *)InformationBuffer+1);
4672865d42cSLarry Finger 		 * RegDataValue =  *((unsigned long *)InformationBuffer+2);
4682865d42cSLarry Finger 		 */
4699839208eSNishka Dasgupta 			if (r8712_getrfreg_cmd(Adapter,
4702865d42cSLarry Finger 			    *(unsigned char *)poid_par_priv->information_buf,
47150d94eacSDing-Chi Wang 			    (unsigned char *)&Adapter->mppriv.workparam.io_value
47250d94eacSDing-Chi Wang 			    ))
4739e01b9f3SPrzemo Firszt 				status = RNDIS_STATUS_NOT_ACCEPTED;
4742865d42cSLarry Finger 		}
475168a2c10SLuis de Bethencourt 	} else {
4769e01b9f3SPrzemo Firszt 		status = RNDIS_STATUS_INVALID_LENGTH;
477168a2c10SLuis de Bethencourt 	}
4782865d42cSLarry Finger 	return status;
4792865d42cSLarry Finger }
4802865d42cSLarry Finger 
4812865d42cSLarry Finger enum _CONNECT_STATE_ {
4822865d42cSLarry Finger 	CHECKINGSTATUS,
4832865d42cSLarry Finger 	ASSOCIATED,
4842865d42cSLarry Finger 	ADHOCMODE,
4852865d42cSLarry Finger 	NOTASSOCIATED
4862865d42cSLarry Finger };
4872865d42cSLarry Finger 
oid_rt_get_connect_state_hdl(struct oid_par_priv * poid_par_priv)4882865d42cSLarry Finger uint oid_rt_get_connect_state_hdl(struct oid_par_priv *poid_par_priv)
4892865d42cSLarry Finger {
490eaf0e796SLucas Tanure 	struct _adapter *padapter = poid_par_priv->adapter_context;
4912865d42cSLarry Finger 	struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
4922865d42cSLarry Finger 	u32 ulInfo;
4932865d42cSLarry Finger 
4942865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != QUERY_OID)
4959e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
4962865d42cSLarry Finger 	/* nStatus==0	CheckingStatus
4972865d42cSLarry Finger 	 * nStatus==1	Associated
4982865d42cSLarry Finger 	 * nStatus==2	AdHocMode
4992865d42cSLarry Finger 	 * nStatus==3	NotAssociated
5002865d42cSLarry Finger 	 */
5011ca96884SLuis de Bethencourt 	if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING))
5022865d42cSLarry Finger 		ulInfo = CHECKINGSTATUS;
5031ca96884SLuis de Bethencourt 	else if (check_fwstate(pmlmepriv, _FW_LINKED))
5042865d42cSLarry Finger 		ulInfo = ASSOCIATED;
5051ca96884SLuis de Bethencourt 	else if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE))
5062865d42cSLarry Finger 		ulInfo = ADHOCMODE;
5072865d42cSLarry Finger 	else
5082865d42cSLarry Finger 		ulInfo = NOTASSOCIATED;
5092865d42cSLarry Finger 	*(u32 *)poid_par_priv->information_buf = ulInfo;
5102865d42cSLarry Finger 	*poid_par_priv->bytes_rw =  poid_par_priv->information_buf_len;
5119e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
5122865d42cSLarry Finger }
5132865d42cSLarry Finger 
oid_rt_set_default_key_id_hdl(struct oid_par_priv * poid_par_priv)5142865d42cSLarry Finger uint oid_rt_set_default_key_id_hdl(struct oid_par_priv *poid_par_priv)
5152865d42cSLarry Finger {
5162865d42cSLarry Finger 	if (poid_par_priv->type_of_oid != SET_OID)
5179e01b9f3SPrzemo Firszt 		return RNDIS_STATUS_NOT_ACCEPTED;
5189e01b9f3SPrzemo Firszt 	return RNDIS_STATUS_SUCCESS;
5192865d42cSLarry Finger }
520