summaryrefslogblamecommitdiffstats
path: root/drivers/staging/rt2860/common/cmm_cfg.c
blob: 727f79929258db751dbb66153177453b93e60b85 (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.             *
 *                                                                       *
 *************************************************************************

    Module Name:
	cmm_cfg.c

    Abstract:
    Ralink WiFi Driver configuration related subroutines

    Revision History:
    Who          When          What
    ---------    ----------    ----------------------------------------------
*/

#include "../rt_config.h"

char *GetPhyMode(int Mode)
{
	switch (Mode) {
	case MODE_CCK:
		return "CCK";

	case MODE_OFDM:
		return "OFDM";
	case MODE_HTMIX:
		return "HTMIX";

	case MODE_HTGREENFIELD:
		return "GREEN";
	default:
		return "N/A";
	}
}

char *GetBW(int BW)
{
	switch (BW) {
	case BW_10:
		return "10M";

	case BW_20:
		return "20M";
	case BW_40:
		return "40M";
	default:
		return "N/A";
	}
}

/*
    ==========================================================================
    Description:
        Set Country Region to pAd->CommonCfg.CountryRegion.
        This command will not work, if the field of CountryRegion in eeprom is programmed.

    Return:
        TRUE if all parameters are OK, FALSE otherwise
    ==========================================================================
*/
int RT_CfgSetCountryRegion(struct rt_rtmp_adapter *pAd, char *arg, int band)
{
	long region, regionMax;
	u8 *pCountryRegion;

	region = simple_strtol(arg, 0, 10);

	if (band == BAND_24G) {
		pCountryRegion = &pAd->CommonCfg.CountryRegion;
		regionMax = REGION_MAXIMUM_BG_BAND;
	} else {
		pCountryRegion = &pAd->CommonCfg.CountryRegionForABand;
		regionMax = REGION_MAXIMUM_A_BAND;
	}

	/* TODO: Is it neccesay for following check??? */
	/* Country can be set only when EEPROM not programmed */
	if (*pCountryRegion & 0x80) {
		DBGPRINT(RT_DEBUG_ERROR,
			 ("CfgSetCountryRegion():CountryRegion in eeprom was programmed\n"));
		return FALSE;
	}

	if ((region >= 0) && (region <= REGION_MAXIMUM_BG_BAND)) {
		*pCountryRegion = (u8)region;
	} else if ((region == REGION_31_BG_BAND) && (band == BAND_24G)) {
		*pCountryRegion = (u8)region;
	} else {
		DBGPRINT(RT_DEBUG_ERROR,
			 ("CfgSetCountryRegion():region(%ld) out of range!\n",
			  region));
		return FALSE;
	}

	return TRUE;

}

/*
    ==========================================================================
    Description:
        Set Wireless Mode
    Return:
        TRUE if all parameters are OK, FALSE otherwise
    ==========================================================================
*/
int RT_CfgSetWirelessMode(struct rt_rtmp_adapter *pAd, char *arg)
{
	int MaxPhyMode = PHY_11G;
	long WirelessMode;

	MaxPhyMode = PHY_11N_5G;

	WirelessMode = simple_strtol(arg, 0, 10);
	if (WirelessMode <= MaxPhyMode) {
		pAd->CommonCfg.PhyMode = WirelessMode;
		return TRUE;
	}

	return FALSE;

}

int RT_CfgSetShortSlot(struct rt_rtmp_adapter *pAd, char *arg)
{
	long ShortSlot;

	ShortSlot = simple_strtol(arg, 0, 10);

	if (ShortSlot == 1)
		pAd->CommonCfg.bUseShortSlotTime = TRUE;
	else if (ShortSlot == 0)
		pAd->CommonCfg.bUseShortSlotTime = FALSE;
	else
		return FALSE;	/*Invalid argument */

	return TRUE;
}

/*
    ==========================================================================
    Description:
        Set WEP KEY base on KeyIdx
    Return:
        TRUE if all parameters are OK, FALSE otherwise
    ==========================================================================
*/
int RT_CfgSetWepKey(struct rt_rtmp_adapter *pAd,
		    char *keyString,
		    struct rt_cipher_key *pSharedKey, int keyIdx)
{
	int KeyLen;
	int i;
	u8 CipherAlg = CIPHER_NONE;
	BOOLEAN bKeyIsHex = FALSE;

	/* TODO: Shall we do memset for the original key info?? */
	memset(pSharedKey, 0, sizeof(struct rt_cipher_key));
	KeyLen = strlen(keyString);
	switch (KeyLen) {
	case 5:		/*wep 40 Ascii type */
	case 13:		/*wep 104 Ascii type */
		bKeyIsHex = FALSE;
		pSharedKey->KeyLen = KeyLen;
		NdisMoveMemory(pSharedKey->Key, keyString, KeyLen);
		break;

	case 10:		/*wep 40 Hex type */
	case 26:		/*wep 104 Hex type */
		for (i = 0; i < KeyLen; i++) {
			if (!isxdigit(*(keyString + i)))
				return FALSE;	/*Not Hex value; */
		}
		bKeyIsHex = TRUE;
		pSharedKey->KeyLen = KeyLen / 2;
		AtoH(keyString, pSharedKey->Key, pSharedKey->KeyLen);
		break;

	default:		/*Invalid argument */
		DBGPRINT(RT_DEBUG_TRACE,
			 ("RT_CfgSetWepKey(keyIdx=%d):Invalid argument (arg=%s)\n",
			  keyIdx, keyString));
		return FALSE;
	}

	pSharedKey->CipherAlg = ((KeyLen % 5) ? CIPHER_WEP128 : CIPHER_WEP64);
	DBGPRINT(RT_DEBUG_TRACE,
		 ("RT_CfgSetWepKey:(KeyIdx=%d,type=%s, Alg=%s)\n", keyIdx,
		  (bKeyIsHex == FALSE ? "Ascii" : "Hex"),
		  CipherName[CipherAlg]));

	return TRUE;
}

/*
    ==========================================================================
    Description:
        Set WPA PSK key

    Arguments:
        pAdapter	Pointer to our adapter
        keyString	WPA pre-shared key string
        pHashStr	String used for password hash function
        hashStrLen	Length of the hash string
        pPMKBuf		Output buffer of WPAPSK key

    Return:
        TRUE if all parameters are OK, FALSE otherwise
    ==========================================================================
*/
int RT_CfgSetWPAPSKKey(struct rt_rtmp_adapter *pAd,
		       char *keyString,
		       u8 * pHashStr,
		       int hashStrLen, u8 *pPMKBuf)
{
	int keyLen;
	u8 keyMaterial[40];

	keyLen = strlen(keyString);
	if ((keyLen < 8) || (keyLen > 64)) {
		DBGPRINT(RT_DEBUG_TRACE,
			 ("WPAPSK Key length(%d) error, required 8 ~ 64 characters!(keyStr=%s)\n",
			  keyLen, keyString));
		return FALSE;
	}

	memset(pPMKBuf, 0, 32);
	if (keyLen == 64) {
		AtoH(keyString, pPMKBuf, 32);
	} else {
		PasswordHash(keyString, pHashStr, hashStrLen, keyMaterial);
		NdisMoveMemory(pPMKBuf, keyMaterial, 32);
	}

	return TRUE;
}