mirror of
https://github.com/Telecominfraproject/wlan-ap.git
synced 2025-12-20 19:03:39 +00:00
590 lines
19 KiB
Diff
590 lines
19 KiB
Diff
From 22f04f2a2893f5dfd13ea1871a61d127b13349f4 Mon Sep 17 00:00:00 2001
|
|
From: Muna Sinada <quic_msinada@quicinc.com>
|
|
Date: Mon, 8 Feb 2021 20:08:34 -0800
|
|
Subject: [PATCH v2] ath12k: add support to configure spatial reuse parameter
|
|
set
|
|
|
|
The SPR parameter set comprises OBSS PD threshold for SRG
|
|
and non SRG and Bitmap of BSS color and partial BSSID. This adds
|
|
support to configure fields of SPR element to firmware.
|
|
|
|
Signed-off-by: Muna Sinada <quic_msinada@quicinc.com>
|
|
---
|
|
.../net/wireless/ath/ath12k/debugfs_htt_stats.c | 12 ++
|
|
.../net/wireless/ath/ath12k/debugfs_htt_stats.h | 15 +-
|
|
drivers/net/wireless/ath/ath12k/mac.c | 179 +++++++++++++++-
|
|
drivers/net/wireless/ath/ath12k/mac.h | 6 +
|
|
drivers/net/wireless/ath/ath12k/wmi.c | 227 +++++++++++++++++++++
|
|
drivers/net/wireless/ath/ath12k/wmi.h | 36 ++++
|
|
6 files changed, 471 insertions(+), 4 deletions(-)
|
|
|
|
--- a/drivers/net/wireless/ath/ath12k/mac.c
|
|
+++ b/drivers/net/wireless/ath/ath12k/mac.c
|
|
@@ -3125,6 +3125,182 @@ static int ath12k_mac_fils_discovery(str
|
|
return ret;
|
|
}
|
|
|
|
+static void ath12k_mac_non_srg_th_config(struct ath12k *ar,
|
|
+ struct ieee80211_he_obss_pd *he_obss_pd,
|
|
+ u32 *param_val)
|
|
+{
|
|
+ s8 non_srg_th = ATH12K_OBSS_PD_THRESHOLD_DISABLED;
|
|
+
|
|
+ if (he_obss_pd->sr_ctrl &
|
|
+ IEEE80211_HE_SPR_NON_SRG_OBSS_PD_SR_DISALLOWED) {
|
|
+ non_srg_th = ATH12K_OBSS_PD_MAX_THRESHOLD;
|
|
+ } else {
|
|
+ if (he_obss_pd->sr_ctrl &
|
|
+ IEEE80211_HE_SPR_NON_SRG_OFFSET_PRESENT)
|
|
+ non_srg_th = (ATH12K_OBSS_PD_MAX_THRESHOLD +
|
|
+ he_obss_pd->non_srg_max_offset);
|
|
+
|
|
+ *param_val |= ATH12K_OBSS_PD_NON_SRG_EN;
|
|
+ }
|
|
+
|
|
+ if (!test_bit(WMI_TLV_SERVICE_SRG_SRP_SPATIAL_REUSE_SUPPORT,
|
|
+ ar->ab->wmi_ab.svc_map)) {
|
|
+ if (non_srg_th != ATH12K_OBSS_PD_THRESHOLD_DISABLED)
|
|
+ non_srg_th -= ATH12K_DEFAULT_NOISE_FLOOR;
|
|
+ }
|
|
+
|
|
+ *param_val |= (non_srg_th & GENMASK(7, 0));
|
|
+}
|
|
+
|
|
+static void ath12k_mac_srg_th_config(struct ath12k *ar,
|
|
+ struct ieee80211_he_obss_pd *he_obss_pd,
|
|
+ u32 *param_val)
|
|
+{
|
|
+ s8 srg_th = 0;
|
|
+
|
|
+ if (he_obss_pd->sr_ctrl & IEEE80211_HE_SPR_SRG_INFORMATION_PRESENT) {
|
|
+ srg_th = ATH12K_OBSS_PD_MAX_THRESHOLD + he_obss_pd->max_offset;
|
|
+ *param_val |= ATH12K_OBSS_PD_SRG_EN;
|
|
+ }
|
|
+
|
|
+ if (test_bit(WMI_TLV_SERVICE_SRG_SRP_SPATIAL_REUSE_SUPPORT,
|
|
+ ar->ab->wmi_ab.svc_map)) {
|
|
+ *param_val |= ATH12K_OBSS_PD_THRESHOLD_IN_DBM;
|
|
+ *param_val |= FIELD_PREP(GENMASK(15, 8), srg_th);
|
|
+ } else {
|
|
+ /* SRG not supported and threshold in dB */
|
|
+ *param_val &= ~(ATH12K_OBSS_PD_SRG_EN |
|
|
+ ATH12K_OBSS_PD_THRESHOLD_IN_DBM);
|
|
+ }
|
|
+}
|
|
+
|
|
+static int ath12k_mac_config_obss_pd(struct ath12k *ar,
|
|
+ struct ieee80211_he_obss_pd *he_obss_pd)
|
|
+{
|
|
+ u32 bitmap[2], param_id, param_val, pdev_id;
|
|
+ int ret;
|
|
+
|
|
+ pdev_id = ar->pdev->pdev_id;
|
|
+
|
|
+ /* Set and enable SRG/non-SRG OBSS PD Threshold */
|
|
+ param_id = WMI_PDEV_PARAM_SET_CMD_OBSS_PD_THRESHOLD;
|
|
+ if (test_bit(ATH12K_FLAG_MONITOR_ENABLED, &ar->monitor_flags)) {
|
|
+ ret = ath12k_wmi_pdev_set_param(ar, param_id, 0, pdev_id);
|
|
+ if (ret)
|
|
+ ath12k_warn(ar->ab,
|
|
+ "Failed to set obss_pd_threshold for pdev: %u\n",
|
|
+ pdev_id);
|
|
+ return ret;
|
|
+ }
|
|
+
|
|
+ ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
|
|
+ "OBSS PD Params: sr_ctrl %x non_srg_thres %u srg_max %u\n",
|
|
+ he_obss_pd->sr_ctrl, he_obss_pd->non_srg_max_offset,
|
|
+ he_obss_pd->max_offset);
|
|
+
|
|
+ param_val = 0;
|
|
+
|
|
+ /* Preparing non-SRG OBSS PD Threshold Configurations */
|
|
+ ath12k_mac_non_srg_th_config(ar, he_obss_pd, ¶m_val);
|
|
+
|
|
+ /* Preparing SRG OBSS PD Threshold Configurations */
|
|
+ ath12k_mac_srg_th_config(ar, he_obss_pd, ¶m_val);
|
|
+
|
|
+ ret = ath12k_wmi_pdev_set_param(ar, param_id, param_val, pdev_id);
|
|
+ if (ret) {
|
|
+ ath12k_warn(ar->ab,
|
|
+ "Failed to set obss_pd_threshold for pdev: %u\n",
|
|
+ pdev_id);
|
|
+ return ret;
|
|
+ }
|
|
+
|
|
+ /* Enable OBSS PD for all access category */
|
|
+ param_id = WMI_PDEV_PARAM_SET_CMD_OBSS_PD_PER_AC;
|
|
+ param_val = 0xf;
|
|
+ ret = ath12k_wmi_pdev_set_param(ar, param_id, param_val, pdev_id);
|
|
+ if (ret) {
|
|
+ ath12k_warn(ar->ab,
|
|
+ "Failed to set obss_pd_per_ac for pdev: %u\n",
|
|
+ pdev_id);
|
|
+ return ret;
|
|
+ }
|
|
+
|
|
+ /* Set SR Prohibit */
|
|
+ param_id = WMI_PDEV_PARAM_ENABLE_SR_PROHIBIT;
|
|
+ param_val = !!(he_obss_pd->sr_ctrl &
|
|
+ IEEE80211_HE_SPR_HESIGA_SR_VAL15_ALLOWED);
|
|
+ ret = ath12k_wmi_pdev_set_param(ar, param_id, param_val, pdev_id);
|
|
+ if (ret) {
|
|
+ ath12k_warn(ar->ab, "Failed to set sr_prohibit for pdev: %u\n",
|
|
+ pdev_id);
|
|
+ return ret;
|
|
+ }
|
|
+
|
|
+ if (!test_bit(WMI_TLV_SERVICE_SRG_SRP_SPATIAL_REUSE_SUPPORT,
|
|
+ ar->ab->wmi_ab.svc_map))
|
|
+ return 0;
|
|
+
|
|
+ /* Set SRG BSS Color Bitmap */
|
|
+ memcpy(bitmap, he_obss_pd->bss_color_bitmap, sizeof(bitmap));
|
|
+ ret = ath12k_wmi_pdev_set_srg_bss_color_bitmap(ar, bitmap);
|
|
+ if (ret) {
|
|
+ ath12k_warn(ar->ab,
|
|
+ "Failed to set bss_color_bitmap for pdev: %u\n",
|
|
+ pdev_id);
|
|
+ return ret;
|
|
+ }
|
|
+
|
|
+ /* Set SRG Partial BSSID Bitmap */
|
|
+ memcpy(bitmap, he_obss_pd->partial_bssid_bitmap, sizeof(bitmap));
|
|
+ ret = ath12k_wmi_pdev_set_srg_patial_bssid_bitmap(ar, bitmap);
|
|
+ if (ret) {
|
|
+ ath12k_warn(ar->ab,
|
|
+ "Failed to set partial_bssid_bitmap for pdev: %u\n",
|
|
+ pdev_id);
|
|
+ return ret;
|
|
+ }
|
|
+
|
|
+ memset(bitmap, 0xff, sizeof(bitmap));
|
|
+
|
|
+ /* Enable all BSS Colors for SRG */
|
|
+ ret = ath12k_wmi_pdev_srg_obss_color_enable_bitmap(ar, bitmap);
|
|
+ if (ret) {
|
|
+ ath12k_warn(ar->ab,
|
|
+ "Failed to set srg_color_en_bitmap pdev: %u\n",
|
|
+ pdev_id);
|
|
+ return ret;
|
|
+ }
|
|
+
|
|
+ /* Enable all patial BSSID mask for SRG */
|
|
+ ret = ath12k_wmi_pdev_srg_obss_bssid_enable_bitmap(ar, bitmap);
|
|
+ if (ret) {
|
|
+ ath12k_warn(ar->ab,
|
|
+ "Failed to set srg_bssid_en_bitmap pdev: %u\n",
|
|
+ pdev_id);
|
|
+ return ret;
|
|
+ }
|
|
+
|
|
+ /* Enable all BSS Colors for non-SRG */
|
|
+ ret = ath12k_wmi_pdev_non_srg_obss_color_enable_bitmap(ar, bitmap);
|
|
+ if (ret) {
|
|
+ ath12k_warn(ar->ab,
|
|
+ "Failed to set non_srg_color_en_bitmap pdev: %u\n",
|
|
+ pdev_id);
|
|
+ return ret;
|
|
+ }
|
|
+
|
|
+ /* Enable all patial BSSID mask for non-SRG */
|
|
+ ret = ath12k_wmi_pdev_non_srg_obss_bssid_enable_bitmap(ar, bitmap);
|
|
+ if (ret) {
|
|
+ ath12k_warn(ar->ab,
|
|
+ "Failed to set non_srg_bssid_en_bitmap pdev: %u\n",
|
|
+ pdev_id);
|
|
+ return ret;
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
static void ath12k_mac_op_bss_info_changed(struct ieee80211_hw *hw,
|
|
struct ieee80211_vif *vif,
|
|
struct ieee80211_bss_conf *info,
|
|
@@ -3389,8 +3565,7 @@ static void ath12k_mac_op_bss_info_chang
|
|
}
|
|
|
|
if (changed & BSS_CHANGED_HE_OBSS_PD)
|
|
- ath12k_wmi_send_obss_spr_cmd(ar, arvif->vdev_id,
|
|
- &info->he_obss_pd);
|
|
+ ath12k_mac_config_obss_pd(ar, &info->he_obss_pd);
|
|
|
|
if (changed & BSS_CHANGED_HE_BSS_COLOR) {
|
|
if (vif->type == NL80211_IFTYPE_AP) {
|
|
--- a/drivers/net/wireless/ath/ath12k/mac.h
|
|
+++ b/drivers/net/wireless/ath/ath12k/mac.h
|
|
@@ -120,6 +120,12 @@ struct ath12k_generic_iter {
|
|
#define ATH12K_PEER_RX_NSS_160MHZ GENMASK(2, 0)
|
|
#define ATH12K_PEER_RX_NSS_80_80MHZ GENMASK(5, 3)
|
|
|
|
+#define ATH12K_OBSS_PD_MAX_THRESHOLD -82
|
|
+#define ATH12K_OBSS_PD_THRESHOLD_DISABLED -128
|
|
+#define ATH12K_OBSS_PD_THRESHOLD_IN_DBM BIT(29)
|
|
+#define ATH12K_OBSS_PD_SRG_EN BIT(30)
|
|
+#define ATH12K_OBSS_PD_NON_SRG_EN BIT(31)
|
|
+
|
|
extern const struct htt_rx_ring_tlv_filter ath12k_mac_mon_status_filter_default;
|
|
|
|
void ath12k_mac_destroy(struct ath12k_base *ab);
|
|
--- a/drivers/net/wireless/ath/ath12k/wmi.c
|
|
+++ b/drivers/net/wireless/ath/ath12k/wmi.c
|
|
@@ -3160,6 +3160,232 @@ int ath12k_wmi_obss_color_cfg_cmd(struct
|
|
return ret;
|
|
}
|
|
|
|
+int ath12k_wmi_pdev_set_srg_bss_color_bitmap(struct ath12k *ar, u32 *bitmap)
|
|
+{
|
|
+ struct ath12k_pdev_wmi *wmi = ar->wmi;
|
|
+ struct ath12k_base *ab = wmi->wmi_ab->ab;
|
|
+ struct wmi_pdev_obss_pd_bitmap_cmd *cmd;
|
|
+ struct sk_buff *skb;
|
|
+ int ret, len;
|
|
+
|
|
+ len = sizeof(*cmd);
|
|
+
|
|
+ skb = ath12k_wmi_alloc_skb(wmi->wmi_ab, len);
|
|
+ if (!skb)
|
|
+ return -ENOMEM;
|
|
+
|
|
+ cmd = (struct wmi_pdev_obss_pd_bitmap_cmd *)skb->data;
|
|
+ cmd->tlv_header = FIELD_PREP(WMI_TLV_TAG,
|
|
+ WMI_TAG_PDEV_SRG_BSS_COLOR_BITMAP_CMD) |
|
|
+ FIELD_PREP(WMI_TLV_LEN, len - TLV_HDR_SIZE);
|
|
+ cmd->pdev_id = ar->pdev->pdev_id;
|
|
+ memcpy(cmd->bitmap, bitmap, sizeof(cmd->bitmap));
|
|
+
|
|
+ ath12k_dbg(ar->ab, ATH12K_DBG_WMI,
|
|
+ "obss pd pdev_id %d bss color bitmap %08x %08x\n",
|
|
+ cmd->pdev_id, cmd->bitmap[0], cmd->bitmap[1]);
|
|
+
|
|
+ ret = ath12k_wmi_cmd_send(wmi, skb,
|
|
+ WMI_PDEV_SET_SRG_BSS_COLOR_BITMAP_CMDID);
|
|
+ if (ret) {
|
|
+ ath12k_warn(ab,
|
|
+ "Failed to send WMI_PDEV_SET_SRG_BSS_COLOR_BITMAP_CMDID");
|
|
+ dev_kfree_skb(skb);
|
|
+ }
|
|
+
|
|
+ return ret;
|
|
+}
|
|
+
|
|
+int
|
|
+ath12k_wmi_pdev_set_srg_patial_bssid_bitmap(struct ath12k *ar, u32 *bitmap)
|
|
+{
|
|
+ struct ath12k_pdev_wmi *wmi = ar->wmi;
|
|
+ struct ath12k_base *ab = wmi->wmi_ab->ab;
|
|
+ struct wmi_pdev_obss_pd_bitmap_cmd *cmd;
|
|
+ struct sk_buff *skb;
|
|
+ int ret, len;
|
|
+
|
|
+ len = sizeof(*cmd);
|
|
+
|
|
+ skb = ath12k_wmi_alloc_skb(wmi->wmi_ab, len);
|
|
+ if (!skb)
|
|
+ return -ENOMEM;
|
|
+
|
|
+ cmd = (struct wmi_pdev_obss_pd_bitmap_cmd *)skb->data;
|
|
+ cmd->tlv_header =
|
|
+ FIELD_PREP(WMI_TLV_TAG,
|
|
+ WMI_TAG_PDEV_SRG_PARTIAL_BSSID_BITMAP_CMD) |
|
|
+ FIELD_PREP(WMI_TLV_LEN, len - TLV_HDR_SIZE);
|
|
+ cmd->pdev_id = ar->pdev->pdev_id;
|
|
+ memcpy(cmd->bitmap, bitmap, sizeof(cmd->bitmap));
|
|
+
|
|
+ ath12k_dbg(ar->ab, ATH12K_DBG_WMI,
|
|
+ "obss pd pdev_id %d partial bssid bitmap %08x %08x\n",
|
|
+ cmd->pdev_id, cmd->bitmap[0], cmd->bitmap[1]);
|
|
+
|
|
+ ret = ath12k_wmi_cmd_send(wmi, skb,
|
|
+ WMI_PDEV_SET_SRG_PARTIAL_BSSID_BITMAP_CMDID);
|
|
+ if (ret) {
|
|
+ ath12k_warn(ab,
|
|
+ "Failed to send WMI_PDEV_SET_SRG_PARTIAL_BSSID_BITMAP_CMDID");
|
|
+ dev_kfree_skb(skb);
|
|
+ }
|
|
+
|
|
+ return ret;
|
|
+}
|
|
+
|
|
+int
|
|
+ath12k_wmi_pdev_srg_obss_color_enable_bitmap(struct ath12k *ar, u32 *bitmap)
|
|
+{
|
|
+ struct ath12k_pdev_wmi *wmi = ar->wmi;
|
|
+ struct ath12k_base *ab = wmi->wmi_ab->ab;
|
|
+ struct wmi_pdev_obss_pd_bitmap_cmd *cmd;
|
|
+ struct sk_buff *skb;
|
|
+ int ret, len;
|
|
+
|
|
+ len = sizeof(*cmd);
|
|
+
|
|
+ skb = ath12k_wmi_alloc_skb(wmi->wmi_ab, len);
|
|
+ if (!skb)
|
|
+ return -ENOMEM;
|
|
+
|
|
+ cmd = (struct wmi_pdev_obss_pd_bitmap_cmd *)skb->data;
|
|
+ cmd->tlv_header =
|
|
+ FIELD_PREP(WMI_TLV_TAG,
|
|
+ WMI_TAG_PDEV_SRG_OBSS_COLOR_ENABLE_BITMAP_CMD) |
|
|
+ FIELD_PREP(WMI_TLV_LEN, len - TLV_HDR_SIZE);
|
|
+ cmd->pdev_id = ar->pdev->pdev_id;
|
|
+ memcpy(cmd->bitmap, bitmap, sizeof(cmd->bitmap));
|
|
+
|
|
+ ath12k_dbg(ar->ab, ATH12K_DBG_WMI,
|
|
+ "obss pd srg pdev_id %d bss color enable bitmap %08x %08x\n",
|
|
+ cmd->pdev_id, cmd->bitmap[0], cmd->bitmap[1]);
|
|
+
|
|
+ ret = ath12k_wmi_cmd_send(wmi, skb,
|
|
+ WMI_PDEV_SET_SRG_OBSS_COLOR_ENABLE_BITMAP_CMDID);
|
|
+ if (ret) {
|
|
+ ath12k_warn(ab,
|
|
+ "Failed to send WMI_PDEV_SET_SRG_OBSS_COLOR_ENABLE_BITMAP_CMDID");
|
|
+ dev_kfree_skb(skb);
|
|
+ }
|
|
+
|
|
+ return ret;
|
|
+}
|
|
+
|
|
+int
|
|
+ath12k_wmi_pdev_srg_obss_bssid_enable_bitmap(struct ath12k *ar, u32 *bitmap)
|
|
+{
|
|
+ struct ath12k_pdev_wmi *wmi = ar->wmi;
|
|
+ struct ath12k_base *ab = wmi->wmi_ab->ab;
|
|
+ struct wmi_pdev_obss_pd_bitmap_cmd *cmd;
|
|
+ struct sk_buff *skb;
|
|
+ int ret, len;
|
|
+
|
|
+ len = sizeof(*cmd);
|
|
+
|
|
+ skb = ath12k_wmi_alloc_skb(wmi->wmi_ab, len);
|
|
+ if (!skb)
|
|
+ return -ENOMEM;
|
|
+
|
|
+ cmd = (struct wmi_pdev_obss_pd_bitmap_cmd *)skb->data;
|
|
+ cmd->tlv_header =
|
|
+ FIELD_PREP(WMI_TLV_TAG,
|
|
+ WMI_TAG_PDEV_SRG_OBSS_BSSID_ENABLE_BITMAP_CMD) |
|
|
+ FIELD_PREP(WMI_TLV_LEN, len - TLV_HDR_SIZE);
|
|
+ cmd->pdev_id = ar->pdev->pdev_id;
|
|
+ memcpy(cmd->bitmap, bitmap, sizeof(cmd->bitmap));
|
|
+
|
|
+ ath12k_dbg(ar->ab, ATH12K_DBG_WMI,
|
|
+ "obss pd srg pdev_id %d bssid enable bitmap %08x %08x\n",
|
|
+ cmd->pdev_id, cmd->bitmap[0], cmd->bitmap[1]);
|
|
+
|
|
+ ret = ath12k_wmi_cmd_send(wmi, skb,
|
|
+ WMI_PDEV_SET_SRG_OBSS_BSSID_ENABLE_BITMAP_CMDID);
|
|
+ if (ret) {
|
|
+ ath12k_warn(ab,
|
|
+ "Failed to send WMI_PDEV_SET_SRG_OBSS_BSSID_ENABLE_BITMAP_CMDID");
|
|
+ dev_kfree_skb(skb);
|
|
+ }
|
|
+
|
|
+ return ret;
|
|
+}
|
|
+
|
|
+int
|
|
+ath12k_wmi_pdev_non_srg_obss_color_enable_bitmap(struct ath12k *ar, u32 *bitmap)
|
|
+{
|
|
+ struct ath12k_pdev_wmi *wmi = ar->wmi;
|
|
+ struct ath12k_base *ab = wmi->wmi_ab->ab;
|
|
+ struct wmi_pdev_obss_pd_bitmap_cmd *cmd;
|
|
+ struct sk_buff *skb;
|
|
+ int ret, len;
|
|
+
|
|
+ len = sizeof(*cmd);
|
|
+
|
|
+ skb = ath12k_wmi_alloc_skb(wmi->wmi_ab, len);
|
|
+ if (!skb)
|
|
+ return -ENOMEM;
|
|
+
|
|
+ cmd = (struct wmi_pdev_obss_pd_bitmap_cmd *)skb->data;
|
|
+ cmd->tlv_header =
|
|
+ FIELD_PREP(WMI_TLV_TAG,
|
|
+ WMI_TAG_PDEV_NON_SRG_OBSS_COLOR_ENABLE_BITMAP_CMD) |
|
|
+ FIELD_PREP(WMI_TLV_LEN, len - TLV_HDR_SIZE);
|
|
+ cmd->pdev_id = ar->pdev->pdev_id;
|
|
+ memcpy(cmd->bitmap, bitmap, sizeof(cmd->bitmap));
|
|
+
|
|
+ ath12k_dbg(ar->ab, ATH12K_DBG_WMI,
|
|
+ "obss pd non_srg pdev_id %d bss color enable bitmap %08x %08x\n",
|
|
+ cmd->pdev_id, cmd->bitmap[0], cmd->bitmap[1]);
|
|
+
|
|
+ ret = ath12k_wmi_cmd_send(wmi, skb,
|
|
+ WMI_PDEV_SET_NON_SRG_OBSS_COLOR_ENABLE_BITMAP_CMDID);
|
|
+ if (ret) {
|
|
+ ath12k_warn(ab,
|
|
+ "Failed to send WMI_PDEV_SET_NON_SRG_OBSS_COLOR_ENABLE_BITMAP_CMDID");
|
|
+ dev_kfree_skb(skb);
|
|
+ }
|
|
+
|
|
+ return ret;
|
|
+}
|
|
+
|
|
+int
|
|
+ath12k_wmi_pdev_non_srg_obss_bssid_enable_bitmap(struct ath12k *ar, u32 *bitmap)
|
|
+{
|
|
+ struct ath12k_pdev_wmi *wmi = ar->wmi;
|
|
+ struct ath12k_base *ab = wmi->wmi_ab->ab;
|
|
+ struct wmi_pdev_obss_pd_bitmap_cmd *cmd;
|
|
+ struct sk_buff *skb;
|
|
+ int ret, len;
|
|
+
|
|
+ len = sizeof(*cmd);
|
|
+
|
|
+ skb = ath12k_wmi_alloc_skb(wmi->wmi_ab, len);
|
|
+ if (!skb)
|
|
+ return -ENOMEM;
|
|
+
|
|
+ cmd = (struct wmi_pdev_obss_pd_bitmap_cmd *)skb->data;
|
|
+ cmd->tlv_header =
|
|
+ FIELD_PREP(WMI_TLV_TAG,
|
|
+ WMI_TAG_PDEV_NON_SRG_OBSS_BSSID_ENABLE_BITMAP_CMD) |
|
|
+ FIELD_PREP(WMI_TLV_LEN, len - TLV_HDR_SIZE);
|
|
+ cmd->pdev_id = ar->pdev->pdev_id;
|
|
+ memcpy(cmd->bitmap, bitmap, sizeof(cmd->bitmap));
|
|
+
|
|
+ ath12k_dbg(ar->ab, ATH12K_DBG_WMI,
|
|
+ "obss pd non_srg pdev_id %d bssid enable bitmap %08x %08x\n",
|
|
+ cmd->pdev_id, cmd->bitmap[0], cmd->bitmap[1]);
|
|
+
|
|
+ ret = ath12k_wmi_cmd_send(wmi, skb,
|
|
+ WMI_PDEV_SET_NON_SRG_OBSS_BSSID_ENABLE_BITMAP_CMDID);
|
|
+ if (ret) {
|
|
+ ath12k_warn(ab,
|
|
+ "Failed to send WMI_PDEV_SET_NON_SRG_OBSS_BSSID_ENABLE_BITMAP_CMDID");
|
|
+ dev_kfree_skb(skb);
|
|
+ }
|
|
+
|
|
+ return ret;
|
|
+}
|
|
+
|
|
int ath12k_wmi_send_bss_color_change_enable_cmd(struct ath12k *ar, u32 vdev_id,
|
|
bool enable)
|
|
{
|
|
--- a/drivers/net/wireless/ath/ath12k/wmi.h
|
|
+++ b/drivers/net/wireless/ath/ath12k/wmi.h
|
|
@@ -270,6 +270,16 @@ enum wmi_tlv_cmd_id {
|
|
WMI_PDEV_DMA_RING_CFG_REQ_CMDID,
|
|
WMI_PDEV_HE_TB_ACTION_FRM_CMDID,
|
|
WMI_PDEV_PKTLOG_FILTER_CMDID,
|
|
+ WMI_PDEV_SET_RAP_CONFIG_CMDID,
|
|
+ WMI_PDEV_DSM_FILTER_CMDID,
|
|
+ WMI_PDEV_FRAME_INJECT_CMDID,
|
|
+ WMI_PDEV_TBTT_OFFSET_SYNC_CMDID,
|
|
+ WMI_PDEV_SET_SRG_BSS_COLOR_BITMAP_CMDID,
|
|
+ WMI_PDEV_SET_SRG_PARTIAL_BSSID_BITMAP_CMDID,
|
|
+ WMI_PDEV_SET_SRG_OBSS_COLOR_ENABLE_BITMAP_CMDID,
|
|
+ WMI_PDEV_SET_SRG_OBSS_BSSID_ENABLE_BITMAP_CMDID,
|
|
+ WMI_PDEV_SET_NON_SRG_OBSS_COLOR_ENABLE_BITMAP_CMDID,
|
|
+ WMI_PDEV_SET_NON_SRG_OBSS_BSSID_ENABLE_BITMAP_CMDID,
|
|
WMI_VDEV_CREATE_CMDID = WMI_TLV_CMD(WMI_GRP_VDEV),
|
|
WMI_VDEV_DELETE_CMDID,
|
|
WMI_VDEV_START_REQUEST_CMDID,
|
|
@@ -934,6 +944,9 @@ enum wmi_tlv_pdev_param {
|
|
WMI_PDEV_PARAM_RADIO_CHAN_STATS_ENABLE,
|
|
WMI_PDEV_PARAM_RADIO_DIAGNOSIS_ENABLE,
|
|
WMI_PDEV_PARAM_MESH_MCAST_ENABLE,
|
|
+ WMI_PDEV_PARAM_SET_CMD_OBSS_PD_THRESHOLD = 0xbc,
|
|
+ WMI_PDEV_PARAM_SET_CMD_OBSS_PD_PER_AC = 0xbe,
|
|
+ WMI_PDEV_PARAM_ENABLE_SR_PROHIBIT = 0xc6,
|
|
};
|
|
|
|
enum wmi_tlv_vdev_param {
|
|
@@ -1845,6 +1858,12 @@ enum wmi_tlv_tag {
|
|
WMI_TAG_SERVICE_READY_EXT2_EVENT = 0x334,
|
|
WMI_TAG_FILS_DISCOVERY_TMPL_CMD = 0x344,
|
|
WMI_TAG_MAC_PHY_CAPABILITIES_EXT = 0x36F,
|
|
+ WMI_TAG_PDEV_SRG_BSS_COLOR_BITMAP_CMD = 0x37b,
|
|
+ WMI_TAG_PDEV_SRG_PARTIAL_BSSID_BITMAP_CMD,
|
|
+ WMI_TAG_PDEV_SRG_OBSS_COLOR_ENABLE_BITMAP_CMD = 0x381,
|
|
+ WMI_TAG_PDEV_SRG_OBSS_BSSID_ENABLE_BITMAP_CMD,
|
|
+ WMI_TAG_PDEV_NON_SRG_OBSS_COLOR_ENABLE_BITMAP_CMD,
|
|
+ WMI_TAG_PDEV_NON_SRG_OBSS_BSSID_ENABLE_BITMAP_CMD,
|
|
WMI_TAG_REGULATORY_RULE_EXT_STRUCT = 0x3A9,
|
|
WMI_TAG_REG_CHAN_LIST_CC_EXT_EVENT,
|
|
WMI_TAG_EHT_RATE_SET = 0x3C4,
|
|
@@ -2071,6 +2090,7 @@ enum wmi_tlv_service {
|
|
WMI_TLV_SERVICE_PER_PEER_HTT_STATS_RESET = 213,
|
|
WMI_TLV_SERVICE_FREQINFO_IN_METADATA = 219,
|
|
WMI_TLV_SERVICE_EXT2_MSG = 220,
|
|
+ WMI_TLV_SERVICE_SRG_SRP_SPATIAL_REUSE_SUPPORT = 249,
|
|
|
|
WMI_MAX_EXT_SERVICE = 256,
|
|
|
|
@@ -5080,6 +5100,12 @@ struct wmi_obss_spatial_reuse_params_cmd
|
|
__le32 vdev_id;
|
|
} __packed;
|
|
|
|
+struct wmi_pdev_obss_pd_bitmap_cmd {
|
|
+ u32 tlv_header;
|
|
+ u32 pdev_id;
|
|
+ u32 bitmap[2];
|
|
+} __packed;
|
|
+
|
|
#define ATH12K_BSS_COLOR_COLLISION_SCAN_PERIOD_MS 200
|
|
#define ATH12K_OBSS_COLOR_COLLISION_DETECTION_DISABLE 0
|
|
#define ATH12K_OBSS_COLOR_COLLISION_DETECTION 1
|
|
@@ -5623,6 +5649,16 @@ int ath12k_wmi_send_twt_enable_cmd(struc
|
|
int ath12k_wmi_send_twt_disable_cmd(struct ath12k *ar, u32 pdev_id);
|
|
int ath12k_wmi_send_obss_spr_cmd(struct ath12k *ar, u32 vdev_id,
|
|
struct ieee80211_he_obss_pd *he_obss_pd);
|
|
+int ath12k_wmi_pdev_set_srg_bss_color_bitmap(struct ath12k *ar, u32 *bitmap);
|
|
+int ath12k_wmi_pdev_set_srg_patial_bssid_bitmap(struct ath12k *ar, u32 *bitmap);
|
|
+int ath12k_wmi_pdev_srg_obss_color_enable_bitmap(struct ath12k *ar,
|
|
+ u32 *bitmap);
|
|
+int ath12k_wmi_pdev_srg_obss_bssid_enable_bitmap(struct ath12k *ar,
|
|
+ u32 *bitmap);
|
|
+int ath12k_wmi_pdev_non_srg_obss_color_enable_bitmap(struct ath12k *ar,
|
|
+ u32 *bitmap);
|
|
+int ath12k_wmi_pdev_non_srg_obss_bssid_enable_bitmap(struct ath12k *ar,
|
|
+ u32 *bitmap);
|
|
int ath12k_wmi_obss_color_cfg_cmd(struct ath12k *ar, u32 vdev_id,
|
|
u8 bss_color, u32 period,
|
|
bool enable);
|
|
--- a/drivers/net/wireless/ath/ath12k/debugfs_htt_stats.c
|
|
+++ b/drivers/net/wireless/ath/ath12k/debugfs_htt_stats.c
|
|
@@ -3846,6 +3846,17 @@ htt_print_pdev_obss_pd_stats_tlv_v(const
|
|
htt_stats_buf->num_obss_tx_ppdu_success);
|
|
len += HTT_DBG_OUT(buf + len, buf_len - len, "OBSS Tx failures PPDU = %u\n",
|
|
htt_stats_buf->num_obss_tx_ppdu_failure);
|
|
+ len += HTT_DBG_OUT(buf + len, buf_len - len, "Non-SRG Opportunities = %u\n",
|
|
+ htt_stats_buf->num_non_srg_opportunities);
|
|
+ len += HTT_DBG_OUT(buf + len, buf_len - len, "Non-SRG tried PPDU = %u\n",
|
|
+ htt_stats_buf->num_non_srg_ppdu_tried);
|
|
+ len += HTT_DBG_OUT(buf + len, buf_len - len, "Non-SRG success PPDU = %u\n",
|
|
+ htt_stats_buf->num_non_srg_ppdu_success);
|
|
+ len += HTT_DBG_OUT(buf + len, buf_len - len, "SRG Opportunities = %u\n",
|
|
+ htt_stats_buf->num_srg_opportunities);
|
|
+ len += HTT_DBG_OUT(buf + len, buf_len - len, "SRG tried PPDU = %u\n",
|
|
+ htt_stats_buf->num_srg_ppdu_tried);
|
|
+ len += HTT_DBG_OUT(buf + len, buf_len - len, "SRG success PPDU = %u\n",
|
|
|
|
if (len >= buf_len)
|
|
buf[buf_len - 1] = 0;
|
|
--- a/drivers/net/wireless/ath/ath12k/debugfs_htt_stats.h
|
|
+++ b/drivers/net/wireless/ath/ath12k/debugfs_htt_stats.h
|
|
@@ -1785,8 +1785,19 @@ struct htt_tx_sounding_stats_tlv {
|
|
};
|
|
|
|
struct htt_pdev_obss_pd_stats_tlv {
|
|
- u32 num_obss_tx_ppdu_success;
|
|
- u32 num_obss_tx_ppdu_failure;
|
|
+ u32 num_obss_tx_ppdu_success;
|
|
+ u32 num_obss_tx_ppdu_failure;
|
|
+ u32 num_sr_tx_transmissions;
|
|
+ u32 num_spatial_reuse_opportunities;
|
|
+ u32 num_non_srg_opportunities;
|
|
+ u32 num_non_srg_ppdu_tried;
|
|
+ u32 num_non_srg_ppdu_success;
|
|
+ u32 num_srg_opportunities;
|
|
+ u32 num_srg_ppdu_tried;
|
|
+ u32 num_srg_ppdu_success;
|
|
+ u32 num_psr_opportunities;
|
|
+ u32 num_psr_ppdu_tried;
|
|
+ u32 num_psr_ppdu_success;
|
|
};
|
|
|
|
struct htt_ring_backpressure_stats_tlv {
|