diff options
author | David Spinadel <david.spinadel@intel.com> | 2012-03-10 16:00:10 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2012-03-12 14:22:02 -0400 |
commit | 8f7ffbe2b275e5315773322161945a24518e31f4 (patch) | |
tree | ca73d736a52b9e443ce79a010c16d19cfb081f75 /drivers/net/wireless/iwlwifi | |
parent | 69a10b29eb87cf186cac20921b4884e349b59c97 (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.c | 1 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-core.c | 3 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-debugfs.c | 15 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-dev.h | 1 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-testmode.c | 40 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-ucode.c | 6 |
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 | } |