diff options
Diffstat (limited to 'drivers/net/wireless/ath/ath9k/gpio.c')
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/gpio.c | 111 | 
1 files changed, 22 insertions, 89 deletions
diff --git a/drivers/net/wireless/ath/ath9k/gpio.c b/drivers/net/wireless/ath/ath9k/gpio.c index 4b412aaf4f3..b1956bf6e01 100644 --- a/drivers/net/wireless/ath/ath9k/gpio.c +++ b/drivers/net/wireless/ath/ath9k/gpio.c @@ -157,36 +157,6 @@ static void ath_detect_bt_priority(struct ath_softc *sc)  	}  } -static void ath9k_gen_timer_start(struct ath_hw *ah, -				  struct ath_gen_timer *timer, -				  u32 trig_timeout, -				  u32 timer_period) -{ -	ath9k_hw_gen_timer_start(ah, timer, trig_timeout, timer_period); - -	if ((ah->imask & ATH9K_INT_GENTIMER) == 0) { -		ath9k_hw_disable_interrupts(ah); -		ah->imask |= ATH9K_INT_GENTIMER; -		ath9k_hw_set_interrupts(ah); -		ath9k_hw_enable_interrupts(ah); -	} -} - -static void ath9k_gen_timer_stop(struct ath_hw *ah, struct ath_gen_timer *timer) -{ -	struct ath_gen_timer_table *timer_table = &ah->hw_gen_timers; - -	ath9k_hw_gen_timer_stop(ah, timer); - -	/* if no timer is enabled, turn off interrupt mask */ -	if (timer_table->timer_mask.val == 0) { -		ath9k_hw_disable_interrupts(ah); -		ah->imask &= ~ATH9K_INT_GENTIMER; -		ath9k_hw_set_interrupts(ah); -		ath9k_hw_enable_interrupts(ah); -	} -} -  static void ath_mci_ftp_adjust(struct ath_softc *sc)  {  	struct ath_btcoex *btcoex = &sc->btcoex; @@ -257,19 +227,9 @@ static void ath_btcoex_period_timer(unsigned long data)  	spin_unlock_bh(&btcoex->btcoex_lock); -	/* -	 * btcoex_period is in msec while (btocex/btscan_)no_stomp are in usec, -	 * ensure that we properly convert btcoex_period to usec -	 * for any comparision with (btcoex/btscan_)no_stomp. -	 */ -	if (btcoex->btcoex_period * 1000 != btcoex->btcoex_no_stomp) { -		if (btcoex->hw_timer_enabled) -			ath9k_gen_timer_stop(ah, btcoex->no_stomp_timer); - -		ath9k_gen_timer_start(ah, btcoex->no_stomp_timer, timer_period, -				      timer_period * 10); -		btcoex->hw_timer_enabled = true; -	} +	if (btcoex->btcoex_period != btcoex->btcoex_no_stomp) +		mod_timer(&btcoex->no_stomp_timer, +			 jiffies + msecs_to_jiffies(timer_period));  	ath9k_ps_restore(sc); @@ -282,7 +242,7 @@ skip_hw_wakeup:   * Generic tsf based hw timer which configures weight   * registers to time slice between wlan and bt traffic   */ -static void ath_btcoex_no_stomp_timer(void *arg) +static void ath_btcoex_no_stomp_timer(unsigned long arg)  {  	struct ath_softc *sc = (struct ath_softc *)arg;  	struct ath_hw *ah = sc->sc_ah; @@ -311,24 +271,18 @@ static int ath_init_btcoex_timer(struct ath_softc *sc)  	struct ath_btcoex *btcoex = &sc->btcoex;  	btcoex->btcoex_period = ATH_BTCOEX_DEF_BT_PERIOD; -	btcoex->btcoex_no_stomp = (100 - ATH_BTCOEX_DEF_DUTY_CYCLE) * 1000 * +	btcoex->btcoex_no_stomp = (100 - ATH_BTCOEX_DEF_DUTY_CYCLE) *  		btcoex->btcoex_period / 100; -	btcoex->btscan_no_stomp = (100 - ATH_BTCOEX_BTSCAN_DUTY_CYCLE) * 1000 * +	btcoex->btscan_no_stomp = (100 - ATH_BTCOEX_BTSCAN_DUTY_CYCLE) *  				   btcoex->btcoex_period / 100;  	setup_timer(&btcoex->period_timer, ath_btcoex_period_timer,  			(unsigned long) sc); +	setup_timer(&btcoex->no_stomp_timer, ath_btcoex_no_stomp_timer, +			(unsigned long) sc);  	spin_lock_init(&btcoex->btcoex_lock); -	btcoex->no_stomp_timer = ath_gen_timer_alloc(sc->sc_ah, -			ath_btcoex_no_stomp_timer, -			ath_btcoex_no_stomp_timer, -			(void *) sc, AR_FIRST_NDP_TIMER); - -	if (!btcoex->no_stomp_timer) -		return -ENOMEM; -  	return 0;  } @@ -343,10 +297,7 @@ void ath9k_btcoex_timer_resume(struct ath_softc *sc)  	ath_dbg(ath9k_hw_common(ah), BTCOEX, "Starting btcoex timers\n");  	/* make sure duty cycle timer is also stopped when resuming */ -	if (btcoex->hw_timer_enabled) { -		ath9k_gen_timer_stop(sc->sc_ah, btcoex->no_stomp_timer); -		btcoex->hw_timer_enabled = false; -	} +	del_timer_sync(&btcoex->no_stomp_timer);  	btcoex->bt_priority_cnt = 0;  	btcoex->bt_priority_time = jiffies; @@ -363,24 +314,16 @@ void ath9k_btcoex_timer_resume(struct ath_softc *sc)  void ath9k_btcoex_timer_pause(struct ath_softc *sc)  {  	struct ath_btcoex *btcoex = &sc->btcoex; -	struct ath_hw *ah = sc->sc_ah;  	del_timer_sync(&btcoex->period_timer); - -	if (btcoex->hw_timer_enabled) { -		ath9k_gen_timer_stop(ah, btcoex->no_stomp_timer); -		btcoex->hw_timer_enabled = false; -	} +	del_timer_sync(&btcoex->no_stomp_timer);  }  void ath9k_btcoex_stop_gen_timer(struct ath_softc *sc)  {  	struct ath_btcoex *btcoex = &sc->btcoex; -	if (btcoex->hw_timer_enabled) { -		ath9k_gen_timer_stop(sc->sc_ah, btcoex->no_stomp_timer); -		btcoex->hw_timer_enabled = false; -	} +	del_timer_sync(&btcoex->no_stomp_timer);  }  u16 ath9k_btcoex_aggr_limit(struct ath_softc *sc, u32 max_4ms_framelen) @@ -400,12 +343,6 @@ u16 ath9k_btcoex_aggr_limit(struct ath_softc *sc, u32 max_4ms_framelen)  void ath9k_btcoex_handle_interrupt(struct ath_softc *sc, u32 status)  { -	struct ath_hw *ah = sc->sc_ah; - -	if (ath9k_hw_get_btcoex_scheme(ah) == ATH_BTCOEX_CFG_3WIRE) -		if (status & ATH9K_INT_GENTIMER) -			ath_gen_timer_isr(sc->sc_ah); -  	if (status & ATH9K_INT_MCI)  		ath_mci_intr(sc);  } @@ -447,10 +384,6 @@ void ath9k_deinit_btcoex(struct ath_softc *sc)  {  	struct ath_hw *ah = sc->sc_ah; -        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_mci_is_enabled(ah))  		ath_mci_cleanup(sc);  } @@ -522,22 +455,22 @@ static int ath9k_dump_mci_btcoex(struct ath_softc *sc, u8 *buf, u32 size)  	ATH_DUMP_BTCOEX("Concurrent Tx", btcoex_hw->mci.concur_tx);  	ATH_DUMP_BTCOEX("Concurrent RSSI cnt", btcoex->rssi_count); -	len += snprintf(buf + len, size - len, "BT Weights: "); +	len += scnprintf(buf + len, size - len, "BT Weights: ");  	for (i = 0; i < AR9300_NUM_BT_WEIGHTS; i++) -		len += snprintf(buf + len, size - len, "%08x ", -				btcoex_hw->bt_weight[i]); -	len += snprintf(buf + len, size - len, "\n"); -	len += snprintf(buf + len, size - len, "WLAN Weights: "); +		len += scnprintf(buf + len, size - len, "%08x ", +				 btcoex_hw->bt_weight[i]); +	len += scnprintf(buf + len, size - len, "\n"); +	len += scnprintf(buf + len, size - len, "WLAN Weights: ");  	for (i = 0; i < AR9300_NUM_BT_WEIGHTS; i++) -		len += snprintf(buf + len, size - len, "%08x ", -				btcoex_hw->wlan_weight[i]); -	len += snprintf(buf + len, size - len, "\n"); -	len += snprintf(buf + len, size - len, "Tx Priorities: "); +		len += scnprintf(buf + len, size - len, "%08x ", +				 btcoex_hw->wlan_weight[i]); +	len += scnprintf(buf + len, size - len, "\n"); +	len += scnprintf(buf + len, size - len, "Tx Priorities: ");  	for (i = 0; i < ATH_BTCOEX_STOMP_MAX; i++) -		len += snprintf(buf + len, size - len, "%08x ", +		len += scnprintf(buf + len, size - len, "%08x ",  				btcoex_hw->tx_prio[i]); -	len += snprintf(buf + len, size - len, "\n"); +	len += scnprintf(buf + len, size - len, "\n");  	return len;  }  | 
