mirror of
https://github.com/torvalds/linux.git
synced 2026-05-05 23:05:25 -04:00
wifi: ath12k: Add support for parsing 64-bit TLVs
There is mismatch between the format of monitor destination TLVs received and the expected format by the current implementation. The received TLVs are in 64-bit format, while the implementation is designed to handle 32-bit TLVs. This leads to incorrect parsing. Fix it by adding support for parsing 64-bit TLVs. Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.3.1-00173-QCAHKSWPL_SILICONZ-1 Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3 Signed-off-by: P Praneesh <quic_ppranees@quicinc.com> Acked-by: Kalle Valo <kvalo@kernel.org> Acked-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com> Link: https://patch.msgid.link/20241217095058.2725755-1-quic_ppranees@quicinc.com Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
This commit is contained in:
@@ -1205,19 +1205,19 @@ ath12k_dp_mon_parse_rx_dest(struct ath12k_base *ab, struct ath12k_mon_data *pmon
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
struct hal_rx_mon_ppdu_info *ppdu_info = &pmon->mon_ppdu_info;
|
||||
struct hal_tlv_hdr *tlv;
|
||||
struct hal_tlv_64_hdr *tlv;
|
||||
enum hal_rx_mon_status hal_status;
|
||||
u32 tlv_userid = 0;
|
||||
u32 tlv_userid;
|
||||
u16 tlv_tag, tlv_len;
|
||||
u8 *ptr = skb->data;
|
||||
|
||||
memset(ppdu_info, 0, sizeof(struct hal_rx_mon_ppdu_info));
|
||||
|
||||
do {
|
||||
tlv = (struct hal_tlv_hdr *)ptr;
|
||||
tlv_tag = le32_get_bits(tlv->tl, HAL_TLV_HDR_TAG);
|
||||
tlv_len = le32_get_bits(tlv->tl, HAL_TLV_HDR_LEN);
|
||||
tlv_userid = le32_get_bits(tlv->tl, HAL_TLV_USR_ID);
|
||||
tlv = (struct hal_tlv_64_hdr *)ptr;
|
||||
tlv_tag = le64_get_bits(tlv->tl, HAL_TLV_64_HDR_TAG);
|
||||
tlv_len = le64_get_bits(tlv->tl, HAL_TLV_64_HDR_LEN);
|
||||
tlv_userid = le64_get_bits(tlv->tl, HAL_TLV_64_USR_ID);
|
||||
ptr += sizeof(*tlv);
|
||||
|
||||
/* The actual length of PPDU_END is the combined length of many PHY
|
||||
@@ -1232,7 +1232,7 @@ ath12k_dp_mon_parse_rx_dest(struct ath12k_base *ab, struct ath12k_mon_data *pmon
|
||||
hal_status = ath12k_dp_mon_rx_parse_status_tlv(ab, pmon,
|
||||
tlv_tag, ptr, tlv_userid);
|
||||
ptr += tlv_len;
|
||||
ptr = PTR_ALIGN(ptr, HAL_TLV_ALIGN);
|
||||
ptr = PTR_ALIGN(ptr, HAL_TLV_64_ALIGN);
|
||||
|
||||
if ((ptr - skb->data) >= DP_RX_BUFFER_SIZE)
|
||||
break;
|
||||
|
||||
@@ -579,6 +579,8 @@ struct hal_tlv_hdr {
|
||||
|
||||
#define HAL_TLV_64_HDR_TAG GENMASK(9, 1)
|
||||
#define HAL_TLV_64_HDR_LEN GENMASK(21, 10)
|
||||
#define HAL_TLV_64_USR_ID GENMASK(31, 26)
|
||||
#define HAL_TLV_64_ALIGN 8
|
||||
|
||||
struct hal_tlv_64_hdr {
|
||||
__le64 tl;
|
||||
|
||||
Reference in New Issue
Block a user