/*
 *************************************************************************
 * 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
	Justin P. Mattock	11/07/2010	Fix typos
*/

#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 %pM\n", Bssid));

	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 means G only.
				 */
				for (rateCnt = 0;
				     rateCnt < pBssEntry->SupRateLen;
				     rateCnt++) {
					/*
					   6Mbps(140) 9Mbps(146) and >=12Mbps(152) are supported rate, it means 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 the mode is only changed */
		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%pM (Aid = %d) "
				"(AP) -\n", pEntry->Addr, 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);
			if (Status)
				Status = -EFAULT;
			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 from reconnecting to the old SSID */
				/* Since calling this indicates users 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 from reconnecting to the old SSID */
				/* Since calling this indicates users 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 supports 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;
}
