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

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

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
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -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,
@@ -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);
};

/**
+3 −0
Original line number Diff line number Diff line
@@ -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
+14 −0
Original line number Diff line number Diff line
@@ -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 −0
Original line number Diff line number Diff line
@@ -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