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