Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d385c5c2 authored by Felix Fietkau's avatar Felix Fietkau Committed by John W. Linville
Browse files

ath9k: add support for reporting tx power to mac80211



Track it per channel context instead of in the softc

Signed-off-by: default avatarFelix Fietkau <nbd@openwrt.org>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 71783576
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -347,6 +347,7 @@ struct ath_chanctx {

	int flush_timeout;
	u16 txpower;
	u16 cur_txpower;
	bool offchannel;
	bool stopped;
	bool active;
@@ -987,7 +988,6 @@ struct ath_softc {
	u8 gtt_cnt;
	u32 intrstatus;
	u16 ps_flags; /* PS_* */
	u16 curtxpow;
	bool ps_enabled;
	bool ps_idle;
	short nbcnvifs;
+14 −11
Original line number Diff line number Diff line
@@ -172,18 +172,21 @@ static void ath9k_reg_notifier(struct wiphy *wiphy,
	ath_reg_notifier_apply(wiphy, request, reg);

	/* Set tx power */
	if (ah->curchan) {
	if (!ah->curchan)
		return;

	sc->cur_chan->txpower = 2 * ah->curchan->chan->max_power;
	ath9k_ps_wakeup(sc);
	ath9k_hw_set_txpowerlimit(ah, sc->cur_chan->txpower, false);
		sc->curtxpow = ath9k_hw_regulatory(ah)->power_limit;
	ath9k_cmn_update_txpow(ah, sc->cur_chan->cur_txpower,
			       sc->cur_chan->txpower,
			       &sc->cur_chan->cur_txpower);
	/* synchronize DFS detector if regulatory domain changed */
	if (sc->dfs_detector != NULL)
		sc->dfs_detector->set_dfs_domain(sc->dfs_detector,
						 request->dfs_region);
	ath9k_ps_restore(sc);
}
}

/*
 *  This function will allocate both the DMA descriptor structure, and the
+25 −4
Original line number Diff line number Diff line
@@ -233,8 +233,9 @@ static bool ath_complete_reset(struct ath_softc *sc, bool start)

	ath9k_calculate_summary_state(sc, sc->cur_chan);
	ath_startrecv(sc);
	ath9k_cmn_update_txpow(ah, sc->curtxpow,
			       sc->cur_chan->txpower, &sc->curtxpow);
	ath9k_cmn_update_txpow(ah, sc->cur_chan->cur_txpower,
			       sc->cur_chan->txpower,
			       &sc->cur_chan->cur_txpower);
	clear_bit(ATH_OP_HW_RESET, &common->op_flags);

	if (!sc->cur_chan->offchannel && start) {
@@ -1468,8 +1469,9 @@ static int ath9k_config(struct ieee80211_hw *hw, u32 changed)
	if (changed & IEEE80211_CONF_CHANGE_POWER) {
		ath_dbg(common, CONFIG, "Set power: %d\n", conf->power_level);
		sc->cur_chan->txpower = 2 * conf->power_level;
		ath9k_cmn_update_txpow(ah, sc->curtxpow,
				       sc->cur_chan->txpower, &sc->curtxpow);
		ath9k_cmn_update_txpow(ah, sc->cur_chan->cur_txpower,
				       sc->cur_chan->txpower,
				       &sc->cur_chan->cur_txpower);
	}

	mutex_unlock(&sc->mutex);
@@ -2591,6 +2593,24 @@ void ath9k_fill_chanctx_ops(void)

#endif

static int ath9k_get_txpower(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
			     int *dbm)
{
	struct ath_softc *sc = hw->priv;
	struct ath_vif *avp = (void *)vif->drv_priv;

	mutex_lock(&sc->mutex);
	if (avp->chanctx)
		*dbm = avp->chanctx->cur_txpower;
	else
		*dbm = sc->cur_chan->cur_txpower;
	mutex_unlock(&sc->mutex);

	*dbm /= 2;

	return 0;
}

struct ieee80211_ops ath9k_ops = {
	.tx 		    = ath9k_tx,
	.start 		    = ath9k_start,
@@ -2637,4 +2657,5 @@ struct ieee80211_ops ath9k_ops = {
#endif
	.sw_scan_start	    = ath9k_sw_scan_start,
	.sw_scan_complete   = ath9k_sw_scan_complete,
	.get_txpower        = ath9k_get_txpower,
};