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