From: Sven Eckelmann <sven@narfation.org>
To: ath11k@lists.infradead.org
Cc: Sven Eckelmann <seckelmann@datto.com>
Subject: [PATCH 2/3] ath11k: support for mgmt rate control
Date: Fri, 5 Jul 2019 12:31:07 +0200 [thread overview]
Message-ID: <20190705103109.3731-3-sven@narfation.org> (raw)
In-Reply-To: <20190705103109.3731-1-sven@narfation.org>
From: Sven Eckelmann <seckelmann@datto.com>
The management frames have to be sent at a basic rate. But the ath11k
firmware is always doing them on 1 Mbit/s for 2.4GHz and 6 Mbit/s for 5GHz.
These might not be the basic rates which the AP advertised. Clients which
don't support these rates will therefore not be able to receive them
correctly.
mac80211 already provides a list of basic rates for the driver. ath11k has
to pick the lowest one and send it to the firmware rate control.
Signed-off-by: Sven Eckelmann <seckelmann@datto.com>
---
drivers/net/wireless/ath/ath11k/mac.c | 60 +++++++++++++++++++++++++++
1 file changed, 60 insertions(+)
diff --git a/drivers/net/wireless/ath/ath11k/mac.c b/drivers/net/wireless/ath/ath11k/mac.c
index 592fe79e8489..cda5b39f1a9b 100644
--- a/drivers/net/wireless/ath/ath11k/mac.c
+++ b/drivers/net/wireless/ath/ath11k/mac.c
@@ -1614,6 +1614,62 @@ static void ath11k_bss_disassoc(struct ieee80211_hw *hw,
/* TODO: cancel connection_loss_work */
}
+static u32 ath11k_mac_get_rate_hw_value(int bitrate)
+{
+ u32 preamble;
+ u16 hw_value;
+ int rate;
+ size_t i;
+
+ if (ath11k_mac_bitrate_is_cck(bitrate))
+ preamble = WMI_RATE_PREAMBLE_CCK;
+ else
+ preamble = WMI_RATE_PREAMBLE_OFDM;
+
+ for (i = 0; i < ARRAY_SIZE(ath11k_legacy_rates); i++) {
+ if (ath11k_legacy_rates[i].bitrate != bitrate)
+ continue;
+
+ hw_value = ath11k_legacy_rates[i].hw_value;
+ rate = ATH11K_HW_RATE_CODE(hw_value, 0, preamble);
+
+ return rate;
+ }
+
+ return -EINVAL;
+}
+
+static void ath11k_recalculate_mgmt_rate(struct ath11k *ar,
+ struct ieee80211_vif *vif,
+ struct cfg80211_chan_def *def)
+{
+ struct ath11k_vif *arvif = (void *)vif->drv_priv;
+ const struct ieee80211_supported_band *sband;
+ u8 basic_rate_idx;
+ int hw_rate_code;
+ u32 vdev_param;
+ u16 bitrate;
+ int ret;
+
+ lockdep_assert_held(&ar->conf_mutex);
+
+ sband = ar->hw->wiphy->bands[def->chan->band];
+ basic_rate_idx = ffs(vif->bss_conf.basic_rates) - 1;
+ bitrate = sband->bitrates[basic_rate_idx].bitrate;
+
+ hw_rate_code = ath11k_mac_get_rate_hw_value(bitrate);
+ if (hw_rate_code < 0) {
+ ath11k_warn(ar->ab, "bitrate not supported %d\n", bitrate);
+ return;
+ }
+
+ vdev_param = WMI_VDEV_PARAM_MGMT_RATE;
+ ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, vdev_param,
+ hw_rate_code);
+ if (ret)
+ ath11k_warn(ar->ab, "failed to set mgmt tx rate %d\n", ret);
+}
+
static void ath11k_mac_op_bss_info_changed(struct ieee80211_hw *hw,
struct ieee80211_vif *vif,
struct ieee80211_bss_conf *info,
@@ -1821,6 +1877,10 @@ static void ath11k_mac_op_bss_info_changed(struct ieee80211_hw *hw,
arvif->vdev_id, ret);
}
+ if (changed & BSS_CHANGED_BASIC_RATES &&
+ !ath11k_mac_vif_chan(arvif->vif, &def))
+ ath11k_recalculate_mgmt_rate(ar, vif, &def);
+
mutex_unlock(&ar->conf_mutex);
}
--
2.20.1
_______________________________________________
ath11k mailing list
ath11k@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/ath11k
next prev parent reply other threads:[~2019-07-05 10:39 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-07-05 10:31 [PATCH 0/3] ath11k: add support for mgmt and mcast rate control Sven Eckelmann
2019-07-05 10:31 ` [PATCH 1/3] ath11k: support for multicast " Sven Eckelmann
2019-07-17 12:23 ` Kalle Valo
2019-07-05 10:31 ` Sven Eckelmann [this message]
2019-07-05 10:31 ` [PATCH 3/3] ath11k: apply mgmt rate for beacons Sven Eckelmann
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=20190705103109.3731-3-sven@narfation.org \
--to=sven@narfation.org \
--cc=ath11k@lists.infradead.org \
--cc=seckelmann@datto.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox