Message ID | 20250127114030.43479-4-quic_periyasa@quicinc.com |
---|---|
State | New |
Headers | show |
Series | wifi: ath12k: Add monitor interface support on QCN9274 | expand |
On 1/27/2025 5:10 PM, Karthikeyan Periyasamy wrote: > From: P Praneesh <quic_ppranees@quicinc.com> > > Currently, error bitmap and decap format information are fetched from the > MSDU Rx TLV data. This logic is inherited from ath11k. However, for ath12k > 802.11be hardware, the Rx TLV will not be present in the MSDU data. > Instead, this information is reported separately under the MSDU END TLV > tag. Therefore, remove the existing fetch code, handle the MSDU END TLV > tag and fetch the above information to store it in the mon_mpdu data > structure for use in the merge MSDU procedure. > > 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> > Signed-off-by: Karthikeyan Periyasamy <quic_periyasa@quicinc.com> > Tested-by: Nicolas Escande <nico.escande@gmail.com> > --- > drivers/net/wireless/ath/ath12k/dp_mon.c | 58 ++++++++++-------------- > 1 file changed, 23 insertions(+), 35 deletions(-) > > diff --git a/drivers/net/wireless/ath/ath12k/dp_mon.c b/drivers/net/wireless/ath/ath12k/dp_mon.c > index e9f53ac169b4..5be47c94bed1 100644 > --- a/drivers/net/wireless/ath/ath12k/dp_mon.c > +++ b/drivers/net/wireless/ath/ath12k/dp_mon.c > @@ -1733,30 +1733,26 @@ static void ath12k_dp_mon_rx_msdus_set_payload(struct ath12k *ar, > > static struct sk_buff * > ath12k_dp_mon_rx_merg_msdus(struct ath12k *ar, > - struct sk_buff *head_msdu, struct sk_buff *tail_msdu, > - struct ieee80211_rx_status *rxs, bool *fcs_err) > + struct dp_mon_mpdu *mon_mpdu, > + struct ieee80211_rx_status *rxs) > { > struct ath12k_base *ab = ar->ab; > struct sk_buff *msdu, *mpdu_buf, *prev_buf, *head_frag_list; > + struct sk_buff *head_msdu, *tail_msdu; > struct hal_rx_desc *rx_desc, *tail_rx_desc; > - u8 *hdr_desc, *dest, decap_format; > + u8 *hdr_desc, *dest, decap_format = mon_mpdu->decap_format; > struct ieee80211_hdr_3addr *wh; > - u32 err_bitmap, frag_list_sum_len = 0; > + u32 frag_list_sum_len = 0; > > mpdu_buf = NULL; > + head_msdu = mon_mpdu->head; > + tail_msdu = mon_mpdu->tail; > > if (!head_msdu) > goto err_merge_fail; > > - rx_desc = (struct hal_rx_desc *)head_msdu->data; > tail_rx_desc = (struct hal_rx_desc *)tail_msdu->data; > > - err_bitmap = ath12k_dp_rx_h_mpdu_err(ab, tail_rx_desc); > - if (err_bitmap & HAL_RX_MPDU_ERR_FCS) > - *fcs_err = true; > - > - decap_format = ath12k_dp_rx_h_decap_type(ab, tail_rx_desc); > - > ath12k_dp_rx_h_ppdu(ar, tail_rx_desc, rxs); > > if (decap_format == DP_RX_DECAP_TYPE_RAW) { > @@ -1985,7 +1981,8 @@ static void ath12k_dp_mon_update_radiotap(struct ath12k *ar, > > static void ath12k_dp_mon_rx_deliver_msdu(struct ath12k *ar, struct napi_struct *napi, > struct sk_buff *msdu, > - struct ieee80211_rx_status *status) > + struct ieee80211_rx_status *status, > + u8 decap) > { > static const struct ieee80211_radiotap_he known = { > .data1 = cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA1_DATA_MCS_KNOWN | > @@ -1997,7 +1994,6 @@ static void ath12k_dp_mon_rx_deliver_msdu(struct ath12k *ar, struct napi_struct > struct ieee80211_sta *pubsta = NULL; > struct ath12k_peer *peer; > struct ath12k_skb_rxcb *rxcb = ATH12K_SKB_RXCB(msdu); > - u8 decap = DP_RX_DECAP_TYPE_RAW; > bool is_mcbc = rxcb->is_mcbc; > bool is_eapol_tkip = rxcb->is_eapol; > > @@ -2010,8 +2006,6 @@ static void ath12k_dp_mon_rx_deliver_msdu(struct ath12k *ar, struct napi_struct > status->flag |= RX_FLAG_RADIOTAP_HE; > } > > - if (!(status->flag & RX_FLAG_ONLY_MONITOR)) > - decap = ath12k_dp_rx_h_decap_type(ar->ab, rxcb->rx_desc); > spin_lock_bh(&ar->ab->base_lock); > peer = ath12k_dp_rx_h_find_peer(ar->ab, msdu); > if (peer && peer->sta) { > @@ -2068,25 +2062,23 @@ static void ath12k_dp_mon_rx_deliver_msdu(struct ath12k *ar, struct napi_struct > } > > static int ath12k_dp_mon_rx_deliver(struct ath12k *ar, > - struct sk_buff *head_msdu, struct sk_buff *tail_msdu, > + struct dp_mon_mpdu *mon_mpdu, > struct hal_rx_mon_ppdu_info *ppduinfo, > struct napi_struct *napi) > { > struct ath12k_pdev_dp *dp = &ar->dp; > struct sk_buff *mon_skb, *skb_next, *header; > struct ieee80211_rx_status *rxs = &dp->rx_status; > - bool fcs_err = false; > + u8 decap = DP_RX_DECAP_TYPE_RAW; > > - mon_skb = ath12k_dp_mon_rx_merg_msdus(ar, > - head_msdu, tail_msdu, > - rxs, &fcs_err); > + mon_skb = ath12k_dp_mon_rx_merg_msdus(ar, mon_mpdu, rxs); > if (!mon_skb) > goto mon_deliver_fail; > > header = mon_skb; > rxs->flag = 0; > > - if (fcs_err) > + if (mon_mpdu->err_bitmap & HAL_RX_MPDU_ERR_FCS) > rxs->flag = RX_FLAG_FAILED_FCS_CRC; > > do { > @@ -2103,8 +2095,12 @@ static int ath12k_dp_mon_rx_deliver(struct ath12k *ar, > rxs->flag |= RX_FLAG_ALLOW_SAME_PN; > } > rxs->flag |= RX_FLAG_ONLY_MONITOR; > + > + if (!(rxs->flag & RX_FLAG_ONLY_MONITOR)) > + decap = mon_mpdu->decap_format; > + > ath12k_dp_mon_update_radiotap(ar, ppduinfo, mon_skb, rxs); > - ath12k_dp_mon_rx_deliver_msdu(ar, napi, mon_skb, rxs); > + ath12k_dp_mon_rx_deliver_msdu(ar, napi, mon_skb, rxs, decap); > mon_skb = skb_next; > } while (mon_skb); > rxs->flag = 0; > @@ -2112,7 +2108,7 @@ static int ath12k_dp_mon_rx_deliver(struct ath12k *ar, > return 0; > > mon_deliver_fail: > - mon_skb = head_msdu; > + mon_skb = mon_mpdu->head; > while (mon_skb) { > skb_next = mon_skb->next; > dev_kfree_skb_any(mon_skb); > @@ -2318,7 +2314,6 @@ ath12k_dp_mon_rx_parse_mon_status(struct ath12k *ar, > struct hal_rx_mon_ppdu_info *ppdu_info = &pmon->mon_ppdu_info; > struct dp_mon_mpdu *tmp; > struct dp_mon_mpdu *mon_mpdu = pmon->mon_mpdu; > - struct sk_buff *head_msdu, *tail_msdu; > enum hal_rx_mon_status hal_status; > > hal_status = ath12k_dp_mon_parse_rx_dest(ar, pmon, skb); > @@ -2327,13 +2322,9 @@ ath12k_dp_mon_rx_parse_mon_status(struct ath12k *ar, > > list_for_each_entry_safe(mon_mpdu, tmp, &pmon->dp_rx_mon_mpdu_list, list) { > list_del(&mon_mpdu->list); > - head_msdu = mon_mpdu->head; > - tail_msdu = mon_mpdu->tail; > > - if (head_msdu && tail_msdu) { > - ath12k_dp_mon_rx_deliver(ar, head_msdu, > - tail_msdu, ppdu_info, napi); > - } > + if (mon_mpdu->head && mon_mpdu->tail) > + ath12k_dp_mon_rx_deliver(ar, mon_mpdu, ppdu_info, napi); > > kfree(mon_mpdu); > } > @@ -3018,16 +3009,13 @@ ath12k_dp_mon_tx_process_ppdu_info(struct ath12k *ar, > struct dp_mon_tx_ppdu_info *tx_ppdu_info) > { > struct dp_mon_mpdu *tmp, *mon_mpdu; > - struct sk_buff *head_msdu, *tail_msdu; > > list_for_each_entry_safe(mon_mpdu, tmp, > &tx_ppdu_info->dp_tx_mon_mpdu_list, list) { > list_del(&mon_mpdu->list); > - head_msdu = mon_mpdu->head; > - tail_msdu = mon_mpdu->tail; > > - if (head_msdu) > - ath12k_dp_mon_rx_deliver(ar, head_msdu, tail_msdu, > + if (mon_mpdu->head) > + ath12k_dp_mon_rx_deliver(ar, mon_mpdu, > &tx_ppdu_info->rx_status, napi); > > kfree(mon_mpdu); Reviewed-by: Vasanthakumar Thiagarajan <vasanthakumar.thiagarajan@oss.qualcomm.com>
diff --git a/drivers/net/wireless/ath/ath12k/dp_mon.c b/drivers/net/wireless/ath/ath12k/dp_mon.c index e9f53ac169b4..5be47c94bed1 100644 --- a/drivers/net/wireless/ath/ath12k/dp_mon.c +++ b/drivers/net/wireless/ath/ath12k/dp_mon.c @@ -1733,30 +1733,26 @@ static void ath12k_dp_mon_rx_msdus_set_payload(struct ath12k *ar, static struct sk_buff * ath12k_dp_mon_rx_merg_msdus(struct ath12k *ar, - struct sk_buff *head_msdu, struct sk_buff *tail_msdu, - struct ieee80211_rx_status *rxs, bool *fcs_err) + struct dp_mon_mpdu *mon_mpdu, + struct ieee80211_rx_status *rxs) { struct ath12k_base *ab = ar->ab; struct sk_buff *msdu, *mpdu_buf, *prev_buf, *head_frag_list; + struct sk_buff *head_msdu, *tail_msdu; struct hal_rx_desc *rx_desc, *tail_rx_desc; - u8 *hdr_desc, *dest, decap_format; + u8 *hdr_desc, *dest, decap_format = mon_mpdu->decap_format; struct ieee80211_hdr_3addr *wh; - u32 err_bitmap, frag_list_sum_len = 0; + u32 frag_list_sum_len = 0; mpdu_buf = NULL; + head_msdu = mon_mpdu->head; + tail_msdu = mon_mpdu->tail; if (!head_msdu) goto err_merge_fail; - rx_desc = (struct hal_rx_desc *)head_msdu->data; tail_rx_desc = (struct hal_rx_desc *)tail_msdu->data; - err_bitmap = ath12k_dp_rx_h_mpdu_err(ab, tail_rx_desc); - if (err_bitmap & HAL_RX_MPDU_ERR_FCS) - *fcs_err = true; - - decap_format = ath12k_dp_rx_h_decap_type(ab, tail_rx_desc); - ath12k_dp_rx_h_ppdu(ar, tail_rx_desc, rxs); if (decap_format == DP_RX_DECAP_TYPE_RAW) { @@ -1985,7 +1981,8 @@ static void ath12k_dp_mon_update_radiotap(struct ath12k *ar, static void ath12k_dp_mon_rx_deliver_msdu(struct ath12k *ar, struct napi_struct *napi, struct sk_buff *msdu, - struct ieee80211_rx_status *status) + struct ieee80211_rx_status *status, + u8 decap) { static const struct ieee80211_radiotap_he known = { .data1 = cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA1_DATA_MCS_KNOWN | @@ -1997,7 +1994,6 @@ static void ath12k_dp_mon_rx_deliver_msdu(struct ath12k *ar, struct napi_struct struct ieee80211_sta *pubsta = NULL; struct ath12k_peer *peer; struct ath12k_skb_rxcb *rxcb = ATH12K_SKB_RXCB(msdu); - u8 decap = DP_RX_DECAP_TYPE_RAW; bool is_mcbc = rxcb->is_mcbc; bool is_eapol_tkip = rxcb->is_eapol; @@ -2010,8 +2006,6 @@ static void ath12k_dp_mon_rx_deliver_msdu(struct ath12k *ar, struct napi_struct status->flag |= RX_FLAG_RADIOTAP_HE; } - if (!(status->flag & RX_FLAG_ONLY_MONITOR)) - decap = ath12k_dp_rx_h_decap_type(ar->ab, rxcb->rx_desc); spin_lock_bh(&ar->ab->base_lock); peer = ath12k_dp_rx_h_find_peer(ar->ab, msdu); if (peer && peer->sta) { @@ -2068,25 +2062,23 @@ static void ath12k_dp_mon_rx_deliver_msdu(struct ath12k *ar, struct napi_struct } static int ath12k_dp_mon_rx_deliver(struct ath12k *ar, - struct sk_buff *head_msdu, struct sk_buff *tail_msdu, + struct dp_mon_mpdu *mon_mpdu, struct hal_rx_mon_ppdu_info *ppduinfo, struct napi_struct *napi) { struct ath12k_pdev_dp *dp = &ar->dp; struct sk_buff *mon_skb, *skb_next, *header; struct ieee80211_rx_status *rxs = &dp->rx_status; - bool fcs_err = false; + u8 decap = DP_RX_DECAP_TYPE_RAW; - mon_skb = ath12k_dp_mon_rx_merg_msdus(ar, - head_msdu, tail_msdu, - rxs, &fcs_err); + mon_skb = ath12k_dp_mon_rx_merg_msdus(ar, mon_mpdu, rxs); if (!mon_skb) goto mon_deliver_fail; header = mon_skb; rxs->flag = 0; - if (fcs_err) + if (mon_mpdu->err_bitmap & HAL_RX_MPDU_ERR_FCS) rxs->flag = RX_FLAG_FAILED_FCS_CRC; do { @@ -2103,8 +2095,12 @@ static int ath12k_dp_mon_rx_deliver(struct ath12k *ar, rxs->flag |= RX_FLAG_ALLOW_SAME_PN; } rxs->flag |= RX_FLAG_ONLY_MONITOR; + + if (!(rxs->flag & RX_FLAG_ONLY_MONITOR)) + decap = mon_mpdu->decap_format; + ath12k_dp_mon_update_radiotap(ar, ppduinfo, mon_skb, rxs); - ath12k_dp_mon_rx_deliver_msdu(ar, napi, mon_skb, rxs); + ath12k_dp_mon_rx_deliver_msdu(ar, napi, mon_skb, rxs, decap); mon_skb = skb_next; } while (mon_skb); rxs->flag = 0; @@ -2112,7 +2108,7 @@ static int ath12k_dp_mon_rx_deliver(struct ath12k *ar, return 0; mon_deliver_fail: - mon_skb = head_msdu; + mon_skb = mon_mpdu->head; while (mon_skb) { skb_next = mon_skb->next; dev_kfree_skb_any(mon_skb); @@ -2318,7 +2314,6 @@ ath12k_dp_mon_rx_parse_mon_status(struct ath12k *ar, struct hal_rx_mon_ppdu_info *ppdu_info = &pmon->mon_ppdu_info; struct dp_mon_mpdu *tmp; struct dp_mon_mpdu *mon_mpdu = pmon->mon_mpdu; - struct sk_buff *head_msdu, *tail_msdu; enum hal_rx_mon_status hal_status; hal_status = ath12k_dp_mon_parse_rx_dest(ar, pmon, skb); @@ -2327,13 +2322,9 @@ ath12k_dp_mon_rx_parse_mon_status(struct ath12k *ar, list_for_each_entry_safe(mon_mpdu, tmp, &pmon->dp_rx_mon_mpdu_list, list) { list_del(&mon_mpdu->list); - head_msdu = mon_mpdu->head; - tail_msdu = mon_mpdu->tail; - if (head_msdu && tail_msdu) { - ath12k_dp_mon_rx_deliver(ar, head_msdu, - tail_msdu, ppdu_info, napi); - } + if (mon_mpdu->head && mon_mpdu->tail) + ath12k_dp_mon_rx_deliver(ar, mon_mpdu, ppdu_info, napi); kfree(mon_mpdu); } @@ -3018,16 +3009,13 @@ ath12k_dp_mon_tx_process_ppdu_info(struct ath12k *ar, struct dp_mon_tx_ppdu_info *tx_ppdu_info) { struct dp_mon_mpdu *tmp, *mon_mpdu; - struct sk_buff *head_msdu, *tail_msdu; list_for_each_entry_safe(mon_mpdu, tmp, &tx_ppdu_info->dp_tx_mon_mpdu_list, list) { list_del(&mon_mpdu->list); - head_msdu = mon_mpdu->head; - tail_msdu = mon_mpdu->tail; - if (head_msdu) - ath12k_dp_mon_rx_deliver(ar, head_msdu, tail_msdu, + if (mon_mpdu->head) + ath12k_dp_mon_rx_deliver(ar, mon_mpdu, &tx_ppdu_info->rx_status, napi); kfree(mon_mpdu);