aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlwifi/iwl-eeprom.c
diff options
context:
space:
mode:
authorBen Cahill <ben.m.cahill@intel.com>2009-10-30 17:36:06 -0400
committerJohn W. Linville <linville@tuxdriver.com>2009-11-02 15:39:44 -0500
commit88521364cc04b67f36748983545b9fe1d4ba4a15 (patch)
tree439c03a036e51326fd472f33932884047c0f3ee1 /drivers/net/wireless/iwlwifi/iwl-eeprom.c
parent5220af0c3b44f5d6e32661e5bb49154c514dbf4f (diff)
iwlwifi: remove power-wasting calls to apm_ops.init()
To save power, don't run apm_ops.init() until needed at "up" time. EEPROM (5000 and earlier devices) may be read without running apm_ops.init(), but OTP reads (6000 and newer devices) require a powered-up chip. Therefore, remove apm_ops.init() from the general path in XXXX_pci_probe(), and call it only if device uses OTP. Once done with OTP read, call apm_ops.stop() to reset chip and save power until "up" time comes around. NOTE: This patch depends on removal of priv->lock from iwl_apm_stop(); lock does not get initialized until later in flow. See patch "remove unneeded locks from apm_stop()". Signed-off-by: Ben Cahill <ben.m.cahill@intel.com> Signed-off-by: Reinette Chatre <reinette.chatre@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-eeprom.c')
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-eeprom.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-eeprom.c b/drivers/net/wireless/iwlwifi/iwl-eeprom.c
index 9429cb1c69bd..8a0709e81a9f 100644
--- a/drivers/net/wireless/iwlwifi/iwl-eeprom.c
+++ b/drivers/net/wireless/iwlwifi/iwl-eeprom.c
@@ -533,6 +533,10 @@ int iwl_eeprom_init(struct iwl_priv *priv)
533 goto err; 533 goto err;
534 } 534 }
535 if (priv->nvm_device_type == NVM_DEVICE_TYPE_OTP) { 535 if (priv->nvm_device_type == NVM_DEVICE_TYPE_OTP) {
536
537 /* OTP reads require powered-up chip */
538 priv->cfg->ops->lib->apm_ops.init(priv);
539
536 ret = iwl_init_otp_access(priv); 540 ret = iwl_init_otp_access(priv);
537 if (ret) { 541 if (ret) {
538 IWL_ERR(priv, "Failed to initialize OTP access.\n"); 542 IWL_ERR(priv, "Failed to initialize OTP access.\n");
@@ -563,6 +567,13 @@ int iwl_eeprom_init(struct iwl_priv *priv)
563 e[cache_addr / 2] = eeprom_data; 567 e[cache_addr / 2] = eeprom_data;
564 cache_addr += sizeof(u16); 568 cache_addr += sizeof(u16);
565 } 569 }
570
571 /*
572 * Now that OTP reads are complete, reset chip to save
573 * power until we load uCode during "up".
574 */
575 priv->cfg->ops->lib->apm_ops.stop(priv);
576
566 } else { 577 } else {
567 /* eeprom is an array of 16bit values */ 578 /* eeprom is an array of 16bit values */
568 for (addr = 0; addr < sz; addr += sizeof(u16)) { 579 for (addr = 0; addr < sz; addr += sizeof(u16)) {