wlan-ap-Telecominfraproject/feeds/wifi-ax/mac80211/patches/qca/306-ath11k-sta-dbg-level-log.patch
John Crispin 43d7ca31d6 wifi-ax/mac80211: make the 11.4 ath11k work inside the v5.4 kernel
Fixes: WIFI-7570
Signed-off-by: John Crispin <john@phrozen.org>
2022-05-27 10:05:52 +02:00

425 lines
13 KiB
Diff

From 3fb34916b37bb56d1f956191b438a7447e134c77 Mon Sep 17 00:00:00 2001
From: Tamizh Chelvam <tamizhr@codeaurora.org>
Date: Tue, 30 Mar 2021 12:34:08 +0530
Subject: [PATCH] ath11k: Add support for peer dbg level logs
Signed-off-by: Tamizh Chelvam <tamizhr@codeaurora.org>
---
drivers/net/wireless/ath/ath11k/core.h | 7 +++
drivers/net/wireless/ath/ath11k/debug.h | 1 +
drivers/net/wireless/ath/ath11k/debugfs.c | 97 +++++++++++++++++++++++++++++++
drivers/net/wireless/ath/ath11k/debugfs.h | 5 ++
drivers/net/wireless/ath/ath11k/mac.c | 79 +++++++++++++++++++++----
drivers/net/wireless/ath/ath11k/mac.h | 1 +
drivers/net/wireless/ath/ath11k/peer.c | 3 +
drivers/net/wireless/ath/ath11k/wmi.c | 7 +++
8 files changed, 189 insertions(+), 11 deletions(-)
--- a/drivers/net/wireless/ath/ath11k/core.h
+++ b/drivers/net/wireless/ath/ath11k/core.h
@@ -231,6 +231,11 @@ struct ath11k_mgmt_frame_stats {
u32 tx_compl_fail[ATH11K_STATS_MGMT_FRM_TYPE_MAX];
};
+struct ath11k_mac_filter {
+ struct list_head list;
+ u8 peer_mac[ETH_ALEN];
+};
+
struct ath11k_vif {
u32 vdev_id;
enum wmi_vdev_type vdev_type;
@@ -284,6 +289,9 @@ struct ath11k_vif {
struct ieee80211_chanctx_conf chanctx;
struct dentry *debugfs_twt;
struct ath11k_mgmt_frame_stats mgmt_stats;
+ /* protected by conf_mutex */
+ struct list_head mac_filters;
+ u32 mac_filter_count;
#ifdef CPTCFG_ATH11K_NSS_SUPPORT
struct arvif_nss nss;
struct list_head ap_vlan_arvifs;
--- a/drivers/net/wireless/ath/ath11k/debug.h
+++ b/drivers/net/wireless/ath/ath11k/debug.h
@@ -28,6 +28,7 @@ enum ath11k_debug_mask {
ATH11K_DBG_DP_RX = 0x00004000,
ATH11K_DBG_CFR = 0x00008000,
ATH11K_DBG_CFR_DUMP = 0x00010000,
+ ATH11K_DBG_PEER = 0x00020000,
ATH11K_DBG_ANY = 0xffffffff,
};
--- a/drivers/net/wireless/ath/ath11k/debugfs.c
+++ b/drivers/net/wireless/ath/ath11k/debugfs.c
@@ -453,6 +453,108 @@ static const struct file_operations ath1
.read = ath11k_read_wmi_ctrl_path_stats,
};
+static ssize_t ath11k_write_mac_filter(struct file *file,
+ const char __user *ubuf,
+ size_t count, loff_t *ppos)
+{
+ struct ath11k_vif *arvif = file->private_data;
+ struct ath11k_mac_filter *mac_filter;
+ struct ath11k_mac_filter *i;
+ struct ath11k *ar = arvif->ar;
+ bool found = false;
+ u8 buf[64] = {0};
+ int ret;
+ unsigned int val;
+
+ ret = simple_write_to_buffer(buf, sizeof(buf) - 1, ppos, ubuf, count);
+ if (ret < 0)
+ return ret;
+
+ mac_filter = kzalloc(sizeof(*mac_filter), GFP_ATOMIC);
+ if (!mac_filter)
+ return -ENOMEM;
+
+ buf[ret] = '\0';
+ ret = sscanf(buf, "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx %u",
+ &mac_filter->peer_mac[0], &mac_filter->peer_mac[1],
+ &mac_filter->peer_mac[2], &mac_filter->peer_mac[3],
+ &mac_filter->peer_mac[4], &mac_filter->peer_mac[5],
+ &val);
+
+ mutex_lock(&ar->conf_mutex);
+
+ if (!list_empty(&arvif->mac_filters)) {
+ list_for_each_entry(i, &arvif->mac_filters, list) {
+ if (ether_addr_equal(i->peer_mac, mac_filter->peer_mac)) {
+ found = true;
+ break;
+ }
+ }
+ }
+
+ if (!found && val) {
+ list_add(&mac_filter->list, &arvif->mac_filters);
+ arvif->mac_filter_count++;
+ } else if (found && !val) {
+ list_del(&i->list);
+ kfree(i);
+ arvif->mac_filter_count--;
+ }
+
+ mutex_unlock(&ar->conf_mutex);
+ return count;
+}
+
+static ssize_t ath11k_read_mac_filter(struct file *file, char __user *ubuf,
+ size_t count, loff_t *ppos)
+{
+ struct ath11k_vif *arvif = file->private_data;
+ struct ath11k *ar = arvif->ar;
+ struct ath11k_mac_filter *i;
+ int len = 0, ret;
+ char *buf;
+ int size;
+
+ size = (arvif->mac_filter_count * 20) + 25;
+
+ buf = kzalloc(size, GFP_KERNEL);
+ if (!buf)
+ return -ENOMEM;
+
+ mutex_lock(&ar->conf_mutex);
+
+ if (list_empty(&arvif->mac_filters)) {
+ len += scnprintf(buf + len, size - len, "List is Empty\n");
+ goto exit;
+ }
+
+ len += scnprintf(buf + len, size - len, "Mac address entries :\n");
+ list_for_each_entry(i, &arvif->mac_filters, list) {
+ len += scnprintf(buf + len, size - len, "%pM\n", i->peer_mac);
+ }
+
+exit:
+ mutex_unlock(&ar->conf_mutex);
+ ret = simple_read_from_buffer(ubuf, count, ppos, buf, len);
+ kfree(buf);
+ return ret;
+
+}
+
+static const struct file_operations fops_mac_filter = {
+ .read = ath11k_read_mac_filter,
+ .write = ath11k_write_mac_filter,
+ .open = simple_open
+};
+
+void ath11k_debugfs_dbg_mac_filter(struct ath11k_vif *arvif)
+{
+ debugfs_create_file("mac_filter", 0644,
+ arvif->vif->debugfs_dir, arvif,
+ &fops_mac_filter);
+ INIT_LIST_HEAD(&arvif->mac_filters);
+}
+
void ath11k_debugfs_wmi_ctrl_stats(struct ath11k_vif *arvif)
{
debugfs_create_file("wmi_ctrl_stats", 0644,
--- a/drivers/net/wireless/ath/ath11k/debugfs.h
+++ b/drivers/net/wireless/ath/ath11k/debugfs.h
@@ -182,11 +182,16 @@ enum ath11k_dbg_aggr_mode {
#ifdef CPTCFG_MAC80211_DEBUGFS
void ath11k_debugfs_twt(struct ath11k_vif *arvif, bool enable);
+void ath11k_debugfs_dbg_mac_filter(struct ath11k_vif *arvif);
#else
static inline void ath11k_debugfs_twt(struct ath11k_vif *arvif, bool enable)
{
}
+
+static void ath11k_debugfs_dbg_mac_filter(struct ath11k_vif *arvif)
+{
+}
#endif
void ath11k_debug_aggr_size_config_init(struct ath11k_vif *arvif);
--- a/drivers/net/wireless/ath/ath11k/mac.c
+++ b/drivers/net/wireless/ath/ath11k/mac.c
@@ -4046,6 +4046,25 @@ ath11k_mac_bitrate_mask_num_vht_rates(st
return num_rates;
}
+bool ath11k_mac_sta_level_info(struct ath11k_vif *arvif,
+ struct ieee80211_sta *sta)
+{
+ struct ath11k_mac_filter *peer;
+
+ lockdep_assert_held(&arvif->ar->conf_mutex);
+
+ if (arvif->vif->type == NL80211_IFTYPE_AP_VLAN ||
+ list_empty(&arvif->mac_filters) || !sta)
+ return true;
+
+ list_for_each_entry(peer, &arvif->mac_filters, list) {
+ if (ether_addr_equal(peer->peer_mac, sta->addr))
+ return true;
+ }
+
+ return false;
+}
+
static int
ath11k_mac_bitrate_mask_num_he_rates(struct ath11k *ar,
enum nl80211_band band,
@@ -4187,9 +4206,15 @@ static int ath11k_station_assoc(struct a
enum nl80211_band band;
struct cfg80211_bitrate_mask *mask;
u8 num_vht_rates, num_he_rates;
+ bool peer_dbg_info;
lockdep_assert_held(&ar->conf_mutex);
+ peer_dbg_info = ath11k_mac_sta_level_info(arvif, sta);
+ if (peer_dbg_info)
+ ath11k_dbg(ar->ab, ATH11K_DBG_PEER, "mac assoc sta %pM\n",
+ sta->addr);
+
if (WARN_ON(ath11k_mac_vif_chan(vif, &def)))
return -EPERM;
@@ -4270,10 +4295,16 @@ static int ath11k_station_disassoc(struc
struct ieee80211_sta *sta)
{
struct ath11k_vif *arvif = (void *)vif->drv_priv;
+ bool peer_dbg_info;
int ret = 0;
lockdep_assert_held(&ar->conf_mutex);
+ peer_dbg_info = ath11k_mac_sta_level_info(arvif, sta);
+ if (peer_dbg_info)
+ ath11k_dbg(ar->ab, ATH11K_DBG_PEER, "mac disassoc sta %pM\n",
+ sta->addr);
+
if (!sta->wme) {
arvif->num_legacy_stations--;
ret = ath11k_recalc_rtscts_prot(arvif);
@@ -4305,6 +4336,7 @@ static void ath11k_sta_rc_update_wk(stru
int err, num_vht_rates, num_he_rates;
const struct cfg80211_bitrate_mask *mask;
struct peer_assoc_params peer_arg;
+ bool peer_dbg_info;
arsta = container_of(wk, struct ath11k_sta, update_wk);
sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);
@@ -4332,6 +4364,8 @@ static void ath11k_sta_rc_update_wk(stru
mutex_lock(&ar->conf_mutex);
+ peer_dbg_info = ath11k_mac_sta_level_info(arvif, sta);
+
nss = max_t(u32, 1, nss);
nss = min(nss, max(max(ath11k_mac_max_ht_nss(ht_mcs_mask),
ath11k_mac_max_vht_nss(vht_mcs_mask)),
@@ -4346,8 +4380,9 @@ static void ath11k_sta_rc_update_wk(stru
}
if (changed & IEEE80211_RC_NSS_CHANGED) {
- ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac update sta %pM nss %d\n",
- sta->addr, nss);
+ if (peer_dbg_info)
+ ath11k_dbg(ar->ab, ATH11K_DBG_PEER, "mac update sta %pM nss %d\n",
+ sta->addr, nss);
err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
WMI_PEER_NSS, nss);
@@ -4357,8 +4392,9 @@ static void ath11k_sta_rc_update_wk(stru
}
if (changed & IEEE80211_RC_SMPS_CHANGED) {
- ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac update sta %pM smps %d\n",
- sta->addr, smps);
+ if (peer_dbg_info)
+ ath11k_dbg(ar->ab, ATH11K_DBG_PEER, "mac update sta %pM smps %d\n",
+ sta->addr, smps);
err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,
WMI_PEER_MIMO_PS_STATE, smps);
@@ -4368,6 +4404,10 @@ static void ath11k_sta_rc_update_wk(stru
}
if (changed & IEEE80211_RC_SUPP_RATES_CHANGED) {
+ if (peer_dbg_info)
+ ath11k_dbg(ar->ab, ATH11K_DBG_PEER, "mac update supp rates for sta %pM\n",
+ sta->addr);
+
mask = &arvif->bitrate_mask;
num_vht_rates = ath11k_mac_bitrate_mask_num_vht_rates(ar, band,
mask);
@@ -4435,6 +4475,7 @@ static void ath11k_sta_use_4addr_wk(stru
struct ath11k_base *ab;
struct ath11k_peer *wds_peer;
u8 wds_addr[ETH_ALEN];
+ bool peer_dbg_info;
u32 wds_peer_id;
int ret = 0;
@@ -4444,13 +4485,18 @@ static void ath11k_sta_use_4addr_wk(stru
ar = arvif->ar;
ab = ar->ab;
+ mutex_lock(&ar->conf_mutex);
+ peer_dbg_info = ath11k_mac_sta_level_info(arvif, sta);
+ mutex_unlock(&ar->conf_mutex);
+
if (ab->nss.enabled && arvif->vif->type == NL80211_IFTYPE_AP_VLAN) {
ap_vlan_arvif = arsta->arvif;
arvif = ap_vlan_arvif->nss.ap_vif;
}
- ath11k_dbg(ab, ATH11K_DBG_MAC,
- "setting USE_4ADDR for peer %pM\n", sta->addr);
+ if (peer_dbg_info)
+ ath11k_dbg(ab, ATH11K_DBG_PEER,
+ "setting USE_4ADDR for STA %pM\n", sta->addr);
ret = ath11k_wmi_set_peer_param(ar, sta->addr,
arvif->vdev_id,
@@ -4618,6 +4664,7 @@ static int ath11k_mac_station_add(struct
struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
struct ath11k_sta *arsta = (struct ath11k_sta *)sta->drv_priv;
struct peer_create_params peer_param;
+ bool peer_dbg_info;
int ret;
lockdep_assert_held(&ar->conf_mutex);
@@ -4629,6 +4676,7 @@ static int ath11k_mac_station_add(struct
goto exit;
}
+ peer_dbg_info = ath11k_mac_sta_level_info(arvif, sta);
arsta->rx_stats = kzalloc(sizeof(*arsta->rx_stats), GFP_KERNEL);
if (!arsta->rx_stats) {
ret = -ENOMEM;
@@ -4646,8 +4694,9 @@ static int ath11k_mac_station_add(struct
goto free_rx_stats;
}
- ath11k_dbg(ab, ATH11K_DBG_MAC, "Added peer: %pM for VDEV: %d\n",
- sta->addr, arvif->vdev_id);
+ if (peer_dbg_info)
+ ath11k_dbg(ab, ATH11K_DBG_PEER, "Added peer: %pM for VDEV: %d\n",
+ sta->addr, arvif->vdev_id);
ret = ath11k_mac_ap_ps_recalc(ar);
if (ret) {
@@ -4664,8 +4713,9 @@ static int ath11k_mac_station_add(struct
}
if (ieee80211_vif_is_mesh(vif)) {
- ath11k_dbg(ab, ATH11K_DBG_MAC,
- "setting USE_4ADDR for mesh peer %pM\n", sta->addr);
+ if (peer_dbg_info)
+ ath11k_dbg(ab, ATH11K_DBG_PEER,
+ "setting USE_4ADDR for mesh peer %pM\n", sta->addr);
ret = ath11k_wmi_set_peer_param(ar, sta->addr,
arvif->vdev_id,
WMI_PEER_USE_4ADDR, 1);
@@ -4782,7 +4832,7 @@ static int ath11k_mac_op_sta_state(struc
ath11k_warn(ar->ab, "Failed to delete peer: %pM for VDEV: %d\n",
sta->addr, arvif->vdev_id);
else
- ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "Removed peer: %pM for VDEV: %d\n",
+ ath11k_dbg(ar->ab, ATH11K_DBG_PEER, "Removed peer: %pM for VDEV: %d\n",
sta->addr, arvif->vdev_id);
ath11k_mac_dec_num_stations(arvif, sta);
@@ -4860,6 +4910,10 @@ static int ath11k_mac_op_sta_state(struc
spin_unlock_bh(&ar->ab->base_lock);
}
+ if (ath11k_mac_sta_level_info(arvif, sta))
+ ath11k_dbg(ar->ab, ATH11K_DBG_PEER, "mac sta %pM old state %d new state :%d\n",
+ sta->addr, old_state, new_state);
+
mutex_unlock(&ar->conf_mutex);
return ret;
}
@@ -6411,6 +6465,8 @@ static int ath11k_mac_op_add_interface(s
goto err;
}
+ ath11k_debugfs_dbg_mac_filter(arvif);
+
switch (vif->type) {
case NL80211_IFTYPE_UNSPECIFIED:
case NL80211_IFTYPE_STATION:
--- a/drivers/net/wireless/ath/ath11k/mac.h
+++ b/drivers/net/wireless/ath/ath11k/mac.h
@@ -166,4 +166,5 @@ enum hal_encrypt_type ath11k_dp_tx_get_e
void ath11k_mac_bcn_tx_event(struct ath11k_vif *arvif);
void ath11k_mac_handle_beacon(struct ath11k *ar, struct sk_buff *skb);
void ath11k_mac_handle_beacon_miss(struct ath11k *ar, u32 vdev_id);
+bool ath11k_mac_sta_level_info(struct ath11k_vif *arvif, struct ieee80211_sta *sta);
#endif
--- a/drivers/net/wireless/ath/ath11k/peer.c
+++ b/drivers/net/wireless/ath/ath11k/peer.c
@@ -753,6 +753,9 @@ int ath11k_peer_create(struct ath11k *ar
ar->num_peers++;
+ if (ath11k_mac_sta_level_info(arvif, sta))
+ ath11k_dbg(ar->ab, ATH11K_DBG_PEER, "Peer created %pM\n", param->peer_addr);
+
spin_unlock_bh(&ar->ab->base_lock);
return 0;
--- a/drivers/net/wireless/ath/ath11k/wmi.c
+++ b/drivers/net/wireless/ath/ath11k/wmi.c
@@ -7946,9 +7946,6 @@ static void ath11k_peer_sta_kickout_even
goto exit;
}
- ath11k_dbg(ab, ATH11K_DBG_WMI, "peer sta kickout event %pM",
- arg.mac_addr);
-
ieee80211_report_low_ack(sta, 10);
exit: