svn commit: r301094 - head/sys/contrib/dev/ath/ath_hal/ar9300

Adrian Chadd adrian at FreeBSD.org
Wed Jun 1 03:24:54 UTC 2016


Author: adrian
Date: Wed Jun  1 03:24:53 2016
New Revision: 301094
URL: https://svnweb.freebsd.org/changeset/base/301094

Log:
  [ath_hal] add support for QCA9565 for configuring the bluetooth antenna LNA diversity.
  
  Notably, this also sets AR_BTCOEX_WL_LNADIV to FORCE_ON, so LNA diversity
  is always enabled and under control of the wifi chip.
  
  Tested:
  
  * QCA9565, STA + bluetooth mode
  
  Obtained from:	Linux ath9k

Modified:
  head/sys/contrib/dev/ath/ath_hal/ar9300/ar9300_reset.c

Modified: head/sys/contrib/dev/ath/ath_hal/ar9300/ar9300_reset.c
==============================================================================
--- head/sys/contrib/dev/ath/ath_hal/ar9300/ar9300_reset.c	Wed Jun  1 03:21:23 2016	(r301093)
+++ head/sys/contrib/dev/ath/ath_hal/ar9300/ar9300_reset.c	Wed Jun  1 03:24:53 2016	(r301094)
@@ -5340,6 +5340,9 @@ ar9300_reset(struct ath_hal *ah, HAL_OPM
 
     ar9300_set_smart_antenna(ah, ahp->ah_smartantenna_enable);
 
+    if (AR_SREV_APHRODITE(ah) && ahp->ah_lna_div_use_bt_ant_enable)
+        OS_REG_SET_BIT(ah, AR_BTCOEX_WL_LNADIV, AR_BTCOEX_WL_LNADIV_FORCE_ON);
+
     if (ahp->ah_skip_rx_iq_cal && !is_scan) {
         /* restore RX Cal result if existing */
         ar9300_rx_iq_cal_restore(ah);
@@ -6385,6 +6388,9 @@ ar9300_ant_ctrl_set_lna_div_use_bt_ant(s
     struct ath_hal_private *ahpriv = AH_PRIVATE(ah);
     HAL_CAPABILITIES *pcap = &ahpriv->ah_caps;
 
+    HALDEBUG(ah, HAL_DEBUG_RESET | HAL_DEBUG_BT_COEX,
+      "%s: called; enable=%d\n", __func__, enable);
+
     if (AR_SREV_POSEIDON(ah)) {
         // Make sure this scheme is only used for WB225(Astra)
         ahp->ah_lna_div_use_bt_ant_enable = enable;
@@ -6454,10 +6460,35 @@ ar9300_ant_ctrl_set_lna_div_use_bt_ant(s
         }
 
         return AH_TRUE;
-    } else {
+    } else if (AR_SREV_APHRODITE(ah)) {
+        ahp->ah_lna_div_use_bt_ant_enable = enable;
+        if (enable) {
+                OS_REG_SET_BIT(ah, AR_PHY_MC_GAIN_CTRL, ANT_DIV_ENABLE);
+                OS_REG_SET_BIT(ah, AR_PHY_MC_GAIN_CTRL, (1 << MULTICHAIN_GAIN_CTRL__ENABLE_ANT_SW_RX_PROT__SHIFT));
+                OS_REG_SET_BIT(ah, AR_PHY_CCK_DETECT, AR_PHY_CCK_DETECT_BB_ENABLE_ANT_FAST_DIV);
+                OS_REG_SET_BIT(ah, AR_PHY_RESTART, RESTART__ENABLE_ANT_FAST_DIV_M2FLAG__MASK);
+                OS_REG_SET_BIT(ah, AR_BTCOEX_WL_LNADIV, AR_BTCOEX_WL_LNADIV_FORCE_ON);
+        } else {
+                OS_REG_CLR_BIT(ah, AR_PHY_MC_GAIN_CTRL, ANT_DIV_ENABLE);
+                OS_REG_CLR_BIT(ah, AR_PHY_MC_GAIN_CTRL, (1 << MULTICHAIN_GAIN_CTRL__ENABLE_ANT_SW_RX_PROT__SHIFT));
+                OS_REG_CLR_BIT(ah, AR_PHY_CCK_DETECT, AR_PHY_CCK_DETECT_BB_ENABLE_ANT_FAST_DIV);
+                OS_REG_CLR_BIT(ah, AR_PHY_RESTART, RESTART__ENABLE_ANT_FAST_DIV_M2FLAG__MASK);
+                OS_REG_CLR_BIT(ah, AR_BTCOEX_WL_LNADIV, AR_BTCOEX_WL_LNADIV_FORCE_ON);
+
+                regval = OS_REG_READ(ah, AR_PHY_MC_GAIN_CTRL);
+                regval &= (~(MULTICHAIN_GAIN_CTRL__ANT_DIV_MAIN_LNACONF__MASK |
+                             MULTICHAIN_GAIN_CTRL__ANT_DIV_ALT_LNACONF__MASK |
+                             MULTICHAIN_GAIN_CTRL__ANT_DIV_ALT_GAINTB__MASK |
+                             MULTICHAIN_GAIN_CTRL__ANT_DIV_MAIN_GAINTB__MASK));
+                regval |= (HAL_ANT_DIV_COMB_LNA1 <<
+                           MULTICHAIN_GAIN_CTRL__ANT_DIV_MAIN_LNACONF__SHIFT);
+                regval |= (HAL_ANT_DIV_COMB_LNA2 <<
+                           MULTICHAIN_GAIN_CTRL__ANT_DIV_ALT_LNACONF__SHIFT);
+ 
+                OS_REG_WRITE(ah, AR_PHY_MC_GAIN_CTRL, regval);
+        }
         return AH_TRUE;
     }
-
-    /* XXX TODO: Add AR9565 support? */
+    return AH_TRUE;
 }
 #endif /* ATH_ANT_DIV_COMB */


More information about the svn-src-all mailing list