From owner-svn-src-head@freebsd.org Wed Jun 1 03:27:35 2016 Return-Path: Delivered-To: svn-src-head@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 0F6D7B56EED; Wed, 1 Jun 2016 03:27:35 +0000 (UTC) (envelope-from adrian@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id B9A9C13A9; Wed, 1 Jun 2016 03:27:34 +0000 (UTC) (envelope-from adrian@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id u513RXO6037434; Wed, 1 Jun 2016 03:27:33 GMT (envelope-from adrian@FreeBSD.org) Received: (from adrian@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id u513RXq0037433; Wed, 1 Jun 2016 03:27:33 GMT (envelope-from adrian@FreeBSD.org) Message-Id: <201606010327.u513RXq0037433@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: adrian set sender to adrian@FreeBSD.org using -f From: Adrian Chadd Date: Wed, 1 Jun 2016 03:27:33 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r301095 - head/sys/contrib/dev/ath/ath_hal/ar9300 X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 01 Jun 2016 03:27:35 -0000 Author: adrian Date: Wed Jun 1 03:27:33 2016 New Revision: 301095 URL: https://svnweb.freebsd.org/changeset/base/301095 Log: [ath_hal] add MCI bits from ath9k for QCA9565 * Add extra debugging - the weights debugging is really useful to ensure things are programmed into the wlan coexistence table. The weights are what traffic priority each of the various modes get (tx, tx-high-priority, rx-beacon, etc) if they're all zero, things work very poorly. * Add in coex init routines from ath9k for AR9462 and QCA9565 1ANT and 2ANT. This control things like beacon stomping, ACK handling, antennas, PA/LNA shared, etc. * Some ancillary bits. TODO: * There's some conditional stuff around MCI_ANT_ARCH_PA_LNA_SHARED() in ath9k which doesn't always enable force-on LNA. That'll have to be examined and merged in as appropriate. Obtained from: linux ath9k Modified: head/sys/contrib/dev/ath/ath_hal/ar9300/ar9300_mci.c Modified: head/sys/contrib/dev/ath/ath_hal/ar9300/ar9300_mci.c ============================================================================== --- head/sys/contrib/dev/ath/ath_hal/ar9300/ar9300_mci.c Wed Jun 1 03:24:53 2016 (r301094) +++ head/sys/contrib/dev/ath/ath_hal/ar9300/ar9300_mci.c Wed Jun 1 03:27:33 2016 (r301095) @@ -73,6 +73,10 @@ void ar9300_mci_osla_setup(struct ath_ha if (!(ah->ah_config.ath_hal_mci_config & ATH_MCI_CONFIG_DISABLE_AGGR_THRESH)) { + + if (AR_SREV_APHRODITE(ah)) + OS_REG_RMW_FIELD(ah, AR_MCI_MISC, AR_MCI_MISC_HW_FIX_EN, 1); + thresh = MS(ah->ah_config.ath_hal_mci_config, ATH_MCI_CONFIG_AGGR_THRESH); OS_REG_RMW_FIELD(ah, AR_BTCOEX_CTRL, @@ -147,11 +151,11 @@ static int32_t ar9300_mci_wait_for_inter } if (time_out <= 0) { - HALDEBUG(ah, HAL_DEBUG_BT_COEX, + HALDEBUG(ah, HAL_DEBUG_BT_COEX, "(MCI) %s: Wait for Reg0x%08x = 0x%08x timeout.\n", __func__, address, bit_position); HALDEBUG(ah, HAL_DEBUG_BT_COEX, - "(MCI) INT_RAW = 0x%08x, RX_MSG_RAW = 0x%08x", + "(MCI) INT_RAW = 0x%08x, RX_MSG_RAW = 0x%08x\n", OS_REG_READ(ah, AR_MCI_INTERRUPT_RAW), OS_REG_READ(ah, AR_MCI_INTERRUPT_RX_MSG_RAW)); time_out = 0; @@ -450,6 +454,9 @@ void ar9300_mci_2g5g_switch(struct ath_h void ar9300_mci_mute_bt(struct ath_hal *ah) { + + HALDEBUG(ah, HAL_DEBUG_BT_COEX, "%s: called\n", __func__); + /* disable all MCI messages */ OS_REG_WRITE(ah, AR_MCI_MSG_ATTRIBUTES_TABLE, 0xFFFF0000); OS_REG_WRITE(ah, AR_BTCOEX_WL_WEIGHTS0, 0xFFFFFFFF); @@ -488,10 +495,13 @@ static void ar9300_mci_observation_set_u OS_REG_WRITE(ah, AR_PHY_TEST, 0x00080000); // a360 OS_REG_WRITE(ah, AR_PHY_TEST_CTL_STATUS, 0xe0000000); // a364 */ + HALDEBUG(ah, HAL_DEBUG_BT_COEX, "%s: called; config=0x%08x\n", + __func__, ah->ah_config.ath_hal_mci_config); if (ah->ah_config.ath_hal_mci_config & ATH_MCI_CONFIG_MCI_OBS_MCI) { + HALDEBUG(ah, HAL_DEBUG_BT_COEX, "%s: CONFIG_MCI_OBS_MCI\n", __func__); ar9300_gpio_cfg_output(ah, 3, HAL_GPIO_OUTPUT_MUX_AS_MCI_WLAN_DATA); ar9300_gpio_cfg_output(ah, 2, HAL_GPIO_OUTPUT_MUX_AS_MCI_WLAN_CLK); ar9300_gpio_cfg_output(ah, 1, HAL_GPIO_OUTPUT_MUX_AS_MCI_BT_DATA); @@ -500,6 +510,7 @@ static void ar9300_mci_observation_set_u else if (ah->ah_config.ath_hal_mci_config & ATH_MCI_CONFIG_MCI_OBS_TXRX) { + HALDEBUG(ah, HAL_DEBUG_BT_COEX, "%s: CONFIG_MCI_OBS_TXRX\n", __func__); ar9300_gpio_cfg_output(ah, 3, HAL_GPIO_OUTPUT_MUX_AS_WL_IN_TX); ar9300_gpio_cfg_output(ah, 2, HAL_GPIO_OUTPUT_MUX_AS_WL_IN_RX); ar9300_gpio_cfg_output(ah, 1, HAL_GPIO_OUTPUT_MUX_AS_BT_IN_TX); @@ -509,6 +520,7 @@ static void ar9300_mci_observation_set_u else if (ah->ah_config.ath_hal_mci_config & ATH_MCI_CONFIG_MCI_OBS_BT) { + HALDEBUG(ah, HAL_DEBUG_BT_COEX, "%s: CONFIG_MCI_OBS_BT\n", __func__); ar9300_gpio_cfg_output(ah, 3, HAL_GPIO_OUTPUT_MUX_AS_BT_IN_TX); ar9300_gpio_cfg_output(ah, 2, HAL_GPIO_OUTPUT_MUX_AS_BT_IN_RX); ar9300_gpio_cfg_output(ah, 1, HAL_GPIO_OUTPUT_MUX_AS_MCI_BT_DATA); @@ -913,6 +925,68 @@ void ar9300_mci_enable_interrupt(struct AR_MCI_INTERRUPT_RX_MSG_DEFAULT); } +static void ar9300_mci_set_btcoex_ctrl_9565_1ANT(struct ath_hal *ah) +{ + uint32_t regval; + + HALDEBUG(ah, HAL_DEBUG_BT_COEX, "%s: called\n", __func__); + regval = SM(1, AR_BTCOEX_CTRL_JUPITER_MODE) | + SM(1, AR_BTCOEX_CTRL_WBTIMER_EN) | + SM(1, AR_BTCOEX_CTRL_PA_SHARED) | + SM(1, AR_BTCOEX_CTRL_LNA_SHARED) | + SM(1, AR_BTCOEX_CTRL_NUM_ANTENNAS) | + SM(1, AR_BTCOEX_CTRL_RX_CHAIN_MASK) | + SM(0, AR_BTCOEX_CTRL_1_CHAIN_ACK) | + SM(0, AR_BTCOEX_CTRL_1_CHAIN_BCN) | + SM(0, AR_BTCOEX_CTRL_ONE_STEP_LOOK_AHEAD_EN); + + OS_REG_RMW_FIELD(ah, AR_BTCOEX_CTRL2, + AR_BTCOEX_CTRL2_TX_CHAIN_MASK, 0x1); + OS_REG_WRITE(ah, AR_BTCOEX_CTRL, regval); +} + +static void ar9300_mci_set_btcoex_ctrl_9565_2ANT(struct ath_hal *ah) +{ + uint32_t regval; + + HALDEBUG(ah, HAL_DEBUG_BT_COEX, "%s: called\n", __func__); + regval = SM(1, AR_BTCOEX_CTRL_JUPITER_MODE) | + SM(1, AR_BTCOEX_CTRL_WBTIMER_EN) | + SM(0, AR_BTCOEX_CTRL_PA_SHARED) | + SM(0, AR_BTCOEX_CTRL_LNA_SHARED) | + SM(2, AR_BTCOEX_CTRL_NUM_ANTENNAS) | + SM(1, AR_BTCOEX_CTRL_RX_CHAIN_MASK) | + SM(0, AR_BTCOEX_CTRL_1_CHAIN_ACK) | + SM(0, AR_BTCOEX_CTRL_1_CHAIN_BCN) | + SM(0, AR_BTCOEX_CTRL_ONE_STEP_LOOK_AHEAD_EN); + + OS_REG_RMW_FIELD(ah, AR_BTCOEX_CTRL2, + AR_BTCOEX_CTRL2_TX_CHAIN_MASK, 0x0); + OS_REG_WRITE(ah, AR_BTCOEX_CTRL, regval); +} + +static void ar9300_mci_set_btcoex_ctrl_9462(struct ath_hal *ah) +{ + uint32_t regval; + + HALDEBUG(ah, HAL_DEBUG_BT_COEX, "%s: called\n", __func__); + regval = SM(1, AR_BTCOEX_CTRL_JUPITER_MODE) | + SM(1, AR_BTCOEX_CTRL_WBTIMER_EN) | + SM(1, AR_BTCOEX_CTRL_PA_SHARED) | + SM(1, AR_BTCOEX_CTRL_LNA_SHARED) | + SM(2, AR_BTCOEX_CTRL_NUM_ANTENNAS) | + SM(3, AR_BTCOEX_CTRL_RX_CHAIN_MASK) | + SM(0, AR_BTCOEX_CTRL_1_CHAIN_ACK) | + SM(0, AR_BTCOEX_CTRL_1_CHAIN_BCN) | + SM(0, AR_BTCOEX_CTRL_ONE_STEP_LOOK_AHEAD_EN); + + if (AR_SREV_JUPITER_10(ah)) { + regval |= SM(1, AR_BTCOEX_CTRL_SPDT_ENABLE_10); + } + + OS_REG_WRITE(ah, AR_BTCOEX_CTRL, regval); +} + void ar9300_mci_reset(struct ath_hal *ah, HAL_BOOL en_int, HAL_BOOL is_2g, HAL_BOOL is_full_sleep) { @@ -945,21 +1019,17 @@ void ar9300_mci_reset(struct ath_hal *ah * To avoid MCI state machine be affected by incoming remote MCI messages, * MCI mode will be enabled later, right before reset the MCI TX and RX. */ - regval = SM(1, AR_BTCOEX_CTRL_JUPITER_MODE) | - SM(1, AR_BTCOEX_CTRL_WBTIMER_EN) | - SM(1, AR_BTCOEX_CTRL_PA_SHARED) | - SM(1, AR_BTCOEX_CTRL_LNA_SHARED) | - SM(2, AR_BTCOEX_CTRL_NUM_ANTENNAS) | - SM(3, AR_BTCOEX_CTRL_RX_CHAIN_MASK) | - SM(0, AR_BTCOEX_CTRL_1_CHAIN_ACK) | - SM(0, AR_BTCOEX_CTRL_1_CHAIN_BCN) | - SM(0, AR_BTCOEX_CTRL_ONE_STEP_LOOK_AHEAD_EN); - - if (AR_SREV_JUPITER_10(ah)) { - regval |= SM(1, AR_BTCOEX_CTRL_SPDT_ENABLE_10); + if (AR_SREV_APHRODITE(ah)) { + uint8_t ant = MS(ah->ah_config.ath_hal_mci_config, + ATH_MCI_CONFIG_ANT_ARCH); + if (ant == ATH_MCI_ANT_ARCH_1_ANT_PA_LNA_SHARED) + ar9300_mci_set_btcoex_ctrl_9565_1ANT(ah); + else + ar9300_mci_set_btcoex_ctrl_9565_2ANT(ah); + } else { + ar9300_mci_set_btcoex_ctrl_9462(ah); } - OS_REG_WRITE(ah, AR_BTCOEX_CTRL, regval); if (is_2g && (AR_SREV_JUPITER_20(ah) || AR_SREV_APHRODITE(ah)) && !(ah->ah_config.ath_hal_mci_config & @@ -982,6 +1052,9 @@ void ar9300_mci_reset(struct ath_hal *ah OS_REG_RMW_FIELD(ah, AR_PCU_MISC, AR_PCU_BT_ANT_PREVENT_RX, 0); + /* Set the time out to 3.125ms (5 BT slots) */ + OS_REG_RMW_FIELD(ah, AR_BTCOEX_WL_LNA, AR_BTCOEX_WL_LNA_TIMEOUT, 0x3D090); + if (ah->ah_config.ath_hal_mci_config & ATH_MCI_CONFIG_CONCUR_TX) { u_int8_t i; u_int32_t const *pmax_tx_pwr; @@ -1342,8 +1415,8 @@ ar9300_mci_state(struct ath_hal *ah, u_i if (AH_PRIVATE(ah)->ah_caps.halMciSupport && ahp->ah_mci_ready) { value = OS_REG_READ(ah, AR_BTCOEX_CTRL); if ((value == 0xdeadbeef) || (value == 0xffffffff)) { - // HALDEBUG(ah, HAL_DEBUG_BT_COEX, - // "(MCI) BTCOEX_CTRL = 0xdeadbeef\n"); + HALDEBUG(ah, HAL_DEBUG_BT_COEX, + "(MCI) BTCOEX_CTRL = 0xdeadbeef\n"); value = 0; } } @@ -1745,6 +1818,8 @@ void ar9300_mci_bt_coex_set_weights(stru // struct ath_hal_private *ahpriv = AH_PRIVATE(ah); u_int32_t tx_priority = 0; + HALDEBUG(ah, HAL_DEBUG_BT_COEX, "%s: stomp_type=%d\n", __func__, stomp_type); + switch (stomp_type) { case HAL_BT_COEX_STOMP_ALL: ahp->ah_bt_coex_wlan_weight[0] = JUPITER_STOMP_ALL_WLAN_WGHT0; @@ -1828,16 +1903,16 @@ void ar9300_mci_bt_coex_set_weights(stru ahp->ah_bt_coex_wlan_weight[3] |= SM(tx_priority, MCI_CONCUR_TX_WLAN_WGHT3_MASK2); } - if (ah->ah_config.ath_hal_mci_config & - ATH_MCI_CONFIG_MCI_WEIGHT_DBG) - { +// if (ah->ah_config.ath_hal_mci_config & +// ATH_MCI_CONFIG_MCI_WEIGHT_DBG) +// { HALDEBUG(ah, HAL_DEBUG_BT_COEX, "(MCI) Set weights: 0x%08x 0x%08x 0x%08x 0x%08x\n", ahp->ah_bt_coex_wlan_weight[0], ahp->ah_bt_coex_wlan_weight[1], ahp->ah_bt_coex_wlan_weight[2], ahp->ah_bt_coex_wlan_weight[3]); - } +// } } void ar9300_mci_bt_coex_disable(struct ath_hal *ah) @@ -1865,6 +1940,16 @@ int ar9300_mci_bt_coex_enable(struct ath { struct ath_hal_9300 *ahp = AH9300(ah); + HALDEBUG(ah, HAL_DEBUG_BT_COEX, "(MCI) %s: called\n", __func__); + + HALDEBUG(ah, HAL_DEBUG_BT_COEX, + "(MCI) Write weights: 0x%08x 0x%08x 0x%08x 0x%08x\n", + ahp->ah_bt_coex_wlan_weight[0], + ahp->ah_bt_coex_wlan_weight[1], + ahp->ah_bt_coex_wlan_weight[2], + ahp->ah_bt_coex_wlan_weight[3]); + + /* Mainly change the WLAN weight table */ OS_REG_WRITE(ah, AR_BTCOEX_WL_WEIGHTS0, ahp->ah_bt_coex_wlan_weight[0]); OS_REG_WRITE(ah, AR_BTCOEX_WL_WEIGHTS1, ahp->ah_bt_coex_wlan_weight[1]);