[Debian-eeepc-devel] [SCM] rt2860 source for the ralink wireless chip in the eeepc 901. branch, master, updated. fea49085c3b26416a96c121f848dd032603f5cb7

Glenn Saberton gsaberton at foomagic.org
Tue Oct 7 08:54:46 UTC 2008


The following commit has been merged in the master branch:
commit fea49085c3b26416a96c121f848dd032603f5cb7
Author: Glenn Saberton <gsaberton at foomagic.org>
Date:   Tue Oct 7 15:34:38 2008 +0800

    New upstream version
    
    Rework no longer valid patches
    release 1.8.0.0

diff --git a/rt2860-1.7.0.0/Makefile b/rt2860-source-1.8.0.0/Makefile
similarity index 71%
copy from rt2860-1.7.0.0/Makefile
copy to rt2860-source-1.8.0.0/Makefile
index 6c556b2..6fa7a73 100644
--- a/rt2860-1.7.0.0/Makefile
+++ b/rt2860-source-1.8.0.0/Makefile
@@ -1,6 +1,12 @@
+#MODE - STA or AP or APSTA.
 RT28xx_MODE = STA
+
+#TARTET - LINUX or UCOS.
 TARGET = LINUX
+
+#CHIPSET - 2860 or 2870.
 CHIPSET = 2860
+
 #RT28xx_DIR = home directory of RT28xx source code
 RT28xx_DIR = $(shell pwd)
 RTMP_SRC_DIR = $(RT28xx_DIR)/RT$(CHIPSET)
@@ -16,8 +22,9 @@ PLATFORM = PC
 #PLATFORM = INF_TWINPASS
 #PLATFORM = INF_DANUBE
 #PLATFORM = BRCM_6358
-#RELEASE = DPA
-RELEASE = DPB
+#PLATFORM = INF_AMAZON_SE
+#PLATFORM = CAVM_OCTEON
+RELEASE = DPO
 ifeq ($(PLATFORM),5VT)
 LINUX_SRC = /opt/fvt_11N_SDK_0807/fvt131x_SDK_11n/linux-2.6.17
 CROSS_COMPILE = /opt/crosstool/uClibc_v5te_le_gcc_4_1_1/bin/arm-linux-
@@ -41,6 +48,7 @@ endif
 ifeq ($(PLATFORM),SIGMA_8622)
 LINUX_SRC = /home/snowpin/armutils_2.5.120.1/build_arm/linux-2.4.22-em86xx
 CROSS_COMPILE = /home/snowpin/armutils_2.5.120.1/toolchain/bin/arm-elf-
+CROSS_COMPILE_INCLUDE = /home/snowpin/armutils_2.5.120.1/toolchain/lib/gcc-lib/arm-elf/2.95.3
 endif
 
 ifeq ($(PLATFORM),INIC)
@@ -87,7 +95,23 @@ LINUX_SRC =
 CROSS_COMPILE = 
 endif
 
-export RT28xx_DIR RT28xx_MODE LINUX_SRC CROSS_COMPILE PLATFORM RELEASE CHIPSET RTMP_SRC_DIR LINUX_SRC_MODULE
+ifeq ($(PLATFORM),INF_AMAZON_SE)
+# Linux 2.6
+#LINUX_SRC = /lib/modules/$(shell uname -r)/build
+# Linux 2.4 Change to your local setting
+LINUX_SRC = /backup/ifx/3.6.2.2/source/kernel/opensource/linux-2.4.31
+#CROSS_COMPILE = mips-linux-
+#LINUX_SRC = /project/Infineon/3.6.2.2/source/kernel/opensource/linux-2.4.31
+CROSS_COMPILE = /opt/uclibc-toolchain/ifx-lxdb-1-2-3-external/gcc-3.3.6/toolchain-mips/R0208V35/mips-linux-uclibc/bin/
+endif
+
+ifeq ($(PLATFORM),CAVM_OCTEON)
+OCTEON_ROOT = /usr/local/Cavium_Networks/OCTEON-SDK
+LINUX_SRC = $(OCTEON_ROOT)/linux/kernel_2.6/linux
+CROSS_COMPILE = mips64-octeon-linux-gnu-
+endif
+
+export RT28xx_DIR RT28xx_MODE LINUX_SRC CROSS_COMPILE CROSS_COMPILE_INCLUDE PLATFORM RELEASE CHIPSET RTMP_SRC_DIR LINUX_SRC_MODULE
 
 all: build_tools $(TARGET)
 
@@ -101,12 +125,28 @@ LINUX:
 ifneq (,$(findstring 2.4,$(LINUX_SRC)))
 	cp -f os/linux/Makefile.4 $(RT28xx_DIR)/os/linux/Makefile
 	make -C $(RT28xx_DIR)/os/linux/
+ifeq ($(RT28xx_MODE),AP)
+	cp -f $(RT28xx_DIR)/os/linux/rt$(CHIPSET)ap.o /tftpboot
+else	
+ifeq ($(RT28xx_MODE),APSTA)
+	cp -f $(RT28xx_DIR)/os/linux/rt$(CHIPSET)apsta.o /tftpboot
+else
 	cp -f $(RT28xx_DIR)/os/linux/rt$(CHIPSET)sta.o /tftpboot
+endif	
+endif	
 else
 	cp -f os/linux/Makefile.6 $(RT28xx_DIR)/os/linux/Makefile
 	make  -C  $(LINUX_SRC) SUBDIRS=$(RT28xx_DIR)/os/linux modules
+ifeq ($(RT28xx_MODE),AP)
+	cp -f $(RT28xx_DIR)/os/linux/rt$(CHIPSET)ap.ko /tftpboot
+else	
+ifeq ($(RT28xx_MODE),APSTA)
+	cp -f $(RT28xx_DIR)/os/linux/rt$(CHIPSET)apsta.ko /tftpboot
+else
 	cp -f $(RT28xx_DIR)/os/linux/rt$(CHIPSET)sta.ko /tftpboot
 endif	
+endif
+endif
 
 clean:
 ifeq ($(TARGET), LINUX)
diff --git a/rt2860-1.7.0.0/README_STA b/rt2860-source-1.8.0.0/README_STA
similarity index 98%
copy from rt2860-1.7.0.0/README_STA
copy to rt2860-source-1.8.0.0/README_STA
index ca531c3..d67230e 100644
--- a/rt2860-1.7.0.0/README_STA
+++ b/rt2860-source-1.8.0.0/README_STA
@@ -71,10 +71,12 @@ Build Instructions:
 	   => #>cd wpa_supplicant-0.5.7
 	   => #>./wpa_supplicant -Dralink -ira0 -c wpa_supplicant.conf -d
 
-4> $make									# compile driver source code
+4> $make			
+	# compile driver source code
+	# To fix "error: too few arguments to function ¡¥iwe_stream_add_event"
+	  => $patch -i os/linux/sta_ioctl.c.patch os/linux/sta_ioctl.c
 
 5> $cp RT2860STA.dat  /etc/Wireless/RT2860STA/RT2860STA.dat       
-    # !!!check if it is a binary file before loading !!!  
     
 6> load driver
     #[kernel 2.4]
diff --git a/rt2860-1.7.0.0/RT2860STA.dat b/rt2860-source-1.8.0.0/RT2860STA.dat
similarity index 97%
copy from rt2860-1.7.0.0/RT2860STA.dat
copy to rt2860-source-1.8.0.0/RT2860STA.dat
index beb98c4..6568fae 100644
--- a/rt2860-1.7.0.0/RT2860STA.dat
+++ b/rt2860-source-1.8.0.0/RT2860STA.dat
@@ -50,3 +50,4 @@ HT_MIMOPSMode=3
 IEEE80211H=0
 TGnWifiTest=0
 WirelessEvent=0
+CarrierDetect=0
diff --git a/rt2860-1.7.0.0/common/2860_rtmp_init.c b/rt2860-source-1.8.0.0/common/2860_rtmp_init.c
similarity index 98%
copy from rt2860-1.7.0.0/common/2860_rtmp_init.c
copy to rt2860-source-1.8.0.0/common/2860_rtmp_init.c
index ae0c67d..f8c0965 100644
--- a/rt2860-1.7.0.0/common/2860_rtmp_init.c
+++ b/rt2860-source-1.8.0.0/common/2860_rtmp_init.c
@@ -387,20 +387,20 @@ VOID	NICInitTxRxRingAndBacklogQueue(
 	InitializeQueueHeader(&pAd->TxSwQueue[QID_AC_VO]);
 	InitializeQueueHeader(&pAd->TxSwQueue[QID_HCCA]);
 
- 	// Init RX Ring index pointer
+	// Init RX Ring index pointer
 	pAd->RxRing.RxSwReadIdx = 0;
 	pAd->RxRing.RxCpuIdx = RX_RING_SIZE - 1;
 	
 	// Init TX rings index pointer
-	for (i=0; i<NUM_OF_TX_RING; i++)
-	{
-		pAd->TxRing[i].TxSwFreeIdx = 0;
-		pAd->TxRing[i].TxCpuIdx = 0;
-	}
+		for (i=0; i<NUM_OF_TX_RING; i++)
+		{
+			pAd->TxRing[i].TxSwFreeIdx = 0;
+			pAd->TxRing[i].TxCpuIdx = 0;
+		}
 
 	// init MGMT ring index pointer
 	pAd->MgmtRing.TxSwFreeIdx = 0;
-	pAd->MgmtRing.TxCpuIdx = 0; 
+	pAd->MgmtRing.TxCpuIdx = 0;
 
 	pAd->PrivateInfo.TxRingFullCnt       = 0;
 }
@@ -437,7 +437,7 @@ VOID	RTMPRingCleanUp(
 	int				i;
 	PRTMP_TX_RING	pTxRing;
 	unsigned long	IrqFlags;
-
+	
 	DBGPRINT(RT_DEBUG_TRACE,("RTMPRingCleanUp(RingIdx=%d, Pending-NDIS=%ld)\n", RingType, pAd->RalinkCounters.PendingNdisPacketCount));
 	switch (RingType)
 	{
@@ -511,7 +511,7 @@ VOID	RTMPRingCleanUp(
 				{
 					PCI_UNMAP_SINGLE(pAd, pTxD->SDPtr1, pTxD->SDLen1, PCI_DMA_TODEVICE);			
 					RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);
-			}
+				}
 				pAd->MgmtRing.Cell[i].pNextNdisPacket = NULL;
 
 			}
@@ -795,7 +795,7 @@ PNDIS_PACKET RTMP_AllocateRxPacketBuffer(
 	if (pkt) {
 		RTMP_SET_PACKET_SOURCE(pkt, PKTSRC_NDIS);
 		*VirtualAddress = (PVOID) RTPKT_TO_OSPKT(pkt)->data;	
- 		*PhysicalAddress = PCI_MAP_SINGLE(pAd, *VirtualAddress, Length, -1, PCI_DMA_FROMDEVICE); 
+		*PhysicalAddress = PCI_MAP_SINGLE(pAd, *VirtualAddress, Length, -1, PCI_DMA_FROMDEVICE);
 	} else {
 		*VirtualAddress = (PVOID) NULL;
 		*PhysicalAddress = (NDIS_PHYSICAL_ADDRESS) NULL;
@@ -917,6 +917,6 @@ done:
 	RTMP_SEM_UNLOCK(&pAd->RxRingLock);
 	*pbReschedule = bReschedule;
 	return pRxPacket;
-} 
+}
 /* End of 2860_rtmp_init.c */
 
diff --git a/rt2860-1.7.0.0/common/action.c b/rt2860-source-1.8.0.0/common/action.c
similarity index 93%
copy from rt2860-1.7.0.0/common/action.c
copy to rt2860-source-1.8.0.0/common/action.c
index 68edeef..a065af0 100644
--- a/rt2860-1.7.0.0/common/action.c
+++ b/rt2860-source-1.8.0.0/common/action.c
@@ -76,19 +76,23 @@ VOID ActionStateMachineInit(
 		StateMachineSetAction(S, ACT_IDLE, MT2_PEER_DLS_CATE, (STATE_MACHINE_FUNC)PeerDLSAction);
 #endif // QOS_DLS_SUPPORT //
 
+#ifdef DOT11_N_SUPPORT
 	StateMachineSetAction(S, ACT_IDLE, MT2_PEER_BA_CATE, (STATE_MACHINE_FUNC)PeerBAAction);
-	StateMachineSetAction(S, ACT_IDLE, MT2_PEER_PUBLIC_CATE, (STATE_MACHINE_FUNC)PeerPublicAction);
-	StateMachineSetAction(S, ACT_IDLE, MT2_PEER_RM_CATE, (STATE_MACHINE_FUNC)PeerRMAction);
 	StateMachineSetAction(S, ACT_IDLE, MT2_PEER_HT_CATE, (STATE_MACHINE_FUNC)PeerHTAction);
-	
 	StateMachineSetAction(S, ACT_IDLE, MT2_MLME_ADD_BA_CATE, (STATE_MACHINE_FUNC)MlmeADDBAAction);
 	StateMachineSetAction(S, ACT_IDLE, MT2_MLME_ORI_DELBA_CATE, (STATE_MACHINE_FUNC)MlmeDELBAAction);
 	StateMachineSetAction(S, ACT_IDLE, MT2_MLME_REC_DELBA_CATE, (STATE_MACHINE_FUNC)MlmeDELBAAction);
+#endif // DOT11_N_SUPPORT //
+
+	StateMachineSetAction(S, ACT_IDLE, MT2_PEER_PUBLIC_CATE, (STATE_MACHINE_FUNC)PeerPublicAction);
+	StateMachineSetAction(S, ACT_IDLE, MT2_PEER_RM_CATE, (STATE_MACHINE_FUNC)PeerRMAction);
+	
 	StateMachineSetAction(S, ACT_IDLE, MT2_MLME_QOS_CATE, (STATE_MACHINE_FUNC)MlmeQOSAction);
 	StateMachineSetAction(S, ACT_IDLE, MT2_MLME_DLS_CATE, (STATE_MACHINE_FUNC)MlmeDLSAction);
 	StateMachineSetAction(S, ACT_IDLE, MT2_ACT_INVALID, (STATE_MACHINE_FUNC)MlmeInvalidAction);
 }
 
+#ifdef DOT11_N_SUPPORT
 VOID MlmeADDBAAction(
     IN PRTMP_ADAPTER pAd, 
     IN MLME_QUEUE_ELEM *Elem) 
@@ -129,7 +133,18 @@ VOID MlmeADDBAAction(
 		
 #ifdef CONFIG_STA_SUPPORT
 		IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
-			ActHeaderInit(pAd, &Frame.Hdr, pAd->CommonCfg.Bssid, pAd->CurrentAddress, pInfo->pAddr);
+		{
+			if (ADHOC_ON(pAd))
+				ActHeaderInit(pAd, &Frame.Hdr, pInfo->pAddr, pAd->CurrentAddress, pAd->CommonCfg.Bssid);
+			else
+#ifdef QOS_DLS_SUPPORT
+			if (pAd->MacTab.Content[pInfo->Wcid].ValidAsDls)
+				ActHeaderInit(pAd, &Frame.Hdr, pInfo->pAddr, pAd->CurrentAddress, pAd->CommonCfg.Bssid);
+			else
+#endif // QOS_DLS_SUPPORT //
+				ActHeaderInit(pAd, &Frame.Hdr, pAd->CommonCfg.Bssid, pAd->CurrentAddress, pInfo->pAddr);
+
+		}
 #endif // CONFIG_STA_SUPPORT // 
 
 		Frame.Category = CATEGORY_BA;
@@ -204,7 +219,7 @@ VOID MlmeDELBAAction(
 		}
 
 		// SEND BAR (Send BAR to refresh peer reordering buffer.)
-		Idx = pAd->MacTab.Content[pInfo->Wcid].BAOriWcidArray[pInfo->TID]; 
+		Idx = pAd->MacTab.Content[pInfo->Wcid].BAOriWcidArray[pInfo->TID];
 #ifdef CONFIG_STA_SUPPORT
 		IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
 			BarHeaderInit(pAd, &FrameBar, pAd->MacTab.Content[pInfo->Wcid].Addr, pAd->CurrentAddress);
@@ -228,7 +243,17 @@ VOID MlmeDELBAAction(
 		FrameLen = 0;
 #ifdef CONFIG_STA_SUPPORT
 		IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
-			ActHeaderInit(pAd, &Frame.Hdr,  pAd->CommonCfg.Bssid, pAd->CurrentAddress, pAd->MacTab.Content[pInfo->Wcid].Addr);
+		{
+			if (ADHOC_ON(pAd))
+				ActHeaderInit(pAd, &Frame.Hdr, pAd->MacTab.Content[pInfo->Wcid].Addr, pAd->CurrentAddress, pAd->CommonCfg.Bssid);
+			else
+#ifdef QOS_DLS_SUPPORT
+			if (pAd->MacTab.Content[pInfo->Wcid].ValidAsDls)
+				ActHeaderInit(pAd, &Frame.Hdr, pAd->MacTab.Content[pInfo->Wcid].Addr, pAd->CurrentAddress, pAd->CommonCfg.Bssid);
+			else
+#endif // QOS_DLS_SUPPORT //
+				ActHeaderInit(pAd, &Frame.Hdr,  pAd->CommonCfg.Bssid, pAd->CurrentAddress, pAd->MacTab.Content[pInfo->Wcid].Addr);
+		}
 #endif // CONFIG_STA_SUPPORT //
 		Frame.Category = CATEGORY_BA;
 		Frame.Action = DELBA;
@@ -246,6 +271,7 @@ VOID MlmeDELBAAction(
 		DBGPRINT(RT_DEBUG_TRACE, ("BA - MlmeDELBAAction() . 3 DELBA sent. Initiator(%d)\n", pInfo->Initiator));
     	}
 }
+#endif // DOT11_N_SUPPORT //
 
 VOID MlmeQOSAction(
     IN PRTMP_ADAPTER pAd, 
@@ -306,6 +332,7 @@ VOID PeerDLSAction(
 }
 #endif // QOS_DLS_SUPPORT //
 
+#ifdef DOT11_N_SUPPORT
 VOID PeerBAAction(
 	IN PRTMP_ADAPTER pAd, 
 	IN MLME_QUEUE_ELEM *Elem) 
@@ -582,6 +609,7 @@ VOID ChannelSwitchAction(
 	}
 }
 #endif // DOT11N_DRAFT3 //
+#endif // DOT11_N_SUPPORT //
 
 VOID PeerPublicAction(
 	IN PRTMP_ADAPTER pAd, 
@@ -666,6 +694,7 @@ VOID PeerRMAction(
 	return;
 }
 
+#ifdef DOT11_N_SUPPORT
 static VOID respond_ht_information_exchange_action(
 	IN PRTMP_ADAPTER pAd,
 	IN MLME_QUEUE_ELEM *Elem) 
@@ -694,7 +723,12 @@ static VOID respond_ht_information_exchange_action(
 	// 2-1. Prepare ADDBA Response frame.
 #ifdef CONFIG_STA_SUPPORT
 	IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
-		ActHeaderInit(pAd, &HTINFOframe.Hdr, pAd->CommonCfg.Bssid, pAd->CurrentAddress, pAddr);
+	{
+		if (ADHOC_ON(pAd))
+			ActHeaderInit(pAd, &HTINFOframe.Hdr, pAddr, pAd->CurrentAddress, pAd->CommonCfg.Bssid);
+		else
+			ActHeaderInit(pAd, &HTINFOframe.Hdr, pAd->CommonCfg.Bssid, pAd->CurrentAddress, pAddr);
+	}
 #endif // CONFIG_STA_SUPPORT //
 
 	HTINFOframe.Category = CATEGORY_HT;
@@ -769,6 +803,18 @@ VOID PeerHTAction(
 	{
 		case NOTIFY_BW_ACTION:
 			DBGPRINT(RT_DEBUG_TRACE,("ACTION - HT Notify Channel bandwidth action----> \n"));
+#ifdef CONFIG_STA_SUPPORT
+			if(pAd->StaActive.SupportedPhyInfo.bHtEnable == FALSE)
+			{
+				// Note, this is to patch DIR-1353 AP. When the AP set to Wep, it will use legacy mode. But AP still keeps 
+				// sending BW_Notify Action frame, and cause us to linkup and linkdown. 
+				// In legacy mode, don't need to parse HT action frame.
+				DBGPRINT(RT_DEBUG_TRACE,("ACTION -Ignore HT Notify Channel BW when link as legacy mode. BW = %d---> \n", 
+								Elem->Msg[LENGTH_802_11+2] ));
+				break;
+			}
+#endif // CONFIG_STA_SUPPORT //
+
 			if (Elem->Msg[LENGTH_802_11+2] == 0)	// 7.4.8.2. if value is 1, keep the same as supported channel bandwidth. 
 				pAd->MacTab.Content[Elem->Wcid].HTPhyMode.field.BW = 0;
 			
@@ -809,8 +855,7 @@ VOID PeerHTAction(
     					respond_ht_information_exchange_action(pAd, Elem);
     				}
 			}
-    		break;
-			
+    			break;	
 	}
 }
 
@@ -892,7 +937,7 @@ VOID SendRefreshBAR(
 				return;
 			}
 				
-			Sequence = pEntry->TxSeq[TID]; 
+			Sequence = pEntry->TxSeq[TID];
 #ifdef CONFIG_STA_SUPPORT
 			IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
 				BarHeaderInit(pAd, &FrameBar, pEntry->Addr, pAd->CurrentAddress);
@@ -908,13 +953,12 @@ VOID SendRefreshBAR(
 			if (1)	// Now we always send BAR.
 			{
 				MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);
-				DBGPRINT_RAW(RT_DEBUG_INFO, ("BA --> NoBADataCountDown  [= %d]!!!\n", pEntry->NoBADataCountDown));
-				DBGPRINT(RT_DEBUG_INFO,("BA - Send BAR, Seq = 0x%x \n", Sequence));
 			}
 			MlmeFreeMemory(pAd, pOutBuffer);
 		}
 	}
 }
+#endif // DOT11_N_SUPPORT //
 
 VOID ActHeaderInit(
     IN	PRTMP_ADAPTER	pAd, 
diff --git a/rt2860-1.7.0.0/common/ba_action.c b/rt2860-source-1.8.0.0/common/ba_action.c
similarity index 97%
copy from rt2860-1.7.0.0/common/ba_action.c
copy to rt2860-source-1.8.0.0/common/ba_action.c
index acfddfe..28a6e79 100644
--- a/rt2860-1.7.0.0/common/ba_action.c
+++ b/rt2860-source-1.8.0.0/common/ba_action.c
@@ -25,13 +25,14 @@
  *************************************************************************
  */
 
+#ifdef DOT11_N_SUPPORT
+
 #include "rt_config.h"
 
 
 
 #define BA_ORI_INIT_SEQ		(pEntry->TxSeq[TID]) //1			// inital sequence number of BA session
 
-#define MAX_TID_NUM		(15)
 #define ORI_SESSION_MAX_RETRY	8
 #define ORI_BA_SESSION_TIMEOUT	(2000)	// ms
 #define REC_BA_SESSION_IDLE_TIMEOUT	(1000)	// ms
@@ -437,9 +438,9 @@ void ba_flush_reordering_timeout_mpdus(
 		 &&(pBAEntry->list.qlen > 1)
 		)
 	{
-		printk("timeout[%d] (%lx-%lx = %d > %d): %x, flush all!\n ", pBAEntry->list.qlen, Now32, (pBAEntry->LastIndSeqAtTimer), 
+		DBGPRINT(RT_DEBUG_TRACE,("timeout[%d] (%08lx-%08lx = %d > %d): %x, flush all!\n ", pBAEntry->list.qlen, Now32, (pBAEntry->LastIndSeqAtTimer), 
 			   (int)((long) Now32 - (long)(pBAEntry->LastIndSeqAtTimer)), MAX_REORDERING_PACKET_TIMEOUT,
-			   pBAEntry->LastIndSeq);
+			   pBAEntry->LastIndSeq));
 		ba_refresh_reordering_mpdus(pAd, pBAEntry);
 		pBAEntry->LastIndSeqAtTimer = Now32;
 	}
@@ -448,9 +449,9 @@ void ba_flush_reordering_timeout_mpdus(
 		&& (pBAEntry->list.qlen > 0)
 	   )
 		{
-		printk("timeout[%d] (%lx-%lx = %d > %d): %x, ", pBAEntry->list.qlen, Now32, (pBAEntry->LastIndSeqAtTimer), 
-		   (int)((long) Now32 - (long)(pBAEntry->LastIndSeqAtTimer)), REORDERING_PACKET_TIMEOUT,
-		   pBAEntry->LastIndSeq);
+//		printk("timeout[%d] (%lx-%lx = %d > %d): %x, ", pBAEntry->list.qlen, Now32, (pBAEntry->LastIndSeqAtTimer), 
+//			   (int)((long) Now32 - (long)(pBAEntry->LastIndSeqAtTimer)), REORDERING_PACKET_TIMEOUT,
+//			   pBAEntry->LastIndSeq);
     		//
 		// force LastIndSeq to shift to LastIndSeq+1
     		// 
@@ -467,7 +468,7 @@ void ba_flush_reordering_timeout_mpdus(
     			pBAEntry->LastIndSeq = Sequence;
     		}
 
-		printk("%x, flush one!\n", pBAEntry->LastIndSeq);
+		//printk("%x, flush one!\n", pBAEntry->LastIndSeq);
 
 	}
 #if 0
@@ -476,9 +477,9 @@ void ba_flush_reordering_timeout_mpdus(
 			  (pBAEntry->list.qlen > 1))
 			)
 		{
-		printk("timeout[%d] (%lx-%lx = %d > %d): %x\n ", pBAEntry->list.qlen, Now32, (pBAEntry->LastIndSeqAtTimer), 
+		DBGPRINT(RT_DEBUG_TRACE,("timeout[%d] (%lx-%lx = %d > %d): %x\n ", pBAEntry->list.qlen, Now32, (pBAEntry->LastIndSeqAtTimer), 
 			   (int)((long) Now32 - (long)(pBAEntry->LastIndSeqAtTimer)), MAX_REORDERING_PACKET_TIMEOUT,
-			   pBAEntry->LastIndSeq);
+			   pBAEntry->LastIndSeq));
 		ba_refresh_reordering_mpdus(pAd, pBAEntry);
 			pBAEntry->LastIndSeqAtTimer = Now32;
 				}
@@ -513,6 +514,8 @@ VOID BAOriSessionSetUp(
 
 	if ((pEntry->BADeclineBitmap & (1<<TID)) && (isForced == FALSE))
 	{
+		// try again after 3 secs
+		DelayTime = 3000; 
 //		printk("DeCline BA from Peer\n");
 //		return;
 	}
@@ -607,6 +610,7 @@ VOID BAOriSessionAdd(
 			return;
 		}
 
+
 #ifdef CONFIG_STA_SUPPORT
 		IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
 			BarHeaderInit(pAd, &FrameBar, pAd->MacTab.Content[pBAEntry->Wcid].Addr, pAd->CurrentAddress);
@@ -705,6 +709,8 @@ BOOLEAN BARecSessionAdd(
 		pEntry->RXBAbitmap |= (1<<TID);
 		pEntry->BARecWcidArray[TID] = Idx;
 
+		pEntry->BADeclineBitmap &= ~(1<<TID);
+
 		// Set BA session mask in WCID table.
 		RT28XX_ADD_BA_SESSION_TO_ASIC(pAd, pEntry->Aid, TID);
 
@@ -1040,7 +1046,7 @@ VOID BASessionTearDownALL(
 {
 	int i;
 
-	for (i=0; i<=MAX_TID_NUM; i++)
+	for (i=0; i<NUM_OF_TID; i++)
 	{
 		BAOriSessionTearDown(pAd, Wcid, i, FALSE, FALSE);
 		BARecSessionTearDown(pAd, Wcid, i, FALSE);
@@ -1226,7 +1232,17 @@ VOID PeerAddBAReqAction(
 	// 2-1. Prepare ADDBA Response frame.
 #ifdef CONFIG_STA_SUPPORT
 	IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
-		ActHeaderInit(pAd, &ADDframe.Hdr, pAd->CommonCfg.Bssid, pAd->CurrentAddress, pAddr);
+	{
+		if (ADHOC_ON(pAd))
+			ActHeaderInit(pAd, &ADDframe.Hdr, pAddr, pAd->CurrentAddress, pAd->CommonCfg.Bssid);
+		else
+#ifdef QOS_DLS_SUPPORT
+		if (pAd->MacTab.Content[Elem->Wcid].ValidAsDls)
+			ActHeaderInit(pAd, &ADDframe.Hdr, pAddr, pAd->CurrentAddress, pAd->CommonCfg.Bssid);
+		else
+#endif // QOS_DLS_SUPPORT //
+			ActHeaderInit(pAd, &ADDframe.Hdr, pAd->CommonCfg.Bssid, pAd->CurrentAddress, pAddr);
+	}
 #endif // CONFIG_STA_SUPPORT //
 	ADDframe.Category = CATEGORY_BA;
 	ADDframe.Action = ADDBA_RESP;
@@ -1726,7 +1742,7 @@ VOID Indicate_AMPDU_Packet(
 	// 
 	else if (Sequence == pBAEntry->LastIndSeq)
 	{
-		DBGPRINT(RT_DEBUG_INFO, ("Duplicated receive pHeader->Sequence = 0x%x ,LastIndSeq = 0x%x. drop \n" , Sequence, pBAEntry->LastIndSeq));
+		
 		// drop and release packet
 		pBAEntry->nDropPacket++;
 		RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE);
@@ -1736,7 +1752,7 @@ VOID Indicate_AMPDU_Packet(
 	// 
 	else if (SEQ_SMALLER(Sequence, pBAEntry->LastIndSeq, MAXSEQ))
 	{
-		DBGPRINT(RT_DEBUG_INFO, ("Rcv old pHeader->Sequence = 0x%x ,LastIndSeq = 0x%x. drop \n" , Sequence, pBAEntry->LastIndSeq));
+		
 		// drop and release packet
 		pBAEntry->nDropPacket++;
 		RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE);
@@ -1759,8 +1775,7 @@ VOID Indicate_AMPDU_Packet(
 #else
 		LONG WinStartSeq, TmpSeq;
 
-		DBGPRINT(RT_DEBUG_INFO, ("%lu: Refresh. Sequence=0x%x, #RxPkt = %d.  LastIndSeq  = 0x%x.\n", Now32, Sequence, pBAEntry->list.qlen, pBAEntry->LastIndSeq));
-
+		
 		TmpSeq = Sequence - (pBAEntry->BAWinSize) -1;
 		if (TmpSeq < 0)
 		{
@@ -1782,3 +1797,6 @@ VOID Indicate_AMPDU_Packet(
 #endif
 	}
 }
+
+#endif // DOT11_N_SUPPORT //
+
diff --git a/rt2860-1.7.0.0/common/cmm_data.c b/rt2860-source-1.8.0.0/common/cmm_data.c
similarity index 93%
copy from rt2860-1.7.0.0/common/cmm_data.c
copy to rt2860-source-1.8.0.0/common/cmm_data.c
index d13c867..4262d37 100644
--- a/rt2860-1.7.0.0/common/cmm_data.c
+++ b/rt2860-source-1.8.0.0/common/cmm_data.c
@@ -198,7 +198,7 @@ NDIS_STATUS MiniportMMRequestUnlock(
 	TXWI_STRUC		TXWI;
 	ULONG	SW_TX_IDX; 
 	PTXD_STRUC		pTxD;
- 
+
 	QueIdx = 3;
 	ASSERT(Length <= MGMT_DMA_BUFFER_SIZE);
 
@@ -237,7 +237,7 @@ NDIS_STATUS MiniportMMRequestUnlock(
 				DBGPRINT(RT_DEBUG_WARN, ("MiniportMMRequest (error:: can't allocate NDIS PACKET)\n"));
 				break;
 			}
- 
+
 			Status = MlmeHardTransmit(pAd, QueIdx, pPacket);
 			if (Status != NDIS_STATUS_SUCCESS)
 				RTMPFreeNdisPacket(pAd, pPacket);
@@ -282,14 +282,10 @@ NDIS_STATUS MiniportMMRequestUnlock(
 */
 NDIS_STATUS MlmeHardTransmit(
 	IN	PRTMP_ADAPTER	pAd,
-	IN	UCHAR	QueIdx,
+	IN	UCHAR			QueIdx,
 	IN	PNDIS_PACKET	pPacket)
 {
-	if ((pAd->CommonCfg.RadarDetect.RDMode != RD_NORMAL_MODE)
-#ifdef CARRIER_DETECTION_SUPPORT
-		||(isCarrierDetectExist(pAd) == TRUE)
-#endif // CARRIER_DETECTION_SUPPORT //
-		)
+	if (pAd->CommonCfg.RadarDetect.RDMode != RD_NORMAL_MODE)
 	{
 		return NDIS_STATUS_FAILURE;
 	}
@@ -321,12 +317,14 @@ NDIS_STATUS MlmeHardTransmitTxRing(
 	PHEADER_802_11	pHeader_802_11;
 	BOOLEAN 		bAckRequired, bInsertTimestamp;
 	ULONG			SrcBufPA;
- 	UCHAR			MlmeRate;
+	UCHAR			MlmeRate;
 	ULONG			SwIdx = pAd->TxRing[QueIdx].TxCpuIdx;
 	PTXWI_STRUC 	pFirstTxWI;
- 	ULONG	 FreeNum;
+	ULONG	 FreeNum;
+	MAC_TABLE_ENTRY	*pMacEntry = NULL;
+
 
- 	RTMP_QueryPacketInfo(pPacket, &PacketInfo, &pSrcBufVA, &SrcBufLen);	 
+	RTMP_QueryPacketInfo(pPacket, &PacketInfo, &pSrcBufVA, &SrcBufLen);	
 
 	if (pSrcBufVA == NULL)
 	{
@@ -359,7 +357,7 @@ NDIS_STATUS MlmeHardTransmitTxRing(
 	if (pAd->TxRing[QueIdx].Cell[SwIdx].pNdisPacket)
 	{
 		printk("MlmeHardTransmit Error\n");
- 		return NDIS_STATUS_FAILURE;
+		return NDIS_STATUS_FAILURE;
 	}
 
 
@@ -367,7 +365,7 @@ NDIS_STATUS MlmeHardTransmitTxRing(
 	IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
 	{
 		// outgoing frame always wakeup PHY to prevent frame lost 
- 		if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))
+		if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))
 			AsicForceWakeup(pAd, TRUE);
 	}
 #endif // CONFIG_STA_SUPPORT //
@@ -382,7 +380,13 @@ NDIS_STATUS MlmeHardTransmitTxRing(
 	{
 		MlmeRate = pAd->CommonCfg.MlmeRate;
 	}
-	
+
+	if ((pHeader_802_11->FC.Type == BTYPE_DATA) &&
+		(pHeader_802_11->FC.SubType == SUBTYPE_QOS_NULL))
+	{
+		pMacEntry = MacTableLookup(pAd, pHeader_802_11->Addr1);
+	}
+
 	// Verify Mlme rate for a / g bands.	
 	if ((pAd->LatchRfRegs.Channel > 14) && (MlmeRate < RATE_6)) // 11A band
 		MlmeRate = RATE_6;
@@ -392,14 +396,12 @@ NDIS_STATUS MlmeHardTransmitTxRing(
 	// Snice it's been set to 0 while on MgtMacHeaderInit
 	// By the way this will cause frame to be send on PWR_SAVE failed.
 	// 
-	// pHeader_802_11->FC.PwrMgmt = 0; // (pAd->StaCfg.Psm == PWR_SAVE);
 	//
 	// In WMM-UAPSD, mlme frame should be set psm as power saving but probe request frame
 #ifdef CONFIG_STA_SUPPORT
     // Data-Null packets alse pass through MMRequest in RT2860, however, we hope control the psm bit to pass APSD
-	if ((pHeader_802_11->FC.Type != BTYPE_DATA) || (pAd->OpMode == OPMODE_AP))        
+	if (pHeader_802_11->FC.Type != BTYPE_DATA)
     {
-#endif // CONFIG_STA_SUPPORT //    
     	if ((pHeader_802_11->FC.SubType == SUBTYPE_PROBE_REQ) || !(pAd->CommonCfg.bAPSDCapable && pAd->CommonCfg.APEdcaParm.bAPSDCapable))
     	{
     		pHeader_802_11->FC.PwrMgmt = PWR_ACTIVE;
@@ -408,7 +410,6 @@ NDIS_STATUS MlmeHardTransmitTxRing(
     	{
     		pHeader_802_11->FC.PwrMgmt = pAd->CommonCfg.bAPSDForcePowerSave;
     	}
-#ifdef CONFIG_STA_SUPPORT        
     }
 #endif // CONFIG_STA_SUPPORT //
 	
@@ -444,7 +445,7 @@ NDIS_STATUS MlmeHardTransmitTxRing(
 		&& (pAd->CommonCfg.RadarDetect.RDMode != RD_NORMAL_MODE))
 	{
 		DBGPRINT(RT_DEBUG_ERROR,("MlmeHardTransmit --> radar detect not in normal mode !!!\n"));
- 		return (NDIS_STATUS_FAILURE);
+		return (NDIS_STATUS_FAILURE);
 	}
 
 #ifdef RT_BIG_ENDIAN
@@ -460,10 +461,23 @@ NDIS_STATUS MlmeHardTransmitTxRing(
 	// For inter-frame gap, the number is for this frame and next frame
 	// For MLME rate, we will fix as 2Mb to match other vendor's implement
 	
-	// management frame doesn't need encryption. so use RESERVED_WCID no matter u are sending to specific wcid or not.
+// management frame doesn't need encryption. so use RESERVED_WCID no matter u are sending to specific wcid or not.
 	// Only beacon use Nseq=TRUE. So here we use Nseq=FALSE.
-	RTMPWriteTxWI(pAd, pFirstTxWI, FALSE, FALSE, bInsertTimestamp, FALSE, bAckRequired, FALSE, 
+	if (pMacEntry == NULL)
+	{
+		RTMPWriteTxWI(pAd, pFirstTxWI, FALSE, FALSE, bInsertTimestamp, FALSE, bAckRequired, FALSE, 
 		0, RESERVED_WCID, (SrcBufLen - TXWI_SIZE), PID_MGMT, 0,  (UCHAR)pAd->CommonCfg.MlmeTransmit.field.MCS, IFS_BACKOFF, FALSE, &pAd->CommonCfg.MlmeTransmit);
+	}
+	else
+	{
+		RTMPWriteTxWI(pAd, pFirstTxWI, FALSE, FALSE,
+					bInsertTimestamp, FALSE, bAckRequired, FALSE,
+					0, pMacEntry->Aid, (SrcBufLen - TXWI_SIZE),
+					pMacEntry->MaxHTPhyMode.field.MCS, 0,
+					(UCHAR)pMacEntry->MaxHTPhyMode.field.MCS,
+					IFS_BACKOFF, FALSE, &pMacEntry->MaxHTPhyMode);
+	}
+
 	pAd->TxRing[QueIdx].Cell[SwIdx].pNdisPacket = pPacket;
 	pAd->TxRing[QueIdx].Cell[SwIdx].pNextNdisPacket = NULL;
 #ifdef RT_BIG_ENDIAN
@@ -510,9 +524,10 @@ NDIS_STATUS MlmeHardTransmitMgmtRing(
 	BOOLEAN 		bAckRequired, bInsertTimestamp;
 	UCHAR			MlmeRate;
 	PTXWI_STRUC 	pFirstTxWI;
+	MAC_TABLE_ENTRY	*pMacEntry = NULL;
 
 	RTMP_QueryPacketInfo(pPacket, &PacketInfo, &pSrcBufVA, &SrcBufLen);	
-	RTMP_SEM_LOCK(&pAd->MgmtRingLock);
+		RTMP_SEM_LOCK(&pAd->MgmtRingLock);
 
 
 	if (pSrcBufVA == NULL)
@@ -524,6 +539,7 @@ NDIS_STATUS MlmeHardTransmitMgmtRing(
 #ifdef CONFIG_STA_SUPPORT
 	IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
 	{
+		// outgoing frame always wakeup PHY to prevent frame lost 
 		if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))
 			AsicForceWakeup(pAd, TRUE);
 	}
@@ -540,17 +556,26 @@ NDIS_STATUS MlmeHardTransmitMgmtRing(
 	{
 		MlmeRate = pAd->CommonCfg.MlmeRate;
 	}
-	
+
 	// Verify Mlme rate for a / g bands.	
 	if ((pAd->LatchRfRegs.Channel > 14) && (MlmeRate < RATE_6)) // 11A band
 		MlmeRate = RATE_6;
 
+	if ((pHeader_802_11->FC.Type == BTYPE_DATA) &&
+		(pHeader_802_11->FC.SubType == SUBTYPE_QOS_NULL))
+	{
+		pMacEntry = MacTableLookup(pAd, pHeader_802_11->Addr1);
+	}
+
 #ifdef CONFIG_STA_SUPPORT
 	IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
 	{
 		// Fixed W52 with Activity scan issue in ABG_MIXED and ABGN_MIXED mode.    
-		if (pAd->CommonCfg.PhyMode == PHY_11ABG_MIXED ||
-			pAd->CommonCfg.PhyMode == PHY_11ABGN_MIXED)
+		if (pAd->CommonCfg.PhyMode == PHY_11ABG_MIXED 
+#ifdef DOT11_N_SUPPORT
+			|| pAd->CommonCfg.PhyMode == PHY_11ABGN_MIXED
+#endif // DOT11_N_SUPPORT //
+		)
 		{
 			if (pAd->LatchRfRegs.Channel > 14)
 				pAd->CommonCfg.MlmeTransmit.field.MODE = 1;
@@ -570,25 +595,26 @@ NDIS_STATUS MlmeHardTransmitMgmtRing(
 	// In WMM-UAPSD, mlme frame should be set psm as power saving but probe request frame
 #ifdef CONFIG_STA_SUPPORT	
     // Data-Null packets alse pass through MMRequest in RT2860, however, we hope control the psm bit to pass APSD    
-	if (((pHeader_802_11->FC.Type != BTYPE_DATA) && (pHeader_802_11->FC.Type != BTYPE_CNTL)) || (pAd->OpMode == OPMODE_AP))
+	if ((pHeader_802_11->FC.Type != BTYPE_DATA) && (pHeader_802_11->FC.Type != BTYPE_CNTL))
 	{
-#endif // CONFIG_STA_SUPPORT //
-		{
-#ifdef CONFIG_STA_SUPPORT			
-			if ((pAd->StaCfg.Psm == PWR_SAVE) &&
-				(pHeader_802_11->FC.SubType == SUBTYPE_ACTION))	
-				pHeader_802_11->FC.PwrMgmt = PWR_SAVE;
-			else
-#endif // CONFIG_STA_SUPPORT //
+		if ((pAd->StaCfg.Psm == PWR_SAVE) &&
+			(pHeader_802_11->FC.SubType == SUBTYPE_ACTION))	
+			pHeader_802_11->FC.PwrMgmt = PWR_SAVE;
+		else
 			pHeader_802_11->FC.PwrMgmt = PWR_ACTIVE;
-		}
-#ifdef CONFIG_STA_SUPPORT 
 	}
 #endif // CONFIG_STA_SUPPORT //
 	
 	bInsertTimestamp = FALSE;
 	if (pHeader_802_11->FC.Type == BTYPE_CNTL) // must be PS-POLL
 	{
+#ifdef CONFIG_STA_SUPPORT
+		//Set PM bit in ps-poll, to fix WLK 1.2  PowerSaveMode_ext failure issue.
+		if ((pAd->OpMode == OPMODE_STA) && (pHeader_802_11->FC.SubType == SUBTYPE_PS_POLL))
+		{
+			pHeader_802_11->FC.PwrMgmt = PWR_SAVE;
+		}
+#endif // CONFIG_STA_SUPPORT //
 		bAckRequired = FALSE;
 	}
 	else // BTYPE_MGMT or BTYPE_DATA(must be NULL frame)
@@ -609,7 +635,6 @@ NDIS_STATUS MlmeHardTransmitMgmtRing(
 		}
 	}
 
-
 	pHeader_802_11->Sequence = pAd->Sequence++;
 	if (pAd->Sequence >0xfff)
 		pAd->Sequence = 0;
@@ -639,9 +664,22 @@ NDIS_STATUS MlmeHardTransmitMgmtRing(
 	// For inter-frame gap, the number is for this frame and next frame
 	// For MLME rate, we will fix as 2Mb to match other vendor's implement
 	
-	// management frame doesn't need encryption. so use RESERVED_WCID no matter u are sending to specific wcid or not.
-	RTMPWriteTxWI(pAd, pFirstTxWI, FALSE, FALSE, bInsertTimestamp, FALSE, bAckRequired, FALSE, 
+// management frame doesn't need encryption. so use RESERVED_WCID no matter u are sending to specific wcid or not.
+	if (pMacEntry == NULL)
+	{
+		RTMPWriteTxWI(pAd, pFirstTxWI, FALSE, FALSE, bInsertTimestamp, FALSE, bAckRequired, FALSE, 
 		0, RESERVED_WCID, (SrcBufLen - TXINFO_SIZE - TXWI_SIZE), PID_MGMT, 0,  (UCHAR)pAd->CommonCfg.MlmeTransmit.field.MCS, IFS_BACKOFF, FALSE, &pAd->CommonCfg.MlmeTransmit);
+	}
+	else
+	{
+		RTMPWriteTxWI(pAd, pFirstTxWI, FALSE, FALSE,
+					bInsertTimestamp, FALSE, bAckRequired, FALSE,
+					0, pMacEntry->Aid, (SrcBufLen - TXINFO_SIZE - TXWI_SIZE),
+					pMacEntry->MaxHTPhyMode.field.MCS, 0,
+					(UCHAR)pMacEntry->MaxHTPhyMode.field.MCS,
+					IFS_BACKOFF, FALSE, &pMacEntry->MaxHTPhyMode);
+	}
+
 #ifdef RT_BIG_ENDIAN
 	RTMPWIEndianChange((PUCHAR)pFirstTxWI, TYPE_TXWI);
 #endif
@@ -725,7 +763,9 @@ static UCHAR TxPktClassification(
 	UCHAR			TxFrameType = TX_UNKOWN_FRAME;
 	UCHAR			Wcid;
 	MAC_TABLE_ENTRY	*pMacEntry = NULL;
+#ifdef DOT11_N_SUPPORT
 	BOOLEAN			bHTRate = FALSE;
+#endif // DOT11_N_SUPPORT //
 
 	Wcid = RTMP_GET_PACKET_WCID(pPacket);
 	if (Wcid == MCAST_WCID)
@@ -736,16 +776,17 @@ static UCHAR TxPktClassification(
 	// Handle for unicast packets
 	pMacEntry = &pAd->MacTab.Content[Wcid];
 	if (RTMP_GET_PACKET_LOWRATE(pPacket))
-	{	// It's a specific packet need to force low rate, i.e., bDHCPFrame, bEAPOLFrame
+	{	// It's a specific packet need to force low rate, i.e., bDHCPFrame, bEAPOLFrame, bWAIFrame
 		TxFrameType = TX_LEGACY_FRAME;
 	}
+#ifdef DOT11_N_SUPPORT
 	else if (IS_HT_RATE(pMacEntry))
 	{	// it's a 11n capable packet
 
 		// Depends on HTPhyMode to check if the peer support the HTRate transmission.
 		// 	Currently didn't support A-MSDU embedded in A-MPDU
 		bHTRate = TRUE;
-		if (RTMP_GET_PACKET_MOREDATA(pPacket))
+		if (RTMP_GET_PACKET_MOREDATA(pPacket) || (pMacEntry->PsMode == PWR_SAVE))
 			TxFrameType = TX_LEGACY_FRAME;
 #ifdef UAPSD_AP_SUPPORT
 		else if (RTMP_GET_PACKET_EOSP(pPacket))
@@ -758,6 +799,7 @@ static UCHAR TxPktClassification(
 		else
 			TxFrameType = TX_LEGACY_FRAME;
 	}
+#endif // DOT11_N_SUPPORT //
 	else 
 	{	// it's a legacy b/g packet.
 		if ((CLIENT_STATUS_TEST_FLAG(pMacEntry, fCLIENT_STATUS_AGGREGATION_CAPABLE) && pAd->CommonCfg.bAggregationCapable) &&
@@ -773,7 +815,7 @@ static UCHAR TxPktClassification(
 	}
 
 	// Currently, our fragment only support when a unicast packet send as NOT-ARALINK, NOT-AMSDU and NOT-AMPDU.
-	if ((RTMP_GET_PACKET_FRAGMENTS(pPacket) > 1) && (TxFrameType == TX_LEGACY_FRAME) /*&& (bHTRate == FALSE)*/)
+	if ((RTMP_GET_PACKET_FRAGMENTS(pPacket) > 1) && (TxFrameType == TX_LEGACY_FRAME))
 		TxFrameType = TX_FRAG_FRAME;
 
 	return TxFrameType;
@@ -804,11 +846,20 @@ BOOLEAN RTMP_FillTxBlkInfo(
 	// Default to clear this flag
 	TX_BLK_CLEAR_FLAG(pTxBlk, fTX_bForceNonQoS);
 	
+	
 	if (pTxBlk->Wcid == MCAST_WCID)
 	{
 		pTxBlk->pMacEntry = NULL;
-		pTxBlk->pTransmit = &pAd->MacTab.Content[MCAST_WCID].HTPhyMode;
-		
+		{
+#ifdef MCAST_RATE_SPECIFIC
+			PUCHAR pDA = GET_OS_PKT_DATAPTR(pPacket);
+			if (((*pDA & 0x01) == 0x01) && (*pDA != 0xff))
+				pTxBlk->pTransmit = &pAd->CommonCfg.MCastPhyMode;
+			else
+#endif // MCAST_RATE_SPECIFIC //
+				pTxBlk->pTransmit = &pAd->MacTab.Content[MCAST_WCID].HTPhyMode;
+		}
+
 		TX_BLK_CLEAR_FLAG(pTxBlk, fTX_bAckRequired);	// AckRequired = FALSE, when broadcast packet in Adhoc mode.
 		//TX_BLK_SET_FLAG(pTxBlk, fTX_bForceLowRate);
 		TX_BLK_CLEAR_FLAG(pTxBlk, fTX_bAllowFrag);
@@ -817,6 +868,7 @@ BOOLEAN RTMP_FillTxBlkInfo(
 		{
 			TX_BLK_SET_FLAG(pTxBlk, fTX_bMoreData);
 		}	
+		
 	}
 	else
 	{
@@ -825,19 +877,22 @@ BOOLEAN RTMP_FillTxBlkInfo(
 
 		pMacEntry = pTxBlk->pMacEntry;
 		
+		
 		// For all unicast packets, need Ack unless the Ack Policy is not set as NORMAL_ACK.
 		if (pAd->CommonCfg.AckPolicy[pTxBlk->QueIdx] != NORMAL_ACK)
 			TX_BLK_CLEAR_FLAG(pTxBlk, fTX_bAckRequired);
 		else
 			TX_BLK_SET_FLAG(pTxBlk, fTX_bAckRequired);
+
 		{
 
 #ifdef CONFIG_STA_SUPPORT
 			IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
 			{
+
 				// If support WMM, enable it.
 				if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED))
-					TX_BLK_SET_FLAG(pTxBlk, fTX_bWMM);		
+					TX_BLK_SET_FLAG(pTxBlk, fTX_bWMM);
 			}
 #endif // CONFIG_STA_SUPPORT //
 		}
@@ -846,9 +901,9 @@ BOOLEAN RTMP_FillTxBlkInfo(
 		{
 			if ( (RTMP_GET_PACKET_LOWRATE(pPacket)) ||
                 ((pAd->OpMode == OPMODE_AP) && (pMacEntry->MaxHTPhyMode.field.MODE == MODE_CCK) && (pMacEntry->MaxHTPhyMode.field.MCS == RATE_1)))
-			{	// Specific packet, i.e., bDHCPFrame, bEAPOLFrame, need force low rate.
+			{	// Specific packet, i.e., bDHCPFrame, bEAPOLFrame, bWAIFrame, need force low rate.
 				pTxBlk->pTransmit = &pAd->MacTab.Content[MCAST_WCID].HTPhyMode;
-
+#ifdef DOT11_N_SUPPORT
 				// Modify the WMM bit for ICV issue. If we have a packet with EOSP field need to set as 1, how to handle it???
 				if (IS_HT_STA(pTxBlk->pMacEntry) && 
 					(CLIENT_STATUS_TEST_FLAG(pMacEntry, fCLIENT_STATUS_RALINK_CHIPSET)) &&
@@ -857,13 +912,16 @@ BOOLEAN RTMP_FillTxBlkInfo(
 					TX_BLK_CLEAR_FLAG(pTxBlk, fTX_bWMM);
 					TX_BLK_SET_FLAG(pTxBlk, fTX_bForceNonQoS);
 				}
+#endif // DOT11_N_SUPPORT //
 			}
 			
+#ifdef DOT11_N_SUPPORT	
 			if ( (IS_HT_RATE(pMacEntry) == FALSE) && 
 				(CLIENT_STATUS_TEST_FLAG(pMacEntry, fCLIENT_STATUS_PIGGYBACK_CAPABLE)))
 			{	// Currently piggy-back only support when peer is operate in b/g mode.
 				TX_BLK_SET_FLAG(pTxBlk, fTX_bPiggyBack);
 			}
+#endif // DOT11_N_SUPPORT //
 
 			if (RTMP_GET_PACKET_MOREDATA(pPacket))
 			{
@@ -902,7 +960,9 @@ BOOLEAN CanDoAggregateTransmit(
 	if (RTMP_GET_PACKET_WCID(pPacket) == MCAST_WCID)
 		return FALSE;
 
-	if (RTMP_GET_PACKET_DHCP(pPacket) || RTMP_GET_PACKET_EAPOL(pPacket))
+	if (RTMP_GET_PACKET_DHCP(pPacket) || 
+		RTMP_GET_PACKET_EAPOL(pPacket) || 
+		RTMP_GET_PACKET_WAI(pPacket))
 		return FALSE;
 	
 	if ((pTxBlk->TxFrameType == TX_AMSDU_FRAME) &&
@@ -972,8 +1032,6 @@ VOID RTMPDeQueuePacket(
 	RtmpDiagStruct	*pDiagStruct = &pAd->DiagStruct;
 #endif
 
-	DBGPRINT(RT_DEBUG_INFO,("RTMPDeQueuePacket (Tx:%d)--> \n", Max_Tx_Packets));
-
 
 	if (QIdx == NUM_OF_TX_RING)
 	{
@@ -984,8 +1042,7 @@ VOID RTMPDeQueuePacket(
 	{
 		sQIdx = eQIdx = QIdx;
 	}
-
-	DBGPRINT(RT_DEBUG_INFO, ("RTMPDeQueuePacket (QueIdx:%d-%d)--> \n", sQIdx, eQIdx));
+	
 	for (QueIdx=sQIdx; QueIdx <= eQIdx; QueIdx++)
 	{
 		Count=0;
@@ -1012,7 +1069,6 @@ VOID RTMPDeQueuePacket(
 				break;
 			
 			DEQUEUE_LOCK(&pAd->irq_lock, bIntContext, IrqFlags);
-			
 			if (&pAd->TxSwQueue[QueIdx] == NULL)
 			{
 #ifdef DBG_DIAGNOSE
@@ -1069,12 +1125,6 @@ VOID RTMPDeQueuePacket(
 			if (!hasTxDesc)
 			{
 				pAd->PrivateInfo.TxRingFullCnt++;
-				DBGPRINT(RT_DEBUG_LOUD, ("TxRing(%d) full, SwQueue Len = %lu, packet required frag =%d!\n", 
-								QueIdx, pAd->TxSwQueue[QueIdx].Number, RTMP_GET_PACKET_FRAGMENTS(pPacket)));
-#ifdef RT2860
-				DBGPRINT(RT_DEBUG_INFO,("DeqPkt -> Not enough free TxD[%d] (TX_CTX_IDX=%u, TxSwFreeIdx=%u)!!!\n",
-								QueIdx, pAd->TxRing[QueIdx].TxCpuIdx, pAd->TxRing[QueIdx].TxSwFreeIdx));
-#endif // RT2860 //
 
 				DEQUEUE_UNLOCK(&pAd->irq_lock, bIntContext, IrqFlags);
 				
@@ -1286,13 +1336,16 @@ VOID RTMPWriteTxWI(
 	
 	pTxWI->NSEQ = NSeq;
 	// John tune the performace with Intel Client in 20 MHz performance
-
+#ifdef DOT11_N_SUPPORT
 	BASize = pAd->CommonCfg.TxBASize;
 
 	if( BASize >7 )
 		BASize =7;
-		
-	pTxWI->BAWinSize = BASize;	
+	pTxWI->BAWinSize = BASize;
+	pTxWI->ShortGI = pTransmit->field.ShortGI;
+	pTxWI->STBC = pTransmit->field.STBC;
+#endif // DOT11_N_SUPPORT //
+
 	pTxWI->WirelessCliID = WCID;
 	pTxWI->MPDUtotalByteCount = Length; 
 	pTxWI->PacketId = PID; 
@@ -1303,33 +1356,31 @@ VOID RTMPWriteTxWI(
 	if (pTxWI->BW)
 		pTxWI->BW = (pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth == 0) ? (BW_20) : (pTransmit->field.BW);	
 #endif // DOT11N_DRAFT3 //
-	pTxWI->ShortGI = pTransmit->field.ShortGI;
-	pTxWI->STBC = pTransmit->field.STBC;
 	
 	pTxWI->MCS = pTransmit->field.MCS;
 	pTxWI->PHYMODE = pTransmit->field.MODE;
 	pTxWI->CFACK = CfAck;
 
-
+#ifdef DOT11_N_SUPPORT
 	if (pMac)
 	{		
-        if (pAd->CommonCfg.bMIMOPSEnable)
-        {
-    		if ((pMac->MmpsMode == MMPS_DYNAMIC) && (pTransmit->field.MCS > 7))
+		if (pAd->CommonCfg.bMIMOPSEnable)
 		{
-			// Dynamic MIMO Power Save Mode
-			pTxWI->MIMOps = 1;
-		} 
-		else if (pMac->MmpsMode == MMPS_STATIC)
-		{
-			// Static MIMO Power Save Mode
-			if (pTransmit->field.MODE >= MODE_HTMIX && pTransmit->field.MCS > 7)
-			{			
-				pTxWI->MCS = 7;
-				pTxWI->MIMOps = 0;
+			if ((pMac->MmpsMode == MMPS_DYNAMIC) && (pTransmit->field.MCS > 7))
+			{
+				// Dynamic MIMO Power Save Mode
+				pTxWI->MIMOps = 1;
+			} 
+			else if (pMac->MmpsMode == MMPS_STATIC)
+			{
+				// Static MIMO Power Save Mode
+				if (pTransmit->field.MODE >= MODE_HTMIX && pTransmit->field.MCS > 7)
+				{			
+					pTxWI->MCS = 7;
+					pTxWI->MIMOps = 0;
+				}
 			}
 		}
-        }
 		//pTxWI->MIMOps = (pMac->PsMode == PWR_MMPS)? 1:0;
 		if (pMac->bIAmBadAtheros && (pMac->WepStatus != Ndis802_11WEPDisabled))
 		{
@@ -1337,9 +1388,10 @@ VOID RTMPWriteTxWI(
 		}
 		else 
 		{
-		pTxWI->MpduDensity = pMac->MpduDensity;
-	}
+			pTxWI->MpduDensity = pMac->MpduDensity;
+		}
 	}
+#endif // DOT11_N_SUPPORT //
 
 	pTxWI->PacketId = pTxWI->MCS;
 	NdisMoveMemory(pOutTxWI, &TxWI, sizeof(TXWI_STRUC));
@@ -1353,15 +1405,17 @@ VOID RTMPWriteTxWI_Data(
 {
 	HTTRANSMIT_SETTING	*pTransmit;
 	PMAC_TABLE_ENTRY	pMacEntry;
+#ifdef DOT11_N_SUPPORT
 	UCHAR				BASize;
-	//BOOLEAN				bAutoRate;
-	//UCHAR				fixed_tx_mode;
+#endif // DOT11_N_SUPPORT //
+
 
 	ASSERT(pTxWI);
 
 	pTransmit = pTxBlk->pTransmit;
 	pMacEntry = pTxBlk->pMacEntry;
 
+
 	//
 	// Always use Long preamble before verifiation short preamble functionality works well.
 	// Todo: remove the following line if short preamble functionality works
@@ -1370,24 +1424,9 @@ VOID RTMPWriteTxWI_Data(
 	NdisZeroMemory(pTxWI, TXWI_SIZE);
 	
 	pTxWI->FRAG		= TX_BLK_TEST_FLAG(pTxBlk, fTX_bAllowFrag);
-
-	pTxWI->AMPDU	= ((pTxBlk->TxFrameType == TX_AMPDU_FRAME) ? TRUE : FALSE);
 	pTxWI->ACK		= TX_BLK_TEST_FLAG(pTxBlk, fTX_bAckRequired);
 	pTxWI->txop		= pTxBlk->FrameGap;
-
-	// John tune the performace with Intel Client in 20 MHz performance
-	BASize = pAd->CommonCfg.TxBASize;
-	if((pTxBlk->TxFrameType == TX_AMPDU_FRAME) && (pMacEntry))
-	{
-		UCHAR		RABAOriIdx = 0;	//The RA's BA Originator table index. 
-					
-		RABAOriIdx = pTxBlk->pMacEntry->BAOriWcidArray[pTxBlk->UserPriority];
-		BASize = pAd->BATable.BAOriEntry[RABAOriIdx].BAWinSize;
-	}
-
-	pTxWI->TxBF = pTransmit->field.TxBF;
-
-	pTxWI->BAWinSize			= BASize;	
+	
 #ifdef CONFIG_STA_SUPPORT
 #ifdef QOS_DLS_SUPPORT
 	if (pMacEntry &&		
@@ -1397,22 +1436,40 @@ VOID RTMPWriteTxWI_Data(
 	else
 #endif // QOS_DLS_SUPPORT //
 #endif // CONFIG_STA_SUPPORT //
-	pTxWI->WirelessCliID		= pTxBlk->Wcid;
+		pTxWI->WirelessCliID		= pTxBlk->Wcid;
+
 	pTxWI->MPDUtotalByteCount	= pTxBlk->MpduHeaderLen + pTxBlk->SrcBufLen; 
 	pTxWI->CFACK				= TX_BLK_TEST_FLAG(pTxBlk, fTX_bPiggyBack);
 
 	// If CCK or OFDM, BW must be 20
 	pTxWI->BW = (pTransmit->field.MODE <= MODE_OFDM) ? (BW_20) : (pTransmit->field.BW);
+#ifdef DOT11_N_SUPPORT
 #ifdef DOT11N_DRAFT3
 	if (pTxWI->BW)
 		pTxWI->BW = (pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth == 0) ? (BW_20) : (pTransmit->field.BW);	
 #endif // DOT11N_DRAFT3 //
+	pTxWI->AMPDU	= ((pTxBlk->TxFrameType == TX_AMPDU_FRAME) ? TRUE : FALSE);
+
+	// John tune the performace with Intel Client in 20 MHz performance
+	BASize = pAd->CommonCfg.TxBASize;
+	if((pTxBlk->TxFrameType == TX_AMPDU_FRAME) && (pMacEntry))
+	{
+		UCHAR		RABAOriIdx = 0;	//The RA's BA Originator table index. 
+					
+		RABAOriIdx = pTxBlk->pMacEntry->BAOriWcidArray[pTxBlk->UserPriority];
+		BASize = pAd->BATable.BAOriEntry[RABAOriIdx].BAWinSize;
+	}
+
+	pTxWI->TxBF = pTransmit->field.TxBF;
+	pTxWI->BAWinSize = BASize;
 	pTxWI->ShortGI = pTransmit->field.ShortGI;
 	pTxWI->STBC = pTransmit->field.STBC;
-	
+#endif // DOT11_N_SUPPORT //
+
 	pTxWI->MCS = pTransmit->field.MCS;
 	pTxWI->PHYMODE = pTransmit->field.MODE;
 
+#ifdef DOT11_N_SUPPORT
 	if (pMacEntry)
 	{		
 		if ((pMacEntry->MmpsMode == MMPS_DYNAMIC) && (pTransmit->field.MCS > 7))
@@ -1436,10 +1493,11 @@ VOID RTMPWriteTxWI_Data(
 		}
 		else 
 		{
-		pTxWI->MpduDensity = pMacEntry->MpduDensity;
-	}
+			pTxWI->MpduDensity = pMacEntry->MpduDensity;
+		}
 	}
-	
+#endif // DOT11_N_SUPPORT //
+
 #ifdef DBG_DIAGNOSE
 		if (pTxBlk->QueIdx== 0)
 		{
@@ -1482,6 +1540,8 @@ VOID RTMPWriteTxWI_Cache(
 		// set PID for TxRateSwitching
 		pTxWI->PacketId = pTransmit->field.MCS;
 	}
+
+#ifdef DOT11_N_SUPPORT
 	pTxWI->AMPDU = ((pMacEntry->NoBADataCountDown == 0) ? TRUE: FALSE);
 	pTxWI->MIMOps = 0;
 
@@ -1490,8 +1550,8 @@ VOID RTMPWriteTxWI_Cache(
 		pTxWI->BW = (pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth == 0) ? (BW_20) : (pTransmit->field.BW);	
 #endif // DOT11N_DRAFT3 //
 
-    if (pAd->CommonCfg.bMIMOPSEnable)
-    {
+	if (pAd->CommonCfg.bMIMOPSEnable)
+	{
 		// MIMO Power Save Mode
 		if ((pMacEntry->MmpsMode == MMPS_DYNAMIC) && (pTransmit->field.MCS > 7))
 		{
@@ -1507,7 +1567,8 @@ VOID RTMPWriteTxWI_Cache(
 				pTxWI->MIMOps = 0;
 			}
 		}
-    }
+	}
+#endif // DOT11_N_SUPPORT //
 
 #ifdef DBG_DIAGNOSE
 	if (pTxBlk->QueIdx== 0)
@@ -1622,13 +1683,15 @@ BOOLEAN PeerIsAggreOn(
 	
 	if (pMacEntry != NULL && CLIENT_STATUS_TEST_FLAG(pMacEntry, AFlags))
 	{		
-		//if (TxRate >= RATE_6)
+#ifdef DOT11_N_SUPPORT
 		if (pMacEntry->HTPhyMode.field.MODE >= MODE_HTMIX)
 		{			
 			return TRUE;
 		}
+#endif // DOT11_N_SUPPORT //
+
 #ifdef AGGREGATION_SUPPORT
-		else if (TxRate >= RATE_6 && pAd->CommonCfg.bAggregationCapable && (!(OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED) && CLIENT_STATUS_TEST_FLAG(pMacEntry, fCLIENT_STATUS_WMM_CAPABLE))))
+		if (TxRate >= RATE_6 && pAd->CommonCfg.bAggregationCapable && (!(OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED) && CLIENT_STATUS_TEST_FLAG(pMacEntry, fCLIENT_STATUS_WMM_CAPABLE))))
 		{	// legacy  Ralink Aggregation support
 			return TRUE;
 		}
@@ -1926,7 +1989,7 @@ kick_out:
 #endif // RALINK_ATE //
 	}
 
-	DBGPRINT(RT_DEBUG_LOUD, ("RTMPFreeTXDUponTxDmaDone %d.\n", FREE));
+	
 	return  bReschedule;
 
 }	
@@ -2075,7 +2138,6 @@ VOID	RTMPHandleTBTTInterrupt(
 	{
 		if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))
 		{
-			DBGPRINT(RT_DEBUG_INFO, ("RTMPHandleTBTTInterrupt...\n"));
 		}
 	}
 }
@@ -2101,6 +2163,8 @@ VOID	RTMPHandlePreTBTTInterrupt(
 			DBGPRINT(RT_DEBUG_TRACE, ("RTMPHandlePreTBTTInterrupt...\n"));
 		}
 	}
+
+
 }
 
 VOID	RTMPHandleRxCoherentInterrupt(
@@ -2271,13 +2335,6 @@ VOID	RTMPSuspendMsduTransmission(
 {
 	DBGPRINT(RT_DEBUG_TRACE,("SCANNING, suspend MSDU transmission ...\n"));
 
-#ifdef CARRIER_DETECTION_SUPPORT // Roger sync Carrier
-	// no carrier detection when scanning
-	if (pAd->CommonCfg.CarrierDetect.Enable == TRUE)
-	{
-		CarrierDetectionStop(pAd);
-	}
-#endif
 
 	//
 	// Before BSS_SCAN_IN_PROGRESS, we need to keep Current R66 value and
@@ -2312,19 +2369,9 @@ VOID	RTMPSuspendMsduTransmission(
 */
 VOID RTMPResumeMsduTransmission(
 	IN	PRTMP_ADAPTER	pAd)
-{    
+{
 	DBGPRINT(RT_DEBUG_TRACE,("SCAN done, resume MSDU transmission ...\n"));
 
-#ifdef CARRIER_DETECTION_SUPPORT // Roger sync Carrier
-	// no carrier detection when scanning
-	if (pAd->CommonCfg.CarrierDetect.Enable == TRUE)
-	{
-		if (isCarrierDetectExist(pAd))
-			CarrierDetectionStart(pAd, 0);
-		else
-			CarrierDetectionStart(pAd, 1);
-	}
-#endif
 
 	RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, pAd->BbpTuning.R66CurrentValue);
 
@@ -2485,56 +2532,6 @@ MAC_TABLE_ENTRY *MacTableLookup(
 	return pEntry;
 }
 
-
-/*
-	==========================================================================
-	Description:
-		This routine reset the entire MAC table. All packets pending in
-		the power-saving queues are freed here.
-	==========================================================================
- */
-VOID STAMacTableReset(
-	IN  PRTMP_ADAPTER  pAd)
-{
-	int         i;
-	USHORT      Reason;
-
-	DBGPRINT(RT_DEBUG_TRACE, ("STAMacTableReset\n"));
-	NdisAcquireSpinLock(&pAd->MacTabLock);
-
-	for (i=1; i<MAX_LEN_OF_MAC_TABLE; i++)
-	{
-		Reason = MAC_WCID_BASE + (i* HW_WCID_ENTRY_SIZE);	
-
-#ifdef RT2860
-		RTMP_IO_WRITE32(pAd, Reason, 0xffffffff);
-		RTMP_IO_WRITE32(pAd, Reason+4, 0xffff);
-#endif // RT2860 //
-
-		if (pAd->MacTab.Content[i].ValidAsCLI == TRUE)
-	    {
-
-			// free resources of BA
-			BASessionTearDownALL(pAd, i);
-
-			pAd->MacTab.Content[i].ValidAsCLI = FALSE;
-
-			Reason = MAC_WCID_BASE + (i* HW_WCID_ENTRY_SIZE);
-
-#ifdef RT2860
-			RTMP_IO_WRITE32(pAd, Reason, 0xffffffff);
-			RTMP_IO_WRITE32(pAd, Reason+4, 0xffff);
-#endif // RT2860 //
-		}
-
-	}
-
-	NdisZeroMemory(&pAd->MacTab, sizeof(MAC_TABLE));
-
-	NdisReleaseSpinLock(&pAd->MacTabLock);
-}
-
-
 MAC_TABLE_ENTRY *MacTableInsertEntry(
 	IN  PRTMP_ADAPTER   pAd, 
 	IN  PUCHAR			pAddr,
@@ -2650,6 +2647,17 @@ MAC_TABLE_ENTRY *MacTableInsertEntry(
 			pEntry->GTKState = REKEY_NEGOTIATING;
 			pEntry->PairwiseKey.KeyLen = 0;
 			pEntry->PairwiseKey.CipherAlg = CIPHER_NONE;
+#ifdef CONFIG_STA_SUPPORT
+			if ((pAd->OpMode == OPMODE_STA) &&
+				(pAd->StaCfg.BssType == BSS_ADHOC))
+				pEntry->PortSecured = WPA_802_1X_PORT_SECURED;
+			else
+#ifdef QOS_DLS_SUPPORT
+			if (pEntry->ValidAsDls == TRUE)
+				pEntry->PortSecured = WPA_802_1X_PORT_SECURED;
+			else 
+#endif //QOS_DLS_SUPPORT
+#endif // CONFIG_STA_SUPPORT //
 			pEntry->PortSecured = WPA_802_1X_PORT_NOT_SECURED;
 			pEntry->PMKID_CacheIdx = ENTRY_NOT_FOUND;
 			COPY_MAC_ADDR(pEntry->Addr, pAddr);
@@ -2660,6 +2668,7 @@ MAC_TABLE_ENTRY *MacTableInsertEntry(
 			pEntry->PsMode = PWR_ACTIVE;
 			pEntry->PsQIdleCount = 0;
 			pEntry->NoDataIdleCount = 0;
+			pEntry->ContinueTxFailCnt = 0;
 			InitializeQueueHeader(&pEntry->PsQueue);
 
 
@@ -2732,8 +2741,10 @@ BOOLEAN MacTableDeleteEntry(
 			// Delete this entry from ASIC on-chip WCID Table
 			RT28XX_STA_ENTRY_MAC_RESET(pAd, wcid);
 
+#ifdef DOT11_N_SUPPORT
 			// free resources of BA
 			BASessionTearDownALL(pAd, pEntry->Aid);
+#endif // DOT11_N_SUPPORT //
 
 
 			pPrevEntry = NULL;
@@ -2766,11 +2777,11 @@ BOOLEAN MacTableDeleteEntry(
 			RT28XX_STA_ENTRY_KEY_DEL(pAd, BSS0, wcid);
 
 
-			if (pEntry->EnqueueEapolStartTimerRunning != EAPOL_START_DISABLE)
-            {                
-                RTMPCancelTimer(&pEntry->EnqueueStartForPSKTimer, &Cancelled);
-                pEntry->EnqueueEapolStartTimerRunning = EAPOL_START_DISABLE;             
-            }
+		if (pEntry->EnqueueEapolStartTimerRunning != EAPOL_START_DISABLE)
+		{                
+			RTMPCancelTimer(&pEntry->EnqueueStartForPSKTimer, &Cancelled);
+			pEntry->EnqueueEapolStartTimerRunning = EAPOL_START_DISABLE;             
+		}
 
 
    			NdisZeroMemory(pEntry, sizeof(MAC_TABLE_ENTRY));
@@ -2788,8 +2799,10 @@ BOOLEAN MacTableDeleteEntry(
 	//Reset operating mode when no Sta.
 	if (pAd->MacTab.Size == 0)
 	{
+#ifdef DOT11_N_SUPPORT
 		pAd->CommonCfg.AddHTInfo.AddHtInfo2.OperaionMode = 0;
-		AsicUpdateProtect(pAd, pAd->CommonCfg.AddHTInfo.AddHtInfo2.OperaionMode, (ALLN_SETPROTECT), TRUE, pAd->MacTab.fAnyStationNonGF);
+#endif // DOT11_N_SUPPORT //
+		AsicUpdateProtect(pAd, 0 /*pAd->CommonCfg.AddHTInfo.AddHtInfo2.OperaionMode*/, (ALLN_SETPROTECT), TRUE, 0 /*pAd->MacTab.fAnyStationNonGF*/);
 	}
 
 	return TRUE;
@@ -2799,6 +2812,46 @@ BOOLEAN MacTableDeleteEntry(
 /*
 	==========================================================================
 	Description:
+		This routine reset the entire MAC table. All packets pending in
+		the power-saving queues are freed here.
+	==========================================================================
+ */
+VOID MacTableReset(
+	IN  PRTMP_ADAPTER  pAd)
+{
+	int         i;
+
+	DBGPRINT(RT_DEBUG_TRACE, ("MacTableReset\n"));
+	//NdisAcquireSpinLock(&pAd->MacTabLock);
+
+	for (i=1; i<MAX_LEN_OF_MAC_TABLE; i++)
+	{
+#ifdef RT2860
+		RT28XX_STA_ENTRY_MAC_RESET(pAd, i);
+#endif // RT2860 //
+		if (pAd->MacTab.Content[i].ValidAsCLI == TRUE)
+	   {
+
+#ifdef DOT11_N_SUPPORT
+			// free resources of BA
+			BASessionTearDownALL(pAd, i);
+#endif // DOT11_N_SUPPORT //
+
+			pAd->MacTab.Content[i].ValidAsCLI = FALSE;
+
+
+
+
+			//AsicDelWcidTab(pAd, i);
+		}
+	}
+
+	return;
+}
+
+/*
+	==========================================================================
+	Description:
 
 	IRQL = DISPATCH_LEVEL
 	
@@ -2966,7 +3019,7 @@ BOOLEAN RTMPCheckEtherType(
 		*/
 		if (pSrcBuf[0] == 0xAA && pSrcBuf[1] == 0xAA && pSrcBuf[2] == 0x03)
 		{
-			Sniff2BytesFromNdisBuffer(pSrcBuf, 6, &Byte0, &Byte0);
+			Sniff2BytesFromNdisBuffer(pSrcBuf, 6, &Byte0, &Byte1);
 			RTMP_SET_PACKET_LLCSNAP(pPacket, 1);
 			TypeLen = (USHORT)((Byte0 << 8) + Byte1);
 			pSrcBuf += 8; // Skip this LLC/SNAP header
@@ -3123,19 +3176,22 @@ VOID CmmRxnonRalinkFrameIndicate(
 	IN	RX_BLK			*pRxBlk,
 	IN	UCHAR			FromWhichBSSID)
 {
-
+#ifdef DOT11_N_SUPPORT
 	if (RX_BLK_TEST_FLAG(pRxBlk, fRX_AMPDU) && (pAd->CommonCfg.bDisableReordering == 0)) 
 	{
 		Indicate_AMPDU_Packet(pAd, pRxBlk, FromWhichBSSID);
 	} 
 	else 
+#endif // DOT11_N_SUPPORT //
 	{
+#ifdef DOT11_N_SUPPORT
 		if (RX_BLK_TEST_FLAG(pRxBlk, fRX_AMSDU))
 		{  
 			// handle A-MSDU
 			Indicate_AMSDU_Packet(pAd, pRxBlk, FromWhichBSSID);
 		}
 		else
+#endif // DOT11_N_SUPPORT //
 		{						 
 			Indicate_Legacy_Packet(pAd, pRxBlk, FromWhichBSSID);
 		}
diff --git a/rt2860-1.7.0.0/common/cmm_data_2860.c b/rt2860-source-1.8.0.0/common/cmm_data_2860.c
similarity index 96%
copy from rt2860-1.7.0.0/common/cmm_data_2860.c
copy to rt2860-source-1.8.0.0/common/cmm_data_2860.c
index a04021d..2c3c0a3 100644
--- a/rt2860-1.7.0.0/common/cmm_data_2860.c
+++ b/rt2860-source-1.8.0.0/common/cmm_data_2860.c
@@ -59,7 +59,7 @@ USHORT RtmpPCI_WriteTxResource(
 
 	// copy TXINFO + TXWI + WLAN Header + LLC into DMA Header Buffer
 	if (pTxBlk->TxFrameType == TX_AMSDU_FRAME)
-	{ 
+	{
 		hwHeaderLen = pTxBlk->MpduHeaderLen - LENGTH_AMSDU_SUBFRAMEHEAD + pTxBlk->HdrPadLen + LENGTH_AMSDU_SUBFRAMEHEAD;
 	}
 	else
@@ -390,7 +390,7 @@ USHORT	RtmpPCI_WriteFragTxResource(
 	
 	pTxD->SDPtr0 = BufBasePaLow;
 	pTxD->SDLen0 = firstDMALen; // include padding
-	pTxD->SDPtr1 = PCI_MAP_SINGLE(pAd, pTxBlk, 0, 1, PCI_DMA_TODEVICE);;
+	pTxD->SDPtr1 = PCI_MAP_SINGLE(pAd, pTxBlk, 0, 1, PCI_DMA_TODEVICE);
 	pTxD->SDLen1 = pTxBlk->SrcBufLen;
 	pTxD->LastSec0 = 0;
 	pTxD->LastSec1 = 1;
@@ -417,7 +417,7 @@ USHORT	RtmpPCI_WriteFragTxResource(
 
 	return RetTxIdx;
 	
-} 
+}
 
 /*
 	Must be run in Interrupt context
@@ -587,7 +587,7 @@ NDIS_STATUS RTMPCheckRxError(
 		if (pHeader == NULL)
 			return(NDIS_STATUS_SUCCESS);
 		
- 		return(NDIS_STATUS_FAILURE);
+		return(NDIS_STATUS_FAILURE);
 	}
 	
 	return(NDIS_STATUS_SUCCESS);
@@ -776,10 +776,6 @@ VOID RT28xxPciAsicRadioOff(
 		RTMP_IO_WRITE32(pAd, WPDMA_GLO_CFG, DmaCfg.word);
 	}
     
-	// Disable for stability. If PCIE Link Control is modified for advance power save, re-covery this code segment.
-    RTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, 0x1280);
-    OPSTATUS_SET_FLAG(pAd, fOP_STATUS_CLKSELECT_40MHZ);    
-    
 	if (Level == DOT11POWERSAVE)
 	{
 		AUTO_WAKEUP_STRUC	AutoWakeupCfg;
@@ -839,9 +835,7 @@ BOOLEAN RT28xxPciAsicRadioOn(
 	{
 	    pAd->Mlme.bPsPollTimerRunning = FALSE;
 		RTMPCancelTimer(&pAd->Mlme.PsPollTimer,	&Cancelled);
-	    // Need to check bPCIclkOffCommand flag. Because sometimes miss RTMPPCIePowerLinkCtrlRestore function before call this RadioOn from
-		// autowakeup interrupt in EeePC.
-		if ((Level == GUIRADIO_OFF) || (Level == GUI_IDLE_POWER_SAVE) || (pAd->bPCIclkOffCommand == TRUE))
+		if ((Level == GUIRADIO_OFF) || (Level == GUI_IDLE_POWER_SAVE))
 		{
 			DBGPRINT(RT_DEBUG_TRACE, ("RT28xxPciAsicRadioOn ()\n"));
 			// 1. Set PCI Link Control in Configuration Space.
@@ -851,16 +845,12 @@ BOOLEAN RT28xxPciAsicRadioOn(
 	}
     
     pAd->bPCIclkOff = FALSE;
-	// Disable for stability. If PCIE Link Control is modified for advance power save, re-covery this code segment.
-   	RTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, 0x1a80);
-    OPSTATUS_SET_FLAG(pAd, fOP_STATUS_CLKSELECT_40MHZ);
     
 	// 2. Send wake up command.
 	AsicSendCommandToMcu(pAd, 0x31, PowerWakeCID, 0x00, 0x00);
     
 	// 2-1. wait command ok.
 	brv = AsicCheckCommanOk(pAd, PowerWakeCID);	
-
     if (brv)
     {
     	//RTMP_IO_WRITE32(pAd, INT_MASK_CSR, (DELAYINTMASK|RxINT));
@@ -1003,7 +993,7 @@ VOID RT28xxPciStaAsicSleepThenAutoWakeup(
         AUTO_WAKEUP_STRUC	AutoWakeupCfg;	
         // we have decided to SLEEP, so at least do it for a BEACON period.	
         if (TbttNumToNextWakeUp == 0)
-            TbttNumToNextWakeUp = 1;
+            TbttNumToNextWakeUp = 1; 
         
         AutoWakeupCfg.word = 0; 
         RTMP_IO_WRITE32(pAd, AUTO_WAKEUP_CFG, AutoWakeupCfg.word);  
@@ -1072,12 +1062,6 @@ VOID  RadioOnExec(
 		RTMPRingCleanUp(pAd, QID_MGMT);
 		RTMPRingCleanUp(pAd, QID_RX);
 
-        
-		// Disable for stability. If PCIE Link Control is modified for advance power save, re-covery this code segment.
-  		// Turn Off PDB clk
-   		RTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, 0x1a80);
-        OPSTATUS_SET_FLAG(pAd, fOP_STATUS_CLKSELECT_40MHZ);
-		
 		// 2. Send wake up command.
 		AsicSendCommandToMcu(pAd, 0x31, PowerWakeCID, 0x00, 0x02);   
 		// 2-1. wait command ok.
@@ -1115,11 +1099,6 @@ VOID  RadioOnExec(
         if (pAd->StaCfg.Psm == PWR_ACTIVE)
         {
     		RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, pAd->StaCfg.BBPR3);
-			
-            // Turn clk to 80Mhz.
-            // Disable for stability. If PCIE Link Control is modified for advance power save, re-covery this code segment.
-            RTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, 0xe80);
-            OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_CLKSELECT_40MHZ);
         }
 	}
 	else
@@ -1149,7 +1128,7 @@ VOID RT28xxPciMlmeRadioOn(
     	RTMPRingCleanUp(pAd, QID_AC_VO);
     	RTMPRingCleanUp(pAd, QID_HCCA);
     	RTMPRingCleanUp(pAd, QID_MGMT);
-    	RTMPRingCleanUp(pAd, QID_RX);
+    	RTMPRingCleanUp(pAd, QID_RX);		
 
     	// Enable Tx/Rx
     	RTMPEnableRxTx(pAd);
diff --git a/rt2860-1.7.0.0/common/cmm_info.c b/rt2860-source-1.8.0.0/common/cmm_info.c
similarity index 98%
copy from rt2860-1.7.0.0/common/cmm_info.c
copy to rt2860-source-1.8.0.0/common/cmm_info.c
index 3a70151..9e712aa 100644
--- a/rt2860-1.7.0.0/common/cmm_info.c
+++ b/rt2860-source-1.8.0.0/common/cmm_info.c
@@ -63,6 +63,7 @@ INT	Show_FragThreshold_Proc(
 	IN	PRTMP_ADAPTER	pAd, 
 	OUT	PUCHAR			pBuf);
 
+#ifdef DOT11_N_SUPPORT
 INT	Show_HtBw_Proc(
 	IN	PRTMP_ADAPTER	pAd, 
 	OUT	PUCHAR			pBuf);
@@ -102,6 +103,7 @@ INT	Show_HtAmsdu_Proc(
 INT	Show_HtAutoBa_Proc(
 	IN	PRTMP_ADAPTER	pAd, 
 	OUT	PUCHAR			pBuf);
+#endif // DOT11_N_SUPPORT //
 
 INT	Show_CountryRegion_Proc(
 	IN	PRTMP_ADAPTER	pAd, 
@@ -182,6 +184,7 @@ static struct {
 	{"BGProtection",			Show_BGProtection_Proc},
 	{"RTSThreshold",			Show_RTSThreshold_Proc},       
 	{"FragThreshold",			Show_FragThreshold_Proc},      
+#ifdef DOT11_N_SUPPORT
 	{"HtBw",					Show_HtBw_Proc},
 	{"HtMcs",					Show_HtMcs_Proc},
 	{"HtGi",					Show_HtGi_Proc},
@@ -192,6 +195,7 @@ static struct {
 	{"HtRdg",		        	Show_HtRdg_Proc},
 	{"HtAmsdu",		        	Show_HtAmsdu_Proc},
 	{"HtAutoBa",		        Show_HtAutoBa_Proc},
+#endif // DOT11_N_SUPPORT //
 	{"CountryRegion",			Show_CountryRegion_Proc},
 	{"CountryRegionABand",		Show_CountryRegionABand_Proc},
 	{"CountryCode",				Show_CountryCode_Proc},
@@ -355,9 +359,16 @@ INT	Set_WirelessMode_Proc(
 #ifdef CONFIG_STA_SUPPORT
 	IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
 	{
-		if (WirelessMode <= PHY_11N_5G)
+		INT MaxPhyMode = PHY_11G;
+		
+#ifdef DOT11_N_SUPPORT
+		MaxPhyMode = PHY_11N_5G;
+#endif // DOT11_N_SUPPORT //
+
+		if (WirelessMode <= MaxPhyMode)
 		{
 			RTMPSetPhyMode(pAd, WirelessMode);
+#ifdef DOT11_N_SUPPORT
 			if (WirelessMode >= PHY_11ABGN_MIXED)
 			{
 				pAd->CommonCfg.BACapability.field.AutoBA = TRUE;
@@ -368,17 +379,10 @@ INT	Set_WirelessMode_Proc(
 				pAd->CommonCfg.BACapability.field.AutoBA = FALSE;
 				pAd->CommonCfg.REGBACapability.field.AutoBA = FALSE;
 			}
-
+#endif // DOT11_N_SUPPORT //
 			// Set AdhocMode rates
 			if (pAd->StaCfg.BssType == BSS_ADHOC)
 			{
-				if (WirelessMode == PHY_11B)
-					pAd->StaCfg.AdhocMode = 0;
-				else if ((WirelessMode == PHY_11BG_MIXED) || (WirelessMode == PHY_11ABG_MIXED))
-					pAd->StaCfg.AdhocMode = 1;
-				else if ((WirelessMode == PHY_11A) || (WirelessMode == PHY_11G))
-					pAd->StaCfg.AdhocMode = 2;
-
 				MlmeUpdateTxRates(pAd, FALSE, 0);
 				MakeIbssBeacon(pAd);           // re-build BEACON frame
 				AsicEnableIbssSync(pAd);       // copy to on-chip memory
@@ -394,7 +398,9 @@ INT	Set_WirelessMode_Proc(
 	// it is needed to set SSID to take effect
 	if (success == TRUE)
 	{
+#ifdef DOT11_N_SUPPORT
 		SetCommonHT(pAd);
+#endif // DOT11_N_SUPPORT //
 		DBGPRINT(RT_DEBUG_TRACE, ("Set_WirelessMode_Proc::(=%ld)\n", WirelessMode));
 	}
 	else
@@ -432,6 +438,7 @@ INT	Set_Channel_Proc(
 
 			if (MONITOR_ON(pAd))
 			{
+#ifdef DOT11_N_SUPPORT
 				N_ChannelCheck(pAd);
 				if (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED &&
 					pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40)
@@ -443,6 +450,7 @@ INT	Set_Channel_Proc(
 								pAd->CommonCfg.Channel, pAd->CommonCfg.CentralChannel));
 				}
 				else
+#endif // DOT11_N_SUPPORT //
 				{
 					AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);
 					AsicLockChannel(pAd, pAd->CommonCfg.Channel);
@@ -776,7 +784,8 @@ INT	Set_IEEE80211H_Proc(
 
 	return TRUE;
 }
- 
+
+
 #ifdef DBG
 /* 
     ==========================================================================
@@ -857,7 +866,7 @@ INT	Show_DescInfo_Proc(
 INT	Set_ResetStatCounter_Proc(
 	IN	PRTMP_ADAPTER	pAd, 
 	IN	PUCHAR			arg)
-{   
+{
 	DBGPRINT(RT_DEBUG_TRACE, ("==>Set_ResetStatCounter_Proc\n"));
 
 	// add the most up-to-date h/w raw counters into software counters
@@ -866,7 +875,7 @@ INT	Set_ResetStatCounter_Proc(
 	NdisZeroMemory(&pAd->WlanCounters, sizeof(COUNTER_802_11));
 	NdisZeroMemory(&pAd->Counters8023, sizeof(COUNTER_802_3));
 	NdisZeroMemory(&pAd->RalinkCounters, sizeof(COUNTER_RALINK));
- 
+
 	return TRUE;
 }
 
@@ -1244,12 +1253,14 @@ VOID	RTMPSetPhyMode(
 			break;
 
 		case PHY_11G:
-		case PHY_11N_2_4G:
 		case PHY_11BG_MIXED:
 		case PHY_11ABG_MIXED:
+#ifdef DOT11_N_SUPPORT
+		case PHY_11N_2_4G:
 		case PHY_11ABGN_MIXED:
 		case PHY_11BGN_MIXED:
 		case PHY_11GN_MIXED:
+#endif // DOT11_N_SUPPORT //
 			pAd->CommonCfg.SupRate[0]  = 0x82;	  // 1 mbps, in units of 0.5 Mbps, basic rate
 			pAd->CommonCfg.SupRate[1]  = 0x84;	  // 2 mbps, in units of 0.5 Mbps, basic rate
 			pAd->CommonCfg.SupRate[2]  = 0x8B;	  // 5.5 mbps, in units of 0.5 Mbps, basic rate
@@ -1279,9 +1290,11 @@ VOID	RTMPSetPhyMode(
 			break;
 
 		case PHY_11A:
+#ifdef DOT11_N_SUPPORT
 		case PHY_11AN_MIXED:
 		case PHY_11AGN_MIXED:
 		case PHY_11N_5G:
+#endif // DOT11_N_SUPPORT //
 			pAd->CommonCfg.SupRate[0]  = 0x8C;	  // 6 mbps, in units of 0.5 Mbps, basic rate
 			pAd->CommonCfg.SupRate[1]  = 0x12;	  // 9 mbps, in units of 0.5 Mbps
 			pAd->CommonCfg.SupRate[2]  = 0x98;	  // 12 mbps, in units of 0.5 Mbps, basic rate
@@ -1307,29 +1320,12 @@ VOID	RTMPSetPhyMode(
 			break;
 	}
 
-#ifdef CONFIG_STA_SUPPORT
-	IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
-	{
-		UCHAR	DesiredMCS = (UCHAR) pAd->StaCfg.DesiredTransmitSetting.field.MCS;
-
-		pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel;
-        if ((DesiredMCS != MCS_AUTO) &&
-			(pAd->StaCfg.BssType == BSS_ADHOC))
-		{
-			if (pAd->StaCfg.AdhocMode == ADHOC_11B)
-                RTMPSetDesiredRates(pAd, (LONG) (RateIdToMbps[DesiredMCS] * 1000000));
-			else
-                RTMPSetDesiredRates(pAd, (LONG) (RateIdToMbps[DesiredMCS+4] * 1000000));
-		}
-		MlmeUpdateTxRates(pAd, FALSE, 0);
-	}
-#endif // CONFIG_STA_SUPPORT //
 
 	pAd->CommonCfg.BandState = UNKNOWN_BAND;	
 }
 
 
-
+#ifdef DOT11_N_SUPPORT
 /*
 	========================================================================
 	Routine Description:
@@ -1457,7 +1453,8 @@ VOID	RTMPSetHT(
 
 		// Turn on BBP 40MHz mode now only as AP . 
 		// Sta can turn on BBP 40MHz after connection with 40MHz AP. Sta only broadcast 40MHz capability before connection.
-		if ((pAd->OpMode == OPMODE_AP) || INFRA_ON(pAd))
+		if ((pAd->OpMode == OPMODE_AP) || INFRA_ON(pAd) || ADHOC_ON(pAd)
+			)
 		{
 			RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue);
 			BBPValue &= (~0x18);
@@ -1497,6 +1494,7 @@ VOID	RTMPSetHT(
 		pAd->CommonCfg.DesiredHtPhy.RxSTBC = 0;
 	}
 
+
 	if(pHTPhyMode->SHORTGI == GI_400)
 	{
 		pAd->CommonCfg.HtCapability.HtCapInfo.ShortGIfor20 = 1;
@@ -1516,7 +1514,7 @@ VOID	RTMPSetHT(
 	pAd->CommonCfg.HtCapability.ExtHtCapInfo.MCSFeedback = MCSFBK_NONE; //MCSFBK_UNSOLICIT;
 	pAd->CommonCfg.AddHTInfo.ControlChan = pAd->CommonCfg.Channel;
 	// 1, the extension channel above the control channel. 
-		
+	
 	// EDCA parameters used for AP's own transmission
 	if (pAd->CommonCfg.APEdcaParm.bValid == FALSE)
 	{
@@ -1550,6 +1548,7 @@ VOID	RTMPSetHT(
 		RTMPSetIndividualHT(pAd, 0);
 	}
 #endif // CONFIG_STA_SUPPORT //
+
 }
 
 /*
@@ -1573,7 +1572,8 @@ VOID	RTMPSetIndividualHT(
 	UCHAR	DesiredMcs	= MCS_AUTO;
 						
 	do
-	{ 
+	{
+
 #ifdef CONFIG_STA_SUPPORT
 		IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
 		{		
@@ -1712,6 +1712,7 @@ VOID	RTMPUpdateHTIE(
 	
         DBGPRINT(RT_DEBUG_TRACE,("RTMPUpdateHTIE <== \n"));
 }
+#endif // DOT11_N_SUPPORT //
 
 /*
 	========================================================================
@@ -1779,7 +1780,7 @@ VOID	RTMPAddWcidAttributeEntry(
 			WCIDAttri = (CipherAlg<<1) | PAIRWISEKEYTABLE;
 #endif // QOS_DLS_SUPPORT //
 		else
-		WCIDAttri = (CipherAlg<<1) | SHAREDKEYTABLE;
+			WCIDAttri = (CipherAlg<<1) | SHAREDKEYTABLE;
 	}
 #endif // CONFIG_STA_SUPPORT //
 		
@@ -1863,7 +1864,7 @@ CHAR *GetAuthMode(CHAR auth)
     	return "WPA1WPA2";
 	if(auth == Ndis802_11AuthModeWPA1PSKWPA2PSK)
     	return "WPA1PSKWPA2PSK";
-    else
+	
     	return "UNKNOW";
 }		
 
@@ -1983,7 +1984,7 @@ VOID RTMPIoctlGetSiteSurvey(
 			sprintf(msg+strlen(msg),"%-3s", " In");
 
         sprintf(msg+strlen(msg),"\n");
- 	}
+	}
 
 #ifdef CONFIG_STA_SUPPORT
 	pAdapter->StaCfg.bScanReqIsFromWebUI = FALSE;
@@ -2013,7 +2014,9 @@ VOID RTMPIoctlGetMacTable(
 			COPY_MAC_ADDR(MacTab.Entry[MacTab.Num].Addr, &pAd->MacTab.Content[i].Addr);
 			MacTab.Entry[MacTab.Num].Aid = (UCHAR)pAd->MacTab.Content[i].Aid;
 			MacTab.Entry[MacTab.Num].Psm = pAd->MacTab.Content[i].PsMode;
+#ifdef DOT11_N_SUPPORT
 			MacTab.Entry[MacTab.Num].MimoPs = pAd->MacTab.Content[i].MmpsMode;
+#endif // DOT11_N_SUPPORT //
 
 			// Fill in RSSI per entry
 			MacTab.Entry[MacTab.Num].AvgRssi0 = pAd->MacTab.Content[i].RssiSample.AvgRssi0;
@@ -2075,6 +2078,7 @@ VOID RTMPIoctlGetMacTable(
 }
 #endif // UCOS //
 
+#ifdef DOT11_N_SUPPORT
 INT	Set_BASetup_Proc(
 	IN	PRTMP_ADAPTER	pAd, 
 	IN	PUCHAR			arg)
@@ -2162,7 +2166,7 @@ INT	Set_BAOriTearDown_Proc(
 	char *token, sepValue[] = ":", DASH = '-';
 	INT i;
     MAC_TABLE_ENTRY *pEntry;
-	
+
 /*
 	The BAOriTearDown inupt string format should be xx:xx:xx:xx:xx:xx-d, 
 		=>The six 2 digit hex-decimal number previous are the Mac address, 
@@ -2175,7 +2179,7 @@ INT	Set_BAOriTearDown_Proc(
 	if ((token != NULL) && (strlen(token)>1))
 	{
 		tid = simple_strtol((token+1), 0, 10);
-		if (tid > 15)
+		if (tid > NUM_OF_TID)
 			return FALSE;
 		
 		*token = '\0';
@@ -2227,7 +2231,7 @@ INT	Set_BARecTearDown_Proc(
 	if ((token != NULL) && (strlen(token)>1))
 	{
 		tid = simple_strtol((token+1), 0, 10);
-		if (tid > 15)
+		if (tid > NUM_OF_TID)
 			return FALSE;
 		
 		*token = '\0';
@@ -2437,7 +2441,7 @@ INT	Set_HtHtc_Proc(
 	if (Value == 0)
 		pAd->HTCEnable = FALSE;
 	else if ( Value ==1 )
-        pAd->HTCEnable = TRUE;
+        	pAd->HTCEnable = TRUE;
 	else 
 		return FALSE; //Invalid argument 	
 	
@@ -2497,8 +2501,6 @@ INT	Set_HtBaWinSize_Proc(
 	
 	Value = simple_strtol(arg, 0, 10);
 
-	// for intel IOT 
-	Value = 64;
 
 	if (Value >=1 && Value <= 64)
 	{
@@ -2531,7 +2533,7 @@ INT	Set_HtRdg_Proc(
 	else if ( Value ==1 )
 	{
 		pAd->HTCEnable = TRUE;
-        pAd->CommonCfg.bRdg = TRUE;
+        	pAd->CommonCfg.bRdg = TRUE;
 	}
 	else 
 		return FALSE; //Invalid argument
@@ -2764,11 +2766,10 @@ INT	Set_HtMimoPs_Proc(
 
 	return TRUE;
 }
+#endif // DOT11_N_SUPPORT //
 
 
-
-//#endif // UCOS //
-
+#ifdef DOT11_N_SUPPORT
 INT	SetCommonHT(
 	IN	PRTMP_ADAPTER	pAd)
 {
@@ -2787,9 +2788,10 @@ INT	SetCommonHT(
 	SetHT.SHORTGI = (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.ShortGI;		
 
 	RTMPSetHT(pAd, &SetHT);
-	
+
 	return TRUE;
 }
+#endif // DOT11_N_SUPPORT //
 
 INT	Set_FixedTxMode_Proc(
 	IN	PRTMP_ADAPTER	pAd, 
@@ -2847,7 +2849,6 @@ INT	Set_OpMode_Proc(
 #endif // CONFIG_APSTA_MIXED_SUPPORT //
 
 
-
 /////////////////////////////////////////////////////////////////////////
 PCHAR   RTMPGetRalinkAuthModeStr(
     IN  NDIS_802_11_AUTHENTICATION_MODE authMode)
@@ -2871,6 +2872,8 @@ PCHAR   RTMPGetRalinkAuthModeStr(
 			return "WPAPSKWPA2PSK";
         case Ndis802_11AuthModeWPA1WPA2:
 			return "WPA1WPA2";
+		case Ndis802_11AuthModeWPANone:
+			return "WPANONE";
 	}
 }
 
@@ -2927,7 +2930,7 @@ INT	Show_SSID_Proc(
 
 #ifdef CONFIG_STA_SUPPORT
 	IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
-		sprintf(pBuf, "\t%s/G", pAd->CommonCfg.Ssid);
+		sprintf(pBuf, "\t%s", pAd->CommonCfg.Ssid);
 #endif // CONFIG_STA_SUPPORT //
 	return 0;
 }
@@ -2953,6 +2956,7 @@ INT	Show_WirelessMode_Proc(
 		case PHY_11G:
 			sprintf(pBuf, "\t11G");
 			break;
+#ifdef DOT11_N_SUPPORT
 		case PHY_11ABGN_MIXED:
 			sprintf(pBuf, "\t11A/B/G/N");
 			break;
@@ -2974,6 +2978,7 @@ INT	Show_WirelessMode_Proc(
 		case PHY_11N_5G:
 			sprintf(pBuf, "\t11N only with 5G");
 			break;
+#endif // DOT11_N_SUPPORT //
 		default:
 			sprintf(pBuf, "\tUnknow Value(%d)", pAd->CommonCfg.PhyMode);
 			break;
@@ -3067,6 +3072,7 @@ INT	Show_FragThreshold_Proc(
 	return 0;
 }
 
+#ifdef DOT11_N_SUPPORT
 INT	Show_HtBw_Proc(
 	IN	PRTMP_ADAPTER	pAd, 
 	OUT	PUCHAR			pBuf)
@@ -3151,6 +3157,7 @@ INT	Show_HtExtcha_Proc(
 	return 0;
 }
 
+
 INT	Show_HtMpduDensity_Proc(
 	IN	PRTMP_ADAPTER	pAd, 
 	OUT	PUCHAR			pBuf)
@@ -3190,6 +3197,7 @@ INT	Show_HtAutoBa_Proc(
 	sprintf(pBuf, "\t%s", pAd->CommonCfg.BACapability.field.AutoBA ? "TRUE":"FALSE");
 	return 0;
 }
+#endif // DOT11_N_SUPPORT //
 
 INT	Show_CountryRegion_Proc(
 	IN	PRTMP_ADAPTER	pAd, 
@@ -3279,7 +3287,7 @@ INT	Show_AuthMode_Proc(
 	IN	PRTMP_ADAPTER	pAd, 
 	OUT	PUCHAR			pBuf)
 {
-	NDIS_802_11_AUTHENTICATION_MODE	AuthMode; 
+	NDIS_802_11_AUTHENTICATION_MODE	AuthMode = Ndis802_11AuthModeOpen; 
 
 #ifdef CONFIG_STA_SUPPORT
 	IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
@@ -3287,7 +3295,7 @@ INT	Show_AuthMode_Proc(
 #endif // CONFIG_STA_SUPPORT //
 
 	if ((AuthMode >= Ndis802_11AuthModeOpen) && 
-		(AuthMode < Ndis802_11AuthModeMax))
+		(AuthMode <= Ndis802_11AuthModeWPA1PSKWPA2PSK))
 		sprintf(pBuf, "\t%s", RTMPGetRalinkAuthModeStr(AuthMode));
 	else
 		sprintf(pBuf, "\tUnknow Value(%d)", AuthMode);
@@ -3299,7 +3307,7 @@ INT	Show_EncrypType_Proc(
 	IN	PRTMP_ADAPTER	pAd, 
 	OUT	PUCHAR			pBuf)
 {
-	NDIS_802_11_WEP_STATUS	WepStatus;
+	NDIS_802_11_WEP_STATUS	WepStatus = Ndis802_11WEPDisabled;
 
 #ifdef CONFIG_STA_SUPPORT
 	IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
diff --git a/rt2860-1.7.0.0/common/cmm_sanity.c b/rt2860-source-1.8.0.0/common/cmm_sanity.c
similarity index 98%
copy from rt2860-1.7.0.0/common/cmm_sanity.c
copy to rt2860-source-1.8.0.0/common/cmm_sanity.c
index c0cff2c..1c52263 100644
--- a/rt2860-1.7.0.0/common/cmm_sanity.c
+++ b/rt2860-source-1.8.0.0/common/cmm_sanity.c
@@ -80,7 +80,7 @@ BOOLEAN MlmeAddBAReqSanity(
         DBGPRINT(RT_DEBUG_TRACE, ("MlmeAddBAReqSanity fail - The peer Mac is not associated yet.\n"));
         return FALSE;
     }	
- 
+
     if ((pInfo->pAddr[0]&0x01) == 0x01)
     {
         DBGPRINT(RT_DEBUG_TRACE, ("MlmeAddBAReqSanity fail - broadcast address not support BA\n"));
@@ -497,7 +497,7 @@ BOOLEAN PeerBeaconAndProbeRspSanity(
 					{
 						if (ChannelSanity(pAd, *pChannel) == 0)
 						{
-							DBGPRINT(RT_DEBUG_INFO, ("PeerBeaconAndProbeRspSanity - wrong IE_DS_PARM (ch=%d)\n",*pChannel));
+							
 							return FALSE;
 						}
 					}
@@ -569,6 +569,7 @@ BOOLEAN PeerBeaconAndProbeRspSanity(
         				*pRalinkIe = 0xf0000000; // Set to non-zero value (can't set bit0-2) to represent this is Ralink Chip. So at linkup, we will set ralinkchip flag.
                 }
 #ifdef CONFIG_STA_SUPPORT
+#ifdef DOT11_N_SUPPORT
 		// This HT IE is before IEEE draft set HT IE value.2006-09-28 by Jan.
                 
                 // Other vendors had production before IE_HT_CAP value is assigned. To backward support those old-firmware AP,
@@ -587,6 +588,7 @@ BOOLEAN PeerBeaconAndProbeRspSanity(
                         *AddHtInfoLen = SIZE_ADD_HT_INFO_IE;
                     }
                 }
+#endif // DOT11_N_SUPPORT //
 #endif // CONFIG_STA_SUPPORT //
                 else if (NdisEqualMemory(pEid->Octet, WPA_OUI, 4))
                 {
@@ -653,8 +655,7 @@ BOOLEAN PeerBeaconAndProbeRspSanity(
                     pEdcaParm->Cwmin[QID_AC_VO] = CW_MIN_IN_BITS-2;
                     pEdcaParm->Cwmax[QID_AC_VO] = CW_MAX_IN_BITS-1;
                     pEdcaParm->Txop[QID_AC_VO]  = 48;   // AC_VO: 48*32us ~= 1.5ms
-                } 
-                DBGPRINT(RT_DEBUG_INFO, ("PeerBeaconAndProbeRspSanity - Receive IE_WPA\n"));
+                }
                 break;
 
             case IE_EXT_SUPP_RATES:
@@ -710,7 +711,6 @@ BOOLEAN PeerBeaconAndProbeRspSanity(
                     NdisMoveMemory(Ptr + *LengthVIE, &pEid->Eid, pEid->Len + 2);
                     *LengthVIE += (pEid->Len + 2);
                 }
-                DBGPRINT(RT_DEBUG_INFO, ("IE_RSN length = %d\n", pEid->Len));
                 break;
 #ifdef CONFIG_STA_SUPPORT
 #ifdef EXT_BUILD_CHANNEL_LIST
@@ -721,9 +721,8 @@ BOOLEAN PeerBeaconAndProbeRspSanity(
 				break;
 #endif // EXT_BUILD_CHANNEL_LIST //
 #endif // CONFIG_STA_SUPPORT //
- 
+                
             default:
-                DBGPRINT(RT_DEBUG_INFO, ("PeerBeaconAndProbeRspSanity - unrecognized EID = %d\n", pEid->Eid));
                 break;
         }
         
@@ -1175,7 +1174,6 @@ BOOLEAN PeerWpaMessageSanity(
     IN 	PEAPOL_PACKET 		pMsg, 
     IN 	ULONG 				MsgLen, 
     IN 	UCHAR				MsgType,
-    IN	PUCHAR				pMIC,
     IN 	MAC_TABLE_ENTRY  	*pEntry)
 {
 	UCHAR			mic[LEN_KEY_DESC_MIC], digest[80], KEYDATA[MAX_LEN_OF_RSNIE];
@@ -1252,6 +1250,10 @@ BOOLEAN PeerWpaMessageSanity(
 	// 2. Verify MIC except Pairwise Msg1
 	if (MsgType != EAPOL_PAIR_MSG_1)
 	{
+		UCHAR			rcvd_mic[LEN_KEY_DESC_MIC];
+
+		// Record the received MIC for check later
+		NdisMoveMemory(rcvd_mic, pMsg->KeyDesc.KeyMic, LEN_KEY_DESC_MIC);
 		NdisZeroMemory(pMsg->KeyDesc.KeyMic, LEN_KEY_DESC_MIC);
 							
         if (pEntry->WepStatus == Ndis802_11Encryption2Enabled)	// TKIP
@@ -1264,7 +1266,7 @@ BOOLEAN PeerWpaMessageSanity(
             NdisMoveMemory(mic, digest, LEN_KEY_DESC_MIC);
         }
 	
-        if (!NdisEqualMemory(pMIC, mic, LEN_KEY_DESC_MIC))
+        if (!NdisEqualMemory(rcvd_mic, mic, LEN_KEY_DESC_MIC))
         {
 			// send wireless event - for MIC different
 			if (pAd->CommonCfg.bWirelessEvent)
@@ -1279,7 +1281,7 @@ BOOLEAN PeerWpaMessageSanity(
 				DBGPRINT(RT_DEBUG_ERROR, ("MIC Different in group msg %d of 2-way handshake!\n", (MsgType - EAPOL_PAIR_MSG_4)));
 			}
 	
-			hex_dump("Received MIC", pMIC, LEN_KEY_DESC_MIC);
+			hex_dump("Received MIC", rcvd_mic, LEN_KEY_DESC_MIC);
 			hex_dump("Desired  MIC", mic, LEN_KEY_DESC_MIC);
 
 			return FALSE;
@@ -1325,7 +1327,7 @@ BOOLEAN PeerWpaMessageSanity(
 		}
 		else
 		{
-			DBGPRINT(RT_DEBUG_INFO, ("The Key Data Length should be zero !!!\n"));
+			
 			return TRUE;
 		}
 
diff --git a/rt2860-1.7.0.0/common/cmm_sync.c b/rt2860-source-1.8.0.0/common/cmm_sync.c
similarity index 95%
copy from rt2860-1.7.0.0/common/cmm_sync.c
copy to rt2860-source-1.8.0.0/common/cmm_sync.c
index 44be0f8..8581439 100644
--- a/rt2860-1.7.0.0/common/cmm_sync.c
+++ b/rt2860-source-1.8.0.0/common/cmm_sync.c
@@ -94,7 +94,11 @@ VOID BuildChannelList(
 	NdisZeroMemory(pAd->ChannelList, MAX_NUM_OF_CHANNELS * sizeof(CHANNEL_TX_POWER));
 
 	// if not 11a-only mode, channel list starts from 2.4Ghz band
-	if ((pAd->CommonCfg.PhyMode != PHY_11A) && (pAd->CommonCfg.PhyMode != PHY_11AN_MIXED) && (pAd->CommonCfg.PhyMode != PHY_11N_5G))
+	if ((pAd->CommonCfg.PhyMode != PHY_11A) 
+#ifdef DOT11_N_SUPPORT
+		&& (pAd->CommonCfg.PhyMode != PHY_11AN_MIXED) && (pAd->CommonCfg.PhyMode != PHY_11N_5G)
+#endif // DOT11_N_SUPPORT //
+	)
 	{
 		switch (pAd->CommonCfg.CountryRegion  & 0x7f)
 		{
@@ -141,8 +145,12 @@ VOID BuildChannelList(
 			pAd->ChannelList[i].MaxTxPwr = 20;
 	}
 
-	if ((pAd->CommonCfg.PhyMode == PHY_11A) || (pAd->CommonCfg.PhyMode == PHY_11ABG_MIXED) || (pAd->CommonCfg.PhyMode == PHY_11ABGN_MIXED) ||
-		(pAd->CommonCfg.PhyMode == PHY_11AN_MIXED) || (pAd->CommonCfg.PhyMode == PHY_11AGN_MIXED) || (pAd->CommonCfg.PhyMode == PHY_11N_5G))
+	if ((pAd->CommonCfg.PhyMode == PHY_11A) || (pAd->CommonCfg.PhyMode == PHY_11ABG_MIXED) 
+#ifdef DOT11_N_SUPPORT
+		|| (pAd->CommonCfg.PhyMode == PHY_11ABGN_MIXED) || (pAd->CommonCfg.PhyMode == PHY_11AN_MIXED) 
+		|| (pAd->CommonCfg.PhyMode == PHY_11AGN_MIXED) || (pAd->CommonCfg.PhyMode == PHY_11N_5G)
+#endif // DOT11_N_SUPPORT //
+	)
 	{
 		switch (pAd->CommonCfg.CountryRegionForABand & 0x7f)
 		{
@@ -379,7 +387,7 @@ VOID ScanNextChannel(
 	USHORT          Status;
 	PHEADER_802_11  pHdr80211;
 #endif // CONFIG_STA_SUPPORT //
-	UCHAR		HtLen;
+	UINT			ScanTimeIn5gChannel = SHORT_CHANNEL_TIME;
 
 #ifdef CONFIG_STA_SUPPORT
 	IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
@@ -400,7 +408,7 @@ VOID ScanNextChannel(
 		if ((pAd->CommonCfg.BBPCurrentBW == BW_40)
 #ifdef CONFIG_STA_SUPPORT
 			&& (INFRA_ON(pAd)
- 				|| (pAd->OpMode == OPMODE_AP))
+				|| (pAd->OpMode == OPMODE_AP))
 #endif // CONFIG_STA_SUPPORT //
 			)
 		{
@@ -445,14 +453,15 @@ VOID ScanNextChannel(
 					RTMPusecDelay(5000);
 				}
 			}
- 
+
 			pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;
 			Status = MLME_SUCCESS;
 			MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_SCAN_CONF, 2, &Status);
 		}
 #endif // CONFIG_STA_SUPPORT //
 
- 		RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS);
+
+		RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS);
 	} 
 	else 
 	{
@@ -478,7 +487,10 @@ VOID ScanNextChannel(
 			if (pAd->MlmeAux.Channel > 14)
 			{
 				if ((pAd->CommonCfg.bIEEE80211H == 1) && RadarChannelCheck(pAd, pAd->MlmeAux.Channel))
+				{
 					ScanType = SCAN_PASSIVE;
+					ScanTimeIn5gChannel = MIN_CHANNEL_TIME;
+				}
 			}
 
 #ifdef CARRIER_DETECTION_SUPPORT // Roger sync Carrier
@@ -486,6 +498,7 @@ VOID ScanNextChannel(
 			if (pAd->CommonCfg.CarrierDetect.Enable == TRUE)
 			{
 				ScanType = SCAN_PASSIVE;
+				ScanTimeIn5gChannel = MIN_CHANNEL_TIME;
 			}
 #endif // CARRIER_DETECTION_SUPPORT // 
 		}
@@ -516,10 +529,14 @@ VOID ScanNextChannel(
 #endif // CONFIG_STA_SUPPORT //
 		else // must be SCAN_PASSIVE or SCAN_ACTIVE
 		{
-			if ((pAd->CommonCfg.PhyMode == PHY_11ABG_MIXED) || (pAd->CommonCfg.PhyMode == PHY_11ABGN_MIXED) || (pAd->CommonCfg.PhyMode == PHY_11AGN_MIXED))
+			if ((pAd->CommonCfg.PhyMode == PHY_11ABG_MIXED) 
+#ifdef DOT11_N_SUPPORT
+				|| (pAd->CommonCfg.PhyMode == PHY_11ABGN_MIXED) || (pAd->CommonCfg.PhyMode == PHY_11AGN_MIXED)
+#endif // DOT11_N_SUPPORT //
+			)
 			{
 				if (pAd->MlmeAux.Channel > 14)
-					RTMPSetTimer(&pAd->MlmeAux.ScanTimer, SHORT_CHANNEL_TIME);
+					RTMPSetTimer(&pAd->MlmeAux.ScanTimer, ScanTimeIn5gChannel);
 				else	
 				RTMPSetTimer(&pAd->MlmeAux.ScanTimer, MIN_CHANNEL_TIME);
 			}
@@ -547,7 +564,8 @@ VOID ScanNextChannel(
 			}
 
 			// There is no need to send broadcast probe request if active scan is in effect.
-			if ((ScanType == SCAN_ACTIVE) || (ScanType == FAST_SCAN_ACTIVE) )
+			if ((ScanType == SCAN_ACTIVE) || (ScanType == FAST_SCAN_ACTIVE)
+				)
 				SsidLen = pAd->MlmeAux.SsidLen;
 			else
 				SsidLen = 0;
@@ -573,9 +591,12 @@ VOID ScanNextChannel(
 								  END_OF_ARGS);
 				FrameLen += Tmp;
 			}
+
+#ifdef DOT11_N_SUPPORT
 			if (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)
 			{
-				ULONG Tmp;
+				ULONG	Tmp;
+				UCHAR	HtLen;
 				UCHAR	BROADCOM[4] = {0x0, 0x90, 0x4c, 0x33};
 #ifdef RT_BIG_ENDIAN
 				HT_CAPABILITY_IE HtCapabilityTmp;
@@ -641,7 +662,9 @@ VOID ScanNextChannel(
 				}
 #endif // DOT11N_DRAFT3 //
 			}
- 
+#endif // DOT11_N_SUPPORT //
+
+
 			MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);
 			MlmeFreeMemory(pAd, pOutBuffer);
 		}
diff --git a/rt2860-1.7.0.0/common/cmm_wpa.c b/rt2860-source-1.8.0.0/common/cmm_wpa.c
similarity index 94%
copy from rt2860-1.7.0.0/common/cmm_wpa.c
copy to rt2860-source-1.8.0.0/common/cmm_wpa.c
index 9218b4d..35bee09 100644
--- a/rt2860-1.7.0.0/common/cmm_wpa.c
+++ b/rt2860-source-1.8.0.0/common/cmm_wpa.c
@@ -303,9 +303,12 @@ static VOID RTMPInsertRsnIeCipher(
 	IN	UCHAR			ElementID,	
 	IN	UINT			WepStatus,
 	IN	BOOLEAN			bMixCipher,
+	IN	UCHAR			FlexibleCipher,
 	OUT	PUCHAR			pRsnIe,
 	OUT	UCHAR			*rsn_len)
 {		
+	UCHAR	PairwiseCnt;
+
 	*rsn_len = 0;
 
 	// decide WPA2 or WPA1	
@@ -340,10 +343,27 @@ static VOID RTMPInsertRsnIeCipher(
 			// TKIP-AES mix mode
             case Ndis802_11Encryption4Enabled:
                 NdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA2_TKIP, 4);
-                pRsnie_cipher->ucount = 2;
-                NdisMoveMemory(pRsnie_cipher->ucast[0].oui, OUI_WPA2_TKIP, 4);
-                NdisMoveMemory(pRsnie_cipher->ucast[0].oui + 4, OUI_WPA2_CCMP, 4);
-                *rsn_len = sizeof(RSNIE2) + 4;
+
+				PairwiseCnt = 1;
+				// Insert WPA2 TKIP as the first pairwise cipher 
+				if (MIX_CIPHER_WPA2_TKIP_ON(FlexibleCipher))
+				{
+                	NdisMoveMemory(pRsnie_cipher->ucast[0].oui, OUI_WPA2_TKIP, 4);
+					// Insert WPA2 AES as the secondary pairwise cipher
+					if (MIX_CIPHER_WPA2_AES_ON(FlexibleCipher))
+					{
+                		NdisMoveMemory(pRsnie_cipher->ucast[0].oui + 4, OUI_WPA2_CCMP, 4);
+						PairwiseCnt = 2;
+					}	
+				}
+				else
+				{
+					// Insert WPA2 AES as the first pairwise cipher 
+					NdisMoveMemory(pRsnie_cipher->ucast[0].oui, OUI_WPA2_CCMP, 4);	
+				}
+							
+                pRsnie_cipher->ucount = PairwiseCnt;				
+                *rsn_len = sizeof(RSNIE2) + (4 * (PairwiseCnt - 1));
                 break;			
         }   
 
@@ -383,10 +403,27 @@ static VOID RTMPInsertRsnIeCipher(
 			// TKIP-AES mix mode
             case Ndis802_11Encryption4Enabled:
                 NdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA_TKIP, 4);
-                pRsnie_cipher->ucount = 2;
-                NdisMoveMemory(pRsnie_cipher->ucast[0].oui, OUI_WPA_TKIP, 4);
-                NdisMoveMemory(pRsnie_cipher->ucast[0].oui + 4, OUI_WPA_CCMP, 4);
-                *rsn_len = sizeof(RSNIE) + 4;
+
+				PairwiseCnt = 1;
+				// Insert WPA TKIP as the first pairwise cipher 
+				if (MIX_CIPHER_WPA_TKIP_ON(FlexibleCipher))
+				{
+                	NdisMoveMemory(pRsnie_cipher->ucast[0].oui, OUI_WPA_TKIP, 4);
+					// Insert WPA AES as the secondary pairwise cipher
+					if (MIX_CIPHER_WPA_AES_ON(FlexibleCipher))
+					{
+                		NdisMoveMemory(pRsnie_cipher->ucast[0].oui + 4, OUI_WPA_CCMP, 4);
+						PairwiseCnt = 2;
+					}	
+				}
+				else
+				{
+					// Insert WPA AES as the first pairwise cipher 
+					NdisMoveMemory(pRsnie_cipher->ucast[0].oui, OUI_WPA_CCMP, 4);	
+				}
+						
+                pRsnie_cipher->ucount = PairwiseCnt;				
+                *rsn_len = sizeof(RSNIE) + (4 * (PairwiseCnt - 1));				
                 break;					
         }
 
@@ -436,13 +473,13 @@ static VOID RTMPInsertRsnIeAKM(
             case Ndis802_11AuthModeWPA2:
             case Ndis802_11AuthModeWPA1WPA2:
                 pRsnie_auth->acount = 1;
-               	NdisMoveMemory(pRsnie_auth->auth[0].oui, OUI_WPA2_8021X_AKM, 4);
+                	NdisMoveMemory(pRsnie_auth->auth[0].oui, OUI_WPA2_8021X_AKM, 4);
                 break;
 
             case Ndis802_11AuthModeWPA2PSK:
             case Ndis802_11AuthModeWPA1PSKWPA2PSK:
                 pRsnie_auth->acount = 1;
-               	NdisMoveMemory(pRsnie_auth->auth[0].oui, OUI_WPA2_PSK_AKM, 4);
+                	NdisMoveMemory(pRsnie_auth->auth[0].oui, OUI_WPA2_PSK_AKM, 4);
                 break;
         }
 	}
@@ -546,6 +583,7 @@ VOID RTMPMakeRSNIE(
 	UCHAR		PrimaryRsnie;			
 	BOOLEAN		bMixCipher = FALSE;	// indicate the pairwise and group cipher are different
 	UCHAR		p_offset;		
+	WPA_MIX_PAIR_CIPHER		FlexibleCipher = MIX_CIPHER_NOTUSE;	// it provide the more flexible cipher combination in WPA-WPA2 and TKIPAES mode
 		
 	rsnielen_cur_p = NULL;
 	rsnielen_ex_cur_p = NULL;
@@ -555,19 +593,22 @@ VOID RTMPMakeRSNIE(
 		IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
 		{
 #ifdef WPA_SUPPLICANT_SUPPORT
-			if (pAd->StaCfg.WpaSupplicantUP)
+			if (pAd->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_DISABLE)
 			{
 				if (AuthMode < Ndis802_11AuthModeWPA)
 					return;
 			}
 			else
 #endif // WPA_SUPPLICANT_SUPPORT //
+			{
 				// Support WPAPSK or WPA2PSK in STA-Infra mode
 				// Support WPANone in STA-Adhoc mode
 				if ((AuthMode != Ndis802_11AuthModeWPAPSK) && 
 					(AuthMode != Ndis802_11AuthModeWPA2PSK) && 
-					(AuthMode != Ndis802_11AuthModeWPANone))
+					(AuthMode != Ndis802_11AuthModeWPANone)
+					)
 					return;
+			}	
 	
 			DBGPRINT(RT_DEBUG_TRACE,("==> RTMPMakeRSNIE(STA)\n"));
 
@@ -594,15 +635,17 @@ VOID RTMPMakeRSNIE(
 	else
 		PrimaryRsnie = Wpa2Ie;
 
-	// Build the primary RSNIE
-	// 1. insert cipher suite
-	RTMPInsertRsnIeCipher(pAd, PrimaryRsnie, WepStatus, bMixCipher, pRsnIe, &p_offset);
-
-	// 2. insert AKM
-	RTMPInsertRsnIeAKM(pAd, PrimaryRsnie, AuthMode, apidx, pRsnIe, &p_offset);
+	{
+		// Build the primary RSNIE
+		// 1. insert cipher suite
+		RTMPInsertRsnIeCipher(pAd, PrimaryRsnie, WepStatus, bMixCipher, FlexibleCipher, pRsnIe, &p_offset);
+	
+		// 2. insert AKM
+		RTMPInsertRsnIeAKM(pAd, PrimaryRsnie, AuthMode, apidx, pRsnIe, &p_offset);
 
-	// 3. insert capability
-	RTMPInsertRsnIeCap(pAd, PrimaryRsnie, apidx, pRsnIe, &p_offset);
+		// 3. insert capability
+		RTMPInsertRsnIeCap(pAd, PrimaryRsnie, apidx, pRsnIe, &p_offset);
+	}
 
 	// 4. update the RSNIE length
 	*rsnielen_cur_p = p_offset; 
@@ -639,10 +682,10 @@ BOOLEAN RTMPCheckWPAframe(
 	ULONG	Body_len;
 	BOOLEAN Cancelled;
 
+
     if(DataByteCount < (LENGTH_802_1_H + LENGTH_EAPOL_H))
         return FALSE;
 
-    DBGPRINT(RT_DEBUG_INFO, ("RTMPCheckWPAframe ===> \n"));
     
 	// Skip LLC header	
     if (NdisEqualMemory(SNAP_802_1H, pData, 6) ||
@@ -822,15 +865,7 @@ VOID	AES_GTK_KEY_UNWRAP(
 	{
 		plaintext[i] = R[i];
 	}
-
-	DBGPRINT_RAW(RT_DEBUG_INFO, ("plaintext = \n"));
-	for(i = 0; i < (num_blocks *8); i++)
-	{
-		DBGPRINT_RAW(RT_DEBUG_INFO, ("%2x ", plaintext[i]));
-		if(i%16 == 15)
-			DBGPRINT_RAW(RT_DEBUG_INFO, ("\n "));
-	}
-	DBGPRINT_RAW(RT_DEBUG_INFO, ("\n  \n"));	
+	
 
 	os_free_mem(NULL, R);
 }
@@ -910,8 +945,7 @@ BOOLEAN RTMPCheckRSNIE(
 			if ((pEntry->AuthMode == Ndis802_11AuthModeWPA || pEntry->AuthMode == Ndis802_11AuthModeWPAPSK) &&
 				(NdisEqualMemory(pVIE, pEntry->RSN_IE, pEntry->RSNIE_Len)) &&
 				(pEntry->RSNIE_Len == (pEid->Len + 2)))
-			{				
-					DBGPRINT(RT_DEBUG_INFO, ("RTMPCheckRSNIE ==> WPA/WPAPSK RSN IE matched, Length(%d) \n", (pEid->Len + 2)));
+			{
 					result = TRUE;				
 			}		
 			
@@ -923,8 +957,7 @@ BOOLEAN RTMPCheckRSNIE(
 			if ((pEntry->AuthMode == Ndis802_11AuthModeWPA2 || pEntry->AuthMode == Ndis802_11AuthModeWPA2PSK) &&
 				(NdisEqualMemory(pVIE, pEntry->RSN_IE, pEntry->RSNIE_Len)) &&
 				(pEntry->RSNIE_Len == (pEid->Len + 2))/* ToDo-AlbertY for mesh*/)
-			{				
-					DBGPRINT(RT_DEBUG_INFO, ("RTMPCheckRSNIE ==> WPA2/WPA2PSK RSN IE matched, Length(%d) \n", (pEid->Len + 2)));
+			{
 					result = TRUE;				
 			}			
 
@@ -939,7 +972,6 @@ BOOLEAN RTMPCheckRSNIE(
 		len  -= (pEid->Len + 2);
 	}
 	
-	DBGPRINT(RT_DEBUG_INFO, ("RTMPCheckRSNIE ==> skip_offset(%d) \n", *Offset));
 		
 	return result;
 	
@@ -1015,11 +1047,8 @@ BOOLEAN RTMPParseEapolKeyData(
 	{				
 		if (KeyDataLength >= 8)	// KDE format exclude GTK length
     	{
-        	pKDE = (PKDE_ENCAP) pMyKeyData;			
-	        DBGPRINT(RT_DEBUG_INFO, ("pKDE->Type %x \n", pKDE->Type));
-    	    DBGPRINT(RT_DEBUG_INFO, ("pKDE->Len 0x%x \n", pKDE->Len));
-        	DBGPRINT(RT_DEBUG_INFO, ("pKDE->OUI %x %x %x \n", pKDE->OUI[0],pKDE->OUI[1],pKDE->OUI[2]));
-	    	DBGPRINT(RT_DEBUG_INFO, ("pKDE->DataType %x \n", pKDE->DataType));
+        	pKDE = (PKDE_ENCAP) pMyKeyData;
+	        
 			
 			DefaultIdx = pKDE->GTKEncap.Kid;
 
@@ -1515,14 +1544,14 @@ NDIS_STATUS	RTMPSoftDecryptBroadCastData(
 {		
 	PRXWI_STRUC			pRxWI = pRxBlk->pRxWI;	
 
-	DBGPRINT(RT_DEBUG_INFO, ("RTMPSoftDecryptBroadCastData --> \n"));	
+	
 
 	// handle WEP decryption
 	if (GroupCipher == Ndis802_11Encryption1Enabled)
     {    	        	        
 		if (RTMPSoftDecryptWEP(pAd, pRxBlk->pData, pRxWI->MPDUtotalByteCount, pShard_key))
 		{
-			DBGPRINT(RT_DEBUG_INFO, ("RTMPSoftDecryptWEP Complete \n"));	
+			
 			//Minus IV[4] & ICV[4]
 			pRxWI->MPDUtotalByteCount -= 8;  
 		}
@@ -1538,7 +1567,7 @@ NDIS_STATUS	RTMPSoftDecryptBroadCastData(
 	{	
 		if (RTMPSoftDecryptTKIP(pAd, pRxBlk->pData, pRxWI->MPDUtotalByteCount, 0, pShard_key))
 		{
-			DBGPRINT(RT_DEBUG_INFO, ("RTMPSoftDecryptTKIP Complete \n"));							
+			
 			//Minus 8 bytes MIC, 8 bytes IV/EIV, 4 bytes ICV
 			pRxWI->MPDUtotalByteCount -= 20;  
 		}
@@ -1554,7 +1583,7 @@ NDIS_STATUS	RTMPSoftDecryptBroadCastData(
 	{
 		if (RTMPSoftDecryptAES(pAd, pRxBlk->pData, pRxWI->MPDUtotalByteCount , pShard_key))
 		{							
-			DBGPRINT(RT_DEBUG_INFO, ("RTMPSoftDecryptAES Complete \n"));								
+			
 			//8 bytes MIC, 8 bytes IV/EIV (CCMP Header)
 			pRxWI->MPDUtotalByteCount -= 16;  
 		}
diff --git a/rt2860-1.7.0.0/common/dfs.c b/rt2860-source-1.8.0.0/common/dfs.c
similarity index 98%
copy from rt2860-1.7.0.0/common/dfs.c
copy to rt2860-source-1.8.0.0/common/dfs.c
index 5c4e351..f557ee7 100644
--- a/rt2860-1.7.0.0/common/dfs.c
+++ b/rt2860-source-1.8.0.0/common/dfs.c
@@ -164,9 +164,7 @@ VOID RadarDetectionStart(
 	}
 	else
 		CtsProtect = 0x01;
-
-	DBGPRINT(RT_DEBUG_INFO,("RadarDetectionStart %s CTS protection, duration %dms, period=%dms\n",
-		(CTSProtect == 1 ? "with" : "without"), DfsActiveTime, CTSPeriod));
+	
 
 	// send start-RD with CTS protection command to MCU
 	// highbyte [7]		reserve
diff --git a/rt2860-1.7.0.0/common/eeprom.c b/rt2860-source-1.8.0.0/common/eeprom.c
similarity index 100%
copy from rt2860-1.7.0.0/common/eeprom.c
copy to rt2860-source-1.8.0.0/common/eeprom.c
diff --git a/rt2860-1.7.0.0/common/md5.c b/rt2860-source-1.8.0.0/common/md5.c
similarity index 96%
copy from rt2860-1.7.0.0/common/md5.c
copy to rt2860-source-1.8.0.0/common/md5.c
index fe0686a..b93c3de 100644
--- a/rt2860-1.7.0.0/common/md5.c
+++ b/rt2860-source-1.8.0.0/common/md5.c
@@ -138,7 +138,7 @@ void byteReverse(unsigned char *buf, unsigned longs);
 void byteReverse(unsigned char *buf, unsigned longs)
 {
     do {
-        *(ULONG *)buf = SWAP32(*(ULONG *)buf);
+        *(UINT32 *)buf = SWAP32(*(UINT32 *)buf);
         buf += 4;
     } while (--longs);
 }
@@ -195,16 +195,16 @@ VOID MD5Init(MD5_CTX *pCtx)
  *  Note:
  *      Called after MD5Init or MD5Update(itself)   
  */
-VOID MD5Update(MD5_CTX *pCtx, UCHAR *pData, ULONG LenInBytes)
+VOID MD5Update(MD5_CTX *pCtx, UCHAR *pData, UINT32 LenInBytes)
 {
     
-    ULONG TfTimes;
-    ULONG temp;
+    UINT32 TfTimes;
+    UINT32 temp;
 	unsigned int i;
     
     temp = pCtx->LenInBitCount[0];
 
-    pCtx->LenInBitCount[0] = (ULONG) (pCtx->LenInBitCount[0] + (LenInBytes << 3));
+    pCtx->LenInBitCount[0] = (UINT32) (pCtx->LenInBitCount[0] + (LenInBytes << 3));
  
     if (pCtx->LenInBitCount[0] < temp)
         pCtx->LenInBitCount[1]++;   //carry in
@@ -227,7 +227,7 @@ VOID MD5Update(MD5_CTX *pCtx, UCHAR *pData, ULONG LenInBytes)
         
         NdisMoveMemory(pAds, (UCHAR *)pData, 64-temp);               
         byteReverse(pCtx->Input, 16);
-        MD5Transform(pCtx->Buf, (ULONG *)pCtx->Input);
+        MD5Transform(pCtx->Buf, (UINT32 *)pCtx->Input);
 
         pData += 64-temp;
         LenInBytes -= 64-temp; 
@@ -240,7 +240,7 @@ VOID MD5Update(MD5_CTX *pCtx, UCHAR *pData, ULONG LenInBytes)
     {
         NdisMoveMemory(pCtx->Input, (UCHAR *)pData, 64);
         byteReverse(pCtx->Input, 16);
-        MD5Transform(pCtx->Buf, (ULONG *)pCtx->Input);
+        MD5Transform(pCtx->Buf, (UINT32 *)pCtx->Input);
         pData += 64;
         LenInBytes -= 64;
     } // end of for
@@ -296,7 +296,7 @@ VOID MD5Final(UCHAR Digest[16], MD5_CTX *pCtx)
       	}
       	
         byteReverse(pCtx->Input, 16);
-        MD5Transform(pCtx->Buf, (ULONG *)pCtx->Input);
+        MD5Transform(pCtx->Buf, (UINT32 *)pCtx->Input);
     } // end of if
     
     // padding bits with crossing block(64-byte based) boundary
@@ -310,7 +310,7 @@ VOID MD5Final(UCHAR Digest[16], MD5_CTX *pCtx)
         PadLenInBytes -= (64 - Remainder - 1);
         
         byteReverse(pCtx->Input, 16);
-        MD5Transform(pCtx->Buf, (ULONG *)pCtx->Input);
+        MD5Transform(pCtx->Buf, (UINT32 *)pCtx->Input);
         
 
         // the second block ===
@@ -324,11 +324,11 @@ VOID MD5Final(UCHAR Digest[16], MD5_CTX *pCtx)
       	}
 
         byteReverse(pCtx->Input, 16);
-        MD5Transform(pCtx->Buf, (ULONG *)pCtx->Input);
+        MD5Transform(pCtx->Buf, (UINT32 *)pCtx->Input);
     } // end of else
 
 
-    NdisMoveMemory((UCHAR *)Digest, (ULONG *)pCtx->Buf, 16); // output
+    NdisMoveMemory((UCHAR *)Digest, (UINT32 *)pCtx->Buf, 16); // output
     byteReverse((UCHAR *)Digest, 4);
     NdisZeroMemory(pCtx, sizeof(pCtx)); // memory free 
 }
@@ -349,9 +349,9 @@ VOID MD5Final(UCHAR Digest[16], MD5_CTX *pCtx)
  *  Note:
  *      Called by MD5Update or MD5Final
  */
-VOID MD5Transform(ULONG Buf[4], ULONG Mes[16])
+VOID MD5Transform(UINT32 Buf[4], UINT32 Mes[16])
 {  
-    ULONG Reg[4], Temp; 
+    UINT32 Reg[4], Temp; 
 	unsigned int i;
     
     static UCHAR LShiftVal[16] = 
@@ -364,7 +364,7 @@ VOID MD5Transform(ULONG Buf[4], ULONG Mes[16])
 
 	
 	// [equal to 4294967296*abs(sin(index))]
-    static ULONG MD5Table[64] = 
+    static UINT32 MD5Table[64] = 
 	{ 
 		0xd76aa478,	0xe8c7b756,	0x242070db,	0xc1bdceee,	
 		0xf57c0faf,	0x4787c62a,	0xa8304613, 0xfd469501,	
@@ -491,22 +491,22 @@ VOID SHAInit(SHA_CTX *pCtx)
  *  Note:
  *      Called after SHAInit or SHAUpdate(itself)   
  */
-UCHAR SHAUpdate(SHA_CTX *pCtx, UCHAR *pData, ULONG LenInBytes)
+UCHAR SHAUpdate(SHA_CTX *pCtx, UCHAR *pData, UINT32 LenInBytes)
 {
-    ULONG TfTimes;
-    ULONG temp1,temp2;
+    UINT32 TfTimes;
+    UINT32 temp1,temp2;
 	unsigned int i;
 	UCHAR err=1;
     
     temp1 = pCtx->LenInBitCount[0];
     temp2 = pCtx->LenInBitCount[1];
 
-    pCtx->LenInBitCount[0] = (ULONG) (pCtx->LenInBitCount[0] + (LenInBytes << 3));
+    pCtx->LenInBitCount[0] = (UINT32) (pCtx->LenInBitCount[0] + (LenInBytes << 3));
     if (pCtx->LenInBitCount[0] < temp1)
         pCtx->LenInBitCount[1]++;   //carry in
 
 
-    pCtx->LenInBitCount[1] = (ULONG) (pCtx->LenInBitCount[1] +(LenInBytes >> 29));
+    pCtx->LenInBitCount[1] = (UINT32) (pCtx->LenInBitCount[1] +(LenInBytes >> 29));
     if (pCtx->LenInBitCount[1] < temp2)
         return (err);   //check total length of original data
  
@@ -529,7 +529,7 @@ UCHAR SHAUpdate(SHA_CTX *pCtx, UCHAR *pData, ULONG LenInBytes)
         byteReverse((UCHAR *)pCtx->Input, 16);               
         
         NdisZeroMemory((UCHAR *)pCtx->Input + 64, 16);
-        SHATransform(pCtx->Buf, (ULONG *)pCtx->Input);
+        SHATransform(pCtx->Buf, (UINT32 *)pCtx->Input);
 
         pData += 64-temp1;
         LenInBytes -= 64-temp1; 
@@ -544,7 +544,7 @@ UCHAR SHAUpdate(SHA_CTX *pCtx, UCHAR *pData, ULONG LenInBytes)
         byteReverse((UCHAR *)pCtx->Input, 16);
         
         NdisZeroMemory((UCHAR *)pCtx->Input + 64, 16);
-        SHATransform(pCtx->Buf, (ULONG *)pCtx->Input);
+        SHATransform(pCtx->Buf, (UINT32 *)pCtx->Input);
         pData += 64;
         LenInBytes -= 64;
     } // end of for
@@ -589,7 +589,7 @@ VOID SHAFinal(SHA_CTX *pCtx, UCHAR Digest[20])
       	
         byteReverse((UCHAR *)pCtx->Input, 16);
         NdisZeroMemory((UCHAR *)pCtx->Input + 64, 14);
-        SHATransform(pCtx->Buf, (ULONG *)pCtx->Input);
+        SHATransform(pCtx->Buf, (UINT32 *)pCtx->Input);
     } // end of if
     
     // padding bits with crossing block(64-byte based) boundary
@@ -604,7 +604,7 @@ VOID SHAFinal(SHA_CTX *pCtx, UCHAR Digest[20])
         
         byteReverse((UCHAR *)pCtx->Input, 16);
         NdisZeroMemory((UCHAR *)pCtx->Input + 64, 16);
-        SHATransform(pCtx->Buf, (ULONG *)pCtx->Input);
+        SHATransform(pCtx->Buf, (UINT32 *)pCtx->Input);
 
 
         // the second block ===
@@ -619,7 +619,7 @@ VOID SHAFinal(SHA_CTX *pCtx, UCHAR Digest[20])
       	
         byteReverse((UCHAR *)pCtx->Input, 16);
         NdisZeroMemory((UCHAR *)pCtx->Input + 64, 16); 
-        SHATransform(pCtx->Buf, (ULONG *)pCtx->Input);
+        SHATransform(pCtx->Buf, (UINT32 *)pCtx->Input);
     } // end of else
 	
 		
@@ -635,13 +635,13 @@ VOID SHAFinal(SHA_CTX *pCtx, UCHAR Digest[20])
 
 // The central algorithm of SHA-1, consists of four rounds and 
 // twenty steps per round
-VOID SHATransform(ULONG Buf[5], ULONG Mes[20])
-{
-    ULONG Reg[5],Temp; 
+VOID SHATransform(UINT32 Buf[5], UINT32 Mes[20])
+{ 
+    UINT32 Reg[5],Temp; 
 	unsigned int i;
-    ULONG W[80]; 
-   
-    static ULONG SHA1Table[4] = { 0x5a827999, 0x6ed9eba1, 
+    UINT32 W[80]; 
+  
+    static UINT32 SHA1Table[4] = { 0x5a827999, 0x6ed9eba1, 
                                   0x8f1bbcdc, 0xca62c1d6 };
  
     Reg[0]=Buf[0];
@@ -1369,6 +1369,7 @@ VOID	HMAC_SHA1(
 	SHAUpdate(&context,	k_opad,	64);	/*	start with outer pad */
 	SHAUpdate(&context,	digest,	20);	/*	then results of	1st	hash */
 	SHAFinal(&context, digest);			/* finish up 2nd pass */
+
 }
 
 /*
diff --git a/rt2860-1.7.0.0/common/mlme.c b/rt2860-source-1.8.0.0/common/mlme.c
similarity index 94%
copy from rt2860-1.7.0.0/common/mlme.c
copy to rt2860-source-1.8.0.0/common/mlme.c
index 015aa5e..6676eb7 100644
--- a/rt2860-1.7.0.0/common/mlme.c
+++ b/rt2860-source-1.8.0.0/common/mlme.c
@@ -43,6 +43,7 @@ UCHAR	CISCO_OUI[] = {0x00, 0x40, 0x96};
 
 UCHAR	WPA_OUI[] = {0x00, 0x50, 0xf2, 0x01};
 UCHAR	RSN_OUI[] = {0x00, 0x0f, 0xac};
+UCHAR	WAPI_OUI[] = {0x00, 0x14, 0x72};
 UCHAR   WME_INFO_ELEM[]  = {0x00, 0x50, 0xf2, 0x02, 0x00, 0x01};
 UCHAR   WME_PARM_ELEM[] = {0x00, 0x50, 0xf2, 0x02, 0x01, 0x01};
 UCHAR	Ccx2QosInfo[] = {0x00, 0x40, 0x96, 0x04};
@@ -50,7 +51,9 @@ UCHAR   RALINK_OUI[]  = {0x00, 0x0c, 0x43};
 UCHAR   BROADCOM_OUI[]  = {0x00, 0x90, 0x4c};
 UCHAR   WPS_OUI[] = {0x00, 0x50, 0xf2, 0x04};
 #ifdef CONFIG_STA_SUPPORT
+#ifdef DOT11_N_SUPPORT
 UCHAR	PRE_N_HT_OUI[]	= {0x00, 0x90, 0x4c};
+#endif // DOT11_N_SUPPORT //
 #endif // CONFIG_STA_SUPPORT //
 
 UCHAR RateSwitchTable[] = {
@@ -116,7 +119,7 @@ UCHAR RateSwitchTable11BG[] = {
 
 UCHAR RateSwitchTable11G[] = {
 // Item No.   Mode   Curr-MCS   TrainUp   TrainDown		// Mode- Bit0: STBC, Bit1: Short GI, Bit4,5: Mode(0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF)
-    0x08, 0x07,  0,  0,  0,						// Initial used item after association
+    0x08, 0x00,  0,  0,  0,						// Initial used item after association
     0x00, 0x10,  0, 20, 101,
     0x01, 0x10,  1, 20, 35,
     0x02, 0x10,  2, 20, 35,
@@ -127,6 +130,7 @@ UCHAR RateSwitchTable11G[] = {
     0x07, 0x10,  7, 10, 13,
 };
 
+#ifdef DOT11_N_SUPPORT
 UCHAR RateSwitchTable11N1S[] = {
 // Item No.   Mode   Curr-MCS   TrainUp   TrainDown		// Mode- Bit0: STBC, Bit1: Short GI, Bit4,5: Mode(0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF)
     0x09, 0x00,  0,  0,  0,						// Initial used item after association
@@ -283,6 +287,7 @@ UCHAR RateSwitchTable11BGN3SForABand[] = { // 3*3
     0x0a, 0x20, 23,  8, 25,
     0x0b, 0x22, 23,  8, 25,
 };
+#endif // DOT11_N_SUPPORT //
 
 PUCHAR ReasonString[] = {
 	/* 0  */	 "Reserved",
@@ -329,12 +334,14 @@ USHORT RateIdTo500Kbps[] = { 2, 4, 11, 22, 12, 18, 24, 36, 48, 72, 96, 108, 144,
 UCHAR  SsidIe	 = IE_SSID;
 UCHAR  SupRateIe = IE_SUPP_RATES;
 UCHAR  ExtRateIe = IE_EXT_SUPP_RATES;
+#ifdef DOT11_N_SUPPORT
 UCHAR  HtCapIe = IE_HT_CAP;
 UCHAR  AddHtInfoIe = IE_ADD_HT;
 UCHAR  NewExtChanIe = IE_SECONDARY_CH_OFFSET;
 #ifdef DOT11N_DRAFT3
 UCHAR  ExtHtCapIe = IE_EXT_CAPABILITY;
 #endif // DOT11N_DRAFT3 //
+#endif // DOT11_N_SUPPORT //
 UCHAR  ErpIe	 = IE_ERP;
 UCHAR  DsIe 	 = IE_DS_PARM;
 UCHAR  TimIe	 = IE_TIM;
@@ -384,18 +391,14 @@ RTMP_RF_REGS RF2850RegTable[] = {
 
 		// 802.11 HyperLan 2
 		{100, 0x98402ec8, 0x984c06b2, 0x98178a55, 0x980ed783},
-#if 0
-		{102, 0x98402ec8, 0x984c06b2, 0x98178a55, 0x980ed793},
-		{104, 0x98402ec8, 0x984c06b2, 0x98178a55, 0x980ed1a3},
-		{108, 0x98402ecc, 0x984c0a32, 0x98178a55, 0x980ed193},
-#else
+		
 		// 2008.04.30 modified 
 		// The system team has AN to improve the EVM value 
 		// for channel 102 to 108 for the RT2850/RT2750 dual band solution.
 		{102, 0x98402ec8, 0x985c06b2, 0x98578a55, 0x980ed793},
 		{104, 0x98402ec8, 0x985c06b2, 0x98578a55, 0x980ed1a3},
 		{108, 0x98402ecc, 0x985c0a32, 0x98578a55, 0x980ed193},
-#endif
+
 		{110, 0x98402ecc, 0x984c0a36, 0x98178a55, 0x980ed183},
 		{112, 0x98402ecc, 0x984c0a36, 0x98178a55, 0x980ed19b},
 		{116, 0x98402ecc, 0x984c0a3a, 0x98178a55, 0x980ed1a3},
@@ -431,6 +434,31 @@ RTMP_RF_REGS RF2850RegTable[] = {
 };
 UCHAR	NUM_OF_2850_CHNL = (sizeof(RF2850RegTable) / sizeof(RTMP_RF_REGS));
 
+FREQUENCY_ITEM FreqItems3020[] =
+{	
+	/**************************************************/
+	// ISM : 2.4 to 2.483 GHz                         //
+	/**************************************************/
+	// 11g
+	/**************************************************/
+	//-CH---N-------R---K-----------
+	{1,    241,  2,  2},
+	{2,    241,	 2,  7},
+	{3,    242,	 2,  2},
+	{4,    242,	 2,  7},
+	{5,    243,	 2,  2},
+	{6,    243,	 2,  7},
+	{7,    244,	 2,  2},
+	{8,    244,	 2,  7},
+	{9,    245,	 2,  2},
+	{10,   245,	 2,  7},
+	{11,   246,	 2,  2},
+	{12,   246,	 2,  7},
+	{13,   247,	 2,  2},
+	{14,   248,	 2,  4},
+};
+#define	NUM_OF_3020_CHNL	(sizeof(FreqItems3020) / sizeof(FREQUENCY_ITEM))
+
 /*
 	==========================================================================
 	Description:
@@ -477,12 +505,15 @@ NDIS_STATUS MlmeInit(
 			DlsStateMachineInit(pAd, &pAd->Mlme.DlsMachine, pAd->Mlme.DlsFunc);
 #endif // QOS_DLS_SUPPORT //
 
+
 			// Since we are using switch/case to implement it, the init is different from the above 
 			// state machine init
 			MlmeCntlInit(pAd, &pAd->Mlme.CntlMachine, NULL);
 		}
 #endif // CONFIG_STA_SUPPORT //
 		
+
+
 		ActionStateMachineInit(pAd, &pAd->Mlme.ActMachine, pAd->Mlme.ActFunc);
 
 		// Init mlme periodic timer
@@ -618,6 +649,9 @@ VOID MlmeHandler(
 					StateMachinePerformAction(pAd, &pAd->Mlme.ActMachine, Elem);
 					break;	
 
+
+
+
 				default:
 					DBGPRINT(RT_DEBUG_TRACE, ("ERROR: Illegal machine %ld in MlmeHandler()\n", Elem->Machine));
 					break;
@@ -697,6 +731,8 @@ VOID MlmeHalt(
 	RTMPCancelTimer(&pAd->Mlme.PeriodicTimer,		&Cancelled);
 	RTMPCancelTimer(&pAd->Mlme.RxAntEvalTimer,		&Cancelled);
 
+
+
 	if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))
 	{
 		// Set LED
@@ -872,13 +908,14 @@ VOID MlmePeriodicExec(
 	pAd->Mlme.PeriodicRound ++;
 
 	// execute every 500ms 
-	if ((pAd->Mlme.PeriodicRound % 5 == 0) && RTMPAutoRateSwitchCheck(pAd))
+	if ((pAd->Mlme.PeriodicRound % 5 == 0) && RTMPAutoRateSwitchCheck(pAd)/*(OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_TX_RATE_SWITCH_ENABLED))*/)
 	{
 #ifdef CONFIG_STA_SUPPORT
 		// perform dynamic tx rate switching based on past TX history
 		IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
 		{
-			if ((OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))
+			if ((OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)
+					)
 				&& (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)))
 				MlmeDynamicTxRateSwitching(pAd);
 		}
@@ -913,15 +950,15 @@ VOID MlmePeriodicExec(
     	}
 #endif // RALINK_ATE //
 
+
 		if (rx_Total)
 		{
-			DBGPRINT(RT_DEBUG_LOUD,("%lu/%lu (%lu%%) , TxDone %ld\n", rx_AMSDU, rx_Total,  (rx_AMSDU*100)/rx_Total, pAd->RalinkCounters.OneSecDmaDoneCount[0]));
-
+			
 			// reset counters
 			rx_AMSDU = 0;
 			rx_Total = 0;
 		}
-		
+
 		// Media status changed, report to NDIS
 		if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_MEDIA_STATE_CHANGE)) 
 		{
@@ -930,6 +967,7 @@ VOID MlmePeriodicExec(
 			{
 				pAd->IndicateMediaState = NdisMediaStateConnected;
 				RTMP_IndicateMediaState(pAd);
+					
 			}
 			else
 			{
@@ -945,8 +983,11 @@ VOID MlmePeriodicExec(
 		NICUpdateRawCounters(pAd);																										
 
 
+#ifdef DOT11_N_SUPPORT
    		// Need statistics after read counter. So put after NICUpdateRawCounters
 		ORIBATimerTimeout(pAd);
+#endif // DOT11_N_SUPPORT //
+
 
 		// The time period for checking antenna is according to traffic
 		if (pAd->Mlme.bEnableAutoAntennaCheck)
@@ -1010,6 +1051,7 @@ VOID MlmePeriodicExec(
 		RT28XX_MLME_HANDLER(pAd);
 	}
 
+
 	pAd->bUpdateBcnCntDone = FALSE;
 }
 
@@ -1031,7 +1073,7 @@ VOID STAMlmePeriodicExec(
 #endif // RALINK_ATE //
 
 #ifdef WPA_SUPPLICANT_SUPPORT
-    if (pAd->StaCfg.WpaSupplicantUP == 0)    
+    if (pAd->StaCfg.WpaSupplicantUP == WPA_SUPPLICANT_DISABLE)    
 #endif // WPA_SUPPLICANT_SUPPORT //        
     {
     	// WPA MIC error should block association attempt for 60 seconds
@@ -1049,9 +1091,7 @@ VOID STAMlmePeriodicExec(
 	}
 
 
-	DBGPRINT(RT_DEBUG_INFO,("MMCHK - CommonCfg.Ssid[%d]=%c%c%c%c... MlmeAux.Ssid[%d]=%c%c%c%c...\n",
-			pAd->CommonCfg.SsidLen, pAd->CommonCfg.Ssid[0], pAd->CommonCfg.Ssid[1], pAd->CommonCfg.Ssid[2], pAd->CommonCfg.Ssid[3],
-			pAd->MlmeAux.SsidLen, pAd->MlmeAux.Ssid[0], pAd->MlmeAux.Ssid[1], pAd->MlmeAux.Ssid[2], pAd->MlmeAux.Ssid[3]));
+	
 
    	AsicStaBbpTuning(pAd);
 
@@ -1123,7 +1163,8 @@ VOID STAMlmePeriodicExec(
 			
 #ifdef WPA_SUPPLICANT_SUPPORT
 #ifndef NATIVE_WPA_SUPPLICANT_SUPPORT
-            if (pAd->StaCfg.WpaSupplicantUP) {
+            if (pAd->StaCfg.WpaSupplicantUP) 
+			{
                 union iwreq_data    wrqu;
                 //send disassociate event to wpa_supplicant
                 memset(&wrqu, 0, sizeof(wrqu));
@@ -1189,6 +1230,25 @@ VOID STAMlmePeriodicExec(
 			pAd->StaCfg.AdhocBOnlyJoined = FALSE;
 		}
 
+#ifdef DOT11_N_SUPPORT
+		if (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)
+		{
+			if ((pAd->StaCfg.AdhocBGJoined) &&
+				((pAd->StaCfg.Last11gBeaconRxTime + 5 * OS_HZ) < pAd->Mlme.Now32))
+			{
+				DBGPRINT(RT_DEBUG_TRACE, ("MMCHK - last 11G peer left\n"));
+				pAd->StaCfg.AdhocBGJoined = FALSE;
+			}
+
+			if ((pAd->StaCfg.Adhoc20NJoined) &&
+				((pAd->StaCfg.Last20NBeaconRxTime + 5 * OS_HZ) < pAd->Mlme.Now32))
+			{
+				DBGPRINT(RT_DEBUG_TRACE, ("MMCHK - last 20MHz N peer left\n"));
+				pAd->StaCfg.Adhoc20NJoined = FALSE;
+			}
+		}
+#endif // DOT11_N_SUPPORT //
+
 		//radar detect
 		if ((pAd->CommonCfg.Channel > 14)
 			&& (pAd->CommonCfg.bIEEE80211H == 1)
@@ -1197,38 +1257,24 @@ VOID STAMlmePeriodicExec(
 			RadarDetectPeriodic(pAd);
 		}
 
-#ifndef SINGLE_ADHOC_LINKUP
 		// If all peers leave, and this STA becomes the last one in this IBSS, then change MediaState
 		// to DISCONNECTED. But still holding this IBSS (i.e. sending BEACON) so that other STAs can
 		// join later.
 		if ((pAd->StaCfg.LastBeaconRxTime + ADHOC_BEACON_LOST_TIME < pAd->Mlme.Now32) &&
 			OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))
 		{
-			UCHAR	i;
+			MLME_START_REQ_STRUCT     StartReq;
+			
 			DBGPRINT(RT_DEBUG_TRACE, ("MMCHK - excessive BEACON lost, last STA in this IBSS, MediaState=Disconnected\n")); 
+			LinkDown(pAd, FALSE);
 
-			for (i=1; i<MAX_LEN_OF_MAC_TABLE; i++)
-			{
-				if (pAd->MacTab.Content[i].ValidAsCLI == TRUE)
-					MacTableDeleteEntry(pAd, pAd->MacTab.Content[i].Aid, pAd->MacTab.Content[i].Addr);
-			}
-
-			// Delete every  BA session with BSSID before tear down INFRA.
-			OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED); 
-			pAd->IndicateMediaState = NdisMediaStateDisconnected;
-			RTMP_IndicateMediaState(pAd);
-            pAd->ExtraInfo = GENERAL_LINK_DOWN;
-			// clean up previous SCAN result, add current BSS back to table if any
-			BssTableDeleteEntry(&pAd->ScanTab, pAd->CommonCfg.Bssid, pAd->CommonCfg.Channel);
-
-			pAd->StaCfg.LastScanTime = pAd->Mlme.Now32;
-			pAd->StaCfg.LastScanTime = pAd->Mlme.Now32;
+			StartParmFill(pAd, &StartReq, pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen);
+			MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_START_REQ, sizeof(MLME_START_REQ_STRUCT), &StartReq);
+			pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_START;
 		}
-#endif
 	}
 	else // no INFRA nor ADHOC connection
 	{
-		DBGPRINT(RT_DEBUG_INFO, ("STAMlmePeriodicExec, no association so far\n"));
 
 		if (pAd->StaCfg.bScanReqIsFromWebUI &&
             ((pAd->StaCfg.LastScanTime + 30 * OS_HZ) > pAd->Mlme.Now32))
@@ -1275,13 +1321,13 @@ VOID STAMlmePeriodicExec(
 #endif // CARRIER_DETECTION_SUPPORT // 
 						MlmeAutoReconnectLastSSID(pAd);
 				}
-
-				DBGPRINT(RT_DEBUG_INFO, ("pAd->StaCfg.bAutoReconnect is TRUE\n"));
 			}
 		}
 	}
 
 SKIP_AUTO_SCAN_CONN:
+
+#ifdef DOT11_N_SUPPORT
     if ((pAd->MacTab.Content[BSSID_WCID].TXBAbitmap !=0) && (pAd->MacTab.fAnyBASession == FALSE))
 	{
 		pAd->MacTab.fAnyBASession = TRUE;
@@ -1292,13 +1338,18 @@ SKIP_AUTO_SCAN_CONN:
 		pAd->MacTab.fAnyBASession = FALSE;
 		AsicUpdateProtect(pAd, pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode,  ALLN_SETPROTECT, FALSE, FALSE);
 	}
+#endif // DOT11_N_SUPPORT //
+
 
+#ifdef DOT11_N_SUPPORT
 #ifdef DOT11N_DRAFT3
 	if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_SCAN_2040))
 		TriEventCounterMaintenance(pAd);
 #endif // DOT11N_DRAFT3 //
+#endif // DOT11_N_SUPPORT //
 
-		}
+	return;
+}
 
 // Link down report
 VOID LinkDownExec(
@@ -1336,6 +1387,8 @@ VOID MlmeAutoScan(
 VOID MlmeAutoReconnectLastSSID(
 	IN PRTMP_ADAPTER pAd)
 {
+
+
 	// check CntlMachine.CurrState to avoid collision with NDIS SetOID request
 	if ((pAd->Mlme.CntlMachine.CurrState == CNTL_IDLE) && 
 		(MlmeValidateSSID(pAd->MlmeAux.AutoReconnectSsid, pAd->MlmeAux.AutoReconnectSsidLen) == TRUE))
@@ -1398,21 +1451,54 @@ VOID MlmeSelectTxRateTable(
 			*ppTable = RateSwitchTable;
 			*pTableSize = RateSwitchTable[0];
 			*pInitTxRateIdx = RateSwitchTable[1];
-
-			DBGPRINT_RAW(RT_DEBUG_TRACE,("DRS: rate table is from rate.bin \n"));
+			
 			break;
 		}
 
 #ifdef CONFIG_STA_SUPPORT
-		IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
-		if (ADHOC_ON(pAd))
-		{
-			if (pAd->CommonCfg.PhyMode == PHY_11B)
+		if ((pAd->OpMode == OPMODE_STA) && ADHOC_ON(pAd))
+		{
+#ifdef DOT11_N_SUPPORT
+			if ((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) && 
+				!pAd->StaCfg.AdhocBOnlyJoined && 
+				!pAd->StaCfg.AdhocBGJoined &&
+				(pAd->StaActive.SupportedPhyInfo.MCSSet[0] == 0xff) && 
+				((pAd->StaActive.SupportedPhyInfo.MCSSet[1] == 0x00) || (pAd->Antenna.field.TxPath == 1)))
+			{// 11N 1S Adhoc
+				*ppTable = RateSwitchTable11N1S;
+				*pTableSize = RateSwitchTable11N1S[0];
+				*pInitTxRateIdx = RateSwitchTable11N1S[1];
+				
+			}
+			else if ((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) && 
+					!pAd->StaCfg.AdhocBOnlyJoined && 
+					!pAd->StaCfg.AdhocBGJoined &&
+					(pAd->StaActive.SupportedPhyInfo.MCSSet[0] == 0xff) && 
+					(pAd->StaActive.SupportedPhyInfo.MCSSet[1] == 0xff) &&
+					(pAd->Antenna.field.TxPath == 2))
+			{// 11N 2S Adhoc
+				if (pAd->LatchRfRegs.Channel <= 14)
+				{
+					*ppTable = RateSwitchTable11N2S;
+					*pTableSize = RateSwitchTable11N2S[0];
+					*pInitTxRateIdx = RateSwitchTable11N2S[1];
+				}
+				else
+				{
+					*ppTable = RateSwitchTable11N2SForABand;
+					*pTableSize = RateSwitchTable11N2SForABand[0];
+					*pInitTxRateIdx = RateSwitchTable11N2SForABand[1];
+				}
+				
+			}
+			else
+#endif // DOT11_N_SUPPORT //				
+				if (pAd->CommonCfg.PhyMode == PHY_11B)
 			{
 				*ppTable = RateSwitchTable11B;
 				*pTableSize = RateSwitchTable11B[0];
 				*pInitTxRateIdx = RateSwitchTable11B[1];
-				DBGPRINT_RAW(RT_DEBUG_INFO,("DRS: B only Adhoc \n"));
+				
 			}
 	        else if((pAd->LatchRfRegs.Channel <= 14) && (pAd->StaCfg.AdhocBOnlyJoined == TRUE))
 			{
@@ -1420,36 +1506,37 @@ VOID MlmeSelectTxRateTable(
 				*ppTable = RateSwitchTable11B;
 				*pTableSize = RateSwitchTable11B[0];
 				*pInitTxRateIdx = RateSwitchTable11B[1];
-				DBGPRINT_RAW(RT_DEBUG_TRACE,("DRS: only B in my Adhoc . PhyMode= %d. ExtRateLen = %d.\n", pAd->CommonCfg.PhyMode, pAd->StaActive.ExtRateLen ));
+				
 			}
 			else if (pAd->LatchRfRegs.Channel <= 14)
 			{
 				*ppTable = RateSwitchTable11BG;
 				*pTableSize = RateSwitchTable11BG[0];
 				*pInitTxRateIdx = RateSwitchTable11BG[1];
-				DBGPRINT_RAW(RT_DEBUG_INFO,("DRS: B/G mixed Adhoc \n"));
+				
 			}
 			else
 			{
 				*ppTable = RateSwitchTable11G;
 				*pTableSize = RateSwitchTable11G[0];
 				*pInitTxRateIdx = RateSwitchTable11G[1];
-				DBGPRINT_RAW(RT_DEBUG_INFO,("DRS: A/G Adhoc \n"));
+				
 			}
 			break;
 		}
 #endif // CONFIG_STA_SUPPORT //
 
+#ifdef DOT11_N_SUPPORT
 		if ((pEntry->RateLen == 12) && (pEntry->HTCapability.MCSSet[0] == 0xff) &&
 			((pEntry->HTCapability.MCSSet[1] == 0x00) || (pAd->CommonCfg.TxStream == 1)))
 		{// 11BGN 1S AP
 			*ppTable = RateSwitchTable11BGN1S;
 			*pTableSize = RateSwitchTable11BGN1S[0];
 			*pInitTxRateIdx = RateSwitchTable11BGN1S[1];
-			DBGPRINT_RAW(RT_DEBUG_INFO,("DRS: 11BGN 1S AP \n"));
+			
 			break;
 		}
-	
+
 		if ((pEntry->RateLen == 12) && (pEntry->HTCapability.MCSSet[0] == 0xff) &&
 			(pEntry->HTCapability.MCSSet[1] == 0xff) && (pAd->CommonCfg.TxStream == 2))
 		{// 11BGN 2S AP
@@ -1458,14 +1545,14 @@ VOID MlmeSelectTxRateTable(
 				*ppTable = RateSwitchTable11BGN2S;
 				*pTableSize = RateSwitchTable11BGN2S[0];
 				*pInitTxRateIdx = RateSwitchTable11BGN2S[1];
-				DBGPRINT_RAW(RT_DEBUG_INFO,("DRS: 11BGN 2S AP \n"));
+				
 			}
 			else
 			{
 				*ppTable = RateSwitchTable11BGN2SForABand;
 				*pTableSize = RateSwitchTable11BGN2SForABand[0];
 				*pInitTxRateIdx = RateSwitchTable11BGN2SForABand[1];
-                		DBGPRINT_RAW(RT_DEBUG_INFO,("DRS: 11AN 2S AP \n"));
+                		
 			}
 			break;
 		}
@@ -1475,7 +1562,7 @@ VOID MlmeSelectTxRateTable(
 			*ppTable = RateSwitchTable11N1S;
 			*pTableSize = RateSwitchTable11N1S[0];
 			*pInitTxRateIdx = RateSwitchTable11N1S[1];
-			DBGPRINT_RAW(RT_DEBUG_INFO,("DRS: 11N 1S AP \n"));
+			
 			break;
 		}
 
@@ -1493,66 +1580,84 @@ VOID MlmeSelectTxRateTable(
 				*pTableSize = RateSwitchTable11N2SForABand[0];
 				*pInitTxRateIdx = RateSwitchTable11N2SForABand[1];
 			}
-			DBGPRINT_RAW(RT_DEBUG_INFO,("DRS: 11N 2S AP \n"));
+			
 			break;
 		}
-
-		if ((pEntry->RateLen == 4) && (pEntry->HTCapability.MCSSet[0] == 0) && (pEntry->HTCapability.MCSSet[1] == 0))
+#endif // DOT11_N_SUPPORT //
+		//else if ((pAd->StaActive.SupRateLen == 4) && (pAd->StaActive.ExtRateLen == 0) && (pAd->StaActive.SupportedPhyInfo.MCSSet[0] == 0) && (pAd->StaActive.SupportedPhyInfo.MCSSet[1] == 0))
+		if ((pEntry->RateLen == 4) 
+#ifdef DOT11_N_SUPPORT
+			&& (pEntry->HTCapability.MCSSet[0] == 0) && (pEntry->HTCapability.MCSSet[1] == 0)
+#endif // DOT11_N_SUPPORT //
+			)
 		{// B only AP
 			*ppTable = RateSwitchTable11B;
 			*pTableSize = RateSwitchTable11B[0];
 			*pInitTxRateIdx = RateSwitchTable11B[1];
-			DBGPRINT_RAW(RT_DEBUG_INFO,("DRS: B only AP \n"));
+			
 			break;
 		}
 
-		if ((pEntry->RateLen > 8) && (pEntry->HTCapability.MCSSet[0] == 0) && (pEntry->HTCapability.MCSSet[1] == 0))
+		//else if ((pAd->StaActive.SupRateLen + pAd->StaActive.ExtRateLen > 8) && (pAd->StaActive.SupportedPhyInfo.MCSSet[0] == 0) && (pAd->StaActive.SupportedPhyInfo.MCSSet[1] == 0))
+		if ((pEntry->RateLen > 8) 
+#ifdef DOT11_N_SUPPORT
+			&& (pEntry->HTCapability.MCSSet[0] == 0) && (pEntry->HTCapability.MCSSet[1] == 0)
+#endif // DOT11_N_SUPPORT //
+			)
 		{// B/G  mixed AP
 			*ppTable = RateSwitchTable11BG;
 			*pTableSize = RateSwitchTable11BG[0];
 			*pInitTxRateIdx = RateSwitchTable11BG[1];
-			DBGPRINT_RAW(RT_DEBUG_INFO,("DRS: B/G mixed AP \n"));
+			
 			break;
 		}
 
-		if ((pEntry->RateLen == 8) && (pEntry->HTCapability.MCSSet[0] == 0) && (pEntry->HTCapability.MCSSet[1] == 0))
+		//else if ((pAd->StaActive.SupRateLen + pAd->StaActive.ExtRateLen == 8) && (pAd->StaActive.SupportedPhyInfo.MCSSet[0] == 0) && (pAd->StaActive.SupportedPhyInfo.MCSSet[1] == 0))
+		if ((pEntry->RateLen == 8) 
+#ifdef DOT11_N_SUPPORT
+			&& (pEntry->HTCapability.MCSSet[0] == 0) && (pEntry->HTCapability.MCSSet[1] == 0)
+#endif // DOT11_N_SUPPORT //
+			)
 		{// G only AP
 			*ppTable = RateSwitchTable11G;
 			*pTableSize = RateSwitchTable11G[0];
 			*pInitTxRateIdx = RateSwitchTable11G[1];
-			DBGPRINT_RAW(RT_DEBUG_INFO,("DRS: A/G AP \n"));
+			
 			break;
 		}
+#ifdef DOT11_N_SUPPORT
+#endif // DOT11_N_SUPPORT //
 
 #ifdef CONFIG_STA_SUPPORT
 		IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
 		{
+#ifdef DOT11_N_SUPPORT
+			//else if ((pAd->StaActive.SupportedPhyInfo.MCSSet[0] == 0) && (pAd->StaActive.SupportedPhyInfo.MCSSet[1] == 0))
 			if ((pEntry->HTCapability.MCSSet[0] == 0) && (pEntry->HTCapability.MCSSet[1] == 0))
-			{// Legacy mode
+#endif // DOT11_N_SUPPORT //
+			{	// Legacy mode
 				if (pAd->CommonCfg.MaxTxRate <= RATE_11)
 				{
 					*ppTable = RateSwitchTable11B;
 					*pTableSize = RateSwitchTable11B[0];
 					*pInitTxRateIdx = RateSwitchTable11B[1];
-					DBGPRINT_RAW(RT_DEBUG_INFO,("DRS: B only AP (MaxTx=%d,MinTx=%d)\n", pAd->CommonCfg.MaxTxRate, pAd->CommonCfg.MinTxRate));
 				}
 				else if ((pAd->CommonCfg.MaxTxRate > RATE_11) && (pAd->CommonCfg.MinTxRate > RATE_11))
 				{
 					*ppTable = RateSwitchTable11G;
 					*pTableSize = RateSwitchTable11G[0];
 					*pInitTxRateIdx = RateSwitchTable11G[1];
-					DBGPRINT_RAW(RT_DEBUG_INFO,("DRS: A/G AP (MaxTx=%d,MinTx=%d)\n", pAd->CommonCfg.MaxTxRate, pAd->CommonCfg.MinTxRate));
+					
 				}
 				else		
 				{
 					*ppTable = RateSwitchTable11BG;
 					*pTableSize = RateSwitchTable11BG[0];
 					*pInitTxRateIdx = RateSwitchTable11BG[1];
-					DBGPRINT_RAW(RT_DEBUG_INFO,("DRS: B/G mixed AP (MaxTx=%d,MinTx=%d)\n", pAd->CommonCfg.MaxTxRate, pAd->CommonCfg.MinTxRate));
 				}
 				break;
 			}
-
+#ifdef DOT11_N_SUPPORT
 			if (pAd->LatchRfRegs.Channel <= 14)
 			{
 				if (pAd->CommonCfg.TxStream == 1)
@@ -1587,6 +1692,7 @@ VOID MlmeSelectTxRateTable(
 					DBGPRINT_RAW(RT_DEBUG_ERROR,("DRS: unkown mode,default use 11N 2S AP \n"));					
 				}
 			}
+#endif // DOT11_N_SUPPORT //
 			DBGPRINT_RAW(RT_DEBUG_ERROR,("DRS: unkown mode (SupRateLen=%d, ExtRateLen=%d, MCSSet[0]=0x%x, MCSSet[1]=0x%x)\n",
 				pAd->StaActive.SupRateLen, pAd->StaActive.ExtRateLen, pAd->StaActive.SupportedPhyInfo.MCSSet[0], pAd->StaActive.SupportedPhyInfo.MCSSet[1]));
 		}
@@ -1810,14 +1916,7 @@ VOID MlmeCalculateChannelQuality(
 		if (pAd->Mlme.ChannelQuality >= 100)
 			pAd->Mlme.ChannelQuality = 100;
 	}
-
-	DBGPRINT(RT_DEBUG_INFO, ("MMCHK - CQI= %ld (Tx Fail=%u/Retry=%u/Total=%lu, Rx Fail=%u/Total=%lu, RSSI=%d dbm)\n", 
-		pAd->Mlme.ChannelQuality, 
-		pAd->RalinkCounters.OneSecTxFailCount, 
-		pAd->RalinkCounters.OneSecTxRetryOkCount, 
-		TxCnt, 
-		pAd->RalinkCounters.OneSecRxFcsErrCnt, 
-		RxCnt, MaxRssi));
+	
 }
 
 VOID MlmeSetTxRate(
@@ -1825,9 +1924,15 @@ VOID MlmeSetTxRate(
 	IN PMAC_TABLE_ENTRY		pEntry,
 	IN PRTMP_TX_RATE_SWITCH	pTxRate)
 {
+	UCHAR	MaxMode = MODE_OFDM;
+	
+#ifdef DOT11_N_SUPPORT
+	MaxMode = MODE_HTGREENFIELD;
+
 	if (pTxRate->STBC && (pAd->StaCfg.MaxHTPhyMode.field.STBC) && (pAd->Antenna.field.TxPath == 2))
 		pAd->StaCfg.HTPhyMode.field.STBC = STBC_USE;
 	else
+#endif // DOT11_N_SUPPORT //
 		pAd->StaCfg.HTPhyMode.field.STBC = STBC_NONE;
 
 	if (pTxRate->CurrMCS < MCS_AUTO)
@@ -1840,7 +1945,7 @@ VOID MlmeSetTxRate(
 	{
 		// If peer adhoc is b-only mode, we can't send 11g rate.
 		pAd->StaCfg.HTPhyMode.field.ShortGI = GI_800;
-		pEntry->HTPhyMode.field.STBC	= 0;
+		pEntry->HTPhyMode.field.STBC	= STBC_NONE;
 
 		//
 		// For Adhoc MODE_CCK, driver will use AdhocBOnlyJoined flag to roll back to B only if necessary
@@ -1853,15 +1958,18 @@ VOID MlmeSetTxRate(
 		pAd->StaCfg.HTPhyMode.field.MODE = pEntry->HTPhyMode.field.MODE;
 	}
 	else
-    {
-	if (pTxRate->Mode <= MODE_HTGREENFIELD)
-		pAd->StaCfg.HTPhyMode.field.MODE = pTxRate->Mode;
+	{
+		if (pTxRate->Mode <= MaxMode)
+			pAd->StaCfg.HTPhyMode.field.MODE = pTxRate->Mode;
 
-        if (pTxRate->ShortGI && (pAd->StaCfg.MaxHTPhyMode.field.ShortGI))
+#ifdef DOT11_N_SUPPORT
+		if (pTxRate->ShortGI && (pAd->StaCfg.MaxHTPhyMode.field.ShortGI))
 			pAd->StaCfg.HTPhyMode.field.ShortGI = GI_400;
 		else
+#endif // DOT11_N_SUPPORT //
 			pAd->StaCfg.HTPhyMode.field.ShortGI = GI_800;
 
+#ifdef DOT11_N_SUPPORT
 		// Reexam each bandwidth's SGI support.
 		if (pAd->StaCfg.HTPhyMode.field.ShortGI == GI_400)
 		{
@@ -1871,7 +1979,7 @@ VOID MlmeSetTxRate(
 				pAd->StaCfg.HTPhyMode.field.ShortGI = GI_800;
 		}
 
-        // Turn RTS/CTS rate to 6Mbps.
+		// Turn RTS/CTS rate to 6Mbps.
 		if ((pEntry->HTPhyMode.field.MCS == 0) && (pAd->StaCfg.HTPhyMode.field.MCS != 0))
 		{
 			pEntry->HTPhyMode.field.MCS		= pAd->StaCfg.HTPhyMode.field.MCS;
@@ -1905,19 +2013,20 @@ VOID MlmeSetTxRate(
 		{
 			AsicUpdateProtect(pAd, HT_RTSCTS_6M, ALLN_SETPROTECT, TRUE, (BOOLEAN)pAd->MlmeAux.AddHtInfo.AddHtInfo2.NonGfPresent);
 		}
-        
+#endif // DOT11_N_SUPPORT //
+
 		pEntry->HTPhyMode.field.STBC	= pAd->StaCfg.HTPhyMode.field.STBC;
 		pEntry->HTPhyMode.field.ShortGI	= pAd->StaCfg.HTPhyMode.field.ShortGI;
 		pEntry->HTPhyMode.field.MCS		= pAd->StaCfg.HTPhyMode.field.MCS;
 		pEntry->HTPhyMode.field.MODE	= pAd->StaCfg.HTPhyMode.field.MODE;
-        if ((pAd->StaCfg.MaxHTPhyMode.field.MODE == MODE_HTGREENFIELD) &&
-            pAd->WIFItestbed.bGreenField)
-            pEntry->HTPhyMode.field.MODE = MODE_HTGREENFIELD;
-    }
-    pAd->LastTxRate = (USHORT)(pEntry->HTPhyMode.word);
-	DBGPRINT_RAW(RT_DEBUG_INFO,("DRS: MlmeSetTxRate - CurrTxRateIdx=%d, MCS=%d, STBC=%d, ShortGI=%d, Mode=%d, BW=%d \n", pAd->CommonCfg.TxRateIndex,
-		pAd->StaCfg.HTPhyMode.field.MCS,	pAd->StaCfg.HTPhyMode.field.STBC, pAd->StaCfg.HTPhyMode.field.ShortGI,
-		pAd->StaCfg.HTPhyMode.field.MODE, pAd->StaCfg.HTPhyMode.field.BW));
+#ifdef DOT11_N_SUPPORT
+		if ((pAd->StaCfg.MaxHTPhyMode.field.MODE == MODE_HTGREENFIELD) &&
+		    pAd->WIFItestbed.bGreenField)
+		    pEntry->HTPhyMode.field.MODE = MODE_HTGREENFIELD;
+#endif // DOT11_N_SUPPORT //
+	}
+	
+	pAd->LastTxRate = (USHORT)(pEntry->HTPhyMode.word);
 }
 
 /*
@@ -1943,7 +2052,7 @@ VOID MlmeDynamicTxRateSwitching(
 	UCHAR					UpRateIdx = 0, DownRateIdx = 0, CurrRateIdx;
 	ULONG					i, AccuTxTotalCnt = 0, TxTotalCnt;
 	ULONG					TxErrorRatio = 0;
-	BOOLEAN					bTxRateChanged = TRUE, bUpgradeQuality = FALSE;
+	BOOLEAN					bTxRateChanged, bUpgradeQuality = FALSE;
 	PRTMP_TX_RATE_SWITCH	pCurrTxRate, pNextTxRate = NULL;
 	PUCHAR					pTable;
 	UCHAR					TableSize = 0;
@@ -1961,10 +2070,10 @@ VOID MlmeDynamicTxRateSwitching(
 	}
 #endif // RALINK_ATE //
 	
-	if (pAd->Antenna.field.RxPath > 1)
+	/*if (pAd->Antenna.field.RxPath > 1)
 		Rssi = (pAd->StaCfg.RssiSample.AvgRssi0 + pAd->StaCfg.RssiSample.AvgRssi1) >> 1;
 	else
-		Rssi = pAd->StaCfg.RssiSample.AvgRssi0;
+		Rssi = pAd->StaCfg.RssiSample.AvgRssi0;*/	
 
 	//
 	// walk through MAC table, see if need to change AP's TX rate toward each entry
@@ -1977,8 +2086,10 @@ VOID MlmeDynamicTxRateSwitching(
 		if (RTMPCheckEntryEnableAutoRateSwitch(pAd, pEntry) == FALSE)
 			continue;
 
-		if (pAd->MacTab.Size == 1)
+		if ((pAd->MacTab.Size == 1) || (pEntry->ValidAsDls))
 		{
+			Rssi = RTMPMaxRssi(pAd, (CHAR)pAd->StaCfg.RssiSample.AvgRssi0, (CHAR)pAd->StaCfg.RssiSample.AvgRssi1, (CHAR)pAd->StaCfg.RssiSample.AvgRssi2);
+			
 			// Update statistic counter
 			RTMP_IO_READ32(pAd, TX_STA_CNT0, &TxStaCnt0.word);
 			RTMP_IO_READ32(pAd, TX_STA_CNT1, &StaTx1.word);
@@ -2007,6 +2118,8 @@ VOID MlmeDynamicTxRateSwitching(
 		}
 		else
 		{
+			Rssi = RTMPMaxRssi(pAd, (CHAR)pEntry->RssiSample.AvgRssi0, (CHAR)pEntry->RssiSample.AvgRssi1, (CHAR)pEntry->RssiSample.AvgRssi2);
+			
 			TxTotalCnt = pEntry->OneSecTxNoRetryOkCount + 
 				 pEntry->OneSecTxRetryOkCount + 
 				 pEntry->OneSecTxFailCount;
@@ -2019,6 +2132,11 @@ VOID MlmeDynamicTxRateSwitching(
 
 		MlmeSelectTxRateTable(pAd, pEntry, &pTable, &TableSize, &InitTxRateIdx);
 
+		if (CurrRateIdx >= TableSize)
+		{
+			CurrRateIdx = TableSize - 1;
+		}
+
 		// When switch from Fixed rate -> auto rate, the REAL TX rate might be different from pAd->CommonCfg.TxRateIndex.
 		// So need to sync here.
 		pCurrTxRate = (PRTMP_TX_RATE_SWITCH) &pTable[(CurrRateIdx+1)*5];
@@ -2026,7 +2144,7 @@ VOID MlmeDynamicTxRateSwitching(
 			//&& (pAd->StaCfg.bAutoTxRateSwitch == TRUE)
 			)
 		{
-			DBGPRINT_RAW(RT_DEBUG_INFO,("DRS: CurrRateIdx = %d, InitTxRateIdx = %d.  \n", CurrRateIdx, InitTxRateIdx));
+			
 			// Need to sync Real Tx rate and our record. 
 			// Then return for next DRS.
 			pCurrTxRate = (PRTMP_TX_RATE_SWITCH) &pTable[(InitTxRateIdx+1)*5];
@@ -2057,12 +2175,14 @@ VOID MlmeDynamicTxRateSwitching(
 
 		pCurrTxRate = (PRTMP_TX_RATE_SWITCH) &pTable[(CurrRateIdx+1)*5];
 
+#ifdef DOT11_N_SUPPORT
 		if ((Rssi > -65) && (pCurrTxRate->Mode >= MODE_HTMIX))
 		{
 			TrainUp		= (pCurrTxRate->TrainUp + (pCurrTxRate->TrainUp >> 1));
 			TrainDown	= (pCurrTxRate->TrainDown + (pCurrTxRate->TrainDown >> 1));
 		}
 		else
+#endif // DOT11_N_SUPPORT //
 		{
 			TrainUp		= pCurrTxRate->TrainUp;
 			TrainDown	= pCurrTxRate->TrainDown;
@@ -2074,24 +2194,8 @@ VOID MlmeDynamicTxRateSwitching(
 		// Keep the last time TxRateChangeAction status.
 		//
 		pEntry->LastTimeTxRateChangeAction = pEntry->LastSecTxRateChangeAction;
+
 		
-		DBGPRINT(RT_DEBUG_INFO, ("DRS: TxSuccess=%lu, TxRetransmit=%lu, TxFailCount=%lu, TxErrorRatio=%lu\n",
-			TxSuccess, TxRetransmit, TxFailCount, TxErrorRatio));
-
-			DBGPRINT_RAW(RT_DEBUG_INFO,("DRS: Before- CurrTxRateIdx=%d, MCS=%d, STBC=%d, ShortGI=%d, Mode=%d, TrainUp=%d, TrainDown=%d, NextUp=%d, NextDown=%d, CurrMCS=%d, PER=%lu%%, Retry=%lu, NoRetry=%lu\n",
-				CurrRateIdx,
-				pCurrTxRate->CurrMCS,
-				pCurrTxRate->STBC,
-				pCurrTxRate->ShortGI,
-				pCurrTxRate->Mode,
-				TrainUp,
-				TrainDown,
-				UpRateIdx,
-				DownRateIdx,
-				pEntry->HTPhyMode.field.MCS,
-				TxErrorRatio,
-				TxRetransmit,
-				TxSuccess));
 
 		//
 		// CASE 1. when TX samples are fewer than 15, then decide TX rate solely on RSSI
@@ -2202,7 +2306,7 @@ VOID MlmeDynamicTxRateSwitching(
 					RssiOffset = 8;
 				}
 			}
-			
+#ifdef DOT11_N_SUPPORT			
 			/*if (MCS15)*/
 			if ((pTable == RateSwitchTable11BGN3S) ||
 				(pTable == RateSwitchTable11N3S) ||
@@ -2268,6 +2372,7 @@ VOID MlmeDynamicTxRateSwitching(
 					TxRateIdx = MCS0;
 			}
 			else
+#endif // DOT11_N_SUPPORT //
 			{// Legacy mode
 				if (MCS7 && (Rssi > -70))
 					TxRateIdx = MCS7;
@@ -2298,9 +2403,6 @@ VOID MlmeDynamicTxRateSwitching(
 			NdisZeroMemory(pEntry->TxQuality, sizeof(USHORT) * MAX_STEP_OF_TX_RATE_SWITCH);
 			NdisZeroMemory(pEntry->PER, sizeof(UCHAR) * MAX_STEP_OF_TX_RATE_SWITCH);
 			pEntry->fLastSecAccordingRSSI = TRUE;
-
-			DBGPRINT_RAW(RT_DEBUG_INFO,("DRS: AccuTxTotalCnt <= 15, switch TxRateIndex as (%d) according to RSSI(%d), RssiOffset=%d\n", pEntry->CurrTxRateIndex, Rssi, RssiOffset));
-
 			// reset all OneSecTx counters
 			RESET_ONE_SEC_TX_CNT(pEntry);
 
@@ -2311,8 +2413,6 @@ VOID MlmeDynamicTxRateSwitching(
 		{
 			pEntry->fLastSecAccordingRSSI = FALSE;
 			pEntry->LastSecTxRateChangeAction = 0;
-			DBGPRINT_RAW(RT_DEBUG_INFO,("DRS: MCS is according to RSSI, and ignore tuning this sec \n"));
-
 			// reset all OneSecTx counters
 			RESET_ONE_SEC_TX_CNT(pEntry);
 
@@ -2364,8 +2464,6 @@ VOID MlmeDynamicTxRateSwitching(
 		// if rate-up happen, clear all bad history of all TX rates
 		if (pEntry->CurrTxRateIndex > CurrRateIdx)
 		{
-			DBGPRINT_RAW(RT_DEBUG_INFO,("DRS: ++TX rate from %d to %d \n", CurrRateIdx, pEntry->CurrTxRateIndex));
-		
 			pEntry->CurrTxRateStableTime = 0;
 			pEntry->TxRateUpPenalty = 0;
 			pEntry->LastSecTxRateChangeAction = 1; // rate UP
@@ -2381,12 +2479,11 @@ VOID MlmeDynamicTxRateSwitching(
 
 				pAd->StaCfg.StaQuickResponeForRateUpTimerRunning = TRUE;
 			}
+			bTxRateChanged = TRUE;
 		}
 		// if rate-down happen, only clear DownRate's bad history
 		else if (pEntry->CurrTxRateIndex < CurrRateIdx)
 		{
-			DBGPRINT_RAW(RT_DEBUG_INFO,("DRS: --TX rate from %d to %d \n", CurrRateIdx, pEntry->CurrTxRateIndex));
-			
 			pEntry->CurrTxRateStableTime = 0;
 			pEntry->TxRateUpPenalty = 0;           // no penalty
 			pEntry->LastSecTxRateChangeAction = 2; // rate DOWN
@@ -2402,6 +2499,7 @@ VOID MlmeDynamicTxRateSwitching(
 
 				pAd->StaCfg.StaQuickResponeForRateUpTimerRunning = TRUE;
 			}
+			bTxRateChanged = TRUE;
 		}
 		else
 		{
@@ -2460,10 +2558,6 @@ VOID StaQuickResponeForRateUpExec(
 	MAC_TABLE_ENTRY			*pEntry;
 	ULONG					i;
 
-	// check if this entry need to switch rate automatically
-	if (RTMPCheckEntryEnableAutoRateSwitch(pAd, NULL) == FALSE)
-		return;
-
 	pAd->StaCfg.StaQuickResponeForRateUpTimerRunning = FALSE;
 
     //
@@ -2473,6 +2567,10 @@ VOID StaQuickResponeForRateUpExec(
 	{
 		pEntry = &pAd->MacTab.Content[i];
 
+		// check if this entry need to switch rate automatically
+		if (RTMPCheckEntryEnableAutoRateSwitch(pAd, pEntry) == FALSE)
+			continue;
+
 		//Rssi = RTMPMaxRssi(pAd, (CHAR)pAd->StaCfg.AvgRssi0, (CHAR)pAd->StaCfg.AvgRssi1, (CHAR)pAd->StaCfg.AvgRssi2);
 	    if (pAd->Antenna.field.TxPath > 1)
 			Rssi = (pAd->StaCfg.RssiSample.AvgRssi0 + pAd->StaCfg.RssiSample.AvgRssi1) >> 1;
@@ -2502,12 +2600,14 @@ VOID StaQuickResponeForRateUpExec(
 
 		pCurrTxRate = (PRTMP_TX_RATE_SWITCH) &pTable[(CurrRateIdx+1)*5];
 
+#ifdef DOT11_N_SUPPORT
 		if ((Rssi > -65) && (pCurrTxRate->Mode >= MODE_HTMIX))
 		{
 			TrainUp		= (pCurrTxRate->TrainUp + (pCurrTxRate->TrainUp >> 1));
 			TrainDown	= (pCurrTxRate->TrainDown + (pCurrTxRate->TrainDown >> 1));
 		}
 		else
+#endif // DOT11_N_SUPPORT //
 		{
 			TrainUp		= pCurrTxRate->TrainUp;
 			TrainDown	= pCurrTxRate->TrainDown;
@@ -2544,9 +2644,7 @@ VOID StaQuickResponeForRateUpExec(
 				TxErrorRatio = ((pEntry->OneSecTxRetryOkCount + pEntry->OneSecTxFailCount) * 100) / TxTotalCnt;
 		}
 
-		DBGPRINT(RT_DEBUG_INFO, ("QuickDRS: OneSecTxNoRetryOkCount=%ld, OneSecTxRetryOkCount=%ld, OneSecTxFailCount=%ld, TxErrorRatio=%ld \n",
-			TxSuccess, TxRetransmit, TxFailCount, TxErrorRatio));
-
+		
 		//
 		// CASE 1. when TX samples are fewer than 15, then decide TX rate solely on RSSI
 		//         (criteria copied from RT2500 for Netopia case)
@@ -2596,27 +2694,19 @@ VOID StaQuickResponeForRateUpExec(
 				{
 					pAd->CommonCfg.TxRateIndex = DownRateIdx;
 					pAd->DrsCounters.TxQuality[CurrRateIdx] = DRS_TX_QUALITY_WORST_BOUND;
-					DBGPRINT_RAW(RT_DEBUG_INFO,("QuickDRS: (Up) bad tx ok count (L:%ld, C:%ld)\n", pAd->DrsCounters.LastTxOkCount, OneSecTxNoRetryOKRationCount));
-				}
-				else
-				{
-					DBGPRINT_RAW(RT_DEBUG_INFO,("QuickDRS: (Up) keep rate-up (L:%ld, C:%ld)\n", pAd->DrsCounters.LastTxOkCount, OneSecTxNoRetryOKRationCount));
+					
 				}
+				
 			}
 			else if ((pAd->DrsCounters.LastSecTxRateChangeAction == 2) && (CurrRateIdx != UpRateIdx))
 			{
 				if ((TxErrorRatio >= 50) || (TxErrorRatio >= TrainDown))
 				{
-					DBGPRINT_RAW(RT_DEBUG_INFO,("QuickDRS: (Down) direct train down (TxErrorRatio >= TrainDown)\n"));
+					
 				}
 				else if ((pAd->DrsCounters.LastTxOkCount + 2) >= OneSecTxNoRetryOKRationCount)
 				{
 					pAd->CommonCfg.TxRateIndex = UpRateIdx;
-					DBGPRINT_RAW(RT_DEBUG_INFO,("QuickDRS: (Down) bad tx ok count (L:%ld, C:%ld)\n", pAd->DrsCounters.LastTxOkCount, OneSecTxNoRetryOKRationCount));
-				}
-				else
-				{
-					DBGPRINT_RAW(RT_DEBUG_INFO,("QuickDRS: (Down) keep rate-down (L:%ld, C:%ld)\n", pAd->DrsCounters.LastTxOkCount, OneSecTxNoRetryOKRationCount));
 				}
 			}
 		}while (FALSE);
@@ -2624,8 +2714,6 @@ VOID StaQuickResponeForRateUpExec(
 		// if rate-up happen, clear all bad history of all TX rates
 		if (pAd->CommonCfg.TxRateIndex > CurrRateIdx)
 		{
-			DBGPRINT_RAW(RT_DEBUG_INFO,("QuickDRS: ++TX rate from %d to %d \n", CurrRateIdx, pAd->CommonCfg.TxRateIndex));
-			
 			pAd->DrsCounters.TxRateUpPenalty = 0;
 			NdisZeroMemory(pAd->DrsCounters.TxQuality, sizeof(USHORT) * MAX_STEP_OF_TX_RATE_SWITCH);
 			NdisZeroMemory(pAd->DrsCounters.PER, sizeof(UCHAR) * MAX_STEP_OF_TX_RATE_SWITCH);
@@ -2642,7 +2730,6 @@ VOID StaQuickResponeForRateUpExec(
 		else
 		{
 			bTxRateChanged = FALSE;
-			DBGPRINT_RAW(RT_DEBUG_INFO,("QuickDRS: rate is not changed \n"));
 		}
 
 		pNextTxRate = (PRTMP_TX_RATE_SWITCH) &pTable[(pAd->CommonCfg.TxRateIndex+1)*5];
@@ -2874,18 +2961,13 @@ VOID MlmeUpdateTxRates(
 		
 		auto_rate_cur_p = &pAd->StaCfg.bAutoTxRateSwitch;
 		HtMcs 		= pAd->StaCfg.DesiredTransmitSetting.field.MCS;
-	}	
-
-	// 2003-12-10 802.11g WIFI spec disallow OFDM rates in 802.11g ADHOC mode
-	IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
-	if ((pAd->StaCfg.BssType == BSS_ADHOC) &&
-		((pAd->CommonCfg.PhyMode == PHY_11BG_MIXED)) && 
-		(pAd->StaCfg.AdhocMode == 0) &&
-		(MaxDesire > RATE_11))
-	{
-		MaxDesire = RATE_11;
-		DBGPRINT(RT_DEBUG_INFO,("MlmeUpdateTxRates. 2 MaxDesire = %d. OpMode=%d\n", MaxDesire, pAd->OpMode));
-
+	
+		if ((pAd->StaCfg.BssType == BSS_ADHOC) &&
+			(pAd->CommonCfg.PhyMode == PHY_11B) && 
+			(MaxDesire > RATE_11))
+		{
+			MaxDesire = RATE_11;
+		}
 	}
 #endif // CONFIG_STA_SUPPORT //
 
@@ -2979,8 +3061,9 @@ VOID MlmeUpdateTxRates(
 
 		if (MinSupport > Rate) MinSupport = Rate;		
 	}
+
 	RTMP_IO_WRITE32(pAd, LEGACY_BASIC_RATE, BasicRateBitmap);
-		
+	
 	// calculate the exptected ACK rate for each TX rate. This info is used to caculate
 	// the DURATION field of outgoing uniicast DATA/MGMT frame
 	for (i=0; i<MAX_LEN_OF_SUPPORTED_RATES; i++)
@@ -2988,7 +3071,6 @@ VOID MlmeUpdateTxRates(
 		if (BasicRateBitmap & (0x01 << i))
 			CurrBasicRate = (UCHAR)i;
 		pAd->CommonCfg.ExpectedACKRate[i] = CurrBasicRate;
-		DBGPRINT(RT_DEBUG_INFO,("Exptected ACK rate[%d] = %d Mbps\n", RateIdToMbps[i], RateIdToMbps[CurrBasicRate]));
 	}
 
 	DBGPRINT(RT_DEBUG_TRACE,("MlmeUpdateTxRates[MaxSupport = %d] = MaxDesire %d Mbps\n", RateIdToMbps[MaxSupport], RateIdToMbps[MaxDesire]));
@@ -3021,7 +3103,6 @@ VOID MlmeUpdateTxRates(
 			pAd->CommonCfg.TxRate = pAd->CommonCfg.MaxTxRate; 
 
 		pAd->CommonCfg.TxRateIndex = 0;
-		DBGPRINT(RT_DEBUG_INFO, (" MlmeUpdateTxRates (Rssi=%d, init TX rate = %d Mbps)\n", dbm, RateIdToMbps[pAd->CommonCfg.TxRate]));
 	}
 	else
 	{
@@ -3064,26 +3145,32 @@ VOID MlmeUpdateTxRates(
 		{
 			case PHY_11BG_MIXED:
 			case PHY_11B:
+#ifdef DOT11_N_SUPPORT
 			case PHY_11BGN_MIXED:
+#endif // DOT11_N_SUPPORT //
 				pAd->CommonCfg.MlmeRate = RATE_1;
 				pAd->CommonCfg.MlmeTransmit.field.MODE = MODE_CCK;
-				pAd->CommonCfg.MlmeTransmit.field.MCS = RATE_1;				
+				pAd->CommonCfg.MlmeTransmit.field.MCS = RATE_1;
 				pAd->CommonCfg.RtsRate = RATE_11;
 				break;
+			case PHY_11G:
+			case PHY_11A:
+#ifdef DOT11_N_SUPPORT
 			case PHY_11AGN_MIXED:
 			case PHY_11GN_MIXED:
 			case PHY_11N_2_4G:
-			case PHY_11G:
-			case PHY_11A:
 			case PHY_11AN_MIXED:
 			case PHY_11N_5G:	
+#endif // DOT11_N_SUPPORT //
 				pAd->CommonCfg.MlmeRate = RATE_6;
 				pAd->CommonCfg.RtsRate = RATE_6;
 				pAd->CommonCfg.MlmeTransmit.field.MODE = MODE_OFDM;
 				pAd->CommonCfg.MlmeTransmit.field.MCS = OfdmRateToRxwiMCS[pAd->CommonCfg.MlmeRate];
 				break;
 			case PHY_11ABG_MIXED:
+#ifdef DOT11_N_SUPPORT
 			case PHY_11ABGN_MIXED:
+#endif // DOT11_N_SUPPORT //
 				if (pAd->CommonCfg.Channel <= 14)
 				{
 					pAd->CommonCfg.MlmeRate = RATE_1;
@@ -3126,6 +3213,7 @@ VOID MlmeUpdateTxRates(
 			 pAd->CommonCfg.MlmeTransmit.word, pAd->MacTab.Content[BSSID_WCID].MinHTPhyMode.word ,pAd->MacTab.Content[BSSID_WCID].MaxHTPhyMode.word ,pAd->MacTab.Content[BSSID_WCID].HTPhyMode.word ));
 }
 
+#ifdef DOT11_N_SUPPORT
 /*
 	==========================================================================
 	Description:
@@ -3247,6 +3335,7 @@ VOID MlmeUpdateHtTxRates(
 			pMinHtPhy->field.MCS = 32;
 			DBGPRINT(RT_DEBUG_TRACE,("MlmeUpdateHtTxRates<=== Use Fixed MCS = %d\n",pMinHtPhy->field.MCS));
 		}
+		
 		for (i=23; (CHAR)i >= 0; i--) // 3*3
 		{	
 			j = i/8;	
@@ -3255,7 +3344,6 @@ VOID MlmeUpdateHtTxRates(
 			{
 				pMaxHtPhy->field.MCS = i;
 				pMinHtPhy->field.MCS = i;
-				DBGPRINT(RT_DEBUG_INFO,("MlmeUpdateHtTxRates<=== Use Fixed MCS = %d\n", i));
 				break;
 			}
 			if (i==0)
@@ -3283,6 +3371,7 @@ VOID MlmeUpdateHtTxRates(
 		pHtPhy->field.BW, pHtPhy->field.ShortGI, pHtPhy->field.MODE));
 	DBGPRINT(RT_DEBUG_TRACE,("MlmeUpdateHtTxRates<=== \n"));
 }
+#endif // DOT11_N_SUPPORT //
 
 // IRQL = DISPATCH_LEVEL
 VOID MlmeRadioOff(
@@ -3327,6 +3416,7 @@ VOID BssTableInit(
 	}
 }
 
+#ifdef DOT11_N_SUPPORT
 VOID BATableInit(
 	IN PRTMP_ADAPTER pAd, 
     IN BA_TABLE *Tab) 
@@ -3346,6 +3436,7 @@ VOID BATableInit(
 		Tab->BAOriEntry[i].ORI_BA_Status = Originator_NONE;
 	}
 }
+#endif // DOT11_N_SUPPORT //
 
 /*! \brief search the BSS table by SSID
  *	\param p_tab pointer to the bss table
@@ -3441,7 +3532,6 @@ VOID BssTableDeleteEntry(
 
 	for (i = 0; i < Tab->BssNr; i++) 
 	{
-		//printf("comparing %s and %s\n", p_tab->bss[i].ssid, ssid);
 		if ((Tab->BssEntry[i].Channel == Channel) && 
 			(MAC_ADDR_EQUAL(Tab->BssEntry[i].Bssid, pBssid)))
 		{
@@ -3449,13 +3539,14 @@ VOID BssTableDeleteEntry(
 			{
 				NdisMoveMemory(&(Tab->BssEntry[j]), &(Tab->BssEntry[j + 1]), sizeof(BSS_ENTRY));
 			}
-			Tab->BssNr -= 1;
-			NdisZeroMemory(&(Tab->BssEntry[Tab->BssNr]), sizeof(BSS_ENTRY));
+			NdisZeroMemory(&(Tab->BssEntry[Tab->BssNr - 1]), sizeof(BSS_ENTRY));
+			Tab->BssNr -= 1;			
 			return;
 		}
 	}
 }
 
+#ifdef DOT11_N_SUPPORT
 /*
 	========================================================================
 	Routine Description:
@@ -3487,6 +3578,7 @@ VOID BATableDeleteORIEntry(
 		NdisReleaseSpinLock(&pAd->BATabLock);
 	}
 }
+#endif // DOT11_N_SUPPORT //
 
 /*! \brief
  *	\param 
@@ -3568,7 +3660,10 @@ VOID BssEntrySet(
 	// Combine with AuthMode, they will decide the connection methods.
 	pBss->Privacy = CAP_IS_PRIVACY_ON(pBss->CapabilityInfo);
 	ASSERT(SupRateLen <= MAX_LEN_OF_SUPPORTED_RATES);
-	NdisMoveMemory(pBss->SupRate, SupRate, SupRateLen);
+	if (SupRateLen <= MAX_LEN_OF_SUPPORTED_RATES)		
+		NdisMoveMemory(pBss->SupRate, SupRate, SupRateLen);	
+	else		
+		NdisMoveMemory(pBss->SupRate, SupRate, MAX_LEN_OF_SUPPORTED_RATES);	
 	pBss->SupRateLen = SupRateLen;
 	ASSERT(ExtRateLen <= MAX_LEN_OF_SUPPORTED_RATES);
 	NdisMoveMemory(pBss->ExtRate, ExtRate, ExtRateLen);
@@ -3598,6 +3693,9 @@ VOID BssEntrySet(
 		pBss->VarIELen = 0;
 	}
 
+	pBss->AddHtInfoLen = 0;
+	pBss->HtCapabilityLen = 0;
+#ifdef DOT11_N_SUPPORT
 	if (HtCapabilityLen> 0)
 	{
 		pBss->HtCapabilityLen = HtCapabilityLen;
@@ -3616,11 +3714,8 @@ VOID BssEntrySet(
 		 				pBss->CentralChannel = pAddHtInfo->ControlChan + 2;
 				}
 		}
-		else
-			pBss->AddHtInfoLen = 0;
 	}
-	else
-		pBss->HtCapabilityLen = 0;
+#endif // DOT11_N_SUPPORT //
 	
 	BssCipherParse(pBss);
 
@@ -3644,6 +3739,7 @@ VOID BssEntrySet(
 		PEID_STRUCT     pEid;
 		USHORT          Length = 0;
 
+
 		NdisZeroMemory(&pBss->WpaIE.IE[0], MAX_CUSTOM_LEN);
 		NdisZeroMemory(&pBss->RsnIE.IE[0], MAX_CUSTOM_LEN);
 #ifdef EXT_BUILD_CHANNEL_LIST
@@ -3677,7 +3773,7 @@ VOID BssEntrySet(
 						}
 						pBss->RsnIE.IELen = pEid->Len + 2;
 						NdisMoveMemory(pBss->RsnIE.IE, pEid, pBss->RsnIE.IELen);
-					}
+			}
 				break;
 #ifdef EXT_BUILD_CHANNEL_LIST					
 				case IE_COUNTRY:					
@@ -3793,6 +3889,7 @@ ULONG BssTableSetEntry(
 }
 
 #ifdef CONFIG_STA_SUPPORT
+#ifdef DOT11_N_SUPPORT
 #ifdef DOT11N_DRAFT3
 VOID  TriEventInit(
 	IN	PRTMP_ADAPTER	pAd) 
@@ -3895,7 +3992,7 @@ VOID TriEventCounterMaintenance(
 		Update2040CoexistFrameAndNotify(pAd, BSSID_WCID, TRUE);
 }
 #endif // DOT11N_DRAFT3 //
-
+#endif // DOT11_N_SUPPORT //
 
 // IRQL = DISPATCH_LEVEL
 VOID BssTableSsidSort(
@@ -3929,6 +4026,7 @@ VOID BssTableSsidSort(
 		{
 			BSS_ENTRY *pOutBss = &OutTab->BssEntry[OutTab->BssNr];
 
+
 #ifdef EXT_BUILD_CHANNEL_LIST
 			// If no Country IE exists no Connection will be established when IEEE80211dClientMode is strict.
 			if ((pAd->StaCfg.IEEE80211dClientMode == Rt802_11_D_Strict) &&
@@ -3939,6 +4037,7 @@ VOID BssTableSsidSort(
 			}
 #endif // EXT_BUILD_CHANNEL_LIST //
 
+#ifdef DOT11_N_SUPPORT
 			// 2.4G/5G N only mode
 			if ((pInBss->HtCapabilityLen == 0) &&
 				((pAd->CommonCfg.PhyMode == PHY_11N_2_4G) || (pAd->CommonCfg.PhyMode == PHY_11N_5G)))
@@ -3946,6 +4045,7 @@ VOID BssTableSsidSort(
 				DBGPRINT(RT_DEBUG_TRACE,("STA is in N-only Mode, this AP don't have Ht capability in Beacon.\n"));
 				continue;
 			}
+#endif // DOT11_N_SUPPORT //
 
 			// New for WPA2
 			// Check the Authmode first
@@ -4014,6 +4114,7 @@ VOID BssTableSsidSort(
 			if (SsidLen == 0)
 				continue;
 			
+#ifdef DOT11_N_SUPPORT			
 			// If both station and AP use 40MHz, still need to check if the 40MHZ band's legality in my country region
 			// If this 40MHz wideband is not allowed in my country list, use bandwidth 20MHZ instead,
 			if ((pInBss->CentralChannel != pInBss->Channel) &&
@@ -4033,6 +4134,7 @@ VOID BssTableSsidSort(
 					}
 				}
 			}
+#endif // DOT11_N_SUPPORT //
 			
 			// copy matching BSS from InTab to OutTab
 			NdisMoveMemory(pOutBss, pInBss, sizeof(BSS_ENTRY));
@@ -4044,6 +4146,7 @@ VOID BssTableSsidSort(
 			BSS_ENTRY *pOutBss = &OutTab->BssEntry[OutTab->BssNr];
 
 
+#ifdef DOT11_N_SUPPORT
 			// 2.4G/5G N only mode
 			if ((pInBss->HtCapabilityLen == 0) &&
 				((pAd->CommonCfg.PhyMode == PHY_11N_2_4G) || (pAd->CommonCfg.PhyMode == PHY_11N_5G)))
@@ -4051,6 +4154,7 @@ VOID BssTableSsidSort(
 				DBGPRINT(RT_DEBUG_TRACE,("STA is in N-only Mode, this AP don't have Ht capability in Beacon.\n"));
 				continue;
 			}
+#endif // DOT11_N_SUPPORT //
 
 			// New for WPA2
 			// Check the Authmode first
@@ -4106,6 +4210,7 @@ VOID BssTableSsidSort(
 			else if (pAd->StaCfg.WepStatus != pInBss->WepStatus)
 					continue;
 			
+#ifdef DOT11_N_SUPPORT
 			// If both station and AP use 40MHz, still need to check if the 40MHZ band's legality in my country region
 			// If this 40MHz wideband is not allowed in my country list, use bandwidth 20MHZ instead,
 			if ((pInBss->CentralChannel != pInBss->Channel) &&
@@ -4118,6 +4223,7 @@ VOID BssTableSsidSort(
 					pAd->CommonCfg.RegTransmitSetting.field.BW = BW_40;
 				}
 			}
+#endif // DOT11_N_SUPPORT //
 			
 			// copy matching BSS from InTab to OutTab
 			NdisMoveMemory(pOutBss, pInBss, sizeof(BSS_ENTRY));
@@ -4196,6 +4302,8 @@ VOID BssCipherParse(
 	pBss->WPA2.GroupCipher	 = Ndis802_11WEPDisabled;
 	pBss->WPA2.RsnCapability = 0;
 	pBss->WPA2.bMixMode 	 = FALSE;
+
+	
 	Length = (INT) pBss->VarIELen;
 
 	while (Length > 0)
@@ -4492,7 +4600,6 @@ VOID BssCipherParse(
 					pBss->WPA2.bMixMode = TRUE;
 				
 				break;
-
 			default:
 				break;
 		}
@@ -4685,8 +4792,6 @@ BOOLEAN MlmeEnqueue(
 	
 	if (MlmeQueueFull(Queue)) 
 	{
-		// Can't add debug print here. It'll make Mlme Stat machine freeze.
-		DBGPRINT(RT_DEBUG_INFO, ("MlmeEnqueue: full, msg dropped and may corrupt MLME\n"));
 		return FALSE;
 	}
 
@@ -4711,7 +4816,6 @@ BOOLEAN MlmeEnqueue(
 	}
 		
 	NdisReleaseSpinLock(&(Queue->Lock));
-	DBGPRINT(RT_DEBUG_INFO, ("MlmeEnqueue, num=%ld\n",Queue->Num));
 	return TRUE;
 }
 
@@ -4769,8 +4873,6 @@ BOOLEAN MlmeEnqueueForRecv(
 
 	if (MlmeQueueFull(Queue)) 
 	{
-		// Can't add debug print here. It'll make Mlme Stat machine freeze.
-		DBGPRINT(RT_DEBUG_INFO, ("MlmeEnqueueForRecv: full and dropped\n"));
 		return FALSE;
 	}
 
@@ -4794,9 +4896,6 @@ BOOLEAN MlmeEnqueueForRecv(
 	{
 		Queue->Tail = 0;
 	}
-
-	DBGPRINT(RT_DEBUG_INFO, ("MlmeEnqueueForRecv, num=%ld\n",Queue->Num));
-
 	Queue->Entry[Tail].Occupied = TRUE;
 	Queue->Entry[Tail].Machine = Machine;
 	Queue->Entry[Tail].MsgType = MsgType;
@@ -4847,8 +4946,6 @@ BOOLEAN MlmeDequeue(
 		Queue->Head = 0;
 	}
 	NdisReleaseSpinLock(&(Queue->Lock));
-	DBGPRINT(RT_DEBUG_INFO, ("MlmeDequeue, num=%ld\n",Queue->Num));
-
 	return TRUE;
 }
 
@@ -5367,6 +5464,7 @@ VOID AsicUpdateAutoFallBackTable(
 					}
 				}
 				break;
+#ifdef DOT11_N_SUPPORT
 			case 2:		//HT-MIX
 			case 3:		//HT-GF
 				{
@@ -5428,6 +5526,7 @@ VOID AsicUpdateAutoFallBackTable(
 					}
 				}
 				break;
+#endif // DOT11_N_SUPPORT //
 		}
 
 		pNextTxRate = pCurrTxRate;
@@ -5437,8 +5536,6 @@ VOID AsicUpdateAutoFallBackTable(
 	RTMP_IO_WRITE32(pAd, HT_FBK_CFG1, HtCfg1.word);
 	RTMP_IO_WRITE32(pAd, LG_FBK_CFG0, LgCfg0.word);
 	RTMP_IO_WRITE32(pAd, LG_FBK_CFG1, LgCfg1.word);
-
-	DBGPRINT(RT_DEBUG_INFO, ("AsicUpdateAutoFallBackTable: HtCfg0=0x%x, HtCfg1=0x%x, LgCfg0=0x%x, LgCfg1=0x%x \n", HtCfg0.word, HtCfg1.word, LgCfg0.word, LgCfg1.word));
 }
 
 /*
@@ -5476,6 +5573,7 @@ VOID 	AsicUpdateProtect(
 		return;
 #endif // RALINK_ATE //
 
+#ifdef DOT11_N_SUPPORT
 	if (!(pAd->CommonCfg.bHTProtect) && (OperationMode != 8))
 	{
 		return;
@@ -5489,7 +5587,7 @@ VOID 	AsicUpdateProtect(
 		SetMask = ALLN_SETPROTECT;
 		OperationMode = 8;
 	}
-
+#endif // DOT11_N_SUPPORT //
 
 	// Config ASIC RTS threshold register
 	RTMP_IO_READ32(pAd, TX_RTS_CFG, &MacReg);
@@ -5498,7 +5596,11 @@ VOID 	AsicUpdateProtect(
 	MacReg |= (pAd->CommonCfg.RtsThreshold << 8);
 #else
 	// If the user want disable RtsThreshold and enbale Amsdu/Ralink-Aggregation, set the RtsThreshold as 4096
-        if (((pAd->CommonCfg.BACapability.field.AmsduEnable) || (pAd->CommonCfg.bAggregationCapable == TRUE))
+        if ((
+#ifdef DOT11_N_SUPPORT
+			(pAd->CommonCfg.BACapability.field.AmsduEnable) || 
+#endif // DOT11_N_SUPPORT //
+			(pAd->CommonCfg.bAggregationCapable == TRUE))
             && pAd->CommonCfg.RtsThreshold == MAX_RTS_THRESHOLD)
         {
 			MacReg |= (0x1000 << 8);
@@ -5546,11 +5648,10 @@ VOID 	AsicUpdateProtect(
 		Protect[1] = ProtCfg.word;
 	}
 
+#ifdef DOT11_N_SUPPORT
 	// Decide HT frame protection.
 	if ((SetMask & ALLN_SETPROTECT) != 0)
 	{
-		//pAd->CommonCfg.BACapability.field.RxBAWinLimit = pAd->CommonCfg.REGBACapability.field.RxBAWinLimit;
-		DBGPRINT(RT_DEBUG_INFO, ("AsicUpdateProtect===>OperationMode = %d. \n", OperationMode));
 		switch(OperationMode)
 		{
 			case 0x0:
@@ -5610,7 +5711,7 @@ VOID 	AsicUpdateProtect(
 				if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_BG_PROTECTION_INUSED))
 				{
 					ProtCfg.word = 0x01740003;	//ERP use Protection bit is set, use protection rate at Clause 18..
-					ProtCfg4.word = 0x03f40083; 
+					ProtCfg4.word = 0x03f40003; // Don't duplicate RTS/CTS in CCK mode. 0x03f40083; 
 				}
 				//Assign Protection method for 20&40 MHz packets
 				ProtCfg.field.ProtectCtrl = ASIC_RTS;
@@ -5654,7 +5755,7 @@ VOID 	AsicUpdateProtect(
 				if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_BG_PROTECTION_INUSED))
 				{
 					ProtCfg.word = 0x01740003;	//ERP use Protection bit is set, use protection rate at Clause 18..
-					ProtCfg4.word = 0x03f40083;
+					ProtCfg4.word = 0x03f40003; // Don't duplicate RTS/CTS in CCK mode. 0x03f40083
 				}
 				//Assign Protection method for 20&40 MHz packets
 				ProtCfg.field.ProtectCtrl = ASIC_RTS;
@@ -5678,16 +5779,17 @@ VOID 	AsicUpdateProtect(
 				break;		
 		}
 	}
-	
+#endif // DOT11_N_SUPPORT //
+
 	offset = CCK_PROT_CFG;
 	for (i = 0;i < 6;i++)
 	{
-			if ((SetMask & (1<< i)))
+		if ((SetMask & (1<< i)))
 		{
-		RTMP_IO_WRITE32(pAd, offset + i*4, Protect[i]);
+			RTMP_IO_WRITE32(pAd, offset + i*4, Protect[i]);
+		}
 	}
 }
-}
 
 /*
 	==========================================================================
@@ -5725,14 +5827,15 @@ VOID AsicSwitchChannel(
 		DBGPRINT(RT_DEBUG_ERROR, ("AsicSwitchChannel: Cant find the Channel#%d \n", Channel));
 	}
 
-	RFRegTable = RF2850RegTable;
-
-	switch (pAd->RfIcType)
 	{
-		case RFIC_2820:
-		case RFIC_2850:
-		case RFIC_2720:
-		case RFIC_2750:
+		RFRegTable = RF2850RegTable;
+
+		switch (pAd->RfIcType)
+		{
+			case RFIC_2820:
+			case RFIC_2850:
+			case RFIC_2720:
+			case RFIC_2750:
 
 			for (index = 0; index < NUM_OF_2850_CHNL; index++)
 			{
@@ -5834,8 +5937,9 @@ VOID AsicSwitchChannel(
 			}
 			break;
 
-		default:
+			default:
 			break;
+		}
 	}
 
 	// Change BBP setting during siwtch from a->g, g->a
@@ -6185,6 +6289,95 @@ VOID AsicAdjustTxPower(
 	RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &BbpR1);
 	BbpR1 &= 0xFC;
 
+#ifdef SINGLE_SKU
+	// Handle regulatory max tx power constrain
+	do
+	{
+		UCHAR    TxPwrInEEPROM = 0xFF, CountryTxPwr = 0xFF, criterion;
+		UCHAR    AdjustMaxTxPwr[40]; 
+
+		if (pAd->CommonCfg.Channel > 14) // 5G band
+			TxPwrInEEPROM = ((pAd->CommonCfg.DefineMaxTxPwr & 0xFF00) >> 8);
+		else // 2.4G band
+			TxPwrInEEPROM = (pAd->CommonCfg.DefineMaxTxPwr & 0x00FF);
+		CountryTxPwr = GetCuntryMaxTxPwr(pAd, pAd->CommonCfg.Channel);
+ 
+		// error handling, range check
+		if ((TxPwrInEEPROM > 0x50) || (CountryTxPwr > 0x50))
+		{
+			DBGPRINT(RT_DEBUG_ERROR,("AsicAdjustTxPower - Invalid max tx power (=0x%02x), CountryTxPwr=%d\n", TxPwrInEEPROM, CountryTxPwr));
+			break;
+		}
+ 
+		criterion = *((PUCHAR)TxPwr + 2) & 0xF;        // FAE use OFDM 6M as criterion
+
+		DBGPRINT_RAW(RT_DEBUG_TRACE,("AsicAdjustTxPower (criterion=%d, TxPwrInEEPROM=%d, CountryTxPwr=%d)\n", criterion, TxPwrInEEPROM, CountryTxPwr));
+ 
+		// Adjust max tx power according to the relationship of tx power in E2PROM
+		for (i=0; i<5; i++)
+		{
+			// CCK will have 4dBm larger than OFDM
+			// Therefore, we should separate to parse the tx power field
+			if (i == 0)
+			{
+				for (j=0; j<8; j++)
+				{
+					Value = (CHAR)((TxPwr[i] >> j*4) & 0x0F);
+ 
+					if (j < 4)
+					{
+						// CCK will have 4dBm larger than OFDM
+						AdjustMaxTxPwr[i*8+j] = TxPwrInEEPROM + (Value - criterion) + 4;
+					}
+					else
+					{
+						AdjustMaxTxPwr[i*8+j] = TxPwrInEEPROM + (Value - criterion);
+					}
+					DBGPRINT_RAW(RT_DEBUG_TRACE,("AsicAdjustTxPower (i/j=%d/%d, Value=%d, %d)\n", i, j, Value, AdjustMaxTxPwr[i*8+j]));
+				}
+			}
+			else
+			{
+				for (j=0; j<8; j++)
+				{
+					Value = (CHAR)((TxPwr[i] >> j*4) & 0x0F);
+ 
+					AdjustMaxTxPwr[i*8+j] = TxPwrInEEPROM + (Value - criterion);
+					DBGPRINT_RAW(RT_DEBUG_TRACE,("AsicAdjustTxPower (i/j=%d/%d, Value=%d, %d)\n", i, j, Value, AdjustMaxTxPwr[i*8+j]));
+				}
+			}
+		}
+ 
+		// Adjust tx power according to the relationship
+		for (i=0; i<5; i++)
+		{
+			if (TxPwr[i] != 0xffffffff)
+			{
+				for (j=0; j<8; j++)
+				{
+					Value = (CHAR)((TxPwr[i] >> j*4) & 0x0F);
+ 
+					// The system tx power is larger than the regulatory, the power should be restrain
+					if (AdjustMaxTxPwr[i*8+j] > CountryTxPwr)
+					{
+						// decrease to zero and don't need to take care BBPR1
+						if ((Value - (AdjustMaxTxPwr[i*8+j] - CountryTxPwr)) > 0)
+							Value -= (AdjustMaxTxPwr[i*8+j] - CountryTxPwr);
+						else
+							Value = 0;
+ 
+						DBGPRINT_RAW(RT_DEBUG_TRACE,("AsicAdjustTxPower (i/j=%d/%d, Value=%d, %d)\n", i, j, Value, AdjustMaxTxPwr[i*8+j]));
+					}
+					else
+						DBGPRINT_RAW(RT_DEBUG_TRACE,("AsicAdjustTxPower (i/j=%d/%d, Value=%d, %d, no change)\n", i, j, Value, AdjustMaxTxPwr[i*8+j]));
+ 
+						TxPwr[i] = (TxPwr[i] & ~(0x0000000F << j*4)) | (Value << j*4);
+				}
+			}
+		}
+	} while (FALSE);
+#endif // SINGLE_SKU //
+
 	/* calculate delta power based on the percentage specified from UI */
 	// E2PROM setting is calibrated for maximum TX power (i.e. 100%)
 	// We lower TX power here according to the percentage specified from UI
@@ -6249,13 +6442,9 @@ VOID AsicAdjustTxPower(
 											TX power for CCK1M/2M */
 			/* TX_PWR_CFG_1 ~ TX_PWR_CFG_4 */
 			RTMP_IO_WRITE32(pAd, TX_PWR_CFG_0 + i*4, TxPwr[i]);
-
-			DBGPRINT(RT_DEBUG_INFO, ("AsicAdjustTxPower - DeltaPwr=%d, offset=0x%x, TxPwr=%lx, BbpR1=%x, BbpR49=%x, round=%ld, pTxAgcCompensate=%d \n",
-				DeltaPwr, TX_PWR_CFG_0 + i*4, TxPwr[i], BbpR1, BbpR49, pAd->Mlme.OneSecPeriodicRound, *pTxAgcCompensate));
 		}
 	}
 
-	DBGPRINT(RT_DEBUG_INFO, ("<-- AsicAdjustTxPower, DeltaPwr=%d\n", DeltaPwr));
 }
 
 #ifdef CONFIG_STA_SUPPORT
@@ -6415,8 +6604,7 @@ VOID AsicDisableRDG(
 	TX_LINK_CFG_STRUC	TxLinkCfg;
 	UINT32				Data = 0;
 
-	DBGPRINT(RT_DEBUG_INFO, ("--->AsicDisableRDG \n"));
-
+	
 	RTMP_IO_READ32(pAd, TX_LINK_CFG, &TxLinkCfg.word);
 	TxLinkCfg.field.TxRDGEn = 0;
 	RTMP_IO_WRITE32(pAd, TX_LINK_CFG, TxLinkCfg.word);
@@ -6424,10 +6612,15 @@ VOID AsicDisableRDG(
 	RTMP_IO_READ32(pAd, EDCA_AC0_CFG, &Data);
 	
 	Data  &= 0xFFFFFF00;
-    if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_DYNAMIC_BE_TXOP_ACTIVE) && (pAd->MacTab.fAnyStationMIMOPSDynamic == FALSE))
+	if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_DYNAMIC_BE_TXOP_ACTIVE) 
+#ifdef DOT11_N_SUPPORT
+		&& (pAd->MacTab.fAnyStationMIMOPSDynamic == FALSE)
+#endif // DOT11_N_SUPPORT //
+	)
 	{
 		// For CWC test, change txop from 0x30 to 0x20 in TxBurst mode
-		Data |= 0x20;
+		if (pAd->CommonCfg.bEnableTxBurst)
+			Data |= 0x20;
 	}
 	RTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, Data);
 }
@@ -6536,7 +6729,7 @@ VOID AsicEnableIbssSync(
 		ptr +=4;
 	}
 #endif // RT2860 //
-	
+
 	// start sending BEACON
 	csr9.field.BeaconInterval = pAd->CommonCfg.BeaconPeriod << 4; // ASIC register in units of 1/16 TU
 	csr9.field.bTsfTicking = 1;
@@ -6848,7 +7041,16 @@ VOID 	AsicSetSlotTime(
 	IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
 	{
 		// force using short SLOT time for FAE to demo performance when TxBurst is ON
-		if (pAd->CommonCfg.bEnableTxBurst)
+		if (((pAd->StaActive.SupportedPhyInfo.bHtEnable == FALSE) && (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED)))
+#ifdef DOT11_N_SUPPORT
+			|| ((pAd->StaActive.SupportedPhyInfo.bHtEnable == TRUE) && (pAd->CommonCfg.BACapability.field.Policy == BA_NOTUSE))
+#endif // DOT11_N_SUPPORT //
+			)
+		{
+			// In this case, we will think it is doing Wi-Fi test
+			// And we will not set to short slot when bEnableTxBurst is TRUE.
+		}
+		else if (pAd->CommonCfg.bEnableTxBurst)
 			SlotTime = 9;
 	}
 #endif // CONFIG_STA_SUPPORT //
@@ -6872,8 +7074,6 @@ VOID 	AsicSetSlotTime(
 	RegValue |= SlotTime;
 
 	RTMP_IO_WRITE32(pAd, BKOFF_SLOT_CFG, RegValue);
-
-	DBGPRINT(RT_DEBUG_INFO, ("AsicSetSlotTime(=%ld us)\n", SlotTime));
 }
 
 /*
@@ -7330,8 +7530,6 @@ VOID AsicRemovePairwiseKeyEntry(
 	offset = MAC_WCID_ATTRIBUTE_BASE + (Wcid * HW_WCID_ATTRI_SIZE);
 	WCIDAttri = (BssIdx<<4) | PAIRWISEKEYTABLE;		
 	RTMP_IO_WRITE32(pAd, offset, WCIDAttri);
-
-	DBGPRINT(RT_DEBUG_INFO, ("AsicRemovePairwiseKeyEntry: Wcid #%d \n", Wcid));
 }
 
 BOOLEAN AsicSendCommandToMcu(
@@ -7356,7 +7554,6 @@ BOOLEAN AsicSendCommandToMcu(
 			break;
 
 		RTMPusecDelay(2);
-		DBGPRINT(RT_DEBUG_INFO, ("AsicSendCommandToMcu::Mail box is busy\n"));
 	} while(i++ < 100);
 
 	if (i >= 100)
@@ -7417,8 +7614,6 @@ BOOLEAN AsicSendCommandToMcu(
 
 	if (Command != 0x80)
 	{
-		DBGPRINT(RT_DEBUG_INFO, ("SW interrupt MCU (cmd=0x%02x, token=0x%02x, arg1,arg0=0x%02x,0x%02x)\n",
-			H2MCmd.field.HostCommand, Token, Arg1, Arg0));
 	}
 	
 	return TRUE;
@@ -7533,6 +7728,7 @@ VOID	RTMPCheckRates(
 }
 
 #ifdef CONFIG_STA_SUPPORT
+#ifdef DOT11_N_SUPPORT
 BOOLEAN RTMPCheckChannel(
 	IN PRTMP_ADAPTER pAd,
 	IN UCHAR		CentralChannel,
@@ -7561,12 +7757,10 @@ BOOLEAN RTMPCheckChannel(
 	{
 		if (pAd->ChannelList[k].Channel == UpperChannel)
 		{
-			DBGPRINT(RT_DEBUG_INFO,("UpperChannel=%d  is in Channel List[%d]\n", UpperChannel, k ));
 			NoEffectChannelinList ++;
 		}
 		if (pAd->ChannelList[k].Channel == LowerChannel)
 		{
-			DBGPRINT(RT_DEBUG_INFO,("LowerChannel=%d  is in Channel List[%d]\n", LowerChannel, k ));
 			NoEffectChannelinList ++;
 		}
 	}
@@ -7595,10 +7789,10 @@ BOOLEAN RTMPCheckChannel(
 	========================================================================
 */
 BOOLEAN 	RTMPCheckHt(
-	IN		PRTMP_ADAPTER	pAd,
-	IN		UCHAR	Wcid,
-	IN OUT	HT_CAPABILITY_IE			*pHtCapability,
-	IN OUT	ADD_HT_INFO_IE			*pAddHtInfo)
+	IN	PRTMP_ADAPTER			pAd,
+	IN	UCHAR					Wcid,
+	IN 	HT_CAPABILITY_IE		*pHtCapability,
+	IN 	ADD_HT_INFO_IE			*pAddHtInfo)
 {
 	if (Wcid >= MAX_LEN_OF_MAC_TABLE)
 		return FALSE;
@@ -7649,18 +7843,7 @@ BOOLEAN 	RTMPCheckHt(
 			break;
 	}	
 
-	// choose smaller setting
-	if (pAd->CommonCfg.PhyMode == PHY_11ABGN_MIXED)
-	{
-		if (pAd->CommonCfg.Channel > 14)
-			pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth = pAddHtInfo->AddHtInfo.RecomWidth & pAd->CommonCfg.DesiredHtPhy.ChannelWidth & !pAd->NicConfig2.field.BW40MAvailForA;
-		else
-			pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth = pAddHtInfo->AddHtInfo.RecomWidth & pAd->CommonCfg.DesiredHtPhy.ChannelWidth & !pAd->NicConfig2.field.BW40MAvailForG;
-	}
-	else
-	{
 	pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth = pAddHtInfo->AddHtInfo.RecomWidth & pAd->CommonCfg.DesiredHtPhy.ChannelWidth;
-	}
 		
     DBGPRINT(RT_DEBUG_TRACE, ("RTMPCheckHt:: HtCapInfo.ChannelWidth=%d, RecomWidth=%d, DesiredHtPhy.ChannelWidth=%d, BW40MAvailForA/G=%d/%d, PhyMode=%d \n",
 		pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth, pAddHtInfo->AddHtInfo.RecomWidth, pAd->CommonCfg.DesiredHtPhy.ChannelWidth,
@@ -7691,33 +7874,9 @@ BOOLEAN 	RTMPCheckHt(
 	COPY_AP_HTSETTINGS_FROM_BEACON(pAd, pHtCapability);
 	return TRUE;
 }
+#endif // DOT11_N_SUPPORT //
 #endif // CONFIG_STA_SUPPORT //
 
-
-BOOLEAN		RTMPCheckAddHtInfoIe(
-	IN		PRTMP_ADAPTER	pAd,
-	IN OUT	ADD_HT_INFO_IE	*pAddHTInfo)
-{
-	INT		i; //, j;
-	ADD_HTINFO		TempAddHTInfo;
-
-	RTMPMoveMemory(&TempAddHTInfo, pAddHTInfo, SIZE_ADD_HT_INFO_IE);
-	RTMPZeroMemory(pAddHTInfo, SIZE_ADD_HT_INFO_IE);
-
-	// basic MCS that should be supported for this BSSID.
-	for ( i=0 ; i< 16 ; i++)
-	{
-		if ((pAddHTInfo->MCSSet[i] & pAd->CommonCfg.HtCapability.MCSSet[i]) != pAddHTInfo->MCSSet[i] )
-		return	FALSE;
-	}
-
-	// Check Controlled access for PSMP only. rt2860 not suppor PSMP yet.
-	if (pAddHTInfo->AddHtInfo.S_PSMPSup == 1)
-		return	FALSE;
-
-	return	TRUE;
-}
-
 /*
 	========================================================================
 
@@ -7739,7 +7898,7 @@ VOID RTMPUpdateMlmeRate(
 {
 	UCHAR	MinimumRate;
 	UCHAR	ProperMlmeRate; //= RATE_54;
-	UCHAR	i, j, RateIdx = 12; // 1, 2, 5.5, 11, 6, 9, 12, 18, 24, 36, 48, 54
+	UCHAR	i, j, RateIdx = 12; //1, 2, 5.5, 11, 6, 9, 12, 18, 24, 36, 48, 54
 	BOOLEAN	bMatch = FALSE;
 
 	switch (pAd->CommonCfg.PhyMode) 
@@ -7749,8 +7908,10 @@ VOID RTMPUpdateMlmeRate(
 			MinimumRate = RATE_1;
 			break;
 		case PHY_11BG_MIXED:
+#ifdef DOT11_N_SUPPORT
 		case PHY_11ABGN_MIXED:
 		case PHY_11BGN_MIXED:
+#endif // DOT11_N_SUPPORT //
 			if ((pAd->MlmeAux.SupRateLen == 4) &&
 				(pAd->MlmeAux.ExtRateLen == 0))
 				// B only AP
@@ -7764,10 +7925,13 @@ VOID RTMPUpdateMlmeRate(
 				MinimumRate = RATE_6;
 			break;
 		case PHY_11A:
+#ifdef DOT11_N_SUPPORT
 		case PHY_11N_2_4G:	// rt2860 need to check mlmerate for 802.11n
 		case PHY_11GN_MIXED:
 		case PHY_11AGN_MIXED:
+		case PHY_11AN_MIXED:
 		case PHY_11N_5G:	
+#endif // DOT11_N_SUPPORT //
 			ProperMlmeRate = RATE_24;
 			MinimumRate = RATE_6;
 			break;
@@ -7916,8 +8080,6 @@ VOID AsicEvaluateRxAnt(
 	}
 #endif // CONFIG_STA_SUPPORT //
 
-	DBGPRINT(RT_DEBUG_INFO, ("AsicEvaluateRxAnt : RealRxPath=%d \n", pAd->Mlme.RealRxPath));
-	
 	RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BBPR3);
 	BBPR3 &= (~0x18);
 	if(pAd->Antenna.field.RxPath == 3)
@@ -7939,7 +8101,8 @@ VOID AsicEvaluateRxAnt(
     	pAd->StaCfg.BBPR3 = BBPR3;
 #endif // RT2860 //
 #endif // CONFIG_STA_SUPPORT //
-	if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))
+	if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)
+		)
 	{
 		ULONG	TxTotalCnt = pAd->RalinkCounters.OneSecTxNoRetryOkCount + 
 								pAd->RalinkCounters.OneSecTxRetryOkCount + 
@@ -8051,8 +8214,6 @@ VOID AsicRxAntEvalTimeout(
 #ifdef RT2860    
     pAd->StaCfg.BBPR3 = BBPR3;
 #endif // RT2860 //
-		DBGPRINT(RT_DEBUG_INFO, ("AsicRxAntEvalTimeout : RealRxPath=%d, AvgRssi=%d, AvgRssi2=%d, AvgRssi3=%d \n",
-			pAd->Mlme.RealRxPath, rssi0, rssi1, rssi2));
 	}
 
 #endif // CONFIG_STA_SUPPORT //
@@ -8097,6 +8258,7 @@ VOID RTMPSetPiggyBack(
 	TX_LINK_CFG_STRUC  TxLinkCfg;
     
 	RTMP_IO_READ32(pAd, TX_LINK_CFG, &TxLinkCfg.word);
+
 	TxLinkCfg.field.TxCFAckEn = bPiggyBack;
 	RTMP_IO_WRITE32(pAd, TX_LINK_CFG, TxLinkCfg.word);
 }
@@ -8133,9 +8295,16 @@ BOOLEAN RTMPCheckEntryEnableAutoRateSwitch(
 		}
 		else
 			result = FALSE;
+
+#ifdef QOS_DLS_SUPPORT
+		if (pEntry && (pEntry->ValidAsDls))
+			result = pAd->StaCfg.bAutoTxRateSwitch;
+#endif // QOS_DLS_SUPPORT //
 	}
 #endif // CONFIG_STA_SUPPORT //
 
+
+
 	return result;
 }
 
@@ -8267,7 +8436,8 @@ VOID AsicStaBbpTuning(
 		return;
 
 	if ((pAd->OpMode == OPMODE_STA) 
-		&& (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))
+		&& (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)
+			)
 		&& !(OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))
 #ifdef RT2860		
 		&& (pAd->bPCIclkOff == FALSE)
@@ -8284,20 +8454,22 @@ VOID AsicStaBbpTuning(
 	
 		if (pAd->LatchRfRegs.Channel <= 14)
 		{	//BG band
-			if (Rssi > RSSI_FOR_MID_LOW_SENSIBILITY)
 			{
-				R66 = (0x2E + GET_LNA_GAIN(pAd)) + 0x10;
-				if (OrigR66Value != R66)
+				if (Rssi > RSSI_FOR_MID_LOW_SENSIBILITY)
 				{
-					RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, R66);
+					R66 = (0x2E + GET_LNA_GAIN(pAd)) + 0x10;
+					if (OrigR66Value != R66)
+					{
+						RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, R66);
+					}
 				}
-			}
-			else
-			{
-				R66 = 0x2E + GET_LNA_GAIN(pAd);
-				if (OrigR66Value != R66)
+				else
 				{
-					RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, R66);
+					R66 = 0x2E + GET_LNA_GAIN(pAd);
+					if (OrigR66Value != R66)
+					{
+						RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, R66);
+					}
 				}
 			}
 		}
@@ -8343,11 +8515,7 @@ VOID AsicStaBbpTuning(
 			}
 		}
 
-		if (pAd->Mlme.OneSecPeriodicRound % 4 == 0)
-		{
-			DBGPRINT(RT_DEBUG_INFO, ("RSSI=%d, CCA=%d, BW=%d, LNA_GAIN=0x%x, fixed R66 at 0x%x\n", 
-				Rssi, pAd->RalinkCounters.OneSecFalseCCACnt, pAd->CommonCfg.BBPCurrentBW, GET_LNA_GAIN(pAd), R66));
-		}
+		
 	}
 }
 #endif // CONFIG_STA_SUPPORT //
@@ -8370,14 +8538,15 @@ VOID RTMPSetAGCInitValue(
 			R66 = (UCHAR)(0x32 + (GET_LNA_GAIN(pAd)*5)/3);
 			RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, R66);
 		}
+#ifdef DOT11_N_SUPPORT
 		else
 		{
 			R66 = (UCHAR)(0x3A + (GET_LNA_GAIN(pAd)*5)/3);
 			RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, R66);
 		}
+#endif // DOT11_N_SUPPORT //
 	}
 
-	DBGPRINT(RT_DEBUG_INFO, ("RTMPSetAGCInitValue - Ch=%d, BandWidth=%d, LNA_GAIN=0x%x, set R66 as 0x%x \n", pAd->LatchRfRegs.Channel, BandWidth, GET_LNA_GAIN(pAd), R66));
 }
 
 VOID AsicTurnOffRFClk(
diff --git a/rt2860-1.7.0.0/common/netif_block.c b/rt2860-source-1.8.0.0/common/netif_block.c
similarity index 100%
copy from rt2860-1.7.0.0/common/netif_block.c
copy to rt2860-source-1.8.0.0/common/netif_block.c
diff --git a/rt2860-1.7.0.0/common/rt2860.bin b/rt2860-source-1.8.0.0/common/rt2860.bin
similarity index 100%
copy from rt2860-1.7.0.0/common/rt2860.bin
copy to rt2860-source-1.8.0.0/common/rt2860.bin
diff --git a/rt2860-1.7.0.0/common/rtmp_init.c b/rt2860-source-1.8.0.0/common/rtmp_init.c
similarity index 93%
copy from rt2860-1.7.0.0/common/rtmp_init.c
copy to rt2860-source-1.8.0.0/common/rtmp_init.c
index e387c91..db9b9d8 100644
--- a/rt2860-1.7.0.0/common/rtmp_init.c
+++ b/rt2860-source-1.8.0.0/common/rtmp_init.c
@@ -106,10 +106,10 @@ unsigned char BitReverse(unsigned char x)
 //
 // BBP register initialization set
 //
-BBP_REG_PAIR   BBPRegTable[] = {
+REG_PAIR   BBPRegTable[] = {
 	{BBP_R65,		0x2C},		// fix rssi issue
 	{BBP_R66,		0x38},	// Also set this default value to pAd->BbpTuning.R66CurrentValue at initial
- 	{BBP_R69,		0x12},
+	{BBP_R69,		0x12},
 	{BBP_R70,		0xa},	// BBP_R70 will change to 0x8 in ApStartUp and LinkUp for rt2860C, otherwise value is 0xa
 	{BBP_R73,		0x10},
 	{BBP_R81,		0x37},
@@ -122,7 +122,11 @@ BBP_REG_PAIR   BBPRegTable[] = {
 	{BBP_R103,  	0x00}, 	// near range high-power issue, requested from Gary @2008-0528
 	{BBP_R105,		0x05},	// 0x05 is for rt2860E to turn on FEQ control. It is safe for rt2860D and before, because Bit 7:2 are reserved in rt2860D and before.
 };
-#define	NUM_BBP_REG_PARMS	(sizeof(BBPRegTable) / sizeof(BBP_REG_PAIR))
+#define	NUM_BBP_REG_PARMS	(sizeof(BBPRegTable) / sizeof(REG_PAIR))
+
+//
+// RF register initialization set
+//
 
 //
 // ASIC register initialization sets
@@ -164,7 +168,7 @@ RTMP_REG_PAIR	MACRegTable[] =	{
 	{TXOP_CTRL_CFG,			0x0000583f, /*0x0000243f*/ /*0x000024bf*/},	//Extension channel backoff.
 	{TX_RTS_CFG,			0x00092b20},	
 	{EXP_ACK_TIME,			0x002400ca},	// default value
- 	{TXOP_HLDR_ET, 			0x00000002},
+	{TXOP_HLDR_ET, 			0x00000002},
 
 	/* Jerry comments 2008/01/16: we use SIFS = 10us in CCK defaultly, but it seems that 10us
 		is too small for INTEL 2200bg card, so in MBSS mode, the delta time between beacon0
@@ -189,9 +193,14 @@ RTMP_REG_PAIR	STAMACRegTable[] =	{
 #endif // CONFIG_STA_SUPPORT //
 
 
+// New 8k byte firmware size for RT3071/RT3072
+#define FIRMWAREIMAGE_MAX_LENGTH	0x2000
 #define FIRMWAREIMAGE_LENGTH		(sizeof (FirmwareImage) / sizeof(UCHAR))
 #define FIRMWARE_MAJOR_VERSION	0
 
+#define FIRMWAREIMAGEV1_LENGTH	0x1000
+#define FIRMWAREIMAGEV2_LENGTH	0x1000
+
 #ifdef RT2860
 #define FIRMWARE_MINOR_VERSION	2
 #endif // RT2860 //
@@ -231,7 +240,7 @@ NDIS_STATUS	RTMPAllocAdapterBlock(
 
 	do
 	{
-		// Allocate RTMP_ADAPTER memory block 
+		// Allocate RTMP_ADAPTER memory block
 		pBeaconBuf = kmalloc(MAX_BEACON_SIZE, MEM_ALLOC_FLAG);
 		if (pBeaconBuf == NULL)
 		{
@@ -247,13 +256,13 @@ NDIS_STATUS	RTMPAllocAdapterBlock(
 			break;
 		}
 		pAd->BeaconBuf = pBeaconBuf;
-		printk("\n\n=== pAd = %p, size = %d ===\n\n", pAd, (UINT32)sizeof(RTMP_ADAPTER)); 
-
+		printk("\n\n=== pAd = %p, size = %d ===\n\n", pAd, (UINT32)sizeof(RTMP_ADAPTER));
 
+		
 		// Init spin locks
 		NdisAllocateSpinLock(&pAd->MgmtRingLock);
 #ifdef RT2860
- 		NdisAllocateSpinLock(&pAd->RxRingLock);
+		NdisAllocateSpinLock(&pAd->RxRingLock);
 #endif // RT2860 //
 
 		for (index =0 ; index < NUM_OF_TX_RING; index++)
@@ -307,7 +316,7 @@ VOID	RTMPReadTxPwrPerRate(
 	// Get power delta for 20MHz and 40MHz.
 	//
 	DBGPRINT(RT_DEBUG_TRACE, ("Txpower per Rate\n"));
-	value2 = RTMP_EEPROM_READ16(pAd, EEPROM_TXPOWER_DELTA);
+	RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_DELTA, value2);
 	Apwrdelta = 0;
 	Gpwrdelta = 0;
 
@@ -338,7 +347,7 @@ VOID	RTMPReadTxPwrPerRate(
 	//
 	for (i=0; i<5; i++)
 	{
-		value = RTMP_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_20MHZ_2_4G + i*4);
+		RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_20MHZ_2_4G + i*4, value);
 		data = value;
 		if (bApwrdeltaMinus == FALSE)
 		{
@@ -411,7 +420,7 @@ VOID	RTMPReadTxPwrPerRate(
 		}				
 		Gdata = t1 + (t2<<4) + (t3<<8) + (t4<<12);
 		
-		value = RTMP_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_20MHZ_2_4G + i*4 + 2);
+		RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_20MHZ_2_4G + i*4 + 2, value);
 		if (bApwrdeltaMinus == FALSE)
 		{
 			t1 = (value&0xf)+(Apwrdelta);
@@ -498,7 +507,7 @@ VOID	RTMPReadTxPwrPerRate(
 	bValid = TRUE;
 	for (i=0; i<6; i++)
 	{
-		value = RTMP_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_40MHZ_2_4G + 2 + i*2);
+		RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_40MHZ_2_4G + 2 + i*2, value);
 		if (((value & 0x00FF) == 0x00FF) || ((value & 0xFF00) == 0xFF00))
 		{
 			bValid = FALSE;
@@ -513,7 +522,7 @@ VOID	RTMPReadTxPwrPerRate(
 	{
 		for (i=0; i<4; i++)
 		{
-			value = RTMP_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_40MHZ_2_4G + i*4);
+			RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_40MHZ_2_4G + i*4, value);
 			if (bGpwrdeltaMinus == FALSE)
 			{
 				t1 = (value&0xf)+(Gpwrdelta);
@@ -550,7 +559,7 @@ VOID	RTMPReadTxPwrPerRate(
 			}				
 			Gdata = t1 + (t2<<4) + (t3<<8) + (t4<<12);
 
-			value = RTMP_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_40MHZ_2_4G + i*4 + 2);
+			RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_40MHZ_2_4G + i*4 + 2, value);
 			if (bGpwrdeltaMinus == FALSE)
 			{
 				t1 = (value&0xf)+(Gpwrdelta);
@@ -602,7 +611,7 @@ VOID	RTMPReadTxPwrPerRate(
 	bValid = TRUE;
 	for (i=0; i<8; i++)
 	{
-		value = RTMP_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_20MHZ_5G + 2 + i*2);
+		RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_20MHZ_5G + 2 + i*2, value);
 		if (((value & 0x00FF) == 0x00FF) || ((value & 0xFF00) == 0xFF00))
 		{
 			bValid = FALSE;
@@ -617,7 +626,7 @@ VOID	RTMPReadTxPwrPerRate(
 	{
 		for (i=0; i<5; i++)
 		{
-			value = RTMP_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_20MHZ_5G + i*4);
+			RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_20MHZ_5G + i*4, value);
 			if (bApwrdeltaMinus == FALSE)
 			{
 				t1 = (value&0xf)+(Apwrdelta);
@@ -654,7 +663,7 @@ VOID	RTMPReadTxPwrPerRate(
 			}				
 			Adata = t1 + (t2<<4) + (t3<<8) + (t4<<12);
 			
-			value = RTMP_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_20MHZ_5G + i*4 + 2);
+			RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_20MHZ_5G + i*4 + 2, value);
 			if (bApwrdeltaMinus == FALSE)
 			{
 				t1 = (value&0xf)+(Apwrdelta);
@@ -706,7 +715,7 @@ VOID	RTMPReadTxPwrPerRate(
 	bValid = TRUE;
 	for (i=0; i<6; i++)
 	{
-		value = RTMP_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_40MHZ_5G + 2 + i*2);
+		RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_40MHZ_5G + 2 + i*2, value);
 		if (((value & 0x00FF) == 0x00FF) || ((value & 0xFF00) == 0xFF00))
 		{
 			bValid = FALSE;
@@ -721,7 +730,7 @@ VOID	RTMPReadTxPwrPerRate(
 	{
 		for (i=0; i<4; i++)
 		{
-			value = RTMP_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_40MHZ_5G + i*4);
+			RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_40MHZ_5G + i*4, value);
 			if (bApwrdeltaMinus == FALSE)
 			{
 				t1 = (value&0xf)+(Apwrdelta);
@@ -758,7 +767,7 @@ VOID	RTMPReadTxPwrPerRate(
 			}				
 			Adata = t1 + (t2<<4) + (t3<<8) + (t4<<12);
 			
-			value = RTMP_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_40MHZ_5G + i*4 + 2);
+			RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_40MHZ_5G + i*4 + 2, value);
 			if (bApwrdeltaMinus == FALSE)
 			{
 				t1 = (value&0xf)+(Apwrdelta);
@@ -984,10 +993,67 @@ VOID	RTMPReadChannelPwr(
 
 	// 4. Print and Debug
 	choffset = 14 + 12 + 16 + 7;
-	for (i = 0; i < choffset; i++)
+	
+
+#if 0
+	// Init the 802.11j channel number for TX channel power
+	// 0. 20MHz 
+	for (i = 0; i < 3; i++)
+	{
+		pAd->TxPower11J[i].Channel = 8 + i * 4;
+		pAd->TxPower11J[i].BW = BW_20;
+	}
+	
+	for (i = 0; i < 4; i++)
+	{
+		pAd->TxPower11J[i + 3].Channel = 34 + i * 4;
+		pAd->TxPower11J[i + 3].BW = BW_20;
+	}
+
+	for (i = 0; i < 4; i++)
 	{
-		DBGPRINT(RT_DEBUG_INFO, ("E2PROM: TxPower[%03d], Channel = %d, Power = %d, Power2 = %d\n", i, pAd->TxPower[i].Channel, pAd->TxPower[i].Power, pAd->TxPower[i].Power2 ));
+		pAd->TxPower11J[i + 7].Channel = 184 + i * 4;
+		pAd->TxPower11J[i + 7].BW = BW_20;
 	}
+
+	// 0. 10MHz 
+	for (i = 0; i < 2; i++)
+	{
+		pAd->TxPower11J[i + 11].Channel = 7 + i;
+		pAd->TxPower11J[i + 11].BW = BW_10;
+	}
+	pAd->TxPower11J[13].Channel = 11;
+	pAd->TxPower11J[13].BW = BW_10;
+	
+	for (i = 0; i < 3; i++)
+	{
+		pAd->TxPower11J[i + 14].Channel = 183 + i;
+		pAd->TxPower11J[i + 14].BW= BW_10;
+	}
+
+	for (i = 0; i < 3; i++)
+	{
+		pAd->TxPower11J[i + 17].Channel = 187 + i;
+		pAd->TxPower11J[i + 17].BW = BW_10;
+	}
+	for (i = 0; i < 10; i++)
+	{
+		Power.word = RTMP_EEPROM_READ16(pAd, EEPROM_Japan_TX_PWR_OFFSET + i * 2);
+		Power2.word = RTMP_EEPROM_READ16(pAd, EEPROM_Japan_TX2_PWR_OFFSET + i * 2);
+
+		if ((Power.field.Byte0 < 36) && (Power.field.Byte0 > -6))
+			pAd->TxPower11J[i * 2].Power = Power.field.Byte0;
+
+		if ((Power.field.Byte1 < 36) && (Power.field.Byte1 > -6))
+			pAd->TxPower11J[i * 2 + 1].Power = Power.field.Byte1;			
+
+		if ((Power2.field.Byte0 < 36) && (Power2.field.Byte0 > -6))
+			pAd->TxPower11J[i * 2].Power2 = Power2.field.Byte0;
+
+		if ((Power2.field.Byte1 < 36) && (Power2.field.Byte1 > -6))
+			pAd->TxPower11J[i * 2 + 1].Power2 = Power2.field.Byte1;			
+	}
+#endif
 }
 
 /*
@@ -1024,6 +1090,8 @@ NDIS_STATUS	NICReadRegParameters(
 }
 
 
+
+
 /*
 	========================================================================
 	
@@ -1154,6 +1222,23 @@ VOID	NICReadEEPROMParameters(
 	if (Version.field.Version > VALID_EEPROM_VERSION)
 	{
 		DBGPRINT_ERR(("E2PROM: WRONG VERSION 0x%x, should be %d\n",Version.field.Version, VALID_EEPROM_VERSION));
+		/*pAd->SystemErrorBitmap |= 0x00000001;
+
+		// hard-code default value when no proper E2PROM installed
+		pAd->bAutoTxAgcA = FALSE;
+		pAd->bAutoTxAgcG = FALSE;
+
+		// Default the channel power
+		for (i = 0; i < MAX_NUM_OF_CHANNELS; i++)
+			pAd->TxPower[i].Power = DEFAULT_RF_TX_POWER;
+
+		// Default the channel power
+		for (i = 0; i < MAX_NUM_OF_11JCHANNELS; i++)
+			pAd->TxPower11J[i].Power = DEFAULT_RF_TX_POWER;
+		
+		for(i = 0; i < NUM_EEPROM_BBP_PARMS; i++)
+			pAd->EEPROMDefaultValue[i] = 0xffff;
+		return;  */
 	}
 
 	// Read BBP default value from EEPROM and store to array(EEPROMDefaultValue) in pAd
@@ -1212,6 +1297,7 @@ VOID	NICReadEEPROMParameters(
 	NicConfig2.word = pAd->EEPROMDefaultValue[1];
 
 
+
 #ifdef CONFIG_STA_SUPPORT
 	IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
 	{
@@ -1240,15 +1326,20 @@ VOID	NICReadEEPROMParameters(
 
 	//
 	// Reset PhyMode if we don't support 802.11a
+	// Only RFIC_2850 & RFIC_2750 support 802.11a
 	//
-	if ((pAd->CommonCfg.PhyMode == PHY_11ABG_MIXED) || (pAd->CommonCfg.PhyMode == PHY_11ABGN_MIXED) ||
-		(pAd->CommonCfg.PhyMode == PHY_11A) || (pAd->CommonCfg.PhyMode == PHY_11AN_MIXED) || (pAd->CommonCfg.PhyMode == PHY_11AGN_MIXED))
-	{
-		//
-		// Only RFIC_2850 & RFIC_2750 support 802.11a
-		//
-		if ((Antenna.field.RfIcType != RFIC_2850) && (Antenna.field.RfIcType != RFIC_2750))
+	if ((Antenna.field.RfIcType != RFIC_2850) && (Antenna.field.RfIcType != RFIC_2750))
+	{
+		if ((pAd->CommonCfg.PhyMode == PHY_11ABG_MIXED) || 
+			(pAd->CommonCfg.PhyMode == PHY_11A))
+			pAd->CommonCfg.PhyMode = PHY_11BG_MIXED;
+#ifdef DOT11_N_SUPPORT
+		else if ((pAd->CommonCfg.PhyMode == PHY_11ABGN_MIXED)	|| 
+				 (pAd->CommonCfg.PhyMode == PHY_11AN_MIXED) 	|| 
+				 (pAd->CommonCfg.PhyMode == PHY_11AGN_MIXED) 	||
+				 (pAd->CommonCfg.PhyMode == PHY_11N_5G))
 			pAd->CommonCfg.PhyMode = PHY_11BGN_MIXED;
+#endif // DOT11_N_SUPPORT //
 	}
 	
 	// Read TSSI reference and TSSI boundary for temperature compensation. This is ugly
@@ -1339,7 +1430,9 @@ VOID	NICReadEEPROMParameters(
 		TmpPhy = pAd->CommonCfg.PhyMode;
 		pAd->CommonCfg.PhyMode = 0xff;
 		RTMPSetPhyMode(pAd, TmpPhy);
+#ifdef DOT11_N_SUPPORT
 		SetCommonHT(pAd);
+#endif // DOT11_N_SUPPORT //
 	}
 
 	//
@@ -1405,6 +1498,12 @@ VOID	NICReadEEPROMParameters(
 	pAd->Led3 = value;
 		
 	RTMPReadTxPwrPerRate(pAd);	
+
+#ifdef SINGLE_SKU
+	//pAd->CommonCfg.DefineMaxTxPwr = RTMP_EEPROM_READ16(pAd, EEPROM_DEFINE_MAX_TXPWR);
+	RT28xx_EEPROM_READ16(pAd, EEPROM_DEFINE_MAX_TXPWR, pAd->CommonCfg.DefineMaxTxPwr);
+#endif // SINGLE_SKU //
+
 	DBGPRINT(RT_DEBUG_TRACE, ("<-- NICReadEEPROMParameters\n"));
 }
 
@@ -1458,22 +1557,6 @@ VOID	NICInitAsicFromEEPROM(
 	NicConfig2.word = pAd->EEPROMDefaultValue[1];
 
 
-#ifdef CONFIG_STA_SUPPORT
-	IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
-	{
-		NicConfig2.word = 0;
-		if ((NicConfig2.word & 0x00ff) == 0xff)
-		{
-			NicConfig2.word &= 0xff00;
-		}
-
-		if ((NicConfig2.word >> 8) == 0xff)
-		{
-			NicConfig2.word &= 0x00ff;
-		}
-	}
-#endif // CONFIG_STA_SUPPORT //
-	
 	// Save the antenna for future use
 	pAd->NicConfig2.word = NicConfig2.word;
 
@@ -1685,13 +1768,12 @@ retry:
 
 	// Write AC_VO base address register
 	Value = RTMP_GetPhysicalAddressLow(pAd->TxRing[QID_AC_VO].Cell[0].AllocPa);	
-
 	RTMP_IO_WRITE32(pAd, TX_BASE_PTR3, Value);
 	DBGPRINT(RT_DEBUG_TRACE, ("--> TX_BASE_PTR3 : 0x%x\n", Value));
 
 	// Write HCCA base address register
-	Value = RTMP_GetPhysicalAddressLow(pAd->TxRing[QID_HCCA].Cell[0].AllocPa);
-	RTMP_IO_WRITE32(pAd, TX_BASE_PTR4, Value);
+	  Value = RTMP_GetPhysicalAddressLow(pAd->TxRing[QID_HCCA].Cell[0].AllocPa);
+	  RTMP_IO_WRITE32(pAd, TX_BASE_PTR4, Value);
 	DBGPRINT(RT_DEBUG_TRACE, ("--> TX_BASE_PTR4 : 0x%x\n", Value));
 
 	// Write MGMT_BASE_CSR register
@@ -1891,13 +1973,14 @@ NDIS_STATUS	NICInitializeAsic(
 	if ((pAd->MACVersion&0xffff) != 0x0101)
 		RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R84, 0x19);
 
+
 	if (pAd->MACVersion == 0x28600100)
 	{
 		RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x16);
 		RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x12);
     }
 	
-	if (pAd->MACVersion >= RALINK_2880E_VERSION) // 3*3
+	if (pAd->MACVersion >= RALINK_2880E_VERSION && pAd->MACVersion < RALINK_3070_VERSION) // 3*3
 	{
 		// enlarge MAX_LEN_CFG
 		UINT32 csr;
@@ -1938,14 +2021,15 @@ NDIS_STATUS	NICInitializeAsic(
 		{
 			RTMP_IO_WRITE32(pAd, SHARED_KEY_MODE_BASE + 4*KeyIdx, 0);
 		}
-	}
 
-	// Clear all pairwise key table when initial
-	for (KeyIdx = 0; KeyIdx < 256; KeyIdx++)
-	{
-		RTMP_IO_WRITE32(pAd, MAC_WCID_ATTRIBUTE_BASE + (KeyIdx * HW_WCID_ATTRI_SIZE), 1);
+		// Clear all pairwise key table when initial
+		for (KeyIdx = 0; KeyIdx < 256; KeyIdx++)
+		{
+			RTMP_IO_WRITE32(pAd, MAC_WCID_ATTRIBUTE_BASE + (KeyIdx * HW_WCID_ATTRI_SIZE), 1);
+		}
 	}
-	 
+	
+
 	// It isn't necessary to clear this space when not hard reset. 	
 	if (bHardReset == TRUE)
 	{
@@ -1994,7 +2078,7 @@ VOID	NICIssueReset(
 {
 	UINT32	Value = 0;
 	DBGPRINT(RT_DEBUG_TRACE, ("--> NICIssueReset\n"));
-	
+
 	// Disable Rx, register value supposed will remain after reset
 	RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);
 	Value &= (0xfffffff3);
@@ -2051,7 +2135,7 @@ VOID NICUpdateFifoStaCounters(
 
 			if (StaFifo.field.bValid == 0)
 				break;
-		
+
 			wcid = (UCHAR)StaFifo.field.wcid;
 
 
@@ -2069,33 +2153,59 @@ VOID NICUpdateFifoStaCounters(
 
 			pEntry->DebugFIFOCount++;
 
+#ifdef DOT11_N_SUPPORT
 			if (StaFifo.field.TxBF) // 3*3
 				pEntry->TxBFCount++;
+#endif // DOT11_N_SUPPORT //
+
+#ifdef UAPSD_AP_SUPPORT
+			UAPSD_SP_AUE_Handle(pAd, pEntry, StaFifo.field.TxSuccess);
+#endif // UAPSD_AP_SUPPORT //
+ 
 			if (!StaFifo.field.TxSuccess)
 			{
 				pEntry->FIFOCount++;
 				pEntry->OneSecTxFailCount++;
+									
 				if (pEntry->FIFOCount >= 1)
 				{			
 					DBGPRINT(RT_DEBUG_TRACE, ("#"));
- 					if(pEntry->PsMode == PWR_ACTIVE)
+#if 0
+					SendRefreshBAR(pAd, pEntry);
+					pEntry->NoBADataCountDown = 64;
+#else
+#ifdef DOT11_N_SUPPORT
+					pEntry->NoBADataCountDown = 64;
+#endif // DOT11_N_SUPPORT //
+
+					if(pEntry->PsMode == PWR_ACTIVE)
 					{
+#ifdef DOT11_N_SUPPORT					
 						int tid;
-						for (tid=0; tid<8; tid++)
+						for (tid=0; tid<NUM_OF_TID; tid++)
 						{
 							BAOriSessionTearDown(pAd, pEntry->Aid,  tid, FALSE, FALSE);
 						}
+#endif // DOT11_N_SUPPORT //
+
+						// Update the continuous transmission counter except PS mode
+						pEntry->ContinueTxFailCnt++;
 					}
 					else
 					{    
 						// Clear the FIFOCount when sta in Power Save mode. Basically we assume 
 						//     this tx error happened due to sta just go to sleep.
 						pEntry->FIFOCount = 0;
+						pEntry->ContinueTxFailCnt = 0;
 					}
+#endif
+					//pEntry->FIFOCount = 0;
 				}
+				//pEntry->bSendBAR = TRUE;
 			}
 			else
 			{
+#ifdef DOT11_N_SUPPORT
 				if ((pEntry->PsMode != PWR_SAVE) && (pEntry->NoBADataCountDown > 0))
 				{
 					pEntry->NoBADataCountDown--;
@@ -2104,10 +2214,12 @@ VOID NICUpdateFifoStaCounters(
 						DBGPRINT(RT_DEBUG_TRACE, ("@\n"));
 					}
 				}
+#endif // DOT11_N_SUPPORT //
 				pEntry->FIFOCount = 0;
 				pEntry->OneSecTxNoRetryOkCount++;
 				// update NoDataIdleCount when sucessful send packet to STA.
 				pEntry->NoDataIdleCount = 0;
+				pEntry->ContinueTxFailCnt = 0;
 			}
 
 			succMCS = StaFifo.field.SuccessRate & 0x7F;
@@ -2139,12 +2251,7 @@ VOID NICUpdateFifoStaCounters(
 				} 
 				pEntry->OneSecTxRetryOkCount += reTry;
 			}
-			else if (reTry < 0)
-			{
-				DBGPRINT(RT_DEBUG_INFO, ("(%d): reTry %d , (TxMCS = %d, SuccessRate = %d)\n", 
-				wcid, reTry, pid, StaFifo.field.SuccessRate & 0x7F));
-			}
-
+			
 			i++;
 			// ASIC store 16 stack
 		} while ( i < (2*TX_RING_SIZE) );
@@ -2220,20 +2327,20 @@ VOID NICUpdateRawCounters(
 	
 	if (!pAd->bUpdateBcnCntDone)
 	{
-		// Update BEACON sent count
-		RTMP_IO_READ32(pAd, TX_STA_CNT0, &TxStaCnt0.word);
-		RTMP_IO_READ32(pAd, TX_STA_CNT1, &StaTx1.word);
-		RTMP_IO_READ32(pAd, TX_STA_CNT2, &StaTx2.word);
-		pAd->RalinkCounters.OneSecBeaconSentCnt += TxStaCnt0.field.TxBeaconCount;
-		pAd->RalinkCounters.OneSecTxRetryOkCount += StaTx1.field.TxRetransmit;
-		pAd->RalinkCounters.OneSecTxNoRetryOkCount += StaTx1.field.TxSuccess;
-		pAd->RalinkCounters.OneSecTxFailCount += TxStaCnt0.field.TxFailCount;
-		pAd->WlanCounters.TransmittedFragmentCount.u.LowPart += StaTx1.field.TxSuccess;
-		pAd->WlanCounters.RetryCount.u.LowPart += StaTx1.field.TxRetransmit;
-		pAd->WlanCounters.FailedCount.u.LowPart += TxStaCnt0.field.TxFailCount;
+	// Update BEACON sent count
+	RTMP_IO_READ32(pAd, TX_STA_CNT0, &TxStaCnt0.word);
+	RTMP_IO_READ32(pAd, TX_STA_CNT1, &StaTx1.word);
+	RTMP_IO_READ32(pAd, TX_STA_CNT2, &StaTx2.word);
+	pAd->RalinkCounters.OneSecBeaconSentCnt += TxStaCnt0.field.TxBeaconCount;
+	pAd->RalinkCounters.OneSecTxRetryOkCount += StaTx1.field.TxRetransmit;
+	pAd->RalinkCounters.OneSecTxNoRetryOkCount += StaTx1.field.TxSuccess;
+	pAd->RalinkCounters.OneSecTxFailCount += TxStaCnt0.field.TxFailCount;
+	pAd->WlanCounters.TransmittedFragmentCount.u.LowPart += StaTx1.field.TxSuccess;
+	pAd->WlanCounters.RetryCount.u.LowPart += StaTx1.field.TxRetransmit;
+	pAd->WlanCounters.FailedCount.u.LowPart += TxStaCnt0.field.TxFailCount;
 	}
 
- 	{
+	{
 		RTMP_IO_READ32(pAd, TX_AGG_CNT, &TxAggCnt.word);
 		RTMP_IO_READ32(pAd, TX_AGG_CNT0, &TxAggCnt0.word);
 		RTMP_IO_READ32(pAd, TX_AGG_CNT1, &TxAggCnt1.word);
@@ -2652,7 +2759,6 @@ NDIS_STATUS NICLoadFirmware(
 	//ULONG			firm;
 	UINT32			MacReg = 0;
 
-
 	pFirmwareImage = FirmwareImage;
 	FileLength = sizeof(FirmwareImage);
 	RT28XX_WRITE_FIRMWARE(pAd, pFirmwareImage, FileLength);
@@ -2705,10 +2811,10 @@ NDIS_STATUS NICLoadFirmware(
 */
 NDIS_STATUS NICLoadRateSwitchingParams(
 	IN PRTMP_ADAPTER pAd)
-{ 
+{
 	return NDIS_STATUS_SUCCESS;
 }
- 
+
 /*
 	========================================================================
 	
@@ -2922,14 +3028,14 @@ VOID	UserCfgInit(
 	//  part I. intialize common configuration
 	//
 
-    for(key_index=0; key_index<SHARE_KEY_NUM; key_index++)
-    {
-        for(bss_index = 0; bss_index < MAX_MBSSID_NUM; bss_index++)
-        {
-            pAd->SharedKey[bss_index][key_index].KeyLen = 0;
-            pAd->SharedKey[bss_index][key_index].CipherAlg = CIPHER_NONE;
-        } /* End of for */
-    } /* End of for */
+	for(key_index=0; key_index<SHARE_KEY_NUM; key_index++)
+	{
+		for(bss_index = 0; bss_index < MAX_MBSSID_NUM; bss_index++)
+		{
+			pAd->SharedKey[bss_index][key_index].KeyLen = 0;
+			pAd->SharedKey[bss_index][key_index].CipherAlg = CIPHER_NONE;
+		}
+	}
 
 	pAd->Antenna.word = 0; 
 	pAd->CommonCfg.BBPCurrentBW = BW_20;
@@ -2937,37 +3043,22 @@ VOID	UserCfgInit(
 	pAd->LedCntl.word = 0;
 #ifdef RT2860
 	pAd->LedIndicatorStregth = 0;
-    pAd->RLnkCtrlOffset = 0;
-    pAd->HostLnkCtrlOffset = 0;
+	pAd->RLnkCtrlOffset = 0;
+	pAd->HostLnkCtrlOffset = 0;
 #endif // RT2860 //
 
-#ifdef DOT11N_DRAFT3
-	pAd->CommonCfg.Dot11OBssScanPassiveDwell = dot11OBSSScanPassiveDwell;	// Unit : TU. 5~1000
-	pAd->CommonCfg.Dot11OBssScanActiveDwell = dot11OBSSScanActiveDwell;	// Unit : TU. 10~1000
-	pAd->CommonCfg.Dot11BssWidthTriggerScanInt = dot11BSSWidthTriggerScanInterval;	// Unit : Second	
-	pAd->CommonCfg.Dot11OBssScanPassiveTotalPerChannel = dot11OBSSScanPassiveTotalPerChannel;	// Unit : TU. 200~10000
-	pAd->CommonCfg.Dot11OBssScanActiveTotalPerChannel = dot11OBSSScanActiveTotalPerChannel;	// Unit : TU. 20~10000
-	pAd->CommonCfg.Dot11BssWidthChanTranDelayFactor = dot11BSSWidthChannelTransactionDelayFactor;
-	pAd->CommonCfg.Dot11OBssScanActivityThre = dot11BSSScanActivityThreshold;	// Unit : percentage
-
-	pAd->CommonCfg.Dot11BssWidthChanTranDelay = (pAd->CommonCfg.Dot11BssWidthTriggerScanInt * pAd->CommonCfg.Dot11BssWidthChanTranDelayFactor);
-#endif  // DOT11N_DRAFT3 //
-
 	pAd->bAutoTxAgcA = FALSE;			// Default is OFF
 	pAd->bAutoTxAgcG = FALSE;			// Default is OFF
 	pAd->RfIcType = RFIC_2820;
 
 	// Init timer for reset complete event
 	pAd->CommonCfg.CentralChannel = 1;
- 	pAd->bBroadComHT = FALSE;
-	pAd->HTCEnable = FALSE;
 	pAd->bForcePrintTX = FALSE;
 	pAd->bForcePrintRX = FALSE;
 	pAd->bStaFifoTest = FALSE;
 	pAd->bProtectionTest = FALSE;
 	pAd->bHCCATest = FALSE;
 	pAd->bGenOneHCCA = FALSE;
-	pAd->CommonCfg.bRdg = FALSE;
 	pAd->CommonCfg.Dsifs = 10;      // in units of usec 
 	pAd->CommonCfg.TxPower = 100; //mW
 	pAd->CommonCfg.TxPowerPercentage = 0xffffffff; // AUTO
@@ -2993,23 +3084,56 @@ VOID	UserCfgInit(
 	pAd->CommonCfg.TxStream = 0;
 	pAd->CommonCfg.RxStream = 0;
 
-	NdisZeroMemory(&pAd->CommonCfg.HtCapability, sizeof(pAd->CommonCfg.HtCapability));
-	NdisZeroMemory(&pAd->CommonCfg.AddHTInfo, sizeof(pAd->CommonCfg.AddHTInfo));
 	NdisZeroMemory(&pAd->BeaconTxWI, sizeof(pAd->BeaconTxWI));
 
+#ifdef DOT11_N_SUPPORT
+	NdisZeroMemory(&pAd->CommonCfg.HtCapability, sizeof(pAd->CommonCfg.HtCapability));
+	pAd->HTCEnable = FALSE;
+	pAd->bBroadComHT = FALSE;
+	pAd->CommonCfg.bRdg = FALSE;
+	
+#ifdef DOT11N_DRAFT3
+	pAd->CommonCfg.Dot11OBssScanPassiveDwell = dot11OBSSScanPassiveDwell;	// Unit : TU. 5~1000
+	pAd->CommonCfg.Dot11OBssScanActiveDwell = dot11OBSSScanActiveDwell;	// Unit : TU. 10~1000
+	pAd->CommonCfg.Dot11BssWidthTriggerScanInt = dot11BSSWidthTriggerScanInterval;	// Unit : Second	
+	pAd->CommonCfg.Dot11OBssScanPassiveTotalPerChannel = dot11OBSSScanPassiveTotalPerChannel;	// Unit : TU. 200~10000
+	pAd->CommonCfg.Dot11OBssScanActiveTotalPerChannel = dot11OBSSScanActiveTotalPerChannel;	// Unit : TU. 20~10000
+	pAd->CommonCfg.Dot11BssWidthChanTranDelayFactor = dot11BSSWidthChannelTransactionDelayFactor;
+	pAd->CommonCfg.Dot11OBssScanActivityThre = dot11BSSScanActivityThreshold;	// Unit : percentage
+	pAd->CommonCfg.Dot11BssWidthChanTranDelay = (pAd->CommonCfg.Dot11BssWidthTriggerScanInt * pAd->CommonCfg.Dot11BssWidthChanTranDelayFactor);
+#endif  // DOT11N_DRAFT3 //
+
+	NdisZeroMemory(&pAd->CommonCfg.AddHTInfo, sizeof(pAd->CommonCfg.AddHTInfo));
 	pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE;
 	pAd->CommonCfg.BACapability.field.MpduDensity = 0;
 	pAd->CommonCfg.BACapability.field.Policy = IMMED_BA;
 	pAd->CommonCfg.BACapability.field.RxBAWinLimit = 64; //32;
 	pAd->CommonCfg.BACapability.field.TxBAWinLimit = 64; //32;
-	pAd->CommonCfg.TxRate = RATE_6;
 	DBGPRINT(RT_DEBUG_TRACE, ("--> UserCfgInit. BACapability = 0x%x\n", pAd->CommonCfg.BACapability.word));    
+
+	pAd->CommonCfg.BACapability.field.AutoBA = FALSE;	
+	BATableInit(pAd, &pAd->BATable);
+
+	pAd->CommonCfg.bExtChannelSwitchAnnouncement = 1;
+	pAd->CommonCfg.bHTProtect = 1;
+	pAd->CommonCfg.bMIMOPSEnable = TRUE;
+	pAd->CommonCfg.bBADecline = FALSE;
+	pAd->CommonCfg.bDisableReordering = FALSE;
+
+	pAd->CommonCfg.TxBASize = 7;
+
+	pAd->CommonCfg.REGBACapability.word = pAd->CommonCfg.BACapability.word;
+#endif // DOT11_N_SUPPORT //
+
+	//pAd->CommonCfg.HTPhyMode.field.BW = BW_20;
+	//pAd->CommonCfg.HTPhyMode.field.MCS = MCS_AUTO;
+	//pAd->CommonCfg.HTPhyMode.field.ShortGI = GI_800;
+	//pAd->CommonCfg.HTPhyMode.field.STBC = STBC_NONE;
+	pAd->CommonCfg.TxRate = RATE_6;
 	
 	pAd->CommonCfg.MlmeTransmit.field.MCS = MCS_RATE_6;
 	pAd->CommonCfg.MlmeTransmit.field.BW = BW_20;
 	pAd->CommonCfg.MlmeTransmit.field.MODE = MODE_OFDM;
-	pAd->CommonCfg.BACapability.field.AutoBA = FALSE;	
-	BATableInit(pAd, &pAd->BATable);
 
 	pAd->CommonCfg.BeaconPeriod = 100;     // in mSec
 
@@ -3024,7 +3148,7 @@ VOID	UserCfgInit(
 		RX_FILTER_SET_FLAG(pAd, fRX_FILTER_ACCEPT_BROADCAST);
 		RX_FILTER_SET_FLAG(pAd, fRX_FILTER_ACCEPT_ALL_MULTICAST);
 
-		pAd->StaCfg.Psm = PWR_ACTIVE; 
+		pAd->StaCfg.Psm = PWR_ACTIVE;
 
 		pAd->StaCfg.OrigWepStatus = Ndis802_11EncryptionDisabled;
 		pAd->StaCfg.PairCipher = Ndis802_11EncryptionDisabled;
@@ -3033,7 +3157,7 @@ VOID	UserCfgInit(
 		pAd->StaCfg.DefaultKeyId = 0;
 
 		// 802.1x port control
-		pAd->StaCfg.PrivacyFilter = Ndis802_11PrivFilterAcceptAll;
+		pAd->StaCfg.PrivacyFilter = Ndis802_11PrivFilter8021xWEP;
 		pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;
 		pAd->StaCfg.LastMicErrorTime = 0;
 		pAd->StaCfg.MicErrCnt        = 0;
@@ -3051,7 +3175,6 @@ VOID	UserCfgInit(
 		pAd->StaCfg.bScanReqIsFromWebUI = FALSE;
 		OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_DOZE);
 		OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_WAKEUP_NOW);
-		OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_CLKSELECT_40MHZ);
 
 		pAd->StaCfg.bAutoTxRateSwitch = TRUE;
 		pAd->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO;
@@ -3078,13 +3201,9 @@ VOID	UserCfgInit(
 		pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeCAM;
 		pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeCAM;
 		pAd->StaCfg.bWindowsACCAMEnable = FALSE;
-	
-#ifdef NDIS51_MINIPORT
-		pAd->StaCfg.WindowsPowerProfile = NdisPowerProfileAcOnLine; // Ndis802_11PowerModeFast_PSP;
-#endif
 
-	// CCX v1.0 releated init value
 #ifdef LEAP_SUPPORT
+		// CCX v1.0 releated init value
 		RTMPInitTimer(pAd, &pAd->StaCfg.LeapAuthTimer, GET_TIMER_FUNCTION(LeapAuthTimeout), pAd, FALSE);
 		pAd->StaCfg.LeapAuthMode = CISCO_AuthModeLEAPNone;
 		pAd->StaCfg.bCkipOn = FALSE;
@@ -3120,12 +3239,13 @@ VOID	UserCfgInit(
 #ifdef WPA_SUPPLICANT_SUPPORT
 		pAd->StaCfg.IEEE8021X = FALSE;
 		pAd->StaCfg.IEEE8021x_required_keys = FALSE;
-		pAd->StaCfg.WpaSupplicantUP = 0;
+		pAd->StaCfg.WpaSupplicantUP = WPA_SUPPLICANT_DISABLE;
 #ifdef NATIVE_WPA_SUPPLICANT_SUPPORT
-		pAd->StaCfg.WpaSupplicantUP = 1;
+		pAd->StaCfg.WpaSupplicantUP = WPA_SUPPLICANT_ENABLE;
 #endif // NATIVE_WPA_SUPPLICANT_SUPPORT //
 #endif // WPA_SUPPLICANT_SUPPORT //
- 	}
+
+	}
 #endif // CONFIG_STA_SUPPORT //
 
 	// Default for extra information is not valid
@@ -3139,7 +3259,6 @@ VOID	UserCfgInit(
 	//
 
 
-
 	//
 	// part IV. others
 	//
@@ -3158,12 +3277,12 @@ VOID	UserCfgInit(
 
 	pAd->Bbp94 = BBPR94_DEFAULT;
 	pAd->BbpForCCK = FALSE;
-		
+	
 	// initialize MAC table and allocate spin lock
 	NdisZeroMemory(&pAd->MacTab, sizeof(MAC_TABLE));
 	InitializeQueueHeader(&pAd->MacTab.McastPsQueue);
 	NdisAllocateSpinLock(&pAd->MacTabLock);
- 
+
 #ifdef RALINK_ATE
 	NdisZeroMemory(&pAd->ate, sizeof(ATE_INFO));
 	pAd->ate.Mode = ATE_STOP;
@@ -3192,23 +3311,17 @@ VOID	UserCfgInit(
 #ifdef RALINK_28xx_QA
 	//pAd->ate.Repeat = 0;
 	pAd->ate.TxStatus = 0;
-	pAd->ate.AtePid = 0;
+	pAd->ate.AtePid = THREAD_PID_INIT_VALUE;
 #endif // RALINK_28xx_QA //
 #endif // RALINK_ATE //
 
-	pAd->CommonCfg.bExtChannelSwitchAnnouncement = 1;
-	pAd->CommonCfg.bHTProtect = 1;
-	pAd->CommonCfg.bMIMOPSEnable = TRUE;
-	pAd->CommonCfg.bBADecline = FALSE;
-	pAd->CommonCfg.bDisableReordering = FALSE;
 
-	pAd->CommonCfg.TxBASize = 7;
-
-    pAd->CommonCfg.REGBACapability.word = pAd->CommonCfg.BACapability.word;
 	pAd->CommonCfg.bWiFiTest = FALSE;
-#ifdef RT2860    
+#ifdef RT2860
     pAd->bPCIclkOff = FALSE;
 #endif // RT2860 //
+
+
 	DBGPRINT(RT_DEBUG_TRACE, ("<-- UserCfgInit\n"));
 }
 
@@ -3309,9 +3422,9 @@ VOID	RTMPInitTimer(
 	pTimer->PeriodicType = Repeat;
 	pTimer->State      = FALSE;
 	pTimer->cookie = (ULONG) pData;
- 
+
+
 	RTMP_OS_Init_Timer(pAd,	&pTimer->TimerObj,	pTimerFunc, (PVOID) pTimer);
-	
 }
 
 /*
@@ -3342,13 +3455,13 @@ VOID	RTMPSetTimer(
 		pTimer->State      = FALSE;
 		if (pTimer->PeriodicType == TRUE)
 		{
-			pTimer->Repeat = TRUE; 
+			pTimer->Repeat = TRUE;
 			RTMP_SetPeriodicTimer(&pTimer->TimerObj, Value);
 		}
 		else
 		{
 			pTimer->Repeat = FALSE;
-			RTMP_OS_Add_Timer(&pTimer->TimerObj, Value); 
+			RTMP_OS_Add_Timer(&pTimer->TimerObj, Value);
 		}
 	}
 	else
@@ -3430,8 +3543,9 @@ VOID	RTMPCancelTimer(
 	if (pTimer->Valid)
 	{
 		if (pTimer->State == FALSE)
-			pTimer->Repeat = FALSE; 
+			pTimer->Repeat = FALSE;
 			RTMP_OS_Del_Timer(&pTimer->TimerObj, pCancelled);
+			
 		if (*pCancelled == TRUE)
 			pTimer->State = TRUE;
 
@@ -3619,7 +3733,7 @@ VOID RTMPEnableRxTx(
 	IN PRTMP_ADAPTER	pAd)
 {
 	DBGPRINT(RT_DEBUG_TRACE, ("==> RTMPEnableRxTx\n"));
- 
+
 	// Enable Rx DMA.
 	RT28XXDMAEnable(pAd);
 
diff --git a/rt2860-1.7.0.0/common/rtmp_tkip.c b/rt2860-source-1.8.0.0/common/rtmp_tkip.c
similarity index 96%
copy from rt2860-1.7.0.0/common/rtmp_tkip.c
copy to rt2860-source-1.8.0.0/common/rtmp_tkip.c
index 3b8df83..42d15d6 100644
--- a/rt2860-1.7.0.0/common/rtmp_tkip.c
+++ b/rt2860-source-1.8.0.0/common/rtmp_tkip.c
@@ -552,7 +552,6 @@ BOOLEAN	RTMPTkipCompareMICValue(
 {
 	UCHAR	OldMic[8];
 	ULONG	Priority = UserPriority;
-	INT		i;
 
 	// Init MIC value calculation
 	RTMPTkipSetMICKey(&pAd->PrivateInfo.Rx, pMICKey);
@@ -577,18 +576,8 @@ BOOLEAN	RTMPTkipCompareMICValue(
 	if(!NdisEqualMemory(pAd->PrivateInfo.Rx.MIC, OldMic, 8))
 	{
 		DBGPRINT_RAW(RT_DEBUG_ERROR, ("RTMPTkipCompareMICValue(): TKIP MIC Error !\n"));  //MIC error.
-		DBGPRINT_RAW(RT_DEBUG_INFO, ("Orig MIC value ="));  //MIC error.
-		for (i = 0; i < 8; i++)
-		{
-			DBGPRINT_RAW(RT_DEBUG_INFO, ("%02x:", OldMic[i]));  //MIC error.
-		}
-		DBGPRINT_RAW(RT_DEBUG_INFO, ("\n"));  //MIC error.
-		DBGPRINT_RAW(RT_DEBUG_INFO, ("Calculated MIC value ="));  //MIC error.
-		for (i = 0; i < 8; i++)
-		{
-			DBGPRINT_RAW(RT_DEBUG_INFO, ("%02x:", pAd->PrivateInfo.Rx.MIC[i]));  //MIC error.
-		}
-		DBGPRINT_RAW(RT_DEBUG_INFO, ("\n"));  //MIC error.
+
+		
 		return (FALSE);
 	}
 	return (TRUE);
@@ -630,7 +619,6 @@ BOOLEAN	RTMPTkipCompareMICValueWithLLC(
 {
 	UCHAR	OldMic[8];
 	ULONG	Priority = 0;
-	INT		i;
 
 	// Init MIC value calculation
 	RTMPTkipSetMICKey(&pAd->PrivateInfo.Rx, pMICKey);
@@ -658,18 +646,8 @@ BOOLEAN	RTMPTkipCompareMICValueWithLLC(
 	if(!NdisEqualMemory(pAd->PrivateInfo.Rx.MIC, OldMic, 8))
 	{
 		DBGPRINT_RAW(RT_DEBUG_ERROR, ("RTMPTkipCompareMICValueWithLLC(): TKIP MIC Error !\n"));  //MIC error.
-		DBGPRINT_RAW(RT_DEBUG_INFO, ("Orig MIC value ="));  //MIC error.
-		for (i = 0; i < 8; i++)
-		{
-			DBGPRINT_RAW(RT_DEBUG_INFO, ("%02x:", OldMic[i]));  //MIC error.
-		}
-		DBGPRINT_RAW(RT_DEBUG_INFO, ("\n"));  //MIC error.
-		DBGPRINT_RAW(RT_DEBUG_INFO, ("Calculated MIC value ="));  //MIC error.
-		for (i = 0; i < 8; i++)
-		{
-			DBGPRINT_RAW(RT_DEBUG_INFO, ("%02x:", pAd->PrivateInfo.Rx.MIC[i]));  //MIC error.
-		}
-		DBGPRINT_RAW(RT_DEBUG_INFO, ("\n"));  //MIC error.
+	
+		
 		return (FALSE);
 	}
 	return (TRUE);
@@ -709,7 +687,7 @@ VOID	RTMPCalculateMICValue(
 	PUCHAR			pSrc;
     UCHAR           UserPriority;
 	UCHAR			vlan_offset = 0;
- 
+
 	RTMP_QueryPacketInfo(pPacket, &PacketInfo, &pSrcBufVA, &SrcBufLen);
 
 	UserPriority = RTMP_GET_PACKET_UP(pPacket);
@@ -719,7 +697,7 @@ VOID	RTMPCalculateMICValue(
 	if (((*(pSrc + 12) << 8) + *(pSrc + 13)) == 0x8100)
 		vlan_offset = 4;
 	
- 	{
+	{
 		RTMPInitMICEngine(
 			pAd,
 			pKey->Key,
@@ -745,7 +723,7 @@ VOID	RTMPCalculateMICValue(
 		{
 			RTMPTkipAppend(&pAd->PrivateInfo.Tx, pSrc, SrcBufLen);
 		}
-		  
+		
 		break;	// No need handle next packet	
 
 	}	while (TRUE);		// End of copying payload
@@ -1248,7 +1226,7 @@ BOOLEAN RTMPSoftDecryptTKIP(
 
 #ifdef RT_BIG_ENDIAN
 	RTMPFrameEndianChange(pAd, (PUCHAR)pData, DIR_READ, FALSE);
-#endif 
+#endif
 	return TRUE;
 }
 
@@ -1334,8 +1312,8 @@ BOOLEAN RTMPSoftDecryptAES(
 	payload_remainder = (payload_len) % 16;
 	num_blocks = (payload_len) / 16; 
 	
-	DBGPRINT(RT_DEBUG_INFO, ("SoftDecryptAES: payload = %d, num_blocks = %d, payload_remainder = %d\n", payload_len, num_blocks, payload_remainder));
 	
+
 	// Find start of payload
 	payload_index = HeaderLen + 8; //IV+EIV
 
@@ -1351,7 +1329,7 @@ BOOLEAN RTMPSoftDecryptAES(
 		aes128k128d(pWpaKey[KeyID].Key, ctr_preload, aes_out);
 
 		bitwise_xor(aes_out, pData + payload_index, chain_buffer);
- 		NdisMoveMemory(pData + payload_index - 8, chain_buffer, 16);
+		NdisMoveMemory(pData + payload_index - 8, chain_buffer, 16);
 		payload_index += 16;
 	}
 
@@ -1374,7 +1352,7 @@ BOOLEAN RTMPSoftDecryptAES(
 		aes128k128d(pWpaKey[KeyID].Key, ctr_preload, aes_out);
 
 		bitwise_xor(aes_out, padded_buffer, chain_buffer);
- 		NdisMoveMemory(pData + payload_index - 8, chain_buffer, payload_remainder);
+		NdisMoveMemory(pData + payload_index - 8, chain_buffer, payload_remainder);
 		payload_index += payload_remainder;
 	}
 
@@ -1395,7 +1373,7 @@ BOOLEAN RTMPSoftDecryptAES(
 	bitwise_xor(aes_out, padded_buffer, chain_buffer);	
 
 	NdisMoveMemory(TrailMIC, chain_buffer, 8);
-		
+	
 	//
 	// Calculate MIC
 	//
diff --git a/rt2860-1.7.0.0/common/rtmp_wep.c b/rt2860-source-1.8.0.0/common/rtmp_wep.c
similarity index 100%
copy from rt2860-1.7.0.0/common/rtmp_wep.c
copy to rt2860-source-1.8.0.0/common/rtmp_wep.c
diff --git a/rt2860-1.7.0.0/common/spectrum.c b/rt2860-source-1.8.0.0/common/spectrum.c
similarity index 95%
copy from rt2860-1.7.0.0/common/spectrum.c
copy to rt2860-source-1.8.0.0/common/spectrum.c
index 1f66ed3..fba1191 100644
--- a/rt2860-1.7.0.0/common/spectrum.c
+++ b/rt2860-source-1.8.0.0/common/spectrum.c
@@ -1090,7 +1090,9 @@ static VOID StartDFSProcedure(
 {
 	// start DFS procedure
 	pAd->CommonCfg.Channel = Channel;
+#ifdef DOT11_N_SUPPORT
 	N_ChannelCheck(pAd);
+#endif // DOT11_N_SUPPORT //
 	pAd->CommonCfg.RadarDetect.RDMode = RD_SWITCHING_MODE;
 	pAd->CommonCfg.RadarDetect.CSCount = 0;
 }
@@ -1147,8 +1149,7 @@ static BOOLEAN PeerChSwAnnSanity(
 				NdisMoveMemory(&pChSwAnnInfo->ChSwMode, eid_ptr->Octet, 1);
 				NdisMoveMemory(&pChSwAnnInfo->Channel, eid_ptr->Octet + 1, 1);
 				NdisMoveMemory(&pChSwAnnInfo->ChSwCnt, eid_ptr->Octet + 2, 1);
-				DBGPRINT(RT_DEBUG_INFO, ("%s - IE_CHANNEL_SWITCH_ANNOUNCEMENT., ChSwMode=%d NewCh=%d ChSwCnt=%d.\n",
-					__FUNCTION__, pChSwAnnInfo->ChSwMode, pChSwAnnInfo->Channel, pChSwAnnInfo->ChSwCnt));
+				
 				result = TRUE;
                 break;
             
@@ -1218,9 +1219,7 @@ static BOOLEAN PeerMeasureReqSanity(
 				pMeasureReqInfo->MeasureReq.MeasureStartTime = SWAP64(MeasureStartTime);
 				NdisMoveMemory(&MeasureDuration, ptr + 9, 2);
 				pMeasureReqInfo->MeasureReq.MeasureDuration = SWAP16(MeasureDuration);
-				DBGPRINT(RT_DEBUG_INFO, ("%s - IE_MEASUREMENT_REQUEST., ChNum=%d StartTime=%lld Duration=%d\n",
-					__FUNCTION__, pMeasureReqInfo->MeasureReq.ChNum, pMeasureReqInfo->MeasureReq.MeasureStartTime,
-					pMeasureReqInfo->MeasureReq.MeasureDuration));
+				
 				result = TRUE;
 				break;
 
@@ -1312,7 +1311,7 @@ static BOOLEAN PeerMeasureReportSanity(
 					NdisMoveMemory(&pReport->MeasureStartTime, ptr + 1, 8);
 					NdisMoveMemory(&pReport->MeasureDuration, ptr + 9, 2);
 					NdisMoveMemory(&pReport->Map, ptr + 11, 1);
-					DBGPRINT(RT_DEBUG_INFO, ("%s - IE_MEASUREMENT_REPORT., ChNum=%d StartTime=%lld Duration=%d Map=%x.\n", __FUNCTION__, pReport->ChNum, pReport->MeasureStartTime, pReport->MeasureDuration, pReport->Map.word));
+					
 				}
 				else if (pMeasureReportInfo->ReportType == RM_CCA)
 				{
@@ -1322,7 +1321,7 @@ static BOOLEAN PeerMeasureReportSanity(
 					NdisMoveMemory(&pReport->MeasureStartTime, ptr + 1, 8);
 					NdisMoveMemory(&pReport->MeasureDuration, ptr + 9, 2);
 					NdisMoveMemory(&pReport->CCA_Busy_Fraction, ptr + 11, 1);
-					DBGPRINT(RT_DEBUG_INFO, ("%s - IE_MEASUREMENT_REPORT., ChNum=%d StartTime=%lld Duration=%d CCA_Busy_Fraction=%d.\n", __FUNCTION__, pReport->ChNum, pReport->MeasureStartTime, pReport->MeasureDuration, pReport->CCA_Busy_Fraction));
+					
 				}
 				else if (pMeasureReportInfo->ReportType == RM_RPI_HISTOGRAM)
 				{
@@ -1332,7 +1331,6 @@ static BOOLEAN PeerMeasureReportSanity(
 					NdisMoveMemory(&pReport->MeasureStartTime, ptr + 1, 8);
 					NdisMoveMemory(&pReport->MeasureDuration, ptr + 9, 2);
 					NdisMoveMemory(&pReport->RPI_Density, ptr + 11, 8);
-					DBGPRINT(RT_DEBUG_INFO, ("%s - IE_MEASUREMENT_REPORT., ChNum=%d StartTime=%lld Duration=%d.\n", __FUNCTION__, pReport->ChNum, pReport->MeasureStartTime, pReport->MeasureDuration));
 				}
 				result = TRUE;
                 break;
@@ -1477,6 +1475,10 @@ static VOID PeerChSwAnnAction(
 {
 	CH_SW_ANN_INFO ChSwAnnInfo;
 	PFRAME_802_11 pFr = (PFRAME_802_11)Elem->Msg;
+#ifdef CONFIG_STA_SUPPORT
+	UCHAR index = 0, Channel = 0, NewChannel = 0;
+	ULONG Bssidx = 0;
+#endif // CONFIG_STA_SUPPORT //
 
 	NdisZeroMemory(&ChSwAnnInfo, sizeof(CH_SW_ANN_INFO));
 	if (! PeerChSwAnnSanity(pAd, Elem->Msg, Elem->MsgLen, &ChSwAnnInfo))
@@ -1485,12 +1487,55 @@ static VOID PeerChSwAnnAction(
 		return;
 	}
 
-	// ChSwAnn need check.
-	if (DfsRequirementCheck(pAd, ChSwAnnInfo.Channel) == TRUE)
+
+#ifdef CONFIG_STA_SUPPORT
+	if (pAd->OpMode == OPMODE_STA)
 	{
-		NotifyChSwAnnToPeerAPs(pAd, pFr->Hdr.Addr1, pFr->Hdr.Addr2, ChSwAnnInfo.ChSwMode, ChSwAnnInfo.Channel);
-		StartDFSProcedure(pAd, ChSwAnnInfo.Channel, ChSwAnnInfo.ChSwMode);
+		Bssidx = BssTableSearch(&pAd->ScanTab, pFr->Hdr.Addr3, pAd->CommonCfg.Channel);
+		if (Bssidx == BSS_NOT_FOUND)
+		{
+			DBGPRINT(RT_DEBUG_TRACE, ("PeerChSwAnnAction - Bssidx is not found\n"));
+			return;  
+		}
+
+		DBGPRINT(RT_DEBUG_TRACE, ("\n****Bssidx is %d, Channel = %d\n", index, pAd->ScanTab.BssEntry[Bssidx].Channel));
+		hex_dump("SSID",pAd->ScanTab.BssEntry[Bssidx].Bssid ,6);
+
+		Channel = pAd->CommonCfg.Channel;
+		NewChannel = ChSwAnnInfo.Channel;
+
+		if ((pAd->CommonCfg.bIEEE80211H == 1) && (NewChannel != 0) && (Channel != NewChannel))
+		{
+			// Switching to channel 1 can prevent from rescanning the current channel immediately (by auto reconnection).
+			// In addition, clear the MLME queue and the scan table to discard the RX packets and previous scanning results.
+			AsicSwitchChannel(pAd, 1, FALSE);
+			AsicLockChannel(pAd, 1);
+		    LinkDown(pAd, FALSE);
+			MlmeQueueInit(&pAd->Mlme.Queue);
+			BssTableInit(&pAd->ScanTab);
+		    RTMPusecDelay(1000000);		// use delay to prevent STA do reassoc
+					
+			// channel sanity check
+			for (index = 0 ; index < pAd->ChannelListNum; index++)
+			{
+				if (pAd->ChannelList[index].Channel == NewChannel)
+				{
+					pAd->ScanTab.BssEntry[Bssidx].Channel = NewChannel;
+					pAd->CommonCfg.Channel = NewChannel;
+					AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);
+					AsicLockChannel(pAd, pAd->CommonCfg.Channel);
+					DBGPRINT(RT_DEBUG_TRACE, ("&&&&&&&&&&&&&&&&PeerChSwAnnAction - STA receive channel switch announcement IE (New Channel =%d)\n", NewChannel));
+					break;
+				}
+			}
+
+			if (index >= pAd->ChannelListNum)
+			{
+				DBGPRINT_ERR(("&&&&&&&&&&&&&&&&&&&&&&&&&&PeerChSwAnnAction(can not find New Channel=%d in ChannelList[%d]\n", pAd->CommonCfg.Channel, pAd->ChannelListNum));
+			}
+		}
 	}
+#endif // CONFIG_STA_SUPPORT //
 
 	return;
 }
diff --git a/rt2860-1.7.0.0/debian/README.Debian b/rt2860-source-1.8.0.0/debian/README.Debian
similarity index 100%
copy from rt2860-1.7.0.0/debian/README.Debian
copy to rt2860-source-1.8.0.0/debian/README.Debian
diff --git a/rt2860-1.7.0.0/debian/README.source b/rt2860-source-1.8.0.0/debian/README.source
similarity index 100%
copy from rt2860-1.7.0.0/debian/README.source
copy to rt2860-source-1.8.0.0/debian/README.source
diff --git a/rt2860-source-1.8.0.0/debian/changelog b/rt2860-source-1.8.0.0/debian/changelog
new file mode 100644
index 0000000..5a294e2
--- /dev/null
+++ b/rt2860-source-1.8.0.0/debian/changelog
@@ -0,0 +1,40 @@
+rt2860-source (1.8.0.0-1) unstable; urgency=low
+
+  * New Upstream Release
+    -Fixed compile error when CARRIER_DETECTION_SUPPORT is enabled.
+    -Add "iwpriv ra0 set CarrierDetect=0(or 1)"
+    -Add new WSC hardware push button function
+    -Add Ad-Hoc to support N rate.
+    -Migrate Mesh supporting to Draft-2.0.
+    -Support WAPI functionality
+    -Fixed suspend/resume error when ra0 down, ra0 up.
+    -Support Linux Kernel 2.6.27
+    -Fixed WPS failed when AP is not in scan table or AP's channel 
+     changing after user sets "iwpriv ra0 wsc_start"
+    -Fixed DLS A-MPDU established failed.
+  * Remove Fix-compilation-for-2.6.26 patch
+  * Refresh patch series
+
+
+ -- Glenn Saberton <gsaberton at foomagic.org>  Tue, 07 Oct 2008 16:01:22 +0800
+
+rt2860-source (1.7.0.0-2) unstable; urgency=low
+
+  [ Damyan Ivanov ]
+  * Fix license
+  * Add Damyan Ivanov to Uploaders
+  * Build with wpasupplicant support
+  * Various debian/ file fixes
+  * Move the configuration dat file to doc
+
+  [ Glenn Saberton ]
+  * Release 1.7.0.0-2 
+
+ -- Glenn Saberton <gsaberton at foomagic.org>  Mon, 15 Sep 2008 23:33:32 +0800
+
+rt2860-source (1.7.0.0-1) unstable; urgency=low
+
+  * Initial release. Closes: #497200 (ITP)
+
+ -- Glenn Saberton <gsaberton at foomagic.org>  Sat, 23 Aug 2008 14:43:38 +0800
+
diff --git a/rt2860-1.7.0.0/debian/compat b/rt2860-source-1.8.0.0/debian/compat
similarity index 100%
copy from rt2860-1.7.0.0/debian/compat
copy to rt2860-source-1.8.0.0/debian/compat
diff --git a/rt2860-1.7.0.0/debian/control b/rt2860-source-1.8.0.0/debian/control
similarity index 100%
copy from rt2860-1.7.0.0/debian/control
copy to rt2860-source-1.8.0.0/debian/control
diff --git a/rt2860-1.7.0.0/debian/control.modules.in b/rt2860-source-1.8.0.0/debian/control.modules.in
similarity index 100%
copy from rt2860-1.7.0.0/debian/control.modules.in
copy to rt2860-source-1.8.0.0/debian/control.modules.in
diff --git a/rt2860-1.7.0.0/debian/copyright b/rt2860-source-1.8.0.0/debian/copyright
similarity index 100%
copy from rt2860-1.7.0.0/debian/copyright
copy to rt2860-source-1.8.0.0/debian/copyright
diff --git a/rt2860-1.7.0.0/debian/docs b/rt2860-source-1.8.0.0/debian/docs
similarity index 100%
copy from rt2860-1.7.0.0/debian/docs
copy to rt2860-source-1.8.0.0/debian/docs
diff --git a/rt2860-source-1.8.0.0/debian/patches/01-remove-tftp-lines-from-makefile.patch b/rt2860-source-1.8.0.0/debian/patches/01-remove-tftp-lines-from-makefile.patch
new file mode 100644
index 0000000..043c873
--- /dev/null
+++ b/rt2860-source-1.8.0.0/debian/patches/01-remove-tftp-lines-from-makefile.patch
@@ -0,0 +1,44 @@
+From cc65e79c6e457430f60eabffe50b4ad49bcefe73 Mon Sep 17 00:00:00 2001
+From: Glenn Saberton <gsaberton at foomagic.org>
+Date: Tue, 7 Oct 2008 15:38:19 +0800
+Subject: [PATCH 1/3] remove tftp lines from makefile
+
+---
+ rt2860-source_1.8.0.0/Makefile |   18 ------------------
+ 1 files changed, 0 insertions(+), 18 deletions(-)
+
+diff --git a/rt2860-source_1.8.0.0/Makefile b/rt2860-source_1.8.0.0/Makefile
+index 6fa7a73..8f95bcc 100644
+--- a/Makefile
++++ b/Makefile
+@@ -125,27 +125,9 @@ LINUX:
+ ifneq (,$(findstring 2.4,$(LINUX_SRC)))
+ 	cp -f os/linux/Makefile.4 $(RT28xx_DIR)/os/linux/Makefile
+ 	make -C $(RT28xx_DIR)/os/linux/
+-ifeq ($(RT28xx_MODE),AP)
+-	cp -f $(RT28xx_DIR)/os/linux/rt$(CHIPSET)ap.o /tftpboot
+-else	
+-ifeq ($(RT28xx_MODE),APSTA)
+-	cp -f $(RT28xx_DIR)/os/linux/rt$(CHIPSET)apsta.o /tftpboot
+-else
+-	cp -f $(RT28xx_DIR)/os/linux/rt$(CHIPSET)sta.o /tftpboot
+-endif	
+-endif	
+ else
+ 	cp -f os/linux/Makefile.6 $(RT28xx_DIR)/os/linux/Makefile
+ 	make  -C  $(LINUX_SRC) SUBDIRS=$(RT28xx_DIR)/os/linux modules
+-ifeq ($(RT28xx_MODE),AP)
+-	cp -f $(RT28xx_DIR)/os/linux/rt$(CHIPSET)ap.ko /tftpboot
+-else	
+-ifeq ($(RT28xx_MODE),APSTA)
+-	cp -f $(RT28xx_DIR)/os/linux/rt$(CHIPSET)apsta.ko /tftpboot
+-else
+-	cp -f $(RT28xx_DIR)/os/linux/rt$(CHIPSET)sta.ko /tftpboot
+-endif	
+-endif
+ endif
+ 
+ clean:
+-- 
+1.5.6.5
+
diff --git a/rt2860-source-1.8.0.0/debian/patches/02-remove-dat-file.patch b/rt2860-source-1.8.0.0/debian/patches/02-remove-dat-file.patch
new file mode 100644
index 0000000..218bb27
--- /dev/null
+++ b/rt2860-source-1.8.0.0/debian/patches/02-remove-dat-file.patch
@@ -0,0 +1,32 @@
+From 568e481700bcd5200549c85b2e385b3d71d0e23b Mon Sep 17 00:00:00 2001
+From: Glenn Saberton <gsaberton at foomagic.org>
+Date: Tue, 7 Oct 2008 15:41:35 +0800
+Subject: [PATCH 2/3] remove dat file
+
+---
+ rt2860-source_1.8.0.0/os/linux/Makefile.6 |    6 ------
+ 1 files changed, 0 insertions(+), 6 deletions(-)
+
+diff --git a/rt2860-source_1.8.0.0/os/linux/Makefile.6 b/rt2860-source_1.8.0.0/os/linux/Makefile.6
+index 5dd36e3..85b0334 100644
+--- a/os/linux/Makefile.6
++++ b/os/linux/Makefile.6
+@@ -72,15 +72,9 @@ clean:
+ 	rm -f ../../sta/.*.{cmd,flags,d}
+ 
+ install:
+-	rm -rf $(DAT_PATH)
+-	$(shell [ ! -f /etc/Wireless ] && mkdir /etc/Wireless)
+-	mkdir $(DAT_PATH)
+-	cp $(RT28xx_DIR)/$(DAT_FILE_NAME) $(DAT_PATH)/.
+ 	install -d $(LINUX_SRC_MODULE)
+ 	install -m 644 -c $(addsuffix .ko,$(MOD_NAME)) $(LINUX_SRC_MODULE)
+ 	/sbin/depmod -a ${shell uname -r}
+ 
+ uninstall:
+-#	rm -rf $(DAT_PATH)
+ 	rm -rf $(addprefix $(LINUX_SRC_MODULE),$(addsuffix .ko,$(MOD_NAME)))
+-	/sbin/depmod -a ${shell uname -r}
+-- 
+1.5.6.5
+
diff --git a/rt2860-source-1.8.0.0/debian/patches/03-compile-support-for-wpasupplicant.patch b/rt2860-source-1.8.0.0/debian/patches/03-compile-support-for-wpasupplicant.patch
new file mode 100644
index 0000000..ec01ae0
--- /dev/null
+++ b/rt2860-source-1.8.0.0/debian/patches/03-compile-support-for-wpasupplicant.patch
@@ -0,0 +1,29 @@
+From 481355db8771ded16390c722b8b4ccf63e3fc6a3 Mon Sep 17 00:00:00 2001
+From: Glenn Saberton <gsaberton at foomagic.org>
+Date: Tue, 7 Oct 2008 15:42:47 +0800
+Subject: [PATCH 3/3] compile support for wpasupplicant
+
+---
+ rt2860-source_1.8.0.0/os/linux/config.mk |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/rt2860-source_1.8.0.0/os/linux/config.mk b/rt2860-source_1.8.0.0/os/linux/config.mk
+index 5f4c5d1..957ead8 100644
+--- a/os/linux/config.mk
++++ b/os/linux/config.mk
+@@ -5,10 +5,10 @@ HAS_ATE=n
+ HAS_28xx_QA=n
+ 
+ # Support Wpa_Supplicant
+-HAS_WPA_SUPPLICANT=n
++HAS_WPA_SUPPLICANT=y
+ 
+ # Support Native WpaSupplicant for Network Maganger
+-HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=n
++HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y
+ 
+ #Support Net interface block while Tx-Sw queue full
+ HAS_BLOCK_NET_IF=n
+-- 
+1.5.6.5
+
diff --git a/rt2860-source-1.8.0.0/debian/patches/series b/rt2860-source-1.8.0.0/debian/patches/series
new file mode 100644
index 0000000..c407862
--- /dev/null
+++ b/rt2860-source-1.8.0.0/debian/patches/series
@@ -0,0 +1,4 @@
+01-remove-tftp-lines-from-makefile.patch
+02-remove-dat-file.patch
+03-compile-support-for-wpasupplicant.patch
+
diff --git a/rt2860-1.7.0.0/debian/rules b/rt2860-source-1.8.0.0/debian/rules
similarity index 100%
copy from rt2860-1.7.0.0/debian/rules
copy to rt2860-source-1.8.0.0/debian/rules
diff --git a/rt2860-1.7.0.0/debian/rules.modules b/rt2860-source-1.8.0.0/debian/rules.modules
similarity index 100%
copy from rt2860-1.7.0.0/debian/rules.modules
copy to rt2860-source-1.8.0.0/debian/rules.modules
diff --git a/rt2860-1.7.0.0/debian/watch b/rt2860-source-1.8.0.0/debian/watch
similarity index 100%
copy from rt2860-1.7.0.0/debian/watch
copy to rt2860-source-1.8.0.0/debian/watch
diff --git a/rt2860-1.7.0.0/include/action.h b/rt2860-source-1.8.0.0/include/action.h
similarity index 100%
copy from rt2860-1.7.0.0/include/action.h
copy to rt2860-source-1.8.0.0/include/action.h
diff --git a/rt2860-1.7.0.0/include/aironet.h b/rt2860-source-1.8.0.0/include/aironet.h
similarity index 100%
copy from rt2860-1.7.0.0/include/aironet.h
copy to rt2860-source-1.8.0.0/include/aironet.h
diff --git a/rt2860-1.7.0.0/include/ap.h b/rt2860-source-1.8.0.0/include/ap.h
similarity index 99%
copy from rt2860-1.7.0.0/include/ap.h
copy to rt2860-source-1.8.0.0/include/ap.h
index 859aab5..fce3209 100644
--- a/rt2860-1.7.0.0/include/ap.h
+++ b/rt2860-source-1.8.0.0/include/ap.h
@@ -165,7 +165,7 @@ USHORT APBuildAssociation(
 	IN HT_CAPABILITY_IE		*pHtCapability,
 	IN UCHAR		 HtCapabilityLen,
     OUT USHORT *pAid);
- 
+
 // ap_auth.c
 
 void APAuthStateMachineInit(
@@ -408,8 +408,10 @@ VOID ApLogEvent(
     IN PUCHAR           pAddr,
     IN USHORT           Event);
 
+#ifdef DOT11_N_SUPPORT
 VOID APUpdateOperationMode(
     IN PRTMP_ADAPTER pAd);
+#endif // DOT11_N_SUPPORT //
 
 VOID APUpdateCapabilityAndErpIe(
 	IN PRTMP_ADAPTER pAd);
@@ -469,7 +471,7 @@ BOOLEAN PeerAssocReqCmmSanity(
     OUT UCHAR *RSN,
     OUT UCHAR *pRSNLen,
     OUT BOOLEAN *pbWmmCapable,
-     OUT ULONG  *pRalinkIe,
+    OUT ULONG  *pRalinkIe,
 #ifdef DOT11N_DRAFT3
     OUT EXT_CAP_INFO_ELEMENT	*pExtCapInfo,
 #endif // DOT11N_DRAFT3 //
diff --git a/rt2860-1.7.0.0/include/chlist.h b/rt2860-source-1.8.0.0/include/chlist.h
similarity index 93%
copy from rt2860-1.7.0.0/include/chlist.h
copy to rt2860-source-1.8.0.0/include/chlist.h
index 3212218..4533e8a 100644
--- a/rt2860-1.7.0.0/include/chlist.h
+++ b/rt2860-source-1.8.0.0/include/chlist.h
@@ -524,7 +524,7 @@ static CH_REGION ChRegion[] =
 			JAP,
 			{
 				{ 1,   14,  20, BOTH, FALSE},	// 2.4 G, ch 1~14
-				{ 34, 	4,  23, IDOR, FALSE},	// 5G, ch 34~46
+				{ 36, 	4,  23, IDOR, FALSE},	// 5G, ch 36~48
 				{ 0},							// end
 			}
 		},
@@ -956,15 +956,19 @@ static inline VOID ChBandCheck(
 {
 	switch(PhyMode)
 	{
-        case PHY_11A:
+		case PHY_11A:
+#ifdef DOT11_N_SUPPORT
 		case PHY_11AN_MIXED:
+#endif // DOT11_N_SUPPORT //
 			*pChType = BAND_5G;
 			break;
-        case PHY_11AGN_MIXED:
-        case PHY_11ABG_MIXED:
-        case PHY_11ABGN_MIXED:
+		case PHY_11ABG_MIXED:
+#ifdef DOT11_N_SUPPORT
+		case PHY_11AGN_MIXED:
+		case PHY_11ABGN_MIXED:
+#endif // DOT11_N_SUPPORT //
 			*pChType = BAND_BOTH;
-            break;
+			break;
 
 		default:
 			*pChType = BAND_24G;
@@ -1110,20 +1114,8 @@ static inline VOID BuildBeaconChList(
 	}
 }
 
-static inline UCHAR GetExtCh(
-	IN UCHAR Channel,
-	IN UCHAR Direction)
-{
-	CHAR ExtCh;
-
-	if (Direction == EXTCHA_ABOVE)
-		ExtCh = Channel + 4;
-	else
-		ExtCh = (Channel - 4) > 0 ? (Channel - 4) : 0;
-
-	return ExtCh;
-}
 
+#ifdef DOT11_N_SUPPORT
 static inline BOOLEAN IsValidChannel(
 	IN PRTMP_ADAPTER pAd,
 	IN UCHAR channel)
@@ -1143,6 +1135,22 @@ static inline BOOLEAN IsValidChannel(
 		return TRUE;
 }
 
+
+static inline UCHAR GetExtCh(
+	IN UCHAR Channel,
+	IN UCHAR Direction)
+{
+	CHAR ExtCh;
+
+	if (Direction == EXTCHA_ABOVE)
+		ExtCh = Channel + 4;
+	else
+		ExtCh = (Channel - 4) > 0 ? (Channel - 4) : 0;
+
+	return ExtCh;
+}
+
+
 static inline VOID N_ChannelCheck(
 	IN PRTMP_ADAPTER pAd)
 {
@@ -1191,19 +1199,58 @@ static inline VOID N_ChannelCheck(
 			if (Channel == 14)
 			{
 				pAd->CommonCfg.RegTransmitSetting.field.BW  = BW_20;
-			} 
+				//pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_NONE;	// We didn't set the ExtCh as NONE due to it'll set in RTMPSetHT()
+			}
+#if 0
+			switch (pAd->CommonCfg.CountryRegion  & 0x7f)
+			{
+				case REGION_0_BG_BAND:	// 1 -11
+				case REGION_1_BG_BAND:	// 1 - 13
+				case REGION_5_BG_BAND:	// 1 - 14
+					if (Channel <= 4)
+					{
+						pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_ABOVE;
+					}
+					else if (Channel >= 8)
+					{
+						if ((ChannelNum - Channel) < 4)
+							pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_BELOW;
+					}
+					break;
+
+				case REGION_2_BG_BAND:	// 10 - 11
+				case REGION_3_BG_BAND:	// 10 - 13
+				case REGION_4_BG_BAND:	// 14
+					pAd->CommonCfg.RegTransmitSetting.field.BW  = BW_20;
+					break;
+
+				case REGION_6_BG_BAND:	// 3 - 9
+					if (Channel <= 5)
+						pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_ABOVE;
+					else if (Channel == 6)
+						pAd->CommonCfg.RegTransmitSetting.field.BW  = BW_20;
+					else if (Channel >= 7)
+						pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_BELOW;
+					break;
+
+				case REGION_7_BG_BAND:  // 5 - 13
+					if (Channel <= 8)
+						pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_ABOVE;
+					else if (Channel >= 10)
+						pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_BELOW;
+					break;
+
+				default:	// Error. should never happen
+					break;
+			}
+#endif
 		}
 	}
 
-#ifdef DOT11N_DRAFT3
-	IF_DEV_CONFIG_OPMODE_ON_AP(pAd)
-	{
-		APOverlappingBSSScan(pAd);
-	}
-#endif // DOT11N_DRAFT3 //
 
 }
 
+
 static inline VOID N_SetCenCh(
 	IN PRTMP_ADAPTER pAd)
 {
@@ -1226,5 +1273,24 @@ static inline VOID N_SetCenCh(
 		pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel;
 	}
 }
+#endif // DOT11_N_SUPPORT //
+
+
+static inline UINT8 GetCuntryMaxTxPwr(
+	IN PRTMP_ADAPTER pAd,
+	IN UINT8 channel)
+{
+	int i;
+	for (i = 0; i < pAd->ChannelListNum; i++)
+	{
+		if (pAd->ChannelList[i].Channel == channel)
+			break;
+	}
+
+	if (i == pAd->ChannelListNum)
+		return 0xff;
+	else
+		return pAd->ChannelList[i].MaxTxPwr;
+}
 #endif // __CHLIST_H__
 
diff --git a/rt2860-1.7.0.0/include/dfs.h b/rt2860-source-1.8.0.0/include/dfs.h
similarity index 100%
copy from rt2860-1.7.0.0/include/dfs.h
copy to rt2860-source-1.8.0.0/include/dfs.h
diff --git a/rt2860-1.7.0.0/include/firmware.h b/rt2860-source-1.8.0.0/include/firmware.h
similarity index 100%
copy from rt2860-1.7.0.0/include/firmware.h
copy to rt2860-source-1.8.0.0/include/firmware.h
diff --git a/rt2860-1.7.0.0/include/leap.h b/rt2860-source-1.8.0.0/include/leap.h
similarity index 100%
copy from rt2860-1.7.0.0/include/leap.h
copy to rt2860-source-1.8.0.0/include/leap.h
diff --git a/rt2860-1.7.0.0/include/link_list.h b/rt2860-source-1.8.0.0/include/link_list.h
similarity index 100%
copy from rt2860-1.7.0.0/include/link_list.h
copy to rt2860-source-1.8.0.0/include/link_list.h
diff --git a/rt2860-1.7.0.0/include/md4.h b/rt2860-source-1.8.0.0/include/md4.h
similarity index 100%
copy from rt2860-1.7.0.0/include/md4.h
copy to rt2860-source-1.8.0.0/include/md4.h
diff --git a/rt2860-1.7.0.0/include/md5.h b/rt2860-source-1.8.0.0/include/md5.h
similarity index 85%
copy from rt2860-1.7.0.0/include/md5.h
copy to rt2860-source-1.8.0.0/include/md5.h
index d06ae88..df60360 100644
--- a/rt2860-1.7.0.0/include/md5.h
+++ b/rt2860-source-1.8.0.0/include/md5.h
@@ -52,15 +52,15 @@
 #define MD5_MAC_LEN 16
 
 typedef struct _MD5_CTX {
-    ULONG   Buf[4];             // buffers of four states
+    UINT32   Buf[4];             // buffers of four states
 	UCHAR   Input[64];          // input message
-	ULONG   LenInBitCount[2];   // length counter for input message, 0 up to 64 bits	                            
+	UINT32   LenInBitCount[2];   // length counter for input message, 0 up to 64 bits	                            
 }   MD5_CTX;
 
 VOID MD5Init(MD5_CTX *pCtx);
-VOID MD5Update(MD5_CTX *pCtx, UCHAR *pData, ULONG LenInBytes);
+VOID MD5Update(MD5_CTX *pCtx, UCHAR *pData, UINT32 LenInBytes);
 VOID MD5Final(UCHAR Digest[16], MD5_CTX *pCtx);
-VOID MD5Transform(ULONG Buf[4], ULONG Mes[16]);
+VOID MD5Transform(UINT32 Buf[4], UINT32 Mes[16]);
 
 void md5_mac(u8 *key, size_t key_len, u8 *data, size_t data_len, u8 *mac);
 void hmac_md5(u8 *key, size_t key_len, u8 *data, size_t data_len, u8 *mac);
@@ -70,16 +70,16 @@ void hmac_md5(u8 *key, size_t key_len, u8 *data, size_t data_len, u8 *mac);
 //
 typedef	struct _SHA_CTX
 {
-	ULONG   Buf[5];             // buffers of five states
+	UINT32   Buf[5];             // buffers of five states
 	UCHAR   Input[80];          // input message
-	ULONG   LenInBitCount[2];   // length counter for input message, 0 up to 64 bits
+	UINT32   LenInBitCount[2];   // length counter for input message, 0 up to 64 bits
 	
 }	SHA_CTX;
 
 VOID SHAInit(SHA_CTX *pCtx);
-UCHAR SHAUpdate(SHA_CTX *pCtx, UCHAR *pData, ULONG LenInBytes);
+UCHAR SHAUpdate(SHA_CTX *pCtx, UCHAR *pData, UINT32 LenInBytes);
 VOID SHAFinal(SHA_CTX *pCtx, UCHAR Digest[20]);
-VOID SHATransform(ULONG Buf[5], ULONG Mes[20]);
+VOID SHATransform(UINT32 Buf[5], UINT32 Mes[20]);
 
 #define SHA_DIGEST_LEN 20
 #endif // __MD5_H__
diff --git a/rt2860-1.7.0.0/include/mlme.h b/rt2860-source-1.8.0.0/include/mlme.h
similarity index 99%
copy from rt2860-1.7.0.0/include/mlme.h
copy to rt2860-source-1.8.0.0/include/mlme.h
index 4ae0bb4..3f37ad7 100644
--- a/rt2860-1.7.0.0/include/mlme.h
+++ b/rt2860-source-1.8.0.0/include/mlme.h
@@ -112,7 +112,7 @@ extern UINT32 CW_MAX_IN_BITS;
 #define RSSI_WEIGHTING                   50
 #define TX_WEIGHTING                     30
 #define RX_WEIGHTING                     20
- 
+
 #define BSS_NOT_FOUND                    0xFFFFFFFF
 
 
@@ -494,7 +494,7 @@ typedef struct {
 //This structure substracts ralink supports from all 802.11n-related features.
 //Features not listed here but contained in 802.11n spec are not supported in rt2860.
 typedef struct {
- #ifdef RT_BIG_ENDIAN
+#ifdef RT_BIG_ENDIAN
 	USHORT	rsv:5;
 	USHORT	AmsduSize:1;	// Max receiving A-MSDU size
 	USHORT	AmsduEnable:1;	// Enable to transmit A-MSDU. Suggest disable. We should use A-MPDU to gain best benifit of 802.11n
@@ -1170,7 +1170,7 @@ typedef struct {
 #ifdef CONFIG_STA_SUPPORT
     WPA_IE_     WpaIE;
     WPA_IE_     RsnIE;
- #ifdef EXT_BUILD_CHANNEL_LIST
+#ifdef EXT_BUILD_CHANNEL_LIST
 	UCHAR		CountryString[3];
 	BOOLEAN		bHasCountryIE;
 #endif // EXT_BUILD_CHANNEL_LIST //
@@ -1197,9 +1197,6 @@ typedef struct _MLME_QUEUE_ELEM {
     UCHAR             Channel;
     UCHAR             Wcid;
     BOOLEAN           Occupied;
-#ifdef MLME_EX
-	USHORT            Idx;
-#endif // MLME_EX //
 } MLME_QUEUE_ELEM, *PMLME_QUEUE_ELEM;
 
 typedef struct _MLME_QUEUE {
@@ -1396,6 +1393,9 @@ typedef struct PACKED _RTMP_TX_RATE_SWITCH
 #define MAC_TABLE_ASSOC_TIMEOUT			5			// unit: sec
 #define MAC_TABLE_FULL(Tab)				((Tab).size == MAX_LEN_OF_MAC_TABLE)
 
+// AP shall drop the sta if contine Tx fail count reach it.
+#define MAC_ENTRY_LIFE_CHECK_CNT		20			// packet cnt.
+
 // Value domain of pMacEntry->Sst
 typedef enum _Sst {
     SST_NOT_AUTH,   // 0: equivalent to IEEE 802.11/1999 state 1
diff --git a/rt2860-1.7.0.0/include/netif_block.h b/rt2860-source-1.8.0.0/include/netif_block.h
similarity index 98%
copy from rt2860-1.7.0.0/include/netif_block.h
copy to rt2860-source-1.8.0.0/include/netif_block.h
index 88a0fde..97b121d 100644
--- a/rt2860-1.7.0.0/include/netif_block.h
+++ b/rt2860-source-1.8.0.0/include/netif_block.h
@@ -27,7 +27,8 @@
 
 #ifndef __NET_IF_BLOCK_H__
 #define __NET_IF_BLOCK_H__
- 
+
+//#include <linux/device.h> 
 #include "link_list.h"
 #include "rtmp.h"
 
diff --git a/rt2860-1.7.0.0/include/oid.h b/rt2860-source-1.8.0.0/include/oid.h
similarity index 99%
copy from rt2860-1.7.0.0/include/oid.h
copy to rt2860-source-1.8.0.0/include/oid.h
index 85b42fe..563ac43 100644
--- a/rt2860-1.7.0.0/include/oid.h
+++ b/rt2860-source-1.8.0.0/include/oid.h
@@ -81,7 +81,7 @@
 #define MAX_NUMBER_OF_DLS_ENTRY			4
 
 #ifndef UNDER_CE
- 
+
 #define OID_GEN_MACHINE_NAME               0x0001021A
 
 #ifdef RALINK_ATE
@@ -592,7 +592,7 @@ typedef struct _NDIS_802_11_AUTHENTICATION_EVENT
     NDIS_802_11_STATUS_INDICATION       Status;
     NDIS_802_11_AUTHENTICATION_REQUEST  Request[1];
 } NDIS_802_11_AUTHENTICATION_EVENT, *PNDIS_802_11_AUTHENTICATION_EVENT;
-
+        
 // 802.11 Media stream constraints, associated with OID_802_11_MEDIA_STREAM_MODE
 typedef enum _NDIS_802_11_MEDIA_STREAM_MODE
 {
@@ -681,7 +681,7 @@ enum {
 };
 
 #endif // CONFIG_STA_SUPPORT //
- 
+
 #ifdef SNMP_SUPPORT
 //SNMP ieee 802dot11, kathy , 2008_0220
 // dot11res(3)
@@ -711,12 +711,12 @@ enum {
 #define OID_802_11_GET_CH_LIST					0x0715
 #define OID_802_11_GET_COUNTRY_CODE				0x0716
 #define OID_802_11_GET_CHANNEL_GEOGRAPHY		0x0717
- 
+
 #ifdef LLTD_SUPPORT
 // for consistency with RT61
 #define RT_OID_GET_PHY_MODE                         0x761
 #endif // LLTD_SUPPORT //
- 
+
 // New for MeetingHouse Api support
 #define OID_MH_802_1X_SUPPORTED               0xFFEDC100
 
@@ -760,6 +760,7 @@ typedef enum _RT_802_11_PHY_MODE {
 	PHY_11A,
 	PHY_11ABG_MIXED,
 	PHY_11G,
+#ifdef DOT11_N_SUPPORT
 	PHY_11ABGN_MIXED,	// both band   5
 	PHY_11N_2_4G,		// 11n-only with 2.4G band   	6
 	PHY_11GN_MIXED,	// 2.4G band      7
@@ -767,16 +768,9 @@ typedef enum _RT_802_11_PHY_MODE {
 	PHY_11BGN_MIXED,	// if check 802.11b.      9
 	PHY_11AGN_MIXED,	// if check 802.11b.      10
 	PHY_11N_5G,			// 11n-only with 5G band		11
+#endif // DOT11_N_SUPPORT //
 } RT_802_11_PHY_MODE;
 
-typedef enum _RT_802_11_ADHOC_MODE {
-	ADHOC_11B,
-	ADHOC_11BG_MIXED,
-	ADHOC_11G,
-	ADHOC_11A,
-	ADHOC_11ABG_MIXED
-} RT_802_11_ADHOC_MODE;
-
 // put all proprietery for-query objects here to reduce # of Query_OID
 typedef struct _RT_802_11_LINK_STATUS {
     ULONG   CurrTxRate;         // in units of 0.5Mbps
@@ -927,7 +921,7 @@ typedef struct {
 	UCHAR		SHORTGI;
 	UCHAR		rsv;
 } OID_SET_HT_PHYMODE, *POID_SET_HT_PHYMODE;
- 
+
 #ifdef LLTD_SUPPORT
 typedef struct _RT_LLTD_ASSOICATION_ENTRY {
     UCHAR           Addr[ETH_LENGTH_OF_ADDRESS];
@@ -978,7 +972,7 @@ typedef enum _RT_802_11_DLS_MODE {
 #endif // NATIVE_WPA_SUPPLICANT_SUPPORT //
 #endif // WPA_SUPPLICANT_SUPPORT //
 #endif // CONFIG_STA_SUPPORT //
- 
+
 #define MAX_CUSTOM_LEN 128 
 
 #ifdef CONFIG_STA_SUPPORT
@@ -995,6 +989,7 @@ typedef struct _RT_CHANNEL_LIST_INFO
 	UCHAR ChannelList[MAX_NUM_OF_CHS];   // list all supported channels for site survey
 	UCHAR ChannelListNum; // number of channel in ChannelList[]
 } RT_CHANNEL_LIST_INFO, *PRT_CHANNEL_LIST_INFO;
- 
+
+
 #endif // _OID_H_
 
diff --git a/rt2860-1.7.0.0/include/rt2860.h b/rt2860-source-1.8.0.0/include/rt2860.h
similarity index 99%
copy from rt2860-1.7.0.0/include/rt2860.h
copy to rt2860-source-1.8.0.0/include/rt2860.h
index dfdc23c..fd7dafb 100644
--- a/rt2860-1.7.0.0/include/rt2860.h
+++ b/rt2860-source-1.8.0.0/include/rt2860.h
@@ -1,9 +1,9 @@
 /*
  *************************************************************************
  * Ralink Tech Inc.
- * 4F, No. 2 Technology 5th Rd.
- * Science-based Industrial Park
- * Hsin-chu, Taiwan, R.O.C.
+ * 5F., No.36, Taiyuan St., Jhubei City,
+ * Hsinchu County 302,
+ * Taiwan, R.O.C.
  *
  * (c) Copyright 2002-2007, Ralink Technology, Inc.
  *
diff --git a/rt2860-1.7.0.0/include/rt28xx.h b/rt2860-source-1.8.0.0/include/rt28xx.h
similarity index 97%
copy from rt2860-1.7.0.0/include/rt28xx.h
copy to rt2860-source-1.8.0.0/include/rt28xx.h
index b2694dd..250321f 100644
--- a/rt2860-1.7.0.0/include/rt28xx.h
+++ b/rt2860-source-1.8.0.0/include/rt28xx.h
@@ -1626,7 +1626,7 @@ typedef struct _HW_WCID_ENTRY {  // 8-byte per entry
 #define HW_DEBUG_SETTING_BASE   0x77f0  // 0x77f0~0x77ff total 16 bytes
 #define HW_DEBUG_SETTING_BASE2   0x7770  // 0x77f0~0x77ff total 16 bytes
 
- // In order to support maximum 8 MBSS and its maximum length is 512 for each beacon
+// In order to support maximum 8 MBSS and its maximum length is 512 for each beacon
 // Three section discontinue memory segments will be used.
 // 1. The original region for BCN 0~3
 // 2. Extract memory from FCE table for BCN 4~5
@@ -1690,7 +1690,7 @@ typedef struct _HW_WCID_ENTRY {  // 8-byte per entry
 #define PID_DATA_AMPDU	 	0x04
 #define PID_DATA_NO_ACK    	0x08
 #define PID_DATA_NOT_NORM_ACK	 	0x03
- // value domain of pTxD->HostQId (4-bit: 0~15)
+// value domain of pTxD->HostQId (4-bit: 0~15)
 #define QID_AC_BK               1   // meet ACI definition in 802.11e
 #define QID_AC_BE               0   // meet ACI definition in 802.11e
 #define QID_AC_VI               2
@@ -1708,6 +1708,39 @@ typedef struct _HW_WCID_ENTRY {  // 8-byte per entry
 #define	BUSY		                1
 #define	IDLE		                0
 
+#define	RF_R00					    0
+#define	RF_R01					    1
+#define	RF_R02					    2
+#define	RF_R03					    3
+#define	RF_R04					    4
+#define	RF_R05					    5
+#define	RF_R06					    6
+#define	RF_R07					    7
+#define	RF_R08					    8
+#define	RF_R09					    9
+#define	RF_R10					    10
+#define	RF_R11					    11
+#define	RF_R12					    12
+#define	RF_R13					    13
+#define	RF_R14					    14
+#define	RF_R15					    15
+#define	RF_R16					    16
+#define	RF_R17					    17
+#define	RF_R18					    18
+#define	RF_R19					    19
+#define	RF_R20					    20
+#define	RF_R21					    21
+#define	RF_R22					    22
+#define	RF_R23					    23
+#define	RF_R24					    24
+#define	RF_R25					    25
+#define	RF_R26					    26
+#define	RF_R27					    27
+#define	RF_R28					    28
+#define	RF_R29					    29
+#define	RF_R30					    30
+#define	RF_R31					    31
+
 #define	BBP_R0					    0  // version
 #define	BBP_R1				        1  // TSSI
 #define	BBP_R2          			2  // TX configure
@@ -1722,15 +1755,18 @@ typedef struct _HW_WCID_ENTRY {  // 8-byte per entry
 #define BBP_R21                     21
 #define BBP_R22                     22
 #define BBP_R24                     24
+#define BBP_R25                     25
 #define BBP_R49                     49 //TSSI
 #define BBP_R50                     50
 #define BBP_R51                     51
 #define BBP_R52                     52
+#define BBP_R55                     55
 #define BBP_R62                     62 // Rx SQ0 Threshold HIGH
 #define BBP_R63                     63
 #define BBP_R64                     64
 #define BBP_R65                     65
 #define BBP_R66                     66
+#define BBP_R67                     67
 #define BBP_R68                     68
 #define BBP_R69                     69
 #define BBP_R70                     70 // Rx AGC SQ CCK Xcorr threshold
@@ -1762,7 +1798,7 @@ typedef struct _HW_WCID_ENTRY {  // 8-byte per entry
 
 #define BBPR94_DEFAULT              0x06 // Add 1 value will gain 1db
 
- #define RSSI_FOR_VERY_LOW_SENSIBILITY -35
+#define RSSI_FOR_VERY_LOW_SENSIBILITY -35
 #define RSSI_FOR_LOW_SENSIBILITY      -58
 #define RSSI_FOR_MID_LOW_SENSIBILITY  -80
 #define RSSI_FOR_MID_SENSIBILITY      -90
@@ -1794,6 +1830,7 @@ typedef struct _HW_WCID_ENTRY {  // 8-byte per entry
 #define EEPROM_LNA_OFFSET			0x44
 #define EEPROM_RSSI_BG_OFFSET		0x46
 #define EEPROM_RSSI_A_OFFSET		0x4a
+#define EEPROM_DEFINE_MAX_TXPWR		0x4e
 #define EEPROM_TXPOWER_BYRATE_20MHZ_2_4G	0xde	// 20MHZ 2.4G tx power.
 #define EEPROM_TXPOWER_BYRATE_40MHZ_2_4G	0xee	// 40MHZ 2.4G tx power.
 #define EEPROM_TXPOWER_BYRATE_20MHZ_5G		0xfa	// 20MHZ 5G tx power.
@@ -2647,4 +2684,31 @@ typedef	union	_QOS_CSR1_STRUC	{
 }	QOS_CSR1_STRUC, *PQOS_CSR1_STRUC;
 #endif
 
+#define	RF_CSR_CFG	0x500
+#ifdef RT_BIG_ENDIAN
+typedef	union	_RF_CSR_CFG_STRUC	{
+	struct	{
+		UINT	Rsvd1:14;				// Reserved
+		UINT	RF_CSR_KICK:1;			// kick RF register read/write
+		UINT	RF_CSR_WR:1;			// 0: read  1: write
+		UINT	Rsvd2:3;				// Reserved
+		UINT	TESTCSR_RFACC_REGNUM:5;	// RF register ID
+		UINT	RF_CSR_DATA:8;			// DATA
+	}	field;
+	UINT	word;
+}	RF_CSR_CFG_STRUC, *PRF_CSR_CFG_STRUC;
+#else
+typedef	union	_RF_CSR_CFG_STRUC	{
+	struct	{
+		UINT	RF_CSR_DATA:8;			// DATA 
+		UINT	TESTCSR_RFACC_REGNUM:5;	// RF register ID
+		UINT	Rsvd2:3;				// Reserved
+		UINT	RF_CSR_WR:1;			// 0: read  1: write
+		UINT	RF_CSR_KICK:1;			// kick RF register read/write
+		UINT	Rsvd1:14;				// Reserved
+	}	field;
+	UINT	word;
+}	RF_CSR_CFG_STRUC, *PRF_CSR_CFG_STRUC;
+#endif
+
 #endif	// __RT28XX_H__
diff --git a/rt2860-1.7.0.0/include/rt_ate.h b/rt2860-source-1.8.0.0/include/rt_ate.h
similarity index 100%
copy from rt2860-1.7.0.0/include/rt_ate.h
copy to rt2860-source-1.8.0.0/include/rt_ate.h
diff --git a/rt2860-1.7.0.0/include/rt_config.h b/rt2860-source-1.8.0.0/include/rt_config.h
similarity index 99%
copy from rt2860-1.7.0.0/include/rt_config.h
copy to rt2860-source-1.8.0.0/include/rt_config.h
index 3af0df0..09f853a 100644
--- a/rt2860-1.7.0.0/include/rt_config.h
+++ b/rt2860-source-1.8.0.0/include/rt_config.h
@@ -66,7 +66,7 @@
 #include	"ap.h"
 #include	"dfs.h"
 #include	"chlist.h"
-#include	"spectrum.h" 
+#include	"spectrum.h"
 
 #ifdef LEAP_SUPPORT
 #include    "leap.h"
diff --git a/rt2860-1.7.0.0/include/rt_linux.h b/rt2860-source-1.8.0.0/include/rt_linux.h
similarity index 95%
copy from rt2860-1.7.0.0/include/rt_linux.h
copy to rt2860-source-1.8.0.0/include/rt_linux.h
index 76f90d8..48e5f3e 100644
--- a/rt2860-1.7.0.0/include/rt_linux.h
+++ b/rt2860-source-1.8.0.0/include/rt_linux.h
@@ -94,7 +94,7 @@ typedef int (*HARD_START_XMIT_FUNC)(struct sk_buff *skb, struct net_device *net_
 #define STA_PROFILE_PATH			"/etc/Wireless/RT2860STA/RT2860STA.dat"
 #define STA_RTMP_FIRMWARE_FILE_NAME "/etc/Wireless/RT2860STA/RT2860STA.bin"
 #define STA_NIC_DEVICE_NAME			"RT2860STA"
-#define STA_DRIVER_VERSION			"1.7.0.0"
+#define STA_DRIVER_VERSION			"1.8.0.0"
 #ifdef MULTIPLE_CARD_SUPPORT
 #define CARD_INFO_PATH			"/etc/Wireless/RT2860STA/RT2860STACard.dat"
 #endif // MULTIPLE_CARD_SUPPORT //
@@ -161,7 +161,7 @@ typedef int (*HARD_START_XMIT_FUNC)(struct sk_buff *skb, struct net_device *net_
 #define MIN_NET_DEVICE_FOR_MESH			0x30
 #ifdef CONFIG_STA_SUPPORT
 #define MIN_NET_DEVICE_FOR_DLS			0x40
- #endif // CONFIG_STA_SUPPORT //
+#endif // CONFIG_STA_SUPPORT //
 
 
 #ifdef CONFIG_STA_SUPPORT
@@ -171,6 +171,22 @@ typedef int (*HARD_START_XMIT_FUNC)(struct sk_buff *skb, struct net_device *net_
 #define NDIS_PACKET_TYPE_ALL_MULTICAST	3
 #endif // CONFIG_STA_SUPPORT //
 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
+typedef	struct pid *	THREAD_PID;
+#define	THREAD_PID_INIT_VALUE	NULL
+#define	GET_PID(_v)	find_get_pid(_v)
+#define	GET_PID_NUMBER(_v)	pid_nr(_v)
+#define CHECK_PID_LEGALITY(_pid)	if (pid_nr(_pid) >= 0)
+#define KILL_THREAD_PID(_A, _B, _C)	kill_pid(_A, _B, _C)
+#else
+typedef	pid_t	THREAD_PID;
+#define	THREAD_PID_INIT_VALUE	-1
+#define	GET_PID(_v)	_v
+#define	GET_PID_NUMBER(_v)	_v
+#define CHECK_PID_LEGALITY(_pid)	if (_pid >= 0)
+#define KILL_THREAD_PID(_A, _B, _C)	kill_proc(_A, _B, _C)
+#endif
+
 struct os_lock  {
 	spinlock_t		lock;
 	unsigned long  	flags;
@@ -281,11 +297,7 @@ void linux_pci_unmap_single(void *handle, dma_addr_t dma_addr, size_t size, int
 #define NdisMIndicateStatus(_w, _x, _y, _z)
 
 
-#ifdef WIN_NDIS
-typedef	NDIS_MINIPORT_TIMER	RTMP_OS_TIMER;
-#else
 typedef struct timer_list	RTMP_OS_TIMER;
-#endif
 	
 
 
@@ -364,7 +376,7 @@ extern ULONG    RTDebugLevel;
 {												\
 	spin_unlock_bh((spinlock_t *)(__lock));				\
 }
- 
+
 // sample, use semaphore lock to replace IRQ lock, 2007/11/15
 #define RTMP_IRQ_LOCK(__lock, __irqflags)			\
 {													\
@@ -387,7 +399,7 @@ extern ULONG    RTDebugLevel;
 #define RTMP_INT_UNLOCK(__lock, __irqflag)			\
 {													\
 	spin_unlock_irqrestore((spinlock_t *)(__lock), ((unsigned long)__irqflag));	\
-} 
+}
 
 #ifdef RT2860
 #if defined(INF_TWINPASS) || defined(INF_DANUBE) || defined(IKANOS_VX_1X0)
@@ -524,7 +536,7 @@ do { \
 		wait_event_interruptible_timeout(_wait, 0, ONE_TICK); }
 
 
- /* Modified by Wu Xi-Kun 4/21/2006 */
+/* Modified by Wu Xi-Kun 4/21/2006 */
 typedef void (*TIMER_FUNCTION)(unsigned long);
 
 #define COPY_MAC_ADDR(Addr1, Addr2)             memcpy((Addr1), (Addr2), MAC_ADDR_LEN)
@@ -578,8 +590,8 @@ DECLARE_TIMER_FUNCTION(RadioOnExec);
 #ifdef QOS_DLS_SUPPORT
 DECLARE_TIMER_FUNCTION(DlsTimeoutAction);
 #endif // QOS_DLS_SUPPORT //
-#endif // CONFIG_STA_SUPPORT // 
- 
+#endif // CONFIG_STA_SUPPORT //
+
 void RTMP_GetCurrentSystemTime(LARGE_INTEGER *time);
 
 
@@ -685,7 +697,12 @@ void RTMP_GetCurrentSystemTime(LARGE_INTEGER *time);
 
 #define RTMP_SET_PACKET_MOREDATA(_p, _morebit)		(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+7] = _morebit)
 #define RTMP_GET_PACKET_MOREDATA(_p)				(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+7])
- 
+
+
+#if 0
+//#define RTMP_SET_PACKET_DHCP(_p, _flg)   	(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11] = _flg)
+//#define RTMP_GET_PACKET_DHCP(_p)         	(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11])
+#else
 //
 //	Sepcific Pakcet Type definition
 //
@@ -694,6 +711,7 @@ void RTMP_GetCurrentSystemTime(LARGE_INTEGER *time);
 #define RTMP_PACKET_SPECIFIC_DHCP		0x01
 #define RTMP_PACKET_SPECIFIC_EAPOL		0x02
 #define RTMP_PACKET_SPECIFIC_IPV4		0x04
+#define RTMP_PACKET_SPECIFIC_WAI		0x08
 #define RTMP_PACKET_SPECIFIC_VLAN		0x10
 #define RTMP_PACKET_SPECIFIC_LLCSNAP	0x20
 
@@ -720,7 +738,17 @@ void RTMP_GetCurrentSystemTime(LARGE_INTEGER *time);
 			}while(0)
 #define RTMP_GET_PACKET_EAPOL(_p)		(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11] & RTMP_PACKET_SPECIFIC_EAPOL)
 
-#define RTMP_GET_PACKET_LOWRATE(_p)		(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11] & (RTMP_PACKET_SPECIFIC_EAPOL | RTMP_PACKET_SPECIFIC_DHCP))
+//WAI
+#define RTMP_SET_PACKET_WAI(_p, _flg)   													\
+			do{																				\
+				if (_flg)																	\
+					(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11]) |= (RTMP_PACKET_SPECIFIC_WAI);		\
+				else																		\
+					(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11]) &= (!RTMP_PACKET_SPECIFIC_WAI);	\
+			}while(0)
+#define RTMP_GET_PACKET_WAI(_p)		(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11] & RTMP_PACKET_SPECIFIC_WAI)
+
+#define RTMP_GET_PACKET_LOWRATE(_p)		(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11] & (RTMP_PACKET_SPECIFIC_EAPOL | RTMP_PACKET_SPECIFIC_DHCP | RTMP_PACKET_SPECIFIC_WAI))
 
 //VLAN
 #define RTMP_SET_PACKET_VLAN(_p, _flg)   													\
@@ -753,6 +781,8 @@ void RTMP_GetCurrentSystemTime(LARGE_INTEGER *time);
 			}while(0)
 			
 #define RTMP_GET_PACKET_IPV4(_p)		(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11] & RTMP_PACKET_SPECIFIC_IPV4)
+	
+#endif
 
 
 // If this flag is set, it indicates that this EAPoL frame MUST be clear. 
diff --git a/rt2860-1.7.0.0/include/rtmp.h b/rt2860-source-1.8.0.0/include/rtmp.h
similarity index 97%
copy from rt2860-1.7.0.0/include/rtmp.h
copy to rt2860-source-1.8.0.0/include/rtmp.h
index 6b0196f..7259f38 100644
--- a/rt2860-1.7.0.0/include/rtmp.h
+++ b/rt2860-source-1.8.0.0/include/rtmp.h
@@ -43,9 +43,6 @@
 #include "link_list.h"
 #include "spectrum_def.h"
 
-#ifdef MLME_EX
-#include "mlme_ex_def.h"
-#endif // MLME_EX //
 
 #ifdef CONFIG_STA_SUPPORT
 #include <aironet.h>
@@ -138,12 +135,16 @@ extern UCHAR  CipherSuiteWpaNoneAesLen;
 extern UCHAR  SsidIe;
 extern UCHAR  SupRateIe;
 extern UCHAR  ExtRateIe;
+
+#ifdef DOT11_N_SUPPORT
 extern UCHAR  HtCapIe;
 extern UCHAR  AddHtInfoIe;
 extern UCHAR  NewExtChanIe;
 #ifdef DOT11N_DRAFT3
 extern UCHAR  ExtHtCapIe;
 #endif // DOT11N_DRAFT3 //
+#endif // DOT11_N_SUPPORT //
+
 extern UCHAR  ErpIe;
 extern UCHAR  DsIe;
 extern UCHAR  TimIe;
@@ -166,6 +167,8 @@ extern UCHAR  RateSwitchTable[];
 extern UCHAR  RateSwitchTable11B[];
 extern UCHAR  RateSwitchTable11G[];
 extern UCHAR  RateSwitchTable11BG[];
+
+#ifdef DOT11_N_SUPPORT
 extern UCHAR  RateSwitchTable11BGN1S[];
 extern UCHAR  RateSwitchTable11BGN2S[];
 extern UCHAR  RateSwitchTable11BGN2SForABand[];
@@ -176,6 +179,7 @@ extern UCHAR  RateSwitchTable11N2SForABand[];
 #ifdef CONFIG_STA_SUPPORT
 extern UCHAR  PRE_N_HT_OUI[];
 #endif // CONFIG_STA_SUPPORT //
+#endif // DOT11_N_SUPPORT //
 
 #define	MAXSEQ		(0xFFF)
 
@@ -191,7 +195,7 @@ typedef	struct _ATE_INFO {
 	UCHAR	Addr1[MAC_ADDR_LEN];
 	UCHAR	Addr2[MAC_ADDR_LEN];
 	UCHAR	Addr3[MAC_ADDR_LEN];
-    UCHAR	Channel;
+	UCHAR	Channel;
 	UINT32	TxLength;
 	UINT32	TxCount;
 	UINT32	TxDoneCount; // Tx DMA Done
@@ -228,7 +232,7 @@ typedef	struct _ATE_INFO {
 	USHORT		DLen; // Data Length
 	USHORT		seq;
 	UINT32		CID;
-	pid_t 		AtePid;
+	THREAD_PID 		AtePid;
 	// counters
 	UINT32		U2M;
 	UINT32		OtherData;
@@ -264,6 +268,7 @@ struct ate_racfghdr {
 #endif // RALINK_28xx_QA //
 #endif // RALINK_ATE //
 
+#ifdef DOT11_N_SUPPORT
 struct reordering_mpdu
 {
 	struct reordering_mpdu	*next;
@@ -284,6 +289,7 @@ struct reordering_mpdu_pool
 	NDIS_SPIN_LOCK			lock;
 	struct reordering_list 	freelist;
 };
+#endif // DOT11_N_SUPPORT //
 
 typedef struct 	_RSSI_SAMPLE {
 	CHAR			LastRssi0;             // last received RSSI
@@ -385,36 +391,12 @@ typedef struct  _QUEUE_HEADER   {
 #define CKIP_CMIC_ON(_p)			((((_p)->StaCfg.CkipFlag) & 0x08) && ((_p)->StaCfg.bCkipCmicOn == TRUE))
 
 
-#ifdef	WIN_NDIS
-#define RTMP_INC_REF(_A)            NdisInterlockedIncrement(&(_A)->RefCount)
-#define RTMP_DEC_REF(_A)            NdisInterlockedDecrement(&(_A)->RefCount); ASSERT(_A->RefCount >= 0)
-#define RTMP_GET_REF(_A)            ((_A)->RefCount)
-
-#define RTMP_INC_RCV_REF(_A)        ((_A)->RcvRefCount++)
-#define RTMP_DEC_RCV_REF(_A)        ((_A)->RcvRefCount--)
-#define RTMP_GET_RCV_REF(_A)        ((_A)->RcvRefCount)
-
-#define RTMP_OFFSET(field)          ((UINT)FIELD_OFFSET(RTMP_ADAPTER, field))
-#define RTMP_SIZE(field)            sizeof(((PRTMP_ADAPTER)0)->field)
-
-#define COMMON_CFG_OFFSET(field)    ((UINT)FIELD_OFFSET(RTMP_ADAPTER, CommonCfg) + (UINT)FIELD_OFFSET(COMMON_CONFIG, field))
-#define STA_CFG_OFFSET(field)       ((UINT)FIELD_OFFSET(RTMP_ADAPTER, StaCfg) + (UINT)FIELD_OFFSET(STA_ADMIN_CONFIG, field))
-#define AP_CFG_OFFSET(field)        ((UINT)FIELD_OFFSET(RTMP_ADAPTER, ApCfg) + (UINT)FIELD_OFFSET(AP_ADMIN_CONFIG, field))
-#define COMMON_CFG_SIZE(field)      sizeof(((PCOMMON_CONFIG)0)->field)
-#define STA_CFG_SIZE(field)         sizeof(((PSTA_ADMIN_CONFIG)0)->field)
-#define AP_CFG_SIZE(field)          sizeof(((PAP_ADMIN_CONFIG)0)->field)
-
-#define INC_RING_INDEX(_idx, _RingSize)    \
-{                                          \
-    (_idx)++;                              \
-    if ((_idx) >= (_RingSize)) _idx=0;     \
-}
-#else
 #define INC_RING_INDEX(_idx, _RingSize)    \
 {                                          \
     (_idx) = (_idx+1) % (_RingSize);       \
 }
-#endif	/* Modified by Wu Xi-Kun 4/24/2006 */
+
+#define IS_RT3070(_pAd)				(((_pAd)->MACVersion & 0xffff0000) == 0x30700000)
 
 #define RING_PACKET_INIT(_TxRing, _idx)    \
 {                                          \
@@ -449,6 +431,8 @@ typedef struct  _QUEUE_HEADER   {
             break;                                      \
     }                                                   \
 }
+
+#ifdef DOT11_N_SUPPORT
 // StaActive.SupportedHtPhy.MCSSet is copied from AP beacon.  Don't need to update here.
 #define COPY_HTSETTINGS_FROM_MLME_AUX_TO_ACTIVE_CFG(_pAd)                                 \
 {                                                                                       \
@@ -472,7 +456,21 @@ typedef struct  _QUEUE_HEADER   {
 	_pAd->MacTab.Content[BSSID_WCID].MmpsMode= (UCHAR)(_pHtCapability->HtCapInfo.MimoPs);	\
 	_pAd->MacTab.Content[BSSID_WCID].MaxRAmpduFactor = (UCHAR)(_pHtCapability->HtCapParm.MaxRAmpduFactor);	\
 }
+#endif // DOT11_N_SUPPORT //
 
+//
+// MACRO for 32-bit PCI register read / write
+//
+// Usage : RTMP_IO_READ32(
+//              PRTMP_ADAPTER pAd,
+//              ULONG Register_Offset,
+//              PULONG  pValue)
+//
+//         RTMP_IO_WRITE32(
+//              PRTMP_ADAPTER pAd,
+//              ULONG Register_Offset,
+//              ULONG Value)
+//
 
 //
 // BBP & RF are using indirect access. Before write any value into it.
@@ -906,10 +904,8 @@ typedef struct _RTMP_SCATTER_GATHER_LIST {
 }
 #endif // RT2860 //
 
-
 #define NDIS_QUERY_BUFFER(_NdisBuf, _ppVA, _pBufLen)                    \
     NdisQueryBuffer(_NdisBuf, _ppVA, _pBufLen)
-//#endif
 
 #define MAC_ADDR_EQUAL(pAddr1,pAddr2)           RTMPEqualMemory((PVOID)(pAddr1), (PVOID)(pAddr2), MAC_ADDR_LEN)
 #define SSID_EQUAL(ssid1, len1, ssid2, len2)    ((len1==len2) && (RTMPEqualMemory(ssid1, ssid2, len1)))
@@ -939,11 +935,11 @@ typedef struct  _RTMP_REG_PAIR
 	ULONG   Value;
 } RTMP_REG_PAIR, *PRTMP_REG_PAIR;
 
-typedef struct  _BBP_REG_PAIR
+typedef struct  _REG_PAIR
 {
 	UCHAR   Register;
 	UCHAR   Value;
-} BBP_REG_PAIR, *PBBP_REG_PAIR;
+} REG_PAIR, *PREG_PAIR;
 
 //
 // Register set pair for initialzation register set definition
@@ -957,6 +953,13 @@ typedef struct  _RTMP_RF_REGS
 	ULONG   R4;
 } RTMP_RF_REGS, *PRTMP_RF_REGS;
 
+typedef struct _FREQUENCY_ITEM {
+	UCHAR	Channel;
+	UCHAR	N;
+	UCHAR	R;
+	UCHAR	K;
+} FREQUENCY_ITEM, *PFREQUENCY_ITEM;
+
 //
 //  Data buffer for DMA operation, the buffer must be contiguous physical memory
 //  Both DMA to / from CPU use the same structure.
@@ -970,7 +973,7 @@ typedef struct  _RTMP_DMABUF
 
 
 typedef	union	_HEADER_802_11_SEQ{
-#ifdef BIG_ENDAIN
+#ifdef RT_BIG_ENDIAN
     struct {
    	USHORT			Sequence:12;
 	USHORT			Frag:4;
@@ -1410,10 +1413,14 @@ typedef struct _MLME_STRUCT {
 	// Action 
 	STATE_MACHINE           ActMachine;
 
+
 #ifdef QOS_DLS_SUPPORT
 	STATE_MACHINE			DlsMachine;
 	STATE_MACHINE_FUNC      DlsFunc[DLS_FUNC_SIZE];
-#endif // QOS_DLS_SUPPORT //	
+#endif // QOS_DLS_SUPPORT //
+
+	
+	
 
 	ULONG                   ChannelQuality;  // 0..100, Channel Quality Indication for Roaming
 	ULONG                   Now32;           // latch the value of NdisGetSystemUpTime()
@@ -1441,6 +1448,8 @@ typedef struct _MLME_STRUCT {
 	BOOLEAN					bLowThroughput;
 	BOOLEAN					bEnableAutoAntennaCheck;
 	RALINK_TIMER_STRUCT		RxAntEvalTimer;
+
+	
 } MLME_STRUCT, *PMLME_STRUCT;
 
 // structure for radar detection and channel switch
@@ -1496,7 +1505,7 @@ typedef enum _ORI_BLOCKACK_STATUS
     Originator_Done
 } ORI_BLOCKACK_STATUS, *PORI_BLOCKACK_STATUS;
 
-
+#ifdef DOT11_N_SUPPORT
 typedef struct _BA_ORI_ENTRY{
 	UCHAR   Wcid;
 	UCHAR   TID;
@@ -1591,6 +1600,7 @@ typedef	union	_BACAP_STRUC	{
 #endif
 	UINT32			word;
 } BACAP_STRUC, *PBACAP_STRUC;
+#endif // DOT11_N_SUPPORT //
 
 //This structure is for all 802.11n card InterOptibilityTest action. Reset all Num every n second.  (Details see MLMEPeriodic)
 typedef	struct	_IOT_STRUC	{
@@ -1710,6 +1720,7 @@ typedef struct _MULTISSID_STRUCT {
 	NDIS_802_11_AUTHENTICATION_MODE     AuthMode;
 	NDIS_802_11_WEP_STATUS              WepStatus;
 	NDIS_802_11_WEP_STATUS				GroupKeyWepStatus;
+	WPA_MIX_PAIR_CIPHER					WpaMixPairCipher;
 
 	ULONG								TxCount;
 	ULONG								RxCount;
@@ -1719,8 +1730,8 @@ typedef struct _MULTISSID_STRUCT {
 	ULONG								RxDropCount;
 
 	HTTRANSMIT_SETTING					HTPhyMode, MaxHTPhyMode, MinHTPhyMode;// For transmit phy setting in TXWI.	
-	DESIRED_TRANSMIT_SETTING        	DesiredTransmitSetting; // Desired transmit setting. this is for reading registry setting only. not useful.
 	RT_HT_PHY_INFO						DesiredHtPhyInfo;
+	DESIRED_TRANSMIT_SETTING        	DesiredTransmitSetting; // Desired transmit setting. this is for reading registry setting only. not useful.
 	BOOLEAN								bAutoTxRateSwitch;
 	
 	UCHAR                               DefaultKeyId;
@@ -1747,6 +1758,7 @@ typedef struct _MULTISSID_STRUCT {
     UCHAR                               RSNIE_Len[2];
     UCHAR                               RSN_IE[2][MAX_LEN_OF_RSNIE];
 
+
     UCHAR                   			TimIELocationInBeacon;
     UCHAR                   			CapabilityInfoLocationInBeacon;
     // outgoing BEACON frame buffer and corresponding TXWI
@@ -1798,6 +1810,8 @@ typedef struct _MULTISSID_STRUCT {
 	CHAR					RssiOfRcvdSpoofedUnknownMgmt;	
 	CHAR					RssiOfRcvdReplayAttack;		
 	
+	BOOLEAN					bBcnSntReq;
+	UCHAR					BcnBufIdx;
 } MULTISSID_STRUCT, *PMULTISSID_STRUCT;
 
 
@@ -1873,8 +1887,10 @@ typedef struct _COMMON_CONFIG {
 	ULONG       TxPowerPercentage;      // 0~100 %
 	ULONG       TxPowerDefault;         // keep for TxPowerPercentage
 
+#ifdef DOT11_N_SUPPORT
 	BACAP_STRUC        BACapability; //   NO USE = 0XFF  ;  IMMED_BA =1  ;  DELAY_BA=0
 	BACAP_STRUC        REGBACapability; //   NO USE = 0XFF  ;  IMMED_BA =1  ;  DELAY_BA=0
+#endif // DOT11_N_SUPPORT //
 	IOT_STRUC		IOTestParm;	// 802.11n InterOpbility Test Parameter;
 	ULONG       TxPreamble;             // Rt802_11PreambleLong, Rt802_11PreambleShort, Rt802_11PreambleAuto
 	BOOLEAN     bUseZeroToDisableFragment;     // Microsoft use 0 as disable 
@@ -1886,7 +1902,9 @@ typedef struct _COMMON_CONFIG {
 	BOOLEAN     bIEEE80211H;			// 1: enable IEEE802.11h spec.
 	ULONG		DisableOLBCDetect;		// 0: enable OLBC detect; 1 disable OLBC detect 
 
+#ifdef DOT11_N_SUPPORT
 	BOOLEAN				bRdg;
+#endif // DOT11_N_SUPPORT //
 	BOOLEAN             bWmmCapable;        // 0:disable WMM, 1:enable WMM
 	QOS_CAPABILITY_PARM APQosCapability;    // QOS capability of the current associated AP
 	EDCA_PARM           APEdcaParm;         // EDCA parameters of the current associated AP
@@ -1907,9 +1925,14 @@ typedef struct _COMMON_CONFIG {
 	// IEEE802.11H--DFS.
 	RADAR_DETECT_STRUCT	RadarDetect;
 
+#ifdef CARRIER_DETECTION_SUPPORT
+	CARRIER_DETECTION		CarrierDetect;
+#endif // CARRIER_DETECTION_SUPPORT //
 
+#ifdef DOT11_N_SUPPORT
 	// HT
 	UCHAR			BASize;		// USer desired BAWindowSize. Should not exceed our max capability
+	//RT_HT_CAPABILITY	SupportedHtPhy;
 	RT_HT_CAPABILITY	DesiredHtPhy;
 	HT_CAPABILITY_IE		HtCapability;	
 	ADD_HT_INFO_IE		AddHTInfo;	// Useful as AP.
@@ -1935,26 +1958,29 @@ typedef struct _COMMON_CONFIG {
 	ULONG					Dot11BssWidthChanTranDelay;			// multiple of (Dot11BssWidthTriggerScanInt * Dot11BssWidthChanTranDelayFactor)
 	ULONG					CountDownCtr;	// CountDown Counter from (Dot11BssWidthTriggerScanInt * Dot11BssWidthChanTranDelayFactor)
 	
-	NDIS_SPIN_LOCK          	TriggerEventTabLock;
+	NDIS_SPIN_LOCK          TriggerEventTabLock;
 	BSS_2040_COEXIST_IE		LastBSSCoexist2040;
 	BSS_2040_COEXIST_IE		BSSCoexist2040;
 	TRIGGER_EVENT_TAB		TriggerEventTab;
 	UCHAR					ChannelListIdx;
 	// <====== 11n D3.0 =======================
+	BOOLEAN					bOverlapScanning;
 #endif // DOT11N_DRAFT3 //
 
-    BOOLEAN                     bHTProtect;
-    BOOLEAN                     bMIMOPSEnable;
-    BOOLEAN						bBADecline;
-	BOOLEAN						bDisableReordering;
-	BOOLEAN						bForty_Mhz_Intolerant;
-	BOOLEAN						bExtChannelSwitchAnnouncement;
-	BOOLEAN						bRcvBSSWidthTriggerEvents;
-	ULONG						LastRcvBSSWidthTriggerEventsTime;
+    BOOLEAN                 bHTProtect;
+    BOOLEAN                 bMIMOPSEnable;
+    BOOLEAN					bBADecline;
+	BOOLEAN					bDisableReordering;
+	BOOLEAN					bForty_Mhz_Intolerant;
+	BOOLEAN					bExtChannelSwitchAnnouncement;
+	BOOLEAN					bRcvBSSWidthTriggerEvents;
+	ULONG					LastRcvBSSWidthTriggerEventsTime;
+
+	UCHAR					TxBASize;	
+#endif // DOT11_N_SUPPORT //
 
 	// Enable wireless event
-	BOOLEAN				bWirelessEvent;		
-	UCHAR				TxBASize;
+	BOOLEAN				bWirelessEvent;
 	BOOLEAN				bWiFiTest;				// Enable this parameter for WiFi test		
 
 	// Tx & Rx Stream number selection
@@ -1967,13 +1993,26 @@ typedef struct _COMMON_CONFIG {
 	UCHAR				McastTransmitPhyMode;
 #endif // MCAST_RATE_SPECIFIC //
 
-	BOOLEAN     bHardwareRadio;     // Hardware controlled Radio enabled
+	BOOLEAN     		bHardwareRadio;     // Hardware controlled Radio enabled
 
-	NDIS_SPIN_LOCK			MeasureReqTabLock;
+
+
+ 	NDIS_SPIN_LOCK			MeasureReqTabLock;
 	PMEASURE_REQ_TAB		pMeasureReqTab;
 
 	NDIS_SPIN_LOCK			TpcReqTabLock;
 	PTPC_REQ_TAB			pTpcReqTab;
+
+	// transmit phy mode, trasmit rate for Multicast.
+#ifdef MCAST_RATE_SPECIFIC
+	HTTRANSMIT_SETTING		MCastPhyMode;
+#endif // MCAST_RATE_SPECIFIC //
+
+#ifdef SINGLE_SKU
+	UINT16					DefineMaxTxPwr;
+#endif // SINGLE_SKU //
+
+
 } COMMON_CONFIG, *PCOMMON_CONFIG;
 
 
@@ -2034,6 +2073,7 @@ typedef struct _STA_ADMIN_CONFIG {
 
 	UCHAR		DefaultKeyId;			
 
+
 	// WPA 802.1x port control, WPA_802_1X_PORT_SECURED, WPA_802_1X_PORT_NOT_SECURED
 	UCHAR       PortSecured;
 
@@ -2054,6 +2094,9 @@ typedef struct _STA_ADMIN_CONFIG {
 
 	ULONG       LastBeaconRxTime;     // OS's timestamp of the last BEACON RX time
 	ULONG       Last11bBeaconRxTime;  // OS's timestamp of the last 11B BEACON RX time
+	ULONG		Last11gBeaconRxTime;	// OS's timestamp of the last 11G BEACON RX time
+	ULONG		Last20NBeaconRxTime;	// OS's timestamp of the last 20MHz N BEACON RX time
+	
 	ULONG       LastScanTime;       // Record last scan time for issue BSSID_SCAN_LIST
 	ULONG       ScanCnt;            // Scan counts since most recent SSID, BSSID, SCAN OID request
 	BOOLEAN     bSwRadio;           // Software controlled Radio On/Off, TRUE: On
@@ -2063,6 +2106,8 @@ typedef struct _STA_ADMIN_CONFIG {
 	BOOLEAN     bShowHiddenSSID;    // Show all known SSID in SSID list get operation
 
     BOOLEAN		AdhocBOnlyJoined;	// Indicate Adhoc B Join.
+    BOOLEAN		AdhocBGJoined;		// Indicate Adhoc B/G Join.
+    BOOLEAN		Adhoc20NJoined;		// Indicate Adhoc 20MHz N Join.
     
 	// New for WPA, windows want us to to keep association information and
 	// Fixed IEs from last association response
@@ -2075,8 +2120,6 @@ typedef struct _STA_ADMIN_CONFIG {
 	UCHAR       RSNIE_Len;
 	UCHAR       RSN_IE[MAX_LEN_OF_RSNIE];	// The content saved here should be little-endian format.
 
-	ULONG       AdhocMode;          // 0:WIFI mode (11b rates only), 1: b/g mixed, 2: 11g only
-
 	// New variables used for CCX 1.0
 	BOOLEAN             bCkipOn;
 	BOOLEAN             bCkipCmicOn;
@@ -2237,12 +2280,13 @@ typedef struct PACKED _RT_802_11_WPA_REKEY {
 
 typedef struct _MAC_TABLE_ENTRY {
 	//Choose 1 from ValidAsWDS and ValidAsCLI  to validize.
-	BOOLEAN         ValidAsCLI;		// Sta mode, set this TRUE after Linkup,too.
-	BOOLEAN         ValidAsWDS;	// This is WDS Entry. only for AP mode.
-	BOOLEAN         ValidAsApCli;   //This is a AP-Client entry, only for AP mode which enable AP-Client functions.
-	BOOLEAN         ValidAsMesh;
-	BOOLEAN         ValidAsDls;	// This is DLS Entry. only for STA mode.
-	BOOLEAN         bIAmBadAtheros;	// Flag if this is Atheros chip that has IOT problem.  We need to turn on RTS/CTS protection.
+	BOOLEAN		ValidAsCLI;		// Sta mode, set this TRUE after Linkup,too.
+	BOOLEAN		ValidAsWDS;	// This is WDS Entry. only for AP mode.
+	BOOLEAN		ValidAsApCli;   //This is a AP-Client entry, only for AP mode which enable AP-Client functions.
+	BOOLEAN		ValidAsMesh;
+	BOOLEAN		ValidAsDls;	// This is DLS Entry. only for STA mode.
+	BOOLEAN		isCached;
+	BOOLEAN		bIAmBadAtheros;	// Flag if this is Atheros chip that has IOT problem.  We need to turn on RTS/CTS protection.
 
 	UCHAR         	EnqueueEapolStartTimerRunning;  // Enqueue EAPoL-Start for triggering EAP SM
 	//jan for wpa
@@ -2268,10 +2312,12 @@ typedef struct _MAC_TABLE_ENTRY {
     INT				PMKID_CacheIdx;
     UCHAR			PMKID[LEN_PMKID];
 
+
 	UCHAR           Addr[MAC_ADDR_LEN];
 	UCHAR           PsMode;
 	SST             Sst;
 	AUTH_STATE      AuthState; // for SHARED KEY authentication state machine used only
+	BOOLEAN			IsReassocSta;	// Indicate whether this is a reassociation procedure
 	USHORT          Aid;
 	USHORT          CapabilityInfo;
 	UCHAR           LastRssi;
@@ -2283,17 +2329,17 @@ typedef struct _MAC_TABLE_ENTRY {
 	UINT32			StaConnectTime;		// the live time of this station since associated with AP 
 
 
-
+#ifdef DOT11_N_SUPPORT
 	BOOLEAN			bSendBAR;
 	USHORT			NoBADataCountDown;
 
-	BOOLEAN			isCached;
 	UINT32   		CachedBuf[16];		// UINT (4 bytes) for alignment
+	UINT			TxBFCount; // 3*3
+#endif // DOT11_N_SUPPORT //
 	UINT			FIFOCount;
 	UINT			DebugFIFOCount;
 	UINT			DebugTxCount;
     BOOLEAN			bDlsInit;
-	UINT			TxBFCount; // 3*3
 
 
 //====================================================
@@ -2308,10 +2354,13 @@ typedef struct _MAC_TABLE_ENTRY {
 	UINT32			OneSecTxNoRetryOkCount;
 	UINT32          OneSecTxRetryOkCount;
 	UINT32          OneSecTxFailCount;
-	UINT32           CurrTxRateStableTime; // # of second in current TX rate
+	UINT32			ContinueTxFailCnt;
+	UINT32          CurrTxRateStableTime; // # of second in current TX rate
 	UCHAR           TxRateUpPenalty;      // extra # of second penalty due to last unstable condition
 //====================================================
 
+
+
 #ifdef CONFIG_STA_SUPPORT
 #ifdef QOS_DLS_SUPPORT
 	UINT			MatchDlsEntryIdx; // indicate the index in pAd->StaCfg.DLSEntry
@@ -2330,6 +2379,11 @@ typedef struct _MAC_TABLE_ENTRY {
 	// CLIENT_STATUS_TEST_FLAG(), CLIENT_STATUS_SET_FLAG(), CLIENT_STATUS_CLEAR_FLAG() macros.
 	// see fOP_STATUS_xxx in RTMP_DEF.C for detail bit definition. fCLIENT_STATUS_AMSDU_INUSED
 	ULONG           ClientStatusFlags;
+
+	// TODO: Shall we move that to DOT11_N_SUPPORT???
+	HTTRANSMIT_SETTING	HTPhyMode, MaxHTPhyMode, MinHTPhyMode;// For transmit phy setting in TXWI.
+	
+#ifdef DOT11_N_SUPPORT
 	// HT EWC MIMO-N used parameters
 	USHORT		RXBAbitmap;	// fill to on-chip  RXWI_BA_BITMASK in 8.1.3RX attribute entry format
 	USHORT		TXBAbitmap;	// This bitmap as originator, only keep in software used to mark AMPDU bit in TXWI 
@@ -2338,20 +2392,23 @@ typedef struct _MAC_TABLE_ENTRY {
 	USHORT		BARecWcidArray[NUM_OF_TID];	// The mapping wcid of recipient session. if RXBAbitmap bit is masked
 	USHORT		BAOriWcidArray[NUM_OF_TID]; // The mapping wcid of originator session. if TXBAbitmap bit is masked
 	USHORT		BAOriSequence[NUM_OF_TID]; // The mapping wcid of originator session. if TXBAbitmap bit is masked
-	HTTRANSMIT_SETTING	HTPhyMode, MaxHTPhyMode, MinHTPhyMode;// For transmit phy setting in TXWI.
-	BOOLEAN		bAutoTxRateSwitch;
+
 	// 802.11n features.
 	UCHAR		MpduDensity;
 	UCHAR		MaxRAmpduFactor;
+	UCHAR		AMsduSize;
+	UCHAR		MmpsMode;	// MIMO power save more. 
+
+	HT_CAPABILITY_IE		HTCapability;
+
 #ifdef DOT11N_DRAFT3
 	UCHAR		BSS2040CoexistenceMgmtSupport;
 #endif // DOT11N_DRAFT3 //
+#endif // DOT11_N_SUPPORT //
 
+	BOOLEAN		bAutoTxRateSwitch;
 
-	UCHAR		AMsduSize;
-	UCHAR		MmpsMode;	// MIMO power save more. 
 	UCHAR       RateLen;
-	HT_CAPABILITY_IE		HTCapability;
 	struct _MAC_TABLE_ENTRY *pNext;
     USHORT      TxSeq[NUM_OF_TID];
 	USHORT		NonQosDataSeq;
@@ -2371,15 +2428,18 @@ typedef struct _MAC_TABLE {
 	QUEUE_HEADER    McastPsQueue;
 	ULONG           PsQIdleCount;
 	BOOLEAN         fAnyStationInPsm;   
+	BOOLEAN         fAnyStationBadAtheros;	// Check if any Station is atheros 802.11n Chip.  We need to use RTS/CTS with Atheros 802,.11n chip. 
+	BOOLEAN			fAnyTxOPForceDisable;	// Check if it is necessary to disable BE TxOP
+#ifdef DOT11_N_SUPPORT	
 	BOOLEAN         fAnyStationIsLegacy;	// Check if I use legacy rate to transmit to my BSS Station/
 	BOOLEAN         fAnyStationNonGF;		// Check if any Station can't support GF.
 	BOOLEAN         fAnyStation20Only;		// Check if any Station can't support GF.
-	BOOLEAN         fAnyStationBadAtheros;	// Check if any Station is atheros 802.11n Chip.  We need to use RTS/CTS with Atheros 802,.11n chip. 
 	BOOLEAN			fAnyStationMIMOPSDynamic; // Check if any Station is MIMO Dynamic
-	BOOLEAN			fAnyTxOPForceDisable;	// Check if it is necessary to disable BE TxOP
 	BOOLEAN         fAnyBASession;   // Check if there is BA session.  Force turn on RTS/CTS 
+#endif // DOT11_N_SUPPORT //
 } MAC_TABLE, *PMAC_TABLE;
 
+#ifdef DOT11_N_SUPPORT
 #define IS_HT_STA(_pMacEntry)	\
 	(_pMacEntry->MaxHTPhyMode.field.MODE >= MODE_HTMIX)
 
@@ -2388,6 +2448,7 @@ typedef struct _MAC_TABLE {
 
 #define PEER_IS_HT_RATE(_pMacEntry)	\
 	(_pMacEntry->HTPhyMode.field.MODE >= MODE_HTMIX)
+#endif // DOT11_N_SUPPORT //
 
 typedef struct _WDS_ENTRY {
 	BOOLEAN         Valid;
@@ -2420,11 +2481,10 @@ typedef struct _RT_802_11_WDS_ENTRY {
 	NDIS_802_11_WEP_STATUS  WepStatus;
 	UCHAR					KeyIdx;
 	CIPHER_KEY          	WdsKey;
-
 	HTTRANSMIT_SETTING				HTPhyMode, MaxHTPhyMode, MinHTPhyMode;
-	BOOLEAN							bAutoTxRateSwitch;	
-	DESIRED_TRANSMIT_SETTING       	DesiredTransmitSetting; // Desired transmit setting.
 	RT_HT_PHY_INFO					DesiredHtPhyInfo;
+	BOOLEAN							bAutoTxRateSwitch;
+	DESIRED_TRANSMIT_SETTING       	DesiredTransmitSetting; // Desired transmit setting.
 } RT_802_11_WDS_ENTRY, *PRT_802_11_WDS_ENTRY;
 
 typedef struct _WDS_TABLE {
@@ -2479,7 +2539,7 @@ typedef struct _APCLI_STRUCT {
 
 	CIPHER_KEY      SharedKey[SHARE_KEY_NUM];
 	UCHAR           DefaultKeyId;
-    
+
 	// store RSN_IE built by driver
 	UCHAR		RSN_IE[MAX_LEN_OF_RSNIE];  // The content saved here should be convert to little-endian format.
 	UCHAR		RSNIE_Len; 
@@ -2492,10 +2552,14 @@ typedef struct _APCLI_STRUCT {
 	UCHAR       	SNonce[32];         // SNonce for WPA-PSK
 	UCHAR			GNonce[32];			// GNonce for WPA-PSK from authenticator
 	
+#ifdef WSC_AP_SUPPORT
+	WSC_CTRL	           WscControl;
+#endif // WSC_AP_SUPPORT //	
+
 	HTTRANSMIT_SETTING				HTPhyMode, MaxHTPhyMode, MinHTPhyMode;
+	RT_HT_PHY_INFO					DesiredHtPhyInfo;
 	BOOLEAN							bAutoTxRateSwitch;
 	DESIRED_TRANSMIT_SETTING       	DesiredTransmitSetting; // Desired transmit setting.
-	RT_HT_PHY_INFO					DesiredHtPhyInfo;
 } APCLI_STRUCT, *PAPCLI_STRUCT;
 
 // ----------- end of AP ----------------------------
@@ -2607,7 +2671,6 @@ typedef struct _RTMP_ADAPTER
     USHORT                  HostLnkCtrlOffset;
 	USHORT		            PCIePowerSaveLevel;
    	BOOLEAN					bPCIclkOff;						// flag that indicate if the PICE power status in Configuration SPace..
-	BOOLEAN					bPCIclkOffCommand;				// flag that indicates whether the PCIe power command is issued or not.
 	BOOLEAN					bPCIclkOffDisableTx;			// 
 
     
@@ -2624,7 +2687,7 @@ typedef struct _RTMP_ADAPTER
 	RTMP_DMABUF             TxBufSpace[NUM_OF_TX_RING]; // Shared memory of all 1st pre-allocated TxBuf associated with each TXD
 	RTMP_DMABUF             RxDescRing;                 // Shared memory for RX descriptors
 	RTMP_DMABUF             TxDescRing[NUM_OF_TX_RING]; 	// Shared memory for Tx descriptors
-	RTMP_TX_RING            TxRing[NUM_OF_TX_RING];     	// AC0~4 + HCCA 
+	RTMP_TX_RING            TxRing[NUM_OF_TX_RING];     	// AC0~4 + HCCA
 #endif // RT2860 //
 
 
@@ -2657,15 +2720,11 @@ typedef struct _RTMP_ADAPTER
 /*****************************************************************************************/
 /*      Rx related parameters                                                           */
 /*****************************************************************************************/
-#ifdef WIN_NDIS
-	RTMP_RXBUF              LocalRxReorderBuf[MAX_BARECI_SESSION];	// resource for software backlog queues
-#endif
 
 #ifdef RT2860
 	RTMP_RX_RING            RxRing;
 	NDIS_SPIN_LOCK          RxRingLock;                 // Rx Ring spinlock
-
- #endif // RT2860 //
+#endif // RT2860 //
 	
 
 
@@ -2707,7 +2766,7 @@ typedef struct _RTMP_ADAPTER
 	CHANNEL_TX_POWER        TxPower[MAX_NUM_OF_CHANNELS];       // Store Tx power value for all channels.
 	CHANNEL_TX_POWER        ChannelList[MAX_NUM_OF_CHANNELS];   // list all supported channels for site survey
 	CHANNEL_11J_TX_POWER    TxPower11J[MAX_NUM_OF_11JCHANNELS];       // 802.11j channel and bw
-	CHANNEL_11J_TX_POWER    ChannelList11J[MAX_NUM_OF_11JCHANNELS];   // list all supported channels for site survey	
+	CHANNEL_11J_TX_POWER    ChannelList11J[MAX_NUM_OF_11JCHANNELS];   // list all supported channels for site survey
 	
 	UCHAR                   ChannelListNum;                     // number of channel in ChannelList[]
 	UCHAR					Bbp94;
@@ -2770,7 +2829,7 @@ typedef struct _RTMP_ADAPTER
 
 	// pre-build PS-POLL and NULL frame upon link up. for efficiency purpose.
 	PSPOLL_FRAME            	PsPollFrame;
-	HEADER_802_11           	NullFrame; 
+	HEADER_802_11           	NullFrame;
 
 //=========AP===========
 
@@ -2792,10 +2851,10 @@ typedef struct _RTMP_ADAPTER
 	// OP mode: either AP or STA
 	UCHAR                   OpMode;                     // OPMODE_STA, OPMODE_AP
 	
-	NDIS_MEDIA_STATE        IndicateMediaState;			// Base on Indication state, default is NdisMediaStateDisConnected 
+	NDIS_MEDIA_STATE        IndicateMediaState;			// Base on Indication state, default is NdisMediaStateDisConnected
+
+	// MAT related parameters
 
-	// MAT related parameters 
-	
 	// configuration: read from Registry & E2PROM
 	BOOLEAN                 bLocalAdminMAC;             // Use user changed MAC
 	UCHAR                   PermanentAddress[MAC_ADDR_LEN];    // Factory default MAC address
@@ -2815,20 +2874,14 @@ typedef struct _RTMP_ADAPTER
 	MAC_TABLE                 MacTab;     // ASIC on-chip WCID entry table.  At TX, ASIC always use key according to this on-chip table.
 	NDIS_SPIN_LOCK          MacTabLock;
 
+#ifdef DOT11_N_SUPPORT
 	BA_TABLE			BATable;
+#endif // DOT11_N_SUPPORT //
 	NDIS_SPIN_LOCK          BATabLock;
 	RALINK_TIMER_STRUCT RECBATimer;
 	
 	// encryption/decryption KEY tables
 	CIPHER_KEY              SharedKey[MAX_MBSSID_NUM][4]; // STA always use SharedKey[BSS0][0..3]
-//  CIPHER_KEY              PairwiseKey[64];        // for AP only
-
-
-#ifdef WIN_NDIS
-	// 802.3 multicast support
-	ULONG                   NumberOfMcastAddresses;     // Number of mcast entry exists
-	UCHAR                   McastTable[MAX_MCAST_LIST_SIZE][MAC_ADDR_LEN];      // Mcast list
-#endif
 
 		// RX re-assembly buffer for fragmentation
 	FRAGMENT_FRAME          FragFrame;                  // Frame storage for fragment frame
@@ -2839,13 +2892,13 @@ typedef struct _RTMP_ADAPTER
 	COUNTER_RALINK          RalinkCounters;             // Ralink propriety counters
 	COUNTER_DRS             DrsCounters;                // counters for Dynamic TX Rate Switching
 	PRIVATE_STRUC           PrivateInfo;                // Private information & counters
-	
+
 	// flags, see fRTMP_ADAPTER_xxx flags
 	ULONG                   Flags;                      // Represent current device status
 
 	// current TX sequence #
 	USHORT                  Sequence;
- 
+
 #ifdef UNDER_CE
 	NDIS_HANDLE             hGiISR;
 #endif
@@ -2874,6 +2927,8 @@ typedef struct _RTMP_ADAPTER
 	RT_802_11_EVENT_TABLE   EventTab;
 
 
+	BOOLEAN		HTCEnable;
+	
 	/*****************************************************************************************/
 	/*      Statistic related parameters                                                     */
 	/*****************************************************************************************/
@@ -2882,7 +2937,7 @@ typedef struct _RTMP_ADAPTER
 	ULONG						watchDogMacDeadlock;	// prevent MAC/BBP into deadlock condition
 	// ----------------------------
 	// DEBUG paramerts
-	// ---------------------------- 
+	// ----------------------------
 	BOOLEAN		bBanAllBaSetup;
 	BOOLEAN		bPromiscuous;
 
@@ -2895,12 +2950,9 @@ typedef struct _RTMP_ADAPTER
 	ULONG		bacontent[16];
 	ULONG		rxint[RX_RING_SIZE+1];
 	UCHAR		rcvba[60];
-	ULONG		MRS;
-	BOOLEAN		HTCEnable;
 	BOOLEAN		bLinkAdapt;
 	BOOLEAN		bForcePrintTX;
 	BOOLEAN		bForcePrintRX;
-	BOOLEAN		bForceDisableautowake;	// defined in RT2870 USB
 	BOOLEAN		bDisablescanning;		//defined in RT2870 USB
 	BOOLEAN		bStaFifoTest;
 	BOOLEAN		bProtectionTest;
@@ -2908,10 +2960,6 @@ typedef struct _RTMP_ADAPTER
 	BOOLEAN		bGenOneHCCA;
 	BOOLEAN		bBroadComHT;
 	//+++Following add from RT2870 USB.
-	BOOLEAN		bDisableResetPipe;
-	BOOLEAN		bVenderReset;
-	BOOLEAN		bBulkInFail;
-	//ULONG		QuickTimerP;			// defined in RT2870 USB but not use.
 	ULONG		BulkOutReq;
 	ULONG		BulkOutComplete;
 	ULONG		BulkOutCompleteOther;
@@ -2927,16 +2975,17 @@ typedef struct _RTMP_ADAPTER
 	ATE_INFO				ate;
 #endif // RALINK_ATE //
 
+#ifdef DOT11_N_SUPPORT
 	struct reordering_mpdu_pool mpdu_blk_pool;
+#endif // DOT11_N_SUPPORT //
 
 	ULONG					OneSecondnonBEpackets;		// record non BE packets per second 
 
-
 #if WIRELESS_EXT >= 12
     struct iw_statistics    iw_stats;
 #endif
 
-	struct net_device_stats	stats; 
+	struct net_device_stats	stats;
 
 #ifdef BLOCK_NET_IF
 	BLOCK_QUEUE_ENTRY		blockQueueTab[NUM_OF_TX_RING];
@@ -2962,16 +3011,25 @@ typedef struct _RTMP_ADAPTER
 	UCHAR					flg_be_adjust;
 	ULONG					be_adjust_last_time;
 
+#ifdef NINTENDO_AP
+	NINDO_CTRL_BLOCK		nindo_ctrl_block;
+#endif // NINTENDO_AP //
+
+
 #ifdef IKANOS_VX_1X0
 	struct IKANOS_TX_INFO	IkanosTxInfo;
-	struct IKANOS_TX_INFO	IkanosRxInfo[MAX_MBSSID_NUM];
+	struct IKANOS_TX_INFO	IkanosRxInfo[MAX_MBSSID_NUM + MAX_WDS_ENTRY + MAX_APCLI_NUM + MAX_MESH_NUM];
 #endif // IKANOS_VX_1X0 //
 
+
 #ifdef DBG_DIAGNOSE
 	RtmpDiagStruct	DiagStruct;
 #endif // DBG_DIAGNOSE //
+
+
+	UINT8					PM_FlgSuspend;
 } RTMP_ADAPTER, *PRTMP_ADAPTER;
- 
+
 //
 // Cisco IAPP format
 //
@@ -3038,7 +3096,7 @@ typedef struct _RX_BLK_
 #define fRX_MESH		0x0200
 #define fRX_APCLI		0x0400
 #define fRX_DLS			0x0800
-
+#define fRX_WPI			0x1000
 
 #define LENGTH_AMSDU_SUBFRAMEHEAD	14
 #define LENGTH_ARALINK_SUBFRAMEHEAD	14
@@ -3090,7 +3148,7 @@ typedef struct _TX_BLK_
 
 	//YOU SHOULD NOT TOUCH IT! Following parameters are used for hardware-depended layer.
 	ULONG				Priv;						// Hardware specific value saved in here.
- } TX_BLK, *PTX_BLK;
+} TX_BLK, *PTX_BLK;
 
 
 #define fTX_bRtsRequired		0x0001	// Indicate if need send RTS frame for protection. Not used in RT2860/RT2870.
@@ -3194,7 +3252,7 @@ static inline VOID	WriteBackToDescriptor(
 		Call this function when read or update descriptor
 	========================================================================
 */
-static VOID	RTMPWIEndianChange(
+static inline VOID	RTMPWIEndianChange(
 	IN	PUCHAR			pData,
 	IN	ULONG			DescriptorType)
 {
@@ -3264,7 +3322,7 @@ static inline VOID	RTMPDescriptorEndianChange(
 		Call this function when read or update buffer data
 	========================================================================
 */
-static VOID	RTMPFrameEndianChange(
+static inline VOID	RTMPFrameEndianChange(
 	IN	PRTMP_ADAPTER	pAd, 
 	IN	PUCHAR			pData, 
 	IN	ULONG			Dir,
@@ -3396,6 +3454,45 @@ static VOID	RTMPFrameEndianChange(
 }
 #endif // RT_BIG_ENDIAN //
 
+
+static inline VOID ConvertMulticastIP2MAC(
+	IN PUCHAR pIpAddr,
+	IN PUCHAR *ppMacAddr, 
+	IN UINT16 ProtoType)
+{
+	if (pIpAddr == NULL)
+		return;
+
+	if (ppMacAddr == NULL || *ppMacAddr == NULL)
+		return;
+
+	switch (ProtoType)
+	{
+		case ETH_P_IPV6:
+//			memset(*ppMacAddr, 0, ETH_LENGTH_OF_ADDRESS);
+			*(*ppMacAddr) = 0x33;
+			*(*ppMacAddr + 1) = 0x33;
+			*(*ppMacAddr + 2) = pIpAddr[12];
+			*(*ppMacAddr + 3) = pIpAddr[13];
+			*(*ppMacAddr + 4) = pIpAddr[14];
+			*(*ppMacAddr + 5) = pIpAddr[15];
+			break;
+
+		case ETH_P_IP:
+		default:
+//			memset(*ppMacAddr, 0, ETH_LENGTH_OF_ADDRESS);
+			*(*ppMacAddr) = 0x01;
+			*(*ppMacAddr + 1) = 0x00;
+			*(*ppMacAddr + 2) = 0x5e;
+			*(*ppMacAddr + 3) = pIpAddr[1] & 0x7f;
+			*(*ppMacAddr + 4) = pIpAddr[2];
+			*(*ppMacAddr + 5) = pIpAddr[3];
+			break;
+	}
+
+	return;
+}
+
 BOOLEAN RTMPCheckForHang(
 	IN  NDIS_HANDLE MiniportAdapterContext
 	);
@@ -3403,7 +3500,7 @@ BOOLEAN RTMPCheckForHang(
 VOID  RTMPHalt(
 	IN  NDIS_HANDLE MiniportAdapterContext
 	);
-  
+
 //
 //  Private routines in rtmp_init.c
 //
@@ -3434,6 +3531,7 @@ NDIS_STATUS NICReadRegParameters(
 	IN  NDIS_HANDLE         WrapperConfigurationContext
 	);
 
+	
 VOID NICReadEEPROMParameters(
 	IN  PRTMP_ADAPTER       pAd,
 	IN	PUCHAR				mac_addr);
@@ -3598,6 +3696,7 @@ VOID MlmeQOSAction(
     IN PRTMP_ADAPTER pAd, 
     IN MLME_QUEUE_ELEM *Elem);
 
+#ifdef DOT11_N_SUPPORT
 VOID PeerAddBAReqAction(
 	IN PRTMP_ADAPTER pAd, 
 	IN MLME_QUEUE_ELEM *Elem);
@@ -3613,6 +3712,7 @@ VOID PeerDelBAAction(
 VOID PeerBAAction(
     IN PRTMP_ADAPTER pAd, 
     IN MLME_QUEUE_ELEM *Elem);
+#endif // DOT11_N_SUPPORT //
 
 VOID SendPSMPAction(
 	IN PRTMP_ADAPTER	pAd,
@@ -3678,9 +3778,11 @@ VOID PeerBSSTranAction(
 	IN PRTMP_ADAPTER pAd, 
 	IN MLME_QUEUE_ELEM *Elem);
 
+#ifdef DOT11_N_SUPPORT
 VOID PeerHTAction(
 	IN PRTMP_ADAPTER pAd, 
 	IN MLME_QUEUE_ELEM *Elem);
+#endif // DOT11_N_SUPPORT //
 
 VOID PeerQOSAction(
     IN PRTMP_ADAPTER pAd, 
@@ -3702,6 +3804,7 @@ VOID DlsParmFill(
 #endif // QOS_DLS_SUPPORT //
 #endif // CONFIG_STA_SUPPORT //
 
+#ifdef DOT11_N_SUPPORT
 VOID RECBATimerTimeout(
     IN PVOID SystemSpecific1, 
     IN PVOID FunctionContext, 
@@ -3714,6 +3817,7 @@ VOID ORIBATimerTimeout(
 VOID SendRefreshBAR(
 	IN	PRTMP_ADAPTER	pAd,
 	IN	MAC_TABLE_ENTRY	*pEntry);
+#endif // DOT11_N_SUPPORT //
 	
 VOID ActHeaderInit(
     IN	PRTMP_ADAPTER	pAd, 
@@ -3746,6 +3850,7 @@ BOOLEAN QosBADataParse(
 	IN USHORT Datasize,
 	IN UINT   CurRxIndex);
 
+#ifdef DOT11_N_SUPPORT
 BOOLEAN CntlEnqueueForRecv(
     IN	PRTMP_ADAPTER	pAd, 
 	IN ULONG Wcid, 
@@ -3754,6 +3859,7 @@ BOOLEAN CntlEnqueueForRecv(
 
 VOID BaAutoManSwitch(
 	IN	PRTMP_ADAPTER	pAd);
+#endif // DOT11_N_SUPPORT //
 
 VOID HTIOTCheck(
 	IN	PRTMP_ADAPTER	pAd,
@@ -3796,7 +3902,7 @@ BOOLEAN PeerIsAggreOn(
     IN  PRTMP_ADAPTER   pAd,
     IN  ULONG          TxRate,
     IN  PMAC_TABLE_ENTRY pMacEntry);
-	
+
 NDIS_STATUS Sniff2BytesFromNdisBuffer(
 	IN  PNDIS_BUFFER    pFirstBuffer,
 	IN  UCHAR           DesiredOffset,
@@ -4111,7 +4217,7 @@ VOID AsicSetBssid(
 
 VOID AsicSetMcastWC(
 	IN PRTMP_ADAPTER pAd);
- 
+
 VOID AsicDelWcidTab(
 	IN PRTMP_ADAPTER pAd,
 	IN UCHAR	Wcid);
@@ -4226,9 +4332,11 @@ VOID MlmeRadioOn(
 VOID BssTableInit(
 	IN BSS_TABLE *Tab);
 
+#ifdef DOT11_N_SUPPORT
 VOID BATableInit(
 	IN PRTMP_ADAPTER pAd,
     IN BA_TABLE *Tab);
+#endif // DOT11_N_SUPPORT //
 
 ULONG BssTableSearch(
 	IN BSS_TABLE *Tab, 
@@ -4254,6 +4362,7 @@ VOID BssTableDeleteEntry(
 	IN      PUCHAR pBssid,
 	IN      UCHAR Channel);
 
+#ifdef DOT11_N_SUPPORT
 VOID BATableDeleteORIEntry(
 	IN OUT	PRTMP_ADAPTER pAd, 
 	IN		BA_ORI_ENTRY	*pBAORIEntry);
@@ -4274,6 +4383,7 @@ VOID BATableTearRECEntry(
 	IN		UCHAR TID, 
 	IN		UCHAR WCID, 
 	IN		BOOLEAN ALL);
+#endif // DOT11_N_SUPPORT //
 
 VOID  BssEntrySet(
 	IN  PRTMP_ADAPTER   pAd, 
@@ -4335,6 +4445,7 @@ ULONG  BssTableSetEntry(
 	IN USHORT LengthVIE,
 	IN PNDIS_802_11_VARIABLE_IEs pVIE);
 
+#ifdef DOT11_N_SUPPORT
 VOID BATableInsertEntry(
     IN	PRTMP_ADAPTER	pAd, 
 	IN USHORT Aid,    
@@ -4368,6 +4479,7 @@ ULONG TriEventTableSetEntry(
 VOID TriEventCounterMaintenance(
 	IN	PRTMP_ADAPTER	pAd);
 #endif // DOT11N_DRAFT3 //
+#endif // DOT11_N_SUPPORT //
 
 VOID BssTableSsidSort(
 	IN  PRTMP_ADAPTER   pAd, 
@@ -4405,7 +4517,8 @@ BOOLEAN MlmeEnqueueForRecv(
 	IN ULONG MsgLen, 
 	IN PVOID Msg,
 	IN UCHAR Signal);
- 
+
+
 BOOLEAN MlmeDequeue(
 	IN MLME_QUEUE *Queue, 
 	OUT MLME_QUEUE_ELEM **Elem);
@@ -5100,7 +5213,6 @@ BOOLEAN PeerWpaMessageSanity(
     IN 	PEAPOL_PACKET 		pMsg, 
     IN 	ULONG 				MsgLen, 
     IN 	UCHAR				MsgType,
-    IN	PUCHAR				pMIC,
     IN 	MAC_TABLE_ENTRY  	*pEntry);
 
 BOOLEAN PeerDeauthSanity(
@@ -5238,10 +5350,11 @@ VOID MlmeUpdateTxRates(
 	IN 	BOOLEAN		 	bLinkUp,
 	IN	UCHAR			apidx);
 
+#ifdef DOT11_N_SUPPORT
 VOID MlmeUpdateHtTxRates(
 	IN PRTMP_ADAPTER 		pAd,
 	IN	UCHAR				apidx);
-
+#endif // DOT11_N_SUPPORT //
 
 VOID    RTMPCheckRates(
 	IN      PRTMP_ADAPTER   pAd,
@@ -5261,10 +5374,6 @@ BOOLEAN 	RTMPCheckHt(
 	IN OUT	HT_CAPABILITY_IE			*pHtCapability,
 	IN OUT	ADD_HT_INFO_IE			*pAddHtInfo);
 
-BOOLEAN		RTMPCheckAddHtInfoIe(
-	IN		PRTMP_ADAPTER	pAd,
-	IN OUT	ADD_HT_INFO_IE	*pAddHTInfo);
-
 VOID StaQuickResponeForRateUpExec(
 	IN PVOID SystemSpecific1, 
 	IN PVOID FunctionContext, 
@@ -5446,7 +5555,7 @@ BOOLEAN RTMPSoftDecryptAES(
 	IN PUCHAR	pData,
 	IN ULONG	DataByteCnt, 
 	IN PCIPHER_KEY	pWpaKey);
- 
+
 //
 // Prototypes of function definition in cmm_info.c
 //
@@ -5506,6 +5615,7 @@ VOID    RTMPAddBSSIDCipher(
     IN  UCHAR   CipherAlg);
 #endif // CONFIG_STA_SUPPORT //
 
+#ifdef DOT11_N_SUPPORT
 VOID	RTMPSetHT(
 	IN	PRTMP_ADAPTER	pAd,
 	IN	OID_SET_HT_PHYMODE *pHTPhyMode);
@@ -5513,6 +5623,7 @@ VOID	RTMPSetHT(
 VOID	RTMPSetIndividualHT(
 	IN	PRTMP_ADAPTER		pAd,
 	IN	UCHAR				apidx);
+#endif // DOT11_N_SUPPORT //
 
 VOID RTMPSendWirelessEvent(
 	IN	PRTMP_ADAPTER	pAd,
@@ -5875,7 +5986,7 @@ VOID RTMPHandleSTAKey(
     IN PRTMP_ADAPTER    pAdapter, 
     IN MAC_TABLE_ENTRY  *pEntry,
     IN MLME_QUEUE_ELEM  *Elem);
- 
+
 VOID PeerGroupMsg2Action(
 	IN  PRTMP_ADAPTER    pAd, 
 	IN  PMAC_TABLE_ENTRY pEntry,
@@ -6146,6 +6257,11 @@ PNDIS_PACKET duplicate_pkt_with_VLAN(
 	IN	ULONG			DataSize,
 	IN	UCHAR			FromWhichBSSID);
 
+PNDIS_PACKET duplicate_pkt_with_WPI(
+	IN	PRTMP_ADAPTER	pAd,
+	IN	PNDIS_PACKET	pPacket,
+	IN	UINT32			ext_head_len,
+	IN	UINT32			ext_tail_len);
 
 UCHAR VLAN_8023_Header_Copy(
 	IN	PRTMP_ADAPTER	pAd, 
@@ -6154,7 +6270,7 @@ UCHAR VLAN_8023_Header_Copy(
 	OUT PUCHAR			pData,
 	IN	UCHAR			FromWhichBSSID);
 
-
+#ifdef DOT11_N_SUPPORT
 void ba_flush_reordering_timeout_mpdus(
 	IN PRTMP_ADAPTER	pAd, 
 	IN PBA_REC_ENTRY	pBAEntry,
@@ -6172,6 +6288,7 @@ VOID BAOriSessionSetUp(
 VOID BASessionTearDownALL(
 	IN OUT	PRTMP_ADAPTER pAd, 
 	IN		UCHAR Wcid);
+#endif // DOT11_N_SUPPORT //
 
 BOOLEAN OS_Need_Clone_Packet(void);
 
@@ -6182,10 +6299,6 @@ VOID build_tx_packet(
 	IN	PUCHAR	pFrame,
 	IN	ULONG	FrameLen);
 
-VOID STAMacTableReset(
-	IN  PRTMP_ADAPTER  pAd);
-
-
 
 VOID BAOriSessionTearDown(
 	IN OUT	PRTMP_ADAPTER	pAd, 
@@ -6225,7 +6338,7 @@ void ChannelInfoDestroy(
 
 UCHAR New_ApAutoSelectChannel(
 	IN PRTMP_ADAPTER pAd);
- 
+
 BOOLEAN rtstrmactohex(
 	IN char *s1,
 	IN char *s2);
@@ -6246,6 +6359,10 @@ char *rstrtok(
 	IN char * s,
 	IN const char * ct);
 	
+int rtinet_aton(
+	const char *cp, 
+	unsigned int *addr);
+	
 ////////// common ioctl functions //////////
 INT Set_DriverVersion_Proc(
 	IN	PRTMP_ADAPTER	pAd, 
@@ -6319,6 +6436,7 @@ INT	Set_ResetStatCounter_Proc(
 	IN	PRTMP_ADAPTER	pAd, 
 	IN	PUCHAR			arg);
 
+#ifdef DOT11_N_SUPPORT
 INT	Set_BASetup_Proc(
 	IN	PRTMP_ADAPTER	pAd, 
 	IN	PUCHAR			arg);
@@ -6419,6 +6537,9 @@ INT	Set_HtMIMOPSmode_Proc(
 INT	Set_HtTxBASize_Proc(
 	IN	PRTMP_ADAPTER	pAd, 
 	IN	PUCHAR			arg);
+#endif // DOT11_N_SUPPORT //
+
+
 
 #ifdef CONFIG_STA_SUPPORT
 //Dls ,	kathy
@@ -6426,10 +6547,12 @@ VOID RTMPSendDLSTearDownFrame(
 	IN	PRTMP_ADAPTER	pAd,
 	IN	PUCHAR			pDA);
 
+#ifdef DOT11_N_SUPPORT
 //Block ACK
 VOID QueryBATABLE(
 	IN  PRTMP_ADAPTER pAd,
 	OUT PQUERYBA_TABLE pBAT);
+#endif // DOT11_N_SUPPORT //
 
 #ifdef WPA_SUPPLICANT_SUPPORT
 INT	    WpaCheckEapCode(
@@ -6455,13 +6578,14 @@ int wext_notify_event_assoc(
 
 
 
+#ifdef DOT11_N_SUPPORT
 VOID Handle_BSS_Width_Trigger_Events(
 	IN PRTMP_ADAPTER pAd);
 
 void build_ext_channel_switch_ie(
 	IN PRTMP_ADAPTER pAd,
 	IN HT_EXT_CHANNEL_SWITCH_ANNOUNCEMENT_IE *pIE);
-
+#endif // DOT11_N_SUPPORT //
 
 
 BOOLEAN APRxDoneInterruptHandle(
@@ -6471,20 +6595,22 @@ BOOLEAN STARxDoneInterruptHandle(
 	IN	PRTMP_ADAPTER	pAd,
 	IN	BOOLEAN			argc);
 
+#ifdef DOT11_N_SUPPORT
 // AMPDU packet indication
 VOID Indicate_AMPDU_Packet(
 	IN	PRTMP_ADAPTER	pAd,
 	IN	RX_BLK			*pRxBlk,
 	IN	UCHAR			FromWhichBSSID);
 
-// Normal legacy Rx packet indication
-VOID Indicate_Legacy_Packet(
+// AMSDU packet indication
+VOID Indicate_AMSDU_Packet(
 	IN	PRTMP_ADAPTER	pAd,
 	IN	RX_BLK			*pRxBlk,
 	IN	UCHAR			FromWhichBSSID);
+#endif // DOT11_N_SUPPORT //
 
-// AMSDU packet indication
-VOID Indicate_AMSDU_Packet(
+// Normal legacy Rx packet indication
+VOID Indicate_Legacy_Packet(
 	IN	PRTMP_ADAPTER	pAd,
 	IN	RX_BLK			*pRxBlk,
 	IN	UCHAR			FromWhichBSSID);
@@ -6612,6 +6738,9 @@ PNDIS_PACKET RTMPDeFragmentDataFrame(
 ////////////////////////////////////////
 
 
+
+
+
 #ifdef SNMP_SUPPORT
 //for snmp , kathy
 typedef struct _DefaultKeyIdxValue
@@ -6757,13 +6886,13 @@ static inline char* GetPhyMode(
 
 		case MODE_OFDM:
 			return "OFDM";
-
+#ifdef DOT11_N_SUPPORT
 		case MODE_HTMIX:
 			return "HTMIX";
 
 		case MODE_HTGREENFIELD:
 			return "GREEN";
-
+#endif // DOT11_N_SUPPORT //
 		default:
 			return "N/A";
 	}
@@ -6780,10 +6909,10 @@ static inline char* GetBW(
 
 		case BW_20:
 			return "20M";
-
+#ifdef DOT11_N_SUPPORT
 		case BW_40:
 			return "40M";
-
+#endif // DOT11_N_SUPPORT //
 		default:
 			return "N/A";
 	}
@@ -7020,11 +7149,17 @@ int rt28xx_open(IN PNET_DEV dev);
 
 __inline INT VIRTUAL_IF_UP(PRTMP_ADAPTER pAd)
 {
+extern VOID MeshMakeBeacon(IN PRTMP_ADAPTER pAd, IN UCHAR idx);
+extern VOID MeshUpdateBeaconFrame(IN PRTMP_ADAPTER pAd, IN UCHAR idx);
+
 	if (VIRTUAL_IF_NUM(pAd) == 0)
 	{
 		if (rt28xx_open(pAd->net_dev) != 0)
 			return -1;
 	}
+	else
+	{
+	}
 	VIRTUAL_IF_INC(pAd);
 	return 0;
 }
@@ -7037,5 +7172,6 @@ __inline VOID VIRTUAL_IF_DOWN(PRTMP_ADAPTER pAd)
 	return;
 }
 
+
 #endif  // __RTMP_H__
 
diff --git a/rt2860-1.7.0.0/include/rtmp_ckipmic.h b/rt2860-source-1.8.0.0/include/rtmp_ckipmic.h
similarity index 100%
copy from rt2860-1.7.0.0/include/rtmp_ckipmic.h
copy to rt2860-source-1.8.0.0/include/rtmp_ckipmic.h
diff --git a/rt2860-1.7.0.0/include/rtmp_def.h b/rt2860-source-1.8.0.0/include/rtmp_def.h
similarity index 98%
copy from rt2860-1.7.0.0/include/rtmp_def.h
copy to rt2860-source-1.8.0.0/include/rtmp_def.h
index ad1851e..bac1b0a 100644
--- a/rt2860-1.7.0.0/include/rtmp_def.h
+++ b/rt2860-source-1.8.0.0/include/rtmp_def.h
@@ -210,7 +210,6 @@
 #define fOP_STATUS_TX_AMSDU_INUSED			0x00002000
 #define fOP_STATUS_MAX_RETRY_ENABLED		0x00004000
 #define fOP_STATUS_WAKEUP_NOW               0x00008000
-#define fOP_STATUS_CLKSELECT_40MHZ          0x00010000
 #define fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE       0x00020000
 
 #ifdef DOT11N_DRAFT3
@@ -329,7 +328,7 @@
 #ifdef MBSS_SUPPORT
 #undef	MAX_MBSSID_NUM
 #define MAX_MBSSID_NUM				(8 - MAX_MESH_NUM - MAX_APCLI_NUM)
-#endif /* !MBSS_SUPPORT */
+#endif // MBSS_SUPPORT //
 
 /* sanity check for apidx */
 #define MBSS_MR_APIDX_SANITY_CHECK(apidx) \
@@ -1097,8 +1096,10 @@
 // Preamble MODE in TxD
 #define MODE_CCK	0
 #define MODE_OFDM   1
+#ifdef DOT11_N_SUPPORT
 #define MODE_HTMIX	2
 #define MODE_HTGREENFIELD	3
+#endif // DOT11_N_SUPPORT //
 // MCS for CCK.  BW.SGI.STBC are reserved
 #define MCS_LONGP_RATE_1                      0	 // long preamble CCK 1Mbps
 #define MCS_LONGP_RATE_2                      1	// long preamble CCK 1Mbps
@@ -1145,10 +1146,12 @@
 #define MCS_32		32
 #define MCS_AUTO		33
 
+#ifdef DOT11_N_SUPPORT
 // OID_HTPHYMODE
 // MODE
 #define HTMODE_MM	0	 
 #define HTMODE_GF	1
+#endif // DOT11_N_SUPPORT //
 
 // Fixed Tx MODE - HT, CCK or OFDM
 #define FIXED_TXMODE_HT		0
@@ -1159,12 +1162,16 @@
 #define BW_40		BAND_WIDTH_40
 #define BW_BOTH		BAND_WIDTH_BOTH
 #define BW_10		BAND_WIDTH_10	// 802.11j has 10MHz. This definition is for internal usage. doesn't fill in the IE or other field.
+
+#ifdef DOT11_N_SUPPORT
 // SHORTGI
 #define GI_400		GAP_INTERVAL_400	// only support in HT mode
-#define GI_800		GAP_INTERVAL_800	
 #define GI_BOTH		GAP_INTERVAL_BOTH
+#endif // DOT11_N_SUPPORT //
+#define GI_800		GAP_INTERVAL_800	
 // STBC
 #define STBC_NONE	0
+#ifdef DOT11_N_SUPPORT
 #define STBC_USE	1	// limited use in rt2860b phy
 #define RXSTBC_ONE	1	// rx support of one spatial stream
 #define RXSTBC_TWO	2	// rx support of 1 and 2 spatial stream
@@ -1186,6 +1193,8 @@
 #define	AMSDU_0	0
 #define	AMSDU_1		1
 
+#endif // DOT11_N_SUPPORT //
+
 // MCS use 7 bits 
 #define TXRATEMIMO		0x80
 #define TXRATEMCS		0x7F
@@ -1269,12 +1278,15 @@
 #define CIPHER_CKIP64               5
 #define CIPHER_CKIP128              6
 #define CIPHER_TKIP_NO_MIC          7       // MIC appended by driver: not a valid value in hardware key table
+#define CIPHER_SMS4					8
 
 // value domain of pAd->RfIcType
 #define RFIC_2820                   1       // 2.4G 2T3R
 #define RFIC_2850                   2       // 2.4G/5G 2T3R
 #define RFIC_2720                   3       // 2.4G 1T2R
 #define RFIC_2750                   4       // 2.4G/5G 1T2R
+#define RFIC_3020                   5       // 2.4G 1T1R
+#define RFIC_2020                   6       // 2.4G B/G
 
 // LED Status.
 #define LED_LINK_DOWN               0
@@ -1301,23 +1313,6 @@
 #define PAIRWISE_KEY                1
 #define GROUP_KEY                   2
 
-#define PCI_CFG_ADDR_PORT           0xcf8
-#define PCI_CFG_DATA_PORT           0xcfc
-
-// vendor ID
-#define RICOH                       0x1180
-#define O2MICRO                     0x1217
-#define TI                          0x104c
-#define RALINK                      0x1814
-#define TOSHIBA                     0x1179
-#define ENE                         0x1524
-#define UNKNOWN                     0xffff
-
-#define CARD_BRIDGE_CLASS           0x0607          // CardBus bridge class & subclass
-
-#define MAX_PCI_DEVICE              32      // support up to 32 devices per bus
-#define MAX_PCI_BUS                 32      // support 10 buses
-#define MAX_FUNC_NUM                4
 //definition of DRS
 #define MAX_STEP_OF_TX_RATE_SWITCH	32
 
@@ -1489,6 +1484,7 @@
 #define	IW_FLOOD_EVENT_FLAG_END                   	0x0406
 #define	IW_FLOOD_EVENT_TYPE_NUM						(IW_FLOOD_EVENT_FLAG_END - IW_FLOOD_EVENT_FLAG_START + 1)
 // For flooding attack - end 
+
 // End - WIRELESS EVENTS definition
 
 #ifdef CONFIG_STA_SUPPORT
@@ -1515,6 +1511,7 @@
 #define MCAST_DISABLE	0
 #define MCAST_CCK		1
 #define MCAST_OFDM		2
+#define MCAST_HTMIX		3
 #endif // MCAST_RATE_SPECIFIC //
 
 // For AsicRadioOff/AsicRadioOn function
@@ -1524,6 +1521,12 @@
 #define GUI_IDLE_POWER_SAVE		3
 // --
 
+
+// definition for WpaSupport flag
+#define WPA_SUPPLICANT_DISABLE				0
+#define WPA_SUPPLICANT_ENABLE				1
+#define	WPA_SUPPLICANT_ENABLE_WITH_WEB_UI	2
+
 // Endian byte swapping codes
 #define SWAP16(x) \
     ((UINT16)( \
diff --git a/rt2860-1.7.0.0/include/rtmp_type.h b/rt2860-source-1.8.0.0/include/rtmp_type.h
similarity index 99%
copy from rt2860-1.7.0.0/include/rtmp_type.h
copy to rt2860-source-1.8.0.0/include/rtmp_type.h
index acbad34..fd469b8 100644
--- a/rt2860-1.7.0.0/include/rtmp_type.h
+++ b/rt2860-source-1.8.0.0/include/rtmp_type.h
@@ -38,7 +38,6 @@
 #ifndef __RTMP_TYPE_H__
 #define __RTMP_TYPE_H__
 
-
 #define PACKED  __attribute__ ((packed))
 
 // Put platform dependent declaration here
diff --git a/rt2860-1.7.0.0/include/spectrum.h b/rt2860-source-1.8.0.0/include/spectrum.h
similarity index 100%
copy from rt2860-1.7.0.0/include/spectrum.h
copy to rt2860-source-1.8.0.0/include/spectrum.h
diff --git a/rt2860-1.7.0.0/include/spectrum_def.h b/rt2860-source-1.8.0.0/include/spectrum_def.h
similarity index 100%
copy from rt2860-1.7.0.0/include/spectrum_def.h
copy to rt2860-source-1.8.0.0/include/spectrum_def.h
diff --git a/rt2860-1.7.0.0/include/wpa.h b/rt2860-source-1.8.0.0/include/wpa.h
similarity index 86%
copy from rt2860-1.7.0.0/include/wpa.h
copy to rt2860-source-1.8.0.0/include/wpa.h
index b51af56..013e6e8 100644
--- a/rt2860-1.7.0.0/include/wpa.h
+++ b/rt2860-source-1.8.0.0/include/wpa.h
@@ -124,6 +124,11 @@
 #define EAPOL_START_PSK						1
 #define EAPOL_START_1X						2
 
+#define MIX_CIPHER_WPA_TKIP_ON(x)       (((x) & 0x08) != 0)
+#define MIX_CIPHER_WPA_AES_ON(x)        (((x) & 0x04) != 0)
+#define MIX_CIPHER_WPA2_TKIP_ON(x)      (((x) & 0x02) != 0)
+#define MIX_CIPHER_WPA2_AES_ON(x)       (((x) & 0x01) != 0)
+
 #define ROUND_UP(__x, __y) \
 	(((ULONG)((__x)+((__y)-1))) & ((ULONG)~((__y)-1)))
 
@@ -139,6 +144,8 @@
 	}while (_V[cnt] == 0);				\
 }
 
+#define IS_WPA_CAPABILITY(a)       (((a) >= Ndis802_11AuthModeWPA) && ((a) <= Ndis802_11AuthModeWPA1PSKWPA2PSK))
+
 // EAPOL Key Information definition within Key descriptor format
 typedef	struct PACKED _KEY_INFO
 {
@@ -288,6 +295,37 @@ typedef	enum	_WpaState
 	SS_KEYUPDATE,			// 5
 }	WPA_STATE;
 
+// 
+//	The definition of the cipher combination
+//
+// 	 bit3	bit2  bit1   bit0
+//	+------------+------------+ 
+// 	|	  WPA	 |	   WPA2   |
+//	+------+-----+------+-----+
+//	| TKIP | AES | TKIP | AES |
+//	|	0  |  1  |   1  |  0  | -> 0x06
+//	|	0  |  1  |   1  |  1  | -> 0x07
+//	|	1  |  0  |   0  |  1  | -> 0x09
+//	|	1  |  0  |   1  |  1  | -> 0x0B
+//	|	1  |  1  |   0  |  1  | -> 0x0D
+//	|	1  |  1  |   1  |  0  | -> 0x0E									
+//	|	1  |  1  |   1  |  1  |	-> 0x0F																												
+//	+------+-----+------+-----+	
+//
+typedef	enum	_WpaMixPairCipher
+{
+	MIX_CIPHER_NOTUSE 			= 0x00,	
+	WPA_NONE_WPA2_TKIPAES		= 0x03,		// WPA2-TKIPAES
+	WPA_AES_WPA2_TKIP 			= 0x06,				
+	WPA_AES_WPA2_TKIPAES		= 0x07,			
+	WPA_TKIP_WPA2_AES			= 0x09,			
+	WPA_TKIP_WPA2_TKIPAES		= 0x0B,  	
+	WPA_TKIPAES_WPA2_NONE		= 0x0C,		// WPA-TKIPAES
+	WPA_TKIPAES_WPA2_AES		= 0x0D,
+	WPA_TKIPAES_WPA2_TKIP		= 0x0E,  			
+	WPA_TKIPAES_WPA2_TKIPAES	= 0x0F,	
+}	WPA_MIX_PAIR_CIPHER;
+
 typedef struct PACKED _RSN_IE_HEADER_STRUCT	{
 	UCHAR		Eid;
 	UCHAR		Length;
diff --git a/rt2860-1.7.0.0/iwpriv_usage.txt b/rt2860-source-1.8.0.0/iwpriv_usage.txt
similarity index 100%
copy from rt2860-1.7.0.0/iwpriv_usage.txt
copy to rt2860-source-1.8.0.0/iwpriv_usage.txt
diff --git a/rt2860-1.7.0.0/os/linux/2860_main_dev.c b/rt2860-source-1.8.0.0/os/linux/2860_main_dev.c
similarity index 75%
copy from rt2860-1.7.0.0/os/linux/2860_main_dev.c
copy to rt2860-source-1.8.0.0/os/linux/2860_main_dev.c
index 19bedba..1e1e7c7 100644
--- a/rt2860-1.7.0.0/os/linux/2860_main_dev.c
+++ b/rt2860-source-1.8.0.0/os/linux/2860_main_dev.c
@@ -172,7 +172,10 @@ static int rt2860_suspend(
 	{
 		pAd = (PRTMP_ADAPTER)net_dev->priv;
 
-		if (net_dev->flags & IFF_UP)
+		/* we can not use IFF_UP because ra0 down but ra1 up */
+		/* and 1 suspend/resume function for 1 module, not for each interface */
+		/* so Linux will call suspend/resume function once */
+		if (VIRTUAL_IF_NUM(pAd) > 0)
 		{
 			// avoid users do suspend after interface is down
 
@@ -189,6 +192,7 @@ static int rt2860_suspend(
 
 			// take down the device
 			rt28xx_close((PNET_DEV)net_dev);
+
 			RT_MOD_DEC_USE_COUNT();
 		}
 	}
@@ -247,9 +251,12 @@ static int rt2860_resume(
 	else
 		pAd = (PRTMP_ADAPTER)net_dev->priv;
 
-		if (pAd != NULL)
+	if (pAd != NULL)
 	{
-		if (net_dev->flags & IFF_UP)
+		/* we can not use IFF_UP because ra0 down but ra1 up */
+		/* and 1 suspend/resume function for 1 module, not for each interface */
+		/* so Linux will call suspend/resume function once */
+		if (VIRTUAL_IF_NUM(pAd) > 0)
 		{
 			// mark device as attached from system and restart if needed
 			netif_device_attach(net_dev);
@@ -340,6 +347,9 @@ static VOID __devexit rt2860_remove_one(
 			MC_CardUsed[pAd->MC_RowID] = 0; // not clear MAC address
 #endif // MULTIPLE_CARD_SUPPORT //
 
+    
+
+
 		// Unregister network device
 		unregister_netdev(net_dev);
 
@@ -380,44 +390,9 @@ static INT __devinit   rt2860_probe(
 {
 	PRTMP_ADAPTER pAd;
     INT rv = 0;
-    USHORT  device_id;
-    BOOLEAN isNoneAdvancedPSdevice = TRUE;
-	POS_COOKIE pObj;	
 
     rv = (INT)rt28xx_probe((void *)pci_dev, (void *)ent, 0, &pAd);
-	if (rv == 0)
-	{
-		pObj = (POS_COOKIE) pAd->OS_Cookie;
-	    pci_read_config_word(pci_dev, PCI_DEVICE_ID, &device_id);
-	    device_id = le2cpu16(device_id);
-	    if ((device_id == NIC2860_PCIe_DEVICE_ID) || 
-	        (device_id == NIC2790_PCIe_DEVICE_ID) ||
-	        (device_id == VEN_AWT_PCIe_DEVICE_ID))
-		{
-			UINT32 MacCsr0 = 0, Index= 0;
-			do 
-			{
-				RTMP_IO_READ32(pAd, MAC_CSR0, &MacCsr0);
-
-				if ((MacCsr0 != 0x00) && (MacCsr0 != 0xFFFFFFFF))
-					break;
-
-				RTMPusecDelay(10);
-			} while (Index++ < 100);
-
-			// Support advanced power save after 2892/2790.
-			// MAC version at offset 0x1000 is 0x2872XXXX/0x2870XXXX(PCIe, USB, SDIO).
-			if ((MacCsr0&0xffff0000) != 0x28600000)
-			{
-				OPSTATUS_SET_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE);
-				isNoneAdvancedPSdevice = FALSE;
-			}
-		}
-		if (isNoneAdvancedPSdevice)
-		{
-			OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE);
-	    }
-	}    
+	OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE);
 	return rv;
 }
 
@@ -846,37 +821,6 @@ rt2860_interrupt(int irq, void *dev_instance, struct pt_regs *regs)
 	// Should start from highest priority interrupt
 	// The priority can be adjust by altering processing if statement
 	//
-#ifdef DBG
-	if ((RTDebugLevel == RT_DEBUG_LOUD) && (((++print_int_count) % 100) == 0))
-	{
-		UINT32 reg = 0;
-		int Count, free;
-
-		RTMP_IO_READ32(pAd, INT_MASK_CSR, &reg);     // 1:enable
-		printk("%d: INT_MASK_CSR = %08x, IntSource %08x\n", print_int_count, reg, IntSource.word);
-		RTMP_IO_READ32(pAd, TX_CTX_IDX0 + 0 * 0x10 , &reg);
-		printk("TX_CTX_IDX0 = %08x\n", reg);
-		RTMP_IO_READ32(pAd, TX_DTX_IDX0 + 0 * 0x10 , &reg);
-		printk("TX_DTX_IDX0 = %08x\n", reg);
-		RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &reg);
-		printk("WPDMA_GLO_CFG = %08x\n", reg);
-		for (Count = 0; Count < 1; Count++)
-		{
-			if (pAd->TxRing[Count].TxSwFreeIdx> pAd->TxRing[Count].TxCpuIdx)
-				free = pAd->TxRing[Count].TxSwFreeIdx - pAd->TxRing[Count].TxCpuIdx -1;
-			else
-				free = pAd->TxRing[Count].TxSwFreeIdx + TX_RING_SIZE - pAd->TxRing[Count].TxCpuIdx -1;
-		
-			printk("%d: Free = %d TxSwFreeIdx = %d\n", Count, free, pAd->TxRing[Count].TxSwFreeIdx); 
-		}
-		printk("pAd->int_disable_mask = %08x\n", pAd->int_disable_mask);
-		printk("pAd->int_enable_reg = %08x\n", pAd->int_enable_reg);
-		printk("pAd->int_pending = %08x\n", pAd->int_pending);
-		RTMP_IO_READ32(pAd, RX_DRX_IDX , &reg);
-		printk("pAd->RxRing.RxSwReadIdx = %08x, RX_DRX_IDX = %08x\n", pAd->RxRing.RxSwReadIdx, reg);
-	}
-#endif
-		
 
     pAd->bPCIclkOff = FALSE;
 
@@ -909,6 +853,7 @@ rt2860_interrupt(int irq, void *dev_instance, struct pt_regs *regs)
 
 	if (IntSource.word & FifoStaFullInt) 
 	{
+#if 1
 		if ((pAd->int_disable_mask & FifoStaFullInt) == 0) 
 		{
 			/* mask FifoStaFullInt */
@@ -916,6 +861,9 @@ rt2860_interrupt(int irq, void *dev_instance, struct pt_regs *regs)
 			tasklet_hi_schedule(&pObj->fifo_statistic_full_task);
 		}
 		pAd->int_pending |= FifoStaFullInt; 
+#else
+		NICUpdateFifoStaCounters(pAd);		
+#endif
 	}
 
 	if (IntSource.word & INT_MGMT_DLY) 
@@ -1302,174 +1250,11 @@ VOID RT28xx_UpdateBeaconToAsic(
 VOID RTMPInitPCIeLinkCtrlValue(
 	IN	PRTMP_ADAPTER	pAd)
 {
-    INT     pos;
-    USHORT	reg16, data2, PCIePowerSaveLevel, Configuration;
-    BOOLEAN	bFindIntel = FALSE;
-	POS_COOKIE pObj;
-
-	pObj = (POS_COOKIE) pAd->OS_Cookie;
-
-	if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE))
-		return;   
-
-    DBGPRINT(RT_DEBUG_TRACE, ("%s.===>\n", __FUNCTION__));
-	// Init EEPROM, and save settings
-	PCIePowerSaveLevel = RTMP_EEPROM_READ16(pAd, 0x22);
-	pAd->PCIePowerSaveLevel = PCIePowerSaveLevel & 0xff;
-
-    if ((PCIePowerSaveLevel&0xff) == 0xff)
-    {
-    	OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE);
-		DBGPRINT(RT_DEBUG_TRACE, ("====> PCIePowerSaveLevel = 0x%x.\n", PCIePowerSaveLevel));
-		return;
-    }
-	else
-	{
-		PCIePowerSaveLevel &= 0x3;
-		data2 = RTMP_EEPROM_READ16(pAd, 0x24);
-
-		if( !(((data2&0xff00) == 0x9200) && ((data2&0x80) !=0)) )
-		{
-			if (PCIePowerSaveLevel > 1 ) 
-				PCIePowerSaveLevel = 1;
-		}
-
-		DBGPRINT(RT_DEBUG_TRACE, ("====> Write 0x83 = 0x%x.\n", PCIePowerSaveLevel));
-		AsicSendCommandToMcu(pAd, 0x83, 0xff, (UCHAR)PCIePowerSaveLevel, 0x00);
-		PCIePowerSaveLevel = RTMP_EEPROM_READ16(pAd, 0x22);
-		PCIePowerSaveLevel &= 0xff;
-		PCIePowerSaveLevel = PCIePowerSaveLevel >> 6;
-		switch(PCIePowerSaveLevel)
-		{
-			case 0:
-				pAd->LnkCtrlBitMask = 0x0;
-				break;
-			case 1:
-				pAd->LnkCtrlBitMask = 0x1;
-				break;
-			case 2:
-				pAd->LnkCtrlBitMask = 0x3;
-				break;
-			case 3:
-				pAd->LnkCtrlBitMask = 0x103;
-				break;
-		}
-		DBGPRINT(RT_DEBUG_TRACE, ("====> LnkCtrlBitMask = 0x%x.\n", pAd->LnkCtrlBitMask));
-	}   
-    
-    // Find Ralink PCIe Device's Express Capability Offset
-	pos = pci_find_capability(pObj->pci_dev, PCI_CAP_ID_EXP);
-
-    if (pos != 0)
-    {
-        // Ralink PCIe Device's Link Control Register Offset
-        pAd->RLnkCtrlOffset = pos + PCI_EXP_LNKCTL;
-    	pci_read_config_word(pObj->pci_dev, pAd->RLnkCtrlOffset, &reg16);
-        Configuration = le2cpu16(reg16);
-        DBGPRINT(RT_DEBUG_TRACE, ("Read (Ralink PCIe Link Control Register) offset 0x%x = 0x%x\n", 
-                                    pAd->RLnkCtrlOffset, Configuration));
-        pAd->RLnkCtrlConfiguration = (Configuration & 0x103);
-        Configuration &= 0xfefc;
-        // value with 0 is more stable than value with 1, 
-        // but value with 1 is more power save than value with 0.
-        Configuration |= (0x0); 
-        reg16 = cpu2le16(Configuration);
-        pci_write_config_word(pObj->pci_dev, pAd->RLnkCtrlOffset, reg16);
-        DBGPRINT(RT_DEBUG_TRACE, ("Write (Ralink PCIe Link Control Register)  offset 0x%x = 0x%x\n", 
-                                    pos + PCI_EXP_LNKCTL, Configuration));
-        
-        RTMPFindHostPCIDev(pAd);
-        if (pObj->parent_pci_dev)
-        {
-            USHORT  vendor_id;
-            
-            pci_read_config_word(pObj->parent_pci_dev, PCI_VENDOR_ID, &vendor_id);
-            vendor_id = le2cpu16(vendor_id);
-            if (vendor_id == PCIBUS_INTEL_VENDOR)
-				bFindIntel = TRUE;
-            
-            // Find PCI-to-PCI Bridge Express Capability Offset
-            pos = pci_find_capability(pObj->parent_pci_dev, PCI_CAP_ID_EXP);
-
-            if (pos != 0)
-            {
-                // PCI-to-PCI Bridge Link Control Register Offset
-                pAd->HostLnkCtrlOffset = pos + PCI_EXP_LNKCTL;
-            	pci_read_config_word(pObj->parent_pci_dev, pAd->HostLnkCtrlOffset, &reg16);    
-                Configuration = le2cpu16(reg16);
-                DBGPRINT(RT_DEBUG_TRACE, ("Read (Host PCI-to-PCI Bridge Link Control Register) offset 0x%x = 0x%x\n", 
-                                            pAd->HostLnkCtrlOffset, Configuration));    
-                pAd->HostLnkCtrlConfiguration = (Configuration & 0x103);
-                Configuration &= 0xfefc;
-                // value with 0 is more stable than value with 1, 
-                // but value with 1 is more power save than value with 0.
-                Configuration |= pAd->LnkCtrlBitMask;//(0x0);
-                reg16 = cpu2le16(Configuration);
-                pci_write_config_word(pObj->parent_pci_dev, pAd->HostLnkCtrlOffset, reg16);
-                DBGPRINT(RT_DEBUG_TRACE, ("Write (Host PCI-to-PCI Bridge Link Control Register) offset 0x%x = 0x%x\n", 
-                                            pAd->HostLnkCtrlOffset, Configuration));
-            }
-            else
-            {
-                pAd->HostLnkCtrlOffset = 0;
-                DBGPRINT(RT_DEBUG_ERROR, ("%s: cannot find PCI-to-PCI Bridge PCI Express Capability!\n", __FUNCTION__));
-            }
-        }
-    }
-    else
-    {
-        pAd->RLnkCtrlOffset = 0;
-        pAd->HostLnkCtrlOffset = 0;
-        DBGPRINT(RT_DEBUG_ERROR, ("%s: cannot find Ralink PCIe Device's PCI Express Capability!\n", __FUNCTION__));
-    }
-
-    if (bFindIntel == FALSE)
-	{
-		DBGPRINT(RT_DEBUG_TRACE, ("Doesn't find Intel PCI host controller. \n"));
-		// Doesn't switch L0, L1, So set PCIePowerSaveLevel to 0xff, which means we doesn't
-		pAd->PCIePowerSaveLevel = 0xff;
-	}
 }
 
 VOID RTMPFindHostPCIDev(
     IN	PRTMP_ADAPTER	pAd)
 {
-    USHORT  reg16;
-    UCHAR   reg8;
-	UINT	DevFn;
-    PPCI_DEV    pPci_dev;
-	POS_COOKIE 	pObj;
-
-	pObj = (POS_COOKIE) pAd->OS_Cookie;
-
-	if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE))
-		return;
-    
-    DBGPRINT(RT_DEBUG_TRACE, ("%s.===>\n", __FUNCTION__));
-
-    pObj->parent_pci_dev = NULL;
-    if (pObj->pci_dev->bus->parent)
-    {
-        for (DevFn = 0; DevFn < 255; DevFn++)
-        {
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-			pPci_dev = pci_get_slot(pObj->pci_dev->bus->parent, DevFn);
-#else
-            pPci_dev = pci_find_slot(pObj->pci_dev->bus->parent->number, DevFn);
-#endif
-            if (pPci_dev)
-            {                
-                pci_read_config_word(pPci_dev, PCI_CLASS_DEVICE, &reg16);
-                reg16 = le2cpu16(reg16);
-                pci_read_config_byte(pPci_dev, PCI_CB_CARD_BUS, &reg8);
-                if ((reg16 == PCI_CLASS_BRIDGE_PCI) && 
-                    (reg8 == pObj->pci_dev->bus->number))
-                {
-                    pObj->parent_pci_dev = pPci_dev;
-                }
-            }
-        }
-    }
 }
 
 /*
@@ -1487,43 +1272,6 @@ VOID RTMPPCIeLinkCtrlValueRestore(
 	IN	PRTMP_ADAPTER	pAd,
 	IN   UCHAR		Level)
 {
-	USHORT  PCIePowerSaveLevel, reg16;
-	USHORT	Configuration;
-	POS_COOKIE 	pObj;
-
-	pObj = (POS_COOKIE) pAd->OS_Cookie;
-
-	if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE))
-		return;
-    
-	DBGPRINT(RT_DEBUG_TRACE, ("%s.===>\n", __FUNCTION__));
-	PCIePowerSaveLevel = pAd->PCIePowerSaveLevel;
-	if ((PCIePowerSaveLevel&0xff) == 0xff)
-	{
-		DBGPRINT(RT_DEBUG_TRACE,("return  \n"));
-		return;
-	}
-    	
-    if (pObj->pci_dev && (pAd->RLnkCtrlOffset != 0))
-    {           
-        PCI_REG_READ_WORD(pObj->pci_dev, pAd->RLnkCtrlOffset, Configuration);
-        if ((Configuration != 0) &&
-            (Configuration != 0xFFFF))
-        {
-    		Configuration &= 0xfefc;
-			if (Level == RESTORE_CLOSE)
-            	Configuration |= pAd->RLnkCtrlConfiguration;
-			else
-				Configuration |= 0x0;
-            PCI_REG_WIRTE_WORD(pObj->pci_dev, pAd->RLnkCtrlOffset, Configuration);
-			pAd->bPCIclkOffCommand = FALSE;
-    		DBGPRINT(RT_DEBUG_TRACE, ("Restore Ralink : offset 0x%x = 0x%x\n", pAd->RLnkCtrlOffset, Configuration));
-        }
-        else
-            DBGPRINT(RT_DEBUG_ERROR, ("Restore Ralink : PCI_REG_READ_WORD failed (Configuration = 0x%x)\n", Configuration));
-	}
-    
-	DBGPRINT(RT_DEBUG_TRACE,("%s <===\n", __FUNCTION__));
 }
 
 /*
@@ -1541,62 +1289,6 @@ VOID RTMPPCIeLinkCtrlSetting(
 	IN	PRTMP_ADAPTER	pAd,
 	IN 	USHORT		Max)
 {
-	USHORT  PCIePowerSaveLevel, reg16;
-	USHORT	Configuration;
-	POS_COOKIE 	pObj;
-
-	pObj = (POS_COOKIE) pAd->OS_Cookie;
-
-	if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE))
-		return;
-
-	DBGPRINT(RT_DEBUG_TRACE,("%s===>\n", __FUNCTION__));
-	PCIePowerSaveLevel = pAd->PCIePowerSaveLevel;
-	if ((PCIePowerSaveLevel&0xff) == 0xff)
-	{
-		DBGPRINT(RT_DEBUG_TRACE,("return  \n"));
-		return;
-	}
-	PCIePowerSaveLevel = PCIePowerSaveLevel>>6;	    
-
-	if (pObj->pci_dev && (pAd->RLnkCtrlOffset != 0))
-	{
-		// first 2892 chip not allow to frequently set mode 3. will cause hang problem.
-		if (PCIePowerSaveLevel > Max)
-			PCIePowerSaveLevel = Max;        
-
-        PCI_REG_READ_WORD(pObj->pci_dev, pAd->RLnkCtrlOffset, Configuration);
-		switch (PCIePowerSaveLevel)
-		{
-			case 0:
-				// No PCI power safe
-				// Set b0 and b1 of LinkControl (both 2892 and PCIe bridge) to 00 . 
-				Configuration &= 0xfefc;
-				break;
-			case 1:
-				//  L0
-				// Set b0 and b1 of LinkControl (both 2892 and PCIe bridge) to 01 .
-				Configuration &= 0xfefc;
-				Configuration |= 0x1;
-				break;
-			case 2:
-				// L0 and L1
-				//  Set b0 and b1 of LinkControl (both 2892 and PCIe bridge) to 11 
-				Configuration &= 0xfefc;
-				Configuration |= 0x1; //0x3;
-				break;
-			case 3:
-				// L0 , L1 and clock management.
-				// Set b0 and b1 of LinkControl (both 2892 and PCIe bridge) to 11 and bit 8 of LinkControl of 2892 to 1
-				Configuration &= 0xfefc;
-				Configuration |= 0x101; //0x103;
-				break;
-		}
-        PCI_REG_WIRTE_WORD(pObj->pci_dev, pAd->RLnkCtrlOffset, Configuration);
-		DBGPRINT(RT_DEBUG_TRACE, ("Write Ralink device : offset 0x%x = 0x%x\n", pAd->RLnkCtrlOffset, Configuration));
-	}
-
-	DBGPRINT(RT_DEBUG_TRACE,("RTMPPCIePowerLinkCtrl <==============\n"));
 }
 #endif // CONFIG_STA_SUPPORT //
 
diff --git a/rt2860-1.7.0.0/os/linux/Makefile.4 b/rt2860-source-1.8.0.0/os/linux/Makefile.4
similarity index 100%
copy from rt2860-1.7.0.0/os/linux/Makefile.4
copy to rt2860-source-1.8.0.0/os/linux/Makefile.4
diff --git a/rt2860-1.7.0.0/os/linux/Makefile.6 b/rt2860-source-1.8.0.0/os/linux/Makefile.6
similarity index 89%
copy from rt2860-1.7.0.0/os/linux/Makefile.6
copy to rt2860-source-1.8.0.0/os/linux/Makefile.6
index fc3be57..5dd36e3 100644
--- a/rt2860-1.7.0.0/os/linux/Makefile.6
+++ b/rt2860-source-1.8.0.0/os/linux/Makefile.6
@@ -11,7 +11,6 @@ rt$(CHIPSET)sta-objs := \
 	../../common/mlme.o\
 	../../common/rtmp_wep.o\
 	../../common/action.o\
-	../../common/ba_action.o\
 	../../common/cmm_data.o\
 	../../common/rtmp_init.o\
 	../../common/rtmp_tkip.o\
@@ -36,8 +35,9 @@ rt$(CHIPSET)sta-objs := \
 	../../os/linux/rt_main_dev.o\
 	../../os/linux/sta_ioctl.o
 
-ifeq ($(HAS_ATE),y)
-rt$(CHIPSET)sta-objs += ../../os/linux/rt_ate.o
+ifeq ($(HAS_DOT11_N_SUPPORT),y)
+rt$(CHIPSET)sta-objs += \
+	../../common/ba_action.o
 endif
 
 ifeq ($(HAS_BLOCK_NET_IF),y)
@@ -55,16 +55,13 @@ rt$(CHIPSET)sta-objs += \
 	../../common/cmm_data_2860.o
 endif
 
-ifeq ($(CHIPSET),2870)
-rt$(CHIPSET)sta-objs += \
-	../../os/linux/2870_main_dev.o\
-	../../common/2870_rtmp_init.o\
-	../../common/rtusb_io.o\
-	../../common/rtusb_bulk.o\
-	../../common/rtusb_data.o\
-	../../common/cmm_data_2870.o
+ifeq ($(HAS_ATE),y)
+rt$(CHIPSET)sta-objs += ../../os/linux/rt_ate.o
 endif
 
+#endif // CONFIG_STA_SUPPORT //
+
+
 clean:
 	rm -f ../../common/*.o
 	rm -f ../../common/.*.{cmd,flags,d}
diff --git a/rt2860-1.7.0.0/os/linux/Module.symvers b/rt2860-source-1.8.0.0/os/linux/Module.symvers
similarity index 100%
copy from rt2860-1.7.0.0/os/linux/Module.symvers
copy to rt2860-source-1.8.0.0/os/linux/Module.symvers
diff --git a/rt2860-1.7.0.0/os/linux/config.mk b/rt2860-source-1.8.0.0/os/linux/config.mk
similarity index 83%
copy from rt2860-1.7.0.0/os/linux/config.mk
copy to rt2860-source-1.8.0.0/os/linux/config.mk
index af961c6..5f4c5d1 100644
--- a/rt2860-1.7.0.0/os/linux/config.mk
+++ b/rt2860-source-1.8.0.0/os/linux/config.mk
@@ -19,38 +19,40 @@ HAS_DFS_SUPPORT=n
 #Support Carrier-Sense function
 HAS_CS_SUPPORT=n
 
-# Support user specific transmit rate of Multicast packet.
-HAS_MCAST_RATE_SPECIFIC_SUPPORT=n
-
 #ifdef MULTI_CARD
 # Support for Multiple Cards
 HAS_MC_SUPPORT=n
 #endif // MULTI_CARD //
 
-#Support for PCI-MSI
-HAS_MSI_SUPPORT=n
-
 #Support for IEEE802.11e DLS
 HAS_QOS_DLS_SUPPORT=n
 
 #Support for EXT_CHANNEL
 HAS_EXT_BUILD_CHANNEL_LIST=n
 
-#Support for IDS 
-HAS_IDS_SUPPORT=n
-
 #Support for Net-SNMP
 HAS_SNMP_SUPPORT=n
 
-#Support features of 802.11n Draft3
-HAS_DOT11N_DRAFT3_SUPPORT=n
+#Support features of Single SKU. 
+HAS_SINGLE_SKU_SUPPORT=n
+
+#Support features of 802.11n
+HAS_DOT11_N_SUPPORT=y
 
 
+#################################################
+
 CC := $(CROSS_COMPILE)gcc
 LD := $(CROSS_COMPILE)ld
 
 WFLAGS := -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT  -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs 
 
+
+#################################################
+
+#ifdef CONFIG_STA_SUPPORT
+# config for STA mode
+
 ifeq ($(RT28xx_MODE),STA)
 WFLAGS += -DCONFIG_STA_SUPPORT -DDBG 
 
@@ -77,17 +79,35 @@ ifeq ($(HAS_QOS_DLS_SUPPORT),y)
 WFLAGS += -DQOS_DLS_SUPPORT
 endif
 
+ifeq ($(HAS_DOT11_N_SUPPORT),y)
+WFLAGS += -DDOT11_N_SUPPORT
+endif
+
+ifeq ($(HAS_CS_SUPPORT),y)
+WFLAGS += -DCARRIER_DETECTION_SUPPORT
+endif
+
+ifeq ($(HAS_SINGLE_SKU_SUPPORT),y)
+WFLAGS += -DSINGLE_SKU
+endif
+
 endif
 # endif of ifeq ($(RT28xx_MODE),STA)
+#endif // CONFIG_STA_SUPPORT //
+
+#################################################
+
+#################################################
+
+#
+# Common compiler flag
+#
+
 
 ifeq ($(HAS_EXT_BUILD_CHANNEL_LIST),y)
 WFLAGS += -DEXT_BUILD_CHANNEL_LIST
 endif
 
-ifeq ($(HAS_IDS_SUPPORT),y)
-WFLAGS += -DIDS_SUPPORT
-endif
-
 ifeq ($(CHIPSET),2860)
 WFLAGS +=-DRT2860
 endif
@@ -138,11 +158,19 @@ ifeq ($(PLATFORM),INF_DANUBE)
 WFLAGS += -DINF_DANUBE -DRT_BIG_ENDIAN
 endif
 
+ifeq ($(PLATFORM),CAVM_OCTEON)
+WFLAGS += -DRT_BIG_ENDIAN
+endif
 
 ifeq ($(PLATFORM),BRCM_6358)
 WFLAGS += -DRT_BIG_ENDIAN
 endif
 
+ifeq ($(PLATFORM),INF_AMAZON_SE)
+#WFLAGS += -DRT_BIG_ENDIAN -DINF_AMAZON_SE -DBG_FT_SUPPORT
+WFLAGS += -DRT_BIG_ENDIAN -DINF_AMAZON_SE
+endif
+
 #kernel build options for 2.4
 # move to Makefile outside LINUX_SRC := /opt/star/kernel/linux-2.4.27-star
 
@@ -159,7 +187,7 @@ export CFLAGS
 endif
 
 ifeq ($(PLATFORM),SIGMA_8622)
-CFLAGS := -D__KERNEL__ -I$(RT28xx_DIR)/include -I$(LINUX_SRC)/include -I$(RT28xx_DIR)/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -fno-common -pipe -fno-builtin -D__linux__ -DNO_MM -mapcs-32 -march=armv4 -mtune=arm7tdmi -msoft-float -DMODULE -mshort-load-bytes -nostdinc -iwithprefix -DMODULE $(WFLAGS)
+CFLAGS := -D__KERNEL__ -I$(CROSS_COMPILE_INCLUDE)/include -I$(LINUX_SRC)/include -I$(RT28xx_DIR)/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -fno-common -pipe -fno-builtin -D__linux__ -DNO_MM -mapcs-32 -march=armv4 -mtune=arm7tdmi -msoft-float -DMODULE -mshort-load-bytes -nostdinc -iwithprefix -DMODULE $(WFLAGS)
 export CFLAGS
 endif
 
@@ -209,3 +237,9 @@ ifeq ($(PLATFORM),IXP)
         EXTRA_CFLAGS := -v $(WFLAGS) -I$(RT28xx_DIR)/include -mbig-endian
 endif
 
+ifeq ($(PLATFORM),CAVM_OCTEON)
+	EXTRA_CFLAGS := $(WFLAGS) -I$(RT28xx_DIR)/include \
+				    -mabi=64 $(WFLAGS)
+export CFLAGS
+endif
+
diff --git a/rt2860-source-1.8.0.0/os/linux/modules.order b/rt2860-source-1.8.0.0/os/linux/modules.order
new file mode 100644
index 0000000..a6cc50c
--- /dev/null
+++ b/rt2860-source-1.8.0.0/os/linux/modules.order
@@ -0,0 +1 @@
+kernel//home/snowpin/temp/2860/V1.8.0.0/RT2860_V1.8.0.0/DPO/os/linux/rt2860sta.ko
diff --git a/rt2860-1.7.0.0/os/linux/rt_ate.c b/rt2860-source-1.8.0.0/os/linux/rt_ate.c
similarity index 95%
copy from rt2860-1.7.0.0/os/linux/rt_ate.c
copy to rt2860-source-1.8.0.0/os/linux/rt_ate.c
index a72ada4..5255815 100644
--- a/rt2860-1.7.0.0/os/linux/rt_ate.c
+++ b/rt2860-source-1.8.0.0/os/linux/rt_ate.c
@@ -1797,6 +1797,13 @@ INT	Set_ATE_TX_BW_Proc(
 					RTMPusecDelay(5000);				
 				}
 			}		
+#ifdef DOT11_N_SUPPORT
+			if ((pAd->ate.TxWI.PHYMODE >= MODE_HTMIX) && (pAd->ate.TxWI.MCS == 7))
+			{
+    			value = 0x28;
+    			ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R67, value);
+			}
+#endif // DOT11_N_SUPPORT //
 		}
 
 		//Set BBP R4 bit[4:3]=1:0
@@ -2885,12 +2892,10 @@ VOID ATEAsicAdjustTxPower(
 			/* TX_PWR_CFG_1 ~ TX_PWR_CFG_4 */
 			RTMP_IO_WRITE32(pAd, TX_PWR_CFG_0 + i*4, TxPwr[i]);
 
-			ATEDBGPRINT(RT_DEBUG_INFO, ("ATEAsicAdjustTxPower - DeltaPwr=%d, offset=0x%x, TxPwr=%lx, BbpR1=%x, round=%ld, pTxAgcCompensate=%d \n",
-				DeltaPwr, TX_PWR_CFG_0 + i*4, TxPwr[i], BbpR49, pAd->Mlme.OneSecPeriodicRound, *pTxAgcCompensate));
+			
 		}
 	}
 
-	ATEDBGPRINT(RT_DEBUG_INFO, ("<-- ATEAsicAdjustTxPower, DeltaPwr=%d\n", DeltaPwr));
 }
 
 /*
@@ -3565,6 +3570,15 @@ VOID ATE_QA_Statistics(
 #define RACFG_CMD_ATE_SET_TX_FRAME_LEN		0x0111
 #define RACFG_CMD_ATE_SET_TX_FRAME_COUNT	0x0112
 #define RACFG_CMD_ATE_START_RX_FRAME		0x0113
+#define RACFG_CMD_ATE_E2PROM_READ_BULK	0x0114
+#define RACFG_CMD_ATE_E2PROM_WRITE_BULK	0x0115
+#define RACFG_CMD_ATE_IO_WRITE_BULK		0x0116
+#define RACFG_CMD_ATE_BBP_READ_BULK		0x0117
+#define RACFG_CMD_ATE_BBP_WRITE_BULK	0x0118
+#define RACFG_CMD_ATE_RF_READ_BULK		0x0119
+#define RACFG_CMD_ATE_RF_WRITE_BULK		0x011a
+
+
 
 #define A2Hex(_X, _p) 				\
 {									\
@@ -3583,6 +3597,7 @@ VOID ATE_QA_Statistics(
 	}												\
 }
 
+
 static VOID memcpy_exl(PRTMP_ADAPTER pAd, UCHAR *dst, UCHAR *src, ULONG len);
 static VOID memcpy_exs(PRTMP_ADAPTER pAd, UCHAR *dst, UCHAR *src, ULONG len);
 static VOID RTMP_IO_READ_BULK(PRTMP_ADAPTER pAd, UCHAR *dst, UCHAR *src, UINT32 len);
@@ -3611,7 +3626,7 @@ VOID RtmpDoAte(
 	struct ate_racfghdr *pRaCfg;
 	INT	Status = NDIS_STATUS_SUCCESS;
 
-	ATEDBGPRINT(RT_DEBUG_LOUD, ("===>RtmpDoAte()\n"));
+	
 
 	if((pRaCfg = kmalloc(sizeof(struct ate_racfghdr), GFP_KERNEL)) == NULL)
 	{
@@ -3627,10 +3642,7 @@ VOID RtmpDoAte(
 		kfree(pRaCfg);
 		return;
 	}
-    else
-    {
-    	ATEDBGPRINT(RT_DEBUG_LOUD, ("Success in copy_from_user()\n"));
-    }
+    
 
 	Command_Id = ntohs(pRaCfg->command_id);
 	
@@ -3709,7 +3721,7 @@ VOID RtmpDoAte(
 					// We must kill ATE daemon first before setting ATESTOP,
 					// or Microsoft will report sth. wrong. 
 #ifndef UCOS
-					ret = kill_proc(pAdapter->ate.AtePid, SIGTERM, 1);
+					ret = KILL_THREAD_PID(pAdapter->ate.AtePid, SIGTERM, 1);
 					if (ret)
 					{
 						ATEDBGPRINT(RT_DEBUG_ERROR, ("%s: unable to signal thread\n", pAdapter->net_dev->name));
@@ -4119,6 +4131,275 @@ VOID RtmpDoAte(
 
 			break;
 
+		case RACFG_CMD_ATE_E2PROM_READ_BULK:
+		{
+			USHORT offset;
+			USHORT len;
+			USHORT buffer[EEPROM_SIZE/2];
+			
+			offset = ntohs(pRaCfg->status);
+			memcpy(&len, pRaCfg->data, 2);
+			len = ntohs(len);
+			
+			rt_ee_read_all(pAdapter,(USHORT *)buffer);
+			if (offset + len <= EEPROM_SIZE)
+				memcpy_exs(pAdapter, pRaCfg->data, (UCHAR *)buffer+offset, len);
+			else
+				ATEDBGPRINT(RT_DEBUG_ERROR, ("exceed EEPROM size\n"));
+
+			// prepare feedback
+			pRaCfg->length = htons(2+len);
+			pRaCfg->status = htons(0);
+			wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
+									+ sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length) 
+									+ sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
+
+            if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
+            {
+            	ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_ATE_E2PROM_READ_BULK\n"));
+                Status = -EFAULT;
+            }
+			else
+			{
+               	ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_ATE_E2PROM_READ_BULK is done !\n"));
+			}
+
+		}
+			break;
+
+		case RACFG_CMD_ATE_E2PROM_WRITE_BULK:
+		{
+			USHORT offset;
+			USHORT len;
+			USHORT buffer[EEPROM_SIZE/2];
+			
+			offset = ntohs(pRaCfg->status);
+			memcpy(&len, pRaCfg->data, 2);
+			len = ntohs(len);
+
+			rt_ee_read_all(pAdapter,(USHORT *)buffer);
+			memcpy_exs(pAdapter, (UCHAR *)buffer + offset, (UCHAR *)pRaCfg->data + 2, len);
+			rt_ee_write_all(pAdapter,(USHORT *)buffer);
+
+			// prepare feedback
+			pRaCfg->length = htons(2);
+			pRaCfg->status = htons(0);
+			wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
+								+ sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length) 
+								+ sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
+            if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
+            {
+            	ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_ATE_E2PROM_WRITE_BULK\n"));
+                   Status = -EFAULT;
+            }
+			else
+			{
+               	ATEDBGPRINT(RT_DEBUG_ERROR, ("RACFG_CMD_ATE_E2PROM_WRITE_BULK is done !\n"));
+			}
+
+		}
+			break;
+
+		case RACFG_CMD_ATE_IO_WRITE_BULK:
+		{
+			UINT32 offset, i, value;
+			USHORT len;
+			
+			memcpy(&offset, &pRaCfg->status, 4);
+			offset = ntohl(offset);
+			memcpy(&len, pRaCfg->data+2, 2);
+			len = ntohs(len);
+			
+			for (i = 0; i < len; i += 4)
+			{
+				memcpy_exl(pAdapter, (UCHAR *)&value, pRaCfg->data+4+i, 4);
+				printk("Write %x %x\n", offset + i, value);
+				RTMP_IO_WRITE32(pAdapter, (offset +i) & 0xffff, value);
+			}
+
+			// prepare feedback
+			pRaCfg->length = htons(2);
+			pRaCfg->status = htons(0);
+			wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
+								+ sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length) 
+								+ sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
+            if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
+            {
+            	ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_ATE_IO_WRITE_BULK\n"));
+                   Status = -EFAULT;
+            }
+			else
+			{
+               	ATEDBGPRINT(RT_DEBUG_ERROR, ("RACFG_CMD_ATE_IO_WRITE_BULK is done !\n"));
+			}
+
+		}
+			break;
+
+		case RACFG_CMD_ATE_BBP_READ_BULK:
+		{
+			USHORT offset;
+			USHORT len;
+			USHORT j;
+			
+			offset = ntohs(pRaCfg->status);
+			memcpy(&len, pRaCfg->data, 2);
+			len = ntohs(len);
+			
+				
+			for (j = offset; j < (offset+len); j++)
+			{
+				pRaCfg->data[j - offset] = 0;
+				
+				if (pAdapter->ate.Mode == ATE_STOP)
+				{
+					RTMP_BBP_IO_READ8_BY_REG_ID(pAdapter, j,  &pRaCfg->data[j - offset]);
+				}
+				else
+				{
+					ATE_BBP_IO_READ8_BY_REG_ID(pAdapter, j,  &pRaCfg->data[j - offset]);
+				}
+			}
+
+			// prepare feedback
+			pRaCfg->length = htons(2+len);
+			pRaCfg->status = htons(0);
+			wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
+								+ sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length) 
+								+ sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
+
+            if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
+            {
+            	ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_ATE_BBP_READ_BULK\n"));
+                   Status = -EFAULT;
+            }
+			else
+			{
+               	ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_ATE_BBP_READ_BULK is done !\n"));
+			}
+
+		}
+			break;
+
+		case RACFG_CMD_ATE_BBP_WRITE_BULK:
+		{
+			USHORT offset;
+			USHORT len;
+			USHORT j;
+			UCHAR *value;
+			
+			offset = ntohs(pRaCfg->status);
+			memcpy(&len, pRaCfg->data, 2);
+			len = ntohs(len);
+							
+			for (j = offset; j < (offset+len); j++)
+			{
+				value = pRaCfg->data + 2 + (j - offset);
+				if (pAdapter->ate.Mode == ATE_STOP)
+				{
+					RTMP_BBP_IO_WRITE8_BY_REG_ID(pAdapter, j,  *value);
+				}
+				else
+				{
+					ATE_BBP_IO_WRITE8_BY_REG_ID(pAdapter, j,  *value);
+				}
+			}
+
+			// prepare feedback
+			pRaCfg->length = htons(2);
+			pRaCfg->status = htons(0);
+			wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
+								+ sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length) 
+								+ sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
+
+            if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
+            {
+            	ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_ATE_BBP_WRITE_BULK\n"));
+                   Status = -EFAULT;
+            }
+			else
+			{
+               	ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_ATE_BBP_WRITE_BULK is done !\n"));
+			}
+		}
+			break;
+
+#ifdef CONFIG_RALINK_RT3052
+		case RACFG_CMD_ATE_RF_READ_BULK:
+		{
+			USHORT offset;
+			USHORT len;
+			USHORT j;
+			
+			offset = ntohs(pRaCfg->status);
+			memcpy(&len, pRaCfg->data, 2);
+			len = ntohs(len);
+
+			for (j = offset; j < (offset+len); j++)
+			{
+				pRaCfg->data[j - offset] = 0;
+				RT30xxReadRFRegister(pAdapter, j,  &pRaCfg->data[j - offset]);
+			}
+
+			// prepare feedback
+			pRaCfg->length = htons(2+len);
+			pRaCfg->status = htons(0);
+			wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
+								+ sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length) 
+								+ sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
+
+            if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
+            {
+            	ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_ATE_RF_READ_BULK\n"));
+                   Status = -EFAULT;
+            }
+			else
+			{
+               	ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_ATE_RF_READ_BULK is done !\n"));
+			}
+
+		}
+			break;
+
+		case RACFG_CMD_ATE_RF_WRITE_BULK:
+		{
+			USHORT offset;
+			USHORT len;
+			USHORT j;
+			UCHAR *value;
+			
+			offset = ntohs(pRaCfg->status);
+			memcpy(&len, pRaCfg->data, 2);
+			len = ntohs(len);
+
+			for (j = offset; j < (offset+len); j++)
+			{
+				value = pRaCfg->data + 2 + (j - offset);
+				RT30xxWriteRFRegister(pAdapter, j,  *value);
+			}
+
+			// prepare feedback
+			pRaCfg->length = htons(2);
+			pRaCfg->status = htons(0);
+			wrq->u.data.length = sizeof(pRaCfg->magic_no) + sizeof(pRaCfg->command_type)
+								+ sizeof(pRaCfg->command_id) + sizeof(pRaCfg->length) 
+								+ sizeof(pRaCfg->sequence) + ntohs(pRaCfg->length);
+
+            if (copy_to_user(wrq->u.data.pointer, pRaCfg, wrq->u.data.length))
+            {
+            	ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in case RACFG_CMD_ATE_RF_WRITE_BULK\n"));
+                   Status = -EFAULT;
+            }
+			else
+			{
+               	ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_ATE_RF_WRITE_BULK is done !\n"));
+			}
+
+		}
+			break;
+#endif
+
+
 		case RACFG_CMD_GET_NOISE_LEVEL:
 			{
 				UCHAR	channel;
diff --git a/rt2860-1.7.0.0/os/linux/rt_linux.c b/rt2860-source-1.8.0.0/os/linux/rt_linux.c
similarity index 99%
copy from rt2860-1.7.0.0/os/linux/rt_linux.c
copy to rt2860-source-1.8.0.0/os/linux/rt_linux.c
index e1a1e08..e39d80c 100644
--- a/rt2860-1.7.0.0/os/linux/rt_linux.c
+++ b/rt2860-source-1.8.0.0/os/linux/rt_linux.c
@@ -294,10 +294,6 @@ VOID	RTMPFreeAdapter(
 	NdisFreeSpinLock(&pAd->MgmtRingLock);
 	
 #ifdef RT2860 
-#ifdef WIN_NDIS
-	NdisFreeSpinLock(&pAd->TxRingLock);	
-	NdisFreeSpinLock(&pAd->LocalTxBufQueueLock);
-#endif
 	NdisFreeSpinLock(&pAd->RxRingLock);
 #endif // RT2860 //
 
@@ -863,7 +859,7 @@ void send_monitor_packets(
     }
         
     pOSPkt = RTPKT_TO_OSPKT(pRxBlk->pRxPacket);
-	pOSPkt->dev = get_netdev_from_bssid(pAd, BSS0);
+	pOSPkt->dev = get_netdev_from_bssid(pAd, BSS0); 
     if (pRxBlk->pHeader->FC.Type == BTYPE_DATA)
     {
         pRxBlk->DataSize -= LENGTH_802_11;
@@ -900,7 +896,7 @@ void send_monitor_packets(
             pRxBlk->pData += header_len;
     } //end if
 
-                
+
 	if (pRxBlk->DataSize < pOSPkt->len) {
         skb_trim(pOSPkt,pRxBlk->DataSize);
     } else {
@@ -965,11 +961,14 @@ void send_monitor_packets(
 	ph->noise.len = 4;
 	ph->noise.data = 0;
 
+#ifdef DOT11_N_SUPPORT
     if (pRxBlk->pRxWI->PHYMODE >= MODE_HTMIX)
     {
     	rate_index = 16 + ((UCHAR)pRxBlk->pRxWI->BW *16) + ((UCHAR)pRxBlk->pRxWI->ShortGI *32) + ((UCHAR)pRxBlk->pRxWI->MCS);
     }
-    else if (pRxBlk->pRxWI->PHYMODE == MODE_OFDM)
+    else
+#endif // DOT11_N_SUPPORT //
+	if (pRxBlk->pRxWI->PHYMODE == MODE_OFDM)
     	rate_index = (UCHAR)(pRxBlk->pRxWI->MCS) + 4;
     else 
     	rate_index = (UCHAR)(pRxBlk->pRxWI->MCS);
diff --git a/rt2860-1.7.0.0/os/linux/rt_main_dev.c b/rt2860-source-1.8.0.0/os/linux/rt_main_dev.c
similarity index 95%
copy from rt2860-1.7.0.0/os/linux/rt_main_dev.c
copy to rt2860-source-1.8.0.0/os/linux/rt_main_dev.c
index 3038ce5..c346743 100644
--- a/rt2860-1.7.0.0/os/linux/rt_main_dev.c
+++ b/rt2860-source-1.8.0.0/os/linux/rt_main_dev.c
@@ -24,7 +24,6 @@
  *                                                                       * 
  *************************************************************************
 
-
     Module Name:
     rt_main_dev.c
 
@@ -70,8 +69,10 @@ MODULE_PARM_DESC (mac, "rt28xx: wireless mac addr");
 /*---------------------------------------------------------------------*/
 /* Prototypes of Functions Used                                        */
 /*---------------------------------------------------------------------*/
+#ifdef DOT11_N_SUPPORT
 extern BOOLEAN ba_reordering_resource_init(PRTMP_ADAPTER pAd, int num);
 extern void ba_reordering_resource_release(PRTMP_ADAPTER pAd);
+#endif // DOT11_N_SUPPORT //
 extern NDIS_STATUS NICLoadRateSwitchingParams(IN PRTMP_ADAPTER pAd);
 
 #ifdef RT2860
@@ -216,7 +217,7 @@ int rt28xx_close(IN PNET_DEV dev)
 {
 	struct net_device * net_dev = (struct net_device *)dev;
     RTMP_ADAPTER	*pAd = net_dev->priv;
-	BOOLEAN			Cancelled = FALSE;
+	BOOLEAN 		Cancelled = FALSE;
 	UINT32			i = 0;
 
 
@@ -226,14 +227,10 @@ int rt28xx_close(IN PNET_DEV dev)
 	if (pAd == NULL)
 		return 0; // close ok
 
-	// when users do "Suspend to Disk" and reboot the computer, Fedora OS
-	// will call rt28xx_close() when OS does not yet finish rtusb_disconnect()
-	//
-	// rtusb_disconnect() will set fRTMP_ADAPTER_NIC_NOT_EXIST, so we need to
-	// check the bit, we can not do rt28xx_close() in the duration of
-	// rtusb_disconnect()
-	if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))
-		return 0;
+
+#ifdef WDS_SUPPORT
+	WdsDown(pAd);
+#endif // WDS_SUPPORT //
 
 #ifdef CONFIG_STA_SUPPORT
 	IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
@@ -250,34 +247,34 @@ int rt28xx_close(IN PNET_DEV dev)
         }
 
 #ifdef QOS_DLS_SUPPORT
-	// send DLS-TEAR_DOWN message, 
-	if (pAd->CommonCfg.bDLSCapable)
-	{
-		UCHAR i;
-
-		// tear down local dls table entry
-		for (i=0; i<MAX_NUM_OF_INIT_DLS_ENTRY; i++)
+		// send DLS-TEAR_DOWN message, 
+		if (pAd->CommonCfg.bDLSCapable)
 		{
-			if (pAd->StaCfg.DLSEntry[i].Valid && (pAd->StaCfg.DLSEntry[i].Status == DLS_FINISH))
+			UCHAR i;
+
+			// tear down local dls table entry
+			for (i=0; i<MAX_NUM_OF_INIT_DLS_ENTRY; i++)
 			{
-				RTMPSendDLSTearDownFrame(pAd, pAd->StaCfg.DLSEntry[i].MacAddr);
-				pAd->StaCfg.DLSEntry[i].Status	= DLS_NONE;
-				pAd->StaCfg.DLSEntry[i].Valid	= FALSE;
+				if (pAd->StaCfg.DLSEntry[i].Valid && (pAd->StaCfg.DLSEntry[i].Status == DLS_FINISH))
+				{
+					RTMPSendDLSTearDownFrame(pAd, pAd->StaCfg.DLSEntry[i].MacAddr);
+					pAd->StaCfg.DLSEntry[i].Status	= DLS_NONE;
+					pAd->StaCfg.DLSEntry[i].Valid	= FALSE;
+				}
 			}
-		}
 
-		// tear down peer dls table entry
-		for (i=MAX_NUM_OF_INIT_DLS_ENTRY; i<MAX_NUM_OF_DLS_ENTRY; i++)
-		{
-			if (pAd->StaCfg.DLSEntry[i].Valid && (pAd->StaCfg.DLSEntry[i].Status == DLS_FINISH))
+			// tear down peer dls table entry
+			for (i=MAX_NUM_OF_INIT_DLS_ENTRY; i<MAX_NUM_OF_DLS_ENTRY; i++)
 			{
-				RTMPSendDLSTearDownFrame(pAd, pAd->StaCfg.DLSEntry[i].MacAddr);
-				pAd->StaCfg.DLSEntry[i].Status = DLS_NONE;
-				pAd->StaCfg.DLSEntry[i].Valid	= FALSE;
+				if (pAd->StaCfg.DLSEntry[i].Valid && (pAd->StaCfg.DLSEntry[i].Status == DLS_FINISH))
+				{
+					RTMPSendDLSTearDownFrame(pAd, pAd->StaCfg.DLSEntry[i].MacAddr);
+					pAd->StaCfg.DLSEntry[i].Status = DLS_NONE;
+					pAd->StaCfg.DLSEntry[i].Valid	= FALSE;
+				}
 			}
+			RT28XX_MLME_HANDLER(pAd);
 		}
-		RT28XX_MLME_HANDLER(pAd);
-	}
 #endif // QOS_DLS_SUPPORT //
 
 		if (INFRA_ON(pAd) &&
@@ -305,12 +302,14 @@ int rt28xx_close(IN PNET_DEV dev)
 			RTMPusecDelay(1000);
 		}
 
+
 #ifdef CCX_SUPPORT
 		RTMPCancelTimer(&pAd->StaCfg.LeapAuthTimer, &Cancelled);
 #endif
 
 		RTMPCancelTimer(&pAd->StaCfg.StaQuickResponeForRateUpTimer, &Cancelled);
 		RTMPCancelTimer(&pAd->StaCfg.WpaDisassocAndBlockAssocTimer, &Cancelled);
+
 #ifdef WPA_SUPPLICANT_SUPPORT
 #ifndef NATIVE_WPA_SUPPLICANT_SUPPORT
 		{
@@ -351,7 +350,7 @@ int rt28xx_close(IN PNET_DEV dev)
 #ifdef CONFIG_STA_SUPPORT
 	IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
 	{
-		STAMacTableReset(pAd);
+		MacTableReset(pAd);
 	}
 #endif // CONFIG_STA_SUPPORT //
 
@@ -359,6 +358,7 @@ int rt28xx_close(IN PNET_DEV dev)
 	MeasureReqTabExit(pAd);
 	TpcReqTabExit(pAd);
 
+
 #ifdef RT2860
 	if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_ACTIVE))
 	{
@@ -383,10 +383,12 @@ int rt28xx_close(IN PNET_DEV dev)
 
 	RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS);
 
-
+#ifdef DOT11_N_SUPPORT
 	// Free BA reorder resource
 	ba_reordering_resource_release(pAd);
+#endif // DOT11_N_SUPPORT //
 	
+
 	RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_START_UP);
 
 	return 0; // close ok
@@ -400,9 +402,11 @@ static int rt28xx_init(IN struct net_device *net_dev)
 	NDIS_STATUS				Status;
 	UINT32 		MacCsr0 = 0;
 
+
+#ifdef DOT11_N_SUPPORT
 	// Allocate BA Reordering memory
 	ba_reordering_resource_init(pAd, MAX_REORDERING_MPDU_NUM);
-	
+#endif // DOT11_N_SUPPORT //
 
 	// Make sure MAC gets ready.
 	index = 0;
@@ -509,6 +513,7 @@ static int rt28xx_init(IN struct net_device *net_dev)
 
 
    	//Init Ba Capability parameters.
+#ifdef DOT11_N_SUPPORT
 	pAd->CommonCfg.DesiredHtPhy.MpduDensity = (UCHAR)pAd->CommonCfg.BACapability.field.MpduDensity;
 	pAd->CommonCfg.DesiredHtPhy.AmsduEnable = (USHORT)pAd->CommonCfg.BACapability.field.AmsduEnable;
 	pAd->CommonCfg.DesiredHtPhy.AmsduSize = (USHORT)pAd->CommonCfg.BACapability.field.AmsduSize;
@@ -517,6 +522,7 @@ static int rt28xx_init(IN struct net_device *net_dev)
 	pAd->CommonCfg.HtCapability.HtCapInfo.MimoPs = (USHORT)pAd->CommonCfg.BACapability.field.MMPSmode;
 	pAd->CommonCfg.HtCapability.HtCapInfo.AMsduSize = (USHORT)pAd->CommonCfg.BACapability.field.AmsduSize;
 	pAd->CommonCfg.HtCapability.HtCapParm.MpduDensity = (UCHAR)pAd->CommonCfg.BACapability.field.MpduDensity;
+#endif // DOT11_N_SUPPORT //
 
 	printk("2. Phy Mode = %d\n", pAd->CommonCfg.PhyMode);
 
@@ -525,11 +531,15 @@ static int rt28xx_init(IN struct net_device *net_dev)
 
 	printk("3. Phy Mode = %d\n", pAd->CommonCfg.PhyMode);
 
+	NICInitAsicFromEEPROM(pAd); //rt2860b
+
 	// Set PHY to appropriate mode
 	TmpPhy = pAd->CommonCfg.PhyMode;
 	pAd->CommonCfg.PhyMode = 0xff;
 	RTMPSetPhyMode(pAd, TmpPhy);
+#ifdef DOT11_N_SUPPORT
 	SetCommonHT(pAd);
+#endif // DOT11_N_SUPPORT //
 
 	// No valid channels.
 	if (pAd->ChannelListNum == 0)
@@ -537,11 +547,12 @@ static int rt28xx_init(IN struct net_device *net_dev)
 		printk("Wrong configuration. No valid channel found. Check \"ContryCode\" and \"ChannelGeography\" setting.\n");
 		goto err4;
 	}
-	
+
+#ifdef DOT11_N_SUPPORT
 	printk("MCS Set = %02x %02x %02x %02x %02x\n", pAd->CommonCfg.HtCapability.MCSSet[0],
            pAd->CommonCfg.HtCapability.MCSSet[1], pAd->CommonCfg.HtCapability.MCSSet[2],
            pAd->CommonCfg.HtCapability.MCSSet[3], pAd->CommonCfg.HtCapability.MCSSet[4]);
-	NICInitAsicFromEEPROM(pAd); //rt2860b
+#endif // DOT11_N_SUPPORT //
 
 #ifdef IKANOS_VX_1X0
 	VR_IKANOS_FP_Init(pAd->ApCfg.BssidNum, pAd->PermanentAddress);
@@ -558,10 +569,11 @@ static int rt28xx_init(IN struct net_device *net_dev)
 
 	if (pAd && (Status != NDIS_STATUS_SUCCESS))
 	{
-
+		//
+		// Undo everything if it failed
+		//
 		if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE))
 		{
-
 			RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE);
 		}
 	}
@@ -571,8 +583,11 @@ static int rt28xx_init(IN struct net_device *net_dev)
 		OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED);
 		RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_MEDIA_STATE_CHANGE);
 		DBGPRINT(RT_DEBUG_TRACE, ("NDIS_STATUS_MEDIA_DISCONNECT Event B!\n"));
+
+
 	}// end of else
 
+
 	DBGPRINT_S(Status, ("<==== RTMPInitialize, Status=%x\n", Status));
 
 	return TRUE;
@@ -585,9 +600,16 @@ err2:
 	RTMPFreeTxRxRingMemory(pAd);
 err1:
 
+#ifdef DOT11_N_SUPPORT
 	os_free_mem(pAd, pAd->mpdu_blk_pool.mem); // free BA pool
+#endif // DOT11_N_SUPPORT //
 	RT28XX_IRQ_RELEASE(net_dev);
-	
+
+	// shall not set priv to NULL here because the priv didn't been free yet.
+	//net_dev->priv = 0;
+#ifdef INF_AMAZON_SE
+err0:
+#endif // INF_AMAZON_SE //
 	printk("!!! %s Initialized fail !!!\n", RT28xx_CHIP_NAME);
 	return FALSE;
 } /* End of rt28xx_init */
@@ -801,7 +823,11 @@ static NDIS_STATUS rt_ieee80211_if_setup(struct net_device *dev, PRTMP_ADAPTER p
 	    
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26)
+        device = dev_get_by_name(dev_net(dev), slot_name);
+#else
         device = dev_get_by_name(dev->nd_net, slot_name);
+#endif
 #else
 		device = dev_get_by_name(slot_name);
 #endif
@@ -830,7 +856,6 @@ static NDIS_STATUS rt_ieee80211_if_setup(struct net_device *dev, PRTMP_ADAPTER p
 		else
 #endif // MULTIPLE_CARD_SUPPORT //
 		sprintf(dev->name, "ra%d", i);
-		DBGPRINT(RT_DEBUG_INFO, ("Assign the net device name as %s\n", dev->name));
 		Status = NDIS_STATUS_SUCCESS;
 	}
 
@@ -918,7 +943,7 @@ BOOLEAN RTMP_CardInfoRead(
 	else
 		pAd->EEPROMAddressNum = 8;	// 93C86
 
-	antenna.word = RTMP_EEPROM_READ16(pAd, EEPROM_NIC1_OFFSET);
+	RT28xx_EEPROM_READ16(pAd, EEPROM_NIC1_OFFSET, antenna.word);
 
 	if ((antenna.field.RfIcType == RFIC_2850) ||
 		(antenna.field.RfIcType == RFIC_2750))
@@ -933,9 +958,9 @@ BOOLEAN RTMP_CardInfoRead(
 	}
 
 	// get MAC address
-	addr01 = RTMP_EEPROM_READ16(pAd, 0x04);
-	addr23 = RTMP_EEPROM_READ16(pAd, 0x06);
-	addr45 = RTMP_EEPROM_READ16(pAd, 0x08);
+	RT28xx_EEPROM_READ16(pAd, 0x04, addr01);
+	RT28xx_EEPROM_READ16(pAd, 0x06, addr23);
+	RT28xx_EEPROM_READ16(pAd, 0x08, addr45);
 
 	mac[0] = (UCHAR)(addr01 & 0xff);
 	mac[1] = (UCHAR)(addr01 >> 8);
@@ -1407,7 +1432,7 @@ int rt28xx_packet_xmit(struct sk_buff *skb)
 		RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);
 		goto done;
 	}
-
+	
 	RTMP_SET_PACKET_5VT(pPacket, 0);
 #ifdef CONFIG_5VT_ENHANCE
     if (*(int*)(skb->cb) == BRIDGE_TAG) {
@@ -1463,7 +1488,7 @@ INT rt28xx_send_packets(
 	NdisZeroMemory((PUCHAR)&skb_p->cb[CB_OFF], 15);
 	RTMP_SET_PACKET_NET_DEVICE_MBSSID(skb_p, MAIN_MBSSID);
 
-		return rt28xx_packet_xmit(skb_p);
+	return rt28xx_packet_xmit(skb_p);
 
 } /* End of MBSS_VirtualIF_PacketSend */
 
@@ -1619,8 +1644,7 @@ struct net_device_stats *RT28xx_get_ether_stats(
 
 	if (pAd)
 	{
-	    DBGPRINT(RT_DEBUG_INFO, ("RT28xx_get_ether_stats --->\n"));
-
+	   
 		pAd->stats.rx_packets = pAd->WlanCounters.ReceivedFragmentCount.QuadPart;
 		pAd->stats.tx_packets = pAd->WlanCounters.TransmittedFragmentCount.QuadPart;
 
diff --git a/rt2860-1.7.0.0/os/linux/rt_profile.c b/rt2860-source-1.8.0.0/os/linux/rt_profile.c
similarity index 91%
copy from rt2860-1.7.0.0/os/linux/rt_profile.c
copy to rt2860-source-1.8.0.0/os/linux/rt_profile.c
index 1006f87..8dc5471 100644
--- a/rt2860-1.7.0.0/os/linux/rt_profile.c
+++ b/rt2860-source-1.8.0.0/os/linux/rt_profile.c
@@ -27,11 +27,12 @@
 
 #include "rt_config.h"
 
+#ifdef DOT11_N_SUPPORT
 static void HTParametersHook(
 	IN	PRTMP_ADAPTER pAd, 
 	IN	CHAR		  *pValueStr,
 	IN	CHAR		  *pInput);
-
+#endif // DOT11_N_SUPPORT //
 
 #define ETH_MAC_ADDR_STR_LEN 17  // in format of xx:xx:xx:xx:xx:xx
 
@@ -207,7 +208,7 @@ INT delimitcnt(char * s,const char * ct)
 		/*
 		 * Print the found text: use len with %.*s to specify field width.
 		 */
-        DBGPRINT(RT_DEBUG_INFO, (" -> \"%.*s\"\n", (INT)(token - s), token));
+        
 		/* accumulate delimiter count */
 	    ++count; 
 	}
@@ -215,6 +216,107 @@ INT delimitcnt(char * s,const char * ct)
 }
 
 /*
+  * converts the Internet host address from the standard numbers-and-dots notation
+  * into binary data.
+  * returns nonzero if the address is valid, zero if not.	
+  */
+int rtinet_aton(const char *cp, unsigned int *addr)
+{
+	unsigned int 	val;
+	int         	base, n;
+	char        	c;
+	unsigned int    parts[4];
+	unsigned int    *pp = parts;
+
+	for (;;)
+    {
+         /*
+          * Collect number up to ``.''. 
+          * Values are specified as for C: 
+          *	0x=hex, 0=octal, other=decimal.
+          */
+         val = 0;
+         base = 10;
+         if (*cp == '0')
+         {
+             if (*++cp == 'x' || *cp == 'X')
+                 base = 16, cp++;
+             else
+                 base = 8;
+         }
+         while ((c = *cp) != '\0')
+         {
+             if (isdigit((unsigned char) c))
+             {
+                 val = (val * base) + (c - '0');
+                 cp++;
+                 continue;
+             }
+             if (base == 16 && isxdigit((unsigned char) c))
+             {
+                 val = (val << 4) +
+                     (c + 10 - (islower((unsigned char) c) ? 'a' : 'A'));
+                 cp++;
+                 continue;
+             }
+             break;
+         }
+         if (*cp == '.')
+         {
+             /*
+              * Internet format: a.b.c.d a.b.c   (with c treated as 16-bits)
+              * a.b     (with b treated as 24 bits)
+              */
+             if (pp >= parts + 3 || val > 0xff)
+                 return 0;
+             *pp++ = val, cp++;
+         }
+         else
+             break;
+     }
+ 
+     /*
+      * Check for trailing junk.
+      */
+     while (*cp)
+         if (!isspace((unsigned char) *cp++))
+             return 0;
+ 
+     /*
+      * Concoct the address according to the number of parts specified.
+      */
+     n = pp - parts + 1;
+     switch (n)
+     {
+ 
+         case 1:         /* a -- 32 bits */
+             break;
+ 
+         case 2:         /* a.b -- 8.24 bits */
+             if (val > 0xffffff)
+                 return 0;
+             val |= parts[0] << 24;
+             break;
+ 
+         case 3:         /* a.b.c -- 8.8.16 bits */
+             if (val > 0xffff)
+                 return 0;
+             val |= (parts[0] << 24) | (parts[1] << 16);
+             break;
+ 
+         case 4:         /* a.b.c.d -- 8.8.8.8 bits */
+             if (val > 0xff)
+                 return 0;
+             val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8);
+             break;
+     }
+	      
+     *addr = htonl(val);
+     return 1;
+
+}
+
+/*
     ========================================================================
 
     Routine Description:
@@ -834,7 +936,7 @@ NDIS_STATUS	RTMPReadParametersHook(
 		srcf = filp_open(src, O_RDONLY, 0);
 		if (IS_ERR(srcf)) 
 		{
-			DBGPRINT(RT_DEBUG_TRACE, ("--> Error %ld opening %s\n", -PTR_ERR(srcf),src));
+			DBGPRINT(RT_DEBUG_ERROR, ("--> Error %ld opening %s\n", -PTR_ERR(srcf),src));
 		}
 		else 
 		{
@@ -952,41 +1054,17 @@ NDIS_STATUS	RTMPReadParametersHook(
 					//WirelessMode
 					if(RTMPGetKeyParameter("WirelessMode", tmpbuf, 10, buffer))
 					{
-						int value  = 0;
-						
+						int value  = 0, maxPhyMode = PHY_11G;
+
+#ifdef DOT11_N_SUPPORT
+						maxPhyMode = PHY_11N_5G;
+#endif // DOT11_N_SUPPORT //
+
 						value = simple_strtol(tmpbuf, 0, 10);
 
-						if (value <= PHY_11N_5G)
+						if (value <= maxPhyMode)
 						{
 							pAd->CommonCfg.PhyMode = value;
-#ifdef CONFIG_STA_SUPPORT
-							IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
-							{
-								switch (pAd->CommonCfg.PhyMode)
-								{
-									case PHY_11A:
-										pAd->StaCfg.AdhocMode = ADHOC_11A;
-										break;
-									case PHY_11B:
-										pAd->StaCfg.AdhocMode = ADHOC_11B;
-										break;
-									case PHY_11G:
-										pAd->StaCfg.AdhocMode = ADHOC_11G;
-										break;
-									case PHY_11BG_MIXED:
-									case PHY_11BGN_MIXED:
-										pAd->StaCfg.AdhocMode = ADHOC_11BG_MIXED;
-										break;
-									case PHY_11ABG_MIXED:
-									case PHY_11ABGN_MIXED:
-										pAd->StaCfg.AdhocMode = ADHOC_11ABG_MIXED;
-										break;
-									default:
-										pAd->StaCfg.AdhocMode = ADHOC_11B;
-										break;
-								}
-							}
-#endif // CONFIG_STA_SUPPORT //
 						}
 						DBGPRINT(RT_DEBUG_TRACE, ("PhyMode=%d\n", pAd->CommonCfg.PhyMode));
 					}
@@ -1237,25 +1315,25 @@ NDIS_STATUS	RTMPReadParametersHook(
 						IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
 						{
 							if ((strcmp(tmpbuf, "WEPAUTO") == 0) || (strcmp(tmpbuf, "wepauto") == 0))
-	                            pAd->StaCfg.AuthMode = Ndis802_11AuthModeAutoSwitch;
-	                        else if ((strcmp(tmpbuf, "SHARED") == 0) || (strcmp(tmpbuf, "shared") == 0))
-	                            pAd->StaCfg.AuthMode = Ndis802_11AuthModeShared;
-	                        else if ((strcmp(tmpbuf, "WPAPSK") == 0) || (strcmp(tmpbuf, "wpapsk") == 0))
-	                            pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPAPSK;
-	                        else if ((strcmp(tmpbuf, "WPANONE") == 0) || (strcmp(tmpbuf, "wpanone") == 0))
-	                            pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPANone;
-	                        else if ((strcmp(tmpbuf, "WPA2PSK") == 0) || (strcmp(tmpbuf, "wpa2psk") == 0))
-	                            pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA2PSK; 
-#ifdef WPA_SUPPLICANT_SUPPORT
+							    pAd->StaCfg.AuthMode = Ndis802_11AuthModeAutoSwitch;
+							else if ((strcmp(tmpbuf, "SHARED") == 0) || (strcmp(tmpbuf, "shared") == 0))
+							    pAd->StaCfg.AuthMode = Ndis802_11AuthModeShared;
+							else if ((strcmp(tmpbuf, "WPAPSK") == 0) || (strcmp(tmpbuf, "wpapsk") == 0))
+							    pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPAPSK;
+							else if ((strcmp(tmpbuf, "WPANONE") == 0) || (strcmp(tmpbuf, "wpanone") == 0))
+							    pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPANone;
+							else if ((strcmp(tmpbuf, "WPA2PSK") == 0) || (strcmp(tmpbuf, "wpa2psk") == 0))
+							    pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA2PSK;
+#ifdef WPA_SUPPLICANT_SUPPORT							
 							else if ((strcmp(tmpbuf, "WPA") == 0) || (strcmp(tmpbuf, "wpa") == 0))
-	                            pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA;
-	                        else if ((strcmp(tmpbuf, "WPA2") == 0) || (strcmp(tmpbuf, "wpa2") == 0))
-	                            pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA2; 
-#endif // WPA_SUPPLICANT_SUPPORT // 
-	                        else
-	                            pAd->StaCfg.AuthMode = Ndis802_11AuthModeOpen;
+							    pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA;
+							else if ((strcmp(tmpbuf, "WPA2") == 0) || (strcmp(tmpbuf, "wpa2") == 0))
+							    pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA2;  
+#endif // WPA_SUPPLICANT_SUPPORT //
+				                        else
+				                            pAd->StaCfg.AuthMode = Ndis802_11AuthModeOpen;
 
-	                        pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;
+				                        pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;
 
 							DBGPRINT(RT_DEBUG_TRACE, ("%s::(EncrypType=%d)\n", __FUNCTION__, pAd->StaCfg.WepStatus));
 						}
@@ -1294,12 +1372,15 @@ NDIS_STATUS	RTMPReadParametersHook(
 					IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
 					{
 						if(RTMPGetCriticalParameter("WPAPSK", tmpbuf, 512, buffer))
-						{						int     err=0;
+						{						
+							int     err=0;
+
 							tmpbuf[strlen(tmpbuf)] = '\0'; // make STA can process .$^& for WPAPSK input 
 
 							if ((pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPAPSK) &&
 								(pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPA2PSK) &&
-								(pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPANone) )
+								(pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPANone) 
+								)
 							{
 								err = 1;
 							}
@@ -1332,18 +1413,37 @@ NDIS_STATUS	RTMPReadParametersHook(
 								{
 									pAd->StaCfg.WpaState = SS_NOTUSE;
 								}
+
 								DBGPRINT(RT_DEBUG_TRACE, ("%s::(WPAPSK=%s)\n", __FUNCTION__, tmpbuf));
 							} 
 						}
 					}
 #endif // CONFIG_STA_SUPPORT //													
 
-    							
 					//DefaultKeyID, KeyType, KeyStr
-					rtmp_read_key_parms_from_file(pAd, tmpbuf, buffer);
+					rtmp_read_key_parms_from_file(pAd, tmpbuf, buffer);					
 
+#ifdef DOT11_N_SUPPORT
 					HTParametersHook(pAd, tmpbuf, buffer);
+#endif // DOT11_N_SUPPORT //
+
+
+#ifdef CARRIER_DETECTION_SUPPORT
+						//CarrierDetect
+						if(RTMPGetKeyParameter("CarrierDetect", tmpbuf, 128, buffer))
+						{
+							if ((strncmp(tmpbuf, "0", 1) == 0))
+								pAd->CommonCfg.CarrierDetect.Enable = FALSE;
+							else if ((strncmp(tmpbuf, "1", 1) == 0))
+								pAd->CommonCfg.CarrierDetect.Enable = TRUE;
+							else
+								pAd->CommonCfg.CarrierDetect.Enable = FALSE;
 
+							DBGPRINT(RT_DEBUG_TRACE, ("CarrierDetect.Enable=%d\n", pAd->CommonCfg.CarrierDetect.Enable));
+						}
+						else
+							pAd->CommonCfg.CarrierDetect.Enable = FALSE;
+#endif // CARRIER_DETECTION_SUPPORT //
 
 #ifdef CONFIG_STA_SUPPORT
 					IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
@@ -1460,6 +1560,7 @@ NDIS_STATUS	RTMPReadParametersHook(
 	return (NDIS_STATUS_SUCCESS);	
 }
 
+#ifdef DOT11_N_SUPPORT
 static void	HTParametersHook(
 	IN	PRTMP_ADAPTER pAd, 
 	IN	CHAR		  *pValueStr,
@@ -1567,7 +1668,7 @@ static void	HTParametersHook(
 		}
 		else
 		{
-            pAd->HTCEnable = TRUE;
+            		pAd->HTCEnable = TRUE;
 		}
 		DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx +HTC frame = %s\n", (Value==0) ? "Disable" : "Enable"));
 	}
@@ -1643,8 +1744,6 @@ static void	HTParametersHook(
 	{
 		Value = simple_strtol(pValueStr, 0, 10);
 
-		// Intel IOT
-		Value = 64;
 		if (Value >=1 && Value <= 64)
 		{		
 			pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = Value;
@@ -1751,6 +1850,10 @@ static void	HTParametersHook(
             pAd->CommonCfg.RegTransmitSetting.field.BW  = BW_20;
 		}		
 
+#ifdef MCAST_RATE_SPECIFIC
+		pAd->CommonCfg.MCastPhyMode.field.BW = pAd->CommonCfg.RegTransmitSetting.field.BW;
+#endif // MCAST_RATE_SPECIFIC //
+
 		DBGPRINT(RT_DEBUG_TRACE, ("HT: Channel Width = %s\n", (Value==BW_40) ? "40 MHz" : "20 MHz" ));
 	}
 
@@ -1869,4 +1972,5 @@ static void	HTParametersHook(
 	}
 
 }
+#endif // DOT11_N_SUPPORT //
 
diff --git a/rt2860-1.7.0.0/os/linux/sta_ioctl.c b/rt2860-source-1.8.0.0/os/linux/sta_ioctl.c
similarity index 96%
copy from rt2860-1.7.0.0/os/linux/sta_ioctl.c
copy to rt2860-source-1.8.0.0/os/linux/sta_ioctl.c
index bd442c3..5f555e7 100644
--- a/rt2860-1.7.0.0/os/linux/sta_ioctl.c
+++ b/rt2860-source-1.8.0.0/os/linux/sta_ioctl.c
@@ -49,6 +49,16 @@ extern ULONG    RTDebugLevel;
 
 #define GROUP_KEY_NO                4
 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
+#define IWE_STREAM_ADD_EVENT(_A, _B, _C, _D, _E)		iwe_stream_add_event(_A, _B, _C, _D, _E)
+#define IWE_STREAM_ADD_POINT(_A, _B, _C, _D, _E)		iwe_stream_add_point(_A, _B, _C, _D, _E)
+#define IWE_STREAM_ADD_VALUE(_A, _B, _C, _D, _E, _F)	iwe_stream_add_value(_A, _B, _C, _D, _E, _F)
+#else
+#define IWE_STREAM_ADD_EVENT(_A, _B, _C, _D, _E)		iwe_stream_add_event(_B, _C, _D, _E)
+#define IWE_STREAM_ADD_POINT(_A, _B, _C, _D, _E)		iwe_stream_add_point(_B, _C, _D, _E)
+#define IWE_STREAM_ADD_VALUE(_A, _B, _C, _D, _E, _F)	iwe_stream_add_value(_B, _C, _D, _E, _F)
+#endif
+
 extern UCHAR    CipherWpa2Template[];
 extern UCHAR    CipherWpaPskTkip[];
 extern UCHAR    CipherWpaPskTkipLen;
@@ -184,6 +194,7 @@ VOID RTMPIoctlE2PROM(
     IN  struct iwreq    *wrq);
 #endif // DBG //
 
+
 NDIS_STATUS RTMPWPANoneAddKeyProc(
     IN  PRTMP_ADAPTER   pAd,
     IN	PVOID			pBuf);
@@ -192,9 +203,11 @@ INT Set_FragTest_Proc(
     IN  PRTMP_ADAPTER   pAdapter, 
     IN  PUCHAR          arg);
 	
+#ifdef DOT11_N_SUPPORT	
 INT Set_TGnWifiTest_Proc(
     IN  PRTMP_ADAPTER   pAd, 
     IN  PUCHAR          arg);
+#endif // DOT11_N_SUPPORT //
 
 INT Set_LongRetryLimit_Proc(
 	IN	PRTMP_ADAPTER	pAdapter, 
@@ -210,6 +223,12 @@ INT Set_Ieee80211dClientMode_Proc(
     IN  PUCHAR          arg);
 #endif // EXT_BUILD_CHANNEL_LIST //
 
+#ifdef CARRIER_DETECTION_SUPPORT
+INT Set_CarrierDetect_Proc(
+    IN  PRTMP_ADAPTER   pAd, 
+    IN  PUCHAR          arg);
+#endif // CARRIER_DETECTION_SUPPORT //
+
 static struct {
 	CHAR *name;
 	INT (*set_proc)(PRTMP_ADAPTER pAdapter, PUCHAR arg);
@@ -226,6 +245,7 @@ static struct {
 	{"BGProtection",				Set_BGProtection_Proc},
 	{"RTSThreshold",				Set_RTSThreshold_Proc},       
 	{"FragThreshold",				Set_FragThreshold_Proc},      
+#ifdef DOT11_N_SUPPORT
 	{"HtBw",		                Set_HtBw_Proc},
 	{"HtMcs",		                Set_HtMcs_Proc},
 	{"HtGi",		                Set_HtGi_Proc},
@@ -239,6 +259,7 @@ static struct {
 	{"HtBaDecline",					Set_BADecline_Proc},
 	{"HtProtect",		        	Set_HtProtect_Proc},
 	{"HtMimoPs",		        	Set_HtMimoPs_Proc},
+#endif // DOT11_N_SUPPORT //
 	
 #ifdef AGGREGATION_SUPPORT
 	{"PktAggregate",				Set_PktAggregate_Proc},       
@@ -301,12 +322,16 @@ static struct {
     {"WpaSupport",                  Set_Wpa_Support},
 #endif // WPA_SUPPLICANT_SUPPORT //
 
+
+
 	{"FixedTxMode",                 Set_FixedTxMode_Proc},
 #ifdef CONFIG_APSTA_MIXED_SUPPORT
 	{"OpMode",						Set_OpMode_Proc},
 #endif // CONFIG_APSTA_MIXED_SUPPORT //
+#ifdef DOT11_N_SUPPORT
     {"TGnWifiTest",                 Set_TGnWifiTest_Proc},
     {"ForceGF",		        		Set_ForceGF_Proc},
+#endif // DOT11_N_SUPPORT //
 #ifdef QOS_DLS_SUPPORT
 	{"DlsAddEntry",					Set_DlsAddEntry_Proc},
 	{"DlsTearDownEntry",			Set_DlsTearDownEntry_Proc},
@@ -316,6 +341,10 @@ static struct {
 #ifdef EXT_BUILD_CHANNEL_LIST
 	{"11dClientMode",				Set_Ieee80211dClientMode_Proc},
 #endif // EXT_BUILD_CHANNEL_LIST //
+#ifdef CARRIER_DETECTION_SUPPORT
+	{"CarrierDetect",				Set_CarrierDetect_Proc},
+#endif // CARRIER_DETECTION_SUPPORT //
+
 	{NULL,}
 };
 
@@ -522,8 +551,9 @@ VOID RTMPAddKey(
 		}
 	}
 end:
-    DBGPRINT(RT_DEBUG_INFO, ("<------ RTMPAddKey\n"));
+	return;
 }
+
 char * rtstrchr(const char * s, int c)
 {
     for(; *s != (char) c; ++s)
@@ -587,7 +617,7 @@ int rt_ioctl_giwfreq(struct net_device *dev,
 		   struct iw_freq *freq, char *extra)
 {
     VIRTUAL_ADAPTER *pVirtualAd = NULL;
-	PRTMP_ADAPTER pAdapter;
+	PRTMP_ADAPTER pAdapter = NULL;
 	UCHAR ch;
 	ULONG	m;
 
@@ -598,7 +628,8 @@ int rt_ioctl_giwfreq(struct net_device *dev,
 	else
 	{
 		pVirtualAd = dev->priv;
-		pAdapter = pVirtualAd->RtmpDev->priv;
+		if (pVirtualAd && pVirtualAd->RtmpDev)
+			pAdapter = pVirtualAd->RtmpDev->priv;
 	}
 
 	if (pAdapter == NULL)
@@ -608,7 +639,7 @@ int rt_ioctl_giwfreq(struct net_device *dev,
 		return -ENETDOWN;
 	}
 
-	ch = pAdapter->CommonCfg.Channel;
+		ch = pAdapter->CommonCfg.Channel;
 
 	DBGPRINT(RT_DEBUG_TRACE,("==>rt_ioctl_giwfreq  %d\n", ch));
 
@@ -659,7 +690,26 @@ int rt_ioctl_giwmode(struct net_device *dev,
 		   struct iw_request_info *info,
 		   __u32 *mode, char *extra)
 {
-	PRTMP_ADAPTER pAdapter = (PRTMP_ADAPTER) dev->priv;
+	PRTMP_ADAPTER 	pAdapter = NULL;
+	VIRTUAL_ADAPTER *pVirtualAd = NULL;
+	
+	if (dev->priv_flags == INT_MAIN)
+	{
+		pAdapter = dev->priv;
+	}
+	else
+	{
+		pVirtualAd = dev->priv;
+		if (pVirtualAd && pVirtualAd->RtmpDev)
+			pAdapter = pVirtualAd->RtmpDev->priv;
+	}
+
+	if (pAdapter == NULL)
+	{
+		/* if 1st open fail, pAd will be free;
+		   So the net_dev->priv will be NULL in 2rd open */
+		return -ENETDOWN;
+	}
 
 	if (ADHOC_ON(pAdapter))
 		*mode = IW_MODE_ADHOC;
@@ -705,11 +755,29 @@ int rt_ioctl_giwrange(struct net_device *dev,
 		   struct iw_request_info *info,
 		   struct iw_point *data, char *extra)
 {
-	PRTMP_ADAPTER pAdapter = (PRTMP_ADAPTER) dev->priv;
-
+	PRTMP_ADAPTER 	pAdapter = NULL;
+	VIRTUAL_ADAPTER *pVirtualAd = NULL;
 	struct iw_range *range = (struct iw_range *) extra;
 	u16 val;
-	int i;	
+	int i;
+
+	if (dev->priv_flags == INT_MAIN)
+	{
+		pAdapter = dev->priv;
+	}
+	else
+	{
+		pVirtualAd = dev->priv;
+		if (pVirtualAd && pVirtualAd->RtmpDev)
+			pAdapter = pVirtualAd->RtmpDev->priv;
+	}
+
+	if (pAdapter == NULL)
+	{
+		/* if 1st open fail, pAd will be free;
+		   So the net_dev->priv will be NULL in 2rd open */
+		return -ENETDOWN;
+	}
 
 	DBGPRINT(RT_DEBUG_TRACE ,("===>rt_ioctl_giwrange\n"));
 	data->length = sizeof(struct iw_range);
@@ -829,7 +897,26 @@ int rt_ioctl_giwap(struct net_device *dev,
 		      struct iw_request_info *info,
 		      struct sockaddr *ap_addr, char *extra)
 {
-	PRTMP_ADAPTER pAdapter = (PRTMP_ADAPTER) dev->priv;    
+	PRTMP_ADAPTER 	pAdapter = NULL;
+	VIRTUAL_ADAPTER *pVirtualAd = NULL;
+	
+	if (dev->priv_flags == INT_MAIN)
+	{
+		pAdapter = dev->priv;
+	}
+	else
+	{
+		pVirtualAd = dev->priv;
+		if (pVirtualAd && pVirtualAd->RtmpDev)
+			pAdapter = pVirtualAd->RtmpDev->priv;
+	}
+
+	if (pAdapter == NULL)
+	{
+		/* if 1st open fail, pAd will be free;
+		   So the net_dev->priv will be NULL in 2rd open */
+		return -ENETDOWN;
+	}
 
 	if (INFRA_ON(pAdapter) || ADHOC_ON(pAdapter))
 	{
@@ -838,7 +925,7 @@ int rt_ioctl_giwap(struct net_device *dev,
 	}
 #ifdef WPA_SUPPLICANT_SUPPORT    
     // Add for RT2870
-    else if (pAdapter->StaCfg.WpaSupplicantUP != 0)
+    else if (pAdapter->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_DISABLE)
     {
         ap_addr->sa_family = ARPHRD_ETHER;
         memcpy(ap_addr->sa_data, &pAdapter->MlmeAux.Bssid, ETH_ALEN);
@@ -951,8 +1038,9 @@ int rt_ioctl_siwscan(struct net_device *dev,
         return -EINVAL;
     }
 
+
 #ifdef WPA_SUPPLICANT_SUPPORT
-	if (pAdapter->StaCfg.WpaSupplicantUP == 1)
+	if (pAdapter->StaCfg.WpaSupplicantUP == WPA_SUPPLICANT_ENABLE)
 	{
 		pAdapter->StaCfg.WpaSupplicantScanCount++;
 	}
@@ -965,7 +1053,7 @@ int rt_ioctl_siwscan(struct net_device *dev,
 		Now = jiffies;
 
 #ifdef WPA_SUPPLICANT_SUPPORT
-		if ((pAdapter->StaCfg.WpaSupplicantUP == 1) &&
+		if ((pAdapter->StaCfg.WpaSupplicantUP == WPA_SUPPLICANT_ENABLE) &&
 			(pAdapter->StaCfg.WpaSupplicantScanCount > 3))
 		{
 			DBGPRINT(RT_DEBUG_TRACE, ("!!! WpaSupplicantScanCount > 3\n"));
@@ -1032,8 +1120,9 @@ int rt_ioctl_giwscan(struct net_device *dev,
 		return -EAGAIN;
 	}
 
+
 #ifdef WPA_SUPPLICANT_SUPPORT
-	if (pAdapter->StaCfg.WpaSupplicantUP == 1)
+	if (pAdapter->StaCfg.WpaSupplicantUP == WPA_SUPPLICANT_ENABLE)
 	{
 		pAdapter->StaCfg.WpaSupplicantScanCount = 0;
 	}
@@ -1070,10 +1159,10 @@ int rt_ioctl_giwscan(struct net_device *dev,
 		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);
+		memcpy(iwe.u.ap_addr.sa_data, &pAdapter->ScanTab.BssEntry[i].Bssid, ETH_ALEN);
 
         previous_ev = current_ev;
-			current_ev = iwe_stream_add_event(current_ev,end_buf, &iwe, IW_EV_ADDR_LEN);
+		current_ev = IWE_STREAM_ADD_EVENT(info, current_ev,end_buf, &iwe, IW_EV_ADDR_LEN);
         if (current_ev == previous_ev)
 #if WIRELESS_EXT >= 17
             return -E2BIG;
@@ -1089,7 +1178,7 @@ int rt_ioctl_giwscan(struct net_device *dev,
 		iwe.u.data.flags = 1;
  
         previous_ev = current_ev;
-		current_ev = iwe_stream_add_point(current_ev,end_buf, &iwe, pAdapter->ScanTab.BssEntry[i].Ssid);
+		current_ev = IWE_STREAM_ADD_POINT(info, current_ev,end_buf, &iwe, pAdapter->ScanTab.BssEntry[i].Ssid);
         if (current_ev == previous_ev)
 #if WIRELESS_EXT >= 17
             return -E2BIG;
@@ -1116,7 +1205,7 @@ int rt_ioctl_giwscan(struct net_device *dev,
 		iwe.len = IW_EV_UINT_LEN;
 
         previous_ev = current_ev;
-		current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe,  IW_EV_UINT_LEN);
+		current_ev = IWE_STREAM_ADD_EVENT(info, current_ev, end_buf, &iwe,  IW_EV_UINT_LEN);
         if (current_ev == previous_ev)
 #if WIRELESS_EXT >= 17
             return -E2BIG;
@@ -1136,7 +1225,7 @@ int rt_ioctl_giwscan(struct net_device *dev,
 		iwe.u.freq.i = 0;
 		
 		previous_ev = current_ev;
-		current_ev = iwe_stream_add_event(current_ev,end_buf, &iwe, IW_EV_FREQ_LEN);
+		current_ev = IWE_STREAM_ADD_EVENT(info, current_ev,end_buf, &iwe, IW_EV_FREQ_LEN);
         if (current_ev == previous_ev)
 #if WIRELESS_EXT >= 17
             return -E2BIG;
@@ -1151,7 +1240,7 @@ int rt_ioctl_giwscan(struct net_device *dev,
     	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(current_ev, end_buf, &iwe, IW_EV_QUAL_LEN);
+    	current_ev = IWE_STREAM_ADD_EVENT(info, current_ev, end_buf, &iwe, IW_EV_QUAL_LEN);
         if (current_ev == previous_ev)
 #if WIRELESS_EXT >= 17
             return -E2BIG;
@@ -1169,7 +1258,7 @@ int rt_ioctl_giwscan(struct net_device *dev,
 			iwe.u.data.flags = IW_ENCODE_DISABLED;
 
         previous_ev = current_ev;		
-        current_ev = iwe_stream_add_point(current_ev, end_buf,&iwe, (char *)pAdapter->SharedKey[BSS0][(iwe.u.data.flags & IW_ENCODE_INDEX)-1].Key);
+        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)
 #if WIRELESS_EXT >= 17
             return -E2BIG;
@@ -1197,7 +1286,7 @@ int rt_ioctl_giwscan(struct net_device *dev,
     		    iwe.u.bitrate.value =  (tmpRate/2) * 1000000;
             
 			iwe.u.bitrate.disabled = 0;
-			current_val = iwe_stream_add_value(current_ev,
+			current_val = IWE_STREAM_ADD_VALUE(info, current_ev,
 				current_val, end_buf, &iwe,
     			IW_EV_PARAM_LEN);            
 
@@ -1221,7 +1310,7 @@ int rt_ioctl_giwscan(struct net_device *dev,
 						   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(current_ev, end_buf, &iwe, custom);
+			current_ev = IWE_STREAM_ADD_POINT(info, current_ev, end_buf, &iwe, custom);
 			if (current_ev == previous_ev)
 #if WIRELESS_EXT >= 17
                 return -E2BIG;
@@ -1239,7 +1328,7 @@ int rt_ioctl_giwscan(struct net_device *dev,
 						   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(current_ev, end_buf, &iwe, custom);
+			current_ev = IWE_STREAM_ADD_POINT(info, current_ev, end_buf, &iwe, custom);
 			if (current_ev == previous_ev)
 #if WIRELESS_EXT >= 17
                 return -E2BIG;
@@ -1260,7 +1349,7 @@ int rt_ioctl_giwscan(struct net_device *dev,
             for (idx = 0; idx < pAdapter->ScanTab.BssEntry[i].WpaIE.IELen; idx++)
                 sprintf(custom, "%s%02x", custom, pAdapter->ScanTab.BssEntry[i].WpaIE.IE[idx]);
             previous_ev = current_ev;
-    		current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe,  custom);
+    		current_ev = IWE_STREAM_ADD_POINT(info, current_ev, end_buf, &iwe,  custom);
             if (current_ev == previous_ev)
 #if WIRELESS_EXT >= 17
                 return -E2BIG;
@@ -1280,7 +1369,7 @@ int rt_ioctl_giwscan(struct net_device *dev,
 			for (idx = 0; idx < pAdapter->ScanTab.BssEntry[i].RsnIE.IELen; idx++)
                 sprintf(custom, "%s%02x", custom, pAdapter->ScanTab.BssEntry[i].RsnIE.IE[idx]);
             previous_ev = current_ev;
-    		current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe,  custom);
+    		current_ev = IWE_STREAM_ADD_POINT(info, current_ev, end_buf, &iwe,  custom);
             if (current_ev == previous_ev)
 #if WIRELESS_EXT >= 17
                 return -E2BIG;
@@ -1343,7 +1432,26 @@ int rt_ioctl_giwessid(struct net_device *dev,
 			 struct iw_request_info *info,
 			 struct iw_point *data, char *essid)
 {
-	PRTMP_ADAPTER pAdapter = (PRTMP_ADAPTER) dev->priv;
+	PRTMP_ADAPTER 	pAdapter = NULL;
+	VIRTUAL_ADAPTER *pVirtualAd = NULL;
+	
+	if (dev->priv_flags == INT_MAIN)
+	{
+		pAdapter = dev->priv;
+	}
+	else
+	{
+		pVirtualAd = dev->priv;
+		if (pVirtualAd && pVirtualAd->RtmpDev)
+			pAdapter = pVirtualAd->RtmpDev->priv;
+	}
+
+	if (pAdapter == NULL)
+	{
+		/* if 1st open fail, pAd will be free;
+		   So the net_dev->priv will be NULL in 2rd open */
+		return -ENETDOWN;
+	}
 	
 	data->flags = 1;		
     if (MONITOR_ON(pAdapter))
@@ -1395,7 +1503,26 @@ int rt_ioctl_giwnickn(struct net_device *dev,
 			 struct iw_request_info *info,
 			 struct iw_point *data, char *nickname)
 {
-	PRTMP_ADAPTER pAdapter = (PRTMP_ADAPTER) dev->priv;
+	PRTMP_ADAPTER 	pAdapter = NULL;
+	VIRTUAL_ADAPTER *pVirtualAd = NULL;
+	
+	if (dev->priv_flags == INT_MAIN)
+	{
+		pAdapter = dev->priv;
+	}
+	else
+	{
+		pVirtualAd = dev->priv;
+		if (pVirtualAd && pVirtualAd->RtmpDev)
+			pAdapter = pVirtualAd->RtmpDev->priv;
+	}
+
+	if (pAdapter == NULL)
+	{
+		/* if 1st open fail, pAd will be free;
+		   So the net_dev->priv will be NULL in 2rd open */
+		return -ENETDOWN;
+	}
 
 	if (data->length > strlen(pAdapter->nickname) + 1)
 		data->length = strlen(pAdapter->nickname) + 1;
@@ -1439,15 +1566,34 @@ int rt_ioctl_giwrts(struct net_device *dev,
 		       struct iw_request_info *info,
 		       struct iw_param *rts, char *extra)
 {
-	PRTMP_ADAPTER pAdapter = (PRTMP_ADAPTER) dev->priv;
+	PRTMP_ADAPTER 	pAdapter = NULL;
+	VIRTUAL_ADAPTER *pVirtualAd = NULL;
 
-	//check if the interface is down
-	if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE))
+	if (dev->priv_flags == INT_MAIN)
 	{
-  		DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n"));
-    	return -ENETDOWN;   
+		pAdapter = dev->priv;
+	}
+	else
+	{
+		pVirtualAd = dev->priv;
+		if (pVirtualAd && pVirtualAd->RtmpDev)
+			pAdapter = pVirtualAd->RtmpDev->priv;
 	}
 
+	if (pAdapter == NULL)
+	{
+		/* if 1st open fail, pAd will be free;
+		   So the net_dev->priv will be NULL in 2rd open */
+		return -ENETDOWN;
+	}
+
+	//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;
@@ -1486,14 +1632,33 @@ int rt_ioctl_giwfrag(struct net_device *dev,
 			struct iw_request_info *info,
 			struct iw_param *frag, char *extra)
 {
-	PRTMP_ADAPTER pAdapter = (PRTMP_ADAPTER) dev->priv;
+	PRTMP_ADAPTER 	pAdapter = NULL;
+	VIRTUAL_ADAPTER *pVirtualAd = NULL;
+	
+	if (dev->priv_flags == INT_MAIN)
+	{
+		pAdapter = dev->priv;
+	}
+	else
+	{
+		pVirtualAd = dev->priv;
+		if (pVirtualAd && pVirtualAd->RtmpDev)
+			pAdapter = pVirtualAd->RtmpDev->priv;
+	}
 
-	//check if the interface is down
-	if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE))
+	if (pAdapter == NULL)
 	{
-  		DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n"));
-    	return -ENETDOWN;   
+		/* if 1st open fail, pAd will be free;
+		   So the net_dev->priv will be NULL in 2rd open */
+		return -ENETDOWN;
 	}
+
+	//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);
@@ -1609,8 +1774,27 @@ rt_ioctl_giwencode(struct net_device *dev,
 			  struct iw_request_info *info,
 			  struct iw_point *erq, char *key)
 {
-	PRTMP_ADAPTER pAdapter = (PRTMP_ADAPTER) dev->priv;
 	int kid;
+	PRTMP_ADAPTER 	pAdapter = NULL;
+	VIRTUAL_ADAPTER *pVirtualAd = NULL;
+	
+	if (dev->priv_flags == INT_MAIN)
+	{
+		pAdapter = dev->priv;
+	}
+	else
+	{
+		pVirtualAd = dev->priv;
+		if (pVirtualAd && pVirtualAd->RtmpDev)
+			pAdapter = pVirtualAd->RtmpDev->priv;
+	}
+
+	if (pAdapter == NULL)
+	{
+		/* if 1st open fail, pAd will be free;
+		   So the net_dev->priv will be NULL in 2rd open */
+		return -ENETDOWN;
+	}
 
 	//check if the interface is down
 	if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE))
@@ -1738,6 +1922,7 @@ rt_ioctl_setparam(struct net_device *dev, struct iw_request_info *info,
     return Status;
 }
 
+
 static int
 rt_private_get_statistics(struct net_device *dev, struct iw_request_info *info,
 		struct iw_point *wrq, char *extra)
@@ -1802,12 +1987,14 @@ rt_private_get_statistics(struct net_device *dev, struct iw_request_info *info,
     sprintf(extra+strlen(extra), "WpaSupplicantUP                 = %d\n\n", pAd->StaCfg.WpaSupplicantUP);
 #endif // WPA_SUPPLICANT_SUPPORT //
 
+        
     wrq->length = strlen(extra) + 1; // 1: size of '\0'
     DBGPRINT(RT_DEBUG_TRACE, ("<== rt_private_get_statistics, wrq->length = %d\n", wrq->length));
 
     return Status;
 }
 
+#ifdef DOT11_N_SUPPORT
 void	getBaInfo(
 	IN	PRTMP_ADAPTER	pAd, 
 	IN	PUCHAR			pOutBuf)
@@ -1855,9 +2042,7 @@ void	getBaInfo(
 
 	return;
 }
-
-
-
+#endif // DOT11_N_SUPPORT //
 
 static int
 rt_private_show(struct net_device *dev, struct iw_request_info *info,
@@ -1903,10 +2088,12 @@ rt_private_show(struct net_device *dev, struct iw_request_info *info,
         case SHOW_CONN_STATUS:
             if (MONITOR_ON(pAd))
             {
+#ifdef DOT11_N_SUPPORT
                 if (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED &&
                     pAd->CommonCfg.RegTransmitSetting.field.BW)
                     sprintf(extra, "Monitor Mode(CentralChannel %d)\n", pAd->CommonCfg.CentralChannel);
                 else
+#endif // DOT11_N_SUPPORT //
                     sprintf(extra, "Monitor Mode(Channel %d)\n", pAd->CommonCfg.Channel);
             }
             else
@@ -1940,18 +2127,18 @@ rt_private_show(struct net_device *dev, struct iw_request_info *info,
             sprintf(extra, "Driver version-%s, %s %s\n", STA_DRIVER_VERSION, __DATE__, __TIME__ );
             wrq->length = strlen(extra) + 1; // 1: size of '\0'
             break;
+#ifdef DOT11_N_SUPPORT
         case SHOW_BA_INFO:
             getBaInfo(pAd, extra);
             wrq->length = strlen(extra) + 1; // 1: size of '\0'
             break;
+#endif // DOT11_N_SUPPORT //
 		case SHOW_DESC_INFO:
 			{
 				Show_DescInfo_Proc(pAd, NULL);
 				wrq->length = 0; // 1: size of '\0'				
 			}
 			break;
-
-
         case RAIO_OFF:
             if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))
             {
@@ -1995,6 +2182,7 @@ rt_private_show(struct net_device *dev, struct iw_request_info *info,
             wrq->length = strlen(extra) + 1; // 1: size of '\0'
             break;
 
+
 #ifdef QOS_DLS_SUPPORT
 		case SHOW_DLS_ENTRY_INFO:
 			{
@@ -2179,7 +2367,9 @@ int rt_ioctl_siwauth(struct net_device *dev,
 #endif // WPA_SUPPLICANT_SUPPORT //                
             }
             else if (param->value == 0)
+            {
 				STA_PORT_SECURED(pAdapter);
+            }
             DBGPRINT(RT_DEBUG_TRACE, ("%s::IW_AUTH_KEY_MGMT - param->value = %d!\n", __FUNCTION__, param->value));
             break;
     	case IW_AUTH_RX_UNENCRYPTED_EAPOL:
@@ -2191,7 +2381,9 @@ int rt_ioctl_siwauth(struct net_device *dev,
             if (param->value != 0)
                 pAdapter->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;
 			else
+			{
 				STA_PORT_SECURED(pAdapter);
+			}
             DBGPRINT(RT_DEBUG_TRACE, ("%s::IW_AUTH_WPA_VERSION - param->value = %d!\n", __FUNCTION__, param->value));
     		break;
     	case IW_AUTH_80211_AUTH_ALG: 
@@ -2361,7 +2553,9 @@ int rt_ioctl_siwencodeext(struct net_device *dev,
                     {
                         fnSetCipherKey(pAdapter, keyIdx, CIPHER_TKIP, FALSE, ext);
                         if (pAdapter->StaCfg.AuthMode >= Ndis802_11AuthModeWPA2)
+                        {
                             STA_PORT_SECURED(pAdapter);
+                        }
 		}
                     else if (ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY)
                     {
@@ -2522,7 +2716,7 @@ int rt_ioctl_giwgenie(struct net_device *dev,
 
 #ifdef NATIVE_WPA_SUPPLICANT_SUPPORT
 #ifdef SIOCSIWGENIE
-	if (pAd->StaCfg.WpaSupplicantUP == 1)
+	if (pAd->StaCfg.WpaSupplicantUP == WPA_SUPPLICANT_ENABLE)
 	{
 	if (wrqu->data.length < pAd->StaCfg.RSNIE_Len)
 		return -E2BIG;
@@ -2642,7 +2836,6 @@ rt_private_ioctl_bbp(struct net_device *dev, struct iw_request_info *info,
 	INT					Status = 0;
     PRTMP_ADAPTER       pAdapter = (PRTMP_ADAPTER) dev->priv;
 
-	DBGPRINT(RT_DEBUG_INFO, ("==>rt_private_ioctl_bbp\n"));
 
 	memset(extra, 0x00, IW_PRIV_SIZE_MASK);
 
@@ -2693,11 +2886,9 @@ rt_private_ioctl_bbp(struct net_device *dev, struct iw_request_info *info,
 			}                                                                                       
 		}                                                                                           
 		else                                                                                        
-		{ //Write                                                                                   
-			DBGPRINT(RT_DEBUG_INFO, ("this_char=%s, value=%s\n", this_char, value));
+		{ //Write                                
 			if ((sscanf(this_char, "%d", &(bbpId)) == 1) && (sscanf(value, "%x", &(bbpValue)) == 1))
-			{                                                                                       
-				DBGPRINT(RT_DEBUG_INFO, ("bbpID=%02d, value=0x%x\n", bbpId, bbpValue));               
+			{
 				if (bbpId <= 136)                                                                   
 				{                                                                                   
 #ifdef RALINK_ATE
@@ -2786,27 +2977,31 @@ int rt_ioctl_siwrate(struct net_device *dev,
     */
     if (rate == -1)
     {
-        //Auto Rate
-        pAd->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO;	
+		//Auto Rate
+		pAd->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO;	
 		pAd->StaCfg.bAutoTxRateSwitch = TRUE;
-        if ((pAd->CommonCfg.PhyMode < PHY_11ABGN_MIXED) ||
-            (pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.MODE < MODE_HTMIX))
-            RTMPSetDesiredRates(pAd, -1);
-        if (pAd->StaCfg.BssType == BSS_INFRA)
-            SetCommonHT(pAd);
+		if ((pAd->CommonCfg.PhyMode <= PHY_11G) ||
+		    (pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.MODE <= MODE_OFDM))
+			RTMPSetDesiredRates(pAd, -1);
+			
+#ifdef DOT11_N_SUPPORT
+		SetCommonHT(pAd);
+#endif // DOT11_N_SUPPORT //
     }
     else
     {        
         if (fixed)
         {
         	pAd->StaCfg.bAutoTxRateSwitch = FALSE;
-            if ((pAd->CommonCfg.PhyMode < PHY_11ABGN_MIXED) ||
-                (pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.MODE < MODE_HTMIX))
+            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;
+#ifdef DOT11_N_SUPPORT
                 SetCommonHT(pAd);
+#endif // DOT11_N_SUPPORT //
             }
             DBGPRINT(RT_DEBUG_TRACE, ("rt_ioctl_siwrate::(HtMcs=%d)\n",pAd->StaCfg.DesiredTransmitSetting.field.MCS));
         }
@@ -2827,18 +3022,17 @@ int rt_ioctl_giwrate(struct net_device *dev,
     PRTMP_ADAPTER   pAd = (PRTMP_ADAPTER) dev->priv;
     int rate_index = 0, rate_count = 0;
     HTTRANSMIT_SETTING ht_setting; 
-
     __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,
-	39, 78,  117, 156, 234, 312, 351, 390,
-	27, 54,   81, 108, 162, 216, 243, 270, 54, 108, 162, 216, 324, 432, 486, 540,
-	81, 162, 243, 324, 486, 648, 729, 810,
-	14, 29,   43,  57,  87, 115, 130, 144, 29, 59,   87, 115, 173, 230, 260, 288,
-	43, 87,  130, 173, 260, 317, 390, 433,
-	30, 60,   90, 120, 180, 240, 270, 300, 60, 120, 180, 240, 360, 480, 540, 600,
-	90, 180, 270, 360, 540, 720, 810, 900};
+	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
 
     rate_count = sizeof(ralinkrate)/sizeof(__s32);
     //check if the interface is down
@@ -2848,31 +3042,25 @@ int rt_ioctl_giwrate(struct net_device *dev,
     	return -ENETDOWN;   
 	}
 
-    if ((pAd->StaCfg.bAutoTxRateSwitch == FALSE)/*!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_TX_RATE_SWITCH_ENABLED)*/ &&
+    if ((pAd->StaCfg.bAutoTxRateSwitch == FALSE) &&
         (INFRA_ON(pAd)) &&
-        ((pAd->CommonCfg.PhyMode < PHY_11ABGN_MIXED) || (pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.MODE < MODE_HTMIX)))
+        ((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;
-    
+
+#ifdef DOT11_N_SUPPORT
     if (ht_setting.field.MODE >= MODE_HTMIX)
     {
     	rate_index = 12 + ((UCHAR)ht_setting.field.BW *24) + ((UCHAR)ht_setting.field.ShortGI *48) + ((UCHAR)ht_setting.field.MCS);
     }
-    else if (ht_setting.field.MODE == MODE_OFDM)                
+    else 
+#endif // DOT11_N_SUPPORT //
+    if (ht_setting.field.MODE == MODE_OFDM)                
     	rate_index = (UCHAR)(ht_setting.field.MCS) + 4;
     else if (ht_setting.field.MODE == MODE_CCK)   
     	rate_index = (UCHAR)(ht_setting.field.MCS);
 
-    if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED) &&
-        ADHOC_ON(pAd))
-    {
-        if (pAd->StaCfg.AdhocMode == ADHOC_11B)
-            rate_index = 3;
-        else
-            rate_index = 11;
-    }
-    
     if (rate_index < 0)
         rate_index = 0;
     
@@ -2984,9 +3172,7 @@ static const iw_handler rt_priv_handlers[] = {
 	(iw_handler) rt_private_show, /* + 0x11 */
     (iw_handler) NULL, /* + 0x12 */
 	(iw_handler) NULL, /* + 0x13 */
-    (iw_handler) NULL, /* + 0x14 */
 	(iw_handler) NULL, /* + 0x15 */
-    (iw_handler) NULL, /* + 0x16 */
 	(iw_handler) NULL, /* + 0x17 */
 	(iw_handler) NULL, /* + 0x18 */
 };
@@ -3030,11 +3216,13 @@ INT RTMPSetInformation(
     NDIS_802_11_NETWORK_TYPE            NetType;
     ULONG                               Now;
     UINT                                KeyIdx = 0;
-    INT                                 Status = NDIS_STATUS_SUCCESS;
+    INT                                 Status = NDIS_STATUS_SUCCESS, MaxPhyMode = PHY_11G;
     ULONG                               PowerTemp;
     BOOLEAN                             RadioState;
     BOOLEAN                             StateMachineTouched = FALSE;
+#ifdef DOT11_N_SUPPORT
 	OID_SET_HT_PHYMODE					HT_PhyMode;	//11n ,kathy
+#endif // DOT11_N_SUPPORT //
 #ifdef WPA_SUPPLICANT_SUPPORT    
     PNDIS_802_11_PMKID                  pPmkId = NULL;
     BOOLEAN				                IEEE8021xState = FALSE;
@@ -3048,6 +3236,12 @@ INT RTMPSetInformation(
 	UCHAR						ctmp;
 #endif // SNMP_SUPPORT //
 
+
+#ifdef DOT11_N_SUPPORT
+	MaxPhyMode = PHY_11N_5G;
+#endif // DOT11_N_SUPPORT //
+
+
 	DBGPRINT(RT_DEBUG_TRACE, ("-->RTMPSetInformation(),	0x%08x\n", cmd&0x7FFF));
     switch(cmd & 0x7FFF) {
         case RT_OID_802_11_COUNTRY_REGION:
@@ -3066,7 +3260,9 @@ INT RTMPSetInformation(
 				pAdapter->CommonCfg.PhyMode = 0xff;
 				// Build all corresponding channel information
 				RTMPSetPhyMode(pAdapter, TmpPhy);
+#ifdef DOT11_N_SUPPORT
 				SetCommonHT(pAdapter);
+#endif // DOT11_N_SUPPORT //
 				DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_COUNTRY_REGION (A:%d  B/G:%d)\n", pAdapter->CommonCfg.CountryRegionForABand,
 				    pAdapter->CommonCfg.CountryRegion));
             }
@@ -3088,6 +3284,10 @@ INT RTMPSetInformation(
                 break;
             }
 
+			//Benson add 20080527, when radio off, sta don't need to scan
+			if (RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_RADIO_OFF))
+				break;
+				
 			if (RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))
 			{
                 DBGPRINT(RT_DEBUG_TRACE, ("!!! Driver is scanning now !!!\n"));
@@ -3117,6 +3317,7 @@ INT RTMPSetInformation(
 				break;
             }
 
+
             if (pAdapter->Mlme.CntlMachine.CurrState != CNTL_IDLE)
             {
                 RT28XX_MLME_RESET_STATE_MACHINE(pAdapter);
@@ -3250,8 +3451,13 @@ INT RTMPSetInformation(
             else
             {
                 Status = copy_from_user(&PhyMode, wrq->u.data.pointer, wrq->u.data.length);
-                RTMPSetPhyMode(pAdapter, PhyMode);
-				SetCommonHT(pAdapter);
+				if (PhyMode <= MaxPhyMode)
+				{
+                	RTMPSetPhyMode(pAdapter, PhyMode);
+#ifdef DOT11_N_SUPPORT
+					SetCommonHT(pAdapter);
+#endif // DOT11_N_SUPPORT //
+				}
                 DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_PHY_MODE (=%d)\n", PhyMode));
             }
             break;
@@ -3264,23 +3470,24 @@ INT RTMPSetInformation(
                 pAdapter->CommonCfg.bEnableTxBurst = StaConfig.EnableTxBurst;
                 pAdapter->CommonCfg.UseBGProtection = StaConfig.UseBGProtection;
                 pAdapter->CommonCfg.bUseShortSlotTime = 1; // 2003-10-30 always SHORT SLOT capable
-                if (pAdapter->StaCfg.AdhocMode != StaConfig.AdhocMode)
+                if ((pAdapter->CommonCfg.PhyMode != StaConfig.AdhocMode) &&
+					(StaConfig.AdhocMode <= MaxPhyMode))
                 {
                     // allow dynamic change of "USE OFDM rate or not" in ADHOC mode
                     // if setting changed, need to reset current TX rate as well as BEACON frame format
-                    pAdapter->StaCfg.AdhocMode = StaConfig.AdhocMode;
                     if (pAdapter->StaCfg.BssType == BSS_ADHOC)
                     {
+						pAdapter->CommonCfg.PhyMode = StaConfig.AdhocMode;
+                    	RTMPSetPhyMode(pAdapter, PhyMode);
                         MlmeUpdateTxRates(pAdapter, FALSE, 0);
                         MakeIbssBeacon(pAdapter);           // re-build BEACON frame
                         AsicEnableIbssSync(pAdapter);   // copy to on-chip memory
                     }
                 }
-                DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_SET_STA_CONFIG (Burst=%d, Protection=%ld,ShortSlot=%d, Adhoc=%ld\n",
+                DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_SET_STA_CONFIG (Burst=%d, Protection=%ld,ShortSlot=%d\n",
                                         pAdapter->CommonCfg.bEnableTxBurst,
                                         pAdapter->CommonCfg.UseBGProtection,
-                                        pAdapter->CommonCfg.bUseShortSlotTime,
-                                        pAdapter->StaCfg.AdhocMode));
+                                        pAdapter->CommonCfg.bUseShortSlotTime));
             }
             break;
         case OID_802_11_DESIRED_RATES:
@@ -3518,9 +3725,10 @@ INT RTMPSetInformation(
 					RTMPSetPhyMode(pAdapter, PHY_11A);
 				else 
 					Status = -EINVAL;
-
+#ifdef DOT11_N_SUPPORT
 				if (Status == NDIS_STATUS_SUCCESS)
 					SetCommonHT(pAdapter);
+#endif // DOT11_N_SUPPORT //
                 DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_NETWORK_TYPE_IN_USE (=%d)\n",NetType));
 		    }	    
 			break;
@@ -3664,7 +3872,7 @@ INT RTMPSetInformation(
                 pAdapter->bConfigChanged = TRUE;
             }
             break;
-
+#ifdef DOT11_N_SUPPORT
 		case RT_OID_802_11_SET_HT_PHYMODE:
 			if (wrq->u.data.length	!= sizeof(OID_SET_HT_PHYMODE))
 				Status = -EINVAL;
@@ -3683,7 +3891,7 @@ INT RTMPSetInformation(
 				pAdapter->StaCfg.HTPhyMode.field.MCS, pAdapter->StaCfg.HTPhyMode.field.BW, pAdapter->StaCfg.HTPhyMode.field.ShortGI,
 				pAdapter->StaCfg.HTPhyMode.field.STBC));
 			break;
-
+#endif // DOT11_N_SUPPORT //
 		case RT_OID_802_11_SET_APSD_SETTING:
 			if (wrq->u.data.length != sizeof(ULONG))
 				Status = -EINVAL;
@@ -3829,6 +4037,7 @@ INT RTMPSetInformation(
 			}
 			break;
 
+#ifdef DOT11_N_SUPPORT
 		case RT_OID_802_11_SET_IMME_BA_CAP:
 				if (wrq->u.data.length != sizeof(OID_BACAP_STRUC))
 					Status = -EINVAL;
@@ -3880,7 +4089,6 @@ INT RTMPSetInformation(
 						pAdapter->CommonCfg.BACapability.field.RxBAWinLimit,pAdapter->CommonCfg.BACapability.field.TxBAWinLimit, pAdapter->CommonCfg.BACapability.field.AutoBA));
 					DBGPRINT(RT_DEBUG_TRACE, ("Set::(MimoPs = %d)(AmsduEnable = %d) (AmsduSize=%d)(MpduDensity=%d)\n",pAdapter->CommonCfg.DesiredHtPhy.MimoPs, pAdapter->CommonCfg.DesiredHtPhy.AmsduEnable,
 						pAdapter->CommonCfg.DesiredHtPhy.AmsduSize, pAdapter->CommonCfg.DesiredHtPhy.MpduDensity));
-					DBGPRINT(RT_DEBUG_INFO, ("Set::RT_OID_802_11_SET_IMME_BA_CAP (=%d)\n", Orde.Policy));
 				}
 
 				break;
@@ -3952,7 +4160,7 @@ INT RTMPSetInformation(
 					Status = copy_from_user(pBA, wrq->u.data.pointer, wrq->u.data.length);
 					DBGPRINT(RT_DEBUG_TRACE, ("Set :: RT_OID_802_11_TEAR_IMME_BA(TID=%d, bAllTid=%d)\n", pBA->TID, pBA->bAllTid));
 					
-					if (!pBA->bAllTid && (pBA->TID > 15))
+					if (!pBA->bAllTid && (pBA->TID > NUM_OF_TID))
 					{
 						Status = NDIS_STATUS_INVALID_DATA;
 						break;
@@ -3984,6 +4192,7 @@ INT RTMPSetInformation(
 				}
             }
             break;
+#endif // DOT11_N_SUPPORT //
 
         // For WPA_SUPPLICANT to set static wep key	  
     	case OID_802_11_ADD_WEP:
@@ -4208,6 +4417,8 @@ INT RTMPSetInformation(
 	        break;
 #endif // WPA_SUPPLICANT_SUPPORT //
 
+
+
 #ifdef SNMP_SUPPORT
 		case OID_802_11_SHORTRETRYLIMIT:
 			if (wrq->u.data.length != sizeof(ULONG))
@@ -4291,12 +4502,15 @@ INT RTMPSetInformation(
 			break;
 #endif
 
+
+
         default:
             DBGPRINT(RT_DEBUG_TRACE, ("Set::unknown IOCTL's subcmd = 0x%08x\n", cmd));
             Status = -EOPNOTSUPP;
             break;
     }
 
+
     return Status;
 }
 
@@ -4331,6 +4545,7 @@ INT RTMPQueryInformation(
 	UCHAR	driverVersion[8];
     OID_SET_HT_PHYMODE			        *pHTPhyMode = NULL;
 	
+
 #ifdef SNMP_SUPPORT	
 	//for snmp, kathy
 	DefaultKeyIdxValue			*pKeyIdxValue;
@@ -4343,7 +4558,6 @@ INT RTMPQueryInformation(
     switch(cmd) 
     {
         case RT_OID_DEVICE_NAME:
-            DBGPRINT(RT_DEBUG_INFO, ("Query::RT_OID_DEVICE_NAME\n"));
             wrq->u.data.length = sizeof(STA_NIC_DEVICE_NAME);
             Status = copy_to_user(wrq->u.data.pointer, STA_NIC_DEVICE_NAME, wrq->u.data.length);
             break;        
@@ -4430,7 +4644,6 @@ INT RTMPQueryInformation(
                 else
                 {
                     pBss->Ssid.SsidLength = pAdapter->ScanTab.BssEntry[i].SsidLen;
-                    //NdisZeroMemory(pBss->Ssid.Ssid, NDIS_802_11_LENGTH_SSID);
                     NdisMoveMemory(pBss->Ssid.Ssid, pAdapter->ScanTab.BssEntry[i].Ssid, pAdapter->ScanTab.BssEntry[i].SsidLen);
                 }
                 pBss->Privacy = pAdapter->ScanTab.BssEntry[i].Privacy;
@@ -4452,12 +4665,6 @@ INT RTMPQueryInformation(
                                pAdapter->ScanTab.BssEntry[i].ExtRate,
                                pAdapter->ScanTab.BssEntry[i].ExtRateLen);
 
-                DBGPRINT(RT_DEBUG_INFO,("BSS#%d - %s, Ch %d = %ld Khz, Sup+Ext rate# = %d\n",
-                    i,pBss->Ssid.Ssid,
-                    pAdapter->ScanTab.BssEntry[i].Channel,
-                    pBss->Configuration.DSConfig,
-                    pAdapter->ScanTab.BssEntry[i].SupRateLen + pAdapter->ScanTab.BssEntry[i].ExtRateLen));
-
                 if (pAdapter->ScanTab.BssEntry[i].VarIELen == 0)
                 {
                     pBss->IELength = sizeof(NDIS_802_11_FIXED_IEs);
@@ -4504,11 +4711,8 @@ INT RTMPQueryInformation(
         case OID_802_3_CURRENT_ADDRESS:
             wrq->u.data.length = MAC_ADDR_LEN;
             Status = copy_to_user(wrq->u.data.pointer, &pAdapter->CurrentAddress, wrq->u.data.length);
-            DBGPRINT(RT_DEBUG_INFO, ("Query::OID_802_3_CURRENT_ADDRESS \n"));
             break;
         case OID_GEN_MEDIA_CONNECT_STATUS:
-            DBGPRINT(RT_DEBUG_INFO, ("Query::OID_GEN_MEDIA_CONNECT_STATUS \n"));
-
             if (pAdapter->IndicateMediaState == NdisMediaStateConnected)
                 MediaState = NdisMediaStateConnected;
             else
@@ -4530,10 +4734,6 @@ INT RTMPQueryInformation(
             {
                 Status = copy_to_user(wrq->u.data.pointer, &pAdapter->CommonCfg.Bssid, sizeof(NDIS_802_11_MAC_ADDRESS));
 
-                DBGPRINT(RT_DEBUG_INFO, ("IOCTL::SIOCGIWAP(=%02x:%02x:%02x:%02x:%02x:%02x)\n",
-                        pAdapter->CommonCfg.Bssid[0],pAdapter->CommonCfg.Bssid[1],pAdapter->CommonCfg.Bssid[2],
-                        pAdapter->CommonCfg.Bssid[3],pAdapter->CommonCfg.Bssid[4],pAdapter->CommonCfg.Bssid[5]));
-
             }
             else
             {
@@ -4580,9 +4780,9 @@ INT RTMPQueryInformation(
                 MAP_CHANNEL_ID_TO_KHZ(pAdapter->CommonCfg.Channel, pConfiguration->DSConfig);
                 wrq->u.data.length = sizeof(NDIS_802_11_CONFIGURATION);
                 Status = copy_to_user(wrq->u.data.pointer, pConfiguration, wrq->u.data.length);
-                kfree(pConfiguration);
                 DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_CONFIGURATION(BeaconPeriod=%ld,AtimW=%ld,Channel=%d) \n", 
                                         pConfiguration->BeaconPeriod, pConfiguration->ATIMWindow, pAdapter->CommonCfg.Channel));
+				kfree(pConfiguration);
             }
             else
             {
@@ -4625,19 +4825,16 @@ INT RTMPQueryInformation(
 			ulInfo = pAdapter->StaCfg.RssiSample.LastRssi0;
 			wrq->u.data.length = sizeof(ulInfo);
 			Status = copy_to_user(wrq->u.data.pointer, &ulInfo,	wrq->u.data.length);
-			DBGPRINT(RT_DEBUG_INFO,	("Query::OID_802_11_RSSI(=%ld)\n", ulInfo));
 			break;
 		case RT_OID_802_11_RSSI_1:
             ulInfo = pAdapter->StaCfg.RssiSample.LastRssi1;
 			wrq->u.data.length = sizeof(ulInfo);
 			Status = copy_to_user(wrq->u.data.pointer, &ulInfo,	wrq->u.data.length);
-			DBGPRINT(RT_DEBUG_INFO,	("Query::OID_802_11_RSSI_1(=%ld)\n", ulInfo));
 			break;
         case RT_OID_802_11_RSSI_2:
             ulInfo = pAdapter->StaCfg.RssiSample.LastRssi2;
 			wrq->u.data.length = sizeof(ulInfo);
 			Status = copy_to_user(wrq->u.data.pointer, &ulInfo,	wrq->u.data.length);
-			DBGPRINT(RT_DEBUG_INFO,	("Query::OID_802_11_RSSI_2(=%ld)\n", ulInfo));
 			break;
         case OID_802_11_STATISTICS:
             pStatistics = (NDIS_802_11_STATISTICS *) kmalloc(sizeof(NDIS_802_11_STATISTICS), MEM_ALLOC_FLAG);
@@ -4679,13 +4876,11 @@ INT RTMPQueryInformation(
             }
             break;
         case OID_GEN_RCV_OK:
-            DBGPRINT(RT_DEBUG_INFO, ("Query::OID_GEN_RCV_OK \n"));
             ulInfo = pAdapter->Counters8023.GoodReceives;
             wrq->u.data.length = sizeof(ulInfo);
             Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
             break;
         case OID_GEN_RCV_NO_BUFFER:
-            DBGPRINT(RT_DEBUG_INFO, ("Query::OID_GEN_RCV_NO_BUFFER \n"));
             ulInfo = pAdapter->Counters8023.RxNoBuffer;
             wrq->u.data.length = sizeof(ulInfo);
             Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
@@ -4705,7 +4900,7 @@ INT RTMPQueryInformation(
                 pStaConfig->EnableTurboRate = 0;
                 pStaConfig->UseBGProtection = pAdapter->CommonCfg.UseBGProtection;
                 pStaConfig->UseShortSlotTime = pAdapter->CommonCfg.bUseShortSlotTime;
-                pStaConfig->AdhocMode = pAdapter->StaCfg.AdhocMode;
+                //pStaConfig->AdhocMode = pAdapter->StaCfg.AdhocMode;
                 pStaConfig->HwRadioStatus = (pAdapter->StaCfg.bHwRadio == TRUE) ? 1 : 0;
                 pStaConfig->Rsv1 = 0;
                 pStaConfig->SystemErrorBitmap = pAdapter->SystemErrorBitmap;
@@ -4816,7 +5011,6 @@ INT RTMPQueryInformation(
 			else
 				ulInfo = Ndis802_11DS;
             Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length);
-			DBGPRINT(RT_DEBUG_INFO, ("Query::OID_802_11_NETWORK_TYPE_IN_USE(=%ld)\n", ulInfo));
 			break;
         case RT_OID_802_11_QUERY_LAST_RX_RATE:
             ulInfo = (ULONG)pAdapter->LastRxRate;
@@ -4834,12 +5028,10 @@ INT RTMPQueryInformation(
         case RT_OID_802_11_QUERY_EEPROM_VERSION:
             wrq->u.data.length = sizeof(ULONG);
             Status = copy_to_user(wrq->u.data.pointer, &pAdapter->EepromVersion, wrq->u.data.length);
-            DBGPRINT(RT_DEBUG_INFO, ("Query::RT_OID_802_11_QUERY_EEPROM_VERSION (=%ld)\n", pAdapter->EepromVersion));
             break;
         case RT_OID_802_11_QUERY_FIRMWARE_VERSION:
             wrq->u.data.length = sizeof(ULONG);
             Status = copy_to_user(wrq->u.data.pointer, &pAdapter->FirmwareVersion, wrq->u.data.length);
-            DBGPRINT(RT_DEBUG_INFO, ("Query::RT_OID_802_11_QUERY_FIRMWARE_VERSION (=%ld)\n", pAdapter->FirmwareVersion));
 			break;
 	    case RT_OID_802_11_QUERY_NOISE_LEVEL:
 			wrq->u.data.length = sizeof(UCHAR);
@@ -4855,7 +5047,6 @@ INT RTMPQueryInformation(
 	        wrq->u.data.length = sizeof(UINT);
 	        we_version_compiled = WIRELESS_EXT;
 	        Status = copy_to_user(wrq->u.data.pointer, &we_version_compiled, wrq->u.data.length);
-	        DBGPRINT(RT_DEBUG_INFO, ("Query::RT_OID_WE_VERSION_COMPILED (=%d)\n", we_version_compiled));
 	        break;
 		case RT_OID_802_11_QUERY_APSD_SETTING:
 			apsd = (pAdapter->CommonCfg.bAPSDCapable | (pAdapter->CommonCfg.bAPSDAC_BE << 1) | (pAdapter->CommonCfg.bAPSDAC_BK << 2)
@@ -4979,7 +5170,6 @@ INT RTMPQueryInformation(
 		case RT_OID_802_11_MAC_ADDRESS:
             wrq->u.data.length = MAC_ADDR_LEN;
             Status = copy_to_user(wrq->u.data.pointer, &pAdapter->CurrentAddress, wrq->u.data.length);
-            DBGPRINT(RT_DEBUG_INFO, ("Query::RT_OID_802_11_MAC_ADDRESS \n"));
 			break;
 
 		case RT_OID_802_11_MANUFACTUREROUI:
@@ -5167,6 +5357,7 @@ INT RTMPQueryInformation(
 			DBGPRINT(RT_DEBUG_TRACE, ("Status=%d\n", Status));
 			break;			
 
+
 #ifdef QOS_DLS_SUPPORT
 		case RT_OID_802_11_QUERY_DLS:
 			wrq->u.data.length = sizeof(BOOLEAN);
@@ -5195,7 +5386,6 @@ INT RTMPQueryInformation(
 			}
 			break;
 #endif // QOS_DLS_SUPPORT //
-
         default:
             DBGPRINT(RT_DEBUG_TRACE, ("Query::unknown IOCTL's subcmd = 0x%08x\n", cmd));
             Status = -EOPNOTSUPP;
@@ -5631,14 +5821,20 @@ INT Set_NetworkType_Proc(
 		DBGPRINT(RT_DEBUG_TRACE, ("fOP_STATUS_MEDIA_STATE_CONNECTED \n"));
         if (pAdapter->CommonCfg.CentralChannel == 0)
         {
+#ifdef DOT11_N_SUPPORT
             if (pAdapter->CommonCfg.PhyMode == PHY_11AN_MIXED)
                 pAdapter->CommonCfg.CentralChannel = 36;
             else
+#endif // DOT11_N_SUPPORT //
                 pAdapter->CommonCfg.CentralChannel = 6;
         }
+#ifdef DOT11_N_SUPPORT
         else
             N_ChannelCheck(pAdapter);
-		if (pAdapter->CommonCfg.PhyMode >= PHY_11ABGN_MIXED &&
+#endif // DOT11_N_SUPPORT //
+
+#ifdef DOT11_N_SUPPORT
+	if (pAdapter->CommonCfg.PhyMode >= PHY_11ABGN_MIXED &&
             pAdapter->CommonCfg.RegTransmitSetting.field.BW == BW_40 &&
             pAdapter->CommonCfg.RegTransmitSetting.field.EXTCHA == EXTCHA_ABOVE)
 		{
@@ -5688,14 +5884,15 @@ INT Set_NetworkType_Proc(
                                        pAdapter->CommonCfg.CentralChannel));
 		}
 		else
+#endif // DOT11_N_SUPPORT //
 		{
 			// 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);
+			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
@@ -6180,9 +6377,10 @@ INT Set_WPAPSK_Proc(
 {
     UCHAR                   keyMaterial[40];
     
-    if ((pAdapter->StaCfg.AuthMode != Ndis802_11AuthModeWPAPSK) &&\
-        (pAdapter->StaCfg.AuthMode != Ndis802_11AuthModeWPA2PSK) &&\
-	    (pAdapter->StaCfg.AuthMode != Ndis802_11AuthModeWPANone) )
+    if ((pAdapter->StaCfg.AuthMode != Ndis802_11AuthModeWPAPSK) && 
+        (pAdapter->StaCfg.AuthMode != Ndis802_11AuthModeWPA2PSK) &&
+	    (pAdapter->StaCfg.AuthMode != Ndis802_11AuthModeWPANone)
+		)
         return TRUE;    // do nothing
         
     DBGPRINT(RT_DEBUG_TRACE, ("Set_WPAPSK_Proc::(WPAPSK=%s)\n", arg));
@@ -6207,6 +6405,8 @@ INT Set_WPAPSK_Proc(
         NdisMoveMemory(pAdapter->StaCfg.PMK, keyMaterial, 32);
     }
 
+
+
     if(pAdapter->StaCfg.BssType == BSS_ADHOC &&
        pAdapter->StaCfg.AuthMode == Ndis802_11AuthModeWPANone)
     {
@@ -6311,13 +6511,13 @@ INT Set_Wpa_Support(
 {
 
     if ( simple_strtol(arg, 0, 10) == 0)
-        pAd->StaCfg.WpaSupplicantUP = 0;
+        pAd->StaCfg.WpaSupplicantUP = WPA_SUPPLICANT_DISABLE;
     else if ( simple_strtol(arg, 0, 10) == 1)
-        pAd->StaCfg.WpaSupplicantUP = 1;
+        pAd->StaCfg.WpaSupplicantUP = WPA_SUPPLICANT_ENABLE;
     else if ( simple_strtol(arg, 0, 10) == 2)
-        pAd->StaCfg.WpaSupplicantUP = 2;
+        pAd->StaCfg.WpaSupplicantUP = WPA_SUPPLICANT_ENABLE_WITH_WEB_UI;
     else
-        pAd->StaCfg.WpaSupplicantUP = 0;
+        pAd->StaCfg.WpaSupplicantUP = WPA_SUPPLICANT_DISABLE;
 
     DBGPRINT(RT_DEBUG_TRACE, ("Set_Wpa_Support::(WpaSupplicantUP=%d)\n", pAd->StaCfg.WpaSupplicantUP));
     
@@ -6356,8 +6556,8 @@ VOID RTMPIoctlMAC(
 	UCHAR				temp[16], temp2[16];
 	UINT32				macValue = 0;
 	INT					Status;
+	
 
-	DBGPRINT(RT_DEBUG_INFO, ("==>RTMPIoctlMAC\n"));
 	memset(msg, 0x00, 1024);
 	if (wrq->u.data.length > 1) //No parameters.
 	{   
@@ -6366,7 +6566,6 @@ VOID RTMPIoctlMAC(
 		
 		//Parsing Read or Write
 	    this_char = arg;
-		DBGPRINT(RT_DEBUG_INFO, ("this_char=%s\n", this_char));
 		if (!*this_char)
 			goto next;
 
@@ -6375,8 +6574,6 @@ VOID RTMPIoctlMAC(
 
 		if (!value || !*value)
 		{ //Read
-			DBGPRINT(RT_DEBUG_INFO, ("Read: this_char=%s, strlen=%d\n", this_char, strlen(this_char)));
-
 			// Sanity check
 			if(strlen(this_char) > 4)
 				goto next;
@@ -6408,7 +6605,6 @@ VOID RTMPIoctlMAC(
 					RTMP_IO_READ32(pAdapter, macAddr, &macValue);
 					DBGPRINT(RT_DEBUG_TRACE, ("MacAddr=%lx, MacValue=%x\n", macAddr, macValue));
 					sprintf(msg+strlen(msg), "[0x%08lX]:%08X  ", macAddr , macValue);
-					DBGPRINT(RT_DEBUG_INFO, ("msg=%s\n", msg));
 				}
 				else
 				{//Invalid parametes, so default printk all bbp
@@ -6418,7 +6614,6 @@ VOID RTMPIoctlMAC(
 		}
 		else
 		{ //Write
-			DBGPRINT(RT_DEBUG_INFO, ("Write: this_char=%s, strlen(value)=%d, value=%s\n", this_char, strlen(value), value));
 			memcpy(&temp2, value, strlen(value));
 			temp2[strlen(value)] = '\0';
 
@@ -6500,16 +6695,14 @@ VOID RTMPIoctlMAC(
 				
 				RTMP_IO_WRITE32(pAdapter, macAddr, macValue);
 				sprintf(msg+strlen(msg), "[0x%08lX]:%08X  ", macAddr, macValue);
-				DBGPRINT(RT_DEBUG_INFO, ("msg=%s\n", msg));
 			}
 		}
 	}
 next:
 	if(strlen(msg) == 1)
 		sprintf(msg+strlen(msg), "===>Error command format!");
-	DBGPRINT(RT_DEBUG_INFO, ("copy to user [msg=%s]\n", msg));
+
 	// Copy the information into the user buffer
-	DBGPRINT(RT_DEBUG_INFO, ("strlen(msg) =%d\n", strlen(msg)));
 	wrq->u.data.length = strlen(msg);
 	Status = copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length);
 	
@@ -6547,7 +6740,7 @@ VOID RTMPIoctlE2PROM(
 	USHORT				eepValue;
 	int					Status;
 
-	DBGPRINT(RT_DEBUG_INFO, ("==>RTMPIoctlE2PROM\n"));
+	
 	memset(msg, 0x00, 1024);
 	if (wrq->u.data.length > 1) //No parameters.
 	{   
@@ -6556,8 +6749,8 @@ VOID RTMPIoctlE2PROM(
 
 	    //Parsing Read or Write
 		this_char = arg;
-		DBGPRINT(RT_DEBUG_INFO, ("this_char=%s\n", this_char));
 		
+			
 		if (!*this_char)
 			goto next;
 
@@ -6566,8 +6759,7 @@ VOID RTMPIoctlE2PROM(
 
 		if (!value || !*value)
 		{ //Read
-			DBGPRINT(RT_DEBUG_INFO, ("Read: this_char=%s, strlen=%d\n", this_char, strlen(this_char)));
-
+			
 			// Sanity check
 			if(strlen(this_char) > 4)
 				goto next;
@@ -6597,9 +6789,7 @@ VOID RTMPIoctlE2PROM(
 				if (eepAddr < 0xFFFF)
 				{
 					RT28xx_EEPROM_READ16(pAdapter, eepAddr, eepValue);
-					DBGPRINT(RT_DEBUG_INFO, ("eepAddr=%x, eepValue=0x%x\n", eepAddr, eepValue));
 					sprintf(msg+strlen(msg), "[0x%04X]:0x%04X  ", eepAddr , eepValue);
-					DBGPRINT(RT_DEBUG_INFO, ("msg=%s\n", msg));
 				}
 				else
 				{//Invalid parametes, so default printk all bbp
@@ -6609,7 +6799,6 @@ VOID RTMPIoctlE2PROM(
 		}
 		else
 		{ //Write
-			DBGPRINT(RT_DEBUG_INFO, ("Write: this_char=%s, strlen(value)=%d, value=%s\n", this_char, strlen(value), value));
 			memcpy(&temp2, value, strlen(value));
 			temp2[strlen(value)] = '\0';
 
@@ -6658,19 +6847,16 @@ VOID RTMPIoctlE2PROM(
 			AtoH(temp2, temp, 2);
 			eepValue = *temp*256 + temp[1];
 
-			DBGPRINT(RT_DEBUG_INFO, ("eepAddr=%02x, eepValue=0x%x\n", eepAddr, eepValue));
-			
 			RT28xx_EEPROM_WRITE16(pAdapter, eepAddr, eepValue);
 			sprintf(msg+strlen(msg), "[0x%02X]:%02X  ", eepAddr, eepValue);
-			DBGPRINT(RT_DEBUG_INFO, ("msg=%s\n", msg));
 		}
 	}
 next:
 	if(strlen(msg) == 1)
 		sprintf(msg+strlen(msg), "===>Error command format!");
 
+
 	// Copy the information into the user buffer
-	DBGPRINT(RT_DEBUG_INFO, ("copy to user [msg=%s]\n", msg));
 	wrq->u.data.length = strlen(msg);
 	Status = copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length);
 	
@@ -6678,6 +6864,9 @@ next:
 }
 #endif // DBG //
 
+
+
+
 INT Set_TGnWifiTest_Proc(
     IN  PRTMP_ADAPTER   pAd, 
     IN  PUCHAR          arg)
@@ -6738,3 +6927,18 @@ INT Set_Ieee80211dClientMode_Proc(
 }
 #endif // EXT_BUILD_CHANNEL_LIST //
 
+#ifdef CARRIER_DETECTION_SUPPORT
+INT Set_CarrierDetect_Proc(
+    IN  PRTMP_ADAPTER   pAd, 
+    IN  PUCHAR          arg)
+{
+    if (simple_strtol(arg, 0, 10) == 0)
+        pAd->CommonCfg.CarrierDetect.Enable = FALSE;
+    else
+        pAd->CommonCfg.CarrierDetect.Enable = TRUE;
+
+    DBGPRINT(RT_DEBUG_TRACE, ("IF Set_CarrierDetect_Proc::(CarrierDetect.Enable=%d)\n", pAd->CommonCfg.CarrierDetect.Enable));
+	return TRUE;
+}
+#endif // CARRIER_DETECTION_SUPPORT //
+
diff --git a/rt2860-source-1.8.0.0/os/linux/sta_ioctl.c.patch b/rt2860-source-1.8.0.0/os/linux/sta_ioctl.c.patch
new file mode 100644
index 0000000..4bf50e5
--- /dev/null
+++ b/rt2860-source-1.8.0.0/os/linux/sta_ioctl.c.patch
@@ -0,0 +1,18 @@
+--- sta_ioctl.c	2008-09-18 10:14:57.000000000 +0800
++++ sta_ioctl.c.fc9	2008-09-18 10:45:57.000000000 +0800
+@@ -49,15 +49,9 @@
+ 
+ #define GROUP_KEY_NO                4
+ 
+-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
+ #define IWE_STREAM_ADD_EVENT(_A, _B, _C, _D, _E)		iwe_stream_add_event(_A, _B, _C, _D, _E)
+ #define IWE_STREAM_ADD_POINT(_A, _B, _C, _D, _E)		iwe_stream_add_point(_A, _B, _C, _D, _E)
+ #define IWE_STREAM_ADD_VALUE(_A, _B, _C, _D, _E, _F)	iwe_stream_add_value(_A, _B, _C, _D, _E, _F)
+-#else
+-#define IWE_STREAM_ADD_EVENT(_A, _B, _C, _D, _E)		iwe_stream_add_event(_B, _C, _D, _E)
+-#define IWE_STREAM_ADD_POINT(_A, _B, _C, _D, _E)		iwe_stream_add_point(_B, _C, _D, _E)
+-#define IWE_STREAM_ADD_VALUE(_A, _B, _C, _D, _E, _F)	iwe_stream_add_value(_B, _C, _D, _E, _F)
+-#endif
+ 
+ extern UCHAR    CipherWpa2Template[];
+ extern UCHAR    CipherWpaPskTkip[];
diff --git a/rt2860-1.7.0.0/sta/aironet.c b/rt2860-source-1.8.0.0/sta/aironet.c
similarity index 100%
copy from rt2860-1.7.0.0/sta/aironet.c
copy to rt2860-source-1.8.0.0/sta/aironet.c
diff --git a/rt2860-1.7.0.0/sta/assoc.c b/rt2860-source-1.8.0.0/sta/assoc.c
similarity index 98%
copy from rt2860-1.7.0.0/sta/assoc.c
copy to rt2860-source-1.8.0.0/sta/assoc.c
index cf7140c..246cc62 100644
--- a/rt2860-1.7.0.0/sta/assoc.c
+++ b/rt2860-source-1.8.0.0/sta/assoc.c
@@ -142,7 +142,6 @@ VOID AssocTimeout(IN PVOID SystemSpecific1,
 				 IN PVOID SystemSpecific3) 
 {
 	RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)FunctionContext;
-	DBGPRINT(RT_DEBUG_INFO,("ASSOC - enqueue MT2_ASSOC_TIMEOUT \n"));
 	
 	// Do nothing if the driver is starting halt state.
 	// This might happen when timer already been fired before cancel timer with mlmehalt
@@ -171,7 +170,6 @@ VOID ReassocTimeout(IN PVOID SystemSpecific1,
 					IN PVOID SystemSpecific3) 
 {
 	RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)FunctionContext;
-	DBGPRINT(RT_DEBUG_INFO,("ASSOC - enqueue MT2_REASSOC_TIMEOUT \n"));
 	
 	// Do nothing if the driver is starting halt state.
 	// This might happen when timer already been fired before cancel timer with mlmehalt
@@ -200,7 +198,6 @@ VOID DisassocTimeout(IN PVOID SystemSpecific1,
 					IN PVOID SystemSpecific3) 
 {
 	RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)FunctionContext;
-	DBGPRINT(RT_DEBUG_INFO,("ASSOC - enqueue MT2_DISASSOC_TIMEOUT \n"));
 	
 	// Do nothing if the driver is starting halt state.
 	// This might happen when timer already been fired before cancel timer with mlmehalt
@@ -344,6 +341,7 @@ VOID MlmeAssocReqAction(
 			FrameLen += tmp;
 		}
 
+#ifdef DOT11_N_SUPPORT
 		// HT
 		if ((pAd->MlmeAux.HtCapabilityLen > 0) && (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED))
 		{
@@ -387,6 +385,7 @@ VOID MlmeAssocReqAction(
 			}
 			FrameLen += TmpLen;
 		}
+#endif // DOT11_N_SUPPORT //
 
 		// add Ralink proprietary IE to inform AP this STA is going to use AGGREGATION or PIGGY-BACK+AGGREGATION
 		// Case I: (Aggregation + Piggy-Back)
@@ -459,16 +458,20 @@ VOID MlmeAssocReqAction(
 		// For example: Put Vendor Specific IE on the front of WPA IE.
 		// This happens on AP (Model No:Linksys WRK54G)
 		//		
-		if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) || 
+		if (((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) || 
             (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK) ||
             (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA) || 
-            (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2))
+            (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2)
+			)            
+            )          
 		{
 			UCHAR RSNIe = IE_WPA;
 			
 			if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK) ||
                 (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2))
+			{
 				RSNIe = IE_WPA2;
+			}	
 			
 #ifdef NATIVE_WPA_SUPPLICANT_SUPPORT
 #ifdef SIOCSIWGENIE
@@ -616,6 +619,7 @@ VOID MlmeAssocReqAction(
 			// End Add by James 
 		}		
 
+
 		MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);
 		MlmeFreeMemory(pAd, pOutBuffer);
 
@@ -755,6 +759,7 @@ VOID MlmeReassocReqAction(
 			FrameLen += tmp;
 		}
 
+#ifdef DOT11_N_SUPPORT
 		// HT
 		if ((pAd->MlmeAux.HtCapabilityLen > 0) && (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED))
 		{
@@ -781,6 +786,8 @@ VOID MlmeReassocReqAction(
 			}
 			FrameLen += TmpLen;
 		}
+#endif // DOT11_N_SUPPORT //
+
 		// add Ralink proprietary IE to inform AP this STA is going to use AGGREGATION or PIGGY-BACK+AGGREGATION
 		// Case I: (Aggregation + Piggy-Back)
 		// 1. user enable aggregation, AND
@@ -984,6 +991,8 @@ VOID MlmeDisassocReqAction(
 		return;
 	}
 
+
+
 	RTMPCancelTimer(&pAd->MlmeAux.DisassocTimer, &TimerCancelled);
 
 	DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - Send DISASSOC request[BSSID::%02x:%02x:%02x:%02x:%02x:%02x (Reason=%d)\n", 
@@ -1013,7 +1022,8 @@ VOID MlmeDisassocReqAction(
 
 #ifdef WPA_SUPPLICANT_SUPPORT
 #ifndef NATIVE_WPA_SUPPLICANT_SUPPORT
-    if (pAd->StaCfg.WpaSupplicantUP) {
+    if (pAd->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_DISABLE) 
+	{
         union iwreq_data    wrqu;
         //send disassociate event to wpa_supplicant
         memset(&wrqu, 0, sizeof(wrqu));
@@ -1068,7 +1078,9 @@ VOID PeerAssocRspAction(
 		if(MAC_ADDR_EQUAL(Addr2, pAd->MlmeAux.Bssid)) 
 		{
 			DBGPRINT(RT_DEBUG_TRACE, ("PeerAssocRspAction():ASSOC - receive ASSOC_RSP to me (status=%d)\n", Status));
+#ifdef DOT11_N_SUPPORT
 			DBGPRINT(RT_DEBUG_TRACE, ("PeerAssocRspAction():MacTable [%d].AMsduSize = %d. ClientStatusFlags = 0x%lx \n",Elem->Wcid, pAd->MacTab.Content[BSSID_WCID].AMsduSize, pAd->MacTab.Content[BSSID_WCID].ClientStatusFlags));
+#endif // DOT11_N_SUPPORT //
 			RTMPCancelTimer(&pAd->MlmeAux.AssocTimer, &TimerCancelled);
 			if(Status == MLME_SUCCESS) 
 			{
@@ -1078,7 +1090,7 @@ VOID PeerAssocRspAction(
 
 #ifdef WPA_SUPPLICANT_SUPPORT
 #ifndef NATIVE_WPA_SUPPLICANT_SUPPORT
-                if (pAd->StaCfg.WpaSupplicantUP)
+                if (pAd->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_DISABLE)
                 {
                     union iwreq_data    wrqu;
 
@@ -1183,7 +1195,7 @@ VOID PeerReassocRspAction(
 
 #ifdef WPA_SUPPLICANT_SUPPORT
 #ifndef NATIVE_WPA_SUPPLICANT_SUPPORT
-                if (pAd->StaCfg.WpaSupplicantUP)
+                if (pAd->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_DISABLE)
                 {
                     union iwreq_data    wrqu;
 
@@ -1284,6 +1296,7 @@ VOID AssocPostProc(
 	COPY_MAC_ADDR(pAd->MlmeAux.Bssid, pAddr2);
 	pAd->MlmeAux.Aid = Aid;
 	pAd->MlmeAux.CapabilityInfo = CapabilityInfo & SUPPORTED_CAPABILITY_INFO;
+#ifdef DOT11_N_SUPPORT
 	// Some HT AP might lost WMM IE. We add WMM ourselves. beacuase HT requires QoS on.
 	if ((HtCapabilityLen > 0) && (pEdcaParm->bValid == FALSE))
 	{
@@ -1309,6 +1322,7 @@ VOID AssocPostProc(
 		pEdcaParm->Txop[3]  = 48;
 
 	}
+#endif // DOT11_N_SUPPORT //
 
 	NdisMoveMemory(&pAd->MlmeAux.APEdcaParm, pEdcaParm, sizeof(EDCA_PARM));
 
@@ -1322,6 +1336,7 @@ VOID AssocPostProc(
 	NdisMoveMemory(pAd->MlmeAux.ExtRate, ExtRate, ExtRateLen);
 	RTMPCheckRates(pAd, pAd->MlmeAux.ExtRate, &pAd->MlmeAux.ExtRateLen);
 
+#ifdef DOT11_N_SUPPORT
 	if (HtCapabilityLen > 0)
 	{
 		RTMPCheckHt(pAd, BSSID_WCID, pHtCapability, pAddHtInfo);
@@ -1330,6 +1345,8 @@ VOID AssocPostProc(
 		
 	DBGPRINT(RT_DEBUG_TRACE, ("AssocPostProc===>    (Mmps=%d, AmsduSize=%d, )\n", 
 		pAd->MacTab.Content[BSSID_WCID].MmpsMode, pAd->MacTab.Content[BSSID_WCID].AMsduSize));
+#endif // DOT11_N_SUPPORT //
+
 	// Set New WPA information
 	Idx = BssTableSearch(&pAd->ScanTab, pAddr2, pAd->MlmeAux.Channel);
 	if (Idx == BSS_NOT_FOUND) 
@@ -1418,6 +1435,7 @@ VOID PeerDisassocAction(
 				RTMPSendWirelessEvent(pAd, IW_DISASSOC_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0); 
 			}
 
+
 #ifdef LEAP_SUPPORT
 			if (pAd->StaCfg.LeapAuthMode == CISCO_AuthModeLEAP)
 			{
@@ -1442,7 +1460,8 @@ VOID PeerDisassocAction(
 
 #ifdef WPA_SUPPLICANT_SUPPORT
 #ifndef NATIVE_WPA_SUPPLICANT_SUPPORT
-            if (pAd->StaCfg.WpaSupplicantUP) {
+            if (pAd->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_DISABLE) 
+			{
                 union iwreq_data    wrqu;
                 //send disassociate event to wpa_supplicant
                 memset(&wrqu, 0, sizeof(wrqu));
diff --git a/rt2860-1.7.0.0/sta/auth.c b/rt2860-source-1.8.0.0/sta/auth.c
similarity index 100%
copy from rt2860-1.7.0.0/sta/auth.c
copy to rt2860-source-1.8.0.0/sta/auth.c
diff --git a/rt2860-1.7.0.0/sta/auth_rsp.c b/rt2860-source-1.8.0.0/sta/auth_rsp.c
similarity index 99%
copy from rt2860-1.7.0.0/sta/auth_rsp.c
copy to rt2860-source-1.8.0.0/sta/auth_rsp.c
index 4f3d91e..c54bfca 100644
--- a/rt2860-1.7.0.0/sta/auth_rsp.c
+++ b/rt2860-source-1.8.0.0/sta/auth_rsp.c
@@ -127,6 +127,7 @@ VOID PeerDeauthAction(
         {
             DBGPRINT(RT_DEBUG_TRACE,("AUTH_RSP - receive DE-AUTH from our AP (Reason=%d)\n", Reason));
 
+
 #ifdef NATIVE_WPA_SUPPLICANT_SUPPORT
             {
                 union iwreq_data    wrqu;
diff --git a/rt2860-1.7.0.0/sta/connect.c b/rt2860-source-1.8.0.0/sta/connect.c
similarity index 91%
copy from rt2860-1.7.0.0/sta/connect.c
copy to rt2860-source-1.8.0.0/sta/connect.c
index bb24bc5..4c92571 100644
--- a/rt2860-1.7.0.0/sta/connect.c
+++ b/rt2860-source-1.8.0.0/sta/connect.c
@@ -87,8 +87,6 @@ UCHAR	CipherSuiteWpaNoneAesLen = (sizeof(CipherSuiteWpaNoneAes) / sizeof(UCHAR))
 	(_pAd)->MacTab.Content[BSSID_WCID].PairwiseKey.CipherAlg = (_pAd)->StaCfg.PairCipher;\
 	COPY_MAC_ADDR((_pAd)->MacTab.Content[BSSID_WCID].PairwiseKey.BssId, (_pAd)->MlmeAux.Bssid);\
 	(_pAd)->MacTab.Content[BSSID_WCID].RateLen = (_pAd)->StaActive.SupRateLen + (_pAd)->StaActive.ExtRateLen;\
-	NdisMoveMemory(&(_pAd)->CommonCfg.HtCapability, &(_pAd)->MlmeAux.HtCapability, sizeof(HT_CAPABILITY_IE));\
-	NdisMoveMemory(&(_pAd)->CommonCfg.AddHTInfo, &(_pAd)->MlmeAux.AddHtInfo, sizeof(ADD_HT_INFO_IE));\
 }
 
 /*
@@ -125,7 +123,9 @@ VOID MlmeCntlMachinePerformAction(
 	switch(pAd->Mlme.CntlMachine.CurrState) 
 	{
 		case CNTL_IDLE:
-			CntlIdleProc(pAd, Elem);
+			{
+				CntlIdleProc(pAd, Elem);
+			}
 			break;
 		case CNTL_WAIT_DISASSOC:
 			CntlWaitDisassocProc(pAd, Elem);
@@ -245,7 +245,7 @@ VOID CntlIdleProc(
 			MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_DISASSOC_REQ, sizeof(MLME_DISASSOC_REQ_STRUCT), &DisassocReq);
 			pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_DISASSOC;
 #ifdef WPA_SUPPLICANT_SUPPORT
-            if (pAd->StaCfg.WpaSupplicantUP != 2)
+            if (pAd->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_ENABLE_WITH_WEB_UI)
 #endif // WPA_SUPPLICANT_SUPPORT //
             {
     			// Set the AutoReconnectSsid to prevent it reconnect to old SSID
@@ -289,8 +289,7 @@ VOID CntlOidScanProc(
 		return;
 #endif // RALINK_ATE //
 
-	DBGPRINT(RT_DEBUG_INFO, ("CNTL - SCAN starts\n"));
-
+	
 	// record current BSS if network is connected. 
 	// 2003-2-13 do not include current IBSS if this is the only STA in this IBSS.
 	if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))
@@ -345,6 +344,7 @@ VOID CntlOidSsidProc(
 	NdisZeroMemory(pAd->MlmeAux.Bssid, MAC_ADDR_LEN);
 	pAd->MlmeAux.BssType = pAd->StaCfg.BssType;
 
+
 	//
 	// Update Reconnect Ssid, that user desired to connect.
 	//
@@ -471,7 +471,8 @@ VOID CntlOidSsidProc(
 		if ((pAd->MlmeAux.SsidBssTab.BssNr == 0) && 
 			(pAd->StaCfg.bAutoReconnect == TRUE) && 
 			(pAd->MlmeAux.BssType == BSS_INFRA) &&
-			(MlmeValidateSSID(pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen) == TRUE))
+			(MlmeValidateSSID(pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen) == TRUE)
+			)
 		{
 			MLME_SCAN_REQ_STRUCT       ScanReq;
 
@@ -490,6 +491,7 @@ VOID CntlOidSsidProc(
 	} 
 }
 
+
 /*
 	==========================================================================
 	Description:
@@ -621,6 +623,7 @@ VOID CntlOidRTBssidProc(
 				// RSN capability
 				pAd->StaCfg.RsnCapability = pAd->ScanTab.BssEntry[BssIdx].WPA2.RsnCapability;
 			}
+			
 			// Set Mix cipher flag
 			pAd->StaCfg.bMixCipher = (pAd->StaCfg.PairCipher == pAd->StaCfg.GroupCipher) ? FALSE : TRUE;
 			if (pAd->StaCfg.bMixCipher == TRUE)
@@ -930,7 +933,34 @@ VOID CntlWaitStartProc(
 				DBGPRINT(RT_DEBUG_TRACE, ("CNTL - Channel=%d, Start adhoc on W53(52,56,60,64) Channels are not accepted\n", pAd->CommonCfg.Channel));
 				return;
 			}
-            
+#ifdef DOT11_N_SUPPORT
+			if (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)
+			{
+				N_ChannelCheck(pAd);
+				SetCommonHT(pAd);
+				NdisMoveMemory(&pAd->MlmeAux.AddHtInfo, &pAd->CommonCfg.AddHTInfo, sizeof(ADD_HT_INFO_IE));
+				RTMPCheckHt(pAd, BSSID_WCID, &pAd->CommonCfg.HtCapability, &pAd->CommonCfg.AddHTInfo);
+				pAd->StaActive.SupportedPhyInfo.bHtEnable = TRUE;
+				NdisZeroMemory(&pAd->StaActive.SupportedPhyInfo.MCSSet[0], 16);
+				NdisMoveMemory(&pAd->StaActive.SupportedPhyInfo.MCSSet[0], &pAd->CommonCfg.HtCapability.MCSSet[0], 16);
+				COPY_HTSETTINGS_FROM_MLME_AUX_TO_ACTIVE_CFG(pAd);
+				
+				if ((pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth  == BW_40) && 
+					(pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset == EXTCHA_ABOVE))
+				{
+					pAd->MlmeAux.CentralChannel = pAd->CommonCfg.Channel + 2;
+				}
+				else if ((pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth  == BW_40) && 
+						 (pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset == EXTCHA_BELOW))
+				{
+					pAd->MlmeAux.CentralChannel = pAd->CommonCfg.Channel - 2;
+				}
+			}
+			else
+#endif // DOT11_N_SUPPORT //
+			{
+				pAd->StaActive.SupportedPhyInfo.bHtEnable = FALSE;
+			}
 			LinkUp(pAd, BSS_ADHOC);
 			pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE;
 			// Before send beacon, driver need do radar detection
@@ -1211,6 +1241,7 @@ VOID LinkUp(
 	MAC_TABLE_ENTRY *pEntry = NULL, *pCurrEntry;
 	
 	pEntry = &pAd->MacTab.Content[BSSID_WCID];
+
 	//
 	// ASSOC - DisassocTimeoutAction
 	// CNTL - Dis-associate successful
@@ -1221,8 +1252,12 @@ VOID LinkUp(
 	// cancel the DisassocTimer no matter what it start or not.
 	//
 	RTMPCancelTimer(&pAd->MlmeAux.DisassocTimer,  &Cancelled);	
+
 	COPY_SETTINGS_FROM_MLME_AUX_TO_ACTIVE_CFG(pAd);
+
+#ifdef DOT11_N_SUPPORT
 	COPY_HTSETTINGS_FROM_MLME_AUX_TO_ACTIVE_CFG(pAd);
+#endif // DOT11_N_SUPPORT //
 	// It's quite difficult to tell if a newly added KEY is WEP or CKIP until a new BSS
 	// is formed (either ASSOC/RE-ASSOC done or IBSS started. LinkUP should be a safe place
 	// to examine if cipher algorithm switching is required.
@@ -1254,166 +1289,146 @@ VOID LinkUp(
 		OPSTATUS_SET_FLAG(pAd, fOP_STATUS_ADHOC_ON);
 		OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_INFRA_ON);
 		
-		pAd->CommonCfg.BBPCurrentBW = BW_20;
-		AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);
-		AsicLockChannel(pAd, pAd->CommonCfg.Channel);
+#ifdef CARRIER_DETECTION_SUPPORT // Roger sync Carrier
+		// No carrier detection when adhoc
+		// CarrierDetectionStop(pAd);
+		pAd->CommonCfg.CarrierDetect.CD_State = CD_NORMAL;
+#endif // CARRIER_DETECTION_SUPPORT //
 
+		DBGPRINT(RT_DEBUG_TRACE, ("!!!Adhoc LINK UP !!! \n" ));
+	}
+	else
+	{
+		OPSTATUS_SET_FLAG(pAd, fOP_STATUS_INFRA_ON);
+		OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_ADHOC_ON);
+	
+		DBGPRINT(RT_DEBUG_TRACE, ("!!!Infra LINK UP !!! \n" ));
+	}
+	
+	// 3*3
+	// reset Tx beamforming bit
+	RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &Value);
+	Value &= (~0x01);
+	Value |= pAd->CommonCfg.RegTransmitSetting.field.TxBF;
+	RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, Value);
+
+#ifdef DOT11_N_SUPPORT
+	// Change to AP channel
+    if ((pAd->CommonCfg.CentralChannel > pAd->CommonCfg.Channel) && (pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth == BW_40))
+	{	
+		// Must using 40MHz.
+		pAd->CommonCfg.BBPCurrentBW = BW_40;
+		AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE);
+		AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel);
+			
 		RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &Value);
 		Value &= (~0x18);
+		Value |= 0x10;
 		RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, Value);
+		
+		//  RX : control channel at lower 
+		RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &Value);
+		Value &= (~0x20);
+		RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, Value);
+#ifdef RT2860
+        pAd->StaCfg.BBPR3 = Value;
+#endif // RT2860 //
 
 		RTMP_IO_READ32(pAd, TX_BAND_CFG, &Data);
 		Data &= 0xfffffffe;
 		RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Data);
+		
+		if (pAd->MACVersion == 0x28600100)
+		{
+			RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x1A);
+			RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x0A);
+			RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x16);
+            DBGPRINT(RT_DEBUG_TRACE, ("!!!rt2860C !!! \n" ));
+		}	
 
+		DBGPRINT(RT_DEBUG_TRACE, ("!!!40MHz Lower LINK UP !!! Control Channel at Below. Central = %d \n", pAd->CommonCfg.CentralChannel ));
+	}
+	else if ((pAd->CommonCfg.CentralChannel < pAd->CommonCfg.Channel) && (pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth == BW_40))
+    {	
+	    // Must using 40MHz.
+		pAd->CommonCfg.BBPCurrentBW = BW_40;
+		AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE);
+	    AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel);
+		
+		RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &Value);
+		Value &= (~0x18);
+		Value |= 0x10;
+		RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, Value);
+		
+		RTMP_IO_READ32(pAd, TX_BAND_CFG, &Data);
+		Data |= 0x1;
+		RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Data);
+		
 		RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &Value);
-		Value &= (~0x20);
+	    Value |= (0x20);
 		RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, Value);
 #ifdef RT2860
         pAd->StaCfg.BBPR3 = Value;
 #endif // RT2860 //
+	
 		if (pAd->MACVersion == 0x28600100)
 		{
-			RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x16);
-			RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x08);
-			RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x11);
+			RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x1A);
+			RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x0A);
+			RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x16);
+			    DBGPRINT(RT_DEBUG_TRACE, ("!!!rt2860C !!! \n" ));
 		}
 
-#ifdef CARRIER_DETECTION_SUPPORT // Roger sync Carrier
-		// No carrier detection when adhoc
-		CarrierDetectionStop(pAd);
-		pAd->CommonCfg.CarrierDetect.CD_State = CD_NORMAL;
-#endif // CARRIER_DETECTION_SUPPORT //
-
-		DBGPRINT(RT_DEBUG_TRACE, ("!!!20MHz Adhoc LINK UP !!! \n" ));
-	}
-	else
-	{
-		OPSTATUS_SET_FLAG(pAd, fOP_STATUS_INFRA_ON);
-		OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_ADHOC_ON);
-	
-		// 3*3
-		// reset Tx beamforming bit
+	    DBGPRINT(RT_DEBUG_TRACE, ("!!! 40MHz Upper LINK UP !!! Control Channel at UpperCentral = %d \n", pAd->CommonCfg.CentralChannel ));
+    }
+    else
+#endif // DOT11_N_SUPPORT //
+    {
+	    pAd->CommonCfg.BBPCurrentBW = BW_20;
+		pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel;
+		AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);
+		AsicLockChannel(pAd, pAd->CommonCfg.Channel);
+		
 		RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &Value);
-		Value &= (~0x01);
-		Value |= pAd->CommonCfg.RegTransmitSetting.field.TxBF;
+		Value &= (~0x18);
 		RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, Value);
-
-    	// Change to AP channel
-        if ((pAd->CommonCfg.CentralChannel > pAd->CommonCfg.Channel) && (pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth == BW_40))
-    	{	
-    		// Must using 40MHz.
-    		pAd->CommonCfg.BBPCurrentBW = BW_40;
-    		AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE);
-    		AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel);
-    			
-    		RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &Value);
-    		Value &= (~0x18);
-    		Value |= 0x10;
-    		RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, Value);
-    		
-    		//  RX : control channel at lower 
-    		RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &Value);
-    		Value &= (~0x20);
-    		RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, Value);
-#ifdef RT2860
-            pAd->StaCfg.BBPR3 = Value;
-#endif // RT2860 //
-
-    		RTMP_IO_READ32(pAd, TX_BAND_CFG, &Data);
-    		Data &= 0xfffffffe;
-    		RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Data);
-    		
-    		if (pAd->MACVersion == 0x28600100)
-    		{
-    			RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x1A);
-    			RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x0A);
-    			RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x16);
-                DBGPRINT(RT_DEBUG_TRACE, ("!!!rt2860C !!! \n" ));
-    		}	
-
-    		DBGPRINT(RT_DEBUG_TRACE, ("!!!40MHz Lower LINK UP !!! Control Channel at Below. Central = %d \n", pAd->CommonCfg.CentralChannel ));
-    	}
-		else if ((pAd->CommonCfg.CentralChannel < pAd->CommonCfg.Channel) && (pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth == BW_40))
-	    {	
-		    // Must using 40MHz.
-			pAd->CommonCfg.BBPCurrentBW = BW_40;
-			AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE);
-		    AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel);
-			
-			RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &Value);
-    		Value &= (~0x18);
-    		Value |= 0x10;
-			RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, Value);
-			
-    		RTMP_IO_READ32(pAd, TX_BAND_CFG, &Data);
-    		Data |= 0x1;
-    		RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Data);
-			
-			RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &Value);
-		    Value |= (0x20);
-			RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, Value);
-#ifdef RT2860
-            pAd->StaCfg.BBPR3 = Value;
-#endif // RT2860 //
 		
-    		if (pAd->MACVersion == 0x28600100)
-    		{
-    			RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x1A);
-    			RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x0A);
-    			RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x16);
-    			    DBGPRINT(RT_DEBUG_TRACE, ("!!!rt2860C !!! \n" ));
-    		}
-
-		    DBGPRINT(RT_DEBUG_TRACE, ("!!! 40MHz Upper LINK UP !!! Control Channel at UpperCentral = %d \n", pAd->CommonCfg.CentralChannel ));
-	    }
-	    else
-	    {
-		    pAd->CommonCfg.BBPCurrentBW = BW_20;
-			pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel;
-			AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE);
-			AsicLockChannel(pAd, pAd->CommonCfg.Channel);
-			
-			RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &Value);
-			Value &= (~0x18);
-			RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, Value);
-			
-			RTMP_IO_READ32(pAd, TX_BAND_CFG, &Data);
-			Data &= 0xfffffffe;
-			RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Data);
-			
-			RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &Value);
-			Value &= (~0x20);
-			RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, Value);
+		RTMP_IO_READ32(pAd, TX_BAND_CFG, &Data);
+		Data &= 0xfffffffe;
+		RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Data);
+		
+		RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &Value);
+		Value &= (~0x20);
+		RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, Value);
 #ifdef RT2860
-            pAd->StaCfg.BBPR3 = Value;
+        pAd->StaCfg.BBPR3 = Value;
 #endif // RT2860 //
-			
-			if (pAd->MACVersion == 0x28600100)
-			{
-				RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x16);
-				RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x08);
-				RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x11);
-                DBGPRINT(RT_DEBUG_TRACE, ("!!!rt2860C !!! \n" ));
-			}		
-			
-		    DBGPRINT(RT_DEBUG_TRACE, ("!!! 20MHz LINK UP !!! \n" ));
-	    }
-	}
+		
+		if (pAd->MACVersion == 0x28600100)
+		{
+			RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x16);
+			RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x08);
+			RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x11);
+            DBGPRINT(RT_DEBUG_TRACE, ("!!!rt2860C !!! \n" ));
+		}
+		
+	    DBGPRINT(RT_DEBUG_TRACE, ("!!! 20MHz LINK UP !!! \n" ));
+    }
 
-	//RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, (0x2E + GET_LNA_GAIN(pAd)));
 	RTMPSetAGCInitValue(pAd, pAd->CommonCfg.BBPCurrentBW);
 	//
 	// Save BBP_R66 value, it will be used in RTUSBResumeMsduTransmission
 	//
 	RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R66, &pAd->BbpTuning.R66CurrentValue);
 
-	DBGPRINT(RT_DEBUG_TRACE, ("!!! LINK UP !!! (Infra=%d, AID=%d, ssid=%s, Channel=%d, CentralChannel = %d)\n", 
+	DBGPRINT(RT_DEBUG_TRACE, ("!!! LINK UP !!! (BssType=%d, AID=%d, ssid=%s, Channel=%d, CentralChannel = %d)\n", 
 		BssType, pAd->StaActive.Aid, pAd->CommonCfg.Ssid, pAd->CommonCfg.Channel, pAd->CommonCfg.CentralChannel));
 
+#ifdef DOT11_N_SUPPORT
 	DBGPRINT(RT_DEBUG_TRACE, ("!!! LINK UP !!! (Density =%d, )\n", pAd->MacTab.Content[BSSID_WCID].MpduDensity));
+#endif // DOT11_N_SUPPORT //
 
-	AsicSetBssid(pAd, pAd->CommonCfg.Bssid);
+		AsicSetBssid(pAd, pAd->CommonCfg.Bssid);
 		
 	AsicSetSlotTime(pAd, TRUE);
 	AsicSetEdcaParm(pAd, &pAd->CommonCfg.APEdcaParm);
@@ -1421,6 +1436,7 @@ VOID LinkUp(
 	// Call this for RTS protectionfor legacy rate, we will always enable RTS threshold, but normally it will not hit
 	AsicUpdateProtect(pAd, 0, (OFDMSETPROTECT | CCKSETPROTECT), TRUE, FALSE);
 
+#ifdef DOT11_N_SUPPORT
 	if ((pAd->StaActive.SupportedPhyInfo.bHtEnable == TRUE))
 	{
 		// Update HT protectionfor based on AP's operating mode.
@@ -1431,6 +1447,7 @@ VOID LinkUp(
     	else
    			AsicUpdateProtect(pAd, pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode,  ALLN_SETPROTECT, FALSE, FALSE);
 	}
+#endif // DOT11_N_SUPPORT //
 
 	NdisZeroMemory(&pAd->DrsCounters, sizeof(COUNTER_DRS));
 
@@ -1440,7 +1457,6 @@ VOID LinkUp(
 	if ((pAd->CommonCfg.TxPreamble != Rt802_11PreambleLong) &&
 		CAP_IS_SHORT_PREAMBLE_ON(pAd->StaActive.CapabilityInfo))
 	{
-		DBGPRINT(RT_DEBUG_INFO, ("CNTL - !!! Set to short preamble!!!\n"));
 		MlmeSetTxPreamble(pAd, Rt802_11PreambleShort);
 	}
 
@@ -1468,15 +1484,6 @@ VOID LinkUp(
 			AsicEnableIbssSync(pAd);
 		}
 		
-#ifdef	SINGLE_ADHOC_LINKUP
-		// Although this did not follow microsoft's recommendation.
-		//Change based on customer's request
-		OPSTATUS_SET_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED); 
-
-		pAd->IndicateMediaState = NdisMediaStateConnected;
-		RTMP_IndicateMediaState(pAd);
-        pAd->ExtraInfo = GENERAL_LINK_UP;
-#endif
 		// In ad hoc mode, use MAC table from index 1. 
 		// p.s ASIC use all 0xff as termination of WCID table search.To prevent it's 0xff-ff-ff-ff-ff-ff, Write 0 here.
 		RTMP_IO_WRITE32(pAd, MAC_WCID_BASE, 0x00);
@@ -1584,6 +1591,7 @@ VOID LinkUp(
 			// Remove all WPA keys 
 			RTMPWPARemoveAllKeys(pAd);
 			pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;			
+			pAd->StaCfg.PrivacyFilter = Ndis802_11PrivFilter8021xWEP;
 			
 			// Fixed connection failed with Range Maximizer - 515 AP (Marvell Chip) when security is WPAPSK/TKIP
 			// If IV related values are too large in GroupMsg2, AP would ignore this message.
@@ -1602,7 +1610,7 @@ VOID LinkUp(
 		ComposePsPoll(pAd);
 		ComposeNullFrame(pAd);
 
-		AsicEnableBssSync(pAd);
+			AsicEnableBssSync(pAd);
 
 		// Add BSSID to WCID search table
 		AsicUpdateRxWCIDTable(pAd, BSSID_WCID, pAd->CommonCfg.Bssid);		
@@ -1634,7 +1642,7 @@ VOID LinkUp(
         if (((pAd->StaCfg.WpaSupplicantUP)&&
              (pAd->StaCfg.WepStatus == Ndis802_11WEPEnabled)&&
              (pAd->StaCfg.PortSecured == WPA_802_1X_PORT_SECURED)) ||
-            ((pAd->StaCfg.WpaSupplicantUP == 0)&&
+            ((pAd->StaCfg.WpaSupplicantUP == WPA_SUPPLICANT_DISABLE)&&
               (pAd->StaCfg.WepStatus == Ndis802_11WEPEnabled)))
 #else
 		if (pAd->StaCfg.WepStatus == Ndis802_11WEPEnabled)
@@ -1690,13 +1698,15 @@ VOID LinkUp(
 		pAd->MacTab.Content[BSSID_WCID].WepStatus = pAd->StaCfg.WepStatus;
         NdisReleaseSpinLock(&pAd->MacTabLock);
 
-		DBGPRINT(RT_DEBUG_TRACE, ("!!! LINK UP !!!  ClientStatusFlags=%lx, Mmps=%d, AmsduSize=%d, )\n", 
-			pAd->MacTab.Content[BSSID_WCID].ClientStatusFlags, 
-			pAd->MacTab.Content[BSSID_WCID].MmpsMode, pAd->MacTab.Content[BSSID_WCID].AMsduSize));
-		DBGPRINT(RT_DEBUG_TRACE, ("!!! LINK UP !! (StaActive.bHtEnable =%d, )\n", pAd->StaActive.SupportedPhyInfo.bHtEnable));
+		DBGPRINT(RT_DEBUG_TRACE, ("!!! LINK UP !!!  ClientStatusFlags=%lx)\n", 
+			pAd->MacTab.Content[BSSID_WCID].ClientStatusFlags));
 
 		MlmeUpdateTxRates(pAd, TRUE, BSS0);
+#ifdef DOT11_N_SUPPORT
 		MlmeUpdateHtTxRates(pAd, BSS0);
+		DBGPRINT(RT_DEBUG_TRACE, ("!!! LINK UP !! (StaActive.bHtEnable =%d, )\n", pAd->StaActive.SupportedPhyInfo.bHtEnable));
+#endif // DOT11_N_SUPPORT //
+
 		//
 		// Report Adjacent AP report.
 		//
@@ -1722,10 +1732,12 @@ VOID LinkUp(
 		
 		if (pAd->MlmeAux.APRalinkIe != 0x0)
 		{
+#ifdef DOT11_N_SUPPORT		
 			if (CLIENT_STATUS_TEST_FLAG(&pAd->MacTab.Content[BSSID_WCID], fCLIENT_STATUS_RDG_CAPABLE))
 			{
 				AsicEnableRDG(pAd);
 			}
+#endif // DOT11_N_SUPPORT //
 			OPSTATUS_SET_FLAG(pAd, fCLIENT_STATUS_RALINK_CHIPSET);
 			CLIENT_STATUS_SET_FLAG(&pAd->MacTab.Content[BSSID_WCID], fCLIENT_STATUS_RALINK_CHIPSET);
 		}
@@ -1736,8 +1748,9 @@ VOID LinkUp(
 		}
 	}
 
+#ifdef DOT11_N_SUPPORT
 	DBGPRINT(RT_DEBUG_TRACE, ("NDIS_STATUS_MEDIA_CONNECT Event B!.BACapability = %x. ClientStatusFlags = %lx\n", pAd->CommonCfg.BACapability.word, pAd->MacTab.Content[BSSID_WCID].ClientStatusFlags));
-	DBGPRINT(RT_DEBUG_INFO, ("CCX: CWMax CWMin %d %d\n", pAd->StaCfg.CCXQosECWMax, pAd->StaCfg.CCXQosECWMin));
+#endif // DOT11_N_SUPPORT //
 
 	// Set LED
 	RTMPSetLED(pAd, LED_LINK_UP);
@@ -1762,14 +1775,15 @@ VOID LinkUp(
 	if (pAd->StaCfg.bAutoTxRateSwitch == FALSE)
 	{
 		pEntry->bAutoTxRateSwitch = FALSE;
+#ifdef DOT11_N_SUPPORT
 		if (pEntry->HTPhyMode.field.MCS == 32)
 			pEntry->HTPhyMode.field.ShortGI = GI_800;
 
 		if ((pEntry->HTPhyMode.field.MCS > MCS_7) || (pEntry->HTPhyMode.field.MCS == 32))
 			pEntry->HTPhyMode.field.STBC = STBC_NONE;
-
+#endif // DOT11_N_SUPPORT //
 		// If the legacy mode is set, overwrite the transmit setting of this entry.  
-		if (pEntry->HTPhyMode.field.MODE < MODE_HTMIX)
+		if (pEntry->HTPhyMode.field.MODE <= MODE_OFDM)
 			RTMPUpdateLegacyTxSetting((UCHAR)pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode, pEntry);
 	}
 	else
@@ -1796,6 +1810,7 @@ VOID LinkUp(
 		RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, Value);
 	}
 
+#ifdef DOT11_N_SUPPORT
 	if (pAd->StaActive.SupportedPhyInfo.bHtEnable == FALSE) 
 	{
 	}
@@ -1805,6 +1820,7 @@ VOID LinkUp(
 	    // Because our Init value is 1 at MACRegTable.
 		RTMP_IO_WRITE32(pAd, MAX_LEN_CFG, 0x0fff);
 	}
+#endif // DOT11_N_SUPPORT //
 
 	// Patch for Marvel AP to gain high throughput
 	// Need to set as following,
@@ -1816,6 +1832,7 @@ VOID LinkUp(
 	// Txop can only be modified when RDG is off, WMM is disable and TxBurst is enable
 	//
 	// if 1. Legacy AP WMM on,  or 2. 11n AP, AMPDU disable.  Force turn off burst no matter what bEnableTxBurst is.
+#ifdef DOT11_N_SUPPORT
 	if (((pAd->StaActive.SupportedPhyInfo.bHtEnable == FALSE) && (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED))) 
 		|| ((pAd->StaActive.SupportedPhyInfo.bHtEnable == TRUE) && (pAd->CommonCfg.BACapability.field.Policy == BA_NOTUSE)))
 	{
@@ -1826,7 +1843,9 @@ VOID LinkUp(
 		RTMP_IO_WRITE32(pAd, PBF_MAX_PCNT, 0x1F3F7F9F);
 		DBGPRINT(RT_DEBUG_TRACE, ("Txburst 1\n"));
 	}
-	else if (pAd->CommonCfg.bEnableTxBurst)
+	else
+#endif // DOT11_N_SUPPORT //
+	if (pAd->CommonCfg.bEnableTxBurst)
 	{
 		RTMP_IO_READ32(pAd, EDCA_AC0_CFG, &Data);
 		Data  &= 0xFFFFFF00;
@@ -1847,6 +1866,7 @@ VOID LinkUp(
 		DBGPRINT(RT_DEBUG_TRACE, ("Txburst 3\n"));
 	}
 	
+#ifdef DOT11_N_SUPPORT	
 	// Re-check to turn on TX burst or not.
 	if ((pAd->CommonCfg.IOTestParm.bLastAtheros == TRUE) && ((STA_WEP_ON(pAd))||(STA_TKIP_ON(pAd))))
 	{
@@ -1866,6 +1886,7 @@ VOID LinkUp(
 	{
 		pAd->CommonCfg.IOTestParm.bNextDisableRxBA = FALSE;
 	}
+#endif // DOT11_N_SUPPORT //
 
 	pAd->CommonCfg.IOTestParm.bLastAtheros = FALSE;
 	COPY_MAC_ADDR(pAd->CommonCfg.LastBssid, pAd->CommonCfg.Bssid);
@@ -1875,7 +1896,10 @@ VOID LinkUp(
 	// Note: As STA, The MACTab.Content[BSSID_WCID]. PairwiseKey and Shared Key for BSS0 are the same.
 
     if (pAd->StaCfg.WepStatus <= Ndis802_11WEPDisabled)
+    {
         pAd->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED;
+		pAd->StaCfg.PrivacyFilter = Ndis802_11PrivFilterAcceptAll;
+	}
 
 	NdisAcquireSpinLock(&pAd->MacTabLock);
 	pEntry->PortSecured = pAd->StaCfg.PortSecured;
@@ -1896,6 +1920,7 @@ VOID LinkUp(
 
 	RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS);
 
+#ifdef DOT11_N_SUPPORT
 #ifdef DOT11N_DRAFT3
 	if ((pAd->CommonCfg.BACapability.field.b2040CoexistScanSup) && (pAd->CommonCfg.Channel <= 11))
 	{
@@ -1903,6 +1928,7 @@ VOID LinkUp(
 		BuildEffectedChannelList(pAd);
 	}
 #endif // DOT11N_DRAFT3 //
+#endif // DOT11_N_SUPPORT //
 }
 
 /*
@@ -1978,21 +2004,11 @@ VOID LinkDown(
 		DBGPRINT(RT_DEBUG_TRACE, ("!!! LINK DOWN 1!!!\n"));
 
 		OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_ADHOC_ON);
-
-        pAd->IndicateMediaState = NdisMediaStateDisconnected;
-#ifdef	SINGLE_ADHOC_LINKUP
-		OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED);
-        pAd->ExtraInfo = GENERAL_LINK_DOWN;
-		// clean up previous SCAN result, add current BSS back to table if any
-		BssTableDeleteEntry(&pAd->ScanTab, pAd->CommonCfg.Bssid, pAd->CommonCfg.Channel);
-#else
-
 		OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED);
 		pAd->IndicateMediaState = NdisMediaStateDisconnected;
 		RTMP_IndicateMediaState(pAd);
         pAd->ExtraInfo = GENERAL_LINK_DOWN;
 		BssTableDeleteEntry(&pAd->ScanTab, pAd->CommonCfg.Bssid, pAd->CommonCfg.Channel);
-#endif
 		DBGPRINT(RT_DEBUG_TRACE, ("!!! MacTab.Size=%d !!!\n", pAd->MacTab.Size));
 	}
 	else					// Infra structure mode
@@ -2026,10 +2042,6 @@ VOID LinkDown(
 		}
 #endif // QOS_DLS_SUPPORT //
 
-		// Delete every  BA session with BSSID before tear down INFRA.
-		// free resources of BA
-		//BASessionTearDownALL(pAd, BSSID_WCID); ==> done in MacTableDeleteEntry
-
 		OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_INFRA_ON); 
 		OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED); 
 
@@ -2074,8 +2086,6 @@ VOID LinkDown(
 			COPY_MAC_ADDR(pAd->StaCfg.CCXAdjacentAPBssid, pAd->CommonCfg.Bssid);			
 		}
 		
-		DBGPRINT(RT_DEBUG_TRACE, ("numAsOriginator = %ld, numAsRecipient = %ld, \n", pAd->BATable.numAsOriginator, pAd->BATable.numAsRecipient));
-
 #ifdef EXT_BUILD_CHANNEL_LIST
 		// Country IE of the AP will be evaluated and will be used.
 		if (pAd->StaCfg.IEEE80211dClientMode != Rt802_11_D_None)
@@ -2105,19 +2115,24 @@ VOID LinkDown(
     pAd->LedIndicatorStregth = 0xF0;
     RTMPSetSignalLED(pAd, -100);	// Force signal strength Led to be turned off, firmware is not done it.
 
-	AsicDisableSync(pAd);
+		AsicDisableSync(pAd);
 
 	pAd->Mlme.PeriodicRound = 0;
 	pAd->Mlme.OneSecPeriodicRound = 0;
 
-	// Remove StaCfg Information after link down
-	NdisZeroMemory(pAd->CommonCfg.Bssid, MAC_ADDR_LEN);
-	NdisZeroMemory(pAd->CommonCfg.Ssid, MAX_LEN_OF_SSID);
+	if (pAd->StaCfg.BssType == BSS_INFRA)
+	{
+		// Remove StaCfg Information after link down
+		NdisZeroMemory(pAd->CommonCfg.Bssid, MAC_ADDR_LEN);
+		NdisZeroMemory(pAd->CommonCfg.Ssid, MAX_LEN_OF_SSID);
+		pAd->CommonCfg.SsidLen = 0;
+	}
+#ifdef DOT11_N_SUPPORT
 	NdisZeroMemory(&pAd->MlmeAux.HtCapability, sizeof(HT_CAPABILITY_IE));
 	NdisZeroMemory(&pAd->MlmeAux.AddHtInfo, sizeof(ADD_HT_INFO_IE));
 	pAd->MlmeAux.HtCapabilityLen = 0;
 	pAd->MlmeAux.NewExtChannelOffset = 0xff;
-	pAd->CommonCfg.SsidLen = 0;
+#endif // DOT11_N_SUPPORT //
 	
 	// Reset WPA-PSK state. Only reset when supplicant enabled
 	if (pAd->StaCfg.WpaState != SS_NOTUSE)
@@ -2132,6 +2147,7 @@ VOID LinkDown(
 #endif // QOS_DLS_SUPPORT //
 	}
 	
+	
 	//
 	// if link down come from AP, we need to remove all WPA keys on WPA mode.
 	// otherwise will cause 4-way handshaking failed, since the WPA key not empty.
@@ -2154,7 +2170,10 @@ VOID LinkDown(
 	}
 	else
 #endif // WPA_SUPPLICANT_SUPPORT //
-	pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;
+	{
+		pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED;
+		pAd->StaCfg.PrivacyFilter = Ndis802_11PrivFilter8021xWEP;
+	}
 
 	NdisAcquireSpinLock(&pAd->MacTabLock);
 	pAd->MacTab.Content[BSSID_WCID].PortSecured = pAd->StaCfg.PortSecured;
@@ -2171,6 +2190,8 @@ VOID LinkDown(
 	pAd->ExtraInfo = GENERAL_LINK_DOWN;
 
     pAd->StaCfg.AdhocBOnlyJoined = FALSE;
+	pAd->StaCfg.AdhocBGJoined = FALSE;
+	pAd->StaCfg.Adhoc20NJoined = FALSE;
     pAd->StaActive.SupportedPhyInfo.bHtEnable = FALSE;
 
 	// Reset the Current AP's IP address
@@ -2196,6 +2217,7 @@ VOID LinkDown(
 	pAd->CommonCfg.MlmeRate = pAd->CommonCfg.BasicMlmeRate;
 	pAd->CommonCfg.RtsRate = pAd->CommonCfg.BasicMlmeRate;
 
+#ifdef DOT11_N_SUPPORT
 	//
 	// After Link down, reset piggy-back setting in ASIC. Disable RDG.
 	//
@@ -2206,7 +2228,7 @@ VOID LinkDown(
 		ByteValue &= (~0x18);
 		RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, ByteValue);
 	}
-
+#endif // DOT11_N_SUPPORT //
 	// Reset DAC
 	RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &ByteValue);
 	ByteValue &= (~0x18);
@@ -2219,7 +2241,9 @@ VOID LinkDown(
 	RTMPSetPiggyBack(pAd,FALSE);
 	OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_PIGGYBACK_INUSED);
 
+#ifdef DOT11_N_SUPPORT
 	pAd->CommonCfg.BACapability.word = pAd->CommonCfg.REGBACapability.word;
+#endif // DOT11_N_SUPPORT //
 
 	// Restore all settings in the following.
 	AsicUpdateProtect(pAd, 0, (ALLN_SETPROTECT|CCKSETPROTECT|OFDMSETPROTECT), TRUE, FALSE);
@@ -2227,6 +2251,7 @@ VOID LinkDown(
 	pAd->CommonCfg.IOTestParm.bCurrentAtheros = FALSE;
 	pAd->CommonCfg.IOTestParm.bNowAtherosBurstOn = FALSE;
 				
+#ifdef DOT11_N_SUPPORT
 #ifdef DOT11N_DRAFT3
 	OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_SCAN_2040);
 	pAd->CommonCfg.BSSCoexist2040.word = 0;
@@ -2236,6 +2261,7 @@ VOID LinkDown(
 		pAd->ChannelList[i].bEffectedChannel = FALSE;
 	}
 #endif // DOT11N_DRAFT3 //
+#endif // DOT11_N_SUPPORT //
 
 	RTMP_IO_WRITE32(pAd, MAX_LEN_CFG, 0x1fff);
 	RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS);
@@ -2312,6 +2338,7 @@ VOID IterateOnBssTab(
 			// RSN capability
 			pAd->StaCfg.RsnCapability = pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx].WPA2.RsnCapability;
 		}
+		
 		// Set Mix cipher flag
 		pAd->StaCfg.bMixCipher = (pAd->StaCfg.PairCipher == pAd->StaCfg.GroupCipher) ? FALSE : TRUE;
 		if (pAd->StaCfg.bMixCipher == TRUE)
@@ -2540,7 +2567,7 @@ ULONG MakeIbssBeacon(
 	UCHAR         ExtRateLen = 0;
 	UCHAR         RSNIe = IE_WPA;
 	
-	if ((pAd->StaCfg.AdhocMode == ADHOC_11B) && (pAd->CommonCfg.Channel <= 14))
+	if ((pAd->CommonCfg.PhyMode == PHY_11B) && (pAd->CommonCfg.Channel <= 14))
 	{
 		SupRate[0] = 0x82; // 1 mbps
 		SupRate[1] = 0x84; // 2 mbps
@@ -2650,6 +2677,52 @@ ULONG MakeIbssBeacon(
 		FrameLen += tmp;	
 	}
 
+#ifdef DOT11_N_SUPPORT
+	if ((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED))
+	{
+		ULONG TmpLen;
+		UCHAR HtLen, HtLen1;
+
+#ifdef RT_BIG_ENDIAN
+		HT_CAPABILITY_IE HtCapabilityTmp;
+		ADD_HT_INFO_IE	addHTInfoTmp;
+		USHORT	b2lTmp, b2lTmp2;
+#endif
+
+		// add HT Capability IE 
+		HtLen = sizeof(pAd->CommonCfg.HtCapability);
+		HtLen1 = sizeof(pAd->CommonCfg.AddHTInfo);
+#ifndef RT_BIG_ENDIAN
+		MakeOutgoingFrame(pBeaconFrame+FrameLen,	&TmpLen,
+						  1,						&HtCapIe,
+						  1,						&HtLen,
+						  HtLen,					&pAd->CommonCfg.HtCapability, 
+						  1,						&AddHtInfoIe,
+						  1,						&HtLen1,
+						  HtLen1,					&pAd->CommonCfg.AddHTInfo, 
+						  END_OF_ARGS);
+#else
+		NdisMoveMemory(&HtCapabilityTmp, &pAd->CommonCfg.HtCapability, HtLen);
+		*(USHORT *)(&HtCapabilityTmp.HtCapInfo) = SWAP16(*(USHORT *)(&HtCapabilityTmp.HtCapInfo));
+		*(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo) = SWAP16(*(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo));
+
+		NdisMoveMemory(&addHTInfoTmp, &pAd->CommonCfg.AddHTInfo, HtLen1);
+		*(USHORT *)(&addHTInfoTmp.AddHtInfo2) = SWAP16(*(USHORT *)(&addHTInfoTmp.AddHtInfo2));
+		*(USHORT *)(&addHTInfoTmp.AddHtInfo3) = SWAP16(*(USHORT *)(&addHTInfoTmp.AddHtInfo3));
+
+		MakeOutgoingFrame(pBeaconFrame+FrameLen,	&TmpLen,
+						  1,						&HtCapIe,
+						  1,						&HtLen,
+						  HtLen,					&HtCapabilityTmp, 
+						  1,						&AddHtInfoIe,
+						  1,						&HtLen1,
+						  HtLen1,					&addHTInfoTmp, 
+						  END_OF_ARGS);
+#endif
+		FrameLen += TmpLen;
+	}
+#endif // DOT11_N_SUPPORT //	
+
 	//beacon use reserved WCID 0xff
     if (pAd->CommonCfg.Channel > 14)
     {
@@ -2670,8 +2743,8 @@ ULONG MakeIbssBeacon(
 	RTMPWIEndianChange((PUCHAR)pTxWI, TYPE_TXWI);
 #endif
 
-    DBGPRINT(RT_DEBUG_TRACE, ("MakeIbssBeacon (len=%ld), SupRateLen=%d, ExtRateLen=%d, Channel=%d, AdhocMode=%ld, PhyMode=%d\n", 
-					FrameLen, SupRateLen, ExtRateLen, pAd->CommonCfg.Channel, pAd->StaCfg.AdhocMode, pAd->CommonCfg.PhyMode));
+    DBGPRINT(RT_DEBUG_TRACE, ("MakeIbssBeacon (len=%ld), SupRateLen=%d, ExtRateLen=%d, Channel=%d, PhyMode=%d\n", 
+					FrameLen, SupRateLen, ExtRateLen, pAd->CommonCfg.Channel, pAd->CommonCfg.PhyMode));
 	return FrameLen;
 }
 
diff --git a/rt2860-1.7.0.0/sta/dls.c b/rt2860-source-1.8.0.0/sta/dls.c
similarity index 95%
copy from rt2860-1.7.0.0/sta/dls.c
copy to rt2860-source-1.8.0.0/sta/dls.c
index 82edd74..ec05888 100644
--- a/rt2860-1.7.0.0/sta/dls.c
+++ b/rt2860-source-1.8.0.0/sta/dls.c
@@ -144,6 +144,7 @@ VOID MlmeDlsReqAction(
 		FrameLen += tmp;
 	}
 
+#ifdef DOT11_N_SUPPORT
 	if ((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED))
 	{
 		UCHAR HtLen;
@@ -173,6 +174,7 @@ VOID MlmeDlsReqAction(
 #endif
 		FrameLen = FrameLen + tmp;
 	}
+#endif // DOT11_N_SUPPORT //
 
 	RTMPCancelTimer(&pDLS->Timer, &TimerCancelled);
 	Timeout = DLS_TIMEOUT;
@@ -347,6 +349,8 @@ VOID PeerDlsReqAction(
 
 					pEntry->MaxHTPhyMode.field.BW = BW_20;
 					pEntry->MinHTPhyMode.field.BW = BW_20;
+
+#ifdef DOT11_N_SUPPORT				
 					pEntry->HTCapability.MCSSet[0] = 0;
 					pEntry->HTCapability.MCSSet[1] = 0;
 
@@ -356,6 +360,9 @@ VOID PeerDlsReqAction(
 						UCHAR	j, bitmask; //k,bitmask;
 						CHAR    ii;
 
+						DBGPRINT(RT_DEBUG_OFF, ("DLS - PeerDlsReqAction() Receive Peer HT Capable STA from %02x:%02x:%02x:%02x:%02x:%02x\n",
+									SA[0], SA[1], SA[2], SA[3], SA[4], SA[5]));
+
 						if ((HtCapability.HtCapInfo.GF) && (pAd->CommonCfg.DesiredHtPhy.GF))
 						{
 							pEntry->MaxHTPhyMode.field.MODE = MODE_HTGREENFIELD;
@@ -439,6 +446,7 @@ VOID PeerDlsReqAction(
 
 						NdisMoveMemory(&pEntry->HTCapability, &HtCapability, sizeof(HT_CAPABILITY_IE));
 					}
+#endif // DOT11_N_SUPPORT //
 
 					pEntry->HTPhyMode.word = pEntry->MaxHTPhyMode.word;
 					pEntry->CurrTxRate = pEntry->MaxSupportedRate;
@@ -509,6 +517,7 @@ VOID PeerDlsReqAction(
 			FrameLen += tmp;
 		}
 
+#ifdef DOT11_N_SUPPORT
 		if ((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED))
 		{
 			UCHAR HtLen;
@@ -538,6 +547,7 @@ VOID PeerDlsReqAction(
 #endif
 			FrameLen = FrameLen + tmp;
 		}
+#endif // DOT11_N_SUPPORT //
 
 		if (pDLS && (pDLS->Status != DLS_FINISH))
 		{
@@ -656,6 +666,8 @@ VOID PeerDlsRspAction(
 
 				pEntry->MaxHTPhyMode.field.BW = BW_20;
 				pEntry->MinHTPhyMode.field.BW = BW_20;
+				
+#ifdef DOT11_N_SUPPORT
 				pEntry->HTCapability.MCSSet[0] = 0;
 				pEntry->HTCapability.MCSSet[1] = 0;
 
@@ -665,6 +677,9 @@ VOID PeerDlsRspAction(
 					UCHAR	j, bitmask; //k,bitmask;
 					CHAR    ii;
 
+					DBGPRINT(RT_DEBUG_OFF, ("DLS - PeerDlsRspAction Receive Peer HT Capable STA from %02x:%02x:%02x:%02x:%02x:%02x\n",
+								SA[0], SA[1], SA[2], SA[3], SA[4], SA[5]));
+
 					if ((HtCapability.HtCapInfo.GF) && (pAd->CommonCfg.DesiredHtPhy.GF))
 					{
 						pEntry->MaxHTPhyMode.field.MODE = MODE_HTGREENFIELD;
@@ -704,8 +719,6 @@ VOID PeerDlsRspAction(
 	 
 					if (pAd->StaCfg.DesiredTransmitSetting.field.MCS != MCS_AUTO)
 					{
-						printk("@@@ pAd->CommonCfg.RegTransmitSetting.field.MCS = %d\n",
-							pAd->StaCfg.DesiredTransmitSetting.field.MCS);
 						if (pAd->StaCfg.DesiredTransmitSetting.field.MCS == 32)
 						{
 							// Fix MCS as HT Duplicated Mode
@@ -746,7 +759,7 @@ VOID PeerDlsRspAction(
 
 					NdisMoveMemory(&pEntry->HTCapability, &HtCapability, sizeof(HT_CAPABILITY_IE));
 				}
-
+#endif // DOT11_N_SUPPORT //
 				pEntry->HTPhyMode.word = pEntry->MaxHTPhyMode.word;
 				pEntry->CurrTxRate = pEntry->MaxSupportedRate;
 				CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE);
@@ -869,6 +882,8 @@ VOID PeerDlsRspAction(
 
 					pEntry->MaxHTPhyMode.field.BW = BW_20;
 					pEntry->MinHTPhyMode.field.BW = BW_20;
+					
+#ifdef DOT11_N_SUPPORT
 					pEntry->HTCapability.MCSSet[0] = 0;
 					pEntry->HTCapability.MCSSet[1] = 0;
 
@@ -878,6 +893,9 @@ VOID PeerDlsRspAction(
 						UCHAR	j, bitmask; //k,bitmask;
 						CHAR    ii;
 
+						DBGPRINT(RT_DEBUG_OFF, ("DLS - PeerDlsRspAction Receive Peer HT Capable STA from %02x:%02x:%02x:%02x:%02x:%02x\n",
+									SA[0], SA[1], SA[2], SA[3], SA[4], SA[5]));
+
 						if ((HtCapability.HtCapInfo.GF) && (pAd->CommonCfg.DesiredHtPhy.GF))
 						{
 							pEntry->MaxHTPhyMode.field.MODE = MODE_HTGREENFIELD;
@@ -959,6 +977,7 @@ VOID PeerDlsRspAction(
 
 						NdisMoveMemory(&pEntry->HTCapability, &HtCapability, sizeof(HT_CAPABILITY_IE));
 					}
+#endif // DOT11_N_SUPPORT //
 
 					pEntry->HTPhyMode.word = pEntry->MaxHTPhyMode.word;
 					pEntry->CurrTxRate = pEntry->MaxSupportedRate;
@@ -1248,8 +1267,7 @@ BOOLEAN RTMPRcvFrameDLSCheck(
 	BOOLEAN			TimerCancelled;
 	CIPHER_KEY		PairwiseKey;
 
-	DBGPRINT(RT_DEBUG_INFO, ("====> RTMPRcvFrameDLSCheck\n"));
-
+	
 	if (! pAd->CommonCfg.bDLSCapable)
 		return bSTAKeyFrame;
 
@@ -1334,7 +1352,7 @@ BOOLEAN RTMPRcvFrameDLSCheck(
 			}
 			else
 				DBGPRINT(RT_DEBUG_TRACE, ("MIC VALID in Msg1 of STAKey handshake! \n"));
-
+#if 1
 			if ((pEap->KeyDesc.KeyData[0] == 0xDD) && (pEap->KeyDesc.KeyData[2] == 0x00) && (pEap->KeyDesc.KeyData[3] == 0x0C)
 				&& (pEap->KeyDesc.KeyData[4] == 0x43) && (pEap->KeyDesc.KeyData[5] == 0x02))
 			{
@@ -1346,10 +1364,27 @@ BOOLEAN RTMPRcvFrameDLSCheck(
 
 				bSTAKeyFrame = TRUE;
 			}
+#else
+			if ((pEap->KeyDesc.KeyData[0] == 0xDD) && (pEap->KeyDesc.KeyData[2] == 0x00) && (pEap->KeyDesc.KeyData[3] == 0x0F)
+				&& (pEap->KeyDesc.KeyData[4] == 0xAC) && (pEap->KeyDesc.KeyData[5] == 0x02))
+			{
+				pAddr			= pEap->KeyDesc.KeyData + 8;		// Tpe(1), Len(1), OUI(3), DataType(1), Reserved(2)
+				pSTAKey			= pEap->KeyDesc.KeyData + 14;	// Tpe(1), Len(1), OUI(3), DataType(1), Reserved(2), STAKey_Mac_Addr(6)
+
+				DBGPRINT(RT_DEBUG_TRACE,("DLS - Receive STAKey Message-1 from %02x:%02x:%02x:%02x:%02x:%02x Len=%d, KeyDataLen=%d\n",
+					pAddr[0], pAddr[1], pAddr[2], pAddr[3], pAddr[4], pAddr[5], Len, pEap->KeyDesc.KeyData[1]));
+
+				bSTAKeyFrame = TRUE;
+			}
+#endif
 			
 		}
 		else if (Len >= (LENGTH_802_11 + 6 + 2 + 2 + sizeof(EAPOL_PACKET) - MAX_LEN_OF_RSNIE))
 		{
+#if 0
+			RTMPMoveMemory(pAd->StaCfg.ReplayCounter, pEap->KeyDesc.ReplayCounter, LEN_KEY_DESC_REPLAY);
+
+#endif
 			RTMPMoveMemory(pAd->StaCfg.DlsReplayCounter, pEap->KeyDesc.ReplayCounter, LEN_KEY_DESC_REPLAY);
 			DBGPRINT(RT_DEBUG_TRACE,("DLS - Sniff replay counter 2(%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x) Len=%ld, KeyDataLen=%d\n",
 				pAd->StaCfg.ReplayCounter[0], pAd->StaCfg.ReplayCounter[1], pAd->StaCfg.ReplayCounter[2],
@@ -1384,6 +1419,7 @@ BOOLEAN RTMPRcvFrameDLSCheck(
 				//AsicAddKeyEntry(pAd, (USHORT)(i + 2), BSS0, 0, &PairwiseKey, TRUE, TRUE);	// reserve 0 for multicast, 1 for unicast
 				//AsicUpdateRxWCIDTable(pAd, (USHORT)(i + 2), pAddr);
 				// Add Pair-wise key to Asic
+#ifdef RT2860
             	AsicAddPairwiseKeyEntry(pAd,
 										pAd->StaCfg.DLSEntry[i].MacAddr, 
 										(UCHAR)pAd->StaCfg.DLSEntry[i].MacTabMatchWCID,
@@ -1395,6 +1431,7 @@ BOOLEAN RTMPRcvFrameDLSCheck(
 										  PairwiseKey.CipherAlg, 
 										  pEntry);
 
+#endif // RT2860 //
 				NdisMoveMemory(&pEntry->PairwiseKey, &PairwiseKey, sizeof(CIPHER_KEY));
 				DBGPRINT(RT_DEBUG_TRACE,("DLS - Receive STAKey Message-1 (Peer STA MAC Address STAKey) \n"));
 
@@ -1440,6 +1477,7 @@ BOOLEAN RTMPRcvFrameDLSCheck(
 				//AsicAddKeyEntry(pAd, (USHORT)(i + 2), BSS0, 0, &PairwiseKey, TRUE, TRUE);	// reserve 0 for multicast, 1 for unicast
 				//AsicUpdateRxWCIDTable(pAd, (USHORT)(i + 2), pAddr);
 				// Add Pair-wise key to Asic
+#ifdef RT2860
             	AsicAddPairwiseKeyEntry(pAd,
 										pAd->StaCfg.DLSEntry[i].MacAddr, 
 										(UCHAR)pAd->StaCfg.DLSEntry[i].MacTabMatchWCID,
@@ -1450,7 +1488,7 @@ BOOLEAN RTMPRcvFrameDLSCheck(
 										  0, 
 										  PairwiseKey.CipherAlg, 
 										  pEntry);
-
+#endif // RT2860 //
 				NdisMoveMemory(&pEntry->PairwiseKey, &PairwiseKey, sizeof(CIPHER_KEY));
 				DBGPRINT(RT_DEBUG_TRACE,("DLS - Receive STAKey Message-1 (Initiator STA MAC Address STAKey)\n"));
 
@@ -1483,8 +1521,7 @@ BOOLEAN RTMPRcvFrameDLSCheck(
 			bFindEntry = TRUE;
 		}
 	}
-
-	DBGPRINT(RT_DEBUG_INFO, ("<==== RTMPRcvFrameDLSCheck\n"));
+	
 
 	return bSTAKeyFrame;
 }
@@ -1905,6 +1942,7 @@ MAC_TABLE_ENTRY *MacTableInsertDlsEntry(
 			pEntry->MatchDlsEntryIdx = DlsEntryIdx;
 			pEntry->AuthMode = pAd->StaCfg.AuthMode;
 			pEntry->WepStatus = pAd->StaCfg.WepStatus;
+			pEntry->PortSecured = WPA_802_1X_PORT_SECURED;
 
 			DBGPRINT(RT_DEBUG_TRACE, ("MacTableInsertDlsEntry - allocate entry #%d, Total= %d\n",pEntry->Aid, pAd->MacTab.Size));
 
@@ -2040,10 +2078,36 @@ INT Set_DlsEntryInfo_Display_Proc(
 	{
 		if ((pAd->StaCfg.DLSEntry[i].Valid) && (pAd->StaCfg.DLSEntry[i].Status == DLS_FINISH))
 		{
+			PMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[pAd->StaCfg.DLSEntry[i].MacTabMatchWCID];
+
 			printk("%02x:%02x:%02x:%02x:%02x:%02x  ",
 				pAd->StaCfg.DLSEntry[i].MacAddr[0], pAd->StaCfg.DLSEntry[i].MacAddr[1], pAd->StaCfg.DLSEntry[i].MacAddr[2],
 				pAd->StaCfg.DLSEntry[i].MacAddr[3], pAd->StaCfg.DLSEntry[i].MacAddr[4], pAd->StaCfg.DLSEntry[i].MacAddr[5]);
 			printk("%-8d\n", pAd->StaCfg.DLSEntry[i].TimeOut);
+
+			printk("\n");
+			printk("\n%-19s%-4s%-4s%-4s%-4s%-8s%-7s%-7s%-7s%-10s%-6s%-6s%-6s%-6s\n",
+				   "MAC", "AID", "BSS", "PSM", "WMM", "MIMOPS", "RSSI0", "RSSI1", "RSSI2", "PhMd", "BW", "MCS", "SGI", "STBC");
+			printk("%02X:%02X:%02X:%02X:%02X:%02X  ",
+				pEntry->Addr[0], pEntry->Addr[1], pEntry->Addr[2],
+				pEntry->Addr[3], pEntry->Addr[4], pEntry->Addr[5]);
+			printk("%-4d", (int)pEntry->Aid);
+			printk("%-4d", (int)pEntry->apidx);
+			printk("%-4d", (int)pEntry->PsMode);
+			printk("%-4d", (int)CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE));
+			printk("%-8d", (int)pEntry->MmpsMode);
+			printk("%-7d", pEntry->RssiSample.AvgRssi0);
+			printk("%-7d", pEntry->RssiSample.AvgRssi1);
+			printk("%-7d", pEntry->RssiSample.AvgRssi2);
+			printk("%-10s", GetPhyMode(pEntry->HTPhyMode.field.MODE));
+			printk("%-6s", GetBW(pEntry->HTPhyMode.field.BW));
+			printk("%-6d", pEntry->HTPhyMode.field.MCS);
+			printk("%-6d", pEntry->HTPhyMode.field.ShortGI);
+			printk("%-6d", pEntry->HTPhyMode.field.STBC);
+			printk("%-10d, %d, %d%%\n", pEntry->DebugFIFOCount, pEntry->DebugTxCount, 
+						(pEntry->DebugTxCount) ? ((pEntry->DebugTxCount-pEntry->DebugFIFOCount)*100/pEntry->DebugTxCount) : 0);
+			printk("\n");
+
 		}
 	}
 
diff --git a/rt2860-1.7.0.0/sta/rtmp_data.c b/rt2860-source-1.8.0.0/sta/rtmp_data.c
similarity index 96%
copy from rt2860-1.7.0.0/sta/rtmp_data.c
copy to rt2860-source-1.8.0.0/sta/rtmp_data.c
index cecfa6c..a186dc8 100644
--- a/rt2860-1.7.0.0/sta/rtmp_data.c
+++ b/rt2860-source-1.8.0.0/sta/rtmp_data.c
@@ -90,7 +90,7 @@ VOID STARxEAPOLFrameIndicate(
                         pAd->IndicateMediaState = NdisMediaStateConnected;
                         pAd->ExtraInfo = GENERAL_LINK_UP;
 #endif // RT2860 //
-    					// For Preventing ShardKey Table is cleared by remove key procedure.
+						// For Preventing ShardKey Table is cleared by remove key procedure.
     					pAd->SharedKey[BSS0][idx].CipherAlg = CipherAlg;
 						pAd->SharedKey[BSS0][idx].KeyLen = pAd->StaCfg.DesireSharedKey[idx].KeyLen;
 						NdisMoveMemory(pAd->SharedKey[BSS0][idx].Key, 
@@ -177,11 +177,13 @@ VOID STARxDataFrameAnnounce(
 	else 
 	{
 		RX_BLK_SET_FLAG(pRxBlk, fRX_EAP);
+#ifdef DOT11_N_SUPPORT
 		if (RX_BLK_TEST_FLAG(pRxBlk, fRX_AMPDU) && (pAd->CommonCfg.bDisableReordering == 0)) 
 		{
 			Indicate_AMPDU_Packet(pAd, pRxBlk, FromWhichBSSID);
 		} 
 		else
+#endif // DOT11_N_SUPPORT //
 		{
 			// Determin the destination of the EAP frame
 			//  to WPA state machine or upper layer
@@ -409,7 +411,6 @@ VOID STAHandleRxDataFrame(
 			{
 				AsicUpdateProtect(pAd, 8, ALLN_SETPROTECT, TRUE, FALSE);
 			}
-			DBGPRINT(RT_DEBUG_INFO, ("Atheros Problem. Turn on RTS/CTS!!!\n"));
 		}
 	}
 
@@ -447,17 +448,19 @@ VOID STAHandleRxDataFrame(
 	if (pHeader->FC.Order)
 	{
 #ifdef AGGREGATION_SUPPORT
-		if ((pRxWI->PHYMODE < MODE_HTMIX) && (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_AGGREGATION_INUSED)))
+		if ((pRxWI->PHYMODE <= MODE_OFDM) && (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_AGGREGATION_INUSED)))
 		{
 			RX_BLK_SET_FLAG(pRxBlk, fRX_ARALINK);
 		}
 		else
 #endif
 		{
+#ifdef DOT11_N_SUPPORT
 			RX_BLK_SET_FLAG(pRxBlk, fRX_HTC);
 			// skip HTC contorl field
 			pRxBlk->pData += 4;
 			pRxBlk->DataSize -= 4;
+#endif // DOT11_N_SUPPORT //
 		}
 	}
 
@@ -470,10 +473,13 @@ VOID STAHandleRxDataFrame(
 		pRxBlk->pData += 2;
 	}
 
+#ifdef DOT11_N_SUPPORT
 	if (pRxD->BA)
 	{
 		RX_BLK_SET_FLAG(pRxBlk, fRX_AMPDU);
 	}
+#endif // DOT11_N_SUPPORT //
+
 
 	// 
 	// Case I  Process Broadcast & Multicast data frame
@@ -499,13 +505,32 @@ VOID STAHandleRxDataFrame(
 		}
 
 		Indicate_Legacy_Packet(pAd, pRxBlk, FromWhichBSSID);
-		DBGPRINT_RAW(RT_DEBUG_INFO, ("!!! report BCAST DATA to LLC (len=%d) !!!\n", pRxBlk->DataSize));
 		return;
 	}					
 	else if (pRxD->U2M)
 	{
 		pAd->LastRxRate = (USHORT)((pRxWI->MCS) + (pRxWI->BW <<7) + (pRxWI->ShortGI <<8)+ (pRxWI->PHYMODE <<14)) ;
 
+
+#ifdef QOS_DLS_SUPPORT
+        if (RX_BLK_TEST_FLAG(pRxBlk, fRX_DLS))
+		{
+			MAC_TABLE_ENTRY *pDlsEntry = NULL;
+
+			pDlsEntry = DlsEntryTableLookupByWcid(pAd, pRxWI->WirelessCliID, pHeader->Addr2, TRUE);
+										                        if(pDlsEntry)
+			Update_Rssi_Sample(pAd, &pDlsEntry->RssiSample, pRxWI);
+		}
+		else
+#endif // QOS_DLS_SUPPORT //
+		if (ADHOC_ON(pAd))
+		{
+			pEntry = MacTableLookup(pAd, pHeader->Addr2);
+			if (pEntry)
+				Update_Rssi_Sample(pAd, &pEntry->RssiSample, pRxWI);
+		}
+
+
 		Update_Rssi_Sample(pAd, &pAd->StaCfg.RssiSample, pRxWI);
 
 		pAd->StaCfg.LastSNR0 = (UCHAR)(pRxWI->SNR0);
@@ -567,6 +592,7 @@ VOID STAHandleRxMgmtFrame(
 
 	do
 	{
+
 		// We should collect RSSI not only U2M data but also my beacon
 		if ((pHeader->FC.SubType == SUBTYPE_BEACON) && (MAC_ADDR_EQUAL(&pAd->CommonCfg.Bssid, &pHeader->Addr2)))
 		{
@@ -594,21 +620,24 @@ VOID STAHandleRxControlFrame(
 	IN	PRTMP_ADAPTER	pAd,
 	IN	RX_BLK			*pRxBlk)
 {
+#ifdef DOT11_N_SUPPORT
 	PRXWI_STRUC		pRxWI = pRxBlk->pRxWI;
+#endif // DOT11_N_SUPPORT //
 	PHEADER_802_11	pHeader = pRxBlk->pHeader;
 	PNDIS_PACKET	pRxPacket = pRxBlk->pRxPacket;
 
 	switch (pHeader->FC.SubType)
 	{
 		case SUBTYPE_BLOCK_ACK_REQ:
+#ifdef DOT11_N_SUPPORT
 			{
 				CntlEnqueueForRecv(pAd, pRxWI->WirelessCliID, (pRxWI->MPDUtotalByteCount), (PFRAME_BA_REQ)pHeader);
 			}
 			break;
+#endif // DOT11_N_SUPPORT //
 		case SUBTYPE_BLOCK_ACK:
 		case SUBTYPE_ACK:
-		default:		
-			DBGPRINT(RT_DEBUG_INFO,("ignore CNTL (subtype=%d)\n", pHeader->FC.SubType));
+		default:
 			break;
 	}
 
@@ -635,7 +664,6 @@ VOID STAHandleRxControlFrame(
 		Need to consider QOS DATA format when converting to 802.3
 	========================================================================
 */
-
 BOOLEAN STARxDoneInterruptHandle(
 	IN	PRTMP_ADAPTER	pAd,
 	IN	BOOLEAN			argc)
@@ -800,7 +828,6 @@ BOOLEAN STARxDoneInterruptHandle(
 VOID	RTMPHandleTwakeupInterrupt(
 	IN PRTMP_ADAPTER pAd)
 {
-	DBGPRINT(RT_DEBUG_INFO, ("Twakeup Expired... !!!\n"));
 	AsicForceWakeup(pAd, FALSE);
 }
 
@@ -832,8 +859,7 @@ VOID STASendPackets(
 	PNDIS_PACKET	pPacket;
 	BOOLEAN			allowToSend = FALSE;
 
-	DBGPRINT(RT_DEBUG_INFO, ("====> STASendPackets\n"));
-	
+
 	for (Index = 0; Index < NumberOfPackets; Index++)
 	{
 		pPacket = ppPacketArray[Index];
@@ -935,8 +961,7 @@ NDIS_STATUS STASendPacket(
 		return NDIS_STATUS_FAILURE;
 	}
 
-	DBGPRINT(RT_DEBUG_LOUD,("RTMPSendPacket --> pSrcBufVA == %p, SrcBufLen=%d\n", pSrcBufVA, SrcBufLen));
-
+	
 	if (SrcBufLen < 14)
 	{
 		DBGPRINT(RT_DEBUG_ERROR,("STASendPacket --> Ndis Packet buffer error !!!\n"));
@@ -991,7 +1016,8 @@ NDIS_STATUS STASendPacket(
 		return NDIS_STATUS_FAILURE;
 	}
 
-	if (ADHOC_ON(pAd))
+	if (ADHOC_ON(pAd)
+		)
 	{
 		RTMP_SET_PACKET_WCID(pPacket, (UCHAR)pEntry->Aid);
 	}
@@ -1002,6 +1028,7 @@ NDIS_STATUS STASendPacket(
 	RTMPCheckEtherType(pAd, pPacket);
 
 	
+	
 	//
 	// WPA 802.1x secured port control - drop all non-802.1x frame before port secured
 	//
@@ -1040,8 +1067,10 @@ NDIS_STATUS STASendPacket(
 		NumberOfFrag = 1;	// Aggregation overwhelms fragmentation
 	else if (CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_AMSDU_INUSED))
 		NumberOfFrag = 1;	// Aggregation overwhelms fragmentation
+#ifdef DOT11_N_SUPPORT
 	else if ((pAd->StaCfg.HTPhyMode.field.MODE == MODE_HTMIX) || (pAd->StaCfg.HTPhyMode.field.MODE == MODE_HTGREENFIELD))
 		NumberOfFrag = 1;	// MIMO RATE overwhelms fragmentation
+#endif // DOT11_N_SUPPORT //
 	else
 	{
 		// The calculated "NumberOfFrag" is a rough estimation because of various 
@@ -1144,9 +1173,9 @@ NDIS_STATUS STASendPacket(
 	}
 	RTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags);
 
+#ifdef DOT11_N_SUPPORT
     if ((pAd->CommonCfg.BACapability.field.AutoBA == TRUE)&& 
-        (pAd->StaActive.SupportedPhyInfo.bHtEnable == TRUE) &&
-        INFRA_ON(pAd))
+        (pAd->StaActive.SupportedPhyInfo.bHtEnable == TRUE))
 	{
 		if (((pEntry->TXBAbitmap & (1<<UserPriority)) == 0) && 
             ((pEntry->BADeclineBitmap & (1<<UserPriority)) == 0) &&
@@ -1162,6 +1191,7 @@ NDIS_STATUS STASendPacket(
 			BAOriSessionSetUp(pAd, pEntry, 0, 0, 10, FALSE);
 		}
 	}
+#endif // DOT11_N_SUPPORT //
 
 	pAd->RalinkCounters.OneSecOsTxCount[QueIdx]++; // TODO: for debug only. to be removed
 	return NDIS_STATUS_SUCCESS;
@@ -1545,7 +1575,7 @@ VOID STABuildCommon802_11Header(
     	pHeader_802_11->FC.PwrMgmt = (pAd->StaCfg.Psm == PWR_SAVE);		
 }
 
-
+#ifdef DOT11_N_SUPPORT
 VOID STABuildCache802_11Header(
 	IN RTMP_ADAPTER		*pAd,
 	IN TX_BLK			*pTxBlk,
@@ -1595,7 +1625,10 @@ VOID STABuildCache802_11Header(
 		}
 		else
 #endif // QOS_DLS_SUPPORT //
-		COPY_MAC_ADDR(pHeader80211->Addr3, pTxBlk->pSrcBufHeader);
+		if (ADHOC_ON(pAd))
+			COPY_MAC_ADDR(pHeader80211->Addr3, pAd->CommonCfg.Bssid);
+		else
+			COPY_MAC_ADDR(pHeader80211->Addr3, pTxBlk->pSrcBufHeader);
 	}
 
 	// -----------------------------------------------------------------
@@ -1606,7 +1639,7 @@ VOID STABuildCache802_11Header(
 	else
     	pHeader80211->FC.PwrMgmt = (pAd->StaCfg.Psm == PWR_SAVE);	
 }
-
+#endif // DOT11_N_SUPPORT //
 
 static inline PUCHAR STA_Build_ARalink_Frame_Header(
 	IN RTMP_ADAPTER *pAd,
@@ -1666,7 +1699,7 @@ static inline PUCHAR STA_Build_ARalink_Frame_Header(
 	
 }
 
-
+#ifdef DOT11_N_SUPPORT
 static inline PUCHAR STA_Build_AMSDU_Frame_Header(
 	IN RTMP_ADAPTER *pAd,
 	IN TX_BLK		*pTxBlk)
@@ -1725,7 +1758,6 @@ VOID STA_AMPDU_Frame_Tx(
 	MAC_TABLE_ENTRY	*pMacEntry;
 	BOOLEAN			bVLANPkt;
 	PQUEUE_ENTRY	pQEntry;
-
 	
 	ASSERT(pTxBlk);
 
@@ -1757,6 +1789,7 @@ VOID STA_AMPDU_Frame_Tx(
 			pHeaderBufPtr = &pTxBlk->HeaderBuf[TXINFO_SIZE + TXWI_SIZE];
 		}
 
+
 		pHeader_802_11 = (HEADER_802_11 *) pHeaderBufPtr;
 		
 		// skip common header
@@ -1812,18 +1845,22 @@ VOID STA_AMPDU_Frame_Tx(
 		pHeaderBufPtr = (PCHAR) ROUND_UP(pHeaderBufPtr, 4);
 		pTxBlk->HdrPadLen = (ULONG)(pHeaderBufPtr - pTxBlk->HdrPadLen);
 
-		//
-		// Insert LLC-SNAP encapsulation - 8 octets
-		//
-		EXTRA_LLCSNAP_ENCAP_FROM_PKT_OFFSET(pTxBlk->pSrcBufData-2, pTxBlk->pExtraLlcSnapEncap);
-		if (pTxBlk->pExtraLlcSnapEncap)
 		{
-			NdisMoveMemory(pHeaderBufPtr, pTxBlk->pExtraLlcSnapEncap, 6);
-			pHeaderBufPtr += 6;
-			// get 2 octets (TypeofLen)
-			NdisMoveMemory(pHeaderBufPtr, pTxBlk->pSrcBufData-2, 2);
-			pHeaderBufPtr += 2;
-			pTxBlk->MpduHeaderLen += LENGTH_802_1_H;
+
+			//
+			// Insert LLC-SNAP encapsulation - 8 octets
+			//
+			EXTRA_LLCSNAP_ENCAP_FROM_PKT_OFFSET(pTxBlk->pSrcBufData-2, pTxBlk->pExtraLlcSnapEncap);
+			if (pTxBlk->pExtraLlcSnapEncap)
+			{
+				NdisMoveMemory(pHeaderBufPtr, pTxBlk->pExtraLlcSnapEncap, 6);
+				pHeaderBufPtr += 6;
+				// get 2 octets (TypeofLen)
+				NdisMoveMemory(pHeaderBufPtr, pTxBlk->pSrcBufData-2, 2);
+				pHeaderBufPtr += 2;
+				pTxBlk->MpduHeaderLen += LENGTH_802_1_H;
+			}
+
 		}
 
 		if (pMacEntry->isCached)
@@ -1984,7 +2021,7 @@ VOID STA_AMSDU_Frame_Tx(
 	// 
 	HAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx);
 }
-
+#endif // DOT11_N_SUPPORT //
 
 VOID STA_Legacy_Frame_Tx(
 	IN	PRTMP_ADAPTER	pAd,
@@ -1995,7 +2032,6 @@ VOID STA_Legacy_Frame_Tx(
 	USHORT			FreeNumber;
 	BOOLEAN			bVLANPkt;
 	PQUEUE_ENTRY	pQEntry;
-
 	
 	ASSERT(pTxBlk);
 
@@ -2026,6 +2062,7 @@ VOID STA_Legacy_Frame_Tx(
 	STAFindCipherAlgorithm(pAd, pTxBlk);
 	STABuildCommon802_11Header(pAd, pTxBlk);
 
+
 	// skip 802.3 header
 	pTxBlk->pSrcBufData = pTxBlk->pSrcBufHeader + LENGTH_802_3;
 	pTxBlk->SrcBufLen  -= LENGTH_802_3;
@@ -2054,34 +2091,35 @@ VOID STA_Legacy_Frame_Tx(
 		pTxBlk->MpduHeaderLen += 2;
 	}
 
-	//
-	// padding at front of LLC header
-	// LLC header should locate at 4-octets aligment
-	// 
+	// The remaining content of MPDU header should locate at 4-octets aligment	
 	pTxBlk->HdrPadLen = (ULONG)pHeaderBufPtr;
 	pHeaderBufPtr = (PCHAR) ROUND_UP(pHeaderBufPtr, 4);
 	pTxBlk->HdrPadLen = (ULONG)(pHeaderBufPtr - pTxBlk->HdrPadLen);
 
-	//
-	// Insert LLC-SNAP encapsulation - 8 octets
-	// 
-		//
-   	// if original Ethernet frame contains no LLC/SNAP, 
-	// then an extra LLC/SNAP encap is required 
-	//
-	EXTRA_LLCSNAP_ENCAP_FROM_PKT_START(pTxBlk->pSrcBufHeader, pTxBlk->pExtraLlcSnapEncap);
-	if (pTxBlk->pExtraLlcSnapEncap)
 	{
-		UCHAR vlan_size;
 
-		NdisMoveMemory(pHeaderBufPtr, pTxBlk->pExtraLlcSnapEncap, 6);
-		pHeaderBufPtr += 6;
-		// skip vlan tag
-		vlan_size =  (bVLANPkt) ? LENGTH_802_1Q : 0;
-		// get 2 octets (TypeofLen)
-		NdisMoveMemory(pHeaderBufPtr, pTxBlk->pSrcBufHeader+12+vlan_size, 2);
-		pHeaderBufPtr += 2;
-		pTxBlk->MpduHeaderLen += LENGTH_802_1_H;
+		//
+		// Insert LLC-SNAP encapsulation - 8 octets
+		// 
+		//
+   		// if original Ethernet frame contains no LLC/SNAP, 
+		// then an extra LLC/SNAP encap is required 
+		//
+		EXTRA_LLCSNAP_ENCAP_FROM_PKT_START(pTxBlk->pSrcBufHeader, pTxBlk->pExtraLlcSnapEncap);
+		if (pTxBlk->pExtraLlcSnapEncap)
+		{
+			UCHAR vlan_size;
+	
+			NdisMoveMemory(pHeaderBufPtr, pTxBlk->pExtraLlcSnapEncap, 6);
+			pHeaderBufPtr += 6;
+			// skip vlan tag
+			vlan_size =  (bVLANPkt) ? LENGTH_802_1Q : 0;
+			// get 2 octets (TypeofLen)
+			NdisMoveMemory(pHeaderBufPtr, pTxBlk->pSrcBufHeader+12+vlan_size, 2);
+			pHeaderBufPtr += 2;
+			pTxBlk->MpduHeaderLen += LENGTH_802_1_H;
+		}
+
 	}
 
 	//
@@ -2157,6 +2195,7 @@ VOID STA_ARalink_Frame_Tx(
 			//	will be updated after final frame was handled.
 			RTMPWriteTxWI_Data(pAd, (PTXWI_STRUC)(&pTxBlk->HeaderBuf[TXINFO_SIZE]), pTxBlk);
 
+
 			//
 			// Insert LLC-SNAP encapsulation - 8 octets
 			// 
@@ -2295,6 +2334,8 @@ VOID STA_Fragment_Frame_Tx(
 	pHeaderBufPtr = (PCHAR) ROUND_UP(pHeaderBufPtr, 4);
 	pTxBlk->HdrPadLen = (ULONG)(pHeaderBufPtr - pTxBlk->HdrPadLen);
 
+
+
 	//
 	// Insert LLC-SNAP encapsulation - 8 octets
 	// 
@@ -2467,7 +2508,7 @@ NDIS_STATUS STAHardTransmit(
 
 	pPacket = QUEUE_ENTRY_TO_PACKET(pTxBlk->TxPacketList.Head);
 
-#ifdef CARRIER_DETECTION_SUPPORT // Roger sync Carrier
+#if 0 //def CARRIER_DETECTION_SUPPORT // Roger sync Carrier
 		if ((pAd->CommonCfg.CarrierDetect.Enable == TRUE) && (isCarrierDetectExist(pAd) == TRUE))
 	{
 		DBGPRINT(RT_DEBUG_INFO,("STAHardTransmit --> radar detect not in normal mode !!!\n"));
@@ -2490,7 +2531,8 @@ NDIS_STATUS STAHardTransmit(
 	
 	// It should not change PSM bit, when APSD turn on.
 	if ((!(pAd->CommonCfg.bAPSDCapable && pAd->CommonCfg.APEdcaParm.bAPSDCapable) && (pAd->CommonCfg.bAPSDForcePowerSave == FALSE))
-		|| (RTMP_GET_PACKET_EAPOL(pTxBlk->pPacket)))
+		|| (RTMP_GET_PACKET_EAPOL(pTxBlk->pPacket))
+		|| (RTMP_GET_PACKET_WAI(pTxBlk->pPacket)))
 	{
 		if ((pAd->StaCfg.Psm == PWR_SAVE) &&
             (pAd->StaCfg.WindowsPowerMode == Ndis802_11PowerModeFast_PSP))
@@ -2499,12 +2541,14 @@ NDIS_STATUS STAHardTransmit(
 
 	switch (pTxBlk->TxFrameType)
 	{
+#ifdef DOT11_N_SUPPORT
 		case TX_AMPDU_FRAME:
 				STA_AMPDU_Frame_Tx(pAd, pTxBlk);
 			break;
 		case TX_AMSDU_FRAME:
 				STA_AMSDU_Frame_Tx(pAd, pTxBlk);
 			break;
+#endif // DOT11_N_SUPPORT //
 		case TX_LEGACY_FRAME:
 				STA_Legacy_Frame_Tx(pAd, pTxBlk);
 			break;
@@ -2556,6 +2600,15 @@ VOID Sta_Announce_or_Forward_802_3_Packet(
 	IN	PNDIS_PACKET	pPacket,
 	IN	UCHAR			FromWhichBSSID)
 {
-	announce_802_3_packet(pAd, pPacket);
+	if (TRUE
+		)
+	{
+		announce_802_3_packet(pAd, pPacket);
+	}
+	else
+	{
+		// release packet
+		RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);
+	}
 }
 
diff --git a/rt2860-1.7.0.0/sta/sanity.c b/rt2860-source-1.8.0.0/sta/sanity.c
similarity index 99%
copy from rt2860-1.7.0.0/sta/sanity.c
copy to rt2860-source-1.8.0.0/sta/sanity.c
index cc890ea..2b32676 100644
--- a/rt2860-1.7.0.0/sta/sanity.c
+++ b/rt2860-source-1.8.0.0/sta/sanity.c
@@ -184,6 +184,7 @@ BOOLEAN PeerAssocRspSanity(
 			}
 				
 		break;
+#ifdef DOT11_N_SUPPORT
             case IE_ADD_HT:
             case IE_ADD_HT2:
 			if (pEid->Len >= sizeof(ADD_HT_INFO_IE))				
@@ -212,7 +213,7 @@ BOOLEAN PeerAssocRspSanity(
 			{
 				DBGPRINT(RT_DEBUG_WARN, ("PeerAssocRspSanity - wrong IE_SECONDARY_CH_OFFSET. \n"));
 			}
-				
+#endif // DOT11_N_SUPPORT //				
 		break;
             case IE_AIRONET_CKIP:
                 // 0. Check Aironet IE length, it must be larger or equal to 28
@@ -343,7 +344,7 @@ BOOLEAN PeerProbeReqSanity(
     }
     else
     {
-        if ((pAd->StaCfg.AdhocMode == 2) && (RateLen < 8))
+        if ((pAd->CommonCfg.PhyMode == PHY_11G) && (RateLen < 8))
             return (FALSE);
     }
 
diff --git a/rt2860-1.7.0.0/sta/sync.c b/rt2860-source-1.8.0.0/sta/sync.c
similarity index 85%
copy from rt2860-1.7.0.0/sta/sync.c
copy to rt2860-source-1.8.0.0/sta/sync.c
index d41239e..040307d 100644
--- a/rt2860-1.7.0.0/sta/sync.c
+++ b/rt2860-source-1.8.0.0/sta/sync.c
@@ -37,6 +37,41 @@
 */
 #include "rt_config.h"
 
+#define AC0_DEF_TXOP		0
+#define AC1_DEF_TXOP		0
+#define AC2_DEF_TXOP		94
+#define AC3_DEF_TXOP		47
+
+VOID	AdhocTurnOnQos(
+	IN  PRTMP_ADAPTER pAd)
+{
+	// Turn on QOs if use HT rate.
+	if (pAd->CommonCfg.APEdcaParm.bValid == FALSE)
+	{
+		pAd->CommonCfg.APEdcaParm.bValid = TRUE;
+		pAd->CommonCfg.APEdcaParm.Aifsn[0] = 3;
+		pAd->CommonCfg.APEdcaParm.Aifsn[1] = 7;
+		pAd->CommonCfg.APEdcaParm.Aifsn[2] = 1;
+		pAd->CommonCfg.APEdcaParm.Aifsn[3] = 1;
+
+		pAd->CommonCfg.APEdcaParm.Cwmin[0] = 4;
+		pAd->CommonCfg.APEdcaParm.Cwmin[1] = 4;
+		pAd->CommonCfg.APEdcaParm.Cwmin[2] = 3;
+		pAd->CommonCfg.APEdcaParm.Cwmin[3] = 2;
+
+		pAd->CommonCfg.APEdcaParm.Cwmax[0] = 10;
+		pAd->CommonCfg.APEdcaParm.Cwmax[1] = 6;
+		pAd->CommonCfg.APEdcaParm.Cwmax[2] = 4;
+		pAd->CommonCfg.APEdcaParm.Cwmax[3] = 3;
+
+		pAd->CommonCfg.APEdcaParm.Txop[0]  = 0;
+		pAd->CommonCfg.APEdcaParm.Txop[1]  = 0;
+		pAd->CommonCfg.APEdcaParm.Txop[2]  = AC2_DEF_TXOP;
+		pAd->CommonCfg.APEdcaParm.Txop[3]  = AC3_DEF_TXOP;
+	}
+	AsicSetEdcaParm(pAd, &pAd->CommonCfg.APEdcaParm);
+}
+
 /*
 	==========================================================================
 	Description:
@@ -97,7 +132,6 @@ VOID BeaconTimeout(
 	IN PVOID SystemSpecific2, 
 	IN PVOID SystemSpecific3) 
 {
-	UCHAR        BBPValue = 0;
 	RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)FunctionContext;
 
 	DBGPRINT(RT_DEBUG_TRACE,("SYNC - BeaconTimeout\n"));
@@ -107,8 +141,11 @@ VOID BeaconTimeout(
 	if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS))
 		return;
 
-	if (pAd->CommonCfg.BBPCurrentBW == BW_40)
+#ifdef DOT11_N_SUPPORT
+	if ((pAd->CommonCfg.BBPCurrentBW == BW_40)
+		)
 	{
+		UCHAR        BBPValue = 0;
 		AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE);
 		AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel);
 		RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue);
@@ -117,6 +154,7 @@ VOID BeaconTimeout(
 		RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue);
 		DBGPRINT(RT_DEBUG_TRACE, ("SYNC - End of SCAN, restore to 40MHz channel %d, Total BSS[%02d]\n",pAd->CommonCfg.CentralChannel, pAd->ScanTab.BssNr));
 	}
+#endif // DOT11_N_SUPPORT //
 
 	MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_BEACON_TIMEOUT, 0, NULL);
 	RT28XX_MLME_HANDLER(pAd);
@@ -138,9 +176,8 @@ VOID ScanTimeout(
 	IN PVOID SystemSpecific3) 
 {
 	RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)FunctionContext;
-
-	DBGPRINT(RT_DEBUG_INFO,("SYNC - Scan Timeout \n"));
 	
+
 	// Do nothing if the driver is starting halt state.
 	// This might happen when timer already been fired before cancel timer with mlmehalt
 	if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS))
@@ -435,9 +472,9 @@ VOID MlmeJoinReqAction(
 				FrameLen += Tmp;
 			}
 			
+
 			MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);
 			MlmeFreeMemory(pAd, pOutBuffer);
-			DBGPRINT(RT_DEBUG_INFO, ("SYNC - send ProbeReq @ channel=%d, Len=%ld\n", pAd->MlmeAux.Channel, FrameLen));
 		}
     } while (FALSE);
 
@@ -466,11 +503,6 @@ VOID MlmeStartReqAction(
 	LARGE_INTEGER				TimeStamp;
 	BOOLEAN Privacy;
 	USHORT Status;
-#ifdef	SINGLE_ADHOC_LINKUP
-	ULONG	Bssidx;
-	CF_PARM CfParm;
-	CfParm.bValid = FALSE;
-#endif
 
 	// Init Variable IE structure
 	pVIE = (PNDIS_802_11_VARIABLE_IEs) VarIE;
@@ -504,7 +536,6 @@ VOID MlmeStartReqAction(
 		pAd->MlmeAux.AtimWin           = pAd->StaCfg.AtimWin;
 		pAd->MlmeAux.Channel           = pAd->CommonCfg.Channel;
 
-		// TODO: if consider 40MHz BW in Adhoc
 		pAd->CommonCfg.CentralChannel  = pAd->CommonCfg.Channel;
 		pAd->MlmeAux.CentralChannel    = pAd->CommonCfg.CentralChannel;
 
@@ -514,6 +545,7 @@ VOID MlmeStartReqAction(
 		pAd->MlmeAux.ExtRateLen = pAd->CommonCfg.ExtRateLen;
 		NdisMoveMemory(pAd->MlmeAux.ExtRate, pAd->CommonCfg.ExtRate, MAX_LEN_OF_SUPPORTED_RATES);
 		RTMPCheckRates(pAd, pAd->MlmeAux.ExtRate, &pAd->MlmeAux.ExtRateLen);
+#ifdef DOT11_N_SUPPORT
 		if (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)
 		{
 			RTMPUpdateHTIE(&pAd->CommonCfg.DesiredHtPhy, &pAd->StaCfg.DesiredHtPhyInfo.MCSSet[0], &pAd->MlmeAux.HtCapability, &pAd->MlmeAux.AddHtInfo);
@@ -522,6 +554,7 @@ VOID MlmeStartReqAction(
 			DBGPRINT(RT_DEBUG_TRACE, ("SYNC -pAd->StaActive.SupportedHtPhy.bHtEnable = TRUE\n"));
 		}
 		else
+#endif // DOT11_N_SUPPORT //
 		{
 			pAd->MlmeAux.HtCapabilityLen = 0;
 			pAd->StaActive.SupportedPhyInfo.bHtEnable = FALSE;
@@ -537,19 +570,6 @@ VOID MlmeStartReqAction(
 		DBGPRINT(RT_DEBUG_TRACE, ("SYNC - MlmeStartReqAction(ch= %d,sup rates= %d, ext rates=%d)\n",
 			pAd->MlmeAux.Channel, pAd->MlmeAux.SupRateLen, pAd->MlmeAux.ExtRateLen));
 
-#ifdef	SINGLE_ADHOC_LINKUP
-		// Add itself as the entry within BSS table
-		Bssidx = BssTableSearch(&pAd->ScanTab, pAd->MlmeAux.Bssid, pAd->MlmeAux.Channel);
-		if (Bssidx == BSS_NOT_FOUND)
-		{
-			Bssidx = BssTableSetEntry(pAd, &pAd->ScanTab, pAd->MlmeAux.Bssid,Ssid, SsidLen, pAd->MlmeAux.BssType, 
-				pAd->MlmeAux.BeaconPeriod, &CfParm, pAd->MlmeAux.AtimWin, pAd->MlmeAux.CapabilityInfo, 
-				&pAd->MlmeAux.HtCapability, pAd->MlmeAux.HtCapabilityLen, &pAd->CommonCfg.AddHTInfo, SIZE_ADD_HT_INFO_IE, pAd->MlmeAux.NewExtChannelOffset,
-				pAd->MlmeAux.SupRate, pAd->MlmeAux.SupRateLen, pAd->MlmeAux.ExtRate, pAd->MlmeAux.ExtRateLen,
-				&pAd->MlmeAux.SupportedHtPhy, pAd->MlmeAux.Channel, pAd->BbpRssiToDbmDelta - 30, TimeStamp, 0, NULL, NULL, 0, pVIE);
-		}
-#endif
-
 		pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;
 		Status = MLME_SUCCESS;
 		MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_START_CONF, 2, &Status);
@@ -594,7 +614,7 @@ VOID PeerBeaconAtScanAction(
 	NDIS_802_11_VARIABLE_IEs	*pVIE = NULL;
 	HT_CAPABILITY_IE		HtCapability;
 	ADD_HT_INFO_IE		AddHtInfo;	// AP might use this additional ht info IE 
-	UCHAR			HtCapabilityLen, PreNHtCapabilityLen;
+	UCHAR			HtCapabilityLen = 0, PreNHtCapabilityLen = 0;
 	UCHAR			AddHtInfoLen;
 	UCHAR			NewExtChannelOffset = 0xff;
 	
@@ -602,9 +622,10 @@ VOID PeerBeaconAtScanAction(
 	// Init Variable IE structure
 	pVIE = (PNDIS_802_11_VARIABLE_IEs) VarIE;
 	pVIE->Length = 0;
+#ifdef DOT11_N_SUPPORT
     RTMPZeroMemory(&HtCapability, sizeof(HtCapability));
 	RTMPZeroMemory(&AddHtInfo, sizeof(ADD_HT_INFO_IE));
-
+#endif // DOT11_N_SUPPORT //
 
 	if (PeerBeaconAndProbeRspSanity(pAd, 
 								Elem->Msg, 
@@ -655,9 +676,11 @@ VOID PeerBeaconAtScanAction(
 
 		Rssi = RTMPMaxRssi(pAd, ConvertToRssi(pAd, Elem->Rssi0, RSSI_0), ConvertToRssi(pAd, Elem->Rssi1, RSSI_1), ConvertToRssi(pAd, Elem->Rssi2, RSSI_2));
 
+
+#ifdef DOT11_N_SUPPORT
 		if ((HtCapabilityLen > 0) || (PreNHtCapabilityLen > 0))
 			HtCapabilityLen = SIZE_HT_CAP_IE;
-
+#endif // DOT11_N_SUPPORT //
 		if ((pAd->StaCfg.CCXReqType != MSRN_TYPE_UNUSED) && (Channel == pAd->StaCfg.CCXScanChannel))
 		{
 			Idx = BssTableSetEntry(pAd, &pAd->StaCfg.CCXBssTab, Bssid, Ssid, SsidLen, BssType, BeaconPeriod, 
@@ -679,6 +702,7 @@ VOID PeerBeaconAtScanAction(
 						  &CfParm, AtimWin, CapabilityInfo, SupRate, SupRateLen, ExtRate, ExtRateLen,  &HtCapability,
 						 &AddHtInfo, HtCapabilityLen, AddHtInfoLen, NewExtChannelOffset, Channel, Rssi, TimeStamp, CkipFlag, 
 						 &EdcaParm, &QosCapability, &QbssLoad, LenVIE, pVIE);
+#ifdef DOT11_N_SUPPORT
 #ifdef DOT11N_DRAFT3
 			if (pAd->ChannelList[pAd->CommonCfg.ChannelListIdx].bEffectedChannel == TRUE)
 			{
@@ -687,7 +711,7 @@ VOID PeerBeaconAtScanAction(
 				TriEventTableSetEntry(pAd, &pAd->CommonCfg.TriggerEventTab, Bssid, &HtCapability, HtCapabilityLen, RegClass, Channel);
 			}
 #endif // DOT11N_DRAFT3 //
-
+#endif // DOT11_N_SUPPORT //
 			if (Idx != BSS_NOT_FOUND)
 			{
 				NdisMoveMemory(pAd->ScanTab.BssEntry[Idx].PTSF, &Elem->Msg[24], 4);
@@ -732,9 +756,12 @@ VOID PeerBeaconAtJoinAction(
 	ULONG         Idx;
 	HT_CAPABILITY_IE		HtCapability;
 	ADD_HT_INFO_IE		AddHtInfo;	// AP might use this additional ht info IE 
-	UCHAR			HtCapabilityLen, PreNHtCapabilityLen;
+	UCHAR				HtCapabilityLen = 0, PreNHtCapabilityLen = 0;
 	UCHAR			AddHtInfoLen;
-	UCHAR			NewExtChannelOffset = 0xff, CentralChannel;
+	UCHAR			NewExtChannelOffset = 0xff;
+#ifdef DOT11_N_SUPPORT
+	UCHAR			CentralChannel;
+#endif // DOT11_N_SUPPORT //
 
 	// Init Variable IE structure
 	pVIE = (PNDIS_802_11_VARIABLE_IEs) VarIE;
@@ -784,7 +811,7 @@ VOID PeerBeaconAtJoinAction(
 								pVIE)) 
 	{
 		// Disqualify 11b only adhoc when we are in 11g only adhoc mode
-		if ((BssType == BSS_ADHOC) && (pAd->StaCfg.AdhocMode == 2) && ((SupRateLen+ExtRateLen)< 12))
+		if ((BssType == BSS_ADHOC) && (pAd->CommonCfg.PhyMode == PHY_11G) && ((SupRateLen+ExtRateLen)< 12))
 			return;
 
 		// BEACON from desired BSS/IBSS found. We should be able to decide most
@@ -848,15 +875,19 @@ VOID PeerBeaconAtJoinAction(
 			pAd->MlmeAux.ExtRateLen = ExtRateLen;
 			NdisMoveMemory(pAd->MlmeAux.ExtRate, ExtRate, ExtRateLen);
 			RTMPCheckRates(pAd, pAd->MlmeAux.ExtRate, &pAd->MlmeAux.ExtRateLen);
+
+            NdisZeroMemory(pAd->StaActive.SupportedPhyInfo.MCSSet, 16);
+#ifdef DOT11_N_SUPPORT
 			pAd->MlmeAux.NewExtChannelOffset = NewExtChannelOffset;
 			pAd->MlmeAux.HtCapabilityLen = HtCapabilityLen;
-            NdisZeroMemory(pAd->StaActive.SupportedPhyInfo.MCSSet, 16);
+
 			// filter out un-supported ht rates
 			if (((HtCapabilityLen > 0) || (PreNHtCapabilityLen > 0)) && (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED))
 			{
 				RTMPZeroMemory(&pAd->MlmeAux.HtCapability, SIZE_HT_CAP_IE);
    				RTMPMoveMemory(&pAd->MlmeAux.AddHtInfo, &AddHtInfo, SIZE_ADD_HT_INFO_IE);
-                // StaActive.SupportedHtPhy.MCSSet stores Peer AP's 11n Rx capability
+				
+				// StaActive.SupportedHtPhy.MCSSet stores Peer AP's 11n Rx capability
 				NdisMoveMemory(pAd->StaActive.SupportedPhyInfo.MCSSet, HtCapability.MCSSet, 16);
 				pAd->MlmeAux.NewExtChannelOffset = NewExtChannelOffset;
 				pAd->MlmeAux.HtCapabilityLen = SIZE_HT_CAP_IE;
@@ -881,7 +912,7 @@ VOID PeerBeaconAtJoinAction(
 		 				CentralChannel = AddHtInfo.ControlChan + 2;
 		 			}
                     
-                    // Check Error .
+					// Check Error .
 					if (pAd->MlmeAux.CentralChannel != CentralChannel)
 		 				DBGPRINT(RT_DEBUG_ERROR, ("PeerBeaconAtJoinAction HT===>Beacon Central Channel = %d, Control Channel = %d. Mlmeaux CentralChannel = %d\n", CentralChannel, AddHtInfo.ControlChan, pAd->MlmeAux.CentralChannel));
 
@@ -891,6 +922,7 @@ VOID PeerBeaconAtJoinAction(
 				
 			}
 			else
+#endif // DOT11_N_SUPPORT //
 			{
    				// To prevent error, let legacy AP must have same CentralChannel and Channel.
 				if ((HtCapabilityLen == 0) && (PreNHtCapabilityLen == 0))
@@ -902,9 +934,13 @@ VOID PeerBeaconAtJoinAction(
 			}
 
 			RTMPUpdateMlmeRate(pAd);
-	
+
 			// copy QOS related information
-			if ((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)|| (pAd->CommonCfg.bWmmCapable))
+			if ((pAd->CommonCfg.bWmmCapable)
+#ifdef DOT11_N_SUPPORT
+				 || (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)
+#endif // DOT11_N_SUPPORT //
+				)
 			{
 				NdisMoveMemory(&pAd->MlmeAux.APEdcaParm, &EdcaParm, sizeof(EDCA_PARM));
 				NdisMoveMemory(&pAd->MlmeAux.APQbssLoad, &QbssLoad, sizeof(QBSS_LOAD_PARM));
@@ -918,7 +954,7 @@ VOID PeerBeaconAtJoinAction(
 			}
 			
 			DBGPRINT(RT_DEBUG_TRACE, ("SYNC - after JOIN, SupRateLen=%d, ExtRateLen=%d\n", 
-				pAd->MlmeAux.SupRateLen, pAd->MlmeAux.ExtRateLen));
+										pAd->MlmeAux.SupRateLen, pAd->MlmeAux.ExtRateLen));
 
 #ifdef LEAP_SUPPORT
 			// Update CkipFlag
@@ -977,6 +1013,7 @@ VOID PeerBeacon(
 	QBSS_LOAD_PARM  QbssLoad;
 	QOS_CAPABILITY_PARM QosCapability;
 	ULONG           RalinkIe;
+	// New for WPA security suites
 	UCHAR						VarIE[MAX_VIE_LEN];		// Total VIE length = MAX_VIE_LEN - -5
 	NDIS_802_11_VARIABLE_IEs	*pVIE = NULL;
 	HT_CAPABILITY_IE		HtCapability;
@@ -985,6 +1022,7 @@ VOID PeerBeacon(
 	UCHAR			AddHtInfoLen;
 	UCHAR			NewExtChannelOffset = 0xff;
 
+
 #ifdef RALINK_ATE
     if (ATE_ON(pAd))
     {
@@ -992,7 +1030,8 @@ VOID PeerBeacon(
     }
 #endif // RALINK_ATE //
 
-	if (!(INFRA_ON(pAd) || ADHOC_ON(pAd)))
+	if (!(INFRA_ON(pAd) || ADHOC_ON(pAd)
+		))
 		return;
 
 	// Init Variable IE structure
@@ -1049,6 +1088,7 @@ VOID PeerBeacon(
 		is_my_bssid = MAC_ADDR_EQUAL(Bssid, pAd->CommonCfg.Bssid)? TRUE : FALSE;
 		is_my_ssid = SSID_EQUAL(Ssid, SsidLen, pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen)? TRUE:FALSE;
 
+
 		// ignore BEACON not for my SSID
 		if ((! is_my_ssid) && (! is_my_bssid))
 			return;
@@ -1057,12 +1097,14 @@ VOID PeerBeacon(
 		if (pAd->Mlme.CntlMachine.CurrState == CNTL_WAIT_DISASSOC)
 			return;
 		
+#ifdef DOT11_N_SUPPORT
 		// Copy Control channel for this BSSID.		
 		if (AddHtInfoLen != 0)
 			Channel = AddHtInfo.ControlChan;
 
 		if ((HtCapabilityLen > 0) || (PreNHtCapabilityLen > 0))
 			HtCapabilityLen = SIZE_HT_CAP_IE;
+#endif // DOT11_N_SUPPORT //
 
 		//
 		// Housekeeping "SsidBssTab" table for later-on ROAMing usage. 
@@ -1082,14 +1124,20 @@ VOID PeerBeacon(
 			NdisMoveMemory(pAd->ScanTab.BssEntry[Bssidx].PTSF, &Elem->Msg[24], 4);
 			NdisMoveMemory(&pAd->ScanTab.BssEntry[Bssidx].TTSF[0], &Elem->TimeStamp.u.LowPart, 4);
 			NdisMoveMemory(&pAd->ScanTab.BssEntry[Bssidx].TTSF[4], &Elem->TimeStamp.u.LowPart, 4);
+
+			
 			
-			DBGPRINT(RT_DEBUG_INFO, ("SYNC - New AP added to SsidBssTab[%ld], RSSI=%d, MAC=%02x:%02x:%02x:%02x:%02x:%02x\n", 
-				Bssidx, RealRssi, Bssid[0], Bssid[1], Bssid[2], Bssid[3], Bssid[4], Bssid[5]));
 		}
 
 		if ((pAd->CommonCfg.bIEEE80211H == 1) && (NewChannel != 0) && (Channel != NewChannel))
 		{
+			// Switching to channel 1 can prevent from rescanning the current channel immediately (by auto reconnection).
+			// In addition, clear the MLME queue and the scan table to discard the RX packets and previous scanning results.
+			AsicSwitchChannel(pAd, 1, FALSE);
+			AsicLockChannel(pAd, 1);
 		    LinkDown(pAd, FALSE);
+			MlmeQueueInit(&pAd->Mlme.Queue);
+			BssTableInit(&pAd->ScanTab);
 		    RTMPusecDelay(1000000);		// use delay to prevent STA do reassoc
 					
 			// channel sanity check
@@ -1121,8 +1169,6 @@ VOID PeerBeacon(
 			// Add the safeguard against the mismatch of adhoc wep status
 			if (pAd->StaCfg.WepStatus != pAd->ScanTab.BssEntry[Bssidx].WepStatus)
 			{
-				DBGPRINT(RT_DEBUG_TRACE, ("SYNC - Not matched wep status %d %d\n", pAd->StaCfg.WepStatus, pAd->ScanTab.BssEntry[Bssidx].WepStatus));
-				DBGPRINT(RT_DEBUG_TRACE, ("bssid=%s\n", pAd->ScanTab.BssEntry[Bssidx].Bssid));
 				return;
 			}
 			
@@ -1146,10 +1192,7 @@ VOID PeerBeacon(
 			}
 		}
 
-		DBGPRINT(RT_DEBUG_INFO, ("SYNC - PeerBeacon from %02x:%02x:%02x:%02x:%02x:%02x - Dtim=%d/%d, Rssi=%02x\n", 
-			Bssid[0], Bssid[1], Bssid[2], Bssid[3], Bssid[4], Bssid[5], 
-			DtimCount, DtimPeriod, RealRssi));
-
+	
 		NdisGetSystemUpTime(&Now);
 		pBss = &pAd->ScanTab.BssEntry[Bssidx];
 		pBss->Rssi = RealRssi;       // lastest RSSI
@@ -1172,10 +1215,6 @@ VOID PeerBeacon(
 			RxWI.RSSI2 = Elem->Rssi2;
 
 			Update_Rssi_Sample(pAd, &pAd->StaCfg.RssiSample, &RxWI);
-
-			DBGPRINT(RT_DEBUG_INFO, ("SYNC - my beacon from %02x:%02x:%02x:%02x:%02x:%02x - Dtim=%d/%d, Rssi=%d, Rssi2=%d, Rssi3=%d\n", 
-				Bssid[0], Bssid[1], Bssid[2], Bssid[3], Bssid[4], Bssid[5], DtimCount, DtimPeriod, pAd->StaCfg.RssiSample.LastRssi0, pAd->StaCfg.RssiSample.LastRssi1, pAd->StaCfg.RssiSample.LastRssi2));
-
 			if (AironetCellPowerLimit != 0xFF)
 			{
 				//
@@ -1198,30 +1237,98 @@ VOID PeerBeacon(
 			// in MlmePeriodicExec()
 			if (ADHOC_ON(pAd) && (CAP_IS_IBSS_ON(CapabilityInfo)))   
 			{
-				 BOOLEAN	bRestart;
-                BOOLEAN	bnRestart;
-                
-				// this timestamp is for MlmePeriodicExec() to check if all 11B peers have left
-				if (SupRateLen+ExtRateLen <= 4)				
-					pAd->StaCfg.Last11bBeaconRxTime = Now;
+				BOOLEAN	bRestart;
+                BOOLEAN	bnRestart;                					
                 
 				bRestart = FALSE;
                 bnRestart = FALSE;
-				if ((SupRateLen+ExtRateLen <= 4) && (pAd->CommonCfg.MaxTxRate > RATE_11))
+	
+				do 
 				{
-					DBGPRINT(RT_DEBUG_TRACE, ("SYNC - 11b peer joined. down-grade to 11b TX rates \n"));
-					NdisMoveMemory(pAd->StaActive.SupRate, SupRate, MAX_LEN_OF_SUPPORTED_RATES);
-					pAd->StaActive.SupRateLen = SupRateLen;
-					NdisMoveMemory(pAd->StaActive.ExtRate, ExtRate, MAX_LEN_OF_SUPPORTED_RATES);
-					pAd->StaActive.ExtRateLen = ExtRateLen;
-                    pAd->StaCfg.AdhocBOnlyJoined = TRUE;
-					bRestart = TRUE;
-				}
-				
-				// Update Ht Phy. 
-				if ((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED))
-					;
-				
+					if ((SupRateLen+ExtRateLen <= 4) && (pAd->CommonCfg.MaxTxRate > RATE_11))
+					{
+						if (pAd->StaCfg.AdhocBOnlyJoined == FALSE)
+						{
+							DBGPRINT(RT_DEBUG_TRACE, ("SYNC - 11b peer joined. down-grade to 11b TX rates \n"));
+							bRestart = TRUE;											
+							NdisMoveMemory(pAd->StaActive.SupRate, SupRate, MAX_LEN_OF_SUPPORTED_RATES);
+							pAd->StaActive.SupRateLen = SupRateLen;
+							NdisMoveMemory(pAd->StaActive.ExtRate, ExtRate, MAX_LEN_OF_SUPPORTED_RATES);
+							pAd->StaActive.ExtRateLen = ExtRateLen;
+							pAd->StaCfg.AdhocBOnlyJoined = TRUE;
+							pAd->StaActive.SupportedPhyInfo.bHtEnable = FALSE;
+							AsicSetEdcaParm(pAd, NULL);
+						}
+						
+						// this timestamp is for MlmePeriodicExec() to check if all 11B peers have left
+						pAd->StaCfg.Last11bBeaconRxTime = Now;
+						break;
+					}
+#ifdef DOT11_N_SUPPORT					
+					// Update Ht Phy. 
+					if ((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED))
+					{						
+						if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED) &&
+							!pAd->StaCfg.AdhocBGJoined &&
+							!pAd->StaCfg.AdhocBOnlyJoined)
+							AdhocTurnOnQos(pAd);
+						
+						// Handle rate switch issue when Adhoc mode
+						if ((SupRateLen+ExtRateLen >= 8) && (HtCapability.MCSSet[0] == 0) && (HtCapability.MCSSet[1] == 0))
+						{
+							if (pAd->StaCfg.AdhocBGJoined == FALSE)
+							{
+								DBGPRINT(RT_DEBUG_TRACE, ("SYNC - 11g peer joined. down-grade to 11g TX rates \n"));
+								bRestart = TRUE;
+								NdisMoveMemory(pAd->StaActive.SupRate, SupRate, MAX_LEN_OF_SUPPORTED_RATES);
+								pAd->StaActive.SupRateLen = SupRateLen;
+								NdisMoveMemory(pAd->StaActive.ExtRate, ExtRate, MAX_LEN_OF_SUPPORTED_RATES);
+								pAd->StaActive.ExtRateLen = ExtRateLen;
+								pAd->StaCfg.AdhocBGJoined = TRUE;
+								pAd->StaActive.SupportedPhyInfo.bHtEnable = FALSE;
+								AsicSetEdcaParm(pAd, NULL);
+							}
+							
+							// this timestamp is for MlmePeriodicExec() to check if all 11g peers have left
+							pAd->StaCfg.Last11gBeaconRxTime = Now;							
+							break;
+						}
+						else if (!pAd->StaCfg.AdhocBGJoined &&
+								 !pAd->StaCfg.AdhocBOnlyJoined &&
+								 (pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40) &&
+								 (HtCapability.HtCapInfo.ChannelWidth == BW_20))
+						{
+							if (pAd->StaCfg.Adhoc20NJoined == FALSE)
+							{
+								UCHAR	ByteValue = 0;
+								
+								pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel;
+								
+								pAd->StaCfg.Adhoc20NJoined = TRUE;
+								NdisMoveMemory(&pAd->MlmeAux.HtCapability, &HtCapability, SIZE_HT_CAP_IE);
+								if (AddHtInfoLen != 0)
+									NdisMoveMemory(&pAd->MlmeAux.AddHtInfo, &AddHtInfo, AddHtInfoLen);
+								NdisMoveMemory(pAd->StaActive.SupportedPhyInfo.MCSSet, HtCapability.MCSSet, 16);
+
+								RTMPCheckHt(pAd, Elem->Wcid, &pAd->MlmeAux.HtCapability, &pAd->MlmeAux.AddHtInfo);
+								COPY_HTSETTINGS_FROM_MLME_AUX_TO_ACTIVE_CFG(pAd);
+								pAd->StaActive.SupportedPhyInfo.bHtEnable = TRUE;
+								bRestart = TRUE;
+								bnRestart = TRUE;
+							}
+							// this timestamp is for MlmePeriodicExec() to check if all 20MHz N peers have left
+							pAd->StaCfg.Last20NBeaconRxTime = Now;
+						}
+						
+					}
+					else
+#endif // DOT11_N_SUPPORT //
+					{
+						RTMPZeroMemory(&pAd->MlmeAux.HtCapability, SIZE_HT_CAP_IE);
+						RTMPZeroMemory(&pAd->MlmeAux.AddHtInfo, SIZE_ADD_HT_INFO_IE);
+					}
+				}while (FALSE);
+
 				// If peer Adhoc is legacy mode, I don't need to call MlmeUpdateHtTxRates no matter I support HT or not
 				if ((bRestart == TRUE) && (bnRestart == FALSE))
 				{
@@ -1229,6 +1336,7 @@ VOID PeerBeacon(
 					MakeIbssBeacon(pAd);        // re-build BEACON frame
 					AsicEnableIbssSync(pAd);    // copy to on-chip memory
 				}
+#ifdef DOT11_N_SUPPORT
 				else if ((bRestart == TRUE) && (bnRestart == TRUE))
 				{
 					MlmeUpdateTxRates(pAd, FALSE, BSS0);
@@ -1236,6 +1344,106 @@ VOID PeerBeacon(
 					MakeIbssBeacon(pAd);        // re-build BEACON frame
 					AsicEnableIbssSync(pAd);    // copy to on-chip memory
 				}
+#endif // DOT11_N_SUPPORT //
+
+				// At least another peer in this IBSS, declare MediaState as CONNECTED
+				if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))
+				{
+					OPSTATUS_SET_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED); 
+
+					pAd->IndicateMediaState = NdisMediaStateConnected;
+					RTMP_IndicateMediaState(pAd);
+	                pAd->ExtraInfo = GENERAL_LINK_UP;
+					AsicSetBssid(pAd, pAd->CommonCfg.Bssid);
+					
+					// 2003/03/12 - john
+					// Make sure this entry in "ScanTab" table, thus complies to Microsoft's policy that
+					// "site survey" result should always include the current connected network. 
+					//
+					Bssidx = BssTableSearch(&pAd->ScanTab, Bssid, Channel);
+					if (Bssidx == BSS_NOT_FOUND)
+					{
+						Bssidx = BssTableSetEntry(pAd, &pAd->ScanTab, Bssid, Ssid, SsidLen, BssType, BeaconPeriod, 
+									&CfParm, AtimWin, CapabilityInfo, SupRate, SupRateLen, ExtRate, ExtRateLen, &HtCapability,
+									&AddHtInfo, HtCapabilityLen, AddHtInfoLen, NewExtChannelOffset, Channel, RealRssi, TimeStamp, 0, 
+									&EdcaParm, &QosCapability, &QbssLoad, LenVIE, pVIE);
+					}
+					DBGPRINT(RT_DEBUG_TRACE, ("ADHOC  fOP_STATUS_MEDIA_STATE_CONNECTED.\n"));
+				}	
+
+				// Ad-hoc mode is using MAC address as BA session. So we need to continuously find newly joined adhoc station by receiving beacon.
+				// To prevent always check this, we use wcid == RESERVED_WCID to recognize it as newly joined adhoc station.
+				if (ADHOC_ON(pAd) && (Elem->Wcid == RESERVED_WCID))
+				{
+					UCHAR	idx;
+					MAC_TABLE_ENTRY *pEntry;
+					
+					// look up the existing table
+					pEntry = MacTableLookup(pAd, Addr2);				
+					if (pEntry == NULL)
+					{
+						// Another adhoc joining, add to our MAC table. 
+						pEntry = MacTableInsertEntry(pAd, Addr2, BSS0, FALSE);	 			
+						if (pEntry)
+						{
+							pEntry->Sst = SST_ASSOC;
+							idx = pAd->StaCfg.DefaultKeyId;	
+							// After InsertEntry, Write to ASIC on-chip table.
+							RT28XX_STA_SECURITY_INFO_ADD(pAd, BSS0, idx, pEntry);
+							DBGPRINT(RT_DEBUG_TRACE, ("ADHOC %x:%x:%x:%x:%x:%x  join in.Entry=%d\n", Addr2[0],Addr2[1],Addr2[2],Addr2[3],Addr2[4],Addr2[5], pEntry->Aid));
+
+							pEntry->HTPhyMode.word = pAd->StaCfg.HTPhyMode.word;
+	                        if (HtCapabilityLen <= 0)
+	                        {
+	                            pEntry->HTPhyMode.field.STBC = 0;
+	                            pEntry->HTPhyMode.field.BW = 0;
+	                            pEntry->HTPhyMode.field.ShortGI = 0;
+	                            if ((SupRateLen+ExtRateLen <= 4) && (pAd->CommonCfg.Channel <= 14))
+	        					{
+	        						pEntry->HTPhyMode.field.MODE = MODE_CCK;
+	        					}
+	        					else
+	        					{
+	        						pEntry->HTPhyMode.field.MODE = MODE_OFDM;
+	        					}
+								MlmeUpdateTxRates(pAd, FALSE, 0);
+	                        }
+#ifdef DOT11_N_SUPPORT
+							else
+							{
+								MlmeUpdateTxRates(pAd, FALSE, 0);
+								MlmeUpdateHtTxRates(pAd, BSS0);
+							}
+#endif // DOT11_N_SUPPORT //
+
+#ifdef WPA_SUPPLICANT_SUPPORT
+#ifndef NATIVE_WPA_SUPPLICANT_SUPPORT
+	                        if (pAd->StaCfg.WpaSupplicantUP)
+	                        {
+	                            union iwreq_data    wrqu;
+
+	                            SendAssocIEsToWpaSupplicant(pAd);
+	                            memset(&wrqu, 0, sizeof(wrqu));
+	                            wrqu.data.flags = RT_ASSOC_EVENT_FLAG;
+	                            wireless_send_event(pAd->net_dev, IWEVCUSTOM, &wrqu, NULL);
+	                        }
+#endif // NATIVE_WPA_SUPPLICANT_SUPPORT //
+#endif // WPA_SUPPLICANT_SUPPORT //                    
+
+#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT
+	                        {
+	                            union iwreq_data    wrqu;
+	                            wext_notify_event_assoc(pAd);
+	                            
+	                            memset(wrqu.ap_addr.sa_data, 0, MAC_ADDR_LEN);
+	                            memcpy(wrqu.ap_addr.sa_data, pAd->MlmeAux.Bssid, MAC_ADDR_LEN);
+	                            wireless_send_event(pAd->net_dev, SIOCGIWAP, &wrqu, NULL);
+	                            
+	                        }
+#endif // NATIVE_WPA_SUPPLICANT_SUPPORT //
+						}
+					}
+				}
 			}
 
 			if (INFRA_ON(pAd))
@@ -1274,6 +1482,7 @@ VOID PeerBeacon(
 					DBGPRINT(RT_DEBUG_WARN, ("SYNC - AP changed B/G protection to %d\n", bUseBGProtection));
 				}
 				
+#ifdef DOT11_N_SUPPORT
 				// check Ht protection mode. and adhere to the Non-GF device indication by AP.
 				if ((AddHtInfoLen != 0) && 
 					((AddHtInfo.AddHtInfo2.OperaionMode != pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode) ||
@@ -1290,6 +1499,7 @@ VOID PeerBeacon(
 
 					DBGPRINT(RT_DEBUG_TRACE, ("SYNC - AP changed N OperaionMode to %d\n", pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode));
 				}
+#endif // DOT11_N_SUPPORT //
 				
 				if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED) && 
 					ERP_IS_USE_BARKER_PREAMBLE(Erp))
@@ -1324,17 +1534,11 @@ VOID PeerBeacon(
 				//  5. otherwise, put PHY back to sleep to save battery.
 				if (MessageToMe)
 				{
-					DBGPRINT(RT_DEBUG_INFO, ("SYNC - AP backlog unicast-to-me, stay AWAKE, send PSPOLL\n"));
 #ifdef RT2860
 					if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE))
 					{
 						RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, pAd->StaCfg.BBPR3);
 						// Turn clk to 80Mhz.
-    					if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_CLKSELECT_40MHZ))
-						{               
-							RTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, 0xe80);
-							OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_CLKSELECT_40MHZ);
-						}
 					}
 #endif // RT2860 //
 					if (pAd->CommonCfg.bAPSDCapable && pAd->CommonCfg.APEdcaParm.bAPSDCapable &&
@@ -1351,15 +1555,8 @@ VOID PeerBeacon(
 					if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE))
 					{
 						RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, pAd->StaCfg.BBPR3);
-						if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_CLKSELECT_40MHZ))
-						{ 
-							// Turn clk to 80Mhz.  
-							RTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, 0xe80);
-							OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_CLKSELECT_40MHZ);
-						}
 					}
 #endif // RT2860 //
-					DBGPRINT(RT_DEBUG_INFO, ("SYNC - AP backlog broadcast/multicast, stay AWAKE\n"));
 				} 
 				else if ((pAd->TxSwQueue[QID_AC_BK].Number != 0)													||
 						(pAd->TxSwQueue[QID_AC_BE].Number != 0)														||
@@ -1373,17 +1570,10 @@ VOID PeerBeacon(
 				{
 					// TODO: consider scheduled HCCA. might not be proper to use traditional DTIM-based power-saving scheme
 					// can we cheat here (i.e. just check MGMT & AC_BE) for better performance?
-					DBGPRINT(RT_DEBUG_INFO, ("SYNC - outgoing frame in TxRing/MgmtRing, stay AWAKE\n"));
 #ifdef RT2860
 					if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE))
 					{
 						RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, pAd->StaCfg.BBPR3);
-						if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_CLKSELECT_40MHZ))
-						{ 
-							// Turn clk to 80Mhz.  
-							RTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, 0xe80);
-							OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_CLKSELECT_40MHZ);
-						}
 					}
 #endif // RT2860 //                    
 				}
@@ -1398,109 +1588,12 @@ VOID PeerBeacon(
 					if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM) && (TbttNumToNextWakeUp > NextDtim))
 						TbttNumToNextWakeUp = NextDtim;
 
-					DBGPRINT(RT_DEBUG_INFO, ("SYNC - PHY sleeps for %d TBTT, Dtim=%d/%d\n", TbttNumToNextWakeUp, DtimCount, DtimPeriod));
 					if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))
 					{
 						AsicSleepThenAutoWakeup(pAd, TbttNumToNextWakeUp);
 					}
 				}
 			}
-#ifndef	SINGLE_ADHOC_LINKUP
-			// At least another peer in this IBSS, declare MediaState as CONNECTED
-			if (ADHOC_ON(pAd) && 
-				!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED) && ((CapabilityInfo&0x1)==0))
-			{
-				OPSTATUS_SET_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED); 
-
-				pAd->IndicateMediaState = NdisMediaStateConnected;
-				RTMP_IndicateMediaState(pAd);
-                pAd->ExtraInfo = GENERAL_LINK_UP;
-				AsicSetBssid(pAd, pAd->CommonCfg.Bssid);
-				// 2003/03/12 - john
-				// Make sure this entry in "ScanTab" table, thus complies to Microsoft's policy that
-				// "site survey" result should always include the current connected network. 
-				//
-				Bssidx = BssTableSearch(&pAd->ScanTab, Bssid, Channel);
-				if (Bssidx == BSS_NOT_FOUND)
-				{
-					Bssidx = BssTableSetEntry(pAd, &pAd->ScanTab, Bssid, Ssid, SsidLen, BssType, BeaconPeriod, 
-								&CfParm, AtimWin, CapabilityInfo, SupRate, SupRateLen, ExtRate, ExtRateLen, &HtCapability,
-								&AddHtInfo, HtCapabilityLen, AddHtInfoLen, NewExtChannelOffset, Channel, RealRssi, TimeStamp, 0, 
-								&EdcaParm, &QosCapability, &QbssLoad, LenVIE, pVIE);
-				}
-				DBGPRINT(RT_DEBUG_TRACE, ("ADHOC  fOP_STATUS_MEDIA_STATE_CONNECTED.\n"));
-			}	
-			// Ad-hoc mode is using MAC address as BA session. So we need to continuously find newly joined adhoc station by receiving beacon.
-			// To prevent always check this, we use wcid == RESERVED_WCID to recognize it as newly joined adhoc station.
-			if (ADHOC_ON(pAd) && (Elem->Wcid == RESERVED_WCID))
-			{
-				UCHAR	idx;
-				MAC_TABLE_ENTRY *pEntry;
-				
-				// look up the existing table
-				pEntry = MacTableLookup(pAd, Addr2);
-				if (pEntry == NULL)
-				{
-					// Another adhoc joining, add to our MAC table. 
-					pEntry = MacTableInsertEntry(pAd, Addr2, BSS0, FALSE);	 			
-					if (pEntry)
-					{
-						pEntry->Sst = SST_ASSOC;
-						idx = pAd->StaCfg.DefaultKeyId;	
-						// After InsertEntry, Write to ASIC on-chip table.
-						RT28XX_STA_SECURITY_INFO_ADD(pAd, BSS0, idx, pEntry);
-						DBGPRINT(RT_DEBUG_TRACE, ("ADHOC %x:%x:%x:%x:%x:%x  join in.Entry=%d\n", Addr2[0],Addr2[1],Addr2[2],Addr2[3],Addr2[4],Addr2[5], pEntry->Aid));
-
-                        /*if ((pAd->CommonCfg.BACapability.field.AutoBA == TRUE) &&
-                            (HtCapabilityLen > 0))
-						    BAOriSessionSetUp(pAd, pEntry, 0, 0, 2000, FALSE);*/
-
-                        pEntry->HTPhyMode.word = pAd->StaCfg.HTPhyMode.word;
-                        if (HtCapabilityLen <= 0)
-                        {
-                            pEntry->HTPhyMode.field.STBC = 0;
-                            pEntry->HTPhyMode.field.BW = 0;
-                            pEntry->HTPhyMode.field.ShortGI = 0;
-                            if ((SupRateLen+ExtRateLen <= 4) && (pAd->CommonCfg.Channel <= 14))
-        					{
-        						pEntry->HTPhyMode.field.MODE = MODE_CCK;
-        					}
-        					else
-        					{
-        						pEntry->HTPhyMode.field.MODE = MODE_OFDM;
-        					}
-                        }
-						MlmeUpdateTxRates(pAd, FALSE, 0);
-
-#ifdef WPA_SUPPLICANT_SUPPORT
-#ifndef NATIVE_WPA_SUPPLICANT_SUPPORT
-                        if (pAd->StaCfg.WpaSupplicantUP)
-                        {
-                            union iwreq_data    wrqu;
-
-                            SendAssocIEsToWpaSupplicant(pAd);
-                            memset(&wrqu, 0, sizeof(wrqu));
-                            wrqu.data.flags = RT_ASSOC_EVENT_FLAG;
-                            wireless_send_event(pAd->net_dev, IWEVCUSTOM, &wrqu, NULL);
-                        }
-#endif // NATIVE_WPA_SUPPLICANT_SUPPORT //
-#endif // WPA_SUPPLICANT_SUPPORT //                    
-
-#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT
-                        {
-                            union iwreq_data    wrqu;
-                            wext_notify_event_assoc(pAd);
-                            
-                            memset(wrqu.ap_addr.sa_data, 0, MAC_ADDR_LEN);
-                            memcpy(wrqu.ap_addr.sa_data, pAd->MlmeAux.Bssid, MAC_ADDR_LEN);
-                            wireless_send_event(pAd->net_dev, SIOCGIWAP, &wrqu, NULL);
-                            
-                        }
-#endif // NATIVE_WPA_SUPPLICANT_SUPPORT //
-					}
-				}
-			}
-#endif
 		}
 		// not my BSSID, ignore it
 	}
@@ -1519,7 +1612,10 @@ VOID PeerProbeReqAction(
 {
 	UCHAR         Addr2[MAC_ADDR_LEN];
 	CHAR          Ssid[MAX_LEN_OF_SSID];
-	UCHAR           SsidLen, HtLen, AddHtLen, NewExtLen;
+	UCHAR         SsidLen;
+#ifdef DOT11_N_SUPPORT
+	UCHAR		  HtLen, AddHtLen, NewExtLen;
+#endif // DOT11_N_SUPPORT //
 	HEADER_802_11 ProbeRspHdr;
 	NDIS_STATUS   NStatus;
 	PUCHAR        pOutBuffer = NULL;
@@ -1544,9 +1640,6 @@ VOID PeerProbeReqAction(
 				return;
 
 			//pAd->StaCfg.AtimWin = 0;  // ??????
-			DBGPRINT(RT_DEBUG_INFO, ("SYNC - Send PROBE_RSP to %02x:%02x:%02x:%02x:%02x:%02x...\n", 
-				Addr2[0],Addr2[1],Addr2[2],Addr2[3],Addr2[4],Addr2[5] ));
-			MgtMacHeaderInit(pAd, &ProbeRspHdr, SUBTYPE_PROBE_RSP, 0, Addr2, pAd->CommonCfg.Bssid);
 
 			Privacy = (pAd->StaCfg.WepStatus == Ndis802_11Encryption1Enabled) || 
 					  (pAd->StaCfg.WepStatus == Ndis802_11Encryption2Enabled) || 
@@ -1595,6 +1688,7 @@ VOID PeerProbeReqAction(
 						  			END_OF_ARGS);
 				FrameLen += tmp;
 			}
+#ifdef DOT11_N_SUPPORT
 			if (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)
 			{
 				ULONG TmpLen;
@@ -1627,7 +1721,7 @@ VOID PeerProbeReqAction(
 				}
 				FrameLen += TmpLen;
 			}
-
+#endif // DOT11_N_SUPPORT //
 			MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);
 			MlmeFreeMemory(pAd, pOutBuffer);
 		}
@@ -1734,7 +1828,7 @@ VOID EnqueuePsPoll(
     }
 #endif // RALINK_ATE //
 
-	DBGPRINT(RT_DEBUG_INFO, ("SYNC - send PsPoll ...\n"));
+	
 	if (pAd->StaCfg.WindowsPowerMode == Ndis802_11PowerModeLegacy_PSP)
     	pAd->PsPollFrame.FC.PwrMgmt = PWR_SAVE;
 	MiniportMMRequest(pAd, 0, (PUCHAR)&pAd->PsPollFrame, sizeof(PSPOLL_FRAME));
@@ -1777,7 +1871,7 @@ VOID EnqueueProbeRequest(
 
 }
 
-
+#ifdef DOT11_N_SUPPORT
 #ifdef DOT11N_DRAFT3
 VOID BuildEffectedChannelList(
 	IN PRTMP_ADAPTER pAd)
@@ -1857,6 +1951,7 @@ VOID BuildEffectedChannelList(
 	}
 }
 #endif // DOT11N_DRAFT3 //
+#endif // DOT11_N_SUPPORT //
 
 BOOLEAN ScanRunning(
 		IN PRTMP_ADAPTER pAd)
diff --git a/rt2860-1.7.0.0/sta/wpa.c b/rt2860-source-1.8.0.0/sta/wpa.c
similarity index 97%
copy from rt2860-1.7.0.0/sta/wpa.c
copy to rt2860-source-1.8.0.0/sta/wpa.c
index b8ef7db..5933cb7 100644
--- a/rt2860-1.7.0.0/sta/wpa.c
+++ b/rt2860-source-1.8.0.0/sta/wpa.c
@@ -160,7 +160,6 @@ BOOLEAN	WpaMsgTypeSubst(
 			*MsgType = MT2_EAPOLASFAlert;
 			break;
 		default:
-			DBGPRINT(RT_DEBUG_INFO, ("WpaMsgTypeSubst : return FALSE; \n"));	   
 			return FALSE;		
 	}	
 	return TRUE;
@@ -221,19 +220,6 @@ VOID WpaEAPOLKeyAction(
 
 	*((USHORT *)&peerKeyInfo) = cpu2le16(*((USHORT *)&peerKeyInfo));
 
-	// Sanity check, this should only happen in WPA(2)-PSK mode
-	// 0. Debug print all bit information
-	DBGPRINT(RT_DEBUG_INFO, ("KeyInfo Key Description Version %d\n", peerKeyInfo.KeyDescVer));
-	DBGPRINT(RT_DEBUG_INFO, ("KeyInfo Key Type %d\n", peerKeyInfo.KeyType));
-	DBGPRINT(RT_DEBUG_INFO, ("KeyInfo Key Index %d\n", peerKeyInfo.KeyIndex));
-	DBGPRINT(RT_DEBUG_INFO, ("KeyInfo Install %d\n", peerKeyInfo.Install));
-	DBGPRINT(RT_DEBUG_INFO, ("KeyInfo Key Ack %d\n", peerKeyInfo.KeyAck));
-	DBGPRINT(RT_DEBUG_INFO, ("KeyInfo Key MIC %d\n", peerKeyInfo.KeyMic));
-	DBGPRINT(RT_DEBUG_INFO, ("KeyInfo Secure %d\n", peerKeyInfo.Secure));
-	DBGPRINT(RT_DEBUG_INFO, ("KeyInfo Error %d\n", peerKeyInfo.Error));
-	DBGPRINT(RT_DEBUG_INFO, ("KeyInfo Request %d\n", peerKeyInfo.Request));
-	DBGPRINT(RT_DEBUG_INFO, ("KeyInfo EKD_DL %d\n", peerKeyInfo.EKD_DL));
-
 
 	// 1. Check EAPOL frame version and type
 	EapolVr	= (UCHAR) Elem->Msg[LENGTH_802_11+LENGTH_802_1_H];
@@ -506,10 +492,6 @@ VOID	WpaPairMsg1Action(
 	// Save key to PTK entry
 	NdisMoveMemory(pAd->StaCfg.PTK, PTK, LEN_PTK);
 
-
-	// Construct Msg 2
-	pAd->Sequence = ((pAd->Sequence) + 1) & (MAX_SEQ_NUMBER);
-
 	// init 802.3 header and Fill Packet
 	MAKE_802_3_HEADER(Header802_3, pAd->CommonCfg.Bssid, pAd->CurrentAddress, EAPOL);	
 
@@ -662,9 +644,6 @@ VOID Wpa2PairMsg1Action(
 	// Save key to PTK entry
 	NdisMoveMemory(pAd->StaCfg.PTK, PTK, LEN_PTK);
 
-	// Construct Msg 2
-	pAd->Sequence = ((pAd->Sequence) + 1) & (MAX_SEQ_NUMBER);
-
 	// init 802.3 header and Fill Packet
 	MAKE_802_3_HEADER(Header802_3, pAd->CommonCfg.Bssid, pAd->CurrentAddress, EAPOL);	
 
@@ -866,9 +845,6 @@ VOID	WpaPairMsg3Action(
 	if(!NdisEqualMemory(pAd->StaCfg.ANonce, pMsg3->KeyDesc.KeyNonce, LEN_KEY_DESC_NONCE))
 		return;
 
-	// 5. Construct Message 4
-	pAd->Sequence = ((pAd->Sequence) + 1) & (MAX_SEQ_NUMBER);
-
 	// init 802.3 header and Fill Packet
 	MAKE_802_3_HEADER(Header802_3, pAd->CommonCfg.Bssid, pAd->CurrentAddress, EAPOL);	
 
@@ -1126,10 +1102,6 @@ VOID    Wpa2PairMsg3Action(
 							  pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg, 
 							  NULL);
 
-
-	// 6. Construct Message 4
-	pAd->Sequence = ((pAd->Sequence) + 1) & (MAX_SEQ_NUMBER);
-
 	// init 802.3 header and Fill Packet
 	MAKE_802_3_HEADER(Header802_3, pAd->CommonCfg.Bssid, pAd->CurrentAddress, EAPOL);
 
@@ -1438,9 +1410,6 @@ VOID	WpaGroupMsg1Action(
     // Indicate Connected for GUI
     pAd->IndicateMediaState = NdisMediaStateConnected;
 
-	// 4. Construct Group Message 2
-	pAd->Sequence = ((pAd->Sequence) + 1) & (MAX_SEQ_NUMBER);
-
 	// init header and Fill Packet
 	MAKE_802_3_HEADER(Header802_3, pAd->CommonCfg.Bssid, pAd->CurrentAddress, EAPOL);		
 
@@ -1766,10 +1735,6 @@ BOOLEAN ParseKeyData(
 	if (KeyDataLength >= 8)
     {
         pKDE = (PKDE_ENCAP) pMyKeyData;
-        DBGPRINT(RT_DEBUG_INFO, ("pKDE->Type %x \n", pKDE->Type));
-        DBGPRINT(RT_DEBUG_INFO, ("pKDE->Len 0x%x \n", pKDE->Len));
-        DBGPRINT(RT_DEBUG_INFO, ("pKDE->OUI %x %x %x \n", pKDE->OUI[0],pKDE->OUI[1],pKDE->OUI[2]));
-    	DBGPRINT(RT_DEBUG_INFO, ("pKDE->DataType %x \n", pKDE->DataType));
     }
 	else
     {
diff --git a/rt2860-1.7.0.0/tools/Makefile b/rt2860-source-1.8.0.0/tools/Makefile
similarity index 100%
copy from rt2860-1.7.0.0/tools/Makefile
copy to rt2860-source-1.8.0.0/tools/Makefile
diff --git a/rt2860-source-1.8.0.0/tools/bin2h b/rt2860-source-1.8.0.0/tools/bin2h
new file mode 100644
index 0000000..1536fdc
Binary files /dev/null and b/rt2860-source-1.8.0.0/tools/bin2h differ
diff --git a/rt2860-1.7.0.0/tools/bin2h.c b/rt2860-source-1.8.0.0/tools/bin2h.c
similarity index 100%
copy from rt2860-1.7.0.0/tools/bin2h.c
copy to rt2860-source-1.8.0.0/tools/bin2h.c
diff --git a/rt2860-source_1.8.0.0.orig.tar.gz b/rt2860-source_1.8.0.0.orig.tar.gz
new file mode 100644
index 0000000..b00e7e9
Binary files /dev/null and b/rt2860-source_1.8.0.0.orig.tar.gz differ

-- 
rt2860 source for the ralink wireless chip in the eeepc 901.



More information about the Debian-eeepc-devel mailing list