diff options
author | Wey-Yi Guy <wey-yi.w.guy@intel.com> | 2010-11-10 12:56:50 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2010-11-15 13:26:59 -0500 |
commit | f81c1f48384d398dbe8f6c5b10377c7158086791 (patch) | |
tree | f5a813c7e3b66a024adb7db8359c920fb878a4db /drivers/net/wireless/iwlwifi/iwl-tx.c | |
parent | 6fe8efb2211fe61caa7b0e1c36c521670b8a10a9 (diff) |
iwlagn: enable shadow register
For 6000 series devices and up, enable automatic update MAC's register
for better power usage in PSP mode
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/iwl-tx.c')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-tx.c | 51 |
1 files changed, 30 insertions, 21 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-tx.c b/drivers/net/wireless/iwlwifi/iwl-tx.c index 7261ee49f282..feaa3670c6bb 100644 --- a/drivers/net/wireless/iwlwifi/iwl-tx.c +++ b/drivers/net/wireless/iwlwifi/iwl-tx.c | |||
@@ -49,30 +49,39 @@ void iwl_txq_update_write_ptr(struct iwl_priv *priv, struct iwl_tx_queue *txq) | |||
49 | if (txq->need_update == 0) | 49 | if (txq->need_update == 0) |
50 | return; | 50 | return; |
51 | 51 | ||
52 | /* if we're trying to save power */ | 52 | if (priv->cfg->base_params->shadow_reg_enable) { |
53 | if (test_bit(STATUS_POWER_PMI, &priv->status)) { | 53 | /* shadow register enabled */ |
54 | /* wake up nic if it's powered down ... | ||
55 | * uCode will wake up, and interrupt us again, so next | ||
56 | * time we'll skip this part. */ | ||
57 | reg = iwl_read32(priv, CSR_UCODE_DRV_GP1); | ||
58 | |||
59 | if (reg & CSR_UCODE_DRV_GP1_BIT_MAC_SLEEP) { | ||
60 | IWL_DEBUG_INFO(priv, "Tx queue %d requesting wakeup, GP1 = 0x%x\n", | ||
61 | txq_id, reg); | ||
62 | iwl_set_bit(priv, CSR_GP_CNTRL, | ||
63 | CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ); | ||
64 | return; | ||
65 | } | ||
66 | |||
67 | iwl_write_direct32(priv, HBUS_TARG_WRPTR, | ||
68 | txq->q.write_ptr | (txq_id << 8)); | ||
69 | |||
70 | /* else not in power-save mode, uCode will never sleep when we're | ||
71 | * trying to tx (during RFKILL, we're not trying to tx). */ | ||
72 | } else | ||
73 | iwl_write32(priv, HBUS_TARG_WRPTR, | 54 | iwl_write32(priv, HBUS_TARG_WRPTR, |
74 | txq->q.write_ptr | (txq_id << 8)); | 55 | txq->q.write_ptr | (txq_id << 8)); |
56 | } else { | ||
57 | /* if we're trying to save power */ | ||
58 | if (test_bit(STATUS_POWER_PMI, &priv->status)) { | ||
59 | /* wake up nic if it's powered down ... | ||
60 | * uCode will wake up, and interrupt us again, so next | ||
61 | * time we'll skip this part. */ | ||
62 | reg = iwl_read32(priv, CSR_UCODE_DRV_GP1); | ||
63 | |||
64 | if (reg & CSR_UCODE_DRV_GP1_BIT_MAC_SLEEP) { | ||
65 | IWL_DEBUG_INFO(priv, | ||
66 | "Tx queue %d requesting wakeup," | ||
67 | " GP1 = 0x%x\n", txq_id, reg); | ||
68 | iwl_set_bit(priv, CSR_GP_CNTRL, | ||
69 | CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ); | ||
70 | return; | ||
71 | } | ||
72 | |||
73 | iwl_write_direct32(priv, HBUS_TARG_WRPTR, | ||
74 | txq->q.write_ptr | (txq_id << 8)); | ||
75 | 75 | ||
76 | /* | ||
77 | * else not in power-save mode, | ||
78 | * uCode will never sleep when we're | ||
79 | * trying to tx (during RFKILL, we're not trying to tx). | ||
80 | */ | ||
81 | } else | ||
82 | iwl_write32(priv, HBUS_TARG_WRPTR, | ||
83 | txq->q.write_ptr | (txq_id << 8)); | ||
84 | } | ||
76 | txq->need_update = 0; | 85 | txq->need_update = 0; |
77 | } | 86 | } |
78 | EXPORT_SYMBOL(iwl_txq_update_write_ptr); | 87 | EXPORT_SYMBOL(iwl_txq_update_write_ptr); |