1237611Sadrian/*
2237611Sadrian * Copyright (c) 2002-2005 Sam Leffler, Errno Consulting
3237611Sadrian * Copyright (c) 2002-2005 Atheros Communications, Inc.
4237611Sadrian * Copyright (c) 2008-2010, Atheros Communications Inc.
5237611Sadrian *
6237611Sadrian * Permission to use, copy, modify, and/or distribute this software for any
7237611Sadrian * purpose with or without fee is hereby granted, provided that the above
8237611Sadrian * copyright notice and this permission notice appear in all copies.
9237611Sadrian *
10237611Sadrian * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11237611Sadrian * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12237611Sadrian * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13237611Sadrian * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14237611Sadrian * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15237611Sadrian * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16237611Sadrian * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17237611Sadrian *
18237611Sadrian * $FreeBSD$
19237611Sadrian */
20237611Sadrian
21237611Sadrian#include "opt_ah.h"
22237611Sadrian
23237611Sadrian#include "ah.h"
24237611Sadrian#include "ah_internal.h"
25237611Sadrian#include "ah_devid.h"
26237611Sadrian#ifdef	AH_DEBUG
27237611Sadrian#include "ah_desc.h"                    /* NB: for HAL_PHYERR* */
28237611Sadrian#endif
29237611Sadrian
30237611Sadrian#include "ar5416/ar5416.h"
31237611Sadrian#include "ar5416/ar5416reg.h"
32237611Sadrian#include "ar5416/ar5416phy.h"
33237611Sadrian#include "ar5416/ar5416desc.h" /* AR5416_CONTTXMODE */
34237611Sadrian#include "ar5416/ar5416_btcoex.h"
35237611Sadrian
36237611Sadrianvoid
37237611Sadrianar5416SetBTCoexInfo(struct ath_hal *ah, HAL_BT_COEX_INFO *btinfo)
38237611Sadrian{
39237611Sadrian	struct ath_hal_5416 *ahp = AH5416(ah);
40237611Sadrian
41237611Sadrian	ahp->ah_btModule = btinfo->bt_module;
42237611Sadrian	ahp->ah_btCoexConfigType = btinfo->bt_coex_config;
43237611Sadrian	ahp->ah_btActiveGpioSelect = btinfo->bt_gpio_bt_active;
44237611Sadrian	ahp->ah_btPriorityGpioSelect = btinfo->bt_gpio_bt_priority;
45237611Sadrian	ahp->ah_wlanActiveGpioSelect = btinfo->bt_gpio_wlan_active;
46237611Sadrian	ahp->ah_btActivePolarity = btinfo->bt_active_polarity;
47237611Sadrian	ahp->ah_btCoexSingleAnt = btinfo->bt_single_ant;
48237611Sadrian	ahp->ah_btWlanIsolation = btinfo->bt_isolation;
49237611Sadrian}
50237611Sadrian
51237611Sadrianvoid
52237611Sadrianar5416BTCoexConfig(struct ath_hal *ah, HAL_BT_COEX_CONFIG *btconf)
53237611Sadrian{
54237611Sadrian	struct ath_hal_5416 *ahp = AH5416(ah);
55237611Sadrian	HAL_BOOL rxClearPolarity = btconf->bt_rxclear_polarity;
56237611Sadrian
57237611Sadrian	/*
58237611Sadrian	 * For Kiwi and Osprey, the polarity of rx_clear is active high.
59237611Sadrian	 * The bt_rxclear_polarity flag from ath(4) needs to be inverted.
60237611Sadrian	 */
61237611Sadrian	if (AR_SREV_KIWI(ah)) {
62237611Sadrian		rxClearPolarity = !btconf->bt_rxclear_polarity;
63237611Sadrian	}
64237611Sadrian
65237611Sadrian	ahp->ah_btCoexMode = (ahp->ah_btCoexMode & AR_BT_QCU_THRESH) |
66237611Sadrian	    SM(btconf->bt_time_extend, AR_BT_TIME_EXTEND) |
67237611Sadrian	    SM(btconf->bt_txstate_extend, AR_BT_TXSTATE_EXTEND) |
68237611Sadrian	    SM(btconf->bt_txframe_extend, AR_BT_TX_FRAME_EXTEND) |
69237611Sadrian	    SM(btconf->bt_mode, AR_BT_MODE) |
70237611Sadrian	    SM(btconf->bt_quiet_collision, AR_BT_QUIET) |
71237611Sadrian	    SM(rxClearPolarity, AR_BT_RX_CLEAR_POLARITY) |
72237611Sadrian	    SM(btconf->bt_priority_time, AR_BT_PRIORITY_TIME) |
73237611Sadrian	    SM(btconf->bt_first_slot_time, AR_BT_FIRST_SLOT_TIME);
74237611Sadrian
75237611Sadrian	ahp->ah_btCoexMode2 |= SM(btconf->bt_hold_rxclear,
76237611Sadrian	    AR_BT_HOLD_RX_CLEAR);
77237611Sadrian
78237611Sadrian	if (ahp->ah_btCoexSingleAnt == AH_FALSE) {
79237611Sadrian		/* Enable ACK to go out even though BT has higher priority. */
80237611Sadrian		ahp->ah_btCoexMode2 |= AR_BT_DISABLE_BT_ANT;
81237611Sadrian	}
82237611Sadrian}
83237611Sadrian
84237611Sadrianvoid
85237611Sadrianar5416BTCoexSetQcuThresh(struct ath_hal *ah, int qnum)
86237611Sadrian{
87237611Sadrian	struct ath_hal_5416 *ahp = AH5416(ah);
88237611Sadrian
89237611Sadrian	ahp->ah_btCoexMode |= SM(qnum, AR_BT_QCU_THRESH);
90237611Sadrian}
91237611Sadrian
92237611Sadrianvoid
93237611Sadrianar5416BTCoexSetWeights(struct ath_hal *ah, u_int32_t stompType)
94237611Sadrian{
95237611Sadrian	struct ath_hal_5416 *ahp = AH5416(ah);
96237611Sadrian
97237611Sadrian	if (AR_SREV_KIWI_10_OR_LATER(ah)) {
98237611Sadrian		/* TODO: TX RX seperate is not enabled. */
99237611Sadrian		switch (stompType) {
100237611Sadrian		case HAL_BT_COEX_STOMP_ALL:
101237611Sadrian			ahp->ah_btCoexBTWeight = AR5416_BT_WGHT;
102237611Sadrian			ahp->ah_btCoexWLANWeight = AR5416_STOMP_ALL_WLAN_WGHT;
103237611Sadrian			break;
104237611Sadrian		case HAL_BT_COEX_STOMP_LOW:
105237611Sadrian			ahp->ah_btCoexBTWeight = AR5416_BT_WGHT;
106237611Sadrian			ahp->ah_btCoexWLANWeight = AR5416_STOMP_LOW_WLAN_WGHT;
107237611Sadrian			break;
108237611Sadrian		case HAL_BT_COEX_STOMP_ALL_FORCE:
109237611Sadrian			ahp->ah_btCoexBTWeight = AR5416_BT_WGHT;
110237611Sadrian			ahp->ah_btCoexWLANWeight =
111237611Sadrian			    AR5416_STOMP_ALL_FORCE_WLAN_WGHT;
112237611Sadrian			break;
113237611Sadrian		case HAL_BT_COEX_STOMP_LOW_FORCE:
114237611Sadrian			ahp->ah_btCoexBTWeight = AR5416_BT_WGHT;
115237611Sadrian			ahp->ah_btCoexWLANWeight =
116237611Sadrian			    AR5416_STOMP_LOW_FORCE_WLAN_WGHT;
117237611Sadrian			break;
118237611Sadrian		case HAL_BT_COEX_STOMP_NONE:
119237611Sadrian		case HAL_BT_COEX_NO_STOMP:
120237611Sadrian			ahp->ah_btCoexBTWeight = AR5416_BT_WGHT;
121237611Sadrian			ahp->ah_btCoexWLANWeight = AR5416_STOMP_NONE_WLAN_WGHT;
122237611Sadrian			break;
123237611Sadrian		default:
124237611Sadrian			/* There is a forceWeight from registry */
125237611Sadrian			ahp->ah_btCoexBTWeight = stompType & 0xffff;
126237611Sadrian			ahp->ah_btCoexWLANWeight = stompType >> 16;
127237611Sadrian			break;
128237611Sadrian		}
129237611Sadrian	} else {
130237611Sadrian		switch (stompType) {
131237611Sadrian		case HAL_BT_COEX_STOMP_ALL:
132237611Sadrian			ahp->ah_btCoexBTWeight = AR5416_BT_WGHT;
133237611Sadrian			ahp->ah_btCoexWLANWeight = AR5416_STOMP_ALL_WLAN_WGHT;
134237611Sadrian			break;
135237611Sadrian		case HAL_BT_COEX_STOMP_LOW:
136237611Sadrian			ahp->ah_btCoexBTWeight = AR5416_BT_WGHT;
137237611Sadrian			ahp->ah_btCoexWLANWeight = AR5416_STOMP_LOW_WLAN_WGHT;
138237611Sadrian			break;
139237611Sadrian		case HAL_BT_COEX_STOMP_ALL_FORCE:
140237611Sadrian			ahp->ah_btCoexBTWeight = AR5416_BT_WGHT;
141237611Sadrian			ahp->ah_btCoexWLANWeight =
142237611Sadrian			    AR5416_STOMP_ALL_FORCE_WLAN_WGHT;
143237611Sadrian			break;
144237611Sadrian		case HAL_BT_COEX_STOMP_LOW_FORCE:
145237611Sadrian			ahp->ah_btCoexBTWeight = AR5416_BT_WGHT;
146237611Sadrian			ahp->ah_btCoexWLANWeight =
147237611Sadrian			    AR5416_STOMP_LOW_FORCE_WLAN_WGHT;
148237611Sadrian			break;
149237611Sadrian		case HAL_BT_COEX_STOMP_NONE:
150237611Sadrian		case HAL_BT_COEX_NO_STOMP:
151237611Sadrian			ahp->ah_btCoexBTWeight = AR5416_BT_WGHT;
152237611Sadrian			ahp->ah_btCoexWLANWeight = AR5416_STOMP_NONE_WLAN_WGHT;
153237611Sadrian			break;
154237611Sadrian		default:
155237611Sadrian			/* There is a forceWeight from registry */
156237611Sadrian			ahp->ah_btCoexBTWeight = stompType & 0xffff;
157237611Sadrian			ahp->ah_btCoexWLANWeight = stompType >> 16;
158237611Sadrian			break;
159237611Sadrian		}
160237611Sadrian	}
161237611Sadrian}
162237611Sadrian
163237611Sadrianvoid
164237611Sadrianar5416BTCoexSetupBmissThresh(struct ath_hal *ah, u_int32_t thresh)
165237611Sadrian{
166237611Sadrian	struct ath_hal_5416 *ahp = AH5416(ah);
167237611Sadrian
168237611Sadrian	ahp->ah_btCoexMode2 |= SM(thresh, AR_BT_BCN_MISS_THRESH);
169237611Sadrian}
170237611Sadrian
171237611Sadrian/*
172237611Sadrian * There is no antenna diversity for Owl, Kiwi, etc.
173237611Sadrian *
174237611Sadrian * Kite will override this particular method.
175237611Sadrian */
176243843Sadrianvoid
177237611Sadrianar5416BTCoexAntennaDiversity(struct ath_hal *ah)
178237611Sadrian{
179237611Sadrian}
180237611Sadrian
181237611Sadrianvoid
182237611Sadrianar5416BTCoexSetParameter(struct ath_hal *ah, u_int32_t type, u_int32_t value)
183237611Sadrian{
184237611Sadrian	struct ath_hal_5416 *ahp = AH5416(ah);
185237611Sadrian
186237611Sadrian	switch (type) {
187237611Sadrian	case HAL_BT_COEX_SET_ACK_PWR:
188237611Sadrian		if (value) {
189237611Sadrian			ahp->ah_btCoexFlag |= HAL_BT_COEX_FLAG_LOW_ACK_PWR;
190237611Sadrian			OS_REG_WRITE(ah, AR_TPC, HAL_BT_COEX_LOW_ACK_POWER);
191237611Sadrian		} else {
192237611Sadrian			ahp->ah_btCoexFlag &= ~HAL_BT_COEX_FLAG_LOW_ACK_PWR;
193237611Sadrian			OS_REG_WRITE(ah, AR_TPC, HAL_BT_COEX_HIGH_ACK_POWER);
194237611Sadrian		}
195237611Sadrian		break;
196237611Sadrian	case HAL_BT_COEX_ANTENNA_DIVERSITY:
197237611Sadrian		/* This is overridden for Kite */
198237611Sadrian		break;
199237611Sadrian#if 0
200237611Sadrian        case HAL_BT_COEX_LOWER_TX_PWR:
201237611Sadrian            if (value) {
202237611Sadrian                if ((ahp->ah_btCoexFlag & HAL_BT_COEX_FLAG_LOWER_TX_PWR) == 0) {
203237611Sadrian                    ahp->ah_btCoexFlag |= HAL_BT_COEX_FLAG_LOWER_TX_PWR;
204237611Sadrian		    AH_PRIVATE(ah)->ah_config.ath_hal_desc_tpc = 1;
205237611Sadrian                    ar5416SetTxPowerLimit(ah, AH_PRIVATE(ah)->ah_power_limit, AH_PRIVATE(ah)->ah_extra_txpow, 0);
206237611Sadrian                }
207237611Sadrian            }
208237611Sadrian            else {
209237611Sadrian                if (ahp->ah_btCoexFlag & HAL_BT_COEX_FLAG_LOWER_TX_PWR) {
210237611Sadrian                    ahp->ah_btCoexFlag &= ~HAL_BT_COEX_FLAG_LOWER_TX_PWR;
211237611Sadrian		    AH_PRIVATE(ah)->ah_config.ath_hal_desc_tpc = 0;
212237611Sadrian                    ar5416SetTxPowerLimit(ah, AH_PRIVATE(ah)->ah_power_limit, AH_PRIVATE(ah)->ah_extra_txpow, 0);
213237611Sadrian                }
214237611Sadrian            }
215237611Sadrian            break;
216237611Sadrian#endif
217237611Sadrian	default:
218237611Sadrian			break;
219237611Sadrian	}
220237611Sadrian}
221237611Sadrian
222237611Sadrianvoid
223237611Sadrianar5416BTCoexDisable(struct ath_hal *ah)
224237611Sadrian{
225237611Sadrian	struct ath_hal_5416 *ahp = AH5416(ah);
226237611Sadrian
227237611Sadrian	/* Always drive rx_clear_external output as 0 */
228237611Sadrian	ar5416GpioSet(ah, ahp->ah_wlanActiveGpioSelect, 0);
229237611Sadrian	ar5416GpioCfgOutput(ah, ahp->ah_wlanActiveGpioSelect,
230237611Sadrian	    HAL_GPIO_OUTPUT_MUX_AS_OUTPUT);
231237611Sadrian
232237611Sadrian	if (AR_SREV_9271(ah)) {
233237611Sadrian		/*
234237611Sadrian		 * Set wlanActiveGpio to input when disabling BT-COEX to
235237611Sadrian		 * reduce power consumption
236237611Sadrian		 */
237237611Sadrian		ar5416GpioCfgInput(ah, ahp->ah_wlanActiveGpioSelect);
238237611Sadrian	}
239237611Sadrian
240237611Sadrian	if (ahp->ah_btCoexSingleAnt == AH_TRUE) {
241237611Sadrian		OS_REG_RMW_FIELD(ah, AR_QUIET1, AR_QUIET1_QUIET_ACK_CTS_ENABLE,
242237611Sadrian		    1);
243237611Sadrian		OS_REG_RMW_FIELD(ah, AR_MISC_MODE, AR_PCU_BT_ANT_PREVENT_RX,
244237611Sadrian		    0);
245237611Sadrian	}
246237611Sadrian
247237611Sadrian	OS_REG_WRITE(ah, AR_BT_COEX_MODE, AR_BT_QUIET | AR_BT_MODE);
248237611Sadrian	OS_REG_WRITE(ah, AR_BT_COEX_WEIGHT, 0);
249237611Sadrian	if (AR_SREV_KIWI_10_OR_LATER(ah))
250237611Sadrian		OS_REG_WRITE(ah, AR_BT_COEX_WEIGHT2, 0);
251237611Sadrian	OS_REG_WRITE(ah, AR_BT_COEX_MODE2, 0);
252237611Sadrian
253237611Sadrian	ahp->ah_btCoexEnabled = AH_FALSE;
254237611Sadrian}
255237611Sadrian
256237611Sadrianint
257237611Sadrianar5416BTCoexEnable(struct ath_hal *ah)
258237611Sadrian{
259237611Sadrian	struct ath_hal_5416 *ahp = AH5416(ah);
260237611Sadrian
261237611Sadrian	/* Program coex mode and weight registers to actually enable coex */
262237611Sadrian	OS_REG_WRITE(ah, AR_BT_COEX_MODE, ahp->ah_btCoexMode);
263237611Sadrian	OS_REG_WRITE(ah, AR_BT_COEX_WEIGHT,
264237611Sadrian	    SM(ahp->ah_btCoexWLANWeight & 0xFFFF, AR_BT_WL_WGHT) |
265237611Sadrian	    SM(ahp->ah_btCoexBTWeight & 0xFFFF, AR_BT_BT_WGHT));
266237611Sadrian	if (AR_SREV_KIWI_10_OR_LATER(ah)) {
267237611Sadrian	OS_REG_WRITE(ah, AR_BT_COEX_WEIGHT2,
268237611Sadrian	    SM(ahp->ah_btCoexWLANWeight >> 16, AR_BT_WL_WGHT));
269237611Sadrian	}
270237611Sadrian	OS_REG_WRITE(ah, AR_BT_COEX_MODE2, ahp->ah_btCoexMode2);
271237611Sadrian
272249517Sadrian	/* Added Select GPIO5~8 instaed SPI */
273249517Sadrian	if (AR_SREV_9271(ah)) {
274249517Sadrian		uint32_t val;
275237611Sadrian
276249517Sadrian		val = OS_REG_READ(ah, AR9271_CLOCK_CONTROL);
277249517Sadrian		val &= 0xFFFFFEFF;
278249517Sadrian		OS_REG_WRITE(ah, AR9271_CLOCK_CONTROL, val);
279249517Sadrian	}
280249517Sadrian
281237611Sadrian	if (ahp->ah_btCoexFlag & HAL_BT_COEX_FLAG_LOW_ACK_PWR)
282237611Sadrian		OS_REG_WRITE(ah, AR_TPC, HAL_BT_COEX_LOW_ACK_POWER);
283237611Sadrian	else
284237611Sadrian		OS_REG_WRITE(ah, AR_TPC, HAL_BT_COEX_HIGH_ACK_POWER);
285237611Sadrian
286237611Sadrian	if (ahp->ah_btCoexSingleAnt == AH_TRUE) {
287237611Sadrian		OS_REG_RMW_FIELD(ah, AR_QUIET1,
288237611Sadrian		    AR_QUIET1_QUIET_ACK_CTS_ENABLE, 1);
289237611Sadrian		/* XXX should update miscMode? */
290237611Sadrian		OS_REG_RMW_FIELD(ah, AR_MISC_MODE,
291237611Sadrian		    AR_PCU_BT_ANT_PREVENT_RX, 1);
292237611Sadrian	} else {
293237611Sadrian		OS_REG_RMW_FIELD(ah, AR_QUIET1,
294237611Sadrian		    AR_QUIET1_QUIET_ACK_CTS_ENABLE, 1);
295237611Sadrian		/* XXX should update miscMode? */
296237611Sadrian		OS_REG_RMW_FIELD(ah, AR_MISC_MODE,
297237611Sadrian		    AR_PCU_BT_ANT_PREVENT_RX, 0);
298237611Sadrian	}
299237611Sadrian
300237611Sadrian	if (ahp->ah_btCoexConfigType == HAL_BT_COEX_CFG_3WIRE) {
301237611Sadrian		/* For 3-wire, configure the desired GPIO port for rx_clear */
302237611Sadrian		ar5416GpioCfgOutput(ah, ahp->ah_wlanActiveGpioSelect,
303237611Sadrian		    HAL_GPIO_OUTPUT_MUX_AS_WLAN_ACTIVE);
304237611Sadrian	} else {
305237611Sadrian		/*
306237611Sadrian		 * For 2-wire, configure the desired GPIO port
307237611Sadrian		 * for TX_FRAME output
308237611Sadrian		 */
309237611Sadrian		ar5416GpioCfgOutput(ah, ahp->ah_wlanActiveGpioSelect,
310237611Sadrian		    HAL_GPIO_OUTPUT_MUX_AS_TX_FRAME);
311237611Sadrian	}
312237611Sadrian
313237611Sadrian	/*
314237611Sadrian	 * Enable a weak pull down on BT_ACTIVE.
315237611Sadrian	 * When BT device is disabled, BT_ACTIVE might be floating.
316237611Sadrian	 */
317237611Sadrian	OS_REG_RMW(ah, AR_GPIO_PDPU,
318237611Sadrian	    (0x2 << (ahp->ah_btActiveGpioSelect * 2)),
319237611Sadrian	    (0x3 << (ahp->ah_btActiveGpioSelect * 2)));
320237611Sadrian
321237611Sadrian	ahp->ah_btCoexEnabled = AH_TRUE;
322237611Sadrian
323237611Sadrian	return (0);
324237611Sadrian}
325237611Sadrian
326237611Sadrianvoid
327237611Sadrianar5416InitBTCoex(struct ath_hal *ah)
328237611Sadrian{
329237611Sadrian	struct ath_hal_5416 *ahp = AH5416(ah);
330237611Sadrian
331251483Sadrian	HALDEBUG(ah, HAL_DEBUG_BT_COEX,
332251483Sadrian	    "%s: called; configType=%d\n",
333251483Sadrian	    __func__,
334251483Sadrian	    ahp->ah_btCoexConfigType);
335251483Sadrian
336237611Sadrian	if (ahp->ah_btCoexConfigType == HAL_BT_COEX_CFG_3WIRE) {
337237611Sadrian		OS_REG_SET_BIT(ah, AR_GPIO_INPUT_EN_VAL,
338237611Sadrian		    (AR_GPIO_INPUT_EN_VAL_BT_PRIORITY_BB |
339237611Sadrian		    AR_GPIO_INPUT_EN_VAL_BT_ACTIVE_BB));
340237611Sadrian
341237611Sadrian		/*
342237611Sadrian		 * Set input mux for bt_prority_async and
343237611Sadrian		 * bt_active_async to GPIO pins
344237611Sadrian		 */
345237611Sadrian		OS_REG_RMW_FIELD(ah, AR_GPIO_INPUT_MUX1,
346237611Sadrian		    AR_GPIO_INPUT_MUX1_BT_ACTIVE,
347237611Sadrian		    ahp->ah_btActiveGpioSelect);
348237611Sadrian		OS_REG_RMW_FIELD(ah, AR_GPIO_INPUT_MUX1,
349237611Sadrian		    AR_GPIO_INPUT_MUX1_BT_PRIORITY,
350237611Sadrian		    ahp->ah_btPriorityGpioSelect);
351237611Sadrian
352237611Sadrian		/*
353237611Sadrian		 * Configure the desired GPIO ports for input
354237611Sadrian		 */
355237611Sadrian		ar5416GpioCfgInput(ah, ahp->ah_btActiveGpioSelect);
356237611Sadrian		ar5416GpioCfgInput(ah, ahp->ah_btPriorityGpioSelect);
357237611Sadrian
358243843Sadrian		/*
359243843Sadrian		 * Configure the antenna diversity setup.
360243843Sadrian		 * It's a no-op for AR9287; AR9285 overrides this
361243843Sadrian		 * as required.
362243843Sadrian		 */
363243843Sadrian		AH5416(ah)->ah_btCoexSetDiversity(ah);
364237611Sadrian
365237611Sadrian		if (ahp->ah_btCoexEnabled)
366237611Sadrian			ar5416BTCoexEnable(ah);
367237611Sadrian		else
368237611Sadrian			ar5416BTCoexDisable(ah);
369237611Sadrian	} else if (ahp->ah_btCoexConfigType != HAL_BT_COEX_CFG_NONE) {
370237611Sadrian		/* 2-wire */
371237611Sadrian		if (ahp->ah_btCoexEnabled) {
372237611Sadrian			/* Connect bt_active_async to baseband */
373237611Sadrian			OS_REG_CLR_BIT(ah, AR_GPIO_INPUT_EN_VAL,
374237611Sadrian			    (AR_GPIO_INPUT_EN_VAL_BT_PRIORITY_DEF |
375237611Sadrian			     AR_GPIO_INPUT_EN_VAL_BT_FREQUENCY_DEF));
376237611Sadrian			OS_REG_SET_BIT(ah, AR_GPIO_INPUT_EN_VAL,
377237611Sadrian			    AR_GPIO_INPUT_EN_VAL_BT_ACTIVE_BB);
378237611Sadrian
379237611Sadrian			/*
380237611Sadrian			 * Set input mux for bt_prority_async and
381237611Sadrian			 * bt_active_async to GPIO pins
382237611Sadrian			 */
383237611Sadrian			OS_REG_RMW_FIELD(ah, AR_GPIO_INPUT_MUX1,
384237611Sadrian			    AR_GPIO_INPUT_MUX1_BT_ACTIVE,
385237611Sadrian                            ahp->ah_btActiveGpioSelect);
386237611Sadrian
387237611Sadrian			/* Configure the desired GPIO ports for input */
388237611Sadrian			ar5416GpioCfgInput(ah, ahp->ah_btActiveGpioSelect);
389237611Sadrian
390237611Sadrian			/* Enable coexistence on initialization */
391237611Sadrian			ar5416BTCoexEnable(ah);
392237611Sadrian		}
393237611Sadrian	}
394237611Sadrian}
395