aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlwifi
diff options
context:
space:
mode:
authorDavid Spinadel <david.spinadel@intel.com>2012-03-10 16:00:10 -0500
committerJohn W. Linville <linville@tuxdriver.com>2012-03-12 14:22:02 -0400
commit8f7ffbe2b275e5315773322161945a24518e31f4 (patch)
treeca73d736a52b9e443ce79a010c16d19cfb081f75 /drivers/net/wireless/iwlwifi
parent69a10b29eb87cf186cac20921b4884e349b59c97 (diff)
iwlwifi: avoid some operations if no uCode loaded
Printing the SRAM and similar testmode operations could be triggered when no uCode is loaded; prevent those invalid operations by tracking whether uCode is loaded. Signed-off-by: David Spinadel <david.spinadel@intel.com> Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi')
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn-lib.c1
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn.c2
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-core.c3
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-debugfs.c15
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-dev.h1
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-testmode.c40
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-ucode.c6
7 files changed, 48 insertions, 20 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-lib.c b/drivers/net/wireless/iwlwifi/iwl-agn-lib.c
index 915183a3a873..3e1698dc995f 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn-lib.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn-lib.c
@@ -1189,6 +1189,7 @@ int iwlagn_suspend(struct iwl_priv *priv, struct cfg80211_wowlan *wowlan)
1189 1189
1190 memcpy(&rxon, &ctx->active, sizeof(rxon)); 1190 memcpy(&rxon, &ctx->active, sizeof(rxon));
1191 1191
1192 priv->ucode_loaded = false;
1192 iwl_trans_stop_device(trans(priv)); 1193 iwl_trans_stop_device(trans(priv));
1193 1194
1194 priv->wowlan = true; 1195 priv->wowlan = true;
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
index 66d7446ff07b..f1226dbf789d 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
@@ -816,6 +816,7 @@ void iwl_down(struct iwl_priv *priv)
816 if (priv->mac80211_registered) 816 if (priv->mac80211_registered)
817 ieee80211_stop_queues(priv->hw); 817 ieee80211_stop_queues(priv->hw);
818 818
819 priv->ucode_loaded = false;
819 iwl_trans_stop_device(trans(priv)); 820 iwl_trans_stop_device(trans(priv));
820 821
821 /* Clear out all status bits but a few that are stable across reset */ 822 /* Clear out all status bits but a few that are stable across reset */
@@ -1406,6 +1407,7 @@ static void iwl_op_mode_dvm_stop(struct iwl_op_mode *op_mode)
1406 iwl_tt_exit(priv); 1407 iwl_tt_exit(priv);
1407 1408
1408 /*This will stop the queues, move the device to low power state */ 1409 /*This will stop the queues, move the device to low power state */
1410 priv->ucode_loaded = false;
1409 iwl_trans_stop_device(trans(priv)); 1411 iwl_trans_stop_device(trans(priv));
1410 1412
1411 iwl_eeprom_free(priv->shrd); 1413 iwl_eeprom_free(priv->shrd);
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c
index e3eda50a5a67..46490d3b95b9 100644
--- a/drivers/net/wireless/iwlwifi/iwl-core.c
+++ b/drivers/net/wireless/iwlwifi/iwl-core.c
@@ -838,6 +838,9 @@ static void iwlagn_fw_error(struct iwl_priv *priv, bool ondemand)
838 iwl_print_rx_config_cmd(priv, IWL_RXON_CTX_BSS); 838 iwl_print_rx_config_cmd(priv, IWL_RXON_CTX_BSS);
839#endif 839#endif
840 840
841 /* uCode is no longer loaded. */
842 priv->ucode_loaded = false;
843
841 /* Set the FW error flag -- cleared on iwl_down */ 844 /* Set the FW error flag -- cleared on iwl_down */
842 set_bit(STATUS_FW_ERROR, &priv->shrd->status); 845 set_bit(STATUS_FW_ERROR, &priv->shrd->status);
843 846
diff --git a/drivers/net/wireless/iwlwifi/iwl-debugfs.c b/drivers/net/wireless/iwlwifi/iwl-debugfs.c
index 9b71c87847c2..89cb9a7a3b56 100644
--- a/drivers/net/wireless/iwlwifi/iwl-debugfs.c
+++ b/drivers/net/wireless/iwlwifi/iwl-debugfs.c
@@ -235,10 +235,21 @@ static ssize_t iwl_dbgfs_sram_read(struct file *file,
235 /* default is to dump the entire data segment */ 235 /* default is to dump the entire data segment */
236 if (!priv->dbgfs_sram_offset && !priv->dbgfs_sram_len) { 236 if (!priv->dbgfs_sram_offset && !priv->dbgfs_sram_len) {
237 priv->dbgfs_sram_offset = 0x800000; 237 priv->dbgfs_sram_offset = 0x800000;
238 if (priv->shrd->ucode_type == IWL_UCODE_INIT) 238 if (!priv->ucode_loaded) {
239 IWL_ERR(priv, "No uCode has been loadded.\n");
240 return -EINVAL;
241 }
242 if (priv->shrd->ucode_type == IWL_UCODE_INIT) {
239 priv->dbgfs_sram_len = priv->fw->ucode_init.data.len; 243 priv->dbgfs_sram_len = priv->fw->ucode_init.data.len;
240 else 244 } else if (priv->shrd->ucode_type == IWL_UCODE_REGULAR) {
241 priv->dbgfs_sram_len = priv->fw->ucode_rt.data.len; 245 priv->dbgfs_sram_len = priv->fw->ucode_rt.data.len;
246 } else if (priv->shrd->ucode_type == IWL_UCODE_WOWLAN) {
247 priv->dbgfs_sram_len = priv->fw->ucode_wowlan.data.len;
248 } else {
249 IWL_ERR(priv, "Unsupported type of uCode loaded?"
250 " that shouldn't happen.\n");
251 return -EINVAL;
252 }
242 } 253 }
243 len = priv->dbgfs_sram_len; 254 len = priv->dbgfs_sram_len;
244 255
diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h
index aa4b3b122da4..01dbe1162f96 100644
--- a/drivers/net/wireless/iwlwifi/iwl-dev.h
+++ b/drivers/net/wireless/iwlwifi/iwl-dev.h
@@ -769,6 +769,7 @@ struct iwl_priv {
769 /* firmware reload counter and timestamp */ 769 /* firmware reload counter and timestamp */
770 unsigned long reload_jiffies; 770 unsigned long reload_jiffies;
771 int reload_count; 771 int reload_count;
772 bool ucode_loaded;
772 773
773 /* we allocate array of iwl_channel_info for NIC's valid channels. 774 /* we allocate array of iwl_channel_info for NIC's valid channels.
774 * Access via channel # using indirect index array */ 775 * Access via channel # using indirect index array */
diff --git a/drivers/net/wireless/iwlwifi/iwl-testmode.c b/drivers/net/wireless/iwlwifi/iwl-testmode.c
index b06c6763cb7a..c6c084f45b72 100644
--- a/drivers/net/wireless/iwlwifi/iwl-testmode.c
+++ b/drivers/net/wireless/iwlwifi/iwl-testmode.c
@@ -494,6 +494,7 @@ static int iwl_testmode_driver(struct ieee80211_hw *hw, struct nlattr **tb)
494 494
495 case IWL_TM_CMD_APP2DEV_CFG_INIT_CALIB: 495 case IWL_TM_CMD_APP2DEV_CFG_INIT_CALIB:
496 iwl_testmode_cfg_init_calib(priv); 496 iwl_testmode_cfg_init_calib(priv);
497 priv->ucode_loaded = false;
497 iwl_trans_stop_device(trans); 498 iwl_trans_stop_device(trans);
498 break; 499 break;
499 500
@@ -512,6 +513,7 @@ static int iwl_testmode_driver(struct ieee80211_hw *hw, struct nlattr **tb)
512 513
513 case IWL_TM_CMD_APP2DEV_LOAD_WOWLAN_FW: 514 case IWL_TM_CMD_APP2DEV_LOAD_WOWLAN_FW:
514 iwl_scan_cancel_timeout(priv, 200); 515 iwl_scan_cancel_timeout(priv, 200);
516 priv->ucode_loaded = false;
515 iwl_trans_stop_device(trans); 517 iwl_trans_stop_device(trans);
516 status = iwl_load_ucode_wait_alive(priv, IWL_UCODE_WOWLAN); 518 status = iwl_load_ucode_wait_alive(priv, IWL_UCODE_WOWLAN);
517 if (status) { 519 if (status) {
@@ -591,25 +593,27 @@ static int iwl_testmode_driver(struct ieee80211_hw *hw, struct nlattr **tb)
591 IWL_ERR(priv, "Memory allocation fail\n"); 593 IWL_ERR(priv, "Memory allocation fail\n");
592 return -ENOMEM; 594 return -ENOMEM;
593 } 595 }
594 switch (priv->shrd->ucode_type) { 596 if (!priv->ucode_loaded) {
595 case IWL_UCODE_REGULAR:
596 inst_size = priv->fw->ucode_rt.code.len;
597 data_size = priv->fw->ucode_rt.data.len;
598 break;
599 case IWL_UCODE_INIT:
600 inst_size = priv->fw->ucode_init.code.len;
601 data_size = priv->fw->ucode_init.data.len;
602 break;
603 case IWL_UCODE_WOWLAN:
604 inst_size = priv->fw->ucode_wowlan.code.len;
605 data_size = priv->fw->ucode_wowlan.data.len;
606 break;
607 case IWL_UCODE_NONE:
608 IWL_ERR(priv, "No uCode has not been loaded\n"); 597 IWL_ERR(priv, "No uCode has not been loaded\n");
609 break; 598 return -EINVAL;
610 default: 599 } else {
611 IWL_ERR(priv, "Unsupported uCode type\n"); 600 switch (priv->shrd->ucode_type) {
612 break; 601 case IWL_UCODE_REGULAR:
602 inst_size = priv->fw->ucode_rt.code.len;
603 data_size = priv->fw->ucode_rt.data.len;
604 break;
605 case IWL_UCODE_INIT:
606 inst_size = priv->fw->ucode_init.code.len;
607 data_size = priv->fw->ucode_init.data.len;
608 break;
609 case IWL_UCODE_WOWLAN:
610 inst_size = priv->fw->ucode_wowlan.code.len;
611 data_size = priv->fw->ucode_wowlan.data.len;
612 break;
613 default:
614 IWL_ERR(priv, "Unsupported uCode type\n");
615 break;
616 }
613 } 617 }
614 NLA_PUT_U32(skb, IWL_TM_ATTR_FW_TYPE, priv->shrd->ucode_type); 618 NLA_PUT_U32(skb, IWL_TM_ATTR_FW_TYPE, priv->shrd->ucode_type);
615 NLA_PUT_U32(skb, IWL_TM_ATTR_FW_INST_SIZE, inst_size); 619 NLA_PUT_U32(skb, IWL_TM_ATTR_FW_INST_SIZE, inst_size);
diff --git a/drivers/net/wireless/iwlwifi/iwl-ucode.c b/drivers/net/wireless/iwlwifi/iwl-ucode.c
index d97cf44b75ba..ae935c0e3563 100644
--- a/drivers/net/wireless/iwlwifi/iwl-ucode.c
+++ b/drivers/net/wireless/iwlwifi/iwl-ucode.c
@@ -465,6 +465,8 @@ int iwl_load_ucode_wait_alive(struct iwl_priv *priv,
465 priv->shrd->ucode_type = ucode_type; 465 priv->shrd->ucode_type = ucode_type;
466 fw = iwl_get_ucode_image(priv, ucode_type); 466 fw = iwl_get_ucode_image(priv, ucode_type);
467 467
468 priv->ucode_loaded = false;
469
468 if (!fw) 470 if (!fw)
469 return -EINVAL; 471 return -EINVAL;
470 472
@@ -519,6 +521,8 @@ int iwl_load_ucode_wait_alive(struct iwl_priv *priv,
519 return ret; 521 return ret;
520 } 522 }
521 523
524 priv->ucode_loaded = true;
525
522 return 0; 526 return 0;
523} 527}
524 528
@@ -563,5 +567,7 @@ int iwl_run_init_ucode(struct iwl_priv *priv)
563 out: 567 out:
564 /* Whatever happened, stop the device */ 568 /* Whatever happened, stop the device */
565 iwl_trans_stop_device(trans(priv)); 569 iwl_trans_stop_device(trans(priv));
570 priv->ucode_loaded = false;
571
566 return ret; 572 return ret;
567} 573}