aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEmmanuel Grumbach <emmanuel.grumbach@intel.com>2008-05-04 22:22:45 -0400
committerJohn W. Linville <linville@tuxdriver.com>2008-05-14 16:29:46 -0400
commitf3ccc08c8cdeb784087348e67f41a779c787fa0e (patch)
treede0c1ebf27ab265613829fb70c8cd6a235b8cec0
parent27aaba0ca099461badb496bf7cde5ab5cdc89b98 (diff)
iwlwifi: move iwl4965_init_alive_start to iwl-4965.c
This patch moves iwl_4965_init_alive_start to iwl-4965.c. Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com> Signed-off-by: Tomas Winkler <tomas.winkler@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-4965.c97
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-core.h2
-rw-r--r--drivers/net/wireless/iwlwifi/iwl4965-base.c101
3 files changed, 100 insertions, 100 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965.c b/drivers/net/wireless/iwlwifi/iwl-4965.c
index 319ffe747a70..f56b9a91d78a 100644
--- a/drivers/net/wireless/iwlwifi/iwl-4965.c
+++ b/drivers/net/wireless/iwlwifi/iwl-4965.c
@@ -222,6 +222,102 @@ static int iwl4965_load_bsm(struct iwl_priv *priv)
222 return 0; 222 return 0;
223} 223}
224 224
225/**
226 * iwl4965_set_ucode_ptrs - Set uCode address location
227 *
228 * Tell initialization uCode where to find runtime uCode.
229 *
230 * BSM registers initially contain pointers to initialization uCode.
231 * We need to replace them to load runtime uCode inst and data,
232 * and to save runtime data when powering down.
233 */
234static int iwl4965_set_ucode_ptrs(struct iwl_priv *priv)
235{
236 dma_addr_t pinst;
237 dma_addr_t pdata;
238 unsigned long flags;
239 int ret = 0;
240
241 /* bits 35:4 for 4965 */
242 pinst = priv->ucode_code.p_addr >> 4;
243 pdata = priv->ucode_data_backup.p_addr >> 4;
244
245 spin_lock_irqsave(&priv->lock, flags);
246 ret = iwl_grab_nic_access(priv);
247 if (ret) {
248 spin_unlock_irqrestore(&priv->lock, flags);
249 return ret;
250 }
251
252 /* Tell bootstrap uCode where to find image to load */
253 iwl_write_prph(priv, BSM_DRAM_INST_PTR_REG, pinst);
254 iwl_write_prph(priv, BSM_DRAM_DATA_PTR_REG, pdata);
255 iwl_write_prph(priv, BSM_DRAM_DATA_BYTECOUNT_REG,
256 priv->ucode_data.len);
257
258 /* Inst bytecount must be last to set up, bit 31 signals uCode
259 * that all new ptr/size info is in place */
260 iwl_write_prph(priv, BSM_DRAM_INST_BYTECOUNT_REG,
261 priv->ucode_code.len | BSM_DRAM_INST_LOAD);
262 iwl_release_nic_access(priv);
263
264 spin_unlock_irqrestore(&priv->lock, flags);
265
266 IWL_DEBUG_INFO("Runtime uCode pointers are set.\n");
267
268 return ret;
269}
270
271/**
272 * iwl4965_init_alive_start - Called after REPLY_ALIVE notification received
273 *
274 * Called after REPLY_ALIVE notification received from "initialize" uCode.
275 *
276 * The 4965 "initialize" ALIVE reply contains calibration data for:
277 * Voltage, temperature, and MIMO tx gain correction, now stored in priv
278 * (3945 does not contain this data).
279 *
280 * Tell "initialize" uCode to go ahead and load the runtime uCode.
281*/
282static void iwl4965_init_alive_start(struct iwl_priv *priv)
283{
284 /* Check alive response for "valid" sign from uCode */
285 if (priv->card_alive_init.is_valid != UCODE_VALID_OK) {
286 /* We had an error bringing up the hardware, so take it
287 * all the way back down so we can try again */
288 IWL_DEBUG_INFO("Initialize Alive failed.\n");
289 goto restart;
290 }
291
292 /* Bootstrap uCode has loaded initialize uCode ... verify inst image.
293 * This is a paranoid check, because we would not have gotten the
294 * "initialize" alive if code weren't properly loaded. */
295 if (iwl_verify_ucode(priv)) {
296 /* Runtime instruction load was bad;
297 * take it all the way back down so we can try again */
298 IWL_DEBUG_INFO("Bad \"initialize\" uCode load.\n");
299 goto restart;
300 }
301
302 /* Calculate temperature */
303 priv->temperature = iwl4965_get_temperature(priv);
304
305 /* Send pointers to protocol/runtime uCode image ... init code will
306 * load and launch runtime uCode, which will send us another "Alive"
307 * notification. */
308 IWL_DEBUG_INFO("Initialization Alive received.\n");
309 if (iwl4965_set_ucode_ptrs(priv)) {
310 /* Runtime instruction load won't happen;
311 * take it all the way back down so we can try again */
312 IWL_DEBUG_INFO("Couldn't set up uCode pointers.\n");
313 goto restart;
314 }
315 return;
316
317restart:
318 queue_work(priv->workqueue, &priv->restart);
319}
320
225static int is_fat_channel(__le32 rxon_flags) 321static int is_fat_channel(__le32 rxon_flags)
226{ 322{
227 return (rxon_flags & RXON_FLG_CHANNEL_MODE_PURE_40_MSK) || 323 return (rxon_flags & RXON_FLG_CHANNEL_MODE_PURE_40_MSK) ||
@@ -3724,6 +3820,7 @@ static struct iwl_lib_ops iwl4965_lib = {
3724 .rx_handler_setup = iwl4965_rx_handler_setup, 3820 .rx_handler_setup = iwl4965_rx_handler_setup,
3725 .is_valid_rtc_data_addr = iwl4965_hw_valid_rtc_data_addr, 3821 .is_valid_rtc_data_addr = iwl4965_hw_valid_rtc_data_addr,
3726 .alive_notify = iwl4965_alive_notify, 3822 .alive_notify = iwl4965_alive_notify,
3823 .init_alive_start = iwl4965_init_alive_start,
3727 .load_ucode = iwl4965_load_bsm, 3824 .load_ucode = iwl4965_load_bsm,
3728 .apm_ops = { 3825 .apm_ops = {
3729 .init = iwl4965_apm_init, 3826 .init = iwl4965_apm_init,
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h
index 3a75dc6e35a2..08eccdefd72e 100644
--- a/drivers/net/wireless/iwlwifi/iwl-core.h
+++ b/drivers/net/wireless/iwlwifi/iwl-core.h
@@ -110,6 +110,8 @@ struct iwl_lib_ops {
110 void (*rx_handler_setup)(struct iwl_priv *priv); 110 void (*rx_handler_setup)(struct iwl_priv *priv);
111 /* nic Tx fifo handling */ 111 /* nic Tx fifo handling */
112 int (*disable_tx_fifo)(struct iwl_priv *priv); 112 int (*disable_tx_fifo)(struct iwl_priv *priv);
113 /* alive notification after init uCode load */
114 void (*init_alive_start)(struct iwl_priv *priv);
113 /* alive notification */ 115 /* alive notification */
114 int (*alive_notify)(struct iwl_priv *priv); 116 int (*alive_notify)(struct iwl_priv *priv);
115 /* check validity of rtc data address */ 117 /* check validity of rtc data address */
diff --git a/drivers/net/wireless/iwlwifi/iwl4965-base.c b/drivers/net/wireless/iwlwifi/iwl4965-base.c
index 8d06cf1a3193..2e976c3881e6 100644
--- a/drivers/net/wireless/iwlwifi/iwl4965-base.c
+++ b/drivers/net/wireless/iwlwifi/iwl4965-base.c
@@ -4162,105 +4162,6 @@ static int iwl4965_read_ucode(struct iwl_priv *priv)
4162 return ret; 4162 return ret;
4163} 4163}
4164 4164
4165
4166/**
4167 * iwl4965_set_ucode_ptrs - Set uCode address location
4168 *
4169 * Tell initialization uCode where to find runtime uCode.
4170 *
4171 * BSM registers initially contain pointers to initialization uCode.
4172 * We need to replace them to load runtime uCode inst and data,
4173 * and to save runtime data when powering down.
4174 */
4175static int iwl4965_set_ucode_ptrs(struct iwl_priv *priv)
4176{
4177 dma_addr_t pinst;
4178 dma_addr_t pdata;
4179 int rc = 0;
4180 unsigned long flags;
4181
4182 /* bits 35:4 for 4965 */
4183 pinst = priv->ucode_code.p_addr >> 4;
4184 pdata = priv->ucode_data_backup.p_addr >> 4;
4185
4186 spin_lock_irqsave(&priv->lock, flags);
4187 rc = iwl_grab_nic_access(priv);
4188 if (rc) {
4189 spin_unlock_irqrestore(&priv->lock, flags);
4190 return rc;
4191 }
4192
4193 /* Tell bootstrap uCode where to find image to load */
4194 iwl_write_prph(priv, BSM_DRAM_INST_PTR_REG, pinst);
4195 iwl_write_prph(priv, BSM_DRAM_DATA_PTR_REG, pdata);
4196 iwl_write_prph(priv, BSM_DRAM_DATA_BYTECOUNT_REG,
4197 priv->ucode_data.len);
4198
4199 /* Inst bytecount must be last to set up, bit 31 signals uCode
4200 * that all new ptr/size info is in place */
4201 iwl_write_prph(priv, BSM_DRAM_INST_BYTECOUNT_REG,
4202 priv->ucode_code.len | BSM_DRAM_INST_LOAD);
4203
4204 iwl_release_nic_access(priv);
4205
4206 spin_unlock_irqrestore(&priv->lock, flags);
4207
4208 IWL_DEBUG_INFO("Runtime uCode pointers are set.\n");
4209
4210 return rc;
4211}
4212
4213/**
4214 * iwl4965_init_alive_start - Called after REPLY_ALIVE notification received
4215 *
4216 * Called after REPLY_ALIVE notification received from "initialize" uCode.
4217 *
4218 * The 4965 "initialize" ALIVE reply contains calibration data for:
4219 * Voltage, temperature, and MIMO tx gain correction, now stored in priv
4220 * (3945 does not contain this data).
4221 *
4222 * Tell "initialize" uCode to go ahead and load the runtime uCode.
4223*/
4224static void iwl4965_init_alive_start(struct iwl_priv *priv)
4225{
4226 /* Check alive response for "valid" sign from uCode */
4227 if (priv->card_alive_init.is_valid != UCODE_VALID_OK) {
4228 /* We had an error bringing up the hardware, so take it
4229 * all the way back down so we can try again */
4230 IWL_DEBUG_INFO("Initialize Alive failed.\n");
4231 goto restart;
4232 }
4233
4234 /* Bootstrap uCode has loaded initialize uCode ... verify inst image.
4235 * This is a paranoid check, because we would not have gotten the
4236 * "initialize" alive if code weren't properly loaded. */
4237 if (iwl_verify_ucode(priv)) {
4238 /* Runtime instruction load was bad;
4239 * take it all the way back down so we can try again */
4240 IWL_DEBUG_INFO("Bad \"initialize\" uCode load.\n");
4241 goto restart;
4242 }
4243
4244 /* Calculate temperature */
4245 priv->temperature = iwl4965_get_temperature(priv);
4246
4247 /* Send pointers to protocol/runtime uCode image ... init code will
4248 * load and launch runtime uCode, which will send us another "Alive"
4249 * notification. */
4250 IWL_DEBUG_INFO("Initialization Alive received.\n");
4251 if (iwl4965_set_ucode_ptrs(priv)) {
4252 /* Runtime instruction load won't happen;
4253 * take it all the way back down so we can try again */
4254 IWL_DEBUG_INFO("Couldn't set up uCode pointers.\n");
4255 goto restart;
4256 }
4257 return;
4258
4259 restart:
4260 queue_work(priv->workqueue, &priv->restart);
4261}
4262
4263
4264/** 4165/**
4265 * iwl4965_alive_start - called after REPLY_ALIVE notification received 4166 * iwl4965_alive_start - called after REPLY_ALIVE notification received
4266 * from protocol/runtime uCode (initialization uCode's 4167 * from protocol/runtime uCode (initialization uCode's
@@ -4586,7 +4487,7 @@ static void iwl4965_bg_init_alive_start(struct work_struct *data)
4586 return; 4487 return;
4587 4488
4588 mutex_lock(&priv->mutex); 4489 mutex_lock(&priv->mutex);
4589 iwl4965_init_alive_start(priv); 4490 priv->cfg->ops->lib->init_alive_start(priv);
4590 mutex_unlock(&priv->mutex); 4491 mutex_unlock(&priv->mutex);
4591} 4492}
4592 4493