xref: /linux/drivers/net/wireless/ath/ath12k/wifi7/hw.c (revision 37a93dd5c49b5fda807fd204edf2547c3493319c)
1a7202704SKiran Venkatappa // SPDX-License-Identifier: BSD-3-Clause-Clear
2a7202704SKiran Venkatappa /*
3a7202704SKiran Venkatappa  * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
48dc72a6fSPavankumar Nandeshwar  * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
5a7202704SKiran Venkatappa  */
6a7202704SKiran Venkatappa 
7a7202704SKiran Venkatappa #include <linux/types.h>
8a7202704SKiran Venkatappa #include <linux/bitops.h>
9a7202704SKiran Venkatappa #include <linux/bitfield.h>
10a7202704SKiran Venkatappa 
11a7202704SKiran Venkatappa #include "../debug.h"
12a7202704SKiran Venkatappa #include "../core.h"
13a7202704SKiran Venkatappa #include "../ce.h"
14a7202704SKiran Venkatappa #include "ce.h"
15a7202704SKiran Venkatappa #include "../hw.h"
16a7202704SKiran Venkatappa #include "hw.h"
17a7202704SKiran Venkatappa #include "../mhi.h"
18a7202704SKiran Venkatappa #include "mhi.h"
198dc72a6fSPavankumar Nandeshwar #include "dp_rx.h"
20a7202704SKiran Venkatappa #include "../peer.h"
21a7202704SKiran Venkatappa #include "wmi.h"
22914c890dSRipan Deuri #include "../wow.h"
23914c890dSRipan Deuri #include "../debugfs.h"
24914c890dSRipan Deuri #include "../debugfs_sta.h"
25914c890dSRipan Deuri #include "../testmode.h"
2674ed243dSPavankumar Nandeshwar #include "hal.h"
27c26f294fSRipan Deuri #include "dp_tx.h"
28a7202704SKiran Venkatappa 
29a7202704SKiran Venkatappa static const guid_t wcn7850_uuid = GUID_INIT(0xf634f534, 0x6147, 0x11ec,
30a7202704SKiran Venkatappa 					     0x90, 0xd6, 0x02, 0x42,
31a7202704SKiran Venkatappa 					     0xac, 0x12, 0x00, 0x03);
32a7202704SKiran Venkatappa 
33bce3b73dSKiran Venkatappa static u8 ath12k_wifi7_hw_qcn9274_mac_from_pdev_id(int pdev_idx)
34a7202704SKiran Venkatappa {
35a7202704SKiran Venkatappa 	return pdev_idx;
36a7202704SKiran Venkatappa }
37a7202704SKiran Venkatappa 
38bce3b73dSKiran Venkatappa static int
39bce3b73dSKiran Venkatappa ath12k_wifi7_hw_mac_id_to_pdev_id_qcn9274(const struct ath12k_hw_params *hw,
40a7202704SKiran Venkatappa 					  int mac_id)
41a7202704SKiran Venkatappa {
42a7202704SKiran Venkatappa 	return mac_id;
43a7202704SKiran Venkatappa }
44a7202704SKiran Venkatappa 
45bce3b73dSKiran Venkatappa static int
46bce3b73dSKiran Venkatappa ath12k_wifi7_hw_mac_id_to_srng_id_qcn9274(const struct ath12k_hw_params *hw,
47a7202704SKiran Venkatappa 					  int mac_id)
48a7202704SKiran Venkatappa {
49a7202704SKiran Venkatappa 	return 0;
50a7202704SKiran Venkatappa }
51a7202704SKiran Venkatappa 
52bce3b73dSKiran Venkatappa static u8 ath12k_wifi7_hw_get_ring_selector_qcn9274(struct sk_buff *skb)
53a7202704SKiran Venkatappa {
54a7202704SKiran Venkatappa 	return smp_processor_id();
55a7202704SKiran Venkatappa }
56a7202704SKiran Venkatappa 
57bce3b73dSKiran Venkatappa static bool ath12k_wifi7_dp_srng_is_comp_ring_qcn9274(int ring_num)
58a7202704SKiran Venkatappa {
59a7202704SKiran Venkatappa 	if (ring_num < 3 || ring_num == 4)
60a7202704SKiran Venkatappa 		return true;
61a7202704SKiran Venkatappa 
62a7202704SKiran Venkatappa 	return false;
63a7202704SKiran Venkatappa }
64a7202704SKiran Venkatappa 
65bce3b73dSKiran Venkatappa static bool
66bce3b73dSKiran Venkatappa ath12k_wifi7_is_frame_link_agnostic_qcn9274(struct ath12k_link_vif *arvif,
67a7202704SKiran Venkatappa 					    struct ieee80211_mgmt *mgmt)
68a7202704SKiran Venkatappa {
69a7202704SKiran Venkatappa 	return ieee80211_is_action(mgmt->frame_control);
70a7202704SKiran Venkatappa }
71a7202704SKiran Venkatappa 
72bce3b73dSKiran Venkatappa static int
73bce3b73dSKiran Venkatappa ath12k_wifi7_hw_mac_id_to_pdev_id_wcn7850(const struct ath12k_hw_params *hw,
74a7202704SKiran Venkatappa 					  int mac_id)
75a7202704SKiran Venkatappa {
76a7202704SKiran Venkatappa 	return 0;
77a7202704SKiran Venkatappa }
78a7202704SKiran Venkatappa 
79bce3b73dSKiran Venkatappa static int
80bce3b73dSKiran Venkatappa ath12k_wifi7_hw_mac_id_to_srng_id_wcn7850(const struct ath12k_hw_params *hw,
81a7202704SKiran Venkatappa 					  int mac_id)
82a7202704SKiran Venkatappa {
83a7202704SKiran Venkatappa 	return mac_id;
84a7202704SKiran Venkatappa }
85a7202704SKiran Venkatappa 
86bce3b73dSKiran Venkatappa static u8 ath12k_wifi7_hw_get_ring_selector_wcn7850(struct sk_buff *skb)
87a7202704SKiran Venkatappa {
88a7202704SKiran Venkatappa 	return skb_get_queue_mapping(skb);
89a7202704SKiran Venkatappa }
90a7202704SKiran Venkatappa 
91bce3b73dSKiran Venkatappa static bool ath12k_wifi7_dp_srng_is_comp_ring_wcn7850(int ring_num)
92a7202704SKiran Venkatappa {
93a7202704SKiran Venkatappa 	if (ring_num == 0 || ring_num == 2 || ring_num == 4)
94a7202704SKiran Venkatappa 		return true;
95a7202704SKiran Venkatappa 
96a7202704SKiran Venkatappa 	return false;
97a7202704SKiran Venkatappa }
98a7202704SKiran Venkatappa 
99a7202704SKiran Venkatappa static bool ath12k_is_addba_resp_action_code(struct ieee80211_mgmt *mgmt)
100a7202704SKiran Venkatappa {
101a7202704SKiran Venkatappa 	if (!ieee80211_is_action(mgmt->frame_control))
102a7202704SKiran Venkatappa 		return false;
103a7202704SKiran Venkatappa 
104a7202704SKiran Venkatappa 	if (mgmt->u.action.category != WLAN_CATEGORY_BACK)
105a7202704SKiran Venkatappa 		return false;
106a7202704SKiran Venkatappa 
107a7202704SKiran Venkatappa 	if (mgmt->u.action.u.addba_resp.action_code != WLAN_ACTION_ADDBA_RESP)
108a7202704SKiran Venkatappa 		return false;
109a7202704SKiran Venkatappa 
110a7202704SKiran Venkatappa 	return true;
111a7202704SKiran Venkatappa }
112a7202704SKiran Venkatappa 
113bce3b73dSKiran Venkatappa static bool
114bce3b73dSKiran Venkatappa ath12k_wifi7_is_frame_link_agnostic_wcn7850(struct ath12k_link_vif *arvif,
115a7202704SKiran Venkatappa 					    struct ieee80211_mgmt *mgmt)
116a7202704SKiran Venkatappa {
117a7202704SKiran Venkatappa 	struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
118a7202704SKiran Venkatappa 	struct ath12k_hw *ah = ath12k_ar_to_ah(arvif->ar);
119a7202704SKiran Venkatappa 	struct ath12k_base *ab = arvif->ar->ab;
1200cafe8ccSHarsh Kumar Bijlani 	struct ath12k_dp *dp = ath12k_ab_to_dp(ab);
121ee16dcf5SHarsh Kumar Bijlani 	struct ath12k_dp_peer *peer;
122a7202704SKiran Venkatappa 	__le16 fc = mgmt->frame_control;
123a7202704SKiran Venkatappa 
1240cafe8ccSHarsh Kumar Bijlani 	spin_lock_bh(&dp->dp_lock);
125ee16dcf5SHarsh Kumar Bijlani 	if (!ath12k_dp_link_peer_find_by_addr(dp, mgmt->da)) {
126ee16dcf5SHarsh Kumar Bijlani 		spin_lock_bh(&ah->dp_hw.peer_lock);
127ee16dcf5SHarsh Kumar Bijlani 		peer = ath12k_dp_peer_find_by_addr(&ah->dp_hw, mgmt->da);
128ee16dcf5SHarsh Kumar Bijlani 		if (!peer || (peer && !peer->is_mlo)) {
129ee16dcf5SHarsh Kumar Bijlani 			spin_unlock_bh(&ah->dp_hw.peer_lock);
1300cafe8ccSHarsh Kumar Bijlani 			spin_unlock_bh(&dp->dp_lock);
131a7202704SKiran Venkatappa 			return false;
132a7202704SKiran Venkatappa 		}
133ee16dcf5SHarsh Kumar Bijlani 		spin_unlock_bh(&ah->dp_hw.peer_lock);
134ee16dcf5SHarsh Kumar Bijlani 	}
1350cafe8ccSHarsh Kumar Bijlani 	spin_unlock_bh(&dp->dp_lock);
136a7202704SKiran Venkatappa 
137a7202704SKiran Venkatappa 	if (vif->type == NL80211_IFTYPE_STATION)
138a7202704SKiran Venkatappa 		return arvif->is_up &&
139a7202704SKiran Venkatappa 		       (vif->valid_links == vif->active_links) &&
140a7202704SKiran Venkatappa 		       !ieee80211_is_probe_req(fc) &&
141a7202704SKiran Venkatappa 		       !ieee80211_is_auth(fc) &&
142a7202704SKiran Venkatappa 		       !ieee80211_is_deauth(fc) &&
143a7202704SKiran Venkatappa 		       !ath12k_is_addba_resp_action_code(mgmt);
144a7202704SKiran Venkatappa 
145a7202704SKiran Venkatappa 	if (vif->type == NL80211_IFTYPE_AP)
146a7202704SKiran Venkatappa 		return !(ieee80211_is_probe_resp(fc) || ieee80211_is_auth(fc) ||
147a7202704SKiran Venkatappa 			 ieee80211_is_assoc_resp(fc) || ieee80211_is_reassoc_resp(fc) ||
148a7202704SKiran Venkatappa 			 ath12k_is_addba_resp_action_code(mgmt));
149a7202704SKiran Venkatappa 
150a7202704SKiran Venkatappa 	return false;
151a7202704SKiran Venkatappa }
152a7202704SKiran Venkatappa 
153a7202704SKiran Venkatappa static const struct ath12k_hw_ops qcn9274_ops = {
154bce3b73dSKiran Venkatappa 	.get_hw_mac_from_pdev_id = ath12k_wifi7_hw_qcn9274_mac_from_pdev_id,
155bce3b73dSKiran Venkatappa 	.mac_id_to_pdev_id = ath12k_wifi7_hw_mac_id_to_pdev_id_qcn9274,
156bce3b73dSKiran Venkatappa 	.mac_id_to_srng_id = ath12k_wifi7_hw_mac_id_to_srng_id_qcn9274,
157a7202704SKiran Venkatappa 	.rxdma_ring_sel_config = ath12k_dp_rxdma_ring_sel_config_qcn9274,
158bce3b73dSKiran Venkatappa 	.get_ring_selector = ath12k_wifi7_hw_get_ring_selector_qcn9274,
159bce3b73dSKiran Venkatappa 	.dp_srng_is_tx_comp_ring = ath12k_wifi7_dp_srng_is_comp_ring_qcn9274,
160bce3b73dSKiran Venkatappa 	.is_frame_link_agnostic = ath12k_wifi7_is_frame_link_agnostic_qcn9274,
161a7202704SKiran Venkatappa };
162a7202704SKiran Venkatappa 
163a7202704SKiran Venkatappa static const struct ath12k_hw_ops wcn7850_ops = {
164bce3b73dSKiran Venkatappa 	.get_hw_mac_from_pdev_id = ath12k_wifi7_hw_qcn9274_mac_from_pdev_id,
165bce3b73dSKiran Venkatappa 	.mac_id_to_pdev_id = ath12k_wifi7_hw_mac_id_to_pdev_id_wcn7850,
166bce3b73dSKiran Venkatappa 	.mac_id_to_srng_id = ath12k_wifi7_hw_mac_id_to_srng_id_wcn7850,
167a7202704SKiran Venkatappa 	.rxdma_ring_sel_config = ath12k_dp_rxdma_ring_sel_config_wcn7850,
168bce3b73dSKiran Venkatappa 	.get_ring_selector = ath12k_wifi7_hw_get_ring_selector_wcn7850,
169bce3b73dSKiran Venkatappa 	.dp_srng_is_tx_comp_ring = ath12k_wifi7_dp_srng_is_comp_ring_wcn7850,
170bce3b73dSKiran Venkatappa 	.is_frame_link_agnostic = ath12k_wifi7_is_frame_link_agnostic_wcn7850,
171a7202704SKiran Venkatappa };
172a7202704SKiran Venkatappa 
173023ace9fSBaochen Qiang static const struct ath12k_hw_ops qcc2072_ops = {
174023ace9fSBaochen Qiang 	.get_hw_mac_from_pdev_id = ath12k_wifi7_hw_qcn9274_mac_from_pdev_id,
175023ace9fSBaochen Qiang 	.mac_id_to_pdev_id = ath12k_wifi7_hw_mac_id_to_pdev_id_wcn7850,
176023ace9fSBaochen Qiang 	.mac_id_to_srng_id = ath12k_wifi7_hw_mac_id_to_srng_id_wcn7850,
177023ace9fSBaochen Qiang 	.rxdma_ring_sel_config = ath12k_dp_rxdma_ring_sel_config_qcc2072,
178023ace9fSBaochen Qiang 	.get_ring_selector = ath12k_wifi7_hw_get_ring_selector_wcn7850,
179023ace9fSBaochen Qiang 	.dp_srng_is_tx_comp_ring = ath12k_wifi7_dp_srng_is_comp_ring_wcn7850,
180023ace9fSBaochen Qiang 	.is_frame_link_agnostic = ath12k_wifi7_is_frame_link_agnostic_wcn7850,
181023ace9fSBaochen Qiang };
182023ace9fSBaochen Qiang 
183a7202704SKiran Venkatappa #define ATH12K_TX_RING_MASK_0 0x1
184a7202704SKiran Venkatappa #define ATH12K_TX_RING_MASK_1 0x2
185a7202704SKiran Venkatappa #define ATH12K_TX_RING_MASK_2 0x4
186a7202704SKiran Venkatappa #define ATH12K_TX_RING_MASK_3 0x8
187a7202704SKiran Venkatappa #define ATH12K_TX_RING_MASK_4 0x10
188a7202704SKiran Venkatappa 
189a7202704SKiran Venkatappa #define ATH12K_RX_RING_MASK_0 0x1
190a7202704SKiran Venkatappa #define ATH12K_RX_RING_MASK_1 0x2
191a7202704SKiran Venkatappa #define ATH12K_RX_RING_MASK_2 0x4
192a7202704SKiran Venkatappa #define ATH12K_RX_RING_MASK_3 0x8
193a7202704SKiran Venkatappa 
194a7202704SKiran Venkatappa #define ATH12K_RX_ERR_RING_MASK_0 0x1
195a7202704SKiran Venkatappa 
196a7202704SKiran Venkatappa #define ATH12K_RX_WBM_REL_RING_MASK_0 0x1
197a7202704SKiran Venkatappa 
198a7202704SKiran Venkatappa #define ATH12K_REO_STATUS_RING_MASK_0 0x1
199a7202704SKiran Venkatappa 
200a7202704SKiran Venkatappa #define ATH12K_HOST2RXDMA_RING_MASK_0 0x1
201a7202704SKiran Venkatappa 
202a7202704SKiran Venkatappa #define ATH12K_RX_MON_RING_MASK_0 0x1
203a7202704SKiran Venkatappa #define ATH12K_RX_MON_RING_MASK_1 0x2
204a7202704SKiran Venkatappa #define ATH12K_RX_MON_RING_MASK_2 0x4
205a7202704SKiran Venkatappa 
206a7202704SKiran Venkatappa #define ATH12K_TX_MON_RING_MASK_0 0x1
207a7202704SKiran Venkatappa #define ATH12K_TX_MON_RING_MASK_1 0x2
208a7202704SKiran Venkatappa 
209a7202704SKiran Venkatappa #define ATH12K_RX_MON_STATUS_RING_MASK_0 0x1
210a7202704SKiran Venkatappa #define ATH12K_RX_MON_STATUS_RING_MASK_1 0x2
211a7202704SKiran Venkatappa #define ATH12K_RX_MON_STATUS_RING_MASK_2 0x4
212a7202704SKiran Venkatappa 
213bce3b73dSKiran Venkatappa static const struct ath12k_hw_ring_mask ath12k_wifi7_hw_ring_mask_qcn9274 = {
214a7202704SKiran Venkatappa 	.tx  = {
215a7202704SKiran Venkatappa 		ATH12K_TX_RING_MASK_0,
216a7202704SKiran Venkatappa 		ATH12K_TX_RING_MASK_1,
217a7202704SKiran Venkatappa 		ATH12K_TX_RING_MASK_2,
218a7202704SKiran Venkatappa 		ATH12K_TX_RING_MASK_3,
219a7202704SKiran Venkatappa 	},
220a7202704SKiran Venkatappa 	.rx_mon_dest = {
221a7202704SKiran Venkatappa 		0, 0, 0, 0,
222a7202704SKiran Venkatappa 		0, 0, 0, 0,
223a7202704SKiran Venkatappa 		ATH12K_RX_MON_RING_MASK_0,
224a7202704SKiran Venkatappa 		ATH12K_RX_MON_RING_MASK_1,
225a7202704SKiran Venkatappa 		ATH12K_RX_MON_RING_MASK_2,
226a7202704SKiran Venkatappa 	},
227a7202704SKiran Venkatappa 	.rx = {
228a7202704SKiran Venkatappa 		0, 0, 0, 0,
229a7202704SKiran Venkatappa 		ATH12K_RX_RING_MASK_0,
230a7202704SKiran Venkatappa 		ATH12K_RX_RING_MASK_1,
231a7202704SKiran Venkatappa 		ATH12K_RX_RING_MASK_2,
232a7202704SKiran Venkatappa 		ATH12K_RX_RING_MASK_3,
233a7202704SKiran Venkatappa 	},
234a7202704SKiran Venkatappa 	.rx_err = {
235a7202704SKiran Venkatappa 		0, 0, 0,
236a7202704SKiran Venkatappa 		ATH12K_RX_ERR_RING_MASK_0,
237a7202704SKiran Venkatappa 	},
238a7202704SKiran Venkatappa 	.rx_wbm_rel = {
239a7202704SKiran Venkatappa 		0, 0, 0,
240a7202704SKiran Venkatappa 		ATH12K_RX_WBM_REL_RING_MASK_0,
241a7202704SKiran Venkatappa 	},
242a7202704SKiran Venkatappa 	.reo_status = {
243a7202704SKiran Venkatappa 		0, 0, 0,
244a7202704SKiran Venkatappa 		ATH12K_REO_STATUS_RING_MASK_0,
245a7202704SKiran Venkatappa 	},
246a7202704SKiran Venkatappa 	.host2rxdma = {
247a7202704SKiran Venkatappa 		0, 0, 0,
248a7202704SKiran Venkatappa 		ATH12K_HOST2RXDMA_RING_MASK_0,
249a7202704SKiran Venkatappa 	},
250a7202704SKiran Venkatappa 	.tx_mon_dest = {
251a7202704SKiran Venkatappa 		0, 0, 0,
252a7202704SKiran Venkatappa 	},
253a7202704SKiran Venkatappa };
254a7202704SKiran Venkatappa 
255bce3b73dSKiran Venkatappa static const struct ath12k_hw_ring_mask ath12k_wifi7_hw_ring_mask_ipq5332 = {
256a7202704SKiran Venkatappa 	.tx  = {
257a7202704SKiran Venkatappa 		ATH12K_TX_RING_MASK_0,
258a7202704SKiran Venkatappa 		ATH12K_TX_RING_MASK_1,
259a7202704SKiran Venkatappa 		ATH12K_TX_RING_MASK_2,
260a7202704SKiran Venkatappa 		ATH12K_TX_RING_MASK_3,
261a7202704SKiran Venkatappa 	},
262a7202704SKiran Venkatappa 	.rx_mon_dest = {
263a7202704SKiran Venkatappa 		0, 0, 0, 0, 0, 0, 0, 0,
264a7202704SKiran Venkatappa 		ATH12K_RX_MON_RING_MASK_0,
265a7202704SKiran Venkatappa 	},
266a7202704SKiran Venkatappa 	.rx = {
267a7202704SKiran Venkatappa 		0, 0, 0, 0,
268a7202704SKiran Venkatappa 		ATH12K_RX_RING_MASK_0,
269a7202704SKiran Venkatappa 		ATH12K_RX_RING_MASK_1,
270a7202704SKiran Venkatappa 		ATH12K_RX_RING_MASK_2,
271a7202704SKiran Venkatappa 		ATH12K_RX_RING_MASK_3,
272a7202704SKiran Venkatappa 	},
273a7202704SKiran Venkatappa 	.rx_err = {
274a7202704SKiran Venkatappa 		0, 0, 0,
275a7202704SKiran Venkatappa 		ATH12K_RX_ERR_RING_MASK_0,
276a7202704SKiran Venkatappa 	},
277a7202704SKiran Venkatappa 	.rx_wbm_rel = {
278a7202704SKiran Venkatappa 		0, 0, 0,
279a7202704SKiran Venkatappa 		ATH12K_RX_WBM_REL_RING_MASK_0,
280a7202704SKiran Venkatappa 	},
281a7202704SKiran Venkatappa 	.reo_status = {
282a7202704SKiran Venkatappa 		0, 0, 0,
283a7202704SKiran Venkatappa 		ATH12K_REO_STATUS_RING_MASK_0,
284a7202704SKiran Venkatappa 	},
285a7202704SKiran Venkatappa 	.host2rxdma = {
286a7202704SKiran Venkatappa 		0, 0, 0,
287a7202704SKiran Venkatappa 		ATH12K_HOST2RXDMA_RING_MASK_0,
288a7202704SKiran Venkatappa 	},
289a7202704SKiran Venkatappa 	.tx_mon_dest = {
290a7202704SKiran Venkatappa 		ATH12K_TX_MON_RING_MASK_0,
291a7202704SKiran Venkatappa 		ATH12K_TX_MON_RING_MASK_1,
292a7202704SKiran Venkatappa 	},
293a7202704SKiran Venkatappa };
294a7202704SKiran Venkatappa 
295bce3b73dSKiran Venkatappa static const struct ath12k_hw_ring_mask ath12k_wifi7_hw_ring_mask_wcn7850 = {
296a7202704SKiran Venkatappa 	.tx  = {
297a7202704SKiran Venkatappa 		ATH12K_TX_RING_MASK_0,
298a7202704SKiran Venkatappa 		ATH12K_TX_RING_MASK_1,
299a7202704SKiran Venkatappa 		ATH12K_TX_RING_MASK_2,
300a7202704SKiran Venkatappa 	},
301a7202704SKiran Venkatappa 	.rx_mon_dest = {
302a7202704SKiran Venkatappa 	},
303a7202704SKiran Venkatappa 	.rx_mon_status = {
304a7202704SKiran Venkatappa 		0, 0, 0, 0,
305a7202704SKiran Venkatappa 		ATH12K_RX_MON_STATUS_RING_MASK_0,
306a7202704SKiran Venkatappa 		ATH12K_RX_MON_STATUS_RING_MASK_1,
307a7202704SKiran Venkatappa 		ATH12K_RX_MON_STATUS_RING_MASK_2,
308a7202704SKiran Venkatappa 	},
309a7202704SKiran Venkatappa 	.rx = {
310a7202704SKiran Venkatappa 		0, 0, 0,
311a7202704SKiran Venkatappa 		ATH12K_RX_RING_MASK_0,
312a7202704SKiran Venkatappa 		ATH12K_RX_RING_MASK_1,
313a7202704SKiran Venkatappa 		ATH12K_RX_RING_MASK_2,
314a7202704SKiran Venkatappa 		ATH12K_RX_RING_MASK_3,
315a7202704SKiran Venkatappa 	},
316a7202704SKiran Venkatappa 	.rx_err = {
317a7202704SKiran Venkatappa 		ATH12K_RX_ERR_RING_MASK_0,
318a7202704SKiran Venkatappa 	},
319a7202704SKiran Venkatappa 	.rx_wbm_rel = {
320a7202704SKiran Venkatappa 		ATH12K_RX_WBM_REL_RING_MASK_0,
321a7202704SKiran Venkatappa 	},
322a7202704SKiran Venkatappa 	.reo_status = {
323a7202704SKiran Venkatappa 		ATH12K_REO_STATUS_RING_MASK_0,
324a7202704SKiran Venkatappa 	},
325a7202704SKiran Venkatappa 	.host2rxdma = {
326a7202704SKiran Venkatappa 	},
327a7202704SKiran Venkatappa 	.tx_mon_dest = {
328a7202704SKiran Venkatappa 	},
329a7202704SKiran Venkatappa };
330a7202704SKiran Venkatappa 
331bce3b73dSKiran Venkatappa static const struct ce_ie_addr ath12k_wifi7_ce_ie_addr_ipq5332 = {
332a7202704SKiran Venkatappa 	.ie1_reg_addr = CE_HOST_IE_ADDRESS - HAL_IPQ5332_CE_WFSS_REG_BASE,
333a7202704SKiran Venkatappa 	.ie2_reg_addr = CE_HOST_IE_2_ADDRESS - HAL_IPQ5332_CE_WFSS_REG_BASE,
334a7202704SKiran Venkatappa 	.ie3_reg_addr = CE_HOST_IE_3_ADDRESS - HAL_IPQ5332_CE_WFSS_REG_BASE,
335a7202704SKiran Venkatappa };
336a7202704SKiran Venkatappa 
337bce3b73dSKiran Venkatappa static const struct ce_remap ath12k_wifi7_ce_remap_ipq5332 = {
338a7202704SKiran Venkatappa 	.base = HAL_IPQ5332_CE_WFSS_REG_BASE,
339a7202704SKiran Venkatappa 	.size = HAL_IPQ5332_CE_SIZE,
3400e487f03SKiran Venkatappa 	.cmem_offset = HAL_SEQ_WCSS_CMEM_OFFSET,
341a7202704SKiran Venkatappa };
342a7202704SKiran Venkatappa 
343bce3b73dSKiran Venkatappa static const struct ath12k_hw_params ath12k_wifi7_hw_params[] = {
344a7202704SKiran Venkatappa 	{
345a7202704SKiran Venkatappa 		.name = "qcn9274 hw1.0",
346a7202704SKiran Venkatappa 		.hw_rev = ATH12K_HW_QCN9274_HW10,
347a7202704SKiran Venkatappa 		.fw = {
348a7202704SKiran Venkatappa 			.dir = "QCN9274/hw1.0",
349a7202704SKiran Venkatappa 			.board_size = 256 * 1024,
350a7202704SKiran Venkatappa 			.cal_offset = 128 * 1024,
351a7202704SKiran Venkatappa 			.m3_loader = ath12k_m3_fw_loader_driver,
352b065ccf4SBaochen Qiang 			.download_aux_ucode = false,
353a7202704SKiran Venkatappa 		},
354a7202704SKiran Venkatappa 		.max_radios = 1,
355a7202704SKiran Venkatappa 		.single_pdev_only = false,
356a7202704SKiran Venkatappa 		.qmi_service_ins_id = ATH12K_QMI_WLFW_SERVICE_INS_ID_V01_QCN9274,
357a7202704SKiran Venkatappa 		.internal_sleep_clock = false,
358a7202704SKiran Venkatappa 
359a7202704SKiran Venkatappa 		.hw_ops = &qcn9274_ops,
360bce3b73dSKiran Venkatappa 		.ring_mask = &ath12k_wifi7_hw_ring_mask_qcn9274,
361a7202704SKiran Venkatappa 
362bce3b73dSKiran Venkatappa 		.host_ce_config = ath12k_wifi7_host_ce_config_qcn9274,
363a7202704SKiran Venkatappa 		.ce_count = 16,
364bce3b73dSKiran Venkatappa 		.target_ce_config = ath12k_wifi7_target_ce_config_wlan_qcn9274,
365a7202704SKiran Venkatappa 		.target_ce_count = 12,
366bce3b73dSKiran Venkatappa 		.svc_to_ce_map =
367bce3b73dSKiran Venkatappa 			ath12k_wifi7_target_service_to_ce_map_wlan_qcn9274,
368a7202704SKiran Venkatappa 		.svc_to_ce_map_len = 18,
369a7202704SKiran Venkatappa 
370a7202704SKiran Venkatappa 		.rxdma1_enable = false,
371a7202704SKiran Venkatappa 		.num_rxdma_per_pdev = 1,
372a7202704SKiran Venkatappa 		.num_rxdma_dst_ring = 0,
373a7202704SKiran Venkatappa 		.rx_mac_buf_ring = false,
374a7202704SKiran Venkatappa 		.vdev_start_delay = false,
375a7202704SKiran Venkatappa 
376a7202704SKiran Venkatappa 		.interface_modes = BIT(NL80211_IFTYPE_STATION) |
377a7202704SKiran Venkatappa 					BIT(NL80211_IFTYPE_AP) |
378a7202704SKiran Venkatappa 					BIT(NL80211_IFTYPE_MESH_POINT) |
379a7202704SKiran Venkatappa 					BIT(NL80211_IFTYPE_AP_VLAN),
380a7202704SKiran Venkatappa 		.supports_monitor = false,
381a7202704SKiran Venkatappa 
382a7202704SKiran Venkatappa 		.idle_ps = false,
383a7202704SKiran Venkatappa 		.download_calib = true,
384a7202704SKiran Venkatappa 		.supports_suspend = false,
385a7202704SKiran Venkatappa 		.tcl_ring_retry = true,
386a7202704SKiran Venkatappa 		.reoq_lut_support = true,
387a7202704SKiran Venkatappa 		.supports_shadow_regs = false,
388a7202704SKiran Venkatappa 
389a7202704SKiran Venkatappa 		.num_tcl_banks = 48,
390a7202704SKiran Venkatappa 		.max_tx_ring = 4,
391a7202704SKiran Venkatappa 
392bce3b73dSKiran Venkatappa 		.mhi_config = &ath12k_wifi7_mhi_config_qcn9274,
393a7202704SKiran Venkatappa 
394bce3b73dSKiran Venkatappa 		.wmi_init = ath12k_wifi7_wmi_init_qcn9274,
395a7202704SKiran Venkatappa 
396a7202704SKiran Venkatappa 		.qmi_cnss_feature_bitmap = BIT(CNSS_QDSS_CFG_MISS_V01),
397a7202704SKiran Venkatappa 
398a7202704SKiran Venkatappa 		.rfkill_pin = 0,
399a7202704SKiran Venkatappa 		.rfkill_cfg = 0,
400a7202704SKiran Venkatappa 		.rfkill_on_level = 0,
401a7202704SKiran Venkatappa 
402a7202704SKiran Venkatappa 		.rddm_size = 0x600000,
403a7202704SKiran Venkatappa 
404a7202704SKiran Venkatappa 		.def_num_link = 0,
405a7202704SKiran Venkatappa 		.max_mlo_peer = 256,
406a7202704SKiran Venkatappa 
407a7202704SKiran Venkatappa 		.otp_board_id_register = QCN9274_QFPROM_RAW_RFA_PDET_ROW13_LSB,
408a7202704SKiran Venkatappa 
409a7202704SKiran Venkatappa 		.supports_sta_ps = false,
410a7202704SKiran Venkatappa 
411a7202704SKiran Venkatappa 		.acpi_guid = NULL,
412a7202704SKiran Venkatappa 		.supports_dynamic_smps_6ghz = true,
413a7202704SKiran Venkatappa 
414a7202704SKiran Venkatappa 		.iova_mask = 0,
415a7202704SKiran Venkatappa 
416a7202704SKiran Venkatappa 		.supports_aspm = false,
417a7202704SKiran Venkatappa 
418a7202704SKiran Venkatappa 		.ce_ie_addr = NULL,
419a7202704SKiran Venkatappa 		.ce_remap = NULL,
420a7202704SKiran Venkatappa 		.bdf_addr_offset = 0,
421a7202704SKiran Venkatappa 
422a7202704SKiran Venkatappa 		.current_cc_support = false,
423a7202704SKiran Venkatappa 
424a7202704SKiran Venkatappa 		.dp_primary_link_only = true,
425a7202704SKiran Venkatappa 	},
426a7202704SKiran Venkatappa 	{
427a7202704SKiran Venkatappa 		.name = "wcn7850 hw2.0",
428a7202704SKiran Venkatappa 		.hw_rev = ATH12K_HW_WCN7850_HW20,
429a7202704SKiran Venkatappa 
430a7202704SKiran Venkatappa 		.fw = {
431a7202704SKiran Venkatappa 			.dir = "WCN7850/hw2.0",
432a7202704SKiran Venkatappa 			.board_size = 256 * 1024,
433a7202704SKiran Venkatappa 			.cal_offset = 256 * 1024,
434a7202704SKiran Venkatappa 			.m3_loader = ath12k_m3_fw_loader_driver,
435b065ccf4SBaochen Qiang 			.download_aux_ucode = false,
436a7202704SKiran Venkatappa 		},
437a7202704SKiran Venkatappa 
438a7202704SKiran Venkatappa 		.max_radios = 1,
439a7202704SKiran Venkatappa 		.single_pdev_only = true,
440a7202704SKiran Venkatappa 		.qmi_service_ins_id = ATH12K_QMI_WLFW_SERVICE_INS_ID_V01_WCN7850,
441a7202704SKiran Venkatappa 		.internal_sleep_clock = true,
442a7202704SKiran Venkatappa 
443a7202704SKiran Venkatappa 		.hw_ops = &wcn7850_ops,
444bce3b73dSKiran Venkatappa 		.ring_mask = &ath12k_wifi7_hw_ring_mask_wcn7850,
445a7202704SKiran Venkatappa 
446bce3b73dSKiran Venkatappa 		.host_ce_config = ath12k_wifi7_host_ce_config_wcn7850,
447a7202704SKiran Venkatappa 		.ce_count = 9,
448bce3b73dSKiran Venkatappa 		.target_ce_config = ath12k_wifi7_target_ce_config_wlan_wcn7850,
449a7202704SKiran Venkatappa 		.target_ce_count = 9,
450bce3b73dSKiran Venkatappa 		.svc_to_ce_map =
451bce3b73dSKiran Venkatappa 			ath12k_wifi7_target_service_to_ce_map_wlan_wcn7850,
452a7202704SKiran Venkatappa 		.svc_to_ce_map_len = 14,
453a7202704SKiran Venkatappa 
454a7202704SKiran Venkatappa 		.rxdma1_enable = false,
455a7202704SKiran Venkatappa 		.num_rxdma_per_pdev = 2,
456a7202704SKiran Venkatappa 		.num_rxdma_dst_ring = 1,
457a7202704SKiran Venkatappa 		.rx_mac_buf_ring = true,
458a7202704SKiran Venkatappa 		.vdev_start_delay = true,
459a7202704SKiran Venkatappa 
460a7202704SKiran Venkatappa 		.interface_modes = BIT(NL80211_IFTYPE_STATION) |
461a7202704SKiran Venkatappa 				   BIT(NL80211_IFTYPE_AP) |
462a7202704SKiran Venkatappa 				   BIT(NL80211_IFTYPE_P2P_DEVICE) |
463a7202704SKiran Venkatappa 				   BIT(NL80211_IFTYPE_P2P_CLIENT) |
464a7202704SKiran Venkatappa 				   BIT(NL80211_IFTYPE_P2P_GO),
465a7202704SKiran Venkatappa 		.supports_monitor = true,
466a7202704SKiran Venkatappa 
467a7202704SKiran Venkatappa 		.idle_ps = true,
468a7202704SKiran Venkatappa 		.download_calib = false,
469a7202704SKiran Venkatappa 		.supports_suspend = true,
470a7202704SKiran Venkatappa 		.tcl_ring_retry = false,
471a7202704SKiran Venkatappa 		.reoq_lut_support = false,
472a7202704SKiran Venkatappa 		.supports_shadow_regs = true,
473a7202704SKiran Venkatappa 
474a7202704SKiran Venkatappa 		.num_tcl_banks = 7,
475a7202704SKiran Venkatappa 		.max_tx_ring = 3,
476a7202704SKiran Venkatappa 
477bce3b73dSKiran Venkatappa 		.mhi_config = &ath12k_wifi7_mhi_config_wcn7850,
478a7202704SKiran Venkatappa 
479bce3b73dSKiran Venkatappa 		.wmi_init = ath12k_wifi7_wmi_init_wcn7850,
480a7202704SKiran Venkatappa 
481a7202704SKiran Venkatappa 		.qmi_cnss_feature_bitmap = BIT(CNSS_QDSS_CFG_MISS_V01) |
482a7202704SKiran Venkatappa 					   BIT(CNSS_PCIE_PERST_NO_PULL_V01),
483a7202704SKiran Venkatappa 
484a7202704SKiran Venkatappa 		.rfkill_pin = 48,
485a7202704SKiran Venkatappa 		.rfkill_cfg = 0,
486a7202704SKiran Venkatappa 		.rfkill_on_level = 1,
487a7202704SKiran Venkatappa 
488a7202704SKiran Venkatappa 		.rddm_size = 0x780000,
489a7202704SKiran Venkatappa 
490a7202704SKiran Venkatappa 		.def_num_link = 2,
491a7202704SKiran Venkatappa 		.max_mlo_peer = 32,
492a7202704SKiran Venkatappa 
493a7202704SKiran Venkatappa 		.otp_board_id_register = 0,
494a7202704SKiran Venkatappa 
495a7202704SKiran Venkatappa 		.supports_sta_ps = true,
496a7202704SKiran Venkatappa 
497a7202704SKiran Venkatappa 		.acpi_guid = &wcn7850_uuid,
498a7202704SKiran Venkatappa 		.supports_dynamic_smps_6ghz = false,
499a7202704SKiran Venkatappa 
500a7202704SKiran Venkatappa 		.iova_mask = ATH12K_PCIE_MAX_PAYLOAD_SIZE - 1,
501a7202704SKiran Venkatappa 
502a7202704SKiran Venkatappa 		.supports_aspm = true,
503a7202704SKiran Venkatappa 
504a7202704SKiran Venkatappa 		.ce_ie_addr = NULL,
505a7202704SKiran Venkatappa 		.ce_remap = NULL,
506a7202704SKiran Venkatappa 		.bdf_addr_offset = 0,
507a7202704SKiran Venkatappa 
508a7202704SKiran Venkatappa 		.current_cc_support = true,
509a7202704SKiran Venkatappa 
510a7202704SKiran Venkatappa 		.dp_primary_link_only = false,
511a7202704SKiran Venkatappa 	},
512a7202704SKiran Venkatappa 	{
513a7202704SKiran Venkatappa 		.name = "qcn9274 hw2.0",
514a7202704SKiran Venkatappa 		.hw_rev = ATH12K_HW_QCN9274_HW20,
515a7202704SKiran Venkatappa 		.fw = {
516a7202704SKiran Venkatappa 			.dir = "QCN9274/hw2.0",
517a7202704SKiran Venkatappa 			.board_size = 256 * 1024,
518a7202704SKiran Venkatappa 			.cal_offset = 128 * 1024,
519a7202704SKiran Venkatappa 			.m3_loader = ath12k_m3_fw_loader_driver,
520b065ccf4SBaochen Qiang 			.download_aux_ucode = false,
521a7202704SKiran Venkatappa 		},
522a7202704SKiran Venkatappa 		.max_radios = 2,
523a7202704SKiran Venkatappa 		.single_pdev_only = false,
524a7202704SKiran Venkatappa 		.qmi_service_ins_id = ATH12K_QMI_WLFW_SERVICE_INS_ID_V01_QCN9274,
525a7202704SKiran Venkatappa 		.internal_sleep_clock = false,
526a7202704SKiran Venkatappa 
527a7202704SKiran Venkatappa 		.hw_ops = &qcn9274_ops,
528bce3b73dSKiran Venkatappa 		.ring_mask = &ath12k_wifi7_hw_ring_mask_qcn9274,
529a7202704SKiran Venkatappa 
530bce3b73dSKiran Venkatappa 		.host_ce_config = ath12k_wifi7_host_ce_config_qcn9274,
531a7202704SKiran Venkatappa 		.ce_count = 16,
532bce3b73dSKiran Venkatappa 		.target_ce_config = ath12k_wifi7_target_ce_config_wlan_qcn9274,
533a7202704SKiran Venkatappa 		.target_ce_count = 12,
534bce3b73dSKiran Venkatappa 		.svc_to_ce_map =
535bce3b73dSKiran Venkatappa 			ath12k_wifi7_target_service_to_ce_map_wlan_qcn9274,
536a7202704SKiran Venkatappa 		.svc_to_ce_map_len = 18,
537a7202704SKiran Venkatappa 
538a7202704SKiran Venkatappa 		.rxdma1_enable = true,
539a7202704SKiran Venkatappa 		.num_rxdma_per_pdev = 1,
540a7202704SKiran Venkatappa 		.num_rxdma_dst_ring = 0,
541a7202704SKiran Venkatappa 		.rx_mac_buf_ring = false,
542a7202704SKiran Venkatappa 		.vdev_start_delay = false,
543a7202704SKiran Venkatappa 
544a7202704SKiran Venkatappa 		.interface_modes = BIT(NL80211_IFTYPE_STATION) |
545a7202704SKiran Venkatappa 					BIT(NL80211_IFTYPE_AP) |
546a7202704SKiran Venkatappa 					BIT(NL80211_IFTYPE_MESH_POINT) |
547a7202704SKiran Venkatappa 					BIT(NL80211_IFTYPE_AP_VLAN),
548a7202704SKiran Venkatappa 		.supports_monitor = true,
549a7202704SKiran Venkatappa 
550a7202704SKiran Venkatappa 		.idle_ps = false,
551a7202704SKiran Venkatappa 		.download_calib = true,
552a7202704SKiran Venkatappa 		.supports_suspend = false,
553a7202704SKiran Venkatappa 		.tcl_ring_retry = true,
554a7202704SKiran Venkatappa 		.reoq_lut_support = true,
555a7202704SKiran Venkatappa 		.supports_shadow_regs = false,
556a7202704SKiran Venkatappa 
557a7202704SKiran Venkatappa 		.num_tcl_banks = 48,
558a7202704SKiran Venkatappa 		.max_tx_ring = 4,
559a7202704SKiran Venkatappa 
560bce3b73dSKiran Venkatappa 		.mhi_config = &ath12k_wifi7_mhi_config_qcn9274,
561a7202704SKiran Venkatappa 
562bce3b73dSKiran Venkatappa 		.wmi_init = ath12k_wifi7_wmi_init_qcn9274,
563a7202704SKiran Venkatappa 
564a7202704SKiran Venkatappa 		.qmi_cnss_feature_bitmap = BIT(CNSS_QDSS_CFG_MISS_V01),
565a7202704SKiran Venkatappa 
566a7202704SKiran Venkatappa 		.rfkill_pin = 0,
567a7202704SKiran Venkatappa 		.rfkill_cfg = 0,
568a7202704SKiran Venkatappa 		.rfkill_on_level = 0,
569a7202704SKiran Venkatappa 
570a7202704SKiran Venkatappa 		.rddm_size = 0x600000,
571a7202704SKiran Venkatappa 
572a7202704SKiran Venkatappa 		.def_num_link = 0,
573a7202704SKiran Venkatappa 		.max_mlo_peer = 256,
574a7202704SKiran Venkatappa 
575a7202704SKiran Venkatappa 		.otp_board_id_register = QCN9274_QFPROM_RAW_RFA_PDET_ROW13_LSB,
576a7202704SKiran Venkatappa 
577a7202704SKiran Venkatappa 		.supports_sta_ps = false,
578a7202704SKiran Venkatappa 
579a7202704SKiran Venkatappa 		.acpi_guid = NULL,
580a7202704SKiran Venkatappa 		.supports_dynamic_smps_6ghz = true,
581a7202704SKiran Venkatappa 
582a7202704SKiran Venkatappa 		.iova_mask = 0,
583a7202704SKiran Venkatappa 
584a7202704SKiran Venkatappa 		.supports_aspm = false,
585a7202704SKiran Venkatappa 
586a7202704SKiran Venkatappa 		.ce_ie_addr = NULL,
587a7202704SKiran Venkatappa 		.ce_remap = NULL,
588a7202704SKiran Venkatappa 		.bdf_addr_offset = 0,
589a7202704SKiran Venkatappa 
590a7202704SKiran Venkatappa 		.current_cc_support = false,
591a7202704SKiran Venkatappa 
592a7202704SKiran Venkatappa 		.dp_primary_link_only = true,
593a7202704SKiran Venkatappa 	},
594a7202704SKiran Venkatappa 	{
595a7202704SKiran Venkatappa 		.name = "ipq5332 hw1.0",
596a7202704SKiran Venkatappa 		.hw_rev = ATH12K_HW_IPQ5332_HW10,
597a7202704SKiran Venkatappa 		.fw = {
598a7202704SKiran Venkatappa 			.dir = "IPQ5332/hw1.0",
599a7202704SKiran Venkatappa 			.board_size = 256 * 1024,
600a7202704SKiran Venkatappa 			.cal_offset = 128 * 1024,
601a7202704SKiran Venkatappa 			.m3_loader = ath12k_m3_fw_loader_remoteproc,
602b065ccf4SBaochen Qiang 			.download_aux_ucode = false,
603a7202704SKiran Venkatappa 		},
604a7202704SKiran Venkatappa 		.max_radios = 1,
605a7202704SKiran Venkatappa 		.single_pdev_only = false,
606a7202704SKiran Venkatappa 		.qmi_service_ins_id = ATH12K_QMI_WLFW_SERVICE_INS_ID_V01_IPQ5332,
607a7202704SKiran Venkatappa 		.internal_sleep_clock = false,
608a7202704SKiran Venkatappa 
609a7202704SKiran Venkatappa 		.hw_ops = &qcn9274_ops,
610bce3b73dSKiran Venkatappa 		.ring_mask = &ath12k_wifi7_hw_ring_mask_ipq5332,
611a7202704SKiran Venkatappa 
612bce3b73dSKiran Venkatappa 		.host_ce_config = ath12k_wifi7_host_ce_config_ipq5332,
613a7202704SKiran Venkatappa 		.ce_count = 12,
614bce3b73dSKiran Venkatappa 		.target_ce_config = ath12k_wifi7_target_ce_config_wlan_ipq5332,
615a7202704SKiran Venkatappa 		.target_ce_count = 12,
616bce3b73dSKiran Venkatappa 		.svc_to_ce_map =
617bce3b73dSKiran Venkatappa 			ath12k_wifi7_target_service_to_ce_map_wlan_ipq5332,
618a7202704SKiran Venkatappa 		.svc_to_ce_map_len = 18,
619a7202704SKiran Venkatappa 
620a7202704SKiran Venkatappa 		.rxdma1_enable = false,
621a7202704SKiran Venkatappa 		.num_rxdma_per_pdev = 1,
622a7202704SKiran Venkatappa 		.num_rxdma_dst_ring = 0,
623a7202704SKiran Venkatappa 		.rx_mac_buf_ring = false,
624a7202704SKiran Venkatappa 		.vdev_start_delay = false,
625a7202704SKiran Venkatappa 
626a7202704SKiran Venkatappa 		.interface_modes = BIT(NL80211_IFTYPE_STATION) |
627a7202704SKiran Venkatappa 				   BIT(NL80211_IFTYPE_AP) |
628a7202704SKiran Venkatappa 				   BIT(NL80211_IFTYPE_MESH_POINT),
629a7202704SKiran Venkatappa 		.supports_monitor = false,
630a7202704SKiran Venkatappa 
631a7202704SKiran Venkatappa 		.idle_ps = false,
632a7202704SKiran Venkatappa 		.download_calib = true,
633a7202704SKiran Venkatappa 		.supports_suspend = false,
634a7202704SKiran Venkatappa 		.tcl_ring_retry = true,
635a7202704SKiran Venkatappa 		.reoq_lut_support = false,
636a7202704SKiran Venkatappa 		.supports_shadow_regs = false,
637a7202704SKiran Venkatappa 
638a7202704SKiran Venkatappa 		.num_tcl_banks = 48,
639a7202704SKiran Venkatappa 		.max_tx_ring = 4,
640a7202704SKiran Venkatappa 
641bce3b73dSKiran Venkatappa 		.wmi_init = &ath12k_wifi7_wmi_init_qcn9274,
642a7202704SKiran Venkatappa 
643a7202704SKiran Venkatappa 		.qmi_cnss_feature_bitmap = BIT(CNSS_QDSS_CFG_MISS_V01),
644a7202704SKiran Venkatappa 
645a7202704SKiran Venkatappa 		.rfkill_pin = 0,
646a7202704SKiran Venkatappa 		.rfkill_cfg = 0,
647a7202704SKiran Venkatappa 		.rfkill_on_level = 0,
648a7202704SKiran Venkatappa 
649a7202704SKiran Venkatappa 		.rddm_size = 0,
650a7202704SKiran Venkatappa 
651a7202704SKiran Venkatappa 		.def_num_link = 0,
652a7202704SKiran Venkatappa 		.max_mlo_peer = 256,
653a7202704SKiran Venkatappa 
654a7202704SKiran Venkatappa 		.otp_board_id_register = 0,
655a7202704SKiran Venkatappa 
656a7202704SKiran Venkatappa 		.supports_sta_ps = false,
657a7202704SKiran Venkatappa 
658a7202704SKiran Venkatappa 		.acpi_guid = NULL,
659a7202704SKiran Venkatappa 		.supports_dynamic_smps_6ghz = false,
660a7202704SKiran Venkatappa 		.iova_mask = 0,
661a7202704SKiran Venkatappa 		.supports_aspm = false,
662a7202704SKiran Venkatappa 
663bce3b73dSKiran Venkatappa 		.ce_ie_addr = &ath12k_wifi7_ce_ie_addr_ipq5332,
664bce3b73dSKiran Venkatappa 		.ce_remap = &ath12k_wifi7_ce_remap_ipq5332,
665a7202704SKiran Venkatappa 		.bdf_addr_offset = 0xC00000,
666a7202704SKiran Venkatappa 
667a7202704SKiran Venkatappa 		.dp_primary_link_only = true,
668a7202704SKiran Venkatappa 	},
66912048e2cSBaochen Qiang 	{
67012048e2cSBaochen Qiang 		.name = "qcc2072 hw1.0",
67112048e2cSBaochen Qiang 		.hw_rev = ATH12K_HW_QCC2072_HW10,
67212048e2cSBaochen Qiang 
67312048e2cSBaochen Qiang 		.fw = {
67412048e2cSBaochen Qiang 			.dir = "QCC2072/hw1.0",
67512048e2cSBaochen Qiang 			.board_size = 256 * 1024,
67612048e2cSBaochen Qiang 			.cal_offset = 256 * 1024,
67712048e2cSBaochen Qiang 			.m3_loader = ath12k_m3_fw_loader_driver,
678b065ccf4SBaochen Qiang 			.download_aux_ucode = true,
67912048e2cSBaochen Qiang 		},
68012048e2cSBaochen Qiang 
68112048e2cSBaochen Qiang 		.max_radios = 1,
68212048e2cSBaochen Qiang 		.single_pdev_only = true,
68312048e2cSBaochen Qiang 		.qmi_service_ins_id = ATH12K_QMI_WLFW_SERVICE_INS_ID_V01_WCN7850,
68412048e2cSBaochen Qiang 		.internal_sleep_clock = true,
68512048e2cSBaochen Qiang 
686023ace9fSBaochen Qiang 		.hw_ops = &qcc2072_ops,
68712048e2cSBaochen Qiang 		.ring_mask = &ath12k_wifi7_hw_ring_mask_wcn7850,
68812048e2cSBaochen Qiang 
68912048e2cSBaochen Qiang 		.host_ce_config = ath12k_wifi7_host_ce_config_wcn7850,
69012048e2cSBaochen Qiang 		.ce_count = 9,
69112048e2cSBaochen Qiang 		.target_ce_config = ath12k_wifi7_target_ce_config_wlan_wcn7850,
69212048e2cSBaochen Qiang 		.target_ce_count = 9,
69312048e2cSBaochen Qiang 		.svc_to_ce_map =
69412048e2cSBaochen Qiang 			ath12k_wifi7_target_service_to_ce_map_wlan_wcn7850,
69512048e2cSBaochen Qiang 		.svc_to_ce_map_len = 14,
69612048e2cSBaochen Qiang 
69712048e2cSBaochen Qiang 		.rxdma1_enable = false,
69812048e2cSBaochen Qiang 		.num_rxdma_per_pdev = 2,
69912048e2cSBaochen Qiang 		.num_rxdma_dst_ring = 1,
70012048e2cSBaochen Qiang 		.rx_mac_buf_ring = true,
70112048e2cSBaochen Qiang 		.vdev_start_delay = true,
70212048e2cSBaochen Qiang 
70312048e2cSBaochen Qiang 		.interface_modes = BIT(NL80211_IFTYPE_STATION) |
70412048e2cSBaochen Qiang 				   BIT(NL80211_IFTYPE_AP) |
70512048e2cSBaochen Qiang 				   BIT(NL80211_IFTYPE_P2P_DEVICE) |
70612048e2cSBaochen Qiang 				   BIT(NL80211_IFTYPE_P2P_CLIENT) |
70712048e2cSBaochen Qiang 				   BIT(NL80211_IFTYPE_P2P_GO),
70812048e2cSBaochen Qiang 		.supports_monitor = true,
70912048e2cSBaochen Qiang 
71012048e2cSBaochen Qiang 		.idle_ps = true,
71112048e2cSBaochen Qiang 		.download_calib = false,
71212048e2cSBaochen Qiang 		.supports_suspend = true,
71312048e2cSBaochen Qiang 		.tcl_ring_retry = false,
71412048e2cSBaochen Qiang 		.reoq_lut_support = false,
71512048e2cSBaochen Qiang 		.supports_shadow_regs = true,
71612048e2cSBaochen Qiang 
71712048e2cSBaochen Qiang 		.num_tcl_banks = 7,
71812048e2cSBaochen Qiang 		.max_tx_ring = 3,
71912048e2cSBaochen Qiang 
72012048e2cSBaochen Qiang 		.mhi_config = &ath12k_wifi7_mhi_config_wcn7850,
72112048e2cSBaochen Qiang 
72212048e2cSBaochen Qiang 		.wmi_init = ath12k_wifi7_wmi_init_wcn7850,
72312048e2cSBaochen Qiang 
72412048e2cSBaochen Qiang 		.qmi_cnss_feature_bitmap = BIT(CNSS_QDSS_CFG_MISS_V01) |
725b065ccf4SBaochen Qiang 					   BIT(CNSS_PCIE_PERST_NO_PULL_V01) |
726b065ccf4SBaochen Qiang 					   BIT(CNSS_AUX_UC_SUPPORT_V01),
72712048e2cSBaochen Qiang 
72812048e2cSBaochen Qiang 		.rfkill_pin = 0,
72912048e2cSBaochen Qiang 		.rfkill_cfg = 0,
73012048e2cSBaochen Qiang 		.rfkill_on_level = 0,
73112048e2cSBaochen Qiang 
73212048e2cSBaochen Qiang 		.rddm_size = 0x780000,
73312048e2cSBaochen Qiang 
73412048e2cSBaochen Qiang 		.def_num_link = 2,
73512048e2cSBaochen Qiang 		.max_mlo_peer = 32,
73612048e2cSBaochen Qiang 
73712048e2cSBaochen Qiang 		.otp_board_id_register = 0,
73812048e2cSBaochen Qiang 
73912048e2cSBaochen Qiang 		.supports_sta_ps = true,
74012048e2cSBaochen Qiang 
74112048e2cSBaochen Qiang 		.acpi_guid = &wcn7850_uuid,
74212048e2cSBaochen Qiang 		.supports_dynamic_smps_6ghz = false,
74312048e2cSBaochen Qiang 
74412048e2cSBaochen Qiang 		.iova_mask = 0,
74512048e2cSBaochen Qiang 
74612048e2cSBaochen Qiang 		.supports_aspm = true,
74712048e2cSBaochen Qiang 
74812048e2cSBaochen Qiang 		.ce_ie_addr = NULL,
74912048e2cSBaochen Qiang 		.ce_remap = NULL,
75012048e2cSBaochen Qiang 		.bdf_addr_offset = 0,
75112048e2cSBaochen Qiang 
75212048e2cSBaochen Qiang 		.current_cc_support = true,
75312048e2cSBaochen Qiang 
75412048e2cSBaochen Qiang 		.dp_primary_link_only = false,
75512048e2cSBaochen Qiang 	},
756a7202704SKiran Venkatappa };
757a7202704SKiran Venkatappa 
758c26f294fSRipan Deuri /* Note: called under rcu_read_lock() */
759c26f294fSRipan Deuri static void ath12k_wifi7_mac_op_tx(struct ieee80211_hw *hw,
760c26f294fSRipan Deuri 				   struct ieee80211_tx_control *control,
761c26f294fSRipan Deuri 				   struct sk_buff *skb)
762c26f294fSRipan Deuri {
763c26f294fSRipan Deuri 	struct ath12k_skb_cb *skb_cb = ATH12K_SKB_CB(skb);
764c26f294fSRipan Deuri 	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
765c26f294fSRipan Deuri 	struct ieee80211_vif *vif = info->control.vif;
766c26f294fSRipan Deuri 	struct ath12k_vif *ahvif = ath12k_vif_to_ahvif(vif);
767c26f294fSRipan Deuri 	struct ath12k_link_vif *arvif = &ahvif->deflink;
768c26f294fSRipan Deuri 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
769c26f294fSRipan Deuri 	struct ieee80211_key_conf *key = info->control.hw_key;
770c26f294fSRipan Deuri 	struct ieee80211_sta *sta = control->sta;
771c26f294fSRipan Deuri 	struct ath12k_link_vif *tmp_arvif;
772c26f294fSRipan Deuri 	u32 info_flags = info->flags;
773c26f294fSRipan Deuri 	struct sk_buff *msdu_copied;
774c26f294fSRipan Deuri 	struct ath12k *ar, *tmp_ar;
775c26f294fSRipan Deuri 	struct ath12k_pdev_dp *dp_pdev, *tmp_dp_pdev;
776c26f294fSRipan Deuri 	struct ath12k_dp_link_peer *peer;
777c26f294fSRipan Deuri 	unsigned long links_map;
778c26f294fSRipan Deuri 	bool is_mcast = false;
779c26f294fSRipan Deuri 	bool is_dvlan = false;
780c26f294fSRipan Deuri 	struct ethhdr *eth;
781c26f294fSRipan Deuri 	bool is_prb_rsp;
782c26f294fSRipan Deuri 	u16 mcbc_gsn;
783c26f294fSRipan Deuri 	u8 link_id;
784c26f294fSRipan Deuri 	int ret;
785c26f294fSRipan Deuri 	struct ath12k_dp *tmp_dp;
786c26f294fSRipan Deuri 
787c26f294fSRipan Deuri 	if (ahvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {
788c26f294fSRipan Deuri 		ieee80211_free_txskb(hw, skb);
789c26f294fSRipan Deuri 		return;
790c26f294fSRipan Deuri 	}
791c26f294fSRipan Deuri 
792c26f294fSRipan Deuri 	link_id = u32_get_bits(info->control.flags, IEEE80211_TX_CTRL_MLO_LINK);
793c26f294fSRipan Deuri 	memset(skb_cb, 0, sizeof(*skb_cb));
794c26f294fSRipan Deuri 	skb_cb->vif = vif;
795c26f294fSRipan Deuri 
796c26f294fSRipan Deuri 	if (key) {
797c26f294fSRipan Deuri 		skb_cb->cipher = key->cipher;
798c26f294fSRipan Deuri 		skb_cb->flags |= ATH12K_SKB_CIPHER_SET;
799c26f294fSRipan Deuri 	}
800c26f294fSRipan Deuri 
801c26f294fSRipan Deuri 	/* handle only for MLO case, use deflink for non MLO case */
802c26f294fSRipan Deuri 	if (ieee80211_vif_is_mld(vif)) {
803c26f294fSRipan Deuri 		link_id = ath12k_mac_get_tx_link(sta, vif, link_id, skb, info_flags);
804c26f294fSRipan Deuri 		if (link_id >= IEEE80211_MLD_MAX_NUM_LINKS) {
805c26f294fSRipan Deuri 			ieee80211_free_txskb(hw, skb);
806c26f294fSRipan Deuri 			return;
807c26f294fSRipan Deuri 		}
808c26f294fSRipan Deuri 	} else {
809*9abf2207SJakub Kicinski 		if (vif->type == NL80211_IFTYPE_P2P_DEVICE)
810*9abf2207SJakub Kicinski 			link_id = ATH12K_FIRST_SCAN_LINK;
811*9abf2207SJakub Kicinski 		else
812c26f294fSRipan Deuri 			link_id = 0;
813c26f294fSRipan Deuri 	}
814c26f294fSRipan Deuri 
815c26f294fSRipan Deuri 	arvif = rcu_dereference(ahvif->link[link_id]);
816c26f294fSRipan Deuri 	if (!arvif || !arvif->ar) {
817c26f294fSRipan Deuri 		ath12k_warn(ahvif->ah, "failed to find arvif link id %u for frame transmission",
818c26f294fSRipan Deuri 			    link_id);
819c26f294fSRipan Deuri 		ieee80211_free_txskb(hw, skb);
820c26f294fSRipan Deuri 		return;
821c26f294fSRipan Deuri 	}
822c26f294fSRipan Deuri 
823c26f294fSRipan Deuri 	ar = arvif->ar;
824c26f294fSRipan Deuri 	skb_cb->link_id = link_id;
825c26f294fSRipan Deuri 	/*
826c26f294fSRipan Deuri 	 * as skb_cb is common currently for dp and mgmt tx processing
827c26f294fSRipan Deuri 	 * set this in the common mac op tx function.
828c26f294fSRipan Deuri 	 */
829c26f294fSRipan Deuri 	skb_cb->ar = ar;
830c26f294fSRipan Deuri 	is_prb_rsp = ieee80211_is_probe_resp(hdr->frame_control);
831c26f294fSRipan Deuri 
832c26f294fSRipan Deuri 	if (info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP) {
833c26f294fSRipan Deuri 		eth = (struct ethhdr *)skb->data;
834c26f294fSRipan Deuri 		is_mcast = is_multicast_ether_addr(eth->h_dest);
835c26f294fSRipan Deuri 
836c26f294fSRipan Deuri 		skb_cb->flags |= ATH12K_SKB_HW_80211_ENCAP;
837c26f294fSRipan Deuri 	} else if (ieee80211_is_mgmt(hdr->frame_control)) {
838c26f294fSRipan Deuri 		if (sta && sta->mlo)
839c26f294fSRipan Deuri 			skb_cb->flags |= ATH12K_SKB_MLO_STA;
840c26f294fSRipan Deuri 
841c26f294fSRipan Deuri 		ret = ath12k_mac_mgmt_tx(ar, skb, is_prb_rsp);
842c26f294fSRipan Deuri 		if (ret) {
843c26f294fSRipan Deuri 			ath12k_warn(ar->ab, "failed to queue management frame %d\n",
844c26f294fSRipan Deuri 				    ret);
845c26f294fSRipan Deuri 			ieee80211_free_txskb(hw, skb);
846c26f294fSRipan Deuri 		}
847c26f294fSRipan Deuri 		return;
848c26f294fSRipan Deuri 	}
849c26f294fSRipan Deuri 
850c26f294fSRipan Deuri 	if (!(info_flags & IEEE80211_TX_CTL_HW_80211_ENCAP))
851c26f294fSRipan Deuri 		is_mcast = is_multicast_ether_addr(hdr->addr1);
852c26f294fSRipan Deuri 
853c26f294fSRipan Deuri 	/* This is case only for P2P_GO */
854c26f294fSRipan Deuri 	if (vif->type == NL80211_IFTYPE_AP && vif->p2p)
855c26f294fSRipan Deuri 		ath12k_mac_add_p2p_noa_ie(ar, vif, skb, is_prb_rsp);
856c26f294fSRipan Deuri 
857c26f294fSRipan Deuri 	dp_pdev = ath12k_dp_to_pdev_dp(ar->ab->dp, ar->pdev_idx);
858c26f294fSRipan Deuri 	if (!dp_pdev) {
859c26f294fSRipan Deuri 		ieee80211_free_txskb(hw, skb);
860c26f294fSRipan Deuri 		return;
861c26f294fSRipan Deuri 	}
862c26f294fSRipan Deuri 
863c26f294fSRipan Deuri 	/* Checking if it is a DVLAN frame */
864c26f294fSRipan Deuri 	if (!test_bit(ATH12K_FLAG_HW_CRYPTO_DISABLED, &ar->ab->dev_flags) &&
865c26f294fSRipan Deuri 	    !(skb_cb->flags & ATH12K_SKB_HW_80211_ENCAP) &&
866c26f294fSRipan Deuri 	    !(skb_cb->flags & ATH12K_SKB_CIPHER_SET) &&
867c26f294fSRipan Deuri 	    ieee80211_has_protected(hdr->frame_control))
868c26f294fSRipan Deuri 		is_dvlan = true;
869c26f294fSRipan Deuri 
870c26f294fSRipan Deuri 	if (!vif->valid_links || !is_mcast || is_dvlan ||
871c26f294fSRipan Deuri 	    (skb_cb->flags & ATH12K_SKB_HW_80211_ENCAP) ||
872c26f294fSRipan Deuri 	    test_bit(ATH12K_FLAG_RAW_MODE, &ar->ab->dev_flags)) {
873c26f294fSRipan Deuri 		ret = ath12k_wifi7_dp_tx(dp_pdev, arvif, skb, false, 0, is_mcast);
874c26f294fSRipan Deuri 		if (unlikely(ret)) {
875c26f294fSRipan Deuri 			ath12k_warn(ar->ab, "failed to transmit frame %d\n", ret);
876c26f294fSRipan Deuri 			ieee80211_free_txskb(ar->ah->hw, skb);
877c26f294fSRipan Deuri 			return;
878c26f294fSRipan Deuri 		}
879c26f294fSRipan Deuri 	} else {
880c26f294fSRipan Deuri 		mcbc_gsn = atomic_inc_return(&ahvif->dp_vif.mcbc_gsn) & 0xfff;
881c26f294fSRipan Deuri 
882c26f294fSRipan Deuri 		links_map = ahvif->links_map;
883c26f294fSRipan Deuri 		for_each_set_bit(link_id, &links_map,
884c26f294fSRipan Deuri 				 IEEE80211_MLD_MAX_NUM_LINKS) {
885c26f294fSRipan Deuri 			tmp_arvif = rcu_dereference(ahvif->link[link_id]);
886c26f294fSRipan Deuri 			if (!tmp_arvif || !tmp_arvif->is_up)
887c26f294fSRipan Deuri 				continue;
888c26f294fSRipan Deuri 
889c26f294fSRipan Deuri 			tmp_ar = tmp_arvif->ar;
890c26f294fSRipan Deuri 			tmp_dp_pdev = ath12k_dp_to_pdev_dp(tmp_ar->ab->dp,
891c26f294fSRipan Deuri 							   tmp_ar->pdev_idx);
892c26f294fSRipan Deuri 			if (!tmp_dp_pdev)
893c26f294fSRipan Deuri 				continue;
894c26f294fSRipan Deuri 			msdu_copied = skb_copy(skb, GFP_ATOMIC);
895c26f294fSRipan Deuri 			if (!msdu_copied) {
896c26f294fSRipan Deuri 				ath12k_err(ar->ab,
897c26f294fSRipan Deuri 					   "skb copy failure link_id 0x%X vdevid 0x%X\n",
898c26f294fSRipan Deuri 					   link_id, tmp_arvif->vdev_id);
899c26f294fSRipan Deuri 				continue;
900c26f294fSRipan Deuri 			}
901c26f294fSRipan Deuri 
902c26f294fSRipan Deuri 			ath12k_mlo_mcast_update_tx_link_address(vif, link_id,
903c26f294fSRipan Deuri 								msdu_copied,
904c26f294fSRipan Deuri 								info_flags);
905c26f294fSRipan Deuri 
906c26f294fSRipan Deuri 			skb_cb = ATH12K_SKB_CB(msdu_copied);
907c26f294fSRipan Deuri 			skb_cb->link_id = link_id;
908c26f294fSRipan Deuri 			skb_cb->vif = vif;
909c26f294fSRipan Deuri 			skb_cb->ar = tmp_ar;
910c26f294fSRipan Deuri 
911c26f294fSRipan Deuri 			/* For open mode, skip peer find logic */
912c26f294fSRipan Deuri 			if (unlikely(!ahvif->dp_vif.key_cipher))
913c26f294fSRipan Deuri 				goto skip_peer_find;
914c26f294fSRipan Deuri 
915c26f294fSRipan Deuri 			tmp_dp = ath12k_ab_to_dp(tmp_ar->ab);
916c26f294fSRipan Deuri 			spin_lock_bh(&tmp_dp->dp_lock);
917c26f294fSRipan Deuri 			peer = ath12k_dp_link_peer_find_by_addr(tmp_dp,
918c26f294fSRipan Deuri 								tmp_arvif->bssid);
919c26f294fSRipan Deuri 			if (!peer || !peer->dp_peer) {
920c26f294fSRipan Deuri 				spin_unlock_bh(&tmp_dp->dp_lock);
921c26f294fSRipan Deuri 				ath12k_warn(tmp_ar->ab,
922c26f294fSRipan Deuri 					    "failed to find peer for vdev_id 0x%X addr %pM link_map 0x%X\n",
923c26f294fSRipan Deuri 					    tmp_arvif->vdev_id, tmp_arvif->bssid,
924c26f294fSRipan Deuri 					    ahvif->links_map);
925c26f294fSRipan Deuri 				dev_kfree_skb_any(msdu_copied);
926c26f294fSRipan Deuri 				continue;
927c26f294fSRipan Deuri 			}
928c26f294fSRipan Deuri 
929c26f294fSRipan Deuri 			key = peer->dp_peer->keys[peer->dp_peer->mcast_keyidx];
930c26f294fSRipan Deuri 			if (key) {
931c26f294fSRipan Deuri 				skb_cb->cipher = key->cipher;
932c26f294fSRipan Deuri 				skb_cb->flags |= ATH12K_SKB_CIPHER_SET;
933c26f294fSRipan Deuri 
934c26f294fSRipan Deuri 				hdr = (struct ieee80211_hdr *)msdu_copied->data;
935c26f294fSRipan Deuri 				if (!ieee80211_has_protected(hdr->frame_control))
936c26f294fSRipan Deuri 					hdr->frame_control |=
937c26f294fSRipan Deuri 						cpu_to_le16(IEEE80211_FCTL_PROTECTED);
938c26f294fSRipan Deuri 			}
939c26f294fSRipan Deuri 			spin_unlock_bh(&tmp_dp->dp_lock);
940c26f294fSRipan Deuri 
941c26f294fSRipan Deuri skip_peer_find:
942c26f294fSRipan Deuri 			ret = ath12k_wifi7_dp_tx(tmp_dp_pdev, tmp_arvif,
943c26f294fSRipan Deuri 						 msdu_copied, true, mcbc_gsn, is_mcast);
944c26f294fSRipan Deuri 			if (unlikely(ret)) {
945c26f294fSRipan Deuri 				if (ret == -ENOMEM) {
946c26f294fSRipan Deuri 					/* Drops are expected during heavy multicast
947c26f294fSRipan Deuri 					 * frame flood. Print with debug log
948c26f294fSRipan Deuri 					 * level to avoid lot of console prints
949c26f294fSRipan Deuri 					 */
950c26f294fSRipan Deuri 					ath12k_dbg(ar->ab, ATH12K_DBG_MAC,
951c26f294fSRipan Deuri 						   "failed to transmit frame %d\n",
952c26f294fSRipan Deuri 						   ret);
953c26f294fSRipan Deuri 				} else {
954c26f294fSRipan Deuri 					ath12k_warn(ar->ab,
955c26f294fSRipan Deuri 						    "failed to transmit frame %d\n",
956c26f294fSRipan Deuri 						    ret);
957c26f294fSRipan Deuri 				}
958c26f294fSRipan Deuri 
959c26f294fSRipan Deuri 				dev_kfree_skb_any(msdu_copied);
960c26f294fSRipan Deuri 			}
961c26f294fSRipan Deuri 		}
962c26f294fSRipan Deuri 		ieee80211_free_txskb(ar->ah->hw, skb);
963c26f294fSRipan Deuri 	}
964c26f294fSRipan Deuri }
965c26f294fSRipan Deuri 
966914c890dSRipan Deuri static const struct ieee80211_ops ath12k_ops_wifi7 = {
967c26f294fSRipan Deuri 	.tx				= ath12k_wifi7_mac_op_tx,
968914c890dSRipan Deuri 	.wake_tx_queue			= ieee80211_handle_wake_tx_queue,
969914c890dSRipan Deuri 	.start                          = ath12k_mac_op_start,
970914c890dSRipan Deuri 	.stop                           = ath12k_mac_op_stop,
971914c890dSRipan Deuri 	.reconfig_complete              = ath12k_mac_op_reconfig_complete,
972914c890dSRipan Deuri 	.add_interface                  = ath12k_mac_op_add_interface,
973914c890dSRipan Deuri 	.remove_interface		= ath12k_mac_op_remove_interface,
974914c890dSRipan Deuri 	.update_vif_offload		= ath12k_mac_op_update_vif_offload,
975914c890dSRipan Deuri 	.config                         = ath12k_mac_op_config,
976914c890dSRipan Deuri 	.link_info_changed              = ath12k_mac_op_link_info_changed,
977914c890dSRipan Deuri 	.vif_cfg_changed		= ath12k_mac_op_vif_cfg_changed,
978914c890dSRipan Deuri 	.change_vif_links               = ath12k_mac_op_change_vif_links,
979914c890dSRipan Deuri 	.configure_filter		= ath12k_mac_op_configure_filter,
980914c890dSRipan Deuri 	.hw_scan                        = ath12k_mac_op_hw_scan,
981914c890dSRipan Deuri 	.cancel_hw_scan                 = ath12k_mac_op_cancel_hw_scan,
982914c890dSRipan Deuri 	.set_key                        = ath12k_mac_op_set_key,
983914c890dSRipan Deuri 	.set_rekey_data	                = ath12k_mac_op_set_rekey_data,
984914c890dSRipan Deuri 	.sta_state                      = ath12k_mac_op_sta_state,
985914c890dSRipan Deuri 	.sta_set_txpwr			= ath12k_mac_op_sta_set_txpwr,
986914c890dSRipan Deuri 	.link_sta_rc_update		= ath12k_mac_op_link_sta_rc_update,
987914c890dSRipan Deuri 	.conf_tx                        = ath12k_mac_op_conf_tx,
988914c890dSRipan Deuri 	.set_antenna			= ath12k_mac_op_set_antenna,
989914c890dSRipan Deuri 	.get_antenna			= ath12k_mac_op_get_antenna,
990914c890dSRipan Deuri 	.ampdu_action			= ath12k_mac_op_ampdu_action,
991914c890dSRipan Deuri 	.add_chanctx			= ath12k_mac_op_add_chanctx,
992914c890dSRipan Deuri 	.remove_chanctx			= ath12k_mac_op_remove_chanctx,
993914c890dSRipan Deuri 	.change_chanctx			= ath12k_mac_op_change_chanctx,
994914c890dSRipan Deuri 	.assign_vif_chanctx		= ath12k_mac_op_assign_vif_chanctx,
995914c890dSRipan Deuri 	.unassign_vif_chanctx		= ath12k_mac_op_unassign_vif_chanctx,
996914c890dSRipan Deuri 	.switch_vif_chanctx		= ath12k_mac_op_switch_vif_chanctx,
997914c890dSRipan Deuri 	.get_txpower			= ath12k_mac_op_get_txpower,
998914c890dSRipan Deuri 	.set_rts_threshold		= ath12k_mac_op_set_rts_threshold,
999914c890dSRipan Deuri 	.set_frag_threshold		= ath12k_mac_op_set_frag_threshold,
1000914c890dSRipan Deuri 	.set_bitrate_mask		= ath12k_mac_op_set_bitrate_mask,
1001914c890dSRipan Deuri 	.get_survey			= ath12k_mac_op_get_survey,
1002914c890dSRipan Deuri 	.flush				= ath12k_mac_op_flush,
1003914c890dSRipan Deuri 	.sta_statistics			= ath12k_mac_op_sta_statistics,
1004914c890dSRipan Deuri 	.link_sta_statistics		= ath12k_mac_op_link_sta_statistics,
1005914c890dSRipan Deuri 	.remain_on_channel              = ath12k_mac_op_remain_on_channel,
1006914c890dSRipan Deuri 	.cancel_remain_on_channel       = ath12k_mac_op_cancel_remain_on_channel,
1007914c890dSRipan Deuri 	.change_sta_links               = ath12k_mac_op_change_sta_links,
1008914c890dSRipan Deuri 	.can_activate_links             = ath12k_mac_op_can_activate_links,
1009914c890dSRipan Deuri #ifdef CONFIG_PM
1010914c890dSRipan Deuri 	.suspend			= ath12k_wow_op_suspend,
1011914c890dSRipan Deuri 	.resume				= ath12k_wow_op_resume,
1012914c890dSRipan Deuri 	.set_wakeup			= ath12k_wow_op_set_wakeup,
1013914c890dSRipan Deuri #endif
1014914c890dSRipan Deuri #ifdef CONFIG_ATH12K_DEBUGFS
1015914c890dSRipan Deuri 	.vif_add_debugfs                = ath12k_debugfs_op_vif_add,
1016914c890dSRipan Deuri #endif
1017914c890dSRipan Deuri 	CFG80211_TESTMODE_CMD(ath12k_tm_cmd)
1018914c890dSRipan Deuri #ifdef CONFIG_ATH12K_DEBUGFS
1019914c890dSRipan Deuri 	.link_sta_add_debugfs           = ath12k_debugfs_link_sta_op_add,
1020914c890dSRipan Deuri #endif
1021914c890dSRipan Deuri };
1022914c890dSRipan Deuri 
1023a7202704SKiran Venkatappa int ath12k_wifi7_hw_init(struct ath12k_base *ab)
1024a7202704SKiran Venkatappa {
1025a7202704SKiran Venkatappa 	const struct ath12k_hw_params *hw_params = NULL;
1026a7202704SKiran Venkatappa 	int i;
1027a7202704SKiran Venkatappa 
1028bce3b73dSKiran Venkatappa 	for (i = 0; i < ARRAY_SIZE(ath12k_wifi7_hw_params); i++) {
1029bce3b73dSKiran Venkatappa 		hw_params = &ath12k_wifi7_hw_params[i];
1030a7202704SKiran Venkatappa 
1031a7202704SKiran Venkatappa 		if (hw_params->hw_rev == ab->hw_rev)
1032a7202704SKiran Venkatappa 			break;
1033a7202704SKiran Venkatappa 	}
1034a7202704SKiran Venkatappa 
1035bce3b73dSKiran Venkatappa 	if (i == ARRAY_SIZE(ath12k_wifi7_hw_params)) {
1036a7202704SKiran Venkatappa 		ath12k_err(ab, "Unsupported Wi-Fi 7 hardware version: 0x%x\n",
1037a7202704SKiran Venkatappa 			   ab->hw_rev);
1038a7202704SKiran Venkatappa 		return -EINVAL;
1039a7202704SKiran Venkatappa 	}
1040a7202704SKiran Venkatappa 
1041a7202704SKiran Venkatappa 	ab->hw_params = hw_params;
1042914c890dSRipan Deuri 	ab->ath12k_ops = &ath12k_ops_wifi7;
1043a7202704SKiran Venkatappa 
104474ed243dSPavankumar Nandeshwar 	ath12k_wifi7_hal_init(ab);
104574ed243dSPavankumar Nandeshwar 
1046a7202704SKiran Venkatappa 	ath12k_info(ab, "Wi-Fi 7 Hardware name: %s\n", ab->hw_params->name);
1047a7202704SKiran Venkatappa 
1048a7202704SKiran Venkatappa 	return 0;
1049a7202704SKiran Venkatappa }
1050