iwl-5000.c revision 88acbd3b32692ae786019ce642c6150b355f4b1e
1/****************************************************************************** 2 * 3 * Copyright(c) 2007-2008 Intel Corporation. All rights reserved. 4 * 5 * This program is free software; you can redistribute it and/or modify it 6 * under the terms of version 2 of the GNU General Public License as 7 * published by the Free Software Foundation. 8 * 9 * This program is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12 * more details. 13 * 14 * You should have received a copy of the GNU General Public License along with 15 * this program; if not, write to the Free Software Foundation, Inc., 16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA 17 * 18 * The full GNU General Public License is included in this distribution in the 19 * file called LICENSE. 20 * 21 * Contact Information: 22 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 23 * 24 *****************************************************************************/ 25 26#include <linux/kernel.h> 27#include <linux/module.h> 28#include <linux/version.h> 29#include <linux/init.h> 30#include <linux/pci.h> 31#include <linux/dma-mapping.h> 32#include <linux/delay.h> 33#include <linux/skbuff.h> 34#include <linux/netdevice.h> 35#include <linux/wireless.h> 36#include <net/mac80211.h> 37#include <linux/etherdevice.h> 38#include <asm/unaligned.h> 39 40#include "iwl-eeprom.h" 41#include "iwl-4965.h" 42#include "iwl-core.h" 43#include "iwl-io.h" 44#include "iwl-helpers.h" 45#include "iwl-5000-hw.h" 46 47#define IWL5000_UCODE_API "-1" 48 49static int iwl5000_apm_init(struct iwl_priv *priv) 50{ 51 int ret = 0; 52 53 iwl_set_bit(priv, CSR_GIO_CHICKEN_BITS, 54 CSR_GIO_CHICKEN_BITS_REG_BIT_DIS_L0S_EXIT_TIMER); 55 56 iwl_set_bit(priv, CSR_ANA_PLL_CFG, CSR50_ANA_PLL_CFG_VAL); 57 58 /* set "initialization complete" bit to move adapter 59 * D0U* --> D0A* state */ 60 iwl_set_bit(priv, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_INIT_DONE); 61 62 /* wait for clock stabilization */ 63 ret = iwl_poll_bit(priv, CSR_GP_CNTRL, 64 CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, 65 CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, 25000); 66 if (ret < 0) { 67 IWL_DEBUG_INFO("Failed to init the card\n"); 68 return ret; 69 } 70 71 ret = iwl_grab_nic_access(priv); 72 if (ret) 73 return ret; 74 75 /* enable DMA */ 76 iwl_write_prph(priv, APMG_CLK_EN_REG, 77 APMG_CLK_VAL_DMA_CLK_RQT); 78 79 udelay(20); 80 81 iwl_set_bits_prph(priv, APMG_PCIDEV_STT_REG, 82 APMG_PCIDEV_STT_VAL_L1_ACT_DIS); 83 84 iwl_release_nic_access(priv); 85 86 return ret; 87} 88 89static struct iwl_hcmd_ops iwl5000_hcmd = { 90}; 91 92static struct iwl_hcmd_utils_ops iwl5000_hcmd_utils = { 93}; 94 95static struct iwl_lib_ops iwl5000_lib = { 96 .apm_ops = { 97 .init = iwl5000_apm_init, 98 .set_pwr_src = iwl4965_set_pwr_src, 99 }, 100 .eeprom_ops = { 101 .verify_signature = iwlcore_eeprom_verify_signature, 102 .acquire_semaphore = iwlcore_eeprom_acquire_semaphore, 103 .release_semaphore = iwlcore_eeprom_release_semaphore, 104 }, 105}; 106 107static struct iwl_ops iwl5000_ops = { 108 .lib = &iwl5000_lib, 109 .hcmd = &iwl5000_hcmd, 110 .utils = &iwl5000_hcmd_utils, 111}; 112 113static struct iwl_mod_params iwl50_mod_params = { 114 .num_of_queues = IWL50_NUM_QUEUES, 115 .enable_qos = 1, 116 .amsdu_size_8K = 1, 117 /* the rest are 0 by default */ 118}; 119 120 121struct iwl_cfg iwl5300_agn_cfg = { 122 .name = "5300AGN", 123 .fw_name = "iwlwifi-5000" IWL5000_UCODE_API ".ucode", 124 .sku = IWL_SKU_A|IWL_SKU_G|IWL_SKU_N, 125 .ops = &iwl5000_ops, 126 .mod_params = &iwl50_mod_params, 127}; 128 129struct iwl_cfg iwl5100_agn_cfg = { 130 .name = "5100AGN", 131 .fw_name = "iwlwifi-5000" IWL5000_UCODE_API ".ucode", 132 .sku = IWL_SKU_A|IWL_SKU_G|IWL_SKU_N, 133 .ops = &iwl5000_ops, 134 .mod_params = &iwl50_mod_params, 135}; 136 137struct iwl_cfg iwl5350_agn_cfg = { 138 .name = "5350AGN", 139 .fw_name = "iwlwifi-5000" IWL5000_UCODE_API ".ucode", 140 .sku = IWL_SKU_A|IWL_SKU_G|IWL_SKU_N, 141 .ops = &iwl5000_ops, 142 .mod_params = &iwl50_mod_params, 143}; 144 145module_param_named(disable50, iwl50_mod_params.disable, int, 0444); 146MODULE_PARM_DESC(disable50, 147 "manually disable the 50XX radio (default 0 [radio on])"); 148module_param_named(swcrypto50, iwl50_mod_params.sw_crypto, bool, 0444); 149MODULE_PARM_DESC(swcrypto50, 150 "using software crypto engine (default 0 [hardware])\n"); 151module_param_named(debug50, iwl50_mod_params.debug, int, 0444); 152MODULE_PARM_DESC(debug50, "50XX debug output mask"); 153module_param_named(queues_num50, iwl50_mod_params.num_of_queues, int, 0444); 154MODULE_PARM_DESC(queues_num50, "number of hw queues in 50xx series"); 155module_param_named(qos_enable50, iwl50_mod_params.enable_qos, int, 0444); 156MODULE_PARM_DESC(qos_enable50, "enable all 50XX QoS functionality"); 157module_param_named(amsdu_size_8K50, iwl50_mod_params.amsdu_size_8K, int, 0444); 158MODULE_PARM_DESC(amsdu_size_8K50, "enable 8K amsdu size in 50XX series"); 159 160 161