From: Carl Huang <cjhuang@codeaurora.org>
To: Brian Norris <briannorris@chromium.org>
Cc: linux-wireless@vger.kernel.org, dianders@chromium.org,
ath10k@lists.infradead.org, kuabhs@google.com
Subject: Re: [RFC 2/2] ath10k: allow dynamic SAR power limits via common API
Date: Thu, 05 Nov 2020 19:27:46 +0800 [thread overview]
Message-ID: <6563d6ac38368de40cd07ae36f230a86@codeaurora.org> (raw)
In-Reply-To: <20201104231128.GA3212577@google.com>
On 2020-11-05 07:11, Brian Norris wrote:
> Hi,
>
> On Tue, Sep 22, 2020 at 01:49:35PM +0800, Carl Huang wrote:
>> ath10k assigns ath10k_mac_set_sar_specs to ath10k_ops, and
>> this function is called when user space application calls
>> NL80211_CMD_SET_SAR_SPECS. ath10k also registers SAR type,
>> and supported frequency ranges to wiphy so user space can
>> query SAR capabilities.
>>
>> ath10k_mac_set_sar_specs further sets the power to firmware
>> to limit the TX power.
>>
>> This feature is controlled by hw parameter: dynamic_sar_support.
>>
>> Signed-off-by: Carl Huang <cjhuang@codeaurora.org>
>> ---
>
>> diff --git a/drivers/net/wireless/ath/ath10k/mac.c
>> b/drivers/net/wireless/ath/ath10k/mac.c
>> index 2e3eb5b..830c61f 100644
>> --- a/drivers/net/wireless/ath/ath10k/mac.c
>> +++ b/drivers/net/wireless/ath/ath10k/mac.c
>> @@ -81,6 +81,17 @@ static struct ieee80211_rate ath10k_rates_rev2[] =
>> {
>> { .bitrate = 540, .hw_value = ATH10K_HW_RATE_OFDM_54M },
>> };
>>
>> +static const struct cfg80211_sar_freq_ranges ath10k_sar_freq_ranges[]
>> = {
>> + { .index = 0, .start_freq = 2412000, .end_freq = 2484000 },
>
> 2412 MHz is a center frequency, but other parts of the nl80211 API use
> band edges. For example:
>
> * @NL80211_ATTR_FREQ_RANGE_START: starting frequencry for the
> regulatory
> * rule in KHz. This is not a center of frequency but an actual
> regulatory
> * band edge.
> * @NL80211_ATTR_FREQ_RANGE_END: ending frequency for the regulatory
> rule
> * in KHz. This is not a center a frequency but an actual
> regulatory
> * band edge.
>
> Seems like we should improve the nl80211.h docs (patch 1) and make
> these
> edges (this patch).
>
>> + { .index = 1, .start_freq = 2484000, .end_freq = 5865000 },
>> +};
>> +
>> +static const struct cfg80211_sar_capa ath10k_sar_capa = {
>> + .type = NL80211_SAR_TYPE_POWER,
>> + .num_freq_ranges = (ARRAY_SIZE(ath10k_sar_freq_ranges)),
>> + .freq_ranges = &ath10k_sar_freq_ranges[0],
>> +};
>> +
>> #define ATH10K_MAC_FIRST_OFDM_RATE_IDX 4
>>
>> #define ath10k_a_rates (ath10k_rates +
>> ATH10K_MAC_FIRST_OFDM_RATE_IDX)
>> @@ -2880,6 +2891,95 @@ static int ath10k_mac_vif_recalc_txbf(struct
>> ath10k *ar,
>> return 0;
>> }
>>
>> +static bool ath10k_mac_is_connected(struct ath10k *ar)
>> +{
>> + struct ath10k_vif *arvif;
>> +
>> + list_for_each_entry(arvif, &ar->arvifs, list) {
>> + if (arvif->is_up && arvif->vdev_type == WMI_VDEV_TYPE_STA)
>> + return true;
>> + }
>> +
>> + return false;
>> +}
>> +
>> +int ath10k_mac_set_sar_power(struct ath10k *ar)
>
> This function should be static.
>
Right.
>> +{
>> + int ret;
>> +
>> + if (!ar->hw_params.dynamic_sar_support)
>> + return 0;
>
> return -EOPNOTSUPP ?
>
sure
>> +
>> + if (ar->tx_power_2g_limit == 0 || ar->tx_power_5g_limit == 0)
>
> ath10k_mac_txpower_recalc() doesn't care about this -- why should you?
> This also seems especially weird, because one of the 2 could be valid
> nonzero values, and yet you're silently rejecting it. Regardless, the
> following seems wrong:
>
Per current design, it's required for userspace to always set meaningful
power limitations.
Now in V2, 0 will be treated as "don't have SAR on this range".
>> + return 0;
>
> This should probably be an error.
>
>> +
>> + if (!ath10k_mac_is_connected(ar))
>> + return 0;
>
> Note to self (since this wasn't obvious to me the first read-through):
> you're calling this function from ath10k_bss_assoc() too, so even if
> you
> weren't connected the first time around, it'll get called later.
>
>> +
>> + ret = ath10k_wmi_pdev_set_param(ar,
>> + ar->wmi.pdev_param->txpower_limit2g,
>> + ar->tx_power_2g_limit);
>> + if (ret) {
>> + ath10k_warn(ar, "failed to set 2.4G txpower %d: %d\n",
>> + ar->tx_power_2g_limit, ret);
>> + return ret;
>> + }
>> +
>> + ret = ath10k_wmi_pdev_set_param(ar,
>> + ar->wmi.pdev_param->txpower_limit5g,
>> + ar->tx_power_5g_limit);
>> + if (ret) {
>> + ath10k_warn(ar, "failed to set 5G txpower %d: %d\n",
>> + ar->tx_power_5g_limit, ret);
>> + return ret;
>> + }
>
> Hmm, so these are the same params configured by
> ath10k_mac_txpower_recalc(), except that we're not taking into account
> the limitations in ath10k_mac_txpower_recalc() (and vice versa) --
> isn't
> that bad? Should we be merging the SAR limitation into
> ath10k_mac_txpower_recalc() and calling that instead?
>
Good suggestions.
> Brian
>
>> +
>> + ath10k_dbg(ar, ATH10K_DBG_MAC, "set txpower 2G:%d, 5G:%d
>> successfully\n",
>> + ar->tx_power_2g_limit, ar->tx_power_5g_limit);
>> +
>> + return ret;
>> +}
>> +
_______________________________________________
ath10k mailing list
ath10k@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/ath10k
WARNING: multiple messages have this Message-ID (diff)
From: Carl Huang <cjhuang@codeaurora.org>
To: Brian Norris <briannorris@chromium.org>
Cc: ath10k@lists.infradead.org, linux-wireless@vger.kernel.org,
dianders@chromium.org, kuabhs@google.com
Subject: Re: [RFC 2/2] ath10k: allow dynamic SAR power limits via common API
Date: Thu, 05 Nov 2020 19:27:46 +0800 [thread overview]
Message-ID: <6563d6ac38368de40cd07ae36f230a86@codeaurora.org> (raw)
In-Reply-To: <20201104231128.GA3212577@google.com>
On 2020-11-05 07:11, Brian Norris wrote:
> Hi,
>
> On Tue, Sep 22, 2020 at 01:49:35PM +0800, Carl Huang wrote:
>> ath10k assigns ath10k_mac_set_sar_specs to ath10k_ops, and
>> this function is called when user space application calls
>> NL80211_CMD_SET_SAR_SPECS. ath10k also registers SAR type,
>> and supported frequency ranges to wiphy so user space can
>> query SAR capabilities.
>>
>> ath10k_mac_set_sar_specs further sets the power to firmware
>> to limit the TX power.
>>
>> This feature is controlled by hw parameter: dynamic_sar_support.
>>
>> Signed-off-by: Carl Huang <cjhuang@codeaurora.org>
>> ---
>
>> diff --git a/drivers/net/wireless/ath/ath10k/mac.c
>> b/drivers/net/wireless/ath/ath10k/mac.c
>> index 2e3eb5b..830c61f 100644
>> --- a/drivers/net/wireless/ath/ath10k/mac.c
>> +++ b/drivers/net/wireless/ath/ath10k/mac.c
>> @@ -81,6 +81,17 @@ static struct ieee80211_rate ath10k_rates_rev2[] =
>> {
>> { .bitrate = 540, .hw_value = ATH10K_HW_RATE_OFDM_54M },
>> };
>>
>> +static const struct cfg80211_sar_freq_ranges ath10k_sar_freq_ranges[]
>> = {
>> + { .index = 0, .start_freq = 2412000, .end_freq = 2484000 },
>
> 2412 MHz is a center frequency, but other parts of the nl80211 API use
> band edges. For example:
>
> * @NL80211_ATTR_FREQ_RANGE_START: starting frequencry for the
> regulatory
> * rule in KHz. This is not a center of frequency but an actual
> regulatory
> * band edge.
> * @NL80211_ATTR_FREQ_RANGE_END: ending frequency for the regulatory
> rule
> * in KHz. This is not a center a frequency but an actual
> regulatory
> * band edge.
>
> Seems like we should improve the nl80211.h docs (patch 1) and make
> these
> edges (this patch).
>
>> + { .index = 1, .start_freq = 2484000, .end_freq = 5865000 },
>> +};
>> +
>> +static const struct cfg80211_sar_capa ath10k_sar_capa = {
>> + .type = NL80211_SAR_TYPE_POWER,
>> + .num_freq_ranges = (ARRAY_SIZE(ath10k_sar_freq_ranges)),
>> + .freq_ranges = &ath10k_sar_freq_ranges[0],
>> +};
>> +
>> #define ATH10K_MAC_FIRST_OFDM_RATE_IDX 4
>>
>> #define ath10k_a_rates (ath10k_rates +
>> ATH10K_MAC_FIRST_OFDM_RATE_IDX)
>> @@ -2880,6 +2891,95 @@ static int ath10k_mac_vif_recalc_txbf(struct
>> ath10k *ar,
>> return 0;
>> }
>>
>> +static bool ath10k_mac_is_connected(struct ath10k *ar)
>> +{
>> + struct ath10k_vif *arvif;
>> +
>> + list_for_each_entry(arvif, &ar->arvifs, list) {
>> + if (arvif->is_up && arvif->vdev_type == WMI_VDEV_TYPE_STA)
>> + return true;
>> + }
>> +
>> + return false;
>> +}
>> +
>> +int ath10k_mac_set_sar_power(struct ath10k *ar)
>
> This function should be static.
>
Right.
>> +{
>> + int ret;
>> +
>> + if (!ar->hw_params.dynamic_sar_support)
>> + return 0;
>
> return -EOPNOTSUPP ?
>
sure
>> +
>> + if (ar->tx_power_2g_limit == 0 || ar->tx_power_5g_limit == 0)
>
> ath10k_mac_txpower_recalc() doesn't care about this -- why should you?
> This also seems especially weird, because one of the 2 could be valid
> nonzero values, and yet you're silently rejecting it. Regardless, the
> following seems wrong:
>
Per current design, it's required for userspace to always set meaningful
power limitations.
Now in V2, 0 will be treated as "don't have SAR on this range".
>> + return 0;
>
> This should probably be an error.
>
>> +
>> + if (!ath10k_mac_is_connected(ar))
>> + return 0;
>
> Note to self (since this wasn't obvious to me the first read-through):
> you're calling this function from ath10k_bss_assoc() too, so even if
> you
> weren't connected the first time around, it'll get called later.
>
>> +
>> + ret = ath10k_wmi_pdev_set_param(ar,
>> + ar->wmi.pdev_param->txpower_limit2g,
>> + ar->tx_power_2g_limit);
>> + if (ret) {
>> + ath10k_warn(ar, "failed to set 2.4G txpower %d: %d\n",
>> + ar->tx_power_2g_limit, ret);
>> + return ret;
>> + }
>> +
>> + ret = ath10k_wmi_pdev_set_param(ar,
>> + ar->wmi.pdev_param->txpower_limit5g,
>> + ar->tx_power_5g_limit);
>> + if (ret) {
>> + ath10k_warn(ar, "failed to set 5G txpower %d: %d\n",
>> + ar->tx_power_5g_limit, ret);
>> + return ret;
>> + }
>
> Hmm, so these are the same params configured by
> ath10k_mac_txpower_recalc(), except that we're not taking into account
> the limitations in ath10k_mac_txpower_recalc() (and vice versa) --
> isn't
> that bad? Should we be merging the SAR limitation into
> ath10k_mac_txpower_recalc() and calling that instead?
>
Good suggestions.
> Brian
>
>> +
>> + ath10k_dbg(ar, ATH10K_DBG_MAC, "set txpower 2G:%d, 5G:%d
>> successfully\n",
>> + ar->tx_power_2g_limit, ar->tx_power_5g_limit);
>> +
>> + return ret;
>> +}
>> +
next prev parent reply other threads:[~2020-11-05 11:27 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-09-22 5:49 [RFC 1/2] nl80211: add common API to configure SAR power limitations Carl Huang
2020-09-22 5:49 ` Carl Huang
2020-09-22 5:49 ` [RFC 2/2] ath10k: allow dynamic SAR power limits via common API Carl Huang
2020-09-22 5:49 ` Carl Huang
2020-09-22 7:33 ` kernel test robot
2020-09-22 13:32 ` kernel test robot
2020-11-04 23:11 ` Brian Norris
2020-11-04 23:11 ` Brian Norris
2020-11-05 11:27 ` Carl Huang [this message]
2020-11-05 11:27 ` Carl Huang
2020-11-05 17:49 ` Brian Norris
2020-11-05 17:49 ` Brian Norris
2020-09-28 12:36 ` [RFC 1/2] nl80211: add common API to configure SAR power limitations Johannes Berg
2020-09-28 12:36 ` Johannes Berg
2020-10-30 20:56 ` Abhishek Kumar
2020-10-30 20:56 ` Abhishek Kumar
2020-10-31 2:46 ` Abhishek Kumar
2020-11-03 2:34 ` Carl Huang
2020-11-03 2:34 ` Carl Huang
2020-11-03 13:15 ` Johannes Berg
2020-11-03 13:15 ` Johannes Berg
2020-11-04 1:17 ` Abhishek Kumar
2020-11-04 1:17 ` Abhishek Kumar
2020-11-04 6:18 ` Carl Huang
2020-11-04 6:18 ` Carl Huang
2020-11-04 8:44 ` Carl Huang
2020-11-04 8:44 ` Carl Huang
2020-11-04 17:48 ` Brian Norris
2020-11-04 17:48 ` Brian Norris
2020-11-05 11:37 ` Carl Huang
2020-11-05 11:37 ` Carl Huang
2020-11-04 23:18 ` Brian Norris
2020-11-04 23:18 ` Brian Norris
2020-11-04 23:27 ` Brian Norris
2020-11-04 23:27 ` Brian Norris
2020-11-05 11:30 ` Carl Huang
2020-11-05 11:30 ` Carl Huang
-- strict thread matches above, loose matches on Subject: below --
2020-09-22 5:36 Carl Huang
2020-09-22 5:36 ` [RFC 2/2] ath10k: allow dynamic SAR power limits via common API Carl Huang
2020-09-22 5:36 ` Carl Huang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=6563d6ac38368de40cd07ae36f230a86@codeaurora.org \
--to=cjhuang@codeaurora.org \
--cc=ath10k@lists.infradead.org \
--cc=briannorris@chromium.org \
--cc=dianders@chromium.org \
--cc=kuabhs@google.com \
--cc=linux-wireless@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.