Skip to content

Commit

Permalink
mac80211: add support for driver tx power reporting
Browse files Browse the repository at this point in the history
The configured tx power is often limited by hardware capabilities,
channel settings, antenna configuration, etc.

Signed-off-by: Felix Fietkau <nbd@openwrt.org>
[fix tracing compilation]
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  • Loading branch information
Felix Fietkau authored and Johannes Berg committed Nov 4, 2014
1 parent 0563921 commit 5b3dc42
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 0 deletions.
5 changes: 5 additions & 0 deletions include/net/mac80211.h
Original file line number Diff line number Diff line change
Expand Up @@ -2857,6 +2857,9 @@ enum ieee80211_roc_type {
* @get_expected_throughput: extract the expected throughput towards the
* specified station. The returned value is expressed in Kbps. It returns 0
* if the RC algorithm does not have proper data to provide.
*
* @get_txpower: get current maximum tx power (in dBm) based on configuration
* and hardware limits.
*/
struct ieee80211_ops {
void (*tx)(struct ieee80211_hw *hw,
Expand Down Expand Up @@ -3065,6 +3068,8 @@ struct ieee80211_ops {
int (*join_ibss)(struct ieee80211_hw *hw, struct ieee80211_vif *vif);
void (*leave_ibss)(struct ieee80211_hw *hw, struct ieee80211_vif *vif);
u32 (*get_expected_throughput)(struct ieee80211_sta *sta);
int (*get_txpower)(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
int *dbm);
};

/**
Expand Down
3 changes: 3 additions & 0 deletions net/mac80211/cfg.c
Original file line number Diff line number Diff line change
Expand Up @@ -2133,6 +2133,9 @@ static int ieee80211_get_tx_power(struct wiphy *wiphy,
struct ieee80211_local *local = wiphy_priv(wiphy);
struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);

if (local->ops->get_txpower)
return drv_get_txpower(local, sdata, dbm);

if (!local->use_chanctx)
*dbm = local->hw.conf.power_level;
else
Expand Down
14 changes: 14 additions & 0 deletions net/mac80211/driver-ops.h
Original file line number Diff line number Diff line change
Expand Up @@ -1279,4 +1279,18 @@ static inline u32 drv_get_expected_throughput(struct ieee80211_local *local,
return ret;
}

static inline int drv_get_txpower(struct ieee80211_local *local,
struct ieee80211_sub_if_data *sdata, int *dbm)
{
int ret;

if (!local->ops->get_txpower)
return -EOPNOTSUPP;

ret = local->ops->get_txpower(&local->hw, &sdata->vif, dbm);
trace_drv_get_txpower(local, sdata, *dbm, ret);

return ret;
}

#endif /* __MAC80211_DRIVER_OPS */
27 changes: 27 additions & 0 deletions net/mac80211/trace.h
Original file line number Diff line number Diff line change
Expand Up @@ -2150,6 +2150,33 @@ DEFINE_EVENT(local_sdata_evt, drv_post_channel_switch,
TP_ARGS(local, sdata)
);

TRACE_EVENT(drv_get_txpower,
TP_PROTO(struct ieee80211_local *local,
struct ieee80211_sub_if_data *sdata,
int dbm, int ret),

TP_ARGS(local, sdata, dbm, ret),

TP_STRUCT__entry(
LOCAL_ENTRY
VIF_ENTRY
__field(int, dbm)
__field(int, ret)
),

TP_fast_assign(
LOCAL_ASSIGN;
VIF_ASSIGN;
__entry->dbm = dbm;
__entry->ret = ret;
),

TP_printk(
LOCAL_PR_FMT VIF_PR_FMT " dbm:%d ret:%d",
LOCAL_PR_ARG, VIF_PR_ARG, __entry->dbm, __entry->ret
)
);


#ifdef CONFIG_MAC80211_MESSAGE_TRACING
#undef TRACE_SYSTEM
Expand Down

0 comments on commit 5b3dc42

Please sign in to comment.