diff options
Diffstat (limited to 'drivers/net/wireless/ath/ath9k/gpio.c')
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/gpio.c | 51 | 
1 files changed, 51 insertions, 0 deletions
diff --git a/drivers/net/wireless/ath/ath9k/gpio.c b/drivers/net/wireless/ath/ath9k/gpio.c index 597c84e31ad..ef23624518b 100644 --- a/drivers/net/wireless/ath/ath9k/gpio.c +++ b/drivers/net/wireless/ath/ath9k/gpio.c @@ -317,3 +317,54 @@ void ath9k_btcoex_timer_pause(struct ath_softc *sc)  	btcoex->hw_timer_enabled = false;  } + +void ath9k_deinit_btcoex(struct ath_softc *sc) +{ +        if ((sc->btcoex.no_stomp_timer) && +	    ath9k_hw_get_btcoex_scheme(sc->sc_ah) == ATH_BTCOEX_CFG_3WIRE) +		ath_gen_timer_free(sc->sc_ah, sc->btcoex.no_stomp_timer); + +	if (ath9k_hw_get_btcoex_scheme(sc->sc_ah) == ATH_BTCOEX_CFG_MCI) +		ath_mci_cleanup(sc); +} + +int ath9k_init_btcoex(struct ath_softc *sc) +{ +	struct ath_txq *txq; +	struct ath_hw *ah = sc->sc_ah; +	int r; + +	switch (ath9k_hw_get_btcoex_scheme(sc->sc_ah)) { +	case ATH_BTCOEX_CFG_NONE: +		break; +	case ATH_BTCOEX_CFG_2WIRE: +		ath9k_hw_btcoex_init_2wire(sc->sc_ah); +		break; +	case ATH_BTCOEX_CFG_3WIRE: +		ath9k_hw_btcoex_init_3wire(sc->sc_ah); +		r = ath_init_btcoex_timer(sc); +		if (r) +			return -1; +		txq = sc->tx.txq_map[WME_AC_BE]; +		ath9k_hw_init_btcoex_hw(sc->sc_ah, txq->axq_qnum); +		sc->btcoex.bt_stomp_type = ATH_BTCOEX_STOMP_LOW; +		break; +	case ATH_BTCOEX_CFG_MCI: +		sc->btcoex.bt_stomp_type = ATH_BTCOEX_STOMP_LOW; +		sc->btcoex.duty_cycle = ATH_BTCOEX_DEF_DUTY_CYCLE; +		INIT_LIST_HEAD(&sc->btcoex.mci.info); + +		r = ath_mci_setup(sc); +		if (r) +			return r; + +		ath9k_hw_btcoex_init_mci(ah); + +		break; +	default: +		WARN_ON(1); +		break; +	} + +	return 0; +}  |