Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
189 changes: 189 additions & 0 deletions drivers/net/wireless/ath/ath12k/debugfs_htt_stats.c
Original file line number Diff line number Diff line change
Expand Up @@ -5539,6 +5539,189 @@ ath12k_htt_print_pdev_rtt_tbr_cmd_res_stats_tlv(const void *tag_buf, u16 tag_len
stats_req->buf_len = len;
}

static void
ath12k_htt_print_rx_pdev_fw_stats_tlv(const void *tag_buf, u16 tag_len,
struct debug_htt_stats_req *stats_req)
{
const struct htt_rx_pdev_fw_stats_tlv *htt_stats_buf = tag_buf;
u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
u32 len = stats_req->buf_len;
u8 *buf = stats_req->buf;

if (tag_len < sizeof(*htt_stats_buf))
return;

len += scnprintf(buf + len, buf_len - len, "HTT_RX_PDEV_FW_STATS_TLV:\n");
len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n",
le32_to_cpu(htt_stats_buf->mac_id__word) & 0xFF);
len += scnprintf(buf + len, buf_len - len, "ppdu_recvd = %u\n",
le32_to_cpu(htt_stats_buf->ppdu_recvd));
len += scnprintf(buf + len, buf_len - len, "mpdu_cnt_fcs_ok = %u\n",
le32_to_cpu(htt_stats_buf->mpdu_cnt_fcs_ok));
len += scnprintf(buf + len, buf_len - len, "mpdu_cnt_fcs_err = %u\n",
le32_to_cpu(htt_stats_buf->mpdu_cnt_fcs_err));
len += scnprintf(buf + len, buf_len - len, "tcp_msdu_cnt = %u\n",
le32_to_cpu(htt_stats_buf->tcp_msdu_cnt));
len += scnprintf(buf + len, buf_len - len, "tcp_ack_msdu_cnt = %u\n",
le32_to_cpu(htt_stats_buf->tcp_ack_msdu_cnt));
len += scnprintf(buf + len, buf_len - len, "udp_msdu_cnt = %u\n",
le32_to_cpu(htt_stats_buf->udp_msdu_cnt));
len += scnprintf(buf + len, buf_len - len, "other_msdu_cnt = %u\n",
le32_to_cpu(htt_stats_buf->other_msdu_cnt));
len += scnprintf(buf + len, buf_len - len, "fw_ring_mpdu_ind = %u\n",
le32_to_cpu(htt_stats_buf->fw_ring_mpdu_ind));
len += print_array_to_buf(buf, len, "fw_ring_mgmt_subtype",
htt_stats_buf->fw_ring_mgmt_subtype,
ATH12K_HTT_STATS_SUBTYPE_MAX, "\n");
len += print_array_to_buf(buf, len, "fw_ring_ctrl_subtype",
htt_stats_buf->fw_ring_ctrl_subtype,
ATH12K_HTT_STATS_SUBTYPE_MAX, "\n");
len += scnprintf(buf + len, buf_len - len, "fw_ring_mcast_data_msdu = %u\n",
le32_to_cpu(htt_stats_buf->fw_ring_mcast_data_msdu));
len += scnprintf(buf + len, buf_len - len, "fw_ring_bcast_data_msdu = %u\n",
le32_to_cpu(htt_stats_buf->fw_ring_bcast_data_msdu));
len += scnprintf(buf + len, buf_len - len, "fw_ring_ucast_data_msdu = %u\n",
le32_to_cpu(htt_stats_buf->fw_ring_ucast_data_msdu));
len += scnprintf(buf + len, buf_len - len, "fw_ring_null_data_msdu = %u\n",
le32_to_cpu(htt_stats_buf->fw_ring_null_data_msdu));
len += scnprintf(buf + len, buf_len - len, "fw_ring_mpdu_drop = %u\n",
le32_to_cpu(htt_stats_buf->fw_ring_mpdu_drop));
len += scnprintf(buf + len, buf_len - len, "ofld_local_data_ind_cnt = %u\n",
le32_to_cpu(htt_stats_buf->ofld_local_data_ind_cnt));
len += scnprintf(buf + len, buf_len - len,
"ofld_local_data_buf_recycle_cnt = %u\n",
le32_to_cpu(htt_stats_buf->ofld_local_data_buf_recycle_cnt));
len += scnprintf(buf + len, buf_len - len, "drx_local_data_ind_cnt = %u\n",
le32_to_cpu(htt_stats_buf->drx_local_data_ind_cnt));
len += scnprintf(buf + len, buf_len - len,
"drx_local_data_buf_recycle_cnt = %u\n",
le32_to_cpu(htt_stats_buf->drx_local_data_buf_recycle_cnt));
len += scnprintf(buf + len, buf_len - len, "local_nondata_ind_cnt = %u\n",
le32_to_cpu(htt_stats_buf->local_nondata_ind_cnt));
len += scnprintf(buf + len, buf_len - len, "local_nondata_buf_recycle_cnt = %u\n",
le32_to_cpu(htt_stats_buf->local_nondata_buf_recycle_cnt));
len += scnprintf(buf + len, buf_len - len, "fw_status_buf_ring_refill_cnt = %u\n",
le32_to_cpu(htt_stats_buf->fw_status_buf_ring_refill_cnt));
len += scnprintf(buf + len, buf_len - len, "fw_status_buf_ring_empty_cnt = %u\n",
le32_to_cpu(htt_stats_buf->fw_status_buf_ring_empty_cnt));
len += scnprintf(buf + len, buf_len - len, "fw_pkt_buf_ring_refill_cnt = %u\n",
le32_to_cpu(htt_stats_buf->fw_pkt_buf_ring_refill_cnt));
len += scnprintf(buf + len, buf_len - len, "fw_pkt_buf_ring_empty_cnt = %u\n",
le32_to_cpu(htt_stats_buf->fw_pkt_buf_ring_empty_cnt));
len += scnprintf(buf + len, buf_len - len, "fw_link_buf_ring_refill_cnt = %u\n",
le32_to_cpu(htt_stats_buf->fw_link_buf_ring_refill_cnt));
len += scnprintf(buf + len, buf_len - len, "fw_link_buf_ring_empty_cnt = %u\n",
le32_to_cpu(htt_stats_buf->fw_link_buf_ring_empty_cnt));
len += scnprintf(buf + len, buf_len - len, "host_pkt_buf_ring_refill_cnt = %u\n",
le32_to_cpu(htt_stats_buf->host_pkt_buf_ring_refill_cnt));
len += scnprintf(buf + len, buf_len - len, "host_pkt_buf_ring_empty_cnt = %u\n",
le32_to_cpu(htt_stats_buf->host_pkt_buf_ring_empty_cnt));
len += scnprintf(buf + len, buf_len - len, "mon_pkt_buf_ring_refill_cnt = %u\n",
le32_to_cpu(htt_stats_buf->mon_pkt_buf_ring_refill_cnt));
len += scnprintf(buf + len, buf_len - len, "mon_pkt_buf_ring_empty_cnt = %u\n",
le32_to_cpu(htt_stats_buf->mon_pkt_buf_ring_empty_cnt));
len += scnprintf(buf + len, buf_len - len,
"mon_status_buf_ring_refill_cnt = %u\n",
le32_to_cpu(htt_stats_buf->mon_status_buf_ring_refill_cnt));
len += scnprintf(buf + len, buf_len - len, "mon_status_buf_ring_empty_cnt = %u\n",
le32_to_cpu(htt_stats_buf->mon_status_buf_ring_empty_cnt));
len += scnprintf(buf + len, buf_len - len, "mon_desc_buf_ring_refill_cnt = %u\n",
le32_to_cpu(htt_stats_buf->mon_desc_buf_ring_refill_cnt));
len += scnprintf(buf + len, buf_len - len, "mon_desc_buf_ring_empty_cnt = %u\n",
le32_to_cpu(htt_stats_buf->mon_desc_buf_ring_empty_cnt));
len += scnprintf(buf + len, buf_len - len, "mon_dest_ring_update_cnt = %u\n",
le32_to_cpu(htt_stats_buf->mon_dest_ring_update_cnt));
len += scnprintf(buf + len, buf_len - len, "mon_dest_ring_full_cnt = %u\n",
le32_to_cpu(htt_stats_buf->mon_dest_ring_full_cnt));
len += scnprintf(buf + len, buf_len - len, "rx_suspend_cnt = %u\n",
le32_to_cpu(htt_stats_buf->rx_suspend_cnt));
len += scnprintf(buf + len, buf_len - len, "rx_suspend_fail_cnt = %u\n",
le32_to_cpu(htt_stats_buf->rx_suspend_fail_cnt));
len += scnprintf(buf + len, buf_len - len, "rx_resume_cnt = %u\n",
le32_to_cpu(htt_stats_buf->rx_resume_cnt));
len += scnprintf(buf + len, buf_len - len, "rx_resume_fail_cnt = %u\n",
le32_to_cpu(htt_stats_buf->rx_resume_fail_cnt));
len += scnprintf(buf + len, buf_len - len, "rx_ring_switch_cnt = %u\n",
le32_to_cpu(htt_stats_buf->rx_ring_switch_cnt));
len += scnprintf(buf + len, buf_len - len, "rx_ring_restore_cnt = %u\n",
le32_to_cpu(htt_stats_buf->rx_ring_restore_cnt));
len += scnprintf(buf + len, buf_len - len, "rx_flush_cnt = %u\n",
le32_to_cpu(htt_stats_buf->rx_flush_cnt));
len += scnprintf(buf + len, buf_len - len, "rx_recovery_reset_cnt = %u\n",
le32_to_cpu(htt_stats_buf->rx_recovery_reset_cnt));
len += scnprintf(buf + len, buf_len - len, "rx_lwm_prom_filter_dis = %u\n",
le32_to_cpu(htt_stats_buf->rx_lwm_prom_filter_dis));
len += scnprintf(buf + len, buf_len - len, "rx_hwm_prom_filter_en = %u\n",
le32_to_cpu(htt_stats_buf->rx_hwm_prom_filter_en));
len += scnprintf(buf + len, buf_len - len, "bytes_received_low_32 = %u\n",
le32_to_cpu(htt_stats_buf->bytes_received_low_32));
len += scnprintf(buf + len, buf_len - len, "bytes_received_high_32 = %u\n",
le32_to_cpu(htt_stats_buf->bytes_received_high_32));

stats_req->buf_len = len;
}

static void
ath12k_htt_print_tx_hwq_stats_cmn_tlv(const void *tag_buf, u16 tag_len,
struct debug_htt_stats_req *stats_req)
{
const struct htt_tx_hwq_stats_cmn_tlv *htt_stats_buf = tag_buf;
u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
u32 len = stats_req->buf_len;
u8 *buf = stats_req->buf;

if (tag_len < sizeof(*htt_stats_buf))
return;

len += scnprintf(buf + len, buf_len - len, "HTT_TX_HWQ_STATS_CMN_TLV:\n");
len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n",
le32_to_cpu(htt_stats_buf->mac_id__hwq_id__word) & 0xFF);
len += scnprintf(buf + len, buf_len - len, "hwq_id = %u\n",
(le32_to_cpu(htt_stats_buf->mac_id__hwq_id__word) & 0xFF00) >> 8);
len += scnprintf(buf + len, buf_len - len, "xretry = %u\n",
le32_to_cpu(htt_stats_buf->xretry));
len += scnprintf(buf + len, buf_len - len, "underrun_cnt = %u\n",
le32_to_cpu(htt_stats_buf->underrun_cnt));
len += scnprintf(buf + len, buf_len - len, "flush_cnt = %u\n",
le32_to_cpu(htt_stats_buf->flush_cnt));
len += scnprintf(buf + len, buf_len - len, "filt_cnt = %u\n",
le32_to_cpu(htt_stats_buf->filt_cnt));
len += scnprintf(buf + len, buf_len - len, "null_mpdu_bmap = %u\n",
le32_to_cpu(htt_stats_buf->null_mpdu_bmap));
len += scnprintf(buf + len, buf_len - len, "user_ack_failure = %u\n",
le32_to_cpu(htt_stats_buf->user_ack_failure));
len += scnprintf(buf + len, buf_len - len, "ack_tlv_proc = %u\n",
le32_to_cpu(htt_stats_buf->ack_tlv_proc));
len += scnprintf(buf + len, buf_len - len, "sched_id_proc = %u\n",
le32_to_cpu(htt_stats_buf->sched_id_proc));
len += scnprintf(buf + len, buf_len - len, "null_mpdu_tx_count = %u\n",
le32_to_cpu(htt_stats_buf->null_mpdu_tx_count));
len += scnprintf(buf + len, buf_len - len, "mpdu_bmap_not_recvd = %u\n",
le32_to_cpu(htt_stats_buf->mpdu_bmap_not_recvd));
len += scnprintf(buf + len, buf_len - len, "num_bar = %u\n",
le32_to_cpu(htt_stats_buf->num_bar));
len += scnprintf(buf + len, buf_len - len, "rts = %u\n",
le32_to_cpu(htt_stats_buf->rts));
len += scnprintf(buf + len, buf_len - len, "cts2self = %u\n",
le32_to_cpu(htt_stats_buf->cts2self));
len += scnprintf(buf + len, buf_len - len, "qos_null = %u\n",
le32_to_cpu(htt_stats_buf->qos_null));
len += scnprintf(buf + len, buf_len - len, "mpdu_tried_cnt = %u\n",
le32_to_cpu(htt_stats_buf->mpdu_tried_cnt));
len += scnprintf(buf + len, buf_len - len, "mpdu_queued_cnt = %u\n",
le32_to_cpu(htt_stats_buf->mpdu_queued_cnt));
len += scnprintf(buf + len, buf_len - len, "mpdu_ack_fail_cnt = %u\n",
le32_to_cpu(htt_stats_buf->mpdu_ack_fail_cnt));
len += scnprintf(buf + len, buf_len - len, "mpdu_filt_cnt = %u\n",
le32_to_cpu(htt_stats_buf->mpdu_filt_cnt));
len += scnprintf(buf + len, buf_len - len, "false_mpdu_ack_count = %u\n",
le32_to_cpu(htt_stats_buf->false_mpdu_ack_count));
len += scnprintf(buf + len, buf_len - len, "txq_timeout = %u\n",
le32_to_cpu(htt_stats_buf->txq_timeout));

stats_req->buf_len = len;
}

static int ath12k_dbg_htt_ext_stats_parse(struct ath12k_base *ab,
u16 tag, u16 len, const void *tag_buf,
void *user_data)
Expand Down Expand Up @@ -5692,6 +5875,9 @@ static int ath12k_dbg_htt_ext_stats_parse(struct ath12k_base *ab,
case HTT_STATS_SFM_CLIENT_USER_TAG:
ath12k_htt_print_sfm_client_user_tlv(tag_buf, len, stats_req);
break;
case HTT_STATS_RX_PDEV_FW_STATS_TAG:
ath12k_htt_print_rx_pdev_fw_stats_tlv(tag_buf, len, stats_req);
break;
case HTT_STATS_TX_PDEV_MU_MIMO_STATS_TAG:
ath12k_htt_print_tx_pdev_mu_mimo_sch_stats_tlv(tag_buf, len, stats_req);
break;
Expand Down Expand Up @@ -5835,6 +6021,9 @@ static int ath12k_dbg_htt_ext_stats_parse(struct ath12k_base *ab,
case HTT_STATS_PDEV_RTT_TBR_CMD_RESULT_STATS_TAG:
ath12k_htt_print_pdev_rtt_tbr_cmd_res_stats_tlv(tag_buf, len, stats_req);
break;
case HTT_STATS_TX_HWQ_CMN_TAG:
ath12k_htt_print_tx_hwq_stats_cmn_tlv(tag_buf, len, stats_req);
break;
default:
break;
}
Expand Down
81 changes: 81 additions & 0 deletions drivers/net/wireless/ath/ath12k/debugfs_htt_stats.h
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,8 @@ struct ath12k_htt_extd_stats_msg {
enum ath12k_dbg_htt_ext_stats_type {
ATH12K_DBG_HTT_EXT_STATS_RESET = 0,
ATH12K_DBG_HTT_EXT_STATS_PDEV_TX = 1,
ATH12K_DBG_HTT_EXT_STATS_PDEV_RX = 2,
ATH12K_DBG_HTT_EXT_STATS_PDEV_TX_HWQ = 3,
ATH12K_DBG_HTT_EXT_STATS_PDEV_TX_SCHED = 4,
ATH12K_DBG_HTT_EXT_STATS_PDEV_ERROR = 5,
ATH12K_DBG_HTT_EXT_STATS_PDEV_TQM = 6,
Expand Down Expand Up @@ -173,6 +175,7 @@ enum ath12k_dbg_htt_tlv_tag {
HTT_STATS_TX_PDEV_SIFS_TAG = 2,
HTT_STATS_TX_PDEV_FLUSH_TAG = 3,
HTT_STATS_STRING_TAG = 5,
HTT_STATS_TX_HWQ_CMN_TAG = 6,
HTT_STATS_TX_TQM_GEN_MPDU_TAG = 11,
HTT_STATS_TX_TQM_LIST_MPDU_TAG = 12,
HTT_STATS_TX_TQM_LIST_MPDU_CNT_TAG = 13,
Expand All @@ -188,6 +191,7 @@ enum ath12k_dbg_htt_tlv_tag {
HTT_STATS_TX_PDEV_MU_MIMO_STATS_TAG = 25,
HTT_STATS_SFM_CMN_TAG = 26,
HTT_STATS_SRING_STATS_TAG = 27,
HTT_STATS_RX_PDEV_FW_STATS_TAG = 28,
HTT_STATS_TX_PDEV_RATE_STATS_TAG = 34,
HTT_STATS_RX_PDEV_RATE_STATS_TAG = 35,
HTT_STATS_TX_PDEV_SCHEDULER_TXQ_STATS_TAG = 36,
Expand Down Expand Up @@ -2075,4 +2079,81 @@ struct ath12k_htt_stats_pdev_rtt_tbr_cmd_result_stats_tlv {
__le32 mu_res[ATH12K_HTT_FTYPE_MAX][ATH12K_HTT_MAX_SCH_CMD_RESULT];
} __packed;

struct htt_rx_pdev_fw_stats_tlv {
__le32 mac_id__word;
__le32 ppdu_recvd;
__le32 mpdu_cnt_fcs_ok;
__le32 mpdu_cnt_fcs_err;
__le32 tcp_msdu_cnt;
__le32 tcp_ack_msdu_cnt;
__le32 udp_msdu_cnt;
__le32 other_msdu_cnt;
__le32 fw_ring_mpdu_ind;
__le32 fw_ring_mgmt_subtype[ATH12K_HTT_STATS_SUBTYPE_MAX];
__le32 fw_ring_ctrl_subtype[ATH12K_HTT_STATS_SUBTYPE_MAX];
__le32 fw_ring_mcast_data_msdu;
__le32 fw_ring_bcast_data_msdu;
__le32 fw_ring_ucast_data_msdu;
__le32 fw_ring_null_data_msdu;
__le32 fw_ring_mpdu_drop;
__le32 ofld_local_data_ind_cnt;
__le32 ofld_local_data_buf_recycle_cnt;
__le32 drx_local_data_ind_cnt;
__le32 drx_local_data_buf_recycle_cnt;
__le32 local_nondata_ind_cnt;
__le32 local_nondata_buf_recycle_cnt;
__le32 fw_status_buf_ring_refill_cnt;
__le32 fw_status_buf_ring_empty_cnt;
__le32 fw_pkt_buf_ring_refill_cnt;
__le32 fw_pkt_buf_ring_empty_cnt;
__le32 fw_link_buf_ring_refill_cnt;
__le32 fw_link_buf_ring_empty_cnt;
__le32 host_pkt_buf_ring_refill_cnt;
__le32 host_pkt_buf_ring_empty_cnt;
__le32 mon_pkt_buf_ring_refill_cnt;
__le32 mon_pkt_buf_ring_empty_cnt;
__le32 mon_status_buf_ring_refill_cnt;
__le32 mon_status_buf_ring_empty_cnt;
__le32 mon_desc_buf_ring_refill_cnt;
__le32 mon_desc_buf_ring_empty_cnt;
__le32 mon_dest_ring_update_cnt;
__le32 mon_dest_ring_full_cnt;
__le32 rx_suspend_cnt;
__le32 rx_suspend_fail_cnt;
__le32 rx_resume_cnt;
__le32 rx_resume_fail_cnt;
__le32 rx_ring_switch_cnt;
__le32 rx_ring_restore_cnt;
__le32 rx_flush_cnt;
__le32 rx_recovery_reset_cnt;
__le32 rx_lwm_prom_filter_dis;
__le32 rx_hwm_prom_filter_en;
__le32 bytes_received_low_32;
__le32 bytes_received_high_32;
} __packed;

struct htt_tx_hwq_stats_cmn_tlv {
__le32 mac_id__hwq_id__word;
__le32 xretry;
__le32 underrun_cnt;
__le32 flush_cnt;
__le32 filt_cnt;
__le32 null_mpdu_bmap;
__le32 user_ack_failure;
__le32 ack_tlv_proc;
__le32 sched_id_proc;
__le32 null_mpdu_tx_count;
__le32 mpdu_bmap_not_recvd;
__le32 num_bar;
__le32 rts;
__le32 cts2self;
__le32 qos_null;
__le32 mpdu_tried_cnt;
__le32 mpdu_queued_cnt;
__le32 mpdu_ack_fail_cnt;
__le32 mpdu_filt_cnt;
__le32 false_mpdu_ack_count;
__le32 txq_timeout;
} __packed;

#endif
3 changes: 3 additions & 0 deletions drivers/net/wireless/ath/ath12k/dp_rx.c
Original file line number Diff line number Diff line change
Expand Up @@ -565,6 +565,9 @@ static int ath12k_dp_prepare_reo_update_elem(struct ath12k_dp *dp,

lockdep_assert_held(&dp->dp_lock);

if (!peer->primary_link)
return 0;

elem = kzalloc(sizeof(*elem), GFP_ATOMIC);
if (!elem)
return -ENOMEM;
Expand Down
3 changes: 2 additions & 1 deletion drivers/net/wireless/ath/ath12k/mac.c
Original file line number Diff line number Diff line change
Expand Up @@ -13162,6 +13162,7 @@ int ath12k_mac_op_get_survey(struct ieee80211_hw *hw, int idx,
struct ath12k *ar;
struct ieee80211_supported_band *sband;
struct survey_info *ar_survey;
int orig_idx = idx;

lockdep_assert_wiphy(hw->wiphy);

Expand Down Expand Up @@ -13196,7 +13197,7 @@ int ath12k_mac_op_get_survey(struct ieee80211_hw *hw, int idx,
return -ENOENT;
}

ar_survey = &ar->survey[idx];
ar_survey = &ar->survey[orig_idx];

ath12k_mac_update_bss_chan_survey(ar, &sband->channels[idx]);

Expand Down