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