xref: /linux/drivers/net/wireless/ath/ath10k/core.h (revision 8be4d31cb8aaeea27bde4b7ddb26e28a89062ebf)
1f0553ca9SKalle Valo /* SPDX-License-Identifier: ISC */
25e3dd157SKalle Valo /*
35e3dd157SKalle Valo  * Copyright (c) 2005-2011 Atheros Communications Inc.
48b1083d6SKalle Valo  * Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
5fe36e70fSRakesh Pillai  * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
6b1dc0ba4SJeff Johnson  * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
7*c256a94dSKang Yang  * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
85e3dd157SKalle Valo  */
95e3dd157SKalle Valo 
105e3dd157SKalle Valo #ifndef _CORE_H_
115e3dd157SKalle Valo #define _CORE_H_
125e3dd157SKalle Valo 
135e3dd157SKalle Valo #include <linux/completion.h>
145e3dd157SKalle Valo #include <linux/if_ether.h>
155e3dd157SKalle Valo #include <linux/types.h>
165e3dd157SKalle Valo #include <linux/pci.h>
17384914b2SBen Greear #include <linux/uuid.h>
18384914b2SBen Greear #include <linux/time.h>
198e1debd8SSebastian Gottschall #include <linux/leds.h>
205e3dd157SKalle Valo 
21edb8236dSMichal Kazior #include "htt.h"
225e3dd157SKalle Valo #include "htc.h"
235e3dd157SKalle Valo #include "hw.h"
245e3dd157SKalle Valo #include "targaddrs.h"
255e3dd157SKalle Valo #include "wmi.h"
265e3dd157SKalle Valo #include "../ath.h"
275e3dd157SKalle Valo #include "../regd.h"
289702c686SJanusz Dziedzic #include "../dfs_pattern_detector.h"
29855aed12SSimon Wunderlich #include "spectral.h"
30fe6f36d6SRajkumar Manoharan #include "thermal.h"
315fd3ac3cSJanusz Dziedzic #include "wow.h"
32dcb02db1SVasanthakumar Thiagarajan #include "swap.h"
335e3dd157SKalle Valo 
345e3dd157SKalle Valo #define MS(_v, _f) (((_v) & _f##_MASK) >> _f##_LSB)
355e3dd157SKalle Valo #define SM(_v, _f) (((_v) << _f##_LSB) & _f##_MASK)
365e3dd157SKalle Valo #define WO(_f)      ((_f##_OFFSET) >> 2)
375e3dd157SKalle Valo 
385e3dd157SKalle Valo #define ATH10K_SCAN_ID 0
39be8cce96SPradeep Kumar Chitrapu #define ATH10K_SCAN_CHANNEL_SWITCH_WMI_EVT_OVERHEAD 10 /* msec */
405e3dd157SKalle Valo #define WMI_READY_TIMEOUT (5 * HZ)
415e3dd157SKalle Valo #define ATH10K_FLUSH_TIMEOUT_HZ (5 * HZ)
42cc9904e6SMichal Kazior #define ATH10K_CONNECTION_LOSS_HZ (3 * HZ)
4338441fb6SBen Greear #define ATH10K_NUM_CHANS 41
4438441fb6SBen Greear #define ATH10K_MAX_5G_CHAN 173
455e3dd157SKalle Valo 
465e3dd157SKalle Valo /* Antenna noise floor */
475e3dd157SKalle Valo #define ATH10K_DEFAULT_NOISE_FLOOR -95
485e3dd157SKalle Valo 
49235b9c42SVenkateswara Naralasetty #define ATH10K_INVALID_RSSI 128
50235b9c42SVenkateswara Naralasetty 
5171098615SBartosz Markowski #define ATH10K_MAX_NUM_MGMT_PENDING 128
525e00d31aSBartosz Markowski 
534705e34eSRajkumar Manoharan /* number of failed packets (20 packets with 16 sw reties each) */
544705e34eSRajkumar Manoharan #define ATH10K_KICKOUT_THRESHOLD (20 * 16)
555a13e76eSKalle Valo 
565a13e76eSKalle Valo /*
575a13e76eSKalle Valo  * Use insanely high numbers to make sure that the firmware implementation
585a13e76eSKalle Valo  * won't start, we have the same functionality already in hostapd. Unit
595a13e76eSKalle Valo  * is seconds.
605a13e76eSKalle Valo  */
615a13e76eSKalle Valo #define ATH10K_KEEPALIVE_MIN_IDLE 3747
625a13e76eSKalle Valo #define ATH10K_KEEPALIVE_MAX_IDLE 3895
635a13e76eSKalle Valo #define ATH10K_KEEPALIVE_MAX_UNRESPONSIVE 3900
645a13e76eSKalle Valo 
651657b8f8SWaldemar Rymarkiewicz /* SMBIOS type containing Board Data File Name Extension */
661657b8f8SWaldemar Rymarkiewicz #define ATH10K_SMBIOS_BDF_EXT_TYPE 0xF8
671657b8f8SWaldemar Rymarkiewicz 
681657b8f8SWaldemar Rymarkiewicz /* SMBIOS type structure length (excluding strings-set) */
691657b8f8SWaldemar Rymarkiewicz #define ATH10K_SMBIOS_BDF_EXT_LENGTH 0x9
701657b8f8SWaldemar Rymarkiewicz 
711657b8f8SWaldemar Rymarkiewicz /* Offset pointing to Board Data File Name Extension */
721657b8f8SWaldemar Rymarkiewicz #define ATH10K_SMBIOS_BDF_EXT_OFFSET 0x8
731657b8f8SWaldemar Rymarkiewicz 
741657b8f8SWaldemar Rymarkiewicz /* Board Data File Name Extension string length.
751657b8f8SWaldemar Rymarkiewicz  * String format: BDF_<Customer ID>_<Extension>\0
761657b8f8SWaldemar Rymarkiewicz  */
771657b8f8SWaldemar Rymarkiewicz #define ATH10K_SMBIOS_BDF_EXT_STR_LENGTH 0x20
781657b8f8SWaldemar Rymarkiewicz 
791657b8f8SWaldemar Rymarkiewicz /* The magic used by QCA spec */
801657b8f8SWaldemar Rymarkiewicz #define ATH10K_SMBIOS_BDF_EXT_MAGIC "BDF_"
811657b8f8SWaldemar Rymarkiewicz 
82b8a71b95SJeff Johnson /* Default Airtime weight multiplier (Tuned for multiclient performance) */
83bb2edb73SToke Høiland-Jørgensen #define ATH10K_AIRTIME_WEIGHT_MULTIPLIER  4
84bb2edb73SToke Høiland-Jørgensen 
857b2531d9STamizh Chelvam #define ATH10K_MAX_RETRY_COUNT 30
867b2531d9STamizh Chelvam 
87ee06fcb9SBen Greear #define ATH10K_ITER_NORMAL_FLAGS (IEEE80211_IFACE_ITER_NORMAL | \
88ee06fcb9SBen Greear 				  IEEE80211_IFACE_SKIP_SDATA_NOT_IN_DRIVER)
89ee06fcb9SBen Greear #define ATH10K_ITER_RESUME_FLAGS (IEEE80211_IFACE_ITER_RESUME_ALL |\
90ee06fcb9SBen Greear 				  IEEE80211_IFACE_SKIP_SDATA_NOT_IN_DRIVER)
91*c256a94dSKang Yang #define ATH10K_RECOVERY_TIMEOUT_HZ			(5 * HZ)
92*c256a94dSKang Yang #define ATH10K_RECOVERY_MAX_FAIL_COUNT			4
93ee06fcb9SBen Greear 
945e3dd157SKalle Valo struct ath10k;
955e3dd157SKalle Valo 
ath10k_bus_str(enum ath10k_bus bus)96e07db352SKalle Valo static inline const char *ath10k_bus_str(enum ath10k_bus bus)
97e07db352SKalle Valo {
98e07db352SKalle Valo 	switch (bus) {
99e07db352SKalle Valo 	case ATH10K_BUS_PCI:
100e07db352SKalle Valo 		return "pci";
1010b523cedSRaja Mani 	case ATH10K_BUS_AHB:
1020b523cedSRaja Mani 		return "ahb";
10301d6fd69SErik Stromdahl 	case ATH10K_BUS_SDIO:
10401d6fd69SErik Stromdahl 		return "sdio";
105b00435e6SErik Stromdahl 	case ATH10K_BUS_USB:
106b00435e6SErik Stromdahl 		return "usb";
10763855e3dSGovind Singh 	case ATH10K_BUS_SNOC:
10863855e3dSGovind Singh 		return "snoc";
109e07db352SKalle Valo 	}
110e07db352SKalle Valo 
111e07db352SKalle Valo 	return "unknown";
112e07db352SKalle Valo }
113e07db352SKalle Valo 
11466b8a010SMichal Kazior enum ath10k_skb_flags {
11566b8a010SMichal Kazior 	ATH10K_SKB_F_NO_HWCRYPT = BIT(0),
11666b8a010SMichal Kazior 	ATH10K_SKB_F_DTIM_ZERO = BIT(1),
11766b8a010SMichal Kazior 	ATH10K_SKB_F_DELIVER_CAB = BIT(2),
118d668dbaeSMichal Kazior 	ATH10K_SKB_F_MGMT = BIT(3),
119609db229SMichal Kazior 	ATH10K_SKB_F_QOS = BIT(4),
1204920ce3bSManikanta Pubbisetty 	ATH10K_SKB_F_RAW_TX = BIT(5),
1217b2531d9STamizh Chelvam 	ATH10K_SKB_F_NOACK_TID = BIT(6),
12266b8a010SMichal Kazior };
12366b8a010SMichal Kazior 
1245e3dd157SKalle Valo struct ath10k_skb_cb {
1255e3dd157SKalle Valo 	dma_addr_t paddr;
12666b8a010SMichal Kazior 	u8 flags;
127d84a512dSMichal Kazior 	u8 eid;
128aca146afSMichal Kazior 	u16 msdu_id;
129d1ce37b7SKan Yan 	u16 airtime_est;
130609db229SMichal Kazior 	struct ieee80211_vif *vif;
131dd4717b6SMichal Kazior 	struct ieee80211_txq *txq;
13295a568c4SYingying Tang 	u32 ucast_cipher;
1335e3dd157SKalle Valo } __packed;
1345e3dd157SKalle Valo 
1358582bf3bSMichal Kazior struct ath10k_skb_rxcb {
1368582bf3bSMichal Kazior 	dma_addr_t paddr;
137c545070eSMichal Kazior 	struct hlist_node hlist;
13867654b26SWen Gong 	u8 eid;
1398582bf3bSMichal Kazior };
1408582bf3bSMichal Kazior 
ATH10K_SKB_CB(struct sk_buff * skb)1415e3dd157SKalle Valo static inline struct ath10k_skb_cb *ATH10K_SKB_CB(struct sk_buff *skb)
1425e3dd157SKalle Valo {
1435e3dd157SKalle Valo 	BUILD_BUG_ON(sizeof(struct ath10k_skb_cb) >
1445e3dd157SKalle Valo 		     IEEE80211_TX_INFO_DRIVER_DATA_SIZE);
1455e3dd157SKalle Valo 	return (struct ath10k_skb_cb *)&IEEE80211_SKB_CB(skb)->driver_data;
1465e3dd157SKalle Valo }
1475e3dd157SKalle Valo 
ATH10K_SKB_RXCB(struct sk_buff * skb)1488582bf3bSMichal Kazior static inline struct ath10k_skb_rxcb *ATH10K_SKB_RXCB(struct sk_buff *skb)
1498582bf3bSMichal Kazior {
1508582bf3bSMichal Kazior 	BUILD_BUG_ON(sizeof(struct ath10k_skb_rxcb) > sizeof(skb->cb));
1518582bf3bSMichal Kazior 	return (struct ath10k_skb_rxcb *)skb->cb;
1528582bf3bSMichal Kazior }
1538582bf3bSMichal Kazior 
154c545070eSMichal Kazior #define ATH10K_RXCB_SKB(rxcb) \
155c545070eSMichal Kazior 		container_of((void *)rxcb, struct sk_buff, cb)
156c545070eSMichal Kazior 
host_interest_item_address(u32 item_offset)1575e3dd157SKalle Valo static inline u32 host_interest_item_address(u32 item_offset)
1585e3dd157SKalle Valo {
1595e3dd157SKalle Valo 	return QCA988X_HOST_INTEREST_ADDRESS + item_offset;
1605e3dd157SKalle Valo }
1615e3dd157SKalle Valo 
1623344b99dSWen Gong enum ath10k_phy_mode {
1633344b99dSWen Gong 	ATH10K_PHY_MODE_LEGACY = 0,
1643344b99dSWen Gong 	ATH10K_PHY_MODE_HT = 1,
1653344b99dSWen Gong 	ATH10K_PHY_MODE_VHT = 2,
1663344b99dSWen Gong };
1673344b99dSWen Gong 
1683344b99dSWen Gong /* Data rate 100KBPS based on IE Index */
1693344b99dSWen Gong struct ath10k_index_ht_data_rate_type {
1703344b99dSWen Gong 	u8   beacon_rate_index;
1713344b99dSWen Gong 	u16  supported_rate[4];
1723344b99dSWen Gong };
1733344b99dSWen Gong 
1743344b99dSWen Gong /* Data rate 100KBPS based on IE Index */
1753344b99dSWen Gong struct ath10k_index_vht_data_rate_type {
1763344b99dSWen Gong 	u8   beacon_rate_index;
1773344b99dSWen Gong 	u16  supported_VHT80_rate[2];
1783344b99dSWen Gong 	u16  supported_VHT40_rate[2];
1793344b99dSWen Gong 	u16  supported_VHT20_rate[2];
1803344b99dSWen Gong };
1813344b99dSWen Gong 
1825e3dd157SKalle Valo struct ath10k_bmi {
1835e3dd157SKalle Valo 	bool done_sent;
1845e3dd157SKalle Valo };
1855e3dd157SKalle Valo 
186b3effe61SBartosz Markowski struct ath10k_mem_chunk {
187b3effe61SBartosz Markowski 	void *vaddr;
188b3effe61SBartosz Markowski 	dma_addr_t paddr;
189b3effe61SBartosz Markowski 	u32 len;
190b3effe61SBartosz Markowski 	u32 req_id;
191b3effe61SBartosz Markowski };
192b3effe61SBartosz Markowski 
1935e3dd157SKalle Valo struct ath10k_wmi {
1945e3dd157SKalle Valo 	enum ath10k_htc_ep_id eid;
1955e3dd157SKalle Valo 	struct completion service_ready;
1965e3dd157SKalle Valo 	struct completion unified_ready;
19720ddca21SMichal Kazior 	struct completion barrier;
1986f6eb1bcSSriram R 	struct completion radar_confirm;
199be8b3943SMichal Kazior 	wait_queue_head_t tx_credits_wq;
200acfe7ecfSMichal Kazior 	DECLARE_BITMAP(svc_map, WMI_SERVICE_MAX);
201ce42870eSBartosz Markowski 	struct wmi_cmd_map *cmd;
2026d1506e7SBartosz Markowski 	struct wmi_vdev_param_map *vdev_param;
203226a339bSBartosz Markowski 	struct wmi_pdev_param_map *pdev_param;
204c0e33fe6SRakesh Pillai 	struct wmi_peer_param_map *peer_param;
205d7579d12SMichal Kazior 	const struct wmi_ops *ops;
2063fab30f7STamizh chelvam 	const struct wmi_peer_flags_map *peer_flags;
207b3effe61SBartosz Markowski 
208dc405152SRakesh Pillai 	u32 mgmt_max_num_pending_tx;
209dc405152SRakesh Pillai 
210dc405152SRakesh Pillai 	/* Protected by data_lock */
211dc405152SRakesh Pillai 	struct idr mgmt_pending_tx;
212dc405152SRakesh Pillai 
213b3effe61SBartosz Markowski 	u32 num_mem_chunks;
214ccec9038SDavid Liu 	u32 rx_decap_mode;
2155c01aa3dSMichal Kazior 	struct ath10k_mem_chunk mem_chunks[WMI_MAX_MEM_REQS];
2165e3dd157SKalle Valo };
2175e3dd157SKalle Valo 
21860ef401aSMichal Kazior struct ath10k_fw_stats_peer {
2195326849aSMichal Kazior 	struct list_head list;
2205326849aSMichal Kazior 
2215e3dd157SKalle Valo 	u8 peer_macaddr[ETH_ALEN];
2225e3dd157SKalle Valo 	u32 peer_rssi;
2235e3dd157SKalle Valo 	u32 peer_tx_rate;
22423c3aae4SBen Greear 	u32 peer_rx_rate; /* 10x only */
225f40a307eSSurabhi Vishnoi 	u64 rx_duration;
2265e3dd157SKalle Valo };
2275e3dd157SKalle Valo 
2284a49ae94SMohammed Shafi Shajakhan struct ath10k_fw_extd_stats_peer {
2294a49ae94SMohammed Shafi Shajakhan 	struct list_head list;
2304a49ae94SMohammed Shafi Shajakhan 
2314a49ae94SMohammed Shafi Shajakhan 	u8 peer_macaddr[ETH_ALEN];
2325c51875cSBalaji Pothunoori 	u64 rx_duration;
2334a49ae94SMohammed Shafi Shajakhan };
2344a49ae94SMohammed Shafi Shajakhan 
2357b6b153aSMichal Kazior struct ath10k_fw_stats_vdev {
2367b6b153aSMichal Kazior 	struct list_head list;
2377b6b153aSMichal Kazior 
2387b6b153aSMichal Kazior 	u32 vdev_id;
2397b6b153aSMichal Kazior 	u32 beacon_snr;
2407b6b153aSMichal Kazior 	u32 data_snr;
2417b6b153aSMichal Kazior 	u32 num_tx_frames[4];
2427b6b153aSMichal Kazior 	u32 num_rx_frames;
2437b6b153aSMichal Kazior 	u32 num_tx_frames_retries[4];
2447b6b153aSMichal Kazior 	u32 num_tx_frames_failures[4];
2457b6b153aSMichal Kazior 	u32 num_rts_fail;
2467b6b153aSMichal Kazior 	u32 num_rts_success;
2477b6b153aSMichal Kazior 	u32 num_rx_err;
2487b6b153aSMichal Kazior 	u32 num_rx_discard;
2497b6b153aSMichal Kazior 	u32 num_tx_not_acked;
2507b6b153aSMichal Kazior 	u32 tx_rate_history[10];
2517b6b153aSMichal Kazior 	u32 beacon_rssi_history[10];
2527b6b153aSMichal Kazior };
2537b6b153aSMichal Kazior 
2541b3fdb50SRajkumar Manoharan struct ath10k_fw_stats_vdev_extd {
2551b3fdb50SRajkumar Manoharan 	struct list_head list;
2561b3fdb50SRajkumar Manoharan 
2571b3fdb50SRajkumar Manoharan 	u32 vdev_id;
2581b3fdb50SRajkumar Manoharan 	u32 ppdu_aggr_cnt;
2591b3fdb50SRajkumar Manoharan 	u32 ppdu_noack;
2601b3fdb50SRajkumar Manoharan 	u32 mpdu_queued;
2611b3fdb50SRajkumar Manoharan 	u32 ppdu_nonaggr_cnt;
2621b3fdb50SRajkumar Manoharan 	u32 mpdu_sw_requeued;
2631b3fdb50SRajkumar Manoharan 	u32 mpdu_suc_retry;
2641b3fdb50SRajkumar Manoharan 	u32 mpdu_suc_multitry;
2651b3fdb50SRajkumar Manoharan 	u32 mpdu_fail_retry;
2661b3fdb50SRajkumar Manoharan 	u32 tx_ftm_suc;
2671b3fdb50SRajkumar Manoharan 	u32 tx_ftm_suc_retry;
2681b3fdb50SRajkumar Manoharan 	u32 tx_ftm_fail;
2691b3fdb50SRajkumar Manoharan 	u32 rx_ftmr_cnt;
2701b3fdb50SRajkumar Manoharan 	u32 rx_ftmr_dup_cnt;
2711b3fdb50SRajkumar Manoharan 	u32 rx_iftmr_cnt;
2721b3fdb50SRajkumar Manoharan 	u32 rx_iftmr_dup_cnt;
2731b3fdb50SRajkumar Manoharan };
2741b3fdb50SRajkumar Manoharan 
2755326849aSMichal Kazior struct ath10k_fw_stats_pdev {
2765326849aSMichal Kazior 	struct list_head list;
2775326849aSMichal Kazior 
2785e3dd157SKalle Valo 	/* PDEV stats */
2795e3dd157SKalle Valo 	s32 ch_noise_floor;
28015138fdfSBen Greear 	u32 tx_frame_count; /* Cycles spent transmitting frames */
28115138fdfSBen Greear 	u32 rx_frame_count; /* Cycles spent receiving frames */
28215138fdfSBen Greear 	u32 rx_clear_count; /* Total channel busy time, evidently */
28315138fdfSBen Greear 	u32 cycle_count; /* Total on-channel time */
2845e3dd157SKalle Valo 	u32 phy_err_count;
2855e3dd157SKalle Valo 	u32 chan_tx_power;
28652e346d1SChun-Yeow Yeoh 	u32 ack_rx_bad;
28752e346d1SChun-Yeow Yeoh 	u32 rts_bad;
28852e346d1SChun-Yeow Yeoh 	u32 rts_good;
28952e346d1SChun-Yeow Yeoh 	u32 fcs_bad;
29052e346d1SChun-Yeow Yeoh 	u32 no_beacons;
29152e346d1SChun-Yeow Yeoh 	u32 mib_int_count;
2925e3dd157SKalle Valo 
2935e3dd157SKalle Valo 	/* PDEV TX stats */
2945e3dd157SKalle Valo 	s32 comp_queued;
2955e3dd157SKalle Valo 	s32 comp_delivered;
2965e3dd157SKalle Valo 	s32 msdu_enqued;
2975e3dd157SKalle Valo 	s32 mpdu_enqued;
2985e3dd157SKalle Valo 	s32 wmm_drop;
2995e3dd157SKalle Valo 	s32 local_enqued;
3005e3dd157SKalle Valo 	s32 local_freed;
3015e3dd157SKalle Valo 	s32 hw_queued;
3025e3dd157SKalle Valo 	s32 hw_reaped;
3035e3dd157SKalle Valo 	s32 underrun;
30498dd2b92SManikanta Pubbisetty 	u32 hw_paused;
3055e3dd157SKalle Valo 	s32 tx_abort;
30617818dfaSColin Ian King 	s32 mpdus_requeued;
3075e3dd157SKalle Valo 	u32 tx_ko;
3085e3dd157SKalle Valo 	u32 data_rc;
3095e3dd157SKalle Valo 	u32 self_triggers;
3105e3dd157SKalle Valo 	u32 sw_retry_failure;
3115e3dd157SKalle Valo 	u32 illgl_rate_phy_err;
3125e3dd157SKalle Valo 	u32 pdev_cont_xretry;
3135e3dd157SKalle Valo 	u32 pdev_tx_timeout;
3145e3dd157SKalle Valo 	u32 pdev_resets;
3155e3dd157SKalle Valo 	u32 phy_underrun;
3165e3dd157SKalle Valo 	u32 txop_ovf;
31798dd2b92SManikanta Pubbisetty 	u32 seq_posted;
31898dd2b92SManikanta Pubbisetty 	u32 seq_failed_queueing;
31998dd2b92SManikanta Pubbisetty 	u32 seq_completed;
32098dd2b92SManikanta Pubbisetty 	u32 seq_restarted;
32198dd2b92SManikanta Pubbisetty 	u32 mu_seq_posted;
32298dd2b92SManikanta Pubbisetty 	u32 mpdus_sw_flush;
32398dd2b92SManikanta Pubbisetty 	u32 mpdus_hw_filter;
32498dd2b92SManikanta Pubbisetty 	u32 mpdus_truncated;
32598dd2b92SManikanta Pubbisetty 	u32 mpdus_ack_failed;
32698dd2b92SManikanta Pubbisetty 	u32 mpdus_expired;
3275e3dd157SKalle Valo 
3285e3dd157SKalle Valo 	/* PDEV RX stats */
3295e3dd157SKalle Valo 	s32 mid_ppdu_route_change;
3305e3dd157SKalle Valo 	s32 status_rcvd;
3315e3dd157SKalle Valo 	s32 r0_frags;
3325e3dd157SKalle Valo 	s32 r1_frags;
3335e3dd157SKalle Valo 	s32 r2_frags;
3345e3dd157SKalle Valo 	s32 r3_frags;
3355e3dd157SKalle Valo 	s32 htt_msdus;
3365e3dd157SKalle Valo 	s32 htt_mpdus;
3375e3dd157SKalle Valo 	s32 loc_msdus;
3385e3dd157SKalle Valo 	s32 loc_mpdus;
3395e3dd157SKalle Valo 	s32 oversize_amsdu;
3405e3dd157SKalle Valo 	s32 phy_errs;
3415e3dd157SKalle Valo 	s32 phy_err_drop;
3425e3dd157SKalle Valo 	s32 mpdu_errs;
34398dd2b92SManikanta Pubbisetty 	s32 rx_ovfl_errs;
3445326849aSMichal Kazior };
3455e3dd157SKalle Valo 
3465326849aSMichal Kazior struct ath10k_fw_stats {
3474a49ae94SMohammed Shafi Shajakhan 	bool extended;
3485326849aSMichal Kazior 	struct list_head pdevs;
3497b6b153aSMichal Kazior 	struct list_head vdevs;
3505326849aSMichal Kazior 	struct list_head peers;
3514a49ae94SMohammed Shafi Shajakhan 	struct list_head peers_extd;
3525e3dd157SKalle Valo };
3535e3dd157SKalle Valo 
35429542666SMaharaja Kennadyrajan #define ATH10K_TPC_TABLE_TYPE_FLAG	1
35529542666SMaharaja Kennadyrajan #define ATH10K_TPC_PREAM_TABLE_END	0xFFFF
35629542666SMaharaja Kennadyrajan 
35729542666SMaharaja Kennadyrajan struct ath10k_tpc_table {
35829542666SMaharaja Kennadyrajan 	u32 pream_idx[WMI_TPC_RATE_MAX];
35929542666SMaharaja Kennadyrajan 	u8 rate_code[WMI_TPC_RATE_MAX];
36029542666SMaharaja Kennadyrajan 	char tpc_value[WMI_TPC_RATE_MAX][WMI_TPC_TX_N_CHAIN * WMI_TPC_BUF_SIZE];
36129542666SMaharaja Kennadyrajan };
36229542666SMaharaja Kennadyrajan 
36329542666SMaharaja Kennadyrajan struct ath10k_tpc_stats {
36429542666SMaharaja Kennadyrajan 	u32 reg_domain;
36529542666SMaharaja Kennadyrajan 	u32 chan_freq;
36629542666SMaharaja Kennadyrajan 	u32 phy_mode;
36729542666SMaharaja Kennadyrajan 	u32 twice_antenna_reduction;
36829542666SMaharaja Kennadyrajan 	u32 twice_max_rd_power;
36929542666SMaharaja Kennadyrajan 	s32 twice_antenna_gain;
37029542666SMaharaja Kennadyrajan 	u32 power_limit;
37129542666SMaharaja Kennadyrajan 	u32 num_tx_chain;
37229542666SMaharaja Kennadyrajan 	u32 ctl;
37329542666SMaharaja Kennadyrajan 	u32 rate_max;
37429542666SMaharaja Kennadyrajan 	u8 flag[WMI_TPC_FLAG];
37529542666SMaharaja Kennadyrajan 	struct ath10k_tpc_table tpc_table[WMI_TPC_FLAG];
37629542666SMaharaja Kennadyrajan };
37729542666SMaharaja Kennadyrajan 
378bc64d052SMaharaja Kennadyrajan struct ath10k_tpc_table_final {
379bc64d052SMaharaja Kennadyrajan 	u32 pream_idx[WMI_TPC_FINAL_RATE_MAX];
380bc64d052SMaharaja Kennadyrajan 	u8 rate_code[WMI_TPC_FINAL_RATE_MAX];
381bc64d052SMaharaja Kennadyrajan 	char tpc_value[WMI_TPC_FINAL_RATE_MAX][WMI_TPC_TX_N_CHAIN * WMI_TPC_BUF_SIZE];
382bc64d052SMaharaja Kennadyrajan };
383bc64d052SMaharaja Kennadyrajan 
384bc64d052SMaharaja Kennadyrajan struct ath10k_tpc_stats_final {
385bc64d052SMaharaja Kennadyrajan 	u32 reg_domain;
386bc64d052SMaharaja Kennadyrajan 	u32 chan_freq;
387bc64d052SMaharaja Kennadyrajan 	u32 phy_mode;
388bc64d052SMaharaja Kennadyrajan 	u32 twice_antenna_reduction;
389bc64d052SMaharaja Kennadyrajan 	u32 twice_max_rd_power;
390bc64d052SMaharaja Kennadyrajan 	s32 twice_antenna_gain;
391bc64d052SMaharaja Kennadyrajan 	u32 power_limit;
392bc64d052SMaharaja Kennadyrajan 	u32 num_tx_chain;
393bc64d052SMaharaja Kennadyrajan 	u32 ctl;
394bc64d052SMaharaja Kennadyrajan 	u32 rate_max;
395bc64d052SMaharaja Kennadyrajan 	u8 flag[WMI_TPC_FLAG];
396bc64d052SMaharaja Kennadyrajan 	struct ath10k_tpc_table_final tpc_table_final[WMI_TPC_FLAG];
397bc64d052SMaharaja Kennadyrajan };
398bc64d052SMaharaja Kennadyrajan 
3999702c686SJanusz Dziedzic struct ath10k_dfs_stats {
4009702c686SJanusz Dziedzic 	u32 phy_errors;
4019702c686SJanusz Dziedzic 	u32 pulses_total;
4029702c686SJanusz Dziedzic 	u32 pulses_detected;
4039702c686SJanusz Dziedzic 	u32 pulses_discarded;
4049702c686SJanusz Dziedzic 	u32 radar_detected;
4059702c686SJanusz Dziedzic };
4069702c686SJanusz Dziedzic 
4076f6eb1bcSSriram R enum ath10k_radar_confirmation_state {
4086f6eb1bcSSriram R 	ATH10K_RADAR_CONFIRMATION_IDLE = 0,
4096f6eb1bcSSriram R 	ATH10K_RADAR_CONFIRMATION_INPROGRESS,
4106f6eb1bcSSriram R 	ATH10K_RADAR_CONFIRMATION_STOPPED,
4116f6eb1bcSSriram R };
4126f6eb1bcSSriram R 
4136f6eb1bcSSriram R struct ath10k_radar_found_info {
4146f6eb1bcSSriram R 	u32 pri_min;
4156f6eb1bcSSriram R 	u32 pri_max;
4166f6eb1bcSSriram R 	u32 width_min;
4176f6eb1bcSSriram R 	u32 width_max;
4186f6eb1bcSSriram R 	u32 sidx_min;
4196f6eb1bcSSriram R 	u32 sidx_max;
4206f6eb1bcSSriram R };
4216f6eb1bcSSriram R 
4225e3dd157SKalle Valo #define ATH10K_MAX_NUM_PEER_IDS (1 << 11) /* htt rx_desc limit */
4235e3dd157SKalle Valo 
4245e3dd157SKalle Valo struct ath10k_peer {
4255e3dd157SKalle Valo 	struct list_head list;
4266942726fSMichal Kazior 	struct ieee80211_vif *vif;
4276942726fSMichal Kazior 	struct ieee80211_sta *sta;
4286942726fSMichal Kazior 
4290a744d92SMichal Kazior 	bool removed;
4305e3dd157SKalle Valo 	int vdev_id;
4315e3dd157SKalle Valo 	u8 addr[ETH_ALEN];
4325e3dd157SKalle Valo 	DECLARE_BITMAP(peer_ids, ATH10K_MAX_NUM_PEER_IDS);
433ae167131SSujith Manoharan 
434ae167131SSujith Manoharan 	/* protected by ar->data_lock */
4355e3dd157SKalle Valo 	struct ieee80211_key_conf *keys[WMI_MAX_KEY_INDEX + 1];
436e1bddde9SWen Gong 	union htt_rx_pn_t tids_last_pn[ATH10K_TXRX_NUM_EXT_TIDS];
437e1bddde9SWen Gong 	bool tids_last_pn_valid[ATH10K_TXRX_NUM_EXT_TIDS];
438e1bddde9SWen Gong 	union htt_rx_pn_t frag_tids_last_pn[ATH10K_TXRX_NUM_EXT_TIDS];
439e1bddde9SWen Gong 	u32 frag_tids_seq[ATH10K_TXRX_NUM_EXT_TIDS];
440e1bddde9SWen Gong 	struct {
441e1bddde9SWen Gong 		enum htt_security_types sec_type;
442e1bddde9SWen Gong 		int pn_len;
443e1bddde9SWen Gong 	} rx_pn[ATH10K_HTT_TXRX_PEER_SECURITY_MAX];
4445e3dd157SKalle Valo };
4455e3dd157SKalle Valo 
44629946878SMichal Kazior struct ath10k_txq {
44729946878SMichal Kazior 	struct list_head list;
4483cc0fef6SMichal Kazior 	unsigned long num_fw_queued;
449426e10eaSMichal Kazior 	unsigned long num_push_allowed;
45029946878SMichal Kazior };
45129946878SMichal Kazior 
452caee728aSVasanthakumar Thiagarajan enum ath10k_pkt_rx_err {
453caee728aSVasanthakumar Thiagarajan 	ATH10K_PKT_RX_ERR_FCS,
454caee728aSVasanthakumar Thiagarajan 	ATH10K_PKT_RX_ERR_TKIP,
455caee728aSVasanthakumar Thiagarajan 	ATH10K_PKT_RX_ERR_CRYPT,
456caee728aSVasanthakumar Thiagarajan 	ATH10K_PKT_RX_ERR_PEER_IDX_INVAL,
457caee728aSVasanthakumar Thiagarajan 	ATH10K_PKT_RX_ERR_MAX,
458caee728aSVasanthakumar Thiagarajan };
459caee728aSVasanthakumar Thiagarajan 
460caee728aSVasanthakumar Thiagarajan enum ath10k_ampdu_subfrm_num {
461caee728aSVasanthakumar Thiagarajan 	ATH10K_AMPDU_SUBFRM_NUM_10,
462caee728aSVasanthakumar Thiagarajan 	ATH10K_AMPDU_SUBFRM_NUM_20,
463caee728aSVasanthakumar Thiagarajan 	ATH10K_AMPDU_SUBFRM_NUM_30,
464caee728aSVasanthakumar Thiagarajan 	ATH10K_AMPDU_SUBFRM_NUM_40,
465caee728aSVasanthakumar Thiagarajan 	ATH10K_AMPDU_SUBFRM_NUM_50,
466caee728aSVasanthakumar Thiagarajan 	ATH10K_AMPDU_SUBFRM_NUM_60,
467caee728aSVasanthakumar Thiagarajan 	ATH10K_AMPDU_SUBFRM_NUM_MORE,
468caee728aSVasanthakumar Thiagarajan 	ATH10K_AMPDU_SUBFRM_NUM_MAX,
469caee728aSVasanthakumar Thiagarajan };
470caee728aSVasanthakumar Thiagarajan 
471caee728aSVasanthakumar Thiagarajan enum ath10k_amsdu_subfrm_num {
472caee728aSVasanthakumar Thiagarajan 	ATH10K_AMSDU_SUBFRM_NUM_1,
473caee728aSVasanthakumar Thiagarajan 	ATH10K_AMSDU_SUBFRM_NUM_2,
474caee728aSVasanthakumar Thiagarajan 	ATH10K_AMSDU_SUBFRM_NUM_3,
475caee728aSVasanthakumar Thiagarajan 	ATH10K_AMSDU_SUBFRM_NUM_4,
476caee728aSVasanthakumar Thiagarajan 	ATH10K_AMSDU_SUBFRM_NUM_MORE,
477caee728aSVasanthakumar Thiagarajan 	ATH10K_AMSDU_SUBFRM_NUM_MAX,
478caee728aSVasanthakumar Thiagarajan };
479caee728aSVasanthakumar Thiagarajan 
480caee728aSVasanthakumar Thiagarajan struct ath10k_sta_tid_stats {
48128bbe237SKalle Valo 	unsigned long rx_pkt_from_fw;
48228bbe237SKalle Valo 	unsigned long rx_pkt_unchained;
48328bbe237SKalle Valo 	unsigned long rx_pkt_drop_chained;
48428bbe237SKalle Valo 	unsigned long rx_pkt_drop_filter;
48528bbe237SKalle Valo 	unsigned long rx_pkt_err[ATH10K_PKT_RX_ERR_MAX];
48628bbe237SKalle Valo 	unsigned long rx_pkt_queued_for_mac;
48728bbe237SKalle Valo 	unsigned long rx_pkt_ampdu[ATH10K_AMPDU_SUBFRM_NUM_MAX];
48828bbe237SKalle Valo 	unsigned long rx_pkt_amsdu[ATH10K_AMSDU_SUBFRM_NUM_MAX];
489caee728aSVasanthakumar Thiagarajan };
490caee728aSVasanthakumar Thiagarajan 
491a904417fSAnilkumar Kolli enum ath10k_counter_type {
492a904417fSAnilkumar Kolli 	ATH10K_COUNTER_TYPE_BYTES,
493a904417fSAnilkumar Kolli 	ATH10K_COUNTER_TYPE_PKTS,
494a904417fSAnilkumar Kolli 	ATH10K_COUNTER_TYPE_MAX,
495a904417fSAnilkumar Kolli };
496a904417fSAnilkumar Kolli 
497a904417fSAnilkumar Kolli enum ath10k_stats_type {
498a904417fSAnilkumar Kolli 	ATH10K_STATS_TYPE_SUCC,
499a904417fSAnilkumar Kolli 	ATH10K_STATS_TYPE_FAIL,
500a904417fSAnilkumar Kolli 	ATH10K_STATS_TYPE_RETRY,
501a904417fSAnilkumar Kolli 	ATH10K_STATS_TYPE_AMPDU,
502a904417fSAnilkumar Kolli 	ATH10K_STATS_TYPE_MAX,
503a904417fSAnilkumar Kolli };
504a904417fSAnilkumar Kolli 
505a904417fSAnilkumar Kolli struct ath10k_htt_data_stats {
506a904417fSAnilkumar Kolli 	u64 legacy[ATH10K_COUNTER_TYPE_MAX][ATH10K_LEGACY_NUM];
507a904417fSAnilkumar Kolli 	u64 ht[ATH10K_COUNTER_TYPE_MAX][ATH10K_HT_MCS_NUM];
508a904417fSAnilkumar Kolli 	u64 vht[ATH10K_COUNTER_TYPE_MAX][ATH10K_VHT_MCS_NUM];
509a904417fSAnilkumar Kolli 	u64 bw[ATH10K_COUNTER_TYPE_MAX][ATH10K_BW_NUM];
510a904417fSAnilkumar Kolli 	u64 nss[ATH10K_COUNTER_TYPE_MAX][ATH10K_NSS_NUM];
511a904417fSAnilkumar Kolli 	u64 gi[ATH10K_COUNTER_TYPE_MAX][ATH10K_GI_NUM];
512e88975caSAnilkumar Kolli 	u64 rate_table[ATH10K_COUNTER_TYPE_MAX][ATH10K_RATE_TABLE_NUM];
513a904417fSAnilkumar Kolli };
514a904417fSAnilkumar Kolli 
515a904417fSAnilkumar Kolli struct ath10k_htt_tx_stats {
516a904417fSAnilkumar Kolli 	struct ath10k_htt_data_stats stats[ATH10K_STATS_TYPE_MAX];
517a904417fSAnilkumar Kolli 	u64 tx_duration;
518a904417fSAnilkumar Kolli 	u64 ba_fails;
519a904417fSAnilkumar Kolli 	u64 ack_fails;
520a904417fSAnilkumar Kolli };
521a904417fSAnilkumar Kolli 
5227b2531d9STamizh Chelvam #define ATH10K_TID_MAX	8
5237b2531d9STamizh Chelvam 
5249797febcSMichal Kazior struct ath10k_sta {
5259797febcSMichal Kazior 	struct ath10k_vif *arvif;
5269797febcSMichal Kazior 
5279797febcSMichal Kazior 	/* the following are protected by ar->data_lock */
5289797febcSMichal Kazior 	u32 changed; /* IEEE80211_RC_* */
5299797febcSMichal Kazior 	u32 bw;
5309797febcSMichal Kazior 	u32 nss;
5319797febcSMichal Kazior 	u32 smps;
532bb8f0c6aSMichal Kazior 	u16 peer_id;
533cec17c38SAnilkumar Kolli 	struct rate_info txrate;
5349a9cf0e6SAnilkumar Kolli 	struct ieee80211_tx_info tx_info;
53559a022ccSWen Gong 	u32 tx_retries;
53659a022ccSWen Gong 	u32 tx_failed;
537d1ce37b7SKan Yan 	u32 last_tx_bitrate;
5389797febcSMichal Kazior 
5390f7cb268SWen Gong 	u32 rx_rate_code;
5400f7cb268SWen Gong 	u32 rx_bitrate_kbps;
5414cc02c7cSWen Gong 	u32 tx_rate_code;
5424cc02c7cSWen Gong 	u32 tx_bitrate_kbps;
5439797febcSMichal Kazior 	struct work_struct update_wk;
5446a7f8911SAnilkumar Kolli 	u64 rx_duration;
545a904417fSAnilkumar Kolli 	struct ath10k_htt_tx_stats *tx_stats;
54695a568c4SYingying Tang 	u32 ucast_cipher;
547f5045988SRajkumar Manoharan 
548f5045988SRajkumar Manoharan #ifdef CONFIG_MAC80211_DEBUGFS
549f5045988SRajkumar Manoharan 	/* protected by conf_mutex */
550f5045988SRajkumar Manoharan 	bool aggr_mode;
551caee728aSVasanthakumar Thiagarajan 
552caee728aSVasanthakumar Thiagarajan 	/* Protected with ar->data_lock */
553caee728aSVasanthakumar Thiagarajan 	struct ath10k_sta_tid_stats tid_stats[IEEE80211_NUM_TIDS + 1];
554f5045988SRajkumar Manoharan #endif
555d70c0d46SMaharaja Kennadyrajan 	/* Protected with ar->data_lock */
556d70c0d46SMaharaja Kennadyrajan 	u32 peer_ps_state;
5577b2531d9STamizh Chelvam 	struct work_struct tid_config_wk;
5587b2531d9STamizh Chelvam 	int noack[ATH10K_TID_MAX];
5597b2531d9STamizh Chelvam 	int retry_long[ATH10K_TID_MAX];
5607b2531d9STamizh Chelvam 	int ampdu[ATH10K_TID_MAX];
5617b2531d9STamizh Chelvam 	u8 rate_ctrl[ATH10K_TID_MAX];
5627b2531d9STamizh Chelvam 	u32 rate_code[ATH10K_TID_MAX];
5637b2531d9STamizh Chelvam 	int rtscts[ATH10K_TID_MAX];
5649797febcSMichal Kazior };
5659797febcSMichal Kazior 
5665e3dd157SKalle Valo #define ATH10K_VDEV_SETUP_TIMEOUT_HZ	(5 * HZ)
567fe36e70fSRakesh Pillai #define ATH10K_VDEV_DELETE_TIMEOUT_HZ	(5 * HZ)
5685e3dd157SKalle Valo 
569af21319fSMichal Kazior enum ath10k_beacon_state {
570af21319fSMichal Kazior 	ATH10K_BEACON_SCHEDULED = 0,
571af21319fSMichal Kazior 	ATH10K_BEACON_SENDING,
572af21319fSMichal Kazior 	ATH10K_BEACON_SENT,
573af21319fSMichal Kazior };
574af21319fSMichal Kazior 
5755e3dd157SKalle Valo struct ath10k_vif {
5760579119fSMichal Kazior 	struct list_head list;
5770579119fSMichal Kazior 
5785e3dd157SKalle Valo 	u32 vdev_id;
579bb8f0c6aSMichal Kazior 	u16 peer_id;
5805e3dd157SKalle Valo 	enum wmi_vdev_type vdev_type;
5815e3dd157SKalle Valo 	enum wmi_vdev_subtype vdev_subtype;
5825e3dd157SKalle Valo 	u32 beacon_interval;
5835e3dd157SKalle Valo 	u32 dtim_period;
584ed54388aSMichal Kazior 	struct sk_buff *beacon;
585748afc47SMichal Kazior 	/* protected by data_lock */
586af21319fSMichal Kazior 	enum ath10k_beacon_state beacon_state;
58764badcb6SMichal Kazior 	void *beacon_buf;
58864badcb6SMichal Kazior 	dma_addr_t beacon_paddr;
58996d828d4SMichal Kazior 	unsigned long tx_paused; /* arbitrary values defined by target */
5905e3dd157SKalle Valo 
5915e3dd157SKalle Valo 	struct ath10k *ar;
5925e3dd157SKalle Valo 	struct ieee80211_vif *vif;
5935e3dd157SKalle Valo 
594c930f744SMichal Kazior 	bool is_started;
595c930f744SMichal Kazior 	bool is_up;
596855aed12SSimon Wunderlich 	bool spectral_enabled;
597cffb41f3SMichal Kazior 	bool ps;
598c930f744SMichal Kazior 	u32 aid;
599c930f744SMichal Kazior 	u8 bssid[ETH_ALEN];
600c930f744SMichal Kazior 
6015e3dd157SKalle Valo 	struct ieee80211_key_conf *wep_keys[WMI_MAX_KEY_INDEX + 1];
602627613f8SSenthilKumar Jegadeesan 	s8 def_wep_key_idx;
6035e3dd157SKalle Valo 
6045e3dd157SKalle Valo 	u16 tx_seq_no;
6055e3dd157SKalle Valo 
6065e3dd157SKalle Valo 	union {
6075e3dd157SKalle Valo 		struct {
6085e3dd157SKalle Valo 			u32 uapsd;
6095e3dd157SKalle Valo 		} sta;
6105e3dd157SKalle Valo 		struct {
6113cec3be3SRaja Mani 			/* 512 stations */
6123cec3be3SRaja Mani 			u8 tim_bitmap[64];
6135e3dd157SKalle Valo 			u8 tim_len;
6145e3dd157SKalle Valo 			u32 ssid_len;
615ac2f43d3SJustin Stitt 			u8 ssid[IEEE80211_MAX_SSID_LEN] __nonstring;
6165e3dd157SKalle Valo 			bool hidden_ssid;
6175e3dd157SKalle Valo 			/* P2P_IE with NoA attribute for P2P_GO case */
6185e3dd157SKalle Valo 			u32 noa_len;
6195e3dd157SKalle Valo 			u8 *noa_data;
6205e3dd157SKalle Valo 		} ap;
6215e3dd157SKalle Valo 	} u;
62251ab1a0aSJanusz Dziedzic 
623e81bd104SMarek Kwaczynski 	bool use_cts_prot;
624ccec9038SDavid Liu 	bool nohwcrypt;
625e81bd104SMarek Kwaczynski 	int num_legacy_stations;
6267d9d5587SMichal Kazior 	int txpower;
627059104bfSPradeep Kumar Chitrapu 	bool ftm_responder;
6285e752e42SMichal Kazior 	struct wmi_wmm_params_all_arg wmm_params;
62981a9a17dSMichal Kazior 	struct work_struct ap_csa_work;
630cc9904e6SMichal Kazior 	struct delayed_work connection_loss_work;
63145c9abc0SMichal Kazior 	struct cfg80211_bitrate_mask bitrate_mask;
6328b97b055SMiaoqing Pan 
6338b97b055SMiaoqing Pan 	/* For setting VHT peer fixed rate, protected by conf_mutex */
6348b97b055SMiaoqing Pan 	int vht_num_rates;
6358b97b055SMiaoqing Pan 	u8 vht_pfr;
6367b2531d9STamizh Chelvam 	u32 tid_conf_changed[ATH10K_TID_MAX];
6377b2531d9STamizh Chelvam 	int noack[ATH10K_TID_MAX];
6387b2531d9STamizh Chelvam 	int retry_long[ATH10K_TID_MAX];
6397b2531d9STamizh Chelvam 	int ampdu[ATH10K_TID_MAX];
6407b2531d9STamizh Chelvam 	u8 rate_ctrl[ATH10K_TID_MAX];
6417b2531d9STamizh Chelvam 	u32 rate_code[ATH10K_TID_MAX];
6427b2531d9STamizh Chelvam 	int rtscts[ATH10K_TID_MAX];
6432ca6a1ddSTamizh Chelvam 	u32 tids_rst;
6445e3dd157SKalle Valo };
6455e3dd157SKalle Valo 
6465e3dd157SKalle Valo struct ath10k_vif_iter {
6475e3dd157SKalle Valo 	u32 vdev_id;
6485e3dd157SKalle Valo 	struct ath10k_vif *arvif;
6495e3dd157SKalle Valo };
6505e3dd157SKalle Valo 
651c75c398bSMohammed Shafi Shajakhan /* Copy Engine register dump, protected by ce-lock */
652c75c398bSMohammed Shafi Shajakhan struct ath10k_ce_crash_data {
653c75c398bSMohammed Shafi Shajakhan 	__le32 base_addr;
654c75c398bSMohammed Shafi Shajakhan 	__le32 src_wr_idx;
655c75c398bSMohammed Shafi Shajakhan 	__le32 src_r_idx;
656c75c398bSMohammed Shafi Shajakhan 	__le32 dst_wr_idx;
657c75c398bSMohammed Shafi Shajakhan 	__le32 dst_r_idx;
658c75c398bSMohammed Shafi Shajakhan };
659c75c398bSMohammed Shafi Shajakhan 
660c75c398bSMohammed Shafi Shajakhan struct ath10k_ce_crash_hdr {
661c75c398bSMohammed Shafi Shajakhan 	__le32 ce_count;
662c75c398bSMohammed Shafi Shajakhan 	__le32 reserved[3]; /* for future use */
663c75c398bSMohammed Shafi Shajakhan 	struct ath10k_ce_crash_data entries[];
664c75c398bSMohammed Shafi Shajakhan };
665c75c398bSMohammed Shafi Shajakhan 
666703f261dSAlan Liu #define MAX_MEM_DUMP_TYPE	5
667703f261dSAlan Liu 
668384914b2SBen Greear /* used for crash-dump storage, protected by data-lock */
669384914b2SBen Greear struct ath10k_fw_crash_data {
670ab3f9c88SAndy Shevchenko 	guid_t guid;
671dafa4203SArnd Bergmann 	struct timespec64 timestamp;
672384914b2SBen Greear 	__le32 registers[REG_DUMP_COUNT_QCA988X];
673c75c398bSMohammed Shafi Shajakhan 	struct ath10k_ce_crash_data ce_crash_data[CE_COUNT_MAX];
674703f261dSAlan Liu 
675703f261dSAlan Liu 	u8 *ramdump_buf;
676703f261dSAlan Liu 	size_t ramdump_buf_len;
677384914b2SBen Greear };
678384914b2SBen Greear 
6795e3dd157SKalle Valo struct ath10k_debug {
6805e3dd157SKalle Valo 	struct dentry *debugfs_phy;
6815e3dd157SKalle Valo 
68260ef401aSMichal Kazior 	struct ath10k_fw_stats fw_stats;
68360ef401aSMichal Kazior 	struct completion fw_stats_complete;
6845326849aSMichal Kazior 	bool fw_stats_done;
6855e3dd157SKalle Valo 
686a3d135e5SKalle Valo 	unsigned long htt_stats_mask;
687473a4084SMaharaja Kennadyrajan 	unsigned long reset_htt_stats;
688a3d135e5SKalle Valo 	struct delayed_work htt_stats_dwork;
6899702c686SJanusz Dziedzic 	struct ath10k_dfs_stats dfs_stats;
6909702c686SJanusz Dziedzic 	struct ath_dfs_pool_stats dfs_pool_stats;
691f118a3e5SKalle Valo 
69229542666SMaharaja Kennadyrajan 	/* used for tpc-dump storage, protected by data-lock */
69329542666SMaharaja Kennadyrajan 	struct ath10k_tpc_stats *tpc_stats;
694bc64d052SMaharaja Kennadyrajan 	struct ath10k_tpc_stats_final *tpc_stats_final;
69529542666SMaharaja Kennadyrajan 
69629542666SMaharaja Kennadyrajan 	struct completion tpc_complete;
69729542666SMaharaja Kennadyrajan 
69890174455SRajkumar Manoharan 	/* protected by conf_mutex */
699afcbc82cSMaharaja Kennadyrajan 	u64 fw_dbglog_mask;
700467210a6SSenthilKumar Jegadeesan 	u32 fw_dbglog_level;
701077a3804SYanbo Li 	u32 reg_addr;
702a7bd3e99SPeter Oh 	u32 nf_cal_period;
703f67b107dSMarty Faltesek 	void *cal_data;
704348cd95cSAnilkumar Kolli 	u32 enable_extd_tx_stats;
705d9e47698SGovind Singh 	u8 fw_dbglog_mode;
7065e3dd157SKalle Valo };
7075e3dd157SKalle Valo 
708f7843d7fSMichal Kazior enum ath10k_state {
709f7843d7fSMichal Kazior 	ATH10K_STATE_OFF = 0,
710f7843d7fSMichal Kazior 	ATH10K_STATE_ON,
711affd3217SMichal Kazior 
712affd3217SMichal Kazior 	/* When doing firmware recovery the device is first powered down.
713affd3217SMichal Kazior 	 * mac80211 is supposed to call in to start() hook later on. It is
714affd3217SMichal Kazior 	 * however possible that driver unloading and firmware crash overlap.
715affd3217SMichal Kazior 	 * mac80211 can wait on conf_mutex in stop() while the device is
716affd3217SMichal Kazior 	 * stopped in ath10k_core_restart() work holding conf_mutex. The state
717affd3217SMichal Kazior 	 * RESTARTED means that the device is up and mac80211 has started hw
718affd3217SMichal Kazior 	 * reconfiguration. Once mac80211 is done with the reconfiguration we
71937ff1b0dSMarcin Rokicki 	 * set the state to STATE_ON in reconfig_complete().
72037ff1b0dSMarcin Rokicki 	 */
721affd3217SMichal Kazior 	ATH10K_STATE_RESTARTING,
722affd3217SMichal Kazior 	ATH10K_STATE_RESTARTED,
723affd3217SMichal Kazior 
724affd3217SMichal Kazior 	/* The device has crashed while restarting hw. This state is like ON
725affd3217SMichal Kazior 	 * but commands are blocked in HTC and -ECOMM response is given. This
726affd3217SMichal Kazior 	 * prevents completion timeouts and makes the driver more responsive to
72737ff1b0dSMarcin Rokicki 	 * userspace commands. This is also prevents recursive recovery.
72837ff1b0dSMarcin Rokicki 	 */
729affd3217SMichal Kazior 	ATH10K_STATE_WEDGED,
73043d2a30fSKalle Valo 
73143d2a30fSKalle Valo 	/* factory tests */
73243d2a30fSKalle Valo 	ATH10K_STATE_UTF,
73343d2a30fSKalle Valo };
73443d2a30fSKalle Valo 
73543d2a30fSKalle Valo enum ath10k_firmware_mode {
73643d2a30fSKalle Valo 	/* the default mode, standard 802.11 functionality */
73743d2a30fSKalle Valo 	ATH10K_FIRMWARE_MODE_NORMAL,
73843d2a30fSKalle Valo 
73943d2a30fSKalle Valo 	/* factory tests etc */
74043d2a30fSKalle Valo 	ATH10K_FIRMWARE_MODE_UTF,
741f7843d7fSMichal Kazior };
742f7843d7fSMichal Kazior 
7430d9b0438SMichal Kazior enum ath10k_fw_features {
7440d9b0438SMichal Kazior 	/* wmi_mgmt_rx_hdr contains extra RSSI information */
7450d9b0438SMichal Kazior 	ATH10K_FW_FEATURE_EXT_WMI_MGMT_RX = 0,
7460d9b0438SMichal Kazior 
747202e86e6SKalle Valo 	/* Firmware from 10X branch. Deprecated, don't use in new code. */
748ce42870eSBartosz Markowski 	ATH10K_FW_FEATURE_WMI_10X = 1,
749ce42870eSBartosz Markowski 
7505e00d31aSBartosz Markowski 	/* firmware support tx frame management over WMI, otherwise it's HTT */
7515e00d31aSBartosz Markowski 	ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX = 2,
7525e00d31aSBartosz Markowski 
753d354181fSBartosz Markowski 	/* Firmware does not support P2P */
754d354181fSBartosz Markowski 	ATH10K_FW_FEATURE_NO_P2P = 3,
755d354181fSBartosz Markowski 
756202e86e6SKalle Valo 	/* Firmware 10.2 feature bit. The ATH10K_FW_FEATURE_WMI_10X feature
757202e86e6SKalle Valo 	 * bit is required to be set as well. Deprecated, don't use in new
758202e86e6SKalle Valo 	 * code.
75924c88f78SMichal Kazior 	 */
76024c88f78SMichal Kazior 	ATH10K_FW_FEATURE_WMI_10_2 = 4,
76124c88f78SMichal Kazior 
762cffb41f3SMichal Kazior 	/* Some firmware revisions lack proper multi-interface client powersave
763cffb41f3SMichal Kazior 	 * implementation. Enabling PS could result in connection drops,
764cffb41f3SMichal Kazior 	 * traffic stalls, etc.
765cffb41f3SMichal Kazior 	 */
766cffb41f3SMichal Kazior 	ATH10K_FW_FEATURE_MULTI_VIF_PS_SUPPORT = 5,
767cffb41f3SMichal Kazior 
7685fd3ac3cSJanusz Dziedzic 	/* Some firmware revisions have an incomplete WoWLAN implementation
7695fd3ac3cSJanusz Dziedzic 	 * despite WMI service bit being advertised. This feature flag is used
7705fd3ac3cSJanusz Dziedzic 	 * to distinguish whether WoWLAN is really supported or not.
7715fd3ac3cSJanusz Dziedzic 	 */
7725fd3ac3cSJanusz Dziedzic 	ATH10K_FW_FEATURE_WOWLAN_SUPPORT = 6,
7735fd3ac3cSJanusz Dziedzic 
774d9153546SKalle Valo 	/* Don't trust error code from otp.bin */
775ccec9038SDavid Liu 	ATH10K_FW_FEATURE_IGNORE_OTP_RESULT = 7,
776d9153546SKalle Valo 
77748f4ca34SMichal Kazior 	/* Some firmware revisions pad 4th hw address to 4 byte boundary making
77848f4ca34SMichal Kazior 	 * it 8 bytes long in Native Wifi Rx decap.
77948f4ca34SMichal Kazior 	 */
780ccec9038SDavid Liu 	ATH10K_FW_FEATURE_NO_NWIFI_DECAP_4ADDR_PADDING = 8,
78148f4ca34SMichal Kazior 
782163f5264SRajkumar Manoharan 	/* Firmware supports bypassing PLL setting on init. */
783163f5264SRajkumar Manoharan 	ATH10K_FW_FEATURE_SUPPORTS_SKIP_CLOCK_INIT = 9,
784163f5264SRajkumar Manoharan 
78520870fb0SSumanth Gavini 	/* Raw mode support. If supported, FW supports receiving and transmitting
786ccec9038SDavid Liu 	 * frames in raw mode.
787ccec9038SDavid Liu 	 */
788ccec9038SDavid Liu 	ATH10K_FW_FEATURE_RAW_MODE_SUPPORT = 10,
789ccec9038SDavid Liu 
79062f77f09SMaharaja 	/* Firmware Supports Adaptive CCA*/
79162f77f09SMaharaja 	ATH10K_FW_FEATURE_SUPPORTS_ADAPTIVE_CCA = 11,
79262f77f09SMaharaja 
79390eceb3bSTamizh chelvam 	/* Firmware supports management frame protection */
79490eceb3bSTamizh chelvam 	ATH10K_FW_FEATURE_MFP_SUPPORT = 12,
79590eceb3bSTamizh chelvam 
7969b783763SMichal Kazior 	/* Firmware supports pull-push model where host shares it's software
7979b783763SMichal Kazior 	 * queue state with firmware and firmware generates fetch requests
7989b783763SMichal Kazior 	 * telling host which queues to dequeue tx from.
7999b783763SMichal Kazior 	 *
8009b783763SMichal Kazior 	 * Primary function of this is improved MU-MIMO performance with
8019b783763SMichal Kazior 	 * multiple clients.
8029b783763SMichal Kazior 	 */
8039b783763SMichal Kazior 	ATH10K_FW_FEATURE_PEER_FLOW_CONTROL = 13,
8049b783763SMichal Kazior 
80564e001f4SRajkumar Manoharan 	/* Firmware supports BT-Coex without reloading firmware via pdev param.
80664e001f4SRajkumar Manoharan 	 * To support Bluetooth coexistence pdev param, WMI_COEX_GPIO_SUPPORT of
80764e001f4SRajkumar Manoharan 	 * extended resource config should be enabled always. This firmware IE
80864e001f4SRajkumar Manoharan 	 * is used to configure WMI_COEX_GPIO_SUPPORT.
80964e001f4SRajkumar Manoharan 	 */
81064e001f4SRajkumar Manoharan 	ATH10K_FW_FEATURE_BTCOEX_PARAM = 14,
81164e001f4SRajkumar Manoharan 
812fcf7cf15SMohammed Shafi Shajakhan 	/* Unused flag and proven to be not working, enable this if you want
813fcf7cf15SMohammed Shafi Shajakhan 	 * to experiment sending NULL func data frames in HTT TX
8142cdce425SMohammed Shafi Shajakhan 	 */
8152cdce425SMohammed Shafi Shajakhan 	ATH10K_FW_FEATURE_SKIP_NULL_FUNC_WAR = 15,
8162cdce425SMohammed Shafi Shajakhan 
817705d7aa0SManoharan, Rajkumar 	/* Firmware allow other BSS mesh broadcast/multicast frames without
818705d7aa0SManoharan, Rajkumar 	 * creating monitor interface. Appropriate rxfilters are programmed for
819705d7aa0SManoharan, Rajkumar 	 * mesh vdev by firmware itself. This feature flags will be used for
820705d7aa0SManoharan, Rajkumar 	 * not creating monitor vdev while configuring mesh node.
821705d7aa0SManoharan, Rajkumar 	 */
822705d7aa0SManoharan, Rajkumar 	ATH10K_FW_FEATURE_ALLOWS_MESH_BCAST = 16,
823705d7aa0SManoharan, Rajkumar 
82436d9cdb6SVenkateswara Naralasetty 	/* Firmware does not support power save in station mode. */
82536d9cdb6SVenkateswara Naralasetty 	ATH10K_FW_FEATURE_NO_PS = 17,
82636d9cdb6SVenkateswara Naralasetty 
8271807da49SRakesh Pillai 	/* Firmware allows management tx by reference instead of by value. */
8281807da49SRakesh Pillai 	ATH10K_FW_FEATURE_MGMT_TX_BY_REF = 18,
8291807da49SRakesh Pillai 
83071e9c29fSRakesh Pillai 	/* Firmware load is done externally, not by bmi */
83171e9c29fSRakesh Pillai 	ATH10K_FW_FEATURE_NON_BMI = 19,
83271e9c29fSRakesh Pillai 
83313104929SRakesh Pillai 	/* Firmware sends only one chan_info event per channel */
83413104929SRakesh Pillai 	ATH10K_FW_FEATURE_SINGLE_CHAN_INFO_PER_CHANNEL = 20,
83513104929SRakesh Pillai 
8368b97b055SMiaoqing Pan 	/* Firmware allows setting peer fixed rate */
8378b97b055SMiaoqing Pan 	ATH10K_FW_FEATURE_PEER_FIXED_RATE = 21,
8388b97b055SMiaoqing Pan 
8399af7c32cSVenkateswara Naralasetty 	/* Firmware support IRAM recovery */
8409af7c32cSVenkateswara Naralasetty 	ATH10K_FW_FEATURE_IRAM_RECOVERY = 22,
8419af7c32cSVenkateswara Naralasetty 
8420d9b0438SMichal Kazior 	/* keep last */
8430d9b0438SMichal Kazior 	ATH10K_FW_FEATURE_COUNT,
8440d9b0438SMichal Kazior };
8450d9b0438SMichal Kazior 
846e8a50f8bSMarek Puzyniak enum ath10k_dev_flags {
847e8a50f8bSMarek Puzyniak 	/* Indicates that ath10k device is during CAC phase of DFS */
848e8a50f8bSMarek Puzyniak 	ATH10K_CAC_RUNNING,
8496782cb69SMichal Kazior 	ATH10K_FLAG_CORE_REGISTERED,
8507962b0d8SMichal Kazior 
8517962b0d8SMichal Kazior 	/* Device has crashed and needs to restart. This indicates any pending
8527962b0d8SMichal Kazior 	 * waiters should immediately cancel instead of waiting for a time out.
8537962b0d8SMichal Kazior 	 */
8547962b0d8SMichal Kazior 	ATH10K_FLAG_CRASH_FLUSH,
855ccec9038SDavid Liu 
856ccec9038SDavid Liu 	/* Use Raw mode instead of native WiFi Tx/Rx encap mode.
857ccec9038SDavid Liu 	 * Raw mode supports both hardware and software crypto. Native WiFi only
858ccec9038SDavid Liu 	 * supports hardware crypto.
859ccec9038SDavid Liu 	 */
860ccec9038SDavid Liu 	ATH10K_FLAG_RAW_MODE,
861ccec9038SDavid Liu 
862ccec9038SDavid Liu 	/* Disable HW crypto engine */
863ccec9038SDavid Liu 	ATH10K_FLAG_HW_CRYPTO_DISABLED,
864844fa572SYanbo Li 
865b8a71b95SJeff Johnson 	/* Bluetooth coexistence enabled */
866844fa572SYanbo Li 	ATH10K_FLAG_BTCOEX,
867cc61a1bbSMohammed Shafi Shajakhan 
868cc61a1bbSMohammed Shafi Shajakhan 	/* Per Station statistics service */
869cc61a1bbSMohammed Shafi Shajakhan 	ATH10K_FLAG_PEER_STATS,
8705dadbe4eSWen Gong 
871e2f8b74eSWen Gong 	/* protected by conf_mutex */
872e2f8b74eSWen Gong 	ATH10K_FLAG_NAPI_ENABLED,
873e8a50f8bSMarek Puzyniak };
874e8a50f8bSMarek Puzyniak 
875a58227efSKalle Valo enum ath10k_cal_mode {
876a58227efSKalle Valo 	ATH10K_CAL_MODE_FILE,
877a58227efSKalle Valo 	ATH10K_CAL_MODE_OTP,
8785aabff05SToshi Kikuchi 	ATH10K_CAL_MODE_DT,
87927deb0f1SChristian Lamparter 	ATH10K_CAL_MODE_NVMEM,
8803d9195eaSRaja Mani 	ATH10K_PRE_CAL_MODE_FILE,
8813d9195eaSRaja Mani 	ATH10K_PRE_CAL_MODE_DT,
88227deb0f1SChristian Lamparter 	ATH10K_PRE_CAL_MODE_NVMEM,
8836847f967SSven Eckelmann 	ATH10K_CAL_MODE_EEPROM,
884a58227efSKalle Valo };
885a58227efSKalle Valo 
886ccec9038SDavid Liu enum ath10k_crypt_mode {
887ccec9038SDavid Liu 	/* Only use hardware crypto engine */
888ccec9038SDavid Liu 	ATH10K_CRYPT_MODE_HW,
889ccec9038SDavid Liu 	/* Only use software crypto engine */
890ccec9038SDavid Liu 	ATH10K_CRYPT_MODE_SW,
891ccec9038SDavid Liu };
892ccec9038SDavid Liu 
ath10k_cal_mode_str(enum ath10k_cal_mode mode)893a58227efSKalle Valo static inline const char *ath10k_cal_mode_str(enum ath10k_cal_mode mode)
894a58227efSKalle Valo {
895a58227efSKalle Valo 	switch (mode) {
896a58227efSKalle Valo 	case ATH10K_CAL_MODE_FILE:
897a58227efSKalle Valo 		return "file";
898a58227efSKalle Valo 	case ATH10K_CAL_MODE_OTP:
899a58227efSKalle Valo 		return "otp";
9005aabff05SToshi Kikuchi 	case ATH10K_CAL_MODE_DT:
9015aabff05SToshi Kikuchi 		return "dt";
90227deb0f1SChristian Lamparter 	case ATH10K_CAL_MODE_NVMEM:
90327deb0f1SChristian Lamparter 		return "nvmem";
9043d9195eaSRaja Mani 	case ATH10K_PRE_CAL_MODE_FILE:
9053d9195eaSRaja Mani 		return "pre-cal-file";
9063d9195eaSRaja Mani 	case ATH10K_PRE_CAL_MODE_DT:
9073d9195eaSRaja Mani 		return "pre-cal-dt";
90827deb0f1SChristian Lamparter 	case ATH10K_PRE_CAL_MODE_NVMEM:
90927deb0f1SChristian Lamparter 		return "pre-cal-nvmem";
9106847f967SSven Eckelmann 	case ATH10K_CAL_MODE_EEPROM:
9116847f967SSven Eckelmann 		return "eeprom";
912a58227efSKalle Valo 	}
913a58227efSKalle Valo 
914a58227efSKalle Valo 	return "unknown";
915a58227efSKalle Valo }
916a58227efSKalle Valo 
9175c81c7fdSMichal Kazior enum ath10k_scan_state {
9185c81c7fdSMichal Kazior 	ATH10K_SCAN_IDLE,
9195c81c7fdSMichal Kazior 	ATH10K_SCAN_STARTING,
9205c81c7fdSMichal Kazior 	ATH10K_SCAN_RUNNING,
9215c81c7fdSMichal Kazior 	ATH10K_SCAN_ABORTING,
9225c81c7fdSMichal Kazior };
9235c81c7fdSMichal Kazior 
ath10k_scan_state_str(enum ath10k_scan_state state)9245c81c7fdSMichal Kazior static inline const char *ath10k_scan_state_str(enum ath10k_scan_state state)
9255c81c7fdSMichal Kazior {
9265c81c7fdSMichal Kazior 	switch (state) {
9275c81c7fdSMichal Kazior 	case ATH10K_SCAN_IDLE:
9285c81c7fdSMichal Kazior 		return "idle";
9295c81c7fdSMichal Kazior 	case ATH10K_SCAN_STARTING:
9305c81c7fdSMichal Kazior 		return "starting";
9315c81c7fdSMichal Kazior 	case ATH10K_SCAN_RUNNING:
9325c81c7fdSMichal Kazior 		return "running";
9335c81c7fdSMichal Kazior 	case ATH10K_SCAN_ABORTING:
9345c81c7fdSMichal Kazior 		return "aborting";
9355c81c7fdSMichal Kazior 	}
9365c81c7fdSMichal Kazior 
9375c81c7fdSMichal Kazior 	return "unknown";
9385c81c7fdSMichal Kazior }
9395c81c7fdSMichal Kazior 
94096d828d4SMichal Kazior enum ath10k_tx_pause_reason {
94196d828d4SMichal Kazior 	ATH10K_TX_PAUSE_Q_FULL,
94296d828d4SMichal Kazior 	ATH10K_TX_PAUSE_MAX,
94396d828d4SMichal Kazior };
94496d828d4SMichal Kazior 
9457ebf721dSKalle Valo struct ath10k_fw_file {
9467ebf721dSKalle Valo 	const struct firmware *firmware;
9477ebf721dSKalle Valo 
94845317355SKalle Valo 	char fw_version[ETHTOOL_FWVERS_LEN];
94945317355SKalle Valo 
950c4cdf753SKalle Valo 	DECLARE_BITMAP(fw_features, ATH10K_FW_FEATURE_COUNT);
951c4cdf753SKalle Valo 
952bf3c13abSKalle Valo 	enum ath10k_fw_wmi_op_version wmi_op_version;
95377561f93SKalle Valo 	enum ath10k_fw_htt_op_version htt_op_version;
954bf3c13abSKalle Valo 
9557ebf721dSKalle Valo 	const void *firmware_data;
9567ebf721dSKalle Valo 	size_t firmware_len;
9577ebf721dSKalle Valo 
9587ebf721dSKalle Valo 	const void *otp_data;
9597ebf721dSKalle Valo 	size_t otp_len;
9607ebf721dSKalle Valo 
9617ebf721dSKalle Valo 	const void *codeswap_data;
9627ebf721dSKalle Valo 	size_t codeswap_len;
9635459c5d4STamizh chelvam 
9645459c5d4STamizh chelvam 	/* The original idea of struct ath10k_fw_file was that it only
9655459c5d4STamizh chelvam 	 * contains struct firmware and pointers to various parts (actual
9665459c5d4STamizh chelvam 	 * firmware binary, otp, metadata etc) of the file. This seg_info
9675459c5d4STamizh chelvam 	 * is actually created separate but as this is used similarly as
9685459c5d4STamizh chelvam 	 * the other firmware components it's more convenient to have it
9695459c5d4STamizh chelvam 	 * here.
9705459c5d4STamizh chelvam 	 */
9715459c5d4STamizh chelvam 	struct ath10k_swap_code_seg_info *firmware_swap_code_seg_info;
9727ebf721dSKalle Valo };
9737ebf721dSKalle Valo 
9747ebf721dSKalle Valo struct ath10k_fw_components {
9757ebf721dSKalle Valo 	const struct firmware *board;
9767ebf721dSKalle Valo 	const void *board_data;
9777ebf721dSKalle Valo 	size_t board_len;
97831324d17SSathishkumar Muruganandam 	const struct firmware *ext_board;
97931324d17SSathishkumar Muruganandam 	const void *ext_board_data;
98031324d17SSathishkumar Muruganandam 	size_t ext_board_len;
9817ebf721dSKalle Valo 
9827ebf721dSKalle Valo 	struct ath10k_fw_file fw_file;
9837ebf721dSKalle Valo };
9847ebf721dSKalle Valo 
985cec17c38SAnilkumar Kolli struct ath10k_per_peer_tx_stats {
986cec17c38SAnilkumar Kolli 	u32	succ_bytes;
987cec17c38SAnilkumar Kolli 	u32	retry_bytes;
988cec17c38SAnilkumar Kolli 	u32	failed_bytes;
989cec17c38SAnilkumar Kolli 	u8	ratecode;
990cec17c38SAnilkumar Kolli 	u8	flags;
991cec17c38SAnilkumar Kolli 	u16	peer_id;
992cec17c38SAnilkumar Kolli 	u16	succ_pkts;
993cec17c38SAnilkumar Kolli 	u16	retry_pkts;
994cec17c38SAnilkumar Kolli 	u16	failed_pkts;
995cec17c38SAnilkumar Kolli 	u16	duration;
996cec17c38SAnilkumar Kolli 	u32	reserved1;
997cec17c38SAnilkumar Kolli 	u32	reserved2;
998cec17c38SAnilkumar Kolli };
999cec17c38SAnilkumar Kolli 
10007c2dd615SErik Stromdahl enum ath10k_dev_type {
10017c2dd615SErik Stromdahl 	ATH10K_DEV_TYPE_LL,
10027c2dd615SErik Stromdahl 	ATH10K_DEV_TYPE_HL,
10037c2dd615SErik Stromdahl };
10047c2dd615SErik Stromdahl 
1005c0d8d565SErik Stromdahl struct ath10k_bus_params {
1006c0d8d565SErik Stromdahl 	u32 chip_id;
10077c2dd615SErik Stromdahl 	enum ath10k_dev_type dev_type;
1008de8781d7SGovind Singh 	bool link_can_suspend;
10098ea51e40SAlagu Sankar 	bool hl_msdu_ids;
1010c0d8d565SErik Stromdahl };
1011c0d8d565SErik Stromdahl 
10125e3dd157SKalle Valo struct ath10k {
10135e3dd157SKalle Valo 	struct ath_common ath_common;
10145e3dd157SKalle Valo 	struct ieee80211_hw *hw;
10154ca18078SMichal Kazior 	struct ieee80211_ops *ops;
10165e3dd157SKalle Valo 	struct device *dev;
1017727fec79SRakesh Pillai 	struct msa_region {
1018727fec79SRakesh Pillai 		dma_addr_t paddr;
1019727fec79SRakesh Pillai 		u32 mem_size;
1020727fec79SRakesh Pillai 		void *vaddr;
1021727fec79SRakesh Pillai 	} msa;
10225e3dd157SKalle Valo 	u8 mac_addr[ETH_ALEN];
10235e3dd157SKalle Valo 
1024d63955b3SMichal Kazior 	enum ath10k_hw_rev hw_rev;
102536582e5dSMichal Kazior 	u16 dev_id;
1026e01ae68cSKalle Valo 	u32 chip_id;
10275e3dd157SKalle Valo 	u32 target_version;
10285e3dd157SKalle Valo 	u8 fw_version_major;
10295e3dd157SKalle Valo 	u32 fw_version_minor;
10305e3dd157SKalle Valo 	u16 fw_version_release;
10315e3dd157SKalle Valo 	u16 fw_version_build;
10326274cd41SYanbo Li 	u32 fw_stats_req_mask;
10335e3dd157SKalle Valo 	u32 phy_capability;
10345e3dd157SKalle Valo 	u32 hw_min_tx_power;
10355e3dd157SKalle Valo 	u32 hw_max_tx_power;
1036209b2a68SBartosz Markowski 	u32 hw_eeprom_rd;
10375e3dd157SKalle Valo 	u32 ht_cap_info;
10385e3dd157SKalle Valo 	u32 vht_cap_info;
103973690c48STomislav Požega 	u32 vht_supp_mcs;
10408865bee4SMichal Kazior 	u32 num_rf_chains;
10415c8726ecSRaja Mani 	u32 max_spatial_stream;
1042b3e71d7aSAshok Raj Nagarajan 	/* protected by conf_mutex */
1043fa879490STomislav Požega 	u32 low_2ghz_chan;
1044fa879490STomislav Požega 	u32 high_2ghz_chan;
1045523f6701STamizh chelvam 	u32 low_5ghz_chan;
1046523f6701STamizh chelvam 	u32 high_5ghz_chan;
1047b3e71d7aSAshok Raj Nagarajan 	bool ani_enabled;
10481382993fSWen Gong 	u32 sys_cap_info;
10491382993fSWen Gong 
10501382993fSWen Gong 	/* protected by data_lock */
10511382993fSWen Gong 	bool hw_rfkill_on;
10521382993fSWen Gong 
1053d70c0d46SMaharaja Kennadyrajan 	/* protected by conf_mutex */
1054d70c0d46SMaharaja Kennadyrajan 	u8 ps_state_enable;
10555e3dd157SKalle Valo 
1056ce834e28SWen Gong 	bool nlo_enabled;
10575e3dd157SKalle Valo 	bool p2p;
10585e3dd157SKalle Valo 
10595e3dd157SKalle Valo 	struct {
1060e07db352SKalle Valo 		enum ath10k_bus bus;
10615e3dd157SKalle Valo 		const struct ath10k_hif_ops *ops;
10625e3dd157SKalle Valo 	} hif;
10635e3dd157SKalle Valo 
10649042e17dSMarek Puzyniak 	struct completion target_suspend;
10650e622f67SSurabhi Vishnoi 	struct completion driver_recovery;
10665e3dd157SKalle Valo 
1067d63955b3SMichal Kazior 	const struct ath10k_hw_regs *regs;
106803a016f8SSarada Prasanna Garnayak 	const struct ath10k_hw_ce_regs *hw_ce_regs;
10692f2cfc4aSVasanthakumar Thiagarajan 	const struct ath10k_hw_values *hw_values;
10705e3dd157SKalle Valo 	struct ath10k_bmi bmi;
1071edb8236dSMichal Kazior 	struct ath10k_wmi wmi;
1072cd003fadSMichal Kazior 	struct ath10k_htc htc;
1073edb8236dSMichal Kazior 	struct ath10k_htt htt;
10745e3dd157SKalle Valo 
107543d923e2SVasanthakumar Thiagarajan 	struct ath10k_hw_params hw_params;
10765e3dd157SKalle Valo 
10777ebf721dSKalle Valo 	/* contains the firmware images used with ATH10K_FIRMWARE_MODE_NORMAL */
10787ebf721dSKalle Valo 	struct ath10k_fw_components normal_mode_fw;
1079958df3a0SKalle Valo 
10807ebf721dSKalle Valo 	/* READ-ONLY images of the running firmware, which can be either
10817ebf721dSKalle Valo 	 * normal or UTF. Do not modify, release etc!
10827ebf721dSKalle Valo 	 */
10837ebf721dSKalle Valo 	const struct ath10k_fw_components *running_fw;
108429385057SMichal Kazior 
10855abf2597SDmitry Baryshkov 	const char *board_name;
10865abf2597SDmitry Baryshkov 
10873d9195eaSRaja Mani 	const struct firmware *pre_cal_file;
1088a58227efSKalle Valo 	const struct firmware *cal_file;
1089a58227efSKalle Valo 
1090dcb02db1SVasanthakumar Thiagarajan 	struct {
10910a51b343SManikanta Pubbisetty 		u32 vendor;
10920a51b343SManikanta Pubbisetty 		u32 device;
10930a51b343SManikanta Pubbisetty 		u32 subsystem_vendor;
10940a51b343SManikanta Pubbisetty 		u32 subsystem_device;
1095db0984e5SManikanta Pubbisetty 
1096db0984e5SManikanta Pubbisetty 		bool bmi_ids_valid;
109722e8a460SRakesh Pillai 		bool qmi_ids_valid;
109822e8a460SRakesh Pillai 		u32 qmi_board_id;
10994e938105SRakesh Pillai 		u32 qmi_chip_id;
1100db0984e5SManikanta Pubbisetty 		u8 bmi_board_id;
110131324d17SSathishkumar Muruganandam 		u8 bmi_eboard_id;
1102db0984e5SManikanta Pubbisetty 		u8 bmi_chip_id;
110331324d17SSathishkumar Muruganandam 		bool ext_bid_supported;
11041657b8f8SWaldemar Rymarkiewicz 
11051657b8f8SWaldemar Rymarkiewicz 		char bdf_ext[ATH10K_SMBIOS_BDF_EXT_STR_LENGTH];
11060a51b343SManikanta Pubbisetty 	} id;
1107de57e2c8SMichal Kazior 
11081a222435SKalle Valo 	int fw_api;
11090a51b343SManikanta Pubbisetty 	int bd_api;
1110a58227efSKalle Valo 	enum ath10k_cal_mode cal_mode;
11111a222435SKalle Valo 
11125e3dd157SKalle Valo 	struct {
11135e3dd157SKalle Valo 		struct completion started;
11145e3dd157SKalle Valo 		struct completion completed;
11155e3dd157SKalle Valo 		struct completion on_channel;
11165c81c7fdSMichal Kazior 		struct delayed_work timeout;
11175c81c7fdSMichal Kazior 		enum ath10k_scan_state state;
11185e3dd157SKalle Valo 		bool is_roc;
11195e3dd157SKalle Valo 		int vdev_id;
11205e3dd157SKalle Valo 		int roc_freq;
1121d710e75dSMichal Kazior 		bool roc_notify;
11225e3dd157SKalle Valo 	} scan;
11235e3dd157SKalle Valo 
11245e3dd157SKalle Valo 	struct {
112557fbcce3SJohannes Berg 		struct ieee80211_supported_band sbands[NUM_NL80211_BANDS];
11265e3dd157SKalle Valo 	} mac;
11275e3dd157SKalle Valo 
11285e3dd157SKalle Valo 	/* should never be NULL; needed for regular htt rx */
11295e3dd157SKalle Valo 	struct ieee80211_channel *rx_channel;
11305e3dd157SKalle Valo 
11315e3dd157SKalle Valo 	/* valid during scan; needed for mgmt rx during scan */
11325e3dd157SKalle Valo 	struct ieee80211_channel *scan_channel;
11335e3dd157SKalle Valo 
1134c930f744SMichal Kazior 	/* current operating channel definition */
1135c930f744SMichal Kazior 	struct cfg80211_chan_def chandef;
1136c930f744SMichal Kazior 
11372ce9b25cSRajkumar Manoharan 	/* currently configured operating channel in firmware */
11382ce9b25cSRajkumar Manoharan 	struct ieee80211_channel *tgt_oper_chan;
11392ce9b25cSRajkumar Manoharan 
114016c11176SBen Greear 	unsigned long long free_vdev_map;
1141500ff9f9SMichal Kazior 	struct ath10k_vif *monitor_arvif;
11421bbc0975SMichal Kazior 	bool monitor;
11435e3dd157SKalle Valo 	int monitor_vdev_id;
11441bbc0975SMichal Kazior 	bool monitor_started;
11455e3dd157SKalle Valo 	unsigned int filter_flags;
1146e8a50f8bSMarek Puzyniak 	unsigned long dev_flags;
1147621a5f7aSViresh Kumar 	bool dfs_block_radar_events;
11485e3dd157SKalle Valo 
1149d650097bSMichal Kazior 	/* protected by conf_mutex */
1150d650097bSMichal Kazior 	bool radar_enabled;
1151d650097bSMichal Kazior 	int num_started_vdevs;
1152d650097bSMichal Kazior 
115346acf7bbSBen Greear 	/* Protected by conf-mutex */
115446acf7bbSBen Greear 	u8 cfg_tx_chainmask;
115546acf7bbSBen Greear 	u8 cfg_rx_chainmask;
115646acf7bbSBen Greear 
11575e3dd157SKalle Valo 	struct completion install_key_done;
11585e3dd157SKalle Valo 
1159833fd34dSBen Greear 	int last_wmi_vdev_start_status;
11605e3dd157SKalle Valo 	struct completion vdev_setup_done;
1161fe36e70fSRakesh Pillai 	struct completion vdev_delete_done;
11620f7cb268SWen Gong 	struct completion peer_stats_info_complete;
11635e3dd157SKalle Valo 
11645e3dd157SKalle Valo 	struct workqueue_struct *workqueue;
1165c8ecfc1cSRaja Mani 	/* Auxiliary workqueue */
1166c8ecfc1cSRaja Mani 	struct workqueue_struct *workqueue_aux;
1167c8334512SWen Gong 	struct workqueue_struct *workqueue_tx_complete;
11685e3dd157SKalle Valo 	/* prevents concurrent FW reconfiguration */
11695e3dd157SKalle Valo 	struct mutex conf_mutex;
11705e3dd157SKalle Valo 
117138faed15SBrian Norris 	/* protects coredump data */
117238faed15SBrian Norris 	struct mutex dump_mutex;
117338faed15SBrian Norris 
11745e3dd157SKalle Valo 	/* protects shared structure data */
11755e3dd157SKalle Valo 	spinlock_t data_lock;
11765e3dd157SKalle Valo 
1177b719ebc3SAlexander Wetzel 	/* serialize wake_tx_queue calls per ac */
1178b719ebc3SAlexander Wetzel 	spinlock_t queue_lock[IEEE80211_NUM_ACS];
1179b719ebc3SAlexander Wetzel 
11800579119fSMichal Kazior 	struct list_head arvifs;
11815e3dd157SKalle Valo 	struct list_head peers;
11826942726fSMichal Kazior 	struct ath10k_peer *peer_map[ATH10K_MAX_NUM_PEER_IDS];
11835e3dd157SKalle Valo 	wait_queue_head_t peer_mapping_wq;
11845e3dd157SKalle Valo 
1185292a753dSMichal Kazior 	/* protected by conf_mutex */
11860e759f36SBartosz Markowski 	int num_peers;
1187cfd1061eSMichal Kazior 	int num_stations;
1188cfd1061eSMichal Kazior 
1189cfd1061eSMichal Kazior 	int max_num_peers;
1190cfd1061eSMichal Kazior 	int max_num_stations;
119130c78167SKalle Valo 	int max_num_vdevs;
11928cca3d60SMarek Puzyniak 	int max_num_tdls_vdevs;
1193d1e52a8eSRaja Mani 	int num_active_peers;
1194d1e52a8eSRaja Mani 	int num_tids;
11950e759f36SBartosz Markowski 
1196c8ecfc1cSRaja Mani 	struct work_struct svc_rdy_work;
1197c8ecfc1cSRaja Mani 	struct sk_buff *svc_rdy_skb;
1198c8ecfc1cSRaja Mani 
11995e3dd157SKalle Valo 	struct work_struct offchan_tx_work;
12005e3dd157SKalle Valo 	struct sk_buff_head offchan_tx_queue;
12015e3dd157SKalle Valo 	struct completion offchan_tx_completed;
12025e3dd157SKalle Valo 	struct sk_buff *offchan_tx_skb;
12035e3dd157SKalle Valo 
12045e00d31aSBartosz Markowski 	struct work_struct wmi_mgmt_tx_work;
12055e00d31aSBartosz Markowski 	struct sk_buff_head wmi_mgmt_tx_queue;
12065e00d31aSBartosz Markowski 
1207f7843d7fSMichal Kazior 	enum ath10k_state state;
1208f7843d7fSMichal Kazior 
12096782cb69SMichal Kazior 	struct work_struct register_work;
1210affd3217SMichal Kazior 	struct work_struct restart_work;
1211c8334512SWen Gong 	struct work_struct bundle_tx_work;
1212c8334512SWen Gong 	struct work_struct tx_complete_work;
1213affd3217SMichal Kazior 
1214*c256a94dSKang Yang 	atomic_t pending_recovery;
1215*c256a94dSKang Yang 	unsigned int recovery_count;
1216*c256a94dSKang Yang 	/* continuous recovery fail count */
1217*c256a94dSKang Yang 	atomic_t fail_cont_count;
1218*c256a94dSKang Yang 
12192e1dea40SMichal Kazior 	/* cycle count is reported twice for each visited channel during scan.
122037ff1b0dSMarcin Rokicki 	 * access protected by data_lock
122137ff1b0dSMarcin Rokicki 	 */
12222e1dea40SMichal Kazior 	u32 survey_last_rx_clear_count;
12232e1dea40SMichal Kazior 	u32 survey_last_cycle_count;
12242e1dea40SMichal Kazior 	struct survey_info survey[ATH10K_NUM_CHANS];
12252e1dea40SMichal Kazior 
122644b7d483SMichal Kazior 	/* Channel info events are expected to come in pairs without and with
122744b7d483SMichal Kazior 	 * COMPLETE flag set respectively for each channel visit during scan.
122844b7d483SMichal Kazior 	 *
122944b7d483SMichal Kazior 	 * However there are deviations from this rule. This flag is used to
123044b7d483SMichal Kazior 	 * avoid reporting garbage data.
123144b7d483SMichal Kazior 	 */
123244b7d483SMichal Kazior 	bool ch_info_can_report_survey;
1233fa7937e3SRajkumar Manoharan 	struct completion bss_survey_done;
123444b7d483SMichal Kazior 
12359702c686SJanusz Dziedzic 	struct dfs_pattern_detector *dfs_detector;
12369702c686SJanusz Dziedzic 
123796d828d4SMichal Kazior 	unsigned long tx_paused; /* see ATH10K_TX_PAUSE_ */
123896d828d4SMichal Kazior 
12395e3dd157SKalle Valo #ifdef CONFIG_ATH10K_DEBUGFS
12405e3dd157SKalle Valo 	struct ath10k_debug debug;
1241855aed12SSimon Wunderlich 	struct {
1242855aed12SSimon Wunderlich 		/* relay(fs) channel for spectral scan */
1243855aed12SSimon Wunderlich 		struct rchan *rfs_chan_spec_scan;
1244855aed12SSimon Wunderlich 
1245855aed12SSimon Wunderlich 		/* spectral_mode and spec_config are protected by conf_mutex */
1246855aed12SSimon Wunderlich 		enum ath10k_spectral_mode mode;
1247855aed12SSimon Wunderlich 		struct ath10k_spec_scan config;
1248855aed12SSimon Wunderlich 	} spectral;
1249de46d165SMohammed Shafi Shajakhan #endif
1250e7b54194SMichal Kazior 
12517f9befbbSAnilkumar Kolli 	u32 pktlog_filter;
1252e2fcf60cSKalle Valo 
1253e2fcf60cSKalle Valo #ifdef CONFIG_DEV_COREDUMP
1254e2fcf60cSKalle Valo 	struct {
1255e2fcf60cSKalle Valo 		struct ath10k_fw_crash_data *fw_crash_data;
1256e2fcf60cSKalle Valo 	} coredump;
1257e2fcf60cSKalle Valo #endif
1258e2fcf60cSKalle Valo 
125943d2a30fSKalle Valo 	struct {
126043d2a30fSKalle Valo 		/* protected by conf_mutex */
12617ebf721dSKalle Valo 		struct ath10k_fw_components utf_mode_fw;
12627ebf721dSKalle Valo 
126343d2a30fSKalle Valo 		/* protected by data_lock */
126443d2a30fSKalle Valo 		bool utf_monitor;
126543d2a30fSKalle Valo 	} testmode;
126643d2a30fSKalle Valo 
1267f51dbe73SBen Greear 	struct {
12688e1debd8SSebastian Gottschall 		struct gpio_led wifi_led;
12698e1debd8SSebastian Gottschall 		struct led_classdev cdev;
12708e1debd8SSebastian Gottschall 		char label[48];
12718e1debd8SSebastian Gottschall 		u32 gpio_state_pin;
12728e1debd8SSebastian Gottschall 	} leds;
12738e1debd8SSebastian Gottschall 
12748e1debd8SSebastian Gottschall 	struct {
1275f51dbe73SBen Greear 		/* protected by data_lock */
1276ea0c3e2aSLinus Lüssing 		u32 rx_crc_err_drop;
1277f51dbe73SBen Greear 		u32 fw_crash_counter;
1278f51dbe73SBen Greear 		u32 fw_warm_reset_counter;
1279f51dbe73SBen Greear 		u32 fw_cold_reset_counter;
1280f51dbe73SBen Greear 	} stats;
1281f51dbe73SBen Greear 
1282fe6f36d6SRajkumar Manoharan 	struct ath10k_thermal thermal;
12835fd3ac3cSJanusz Dziedzic 	struct ath10k_wow wow;
1284cec17c38SAnilkumar Kolli 	struct ath10k_per_peer_tx_stats peer_tx_stats;
1285fe6f36d6SRajkumar Manoharan 
12863c97f5deSRajkumar Manoharan 	/* NAPI */
128757738dabSBreno Leitao 	struct net_device *napi_dev;
12883c97f5deSRajkumar Manoharan 	struct napi_struct napi;
12893c97f5deSRajkumar Manoharan 
1290ebee76f7SBenjamin Berg 	struct work_struct set_coverage_class_work;
1291ebee76f7SBenjamin Berg 	/* protected by conf_mutex */
1292ebee76f7SBenjamin Berg 	struct {
1293ebee76f7SBenjamin Berg 		/* writing also protected by data_lock */
1294ebee76f7SBenjamin Berg 		s16 coverage_class;
1295ebee76f7SBenjamin Berg 
1296ebee76f7SBenjamin Berg 		u32 reg_phyclk;
1297ebee76f7SBenjamin Berg 		u32 reg_slottime_conf;
1298ebee76f7SBenjamin Berg 		u32 reg_slottime_orig;
1299ebee76f7SBenjamin Berg 		u32 reg_ack_cts_timeout_conf;
1300ebee76f7SBenjamin Berg 		u32 reg_ack_cts_timeout_orig;
1301ebee76f7SBenjamin Berg 	} fw_coverage;
1302ebee76f7SBenjamin Berg 
130347cc0ca9SMatthias Frei 	u32 ampdu_reference;
130447cc0ca9SMatthias Frei 
13057d94f862SAbhishek Ambure 	const u8 *wmi_key_cipher;
1306641fe28aSGovind Singh 	void *ce_priv;
1307641fe28aSGovind Singh 
1308caee728aSVasanthakumar Thiagarajan 	u32 sta_tid_stats_mask;
1309caee728aSVasanthakumar Thiagarajan 
13106f6eb1bcSSriram R 	/* protected by data_lock */
13116f6eb1bcSSriram R 	enum ath10k_radar_confirmation_state radar_conf_state;
13126f6eb1bcSSriram R 	struct ath10k_radar_found_info last_radar_info;
13136f6eb1bcSSriram R 	struct work_struct radar_confirmation_work;
1314de8781d7SGovind Singh 	struct ath10k_bus_params bus_param;
1315c6f537a1SDundi Raviteja 	struct completion peer_delete_done;
13166f6eb1bcSSriram R 
13179f83993eSTamizh Chelvam 	bool coex_support;
13189f83993eSTamizh Chelvam 	int coex_gpio_pin;
13199f83993eSTamizh Chelvam 
1320442545baSCarl Huang 	s32 tx_power_2g_limit;
1321442545baSCarl Huang 	s32 tx_power_5g_limit;
1322442545baSCarl Huang 
1323e7b54194SMichal Kazior 	/* must be last */
1324d3ed0cf0SGustavo A. R. Silva 	u8 drv_priv[] __aligned(sizeof(void *));
13255e3dd157SKalle Valo };
13265e3dd157SKalle Valo 
ath10k_peer_stats_enabled(struct ath10k * ar)1327cc61a1bbSMohammed Shafi Shajakhan static inline bool ath10k_peer_stats_enabled(struct ath10k *ar)
1328cc61a1bbSMohammed Shafi Shajakhan {
1329cc61a1bbSMohammed Shafi Shajakhan 	if (test_bit(ATH10K_FLAG_PEER_STATS, &ar->dev_flags) &&
1330cc61a1bbSMohammed Shafi Shajakhan 	    test_bit(WMI_SERVICE_PEER_STATS, ar->wmi.svc_map))
1331cc61a1bbSMohammed Shafi Shajakhan 		return true;
1332cc61a1bbSMohammed Shafi Shajakhan 
1333cc61a1bbSMohammed Shafi Shajakhan 	return false;
1334cc61a1bbSMohammed Shafi Shajakhan }
1335cc61a1bbSMohammed Shafi Shajakhan 
1336a0974054SSergey Ryazanov extern unsigned int ath10k_frame_mode;
13375c9d0a20SKalle Valo extern unsigned long ath10k_coredump_mask;
13385c9d0a20SKalle Valo 
1339e2f8b74eSWen Gong void ath10k_core_napi_sync_disable(struct ath10k *ar);
1340e2f8b74eSWen Gong void ath10k_core_napi_enable(struct ath10k *ar);
1341e7b54194SMichal Kazior struct ath10k *ath10k_core_create(size_t priv_size, struct device *dev,
1342e07db352SKalle Valo 				  enum ath10k_bus bus,
1343d63955b3SMichal Kazior 				  enum ath10k_hw_rev hw_rev,
13445e3dd157SKalle Valo 				  const struct ath10k_hif_ops *hif_ops);
13455e3dd157SKalle Valo void ath10k_core_destroy(struct ath10k *ar);
1346b27bc5a4SMichal Kazior void ath10k_core_get_fw_features_str(struct ath10k *ar,
1347b27bc5a4SMichal Kazior 				     char *buf,
1348b27bc5a4SMichal Kazior 				     size_t max_len);
13499dfe240bSKalle Valo int ath10k_core_fetch_firmware_api_n(struct ath10k *ar, const char *name,
13509dfe240bSKalle Valo 				     struct ath10k_fw_file *fw_file);
13515e3dd157SKalle Valo 
13527ebf721dSKalle Valo int ath10k_core_start(struct ath10k *ar, enum ath10k_firmware_mode mode,
13537ebf721dSKalle Valo 		      const struct ath10k_fw_components *fw_components);
135400f5482bSMarek Puzyniak int ath10k_wait_for_suspend(struct ath10k *ar, u32 suspend_opt);
1355dd30a36eSMichal Kazior void ath10k_core_stop(struct ath10k *ar);
13565dadbe4eSWen Gong void ath10k_core_start_recovery(struct ath10k *ar);
1357c0d8d565SErik Stromdahl int ath10k_core_register(struct ath10k *ar,
1358c0d8d565SErik Stromdahl 			 const struct ath10k_bus_params *bus_params);
13595e3dd157SKalle Valo void ath10k_core_unregister(struct ath10k *ar);
1360ba94c753SGovind Singh int ath10k_core_fetch_board_file(struct ath10k *ar, int bd_ie_type);
13614e938105SRakesh Pillai int ath10k_core_check_dt(struct ath10k *ar);
1362ba94c753SGovind Singh void ath10k_core_free_board_files(struct ath10k *ar);
13635e3dd157SKalle Valo 
13645e3dd157SKalle Valo #endif /* _CORE_H_ */
1365