/*
 *************************************************************************
 * Ralink Tech Inc.
 * 5F., No.36, Taiyuan St., Jhubei City,
 * Hsinchu County 302,
 * Taiwan, R.O.C.
 *
 * (c) Copyright 2002-2007, Ralink Technology, Inc.
 *
 * This program is free software; you can redistribute it and/or modify  *
 * it under the terms of the GNU General Public License as published by  *
 * the Free Software Foundation; either version 2 of the License, or     *
 * (at your option) any later version.                                   *
 *                                                                       *
 * This program is distributed in the hope that it will be useful,       *
 * but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 * GNU General Public License for more details.                          *
 *                                                                       *
 * You should have received a copy of the GNU General Public License     *
 * along with this program; if not, write to the                         *
 * Free Software Foundation, Inc.,                                       *
 * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 *                                                                       *
 *************************************************************************

    Module Name:
    sta_ioctl.c

    Abstract:
    IOCTL related subroutines

    Revision History:
    Who         When          What
    --------    ----------    ----------------------------------------------
    Rory Chen   01-03-2003    created
	Rory Chen   02-14-2005    modify to support RT61
*/

#include	"rt_config.h"

#ifdef DBG
extern unsigned long RTDebugLevel;
#endif

#define NR_WEP_KEYS 				4
#define WEP_SMALL_KEY_LEN 			(40/8)
#define WEP_LARGE_KEY_LEN 			(104/8)

#define GROUP_KEY_NO                4

extern u8 CipherWpa2Template[];

struct PACKED rt_version_info {
	u8 DriverVersionW;
	u8 DriverVersionX;
	u8 DriverVersionY;
	u8 DriverVersionZ;
	u32 DriverBuildYear;
	u32 DriverBuildMonth;
	u32 DriverBuildDay;
};

static __s32 ralinkrate[] = { 2, 4, 11, 22,	/* CCK */
	12, 18, 24, 36, 48, 72, 96, 108,	/* OFDM */
	13, 26, 39, 52, 78, 104, 117, 130, 26, 52, 78, 104, 156, 208, 234, 260,	/* 20MHz, 800ns GI, MCS: 0 ~ 15 */
	39, 78, 117, 156, 234, 312, 351, 390,	/* 20MHz, 800ns GI, MCS: 16 ~ 23 */
	27, 54, 81, 108, 162, 216, 243, 270, 54, 108, 162, 216, 324, 432, 486, 540,	/* 40MHz, 800ns GI, MCS: 0 ~ 15 */
	81, 162, 243, 324, 486, 648, 729, 810,	/* 40MHz, 800ns GI, MCS: 16 ~ 23 */
	14, 29, 43, 57, 87, 115, 130, 144, 29, 59, 87, 115, 173, 230, 260, 288,	/* 20MHz, 400ns GI, MCS: 0 ~ 15 */
	43, 87, 130, 173, 260, 317, 390, 433,	/* 20MHz, 400ns GI, MCS: 16 ~ 23 */
	30, 60, 90, 120, 180, 240, 270, 300, 60, 120, 180, 240, 360, 480, 540, 600,	/* 40MHz, 400ns GI, MCS: 0 ~ 15 */
	90, 180, 270, 360, 540, 720, 810, 900
};

int Set_SSID_Proc(struct rt_rtmp_adapter *pAdapter, char *arg);

int Set_NetworkType_Proc(struct rt_rtmp_adapter *pAdapter, char *arg);

void RTMPAddKey(struct rt_rtmp_adapter *pAd, struct rt_ndis_802_11_key *pKey)
{
	unsigned long KeyIdx;
	struct rt_mac_table_entry *pEntry;

	DBGPRINT(RT_DEBUG_TRACE, ("RTMPAddKey ------>\n"));

	if (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA) {
		if (pKey->KeyIndex & 0x80000000) {
			if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone) {
				NdisZeroMemory(pAd->StaCfg.PMK, 32);
				NdisMoveMemory(pAd->StaCfg.PMK,
					       pKey->KeyMaterial,
					       pKey->KeyLength);
				goto end;
			}
			/* Update PTK */
			NdisZeroMemory(&pAd->SharedKey[BSS0][0],
				       sizeof(struct rt_cipher_key));
			pAd->SharedKey[BSS0][0].KeyLen = LEN_TKIP_EK;
			NdisMoveMemory(pAd->SharedKey[BSS0][0].Key,
				       pKey->KeyMaterial, LEN_TKIP_EK);

			if (pAd->StaCfg.PairCipher ==
			    Ndis802_11Encryption2Enabled) {
				NdisMoveMemory(pAd->SharedKey[BSS0][0].RxMic,
					       pKey->KeyMaterial + LEN_TKIP_EK,
					       LEN_TKIP_TXMICK);
				NdisMoveMemory(pAd->SharedKey[BSS0][0].TxMic,
					       pKey->KeyMaterial + LEN_TKIP_EK +
					       LEN_TKIP_TXMICK,
					       LEN_TKIP_RXMICK);
			} else {
				NdisMoveMemory(pAd->SharedKey[BSS0][0].TxMic,
					       pKey->KeyMaterial + LEN_TKIP_EK,
					       LEN_TKIP_TXMICK);
				NdisMoveMemory(pAd->SharedKey[BSS0][0].RxMic,
					       pKey->KeyMaterial + LEN_TKIP_EK +
					       LEN_TKIP_TXMICK,
					       LEN_TKIP_RXMICK);
			}

			/* Decide its ChiperAlg */
			if (pAd->StaCfg.PairCipher ==
			    Ndis802_11Encryption2Enabled)
				pAd->SharedKey[BSS0][0].CipherAlg = CIPHER_TKIP;
			else if (pAd->StaCfg.PairCipher ==
				 Ndis802_11Encryption3Enabled)
				pAd->SharedKey[BSS0][0].CipherAlg = CIPHER_AES;
			else
				pAd->SharedKey[BSS0][0].CipherAlg = CIPHER_NONE;

			/* Update these related information to struct rt_mac_table_entry */
			pEntry = &pAd->MacTab.Content[BSSID_WCID];
			NdisMoveMemory(pEntry->PairwiseKey.Key,
				       pAd->SharedKey[BSS0][0].Key,
				       LEN_TKIP_EK);
			NdisMoveMemory(pEntry->PairwiseKey.RxMic,
				       pAd->SharedKey[BSS0][0].RxMic,
				       LEN_TKIP_RXMICK);
			NdisMoveMemory(pEntry->PairwiseKey.TxMic,
				       pAd->SharedKey[BSS0][0].TxMic,
				       LEN_TKIP_TXMICK);
			pEntry->PairwiseKey.CipherAlg =
			    pAd->SharedKey[BSS0][0].CipherAlg;

			/* Update pairwise key information to ASIC Shared Key Table */
			AsicAddSharedKeyEntry(pAd,
					      BSS0,
					      0,
					      pAd->SharedKey[BSS0][0].CipherAlg,
					      pAd->SharedKey[BSS0][0].Key,
					      pAd->SharedKey[BSS0][0].TxMic,
					      pAd->SharedKey[BSS0][0].RxMic);

			/* Update ASIC WCID attribute table and IVEIV table */
			RTMPAddWcidAttributeEntry(pAd,
						  BSS0,
						  0,
						  pAd->SharedKey[BSS0][0].
						  CipherAlg, pEntry);

			if (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA2) {
				/* set 802.1x port control */
				/*pAd->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED; */
				STA_PORT_SECURED(pAd);

				/* Indicate Connected for GUI */
				pAd->IndicateMediaState =
				    NdisMediaStateConnected;
			}
		} else {
			/* Update GTK */
			pAd->StaCfg.DefaultKeyId = (pKey->KeyIndex & 0xFF);
			NdisZeroMemory(&pAd->
				       SharedKey[BSS0][pAd->StaCfg.
						       DefaultKeyId],
				       sizeof(struct rt_cipher_key));
			pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].KeyLen =
			    LEN_TKIP_EK;
			NdisMoveMemory(pAd->
				       SharedKey[BSS0][pAd->StaCfg.
						       DefaultKeyId].Key,
				       pKey->KeyMaterial, LEN_TKIP_EK);

			if (pAd->StaCfg.GroupCipher ==
			    Ndis802_11Encryption2Enabled) {
				NdisMoveMemory(pAd->
					       SharedKey[BSS0][pAd->StaCfg.
							       DefaultKeyId].
					       RxMic,
					       pKey->KeyMaterial + LEN_TKIP_EK,
					       LEN_TKIP_TXMICK);
				NdisMoveMemory(pAd->
					       SharedKey[BSS0][pAd->StaCfg.
							       DefaultKeyId].
					       TxMic,
					       pKey->KeyMaterial + LEN_TKIP_EK +
					       LEN_TKIP_TXMICK,
					       LEN_TKIP_RXMICK);
			} else {
				NdisMoveMemory(pAd->
					       SharedKey[BSS0][pAd->StaCfg.
							       DefaultKeyId].
					       TxMic,
					       pKey->KeyMaterial + LEN_TKIP_EK,
					       LEN_TKIP_TXMICK);
				NdisMoveMemory(pAd->
					       SharedKey[BSS0][pAd->StaCfg.
							       DefaultKeyId].
					       RxMic,
					       pKey->KeyMaterial + LEN_TKIP_EK +
					       LEN_TKIP_TXMICK,
					       LEN_TKIP_RXMICK);
			}

			/* Update Shared Key CipherAlg */
			pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].
			    CipherAlg = CIPHER_NONE;
			if (pAd->StaCfg.GroupCipher ==
			    Ndis802_11Encryption2Enabled)
				pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].
				    CipherAlg = CIPHER_TKIP;
			else if (pAd->StaCfg.GroupCipher ==
				 Ndis802_11Encryption3Enabled)
				pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].
				    CipherAlg = CIPHER_AES;

			/* Update group key information to ASIC Shared Key Table */
			AsicAddSharedKeyEntry(pAd,
					      BSS0,
					      pAd->StaCfg.DefaultKeyId,
					      pAd->SharedKey[BSS0][pAd->StaCfg.
								   DefaultKeyId].
					      CipherAlg,
					      pAd->SharedKey[BSS0][pAd->StaCfg.
								   DefaultKeyId].
					      Key,
					      pAd->SharedKey[BSS0][pAd->StaCfg.
								   DefaultKeyId].
					      TxMic,
					      pAd->SharedKey[BSS0][pAd->StaCfg.
								   DefaultKeyId].
					      RxMic);

			/* Update ASIC WCID attribute table and IVEIV table */
			RTMPAddWcidAttributeEntry(pAd,
						  BSS0,
						  pAd->StaCfg.DefaultKeyId,
						  pAd->SharedKey[BSS0][pAd->
								       StaCfg.
								       DefaultKeyId].
						  CipherAlg, NULL);

			/* set 802.1x port control */
			/*pAd->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED; */
			STA_PORT_SECURED(pAd);

			/* Indicate Connected for GUI */
			pAd->IndicateMediaState = NdisMediaStateConnected;
		}
	} else			/* dynamic WEP from wpa_supplicant */
	{
		u8 CipherAlg;
		u8 *Key;

		if (pKey->KeyLength == 32)
			goto end;

		KeyIdx = pKey->KeyIndex & 0x0fffffff;

		if (KeyIdx < 4) {
			/* it is a default shared key, for Pairwise key setting */
			if (pKey->KeyIndex & 0x80000000) {
				pEntry = MacTableLookup(pAd, pKey->BSSID);

				if (pEntry) {
					DBGPRINT(RT_DEBUG_TRACE,
						 ("RTMPAddKey: Set Pair-wise Key\n"));

					/* set key material and key length */
					pEntry->PairwiseKey.KeyLen =
					    (u8)pKey->KeyLength;
					NdisMoveMemory(pEntry->PairwiseKey.Key,
						       &pKey->KeyMaterial,
						       pKey->KeyLength);

					/* set Cipher type */
					if (pKey->KeyLength == 5)
						pEntry->PairwiseKey.CipherAlg =
						    CIPHER_WEP64;
					else
						pEntry->PairwiseKey.CipherAlg =
						    CIPHER_WEP128;

					/* Add Pair-wise key to Asic */
					AsicAddPairwiseKeyEntry(pAd,
								pEntry->Addr,
								(u8)pEntry->
								Aid,
								&pEntry->
								PairwiseKey);

					/* update WCID attribute table and IVEIV table for this entry */
					RTMPAddWcidAttributeEntry(pAd, BSS0, KeyIdx,	/* The value may be not zero */
								  pEntry->
								  PairwiseKey.
								  CipherAlg,
								  pEntry);

				}
			} else {
				/* Default key for tx (shared key) */
				pAd->StaCfg.DefaultKeyId = (u8)KeyIdx;

				/* set key material and key length */
				pAd->SharedKey[BSS0][KeyIdx].KeyLen =
				    (u8)pKey->KeyLength;
				NdisMoveMemory(pAd->SharedKey[BSS0][KeyIdx].Key,
					       &pKey->KeyMaterial,
					       pKey->KeyLength);

				/* Set Ciper type */
				if (pKey->KeyLength == 5)
					pAd->SharedKey[BSS0][KeyIdx].CipherAlg =
					    CIPHER_WEP64;
				else
					pAd->SharedKey[BSS0][KeyIdx].CipherAlg =
					    CIPHER_WEP128;

				CipherAlg =
				    pAd->SharedKey[BSS0][KeyIdx].CipherAlg;
				Key = pAd->SharedKey[BSS0][KeyIdx].Key;

				/* Set Group key material to Asic */
				AsicAddSharedKeyEntry(pAd, BSS0, KeyIdx,
						      CipherAlg, Key, NULL,
						      NULL);

				/* Update WCID attribute table and IVEIV table for this group key table */
				RTMPAddWcidAttributeEntry(pAd, BSS0, KeyIdx,
							  CipherAlg, NULL);

			}
		}
	}
end:
	return;
}

char *rtstrchr(const char *s, int c)
{
	for (; *s != (char)c; ++s)
		if (*s == '\0')
			return NULL;
	return (char *)s;
}

/*
This is required for LinEX2004/kernel2.6.7 to provide iwlist scanning function
*/

int
rt_ioctl_giwname(struct net_device *dev,
		 struct iw_request_info *info, char *name, char *extra)
{
	strncpy(name, "Ralink STA", IFNAMSIZ);
	/* RT2870 2.1.0.0 uses "RT2870 Wireless" */
	/* RT3090 2.1.0.0 uses "RT2860 Wireless" */
	return 0;
}

int rt_ioctl_siwfreq(struct net_device *dev,
		     struct iw_request_info *info,
		     struct iw_freq *freq, char *extra)
{
	struct rt_rtmp_adapter *pAdapter = NULL;
	int chan = -1;

	GET_PAD_FROM_NET_DEV(pAdapter, dev);

	/*check if the interface is down */
	if (!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) {
		DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n"));
		return -ENETDOWN;
	}

	if (freq->e > 1)
		return -EINVAL;

	if ((freq->e == 0) && (freq->m <= 1000))
		chan = freq->m;	/* Setting by channel number */
	else
		MAP_KHZ_TO_CHANNEL_ID((freq->m / 100), chan);	/* Setting by frequency - search the table , like 2.412G, 2.422G, */

	if (ChannelSanity(pAdapter, chan) == TRUE) {
		pAdapter->CommonCfg.Channel = chan;
		DBGPRINT(RT_DEBUG_ERROR,
			 ("==>rt_ioctl_siwfreq::SIOCSIWFREQ[cmd=0x%x] (Channel=%d)\n",
			  SIOCSIWFREQ, pAdapter->CommonCfg.Channel));
	} else
		return -EINVAL;

	return 0;
}

int rt_ioctl_giwfreq(struct net_device *dev,
		     struct iw_request_info *info,
		     struct iw_freq *freq, char *extra)
{
	struct rt_rtmp_adapter *pAdapter = NULL;
	u8 ch;
	unsigned long m = 2412000;

	GET_PAD_FROM_NET_DEV(pAdapter, dev);

	ch = pAdapter->CommonCfg.Channel;

	DBGPRINT(RT_DEBUG_TRACE, ("==>rt_ioctl_giwfreq  %d\n", ch));

	MAP_CHANNEL_ID_TO_KHZ(ch, m);
	freq->m = m * 100;
	freq->e = 1;
	return 0;
}

int rt_ioctl_siwmode(struct net_device *dev,
		     struct iw_request_info *info, __u32 * mode, char *extra)
{
	struct rt_rtmp_adapter *pAdapter = NULL;

	GET_PAD_FROM_NET_DEV(pAdapter, dev);

	/*check if the interface is down */
	if (!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) {
		DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n"));
		return -ENETDOWN;
	}

	switch (*mode) {
	case IW_MODE_ADHOC:
		Set_NetworkType_Proc(pAdapter, "Adhoc");
		break;
	case IW_MODE_INFRA:
		Set_NetworkType_Proc(pAdapter, "Infra");
		break;
	case IW_MODE_MONITOR:
		Set_NetworkType_Proc(pAdapter, "Monitor");
		break;
	default:
		DBGPRINT(RT_DEBUG_TRACE,
			 ("===>rt_ioctl_siwmode::SIOCSIWMODE (unknown %d)\n",
			  *mode));
		return -EINVAL;
	}

	/* Reset Ralink supplicant to not use, it will be set to start when UI set PMK key */
	pAdapter->StaCfg.WpaState = SS_NOTUSE;

	return 0;
}

int rt_ioctl_giwmode(struct net_device *dev,
		     struct iw_request_info *info, __u32 * mode, char *extra)
{
	struct rt_rtmp_adapter *pAdapter = NULL;

	GET_PAD_FROM_NET_DEV(pAdapter, dev);

	if (ADHOC_ON(pAdapter))
		*mode = IW_MODE_ADHOC;
	else if (INFRA_ON(pAdapter))
		*mode = IW_MODE_INFRA;
	else if (MONITOR_ON(pAdapter)) {
		*mode = IW_MODE_MONITOR;
	} else
		*mode = IW_MODE_AUTO;

	DBGPRINT(RT_DEBUG_TRACE, ("==>rt_ioctl_giwmode(mode=%d)\n", *mode));
	return 0;
}

int rt_ioctl_siwsens(struct net_device *dev,
		     struct iw_request_info *info, char *name, char *extra)
{
	struct rt_rtmp_adapter *pAdapter = NULL;

	GET_PAD_FROM_NET_DEV(pAdapter, dev);

	/*check if the interface is down */
	if (!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) {
		DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n"));
		return -ENETDOWN;
	}

	return 0;
}

int rt_ioctl_giwsens(struct net_device *dev,
		     struct iw_request_info *info, char *name, char *extra)
{
	return 0;
}

int rt_ioctl_giwrange(struct net_device *dev,
		      struct iw_request_info *info,
		      struct iw_point *data, char *extra)
{
	struct rt_rtmp_adapter *pAdapter = NULL;
	struct iw_range *range = (struct iw_range *)extra;
	u16 val;
	int i;

	GET_PAD_FROM_NET_DEV(pAdapter, dev);

	DBGPRINT(RT_DEBUG_TRACE, ("===>rt_ioctl_giwrange\n"));
	data->length = sizeof(struct iw_range);
	memset(range, 0, sizeof(struct iw_range));

	range->txpower_capa = IW_TXPOW_DBM;

	if (INFRA_ON(pAdapter) || ADHOC_ON(pAdapter)) {
		range->min_pmp = 1 * 1024;
		range->max_pmp = 65535 * 1024;
		range->min_pmt = 1 * 1024;
		range->max_pmt = 1000 * 1024;
		range->pmp_flags = IW_POWER_PERIOD;
		range->pmt_flags = IW_POWER_TIMEOUT;
		range->pm_capa = IW_POWER_PERIOD | IW_POWER_TIMEOUT |
		    IW_POWER_UNICAST_R | IW_POWER_ALL_R;
	}

	range->we_version_compiled = WIRELESS_EXT;
	range->we_version_source = 14;

	range->retry_capa = IW_RETRY_LIMIT;
	range->retry_flags = IW_RETRY_LIMIT;
	range->min_retry = 0;
	range->max_retry = 255;

	range->num_channels = pAdapter->ChannelListNum;

	val = 0;
	for (i = 1; i <= range->num_channels; i++) {
		u32 m = 2412000;
		range->freq[val].i = pAdapter->ChannelList[i - 1].Channel;
		MAP_CHANNEL_ID_TO_KHZ(pAdapter->ChannelList[i - 1].Channel, m);
		range->freq[val].m = m * 100;	/* OS_HZ */

		range->freq[val].e = 1;
		val++;
		if (val == IW_MAX_FREQUENCIES)
			break;
	}
	range->num_frequency = val;

	range->max_qual.qual = 100;	/* what is correct max? This was not
					 * documented exactly. At least
					 * 69 has been observed. */
	range->max_qual.level = 0;	/* dB */
	range->max_qual.noise = 0;	/* dB */

	/* What would be suitable values for "average/typical" qual? */
	range->avg_qual.qual = 20;
	range->avg_qual.level = -60;
	range->avg_qual.noise = -95;
	range->sensitivity = 3;

	range->max_encoding_tokens = NR_WEP_KEYS;
	range->num_encoding_sizes = 2;
	range->encoding_size[0] = 5;
	range->encoding_size[1] = 13;

	range->min_rts = 0;
	range->max_rts = 2347;
	range->min_frag = 256;
	range->max_frag = 2346;

	/* IW_ENC_CAPA_* bit field */
	range->enc_capa = IW_ENC_CAPA_WPA | IW_ENC_CAPA_WPA2 |
	    IW_ENC_CAPA_CIPHER_TKIP | IW_ENC_CAPA_CIPHER_CCMP;

	return 0;
}

int rt_ioctl_siwap(struct net_device *dev,
		   struct iw_request_info *info,
		   struct sockaddr *ap_addr, char *extra)
{
	struct rt_rtmp_adapter *pAdapter = NULL;
	NDIS_802_11_MAC_ADDRESS Bssid;

	GET_PAD_FROM_NET_DEV(pAdapter, dev);

	/*check if the interface is down */
	if (!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) {
		DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n"));
		return -ENETDOWN;
	}

	if (pAdapter->Mlme.CntlMachine.CurrState != CNTL_IDLE) {
		RTMP_MLME_RESET_STATE_MACHINE(pAdapter);
		DBGPRINT(RT_DEBUG_TRACE,
			 ("MLME busy, reset MLME state machine!\n"));
	}
	/* tell CNTL state machine to call NdisMSetInformationComplete() after completing */
	/* this request, because this request is initiated by NDIS. */
	pAdapter->MlmeAux.CurrReqIsFromNdis = FALSE;
	/* Prevent to connect AP again in STAMlmePeriodicExec */
	pAdapter->MlmeAux.AutoReconnectSsidLen = 32;

	memcpy(Bssid, ap_addr->sa_data, MAC_ADDR_LEN);
	MlmeEnqueue(pAdapter,
		    MLME_CNTL_STATE_MACHINE,
		    OID_802_11_BSSID,
		    sizeof(NDIS_802_11_MAC_ADDRESS), (void *) & Bssid);

	DBGPRINT(RT_DEBUG_TRACE,
		 ("IOCTL::SIOCSIWAP %02x:%02x:%02x:%02x:%02x:%02x\n", Bssid[0],
		  Bssid[1], Bssid[2], Bssid[3], Bssid[4], Bssid[5]));

	return 0;
}

int rt_ioctl_giwap(struct net_device *dev,
		   struct iw_request_info *info,
		   struct sockaddr *ap_addr, char *extra)
{
	struct rt_rtmp_adapter *pAdapter = NULL;

	GET_PAD_FROM_NET_DEV(pAdapter, dev);

	if (INFRA_ON(pAdapter) || ADHOC_ON(pAdapter)) {
		ap_addr->sa_family = ARPHRD_ETHER;
		memcpy(ap_addr->sa_data, &pAdapter->CommonCfg.Bssid, ETH_ALEN);
	}
	/* Add for RT2870 */
	else if (pAdapter->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_DISABLE) {
		ap_addr->sa_family = ARPHRD_ETHER;
		memcpy(ap_addr->sa_data, &pAdapter->MlmeAux.Bssid, ETH_ALEN);
	} else {
		DBGPRINT(RT_DEBUG_TRACE, ("IOCTL::SIOCGIWAP(=EMPTY)\n"));
		return -ENOTCONN;
	}

	return 0;
}

/*
 * Units are in db above the noise floor. That means the
 * rssi values reported in the tx/rx descriptors in the
 * driver are the SNR expressed in db.
 *
 * If you assume that the noise floor is -95, which is an
 * excellent assumption 99.5 % of the time, then you can
 * derive the absolute signal level (i.e. -95 + rssi).
 * There are some other slight factors to take into account
 * depending on whether the rssi measurement is from 11b,
 * 11g, or 11a.   These differences are at most 2db and
 * can be documented.
 *
 * NB: various calculations are based on the orinoco/wavelan
 *     drivers for compatibility
 */
static void set_quality(struct rt_rtmp_adapter *pAdapter,
			struct iw_quality *iq, signed char rssi)
{
	__u8 ChannelQuality;

	/* Normalize Rssi */
	if (rssi >= -50)
		ChannelQuality = 100;
	else if (rssi >= -80)	/* between -50 ~ -80dbm */
		ChannelQuality = (__u8) (24 + ((rssi + 80) * 26) / 10);
	else if (rssi >= -90)	/* between -80 ~ -90dbm */
		ChannelQuality = (__u8) ((rssi + 90) * 26) / 10;
	else
		ChannelQuality = 0;

	iq->qual = (__u8) ChannelQuality;

	iq->level = (__u8) (rssi);
	iq->noise = (pAdapter->BbpWriteLatch[66] > pAdapter->BbpTuning.FalseCcaUpperThreshold) ? ((__u8) pAdapter->BbpTuning.FalseCcaUpperThreshold) : ((__u8) pAdapter->BbpWriteLatch[66]);	/* noise level (dBm) */
	iq->noise += 256 - 143;
	iq->updated = pAdapter->iw_stats.qual.updated;
}

int rt_ioctl_iwaplist(struct net_device *dev,
		      struct iw_request_info *info,
		      struct iw_point *data, char *extra)
{
	struct rt_rtmp_adapter *pAdapter = NULL;

	struct sockaddr addr[IW_MAX_AP];
	struct iw_quality qual[IW_MAX_AP];
	int i;

	GET_PAD_FROM_NET_DEV(pAdapter, dev);

	/*check if the interface is down */
	if (!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) {
		DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n"));
		data->length = 0;
		return 0;
		/*return -ENETDOWN; */
	}

	for (i = 0; i < IW_MAX_AP; i++) {
		if (i >= pAdapter->ScanTab.BssNr)
			break;
		addr[i].sa_family = ARPHRD_ETHER;
		memcpy(addr[i].sa_data, &pAdapter->ScanTab.BssEntry[i].Bssid,
		       MAC_ADDR_LEN);
		set_quality(pAdapter, &qual[i],
			    pAdapter->ScanTab.BssEntry[i].Rssi);
	}
	data->length = i;
	memcpy(extra, &addr, i * sizeof(addr[0]));
	data->flags = 1;	/* signal quality present (sort of) */
	memcpy(extra + i * sizeof(addr[0]), &qual, i * sizeof(qual[i]));

	return 0;
}

int rt_ioctl_siwscan(struct net_device *dev,
		     struct iw_request_info *info,
		     struct iw_point *data, char *extra)
{
	struct rt_rtmp_adapter *pAdapter = NULL;

	unsigned long Now;
	int Status = NDIS_STATUS_SUCCESS;

	GET_PAD_FROM_NET_DEV(pAdapter, dev);

	/*check if the interface is down */
	if (!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) {
		DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n"));
		return -ENETDOWN;
	}

	if (MONITOR_ON(pAdapter)) {
		DBGPRINT(RT_DEBUG_TRACE,
			 ("Driver is in Monitor Mode now!\n"));
		return -EINVAL;
	}

	if (pAdapter->StaCfg.WpaSupplicantUP == WPA_SUPPLICANT_ENABLE) {
		pAdapter->StaCfg.WpaSupplicantScanCount++;
	}

	pAdapter->StaCfg.bScanReqIsFromWebUI = TRUE;
	if (RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))
		return NDIS_STATUS_SUCCESS;
	do {
		Now = jiffies;

		if ((pAdapter->StaCfg.WpaSupplicantUP == WPA_SUPPLICANT_ENABLE)
		    && (pAdapter->StaCfg.WpaSupplicantScanCount > 3)) {
			DBGPRINT(RT_DEBUG_TRACE,
				 ("WpaSupplicantScanCount > 3\n"));
			Status = NDIS_STATUS_SUCCESS;
			break;
		}

		if ((OPSTATUS_TEST_FLAG
		     (pAdapter, fOP_STATUS_MEDIA_STATE_CONNECTED))
		    && ((pAdapter->StaCfg.AuthMode == Ndis802_11AuthModeWPA)
			|| (pAdapter->StaCfg.AuthMode ==
			    Ndis802_11AuthModeWPAPSK))
		    && (pAdapter->StaCfg.PortSecured ==
			WPA_802_1X_PORT_NOT_SECURED)) {
			DBGPRINT(RT_DEBUG_TRACE,
				 ("Link UP, Port Not Secured! ignore this set::OID_802_11_BSSID_LIST_SCAN\n"));
			Status = NDIS_STATUS_SUCCESS;
			break;
		}

		if (pAdapter->Mlme.CntlMachine.CurrState != CNTL_IDLE) {
			RTMP_MLME_RESET_STATE_MACHINE(pAdapter);
			DBGPRINT(RT_DEBUG_TRACE,
				 ("MLME busy, reset MLME state machine!\n"));
		}
		/* tell CNTL state machine to call NdisMSetInformationComplete() after completing */
		/* this request, because this request is initiated by NDIS. */
		pAdapter->MlmeAux.CurrReqIsFromNdis = FALSE;
		/* Reset allowed scan retries */
		pAdapter->StaCfg.ScanCnt = 0;
		pAdapter->StaCfg.LastScanTime = Now;

		MlmeEnqueue(pAdapter,
			    MLME_CNTL_STATE_MACHINE,
			    OID_802_11_BSSID_LIST_SCAN, 0, NULL);

		Status = NDIS_STATUS_SUCCESS;
		RTMP_MLME_HANDLER(pAdapter);
	} while (0);
	return NDIS_STATUS_SUCCESS;
}

int rt_ioctl_giwscan(struct net_device *dev,
		     struct iw_request_info *info,
		     struct iw_point *data, char *extra)
{
	struct rt_rtmp_adapter *pAdapter = NULL;
	int i = 0;
	char *current_ev = extra, *previous_ev = extra;
	char *end_buf;
	char *current_val;
	char custom[MAX_CUSTOM_LEN] = { 0 };
	struct iw_event iwe;

	GET_PAD_FROM_NET_DEV(pAdapter, dev);

	if (RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) {
		/*
		 * Still scanning, indicate the caller should try again.
		 */
		return -EAGAIN;
	}

	if (pAdapter->StaCfg.WpaSupplicantUP == WPA_SUPPLICANT_ENABLE) {
		pAdapter->StaCfg.WpaSupplicantScanCount = 0;
	}

	if (pAdapter->ScanTab.BssNr == 0) {
		data->length = 0;
		return 0;
	}

	if (data->length > 0)
		end_buf = extra + data->length;
	else
		end_buf = extra + IW_SCAN_MAX_DATA;

	for (i = 0; i < pAdapter->ScanTab.BssNr; i++) {
		if (current_ev >= end_buf) {
			return -E2BIG;
		}
		/*MAC address */
		/*================================ */
		memset(&iwe, 0, sizeof(iwe));
		iwe.cmd = SIOCGIWAP;
		iwe.u.ap_addr.sa_family = ARPHRD_ETHER;
		memcpy(iwe.u.ap_addr.sa_data,
		       &pAdapter->ScanTab.BssEntry[i].Bssid, ETH_ALEN);

		previous_ev = current_ev;
		current_ev =
		    iwe_stream_add_event(info, current_ev, end_buf, &iwe,
					 IW_EV_ADDR_LEN);
		if (current_ev == previous_ev)
			return -E2BIG;

		/*
		   Protocol:
		   it will show scanned AP's WirelessMode .
		   it might be
		   802.11a
		   802.11a/n
		   802.11g/n
		   802.11b/g/n
		   802.11g
		   802.11b/g
		 */
		memset(&iwe, 0, sizeof(iwe));
		iwe.cmd = SIOCGIWNAME;

		{
			struct rt_bss_entry *pBssEntry = &pAdapter->ScanTab.BssEntry[i];
			BOOLEAN isGonly = FALSE;
			int rateCnt = 0;

			if (pBssEntry->Channel > 14) {
				if (pBssEntry->HtCapabilityLen != 0)
					strcpy(iwe.u.name, "802.11a/n");
				else
					strcpy(iwe.u.name, "802.11a");
			} else {
				/*
				   if one of non B mode rate is set supported rate . it mean G only.
				 */
				for (rateCnt = 0;
				     rateCnt < pBssEntry->SupRateLen;
				     rateCnt++) {
					/*
					   6Mbps(140) 9Mbps(146) and >=12Mbps(152) are supported rate , it mean G only.
					 */
					if (pBssEntry->SupRate[rateCnt] == 140
					    || pBssEntry->SupRate[rateCnt] ==
					    146
					    || pBssEntry->SupRate[rateCnt] >=
					    152)
						isGonly = TRUE;
				}

				for (rateCnt = 0;
				     rateCnt < pBssEntry->ExtRateLen;
				     rateCnt++) {
					if (pBssEntry->ExtRate[rateCnt] == 140
					    || pBssEntry->ExtRate[rateCnt] ==
					    146
					    || pBssEntry->ExtRate[rateCnt] >=
					    152)
						isGonly = TRUE;
				}

				if (pBssEntry->HtCapabilityLen != 0) {
					if (isGonly == TRUE)
						strcpy(iwe.u.name, "802.11g/n");
					else
						strcpy(iwe.u.name,
						       "802.11b/g/n");
				} else {
					if (isGonly == TRUE)
						strcpy(iwe.u.name, "802.11g");
					else {
						if (pBssEntry->SupRateLen == 4
						    && pBssEntry->ExtRateLen ==
						    0)
							strcpy(iwe.u.name,
							       "802.11b");
						else
							strcpy(iwe.u.name,
							       "802.11b/g");
					}
				}
			}
		}

		previous_ev = current_ev;
		current_ev =
		    iwe_stream_add_event(info, current_ev, end_buf, &iwe,
					 IW_EV_ADDR_LEN);
		if (current_ev == previous_ev)
			return -E2BIG;

		/*ESSID */
		/*================================ */
		memset(&iwe, 0, sizeof(iwe));
		iwe.cmd = SIOCGIWESSID;
		iwe.u.data.length = pAdapter->ScanTab.BssEntry[i].SsidLen;
		iwe.u.data.flags = 1;

		previous_ev = current_ev;
		current_ev =
		    iwe_stream_add_point(info, current_ev, end_buf, &iwe,
					 (char *)pAdapter->ScanTab.
					 BssEntry[i].Ssid);
		if (current_ev == previous_ev)
			return -E2BIG;

		/*Network Type */
		/*================================ */
		memset(&iwe, 0, sizeof(iwe));
		iwe.cmd = SIOCGIWMODE;
		if (pAdapter->ScanTab.BssEntry[i].BssType == Ndis802_11IBSS) {
			iwe.u.mode = IW_MODE_ADHOC;
		} else if (pAdapter->ScanTab.BssEntry[i].BssType ==
			   Ndis802_11Infrastructure) {
			iwe.u.mode = IW_MODE_INFRA;
		} else {
			iwe.u.mode = IW_MODE_AUTO;
		}
		iwe.len = IW_EV_UINT_LEN;

		previous_ev = current_ev;
		current_ev =
		    iwe_stream_add_event(info, current_ev, end_buf, &iwe,
					 IW_EV_UINT_LEN);
		if (current_ev == previous_ev)
			return -E2BIG;

		/*Channel and Frequency */
		/*================================ */
		memset(&iwe, 0, sizeof(iwe));
		iwe.cmd = SIOCGIWFREQ;
		iwe.u.freq.m = pAdapter->ScanTab.BssEntry[i].Channel;
		iwe.u.freq.e = 0;
		iwe.u.freq.i = 0;

		previous_ev = current_ev;
		current_ev =
		    iwe_stream_add_event(info, current_ev, end_buf, &iwe,
					 IW_EV_FREQ_LEN);
		if (current_ev == previous_ev)
			return -E2BIG;

		/*Add quality statistics */
		/*================================ */
		memset(&iwe, 0, sizeof(iwe));
		iwe.cmd = IWEVQUAL;
		iwe.u.qual.level = 0;
		iwe.u.qual.noise = 0;
		set_quality(pAdapter, &iwe.u.qual,
			    pAdapter->ScanTab.BssEntry[i].Rssi);
		current_ev =
		    iwe_stream_add_event(info, current_ev, end_buf, &iwe,
					 IW_EV_QUAL_LEN);
		if (current_ev == previous_ev)
			return -E2BIG;

		/*Encyption key */
		/*================================ */
		memset(&iwe, 0, sizeof(iwe));
		iwe.cmd = SIOCGIWENCODE;
		if (CAP_IS_PRIVACY_ON
		    (pAdapter->ScanTab.BssEntry[i].CapabilityInfo))
			iwe.u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY;
		else
			iwe.u.data.flags = IW_ENCODE_DISABLED;

		previous_ev = current_ev;
		current_ev =
		    iwe_stream_add_point(info, current_ev, end_buf, &iwe,
					 (char *)pAdapter->
					 SharedKey[BSS0][(iwe.u.data.
							  flags &
							  IW_ENCODE_INDEX) -
							 1].Key);
		if (current_ev == previous_ev)
			return -E2BIG;

		/*Bit Rate */
		/*================================ */
		if (pAdapter->ScanTab.BssEntry[i].SupRateLen) {
			u8 tmpRate =
			    pAdapter->ScanTab.BssEntry[i].SupRate[pAdapter->
								  ScanTab.
								  BssEntry[i].
								  SupRateLen -
								  1];
			memset(&iwe, 0, sizeof(iwe));
			iwe.cmd = SIOCGIWRATE;
			current_val = current_ev + IW_EV_LCP_LEN;
			if (tmpRate == 0x82)
				iwe.u.bitrate.value = 1 * 1000000;
			else if (tmpRate == 0x84)
				iwe.u.bitrate.value = 2 * 1000000;
			else if (tmpRate == 0x8B)
				iwe.u.bitrate.value = 5.5 * 1000000;
			else if (tmpRate == 0x96)
				iwe.u.bitrate.value = 11 * 1000000;
			else
				iwe.u.bitrate.value = (tmpRate / 2) * 1000000;

			if (tmpRate == 0x6c
			    && pAdapter->ScanTab.BssEntry[i].HtCapabilityLen >
			    0) {
				int rate_count = ARRAY_SIZE(ralinkrate);
				struct rt_ht_cap_info capInfo =
				    pAdapter->ScanTab.BssEntry[i].HtCapability.
				    HtCapInfo;
				int shortGI =
				    capInfo.ChannelWidth ? capInfo.
				    ShortGIfor40 : capInfo.ShortGIfor20;
				int maxMCS =
				    pAdapter->ScanTab.BssEntry[i].HtCapability.
				    MCSSet[1] ? 15 : 7;
				int rate_index =
				    12 + ((u8)capInfo.ChannelWidth * 24) +
				    ((u8)shortGI * 48) + ((u8)maxMCS);

				if (rate_index < 0)
					rate_index = 0;
				if (rate_index >= rate_count)
					rate_index = rate_count - 1;
				iwe.u.bitrate.value =
				    ralinkrate[rate_index] * 500000;
			}

			iwe.u.bitrate.disabled = 0;
			current_val = iwe_stream_add_value(info, current_ev,
							   current_val, end_buf,
							   &iwe,
							   IW_EV_PARAM_LEN);

			if ((current_val - current_ev) > IW_EV_LCP_LEN)
				current_ev = current_val;
			else
				return -E2BIG;
		}
		/*WPA IE */
		if (pAdapter->ScanTab.BssEntry[i].WpaIE.IELen > 0) {
			memset(&iwe, 0, sizeof(iwe));
			memset(&custom[0], 0, MAX_CUSTOM_LEN);
			memcpy(custom,
			       &(pAdapter->ScanTab.BssEntry[i].WpaIE.IE[0]),
			       pAdapter->ScanTab.BssEntry[i].WpaIE.IELen);
			iwe.cmd = IWEVGENIE;
			iwe.u.data.length =
			    pAdapter->ScanTab.BssEntry[i].WpaIE.IELen;
			current_ev =
			    iwe_stream_add_point(info, current_ev, end_buf,
						 &iwe, custom);
			if (current_ev == previous_ev)
				return -E2BIG;
		}
		/*WPA2 IE */
		if (pAdapter->ScanTab.BssEntry[i].RsnIE.IELen > 0) {
			memset(&iwe, 0, sizeof(iwe));
			memset(&custom[0], 0, MAX_CUSTOM_LEN);
			memcpy(custom,
			       &(pAdapter->ScanTab.BssEntry[i].RsnIE.IE[0]),
			       pAdapter->ScanTab.BssEntry[i].RsnIE.IELen);
			iwe.cmd = IWEVGENIE;
			iwe.u.data.length =
			    pAdapter->ScanTab.BssEntry[i].RsnIE.IELen;
			current_ev =
			    iwe_stream_add_point(info, current_ev, end_buf,
						 &iwe, custom);
			if (current_ev == previous_ev)
				return -E2BIG;
		}
	}

	data->length = current_ev - extra;
	pAdapter->StaCfg.bScanReqIsFromWebUI = FALSE;
	DBGPRINT(RT_DEBUG_ERROR,
		 ("===>rt_ioctl_giwscan. %d(%d) BSS returned, data->length = %d\n",
		  i, pAdapter->ScanTab.BssNr, data->length));
	return 0;
}

int rt_ioctl_siwessid(struct net_device *dev,
		      struct iw_request_info *info,
		      struct iw_point *data, char *essid)
{
	struct rt_rtmp_adapter *pAdapter = NULL;

	GET_PAD_FROM_NET_DEV(pAdapter, dev);

	/*check if the interface is down */
	if (!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) {
		DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n"));
		return -ENETDOWN;
	}

	if (data->flags) {
		char *pSsidString = NULL;

		/* Includes null character. */
		if (data->length > (IW_ESSID_MAX_SIZE + 1))
			return -E2BIG;

		pSsidString = kmalloc(MAX_LEN_OF_SSID + 1, MEM_ALLOC_FLAG);
		if (pSsidString) {
			NdisZeroMemory(pSsidString, MAX_LEN_OF_SSID + 1);
			NdisMoveMemory(pSsidString, essid, data->length);
			if (Set_SSID_Proc(pAdapter, pSsidString) == FALSE)
				return -EINVAL;
		} else
			return -ENOMEM;
	} else {
		/* ANY ssid */
		if (Set_SSID_Proc(pAdapter, "") == FALSE)
			return -EINVAL;
	}
	return 0;
}

int rt_ioctl_giwessid(struct net_device *dev,
		      struct iw_request_info *info,
		      struct iw_point *data, char *essid)
{
	struct rt_rtmp_adapter *pAdapter = NULL;

	GET_PAD_FROM_NET_DEV(pAdapter, dev);

	data->flags = 1;
	if (MONITOR_ON(pAdapter)) {
		data->length = 0;
		return 0;
	}

	if (OPSTATUS_TEST_FLAG(pAdapter, fOP_STATUS_MEDIA_STATE_CONNECTED)) {
		DBGPRINT(RT_DEBUG_TRACE, ("MediaState is connected\n"));
		data->length = pAdapter->CommonCfg.SsidLen;
		memcpy(essid, pAdapter->CommonCfg.Ssid,
		       pAdapter->CommonCfg.SsidLen);
	}
#ifdef RTMP_MAC_USB
	/* Add for RT2870 */
	else if (pAdapter->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_DISABLE) {
		data->length = pAdapter->CommonCfg.SsidLen;
		memcpy(essid, pAdapter->CommonCfg.Ssid,
		       pAdapter->CommonCfg.SsidLen);
	}
#endif /* RTMP_MAC_USB // */
	else {			/*the ANY ssid was specified */
		data->length = 0;
		DBGPRINT(RT_DEBUG_TRACE,
			 ("MediaState is not connected, ess\n"));
	}

	return 0;

}

int rt_ioctl_siwnickn(struct net_device *dev,
		      struct iw_request_info *info,
		      struct iw_point *data, char *nickname)
{
	struct rt_rtmp_adapter *pAdapter = NULL;

	GET_PAD_FROM_NET_DEV(pAdapter, dev);

	/*check if the interface is down */
	if (!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) {
		DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n"));
		return -ENETDOWN;
	}

	if (data->length > IW_ESSID_MAX_SIZE)
		return -EINVAL;

	memset(pAdapter->nickname, 0, IW_ESSID_MAX_SIZE + 1);
	memcpy(pAdapter->nickname, nickname, data->length);

	return 0;
}

int rt_ioctl_giwnickn(struct net_device *dev,
		      struct iw_request_info *info,
		      struct iw_point *data, char *nickname)
{
	struct rt_rtmp_adapter *pAdapter = NULL;

	GET_PAD_FROM_NET_DEV(pAdapter, dev);

	if (data->length > strlen((char *)pAdapter->nickname) + 1)
		data->length = strlen((char *)pAdapter->nickname) + 1;
	if (data->length > 0) {
		memcpy(nickname, pAdapter->nickname, data->length - 1);
		nickname[data->length - 1] = '\0';
	}
	return 0;
}

int rt_ioctl_siwrts(struct net_device *dev,
		    struct iw_request_info *info,
		    struct iw_param *rts, char *extra)
{
	struct rt_rtmp_adapter *pAdapter = NULL;
	u16 val;

	GET_PAD_FROM_NET_DEV(pAdapter, dev);

	/*check if the interface is down */
	if (!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) {
		DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n"));
		return -ENETDOWN;
	}

	if (rts->disabled)
		val = MAX_RTS_THRESHOLD;
	else if (rts->value < 0 || rts->value > MAX_RTS_THRESHOLD)
		return -EINVAL;
	else if (rts->value == 0)
		val = MAX_RTS_THRESHOLD;
	else
		val = rts->value;

	if (val != pAdapter->CommonCfg.RtsThreshold)
		pAdapter->CommonCfg.RtsThreshold = val;

	return 0;
}

int rt_ioctl_giwrts(struct net_device *dev,
		    struct iw_request_info *info,
		    struct iw_param *rts, char *extra)
{
	struct rt_rtmp_adapter *pAdapter = NULL;

	GET_PAD_FROM_NET_DEV(pAdapter, dev);

	/*check if the interface is down */
	if (!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) {
		DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n"));
		return -ENETDOWN;
	}

	rts->value = pAdapter->CommonCfg.RtsThreshold;
	rts->disabled = (rts->value == MAX_RTS_THRESHOLD);
	rts->fixed = 1;

	return 0;
}

int rt_ioctl_siwfrag(struct net_device *dev,
		     struct iw_request_info *info,
		     struct iw_param *frag, char *extra)
{
	struct rt_rtmp_adapter *pAdapter = NULL;
	u16 val;

	GET_PAD_FROM_NET_DEV(pAdapter, dev);

	/*check if the interface is down */
	if (!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) {
		DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n"));
		return -ENETDOWN;
	}

	if (frag->disabled)
		val = MAX_FRAG_THRESHOLD;
	else if (frag->value >= MIN_FRAG_THRESHOLD
		 && frag->value <= MAX_FRAG_THRESHOLD)
		val = __cpu_to_le16(frag->value & ~0x1);	/* even numbers only */
	else if (frag->value == 0)
		val = MAX_FRAG_THRESHOLD;
	else
		return -EINVAL;

	pAdapter->CommonCfg.FragmentThreshold = val;
	return 0;
}

int rt_ioctl_giwfrag(struct net_device *dev,
		     struct iw_request_info *info,
		     struct iw_param *frag, char *extra)
{
	struct rt_rtmp_adapter *pAdapter = NULL;

	GET_PAD_FROM_NET_DEV(pAdapter, dev);

	/*check if the interface is down */
	if (!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) {
		DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n"));
		return -ENETDOWN;
	}

	frag->value = pAdapter->CommonCfg.FragmentThreshold;
	frag->disabled = (frag->value == MAX_FRAG_THRESHOLD);
	frag->fixed = 1;

	return 0;
}

#define MAX_WEP_KEY_SIZE 13
#define MIN_WEP_KEY_SIZE 5
int rt_ioctl_siwencode(struct net_device *dev,
		       struct iw_request_info *info,
		       struct iw_point *erq, char *extra)
{
	struct rt_rtmp_adapter *pAdapter = NULL;

	GET_PAD_FROM_NET_DEV(pAdapter, dev);

	/*check if the interface is down */
	if (!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) {
		DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n"));
		return -ENETDOWN;
	}

	if ((erq->length == 0) && (erq->flags & IW_ENCODE_DISABLED)) {
		pAdapter->StaCfg.PairCipher = Ndis802_11WEPDisabled;
		pAdapter->StaCfg.GroupCipher = Ndis802_11WEPDisabled;
		pAdapter->StaCfg.WepStatus = Ndis802_11WEPDisabled;
		pAdapter->StaCfg.OrigWepStatus = pAdapter->StaCfg.WepStatus;
		pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeOpen;
		goto done;
	} else if (erq->flags & IW_ENCODE_RESTRICTED
		   || erq->flags & IW_ENCODE_OPEN) {
		/*pAdapter->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED; */
		STA_PORT_SECURED(pAdapter);
		pAdapter->StaCfg.PairCipher = Ndis802_11WEPEnabled;
		pAdapter->StaCfg.GroupCipher = Ndis802_11WEPEnabled;
		pAdapter->StaCfg.WepStatus = Ndis802_11WEPEnabled;
		pAdapter->StaCfg.OrigWepStatus = pAdapter->StaCfg.WepStatus;
		if (erq->flags & IW_ENCODE_RESTRICTED)
			pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeShared;
		else
			pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeOpen;
	}

	if (erq->length > 0) {
		int keyIdx = (erq->flags & IW_ENCODE_INDEX) - 1;
		/* Check the size of the key */
		if (erq->length > MAX_WEP_KEY_SIZE) {
			return -EINVAL;
		}
		/* Check key index */
		if ((keyIdx < 0) || (keyIdx >= NR_WEP_KEYS)) {
			DBGPRINT(RT_DEBUG_TRACE,
				 ("==>rt_ioctl_siwencode::Wrong keyIdx=%d! Using default key instead (%d)\n",
				  keyIdx, pAdapter->StaCfg.DefaultKeyId));

			/*Using default key */
			keyIdx = pAdapter->StaCfg.DefaultKeyId;
		} else
			pAdapter->StaCfg.DefaultKeyId = keyIdx;

		NdisZeroMemory(pAdapter->SharedKey[BSS0][keyIdx].Key, 16);

		if (erq->length == MAX_WEP_KEY_SIZE) {
			pAdapter->SharedKey[BSS0][keyIdx].KeyLen =
			    MAX_WEP_KEY_SIZE;
			pAdapter->SharedKey[BSS0][keyIdx].CipherAlg =
			    CIPHER_WEP128;
		} else if (erq->length == MIN_WEP_KEY_SIZE) {
			pAdapter->SharedKey[BSS0][keyIdx].KeyLen =
			    MIN_WEP_KEY_SIZE;
			pAdapter->SharedKey[BSS0][keyIdx].CipherAlg =
			    CIPHER_WEP64;
		} else
			/* Disable the key */
			pAdapter->SharedKey[BSS0][keyIdx].KeyLen = 0;

		/* Check if the key is not marked as invalid */
		if (!(erq->flags & IW_ENCODE_NOKEY)) {
			/* Copy the key in the driver */
			NdisMoveMemory(pAdapter->SharedKey[BSS0][keyIdx].Key,
				       extra, erq->length);
		}
	} else {
		/* Do we want to just set the transmit key index ? */
		int index = (erq->flags & IW_ENCODE_INDEX) - 1;
		if ((index >= 0) && (index < 4)) {
			pAdapter->StaCfg.DefaultKeyId = index;
		} else
			/* Don't complain if only change the mode */
		if (!(erq->flags & IW_ENCODE_MODE))
			return -EINVAL;
	}

done:
	DBGPRINT(RT_DEBUG_TRACE,
		 ("==>rt_ioctl_siwencode::erq->flags=%x\n", erq->flags));
	DBGPRINT(RT_DEBUG_TRACE,
		 ("==>rt_ioctl_siwencode::AuthMode=%x\n",
		  pAdapter->StaCfg.AuthMode));
	DBGPRINT(RT_DEBUG_TRACE,
		 ("==>rt_ioctl_siwencode::DefaultKeyId=%x, KeyLen = %d\n",
		  pAdapter->StaCfg.DefaultKeyId,
		  pAdapter->SharedKey[BSS0][pAdapter->StaCfg.DefaultKeyId].
		  KeyLen));
	DBGPRINT(RT_DEBUG_TRACE,
		 ("==>rt_ioctl_siwencode::WepStatus=%x\n",
		  pAdapter->StaCfg.WepStatus));
	return 0;
}

int
rt_ioctl_giwencode(struct net_device *dev,
		   struct iw_request_info *info,
		   struct iw_point *erq, char *key)
{
	int kid;
	struct rt_rtmp_adapter *pAdapter = NULL;

	GET_PAD_FROM_NET_DEV(pAdapter, dev);

	/*check if the interface is down */
	if (!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) {
		DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n"));
		return -ENETDOWN;
	}

	kid = erq->flags & IW_ENCODE_INDEX;
	DBGPRINT(RT_DEBUG_TRACE,
		 ("===>rt_ioctl_giwencode %d\n", erq->flags & IW_ENCODE_INDEX));

	if (pAdapter->StaCfg.WepStatus == Ndis802_11WEPDisabled) {
		erq->length = 0;
		erq->flags = IW_ENCODE_DISABLED;
	} else if ((kid > 0) && (kid <= 4)) {
		/* copy wep key */
		erq->flags = kid;	/* NB: base 1 */
		if (erq->length > pAdapter->SharedKey[BSS0][kid - 1].KeyLen)
			erq->length = pAdapter->SharedKey[BSS0][kid - 1].KeyLen;
		memcpy(key, pAdapter->SharedKey[BSS0][kid - 1].Key,
		       erq->length);
		/*if ((kid == pAdapter->PortCfg.DefaultKeyId)) */
		/*erq->flags |= IW_ENCODE_ENABLED; */	/* XXX */
		if (pAdapter->StaCfg.AuthMode == Ndis802_11AuthModeShared)
			erq->flags |= IW_ENCODE_RESTRICTED;	/* XXX */
		else
			erq->flags |= IW_ENCODE_OPEN;	/* XXX */

	} else if (kid == 0) {
		if (pAdapter->StaCfg.AuthMode == Ndis802_11AuthModeShared)
			erq->flags |= IW_ENCODE_RESTRICTED;	/* XXX */
		else
			erq->flags |= IW_ENCODE_OPEN;	/* XXX */
		erq->length =
		    pAdapter->SharedKey[BSS0][pAdapter->StaCfg.DefaultKeyId].
		    KeyLen;
		memcpy(key,
		       pAdapter->SharedKey[BSS0][pAdapter->StaCfg.DefaultKeyId].
		       Key, erq->length);
		/* copy default key ID */
		if (pAdapter->StaCfg.AuthMode == Ndis802_11AuthModeShared)
			erq->flags |= IW_ENCODE_RESTRICTED;	/* XXX */
		else
			erq->flags |= IW_ENCODE_OPEN;	/* XXX */
		erq->flags = pAdapter->StaCfg.DefaultKeyId + 1;	/* NB: base 1 */
		erq->flags |= IW_ENCODE_ENABLED;	/* XXX */
	}

	return 0;

}

void getBaInfo(struct rt_rtmp_adapter *pAd, char *pOutBuf)
{
	int i, j;
	struct rt_ba_ori_entry *pOriBAEntry;
	struct rt_ba_rec_entry *pRecBAEntry;

	for (i = 0; i < MAX_LEN_OF_MAC_TABLE; i++) {
		struct rt_mac_table_entry *pEntry = &pAd->MacTab.Content[i];
		if (((pEntry->ValidAsCLI || pEntry->ValidAsApCli)
		     && (pEntry->Sst == SST_ASSOC))
		    || (pEntry->ValidAsWDS) || (pEntry->ValidAsMesh)) {
			sprintf(pOutBuf + strlen(pOutBuf),
				"\n%02X:%02X:%02X:%02X:%02X:%02X (Aid = %d) (AP) -\n",
				pEntry->Addr[0], pEntry->Addr[1],
				pEntry->Addr[2], pEntry->Addr[3],
				pEntry->Addr[4], pEntry->Addr[5], pEntry->Aid);

			sprintf(pOutBuf, "%s[Recipient]\n", pOutBuf);
			for (j = 0; j < NUM_OF_TID; j++) {
				if (pEntry->BARecWcidArray[j] != 0) {
					pRecBAEntry =
					    &pAd->BATable.BARecEntry[pEntry->
								     BARecWcidArray
								     [j]];
					sprintf(pOutBuf + strlen(pOutBuf),
						"TID=%d, BAWinSize=%d, LastIndSeq=%d, ReorderingPkts=%d\n",
						j, pRecBAEntry->BAWinSize,
						pRecBAEntry->LastIndSeq,
						pRecBAEntry->list.qlen);
				}
			}
			sprintf(pOutBuf, "%s\n", pOutBuf);

			sprintf(pOutBuf, "%s[Originator]\n", pOutBuf);
			for (j = 0; j < NUM_OF_TID; j++) {
				if (pEntry->BAOriWcidArray[j] != 0) {
					pOriBAEntry =
					    &pAd->BATable.BAOriEntry[pEntry->
								     BAOriWcidArray
								     [j]];
					sprintf(pOutBuf + strlen(pOutBuf),
						"TID=%d, BAWinSize=%d, StartSeq=%d, CurTxSeq=%d\n",
						j, pOriBAEntry->BAWinSize,
						pOriBAEntry->Sequence,
						pEntry->TxSeq[j]);
				}
			}
			sprintf(pOutBuf, "%s\n\n", pOutBuf);
		}
		if (strlen(pOutBuf) > (IW_PRIV_SIZE_MASK - 30))
			break;
	}

	return;
}

int rt_ioctl_siwmlme(struct net_device *dev,
		     struct iw_request_info *info,
		     union iwreq_data *wrqu, char *extra)
{
	struct rt_rtmp_adapter *pAd = NULL;
	struct iw_mlme *pMlme = (struct iw_mlme *)wrqu->data.pointer;
	struct rt_mlme_queue_elem MsgElem;
	struct rt_mlme_disassoc_req DisAssocReq;
	struct rt_mlme_deauth_req DeAuthReq;

	GET_PAD_FROM_NET_DEV(pAd, dev);

	DBGPRINT(RT_DEBUG_TRACE, ("====> %s\n", __func__));

	if (pMlme == NULL)
		return -EINVAL;

	switch (pMlme->cmd) {
#ifdef IW_MLME_DEAUTH
	case IW_MLME_DEAUTH:
		DBGPRINT(RT_DEBUG_TRACE,
			 ("====> %s - IW_MLME_DEAUTH\n", __func__));
		COPY_MAC_ADDR(DeAuthReq.Addr, pAd->CommonCfg.Bssid);
		DeAuthReq.Reason = pMlme->reason_code;
		MsgElem.MsgLen = sizeof(struct rt_mlme_deauth_req);
		NdisMoveMemory(MsgElem.Msg, &DeAuthReq,
			       sizeof(struct rt_mlme_deauth_req));
		MlmeDeauthReqAction(pAd, &MsgElem);
		if (INFRA_ON(pAd)) {
			LinkDown(pAd, FALSE);
			pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;
		}
		break;
#endif /* IW_MLME_DEAUTH // */
#ifdef IW_MLME_DISASSOC
	case IW_MLME_DISASSOC:
		DBGPRINT(RT_DEBUG_TRACE,
			 ("====> %s - IW_MLME_DISASSOC\n", __func__));
		COPY_MAC_ADDR(DisAssocReq.Addr, pAd->CommonCfg.Bssid);
		DisAssocReq.Reason = pMlme->reason_code;

		MsgElem.Machine = ASSOC_STATE_MACHINE;
		MsgElem.MsgType = MT2_MLME_DISASSOC_REQ;
		MsgElem.MsgLen = sizeof(struct rt_mlme_disassoc_req);
		NdisMoveMemory(MsgElem.Msg, &DisAssocReq,
			       sizeof(struct rt_mlme_disassoc_req));

		pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_DISASSOC;
		MlmeDisassocReqAction(pAd, &MsgElem);
		break;
#endif /* IW_MLME_DISASSOC // */
	default:
		DBGPRINT(RT_DEBUG_TRACE,
			 ("====> %s - Unknow Command\n", __func__));
		break;
	}

	return 0;
}

int rt_ioctl_siwauth(struct net_device *dev,
		     struct iw_request_info *info,
		     union iwreq_data *wrqu, char *extra)
{
	struct rt_rtmp_adapter *pAdapter = NULL;
	struct iw_param *param = &wrqu->param;

	GET_PAD_FROM_NET_DEV(pAdapter, dev);

	/*check if the interface is down */
	if (!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) {
		DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n"));
		return -ENETDOWN;
	}
	switch (param->flags & IW_AUTH_INDEX) {
	case IW_AUTH_WPA_VERSION:
		if (param->value == IW_AUTH_WPA_VERSION_WPA) {
			pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeWPAPSK;
			if (pAdapter->StaCfg.BssType == BSS_ADHOC)
				pAdapter->StaCfg.AuthMode =
				    Ndis802_11AuthModeWPANone;
		} else if (param->value == IW_AUTH_WPA_VERSION_WPA2)
			pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeWPA2PSK;

		DBGPRINT(RT_DEBUG_TRACE,
			 ("%s::IW_AUTH_WPA_VERSION - param->value = %d!\n",
			  __func__, param->value));
		break;
	case IW_AUTH_CIPHER_PAIRWISE:
		if (param->value == IW_AUTH_CIPHER_NONE) {
			pAdapter->StaCfg.WepStatus = Ndis802_11WEPDisabled;
			pAdapter->StaCfg.OrigWepStatus =
			    pAdapter->StaCfg.WepStatus;
			pAdapter->StaCfg.PairCipher = Ndis802_11WEPDisabled;
		} else if (param->value == IW_AUTH_CIPHER_WEP40 ||
			   param->value == IW_AUTH_CIPHER_WEP104) {
			pAdapter->StaCfg.WepStatus = Ndis802_11WEPEnabled;
			pAdapter->StaCfg.OrigWepStatus =
			    pAdapter->StaCfg.WepStatus;
			pAdapter->StaCfg.PairCipher = Ndis802_11WEPEnabled;
			pAdapter->StaCfg.IEEE8021X = FALSE;
		} else if (param->value == IW_AUTH_CIPHER_TKIP) {
			pAdapter->StaCfg.WepStatus =
			    Ndis802_11Encryption2Enabled;
			pAdapter->StaCfg.OrigWepStatus =
			    pAdapter->StaCfg.WepStatus;
			pAdapter->StaCfg.PairCipher =
			    Ndis802_11Encryption2Enabled;
		} else if (param->value == IW_AUTH_CIPHER_CCMP) {
			pAdapter->StaCfg.WepStatus =
			    Ndis802_11Encryption3Enabled;
			pAdapter->StaCfg.OrigWepStatus =
			    pAdapter->StaCfg.WepStatus;
			pAdapter->StaCfg.PairCipher =
			    Ndis802_11Encryption3Enabled;
		}
		DBGPRINT(RT_DEBUG_TRACE,
			 ("%s::IW_AUTH_CIPHER_PAIRWISE - param->value = %d!\n",
			  __func__, param->value));
		break;
	case IW_AUTH_CIPHER_GROUP:
		if (param->value == IW_AUTH_CIPHER_NONE) {
			pAdapter->StaCfg.GroupCipher = Ndis802_11WEPDisabled;
		} else if (param->value == IW_AUTH_CIPHER_WEP40 ||
			   param->value == IW_AUTH_CIPHER_WEP104) {
			pAdapter->StaCfg.GroupCipher = Ndis802_11WEPEnabled;
		} else if (param->value == IW_AUTH_CIPHER_TKIP) {
			pAdapter->StaCfg.GroupCipher =
			    Ndis802_11Encryption2Enabled;
		} else if (param->value == IW_AUTH_CIPHER_CCMP) {
			pAdapter->StaCfg.GroupCipher =
			    Ndis802_11Encryption3Enabled;
		}
		DBGPRINT(RT_DEBUG_TRACE,
			 ("%s::IW_AUTH_CIPHER_GROUP - param->value = %d!\n",
			  __func__, param->value));
		break;
	case IW_AUTH_KEY_MGMT:
		if (param->value == IW_AUTH_KEY_MGMT_802_1X) {
			if (pAdapter->StaCfg.AuthMode ==
			    Ndis802_11AuthModeWPAPSK) {
				pAdapter->StaCfg.AuthMode =
				    Ndis802_11AuthModeWPA;
				pAdapter->StaCfg.IEEE8021X = FALSE;
			} else if (pAdapter->StaCfg.AuthMode ==
				   Ndis802_11AuthModeWPA2PSK) {
				pAdapter->StaCfg.AuthMode =
				    Ndis802_11AuthModeWPA2;
				pAdapter->StaCfg.IEEE8021X = FALSE;
			} else
				/* WEP 1x */
				pAdapter->StaCfg.IEEE8021X = TRUE;
		} else if (param->value == 0) {
			/*pAdapter->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED; */
			STA_PORT_SECURED(pAdapter);
		}
		DBGPRINT(RT_DEBUG_TRACE,
			 ("%s::IW_AUTH_KEY_MGMT - param->value = %d!\n",
			  __func__, param->value));
		break;
	case IW_AUTH_RX_UNENCRYPTED_EAPOL:
		break;
	case IW_AUTH_PRIVACY_INVOKED:
		/*if (param->value == 0)
		   {
		   pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeOpen;
		   pAdapter->StaCfg.WepStatus = Ndis802_11WEPDisabled;
		   pAdapter->StaCfg.OrigWepStatus = pAdapter->StaCfg.WepStatus;
		   pAdapter->StaCfg.PairCipher = Ndis802_11WEPDisabled;
		   pAdapter->StaCfg.GroupCipher = Ndis802_11WEPDisabled;
		   } */
		DBGPRINT(RT_DEBUG_TRACE,
			 ("%s::IW_AUTH_PRIVACY_INVOKED - param->value = %d!\n",
			  __func__, param->value));
		break;
	case IW_AUTH_DROP_UNENCRYPTED:
		if (param->value != 0)
			pAdapter->StaCfg.PortSecured =
			    WPA_802_1X_PORT_NOT_SECURED;
		else {
			/*pAdapter->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED; */
			STA_PORT_SECURED(pAdapter);
		}
		DBGPRINT(RT_DEBUG_TRACE,
			 ("%s::IW_AUTH_WPA_VERSION - param->value = %d!\n",
			  __func__, param->value));
		break;
	case IW_AUTH_80211_AUTH_ALG:
		if (param->value & IW_AUTH_ALG_SHARED_KEY) {
			pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeShared;
		} else if (param->value & IW_AUTH_ALG_OPEN_SYSTEM) {
			pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeOpen;
		} else
			return -EINVAL;
		DBGPRINT(RT_DEBUG_TRACE,
			 ("%s::IW_AUTH_80211_AUTH_ALG - param->value = %d!\n",
			  __func__, param->value));
		break;
	case IW_AUTH_WPA_ENABLED:
		DBGPRINT(RT_DEBUG_TRACE,
			 ("%s::IW_AUTH_WPA_ENABLED - Driver supports WPA!(param->value = %d)\n",
			  __func__, param->value));
		break;
	default:
		return -EOPNOTSUPP;
	}

	return 0;
}

int rt_ioctl_giwauth(struct net_device *dev,
		     struct iw_request_info *info,
		     union iwreq_data *wrqu, char *extra)
{
	struct rt_rtmp_adapter *pAdapter = NULL;
	struct iw_param *param = &wrqu->param;

	GET_PAD_FROM_NET_DEV(pAdapter, dev);

	/*check if the interface is down */
	if (!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) {
		DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n"));
		return -ENETDOWN;
	}

	switch (param->flags & IW_AUTH_INDEX) {
	case IW_AUTH_DROP_UNENCRYPTED:
		param->value =
		    (pAdapter->StaCfg.WepStatus ==
		     Ndis802_11WEPDisabled) ? 0 : 1;
		break;

	case IW_AUTH_80211_AUTH_ALG:
		param->value =
		    (pAdapter->StaCfg.AuthMode ==
		     Ndis802_11AuthModeShared) ? IW_AUTH_ALG_SHARED_KEY :
		    IW_AUTH_ALG_OPEN_SYSTEM;
		break;

	case IW_AUTH_WPA_ENABLED:
		param->value =
		    (pAdapter->StaCfg.AuthMode >=
		     Ndis802_11AuthModeWPA) ? 1 : 0;
		break;

	default:
		return -EOPNOTSUPP;
	}
	DBGPRINT(RT_DEBUG_TRACE,
		 ("rt_ioctl_giwauth::param->value = %d!\n", param->value));
	return 0;
}

void fnSetCipherKey(struct rt_rtmp_adapter *pAdapter,
		    int keyIdx,
		    u8 CipherAlg,
		    IN BOOLEAN bGTK, IN struct iw_encode_ext *ext)
{
	NdisZeroMemory(&pAdapter->SharedKey[BSS0][keyIdx], sizeof(struct rt_cipher_key));
	pAdapter->SharedKey[BSS0][keyIdx].KeyLen = LEN_TKIP_EK;
	NdisMoveMemory(pAdapter->SharedKey[BSS0][keyIdx].Key, ext->key,
		       LEN_TKIP_EK);
	NdisMoveMemory(pAdapter->SharedKey[BSS0][keyIdx].TxMic,
		       ext->key + LEN_TKIP_EK, LEN_TKIP_TXMICK);
	NdisMoveMemory(pAdapter->SharedKey[BSS0][keyIdx].RxMic,
		       ext->key + LEN_TKIP_EK + LEN_TKIP_TXMICK,
		       LEN_TKIP_RXMICK);
	pAdapter->SharedKey[BSS0][keyIdx].CipherAlg = CipherAlg;

	/* Update group key information to ASIC Shared Key Table */
	AsicAddSharedKeyEntry(pAdapter,
			      BSS0,
			      keyIdx,
			      pAdapter->SharedKey[BSS0][keyIdx].CipherAlg,
			      pAdapter->SharedKey[BSS0][keyIdx].Key,
			      pAdapter->SharedKey[BSS0][keyIdx].TxMic,
			      pAdapter->SharedKey[BSS0][keyIdx].RxMic);

	if (bGTK)
		/* Update ASIC WCID attribute table and IVEIV table */
		RTMPAddWcidAttributeEntry(pAdapter,
					  BSS0,
					  keyIdx,
					  pAdapter->SharedKey[BSS0][keyIdx].
					  CipherAlg, NULL);
	else
		/* Update ASIC WCID attribute table and IVEIV table */
		RTMPAddWcidAttributeEntry(pAdapter,
					  BSS0,
					  keyIdx,
					  pAdapter->SharedKey[BSS0][keyIdx].
					  CipherAlg,
					  &pAdapter->MacTab.
					  Content[BSSID_WCID]);
}

int rt_ioctl_siwencodeext(struct net_device *dev,
			  struct iw_request_info *info,
			  union iwreq_data *wrqu, char *extra)
{
	struct rt_rtmp_adapter *pAdapter = NULL;
	struct iw_point *encoding = &wrqu->encoding;
	struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;
	int keyIdx, alg = ext->alg;

	GET_PAD_FROM_NET_DEV(pAdapter, dev);

	/*check if the interface is down */
	if (!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) {
		DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n"));
		return -ENETDOWN;
	}

	if (encoding->flags & IW_ENCODE_DISABLED) {
		keyIdx = (encoding->flags & IW_ENCODE_INDEX) - 1;
		/* set BSSID wcid entry of the Pair-wise Key table as no-security mode */
		AsicRemovePairwiseKeyEntry(pAdapter, BSS0, BSSID_WCID);
		pAdapter->SharedKey[BSS0][keyIdx].KeyLen = 0;
		pAdapter->SharedKey[BSS0][keyIdx].CipherAlg = CIPHER_NONE;
		AsicRemoveSharedKeyEntry(pAdapter, 0, (u8)keyIdx);
		NdisZeroMemory(&pAdapter->SharedKey[BSS0][keyIdx],
			       sizeof(struct rt_cipher_key));
		DBGPRINT(RT_DEBUG_TRACE,
			 ("%s::Remove all keys!(encoding->flags = %x)\n",
			  __func__, encoding->flags));
	} else {
		/* Get Key Index and convet to our own defined key index */
		keyIdx = (encoding->flags & IW_ENCODE_INDEX) - 1;
		if ((keyIdx < 0) || (keyIdx >= NR_WEP_KEYS))
			return -EINVAL;

		if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) {
			pAdapter->StaCfg.DefaultKeyId = keyIdx;
			DBGPRINT(RT_DEBUG_TRACE,
				 ("%s::DefaultKeyId = %d\n", __func__,
				  pAdapter->StaCfg.DefaultKeyId));
		}

		switch (alg) {
		case IW_ENCODE_ALG_NONE:
			DBGPRINT(RT_DEBUG_TRACE,
				 ("%s::IW_ENCODE_ALG_NONE\n", __func__));
			break;
		case IW_ENCODE_ALG_WEP:
			DBGPRINT(RT_DEBUG_TRACE,
				 ("%s::IW_ENCODE_ALG_WEP - ext->key_len = %d, keyIdx = %d\n",
				  __func__, ext->key_len, keyIdx));
			if (ext->key_len == MAX_WEP_KEY_SIZE) {
				pAdapter->SharedKey[BSS0][keyIdx].KeyLen =
				    MAX_WEP_KEY_SIZE;
				pAdapter->SharedKey[BSS0][keyIdx].CipherAlg =
				    CIPHER_WEP128;
			} else if (ext->key_len == MIN_WEP_KEY_SIZE) {
				pAdapter->SharedKey[BSS0][keyIdx].KeyLen =
				    MIN_WEP_KEY_SIZE;
				pAdapter->SharedKey[BSS0][keyIdx].CipherAlg =
				    CIPHER_WEP64;
			} else
				return -EINVAL;

			NdisZeroMemory(pAdapter->SharedKey[BSS0][keyIdx].Key,
				       16);
			NdisMoveMemory(pAdapter->SharedKey[BSS0][keyIdx].Key,
				       ext->key, ext->key_len);
			if (pAdapter->StaCfg.GroupCipher ==
			    Ndis802_11GroupWEP40Enabled
			    || pAdapter->StaCfg.GroupCipher ==
			    Ndis802_11GroupWEP104Enabled) {
				/* Set Group key material to Asic */
				AsicAddSharedKeyEntry(pAdapter, BSS0, keyIdx,
						      pAdapter->
						      SharedKey[BSS0][keyIdx].
						      CipherAlg,
						      pAdapter->
						      SharedKey[BSS0][keyIdx].
						      Key, NULL, NULL);

				/* Update WCID attribute table and IVEIV table for this group key table */
				RTMPAddWcidAttributeEntry(pAdapter, BSS0,
							  keyIdx,
							  pAdapter->
							  SharedKey[BSS0]
							  [keyIdx].CipherAlg,
							  NULL);

				STA_PORT_SECURED(pAdapter);

				/* Indicate Connected for GUI */
				pAdapter->IndicateMediaState =
				    NdisMediaStateConnected;
			}
			break;
		case IW_ENCODE_ALG_TKIP:
			DBGPRINT(RT_DEBUG_TRACE,
				 ("%s::IW_ENCODE_ALG_TKIP - keyIdx = %d, ext->key_len = %d\n",
				  __func__, keyIdx, ext->key_len));
			if (ext->key_len == 32) {
				if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) {
					fnSetCipherKey(pAdapter, keyIdx,
						       CIPHER_TKIP, FALSE, ext);
					if (pAdapter->StaCfg.AuthMode >=
					    Ndis802_11AuthModeWPA2) {
						/*pAdapter->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED; */
						STA_PORT_SECURED(pAdapter);
						pAdapter->IndicateMediaState =
						    NdisMediaStateConnected;
					}
				} else if (ext->
					   ext_flags & IW_ENCODE_EXT_GROUP_KEY)
				{
					fnSetCipherKey(pAdapter, keyIdx,
						       CIPHER_TKIP, TRUE, ext);

					/* set 802.1x port control */
					/*pAdapter->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED; */
					STA_PORT_SECURED(pAdapter);
					pAdapter->IndicateMediaState =
					    NdisMediaStateConnected;
				}
			} else
				return -EINVAL;
			break;
		case IW_ENCODE_ALG_CCMP:
			if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) {
				fnSetCipherKey(pAdapter, keyIdx, CIPHER_AES,
					       FALSE, ext);
				if (pAdapter->StaCfg.AuthMode >=
				    Ndis802_11AuthModeWPA2)
					/*pAdapter->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED; */
					STA_PORT_SECURED(pAdapter);
				pAdapter->IndicateMediaState =
				    NdisMediaStateConnected;
			} else if (ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY) {
				fnSetCipherKey(pAdapter, keyIdx, CIPHER_AES,
					       TRUE, ext);

				/* set 802.1x port control */
				/*pAdapter->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED; */
				STA_PORT_SECURED(pAdapter);
				pAdapter->IndicateMediaState =
				    NdisMediaStateConnected;
			}
			break;
		default:
			return -EINVAL;
		}
	}

	return 0;
}

int
rt_ioctl_giwencodeext(struct net_device *dev,
		      struct iw_request_info *info,
		      union iwreq_data *wrqu, char *extra)
{
	struct rt_rtmp_adapter *pAd = NULL;
	char *pKey = NULL;
	struct iw_point *encoding = &wrqu->encoding;
	struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;
	int idx, max_key_len;

	GET_PAD_FROM_NET_DEV(pAd, dev);

	DBGPRINT(RT_DEBUG_TRACE, ("===> rt_ioctl_giwencodeext\n"));

	max_key_len = encoding->length - sizeof(*ext);
	if (max_key_len < 0)
		return -EINVAL;

	idx = encoding->flags & IW_ENCODE_INDEX;
	if (idx) {
		if (idx < 1 || idx > 4)
			return -EINVAL;
		idx--;

		if ((pAd->StaCfg.WepStatus == Ndis802_11Encryption2Enabled) ||
		    (pAd->StaCfg.WepStatus == Ndis802_11Encryption3Enabled)) {
			if (idx != pAd->StaCfg.DefaultKeyId) {
				ext->key_len = 0;
				return 0;
			}
		}
	} else
		idx = pAd->StaCfg.DefaultKeyId;

	encoding->flags = idx + 1;
	memset(ext, 0, sizeof(*ext));

	ext->key_len = 0;
	switch (pAd->StaCfg.WepStatus) {
	case Ndis802_11WEPDisabled:
		ext->alg = IW_ENCODE_ALG_NONE;
		encoding->flags |= IW_ENCODE_DISABLED;
		break;
	case Ndis802_11WEPEnabled:
		ext->alg = IW_ENCODE_ALG_WEP;
		if (pAd->SharedKey[BSS0][idx].KeyLen > max_key_len)
			return -E2BIG;
		else {
			ext->key_len = pAd->SharedKey[BSS0][idx].KeyLen;
			pKey = (char *)& (pAd->SharedKey[BSS0][idx].Key[0]);
		}
		break;
	case Ndis802_11Encryption2Enabled:
	case Ndis802_11Encryption3Enabled:
		if (pAd->StaCfg.WepStatus == Ndis802_11Encryption2Enabled)
			ext->alg = IW_ENCODE_ALG_TKIP;
		else
			ext->alg = IW_ENCODE_ALG_CCMP;

		if (max_key_len < 32)
			return -E2BIG;
		else {
			ext->key_len = 32;
			pKey = (char *)& pAd->StaCfg.PMK[0];
		}
		break;
	default:
		return -EINVAL;
	}

	if (ext->key_len && pKey) {
		encoding->flags |= IW_ENCODE_ENABLED;
		memcpy(ext->key, pKey, ext->key_len);
	}

	return 0;
}

int rt_ioctl_siwgenie(struct net_device *dev,
		      struct iw_request_info *info,
		      union iwreq_data *wrqu, char *extra)
{
	struct rt_rtmp_adapter *pAd = NULL;

	GET_PAD_FROM_NET_DEV(pAd, dev);

	DBGPRINT(RT_DEBUG_TRACE, ("===> rt_ioctl_siwgenie\n"));
	pAd->StaCfg.bRSN_IE_FromWpaSupplicant = FALSE;
	if (wrqu->data.length > MAX_LEN_OF_RSNIE ||
	    (wrqu->data.length && extra == NULL))
		return -EINVAL;

	if (wrqu->data.length) {
		pAd->StaCfg.RSNIE_Len = wrqu->data.length;
		NdisMoveMemory(&pAd->StaCfg.RSN_IE[0], extra,
			       pAd->StaCfg.RSNIE_Len);
		pAd->StaCfg.bRSN_IE_FromWpaSupplicant = TRUE;
	} else {
		pAd->StaCfg.RSNIE_Len = 0;
		NdisZeroMemory(&pAd->StaCfg.RSN_IE[0], MAX_LEN_OF_RSNIE);
	}

	return 0;
}

int rt_ioctl_giwgenie(struct net_device *dev,
		      struct iw_request_info *info,
		      union iwreq_data *wrqu, char *extra)
{
	struct rt_rtmp_adapter *pAd = NULL;

	GET_PAD_FROM_NET_DEV(pAd, dev);

	if ((pAd->StaCfg.RSNIE_Len == 0) ||
	    (pAd->StaCfg.AuthMode < Ndis802_11AuthModeWPA)) {
		wrqu->data.length = 0;
		return 0;
	}

	if (pAd->StaCfg.WpaSupplicantUP == WPA_SUPPLICANT_ENABLE) {
		if (wrqu->data.length < pAd->StaCfg.RSNIE_Len)
			return -E2BIG;

		wrqu->data.length = pAd->StaCfg.RSNIE_Len;
		memcpy(extra, &pAd->StaCfg.RSN_IE[0], pAd->StaCfg.RSNIE_Len);
	} else {
		u8 RSNIe = IE_WPA;

		if (wrqu->data.length < (pAd->StaCfg.RSNIE_Len + 2))	/* ID, Len */
			return -E2BIG;
		wrqu->data.length = pAd->StaCfg.RSNIE_Len + 2;

		if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK) ||
		    (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2))
			RSNIe = IE_RSN;

		extra[0] = (char)RSNIe;
		extra[1] = pAd->StaCfg.RSNIE_Len;
		memcpy(extra + 2, &pAd->StaCfg.RSN_IE[0],
		       pAd->StaCfg.RSNIE_Len);
	}

	return 0;
}

int rt_ioctl_siwpmksa(struct net_device *dev,
		      struct iw_request_info *info,
		      union iwreq_data *wrqu, char *extra)
{
	struct rt_rtmp_adapter *pAd = NULL;
	struct iw_pmksa *pPmksa = (struct iw_pmksa *)wrqu->data.pointer;
	int CachedIdx = 0, idx = 0;

	GET_PAD_FROM_NET_DEV(pAd, dev);

	if (pPmksa == NULL)
		return -EINVAL;

	DBGPRINT(RT_DEBUG_TRACE, ("===> rt_ioctl_siwpmksa\n"));
	switch (pPmksa->cmd) {
	case IW_PMKSA_FLUSH:
		NdisZeroMemory(pAd->StaCfg.SavedPMK,
			       sizeof(struct rt_bssid_info) * PMKID_NO);
		DBGPRINT(RT_DEBUG_TRACE,
			 ("rt_ioctl_siwpmksa - IW_PMKSA_FLUSH\n"));
		break;
	case IW_PMKSA_REMOVE:
		for (CachedIdx = 0; CachedIdx < pAd->StaCfg.SavedPMKNum;
		     CachedIdx++) {
			/* compare the BSSID */
			if (NdisEqualMemory
			    (pPmksa->bssid.sa_data,
			     pAd->StaCfg.SavedPMK[CachedIdx].BSSID,
			     MAC_ADDR_LEN)) {
				NdisZeroMemory(pAd->StaCfg.SavedPMK[CachedIdx].
					       BSSID, MAC_ADDR_LEN);
				NdisZeroMemory(pAd->StaCfg.SavedPMK[CachedIdx].
					       PMKID, 16);
				for (idx = CachedIdx;
				     idx < (pAd->StaCfg.SavedPMKNum - 1);
				     idx++) {
					NdisMoveMemory(&pAd->StaCfg.
						       SavedPMK[idx].BSSID[0],
						       &pAd->StaCfg.
						       SavedPMK[idx +
								1].BSSID[0],
						       MAC_ADDR_LEN);
					NdisMoveMemory(&pAd->StaCfg.
						       SavedPMK[idx].PMKID[0],
						       &pAd->StaCfg.
						       SavedPMK[idx +
								1].PMKID[0],
						       16);
				}
				pAd->StaCfg.SavedPMKNum--;
				break;
			}
		}

		DBGPRINT(RT_DEBUG_TRACE,
			 ("rt_ioctl_siwpmksa - IW_PMKSA_REMOVE\n"));
		break;
	case IW_PMKSA_ADD:
		for (CachedIdx = 0; CachedIdx < pAd->StaCfg.SavedPMKNum;
		     CachedIdx++) {
			/* compare the BSSID */
			if (NdisEqualMemory
			    (pPmksa->bssid.sa_data,
			     pAd->StaCfg.SavedPMK[CachedIdx].BSSID,
			     MAC_ADDR_LEN))
				break;
		}

		/* Found, replace it */
		if (CachedIdx < PMKID_NO) {
			DBGPRINT(RT_DEBUG_OFF,
				 ("Update PMKID, idx = %d\n", CachedIdx));
			NdisMoveMemory(&pAd->StaCfg.SavedPMK[CachedIdx].
				       BSSID[0], pPmksa->bssid.sa_data,
				       MAC_ADDR_LEN);
			NdisMoveMemory(&pAd->StaCfg.SavedPMK[CachedIdx].
				       PMKID[0], pPmksa->pmkid, 16);
			pAd->StaCfg.SavedPMKNum++;
		}
		/* Not found, replace the last one */
		else {
			/* Randomly replace one */
			CachedIdx = (pPmksa->bssid.sa_data[5] % PMKID_NO);
			DBGPRINT(RT_DEBUG_OFF,
				 ("Update PMKID, idx = %d\n", CachedIdx));
			NdisMoveMemory(&pAd->StaCfg.SavedPMK[CachedIdx].
				       BSSID[0], pPmksa->bssid.sa_data,
				       MAC_ADDR_LEN);
			NdisMoveMemory(&pAd->StaCfg.SavedPMK[CachedIdx].
				       PMKID[0], pPmksa->pmkid, 16);
		}

		DBGPRINT(RT_DEBUG_TRACE,
			 ("rt_ioctl_siwpmksa - IW_PMKSA_ADD\n"));
		break;
	default:
		DBGPRINT(RT_DEBUG_TRACE,
			 ("rt_ioctl_siwpmksa - Unknown Command!\n"));
		break;
	}

	return 0;
}

int rt_ioctl_siwrate(struct net_device *dev,
		     struct iw_request_info *info,
		     union iwreq_data *wrqu, char *extra)
{
	struct rt_rtmp_adapter *pAd = NULL;
	u32 rate = wrqu->bitrate.value, fixed = wrqu->bitrate.fixed;

	GET_PAD_FROM_NET_DEV(pAd, dev);

	/*check if the interface is down */
	if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) {
		DBGPRINT(RT_DEBUG_TRACE,
			 ("rt_ioctl_siwrate::Network is down!\n"));
		return -ENETDOWN;
	}

	DBGPRINT(RT_DEBUG_TRACE,
		 ("rt_ioctl_siwrate::(rate = %d, fixed = %d)\n", rate, fixed));
	/* rate = -1 => auto rate
	   rate = X, fixed = 1 => (fixed rate X)
	 */
	if (rate == -1) {
		/*Auto Rate */
		pAd->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO;
		pAd->StaCfg.bAutoTxRateSwitch = TRUE;
		if ((pAd->CommonCfg.PhyMode <= PHY_11G) ||
		    (pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.MODE <=
		     MODE_OFDM))
			RTMPSetDesiredRates(pAd, -1);

		SetCommonHT(pAd);
	} else {
		if (fixed) {
			pAd->StaCfg.bAutoTxRateSwitch = FALSE;
			if ((pAd->CommonCfg.PhyMode <= PHY_11G) ||
			    (pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.
			     MODE <= MODE_OFDM))
				RTMPSetDesiredRates(pAd, rate);
			else {
				pAd->StaCfg.DesiredTransmitSetting.field.MCS =
				    MCS_AUTO;
				SetCommonHT(pAd);
			}
			DBGPRINT(RT_DEBUG_TRACE,
				 ("rt_ioctl_siwrate::(HtMcs=%d)\n",
				  pAd->StaCfg.DesiredTransmitSetting.field.
				  MCS));
		} else {
			/* TODO: rate = X, fixed = 0 => (rates <= X) */
			return -EOPNOTSUPP;
		}
	}

	return 0;
}

int rt_ioctl_giwrate(struct net_device *dev,
		     struct iw_request_info *info,
		     union iwreq_data *wrqu, char *extra)
{
	struct rt_rtmp_adapter *pAd = NULL;
	int rate_index = 0, rate_count = 0;
	HTTRANSMIT_SETTING ht_setting;
/* Remove to global variable
    __s32 ralinkrate[] =
	{2,  4,   11,  22, // CCK
	12, 18,   24,  36, 48, 72, 96, 108, // OFDM
	13, 26,   39,  52,  78, 104, 117, 130, 26,  52,  78, 104, 156, 208, 234, 260, // 20MHz, 800ns GI, MCS: 0 ~ 15
	39, 78,  117, 156, 234, 312, 351, 390,										  // 20MHz, 800ns GI, MCS: 16 ~ 23
	27, 54,   81, 108, 162, 216, 243, 270, 54, 108, 162, 216, 324, 432, 486, 540, // 40MHz, 800ns GI, MCS: 0 ~ 15
	81, 162, 243, 324, 486, 648, 729, 810,										  // 40MHz, 800ns GI, MCS: 16 ~ 23
	14, 29,   43,  57,  87, 115, 130, 144, 29, 59,   87, 115, 173, 230, 260, 288, // 20MHz, 400ns GI, MCS: 0 ~ 15
	43, 87,  130, 173, 260, 317, 390, 433,										  // 20MHz, 400ns GI, MCS: 16 ~ 23
	30, 60,   90, 120, 180, 240, 270, 300, 60, 120, 180, 240, 360, 480, 540, 600, // 40MHz, 400ns GI, MCS: 0 ~ 15
	90, 180, 270, 360, 540, 720, 810, 900};										  // 40MHz, 400ns GI, MCS: 16 ~ 23
*/
	GET_PAD_FROM_NET_DEV(pAd, dev);

	rate_count = ARRAY_SIZE(ralinkrate);
	/*check if the interface is down */
	if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) {
		DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n"));
		return -ENETDOWN;
	}

	if ((pAd->StaCfg.bAutoTxRateSwitch == FALSE) &&
	    (INFRA_ON(pAd)) &&
	    ((pAd->CommonCfg.PhyMode <= PHY_11G)
	     || (pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.MODE <=
		 MODE_OFDM)))
		ht_setting.word = pAd->StaCfg.HTPhyMode.word;
	else
		ht_setting.word =
		    pAd->MacTab.Content[BSSID_WCID].HTPhyMode.word;

	if (ht_setting.field.MODE >= MODE_HTMIX) {
/*      rate_index = 12 + ((u8)ht_setting.field.BW *16) + ((u8)ht_setting.field.ShortGI *32) + ((u8)ht_setting.field.MCS); */
		rate_index =
		    12 + ((u8)ht_setting.field.BW * 24) +
		    ((u8)ht_setting.field.ShortGI * 48) +
		    ((u8)ht_setting.field.MCS);
	} else if (ht_setting.field.MODE == MODE_OFDM)
		rate_index = (u8)(ht_setting.field.MCS) + 4;
	else if (ht_setting.field.MODE == MODE_CCK)
		rate_index = (u8)(ht_setting.field.MCS);

	if (rate_index < 0)
		rate_index = 0;

	if (rate_index >= rate_count)
		rate_index = rate_count - 1;

	wrqu->bitrate.value = ralinkrate[rate_index] * 500000;
	wrqu->bitrate.disabled = 0;

	return 0;
}

static const iw_handler rt_handler[] = {
	(iw_handler) NULL,	/* SIOCSIWCOMMIT */
	(iw_handler) rt_ioctl_giwname,	/* SIOCGIWNAME   */
	(iw_handler) NULL,	/* SIOCSIWNWID   */
	(iw_handler) NULL,	/* SIOCGIWNWID   */
	(iw_handler) rt_ioctl_siwfreq,	/* SIOCSIWFREQ   */
	(iw_handler) rt_ioctl_giwfreq,	/* SIOCGIWFREQ   */
	(iw_handler) rt_ioctl_siwmode,	/* SIOCSIWMODE   */
	(iw_handler) rt_ioctl_giwmode,	/* SIOCGIWMODE   */
	(iw_handler) NULL,	/* SIOCSIWSENS   */
	(iw_handler) NULL,	/* SIOCGIWSENS   */
	(iw_handler) NULL /* not used */ ,	/* SIOCSIWRANGE  */
	(iw_handler) rt_ioctl_giwrange,	/* SIOCGIWRANGE  */
	(iw_handler) NULL /* not used */ ,	/* SIOCSIWPRIV   */
	(iw_handler) NULL /* kernel code */ ,	/* SIOCGIWPRIV   */
	(iw_handler) NULL /* not used */ ,	/* SIOCSIWSTATS  */
	(iw_handler) rt28xx_get_wireless_stats /* kernel code */ ,	/* SIOCGIWSTATS  */
	(iw_handler) NULL,	/* SIOCSIWSPY    */
	(iw_handler) NULL,	/* SIOCGIWSPY    */
	(iw_handler) NULL,	/* SIOCSIWTHRSPY */
	(iw_handler) NULL,	/* SIOCGIWTHRSPY */
	(iw_handler) rt_ioctl_siwap,	/* SIOCSIWAP     */
	(iw_handler) rt_ioctl_giwap,	/* SIOCGIWAP     */
	(iw_handler) rt_ioctl_siwmlme,	/* SIOCSIWMLME   */
	(iw_handler) rt_ioctl_iwaplist,	/* SIOCGIWAPLIST */
	(iw_handler) rt_ioctl_siwscan,	/* SIOCSIWSCAN   */
	(iw_handler) rt_ioctl_giwscan,	/* SIOCGIWSCAN   */
	(iw_handler) rt_ioctl_siwessid,	/* SIOCSIWESSID  */
	(iw_handler) rt_ioctl_giwessid,	/* SIOCGIWESSID  */
	(iw_handler) rt_ioctl_siwnickn,	/* SIOCSIWNICKN  */
	(iw_handler) rt_ioctl_giwnickn,	/* SIOCGIWNICKN  */
	(iw_handler) NULL,	/* -- hole --    */
	(iw_handler) NULL,	/* -- hole --    */
	(iw_handler) rt_ioctl_siwrate,	/* SIOCSIWRATE   */
	(iw_handler) rt_ioctl_giwrate,	/* SIOCGIWRATE   */
	(iw_handler) rt_ioctl_siwrts,	/* SIOCSIWRTS    */
	(iw_handler) rt_ioctl_giwrts,	/* SIOCGIWRTS    */
	(iw_handler) rt_ioctl_siwfrag,	/* SIOCSIWFRAG   */
	(iw_handler) rt_ioctl_giwfrag,	/* SIOCGIWFRAG   */
	(iw_handler) NULL,	/* SIOCSIWTXPOW  */
	(iw_handler) NULL,	/* SIOCGIWTXPOW  */
	(iw_handler) NULL,	/* SIOCSIWRETRY  */
	(iw_handler) NULL,	/* SIOCGIWRETRY  */
	(iw_handler) rt_ioctl_siwencode,	/* SIOCSIWENCODE */
	(iw_handler) rt_ioctl_giwencode,	/* SIOCGIWENCODE */
	(iw_handler) NULL,	/* SIOCSIWPOWER  */
	(iw_handler) NULL,	/* SIOCGIWPOWER  */
	(iw_handler) NULL,	/* -- hole -- */
	(iw_handler) NULL,	/* -- hole -- */
	(iw_handler) rt_ioctl_siwgenie,	/* SIOCSIWGENIE  */
	(iw_handler) rt_ioctl_giwgenie,	/* SIOCGIWGENIE  */
	(iw_handler) rt_ioctl_siwauth,	/* SIOCSIWAUTH   */
	(iw_handler) rt_ioctl_giwauth,	/* SIOCGIWAUTH   */
	(iw_handler) rt_ioctl_siwencodeext,	/* SIOCSIWENCODEEXT */
	(iw_handler) rt_ioctl_giwencodeext,	/* SIOCGIWENCODEEXT */
	(iw_handler) rt_ioctl_siwpmksa,	/* SIOCSIWPMKSA  */
};

const struct iw_handler_def rt28xx_iw_handler_def = {
	.standard = (iw_handler *) rt_handler,
	.num_standard = sizeof(rt_handler) / sizeof(iw_handler),
#if IW_HANDLER_VERSION >= 7
	.get_wireless_stats = rt28xx_get_wireless_stats,
#endif
};

int rt28xx_sta_ioctl(IN struct net_device *net_dev,
		     IN OUT struct ifreq *rq, int cmd)
{
	struct os_cookie *pObj;
	struct rt_rtmp_adapter *pAd = NULL;
	struct iwreq *wrq = (struct iwreq *)rq;
	BOOLEAN StateMachineTouched = FALSE;
	int Status = NDIS_STATUS_SUCCESS;

	GET_PAD_FROM_NET_DEV(pAd, net_dev);

	pObj = (struct os_cookie *)pAd->OS_Cookie;

	/*check if the interface is down */
	if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) {
		{
			DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n"));
			return -ENETDOWN;
		}
	}

	{			/* determine this ioctl command is comming from which interface. */
		pObj->ioctl_if_type = INT_MAIN;
		pObj->ioctl_if = MAIN_MBSSID;
	}

	switch (cmd) {
	case SIOCGIFHWADDR:
		DBGPRINT(RT_DEBUG_TRACE, ("IOCTL::SIOCGIFHWADDR\n"));
		memcpy(wrq->u.name, pAd->CurrentAddress, ETH_ALEN);
		break;
	case SIOCGIWNAME:
		{
			char *name = &wrq->u.name[0];
			rt_ioctl_giwname(net_dev, NULL, name, NULL);
			break;
		}
	case SIOCGIWESSID:	/*Get ESSID */
		{
			struct iw_point *essid = &wrq->u.essid;
			rt_ioctl_giwessid(net_dev, NULL, essid, essid->pointer);
			break;
		}
	case SIOCSIWESSID:	/*Set ESSID */
		{
			struct iw_point *essid = &wrq->u.essid;
			rt_ioctl_siwessid(net_dev, NULL, essid, essid->pointer);
			break;
		}
	case SIOCSIWNWID:	/* set network id (the cell) */
	case SIOCGIWNWID:	/* get network id */
		Status = -EOPNOTSUPP;
		break;
	case SIOCSIWFREQ:	/*set channel/frequency (Hz) */
		{
			struct iw_freq *freq = &wrq->u.freq;
			rt_ioctl_siwfreq(net_dev, NULL, freq, NULL);
			break;
		}
	case SIOCGIWFREQ:	/* get channel/frequency (Hz) */
		{
			struct iw_freq *freq = &wrq->u.freq;
			rt_ioctl_giwfreq(net_dev, NULL, freq, NULL);
			break;
		}
	case SIOCSIWNICKN:	/*set node name/nickname */
		{
			/*struct iw_point *data=&wrq->u.data; */
			/*rt_ioctl_siwnickn(net_dev, NULL, data, NULL); */
			break;
		}
	case SIOCGIWNICKN:	/*get node name/nickname */
		{
			struct iw_point *erq = NULL;
			erq = &wrq->u.data;
			erq->length = strlen((char *)pAd->nickname);
			Status =
			    copy_to_user(erq->pointer, pAd->nickname,
					 erq->length);
			break;
		}
	case SIOCGIWRATE:	/*get default bit rate (bps) */
		rt_ioctl_giwrate(net_dev, NULL, &wrq->u, NULL);
		break;
	case SIOCSIWRATE:	/*set default bit rate (bps) */
		rt_ioctl_siwrate(net_dev, NULL, &wrq->u, NULL);
		break;
	case SIOCGIWRTS:	/* get RTS/CTS threshold (bytes) */
		{
			struct iw_param *rts = &wrq->u.rts;
			rt_ioctl_giwrts(net_dev, NULL, rts, NULL);
			break;
		}
	case SIOCSIWRTS:	/*set RTS/CTS threshold (bytes) */
		{
			struct iw_param *rts = &wrq->u.rts;
			rt_ioctl_siwrts(net_dev, NULL, rts, NULL);
			break;
		}
	case SIOCGIWFRAG:	/*get fragmentation thr (bytes) */
		{
			struct iw_param *frag = &wrq->u.frag;
			rt_ioctl_giwfrag(net_dev, NULL, frag, NULL);
			break;
		}
	case SIOCSIWFRAG:	/*set fragmentation thr (bytes) */
		{
			struct iw_param *frag = &wrq->u.frag;
			rt_ioctl_siwfrag(net_dev, NULL, frag, NULL);
			break;
		}
	case SIOCGIWENCODE:	/*get encoding token & mode */
		{
			struct iw_point *erq = &wrq->u.encoding;
			if (erq)
				rt_ioctl_giwencode(net_dev, NULL, erq,
						   erq->pointer);
			break;
		}
	case SIOCSIWENCODE:	/*set encoding token & mode */
		{
			struct iw_point *erq = &wrq->u.encoding;
			if (erq)
				rt_ioctl_siwencode(net_dev, NULL, erq,
						   erq->pointer);
			break;
		}
	case SIOCGIWAP:	/*get access point MAC addresses */
		{
			struct sockaddr *ap_addr = &wrq->u.ap_addr;
			rt_ioctl_giwap(net_dev, NULL, ap_addr,
				       ap_addr->sa_data);
			break;
		}
	case SIOCSIWAP:	/*set access point MAC addresses */
		{
			struct sockaddr *ap_addr = &wrq->u.ap_addr;
			rt_ioctl_siwap(net_dev, NULL, ap_addr,
				       ap_addr->sa_data);
			break;
		}
	case SIOCGIWMODE:	/*get operation mode */
		{
			__u32 *mode = &wrq->u.mode;
			rt_ioctl_giwmode(net_dev, NULL, mode, NULL);
			break;
		}
	case SIOCSIWMODE:	/*set operation mode */
		{
			__u32 *mode = &wrq->u.mode;
			rt_ioctl_siwmode(net_dev, NULL, mode, NULL);
			break;
		}
	case SIOCGIWSENS:	/*get sensitivity (dBm) */
	case SIOCSIWSENS:	/*set sensitivity (dBm) */
	case SIOCGIWPOWER:	/*get Power Management settings */
	case SIOCSIWPOWER:	/*set Power Management settings */
	case SIOCGIWTXPOW:	/*get transmit power (dBm) */
	case SIOCSIWTXPOW:	/*set transmit power (dBm) */
	case SIOCGIWRANGE:	/*Get range of parameters */
	case SIOCGIWRETRY:	/*get retry limits and lifetime */
	case SIOCSIWRETRY:	/*set retry limits and lifetime */
	case RT_PRIV_IOCTL:
	case RT_PRIV_IOCTL_EXT:
	case RTPRIV_IOCTL_SET:
	case RTPRIV_IOCTL_GSITESURVEY:
	case SIOCGIWPRIV:
		Status = -EOPNOTSUPP;
		break;
	case SIOCETHTOOL:
		break;
	default:
		DBGPRINT(RT_DEBUG_ERROR,
			 ("IOCTL::unknown IOCTL's cmd = 0x%08x\n", cmd));
		Status = -EOPNOTSUPP;
		break;
	}

	if (StateMachineTouched)	/* Upper layer sent a MLME-related operations */
		RTMP_MLME_HANDLER(pAd);

	return Status;
}

/*
    ==========================================================================
    Description:
        Set SSID
    Return:
        TRUE if all parameters are OK, FALSE otherwise
    ==========================================================================
*/
int Set_SSID_Proc(struct rt_rtmp_adapter *pAdapter, char *arg)
{
	struct rt_ndis_802_11_ssid Ssid, *pSsid = NULL;
	BOOLEAN StateMachineTouched = FALSE;
	int success = TRUE;

	if (strlen(arg) <= MAX_LEN_OF_SSID) {
		NdisZeroMemory(&Ssid, sizeof(struct rt_ndis_802_11_ssid));
		if (strlen(arg) != 0) {
			NdisMoveMemory(Ssid.Ssid, arg, strlen(arg));
			Ssid.SsidLength = strlen(arg);
		} else		/*ANY ssid */
		{
			Ssid.SsidLength = 0;
			memcpy(Ssid.Ssid, "", 0);
			pAdapter->StaCfg.BssType = BSS_INFRA;
			pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeOpen;
			pAdapter->StaCfg.WepStatus =
			    Ndis802_11EncryptionDisabled;
		}
		pSsid = &Ssid;

		if (pAdapter->Mlme.CntlMachine.CurrState != CNTL_IDLE) {
			RTMP_MLME_RESET_STATE_MACHINE(pAdapter);
			DBGPRINT(RT_DEBUG_TRACE,
				 ("MLME busy, reset MLME state machine!\n"));
		}

		if ((pAdapter->StaCfg.WpaPassPhraseLen >= 8) &&
		    (pAdapter->StaCfg.WpaPassPhraseLen <= 64)) {
			char passphrase_str[65] = { 0 };
			u8 keyMaterial[40];

			RTMPMoveMemory(passphrase_str,
				       pAdapter->StaCfg.WpaPassPhrase,
				       pAdapter->StaCfg.WpaPassPhraseLen);
			RTMPZeroMemory(pAdapter->StaCfg.PMK, 32);
			if (pAdapter->StaCfg.WpaPassPhraseLen == 64) {
				AtoH((char *)pAdapter->StaCfg.WpaPassPhrase,
				     pAdapter->StaCfg.PMK, 32);
			} else {
				PasswordHash((char *)pAdapter->StaCfg.
					     WpaPassPhrase, Ssid.Ssid,
					     Ssid.SsidLength, keyMaterial);
				NdisMoveMemory(pAdapter->StaCfg.PMK,
					       keyMaterial, 32);
			}
		}

		pAdapter->MlmeAux.CurrReqIsFromNdis = TRUE;
		pAdapter->StaCfg.bScanReqIsFromWebUI = FALSE;
		pAdapter->bConfigChanged = TRUE;

		MlmeEnqueue(pAdapter,
			    MLME_CNTL_STATE_MACHINE,
			    OID_802_11_SSID,
			    sizeof(struct rt_ndis_802_11_ssid), (void *) pSsid);

		StateMachineTouched = TRUE;
		DBGPRINT(RT_DEBUG_TRACE,
			 ("Set_SSID_Proc::(Len=%d,Ssid=%s)\n", Ssid.SsidLength,
			  Ssid.Ssid));
	} else
		success = FALSE;

	if (StateMachineTouched)	/* Upper layer sent a MLME-related operations */
		RTMP_MLME_HANDLER(pAdapter);

	return success;
}

/*
    ==========================================================================
    Description:
        Set Network Type(Infrastructure/Adhoc mode)
    Return:
        TRUE if all parameters are OK, FALSE otherwise
    ==========================================================================
*/
int Set_NetworkType_Proc(struct rt_rtmp_adapter *pAdapter, char *arg)
{
	u32 Value = 0;

	if (strcmp(arg, "Adhoc") == 0) {
		if (pAdapter->StaCfg.BssType != BSS_ADHOC) {
			/* Config has changed */
			pAdapter->bConfigChanged = TRUE;
			if (MONITOR_ON(pAdapter)) {
				RTMP_IO_WRITE32(pAdapter, RX_FILTR_CFG,
						STANORMAL);
				RTMP_IO_READ32(pAdapter, MAC_SYS_CTRL, &Value);
				Value &= (~0x80);
				RTMP_IO_WRITE32(pAdapter, MAC_SYS_CTRL, Value);
				OPSTATUS_CLEAR_FLAG(pAdapter,
						    fOP_STATUS_MEDIA_STATE_CONNECTED);
				pAdapter->StaCfg.bAutoReconnect = TRUE;
				LinkDown(pAdapter, FALSE);
			}
			if (INFRA_ON(pAdapter)) {
				/*BOOLEAN Cancelled; */
				/* Set the AutoReconnectSsid to prevent it reconnect to old SSID */
				/* Since calling this indicate user don't want to connect to that SSID anymore. */
				pAdapter->MlmeAux.AutoReconnectSsidLen = 32;
				NdisZeroMemory(pAdapter->MlmeAux.
					       AutoReconnectSsid,
					       pAdapter->MlmeAux.
					       AutoReconnectSsidLen);

				LinkDown(pAdapter, FALSE);

				DBGPRINT(RT_DEBUG_TRACE,
					 ("NDIS_STATUS_MEDIA_DISCONNECT Event BB!\n"));
			}
		}
		pAdapter->StaCfg.BssType = BSS_ADHOC;
		pAdapter->net_dev->type = pAdapter->StaCfg.OriDevType;
		DBGPRINT(RT_DEBUG_TRACE,
			 ("===>Set_NetworkType_Proc::(AD-HOC)\n"));
	} else if (strcmp(arg, "Infra") == 0) {
		if (pAdapter->StaCfg.BssType != BSS_INFRA) {
			/* Config has changed */
			pAdapter->bConfigChanged = TRUE;
			if (MONITOR_ON(pAdapter)) {
				RTMP_IO_WRITE32(pAdapter, RX_FILTR_CFG,
						STANORMAL);
				RTMP_IO_READ32(pAdapter, MAC_SYS_CTRL, &Value);
				Value &= (~0x80);
				RTMP_IO_WRITE32(pAdapter, MAC_SYS_CTRL, Value);
				OPSTATUS_CLEAR_FLAG(pAdapter,
						    fOP_STATUS_MEDIA_STATE_CONNECTED);
				pAdapter->StaCfg.bAutoReconnect = TRUE;
				LinkDown(pAdapter, FALSE);
			}
			if (ADHOC_ON(pAdapter)) {
				/* Set the AutoReconnectSsid to prevent it reconnect to old SSID */
				/* Since calling this indicate user don't want to connect to that SSID anymore. */
				pAdapter->MlmeAux.AutoReconnectSsidLen = 32;
				NdisZeroMemory(pAdapter->MlmeAux.
					       AutoReconnectSsid,
					       pAdapter->MlmeAux.
					       AutoReconnectSsidLen);

				LinkDown(pAdapter, FALSE);
			}
		}
		pAdapter->StaCfg.BssType = BSS_INFRA;
		pAdapter->net_dev->type = pAdapter->StaCfg.OriDevType;
		DBGPRINT(RT_DEBUG_TRACE,
			 ("===>Set_NetworkType_Proc::(INFRA)\n"));
	} else if (strcmp(arg, "Monitor") == 0) {
		u8 bbpValue = 0;
		BCN_TIME_CFG_STRUC csr;
		OPSTATUS_CLEAR_FLAG(pAdapter, fOP_STATUS_INFRA_ON);
		OPSTATUS_CLEAR_FLAG(pAdapter, fOP_STATUS_ADHOC_ON);
		OPSTATUS_SET_FLAG(pAdapter, fOP_STATUS_MEDIA_STATE_CONNECTED);
		/* disable all periodic state machine */
		pAdapter->StaCfg.bAutoReconnect = FALSE;
		/* reset all mlme state machine */
		RTMP_MLME_RESET_STATE_MACHINE(pAdapter);
		DBGPRINT(RT_DEBUG_TRACE,
			 ("fOP_STATUS_MEDIA_STATE_CONNECTED \n"));
		if (pAdapter->CommonCfg.CentralChannel == 0) {
			if (pAdapter->CommonCfg.PhyMode == PHY_11AN_MIXED)
				pAdapter->CommonCfg.CentralChannel = 36;
			else
				pAdapter->CommonCfg.CentralChannel = 6;
		} else
			N_ChannelCheck(pAdapter);

		if (pAdapter->CommonCfg.PhyMode >= PHY_11ABGN_MIXED &&
		    pAdapter->CommonCfg.RegTransmitSetting.field.BW == BW_40 &&
		    pAdapter->CommonCfg.RegTransmitSetting.field.EXTCHA ==
		    EXTCHA_ABOVE) {
			/* 40MHz ,control channel at lower */
			RTMP_BBP_IO_READ8_BY_REG_ID(pAdapter, BBP_R4,
						    &bbpValue);
			bbpValue &= (~0x18);
			bbpValue |= 0x10;
			RTMP_BBP_IO_WRITE8_BY_REG_ID(pAdapter, BBP_R4,
						     bbpValue);
			pAdapter->CommonCfg.BBPCurrentBW = BW_40;
			/*  RX : control channel at lower */
			RTMP_BBP_IO_READ8_BY_REG_ID(pAdapter, BBP_R3,
						    &bbpValue);
			bbpValue &= (~0x20);
			RTMP_BBP_IO_WRITE8_BY_REG_ID(pAdapter, BBP_R3,
						     bbpValue);

			RTMP_IO_READ32(pAdapter, TX_BAND_CFG, &Value);
			Value &= 0xfffffffe;
			RTMP_IO_WRITE32(pAdapter, TX_BAND_CFG, Value);
			pAdapter->CommonCfg.CentralChannel =
			    pAdapter->CommonCfg.Channel + 2;
			AsicSwitchChannel(pAdapter,
					  pAdapter->CommonCfg.CentralChannel,
					  FALSE);
			AsicLockChannel(pAdapter,
					pAdapter->CommonCfg.CentralChannel);
			DBGPRINT(RT_DEBUG_TRACE,
				 ("BW_40 ,control_channel(%d), CentralChannel(%d) \n",
				  pAdapter->CommonCfg.Channel,
				  pAdapter->CommonCfg.CentralChannel));
		} else if (pAdapter->CommonCfg.PhyMode >= PHY_11ABGN_MIXED
			   && pAdapter->CommonCfg.RegTransmitSetting.field.BW ==
			   BW_40
			   && pAdapter->CommonCfg.RegTransmitSetting.field.
			   EXTCHA == EXTCHA_BELOW) {
			/* 40MHz ,control channel at upper */
			RTMP_BBP_IO_READ8_BY_REG_ID(pAdapter, BBP_R4,
						    &bbpValue);
			bbpValue &= (~0x18);
			bbpValue |= 0x10;
			RTMP_BBP_IO_WRITE8_BY_REG_ID(pAdapter, BBP_R4,
						     bbpValue);
			pAdapter->CommonCfg.BBPCurrentBW = BW_40;
			RTMP_IO_READ32(pAdapter, TX_BAND_CFG, &Value);
			Value |= 0x1;
			RTMP_IO_WRITE32(pAdapter, TX_BAND_CFG, Value);

			RTMP_BBP_IO_READ8_BY_REG_ID(pAdapter, BBP_R3,
						    &bbpValue);
			bbpValue |= (0x20);
			RTMP_BBP_IO_WRITE8_BY_REG_ID(pAdapter, BBP_R3,
						     bbpValue);
			pAdapter->CommonCfg.CentralChannel =
			    pAdapter->CommonCfg.Channel - 2;
			AsicSwitchChannel(pAdapter,
					  pAdapter->CommonCfg.CentralChannel,
					  FALSE);
			AsicLockChannel(pAdapter,
					pAdapter->CommonCfg.CentralChannel);
			DBGPRINT(RT_DEBUG_TRACE,
				 ("BW_40 ,control_channel(%d), CentralChannel(%d) \n",
				  pAdapter->CommonCfg.Channel,
				  pAdapter->CommonCfg.CentralChannel));
		} else {
			/* 20MHz */
			RTMP_BBP_IO_READ8_BY_REG_ID(pAdapter, BBP_R4,
						    &bbpValue);
			bbpValue &= (~0x18);
			RTMP_BBP_IO_WRITE8_BY_REG_ID(pAdapter, BBP_R4,
						     bbpValue);
			pAdapter->CommonCfg.BBPCurrentBW = BW_20;
			AsicSwitchChannel(pAdapter, pAdapter->CommonCfg.Channel,
					  FALSE);
			AsicLockChannel(pAdapter, pAdapter->CommonCfg.Channel);
			DBGPRINT(RT_DEBUG_TRACE,
				 ("BW_20, Channel(%d)\n",
				  pAdapter->CommonCfg.Channel));
		}
		/* Enable Rx with promiscuous reception */
		RTMP_IO_WRITE32(pAdapter, RX_FILTR_CFG, 0x3);
		/* ASIC supporsts sniffer function with replacing RSSI with timestamp. */
		/*RTMP_IO_READ32(pAdapter, MAC_SYS_CTRL, &Value); */
		/*Value |= (0x80); */
		/*RTMP_IO_WRITE32(pAdapter, MAC_SYS_CTRL, Value); */
		/* disable sync */
		RTMP_IO_READ32(pAdapter, BCN_TIME_CFG, &csr.word);
		csr.field.bBeaconGen = 0;
		csr.field.bTBTTEnable = 0;
		csr.field.TsfSyncMode = 0;
		RTMP_IO_WRITE32(pAdapter, BCN_TIME_CFG, csr.word);

		pAdapter->StaCfg.BssType = BSS_MONITOR;
		pAdapter->net_dev->type = ARPHRD_IEEE80211_PRISM;	/*ARPHRD_IEEE80211; // IEEE80211 */
		DBGPRINT(RT_DEBUG_TRACE,
			 ("===>Set_NetworkType_Proc::(MONITOR)\n"));
	}
	/* Reset Ralink supplicant to not use, it will be set to start when UI set PMK key */
	pAdapter->StaCfg.WpaState = SS_NOTUSE;

	DBGPRINT(RT_DEBUG_TRACE,
		 ("Set_NetworkType_Proc::(NetworkType=%d)\n",
		  pAdapter->StaCfg.BssType));

	return TRUE;
}
