diff mbox

[v2,2/2] mac80211: store tx power value from user to station

Message ID 1485888101-23454-2-git-send-email-arnagara@qti.qualcomm.com (mailing list archive)
State Changes Requested
Delegated to: Johannes Berg
Headers show

Commit Message

Ashok Raj Nagarajan Jan. 31, 2017, 6:41 p.m. UTC
This patch introduce a new driver callback drv_sta_set_txpwr. This API will
copy the transmit power value passed from user space and call the driver
callback to set the tx power for the station.

Signed-off-by: Ashok Raj Nagarajan <arnagara@qti.qualcomm.com>
---
 include/net/mac80211.h    |  6 ++++++
 net/mac80211/cfg.c        |  7 +++++++
 net/mac80211/driver-ops.c | 21 +++++++++++++++++++++
 net/mac80211/driver-ops.h |  5 +++++
 net/mac80211/trace.h      | 27 +++++++++++++++++++++++++++
 5 files changed, 66 insertions(+)

Comments

Ben Greear Jan. 31, 2017, 7 p.m. UTC | #1
On 01/31/2017 10:41 AM, Ashok Raj Nagarajan wrote:
> This patch introduce a new driver callback drv_sta_set_txpwr. This API will
> copy the transmit power value passed from user space and call the driver
> callback to set the tx power for the station.
>
> Signed-off-by: Ashok Raj Nagarajan <arnagara@qti.qualcomm.com>
> ---
>  include/net/mac80211.h    |  6 ++++++
>  net/mac80211/cfg.c        |  7 +++++++
>  net/mac80211/driver-ops.c | 21 +++++++++++++++++++++
>  net/mac80211/driver-ops.h |  5 +++++
>  net/mac80211/trace.h      | 27 +++++++++++++++++++++++++++
>  5 files changed, 66 insertions(+)
>
> diff --git a/include/net/mac80211.h b/include/net/mac80211.h
> index 5345d35..e059d5a 100644
> --- a/include/net/mac80211.h
> +++ b/include/net/mac80211.h
> @@ -1777,6 +1777,8 @@ struct ieee80211_sta_rates {
>   *	This is defined by the spec (IEEE 802.11-2012 section 8.3.2.2 NOTE 2).
>   * @support_p2p_ps: indicates whether the STA supports P2P PS mechanism or not.
>   * @max_rc_amsdu_len: Maximum A-MSDU size in bytes recommended by rate control.
> + * @txpwr: indicates the tx power, in dBm, to be used when sending data frames
> + *	to the STA. Value of 0 means, automatic (default) tx power.

Atheros NICs use 1/2 dBm increments internally, so maybe pass down mBm to the driver so you don't
loose the granularity?  (Other NICs may potentially have even finer control.)

Thanks,
Ben
Ashok Raj Nagarajan Feb. 1, 2017, 5:29 p.m. UTC | #2
On 2017-02-01 00:30, Ben Greear wrote:
> On 01/31/2017 10:41 AM, Ashok Raj Nagarajan wrote:
>> This patch introduce a new driver callback drv_sta_set_txpwr. This API 
>> will
>> copy the transmit power value passed from user space and call the 
>> driver
>> callback to set the tx power for the station.
>> 
>> Signed-off-by: Ashok Raj Nagarajan <arnagara@qti.qualcomm.com>
>> ---
>>  include/net/mac80211.h    |  6 ++++++
>>  net/mac80211/cfg.c        |  7 +++++++
>>  net/mac80211/driver-ops.c | 21 +++++++++++++++++++++
>>  net/mac80211/driver-ops.h |  5 +++++
>>  net/mac80211/trace.h      | 27 +++++++++++++++++++++++++++
>>  5 files changed, 66 insertions(+)
>> 
>> diff --git a/include/net/mac80211.h b/include/net/mac80211.h
>> index 5345d35..e059d5a 100644
>> --- a/include/net/mac80211.h
>> +++ b/include/net/mac80211.h
>> @@ -1777,6 +1777,8 @@ struct ieee80211_sta_rates {
>>   *	This is defined by the spec (IEEE 802.11-2012 section 8.3.2.2 NOTE 
>> 2).
>>   * @support_p2p_ps: indicates whether the STA supports P2P PS 
>> mechanism or not.
>>   * @max_rc_amsdu_len: Maximum A-MSDU size in bytes recommended by 
>> rate control.
>> + * @txpwr: indicates the tx power, in dBm, to be used when sending 
>> data frames
>> + *	to the STA. Value of 0 means, automatic (default) tx power.
> 
> Atheros NICs use 1/2 dBm increments internally, so maybe pass down mBm
> to the driver so you don't
> loose the granularity?  (Other NICs may potentially have even finer 
> control.)
> 

ath10k firmware expects values to be in dBm and the calculations 
regarding 1/2 dBm is taken care in firmware.

Thanks,
Ashok
> Thanks,
> Ben
Ben Greear Feb. 1, 2017, 5:32 p.m. UTC | #3
On 02/01/2017 09:29 AM, Ashok Raj Nagarajan wrote:
> On 2017-02-01 00:30, Ben Greear wrote:
>> On 01/31/2017 10:41 AM, Ashok Raj Nagarajan wrote:
>>> This patch introduce a new driver callback drv_sta_set_txpwr. This API will
>>> copy the transmit power value passed from user space and call the driver
>>> callback to set the tx power for the station.
>>>
>>> Signed-off-by: Ashok Raj Nagarajan <arnagara@qti.qualcomm.com>
>>> ---
>>>  include/net/mac80211.h    |  6 ++++++
>>>  net/mac80211/cfg.c        |  7 +++++++
>>>  net/mac80211/driver-ops.c | 21 +++++++++++++++++++++
>>>  net/mac80211/driver-ops.h |  5 +++++
>>>  net/mac80211/trace.h      | 27 +++++++++++++++++++++++++++
>>>  5 files changed, 66 insertions(+)
>>>
>>> diff --git a/include/net/mac80211.h b/include/net/mac80211.h
>>> index 5345d35..e059d5a 100644
>>> --- a/include/net/mac80211.h
>>> +++ b/include/net/mac80211.h
>>> @@ -1777,6 +1777,8 @@ struct ieee80211_sta_rates {
>>>   *    This is defined by the spec (IEEE 802.11-2012 section 8.3.2.2 NOTE 2).
>>>   * @support_p2p_ps: indicates whether the STA supports P2P PS mechanism or not.
>>>   * @max_rc_amsdu_len: Maximum A-MSDU size in bytes recommended by rate control.
>>> + * @txpwr: indicates the tx power, in dBm, to be used when sending data frames
>>> + *    to the STA. Value of 0 means, automatic (default) tx power.
>>
>> Atheros NICs use 1/2 dBm increments internally, so maybe pass down mBm
>> to the driver so you don't
>> loose the granularity?  (Other NICs may potentially have even finer control.)
>>
>
> ath10k firmware expects values to be in dBm and the calculations regarding 1/2 dBm is taken care in firmware.

Other drivers may want more precision, so I still think you should store this in mBm instead
of throwing away precision in the API.

A new and improved ath10k firmware may support 1/2 dBm units directly, for instance.

Thanks,
Ben

>
> Thanks,
> Ashok
>> Thanks,
>> Ben
>
Ashok Raj Nagarajan Feb. 1, 2017, 5:47 p.m. UTC | #4
On 2017-02-01 23:02, Ben Greear wrote:
> On 02/01/2017 09:29 AM, Ashok Raj Nagarajan wrote:
>> On 2017-02-01 00:30, Ben Greear wrote:
>>> On 01/31/2017 10:41 AM, Ashok Raj Nagarajan wrote:
>>>> This patch introduce a new driver callback drv_sta_set_txpwr. This 
>>>> API will
>>>> copy the transmit power value passed from user space and call the 
>>>> driver
>>>> callback to set the tx power for the station.
>>>> 
>>>> Signed-off-by: Ashok Raj Nagarajan <arnagara@qti.qualcomm.com>
>>>> ---
>>>>  include/net/mac80211.h    |  6 ++++++
>>>>  net/mac80211/cfg.c        |  7 +++++++
>>>>  net/mac80211/driver-ops.c | 21 +++++++++++++++++++++
>>>>  net/mac80211/driver-ops.h |  5 +++++
>>>>  net/mac80211/trace.h      | 27 +++++++++++++++++++++++++++
>>>>  5 files changed, 66 insertions(+)
>>>> 
>>>> diff --git a/include/net/mac80211.h b/include/net/mac80211.h
>>>> index 5345d35..e059d5a 100644
>>>> --- a/include/net/mac80211.h
>>>> +++ b/include/net/mac80211.h
>>>> @@ -1777,6 +1777,8 @@ struct ieee80211_sta_rates {
>>>>   *    This is defined by the spec (IEEE 802.11-2012 section 8.3.2.2 
>>>> NOTE 2).
>>>>   * @support_p2p_ps: indicates whether the STA supports P2P PS 
>>>> mechanism or not.
>>>>   * @max_rc_amsdu_len: Maximum A-MSDU size in bytes recommended by 
>>>> rate control.
>>>> + * @txpwr: indicates the tx power, in dBm, to be used when sending 
>>>> data frames
>>>> + *    to the STA. Value of 0 means, automatic (default) tx power.
>>> 
>>> Atheros NICs use 1/2 dBm increments internally, so maybe pass down 
>>> mBm
>>> to the driver so you don't
>>> loose the granularity?  (Other NICs may potentially have even finer 
>>> control.)
>>> 
>> 
>> ath10k firmware expects values to be in dBm and the calculations 
>> regarding 1/2 dBm is taken care in firmware.
> 
> Other drivers may want more precision, so I still think you should
> store this in mBm instead
> of throwing away precision in the API.
> 

Okay point taken! Instead of having the conversion happening now in API, 
I will push it down to the ath10k driver.

> A new and improved ath10k firmware may support 1/2 dBm units directly,
> for instance.
> 
> Thanks,
> Ben
> 
>> 
>> Thanks,
>> Ashok
>>> Thanks,
>>> Ben
>>
diff mbox

Patch

diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index 5345d35..e059d5a 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -1777,6 +1777,8 @@  struct ieee80211_sta_rates {
  *	This is defined by the spec (IEEE 802.11-2012 section 8.3.2.2 NOTE 2).
  * @support_p2p_ps: indicates whether the STA supports P2P PS mechanism or not.
  * @max_rc_amsdu_len: Maximum A-MSDU size in bytes recommended by rate control.
+ * @txpwr: indicates the tx power, in dBm, to be used when sending data frames
+ *	to the STA. Value of 0 means, automatic (default) tx power.
  * @txq: per-TID data TX queues (if driver uses the TXQ abstraction)
  */
 struct ieee80211_sta {
@@ -1800,6 +1802,7 @@  struct ieee80211_sta {
 	u16 max_amsdu_len;
 	bool support_p2p_ps;
 	u16 max_rc_amsdu_len;
+	u8 txpwr;
 
 	struct ieee80211_txq *txq[IEEE80211_NUM_TIDS];
 
@@ -3545,6 +3548,9 @@  struct ieee80211_ops {
 #endif
 	void (*sta_notify)(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
 			enum sta_notify_cmd, struct ieee80211_sta *sta);
+	int (*sta_set_txpwr)(struct ieee80211_hw *hw,
+			     struct ieee80211_vif *vif,
+			     struct ieee80211_sta *sta);
 	int (*sta_state)(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
 			 struct ieee80211_sta *sta,
 			 enum ieee80211_sta_state old_state,
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
index e91e503..f84ada0 100644
--- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c
@@ -1346,6 +1346,13 @@  static int sta_apply_parameters(struct ieee80211_local *local,
 	if (params->listen_interval >= 0)
 		sta->listen_interval = params->listen_interval;
 
+	if (params->txpwr >= 0) {
+		sta->sta.txpwr = MBM_TO_DBM(params->txpwr);
+		ret = drv_sta_set_txpwr(local, sdata, sta);
+		if (ret)
+			return ret;
+	}
+
 	if (params->supported_rates) {
 		ieee80211_parse_bitrates(&sdata->vif.bss_conf.chandef,
 					 sband, params->supported_rates,
diff --git a/net/mac80211/driver-ops.c b/net/mac80211/driver-ops.c
index bb886e7..839c002 100644
--- a/net/mac80211/driver-ops.c
+++ b/net/mac80211/driver-ops.c
@@ -138,6 +138,27 @@  int drv_sta_state(struct ieee80211_local *local,
 	return ret;
 }
 
+__must_check
+int drv_sta_set_txpwr(struct ieee80211_local *local,
+		      struct ieee80211_sub_if_data *sdata,
+		      struct sta_info *sta)
+{
+	int ret = -EOPNOTSUPP;
+
+	might_sleep();
+
+	sdata = get_bss_sdata(sdata);
+	if (!check_sdata_in_driver(sdata))
+		return -EIO;
+
+	trace_drv_sta_set_txpwr(local, sdata, &sta->sta);
+	if (local->ops->sta_set_txpwr)
+		ret = local->ops->sta_set_txpwr(&local->hw, &sdata->vif,
+						&sta->sta);
+	trace_drv_return_int(local, ret);
+	return ret;
+}
+
 void drv_sta_rc_update(struct ieee80211_local *local,
 		       struct ieee80211_sub_if_data *sdata,
 		       struct ieee80211_sta *sta, u32 changed)
diff --git a/net/mac80211/driver-ops.h b/net/mac80211/driver-ops.h
index 09f77e4..2b13c39 100644
--- a/net/mac80211/driver-ops.h
+++ b/net/mac80211/driver-ops.h
@@ -526,6 +526,11 @@  int drv_sta_state(struct ieee80211_local *local,
 		  enum ieee80211_sta_state old_state,
 		  enum ieee80211_sta_state new_state);
 
+__must_check
+int drv_sta_set_txpwr(struct ieee80211_local *local,
+		      struct ieee80211_sub_if_data *sdata,
+		      struct sta_info *sta);
+
 void drv_sta_rc_update(struct ieee80211_local *local,
 		       struct ieee80211_sub_if_data *sdata,
 		       struct ieee80211_sta *sta, u32 changed);
diff --git a/net/mac80211/trace.h b/net/mac80211/trace.h
index 92a47af..a264261 100644
--- a/net/mac80211/trace.h
+++ b/net/mac80211/trace.h
@@ -823,6 +823,33 @@ 
 	)
 );
 
+TRACE_EVENT(drv_sta_set_txpwr,
+	TP_PROTO(struct ieee80211_local *local,
+		 struct ieee80211_sub_if_data *sdata,
+		 struct ieee80211_sta *sta),
+
+	TP_ARGS(local, sdata, sta),
+
+	TP_STRUCT__entry(
+		LOCAL_ENTRY
+		VIF_ENTRY
+		STA_ENTRY
+		__field(u8, txpwr)
+	),
+
+	TP_fast_assign(
+		LOCAL_ASSIGN;
+		VIF_ASSIGN;
+		STA_ASSIGN;
+		__entry->txpwr = sta->txpwr;
+	),
+
+	TP_printk(
+		LOCAL_PR_FMT  VIF_PR_FMT  STA_PR_FMT " txpwr: %d",
+		LOCAL_PR_ARG, VIF_PR_ARG, STA_PR_ARG, __entry->txpwr
+	)
+);
+
 TRACE_EVENT(drv_sta_rc_update,
 	TP_PROTO(struct ieee80211_local *local,
 		 struct ieee80211_sub_if_data *sdata,