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

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
...@@ -347,6 +347,7 @@ struct ath_chanctx { ...@@ -347,6 +347,7 @@ struct ath_chanctx {
int flush_timeout; int flush_timeout;
u16 txpower; u16 txpower;
u16 cur_txpower;
bool offchannel; bool offchannel;
bool stopped; bool stopped;
bool active; bool active;
...@@ -987,7 +988,6 @@ struct ath_softc { ...@@ -987,7 +988,6 @@ struct ath_softc {
u8 gtt_cnt; u8 gtt_cnt;
u32 intrstatus; u32 intrstatus;
u16 ps_flags; /* PS_* */ u16 ps_flags; /* PS_* */
u16 curtxpow;
bool ps_enabled; bool ps_enabled;
bool ps_idle; bool ps_idle;
short nbcnvifs; short nbcnvifs;
......
...@@ -172,17 +172,20 @@ static void ath9k_reg_notifier(struct wiphy *wiphy, ...@@ -172,17 +172,20 @@ static void ath9k_reg_notifier(struct wiphy *wiphy,
ath_reg_notifier_apply(wiphy, request, reg); ath_reg_notifier_apply(wiphy, request, reg);
/* Set tx power */ /* Set tx power */
if (ah->curchan) { if (!ah->curchan)
sc->cur_chan->txpower = 2 * ah->curchan->chan->max_power; return;
ath9k_ps_wakeup(sc);
ath9k_hw_set_txpowerlimit(ah, sc->cur_chan->txpower, false); sc->cur_chan->txpower = 2 * ah->curchan->chan->max_power;
sc->curtxpow = ath9k_hw_regulatory(ah)->power_limit; ath9k_ps_wakeup(sc);
/* synchronize DFS detector if regulatory domain changed */ ath9k_hw_set_txpowerlimit(ah, sc->cur_chan->txpower, false);
if (sc->dfs_detector != NULL) ath9k_cmn_update_txpow(ah, sc->cur_chan->cur_txpower,
sc->dfs_detector->set_dfs_domain(sc->dfs_detector, sc->cur_chan->txpower,
request->dfs_region); &sc->cur_chan->cur_txpower);
ath9k_ps_restore(sc); /* 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);
} }
/* /*
......
...@@ -233,8 +233,9 @@ static bool ath_complete_reset(struct ath_softc *sc, bool start) ...@@ -233,8 +233,9 @@ static bool ath_complete_reset(struct ath_softc *sc, bool start)
ath9k_calculate_summary_state(sc, sc->cur_chan); ath9k_calculate_summary_state(sc, sc->cur_chan);
ath_startrecv(sc); ath_startrecv(sc);
ath9k_cmn_update_txpow(ah, sc->curtxpow, ath9k_cmn_update_txpow(ah, sc->cur_chan->cur_txpower,
sc->cur_chan->txpower, &sc->curtxpow); sc->cur_chan->txpower,
&sc->cur_chan->cur_txpower);
clear_bit(ATH_OP_HW_RESET, &common->op_flags); clear_bit(ATH_OP_HW_RESET, &common->op_flags);
if (!sc->cur_chan->offchannel && start) { if (!sc->cur_chan->offchannel && start) {
...@@ -1468,8 +1469,9 @@ static int ath9k_config(struct ieee80211_hw *hw, u32 changed) ...@@ -1468,8 +1469,9 @@ static int ath9k_config(struct ieee80211_hw *hw, u32 changed)
if (changed & IEEE80211_CONF_CHANGE_POWER) { if (changed & IEEE80211_CONF_CHANGE_POWER) {
ath_dbg(common, CONFIG, "Set power: %d\n", conf->power_level); ath_dbg(common, CONFIG, "Set power: %d\n", conf->power_level);
sc->cur_chan->txpower = 2 * conf->power_level; sc->cur_chan->txpower = 2 * conf->power_level;
ath9k_cmn_update_txpow(ah, sc->curtxpow, ath9k_cmn_update_txpow(ah, sc->cur_chan->cur_txpower,
sc->cur_chan->txpower, &sc->curtxpow); sc->cur_chan->txpower,
&sc->cur_chan->cur_txpower);
} }
mutex_unlock(&sc->mutex); mutex_unlock(&sc->mutex);
...@@ -2591,6 +2593,24 @@ void ath9k_fill_chanctx_ops(void) ...@@ -2591,6 +2593,24 @@ void ath9k_fill_chanctx_ops(void)
#endif #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 = { struct ieee80211_ops ath9k_ops = {
.tx = ath9k_tx, .tx = ath9k_tx,
.start = ath9k_start, .start = ath9k_start,
...@@ -2637,4 +2657,5 @@ struct ieee80211_ops ath9k_ops = { ...@@ -2637,4 +2657,5 @@ struct ieee80211_ops ath9k_ops = {
#endif #endif
.sw_scan_start = ath9k_sw_scan_start, .sw_scan_start = ath9k_sw_scan_start,
.sw_scan_complete = ath9k_sw_scan_complete, .sw_scan_complete = ath9k_sw_scan_complete,
.get_txpower = ath9k_get_txpower,
}; };
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment