From: Brian Norris <briannorris@chromium.org>
To: Carl Huang <cjhuang@codeaurora.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: Wed, 4 Nov 2020 15:11:28 -0800 [thread overview]
Message-ID: <20201104231128.GA3212577@google.com> (raw)
In-Reply-To: <1600753775-4745-2-git-send-email-cjhuang@codeaurora.org>
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.
> +{
> + int ret;
> +
> + if (!ar->hw_params.dynamic_sar_support)
> + return 0;
return -EOPNOTSUPP ?
> +
> + 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:
> + 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?
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: Brian Norris <briannorris@chromium.org>
To: Carl Huang <cjhuang@codeaurora.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: Wed, 4 Nov 2020 15:11:28 -0800 [thread overview]
Message-ID: <20201104231128.GA3212577@google.com> (raw)
In-Reply-To: <1600753775-4745-2-git-send-email-cjhuang@codeaurora.org>
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.
> +{
> + int ret;
> +
> + if (!ar->hw_params.dynamic_sar_support)
> + return 0;
return -EOPNOTSUPP ?
> +
> + 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:
> + 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?
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-04 23:12 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 [this message]
2020-11-04 23:11 ` Brian Norris
2020-11-05 11:27 ` Carl Huang
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=20201104231128.GA3212577@google.com \
--to=briannorris@chromium.org \
--cc=ath10k@lists.infradead.org \
--cc=cjhuang@codeaurora.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.