xref: /linux/drivers/net/wireless/ath/ath12k/wifi7/dp.c (revision bf4afc53b77aeaa48b5409da5c8da6bb4eff7f43)
15d2df2aaSPavankumar Nandeshwar // SPDX-License-Identifier: BSD-3-Clause-Clear
25d2df2aaSPavankumar Nandeshwar /*
35d2df2aaSPavankumar Nandeshwar  * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
45d2df2aaSPavankumar Nandeshwar  * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
55d2df2aaSPavankumar Nandeshwar  */
65d2df2aaSPavankumar Nandeshwar #include "../core.h"
75d2df2aaSPavankumar Nandeshwar #include "../debug.h"
85d2df2aaSPavankumar Nandeshwar #include "../dp_rx.h"
95d2df2aaSPavankumar Nandeshwar #include "../dp_tx.h"
10951cca9cSPavankumar Nandeshwar #include "hal_desc.h"
115d2df2aaSPavankumar Nandeshwar #include "../dp_mon.h"
1224b21a9bSAlok Singh #include "dp_mon.h"
13614c23e2SRipan Deuri #include "../dp_cmn.h"
145d2df2aaSPavankumar Nandeshwar #include "dp_rx.h"
155d2df2aaSPavankumar Nandeshwar #include "dp.h"
168527d81eSPavankumar Nandeshwar #include "dp_tx.h"
17eba935ecSPavankumar Nandeshwar #include "hal.h"
185d2df2aaSPavankumar Nandeshwar 
ath12k_wifi7_dp_service_srng(struct ath12k_dp * dp,struct ath12k_ext_irq_grp * irq_grp,int budget)1939538dc8SRipan Deuri static int ath12k_wifi7_dp_service_srng(struct ath12k_dp *dp,
205d2df2aaSPavankumar Nandeshwar 					struct ath12k_ext_irq_grp *irq_grp,
215d2df2aaSPavankumar Nandeshwar 					int budget)
225d2df2aaSPavankumar Nandeshwar {
235d2df2aaSPavankumar Nandeshwar 	struct napi_struct *napi = &irq_grp->napi;
245d2df2aaSPavankumar Nandeshwar 	int grp_id = irq_grp->grp_id;
255d2df2aaSPavankumar Nandeshwar 	int work_done = 0;
265d2df2aaSPavankumar Nandeshwar 	int i = 0, j;
275d2df2aaSPavankumar Nandeshwar 	int tot_work_done = 0;
285d2df2aaSPavankumar Nandeshwar 	enum dp_monitor_mode monitor_mode;
295d2df2aaSPavankumar Nandeshwar 	u8 ring_mask;
305d2df2aaSPavankumar Nandeshwar 
3196b42732SPavankumar Nandeshwar 	if (dp->hw_params->ring_mask->tx[grp_id]) {
3296b42732SPavankumar Nandeshwar 		i = fls(dp->hw_params->ring_mask->tx[grp_id]) - 1;
3396b42732SPavankumar Nandeshwar 		ath12k_wifi7_dp_tx_completion_handler(dp, i);
345d2df2aaSPavankumar Nandeshwar 	}
355d2df2aaSPavankumar Nandeshwar 
3696b42732SPavankumar Nandeshwar 	if (dp->hw_params->ring_mask->rx_err[grp_id]) {
3796b42732SPavankumar Nandeshwar 		work_done = ath12k_wifi7_dp_rx_process_err(dp, napi, budget);
385d2df2aaSPavankumar Nandeshwar 		budget -= work_done;
395d2df2aaSPavankumar Nandeshwar 		tot_work_done += work_done;
405d2df2aaSPavankumar Nandeshwar 		if (budget <= 0)
415d2df2aaSPavankumar Nandeshwar 			goto done;
425d2df2aaSPavankumar Nandeshwar 	}
435d2df2aaSPavankumar Nandeshwar 
4496b42732SPavankumar Nandeshwar 	if (dp->hw_params->ring_mask->rx_wbm_rel[grp_id]) {
4596b42732SPavankumar Nandeshwar 		work_done = ath12k_wifi7_dp_rx_process_wbm_err(dp, napi, budget);
465d2df2aaSPavankumar Nandeshwar 		budget -= work_done;
475d2df2aaSPavankumar Nandeshwar 		tot_work_done += work_done;
485d2df2aaSPavankumar Nandeshwar 
495d2df2aaSPavankumar Nandeshwar 		if (budget <= 0)
505d2df2aaSPavankumar Nandeshwar 			goto done;
515d2df2aaSPavankumar Nandeshwar 	}
525d2df2aaSPavankumar Nandeshwar 
5396b42732SPavankumar Nandeshwar 	if (dp->hw_params->ring_mask->rx[grp_id]) {
5496b42732SPavankumar Nandeshwar 		i = fls(dp->hw_params->ring_mask->rx[grp_id]) - 1;
5596b42732SPavankumar Nandeshwar 		work_done = ath12k_wifi7_dp_rx_process(dp, i, napi, budget);
565d2df2aaSPavankumar Nandeshwar 		budget -= work_done;
575d2df2aaSPavankumar Nandeshwar 		tot_work_done += work_done;
585d2df2aaSPavankumar Nandeshwar 		if (budget <= 0)
595d2df2aaSPavankumar Nandeshwar 			goto done;
605d2df2aaSPavankumar Nandeshwar 	}
615d2df2aaSPavankumar Nandeshwar 
6296b42732SPavankumar Nandeshwar 	if (dp->hw_params->ring_mask->rx_mon_status[grp_id]) {
6396b42732SPavankumar Nandeshwar 		ring_mask = dp->hw_params->ring_mask->rx_mon_status[grp_id];
6496b42732SPavankumar Nandeshwar 		for (i = 0; i < dp->ab->num_radios; i++) {
6596b42732SPavankumar Nandeshwar 			for (j = 0; j < dp->hw_params->num_rxdma_per_pdev; j++) {
6696b42732SPavankumar Nandeshwar 				int id = i * dp->hw_params->num_rxdma_per_pdev + j;
675d2df2aaSPavankumar Nandeshwar 
685d2df2aaSPavankumar Nandeshwar 				if (ring_mask & BIT(id)) {
695d2df2aaSPavankumar Nandeshwar 					work_done =
7024b21a9bSAlok Singh 					ath12k_wifi7_dp_mon_process_ring(dp, id, napi,
7124b21a9bSAlok Singh 									 budget,
725d2df2aaSPavankumar Nandeshwar 									 0);
735d2df2aaSPavankumar Nandeshwar 					budget -= work_done;
745d2df2aaSPavankumar Nandeshwar 					tot_work_done += work_done;
755d2df2aaSPavankumar Nandeshwar 					if (budget <= 0)
765d2df2aaSPavankumar Nandeshwar 						goto done;
775d2df2aaSPavankumar Nandeshwar 				}
785d2df2aaSPavankumar Nandeshwar 			}
795d2df2aaSPavankumar Nandeshwar 		}
805d2df2aaSPavankumar Nandeshwar 	}
815d2df2aaSPavankumar Nandeshwar 
8296b42732SPavankumar Nandeshwar 	if (dp->hw_params->ring_mask->rx_mon_dest[grp_id]) {
835d2df2aaSPavankumar Nandeshwar 		monitor_mode = ATH12K_DP_RX_MONITOR_MODE;
8496b42732SPavankumar Nandeshwar 		ring_mask = dp->hw_params->ring_mask->rx_mon_dest[grp_id];
8596b42732SPavankumar Nandeshwar 		for (i = 0; i < dp->ab->num_radios; i++) {
8696b42732SPavankumar Nandeshwar 			for (j = 0; j < dp->hw_params->num_rxdma_per_pdev; j++) {
8796b42732SPavankumar Nandeshwar 				int id = i * dp->hw_params->num_rxdma_per_pdev + j;
885d2df2aaSPavankumar Nandeshwar 
895d2df2aaSPavankumar Nandeshwar 				if (ring_mask & BIT(id)) {
905d2df2aaSPavankumar Nandeshwar 					work_done =
9124b21a9bSAlok Singh 					ath12k_wifi7_dp_mon_process_ring(dp, id, napi,
9224b21a9bSAlok Singh 									 budget,
935d2df2aaSPavankumar Nandeshwar 									 monitor_mode);
945d2df2aaSPavankumar Nandeshwar 					budget -= work_done;
955d2df2aaSPavankumar Nandeshwar 					tot_work_done += work_done;
965d2df2aaSPavankumar Nandeshwar 
975d2df2aaSPavankumar Nandeshwar 					if (budget <= 0)
985d2df2aaSPavankumar Nandeshwar 						goto done;
995d2df2aaSPavankumar Nandeshwar 				}
1005d2df2aaSPavankumar Nandeshwar 			}
1015d2df2aaSPavankumar Nandeshwar 		}
1025d2df2aaSPavankumar Nandeshwar 	}
1035d2df2aaSPavankumar Nandeshwar 
10496b42732SPavankumar Nandeshwar 	if (dp->hw_params->ring_mask->tx_mon_dest[grp_id]) {
1055d2df2aaSPavankumar Nandeshwar 		monitor_mode = ATH12K_DP_TX_MONITOR_MODE;
10696b42732SPavankumar Nandeshwar 		ring_mask = dp->hw_params->ring_mask->tx_mon_dest[grp_id];
10796b42732SPavankumar Nandeshwar 		for (i = 0; i < dp->ab->num_radios; i++) {
10896b42732SPavankumar Nandeshwar 			for (j = 0; j < dp->hw_params->num_rxdma_per_pdev; j++) {
10996b42732SPavankumar Nandeshwar 				int id = i * dp->hw_params->num_rxdma_per_pdev + j;
1105d2df2aaSPavankumar Nandeshwar 
1115d2df2aaSPavankumar Nandeshwar 				if (ring_mask & BIT(id)) {
1125d2df2aaSPavankumar Nandeshwar 					work_done =
11324b21a9bSAlok Singh 					ath12k_wifi7_dp_mon_process_ring(dp, id,
11424b21a9bSAlok Singh 									 napi, budget,
1155d2df2aaSPavankumar Nandeshwar 									 monitor_mode);
1165d2df2aaSPavankumar Nandeshwar 					budget -= work_done;
1175d2df2aaSPavankumar Nandeshwar 					tot_work_done += work_done;
1185d2df2aaSPavankumar Nandeshwar 
1195d2df2aaSPavankumar Nandeshwar 					if (budget <= 0)
1205d2df2aaSPavankumar Nandeshwar 						goto done;
1215d2df2aaSPavankumar Nandeshwar 				}
1225d2df2aaSPavankumar Nandeshwar 			}
1235d2df2aaSPavankumar Nandeshwar 		}
1245d2df2aaSPavankumar Nandeshwar 	}
1255d2df2aaSPavankumar Nandeshwar 
12696b42732SPavankumar Nandeshwar 	if (dp->hw_params->ring_mask->reo_status[grp_id])
12796b42732SPavankumar Nandeshwar 		ath12k_wifi7_dp_rx_process_reo_status(dp);
1285d2df2aaSPavankumar Nandeshwar 
12996b42732SPavankumar Nandeshwar 	if (dp->hw_params->ring_mask->host2rxdma[grp_id]) {
1305d2df2aaSPavankumar Nandeshwar 		struct dp_rxdma_ring *rx_ring = &dp->rx_refill_buf_ring;
1315d2df2aaSPavankumar Nandeshwar 		LIST_HEAD(list);
1325d2df2aaSPavankumar Nandeshwar 
13396b42732SPavankumar Nandeshwar 		ath12k_dp_rx_bufs_replenish(dp, rx_ring, &list, 0);
1345d2df2aaSPavankumar Nandeshwar 	}
1355d2df2aaSPavankumar Nandeshwar 
1365d2df2aaSPavankumar Nandeshwar 	/* TODO: Implement handler for other interrupts */
1375d2df2aaSPavankumar Nandeshwar 
1385d2df2aaSPavankumar Nandeshwar done:
1395d2df2aaSPavankumar Nandeshwar 	return tot_work_done;
1405d2df2aaSPavankumar Nandeshwar }
141614c23e2SRipan Deuri 
14239538dc8SRipan Deuri static struct ath12k_dp_arch_ops ath12k_wifi7_dp_arch_ops = {
14339538dc8SRipan Deuri 	.service_srng = ath12k_wifi7_dp_service_srng,
14473c92834SPavankumar Nandeshwar 	.tx_get_vdev_bank_config = ath12k_wifi7_dp_tx_get_vdev_bank_config,
14573c92834SPavankumar Nandeshwar 	.reo_cmd_send = ath12k_wifi7_dp_reo_cmd_send,
14673c92834SPavankumar Nandeshwar 	.setup_pn_check_reo_cmd = ath12k_wifi7_dp_setup_pn_check_reo_cmd,
14773c92834SPavankumar Nandeshwar 	.rx_peer_tid_delete = ath12k_wifi7_dp_rx_peer_tid_delete,
14873c92834SPavankumar Nandeshwar 	.reo_cache_flush = ath12k_wifi7_dp_reo_cache_flush,
14973c92834SPavankumar Nandeshwar 	.rx_link_desc_return = ath12k_wifi7_dp_rx_link_desc_return,
150d43133a3SPavankumar Nandeshwar 	.rx_frags_cleanup = ath12k_wifi7_dp_rx_frags_cleanup,
15173c92834SPavankumar Nandeshwar 	.peer_rx_tid_reo_update = ath12k_wifi7_peer_rx_tid_reo_update,
15273c92834SPavankumar Nandeshwar 	.rx_assign_reoq = ath12k_wifi7_dp_rx_assign_reoq,
15373c92834SPavankumar Nandeshwar 	.peer_rx_tid_qref_setup = ath12k_wifi7_peer_rx_tid_qref_setup,
154631ee338SJeff Johnson 	.peer_rx_tid_qref_reset = ath12k_wifi7_peer_rx_tid_qref_reset,
155631ee338SJeff Johnson 	.rx_tid_delete_handler = ath12k_wifi7_dp_rx_tid_delete_handler,
15639538dc8SRipan Deuri };
15739538dc8SRipan Deuri 
158614c23e2SRipan Deuri /* TODO: remove export once this file is built with wifi7 ko */
ath12k_wifi7_dp_device_alloc(struct ath12k_base * ab)159614c23e2SRipan Deuri struct ath12k_dp *ath12k_wifi7_dp_device_alloc(struct ath12k_base *ab)
160614c23e2SRipan Deuri {
161614c23e2SRipan Deuri 	struct ath12k_dp *dp;
162614c23e2SRipan Deuri 
163614c23e2SRipan Deuri 	/* TODO: align dp later if cache alignment becomes a bottleneck */
164*bf4afc53SLinus Torvalds 	dp = kzalloc_obj(*dp);
165614c23e2SRipan Deuri 	if (!dp)
166614c23e2SRipan Deuri 		return NULL;
167614c23e2SRipan Deuri 
168614c23e2SRipan Deuri 	dp->ab = ab;
169614c23e2SRipan Deuri 	dp->dev = ab->dev;
170614c23e2SRipan Deuri 	dp->hw_params = ab->hw_params;
171a337bff1SPavankumar Nandeshwar 	dp->hal = &ab->hal;
172614c23e2SRipan Deuri 
17339538dc8SRipan Deuri 	dp->ops = &ath12k_wifi7_dp_arch_ops;
17439538dc8SRipan Deuri 
175614c23e2SRipan Deuri 	return dp;
176614c23e2SRipan Deuri }
177614c23e2SRipan Deuri 
ath12k_wifi7_dp_device_free(struct ath12k_dp * dp)178614c23e2SRipan Deuri void ath12k_wifi7_dp_device_free(struct ath12k_dp *dp)
179614c23e2SRipan Deuri {
180614c23e2SRipan Deuri 	kfree(dp);
181614c23e2SRipan Deuri }
182