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