Command "iw wls1 station dump" does not show each chain's rssi currently. If the rssi of each chain from mon status which parsed in function ath11k_hal_rx_parse_mon_status_tlv() is invalid, then ath11k send wmi cmd WMI_REQUEST_STATS_CMDID with flag WMI_REQUEST_RSSI_PER_CHAIN_STAT to firmware, and parse the rssi of chain in wmi WMI_UPDATE_STATS_EVENTID, then report them to mac80211. WMI_REQUEST_STATS_CMDID is only sent when CONFIG_ATH11K_DEBUGFS is set, it is only called by ath11k_mac_op_sta_statistics(). It does not effect performance and power consumption. Because after STATION connected to AP, it is only called every 6 seconds by NetworkManager in below stack. [ 797.005587] CPU: 0 PID: 701 Comm: NetworkManager Tainted: G W OE 5.13.0-rc6-wt-ath+ #2 [ 797.005596] Hardware name: LENOVO 418065C/418065C, BIOS 83ET63WW (1.33 ) 07/29/2011 [ 797.005600] RIP: 0010:ath11k_mac_op_sta_statistics+0x2f/0x1b0 [ath11k] [ 797.005644] Code: 41 56 41 55 4c 8d aa 58 01 00 00 41 54 55 48 89 d5 53 48 8b 82 58 01 00 00 48 89 cb 4c 8b 70 20 49 8b 06 4c 8b a0 90 08 00 00 <0f> 0b 48 8b 82 b8 01 00 00 48 ba 00 00 00 00 01 00 00 00 48 89 81 [ 797.005651] RSP: 0018:ffffb1fc80a4b890 EFLAGS: 00010282 [ 797.005658] RAX: ffff8a5726200000 RBX: ffffb1fc80a4b958 RCX: ffffb1fc80a4b958 [ 797.005664] RDX: ffff8a5726a609f0 RSI: ffff8a581247f598 RDI: ffff8a5702878800 [ 797.005668] RBP: ffff8a5726a609f0 R08: 0000000000000000 R09: 0000000000000000 [ 797.005672] R10: 0000000000000000 R11: 0000000000000007 R12: 02dd68024f75f480 [ 797.005676] R13: ffff8a5726a60b48 R14: ffff8a5702879f40 R15: ffff8a5726a60000 [ 797.005681] FS: 00007f632c52a380(0000) GS:ffff8a583a200000(0000) knlGS:0000000000000000 [ 797.005687] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 797.005692] CR2: 00007fb025d69000 CR3: 00000001124f6005 CR4: 00000000000606f0 [ 797.005698] Call Trace: [ 797.005710] sta_set_sinfo+0xa7/0xb80 [mac80211] [ 797.005820] ieee80211_get_station+0x50/0x70 [mac80211] [ 797.005925] nl80211_get_station+0xd1/0x200 [cfg80211] [ 797.006045] genl_family_rcv_msg_doit.isra.15+0x111/0x140 [ 797.006059] genl_rcv_msg+0xe6/0x1e0 [ 797.006065] ? nl80211_dump_station+0x220/0x220 [cfg80211] [ 797.006223] ? nl80211_send_station.isra.72+0xf50/0xf50 [cfg80211] [ 797.006348] ? genl_family_rcv_msg_doit.isra.15+0x140/0x140 [ 797.006355] netlink_rcv_skb+0xb9/0xf0 [ 797.006363] genl_rcv+0x24/0x40 [ 797.006369] netlink_unicast+0x18e/0x290 [ 797.006375] netlink_sendmsg+0x30f/0x450 [ 797.006382] sock_sendmsg+0x5b/0x60 [ 797.006393] ____sys_sendmsg+0x219/0x240 [ 797.006403] ? copy_msghdr_from_user+0x5c/0x90 [ 797.006413] ? ____sys_recvmsg+0xf5/0x190 [ 797.006422] ___sys_sendmsg+0x88/0xd0 [ 797.006432] ? copy_msghdr_from_user+0x5c/0x90 [ 797.006443] ? ___sys_recvmsg+0x9e/0xd0 [ 797.006454] ? __fget_files+0x58/0x90 [ 797.006461] ? __fget_light+0x2d/0x70 [ 797.006466] ? do_epoll_wait+0xce/0x720 [ 797.006476] ? __sys_sendmsg+0x63/0xa0 [ 797.006485] __sys_sendmsg+0x63/0xa0 [ 797.006497] do_syscall_64+0x3c/0xb0 [ 797.006509] entry_SYSCALL_64_after_hwframe+0x44/0xae [ 797.006519] RIP: 0033:0x7f632d99912d [ 797.006526] Code: 28 89 54 24 1c 48 89 74 24 10 89 7c 24 08 e8 ca ee ff ff 8b 54 24 1c 48 8b 74 24 10 41 89 c0 8b 7c 24 08 b8 2e 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 2f 44 89 c7 48 89 44 24 08 e8 fe ee ff ff 48 [ 797.006533] RSP: 002b:00007ffd80808c00 EFLAGS: 00000293 ORIG_RAX: 000000000000002e [ 797.006540] RAX: ffffffffffffffda RBX: 0000563dab99d840 RCX: 00007f632d99912d [ 797.006545] RDX: 0000000000000000 RSI: 00007ffd80808c50 RDI: 000000000000000b [ 797.006549] RBP: 00007ffd80808c50 R08: 0000000000000000 R09: 0000000000001000 [ 797.006552] R10: 0000563dab96f010 R11: 0000000000000293 R12: 0000563dab99d840 [ 797.006556] R13: 0000563dabbb28c0 R14: 00007f632dad4280 R15: 0000563dabab11c0 [ 797.006563] ---[ end trace c9dcf08920c9945c ]--- Tested-on: QCA6390 hw2.0 PCI WLAN.HST.1.0.1-01230-QCAHSTSWPLZ_V2_TO_X86-1 Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-02892.1-QCAHSPSWPL_V1_V2_SILICONZ_LITE-1 Signed-off-by: Wen Gong <quic_wgong@quicinc.com> Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com> Link: https://lore.kernel.org/r/20211215090944.19729-1-quic_wgong@quicinc.com
230 lines
6.2 KiB
C
230 lines
6.2 KiB
C
/* SPDX-License-Identifier: BSD-3-Clause-Clear */
|
|
/*
|
|
* Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
|
|
*/
|
|
|
|
#ifndef _ATH11K_DEBUGFS_H_
|
|
#define _ATH11K_DEBUGFS_H_
|
|
|
|
#include "hal_tx.h"
|
|
|
|
#define ATH11K_TX_POWER_MAX_VAL 70
|
|
#define ATH11K_TX_POWER_MIN_VAL 0
|
|
|
|
/* htt_dbg_ext_stats_type */
|
|
enum ath11k_dbg_htt_ext_stats_type {
|
|
ATH11K_DBG_HTT_EXT_STATS_RESET = 0,
|
|
ATH11K_DBG_HTT_EXT_STATS_PDEV_TX = 1,
|
|
ATH11K_DBG_HTT_EXT_STATS_PDEV_RX = 2,
|
|
ATH11K_DBG_HTT_EXT_STATS_PDEV_TX_HWQ = 3,
|
|
ATH11K_DBG_HTT_EXT_STATS_PDEV_TX_SCHED = 4,
|
|
ATH11K_DBG_HTT_EXT_STATS_PDEV_ERROR = 5,
|
|
ATH11K_DBG_HTT_EXT_STATS_PDEV_TQM = 6,
|
|
ATH11K_DBG_HTT_EXT_STATS_TQM_CMDQ = 7,
|
|
ATH11K_DBG_HTT_EXT_STATS_TX_DE_INFO = 8,
|
|
ATH11K_DBG_HTT_EXT_STATS_PDEV_TX_RATE = 9,
|
|
ATH11K_DBG_HTT_EXT_STATS_PDEV_RX_RATE = 10,
|
|
ATH11K_DBG_HTT_EXT_STATS_PEER_INFO = 11,
|
|
ATH11K_DBG_HTT_EXT_STATS_TX_SELFGEN_INFO = 12,
|
|
ATH11K_DBG_HTT_EXT_STATS_TX_MU_HWQ = 13,
|
|
ATH11K_DBG_HTT_EXT_STATS_RING_IF_INFO = 14,
|
|
ATH11K_DBG_HTT_EXT_STATS_SRNG_INFO = 15,
|
|
ATH11K_DBG_HTT_EXT_STATS_SFM_INFO = 16,
|
|
ATH11K_DBG_HTT_EXT_STATS_PDEV_TX_MU = 17,
|
|
ATH11K_DBG_HTT_EXT_STATS_ACTIVE_PEERS_LIST = 18,
|
|
ATH11K_DBG_HTT_EXT_STATS_PDEV_CCA_STATS = 19,
|
|
ATH11K_DBG_HTT_EXT_STATS_TWT_SESSIONS = 20,
|
|
ATH11K_DBG_HTT_EXT_STATS_REO_RESOURCE_STATS = 21,
|
|
ATH11K_DBG_HTT_EXT_STATS_TX_SOUNDING_INFO = 22,
|
|
ATH11K_DBG_HTT_EXT_STATS_PDEV_OBSS_PD_STATS = 23,
|
|
ATH11K_DBG_HTT_EXT_STATS_RING_BACKPRESSURE_STATS = 24,
|
|
ATH11K_DBG_HTT_EXT_STATS_PEER_CTRL_PATH_TXRX_STATS = 29,
|
|
ATH11K_DBG_HTT_EXT_STATS_PDEV_TX_RATE_TXBF_STATS = 31,
|
|
ATH11K_DBG_HTT_EXT_STATS_TXBF_OFDMA = 32,
|
|
ATH11K_DBG_HTT_EXT_PHY_COUNTERS_AND_PHY_STATS = 37,
|
|
|
|
/* keep this last */
|
|
ATH11K_DBG_HTT_NUM_EXT_STATS,
|
|
};
|
|
|
|
struct debug_htt_stats_req {
|
|
bool done;
|
|
u8 pdev_id;
|
|
u8 type;
|
|
u8 peer_addr[ETH_ALEN];
|
|
struct completion cmpln;
|
|
u32 buf_len;
|
|
u8 buf[];
|
|
};
|
|
|
|
struct ath_pktlog_hdr {
|
|
u16 flags;
|
|
u16 missed_cnt;
|
|
u16 log_type;
|
|
u16 size;
|
|
u32 timestamp;
|
|
u32 type_specific_data;
|
|
u8 payload[];
|
|
};
|
|
|
|
#define ATH11K_HTT_PEER_STATS_RESET BIT(16)
|
|
|
|
#define ATH11K_HTT_STATS_BUF_SIZE (1024 * 512)
|
|
#define ATH11K_FW_STATS_BUF_SIZE (1024 * 1024)
|
|
|
|
enum ath11k_pktlog_filter {
|
|
ATH11K_PKTLOG_RX = 0x000000001,
|
|
ATH11K_PKTLOG_TX = 0x000000002,
|
|
ATH11K_PKTLOG_RCFIND = 0x000000004,
|
|
ATH11K_PKTLOG_RCUPDATE = 0x000000008,
|
|
ATH11K_PKTLOG_EVENT_SMART_ANT = 0x000000020,
|
|
ATH11K_PKTLOG_EVENT_SW = 0x000000040,
|
|
ATH11K_PKTLOG_ANY = 0x00000006f,
|
|
};
|
|
|
|
enum ath11k_pktlog_mode {
|
|
ATH11K_PKTLOG_MODE_LITE = 1,
|
|
ATH11K_PKTLOG_MODE_FULL = 2,
|
|
};
|
|
|
|
enum ath11k_pktlog_enum {
|
|
ATH11K_PKTLOG_TYPE_TX_CTRL = 1,
|
|
ATH11K_PKTLOG_TYPE_TX_STAT = 2,
|
|
ATH11K_PKTLOG_TYPE_TX_MSDU_ID = 3,
|
|
ATH11K_PKTLOG_TYPE_RX_STAT = 5,
|
|
ATH11K_PKTLOG_TYPE_RC_FIND = 6,
|
|
ATH11K_PKTLOG_TYPE_RC_UPDATE = 7,
|
|
ATH11K_PKTLOG_TYPE_TX_VIRT_ADDR = 8,
|
|
ATH11K_PKTLOG_TYPE_RX_CBF = 10,
|
|
ATH11K_PKTLOG_TYPE_RX_STATBUF = 22,
|
|
ATH11K_PKTLOG_TYPE_PPDU_STATS = 23,
|
|
ATH11K_PKTLOG_TYPE_LITE_RX = 24,
|
|
};
|
|
|
|
enum ath11k_dbg_aggr_mode {
|
|
ATH11K_DBG_AGGR_MODE_AUTO,
|
|
ATH11K_DBG_AGGR_MODE_MANUAL,
|
|
ATH11K_DBG_AGGR_MODE_MAX,
|
|
};
|
|
|
|
#ifdef CONFIG_ATH11K_DEBUGFS
|
|
int ath11k_debugfs_soc_create(struct ath11k_base *ab);
|
|
void ath11k_debugfs_soc_destroy(struct ath11k_base *ab);
|
|
int ath11k_debugfs_pdev_create(struct ath11k_base *ab);
|
|
void ath11k_debugfs_pdev_destroy(struct ath11k_base *ab);
|
|
int ath11k_debugfs_register(struct ath11k *ar);
|
|
void ath11k_debugfs_unregister(struct ath11k *ar);
|
|
void ath11k_debugfs_fw_stats_process(struct ath11k_base *ab, struct sk_buff *skb);
|
|
|
|
void ath11k_debugfs_fw_stats_init(struct ath11k *ar);
|
|
int ath11k_debugfs_get_fw_stats(struct ath11k *ar, u32 pdev_id,
|
|
u32 vdev_id, u32 stats_id);
|
|
|
|
static inline bool ath11k_debugfs_is_pktlog_lite_mode_enabled(struct ath11k *ar)
|
|
{
|
|
return (ar->debug.pktlog_mode == ATH11K_PKTLOG_MODE_LITE);
|
|
}
|
|
|
|
static inline bool ath11k_debugfs_is_pktlog_rx_stats_enabled(struct ath11k *ar)
|
|
{
|
|
return (!ar->debug.pktlog_peer_valid && ar->debug.pktlog_mode);
|
|
}
|
|
|
|
static inline bool ath11k_debugfs_is_pktlog_peer_valid(struct ath11k *ar, u8 *addr)
|
|
{
|
|
return (ar->debug.pktlog_peer_valid && ar->debug.pktlog_mode &&
|
|
ether_addr_equal(addr, ar->debug.pktlog_peer_addr));
|
|
}
|
|
|
|
static inline int ath11k_debugfs_is_extd_tx_stats_enabled(struct ath11k *ar)
|
|
{
|
|
return ar->debug.extd_tx_stats;
|
|
}
|
|
|
|
static inline int ath11k_debugfs_is_extd_rx_stats_enabled(struct ath11k *ar)
|
|
{
|
|
return ar->debug.extd_rx_stats;
|
|
}
|
|
|
|
static inline int ath11k_debugfs_rx_filter(struct ath11k *ar)
|
|
{
|
|
return ar->debug.rx_filter;
|
|
}
|
|
|
|
#else
|
|
static inline int ath11k_debugfs_soc_create(struct ath11k_base *ab)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline void ath11k_debugfs_soc_destroy(struct ath11k_base *ab)
|
|
{
|
|
}
|
|
|
|
static inline int ath11k_debugfs_pdev_create(struct ath11k_base *ab)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline void ath11k_debugfs_pdev_destroy(struct ath11k_base *ab)
|
|
{
|
|
}
|
|
|
|
static inline int ath11k_debugfs_register(struct ath11k *ar)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline void ath11k_debugfs_unregister(struct ath11k *ar)
|
|
{
|
|
}
|
|
|
|
static inline void ath11k_debugfs_fw_stats_process(struct ath11k_base *ab,
|
|
struct sk_buff *skb)
|
|
{
|
|
}
|
|
|
|
static inline void ath11k_debugfs_fw_stats_init(struct ath11k *ar)
|
|
{
|
|
}
|
|
|
|
static inline int ath11k_debugfs_is_extd_tx_stats_enabled(struct ath11k *ar)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline int ath11k_debugfs_is_extd_rx_stats_enabled(struct ath11k *ar)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline bool ath11k_debugfs_is_pktlog_lite_mode_enabled(struct ath11k *ar)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
static inline bool ath11k_debugfs_is_pktlog_rx_stats_enabled(struct ath11k *ar)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
static inline bool ath11k_debugfs_is_pktlog_peer_valid(struct ath11k *ar, u8 *addr)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
static inline int ath11k_debugfs_rx_filter(struct ath11k *ar)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline int ath11k_debugfs_get_fw_stats(struct ath11k *ar,
|
|
u32 pdev_id, u32 vdev_id, u32 stats_id)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
#endif /* CONFIG_MAC80211_DEBUGFS*/
|
|
|
|
#endif /* _ATH11K_DEBUGFS_H_ */
|