]> git.openfabrics.org - ~emulex/infiniband.git/commitdiff
ath9k_hw: fix BT RF performance
authorRajkumar Manoharan <rmanohar@qca.qualcomm.com>
Mon, 4 Jun 2012 10:58:31 +0000 (16:28 +0530)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 6 Jun 2012 19:20:28 +0000 (15:20 -0400)
When software rfkill is triggered, before put the chip in reset
state, give LNA and SPDT control to BT to make sure BT can have
good RF performance.

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

index 854dff66a63f6b21e1eb20be362eef92f6e67bf4..8b09a8239c1c492f4a9c9d8b8c06a9f249e21a8d 100644 (file)
@@ -1391,3 +1391,19 @@ u32 ar9003_mci_state(struct ath_hw *ah, u32 state_type, u32 *p_data)
        return value;
 }
 EXPORT_SYMBOL(ar9003_mci_state);
+
+void ar9003_mci_bt_gain_ctrl(struct ath_hw *ah)
+{
+       struct ath_common *common = ath9k_hw_common(ah);
+       struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci;
+
+       ath_dbg(common, MCI, "Give LNA and SPDT control to BT\n");
+
+       REG_SET_BIT(ah, AR_PHY_GLB_CONTROL, AR_BTCOEX_CTRL_BT_OWN_SPDT_CTRL);
+       mci->is_2g = false;
+       mci->update_2g5g = true;
+       ar9003_mci_send_2g5g_status(ah, true);
+
+       /* Force another 2g5g update at next scanning */
+       mci->update_2g5g = true;
+}
index 652ab8c39e2b787fcfe4a446cccfd12581479b4c..f4a6a4450ba899e24e9862ff31a9fc5c67e6372e 100644 (file)
@@ -266,6 +266,7 @@ void ar9003_mci_setup(struct ath_hw *ah, u32 gpm_addr, void *gpm_buf,
 void ar9003_mci_cleanup(struct ath_hw *ah);
 void ar9003_mci_get_interrupt(struct ath_hw *ah, u32 *raw_intr,
                              u32 *rx_msg_intr);
+void ar9003_mci_bt_gain_ctrl(struct ath_hw *ah);
 
 /*
  * These functions are used by ath9k_hw.
index 9f0f5f74f17a5f25e36348bf900e1f1f37751b85..98478fd5d284b1c94c44bbfe2631509952f3fe5e 100644 (file)
@@ -2737,6 +2737,9 @@ EXPORT_SYMBOL(ath9k_hw_setrxfilter);
 
 bool ath9k_hw_phy_disable(struct ath_hw *ah)
 {
+       if (ath9k_hw_mci_is_enabled(ah))
+               ar9003_mci_bt_gain_ctrl(ah);
+
        if (!ath9k_hw_set_reset_reg(ah, ATH9K_RESET_WARM))
                return false;