ath9k_hw: fix power state for MCI
authorRajkumar Manoharan <rmanohar@qca.qualcomm.com>
Mon, 4 Jun 2012 10:58:47 +0000 (16:28 +0530)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 6 Jun 2012 19:20:29 +0000 (15:20 -0400)
Program MCI related power registers only if MCI interrupts
are enabled. This could help to reduce power consumptions when
WLAN alone is enabled in BT coex chips.

Signed-off-by: Rajkumar Manoharan <rmanohar@qca.qualcomm.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/hw.c

index 98478fd..45e6700 100644 (file)
@@ -2009,12 +2009,9 @@ static void ath9k_set_power_sleep(struct ath_hw *ah)
        REG_SET_BIT(ah, AR_STA_ID1, AR_STA_ID1_PWR_SAV);
 
        if (AR_SREV_9462(ah)) {
-               REG_WRITE(ah, AR_TIMER_MODE,
-                         REG_READ(ah, AR_TIMER_MODE) & 0xFFFFFF00);
-               REG_WRITE(ah, AR_NDP2_TIMER_MODE,
-                         REG_READ(ah, AR_NDP2_TIMER_MODE) & 0xFFFFFF00);
-               REG_WRITE(ah, AR_SLP32_INC,
-                         REG_READ(ah, AR_SLP32_INC) & 0xFFF00000);
+               REG_CLR_BIT(ah, AR_TIMER_MODE, 0xff);
+               REG_CLR_BIT(ah, AR_NDP2_TIMER_MODE, 0xff);
+               REG_CLR_BIT(ah, AR_SLP32_INC, 0xfffff);
                /* xxx Required for WLAN only case ? */
                REG_WRITE(ah, AR_MCI_INTERRUPT_RX_MSG_EN, 0);
                udelay(100);
@@ -2026,7 +2023,7 @@ static void ath9k_set_power_sleep(struct ath_hw *ah)
         */
        REG_CLR_BIT(ah, AR_RTC_FORCE_WAKE, AR_RTC_FORCE_WAKE_EN);
 
-       if (AR_SREV_9462(ah))
+       if (ath9k_hw_mci_is_enabled(ah))
                udelay(100);
 
        if (!AR_SREV_9100(ah) && !AR_SREV_9300_20_OR_LATER(ah))
@@ -2051,7 +2048,6 @@ static void ath9k_set_power_sleep(struct ath_hw *ah)
 static void ath9k_set_power_network_sleep(struct ath_hw *ah)
 {
        struct ath9k_hw_capabilities *pCap = &ah->caps;
-       u32 val;
 
        REG_SET_BIT(ah, AR_STA_ID1, AR_STA_ID1_PWR_SAV);
 
@@ -2070,19 +2066,16 @@ static void ath9k_set_power_network_sleep(struct ath_hw *ah)
                 * SYS_WAKING and SYS_SLEEPING messages which will make
                 * BT CPU to busy to process.
                 */
-               if (AR_SREV_9462(ah)) {
-                       val = REG_READ(ah, AR_MCI_INTERRUPT_RX_MSG_EN) &
-                               ~AR_MCI_INTERRUPT_RX_HW_MSG_MASK;
-                       REG_WRITE(ah, AR_MCI_INTERRUPT_RX_MSG_EN, val);
-               }
+               if (ath9k_hw_mci_is_enabled(ah))
+                       REG_CLR_BIT(ah, AR_MCI_INTERRUPT_RX_MSG_EN,
+                                   AR_MCI_INTERRUPT_RX_HW_MSG_MASK);
                /*
                 * Clear the RTC force wake bit to allow the
                 * mac to go to sleep.
                 */
-               REG_CLR_BIT(ah, AR_RTC_FORCE_WAKE,
-                           AR_RTC_FORCE_WAKE_EN);
+               REG_CLR_BIT(ah, AR_RTC_FORCE_WAKE, AR_RTC_FORCE_WAKE_EN);
 
-               if (AR_SREV_9462(ah))
+               if (ath9k_hw_mci_is_enabled(ah))
                        udelay(30);
        }