Commit 5b3dc42b authored by Felix Fietkau's avatar Felix Fietkau Committed by Johannes Berg

mac80211: add support for driver tx power reporting

The configured tx power is often limited by hardware capabilities,
channel settings, antenna configuration, etc.
Signed-off-by: default avatarFelix Fietkau <nbd@openwrt.org>
[fix tracing compilation]
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 0563921a
...@@ -2857,6 +2857,9 @@ enum ieee80211_roc_type { ...@@ -2857,6 +2857,9 @@ enum ieee80211_roc_type {
* @get_expected_throughput: extract the expected throughput towards the * @get_expected_throughput: extract the expected throughput towards the
* specified station. The returned value is expressed in Kbps. It returns 0 * specified station. The returned value is expressed in Kbps. It returns 0
* if the RC algorithm does not have proper data to provide. * 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 { struct ieee80211_ops {
void (*tx)(struct ieee80211_hw *hw, void (*tx)(struct ieee80211_hw *hw,
...@@ -3065,6 +3068,8 @@ struct ieee80211_ops { ...@@ -3065,6 +3068,8 @@ struct ieee80211_ops {
int (*join_ibss)(struct ieee80211_hw *hw, struct ieee80211_vif *vif); int (*join_ibss)(struct ieee80211_hw *hw, struct ieee80211_vif *vif);
void (*leave_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); u32 (*get_expected_throughput)(struct ieee80211_sta *sta);
int (*get_txpower)(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
int *dbm);
}; };
/** /**
......
...@@ -2133,6 +2133,9 @@ static int ieee80211_get_tx_power(struct wiphy *wiphy, ...@@ -2133,6 +2133,9 @@ static int ieee80211_get_tx_power(struct wiphy *wiphy,
struct ieee80211_local *local = wiphy_priv(wiphy); struct ieee80211_local *local = wiphy_priv(wiphy);
struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev); 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) if (!local->use_chanctx)
*dbm = local->hw.conf.power_level; *dbm = local->hw.conf.power_level;
else else
......
...@@ -1279,4 +1279,18 @@ static inline u32 drv_get_expected_throughput(struct ieee80211_local *local, ...@@ -1279,4 +1279,18 @@ static inline u32 drv_get_expected_throughput(struct ieee80211_local *local,
return ret; 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 */ #endif /* __MAC80211_DRIVER_OPS */
...@@ -2150,6 +2150,33 @@ DEFINE_EVENT(local_sdata_evt, drv_post_channel_switch, ...@@ -2150,6 +2150,33 @@ DEFINE_EVENT(local_sdata_evt, drv_post_channel_switch,
TP_ARGS(local, sdata) 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 #ifdef CONFIG_MAC80211_MESSAGE_TRACING
#undef TRACE_SYSTEM #undef TRACE_SYSTEM
......
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