2008-04-24 11:55:23 -07:00
/******************************************************************************
*
* Copyright ( c ) 2007 - 2008 Intel Corporation . All rights reserved .
*
* This program is free software ; you can redistribute it and / or modify it
* under the terms of version 2 of the GNU General Public License as
* published by the Free Software Foundation .
*
* 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 . ,
* 51 Franklin Street , Fifth Floor , Boston , MA 02110 , USA
*
* The full GNU General Public License is included in this distribution in the
* file called LICENSE .
*
* Contact Information :
* Intel Corporation , 5200 N . E . Elam Young Parkway , Hillsboro , OR 97124 - 6497
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# include <linux/kernel.h>
# include <linux/module.h>
# include <linux/version.h>
# include <linux/init.h>
# include <linux/pci.h>
# include <linux/dma-mapping.h>
# include <linux/delay.h>
# include <linux/skbuff.h>
# include <linux/netdevice.h>
# include <linux/wireless.h>
# include <net/mac80211.h>
# include <linux/etherdevice.h>
# include <asm/unaligned.h>
# include "iwl-eeprom.h"
# include "iwl-4965.h"
# include "iwl-core.h"
# include "iwl-io.h"
# include "iwl-helpers.h"
# include "iwl-5000-hw.h"
# define IWL5000_UCODE_API "-1"
2008-04-24 11:55:25 -07:00
static int iwl5000_apm_init ( struct iwl_priv * priv )
{
int ret = 0 ;
iwl_set_bit ( priv , CSR_GIO_CHICKEN_BITS ,
CSR_GIO_CHICKEN_BITS_REG_BIT_DIS_L0S_EXIT_TIMER ) ;
iwl_set_bit ( priv , CSR_ANA_PLL_CFG , CSR50_ANA_PLL_CFG_VAL ) ;
/* set "initialization complete" bit to move adapter
* D0U * - - > D0A * state */
iwl_set_bit ( priv , CSR_GP_CNTRL , CSR_GP_CNTRL_REG_FLAG_INIT_DONE ) ;
/* wait for clock stabilization */
ret = iwl_poll_bit ( priv , CSR_GP_CNTRL ,
CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY ,
CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY , 25000 ) ;
if ( ret < 0 ) {
IWL_DEBUG_INFO ( " Failed to init the card \n " ) ;
return ret ;
}
ret = iwl_grab_nic_access ( priv ) ;
if ( ret )
return ret ;
/* enable DMA */
iwl_write_prph ( priv , APMG_CLK_EN_REG ,
APMG_CLK_VAL_DMA_CLK_RQT ) ;
udelay ( 20 ) ;
iwl_set_bits_prph ( priv , APMG_PCIDEV_STT_REG ,
APMG_PCIDEV_STT_VAL_L1_ACT_DIS ) ;
iwl_release_nic_access ( priv ) ;
return ret ;
}
2008-04-24 11:55:24 -07:00
static struct iwl_hcmd_ops iwl5000_hcmd = {
} ;
static struct iwl_hcmd_utils_ops iwl5000_hcmd_utils = {
} ;
static struct iwl_lib_ops iwl5000_lib = {
2008-04-24 11:55:25 -07:00
. apm_ops = {
. init = iwl5000_apm_init ,
2008-04-24 11:55:26 -07:00
. set_pwr_src = iwl4965_set_pwr_src ,
2008-04-24 11:55:25 -07:00
} ,
2008-04-24 11:55:24 -07:00
. eeprom_ops = {
. verify_signature = iwlcore_eeprom_verify_signature ,
. acquire_semaphore = iwlcore_eeprom_acquire_semaphore ,
. release_semaphore = iwlcore_eeprom_release_semaphore ,
} ,
} ;
static struct iwl_ops iwl5000_ops = {
. lib = & iwl5000_lib ,
. hcmd = & iwl5000_hcmd ,
. utils = & iwl5000_hcmd_utils ,
} ;
2008-04-24 11:55:23 -07:00
static struct iwl_mod_params iwl50_mod_params = {
. num_of_queues = IWL50_NUM_QUEUES ,
. enable_qos = 1 ,
. amsdu_size_8K = 1 ,
/* the rest are 0 by default */
} ;
struct iwl_cfg iwl5300_agn_cfg = {
. name = " 5300AGN " ,
. fw_name = " iwlwifi-5000 " IWL5000_UCODE_API " .ucode " ,
. sku = IWL_SKU_A | IWL_SKU_G | IWL_SKU_N ,
2008-04-24 11:55:24 -07:00
. ops = & iwl5000_ops ,
2008-04-24 11:55:23 -07:00
. mod_params = & iwl50_mod_params ,
} ;
struct iwl_cfg iwl5100_agn_cfg = {
. name = " 5100AGN " ,
. fw_name = " iwlwifi-5000 " IWL5000_UCODE_API " .ucode " ,
. sku = IWL_SKU_A | IWL_SKU_G | IWL_SKU_N ,
2008-04-24 11:55:24 -07:00
. ops = & iwl5000_ops ,
2008-04-24 11:55:23 -07:00
. mod_params = & iwl50_mod_params ,
} ;
struct iwl_cfg iwl5350_agn_cfg = {
. name = " 5350AGN " ,
. fw_name = " iwlwifi-5000 " IWL5000_UCODE_API " .ucode " ,
. sku = IWL_SKU_A | IWL_SKU_G | IWL_SKU_N ,
2008-04-24 11:55:24 -07:00
. ops = & iwl5000_ops ,
2008-04-24 11:55:23 -07:00
. mod_params = & iwl50_mod_params ,
} ;
module_param_named ( disable50 , iwl50_mod_params . disable , int , 0444 ) ;
MODULE_PARM_DESC ( disable50 ,
" manually disable the 50XX radio (default 0 [radio on]) " ) ;
module_param_named ( swcrypto50 , iwl50_mod_params . sw_crypto , bool , 0444 ) ;
MODULE_PARM_DESC ( swcrypto50 ,
" using software crypto engine (default 0 [hardware]) \n " ) ;
module_param_named ( debug50 , iwl50_mod_params . debug , int , 0444 ) ;
MODULE_PARM_DESC ( debug50 , " 50XX debug output mask " ) ;
module_param_named ( queues_num50 , iwl50_mod_params . num_of_queues , int , 0444 ) ;
MODULE_PARM_DESC ( queues_num50 , " number of hw queues in 50xx series " ) ;
module_param_named ( qos_enable50 , iwl50_mod_params . enable_qos , int , 0444 ) ;
MODULE_PARM_DESC ( qos_enable50 , " enable all 50XX QoS functionality " ) ;
module_param_named ( amsdu_size_8K50 , iwl50_mod_params . amsdu_size_8K , int , 0444 ) ;
MODULE_PARM_DESC ( amsdu_size_8K50 , " enable 8K amsdu size in 50XX series " ) ;