[PATCH v9 3/9] wifi: ath12k: Add HAL_RX_PPDU_START_USER_INFO TLV parsing support

Karthikeyan Periyasamy quic_periyasa at quicinc.com
Mon Feb 10 05:55:42 PST 2025



On 2/10/2025 4:35 PM, Mahendran P wrote:
> On 2/6/2025 7:08 AM, Karthikeyan Periyasamy wrote:
>> Currently, monitor is not enabled. However, in the future, the monitor
>> will be enabled. Therefore, add necessary HAL_RX_PPDU_START_USER_INFO TLV
>> parsing support in monitor Rx path, which help to populate the EHT radiotap
>> data.
>>
>> 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
>>
>> Co-developed-by: P Praneesh <quic_ppranees at quicinc.com>
>> Signed-off-by: P Praneesh <quic_ppranees at quicinc.com>
>> Reviewed-by: Vasanthakumar Thiagarajan <vasanthakumar.thiagarajan at oss.qualcomm.com>
>> Signed-off-by: Karthikeyan Periyasamy <quic_periyasa at quicinc.com>
>> ---
>>   drivers/net/wireless/ath/ath12k/dp_mon.c  | 307 +++++++++++++++++++++-
>>   drivers/net/wireless/ath/ath12k/hal_rx.h  | 291 +++++++++++++++++---
>>   drivers/net/wireless/ath/ath12k/rx_desc.h |   9 -
>>   3 files changed, 551 insertions(+), 56 deletions(-)
>>
>> diff --git a/drivers/net/wireless/ath/ath12k/dp_mon.c b/drivers/net/wireless/ath/ath12k/dp_mon.c
>> index dd17607d470d..96e9d68618d3 100644
>> --- a/drivers/net/wireless/ath/ath12k/dp_mon.c
>> +++ b/drivers/net/wireless/ath/ath12k/dp_mon.c
>> @@ -81,7 +81,7 @@ ath12k_dp_mon_rx_populate_mu_user_info(const struct hal_rx_ppdu_end_user_stats *
>>   static void ath12k_dp_mon_parse_vht_sig_a(const struct hal_rx_vht_sig_a_info *vht_sig,
>>   					  struct hal_rx_mon_ppdu_info *ppdu_info)
>>   {
>> -	u32 nsts, group_id, info0, info1;
>> +	u32 nsts, info0, info1;
>>   	u8 gi_setting;
>>   
>>   	info0 = __le32_to_cpu(vht_sig->info0);
>> @@ -109,12 +109,8 @@ static void ath12k_dp_mon_parse_vht_sig_a(const struct hal_rx_vht_sig_a_info *vh
>>   	ppdu_info->bw = u32_get_bits(info0, HAL_RX_VHT_SIG_A_INFO_INFO0_BW);
>>   	ppdu_info->beamformed = u32_get_bits(info1,
>>   					     HAL_RX_VHT_SIG_A_INFO_INFO1_BEAMFORMED);
>> -	group_id = u32_get_bits(info0, HAL_RX_VHT_SIG_A_INFO_INFO0_GROUP_ID);
>> -	if (group_id == 0 || group_id == 63)
>> -		ppdu_info->reception_type = HAL_RX_RECEPTION_TYPE_SU;
>> -	else
>> -		ppdu_info->reception_type = HAL_RX_RECEPTION_TYPE_MU_MIMO;
>> -	ppdu_info->vht_flag_values5 = group_id;
>> +	ppdu_info->vht_flag_values5 = u32_get_bits(info0,
>> +						   HAL_RX_VHT_SIG_A_INFO_INFO0_GROUP_ID);
>>   	ppdu_info->vht_flag_values3[0] = (((ppdu_info->mcs) << 4) |
>>   					    ppdu_info->nss);
>>   	ppdu_info->vht_flag_values2 = ppdu_info->bw;
>> @@ -134,7 +130,6 @@ static void ath12k_dp_mon_parse_ht_sig(const struct hal_rx_ht_sig_info *ht_sig,
>>   	ppdu_info->ldpc = u32_get_bits(info1, HAL_RX_HT_SIG_INFO_INFO1_FEC_CODING);
>>   	ppdu_info->gi = u32_get_bits(info1, HAL_RX_HT_SIG_INFO_INFO1_GI);
>>   	ppdu_info->nss = (ppdu_info->mcs >> 3);
>> -	ppdu_info->reception_type = HAL_RX_RECEPTION_TYPE_SU;
>>   }
>>   
>>   static void ath12k_dp_mon_parse_l_sig_b(const struct hal_rx_lsig_b_info *lsigb,
>> @@ -166,7 +161,6 @@ static void ath12k_dp_mon_parse_l_sig_b(const struct hal_rx_lsig_b_info *lsigb,
>>   
>>   	ppdu_info->rate = rate;
>>   	ppdu_info->cck_flag = 1;
>> -	ppdu_info->reception_type = HAL_RX_RECEPTION_TYPE_SU;
>>   }
>>   
>>   static void ath12k_dp_mon_parse_l_sig_a(const struct hal_rx_lsig_a_info *lsiga,
>> @@ -206,7 +200,6 @@ static void ath12k_dp_mon_parse_l_sig_a(const struct hal_rx_lsig_a_info *lsiga,
>>   	}
>>   
>>   	ppdu_info->rate = rate;
>> -	ppdu_info->reception_type = HAL_RX_RECEPTION_TYPE_SU;
>>   }
>>   
>>   static void
>> @@ -243,7 +236,6 @@ ath12k_dp_mon_parse_he_sig_b2_ofdma(const struct hal_rx_he_sig_b2_ofdma_info *of
>>   	ppdu_info->nss = u32_get_bits(info0, HAL_RX_HE_SIG_B2_OFDMA_INFO_INFO0_STA_NSTS);
>>   	ppdu_info->beamformed = u32_get_bits(info0,
>>   					     HAL_RX_HE_SIG_B2_OFDMA_INFO_INFO0_STA_TXBF);
>> -	ppdu_info->reception_type = HAL_RX_RECEPTION_TYPE_MU_OFDMA;
>>   }
>>   
>>   static void
>> @@ -283,7 +275,6 @@ ath12k_dp_mon_parse_he_sig_b1_mu(const struct hal_rx_he_sig_b1_mu_info *he_sig_b
>>   				HAL_RX_HE_SIG_B1_MU_INFO_INFO0_RU_ALLOCATION);
>>   	ppdu_info->ru_alloc = ath12k_he_ru_tones_to_nl80211_he_ru_alloc(ru_tones);
>>   	ppdu_info->he_RU[0] = ru_tones;
>> -	ppdu_info->reception_type = HAL_RX_RECEPTION_TYPE_MU_MIMO;
>>   }
>>   
>>   static void
>> @@ -417,7 +408,6 @@ ath12k_dp_mon_parse_he_sig_mu(const struct hal_rx_he_sig_a_mu_dl_info *he_sig_a_
>>   
>>   	ppdu_info->is_stbc = info1 &
>>   			     HAL_RX_HE_SIG_A_MU_DL_INFO1_STBC;
>> -	ppdu_info->reception_type = HAL_RX_RECEPTION_TYPE_MU_MIMO;
>>   }
>>   
>>   static void ath12k_dp_mon_parse_he_sig_su(const struct hal_rx_he_sig_a_su_info *he_sig_a,
>> @@ -565,7 +555,6 @@ static void ath12k_dp_mon_parse_he_sig_su(const struct hal_rx_he_sig_a_su_info *
>>   	dcm = u32_get_bits(info0, HAL_RX_HE_SIG_A_SU_INFO_INFO0_DCM);
>>   	ppdu_info->nss = u32_get_bits(info0, HAL_RX_HE_SIG_A_SU_INFO_INFO0_NSTS);
>>   	ppdu_info->dcm = dcm;
>> -	ppdu_info->reception_type = HAL_RX_RECEPTION_TYPE_SU;
>>   }
>>   
>>   static void
>> @@ -1141,6 +1130,292 @@ ath12k_dp_mon_parse_eht_sig_hdr(struct hal_rx_mon_ppdu_info *ppdu_info,
>>   		ath12k_dp_mon_hal_rx_parse_eht_sig_ofdma(tlv_data, ppdu_info);
>>   }
>>   
>> +static inline enum ath12k_eht_ru_size
>> +hal_rx_mon_hal_ru_size_to_ath12k_ru_size(u32 hal_ru_size)
>> +{
>> +	switch (hal_ru_size) {
>> +	case HAL_EHT_RU_26:
>> +		return ATH12K_EHT_RU_26;
>> +	case HAL_EHT_RU_52:
>> +		return ATH12K_EHT_RU_52;
>> +	case HAL_EHT_RU_78:
>> +		return ATH12K_EHT_RU_52_26;
>> +	case HAL_EHT_RU_106:
>> +		return ATH12K_EHT_RU_106;
>> +	case HAL_EHT_RU_132:
>> +		return ATH12K_EHT_RU_106_26;
>> +	case HAL_EHT_RU_242:
>> +		return ATH12K_EHT_RU_242;
>> +	case HAL_EHT_RU_484:
>> +		return ATH12K_EHT_RU_484;
>> +	case HAL_EHT_RU_726:
>> +		return ATH12K_EHT_RU_484_242;
>> +	case HAL_EHT_RU_996:
>> +		return ATH12K_EHT_RU_996;
>> +	case HAL_EHT_RU_996x2:
>> +		return ATH12K_EHT_RU_996x2;
>> +	case HAL_EHT_RU_996x3:
>> +		return ATH12K_EHT_RU_996x3;
>> +	case HAL_EHT_RU_996x4:
>> +		return ATH12K_EHT_RU_996x4;
>> +	case HAL_EHT_RU_NONE:
>> +		return ATH12K_EHT_RU_INVALID;
>> +	case HAL_EHT_RU_996_484:
>> +		return ATH12K_EHT_RU_996_484;
>> +	case HAL_EHT_RU_996x2_484:
>> +		return ATH12K_EHT_RU_996x2_484;
>> +	case HAL_EHT_RU_996x3_484:
>> +		return ATH12K_EHT_RU_996x3_484;
>> +	case HAL_EHT_RU_996_484_242:
>> +		return ATH12K_EHT_RU_996_484_242;
>> +	default:
>> +		return ATH12K_EHT_RU_INVALID;
>> +	}
>> +}
> 
> consider using lookup table.
> 

Lookup table need static array. Really need the static for this ?

Even if we need, shall we have this in a separate future patch ?


>> +
>> +static inline u32
>> +hal_rx_ul_ofdma_ru_size_to_width(enum ath12k_eht_ru_size ru_size)
>> +{
>> +	switch (ru_size) {
>> +	case ATH12K_EHT_RU_26:
>> +		return RU_26;
>> +	case ATH12K_EHT_RU_52:
>> +		return RU_52;
>> +	case ATH12K_EHT_RU_52_26:
>> +		return RU_52_26;
>> +	case ATH12K_EHT_RU_106:
>> +		return RU_106;
>> +	case ATH12K_EHT_RU_106_26:
>> +		return RU_106_26;
>> +	case ATH12K_EHT_RU_242:
>> +		return RU_242;
>> +	case ATH12K_EHT_RU_484:
>> +		return RU_484;
>> +	case ATH12K_EHT_RU_484_242:
>> +		return RU_484_242;
>> +	case ATH12K_EHT_RU_996:
>> +		return RU_996;
>> +	case ATH12K_EHT_RU_996_484:
>> +		return RU_996_484;
>> +	case ATH12K_EHT_RU_996_484_242:
>> +		return RU_996_484_242;
>> +	case ATH12K_EHT_RU_996x2:
>> +		return RU_2X996;
>> +	case ATH12K_EHT_RU_996x2_484:
>> +		return RU_2X996_484;
>> +	case ATH12K_EHT_RU_996x3:
>> +		return RU_3X996;
>> +	case ATH12K_EHT_RU_996x3_484:
>> +		return RU_3X996_484;
>> +	case ATH12K_EHT_RU_996x4:
>> +		return RU_4X996;
>> +	default:
>> +		return RU_INVALID;
>> +	}
>> +}
> 
> same as above
> 

same here


-- 
Karthikeyan Periyasamy
--
கார்த்திகேயன் பெரியசாமி



More information about the ath12k mailing list