mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-14 01:49:20 -04:00
wifi: ath12k: Avoid code duplication in monitor ring processing
The current implementation processes the monitor destination ring using two separate functions, ath12k_dp_mon_srng_process() for standalone monitor mode and ath12k_dp_mon_rx_process_stats() for statistics. However, both functions contain same code which performs monitor ring reaping and skb data processing. To eliminate redundancy, remove the duplicate code and use a single function to handle both the cases. 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> Link: https://patch.msgid.link/20241223060132.3506372-5-quic_ppranees@quicinc.com Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
This commit is contained in:
@@ -2000,116 +2000,6 @@ ath12k_dp_mon_tx_parse_mon_status(struct ath12k *ar,
|
||||
return tlv_status;
|
||||
}
|
||||
|
||||
int ath12k_dp_mon_srng_process(struct ath12k *ar, int *budget,
|
||||
enum dp_monitor_mode monitor_mode,
|
||||
struct napi_struct *napi)
|
||||
{
|
||||
struct hal_mon_dest_desc *mon_dst_desc;
|
||||
struct ath12k_pdev_dp *pdev_dp = &ar->dp;
|
||||
struct ath12k_mon_data *pmon = (struct ath12k_mon_data *)&pdev_dp->mon_data;
|
||||
struct ath12k_base *ab = ar->ab;
|
||||
struct ath12k_dp *dp = &ab->dp;
|
||||
struct sk_buff *skb;
|
||||
struct ath12k_skb_rxcb *rxcb;
|
||||
struct dp_srng *mon_dst_ring;
|
||||
struct hal_srng *srng;
|
||||
struct dp_rxdma_mon_ring *buf_ring;
|
||||
u64 cookie;
|
||||
u32 ppdu_id;
|
||||
int num_buffs_reaped = 0, srng_id, buf_id;
|
||||
u8 dest_idx = 0, i;
|
||||
bool end_of_ppdu;
|
||||
struct hal_rx_mon_ppdu_info *ppdu_info;
|
||||
struct ath12k_peer *peer = NULL;
|
||||
u8 pdev_idx = ath12k_hw_mac_id_to_pdev_id(ab->hw_params, ar->pdev_idx);
|
||||
|
||||
ppdu_info = &pmon->mon_ppdu_info;
|
||||
memset(ppdu_info, 0, sizeof(*ppdu_info));
|
||||
ppdu_info->peer_id = HAL_INVALID_PEERID;
|
||||
|
||||
srng_id = ath12k_hw_mac_id_to_srng_id(ab->hw_params, pdev_idx);
|
||||
|
||||
if (monitor_mode == ATH12K_DP_RX_MONITOR_MODE) {
|
||||
mon_dst_ring = &pdev_dp->rxdma_mon_dst_ring[srng_id];
|
||||
buf_ring = &dp->rxdma_mon_buf_ring;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
|
||||
srng = &ab->hal.srng_list[mon_dst_ring->ring_id];
|
||||
|
||||
spin_lock_bh(&srng->lock);
|
||||
ath12k_hal_srng_access_begin(ab, srng);
|
||||
|
||||
while (likely(*budget)) {
|
||||
*budget -= 1;
|
||||
mon_dst_desc = ath12k_hal_srng_dst_peek(ab, srng);
|
||||
if (unlikely(!mon_dst_desc))
|
||||
break;
|
||||
|
||||
cookie = le32_to_cpu(mon_dst_desc->cookie);
|
||||
buf_id = u32_get_bits(cookie, DP_RXDMA_BUF_COOKIE_BUF_ID);
|
||||
|
||||
spin_lock_bh(&buf_ring->idr_lock);
|
||||
skb = idr_remove(&buf_ring->bufs_idr, buf_id);
|
||||
spin_unlock_bh(&buf_ring->idr_lock);
|
||||
|
||||
if (unlikely(!skb)) {
|
||||
ath12k_warn(ab, "monitor destination with invalid buf_id %d\n",
|
||||
buf_id);
|
||||
goto move_next;
|
||||
}
|
||||
|
||||
rxcb = ATH12K_SKB_RXCB(skb);
|
||||
dma_unmap_single(ab->dev, rxcb->paddr,
|
||||
skb->len + skb_tailroom(skb),
|
||||
DMA_FROM_DEVICE);
|
||||
|
||||
pmon->dest_skb_q[dest_idx] = skb;
|
||||
dest_idx++;
|
||||
ppdu_id = le32_to_cpu(mon_dst_desc->ppdu_id);
|
||||
end_of_ppdu = le32_get_bits(mon_dst_desc->info0,
|
||||
HAL_MON_DEST_INFO0_END_OF_PPDU);
|
||||
if (!end_of_ppdu)
|
||||
continue;
|
||||
|
||||
for (i = 0; i < dest_idx; i++) {
|
||||
skb = pmon->dest_skb_q[i];
|
||||
|
||||
if (monitor_mode == ATH12K_DP_RX_MONITOR_MODE)
|
||||
ath12k_dp_mon_rx_parse_mon_status(ar, pmon,
|
||||
skb, napi);
|
||||
else
|
||||
ath12k_dp_mon_tx_parse_mon_status(ar, pmon,
|
||||
skb, napi, ppdu_id);
|
||||
|
||||
peer = ath12k_peer_find_by_id(ab, ppdu_info->peer_id);
|
||||
|
||||
if (!peer || !peer->sta) {
|
||||
ath12k_dbg(ab, ATH12K_DBG_DATA,
|
||||
"failed to find the peer with peer_id %d\n",
|
||||
ppdu_info->peer_id);
|
||||
dev_kfree_skb_any(skb);
|
||||
continue;
|
||||
}
|
||||
|
||||
dev_kfree_skb_any(skb);
|
||||
pmon->dest_skb_q[i] = NULL;
|
||||
}
|
||||
|
||||
dest_idx = 0;
|
||||
move_next:
|
||||
ath12k_dp_mon_buf_replenish(ab, buf_ring, 1);
|
||||
ath12k_hal_srng_src_get_next_entry(ab, srng);
|
||||
num_buffs_reaped++;
|
||||
}
|
||||
|
||||
ath12k_hal_srng_access_end(ab, srng);
|
||||
spin_unlock_bh(&srng->lock);
|
||||
|
||||
return num_buffs_reaped;
|
||||
}
|
||||
|
||||
static void
|
||||
ath12k_dp_mon_rx_update_peer_rate_table_stats(struct ath12k_rx_peer_stats *rx_stats,
|
||||
struct hal_rx_mon_ppdu_info *ppdu_info,
|
||||
@@ -2415,8 +2305,8 @@ ath12k_dp_mon_rx_update_peer_mu_stats(struct ath12k *ar,
|
||||
ath12k_dp_mon_rx_update_user_stats(ar, ppdu_info, i);
|
||||
}
|
||||
|
||||
int ath12k_dp_mon_rx_process_stats(struct ath12k *ar, int mac_id,
|
||||
struct napi_struct *napi, int *budget)
|
||||
int ath12k_dp_mon_srng_process(struct ath12k *ar, int *budget,
|
||||
struct napi_struct *napi)
|
||||
{
|
||||
struct ath12k_base *ab = ar->ab;
|
||||
struct ath12k_pdev_dp *pdev_dp = &ar->dp;
|
||||
@@ -2437,8 +2327,9 @@ int ath12k_dp_mon_rx_process_stats(struct ath12k *ar, int mac_id,
|
||||
u8 dest_idx = 0, i;
|
||||
bool end_of_ppdu;
|
||||
u32 hal_status;
|
||||
u8 pdev_idx = ath12k_hw_mac_id_to_pdev_id(ab->hw_params, ar->pdev_idx);
|
||||
|
||||
srng_id = ath12k_hw_mac_id_to_srng_id(ab->hw_params, mac_id);
|
||||
srng_id = ath12k_hw_mac_id_to_srng_id(ab->hw_params, pdev_idx);
|
||||
mon_dst_ring = &pdev_dp->rxdma_mon_dst_ring[srng_id];
|
||||
buf_ring = &dp->rxdma_mon_buf_ring;
|
||||
|
||||
@@ -2535,11 +2426,10 @@ int ath12k_dp_mon_process_ring(struct ath12k_base *ab, int mac_id,
|
||||
struct ath12k *ar = ath12k_ab_to_ar(ab, mac_id);
|
||||
int num_buffs_reaped = 0;
|
||||
|
||||
if (!ar->monitor_started)
|
||||
ath12k_dp_mon_rx_process_stats(ar, mac_id, napi, &budget);
|
||||
else
|
||||
num_buffs_reaped = ath12k_dp_mon_srng_process(ar, &budget,
|
||||
monitor_mode, napi);
|
||||
if (ab->hw_params->rxdma1_enable) {
|
||||
if (monitor_mode == ATH12K_DP_RX_MONITOR_MODE)
|
||||
num_buffs_reaped = ath12k_dp_mon_srng_process(ar, &budget, napi);
|
||||
}
|
||||
|
||||
return num_buffs_reaped;
|
||||
}
|
||||
|
||||
@@ -82,9 +82,6 @@ ath12k_dp_mon_rx_parse_mon_status(struct ath12k *ar,
|
||||
int ath12k_dp_mon_buf_replenish(struct ath12k_base *ab,
|
||||
struct dp_rxdma_mon_ring *buf_ring,
|
||||
int req_entries);
|
||||
int ath12k_dp_mon_srng_process(struct ath12k *ar,
|
||||
int *budget, enum dp_monitor_mode monitor_mode,
|
||||
struct napi_struct *napi);
|
||||
int ath12k_dp_mon_process_ring(struct ath12k_base *ab, int mac_id,
|
||||
struct napi_struct *napi, int budget,
|
||||
enum dp_monitor_mode monitor_mode);
|
||||
@@ -100,6 +97,5 @@ ath12k_dp_mon_tx_parse_mon_status(struct ath12k *ar,
|
||||
struct napi_struct *napi,
|
||||
u32 ppdu_id);
|
||||
void ath12k_dp_mon_rx_process_ulofdma(struct hal_rx_mon_ppdu_info *ppdu_info);
|
||||
int ath12k_dp_mon_rx_process_stats(struct ath12k *ar, int mac_id,
|
||||
struct napi_struct *napi, int *budget);
|
||||
int ath12k_dp_mon_srng_process(struct ath12k *ar, int *budget, struct napi_struct *napi);
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user