summaryrefslogblamecommitdiffstats
path: root/drivers/staging/rt2860/common/cmm_info.c
blob: 21780578f5562eba8538d328e3583cb3eea536d8 (plain) (tree)
























                                                                          
   
 
                        

                         

                                                                                
 

                                      
 


                                                                                                           
 

                                                                                    
 
                             
 
             
 

                                                                                
                                                               
 



                                                           
                                            
                                

                                                        


                                                                           

                                                        


                                                                           

                                                         


                                                                           

                                                         


                                                                           

                                                         


                                                                           

                                                         


                                                                           

                                                         


                                                                           

                                                         


                                                                           
                                         
                        







                                                            




                                                                           


                                                 

                                
                                       



                                                                           
                                       



                                                                           

                                                          


                                                                           

                                                         


                                                                           

                                                        


                                                                           

                                                        


                                                                           

                                                         


                                                                           

                                                         


                                                                           

                                                         


                                                                           

                                                         


                                                                           

                                                         


                                                                           

                                                         


                                                                           
                                         
                        













                                                                                   





















                                                                                     
                                                                                      
                                              

 
  
                                                                                
 

                                   
 

                                                                              
 

                     
 
                             
 
             
 

                                                                                
                                               
 
 
             
 


                                                                      
                                                      

                                                                                               

                                                         
 

                                                                                               

                                                              
 
                                                                                 
                                                          
 
                                                     



                                                                             
                                                                             
 



                                                       
 

                                                                                
 





                                                                                                
 


                                                                                                           
 

                                                                                    
 
                             
 
             
 






                                                                                       
 


                                            
 

                             
 

                                                                                
                                                                
 
              
                                                                                   
 
                                      
                  


                                                 
                                             
 


                                                                   
 
                              
 
                                       
                                                   


                                                                          
 
                                       
                                                           


                                                                                             
         
 



                                                                              
                     



                                                                                                        

                                              




                                                                                                      








                              







                                                                                                        
                                              



                                                                                           
                                              











                                                                                            





                             







                                                                                                       

                                              








                                                                                                       



                      
         
 

                                                
 




                                                                                
 


                                            
 

                                                                                
                                                                        
 




                                              
 



                                                                                                     
 
                                                  









                                                                

                                                                        
                

                                                                        

         

                                                                  
 


                                                                   
 
                                           
                                                 
                                                               
                                               
                                                            
                                            
                                                           
                                                 
                                                              

                                                         
                                                             
                                                      
                                                            
                                                           
                                                              








                                                                                                      

                                                             
              
                                                   
 
                              










                                                             
                                 



                                                             
         
 

                                                                             

                                                                               
         
 
                                      
                                                                            





                                                                              


                                                                   
                                                                  

                                                                     
                                                              


                                                                 
                                                                     



                                                                 

                                                                                                                                      
                                                                                
                       



                                                                            
 


                                                                             
                




                                                                               
                                                             
                 



                                                                            


                 
                                           



                                                                 
                

                                                       

         
                                            



                                                                       
                




                                                                       
 

                                                                                                      
                                                                      
                                                                 
 
                                                            
                                                        




                                                        
 



                                                       
 



                                                        
 



                                                       
         
                                                         
 


                                            
 

 




                                                                                
 


                                            
 

                                                                                
                                                        
 
                                               

                                              
 
            

                                                                        

                                                                         
                                                                                                     
                              


                        


                                                                              
                       
         
                                                                
 

                                                                           
                                       




                                                                                               
                                   
         
 



                                                                                                           
                                   
         
 

                                          
                                   















                                                                     
                                           







                                                                   
                                 





                                                          
                                           






                                                                   
         
 
                                                                


                                                                   
                                    



                                                

 



                                                                                
 

                                                                          
 

                                                                                

                                                

                                                         
 

                                                                
 














                                                                          
                                                                                                                                                   

                                                            
 
 






                                                                                     



                                                                         
 



                          
 

                 



                                                                                                                            

                                       


                                                                                                           






                                                   
                                         
                                                                       
 
         
                                                  
                                                                        
                    
                                                                      
         
 
                                                
 
                                 
                                                                     
 
                      

                                                                           
                                                                    

                                             
                                                   

                                      
 
                                                                                          
                   
                                               
                            
                   
                                                         
                            
 



                                                                                
 

 






                                                                              
 

                 
 


                                                                              
                              
 











                                                

 
                            
 





















                                                     

 
                                     
 
                                 
 

                                                      
 
                                               

                                                                          
                         
                                                               
                             


                                                                            
 
                               
 
                    

 
                                              
 












                                          

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

#include <linux/sched.h>
#include "../rt_config.h"

/*
	========================================================================

	Routine Description:
		Remove WPA Key process

	Arguments:
		pAd 					Pointer to our adapter
		pBuf							Pointer to the where the key stored

	Return Value:
		NDIS_SUCCESS					Add key successfully

	IRQL = DISPATCH_LEVEL

	Note:

	========================================================================
*/
void RTMPSetDesiredRates(IN PRTMP_ADAPTER pAdapter, long Rates)
{
	NDIS_802_11_RATES aryRates;

	memset(&aryRates, 0x00, sizeof(NDIS_802_11_RATES));
	switch (pAdapter->CommonCfg.PhyMode) {
	case PHY_11A:		/* A only */
		switch (Rates) {
		case 6000000:	/*6M */
			aryRates[0] = 0x0c;	/* 6M */
			pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
			    MCS_0;
			break;
		case 9000000:	/*9M */
			aryRates[0] = 0x12;	/* 9M */
			pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
			    MCS_1;
			break;
		case 12000000:	/*12M */
			aryRates[0] = 0x18;	/* 12M */
			pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
			    MCS_2;
			break;
		case 18000000:	/*18M */
			aryRates[0] = 0x24;	/* 18M */
			pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
			    MCS_3;
			break;
		case 24000000:	/*24M */
			aryRates[0] = 0x30;	/* 24M */
			pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
			    MCS_4;
			break;
		case 36000000:	/*36M */
			aryRates[0] = 0x48;	/* 36M */
			pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
			    MCS_5;
			break;
		case 48000000:	/*48M */
			aryRates[0] = 0x60;	/* 48M */
			pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
			    MCS_6;
			break;
		case 54000000:	/*54M */
			aryRates[0] = 0x6c;	/* 54M */
			pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
			    MCS_7;
			break;
		case -1:	/*Auto */
		default:
			aryRates[0] = 0x6c;	/* 54Mbps */
			aryRates[1] = 0x60;	/* 48Mbps */
			aryRates[2] = 0x48;	/* 36Mbps */
			aryRates[3] = 0x30;	/* 24Mbps */
			aryRates[4] = 0x24;	/* 18M */
			aryRates[5] = 0x18;	/* 12M */
			aryRates[6] = 0x12;	/* 9M */
			aryRates[7] = 0x0c;	/* 6M */
			pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
			    MCS_AUTO;
			break;
		}
		break;
	case PHY_11BG_MIXED:	/* B/G Mixed */
	case PHY_11B:		/* B only */
	case PHY_11ABG_MIXED:	/* A/B/G Mixed */
	default:
		switch (Rates) {
		case 1000000:	/*1M */
			aryRates[0] = 0x02;
			pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
			    MCS_0;
			break;
		case 2000000:	/*2M */
			aryRates[0] = 0x04;
			pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
			    MCS_1;
			break;
		case 5000000:	/*5.5M */
			aryRates[0] = 0x0b;	/* 5.5M */
			pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
			    MCS_2;
			break;
		case 11000000:	/*11M */
			aryRates[0] = 0x16;	/* 11M */
			pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
			    MCS_3;
			break;
		case 6000000:	/*6M */
			aryRates[0] = 0x0c;	/* 6M */
			pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
			    MCS_0;
			break;
		case 9000000:	/*9M */
			aryRates[0] = 0x12;	/* 9M */
			pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
			    MCS_1;
			break;
		case 12000000:	/*12M */
			aryRates[0] = 0x18;	/* 12M */
			pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
			    MCS_2;
			break;
		case 18000000:	/*18M */
			aryRates[0] = 0x24;	/* 18M */
			pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
			    MCS_3;
			break;
		case 24000000:	/*24M */
			aryRates[0] = 0x30;	/* 24M */
			pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
			    MCS_4;
			break;
		case 36000000:	/*36M */
			aryRates[0] = 0x48;	/* 36M */
			pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
			    MCS_5;
			break;
		case 48000000:	/*48M */
			aryRates[0] = 0x60;	/* 48M */
			pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
			    MCS_6;
			break;
		case 54000000:	/*54M */
			aryRates[0] = 0x6c;	/* 54M */
			pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
			    MCS_7;
			break;
		case -1:	/*Auto */
		default:
			if (pAdapter->CommonCfg.PhyMode == PHY_11B) {	/*B Only */
				aryRates[0] = 0x16;	/* 11Mbps */
				aryRates[1] = 0x0b;	/* 5.5Mbps */
				aryRates[2] = 0x04;	/* 2Mbps */
				aryRates[3] = 0x02;	/* 1Mbps */
			} else {	/*(B/G) Mixed or (A/B/G) Mixed */
				aryRates[0] = 0x6c;	/* 54Mbps */
				aryRates[1] = 0x60;	/* 48Mbps */
				aryRates[2] = 0x48;	/* 36Mbps */
				aryRates[3] = 0x30;	/* 24Mbps */
				aryRates[4] = 0x16;	/* 11Mbps */
				aryRates[5] = 0x0b;	/* 5.5Mbps */
				aryRates[6] = 0x04;	/* 2Mbps */
				aryRates[7] = 0x02;	/* 1Mbps */
			}
			pAdapter->StaCfg.DesiredTransmitSetting.field.MCS =
			    MCS_AUTO;
			break;
		}
		break;
	}

	NdisZeroMemory(pAdapter->CommonCfg.DesireRate,
		       MAX_LEN_OF_SUPPORTED_RATES);
	NdisMoveMemory(pAdapter->CommonCfg.DesireRate, &aryRates,
		       sizeof(NDIS_802_11_RATES));
	DBGPRINT(RT_DEBUG_TRACE,
		 (" RTMPSetDesiredRates (%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x)\n",
		  pAdapter->CommonCfg.DesireRate[0],
		  pAdapter->CommonCfg.DesireRate[1],
		  pAdapter->CommonCfg.DesireRate[2],
		  pAdapter->CommonCfg.DesireRate[3],
		  pAdapter->CommonCfg.DesireRate[4],
		  pAdapter->CommonCfg.DesireRate[5],
		  pAdapter->CommonCfg.DesireRate[6],
		  pAdapter->CommonCfg.DesireRate[7]));
	/* Changing DesiredRate may affect the MAX TX rate we used to TX frames out */
	MlmeUpdateTxRates(pAdapter, FALSE, 0);
}

/*
	========================================================================

	Routine Description:
		Remove All WPA Keys

	Arguments:
		pAd 					Pointer to our adapter

	Return Value:
		None

	IRQL = DISPATCH_LEVEL

	Note:

	========================================================================
*/
void RTMPWPARemoveAllKeys(IN PRTMP_ADAPTER pAd)
{

	u8 i;

	DBGPRINT(RT_DEBUG_TRACE,
		 ("RTMPWPARemoveAllKeys(AuthMode=%d, WepStatus=%d)\n",
		  pAd->StaCfg.AuthMode, pAd->StaCfg.WepStatus));
	RTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP);
	/* For WEP/CKIP, there is no need to remove it, since WinXP won't set it again after */
	/* Link up. And it will be replaced if user changed it. */
	if (pAd->StaCfg.AuthMode < Ndis802_11AuthModeWPA)
		return;

	/* For WPA-None, there is no need to remove it, since WinXP won't set it again after */
	/* Link up. And it will be replaced if user changed it. */
	if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone)
		return;

	/* set BSSID wcid entry of the Pair-wise Key table as no-security mode */
	AsicRemovePairwiseKeyEntry(pAd, BSS0, BSSID_WCID);

	/* set all shared key mode as no-security. */
	for (i = 0; i < SHARE_KEY_NUM; i++) {
		DBGPRINT(RT_DEBUG_TRACE,
			 ("remove %s key #%d\n",
			  CipherName[pAd->SharedKey[BSS0][i].CipherAlg], i));
		NdisZeroMemory(&pAd->SharedKey[BSS0][i], sizeof(CIPHER_KEY));

		AsicRemoveSharedKeyEntry(pAd, BSS0, i);
	}
	RTMP_SET_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP);
}

/*
	========================================================================

	Routine Description:
		As STA's BSSID is a WC too, it uses shared key table.
		This function write correct unicast TX key to ASIC WCID.
		And we still make a copy in our MacTab.Content[BSSID_WCID].PairwiseKey.
		Caller guarantee TKIP/AES always has keyidx = 0. (pairwise key)
		Caller guarantee WEP calls this function when set Txkey,  default key index=0~3.

	Arguments:
		pAd					Pointer to our adapter
		pKey							Pointer to the where the key stored

	Return Value:
		NDIS_SUCCESS					Add key successfully

	IRQL = DISPATCH_LEVEL

	Note:

	========================================================================
*/
/*
	========================================================================
	Routine Description:
		Change NIC PHY mode. Re-association may be necessary. possible settings
		include - PHY_11B, PHY_11BG_MIXED, PHY_11A, and PHY_11ABG_MIXED

	Arguments:
		pAd - Pointer to our adapter
		phymode  -

	IRQL = PASSIVE_LEVEL
	IRQL = DISPATCH_LEVEL

	========================================================================
*/
void RTMPSetPhyMode(IN PRTMP_ADAPTER pAd, unsigned long phymode)
{
	int i;
	/* the selected phymode must be supported by the RF IC encoded in E2PROM */

	/* if no change, do nothing */
	/* bug fix
	   if (pAd->CommonCfg.PhyMode == phymode)
	   return;
	 */
	pAd->CommonCfg.PhyMode = (u8)phymode;

	DBGPRINT(RT_DEBUG_TRACE,
		 ("RTMPSetPhyMode : PhyMode=%d, channel=%d \n",
		  pAd->CommonCfg.PhyMode, pAd->CommonCfg.Channel));

	BuildChannelList(pAd);

	/* sanity check user setting */
	for (i = 0; i < pAd->ChannelListNum; i++) {
		if (pAd->CommonCfg.Channel == pAd->ChannelList[i].Channel)
			break;
	}

	if (i == pAd->ChannelListNum) {
		pAd->CommonCfg.Channel = FirstChannel(pAd);
		DBGPRINT(RT_DEBUG_ERROR,
			 ("RTMPSetPhyMode: channel is out of range, use first channel=%d \n",
			  pAd->CommonCfg.Channel));
	}

	NdisZeroMemory(pAd->CommonCfg.SupRate, MAX_LEN_OF_SUPPORTED_RATES);
	NdisZeroMemory(pAd->CommonCfg.ExtRate, MAX_LEN_OF_SUPPORTED_RATES);
	NdisZeroMemory(pAd->CommonCfg.DesireRate, MAX_LEN_OF_SUPPORTED_RATES);
	switch (phymode) {
	case PHY_11B:
		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 */
		pAd->CommonCfg.SupRate[3] = 0x96;	/* 11 mbps, in units of 0.5 Mbps, basic rate */
		pAd->CommonCfg.SupRateLen = 4;
		pAd->CommonCfg.ExtRateLen = 0;
		pAd->CommonCfg.DesireRate[0] = 2;	/* 1 mbps, in units of 0.5 Mbps */
		pAd->CommonCfg.DesireRate[1] = 4;	/* 2 mbps, in units of 0.5 Mbps */
		pAd->CommonCfg.DesireRate[2] = 11;	/* 5.5 mbps, in units of 0.5 Mbps */
		pAd->CommonCfg.DesireRate[3] = 22;	/* 11 mbps, in units of 0.5 Mbps */
		/*pAd->CommonCfg.HTPhyMode.field.MODE = MODE_CCK; // This MODE is only FYI. not use */
		break;

	case PHY_11G:
	case PHY_11BG_MIXED:
	case PHY_11ABG_MIXED:
	case PHY_11N_2_4G:
	case PHY_11ABGN_MIXED:
	case PHY_11BGN_MIXED:
	case PHY_11GN_MIXED:
		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 */
		pAd->CommonCfg.SupRate[3] = 0x96;	/* 11 mbps, in units of 0.5 Mbps, basic rate */
		pAd->CommonCfg.SupRate[4] = 0x12;	/* 9 mbps, in units of 0.5 Mbps */
		pAd->CommonCfg.SupRate[5] = 0x24;	/* 18 mbps, in units of 0.5 Mbps */
		pAd->CommonCfg.SupRate[6] = 0x48;	/* 36 mbps, in units of 0.5 Mbps */
		pAd->CommonCfg.SupRate[7] = 0x6c;	/* 54 mbps, in units of 0.5 Mbps */
		pAd->CommonCfg.SupRateLen = 8;
		pAd->CommonCfg.ExtRate[0] = 0x0C;	/* 6 mbps, in units of 0.5 Mbps */
		pAd->CommonCfg.ExtRate[1] = 0x18;	/* 12 mbps, in units of 0.5 Mbps */
		pAd->CommonCfg.ExtRate[2] = 0x30;	/* 24 mbps, in units of 0.5 Mbps */
		pAd->CommonCfg.ExtRate[3] = 0x60;	/* 48 mbps, in units of 0.5 Mbps */
		pAd->CommonCfg.ExtRateLen = 4;
		pAd->CommonCfg.DesireRate[0] = 2;	/* 1 mbps, in units of 0.5 Mbps */
		pAd->CommonCfg.DesireRate[1] = 4;	/* 2 mbps, in units of 0.5 Mbps */
		pAd->CommonCfg.DesireRate[2] = 11;	/* 5.5 mbps, in units of 0.5 Mbps */
		pAd->CommonCfg.DesireRate[3] = 22;	/* 11 mbps, in units of 0.5 Mbps */
		pAd->CommonCfg.DesireRate[4] = 12;	/* 6 mbps, in units of 0.5 Mbps */
		pAd->CommonCfg.DesireRate[5] = 18;	/* 9 mbps, in units of 0.5 Mbps */
		pAd->CommonCfg.DesireRate[6] = 24;	/* 12 mbps, in units of 0.5 Mbps */
		pAd->CommonCfg.DesireRate[7] = 36;	/* 18 mbps, in units of 0.5 Mbps */
		pAd->CommonCfg.DesireRate[8] = 48;	/* 24 mbps, in units of 0.5 Mbps */
		pAd->CommonCfg.DesireRate[9] = 72;	/* 36 mbps, in units of 0.5 Mbps */
		pAd->CommonCfg.DesireRate[10] = 96;	/* 48 mbps, in units of 0.5 Mbps */
		pAd->CommonCfg.DesireRate[11] = 108;	/* 54 mbps, in units of 0.5 Mbps */
		break;

	case PHY_11A:
	case PHY_11AN_MIXED:
	case PHY_11AGN_MIXED:
	case PHY_11N_5G:
		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 */
		pAd->CommonCfg.SupRate[3] = 0x24;	/* 18 mbps, in units of 0.5 Mbps */
		pAd->CommonCfg.SupRate[4] = 0xb0;	/* 24 mbps, in units of 0.5 Mbps, basic rate */
		pAd->CommonCfg.SupRate[5] = 0x48;	/* 36 mbps, in units of 0.5 Mbps */
		pAd->CommonCfg.SupRate[6] = 0x60;	/* 48 mbps, in units of 0.5 Mbps */
		pAd->CommonCfg.SupRate[7] = 0x6c;	/* 54 mbps, in units of 0.5 Mbps */
		pAd->CommonCfg.SupRateLen = 8;
		pAd->CommonCfg.ExtRateLen = 0;
		pAd->CommonCfg.DesireRate[0] = 12;	/* 6 mbps, in units of 0.5 Mbps */
		pAd->CommonCfg.DesireRate[1] = 18;	/* 9 mbps, in units of 0.5 Mbps */
		pAd->CommonCfg.DesireRate[2] = 24;	/* 12 mbps, in units of 0.5 Mbps */
		pAd->CommonCfg.DesireRate[3] = 36;	/* 18 mbps, in units of 0.5 Mbps */
		pAd->CommonCfg.DesireRate[4] = 48;	/* 24 mbps, in units of 0.5 Mbps */
		pAd->CommonCfg.DesireRate[5] = 72;	/* 36 mbps, in units of 0.5 Mbps */
		pAd->CommonCfg.DesireRate[6] = 96;	/* 48 mbps, in units of 0.5 Mbps */
		pAd->CommonCfg.DesireRate[7] = 108;	/* 54 mbps, in units of 0.5 Mbps */
		/*pAd->CommonCfg.HTPhyMode.field.MODE = MODE_OFDM; // This MODE is only FYI. not use */
		break;

	default:
		break;
	}

	pAd->CommonCfg.BandState = UNKNOWN_BAND;
}

/*
	========================================================================
	Routine Description:
		Caller ensures we has 802.11n support.
		Calls at setting HT from AP/STASetinformation

	Arguments:
		pAd - Pointer to our adapter
		phymode  -

	========================================================================
*/
void RTMPSetHT(IN PRTMP_ADAPTER pAd, IN OID_SET_HT_PHYMODE * pHTPhyMode)
{
	/*unsigned long *pmcs; */
	u32 Value = 0;
	u8 BBPValue = 0;
	u8 BBP3Value = 0;
	u8 RxStream = pAd->CommonCfg.RxStream;

	DBGPRINT(RT_DEBUG_TRACE,
		 ("RTMPSetHT : HT_mode(%d), ExtOffset(%d), MCS(%d), BW(%d), STBC(%d), SHORTGI(%d)\n",
		  pHTPhyMode->HtMode, pHTPhyMode->ExtOffset, pHTPhyMode->MCS,
		  pHTPhyMode->BW, pHTPhyMode->STBC, pHTPhyMode->SHORTGI));

	/* Don't zero supportedHyPhy structure. */
	RTMPZeroMemory(&pAd->CommonCfg.HtCapability,
		       sizeof(pAd->CommonCfg.HtCapability));
	RTMPZeroMemory(&pAd->CommonCfg.AddHTInfo,
		       sizeof(pAd->CommonCfg.AddHTInfo));
	RTMPZeroMemory(&pAd->CommonCfg.NewExtChanOffset,
		       sizeof(pAd->CommonCfg.NewExtChanOffset));
	RTMPZeroMemory(&pAd->CommonCfg.DesiredHtPhy,
		       sizeof(pAd->CommonCfg.DesiredHtPhy));

	if (pAd->CommonCfg.bRdg) {
		pAd->CommonCfg.HtCapability.ExtHtCapInfo.PlusHTC = 1;
		pAd->CommonCfg.HtCapability.ExtHtCapInfo.RDGSupport = 1;
	} else {
		pAd->CommonCfg.HtCapability.ExtHtCapInfo.PlusHTC = 0;
		pAd->CommonCfg.HtCapability.ExtHtCapInfo.RDGSupport = 0;
	}

	pAd->CommonCfg.HtCapability.HtCapParm.MaxRAmpduFactor = 3;
	pAd->CommonCfg.DesiredHtPhy.MaxRAmpduFactor = 3;

	DBGPRINT(RT_DEBUG_TRACE,
		 ("RTMPSetHT : RxBAWinLimit = %d\n",
		  pAd->CommonCfg.BACapability.field.RxBAWinLimit));

	/* Mimo power save, A-MSDU size, */
	pAd->CommonCfg.DesiredHtPhy.AmsduEnable =
	    (u16)pAd->CommonCfg.BACapability.field.AmsduEnable;
	pAd->CommonCfg.DesiredHtPhy.AmsduSize =
	    (u8)pAd->CommonCfg.BACapability.field.AmsduSize;
	pAd->CommonCfg.DesiredHtPhy.MimoPs =
	    (u8)pAd->CommonCfg.BACapability.field.MMPSmode;
	pAd->CommonCfg.DesiredHtPhy.MpduDensity =
	    (u8)pAd->CommonCfg.BACapability.field.MpduDensity;

	pAd->CommonCfg.HtCapability.HtCapInfo.AMsduSize =
	    (u16)pAd->CommonCfg.BACapability.field.AmsduSize;
	pAd->CommonCfg.HtCapability.HtCapInfo.MimoPs =
	    (u16)pAd->CommonCfg.BACapability.field.MMPSmode;
	pAd->CommonCfg.HtCapability.HtCapParm.MpduDensity =
	    (u8)pAd->CommonCfg.BACapability.field.MpduDensity;

	DBGPRINT(RT_DEBUG_TRACE,
		 ("RTMPSetHT : AMsduSize = %d, MimoPs = %d, MpduDensity = %d, MaxRAmpduFactor = %d\n",
		  pAd->CommonCfg.DesiredHtPhy.AmsduSize,
		  pAd->CommonCfg.DesiredHtPhy.MimoPs,
		  pAd->CommonCfg.DesiredHtPhy.MpduDensity,
		  pAd->CommonCfg.DesiredHtPhy.MaxRAmpduFactor));

	if (pHTPhyMode->HtMode == HTMODE_GF) {
		pAd->CommonCfg.HtCapability.HtCapInfo.GF = 1;
		pAd->CommonCfg.DesiredHtPhy.GF = 1;
	} else
		pAd->CommonCfg.DesiredHtPhy.GF = 0;

	/* Decide Rx MCSSet */
	switch (RxStream) {
	case 1:
		pAd->CommonCfg.HtCapability.MCSSet[0] = 0xff;
		pAd->CommonCfg.HtCapability.MCSSet[1] = 0x00;
		break;

	case 2:
		pAd->CommonCfg.HtCapability.MCSSet[0] = 0xff;
		pAd->CommonCfg.HtCapability.MCSSet[1] = 0xff;
		break;

	case 3:		/* 3*3 */
		pAd->CommonCfg.HtCapability.MCSSet[0] = 0xff;
		pAd->CommonCfg.HtCapability.MCSSet[1] = 0xff;
		pAd->CommonCfg.HtCapability.MCSSet[2] = 0xff;
		break;
	}

	if (pAd->CommonCfg.bForty_Mhz_Intolerant
	    && (pAd->CommonCfg.Channel <= 14) && (pHTPhyMode->BW == BW_40)) {
		pHTPhyMode->BW = BW_20;
		pAd->CommonCfg.HtCapability.HtCapInfo.Forty_Mhz_Intolerant = 1;
	}

	if (pHTPhyMode->BW == BW_40) {
		pAd->CommonCfg.HtCapability.MCSSet[4] = 0x1;	/* MCS 32 */
		pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth = 1;
		if (pAd->CommonCfg.Channel <= 14)
			pAd->CommonCfg.HtCapability.HtCapInfo.CCKmodein40 = 1;

		pAd->CommonCfg.DesiredHtPhy.ChannelWidth = 1;
		pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth = 1;
		pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset =
		    (pHTPhyMode->ExtOffset ==
		     EXTCHA_BELOW) ? (EXTCHA_BELOW) : EXTCHA_ABOVE;
		/* Set Regsiter for extension channel position. */
		RTMP_IO_READ32(pAd, TX_BAND_CFG, &Value);
		RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BBP3Value);
		if ((pHTPhyMode->ExtOffset == EXTCHA_BELOW)) {
			Value |= 0x1;
			BBP3Value |= (0x20);
			RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Value);
		} else if ((pHTPhyMode->ExtOffset == EXTCHA_ABOVE)) {
			Value &= 0xfe;
			BBP3Value &= (~0x20);
			RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Value);
		}
		/* 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) || ADHOC_ON(pAd)
		    ) {
			RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue);
			BBPValue &= (~0x18);
			BBPValue |= 0x10;
			RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue);

			RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BBP3Value);
			pAd->CommonCfg.BBPCurrentBW = BW_40;
		}
	} else {
		pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth = 0;
		pAd->CommonCfg.DesiredHtPhy.ChannelWidth = 0;
		pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth = 0;
		pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset = EXTCHA_NONE;
		pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel;
		/* Turn on BBP 20MHz mode by request here. */
		{
			RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue);
			BBPValue &= (~0x18);
			RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue);
			pAd->CommonCfg.BBPCurrentBW = BW_20;
		}
	}

	if (pHTPhyMode->STBC == STBC_USE) {
		pAd->CommonCfg.HtCapability.HtCapInfo.TxSTBC = 1;
		pAd->CommonCfg.DesiredHtPhy.TxSTBC = 1;
		pAd->CommonCfg.HtCapability.HtCapInfo.RxSTBC = 1;
		pAd->CommonCfg.DesiredHtPhy.RxSTBC = 1;
	} else {
		pAd->CommonCfg.DesiredHtPhy.TxSTBC = 0;
		pAd->CommonCfg.DesiredHtPhy.RxSTBC = 0;
	}

	if (pHTPhyMode->SHORTGI == GI_400) {
		pAd->CommonCfg.HtCapability.HtCapInfo.ShortGIfor20 = 1;
		pAd->CommonCfg.HtCapability.HtCapInfo.ShortGIfor40 = 1;
		pAd->CommonCfg.DesiredHtPhy.ShortGIfor20 = 1;
		pAd->CommonCfg.DesiredHtPhy.ShortGIfor40 = 1;
	} else {
		pAd->CommonCfg.HtCapability.HtCapInfo.ShortGIfor20 = 0;
		pAd->CommonCfg.HtCapability.HtCapInfo.ShortGIfor40 = 0;
		pAd->CommonCfg.DesiredHtPhy.ShortGIfor20 = 0;
		pAd->CommonCfg.DesiredHtPhy.ShortGIfor40 = 0;
	}

	/* We support link adaptation for unsolicit MCS feedback, set to 2. */
	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) {
		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] = 6;
		pAd->CommonCfg.APEdcaParm.Cwmax[1] = 10;
		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] = 94;
		pAd->CommonCfg.APEdcaParm.Txop[3] = 47;
	}
	AsicSetEdcaParm(pAd, &pAd->CommonCfg.APEdcaParm);

	{
		RTMPSetIndividualHT(pAd, 0);
	}

}

/*
	========================================================================
	Routine Description:
		Caller ensures we has 802.11n support.
		Calls at setting HT from AP/STASetinformation

	Arguments:
		pAd - Pointer to our adapter
		phymode  -

	========================================================================
*/
void RTMPSetIndividualHT(IN PRTMP_ADAPTER pAd, u8 apidx)
{
	PRT_HT_PHY_INFO pDesired_ht_phy = NULL;
	u8 TxStream = pAd->CommonCfg.TxStream;
	u8 DesiredMcs = MCS_AUTO;

	do {
		{
			pDesired_ht_phy = &pAd->StaCfg.DesiredHtPhyInfo;
			DesiredMcs =
			    pAd->StaCfg.DesiredTransmitSetting.field.MCS;
			/*pAd->StaCfg.bAutoTxRateSwitch = (DesiredMcs == MCS_AUTO) ? TRUE : FALSE; */
			break;
		}
	} while (FALSE);

	if (pDesired_ht_phy == NULL) {
		DBGPRINT(RT_DEBUG_ERROR,
			 ("RTMPSetIndividualHT: invalid apidx(%d)\n", apidx));
		return;
	}
	RTMPZeroMemory(pDesired_ht_phy, sizeof(RT_HT_PHY_INFO));

	DBGPRINT(RT_DEBUG_TRACE,
		 ("RTMPSetIndividualHT : Desired MCS = %d\n", DesiredMcs));
	/* Check the validity of MCS */
	if ((TxStream == 1)
	    && ((DesiredMcs >= MCS_8) && (DesiredMcs <= MCS_15))) {
		DBGPRINT(RT_DEBUG_WARN,
			 ("RTMPSetIndividualHT: MCS(%d) is invalid in 1S, reset it as MCS_7\n",
			  DesiredMcs));
		DesiredMcs = MCS_7;
	}

	if ((pAd->CommonCfg.DesiredHtPhy.ChannelWidth == BW_20)
	    && (DesiredMcs == MCS_32)) {
		DBGPRINT(RT_DEBUG_WARN,
			 ("RTMPSetIndividualHT: MCS_32 is only supported in 40-MHz, reset it as MCS_0\n"));
		DesiredMcs = MCS_0;
	}

	pDesired_ht_phy->bHtEnable = TRUE;

	/* Decide desired Tx MCS */
	switch (TxStream) {
	case 1:
		if (DesiredMcs == MCS_AUTO) {
			pDesired_ht_phy->MCSSet[0] = 0xff;
			pDesired_ht_phy->MCSSet[1] = 0x00;
		} else if (DesiredMcs <= MCS_7) {
			pDesired_ht_phy->MCSSet[0] = 1 << DesiredMcs;
			pDesired_ht_phy->MCSSet[1] = 0x00;
		}
		break;

	case 2:
		if (DesiredMcs == MCS_AUTO) {
			pDesired_ht_phy->MCSSet[0] = 0xff;
			pDesired_ht_phy->MCSSet[1] = 0xff;
		} else if (DesiredMcs <= MCS_15) {
			unsigned long mode;

			mode = DesiredMcs / 8;
			if (mode < 2)
				pDesired_ht_phy->MCSSet[mode] =
				    (1 << (DesiredMcs - mode * 8));
		}
		break;

	case 3:		/* 3*3 */
		if (DesiredMcs == MCS_AUTO) {
			/* MCS0 ~ MCS23, 3 bytes */
			pDesired_ht_phy->MCSSet[0] = 0xff;
			pDesired_ht_phy->MCSSet[1] = 0xff;
			pDesired_ht_phy->MCSSet[2] = 0xff;
		} else if (DesiredMcs <= MCS_23) {
			unsigned long mode;

			mode = DesiredMcs / 8;
			if (mode < 3)
				pDesired_ht_phy->MCSSet[mode] =
				    (1 << (DesiredMcs - mode * 8));
		}
		break;
	}

	if (pAd->CommonCfg.DesiredHtPhy.ChannelWidth == BW_40) {
		if (DesiredMcs == MCS_AUTO || DesiredMcs == MCS_32)
			pDesired_ht_phy->MCSSet[4] = 0x1;
	}
	/* update HT Rate setting */
	if (pAd->OpMode == OPMODE_STA)
		MlmeUpdateHtTxRates(pAd, BSS0);
	else
		MlmeUpdateHtTxRates(pAd, apidx);
}

/*
	========================================================================
	Routine Description:
		Update HT IE from our capability.

	Arguments:
		Send all HT IE in beacon/probe rsp/assoc rsp/action frame.

	========================================================================
*/
void RTMPUpdateHTIE(IN RT_HT_CAPABILITY * pRtHt,
		    u8 * pMcsSet,
		    OUT HT_CAPABILITY_IE * pHtCapability,
		    OUT ADD_HT_INFO_IE * pAddHtInfo)
{
	RTMPZeroMemory(pHtCapability, sizeof(HT_CAPABILITY_IE));
	RTMPZeroMemory(pAddHtInfo, sizeof(ADD_HT_INFO_IE));

	pHtCapability->HtCapInfo.ChannelWidth = pRtHt->ChannelWidth;
	pHtCapability->HtCapInfo.MimoPs = pRtHt->MimoPs;
	pHtCapability->HtCapInfo.GF = pRtHt->GF;
	pHtCapability->HtCapInfo.ShortGIfor20 = pRtHt->ShortGIfor20;
	pHtCapability->HtCapInfo.ShortGIfor40 = pRtHt->ShortGIfor40;
	pHtCapability->HtCapInfo.TxSTBC = pRtHt->TxSTBC;
	pHtCapability->HtCapInfo.RxSTBC = pRtHt->RxSTBC;
	pHtCapability->HtCapInfo.AMsduSize = pRtHt->AmsduSize;
	pHtCapability->HtCapParm.MaxRAmpduFactor = pRtHt->MaxRAmpduFactor;
	pHtCapability->HtCapParm.MpduDensity = pRtHt->MpduDensity;

	pAddHtInfo->AddHtInfo.ExtChanOffset = pRtHt->ExtChanOffset;
	pAddHtInfo->AddHtInfo.RecomWidth = pRtHt->RecomWidth;
	pAddHtInfo->AddHtInfo2.OperaionMode = pRtHt->OperaionMode;
	pAddHtInfo->AddHtInfo2.NonGfPresent = pRtHt->NonGfPresent;
	RTMPMoveMemory(pAddHtInfo->MCSSet, /*pRtHt->MCSSet */ pMcsSet, 4);	/* rt2860 only support MCS max=32, no need to copy all 16 uchar. */

	DBGPRINT(RT_DEBUG_TRACE, ("RTMPUpdateHTIE <== \n"));
}

/*
	========================================================================
	Description:
		Add Client security information into ASIC WCID table and IVEIV table.
    Return:
	========================================================================
*/
void RTMPAddWcidAttributeEntry(IN PRTMP_ADAPTER pAd,
			       u8 BssIdx,
			       u8 KeyIdx,
			       u8 CipherAlg, IN MAC_TABLE_ENTRY * pEntry)
{
	u32 WCIDAttri = 0;
	u16 offset;
	u8 IVEIV = 0;
	u16 Wcid = 0;

	{
		{
			if (BssIdx > BSS0) {
				DBGPRINT(RT_DEBUG_ERROR,
					 ("RTMPAddWcidAttributeEntry: The BSS-index(%d) is out of range for Infra link. \n",
					  BssIdx));
				return;
			}
			/* 1.   In ADHOC mode, the AID is wcid number. And NO mesh link exists. */
			/* 2.   In Infra mode, the AID:1 MUST be wcid of infra STA. */
			/*                                         the AID:2~ assign to mesh link entry. */
			if (pEntry)
				Wcid = pEntry->Aid;
			else
				Wcid = MCAST_WCID;
		}
	}

	/* Update WCID attribute table */
	offset = MAC_WCID_ATTRIBUTE_BASE + (Wcid * HW_WCID_ATTRI_SIZE);

	{
		if (pEntry && pEntry->ValidAsMesh)
			WCIDAttri = (CipherAlg << 1) | PAIRWISEKEYTABLE;
		else
			WCIDAttri = (CipherAlg << 1) | SHAREDKEYTABLE;
	}

	RTMP_IO_WRITE32(pAd, offset, WCIDAttri);

	/* Update IV/EIV table */
	offset = MAC_IVEIV_TABLE_BASE + (Wcid * HW_IVEIV_ENTRY_SIZE);

	/* WPA mode */
	if ((CipherAlg == CIPHER_TKIP) || (CipherAlg == CIPHER_TKIP_NO_MIC)
	    || (CipherAlg == CIPHER_AES)) {
		/* Eiv bit on. keyid always is 0 for pairwise key */
		IVEIV = (KeyIdx << 6) | 0x20;
	} else {
		/* WEP KeyIdx is default tx key. */
		IVEIV = (KeyIdx << 6);
	}

	/* For key index and ext IV bit, so only need to update the position(offset+3). */
#ifdef RTMP_MAC_PCI
	RTMP_IO_WRITE8(pAd, offset + 3, IVEIV);
#endif /* RTMP_MAC_PCI // */
#ifdef RTMP_MAC_USB
	RTUSBMultiWrite_OneByte(pAd, offset + 3, &IVEIV);
#endif /* RTMP_MAC_USB // */

	DBGPRINT(RT_DEBUG_TRACE,
		 ("RTMPAddWcidAttributeEntry: WCID #%d, KeyIndex #%d, Alg=%s\n",
		  Wcid, KeyIdx, CipherName[CipherAlg]));
	DBGPRINT(RT_DEBUG_TRACE, ("	WCIDAttri = 0x%x \n", WCIDAttri));

}

/*
    ==========================================================================
    Description:
        Parse encryption type
Arguments:
    pAdapter                    Pointer to our adapter
    wrq                         Pointer to the ioctl argument

    Return Value:
        None

    Note:
    ==========================================================================
*/
char *GetEncryptType(char enc)
{
	if (enc == Ndis802_11WEPDisabled)
		return "NONE";
	if (enc == Ndis802_11WEPEnabled)
		return "WEP";
	if (enc == Ndis802_11Encryption2Enabled)
		return "TKIP";
	if (enc == Ndis802_11Encryption3Enabled)
		return "AES";
	if (enc == Ndis802_11Encryption4Enabled)
		return "TKIPAES";
	else
		return "UNKNOW";
}

char *GetAuthMode(char auth)
{
	if (auth == Ndis802_11AuthModeOpen)
		return "OPEN";
	if (auth == Ndis802_11AuthModeShared)
		return "SHARED";
	if (auth == Ndis802_11AuthModeAutoSwitch)
		return "AUTOWEP";
	if (auth == Ndis802_11AuthModeWPA)
		return "WPA";
	if (auth == Ndis802_11AuthModeWPAPSK)
		return "WPAPSK";
	if (auth == Ndis802_11AuthModeWPANone)
		return "WPANONE";
	if (auth == Ndis802_11AuthModeWPA2)
		return "WPA2";
	if (auth == Ndis802_11AuthModeWPA2PSK)
		return "WPA2PSK";
	if (auth == Ndis802_11AuthModeWPA1WPA2)
		return "WPA1WPA2";
	if (auth == Ndis802_11AuthModeWPA1PSKWPA2PSK)
		return "WPA1PSKWPA2PSK";

	return "UNKNOW";
}

int SetCommonHT(IN PRTMP_ADAPTER pAd)
{
	OID_SET_HT_PHYMODE SetHT;

	if (pAd->CommonCfg.PhyMode < PHY_11ABGN_MIXED)
		return FALSE;

	SetHT.PhyMode = pAd->CommonCfg.PhyMode;
	SetHT.TransmitNo = ((u8)pAd->Antenna.field.TxPath);
	SetHT.HtMode = (u8)pAd->CommonCfg.RegTransmitSetting.field.HTMODE;
	SetHT.ExtOffset =
	    (u8)pAd->CommonCfg.RegTransmitSetting.field.EXTCHA;
	SetHT.MCS = MCS_AUTO;
	SetHT.BW = (u8)pAd->CommonCfg.RegTransmitSetting.field.BW;
	SetHT.STBC = (u8)pAd->CommonCfg.RegTransmitSetting.field.STBC;
	SetHT.SHORTGI = (u8)pAd->CommonCfg.RegTransmitSetting.field.ShortGI;

	RTMPSetHT(pAd, &SetHT);

	return TRUE;
}

char *RTMPGetRalinkEncryModeStr(u16 encryMode)
{
	switch (encryMode) {
	case Ndis802_11WEPDisabled:
		return "NONE";
	case Ndis802_11WEPEnabled:
		return "WEP";
	case Ndis802_11Encryption2Enabled:
		return "TKIP";
	case Ndis802_11Encryption3Enabled:
		return "AES";
	case Ndis802_11Encryption4Enabled:
		return "TKIPAES";
	default:
		return "UNKNOW";
	}
}