diff options
author | Andrea Bastoni <bastoni@cs.unc.edu> | 2010-05-30 19:16:45 -0400 |
---|---|---|
committer | Andrea Bastoni <bastoni@cs.unc.edu> | 2010-05-30 19:16:45 -0400 |
commit | ada47b5fe13d89735805b566185f4885f5a3f750 (patch) | |
tree | 644b88f8a71896307d71438e9b3af49126ffb22b /drivers/net/wireless/iwlwifi/iwl-1000.c | |
parent | 43e98717ad40a4ae64545b5ba047c7b86aa44f4f (diff) | |
parent | 3280f21d43ee541f97f8cda5792150d2dbec20d5 (diff) |
Merge branch 'wip-2.6.34' into old-private-masterarchived-private-master
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-1000.c')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-1000.c | 133 |
1 files changed, 124 insertions, 9 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-1000.c b/drivers/net/wireless/iwlwifi/iwl-1000.c index 950267ab556a..3bf2e6e9b2d9 100644 --- a/drivers/net/wireless/iwlwifi/iwl-1000.c +++ b/drivers/net/wireless/iwlwifi/iwl-1000.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /****************************************************************************** | 1 | /****************************************************************************** |
2 | * | 2 | * |
3 | * Copyright(c) 2008-2009 Intel Corporation. All rights reserved. | 3 | * Copyright(c) 2008 - 2010 Intel Corporation. All rights reserved. |
4 | * | 4 | * |
5 | * This program is free software; you can redistribute it and/or modify it | 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 | 6 | * under the terms of version 2 of the GNU General Public License as |
@@ -44,6 +44,7 @@ | |||
44 | #include "iwl-sta.h" | 44 | #include "iwl-sta.h" |
45 | #include "iwl-helpers.h" | 45 | #include "iwl-helpers.h" |
46 | #include "iwl-5000-hw.h" | 46 | #include "iwl-5000-hw.h" |
47 | #include "iwl-agn-led.h" | ||
47 | 48 | ||
48 | /* Highest firmware API version supported */ | 49 | /* Highest firmware API version supported */ |
49 | #define IWL1000_UCODE_API_MAX 3 | 50 | #define IWL1000_UCODE_API_MAX 3 |
@@ -76,7 +77,10 @@ static void iwl1000_set_ct_threshold(struct iwl_priv *priv) | |||
76 | /* NIC configuration for 1000 series */ | 77 | /* NIC configuration for 1000 series */ |
77 | static void iwl1000_nic_config(struct iwl_priv *priv) | 78 | static void iwl1000_nic_config(struct iwl_priv *priv) |
78 | { | 79 | { |
79 | iwl5000_nic_config(priv); | 80 | /* set CSR_HW_CONFIG_REG for uCode use */ |
81 | iwl_set_bit(priv, CSR_HW_IF_CONFIG_REG, | ||
82 | CSR_HW_IF_CONFIG_REG_BIT_RADIO_SI | | ||
83 | CSR_HW_IF_CONFIG_REG_BIT_MAC_SI); | ||
80 | 84 | ||
81 | /* Setting digital SVR for 1000 card to 1.32V */ | 85 | /* Setting digital SVR for 1000 card to 1.32V */ |
82 | /* locking is acquired in iwl_set_bits_mask_prph() function */ | 86 | /* locking is acquired in iwl_set_bits_mask_prph() function */ |
@@ -85,8 +89,78 @@ static void iwl1000_nic_config(struct iwl_priv *priv) | |||
85 | ~APMG_SVR_VOLTAGE_CONFIG_BIT_MSK); | 89 | ~APMG_SVR_VOLTAGE_CONFIG_BIT_MSK); |
86 | } | 90 | } |
87 | 91 | ||
92 | static struct iwl_sensitivity_ranges iwl1000_sensitivity = { | ||
93 | .min_nrg_cck = 95, | ||
94 | .max_nrg_cck = 0, /* not used, set to 0 */ | ||
95 | .auto_corr_min_ofdm = 90, | ||
96 | .auto_corr_min_ofdm_mrc = 170, | ||
97 | .auto_corr_min_ofdm_x1 = 120, | ||
98 | .auto_corr_min_ofdm_mrc_x1 = 240, | ||
99 | |||
100 | .auto_corr_max_ofdm = 120, | ||
101 | .auto_corr_max_ofdm_mrc = 210, | ||
102 | .auto_corr_max_ofdm_x1 = 155, | ||
103 | .auto_corr_max_ofdm_mrc_x1 = 290, | ||
104 | |||
105 | .auto_corr_min_cck = 125, | ||
106 | .auto_corr_max_cck = 200, | ||
107 | .auto_corr_min_cck_mrc = 170, | ||
108 | .auto_corr_max_cck_mrc = 400, | ||
109 | .nrg_th_cck = 95, | ||
110 | .nrg_th_ofdm = 95, | ||
111 | |||
112 | .barker_corr_th_min = 190, | ||
113 | .barker_corr_th_min_mrc = 390, | ||
114 | .nrg_th_cca = 62, | ||
115 | }; | ||
116 | |||
117 | static int iwl1000_hw_set_hw_params(struct iwl_priv *priv) | ||
118 | { | ||
119 | if (priv->cfg->mod_params->num_of_queues >= IWL_MIN_NUM_QUEUES && | ||
120 | priv->cfg->mod_params->num_of_queues <= IWL50_NUM_QUEUES) | ||
121 | priv->cfg->num_of_queues = | ||
122 | priv->cfg->mod_params->num_of_queues; | ||
123 | |||
124 | priv->hw_params.max_txq_num = priv->cfg->num_of_queues; | ||
125 | priv->hw_params.dma_chnl_num = FH50_TCSR_CHNL_NUM; | ||
126 | priv->hw_params.scd_bc_tbls_size = | ||
127 | priv->cfg->num_of_queues * | ||
128 | sizeof(struct iwl5000_scd_bc_tbl); | ||
129 | priv->hw_params.tfd_size = sizeof(struct iwl_tfd); | ||
130 | priv->hw_params.max_stations = IWL5000_STATION_COUNT; | ||
131 | priv->hw_params.bcast_sta_id = IWL5000_BROADCAST_ID; | ||
132 | |||
133 | priv->hw_params.max_data_size = IWL50_RTC_DATA_SIZE; | ||
134 | priv->hw_params.max_inst_size = IWL50_RTC_INST_SIZE; | ||
135 | |||
136 | priv->hw_params.max_bsm_size = 0; | ||
137 | priv->hw_params.ht40_channel = BIT(IEEE80211_BAND_2GHZ) | | ||
138 | BIT(IEEE80211_BAND_5GHZ); | ||
139 | priv->hw_params.rx_wrt_ptr_reg = FH_RSCSR_CHNL0_WPTR; | ||
140 | |||
141 | priv->hw_params.tx_chains_num = num_of_ant(priv->cfg->valid_tx_ant); | ||
142 | priv->hw_params.rx_chains_num = num_of_ant(priv->cfg->valid_rx_ant); | ||
143 | priv->hw_params.valid_tx_ant = priv->cfg->valid_tx_ant; | ||
144 | priv->hw_params.valid_rx_ant = priv->cfg->valid_rx_ant; | ||
145 | |||
146 | if (priv->cfg->ops->lib->temp_ops.set_ct_kill) | ||
147 | priv->cfg->ops->lib->temp_ops.set_ct_kill(priv); | ||
148 | |||
149 | /* Set initial sensitivity parameters */ | ||
150 | /* Set initial calibration set */ | ||
151 | priv->hw_params.sens = &iwl1000_sensitivity; | ||
152 | priv->hw_params.calib_init_cfg = | ||
153 | BIT(IWL_CALIB_XTAL) | | ||
154 | BIT(IWL_CALIB_LO) | | ||
155 | BIT(IWL_CALIB_TX_IQ) | | ||
156 | BIT(IWL_CALIB_TX_IQ_PERD) | | ||
157 | BIT(IWL_CALIB_BASE_BAND); | ||
158 | |||
159 | return 0; | ||
160 | } | ||
161 | |||
88 | static struct iwl_lib_ops iwl1000_lib = { | 162 | static struct iwl_lib_ops iwl1000_lib = { |
89 | .set_hw_params = iwl5000_hw_set_hw_params, | 163 | .set_hw_params = iwl1000_hw_set_hw_params, |
90 | .txq_update_byte_cnt_tbl = iwl5000_txq_update_byte_cnt_tbl, | 164 | .txq_update_byte_cnt_tbl = iwl5000_txq_update_byte_cnt_tbl, |
91 | .txq_inval_byte_cnt_tbl = iwl5000_txq_inval_byte_cnt_tbl, | 165 | .txq_inval_byte_cnt_tbl = iwl5000_txq_inval_byte_cnt_tbl, |
92 | .txq_set_sched = iwl5000_txq_set_sched, | 166 | .txq_set_sched = iwl5000_txq_set_sched, |
@@ -101,14 +175,15 @@ static struct iwl_lib_ops iwl1000_lib = { | |||
101 | .load_ucode = iwl5000_load_ucode, | 175 | .load_ucode = iwl5000_load_ucode, |
102 | .dump_nic_event_log = iwl_dump_nic_event_log, | 176 | .dump_nic_event_log = iwl_dump_nic_event_log, |
103 | .dump_nic_error_log = iwl_dump_nic_error_log, | 177 | .dump_nic_error_log = iwl_dump_nic_error_log, |
178 | .dump_csr = iwl_dump_csr, | ||
179 | .dump_fh = iwl_dump_fh, | ||
104 | .init_alive_start = iwl5000_init_alive_start, | 180 | .init_alive_start = iwl5000_init_alive_start, |
105 | .alive_notify = iwl5000_alive_notify, | 181 | .alive_notify = iwl5000_alive_notify, |
106 | .send_tx_power = iwl5000_send_tx_power, | 182 | .send_tx_power = iwl5000_send_tx_power, |
107 | .update_chain_flags = iwl_update_chain_flags, | 183 | .update_chain_flags = iwl_update_chain_flags, |
108 | .apm_ops = { | 184 | .apm_ops = { |
109 | .init = iwl5000_apm_init, | 185 | .init = iwl_apm_init, |
110 | .reset = iwl5000_apm_reset, | 186 | .stop = iwl_apm_stop, |
111 | .stop = iwl5000_apm_stop, | ||
112 | .config = iwl1000_nic_config, | 187 | .config = iwl1000_nic_config, |
113 | .set_pwr_src = iwl_set_pwr_src, | 188 | .set_pwr_src = iwl_set_pwr_src, |
114 | }, | 189 | }, |
@@ -135,13 +210,15 @@ static struct iwl_lib_ops iwl1000_lib = { | |||
135 | .temperature = iwl5000_temperature, | 210 | .temperature = iwl5000_temperature, |
136 | .set_ct_kill = iwl1000_set_ct_threshold, | 211 | .set_ct_kill = iwl1000_set_ct_threshold, |
137 | }, | 212 | }, |
213 | .add_bcast_station = iwl_add_bcast_station, | ||
138 | }; | 214 | }; |
139 | 215 | ||
140 | static struct iwl_ops iwl1000_ops = { | 216 | static const struct iwl_ops iwl1000_ops = { |
141 | .ucode = &iwl5000_ucode, | 217 | .ucode = &iwl5000_ucode, |
142 | .lib = &iwl1000_lib, | 218 | .lib = &iwl1000_lib, |
143 | .hcmd = &iwl5000_hcmd, | 219 | .hcmd = &iwl5000_hcmd, |
144 | .utils = &iwl5000_hcmd_utils, | 220 | .utils = &iwl5000_hcmd_utils, |
221 | .led = &iwlagn_led_ops, | ||
145 | }; | 222 | }; |
146 | 223 | ||
147 | struct iwl_cfg iwl1000_bgn_cfg = { | 224 | struct iwl_cfg iwl1000_bgn_cfg = { |
@@ -152,15 +229,53 @@ struct iwl_cfg iwl1000_bgn_cfg = { | |||
152 | .sku = IWL_SKU_G|IWL_SKU_N, | 229 | .sku = IWL_SKU_G|IWL_SKU_N, |
153 | .ops = &iwl1000_ops, | 230 | .ops = &iwl1000_ops, |
154 | .eeprom_size = OTP_LOW_IMAGE_SIZE, | 231 | .eeprom_size = OTP_LOW_IMAGE_SIZE, |
155 | .eeprom_ver = EEPROM_5000_EEPROM_VERSION, | 232 | .eeprom_ver = EEPROM_1000_EEPROM_VERSION, |
156 | .eeprom_calib_ver = EEPROM_5000_TX_POWER_VERSION, | 233 | .eeprom_calib_ver = EEPROM_5000_TX_POWER_VERSION, |
234 | .num_of_queues = IWL50_NUM_QUEUES, | ||
235 | .num_of_ampdu_queues = IWL50_NUM_AMPDU_QUEUES, | ||
157 | .mod_params = &iwl50_mod_params, | 236 | .mod_params = &iwl50_mod_params, |
158 | .valid_tx_ant = ANT_A, | 237 | .valid_tx_ant = ANT_A, |
159 | .valid_rx_ant = ANT_AB, | 238 | .valid_rx_ant = ANT_AB, |
160 | .need_pll_cfg = true, | 239 | .pll_cfg_val = CSR50_ANA_PLL_CFG_VAL, |
240 | .set_l0s = true, | ||
241 | .use_bsm = false, | ||
161 | .max_ll_items = OTP_MAX_LL_ITEMS_1000, | 242 | .max_ll_items = OTP_MAX_LL_ITEMS_1000, |
162 | .shadow_ram_support = false, | 243 | .shadow_ram_support = false, |
163 | .ht_greenfield_support = true, | 244 | .ht_greenfield_support = true, |
245 | .led_compensation = 51, | ||
164 | .use_rts_for_ht = true, /* use rts/cts protection */ | 246 | .use_rts_for_ht = true, /* use rts/cts protection */ |
247 | .chain_noise_num_beacons = IWL_CAL_NUM_BEACONS, | ||
248 | .support_ct_kill_exit = true, | ||
249 | .plcp_delta_threshold = IWL_MAX_PLCP_ERR_EXT_LONG_THRESHOLD_DEF, | ||
250 | .chain_noise_scale = 1000, | ||
251 | }; | ||
252 | |||
253 | struct iwl_cfg iwl1000_bg_cfg = { | ||
254 | .name = "1000 Series BG", | ||
255 | .fw_name_pre = IWL1000_FW_PRE, | ||
256 | .ucode_api_max = IWL1000_UCODE_API_MAX, | ||
257 | .ucode_api_min = IWL1000_UCODE_API_MIN, | ||
258 | .sku = IWL_SKU_G, | ||
259 | .ops = &iwl1000_ops, | ||
260 | .eeprom_size = OTP_LOW_IMAGE_SIZE, | ||
261 | .eeprom_ver = EEPROM_1000_EEPROM_VERSION, | ||
262 | .eeprom_calib_ver = EEPROM_5000_TX_POWER_VERSION, | ||
263 | .num_of_queues = IWL50_NUM_QUEUES, | ||
264 | .num_of_ampdu_queues = IWL50_NUM_AMPDU_QUEUES, | ||
265 | .mod_params = &iwl50_mod_params, | ||
266 | .valid_tx_ant = ANT_A, | ||
267 | .valid_rx_ant = ANT_AB, | ||
268 | .pll_cfg_val = CSR50_ANA_PLL_CFG_VAL, | ||
269 | .set_l0s = true, | ||
270 | .use_bsm = false, | ||
271 | .max_ll_items = OTP_MAX_LL_ITEMS_1000, | ||
272 | .shadow_ram_support = false, | ||
273 | .ht_greenfield_support = true, | ||
274 | .led_compensation = 51, | ||
275 | .chain_noise_num_beacons = IWL_CAL_NUM_BEACONS, | ||
276 | .support_ct_kill_exit = true, | ||
277 | .plcp_delta_threshold = IWL_MAX_PLCP_ERR_EXT_LONG_THRESHOLD_DEF, | ||
278 | .chain_noise_scale = 1000, | ||
165 | }; | 279 | }; |
166 | 280 | ||
281 | MODULE_FIRMWARE(IWL1000_MODULE_FIRMWARE(IWL1000_UCODE_API_MAX)); | ||