194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger/****************************************************************************** 294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved. 394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * 494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * This program is distributed in the hope that it will be useful, but WITHOUT 594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * more details. 894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * 994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * You should have received a copy of the GNU General Public License along with 1094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * this program; if not, write to the Free Software Foundation, Inc., 1194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA 1294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * 1394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * The full GNU General Public License is included in this distribution in the 1494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * file called LICENSE. 1594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * 1694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * Contact Information: 1794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * wlanfae <wlanfae@realtek.com> 1894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger******************************************************************************/ 1994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 2094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#include <linux/string.h> 2194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#include "rtl_core.h" 2294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 2394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#define RATE_COUNT 12 2449aab5fd9df153a73992afa7cc386661d759c8e3Larry Fingerstatic u32 rtl8192_rates[] = { 2508d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger 1000000, 2000000, 5500000, 11000000, 6000000, 9000000, 12000000, 2608d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger 18000000, 24000000, 36000000, 48000000, 54000000 2708d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger}; 2894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 2994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#ifndef ENETDOWN 3094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#define ENETDOWN 1 3194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#endif 3294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 3394a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic int r8192_wx_get_freq(struct net_device *dev, 3494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct iw_request_info *a, 3594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger union iwreq_data *wrqu, char *b) 3694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 3794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 3894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 3908d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger return rtllib_wx_get_freq(priv->rtllib, a, wrqu, b); 4094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 4194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 4294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 4394a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic int r8192_wx_get_mode(struct net_device *dev, struct iw_request_info *a, 4494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger union iwreq_data *wrqu, char *b) 4594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 4608d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger struct r8192_priv *priv = rtllib_priv(dev); 4794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 4808d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger return rtllib_wx_get_mode(priv->rtllib, a, wrqu, b); 4994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 5094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 5194a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic int r8192_wx_get_rate(struct net_device *dev, 5294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct iw_request_info *info, 5394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger union iwreq_data *wrqu, char *extra) 5494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 5594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 5608d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger return rtllib_wx_get_rate(priv->rtllib, info, wrqu, extra); 5794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 5894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 5994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 6094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 6194a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic int r8192_wx_set_rate(struct net_device *dev, 6294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct iw_request_info *info, 6394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger union iwreq_data *wrqu, char *extra) 6494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 6594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger int ret; 6694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 6794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 6894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (priv->bHwRadioOff == true) 6994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return 0; 7094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 7194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger down(&priv->wx_sem); 7294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 7308d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger ret = rtllib_wx_set_rate(priv->rtllib, info, wrqu, extra); 7494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 7594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger up(&priv->wx_sem); 7694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 7794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return ret; 7894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 7994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 8094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 8194a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic int r8192_wx_set_rts(struct net_device *dev, 8294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct iw_request_info *info, 8394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger union iwreq_data *wrqu, char *extra) 8494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 8594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger int ret; 8694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 8794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 8894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (priv->bHwRadioOff == true) 8994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return 0; 9094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 9194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger down(&priv->wx_sem); 9294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 9308d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger ret = rtllib_wx_set_rts(priv->rtllib, info, wrqu, extra); 9494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 9594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger up(&priv->wx_sem); 9694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 9794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return ret; 9894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 9994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 10094a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic int r8192_wx_get_rts(struct net_device *dev, 10194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct iw_request_info *info, 10294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger union iwreq_data *wrqu, char *extra) 10394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 10494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 10508d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger return rtllib_wx_get_rts(priv->rtllib, info, wrqu, extra); 10694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 10794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 10894a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic int r8192_wx_set_power(struct net_device *dev, 10994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct iw_request_info *info, 11094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger union iwreq_data *wrqu, char *extra) 11194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 11294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger int ret; 11394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 11494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 11508d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger if (priv->bHwRadioOff == true) { 11608d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger RT_TRACE(COMP_ERR, "%s():Hw is Radio Off, we can't set " 11708d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger "Power,return\n", __func__); 11894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return 0; 11994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 12094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger down(&priv->wx_sem); 12194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 12208d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger ret = rtllib_wx_set_power(priv->rtllib, info, wrqu, extra); 12394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 12494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger up(&priv->wx_sem); 12594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 12694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return ret; 12794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 12894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 12994a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic int r8192_wx_get_power(struct net_device *dev, 13094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct iw_request_info *info, 13194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger union iwreq_data *wrqu, char *extra) 13294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 13394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 13408d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger return rtllib_wx_get_power(priv->rtllib, info, wrqu, extra); 13594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 13694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 13794a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic int r8192_wx_set_rawtx(struct net_device *dev, 13808d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger struct iw_request_info *info, 13908d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger union iwreq_data *wrqu, char *extra) 14094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 14194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 14294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger int ret; 14394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 14494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (priv->bHwRadioOff == true) 14594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return 0; 14694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 14794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger down(&priv->wx_sem); 14894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 14994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ret = rtllib_wx_set_rawtx(priv->rtllib, info, wrqu, extra); 15094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 15194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger up(&priv->wx_sem); 15294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 15394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return ret; 15494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 15594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 15694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 15794a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic int r8192_wx_force_reset(struct net_device *dev, 15894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct iw_request_info *info, 15994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger union iwreq_data *wrqu, char *extra) 16094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 16194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 16294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 16394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger down(&priv->wx_sem); 16494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 16508d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger RT_TRACE(COMP_DBG, "%s(): force reset ! extra is %d\n", 16608d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger __func__, *extra); 16794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->force_reset = *extra; 16894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger up(&priv->wx_sem); 16994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return 0; 17094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 17194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 17294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 17394a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic int r8192_wx_force_mic_error(struct net_device *dev, 17494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct iw_request_info *info, 17594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger union iwreq_data *wrqu, char *extra) 17694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 17794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 17808d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger struct rtllib_device *ieee = priv->rtllib; 17994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 18094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger down(&priv->wx_sem); 18194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 18208d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger RT_TRACE(COMP_DBG, "%s(): force mic error !\n", __func__); 18394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->force_mic_error = true; 18494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger up(&priv->wx_sem); 18594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return 0; 18694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 18794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 18894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 18994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#define MAX_ADHOC_PEER_NUM 64 190f0a1f2924b2698ec9eb58a2739fab633dd2b29ccLarry Fingerstruct adhoc_peer_entry { 19194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger unsigned char MacAddr[ETH_ALEN]; 19294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger unsigned char WirelessMode; 19394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger unsigned char bCurTxBW40MHz; 194f0a1f2924b2698ec9eb58a2739fab633dd2b29ccLarry Finger}; 19549f4e74a94920807bfa5d952954c5b08b2d33359Larry Fingerstruct adhoc_peers_info { 196f0a1f2924b2698ec9eb58a2739fab633dd2b29ccLarry Finger struct adhoc_peer_entry Entry[MAX_ADHOC_PEER_NUM]; 19794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger unsigned char num; 19849f4e74a94920807bfa5d952954c5b08b2d33359Larry Finger}; 1991e71e6d0cf764841cdf60dec4a40849ff41be75cLarry Finger 20049aab5fd9df153a73992afa7cc386661d759c8e3Larry Fingerstatic int r8192_wx_get_adhoc_peers(struct net_device *dev, 20149aab5fd9df153a73992afa7cc386661d759c8e3Larry Finger struct iw_request_info *info, 20249aab5fd9df153a73992afa7cc386661d759c8e3Larry Finger union iwreq_data *wrqu, char *extra) 20394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 20494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return 0; 20594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 20694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 20794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 20894a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic int r8191se_wx_get_firm_version(struct net_device *dev, 20994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct iw_request_info *info, 21094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct iw_param *wrqu, char *extra) 21194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 21294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return 0; 21394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 21494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 21594a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic int r8192_wx_adapter_power_status(struct net_device *dev, 21694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct iw_request_info *info, 21794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger union iwreq_data *wrqu, char *extra) 21894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 21994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 22008d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger struct rt_pwr_save_ctrl *pPSC = (struct rt_pwr_save_ctrl *) 22108d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger (&(priv->rtllib->PowerSaveControl)); 22208d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger struct rtllib_device *ieee = priv->rtllib; 22394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 22494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger down(&priv->wx_sem); 22594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 22608d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger RT_TRACE(COMP_POWER, "%s(): %s\n", __func__, (*extra == 6) ? 22708d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger "DC power" : "AC power"); 22894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (*extra || priv->force_lps) { 22994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->ps_force = false; 23094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger pPSC->bLeisurePs = true; 23194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } else { 23294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (priv->rtllib->state == RTLLIB_LINKED) 23394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger LeisurePSLeave(dev); 23494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 23594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->ps_force = true; 23694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger pPSC->bLeisurePs = false; 23794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->ps = *extra; 23894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 23994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 24094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger up(&priv->wx_sem); 24194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 24294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return 0; 24394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 24494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 24594a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic int r8192se_wx_set_radio(struct net_device *dev, 24608d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger struct iw_request_info *info, 24708d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger union iwreq_data *wrqu, char *extra) 24894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 24908d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger struct r8192_priv *priv = rtllib_priv(dev); 25094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 25108d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger down(&priv->wx_sem); 25294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 25308d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger printk(KERN_INFO "%s(): set radio ! extra is %d\n", __func__, *extra); 25408d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger if ((*extra != 0) && (*extra != 1)) { 25508d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger RT_TRACE(COMP_ERR, "%s(): set radio an err value,must 0(radio " 25608d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger "off) or 1(radio on)\n", __func__); 257e25316a08e7e1ebd3f152b14ed251067b45d2da8Larry Finger up(&priv->wx_sem); 25808d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger return -1; 25908d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger } 26008d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger priv->sw_radio_on = *extra; 26108d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger up(&priv->wx_sem); 26208d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger return 0; 26394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 26494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 26594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 26694a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic int r8192se_wx_set_lps_awake_interval(struct net_device *dev, 26708d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger struct iw_request_info *info, 26808d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger union iwreq_data *wrqu, char *extra) 26994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 27008d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger struct r8192_priv *priv = rtllib_priv(dev); 27108d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger struct rt_pwr_save_ctrl *pPSC = (struct rt_pwr_save_ctrl *) 27208d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger (&(priv->rtllib->PowerSaveControl)); 27394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 27408d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger down(&priv->wx_sem); 27594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 27608d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger printk(KERN_INFO "%s(): set lps awake interval ! extra is %d\n", 27708d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger __func__, *extra); 27894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 27908d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger pPSC->RegMaxLPSAwakeIntvl = *extra; 28008d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger up(&priv->wx_sem); 28108d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger return 0; 28294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 28394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 28494a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic int r8192se_wx_set_force_lps(struct net_device *dev, 28594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct iw_request_info *info, 28694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger union iwreq_data *wrqu, char *extra) 28794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 28894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 28994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 29094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger down(&priv->wx_sem); 29194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 29208d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger printk(KERN_INFO "%s(): force LPS ! extra is %d (1 is open 0 is " 29308d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger "close)\n", __func__, *extra); 29494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->force_lps = *extra; 29594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger up(&priv->wx_sem); 29694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return 0; 29794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 29894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 29994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 30094a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic int r8192_wx_set_debugflag(struct net_device *dev, 30108d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger struct iw_request_info *info, 30208d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger union iwreq_data *wrqu, char *extra) 30394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 30494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 30594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger u8 c = *extra; 30694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 30794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (priv->bHwRadioOff == true) 30894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return 0; 30994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 31008d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger printk(KERN_INFO "=====>%s(), *extra:%x, debugflag:%x\n", __func__, 31108d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger *extra, rt_global_debug_component); 31208d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger if (c > 0) 31394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rt_global_debug_component |= (1<<c); 31408d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger else 31594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rt_global_debug_component &= BIT31; 31694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return 0; 31794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 31894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 31994a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic int r8192_wx_set_mode(struct net_device *dev, struct iw_request_info *a, 32094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger union iwreq_data *wrqu, char *b) 32194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 32294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 32308d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger struct rtllib_device *ieee = netdev_priv_rsl(dev); 32494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 325de7c885a248ad79380bf1b3425738e436a7790ffLarry Finger enum rt_rf_power_state rtState; 32694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger int ret; 32794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 32894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (priv->bHwRadioOff == true) 32994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return 0; 33094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtState = priv->rtllib->eRFPowerState; 33194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger down(&priv->wx_sem); 33208d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger if (wrqu->mode == IW_MODE_ADHOC || wrqu->mode == IW_MODE_MONITOR || 33308d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger ieee->bNetPromiscuousMode) { 33408d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger if (priv->rtllib->PowerSaveControl.bInactivePs) { 33508d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger if (rtState == eRfOff) { 33608d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger if (priv->rtllib->RfOffReason > 33708d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger RF_CHANGE_BY_IPS) { 33808d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger RT_TRACE(COMP_ERR, "%s(): RF is OFF.\n", 33908d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger __func__); 34094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger up(&priv->wx_sem); 34194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return -1; 34294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } else { 34308d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger printk(KERN_INFO "=========>%s(): " 34408d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger "IPSLeave\n", __func__); 34594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger down(&priv->rtllib->ips_sem); 34694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger IPSLeave(dev); 34794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger up(&priv->rtllib->ips_sem); 34894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 34994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 35094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 35194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 35208d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger ret = rtllib_wx_set_mode(priv->rtllib, a, wrqu, b); 35394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 35494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger up(&priv->wx_sem); 35594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return ret; 35694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 35794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 35808d348a021213a16eb76b6e9937e91d1ec67a90bLarry Fingerstruct iw_range_with_scan_capa { 35908d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger /* Informative stuff (to choose between different interface) */ 36008d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger __u32 throughput; /* To give an idea... */ 36108d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger /* In theory this value should be the maximum benchmarked 36208d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger * TCP/IP throughput, because with most of these devices the 36308d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger * bit rate is meaningless (overhead an co) to estimate how 36408d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger * fast the connection will go and pick the fastest one. 36508d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger * I suggest people to play with Netperf or any benchmark... 36608d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger */ 36708d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger 36808d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger /* NWID (or domain id) */ 36908d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger __u32 min_nwid; /* Minimal NWID we are able to set */ 37008d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger __u32 max_nwid; /* Maximal NWID we are able to set */ 37108d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger 37208d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger /* Old Frequency (backward compat - moved lower ) */ 37308d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger __u16 old_num_channels; 37408d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger __u8 old_num_frequency; 37508d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger 37608d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger /* Scan capabilities */ 37708d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger __u8 scan_capa; 37894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}; 37994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 38094a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic int rtl8192_wx_get_range(struct net_device *dev, 38194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct iw_request_info *info, 38294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger union iwreq_data *wrqu, char *extra) 38394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 38494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct iw_range *range = (struct iw_range *)extra; 38594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 38694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger u16 val; 38794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger int i; 38894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 38994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger wrqu->data.length = sizeof(*range); 39094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger memset(range, 0, sizeof(*range)); 39194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 39294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger /* ~130 Mb/s real (802.11n) */ 39394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger range->throughput = 130 * 1000 * 1000; 39494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 39508d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger if (priv->rf_set_sens != NULL) { 39608d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger /* signal level threshold range */ 39708d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger range->sensitivity = priv->max_sens; 39808d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger } 39994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 40094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger range->max_qual.qual = 100; 40194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger range->max_qual.level = 0; 40294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger range->max_qual.noise = 0; 40394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger range->max_qual.updated = 7; /* Updated all three */ 40494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 40594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger range->avg_qual.qual = 70; /* > 8% missed beacons is 'bad' */ 40694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger range->avg_qual.level = 0; 40794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger range->avg_qual.noise = 0; 40894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger range->avg_qual.updated = 7; /* Updated all three */ 40994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 41094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger range->num_bitrates = min(RATE_COUNT, IW_MAX_BITRATES); 41194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 41208d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger for (i = 0; i < range->num_bitrates; i++) 41394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger range->bitrate[i] = rtl8192_rates[i]; 41494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 41594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger range->max_rts = DEFAULT_RTS_THRESHOLD; 41694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger range->min_frag = MIN_FRAG_THRESHOLD; 41794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger range->max_frag = MAX_FRAG_THRESHOLD; 41894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 41994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger range->min_pmp = 0; 42094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger range->max_pmp = 5000000; 42194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger range->min_pmt = 0; 42294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger range->max_pmt = 65535*1000; 42394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger range->pmp_flags = IW_POWER_PERIOD; 42494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger range->pmt_flags = IW_POWER_TIMEOUT; 42594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger range->pm_capa = IW_POWER_PERIOD | IW_POWER_TIMEOUT | IW_POWER_ALL_R; 42694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger range->we_version_compiled = WIRELESS_EXT; 42794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger range->we_version_source = 18; 42894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 42994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger for (i = 0, val = 0; i < 14; i++) { 43094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if ((priv->rtllib->active_channel_map)[i+1]) { 43108d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger range->freq[val].i = i + 1; 43208d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger range->freq[val].m = rtllib_wlan_frequencies[i] * 43308d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger 100000; 43494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger range->freq[val].e = 1; 43594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger val++; 43694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 43794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 43894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (val == IW_MAX_FREQUENCIES) 43908d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger break; 44094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 44194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger range->num_frequency = val; 44294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger range->num_channels = val; 44394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger range->enc_capa = IW_ENC_CAPA_WPA|IW_ENC_CAPA_WPA2| 44494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger IW_ENC_CAPA_CIPHER_TKIP|IW_ENC_CAPA_CIPHER_CCMP; 44594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger range->scan_capa = IW_SCAN_CAPA_ESSID | IW_SCAN_CAPA_TYPE; 44694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 44708d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger /* Event capability (kernel + driver) */ 44894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 44994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return 0; 45094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 45194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 45294a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic int r8192_wx_set_scan(struct net_device *dev, struct iw_request_info *a, 45394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger union iwreq_data *wrqu, char *b) 45494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 45594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 45608d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger struct rtllib_device *ieee = priv->rtllib; 457de7c885a248ad79380bf1b3425738e436a7790ffLarry Finger enum rt_rf_power_state rtState; 45894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger int ret; 45994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 46008d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger if (!(ieee->softmac_features & IEEE_SOFTMAC_SCAN)) { 46108d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger if ((ieee->state >= RTLLIB_ASSOCIATING) && 46208d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger (ieee->state <= RTLLIB_ASSOCIATING_AUTHENTICATED)) 46394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return 0; 46408d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger if ((priv->rtllib->state == RTLLIB_LINKED) && 46508d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger (priv->rtllib->CntAfterLink < 2)) 46694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return 0; 46794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 46894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 46908d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger if (priv->bHwRadioOff == true) { 47008d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger printk(KERN_INFO "================>%s(): hwradio off\n", 47108d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger __func__); 47294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return 0; 47394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 47494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtState = priv->rtllib->eRFPowerState; 47508d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger if (!priv->up) 47608d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger return -ENETDOWN; 47794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (priv->rtllib->LinkDetectInfo.bBusyTraffic == true) 47894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return -EAGAIN; 47994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 48008d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger if (wrqu->data.flags & IW_SCAN_THIS_ESSID) { 48108d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger struct iw_scan_req *req = (struct iw_scan_req *)b; 48208d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger if (req->essid_len) { 48394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->current_network.ssid_len = req->essid_len; 48408d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger memcpy(ieee->current_network.ssid, req->essid, 48508d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger req->essid_len); 48694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 48794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 48894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 48994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger down(&priv->wx_sem); 49094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 49194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->rtllib->FirstIe_InScan = true; 49294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 49308d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger if (priv->rtllib->state != RTLLIB_LINKED) { 49408d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger if (priv->rtllib->PowerSaveControl.bInactivePs) { 49508d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger if (rtState == eRfOff) { 49608d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger if (priv->rtllib->RfOffReason > 49708d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger RF_CHANGE_BY_IPS) { 49808d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger RT_TRACE(COMP_ERR, "%s(): RF is " 49908d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger "OFF.\n", __func__); 50094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger up(&priv->wx_sem); 50194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return -1; 50208d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger } else { 50308d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger RT_TRACE(COMP_PS, "=========>%s(): " 50408d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger "IPSLeave\n", __func__); 50594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger down(&priv->rtllib->ips_sem); 50694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger IPSLeave(dev); 50794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger up(&priv->rtllib->ips_sem); 50894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 50994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 51094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 51194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtllib_stop_scan(priv->rtllib); 51294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (priv->rtllib->LedControlHandler) 51308d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger priv->rtllib->LedControlHandler(dev, 51408d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger LED_CTL_SITE_SURVEY); 51594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 51608d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger if (priv->rtllib->eRFPowerState != eRfOff) { 51794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->rtllib->actscanning = true; 51894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 51994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (ieee->ScanOperationBackupHandler) 52008d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger ieee->ScanOperationBackupHandler(ieee->dev, 52108d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger SCAN_OPT_BACKUP); 52294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 52394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtllib_start_scan_syncro(priv->rtllib, 0); 52494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 52594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (ieee->ScanOperationBackupHandler) 52608d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger ieee->ScanOperationBackupHandler(ieee->dev, 52708d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger SCAN_OPT_RESTORE); 52808d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger } 52994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ret = 0; 53094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } else { 53194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->rtllib->actscanning = true; 53208d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger ret = rtllib_wx_set_scan(priv->rtllib, a, wrqu, b); 53394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 53494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 53594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger up(&priv->wx_sem); 53694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return ret; 53794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 53894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 53994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 54094a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic int r8192_wx_get_scan(struct net_device *dev, struct iw_request_info *a, 54194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger union iwreq_data *wrqu, char *b) 54294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 54394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 54494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger int ret; 54594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 54694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 54708d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger if (!priv->up) 54808d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger return -ENETDOWN; 54994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 55094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (priv->bHwRadioOff == true) 55194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return 0; 55294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 55394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 55494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger down(&priv->wx_sem); 55594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 55608d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger ret = rtllib_wx_get_scan(priv->rtllib, a, wrqu, b); 55794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 55894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger up(&priv->wx_sem); 55994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 56094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return ret; 56194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 56294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 56394a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic int r8192_wx_set_essid(struct net_device *dev, 56494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct iw_request_info *a, 56594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger union iwreq_data *wrqu, char *b) 56694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 56794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 56894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger int ret; 56994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 57008d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger if ((rtllib_act_scanning(priv->rtllib, false)) && 57108d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger !(priv->rtllib->softmac_features & IEEE_SOFTMAC_SCAN)) { 57208d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger ; /* TODO - get rid of if */ 57394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 57408d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger if (priv->bHwRadioOff == true) { 57508d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger printk(KERN_INFO "=========>%s():hw radio off,or Rf state is " 57608d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger "eRfOff, return\n", __func__); 57794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return 0; 57894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 57994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger down(&priv->wx_sem); 58008d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger ret = rtllib_wx_set_essid(priv->rtllib, a, wrqu, b); 58194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 58294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger up(&priv->wx_sem); 58394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 58494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return ret; 58594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 58694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 58794a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic int r8192_wx_get_essid(struct net_device *dev, 58894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct iw_request_info *a, 58994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger union iwreq_data *wrqu, char *b) 59094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 59194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger int ret; 59294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 59394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 59494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger down(&priv->wx_sem); 59594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 59694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ret = rtllib_wx_get_essid(priv->rtllib, a, wrqu, b); 59794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 59894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger up(&priv->wx_sem); 59994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 60094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return ret; 60194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 60294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 60394a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic int r8192_wx_set_nick(struct net_device *dev, 60494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct iw_request_info *info, 60594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger union iwreq_data *wrqu, char *extra) 60694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 60794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 60894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 60994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (wrqu->data.length > IW_ESSID_MAX_SIZE) 61094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return -E2BIG; 61194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger down(&priv->wx_sem); 61294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger wrqu->data.length = min((size_t) wrqu->data.length, sizeof(priv->nick)); 61394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger memset(priv->nick, 0, sizeof(priv->nick)); 61494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger memcpy(priv->nick, extra, wrqu->data.length); 61594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger up(&priv->wx_sem); 61694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return 0; 61794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 61894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 61994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 62094a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic int r8192_wx_get_nick(struct net_device *dev, 62194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct iw_request_info *info, 62294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger union iwreq_data *wrqu, char *extra) 62394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 62494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 62594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 62694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger down(&priv->wx_sem); 62794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger wrqu->data.length = strlen(priv->nick); 62894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger memcpy(extra, priv->nick, wrqu->data.length); 62994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger wrqu->data.flags = 1; /* active */ 63094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger up(&priv->wx_sem); 63194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return 0; 63294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 63394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 63494a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic int r8192_wx_set_freq(struct net_device *dev, struct iw_request_info *a, 63594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger union iwreq_data *wrqu, char *b) 63694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 63794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger int ret; 63894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 63994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 64094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (priv->bHwRadioOff == true) 64194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return 0; 64294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 64394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger down(&priv->wx_sem); 64494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 64594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ret = rtllib_wx_set_freq(priv->rtllib, a, wrqu, b); 64694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 64794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger up(&priv->wx_sem); 64894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return ret; 64994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 65094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 65194a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic int r8192_wx_get_name(struct net_device *dev, 65294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct iw_request_info *info, 65394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger union iwreq_data *wrqu, char *extra) 65494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 65594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 65694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return rtllib_wx_get_name(priv->rtllib, info, wrqu, extra); 65794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 65894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 65994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 66094a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic int r8192_wx_set_frag(struct net_device *dev, 66194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct iw_request_info *info, 66294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger union iwreq_data *wrqu, char *extra) 66394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 66494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 66594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 66694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (priv->bHwRadioOff == true) 66794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return 0; 66894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 66994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (wrqu->frag.disabled) 67094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->rtllib->fts = DEFAULT_FRAG_THRESHOLD; 67194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger else { 67294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (wrqu->frag.value < MIN_FRAG_THRESHOLD || 67394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger wrqu->frag.value > MAX_FRAG_THRESHOLD) 67494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return -EINVAL; 67594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 67694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->rtllib->fts = wrqu->frag.value & ~0x1; 67794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 67894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 67994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return 0; 68094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 68194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 68294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 68394a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic int r8192_wx_get_frag(struct net_device *dev, 68494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct iw_request_info *info, 68594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger union iwreq_data *wrqu, char *extra) 68694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 68794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 68894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 68994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger wrqu->frag.value = priv->rtllib->fts; 69094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger wrqu->frag.fixed = 0; /* no auto select */ 69194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger wrqu->frag.disabled = (wrqu->frag.value == DEFAULT_FRAG_THRESHOLD); 69294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 69394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return 0; 69494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 69594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 69694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 69794a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic int r8192_wx_set_wap(struct net_device *dev, 69894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct iw_request_info *info, 69994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger union iwreq_data *awrq, 70094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger char *extra) 70194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 70294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger int ret; 70394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 70494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 70508d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger if ((rtllib_act_scanning(priv->rtllib, false)) && 70608d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger !(priv->rtllib->softmac_features & IEEE_SOFTMAC_SCAN)) { 70708d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger ; /* TODO - get rid of if */ 70894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 70994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 71094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (priv->bHwRadioOff == true) 71194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return 0; 71294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 71394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger down(&priv->wx_sem); 71494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 71508d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger ret = rtllib_wx_set_wap(priv->rtllib, info, awrq, extra); 71694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 71794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger up(&priv->wx_sem); 71894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 71994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return ret; 72094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 72194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 72294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 72394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 72494a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic int r8192_wx_get_wap(struct net_device *dev, 72594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct iw_request_info *info, 72694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger union iwreq_data *wrqu, char *extra) 72794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 72894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 72994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 73008d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger return rtllib_wx_get_wap(priv->rtllib, info, wrqu, extra); 73194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 73294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 73394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 73494a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic int r8192_wx_get_enc(struct net_device *dev, 73594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct iw_request_info *info, 73694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger union iwreq_data *wrqu, char *key) 73794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 73894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 73994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 74094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return rtllib_wx_get_encode(priv->rtllib, info, wrqu, key); 74194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 74294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 74394a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic int r8192_wx_set_enc(struct net_device *dev, 74494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct iw_request_info *info, 74594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger union iwreq_data *wrqu, char *key) 74694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 74794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 74894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger int ret; 74994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 75094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct rtllib_device *ieee = priv->rtllib; 75108d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger u32 hwkey[4] = {0, 0, 0, 0}; 75208d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger u8 mask = 0xff; 75308d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger u32 key_idx = 0; 75408d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger u8 zero_addr[4][6] = {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 75508d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger {0x00, 0x00, 0x00, 0x00, 0x00, 0x01}, 75608d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger {0x00, 0x00, 0x00, 0x00, 0x00, 0x02}, 75708d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger {0x00, 0x00, 0x00, 0x00, 0x00, 0x03} }; 75894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger int i; 75994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 76008d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger if ((rtllib_act_scanning(priv->rtllib, false)) && 76108d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger !(priv->rtllib->softmac_features & IEEE_SOFTMAC_SCAN)) 76208d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger ; /* TODO - get rid of if */ 76394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (priv->bHwRadioOff == true) 76494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return 0; 76594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 76608d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger if (!priv->up) 76708d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger return -ENETDOWN; 76894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 76908d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger priv->rtllib->wx_set_enc = 1; 77008d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger down(&priv->rtllib->ips_sem); 77108d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger IPSLeave(dev); 77208d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger up(&priv->rtllib->ips_sem); 77394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger down(&priv->wx_sem); 77494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 77594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger RT_TRACE(COMP_SEC, "Setting SW wep key"); 77608d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger ret = rtllib_wx_set_encode(priv->rtllib, info, wrqu, key); 77794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger up(&priv->wx_sem); 77894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 77994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 78094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (wrqu->encoding.flags & IW_ENCODE_DISABLED) { 78194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->pairwise_key_type = ieee->group_key_type = KEY_TYPE_NA; 78294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger CamResetAllEntry(dev); 78308d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger memset(priv->rtllib->swcamtable, 0, 78408d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger sizeof(struct sw_cam_table) * 32); 78594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger goto end_hw_sec; 78694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 78708d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger if (wrqu->encoding.length != 0) { 78894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 78908d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger for (i = 0; i < 4; i++) { 79094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger hwkey[i] |= key[4*i+0]&mask; 79108d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger if (i == 1 && (4 * i + 1) == wrqu->encoding.length) 79208d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger mask = 0x00; 79308d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger if (i == 3 && (4 * i + 1) == wrqu->encoding.length) 79408d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger mask = 0x00; 79508d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger hwkey[i] |= (key[4 * i + 1] & mask) << 8; 79608d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger hwkey[i] |= (key[4 * i + 2] & mask) << 16; 79708d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger hwkey[i] |= (key[4 * i + 3] & mask) << 24; 79894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 79994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 80094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger #define CONF_WEP40 0x4 80194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger #define CONF_WEP104 0x14 80294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 80308d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger switch (wrqu->encoding.flags & IW_ENCODE_INDEX) { 80408d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger case 0: 8050ddcf5fdfac6bd80e153ee5c405bdfc9cb868b95Sean MacLennan key_idx = ieee->crypt_info.tx_keyidx; 80608d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger break; 80708d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger case 1: 80808d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger key_idx = 0; 80908d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger break; 81008d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger case 2: 81108d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger key_idx = 1; 81208d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger break; 81308d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger case 3: 81408d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger key_idx = 2; 81508d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger break; 81608d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger case 4: 81708d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger key_idx = 3; 81808d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger break; 81908d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger default: 82008d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger break; 82194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 82208d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger if (wrqu->encoding.length == 0x5) { 82394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->pairwise_key_type = KEY_TYPE_WEP40; 82494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger EnableHWSecurityConfig8192(dev); 82594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 82694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 82708d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger else if (wrqu->encoding.length == 0xd) { 82894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->pairwise_key_type = KEY_TYPE_WEP104; 82994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger EnableHWSecurityConfig8192(dev); 83008d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger setKey(dev, key_idx, key_idx, KEY_TYPE_WEP104, 83108d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger zero_addr[key_idx], 0, hwkey); 83208d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger set_swcam(dev, key_idx, key_idx, KEY_TYPE_WEP104, 83308d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger zero_addr[key_idx], 0, hwkey, 0); 83494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } else { 83508d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger printk(KERN_INFO "wrong type in WEP, not WEP40 and WEP104\n"); 83694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 83794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 83894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 83994a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerend_hw_sec: 84094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->rtllib->wx_set_enc = 0; 84194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return ret; 84294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 84394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 84408d348a021213a16eb76b6e9937e91d1ec67a90bLarry Fingerstatic int r8192_wx_set_scan_type(struct net_device *dev, 84508d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger struct iw_request_info *aa, 84608d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger union iwreq_data *wrqu, char *p) 84708d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger{ 84894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 84908d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger int *parms = (int *)p; 85008d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger int mode = parms[0]; 85194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 85294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (priv->bHwRadioOff == true) 85394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return 0; 85494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 85594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->rtllib->active_scan = mode; 85694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 85794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return 1; 85894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 85994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 86094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 86194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 86294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#define R8192_MAX_RETRY 255 86394a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic int r8192_wx_set_retry(struct net_device *dev, 86494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct iw_request_info *info, 86594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger union iwreq_data *wrqu, char *extra) 86694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 86794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 86894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger int err = 0; 86994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 87094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (priv->bHwRadioOff == true) 87194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return 0; 87294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 87394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger down(&priv->wx_sem); 87494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 87594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (wrqu->retry.flags & IW_RETRY_LIFETIME || 87608d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger wrqu->retry.disabled) { 87794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger err = -EINVAL; 87894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger goto exit; 87994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 88008d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger if (!(wrqu->retry.flags & IW_RETRY_LIMIT)) { 88194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger err = -EINVAL; 88294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger goto exit; 88394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 88494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 88508d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger if (wrqu->retry.value > R8192_MAX_RETRY) { 88608d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger err = -EINVAL; 88794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger goto exit; 88894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 88994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (wrqu->retry.flags & IW_RETRY_MAX) { 89094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->retry_rts = wrqu->retry.value; 89108d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger DMESG("Setting retry for RTS/CTS data to %d", 89208d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger wrqu->retry.value); 89394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 89408d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger } else { 89594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->retry_data = wrqu->retry.value; 89608d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger DMESG("Setting retry for non RTS/CTS data to %d", 89708d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger wrqu->retry.value); 89894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 89994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 90094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 90194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtl8192_commit(dev); 90294a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerexit: 90394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger up(&priv->wx_sem); 90494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 90594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return err; 90694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 90794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 90894a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic int r8192_wx_get_retry(struct net_device *dev, 90994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct iw_request_info *info, 91094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger union iwreq_data *wrqu, char *extra) 91194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 91294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 91394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 91494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 91594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger wrqu->retry.disabled = 0; /* can't be disabled */ 91694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 91794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if ((wrqu->retry.flags & IW_RETRY_TYPE) == 91894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger IW_RETRY_LIFETIME) 91994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return -EINVAL; 92094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 92194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (wrqu->retry.flags & IW_RETRY_MAX) { 92294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger wrqu->retry.flags = IW_RETRY_LIMIT & IW_RETRY_MAX; 92394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger wrqu->retry.value = priv->retry_rts; 92494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } else { 92594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger wrqu->retry.flags = IW_RETRY_LIMIT & IW_RETRY_MIN; 92694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger wrqu->retry.value = priv->retry_data; 92794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 92894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return 0; 92994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 93094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 93194a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic int r8192_wx_get_sens(struct net_device *dev, 93208d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger struct iw_request_info *info, 93308d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger union iwreq_data *wrqu, char *extra) 93494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 93594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 93694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (priv->rf_set_sens == NULL) 93794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return -1; /* we have not this support for this radio */ 93894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger wrqu->sens.value = priv->sens; 93994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return 0; 94094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 94194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 94294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 94394a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic int r8192_wx_set_sens(struct net_device *dev, 94494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct iw_request_info *info, 94594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger union iwreq_data *wrqu, char *extra) 94694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 94794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 94894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 94994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 95094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger short err = 0; 95194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 95294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (priv->bHwRadioOff == true) 95394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return 0; 95494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 95594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger down(&priv->wx_sem); 95694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (priv->rf_set_sens == NULL) { 95708d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger err = -1; /* we have not this support for this radio */ 95894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger goto exit; 95994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 96094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (priv->rf_set_sens(dev, wrqu->sens.value) == 0) 96194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->sens = wrqu->sens.value; 96294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger else 96308d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger err = -EINVAL; 96494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 96594a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerexit: 96694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger up(&priv->wx_sem); 96794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 96894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return err; 96994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 97094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 97194a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic int r8192_wx_set_enc_ext(struct net_device *dev, 97208d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger struct iw_request_info *info, 97308d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger union iwreq_data *wrqu, char *extra) 97494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 97508d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger int ret = 0; 97694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 97708d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger struct rtllib_device *ieee = priv->rtllib; 97894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 97994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (priv->bHwRadioOff == true) 98094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return 0; 98194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 98294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger down(&priv->wx_sem); 98394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 98408d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger priv->rtllib->wx_set_enc = 1; 98508d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger down(&priv->rtllib->ips_sem); 98608d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger IPSLeave(dev); 98708d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger up(&priv->rtllib->ips_sem); 98894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 98994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ret = rtllib_wx_set_encode_ext(ieee, info, wrqu, extra); 99094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger { 99108d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger u8 broadcast_addr[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; 99294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger u8 zero[6] = {0}; 99394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger u32 key[4] = {0}; 99494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct iw_encode_ext *ext = (struct iw_encode_ext *)extra; 99594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct iw_point *encoding = &wrqu->encoding; 99694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger u8 idx = 0, alg = 0, group = 0; 99794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if ((encoding->flags & IW_ENCODE_DISABLED) || 99808d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger ext->alg == IW_ENCODE_ALG_NONE) { 99908d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger ieee->pairwise_key_type = ieee->group_key_type 100008d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger = KEY_TYPE_NA; 100194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger CamResetAllEntry(dev); 100208d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger memset(priv->rtllib->swcamtable, 0, 100308d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger sizeof(struct sw_cam_table) * 32); 100494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger goto end_hw_sec; 100594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 100608d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger alg = (ext->alg == IW_ENCODE_ALG_CCMP) ? KEY_TYPE_CCMP : 100708d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger ext->alg; 100894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger idx = encoding->flags & IW_ENCODE_INDEX; 100994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (idx) 101008d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger idx--; 101194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger group = ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY; 101294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 101308d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger if ((!group) || (IW_MODE_ADHOC == ieee->iw_mode) || 101408d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger (alg == KEY_TYPE_WEP40)) { 101508d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger if ((ext->key_len == 13) && (alg == KEY_TYPE_WEP40)) 101694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger alg = KEY_TYPE_WEP104; 101794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->pairwise_key_type = alg; 101894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger EnableHWSecurityConfig8192(dev); 101994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 102008d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger memcpy((u8 *)key, ext->key, 16); 102194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 102208d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger if ((alg & KEY_TYPE_WEP40) && (ieee->auth_mode != 2)) { 102394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (ext->key_len == 13) 102494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->pairwise_key_type = alg = KEY_TYPE_WEP104; 102508d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger setKey(dev, idx, idx, alg, zero, 0, key); 102608d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger set_swcam(dev, idx, idx, alg, zero, 0, key, 0); 102708d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger } else if (group) { 102894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->group_key_type = alg; 102908d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger setKey(dev, idx, idx, alg, broadcast_addr, 0, key); 103008d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger set_swcam(dev, idx, idx, alg, broadcast_addr, 0, 103108d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger key, 0); 103208d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger } else { 103308d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger if ((ieee->pairwise_key_type == KEY_TYPE_CCMP) && 103408d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger ieee->pHTInfo->bCurrentHTSupport) 103508d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger write_nic_byte(dev, 0x173, 1); 103608d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger setKey(dev, 4, idx, alg, (u8 *)ieee->ap_mac_addr, 103708d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger 0, key); 103808d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger set_swcam(dev, 4, idx, alg, (u8 *)ieee->ap_mac_addr, 103908d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger 0, key, 0); 104094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 104194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 104294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 104394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 104494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 104594a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerend_hw_sec: 104608d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger priv->rtllib->wx_set_enc = 0; 104794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger up(&priv->wx_sem); 104894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return ret; 104994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 105094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 105194a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic int r8192_wx_set_auth(struct net_device *dev, 105208d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger struct iw_request_info *info, 105308d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger union iwreq_data *data, char *extra) 105494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 105508d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger int ret = 0; 105694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 105794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 105894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 105994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (priv->bHwRadioOff == true) 106094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return 0; 106194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 106294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger down(&priv->wx_sem); 106394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ret = rtllib_wx_set_auth(priv->rtllib, info, &(data->param), extra); 106494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger up(&priv->wx_sem); 106594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return ret; 106694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 106794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 106894a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic int r8192_wx_set_mlme(struct net_device *dev, 106908d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger struct iw_request_info *info, 107008d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger union iwreq_data *wrqu, char *extra) 107194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 107294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 107308d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger int ret = 0; 107494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 107594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 107694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 107794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (priv->bHwRadioOff == true) 107894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return 0; 107994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 108094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger down(&priv->wx_sem); 108194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ret = rtllib_wx_set_mlme(priv->rtllib, info, wrqu, extra); 108294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger up(&priv->wx_sem); 108394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return ret; 108494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 108594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 108694a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic int r8192_wx_set_gen_ie(struct net_device *dev, 108708d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger struct iw_request_info *info, 108808d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger union iwreq_data *data, char *extra) 108994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 109094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger int ret = 0; 109194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 109208d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger struct r8192_priv *priv = rtllib_priv(dev); 109394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 109494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (priv->bHwRadioOff == true) 109594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return 0; 109694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 109708d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger down(&priv->wx_sem); 109808d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger ret = rtllib_wx_set_gen_ie(priv->rtllib, extra, data->data.length); 109908d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger up(&priv->wx_sem); 110008d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger return ret; 110194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 110294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 110394a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic int r8192_wx_get_gen_ie(struct net_device *dev, 110408d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger struct iw_request_info *info, 110594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger union iwreq_data *data, char *extra) 110694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 110794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger int ret = 0; 110808d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger struct r8192_priv *priv = rtllib_priv(dev); 110908d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger struct rtllib_device *ieee = priv->rtllib; 111094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 111194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (ieee->wpa_ie_len == 0 || ieee->wpa_ie == NULL) { 111294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger data->data.length = 0; 111394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return 0; 111494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 111594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 111608d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger if (data->data.length < ieee->wpa_ie_len) 111794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return -E2BIG; 111894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 111994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger data->data.length = ieee->wpa_ie_len; 112094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger memcpy(extra, ieee->wpa_ie, ieee->wpa_ie_len); 112108d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger return ret; 112294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 112394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 112494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#define OID_RT_INTEL_PROMISCUOUS_MODE 0xFF0101F6 112594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 112694a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic int r8192_wx_set_PromiscuousMode(struct net_device *dev, 112708d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger struct iw_request_info *info, 112808d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger union iwreq_data *wrqu, char *extra) 112994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 113094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 113108d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger struct rtllib_device *ieee = priv->rtllib; 113294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 113308d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger u32 *info_buf = (u32 *)(wrqu->data.pointer); 113494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 113594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger u32 oid = info_buf[0]; 113694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger u32 bPromiscuousOn = info_buf[1]; 113794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger u32 bFilterSourceStationFrame = info_buf[2]; 113894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 113908d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger if (OID_RT_INTEL_PROMISCUOUS_MODE == oid) { 114094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->IntelPromiscuousModeInfo.bPromiscuousOn = 114108d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger (bPromiscuousOn) ? (true) : (false); 114294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ieee->IntelPromiscuousModeInfo.bFilterSourceStationFrame = 114308d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger (bFilterSourceStationFrame) ? (true) : (false); 114408d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger (bPromiscuousOn) ? 114508d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger (rtllib_EnableIntelPromiscuousMode(dev, false)) : 114608d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger (rtllib_DisableIntelPromiscuousMode(dev, false)); 114794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 114808d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger printk(KERN_INFO "=======>%s(), on = %d, filter src sta = %d\n", 114908d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger __func__, bPromiscuousOn, bFilterSourceStationFrame); 115094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } else { 115194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return -1; 115294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 115394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 115494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return 0; 115594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 115694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 115794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 115894a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic int r8192_wx_get_PromiscuousMode(struct net_device *dev, 115908d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger struct iw_request_info *info, 116008d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger union iwreq_data *wrqu, char *extra) 116194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 116294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 116308d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger struct rtllib_device *ieee = priv->rtllib; 116494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 116508d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger down(&priv->wx_sem); 116694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 116708d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger snprintf(extra, 45, "PromiscuousMode:%d, FilterSrcSTAFrame:%d", 116808d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger ieee->IntelPromiscuousModeInfo.bPromiscuousOn, 116908d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger ieee->IntelPromiscuousModeInfo.bFilterSourceStationFrame); 117008d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger wrqu->data.length = strlen(extra) + 1; 117194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 117208d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger up(&priv->wx_sem); 117394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 117494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return 0; 117594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 117694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 117794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 117894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#define IW_IOCTL(x) [(x)-SIOCSIWCOMMIT] 117908d348a021213a16eb76b6e9937e91d1ec67a90bLarry Fingerstatic iw_handler r8192_wx_handlers[] = { 118008d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger IW_IOCTL(SIOCGIWNAME) = r8192_wx_get_name, 118108d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger IW_IOCTL(SIOCSIWFREQ) = r8192_wx_set_freq, 118208d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger IW_IOCTL(SIOCGIWFREQ) = r8192_wx_get_freq, 118308d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger IW_IOCTL(SIOCSIWMODE) = r8192_wx_set_mode, 118408d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger IW_IOCTL(SIOCGIWMODE) = r8192_wx_get_mode, 118508d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger IW_IOCTL(SIOCSIWSENS) = r8192_wx_set_sens, 118608d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger IW_IOCTL(SIOCGIWSENS) = r8192_wx_get_sens, 118708d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger IW_IOCTL(SIOCGIWRANGE) = rtl8192_wx_get_range, 118808d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger IW_IOCTL(SIOCSIWAP) = r8192_wx_set_wap, 118908d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger IW_IOCTL(SIOCGIWAP) = r8192_wx_get_wap, 119008d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger IW_IOCTL(SIOCSIWSCAN) = r8192_wx_set_scan, 119108d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger IW_IOCTL(SIOCGIWSCAN) = r8192_wx_get_scan, 119208d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger IW_IOCTL(SIOCSIWESSID) = r8192_wx_set_essid, 119308d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger IW_IOCTL(SIOCGIWESSID) = r8192_wx_get_essid, 119408d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger IW_IOCTL(SIOCSIWNICKN) = r8192_wx_set_nick, 119594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger IW_IOCTL(SIOCGIWNICKN) = r8192_wx_get_nick, 119608d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger IW_IOCTL(SIOCSIWRATE) = r8192_wx_set_rate, 119708d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger IW_IOCTL(SIOCGIWRATE) = r8192_wx_get_rate, 119808d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger IW_IOCTL(SIOCSIWRTS) = r8192_wx_set_rts, 119908d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger IW_IOCTL(SIOCGIWRTS) = r8192_wx_get_rts, 120008d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger IW_IOCTL(SIOCSIWFRAG) = r8192_wx_set_frag, 120108d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger IW_IOCTL(SIOCGIWFRAG) = r8192_wx_get_frag, 120208d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger IW_IOCTL(SIOCSIWRETRY) = r8192_wx_set_retry, 120308d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger IW_IOCTL(SIOCGIWRETRY) = r8192_wx_get_retry, 120408d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger IW_IOCTL(SIOCSIWENCODE) = r8192_wx_set_enc, 120508d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger IW_IOCTL(SIOCGIWENCODE) = r8192_wx_get_enc, 120608d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger IW_IOCTL(SIOCSIWPOWER) = r8192_wx_set_power, 120708d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger IW_IOCTL(SIOCGIWPOWER) = r8192_wx_get_power, 12083591733d287446edbeb14bbc36fb6f23a9f8cefdMike McCormack IW_IOCTL(SIOCSIWGENIE) = r8192_wx_set_gen_ie, 12093591733d287446edbeb14bbc36fb6f23a9f8cefdMike McCormack IW_IOCTL(SIOCGIWGENIE) = r8192_wx_get_gen_ie, 12103591733d287446edbeb14bbc36fb6f23a9f8cefdMike McCormack IW_IOCTL(SIOCSIWMLME) = r8192_wx_set_mlme, 12113591733d287446edbeb14bbc36fb6f23a9f8cefdMike McCormack IW_IOCTL(SIOCSIWAUTH) = r8192_wx_set_auth, 12123591733d287446edbeb14bbc36fb6f23a9f8cefdMike McCormack IW_IOCTL(SIOCSIWENCODEEXT) = r8192_wx_set_enc_ext, 121394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}; 121494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 121594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger/* 121694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * the following rule need to be follwing, 121794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * Odd : get (world access), 121894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * even : set (root access) 121994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * */ 122094a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic const struct iw_priv_args r8192_private_args[] = { 122194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger { 122294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger SIOCIWFIRSTPRIV + 0x0, 122394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "set_debugflag" 122408d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger }, { 122594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger SIOCIWFIRSTPRIV + 0x1, 122694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "activescan" 122708d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger }, { 122894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger SIOCIWFIRSTPRIV + 0x2, 122994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "rawtx" 123008d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger }, { 123194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger SIOCIWFIRSTPRIV + 0x3, 123294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "forcereset" 123308d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger }, { 123494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger SIOCIWFIRSTPRIV + 0x4, 123594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "force_mic_error" 123608d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger }, { 123794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger SIOCIWFIRSTPRIV + 0x5, 123894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger IW_PRIV_TYPE_NONE, IW_PRIV_TYPE_INT|IW_PRIV_SIZE_FIXED|1, 123994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger "firm_ver" 124008d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger }, { 124194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger SIOCIWFIRSTPRIV + 0x6, 124294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED|1, IW_PRIV_TYPE_NONE, 124394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger "set_power" 124408d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger }, { 124594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger SIOCIWFIRSTPRIV + 0x9, 124694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED|1, IW_PRIV_TYPE_NONE, 124794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger "radio" 124808d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger }, { 124994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger SIOCIWFIRSTPRIV + 0xa, 125094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED|1, IW_PRIV_TYPE_NONE, 125194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger "lps_interv" 125208d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger }, { 125394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger SIOCIWFIRSTPRIV + 0xb, 125494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED|1, IW_PRIV_TYPE_NONE, 125594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger "lps_force" 125608d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger }, { 125794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger SIOCIWFIRSTPRIV + 0xc, 125894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 0, IW_PRIV_TYPE_CHAR|2047, "adhoc_peer_list" 125908d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger }, { 126094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger SIOCIWFIRSTPRIV + 0x16, 126108d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 3, 0, "setpromisc" 126208d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger }, { 126394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger SIOCIWFIRSTPRIV + 0x17, 126408d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger 0, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | 45, "getpromisc" 126594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 126694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 126794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}; 126894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 126994a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic iw_handler r8192_private_handler[] = { 127094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger (iw_handler)r8192_wx_set_debugflag, /*SIOCIWSECONDPRIV*/ 127194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger (iw_handler)r8192_wx_set_scan_type, 127294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger (iw_handler)r8192_wx_set_rawtx, 127394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger (iw_handler)r8192_wx_force_reset, 127494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger (iw_handler)r8192_wx_force_mic_error, 127594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger (iw_handler)r8191se_wx_get_firm_version, 127694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger (iw_handler)r8192_wx_adapter_power_status, 127794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger (iw_handler)NULL, 127894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger (iw_handler)NULL, 127994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger (iw_handler)r8192se_wx_set_radio, 128094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger (iw_handler)r8192se_wx_set_lps_awake_interval, 128194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger (iw_handler)r8192se_wx_set_force_lps, 128294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger (iw_handler)r8192_wx_get_adhoc_peers, 128394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger (iw_handler)NULL, 128494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger (iw_handler)NULL, 128594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger (iw_handler)NULL, 128694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger (iw_handler)NULL, 128794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger (iw_handler)NULL, 128894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger (iw_handler)NULL, 128994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger (iw_handler)NULL, 129094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger (iw_handler)NULL, 129194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger (iw_handler)NULL, 129294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger (iw_handler)r8192_wx_set_PromiscuousMode, 129394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger (iw_handler)r8192_wx_get_PromiscuousMode, 129494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}; 129594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 129649aab5fd9df153a73992afa7cc386661d759c8e3Larry Fingerstatic struct iw_statistics *r8192_get_wireless_stats(struct net_device *dev) 129794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 129808d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger struct r8192_priv *priv = rtllib_priv(dev); 129908d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger struct rtllib_device *ieee = priv->rtllib; 130008d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger struct iw_statistics *wstats = &priv->wstats; 130194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger int tmp_level = 0; 130294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger int tmp_qual = 0; 130394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger int tmp_noise = 0; 130408d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger if (ieee->state < RTLLIB_LINKED) { 130594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger wstats->qual.qual = 10; 130694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger wstats->qual.level = 0; 130794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger wstats->qual.noise = -100; 130894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger wstats->qual.updated = IW_QUAL_ALL_UPDATED | IW_QUAL_DBM; 130994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return wstats; 131094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 131194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 131208d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger tmp_level = (&ieee->current_network)->stats.rssi; 131394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger tmp_qual = (&ieee->current_network)->stats.signal; 131494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger tmp_noise = (&ieee->current_network)->stats.noise; 131594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 131694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger wstats->qual.level = tmp_level; 131794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger wstats->qual.qual = tmp_qual; 131894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger wstats->qual.noise = tmp_noise; 131994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger wstats->qual.updated = IW_QUAL_ALL_UPDATED | IW_QUAL_DBM; 132094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return wstats; 132194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 132294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 132308d348a021213a16eb76b6e9937e91d1ec67a90bLarry Fingerstruct iw_handler_def r8192_wx_handlers_def = { 132494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger .standard = r8192_wx_handlers, 132594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger .num_standard = sizeof(r8192_wx_handlers) / sizeof(iw_handler), 132694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger .private = r8192_private_handler, 132794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger .num_private = sizeof(r8192_private_handler) / sizeof(iw_handler), 132808d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger .num_private_args = sizeof(r8192_private_args) / 132908d348a021213a16eb76b6e9937e91d1ec67a90bLarry Finger sizeof(struct iw_priv_args), 133094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger .get_wireless_stats = r8192_get_wireless_stats, 133194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger .private_args = (struct iw_priv_args *)r8192_private_args, 133294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}; 1333