iwlwifi: remove power-wasting calls to apm_ops.init()
authorBen Cahill <ben.m.cahill@intel.com>
Fri, 30 Oct 2009 21:36:06 +0000 (14:36 -0700)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 2 Nov 2009 20:39:44 +0000 (15:39 -0500)
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>
drivers/net/wireless/iwlwifi/iwl-agn.c
drivers/net/wireless/iwlwifi/iwl-eeprom.c
drivers/net/wireless/iwlwifi/iwl3945-base.c

index 05d1070e22d042aacc1a0cfcb0973b263b94d54e..6daaad1e4bc909bd29c37e4fc8765e41f859fc7b 100644 (file)
@@ -3113,12 +3113,6 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                goto out_iounmap;
        }
 
-       /* amp init */
-       err = priv->cfg->ops->lib->apm_ops.init(priv);
-       if (err < 0) {
-               IWL_ERR(priv, "Failed to init APMG\n");
-               goto out_iounmap;
-       }
        /*****************
         * 4. Read EEPROM
         *****************/
index 9429cb1c69bd2556fe74603c60a7b76416bc6378..8a0709e81a9f071ebe6f986c76937e1062f6b285 100644 (file)
@@ -533,6 +533,10 @@ int iwl_eeprom_init(struct iwl_priv *priv)
                goto err;
        }
        if (priv->nvm_device_type == NVM_DEVICE_TYPE_OTP) {
+
+               /* OTP reads require powered-up chip */
+               priv->cfg->ops->lib->apm_ops.init(priv);
+
                ret = iwl_init_otp_access(priv);
                if (ret) {
                        IWL_ERR(priv, "Failed to initialize OTP access.\n");
@@ -563,6 +567,13 @@ int iwl_eeprom_init(struct iwl_priv *priv)
                        e[cache_addr / 2] = eeprom_data;
                        cache_addr += sizeof(u16);
                }
+
+               /*
+                * Now that OTP reads are complete, reset chip to save
+                *   power until we load uCode during "up".
+                */
+               priv->cfg->ops->lib->apm_ops.stop(priv);
+
        } else {
                /* eeprom is an array of 16bit values */
                for (addr = 0; addr < sz; addr += sizeof(u16)) {
index 5c80a83eb2e1b42e2dafe9d6f0f3666534055a34..23b31e6dcacd03cf3c5034bb2f1bbe7ad81f9aa9 100644 (file)
@@ -4000,13 +4000,6 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e
         */
        spin_lock_init(&priv->reg_lock);
 
-       /* amp init */
-       err = priv->cfg->ops->lib->apm_ops.init(priv);
-       if (err < 0) {
-               IWL_DEBUG_INFO(priv, "Failed to init the card\n");
-               goto out_iounmap;
-       }
-
        /***********************
         * 4. Read EEPROM
         * ********************/