wlan-ap-Telecominfraproject/feeds/wifi-ax/mac80211/patches/qca/228-ath11k-fix-rssi-station-dump-not-updated-in-qcn9000.patch
John Crispin 8cd26b4b50 ipq807x: update to 11.4-CS
Signed-off-by: John Crispin <john@phrozen.org>
2021-09-14 09:16:23 +02:00

201 lines
7.5 KiB
Diff

From 2321888a0f07a22af896313ea93d2470546c12f5 Mon Sep 17 00:00:00 2001
From: P Praneesh <ppranees@codeaurora.org>
Date: Fri, 20 Nov 2020 16:03:47 +0530
Subject: [PATCH] ath11k: fix rssi station dump not updated in qcn9000
In qcn9000, station dump signal values displays default
-95 dbm, Since there is firmware header change for
HAL_RX_MPDU_START between qcn9000 and qca8074 which
cause wrong peer_id fetch from msdu. Fixed this
by update hal_rx_mpdu_info with corresponding
qcn9000 tlv format.
Signed-off-by: P Praneesh <ppranees@codeaurora.org>
---
drivers/net/wireless/ath/ath11k/hal_rx.c | 20 +++++++++++++----
drivers/net/wireless/ath/ath11k/hal_rx.h | 17 +++++++++++++-
drivers/net/wireless/ath/ath11k/hw.c | 38 ++++++++++++++++++++++++++++++++
drivers/net/wireless/ath/ath11k/hw.h | 3 +++
4 files changed, 73 insertions(+), 5 deletions(-)
--- a/drivers/net/wireless/ath/ath11k/hal_rx.c
+++ b/drivers/net/wireless/ath/ath11k/hal_rx.c
@@ -899,6 +899,20 @@ ath11k_hal_rx_populate_mu_user_info(void
ath11k_hal_rx_populate_byte_count(rx_tlv, ppdu_info, rx_user_status);
}
+static
+u16 ath11k_hal_rxdesc_get_hal_mpdu_peerid(struct ath11k_base *ab,
+ struct hal_rx_mpdu_info *mpdu_info)
+{
+ return ab->hw_params.hw_ops->rx_desc_get_hal_mpdu_peerid(mpdu_info);
+}
+
+static
+u32 ath11k_hal_rxdesc_get_hal_mpdu_len(struct ath11k_base *ab,
+ struct hal_rx_mpdu_info *mpdu_info)
+{
+ return ab->hw_params.hw_ops->rx_desc_get_hal_mpdu_len(mpdu_info);
+}
+
static enum hal_rx_mon_status
ath11k_hal_rx_parse_mon_status_tlv(struct ath11k_base *ab,
struct hal_rx_mon_ppdu_info *ppdu_info,
@@ -1544,13 +1558,11 @@ ath11k_hal_rx_parse_mon_status_tlv(struc
(struct hal_rx_mpdu_info *)tlv_data;
u16 peer_id;
- peer_id = FIELD_GET(HAL_RX_MPDU_INFO_INFO0_PEERID,
- __le32_to_cpu(mpdu_info->info0));
+ peer_id = ath11k_hal_rxdesc_get_hal_mpdu_peerid(ab,mpdu_info);
if (peer_id)
ppdu_info->peer_id = peer_id;
- ppdu_info->mpdu_len += FIELD_GET(HAL_RX_MPDU_INFO_INFO1_MPDU_LEN,
- __le32_to_cpu(mpdu_info->info1));
+ ppdu_info->mpdu_len += ath11k_hal_rxdesc_get_hal_mpdu_len(ab,mpdu_info);
break;
}
case HAL_RXPCU_PPDU_END_INFO: {
--- a/drivers/net/wireless/ath/ath11k/hal_rx.h
+++ b/drivers/net/wireless/ath/ath11k/hal_rx.h
@@ -445,7 +445,7 @@ struct hal_rx_phyrx_rssi_legacy_info {
#define HAL_RX_MPDU_INFO_INFO0_PEERID GENMASK(31, 16)
#define HAL_RX_MPDU_INFO_INFO1_MPDU_LEN GENMASK(13, 0)
-struct hal_rx_mpdu_info {
+struct hal_rx_mpdu_info_ipq8074 {
__le32 rsvd0;
__le32 info0;
__le32 rsvd1[11];
@@ -453,6 +453,21 @@ struct hal_rx_mpdu_info {
__le32 rsvd2[9];
} __packed;
+struct hal_rx_mpdu_info_ipq9074 {
+ __le32 rsvd0[10];
+ __le32 info0;
+ __le32 rsvd1[2];
+ __le32 info1;
+ __le32 rsvd2[9];
+} __packed;
+
+struct hal_rx_mpdu_info {
+ union {
+ struct hal_rx_mpdu_info_ipq8074 ipq8074;
+ struct hal_rx_mpdu_info_ipq9074 qcn9074;
+ } u;
+} __packed;
+
#define HAL_RX_PPDU_END_DURATION GENMASK(23, 0)
struct hal_rx_ppdu_end_duration {
__le32 rsvd0[9];
--- a/drivers/net/wireless/ath/ath11k/hw.c
+++ b/drivers/net/wireless/ath/ath11k/hw.c
@@ -353,6 +353,20 @@ static u8 *ath11k_hw_ipq8074_rx_desc_get
return &desc->u.ipq8074.msdu_payload[0];
}
+static
+u16 ath11k_hw_ipq8074_rx_desc_get_hal_mpdu_peerid(struct hal_rx_mpdu_info *mpdu_info)
+{
+ return FIELD_GET(HAL_RX_MPDU_INFO_INFO0_PEERID,
+ __le32_to_cpu(mpdu_info->u.ipq8074.info0));
+}
+
+static
+u32 ath11k_hw_ipq8074_rx_desc_get_hal_mpdu_len(struct hal_rx_mpdu_info *mpdu_info)
+{
+ return FIELD_GET(HAL_RX_MPDU_INFO_INFO1_MPDU_LEN,
+ __le32_to_cpu(mpdu_info->u.ipq8074.info1));
+}
+
static bool ath11k_hw_qcn9074_rx_desc_get_first_msdu(struct hal_rx_desc *desc)
{
return !!FIELD_GET(RX_MSDU_END_INFO4_FIRST_MSDU,
@@ -554,6 +568,20 @@ static void ath11k_hw_ipq5018_set_rx_fra
ath11k_hif_write32(ab, reo_base + HAL_REO1_R0_MISC_CTL, val);
}
+static
+u16 ath11k_hw_qcn9074_rx_desc_get_hal_mpdu_peerid(struct hal_rx_mpdu_info *mpdu_info)
+{
+ return FIELD_GET(HAL_RX_MPDU_INFO_INFO0_PEERID,
+ __le32_to_cpu(mpdu_info->u.qcn9074.info0));
+}
+
+static
+u32 ath11k_hw_qcn9074_rx_desc_get_hal_mpdu_len(struct hal_rx_mpdu_info *mpdu_info)
+{
+ return FIELD_GET(HAL_RX_MPDU_INFO_INFO1_MPDU_LEN,
+ __le32_to_cpu(mpdu_info->u.qcn9074.info1));
+}
+
static u32 ath11k_get_reo_dest_remap_config_default(void)
{
u32 ring_hash_map;
@@ -632,6 +660,8 @@ const struct ath11k_hw_ops ipq8074_ops =
.rx_desc_mpdu_start_addr2 = ath11k_hw_ipq8074_rx_desc_mpdu_start_addr2,
.set_rx_fragmentation_dst_ring = ath11k_hw_ipq8074_set_rx_fragmentation_dst_ring,
.get_reo_dest_remap_config = ath11k_get_reo_dest_remap_config_default,
+ .rx_desc_get_hal_mpdu_peerid = ath11k_hw_ipq8074_rx_desc_get_hal_mpdu_peerid,
+ .rx_desc_get_hal_mpdu_len = ath11k_hw_ipq8074_rx_desc_get_hal_mpdu_len,
};
const struct ath11k_hw_ops ipq6018_ops = {
@@ -671,6 +701,8 @@ const struct ath11k_hw_ops ipq6018_ops =
.rx_desc_mpdu_start_addr2 = ath11k_hw_ipq8074_rx_desc_mpdu_start_addr2,
.set_rx_fragmentation_dst_ring = ath11k_hw_ipq8074_set_rx_fragmentation_dst_ring,
.get_reo_dest_remap_config = ath11k_get_reo_dest_remap_config_default,
+ .rx_desc_get_hal_mpdu_peerid = ath11k_hw_ipq8074_rx_desc_get_hal_mpdu_peerid,
+ .rx_desc_get_hal_mpdu_len = ath11k_hw_ipq8074_rx_desc_get_hal_mpdu_len,
};
const struct ath11k_hw_ops qca6390_ops = {
@@ -707,6 +739,8 @@ const struct ath11k_hw_ops qca6390_ops =
.rx_desc_get_msdu_payload = ath11k_hw_ipq8074_rx_desc_get_msdu_payload,
.set_rx_fragmentation_dst_ring = ath11k_hw_ipq8074_set_rx_fragmentation_dst_ring,
.get_reo_dest_remap_config = ath11k_get_reo_dest_remap_config_default,
+ .rx_desc_get_hal_mpdu_peerid = ath11k_hw_ipq8074_rx_desc_get_hal_mpdu_peerid,
+ .rx_desc_get_hal_mpdu_len = ath11k_hw_ipq8074_rx_desc_get_hal_mpdu_len,
//TODO
/* .rx_desc_get_da_mcbc,
.rx_desc_mac_addr2_valid,
@@ -748,6 +782,8 @@ const struct ath11k_hw_ops qcn9074_ops =
.rx_desc_get_msdu_payload = ath11k_hw_qcn9074_rx_desc_get_msdu_payload,
.set_rx_fragmentation_dst_ring = ath11k_hw_ipq8074_set_rx_fragmentation_dst_ring,
.get_reo_dest_remap_config = ath11k_get_reo_dest_remap_config_default,
+ .rx_desc_get_hal_mpdu_peerid = ath11k_hw_qcn9074_rx_desc_get_hal_mpdu_peerid,
+ .rx_desc_get_hal_mpdu_len = ath11k_hw_qcn9074_rx_desc_get_hal_mpdu_len,
};
/* IPQ5018 hw ops is similar to QCN9074 except for the dest ring remap */
@@ -787,6 +823,8 @@ const struct ath11k_hw_ops ipq5018_ops =
.rx_desc_get_attention = ath11k_hw_qcn9074_rx_desc_get_attention,
.rx_desc_get_msdu_payload = ath11k_hw_qcn9074_rx_desc_get_msdu_payload,
.set_rx_fragmentation_dst_ring = ath11k_hw_ipq5018_set_rx_fragmentation_dst_ring,
+ .rx_desc_get_hal_mpdu_peerid = ath11k_hw_qcn9074_rx_desc_get_hal_mpdu_peerid,
+ .rx_desc_get_hal_mpdu_len = ath11k_hw_qcn9074_rx_desc_get_hal_mpdu_len,
.get_reo_dest_remap_config = ath11k_get_reo_dest_remap_config_5018,
};
--- a/drivers/net/wireless/ath/ath11k/hw.h
+++ b/drivers/net/wireless/ath/ath11k/hw.h
@@ -125,6 +125,7 @@ enum ath11k_bus {
#define ATH11K_EXT_IRQ_GRP_NUM_MAX 11
+struct hal_rx_mpdu_info;
struct hal_rx_desc;
struct hal_tcl_data_cmd;
struct napi_struct;
@@ -234,6 +235,8 @@ struct ath11k_hw_ops {
u8* (*rx_desc_mpdu_start_addr2)(struct hal_rx_desc *desc);
void (*set_rx_fragmentation_dst_ring)(struct ath11k_base *ab);
u32 (*get_reo_dest_remap_config)(void);
+ u16 (*rx_desc_get_hal_mpdu_peerid) (struct hal_rx_mpdu_info *mpdu_info);
+ u32 (*rx_desc_get_hal_mpdu_len) (struct hal_rx_mpdu_info *mpdu_info);
};
extern const struct ath11k_hw_ops ipq8074_ops;