mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-11-01 08:58:07 +00:00
wifi: ath11k: fix rssi station dump not updated in QCN9074
In QCN9074, station dump signal values display default value which is -95 dbm, since there is firmware header change for HAL_RX_MPDU_START between QCN9074 and IPQ8074 which cause wrong peer_id fetch from msdu. Fix this by updating hal_rx_mpdu_info with corresponding QCN9074 tlv format. Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1 Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.4.0.1-01695-QCAHKSWPL_SILICONZ-1 Signed-off-by: P Praneesh <quic_ppranees@quicinc.com> Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com> Link: https://lore.kernel.org/r/20230320110312.20639-1-quic_ppranees@quicinc.com
This commit is contained in:
parent
813968c241
commit
031ffa6c2c
4 changed files with 45 additions and 12 deletions
|
@ -865,6 +865,12 @@ ath11k_hal_rx_populate_mu_user_info(void *rx_tlv, struct hal_rx_mon_ppdu_info *p
|
|||
ath11k_hal_rx_populate_byte_count(rx_tlv, ppdu_info, rx_user_status);
|
||||
}
|
||||
|
||||
static u16 ath11k_hal_rx_mpduinfo_get_peerid(struct ath11k_base *ab,
|
||||
struct hal_rx_mpdu_info *mpdu_info)
|
||||
{
|
||||
return ab->hw_params.hw_ops->mpdu_info_get_peerid(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,
|
||||
|
@ -1459,9 +1465,11 @@ ath11k_hal_rx_parse_mon_status_tlv(struct ath11k_base *ab,
|
|||
break;
|
||||
}
|
||||
case HAL_RX_MPDU_START: {
|
||||
struct hal_rx_mpdu_info *mpdu_info =
|
||||
(struct hal_rx_mpdu_info *)tlv_data;
|
||||
u16 peer_id;
|
||||
|
||||
peer_id = ab->hw_params.hw_ops->mpdu_info_get_peerid(tlv_data);
|
||||
peer_id = ath11k_hal_rx_mpduinfo_get_peerid(ab, mpdu_info);
|
||||
if (peer_id)
|
||||
ppdu_info->peer_id = peer_id;
|
||||
break;
|
||||
|
|
|
@ -405,7 +405,7 @@ struct hal_rx_phyrx_rssi_legacy_info {
|
|||
#define HAL_RX_MPDU_INFO_INFO0_PEERID_WCN6855 GENMASK(15, 0)
|
||||
#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];
|
||||
|
@ -413,12 +413,28 @@ struct hal_rx_mpdu_info {
|
|||
__le32 rsvd2[9];
|
||||
} __packed;
|
||||
|
||||
struct hal_rx_mpdu_info_qcn9074 {
|
||||
__le32 rsvd0[10];
|
||||
__le32 info0;
|
||||
__le32 rsvd1[2];
|
||||
__le32 info1;
|
||||
__le32 rsvd2[9];
|
||||
} __packed;
|
||||
|
||||
struct hal_rx_mpdu_info_wcn6855 {
|
||||
__le32 rsvd0[8];
|
||||
__le32 info0;
|
||||
__le32 rsvd1[14];
|
||||
} __packed;
|
||||
|
||||
struct hal_rx_mpdu_info {
|
||||
union {
|
||||
struct hal_rx_mpdu_info_ipq8074 ipq8074;
|
||||
struct hal_rx_mpdu_info_qcn9074 qcn9074;
|
||||
struct hal_rx_mpdu_info_wcn6855 wcn6855;
|
||||
} u;
|
||||
} __packed;
|
||||
|
||||
#define HAL_RX_PPDU_END_DURATION GENMASK(23, 0)
|
||||
struct hal_rx_ppdu_end_duration {
|
||||
__le32 rsvd0[9];
|
||||
|
|
|
@ -835,26 +835,35 @@ static void ath11k_hw_ipq5018_reo_setup(struct ath11k_base *ab)
|
|||
ring_hash_map);
|
||||
}
|
||||
|
||||
static u16 ath11k_hw_ipq8074_mpdu_info_get_peerid(u8 *tlv_data)
|
||||
static u16
|
||||
ath11k_hw_ipq8074_mpdu_info_get_peerid(struct hal_rx_mpdu_info *mpdu_info)
|
||||
{
|
||||
u16 peer_id = 0;
|
||||
struct hal_rx_mpdu_info *mpdu_info =
|
||||
(struct hal_rx_mpdu_info *)tlv_data;
|
||||
|
||||
peer_id = FIELD_GET(HAL_RX_MPDU_INFO_INFO0_PEERID,
|
||||
__le32_to_cpu(mpdu_info->info0));
|
||||
__le32_to_cpu(mpdu_info->u.ipq8074.info0));
|
||||
|
||||
return peer_id;
|
||||
}
|
||||
|
||||
static u16 ath11k_hw_wcn6855_mpdu_info_get_peerid(u8 *tlv_data)
|
||||
static u16
|
||||
ath11k_hw_qcn9074_mpdu_info_get_peerid(struct hal_rx_mpdu_info *mpdu_info)
|
||||
{
|
||||
u16 peer_id = 0;
|
||||
|
||||
peer_id = FIELD_GET(HAL_RX_MPDU_INFO_INFO0_PEERID,
|
||||
__le32_to_cpu(mpdu_info->u.qcn9074.info0));
|
||||
|
||||
return peer_id;
|
||||
}
|
||||
|
||||
static u16
|
||||
ath11k_hw_wcn6855_mpdu_info_get_peerid(struct hal_rx_mpdu_info *mpdu_info)
|
||||
{
|
||||
u16 peer_id = 0;
|
||||
struct hal_rx_mpdu_info_wcn6855 *mpdu_info =
|
||||
(struct hal_rx_mpdu_info_wcn6855 *)tlv_data;
|
||||
|
||||
peer_id = FIELD_GET(HAL_RX_MPDU_INFO_INFO0_PEERID_WCN6855,
|
||||
__le32_to_cpu(mpdu_info->info0));
|
||||
__le32_to_cpu(mpdu_info->u.wcn6855.info0));
|
||||
return peer_id;
|
||||
}
|
||||
|
||||
|
@ -1042,7 +1051,7 @@ const struct ath11k_hw_ops qcn9074_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,
|
||||
.reo_setup = ath11k_hw_ipq8074_reo_setup,
|
||||
.mpdu_info_get_peerid = ath11k_hw_ipq8074_mpdu_info_get_peerid,
|
||||
.mpdu_info_get_peerid = ath11k_hw_qcn9074_mpdu_info_get_peerid,
|
||||
.rx_desc_mac_addr2_valid = ath11k_hw_ipq9074_rx_desc_mac_addr2_valid,
|
||||
.rx_desc_mpdu_start_addr2 = ath11k_hw_ipq9074_rx_desc_mpdu_start_addr2,
|
||||
.get_ring_selector = ath11k_hw_ipq8074_get_tcl_ring_selector,
|
||||
|
|
|
@ -263,7 +263,7 @@ struct ath11k_hw_ops {
|
|||
struct rx_attention *(*rx_desc_get_attention)(struct hal_rx_desc *desc);
|
||||
u8 *(*rx_desc_get_msdu_payload)(struct hal_rx_desc *desc);
|
||||
void (*reo_setup)(struct ath11k_base *ab);
|
||||
u16 (*mpdu_info_get_peerid)(u8 *tlv_data);
|
||||
u16 (*mpdu_info_get_peerid)(struct hal_rx_mpdu_info *mpdu_info);
|
||||
bool (*rx_desc_mac_addr2_valid)(struct hal_rx_desc *desc);
|
||||
u8* (*rx_desc_mpdu_start_addr2)(struct hal_rx_desc *desc);
|
||||
u32 (*get_ring_selector)(struct sk_buff *skb);
|
||||
|
|
Loading…
Reference in a new issue