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