[PATCH v9 2/9] wifi: ath12k: Add HAL_PHYRX_GENERIC_EHT_SIG TLV parsing support

Karthikeyan Periyasamy quic_periyasa at quicinc.com
Mon Feb 10 05:50:26 PST 2025



On 2/10/2025 4:23 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 the necessary HAL_PHYRX_GENERIC_EHT_SIG
>> 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 | 548 +++++++++++++++++++++--
>>   drivers/net/wireless/ath/ath12k/hal_rx.h | 136 +++++-
>>   2 files changed, 638 insertions(+), 46 deletions(-)
>>
>> diff --git a/drivers/net/wireless/ath/ath12k/dp_mon.c b/drivers/net/wireless/ath/ath12k/dp_mon.c
>> index 61fd481b7a3b..dd17607d470d 100644
>> --- a/drivers/net/wireless/ath/ath12k/dp_mon.c
>> +++ b/drivers/net/wireless/ath/ath12k/dp_mon.c
>> @@ -13,6 +13,9 @@
>>   #define ATH12K_LE32_DEC_ENC(value, dec_bits, enc_bits)	\
>>   		u32_encode_bits(le32_get_bits(value, dec_bits), enc_bits)
>>   
>> +#define ATH12K_LE64_DEC_ENC(value, dec_bits, enc_bits) \
>> +		u32_encode_bits(le64_get_bits(value, dec_bits), enc_bits)
> 
> u64_encode_bits?
> 

No, Its not needed. Here we need to decode from the u64 and get assign 
to u32 as defined by eht radiotap header.


>> @@ -836,6 +1239,9 @@ ath12k_dp_mon_rx_parse_status_tlv(struct ath12k *ar,
>>   		case HAL_RX_PREAMBLE_11AX:
>>   			ppdu_info->he_flags = 1;
>>   			break;
>> +		case HAL_RX_PREAMBLE_11BE:
>> +			ppdu_info->is_eht = true;
>> +			break;
>>   		default:
>>   			break;
>>   		}
>> @@ -961,6 +1367,21 @@ ath12k_dp_mon_rx_parse_status_tlv(struct ath12k *ar,
>>   	case HAL_PHYRX_GENERIC_U_SIG:
>>   		ath12k_dp_mon_hal_rx_parse_u_sig_hdr(tlv_data, ppdu_info);
>>   		break;
>> +	case HAL_PHYRX_GENERIC_EHT_SIG:
>> +		/* Handle the case where aggregation is in progress
>> +		 * or the current TLV is one of the TLVs which should be
>> +		 * aggregated
>> +		 */
>> +		if (!ppdu_info->tlv_aggr.in_progress) {
>> +			ppdu_info->tlv_aggr.in_progress = true;
>> +			ppdu_info->tlv_aggr.tlv_tag = tlv_tag;
>> +			ppdu_info->tlv_aggr.cur_len = 0;
>> +		}
>> +
>> +		ppdu_info->is_eht = true;
>> +
>> +		ath12k_dp_mon_hal_aggr_tlv(ppdu_info, tlv_len, tlv_data);
>> +		break;
>>   	case HAL_DUMMY:
>>   		return HAL_RX_MON_STATUS_BUF_DONE;
>>   	case HAL_RX_PPDU_END_STATUS_DONE:
>> @@ -1158,22 +1579,59 @@ static void ath12k_dp_mon_update_radiotap(struct ath12k *ar,
>>   		rxs->ampdu_reference = ampdu_id;
>>   	}
>>   
>> -	if (ppduinfo->eht_usig) {
>> +	if (ppduinfo->is_eht || ppduinfo->eht_usig) {
>>   		struct ieee80211_radiotap_tlv *tlv;
>> +		struct ieee80211_radiotap_eht *eht;
>>   		struct ieee80211_radiotap_eht_usig *usig;
>> -		u16 len = sizeof(*usig);
>> +		u16 len = 0, i, eht_len, usig_len;
>> +		u8 user;
>> +
>> +		if (ppduinfo->is_eht) {
>> +			eht_len = struct_size(eht,
>> +					      user_info,
>> +					      ppduinfo->eht_info.num_user_info);
>> +			len += sizeof(*tlv) + eht_len;
>> +		}
>> +
>> +		if (ppduinfo->eht_usig) {
>> +			usig_len = sizeof(*usig);
>> +			len += sizeof(*tlv) + usig_len;
>> +		}
>>   
>>   		rxs->flag |= RX_FLAG_RADIOTAP_TLV_AT_END;
>>   		rxs->encoding = RX_ENC_EHT;
>>   
>>   		skb_reset_mac_header(mon_skb);
>>   
>> -		tlv = skb_push(mon_skb, sizeof(*tlv) + len);
>> -		tlv->type = cpu_to_le16(IEEE80211_RADIOTAP_EHT_USIG);
>> -		tlv->len = cpu_to_le16(len);
>> +		tlv = skb_push(mon_skb, len);
>> +
>> +		if (ppduinfo->is_eht) {
>> +			tlv->type = cpu_to_le16(IEEE80211_RADIOTAP_EHT);
>> +			tlv->len = cpu_to_le16(eht_len);
>>   
>> -		usig = (struct ieee80211_radiotap_eht_usig *)tlv->data;
>> -		*usig = ppduinfo->usig;
>> +			eht = (struct ieee80211_radiotap_eht *)tlv->data;
>> +			eht->known = ppduinfo->eht_info.eht.known;
>> +
>> +			for (i = 0;
>> +			     i < ARRAY_SIZE(eht->data) &&
>> +			     i < ARRAY_SIZE(ppduinfo->eht_info.eht.data);
>> +			     i++)
>> +				eht->data[i] = ppduinfo->eht_info.eht.data[i];
>> +
>> +			for (user = 0; user < ppduinfo->eht_info.num_user_info; user++)
>> +				put_unaligned_le32(ppduinfo->eht_info.user_info[user],
>> +						   &eht->user_info[user]);
>> +
>> +			tlv = (struct ieee80211_radiotap_tlv *)&tlv->data[eht_len];
>> +		}
>> +
>> +		if (ppduinfo->eht_usig) {
>> +			tlv->type = cpu_to_le16(IEEE80211_RADIOTAP_EHT_USIG);
>> +			tlv->len = cpu_to_le16(usig_len);
>> +
>> +			usig = (struct ieee80211_radiotap_eht_usig *)tlv->data;
>> +			*usig = ppduinfo->u_sig_info.usig;
>> +		}
>>   	} else if (ppduinfo->he_mu_flags) {
>>   		rxs->flag |= RX_FLAG_RADIOTAP_HE_MU;
>>   		rxs->encoding = RX_ENC_HE;
>> diff --git a/drivers/net/wireless/ath/ath12k/hal_rx.h b/drivers/net/wireless/ath/ath12k/hal_rx.h
>> index 2da16f27e76c..959f2283294c 100644
>> --- a/drivers/net/wireless/ath/ath12k/hal_rx.h
>> +++ b/drivers/net/wireless/ath/ath12k/hal_rx.h
>> @@ -71,6 +71,8 @@ enum hal_rx_preamble {
>>   	HAL_RX_PREAMBLE_11N,
>>   	HAL_RX_PREAMBLE_11AC,
>>   	HAL_RX_PREAMBLE_11AX,
>> +	HAL_RX_PREAMBLE_11BA,
> 
> is it needed?
> 

It will be good to have the defined values in the enum instead of 
initialise the HAL_RX_PREAMBLE_11BE = 6 directly.

>> +	HAL_RX_PREAMBLE_11BE,
>>   	HAL_RX_PREAMBLE_MAX,
>>   };
>>   

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



More information about the ath12k mailing list