Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
0002 /*
0003  * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
0004  */
0005 
0006 #ifndef ATH11K_DP_H
0007 #define ATH11K_DP_H
0008 
0009 #include "hal_rx.h"
0010 
0011 #define MAX_RXDMA_PER_PDEV     2
0012 
0013 struct ath11k_base;
0014 struct ath11k_peer;
0015 struct ath11k_dp;
0016 struct ath11k_vif;
0017 struct hal_tcl_status_ring;
0018 struct ath11k_ext_irq_grp;
0019 
0020 struct dp_rx_tid {
0021     u8 tid;
0022     u32 *vaddr;
0023     dma_addr_t paddr;
0024     u32 size;
0025     u32 ba_win_sz;
0026     bool active;
0027 
0028     /* Info related to rx fragments */
0029     u32 cur_sn;
0030     u16 last_frag_no;
0031     u16 rx_frag_bitmap;
0032 
0033     struct sk_buff_head rx_frags;
0034     struct hal_reo_dest_ring *dst_ring_desc;
0035 
0036     /* Timer info related to fragments */
0037     struct timer_list frag_timer;
0038     struct ath11k_base *ab;
0039 };
0040 
0041 #define DP_REO_DESC_FREE_THRESHOLD  64
0042 #define DP_REO_DESC_FREE_TIMEOUT_MS 1000
0043 #define DP_MON_PURGE_TIMEOUT_MS     100
0044 #define DP_MON_SERVICE_BUDGET       128
0045 
0046 struct dp_reo_cache_flush_elem {
0047     struct list_head list;
0048     struct dp_rx_tid data;
0049     unsigned long ts;
0050 };
0051 
0052 struct dp_reo_cmd {
0053     struct list_head list;
0054     struct dp_rx_tid data;
0055     int cmd_num;
0056     void (*handler)(struct ath11k_dp *, void *,
0057             enum hal_reo_cmd_status status);
0058 };
0059 
0060 struct dp_srng {
0061     u32 *vaddr_unaligned;
0062     u32 *vaddr;
0063     dma_addr_t paddr_unaligned;
0064     dma_addr_t paddr;
0065     int size;
0066     u32 ring_id;
0067     u8 cached;
0068 };
0069 
0070 struct dp_rxdma_ring {
0071     struct dp_srng refill_buf_ring;
0072     struct idr bufs_idr;
0073     /* Protects bufs_idr */
0074     spinlock_t idr_lock;
0075     int bufs_max;
0076 };
0077 
0078 #define ATH11K_TX_COMPL_NEXT(x) (((x) + 1) % DP_TX_COMP_RING_SIZE)
0079 
0080 struct dp_tx_ring {
0081     u8 tcl_data_ring_id;
0082     struct dp_srng tcl_data_ring;
0083     struct dp_srng tcl_comp_ring;
0084     struct idr txbuf_idr;
0085     /* Protects txbuf_idr and num_pending */
0086     spinlock_t tx_idr_lock;
0087     struct hal_wbm_release_ring *tx_status;
0088     int tx_status_head;
0089     int tx_status_tail;
0090 };
0091 
0092 enum dp_mon_status_buf_state {
0093     /* PPDU id matches in dst ring and status ring */
0094     DP_MON_STATUS_MATCH,
0095     /* status ring dma is not done */
0096     DP_MON_STATUS_NO_DMA,
0097     /* status ring is lagging, reap status ring */
0098     DP_MON_STATUS_LAG,
0099     /* status ring is leading, reap dst ring and drop */
0100     DP_MON_STATUS_LEAD,
0101     /* replinish monitor status ring */
0102     DP_MON_STATUS_REPLINISH,
0103 };
0104 
0105 struct ath11k_pdev_mon_stats {
0106     u32 status_ppdu_state;
0107     u32 status_ppdu_start;
0108     u32 status_ppdu_end;
0109     u32 status_ppdu_compl;
0110     u32 status_ppdu_start_mis;
0111     u32 status_ppdu_end_mis;
0112     u32 status_ppdu_done;
0113     u32 dest_ppdu_done;
0114     u32 dest_mpdu_done;
0115     u32 dest_mpdu_drop;
0116     u32 dup_mon_linkdesc_cnt;
0117     u32 dup_mon_buf_cnt;
0118     u32 dest_mon_stuck;
0119     u32 dest_mon_not_reaped;
0120 };
0121 
0122 struct dp_full_mon_mpdu {
0123     struct list_head list;
0124     struct sk_buff *head;
0125     struct sk_buff *tail;
0126 };
0127 
0128 struct dp_link_desc_bank {
0129     void *vaddr_unaligned;
0130     void *vaddr;
0131     dma_addr_t paddr_unaligned;
0132     dma_addr_t paddr;
0133     u32 size;
0134 };
0135 
0136 /* Size to enforce scatter idle list mode */
0137 #define DP_LINK_DESC_ALLOC_SIZE_THRESH 0x200000
0138 #define DP_LINK_DESC_BANKS_MAX 8
0139 
0140 #define DP_RX_DESC_COOKIE_INDEX_MAX     0x3ffff
0141 #define DP_RX_DESC_COOKIE_POOL_ID_MAX       0x1c0000
0142 #define DP_RX_DESC_COOKIE_MAX   \
0143     (DP_RX_DESC_COOKIE_INDEX_MAX | DP_RX_DESC_COOKIE_POOL_ID_MAX)
0144 #define DP_NOT_PPDU_ID_WRAP_AROUND 20000
0145 
0146 enum ath11k_dp_ppdu_state {
0147     DP_PPDU_STATUS_START,
0148     DP_PPDU_STATUS_DONE,
0149 };
0150 
0151 struct ath11k_mon_data {
0152     struct dp_link_desc_bank link_desc_banks[DP_LINK_DESC_BANKS_MAX];
0153     struct hal_rx_mon_ppdu_info mon_ppdu_info;
0154 
0155     u32 mon_ppdu_status;
0156     u32 mon_last_buf_cookie;
0157     u64 mon_last_linkdesc_paddr;
0158     u16 chan_noise_floor;
0159     bool hold_mon_dst_ring;
0160     enum dp_mon_status_buf_state buf_state;
0161     dma_addr_t mon_status_paddr;
0162     struct dp_full_mon_mpdu *mon_mpdu;
0163     struct hal_sw_mon_ring_entries sw_mon_entries;
0164     struct ath11k_pdev_mon_stats rx_mon_stats;
0165     /* lock for monitor data */
0166     spinlock_t mon_lock;
0167     struct sk_buff_head rx_status_q;
0168 };
0169 
0170 struct ath11k_pdev_dp {
0171     u32 mac_id;
0172     u32 mon_dest_ring_stuck_cnt;
0173     atomic_t num_tx_pending;
0174     wait_queue_head_t tx_empty_waitq;
0175     struct dp_rxdma_ring rx_refill_buf_ring;
0176     struct dp_srng rx_mac_buf_ring[MAX_RXDMA_PER_PDEV];
0177     struct dp_srng rxdma_err_dst_ring[MAX_RXDMA_PER_PDEV];
0178     struct dp_srng rxdma_mon_dst_ring;
0179     struct dp_srng rxdma_mon_desc_ring;
0180 
0181     struct dp_rxdma_ring rxdma_mon_buf_ring;
0182     struct dp_rxdma_ring rx_mon_status_refill_ring[MAX_RXDMA_PER_PDEV];
0183     struct ieee80211_rx_status rx_status;
0184     struct ath11k_mon_data mon_data;
0185 };
0186 
0187 #define DP_NUM_CLIENTS_MAX 64
0188 #define DP_AVG_TIDS_PER_CLIENT 2
0189 #define DP_NUM_TIDS_MAX (DP_NUM_CLIENTS_MAX * DP_AVG_TIDS_PER_CLIENT)
0190 #define DP_AVG_MSDUS_PER_FLOW 128
0191 #define DP_AVG_FLOWS_PER_TID 2
0192 #define DP_AVG_MPDUS_PER_TID_MAX 128
0193 #define DP_AVG_MSDUS_PER_MPDU 4
0194 
0195 #define DP_RX_HASH_ENABLE   1 /* Enable hash based Rx steering */
0196 
0197 #define DP_BA_WIN_SZ_MAX    256
0198 
0199 #define DP_TCL_NUM_RING_MAX 3
0200 #define DP_TCL_NUM_RING_MAX_QCA6390 1
0201 
0202 #define DP_IDLE_SCATTER_BUFS_MAX 16
0203 
0204 #define DP_WBM_RELEASE_RING_SIZE    64
0205 #define DP_TCL_DATA_RING_SIZE       512
0206 #define DP_TX_COMP_RING_SIZE        32768
0207 #define DP_TX_IDR_SIZE          DP_TX_COMP_RING_SIZE
0208 #define DP_TCL_CMD_RING_SIZE        32
0209 #define DP_TCL_STATUS_RING_SIZE     32
0210 #define DP_REO_DST_RING_MAX     4
0211 #define DP_REO_DST_RING_SIZE        2048
0212 #define DP_REO_REINJECT_RING_SIZE   32
0213 #define DP_RX_RELEASE_RING_SIZE     1024
0214 #define DP_REO_EXCEPTION_RING_SIZE  128
0215 #define DP_REO_CMD_RING_SIZE        128
0216 #define DP_REO_STATUS_RING_SIZE     2048
0217 #define DP_RXDMA_BUF_RING_SIZE      4096
0218 #define DP_RXDMA_REFILL_RING_SIZE   2048
0219 #define DP_RXDMA_ERR_DST_RING_SIZE  1024
0220 #define DP_RXDMA_MON_STATUS_RING_SIZE   1024
0221 #define DP_RXDMA_MONITOR_BUF_RING_SIZE  4096
0222 #define DP_RXDMA_MONITOR_DST_RING_SIZE  2048
0223 #define DP_RXDMA_MONITOR_DESC_RING_SIZE 4096
0224 
0225 #define DP_RX_BUFFER_SIZE   2048
0226 #define DP_RX_BUFFER_SIZE_LITE  1024
0227 #define DP_RX_BUFFER_ALIGN_SIZE 128
0228 
0229 #define DP_RXDMA_BUF_COOKIE_BUF_ID  GENMASK(17, 0)
0230 #define DP_RXDMA_BUF_COOKIE_PDEV_ID GENMASK(20, 18)
0231 
0232 #define DP_HW2SW_MACID(mac_id) ((mac_id) ? ((mac_id) - 1) : 0)
0233 #define DP_SW2HW_MACID(mac_id) ((mac_id) + 1)
0234 
0235 #define DP_TX_DESC_ID_MAC_ID  GENMASK(1, 0)
0236 #define DP_TX_DESC_ID_MSDU_ID GENMASK(18, 2)
0237 #define DP_TX_DESC_ID_POOL_ID GENMASK(20, 19)
0238 
0239 #define ATH11K_SHADOW_DP_TIMER_INTERVAL 20
0240 #define ATH11K_SHADOW_CTRL_TIMER_INTERVAL 10
0241 
0242 struct ath11k_hp_update_timer {
0243     struct timer_list timer;
0244     bool started;
0245     bool init;
0246     u32 tx_num;
0247     u32 timer_tx_num;
0248     u32 ring_id;
0249     u32 interval;
0250     struct ath11k_base *ab;
0251 };
0252 
0253 struct ath11k_dp {
0254     struct ath11k_base *ab;
0255     enum ath11k_htc_ep_id eid;
0256     struct completion htt_tgt_version_received;
0257     u8 htt_tgt_ver_major;
0258     u8 htt_tgt_ver_minor;
0259     struct dp_link_desc_bank link_desc_banks[DP_LINK_DESC_BANKS_MAX];
0260     struct dp_srng wbm_idle_ring;
0261     struct dp_srng wbm_desc_rel_ring;
0262     struct dp_srng tcl_cmd_ring;
0263     struct dp_srng tcl_status_ring;
0264     struct dp_srng reo_reinject_ring;
0265     struct dp_srng rx_rel_ring;
0266     struct dp_srng reo_except_ring;
0267     struct dp_srng reo_cmd_ring;
0268     struct dp_srng reo_status_ring;
0269     struct dp_srng reo_dst_ring[DP_REO_DST_RING_MAX];
0270     struct dp_tx_ring tx_ring[DP_TCL_NUM_RING_MAX];
0271     struct hal_wbm_idle_scatter_list scatter_list[DP_IDLE_SCATTER_BUFS_MAX];
0272     struct list_head reo_cmd_list;
0273     struct list_head reo_cmd_cache_flush_list;
0274     struct list_head dp_full_mon_mpdu_list;
0275     u32 reo_cmd_cache_flush_count;
0276     /**
0277      * protects access to below fields,
0278      * - reo_cmd_list
0279      * - reo_cmd_cache_flush_list
0280      * - reo_cmd_cache_flush_count
0281      */
0282     spinlock_t reo_cmd_lock;
0283     struct ath11k_hp_update_timer reo_cmd_timer;
0284     struct ath11k_hp_update_timer tx_ring_timer[DP_TCL_NUM_RING_MAX];
0285 };
0286 
0287 /* HTT definitions */
0288 
0289 #define HTT_TCL_META_DATA_TYPE          BIT(0)
0290 #define HTT_TCL_META_DATA_VALID_HTT     BIT(1)
0291 
0292 /* vdev meta data */
0293 #define HTT_TCL_META_DATA_VDEV_ID       GENMASK(9, 2)
0294 #define HTT_TCL_META_DATA_PDEV_ID       GENMASK(11, 10)
0295 #define HTT_TCL_META_DATA_HOST_INSPECTED    BIT(12)
0296 
0297 /* peer meta data */
0298 #define HTT_TCL_META_DATA_PEER_ID       GENMASK(15, 2)
0299 
0300 #define HTT_TX_WBM_COMP_STATUS_OFFSET 8
0301 
0302 /* HTT tx completion is overlayed in wbm_release_ring */
0303 #define HTT_TX_WBM_COMP_INFO0_STATUS        GENMASK(12, 9)
0304 #define HTT_TX_WBM_COMP_INFO0_REINJECT_REASON   GENMASK(16, 13)
0305 #define HTT_TX_WBM_COMP_INFO0_REINJECT_REASON   GENMASK(16, 13)
0306 
0307 #define HTT_TX_WBM_COMP_INFO1_ACK_RSSI      GENMASK(31, 24)
0308 
0309 struct htt_tx_wbm_completion {
0310     u32 info0;
0311     u32 info1;
0312     u32 info2;
0313     u32 info3;
0314 } __packed;
0315 
0316 enum htt_h2t_msg_type {
0317     HTT_H2T_MSG_TYPE_VERSION_REQ        = 0,
0318     HTT_H2T_MSG_TYPE_SRING_SETUP        = 0xb,
0319     HTT_H2T_MSG_TYPE_RX_RING_SELECTION_CFG  = 0xc,
0320     HTT_H2T_MSG_TYPE_EXT_STATS_CFG      = 0x10,
0321     HTT_H2T_MSG_TYPE_PPDU_STATS_CFG     = 0x11,
0322     HTT_H2T_MSG_TYPE_RX_FULL_MONITOR_MODE   = 0x17,
0323 };
0324 
0325 #define HTT_VER_REQ_INFO_MSG_ID     GENMASK(7, 0)
0326 
0327 struct htt_ver_req_cmd {
0328     u32 ver_reg_info;
0329 } __packed;
0330 
0331 enum htt_srng_ring_type {
0332     HTT_HW_TO_SW_RING,
0333     HTT_SW_TO_HW_RING,
0334     HTT_SW_TO_SW_RING,
0335 };
0336 
0337 enum htt_srng_ring_id {
0338     HTT_RXDMA_HOST_BUF_RING,
0339     HTT_RXDMA_MONITOR_STATUS_RING,
0340     HTT_RXDMA_MONITOR_BUF_RING,
0341     HTT_RXDMA_MONITOR_DESC_RING,
0342     HTT_RXDMA_MONITOR_DEST_RING,
0343     HTT_HOST1_TO_FW_RXBUF_RING,
0344     HTT_HOST2_TO_FW_RXBUF_RING,
0345     HTT_RXDMA_NON_MONITOR_DEST_RING,
0346 };
0347 
0348 /* host -> target  HTT_SRING_SETUP message
0349  *
0350  * After target is booted up, Host can send SRING setup message for
0351  * each host facing LMAC SRING. Target setups up HW registers based
0352  * on setup message and confirms back to Host if response_required is set.
0353  * Host should wait for confirmation message before sending new SRING
0354  * setup message
0355  *
0356  * The message would appear as follows:
0357  *
0358  * |31            24|23    20|19|18 16|15|14          8|7                0|
0359  * |--------------- +-----------------+----------------+------------------|
0360  * |    ring_type   |      ring_id    |    pdev_id     |     msg_type     |
0361  * |----------------------------------------------------------------------|
0362  * |                          ring_base_addr_lo                           |
0363  * |----------------------------------------------------------------------|
0364  * |                         ring_base_addr_hi                            |
0365  * |----------------------------------------------------------------------|
0366  * |ring_misc_cfg_flag|ring_entry_size|            ring_size              |
0367  * |----------------------------------------------------------------------|
0368  * |                         ring_head_offset32_remote_addr_lo            |
0369  * |----------------------------------------------------------------------|
0370  * |                         ring_head_offset32_remote_addr_hi            |
0371  * |----------------------------------------------------------------------|
0372  * |                         ring_tail_offset32_remote_addr_lo            |
0373  * |----------------------------------------------------------------------|
0374  * |                         ring_tail_offset32_remote_addr_hi            |
0375  * |----------------------------------------------------------------------|
0376  * |                          ring_msi_addr_lo                            |
0377  * |----------------------------------------------------------------------|
0378  * |                          ring_msi_addr_hi                            |
0379  * |----------------------------------------------------------------------|
0380  * |                          ring_msi_data                               |
0381  * |----------------------------------------------------------------------|
0382  * |         intr_timer_th            |IM|      intr_batch_counter_th     |
0383  * |----------------------------------------------------------------------|
0384  * |          reserved        |RR|PTCF|        intr_low_threshold         |
0385  * |----------------------------------------------------------------------|
0386  * Where
0387  *     IM = sw_intr_mode
0388  *     RR = response_required
0389  *     PTCF = prefetch_timer_cfg
0390  *
0391  * The message is interpreted as follows:
0392  * dword0  - b'0:7   - msg_type: This will be set to
0393  *                     HTT_H2T_MSG_TYPE_SRING_SETUP
0394  *           b'8:15  - pdev_id:
0395  *                     0 (for rings at SOC/UMAC level),
0396  *                     1/2/3 mac id (for rings at LMAC level)
0397  *           b'16:23 - ring_id: identify which ring is to setup,
0398  *                     more details can be got from enum htt_srng_ring_id
0399  *           b'24:31 - ring_type: identify type of host rings,
0400  *                     more details can be got from enum htt_srng_ring_type
0401  * dword1  - b'0:31  - ring_base_addr_lo: Lower 32bits of ring base address
0402  * dword2  - b'0:31  - ring_base_addr_hi: Upper 32bits of ring base address
0403  * dword3  - b'0:15  - ring_size: size of the ring in unit of 4-bytes words
0404  *           b'16:23 - ring_entry_size: Size of each entry in 4-byte word units
0405  *           b'24:31 - ring_misc_cfg_flag: Valid only for HW_TO_SW_RING and
0406  *                     SW_TO_HW_RING.
0407  *                     Refer to HTT_SRING_SETUP_RING_MISC_CFG_RING defs.
0408  * dword4  - b'0:31  - ring_head_off32_remote_addr_lo:
0409  *                     Lower 32 bits of memory address of the remote variable
0410  *                     storing the 4-byte word offset that identifies the head
0411  *                     element within the ring.
0412  *                     (The head offset variable has type u32.)
0413  *                     Valid for HW_TO_SW and SW_TO_SW rings.
0414  * dword5  - b'0:31  - ring_head_off32_remote_addr_hi:
0415  *                     Upper 32 bits of memory address of the remote variable
0416  *                     storing the 4-byte word offset that identifies the head
0417  *                     element within the ring.
0418  *                     (The head offset variable has type u32.)
0419  *                     Valid for HW_TO_SW and SW_TO_SW rings.
0420  * dword6  - b'0:31  - ring_tail_off32_remote_addr_lo:
0421  *                     Lower 32 bits of memory address of the remote variable
0422  *                     storing the 4-byte word offset that identifies the tail
0423  *                     element within the ring.
0424  *                     (The tail offset variable has type u32.)
0425  *                     Valid for HW_TO_SW and SW_TO_SW rings.
0426  * dword7  - b'0:31  - ring_tail_off32_remote_addr_hi:
0427  *                     Upper 32 bits of memory address of the remote variable
0428  *                     storing the 4-byte word offset that identifies the tail
0429  *                     element within the ring.
0430  *                     (The tail offset variable has type u32.)
0431  *                     Valid for HW_TO_SW and SW_TO_SW rings.
0432  * dword8  - b'0:31  - ring_msi_addr_lo: Lower 32bits of MSI cfg address
0433  *                     valid only for HW_TO_SW_RING and SW_TO_HW_RING
0434  * dword9  - b'0:31  - ring_msi_addr_hi: Upper 32bits of MSI cfg address
0435  *                     valid only for HW_TO_SW_RING and SW_TO_HW_RING
0436  * dword10 - b'0:31  - ring_msi_data: MSI data
0437  *                     Refer to HTT_SRING_SETUP_RING_MSC_CFG_xxx defs
0438  *                     valid only for HW_TO_SW_RING and SW_TO_HW_RING
0439  * dword11 - b'0:14  - intr_batch_counter_th:
0440  *                     batch counter threshold is in units of 4-byte words.
0441  *                     HW internally maintains and increments batch count.
0442  *                     (see SRING spec for detail description).
0443  *                     When batch count reaches threshold value, an interrupt
0444  *                     is generated by HW.
0445  *           b'15    - sw_intr_mode:
0446  *                     This configuration shall be static.
0447  *                     Only programmed at power up.
0448  *                     0: generate pulse style sw interrupts
0449  *                     1: generate level style sw interrupts
0450  *           b'16:31 - intr_timer_th:
0451  *                     The timer init value when timer is idle or is
0452  *                     initialized to start downcounting.
0453  *                     In 8us units (to cover a range of 0 to 524 ms)
0454  * dword12 - b'0:15  - intr_low_threshold:
0455  *                     Used only by Consumer ring to generate ring_sw_int_p.
0456  *                     Ring entries low threshold water mark, that is used
0457  *                     in combination with the interrupt timer as well as
0458  *                     the clearing of the level interrupt.
0459  *           b'16:18 - prefetch_timer_cfg:
0460  *                     Used only by Consumer ring to set timer mode to
0461  *                     support Application prefetch handling.
0462  *                     The external tail offset/pointer will be updated
0463  *                     at following intervals:
0464  *                     3'b000: (Prefetch feature disabled; used only for debug)
0465  *                     3'b001: 1 usec
0466  *                     3'b010: 4 usec
0467  *                     3'b011: 8 usec (default)
0468  *                     3'b100: 16 usec
0469  *                     Others: Reserverd
0470  *           b'19    - response_required:
0471  *                     Host needs HTT_T2H_MSG_TYPE_SRING_SETUP_DONE as response
0472  *           b'20:31 - reserved:  reserved for future use
0473  */
0474 
0475 #define HTT_SRNG_SETUP_CMD_INFO0_MSG_TYPE   GENMASK(7, 0)
0476 #define HTT_SRNG_SETUP_CMD_INFO0_PDEV_ID    GENMASK(15, 8)
0477 #define HTT_SRNG_SETUP_CMD_INFO0_RING_ID    GENMASK(23, 16)
0478 #define HTT_SRNG_SETUP_CMD_INFO0_RING_TYPE  GENMASK(31, 24)
0479 
0480 #define HTT_SRNG_SETUP_CMD_INFO1_RING_SIZE          GENMASK(15, 0)
0481 #define HTT_SRNG_SETUP_CMD_INFO1_RING_ENTRY_SIZE        GENMASK(23, 16)
0482 #define HTT_SRNG_SETUP_CMD_INFO1_RING_LOOP_CNT_DIS      BIT(25)
0483 #define HTT_SRNG_SETUP_CMD_INFO1_RING_FLAGS_MSI_SWAP        BIT(27)
0484 #define HTT_SRNG_SETUP_CMD_INFO1_RING_FLAGS_HOST_FW_SWAP    BIT(28)
0485 #define HTT_SRNG_SETUP_CMD_INFO1_RING_FLAGS_TLV_SWAP        BIT(29)
0486 
0487 #define HTT_SRNG_SETUP_CMD_INTR_INFO_BATCH_COUNTER_THRESH   GENMASK(14, 0)
0488 #define HTT_SRNG_SETUP_CMD_INTR_INFO_SW_INTR_MODE       BIT(15)
0489 #define HTT_SRNG_SETUP_CMD_INTR_INFO_INTR_TIMER_THRESH      GENMASK(31, 16)
0490 
0491 #define HTT_SRNG_SETUP_CMD_INFO2_INTR_LOW_THRESH    GENMASK(15, 0)
0492 #define HTT_SRNG_SETUP_CMD_INFO2_PRE_FETCH_TIMER_CFG    BIT(16)
0493 #define HTT_SRNG_SETUP_CMD_INFO2_RESPONSE_REQUIRED  BIT(19)
0494 
0495 struct htt_srng_setup_cmd {
0496     u32 info0;
0497     u32 ring_base_addr_lo;
0498     u32 ring_base_addr_hi;
0499     u32 info1;
0500     u32 ring_head_off32_remote_addr_lo;
0501     u32 ring_head_off32_remote_addr_hi;
0502     u32 ring_tail_off32_remote_addr_lo;
0503     u32 ring_tail_off32_remote_addr_hi;
0504     u32 ring_msi_addr_lo;
0505     u32 ring_msi_addr_hi;
0506     u32 msi_data;
0507     u32 intr_info;
0508     u32 info2;
0509 } __packed;
0510 
0511 /* host -> target FW  PPDU_STATS config message
0512  *
0513  * @details
0514  * The following field definitions describe the format of the HTT host
0515  * to target FW for PPDU_STATS_CFG msg.
0516  * The message allows the host to configure the PPDU_STATS_IND messages
0517  * produced by the target.
0518  *
0519  * |31          24|23          16|15           8|7            0|
0520  * |-----------------------------------------------------------|
0521  * |    REQ bit mask             |   pdev_mask  |   msg type   |
0522  * |-----------------------------------------------------------|
0523  * Header fields:
0524  *  - MSG_TYPE
0525  *    Bits 7:0
0526  *    Purpose: identifies this is a req to configure ppdu_stats_ind from target
0527  *    Value: 0x11
0528  *  - PDEV_MASK
0529  *    Bits 8:15
0530  *    Purpose: identifies which pdevs this PPDU stats configuration applies to
0531  *    Value: This is a overloaded field, refer to usage and interpretation of
0532  *           PDEV in interface document.
0533  *           Bit   8    :  Reserved for SOC stats
0534  *           Bit 9 - 15 :  Indicates PDEV_MASK in DBDC
0535  *                         Indicates MACID_MASK in DBS
0536  *  - REQ_TLV_BIT_MASK
0537  *    Bits 16:31
0538  *    Purpose: each set bit indicates the corresponding PPDU stats TLV type
0539  *        needs to be included in the target's PPDU_STATS_IND messages.
0540  *    Value: refer htt_ppdu_stats_tlv_tag_t <<<???
0541  *
0542  */
0543 
0544 struct htt_ppdu_stats_cfg_cmd {
0545     u32 msg;
0546 } __packed;
0547 
0548 #define HTT_PPDU_STATS_CFG_MSG_TYPE     GENMASK(7, 0)
0549 #define HTT_PPDU_STATS_CFG_SOC_STATS        BIT(8)
0550 #define HTT_PPDU_STATS_CFG_PDEV_ID      GENMASK(15, 9)
0551 #define HTT_PPDU_STATS_CFG_TLV_TYPE_BITMASK GENMASK(31, 16)
0552 
0553 enum htt_ppdu_stats_tag_type {
0554     HTT_PPDU_STATS_TAG_COMMON,
0555     HTT_PPDU_STATS_TAG_USR_COMMON,
0556     HTT_PPDU_STATS_TAG_USR_RATE,
0557     HTT_PPDU_STATS_TAG_USR_MPDU_ENQ_BITMAP_64,
0558     HTT_PPDU_STATS_TAG_USR_MPDU_ENQ_BITMAP_256,
0559     HTT_PPDU_STATS_TAG_SCH_CMD_STATUS,
0560     HTT_PPDU_STATS_TAG_USR_COMPLTN_COMMON,
0561     HTT_PPDU_STATS_TAG_USR_COMPLTN_BA_BITMAP_64,
0562     HTT_PPDU_STATS_TAG_USR_COMPLTN_BA_BITMAP_256,
0563     HTT_PPDU_STATS_TAG_USR_COMPLTN_ACK_BA_STATUS,
0564     HTT_PPDU_STATS_TAG_USR_COMPLTN_FLUSH,
0565     HTT_PPDU_STATS_TAG_USR_COMMON_ARRAY,
0566     HTT_PPDU_STATS_TAG_INFO,
0567     HTT_PPDU_STATS_TAG_TX_MGMTCTRL_PAYLOAD,
0568 
0569     /* New TLV's are added above to this line */
0570     HTT_PPDU_STATS_TAG_MAX,
0571 };
0572 
0573 #define HTT_PPDU_STATS_TAG_DEFAULT (BIT(HTT_PPDU_STATS_TAG_COMMON) \
0574                    | BIT(HTT_PPDU_STATS_TAG_USR_COMMON) \
0575                    | BIT(HTT_PPDU_STATS_TAG_USR_RATE) \
0576                    | BIT(HTT_PPDU_STATS_TAG_SCH_CMD_STATUS) \
0577                    | BIT(HTT_PPDU_STATS_TAG_USR_COMPLTN_COMMON) \
0578                    | BIT(HTT_PPDU_STATS_TAG_USR_COMPLTN_ACK_BA_STATUS) \
0579                    | BIT(HTT_PPDU_STATS_TAG_USR_COMPLTN_FLUSH) \
0580                    | BIT(HTT_PPDU_STATS_TAG_USR_COMMON_ARRAY))
0581 
0582 #define HTT_PPDU_STATS_TAG_PKTLOG  (BIT(HTT_PPDU_STATS_TAG_USR_MPDU_ENQ_BITMAP_64) | \
0583                     BIT(HTT_PPDU_STATS_TAG_USR_MPDU_ENQ_BITMAP_256) | \
0584                     BIT(HTT_PPDU_STATS_TAG_USR_COMPLTN_BA_BITMAP_64) | \
0585                     BIT(HTT_PPDU_STATS_TAG_USR_COMPLTN_BA_BITMAP_256) | \
0586                     BIT(HTT_PPDU_STATS_TAG_INFO) | \
0587                     BIT(HTT_PPDU_STATS_TAG_TX_MGMTCTRL_PAYLOAD) | \
0588                     HTT_PPDU_STATS_TAG_DEFAULT)
0589 
0590 /* HTT_H2T_MSG_TYPE_RX_RING_SELECTION_CFG Message
0591  *
0592  * details:
0593  *    HTT_H2T_MSG_TYPE_RX_RING_SELECTION_CFG message is sent by host to
0594  *    configure RXDMA rings.
0595  *    The configuration is per ring based and includes both packet subtypes
0596  *    and PPDU/MPDU TLVs.
0597  *
0598  *    The message would appear as follows:
0599  *
0600  *    |31       26|25|24|23            16|15             8|7             0|
0601  *    |-----------------+----------------+----------------+---------------|
0602  *    |   rsvd1   |PS|SS|     ring_id    |     pdev_id    |    msg_type   |
0603  *    |-------------------------------------------------------------------|
0604  *    |              rsvd2               |           ring_buffer_size     |
0605  *    |-------------------------------------------------------------------|
0606  *    |                        packet_type_enable_flags_0                 |
0607  *    |-------------------------------------------------------------------|
0608  *    |                        packet_type_enable_flags_1                 |
0609  *    |-------------------------------------------------------------------|
0610  *    |                        packet_type_enable_flags_2                 |
0611  *    |-------------------------------------------------------------------|
0612  *    |                        packet_type_enable_flags_3                 |
0613  *    |-------------------------------------------------------------------|
0614  *    |                         tlv_filter_in_flags                       |
0615  *    |-------------------------------------------------------------------|
0616  * Where:
0617  *     PS = pkt_swap
0618  *     SS = status_swap
0619  * The message is interpreted as follows:
0620  * dword0 - b'0:7   - msg_type: This will be set to
0621  *                    HTT_H2T_MSG_TYPE_RX_RING_SELECTION_CFG
0622  *          b'8:15  - pdev_id:
0623  *                    0 (for rings at SOC/UMAC level),
0624  *                    1/2/3 mac id (for rings at LMAC level)
0625  *          b'16:23 - ring_id : Identify the ring to configure.
0626  *                    More details can be got from enum htt_srng_ring_id
0627  *          b'24    - status_swap: 1 is to swap status TLV
0628  *          b'25    - pkt_swap:  1 is to swap packet TLV
0629  *          b'26:31 - rsvd1:  reserved for future use
0630  * dword1 - b'0:16  - ring_buffer_size: size of bufferes referenced by rx ring,
0631  *                    in byte units.
0632  *                    Valid only for HW_TO_SW_RING and SW_TO_HW_RING
0633  *        - b'16:31 - rsvd2: Reserved for future use
0634  * dword2 - b'0:31  - packet_type_enable_flags_0:
0635  *                    Enable MGMT packet from 0b0000 to 0b1001
0636  *                    bits from low to high: FP, MD, MO - 3 bits
0637  *                        FP: Filter_Pass
0638  *                        MD: Monitor_Direct
0639  *                        MO: Monitor_Other
0640  *                    10 mgmt subtypes * 3 bits -> 30 bits
0641  *                    Refer to PKT_TYPE_ENABLE_FLAG0_xxx_MGMT_xxx defs
0642  * dword3 - b'0:31  - packet_type_enable_flags_1:
0643  *                    Enable MGMT packet from 0b1010 to 0b1111
0644  *                    bits from low to high: FP, MD, MO - 3 bits
0645  *                    Refer to PKT_TYPE_ENABLE_FLAG1_xxx_MGMT_xxx defs
0646  * dword4 - b'0:31 -  packet_type_enable_flags_2:
0647  *                    Enable CTRL packet from 0b0000 to 0b1001
0648  *                    bits from low to high: FP, MD, MO - 3 bits
0649  *                    Refer to PKT_TYPE_ENABLE_FLAG2_xxx_CTRL_xxx defs
0650  * dword5 - b'0:31  - packet_type_enable_flags_3:
0651  *                    Enable CTRL packet from 0b1010 to 0b1111,
0652  *                    MCAST_DATA, UCAST_DATA, NULL_DATA
0653  *                    bits from low to high: FP, MD, MO - 3 bits
0654  *                    Refer to PKT_TYPE_ENABLE_FLAG3_xxx_CTRL_xxx defs
0655  * dword6 - b'0:31 -  tlv_filter_in_flags:
0656  *                    Filter in Attention/MPDU/PPDU/Header/User tlvs
0657  *                    Refer to CFG_TLV_FILTER_IN_FLAG defs
0658  */
0659 
0660 #define HTT_RX_RING_SELECTION_CFG_CMD_INFO0_MSG_TYPE    GENMASK(7, 0)
0661 #define HTT_RX_RING_SELECTION_CFG_CMD_INFO0_PDEV_ID GENMASK(15, 8)
0662 #define HTT_RX_RING_SELECTION_CFG_CMD_INFO0_RING_ID GENMASK(23, 16)
0663 #define HTT_RX_RING_SELECTION_CFG_CMD_INFO0_SS      BIT(24)
0664 #define HTT_RX_RING_SELECTION_CFG_CMD_INFO0_PS      BIT(25)
0665 
0666 #define HTT_RX_RING_SELECTION_CFG_CMD_INFO1_BUF_SIZE    GENMASK(15, 0)
0667 
0668 enum htt_rx_filter_tlv_flags {
0669     HTT_RX_FILTER_TLV_FLAGS_MPDU_START      = BIT(0),
0670     HTT_RX_FILTER_TLV_FLAGS_MSDU_START      = BIT(1),
0671     HTT_RX_FILTER_TLV_FLAGS_RX_PACKET       = BIT(2),
0672     HTT_RX_FILTER_TLV_FLAGS_MSDU_END        = BIT(3),
0673     HTT_RX_FILTER_TLV_FLAGS_MPDU_END        = BIT(4),
0674     HTT_RX_FILTER_TLV_FLAGS_PACKET_HEADER       = BIT(5),
0675     HTT_RX_FILTER_TLV_FLAGS_PER_MSDU_HEADER     = BIT(6),
0676     HTT_RX_FILTER_TLV_FLAGS_ATTENTION       = BIT(7),
0677     HTT_RX_FILTER_TLV_FLAGS_PPDU_START      = BIT(8),
0678     HTT_RX_FILTER_TLV_FLAGS_PPDU_END        = BIT(9),
0679     HTT_RX_FILTER_TLV_FLAGS_PPDU_END_USER_STATS = BIT(10),
0680     HTT_RX_FILTER_TLV_FLAGS_PPDU_END_USER_STATS_EXT = BIT(11),
0681     HTT_RX_FILTER_TLV_FLAGS_PPDU_END_STATUS_DONE    = BIT(12),
0682 };
0683 
0684 enum htt_rx_mgmt_pkt_filter_tlv_flags0 {
0685     HTT_RX_FP_MGMT_PKT_FILTER_TLV_FLAGS0_ASSOC_REQ      = BIT(0),
0686     HTT_RX_MD_MGMT_PKT_FILTER_TLV_FLAGS0_ASSOC_REQ      = BIT(1),
0687     HTT_RX_MO_MGMT_PKT_FILTER_TLV_FLAGS0_ASSOC_REQ      = BIT(2),
0688     HTT_RX_FP_MGMT_PKT_FILTER_TLV_FLAGS0_ASSOC_RESP     = BIT(3),
0689     HTT_RX_MD_MGMT_PKT_FILTER_TLV_FLAGS0_ASSOC_RESP     = BIT(4),
0690     HTT_RX_MO_MGMT_PKT_FILTER_TLV_FLAGS0_ASSOC_RESP     = BIT(5),
0691     HTT_RX_FP_MGMT_PKT_FILTER_TLV_FLAGS0_REASSOC_REQ    = BIT(6),
0692     HTT_RX_MD_MGMT_PKT_FILTER_TLV_FLAGS0_REASSOC_REQ    = BIT(7),
0693     HTT_RX_MO_MGMT_PKT_FILTER_TLV_FLAGS0_REASSOC_REQ    = BIT(8),
0694     HTT_RX_FP_MGMT_PKT_FILTER_TLV_FLAGS0_REASSOC_RESP   = BIT(9),
0695     HTT_RX_MD_MGMT_PKT_FILTER_TLV_FLAGS0_REASSOC_RESP   = BIT(10),
0696     HTT_RX_MO_MGMT_PKT_FILTER_TLV_FLAGS0_REASSOC_RESP   = BIT(11),
0697     HTT_RX_FP_MGMT_PKT_FILTER_TLV_FLAGS0_PROBE_REQ      = BIT(12),
0698     HTT_RX_MD_MGMT_PKT_FILTER_TLV_FLAGS0_PROBE_REQ      = BIT(13),
0699     HTT_RX_MO_MGMT_PKT_FILTER_TLV_FLAGS0_PROBE_REQ      = BIT(14),
0700     HTT_RX_FP_MGMT_PKT_FILTER_TLV_FLAGS0_PROBE_RESP     = BIT(15),
0701     HTT_RX_MD_MGMT_PKT_FILTER_TLV_FLAGS0_PROBE_RESP     = BIT(16),
0702     HTT_RX_MO_MGMT_PKT_FILTER_TLV_FLAGS0_PROBE_RESP     = BIT(17),
0703     HTT_RX_FP_MGMT_PKT_FILTER_TLV_FLAGS0_PROBE_TIMING_ADV   = BIT(18),
0704     HTT_RX_MD_MGMT_PKT_FILTER_TLV_FLAGS0_PROBE_TIMING_ADV   = BIT(19),
0705     HTT_RX_MO_MGMT_PKT_FILTER_TLV_FLAGS0_PROBE_TIMING_ADV   = BIT(20),
0706     HTT_RX_FP_MGMT_PKT_FILTER_TLV_FLAGS0_RESERVED_7     = BIT(21),
0707     HTT_RX_MD_MGMT_PKT_FILTER_TLV_FLAGS0_RESERVED_7     = BIT(22),
0708     HTT_RX_MO_MGMT_PKT_FILTER_TLV_FLAGS0_RESERVED_7     = BIT(23),
0709     HTT_RX_FP_MGMT_PKT_FILTER_TLV_FLAGS0_BEACON     = BIT(24),
0710     HTT_RX_MD_MGMT_PKT_FILTER_TLV_FLAGS0_BEACON     = BIT(25),
0711     HTT_RX_MO_MGMT_PKT_FILTER_TLV_FLAGS0_BEACON     = BIT(26),
0712     HTT_RX_FP_MGMT_PKT_FILTER_TLV_FLAGS0_ATIM       = BIT(27),
0713     HTT_RX_MD_MGMT_PKT_FILTER_TLV_FLAGS0_ATIM       = BIT(28),
0714     HTT_RX_MO_MGMT_PKT_FILTER_TLV_FLAGS0_ATIM       = BIT(29),
0715 };
0716 
0717 enum htt_rx_mgmt_pkt_filter_tlv_flags1 {
0718     HTT_RX_FP_MGMT_PKT_FILTER_TLV_FLAGS1_DISASSOC       = BIT(0),
0719     HTT_RX_MD_MGMT_PKT_FILTER_TLV_FLAGS1_DISASSOC       = BIT(1),
0720     HTT_RX_MO_MGMT_PKT_FILTER_TLV_FLAGS1_DISASSOC       = BIT(2),
0721     HTT_RX_FP_MGMT_PKT_FILTER_TLV_FLAGS1_AUTH       = BIT(3),
0722     HTT_RX_MD_MGMT_PKT_FILTER_TLV_FLAGS1_AUTH       = BIT(4),
0723     HTT_RX_MO_MGMT_PKT_FILTER_TLV_FLAGS1_AUTH       = BIT(5),
0724     HTT_RX_FP_MGMT_PKT_FILTER_TLV_FLAGS1_DEAUTH     = BIT(6),
0725     HTT_RX_MD_MGMT_PKT_FILTER_TLV_FLAGS1_DEAUTH     = BIT(7),
0726     HTT_RX_MO_MGMT_PKT_FILTER_TLV_FLAGS1_DEAUTH     = BIT(8),
0727     HTT_RX_FP_MGMT_PKT_FILTER_TLV_FLAGS1_ACTION     = BIT(9),
0728     HTT_RX_MD_MGMT_PKT_FILTER_TLV_FLAGS1_ACTION     = BIT(10),
0729     HTT_RX_MO_MGMT_PKT_FILTER_TLV_FLAGS1_ACTION     = BIT(11),
0730     HTT_RX_FP_MGMT_PKT_FILTER_TLV_FLAGS1_ACTION_NOACK   = BIT(12),
0731     HTT_RX_MD_MGMT_PKT_FILTER_TLV_FLAGS1_ACTION_NOACK   = BIT(13),
0732     HTT_RX_MO_MGMT_PKT_FILTER_TLV_FLAGS1_ACTION_NOACK   = BIT(14),
0733     HTT_RX_FP_MGMT_PKT_FILTER_TLV_FLAGS1_RESERVED_15    = BIT(15),
0734     HTT_RX_MD_MGMT_PKT_FILTER_TLV_FLAGS1_RESERVED_15    = BIT(16),
0735     HTT_RX_MO_MGMT_PKT_FILTER_TLV_FLAGS1_RESERVED_15    = BIT(17),
0736 };
0737 
0738 enum htt_rx_ctrl_pkt_filter_tlv_flags2 {
0739     HTT_RX_FP_CTRL_PKT_FILTER_TLV_FLAGS2_CTRL_RESERVED_1    = BIT(0),
0740     HTT_RX_MD_CTRL_PKT_FILTER_TLV_FLAGS2_CTRL_RESERVED_1    = BIT(1),
0741     HTT_RX_MO_CTRL_PKT_FILTER_TLV_FLAGS2_CTRL_RESERVED_1    = BIT(2),
0742     HTT_RX_FP_CTRL_PKT_FILTER_TLV_FLAGS2_CTRL_RESERVED_2    = BIT(3),
0743     HTT_RX_MD_CTRL_PKT_FILTER_TLV_FLAGS2_CTRL_RESERVED_2    = BIT(4),
0744     HTT_RX_MO_CTRL_PKT_FILTER_TLV_FLAGS2_CTRL_RESERVED_2    = BIT(5),
0745     HTT_RX_FP_CTRL_PKT_FILTER_TLV_FLAGS2_CTRL_TRIGGER   = BIT(6),
0746     HTT_RX_MD_CTRL_PKT_FILTER_TLV_FLAGS2_CTRL_TRIGGER   = BIT(7),
0747     HTT_RX_MO_CTRL_PKT_FILTER_TLV_FLAGS2_CTRL_TRIGGER   = BIT(8),
0748     HTT_RX_FP_CTRL_PKT_FILTER_TLV_FLAGS2_CTRL_RESERVED_4    = BIT(9),
0749     HTT_RX_MD_CTRL_PKT_FILTER_TLV_FLAGS2_CTRL_RESERVED_4    = BIT(10),
0750     HTT_RX_MO_CTRL_PKT_FILTER_TLV_FLAGS2_CTRL_RESERVED_4    = BIT(11),
0751     HTT_RX_FP_CTRL_PKT_FILTER_TLV_FLAGS2_CTRL_BF_REP_POLL   = BIT(12),
0752     HTT_RX_MD_CTRL_PKT_FILTER_TLV_FLAGS2_CTRL_BF_REP_POLL   = BIT(13),
0753     HTT_RX_MO_CTRL_PKT_FILTER_TLV_FLAGS2_CTRL_BF_REP_POLL   = BIT(14),
0754     HTT_RX_FP_CTRL_PKT_FILTER_TLV_FLAGS2_CTRL_VHT_NDP   = BIT(15),
0755     HTT_RX_MD_CTRL_PKT_FILTER_TLV_FLAGS2_CTRL_VHT_NDP   = BIT(16),
0756     HTT_RX_MO_CTRL_PKT_FILTER_TLV_FLAGS2_CTRL_VHT_NDP   = BIT(17),
0757     HTT_RX_FP_CTRL_PKT_FILTER_TLV_FLAGS2_CTRL_FRAME_EXT = BIT(18),
0758     HTT_RX_MD_CTRL_PKT_FILTER_TLV_FLAGS2_CTRL_FRAME_EXT = BIT(19),
0759     HTT_RX_MO_CTRL_PKT_FILTER_TLV_FLAGS2_CTRL_FRAME_EXT = BIT(20),
0760     HTT_RX_FP_CTRL_PKT_FILTER_TLV_FLAGS2_CTRL_WRAPPER   = BIT(21),
0761     HTT_RX_MD_CTRL_PKT_FILTER_TLV_FLAGS2_CTRL_WRAPPER   = BIT(22),
0762     HTT_RX_MO_CTRL_PKT_FILTER_TLV_FLAGS2_CTRL_WRAPPER   = BIT(23),
0763     HTT_RX_FP_CTRL_PKT_FILTER_TLV_FLAGS2_BAR        = BIT(24),
0764     HTT_RX_MD_CTRL_PKT_FILTER_TLV_FLAGS2_BAR        = BIT(25),
0765     HTT_RX_MO_CTRL_PKT_FILTER_TLV_FLAGS2_BAR        = BIT(26),
0766     HTT_RX_FP_CTRL_PKT_FILTER_TLV_FLAGS2_BA         = BIT(27),
0767     HTT_RX_MD_CTRL_PKT_FILTER_TLV_FLAGS2_BA         = BIT(28),
0768     HTT_RX_MO_CTRL_PKT_FILTER_TLV_FLAGS2_BA         = BIT(29),
0769 };
0770 
0771 enum htt_rx_ctrl_pkt_filter_tlv_flags3 {
0772     HTT_RX_FP_CTRL_PKT_FILTER_TLV_FLAGS3_PSPOLL     = BIT(0),
0773     HTT_RX_MD_CTRL_PKT_FILTER_TLV_FLAGS3_PSPOLL     = BIT(1),
0774     HTT_RX_MO_CTRL_PKT_FILTER_TLV_FLAGS3_PSPOLL     = BIT(2),
0775     HTT_RX_FP_CTRL_PKT_FILTER_TLV_FLAGS3_RTS        = BIT(3),
0776     HTT_RX_MD_CTRL_PKT_FILTER_TLV_FLAGS3_RTS        = BIT(4),
0777     HTT_RX_MO_CTRL_PKT_FILTER_TLV_FLAGS3_RTS        = BIT(5),
0778     HTT_RX_FP_CTRL_PKT_FILTER_TLV_FLAGS3_CTS        = BIT(6),
0779     HTT_RX_MD_CTRL_PKT_FILTER_TLV_FLAGS3_CTS        = BIT(7),
0780     HTT_RX_MO_CTRL_PKT_FILTER_TLV_FLAGS3_CTS        = BIT(8),
0781     HTT_RX_FP_CTRL_PKT_FILTER_TLV_FLAGS3_ACK        = BIT(9),
0782     HTT_RX_MD_CTRL_PKT_FILTER_TLV_FLAGS3_ACK        = BIT(10),
0783     HTT_RX_MO_CTRL_PKT_FILTER_TLV_FLAGS3_ACK        = BIT(11),
0784     HTT_RX_FP_CTRL_PKT_FILTER_TLV_FLAGS3_CFEND      = BIT(12),
0785     HTT_RX_MD_CTRL_PKT_FILTER_TLV_FLAGS3_CFEND      = BIT(13),
0786     HTT_RX_MO_CTRL_PKT_FILTER_TLV_FLAGS3_CFEND      = BIT(14),
0787     HTT_RX_FP_CTRL_PKT_FILTER_TLV_FLAGS3_CFEND_ACK      = BIT(15),
0788     HTT_RX_MD_CTRL_PKT_FILTER_TLV_FLAGS3_CFEND_ACK      = BIT(16),
0789     HTT_RX_MO_CTRL_PKT_FILTER_TLV_FLAGS3_CFEND_ACK      = BIT(17),
0790 };
0791 
0792 enum htt_rx_data_pkt_filter_tlv_flasg3 {
0793     HTT_RX_FP_DATA_PKT_FILTER_TLV_FLASG3_MCAST  = BIT(18),
0794     HTT_RX_MD_DATA_PKT_FILTER_TLV_FLASG3_MCAST  = BIT(19),
0795     HTT_RX_MO_DATA_PKT_FILTER_TLV_FLASG3_MCAST  = BIT(20),
0796     HTT_RX_FP_DATA_PKT_FILTER_TLV_FLASG3_UCAST  = BIT(21),
0797     HTT_RX_MD_DATA_PKT_FILTER_TLV_FLASG3_UCAST  = BIT(22),
0798     HTT_RX_MO_DATA_PKT_FILTER_TLV_FLASG3_UCAST  = BIT(23),
0799     HTT_RX_FP_DATA_PKT_FILTER_TLV_FLASG3_NULL_DATA  = BIT(24),
0800     HTT_RX_MD_DATA_PKT_FILTER_TLV_FLASG3_NULL_DATA  = BIT(25),
0801     HTT_RX_MO_DATA_PKT_FILTER_TLV_FLASG3_NULL_DATA  = BIT(26),
0802 };
0803 
0804 #define HTT_RX_FP_MGMT_FILTER_FLAGS0 \
0805     (HTT_RX_FP_MGMT_PKT_FILTER_TLV_FLAGS0_ASSOC_REQ \
0806     | HTT_RX_FP_MGMT_PKT_FILTER_TLV_FLAGS0_ASSOC_RESP \
0807     | HTT_RX_FP_MGMT_PKT_FILTER_TLV_FLAGS0_REASSOC_REQ \
0808     | HTT_RX_FP_MGMT_PKT_FILTER_TLV_FLAGS0_REASSOC_RESP \
0809     | HTT_RX_FP_MGMT_PKT_FILTER_TLV_FLAGS0_PROBE_REQ \
0810     | HTT_RX_FP_MGMT_PKT_FILTER_TLV_FLAGS0_PROBE_RESP \
0811     | HTT_RX_FP_MGMT_PKT_FILTER_TLV_FLAGS0_PROBE_TIMING_ADV \
0812     | HTT_RX_FP_MGMT_PKT_FILTER_TLV_FLAGS0_BEACON \
0813     | HTT_RX_FP_MGMT_PKT_FILTER_TLV_FLAGS0_ATIM)
0814 
0815 #define HTT_RX_MD_MGMT_FILTER_FLAGS0 \
0816     (HTT_RX_MD_MGMT_PKT_FILTER_TLV_FLAGS0_ASSOC_REQ \
0817     | HTT_RX_MD_MGMT_PKT_FILTER_TLV_FLAGS0_ASSOC_RESP \
0818     | HTT_RX_MD_MGMT_PKT_FILTER_TLV_FLAGS0_REASSOC_REQ \
0819     | HTT_RX_MD_MGMT_PKT_FILTER_TLV_FLAGS0_REASSOC_RESP \
0820     | HTT_RX_MD_MGMT_PKT_FILTER_TLV_FLAGS0_PROBE_REQ \
0821     | HTT_RX_MD_MGMT_PKT_FILTER_TLV_FLAGS0_PROBE_RESP \
0822     | HTT_RX_MD_MGMT_PKT_FILTER_TLV_FLAGS0_PROBE_TIMING_ADV \
0823     | HTT_RX_MD_MGMT_PKT_FILTER_TLV_FLAGS0_BEACON \
0824     | HTT_RX_MD_MGMT_PKT_FILTER_TLV_FLAGS0_ATIM)
0825 
0826 #define HTT_RX_MO_MGMT_FILTER_FLAGS0 \
0827     (HTT_RX_MO_MGMT_PKT_FILTER_TLV_FLAGS0_ASSOC_REQ \
0828     | HTT_RX_MO_MGMT_PKT_FILTER_TLV_FLAGS0_ASSOC_RESP \
0829     | HTT_RX_MO_MGMT_PKT_FILTER_TLV_FLAGS0_REASSOC_REQ \
0830     | HTT_RX_MO_MGMT_PKT_FILTER_TLV_FLAGS0_REASSOC_RESP \
0831     | HTT_RX_MO_MGMT_PKT_FILTER_TLV_FLAGS0_PROBE_REQ \
0832     | HTT_RX_MO_MGMT_PKT_FILTER_TLV_FLAGS0_PROBE_RESP \
0833     | HTT_RX_MO_MGMT_PKT_FILTER_TLV_FLAGS0_PROBE_TIMING_ADV \
0834     | HTT_RX_MO_MGMT_PKT_FILTER_TLV_FLAGS0_BEACON \
0835     | HTT_RX_MO_MGMT_PKT_FILTER_TLV_FLAGS0_ATIM)
0836 
0837 #define HTT_RX_FP_MGMT_FILTER_FLAGS1 (HTT_RX_FP_MGMT_PKT_FILTER_TLV_FLAGS1_DISASSOC \
0838                      | HTT_RX_FP_MGMT_PKT_FILTER_TLV_FLAGS1_AUTH \
0839                      | HTT_RX_FP_MGMT_PKT_FILTER_TLV_FLAGS1_DEAUTH \
0840                      | HTT_RX_FP_MGMT_PKT_FILTER_TLV_FLAGS1_ACTION \
0841                      | HTT_RX_FP_MGMT_PKT_FILTER_TLV_FLAGS1_ACTION_NOACK)
0842 
0843 #define HTT_RX_MD_MGMT_FILTER_FLAGS1 (HTT_RX_MD_MGMT_PKT_FILTER_TLV_FLAGS1_DISASSOC \
0844                      | HTT_RX_MD_MGMT_PKT_FILTER_TLV_FLAGS1_AUTH \
0845                      | HTT_RX_MD_MGMT_PKT_FILTER_TLV_FLAGS1_DEAUTH \
0846                      | HTT_RX_MD_MGMT_PKT_FILTER_TLV_FLAGS1_ACTION \
0847                      | HTT_RX_MD_MGMT_PKT_FILTER_TLV_FLAGS1_ACTION_NOACK)
0848 
0849 #define HTT_RX_MO_MGMT_FILTER_FLAGS1 (HTT_RX_MO_MGMT_PKT_FILTER_TLV_FLAGS1_DISASSOC \
0850                      | HTT_RX_MO_MGMT_PKT_FILTER_TLV_FLAGS1_AUTH \
0851                      | HTT_RX_MO_MGMT_PKT_FILTER_TLV_FLAGS1_DEAUTH \
0852                      | HTT_RX_MO_MGMT_PKT_FILTER_TLV_FLAGS1_ACTION \
0853                      | HTT_RX_MO_MGMT_PKT_FILTER_TLV_FLAGS1_ACTION_NOACK)
0854 
0855 #define HTT_RX_FP_CTRL_FILTER_FLASG2 (HTT_RX_FP_CTRL_PKT_FILTER_TLV_FLAGS2_CTRL_WRAPPER \
0856                      | HTT_RX_FP_CTRL_PKT_FILTER_TLV_FLAGS2_BAR \
0857                      | HTT_RX_FP_CTRL_PKT_FILTER_TLV_FLAGS2_BA)
0858 
0859 #define HTT_RX_MD_CTRL_FILTER_FLASG2 (HTT_RX_MD_CTRL_PKT_FILTER_TLV_FLAGS2_CTRL_WRAPPER \
0860                      | HTT_RX_MD_CTRL_PKT_FILTER_TLV_FLAGS2_BAR \
0861                      | HTT_RX_MD_CTRL_PKT_FILTER_TLV_FLAGS2_BA)
0862 
0863 #define HTT_RX_MO_CTRL_FILTER_FLASG2 (HTT_RX_MO_CTRL_PKT_FILTER_TLV_FLAGS2_CTRL_WRAPPER \
0864                      | HTT_RX_MO_CTRL_PKT_FILTER_TLV_FLAGS2_BAR \
0865                      | HTT_RX_MO_CTRL_PKT_FILTER_TLV_FLAGS2_BA)
0866 
0867 #define HTT_RX_FP_CTRL_FILTER_FLASG3 (HTT_RX_FP_CTRL_PKT_FILTER_TLV_FLAGS3_PSPOLL \
0868                      | HTT_RX_FP_CTRL_PKT_FILTER_TLV_FLAGS3_RTS \
0869                      | HTT_RX_FP_CTRL_PKT_FILTER_TLV_FLAGS3_CTS \
0870                      | HTT_RX_FP_CTRL_PKT_FILTER_TLV_FLAGS3_ACK \
0871                      | HTT_RX_FP_CTRL_PKT_FILTER_TLV_FLAGS3_CFEND \
0872                      | HTT_RX_FP_CTRL_PKT_FILTER_TLV_FLAGS3_CFEND_ACK)
0873 
0874 #define HTT_RX_MD_CTRL_FILTER_FLASG3 (HTT_RX_MD_CTRL_PKT_FILTER_TLV_FLAGS3_PSPOLL \
0875                      | HTT_RX_MD_CTRL_PKT_FILTER_TLV_FLAGS3_RTS \
0876                      | HTT_RX_MD_CTRL_PKT_FILTER_TLV_FLAGS3_CTS \
0877                      | HTT_RX_MD_CTRL_PKT_FILTER_TLV_FLAGS3_ACK \
0878                      | HTT_RX_MD_CTRL_PKT_FILTER_TLV_FLAGS3_CFEND \
0879                      | HTT_RX_MD_CTRL_PKT_FILTER_TLV_FLAGS3_CFEND_ACK)
0880 
0881 #define HTT_RX_MO_CTRL_FILTER_FLASG3 (HTT_RX_MO_CTRL_PKT_FILTER_TLV_FLAGS3_PSPOLL \
0882                      | HTT_RX_MO_CTRL_PKT_FILTER_TLV_FLAGS3_RTS \
0883                      | HTT_RX_MO_CTRL_PKT_FILTER_TLV_FLAGS3_CTS \
0884                      | HTT_RX_MO_CTRL_PKT_FILTER_TLV_FLAGS3_ACK \
0885                      | HTT_RX_MO_CTRL_PKT_FILTER_TLV_FLAGS3_CFEND \
0886                      | HTT_RX_MO_CTRL_PKT_FILTER_TLV_FLAGS3_CFEND_ACK)
0887 
0888 #define HTT_RX_FP_DATA_FILTER_FLASG3 (HTT_RX_FP_DATA_PKT_FILTER_TLV_FLASG3_MCAST \
0889                      | HTT_RX_FP_DATA_PKT_FILTER_TLV_FLASG3_UCAST \
0890                      | HTT_RX_FP_DATA_PKT_FILTER_TLV_FLASG3_NULL_DATA)
0891 
0892 #define HTT_RX_MD_DATA_FILTER_FLASG3 (HTT_RX_MD_DATA_PKT_FILTER_TLV_FLASG3_MCAST \
0893                      | HTT_RX_MD_DATA_PKT_FILTER_TLV_FLASG3_UCAST \
0894                      | HTT_RX_MD_DATA_PKT_FILTER_TLV_FLASG3_NULL_DATA)
0895 
0896 #define HTT_RX_MO_DATA_FILTER_FLASG3 (HTT_RX_MO_DATA_PKT_FILTER_TLV_FLASG3_MCAST \
0897                      | HTT_RX_MO_DATA_PKT_FILTER_TLV_FLASG3_UCAST \
0898                      | HTT_RX_MO_DATA_PKT_FILTER_TLV_FLASG3_NULL_DATA)
0899 
0900 #define HTT_RX_MON_FP_MGMT_FILTER_FLAGS0 \
0901         (HTT_RX_FP_MGMT_FILTER_FLAGS0 | \
0902         HTT_RX_FP_MGMT_PKT_FILTER_TLV_FLAGS0_RESERVED_7)
0903 
0904 #define HTT_RX_MON_MO_MGMT_FILTER_FLAGS0 \
0905         (HTT_RX_MO_MGMT_FILTER_FLAGS0 | \
0906         HTT_RX_MO_MGMT_PKT_FILTER_TLV_FLAGS0_RESERVED_7)
0907 
0908 #define HTT_RX_MON_FP_MGMT_FILTER_FLAGS1 \
0909         (HTT_RX_FP_MGMT_FILTER_FLAGS1 | \
0910         HTT_RX_FP_MGMT_PKT_FILTER_TLV_FLAGS1_RESERVED_15)
0911 
0912 #define HTT_RX_MON_MO_MGMT_FILTER_FLAGS1 \
0913         (HTT_RX_MO_MGMT_FILTER_FLAGS1 | \
0914         HTT_RX_MO_MGMT_PKT_FILTER_TLV_FLAGS1_RESERVED_15)
0915 
0916 #define HTT_RX_MON_FP_CTRL_FILTER_FLASG2 \
0917         (HTT_RX_FP_CTRL_FILTER_FLASG2 | \
0918         HTT_RX_FP_CTRL_PKT_FILTER_TLV_FLAGS2_CTRL_RESERVED_1 | \
0919         HTT_RX_FP_CTRL_PKT_FILTER_TLV_FLAGS2_CTRL_RESERVED_2 | \
0920         HTT_RX_FP_CTRL_PKT_FILTER_TLV_FLAGS2_CTRL_TRIGGER | \
0921         HTT_RX_FP_CTRL_PKT_FILTER_TLV_FLAGS2_CTRL_RESERVED_4 | \
0922         HTT_RX_FP_CTRL_PKT_FILTER_TLV_FLAGS2_CTRL_BF_REP_POLL | \
0923         HTT_RX_FP_CTRL_PKT_FILTER_TLV_FLAGS2_CTRL_VHT_NDP | \
0924         HTT_RX_FP_CTRL_PKT_FILTER_TLV_FLAGS2_CTRL_FRAME_EXT)
0925 
0926 #define HTT_RX_MON_MO_CTRL_FILTER_FLASG2 \
0927         (HTT_RX_MO_CTRL_FILTER_FLASG2 | \
0928         HTT_RX_MO_CTRL_PKT_FILTER_TLV_FLAGS2_CTRL_RESERVED_1 | \
0929         HTT_RX_MO_CTRL_PKT_FILTER_TLV_FLAGS2_CTRL_RESERVED_2 | \
0930         HTT_RX_MO_CTRL_PKT_FILTER_TLV_FLAGS2_CTRL_TRIGGER | \
0931         HTT_RX_MO_CTRL_PKT_FILTER_TLV_FLAGS2_CTRL_RESERVED_4 | \
0932         HTT_RX_MO_CTRL_PKT_FILTER_TLV_FLAGS2_CTRL_BF_REP_POLL | \
0933         HTT_RX_MO_CTRL_PKT_FILTER_TLV_FLAGS2_CTRL_VHT_NDP | \
0934         HTT_RX_MO_CTRL_PKT_FILTER_TLV_FLAGS2_CTRL_FRAME_EXT)
0935 
0936 #define HTT_RX_MON_FP_CTRL_FILTER_FLASG3 HTT_RX_FP_CTRL_FILTER_FLASG3
0937 
0938 #define HTT_RX_MON_MO_CTRL_FILTER_FLASG3 HTT_RX_MO_CTRL_FILTER_FLASG3
0939 
0940 #define HTT_RX_MON_FP_DATA_FILTER_FLASG3 HTT_RX_FP_DATA_FILTER_FLASG3
0941 
0942 #define HTT_RX_MON_MO_DATA_FILTER_FLASG3 HTT_RX_MO_DATA_FILTER_FLASG3
0943 
0944 #define HTT_RX_MON_FILTER_TLV_FLAGS \
0945         (HTT_RX_FILTER_TLV_FLAGS_MPDU_START | \
0946         HTT_RX_FILTER_TLV_FLAGS_PPDU_START | \
0947         HTT_RX_FILTER_TLV_FLAGS_PPDU_END | \
0948         HTT_RX_FILTER_TLV_FLAGS_PPDU_END_USER_STATS | \
0949         HTT_RX_FILTER_TLV_FLAGS_PPDU_END_USER_STATS_EXT | \
0950         HTT_RX_FILTER_TLV_FLAGS_PPDU_END_STATUS_DONE)
0951 
0952 #define HTT_RX_MON_FILTER_TLV_FLAGS_MON_STATUS_RING \
0953         (HTT_RX_FILTER_TLV_FLAGS_MPDU_START | \
0954         HTT_RX_FILTER_TLV_FLAGS_PPDU_START | \
0955         HTT_RX_FILTER_TLV_FLAGS_PPDU_END | \
0956         HTT_RX_FILTER_TLV_FLAGS_PPDU_END_USER_STATS | \
0957         HTT_RX_FILTER_TLV_FLAGS_PPDU_END_USER_STATS_EXT | \
0958         HTT_RX_FILTER_TLV_FLAGS_PPDU_END_STATUS_DONE)
0959 
0960 #define HTT_RX_MON_FILTER_TLV_FLAGS_MON_BUF_RING \
0961         (HTT_RX_FILTER_TLV_FLAGS_MPDU_START | \
0962         HTT_RX_FILTER_TLV_FLAGS_MSDU_START | \
0963         HTT_RX_FILTER_TLV_FLAGS_RX_PACKET | \
0964         HTT_RX_FILTER_TLV_FLAGS_MSDU_END | \
0965         HTT_RX_FILTER_TLV_FLAGS_MPDU_END | \
0966         HTT_RX_FILTER_TLV_FLAGS_PACKET_HEADER | \
0967         HTT_RX_FILTER_TLV_FLAGS_PER_MSDU_HEADER | \
0968         HTT_RX_FILTER_TLV_FLAGS_ATTENTION)
0969 
0970 struct htt_rx_ring_selection_cfg_cmd {
0971     u32 info0;
0972     u32 info1;
0973     u32 pkt_type_en_flags0;
0974     u32 pkt_type_en_flags1;
0975     u32 pkt_type_en_flags2;
0976     u32 pkt_type_en_flags3;
0977     u32 rx_filter_tlv;
0978 } __packed;
0979 
0980 struct htt_rx_ring_tlv_filter {
0981     u32 rx_filter; /* see htt_rx_filter_tlv_flags */
0982     u32 pkt_filter_flags0; /* MGMT */
0983     u32 pkt_filter_flags1; /* MGMT */
0984     u32 pkt_filter_flags2; /* CTRL */
0985     u32 pkt_filter_flags3; /* DATA */
0986 };
0987 
0988 #define HTT_RX_FULL_MON_MODE_CFG_CMD_INFO0_MSG_TYPE GENMASK(7, 0)
0989 #define HTT_RX_FULL_MON_MODE_CFG_CMD_INFO0_PDEV_ID  GENMASK(15, 8)
0990 
0991 #define HTT_RX_FULL_MON_MODE_CFG_CMD_CFG_ENABLE         BIT(0)
0992 #define HTT_RX_FULL_MON_MODE_CFG_CMD_CFG_ZERO_MPDUS_END     BIT(1)
0993 #define HTT_RX_FULL_MON_MODE_CFG_CMD_CFG_NON_ZERO_MPDUS_END BIT(2)
0994 #define HTT_RX_FULL_MON_MODE_CFG_CMD_CFG_RELEASE_RING       GENMASK(10, 3)
0995 
0996 /**
0997  * Enumeration for full monitor mode destination ring select
0998  * 0 - REO destination ring select
0999  * 1 - FW destination ring select
1000  * 2 - SW destination ring select
1001  * 3 - Release destination ring select
1002  */
1003 enum htt_rx_full_mon_release_ring {
1004     HTT_RX_MON_RING_REO,
1005     HTT_RX_MON_RING_FW,
1006     HTT_RX_MON_RING_SW,
1007     HTT_RX_MON_RING_RELEASE,
1008 };
1009 
1010 struct htt_rx_full_monitor_mode_cfg_cmd {
1011     u32 info0;
1012     u32 cfg;
1013 } __packed;
1014 
1015 /* HTT message target->host */
1016 
1017 enum htt_t2h_msg_type {
1018     HTT_T2H_MSG_TYPE_VERSION_CONF,
1019     HTT_T2H_MSG_TYPE_PEER_MAP   = 0x3,
1020     HTT_T2H_MSG_TYPE_PEER_UNMAP = 0x4,
1021     HTT_T2H_MSG_TYPE_RX_ADDBA   = 0x5,
1022     HTT_T2H_MSG_TYPE_PKTLOG     = 0x8,
1023     HTT_T2H_MSG_TYPE_SEC_IND    = 0xb,
1024     HTT_T2H_MSG_TYPE_PEER_MAP2  = 0x1e,
1025     HTT_T2H_MSG_TYPE_PEER_UNMAP2    = 0x1f,
1026     HTT_T2H_MSG_TYPE_PPDU_STATS_IND = 0x1d,
1027     HTT_T2H_MSG_TYPE_EXT_STATS_CONF = 0x1c,
1028     HTT_T2H_MSG_TYPE_BKPRESSURE_EVENT_IND = 0x24,
1029 };
1030 
1031 #define HTT_TARGET_VERSION_MAJOR 3
1032 
1033 #define HTT_T2H_MSG_TYPE        GENMASK(7, 0)
1034 #define HTT_T2H_VERSION_CONF_MINOR  GENMASK(15, 8)
1035 #define HTT_T2H_VERSION_CONF_MAJOR  GENMASK(23, 16)
1036 
1037 struct htt_t2h_version_conf_msg {
1038     u32 version;
1039 } __packed;
1040 
1041 #define HTT_T2H_PEER_MAP_INFO_VDEV_ID   GENMASK(15, 8)
1042 #define HTT_T2H_PEER_MAP_INFO_PEER_ID   GENMASK(31, 16)
1043 #define HTT_T2H_PEER_MAP_INFO1_MAC_ADDR_H16 GENMASK(15, 0)
1044 #define HTT_T2H_PEER_MAP_INFO1_HW_PEER_ID   GENMASK(31, 16)
1045 #define HTT_T2H_PEER_MAP_INFO2_AST_HASH_VAL GENMASK(15, 0)
1046 #define HTT_T2H_PEER_MAP_INFO2_NEXT_HOP_M   BIT(16)
1047 #define HTT_T2H_PEER_MAP_INFO2_NEXT_HOP_S   16
1048 
1049 struct htt_t2h_peer_map_event {
1050     u32 info;
1051     u32 mac_addr_l32;
1052     u32 info1;
1053     u32 info2;
1054 } __packed;
1055 
1056 #define HTT_T2H_PEER_UNMAP_INFO_VDEV_ID HTT_T2H_PEER_MAP_INFO_VDEV_ID
1057 #define HTT_T2H_PEER_UNMAP_INFO_PEER_ID HTT_T2H_PEER_MAP_INFO_PEER_ID
1058 #define HTT_T2H_PEER_UNMAP_INFO1_MAC_ADDR_H16 \
1059                     HTT_T2H_PEER_MAP_INFO1_MAC_ADDR_H16
1060 #define HTT_T2H_PEER_MAP_INFO1_NEXT_HOP_M HTT_T2H_PEER_MAP_INFO2_NEXT_HOP_M
1061 #define HTT_T2H_PEER_MAP_INFO1_NEXT_HOP_S HTT_T2H_PEER_MAP_INFO2_NEXT_HOP_S
1062 
1063 struct htt_t2h_peer_unmap_event {
1064     u32 info;
1065     u32 mac_addr_l32;
1066     u32 info1;
1067 } __packed;
1068 
1069 struct htt_resp_msg {
1070     union {
1071         struct htt_t2h_version_conf_msg version_msg;
1072         struct htt_t2h_peer_map_event peer_map_ev;
1073         struct htt_t2h_peer_unmap_event peer_unmap_ev;
1074     };
1075 } __packed;
1076 
1077 #define HTT_BACKPRESSURE_EVENT_PDEV_ID_M GENMASK(15, 8)
1078 #define HTT_BACKPRESSURE_EVENT_RING_TYPE_M GENMASK(23, 16)
1079 #define HTT_BACKPRESSURE_EVENT_RING_ID_M GENMASK(31, 24)
1080 
1081 #define HTT_BACKPRESSURE_EVENT_HP_M GENMASK(15, 0)
1082 #define HTT_BACKPRESSURE_EVENT_TP_M GENMASK(31, 16)
1083 
1084 #define HTT_BACKPRESSURE_UMAC_RING_TYPE 0
1085 #define HTT_BACKPRESSURE_LMAC_RING_TYPE 1
1086 
1087 enum htt_backpressure_umac_ringid {
1088     HTT_SW_RING_IDX_REO_REO2SW1_RING,
1089     HTT_SW_RING_IDX_REO_REO2SW2_RING,
1090     HTT_SW_RING_IDX_REO_REO2SW3_RING,
1091     HTT_SW_RING_IDX_REO_REO2SW4_RING,
1092     HTT_SW_RING_IDX_REO_WBM2REO_LINK_RING,
1093     HTT_SW_RING_IDX_REO_REO2TCL_RING,
1094     HTT_SW_RING_IDX_REO_REO2FW_RING,
1095     HTT_SW_RING_IDX_REO_REO_RELEASE_RING,
1096     HTT_SW_RING_IDX_WBM_PPE_RELEASE_RING,
1097     HTT_SW_RING_IDX_TCL_TCL2TQM_RING,
1098     HTT_SW_RING_IDX_WBM_TQM_RELEASE_RING,
1099     HTT_SW_RING_IDX_WBM_REO_RELEASE_RING,
1100     HTT_SW_RING_IDX_WBM_WBM2SW0_RELEASE_RING,
1101     HTT_SW_RING_IDX_WBM_WBM2SW1_RELEASE_RING,
1102     HTT_SW_RING_IDX_WBM_WBM2SW2_RELEASE_RING,
1103     HTT_SW_RING_IDX_WBM_WBM2SW3_RELEASE_RING,
1104     HTT_SW_RING_IDX_REO_REO_CMD_RING,
1105     HTT_SW_RING_IDX_REO_REO_STATUS_RING,
1106     HTT_SW_UMAC_RING_IDX_MAX,
1107 };
1108 
1109 enum htt_backpressure_lmac_ringid {
1110     HTT_SW_RING_IDX_FW2RXDMA_BUF_RING,
1111     HTT_SW_RING_IDX_FW2RXDMA_STATUS_RING,
1112     HTT_SW_RING_IDX_FW2RXDMA_LINK_RING,
1113     HTT_SW_RING_IDX_SW2RXDMA_BUF_RING,
1114     HTT_SW_RING_IDX_WBM2RXDMA_LINK_RING,
1115     HTT_SW_RING_IDX_RXDMA2FW_RING,
1116     HTT_SW_RING_IDX_RXDMA2SW_RING,
1117     HTT_SW_RING_IDX_RXDMA2RELEASE_RING,
1118     HTT_SW_RING_IDX_RXDMA2REO_RING,
1119     HTT_SW_RING_IDX_MONITOR_STATUS_RING,
1120     HTT_SW_RING_IDX_MONITOR_BUF_RING,
1121     HTT_SW_RING_IDX_MONITOR_DESC_RING,
1122     HTT_SW_RING_IDX_MONITOR_DEST_RING,
1123     HTT_SW_LMAC_RING_IDX_MAX,
1124 };
1125 
1126 /* ppdu stats
1127  *
1128  * @details
1129  * The following field definitions describe the format of the HTT target
1130  * to host ppdu stats indication message.
1131  *
1132  *
1133  * |31                         16|15   12|11   10|9      8|7            0 |
1134  * |----------------------------------------------------------------------|
1135  * |    payload_size             | rsvd  |pdev_id|mac_id  |    msg type   |
1136  * |----------------------------------------------------------------------|
1137  * |                          ppdu_id                                     |
1138  * |----------------------------------------------------------------------|
1139  * |                        Timestamp in us                               |
1140  * |----------------------------------------------------------------------|
1141  * |                          reserved                                    |
1142  * |----------------------------------------------------------------------|
1143  * |                    type-specific stats info                          |
1144  * |                     (see htt_ppdu_stats.h)                           |
1145  * |----------------------------------------------------------------------|
1146  * Header fields:
1147  *  - MSG_TYPE
1148  *    Bits 7:0
1149  *    Purpose: Identifies this is a PPDU STATS indication
1150  *             message.
1151  *    Value: 0x1d
1152  *  - mac_id
1153  *    Bits 9:8
1154  *    Purpose: mac_id of this ppdu_id
1155  *    Value: 0-3
1156  *  - pdev_id
1157  *    Bits 11:10
1158  *    Purpose: pdev_id of this ppdu_id
1159  *    Value: 0-3
1160  *     0 (for rings at SOC level),
1161  *     1/2/3 PDEV -> 0/1/2
1162  *  - payload_size
1163  *    Bits 31:16
1164  *    Purpose: total tlv size
1165  *    Value: payload_size in bytes
1166  */
1167 
1168 #define HTT_T2H_PPDU_STATS_INFO_PDEV_ID GENMASK(11, 10)
1169 #define HTT_T2H_PPDU_STATS_INFO_PAYLOAD_SIZE GENMASK(31, 16)
1170 
1171 struct ath11k_htt_ppdu_stats_msg {
1172     u32 info;
1173     u32 ppdu_id;
1174     u32 timestamp;
1175     u32 rsvd;
1176     u8 data[];
1177 } __packed;
1178 
1179 struct htt_tlv {
1180     u32 header;
1181     u8 value[];
1182 } __packed;
1183 
1184 #define HTT_TLV_TAG         GENMASK(11, 0)
1185 #define HTT_TLV_LEN         GENMASK(23, 12)
1186 
1187 enum HTT_PPDU_STATS_BW {
1188     HTT_PPDU_STATS_BANDWIDTH_5MHZ   = 0,
1189     HTT_PPDU_STATS_BANDWIDTH_10MHZ  = 1,
1190     HTT_PPDU_STATS_BANDWIDTH_20MHZ  = 2,
1191     HTT_PPDU_STATS_BANDWIDTH_40MHZ  = 3,
1192     HTT_PPDU_STATS_BANDWIDTH_80MHZ  = 4,
1193     HTT_PPDU_STATS_BANDWIDTH_160MHZ = 5, /* includes 80+80 */
1194     HTT_PPDU_STATS_BANDWIDTH_DYN    = 6,
1195 };
1196 
1197 #define HTT_PPDU_STATS_CMN_FLAGS_FRAME_TYPE_M   GENMASK(7, 0)
1198 #define HTT_PPDU_STATS_CMN_FLAGS_QUEUE_TYPE_M   GENMASK(15, 8)
1199 /* bw - HTT_PPDU_STATS_BW */
1200 #define HTT_PPDU_STATS_CMN_FLAGS_BW_M       GENMASK(19, 16)
1201 
1202 struct htt_ppdu_stats_common {
1203     u32 ppdu_id;
1204     u16 sched_cmdid;
1205     u8 ring_id;
1206     u8 num_users;
1207     u32 flags; /* %HTT_PPDU_STATS_COMMON_FLAGS_*/
1208     u32 chain_mask;
1209     u32 fes_duration_us; /* frame exchange sequence */
1210     u32 ppdu_sch_eval_start_tstmp_us;
1211     u32 ppdu_sch_end_tstmp_us;
1212     u32 ppdu_start_tstmp_us;
1213     /* BIT [15 :  0] - phy mode (WLAN_PHY_MODE) with which ppdu was transmitted
1214      * BIT [31 : 16] - bandwidth (in MHz) with which ppdu was transmitted
1215      */
1216     u16 phy_mode;
1217     u16 bw_mhz;
1218 } __packed;
1219 
1220 enum htt_ppdu_stats_gi {
1221     HTT_PPDU_STATS_SGI_0_8_US,
1222     HTT_PPDU_STATS_SGI_0_4_US,
1223     HTT_PPDU_STATS_SGI_1_6_US,
1224     HTT_PPDU_STATS_SGI_3_2_US,
1225 };
1226 
1227 #define HTT_PPDU_STATS_USER_RATE_INFO0_USER_POS_M   GENMASK(3, 0)
1228 #define HTT_PPDU_STATS_USER_RATE_INFO0_MU_GROUP_ID_M    GENMASK(11, 4)
1229 
1230 #define HTT_PPDU_STATS_USER_RATE_INFO1_RESP_TYPE_VALD_M BIT(0)
1231 #define HTT_PPDU_STATS_USER_RATE_INFO1_PPDU_TYPE_M  GENMASK(5, 1)
1232 
1233 #define HTT_PPDU_STATS_USER_RATE_FLAGS_LTF_SIZE_M   GENMASK(1, 0)
1234 #define HTT_PPDU_STATS_USER_RATE_FLAGS_STBC_M       BIT(2)
1235 #define HTT_PPDU_STATS_USER_RATE_FLAGS_HE_RE_M      BIT(3)
1236 #define HTT_PPDU_STATS_USER_RATE_FLAGS_TXBF_M       GENMASK(7, 4)
1237 #define HTT_PPDU_STATS_USER_RATE_FLAGS_BW_M     GENMASK(11, 8)
1238 #define HTT_PPDU_STATS_USER_RATE_FLAGS_NSS_M        GENMASK(15, 12)
1239 #define HTT_PPDU_STATS_USER_RATE_FLAGS_MCS_M        GENMASK(19, 16)
1240 #define HTT_PPDU_STATS_USER_RATE_FLAGS_PREAMBLE_M   GENMASK(23, 20)
1241 #define HTT_PPDU_STATS_USER_RATE_FLAGS_GI_M     GENMASK(27, 24)
1242 #define HTT_PPDU_STATS_USER_RATE_FLAGS_DCM_M        BIT(28)
1243 #define HTT_PPDU_STATS_USER_RATE_FLAGS_LDPC_M       BIT(29)
1244 
1245 #define HTT_USR_RATE_PREAMBLE(_val) \
1246         FIELD_GET(HTT_PPDU_STATS_USER_RATE_FLAGS_PREAMBLE_M, _val)
1247 #define HTT_USR_RATE_BW(_val) \
1248         FIELD_GET(HTT_PPDU_STATS_USER_RATE_FLAGS_BW_M, _val)
1249 #define HTT_USR_RATE_NSS(_val) \
1250         FIELD_GET(HTT_PPDU_STATS_USER_RATE_FLAGS_NSS_M, _val)
1251 #define HTT_USR_RATE_MCS(_val) \
1252         FIELD_GET(HTT_PPDU_STATS_USER_RATE_FLAGS_MCS_M, _val)
1253 #define HTT_USR_RATE_GI(_val) \
1254         FIELD_GET(HTT_PPDU_STATS_USER_RATE_FLAGS_GI_M, _val)
1255 #define HTT_USR_RATE_DCM(_val) \
1256         FIELD_GET(HTT_PPDU_STATS_USER_RATE_FLAGS_DCM_M, _val)
1257 
1258 #define HTT_PPDU_STATS_USER_RATE_RESP_FLAGS_LTF_SIZE_M      GENMASK(1, 0)
1259 #define HTT_PPDU_STATS_USER_RATE_RESP_FLAGS_STBC_M      BIT(2)
1260 #define HTT_PPDU_STATS_USER_RATE_RESP_FLAGS_HE_RE_M     BIT(3)
1261 #define HTT_PPDU_STATS_USER_RATE_RESP_FLAGS_TXBF_M      GENMASK(7, 4)
1262 #define HTT_PPDU_STATS_USER_RATE_RESP_FLAGS_BW_M        GENMASK(11, 8)
1263 #define HTT_PPDU_STATS_USER_RATE_RESP_FLAGS_NSS_M       GENMASK(15, 12)
1264 #define HTT_PPDU_STATS_USER_RATE_RESP_FLAGS_MCS_M       GENMASK(19, 16)
1265 #define HTT_PPDU_STATS_USER_RATE_RESP_FLAGS_PREAMBLE_M      GENMASK(23, 20)
1266 #define HTT_PPDU_STATS_USER_RATE_RESP_FLAGS_GI_M        GENMASK(27, 24)
1267 #define HTT_PPDU_STATS_USER_RATE_RESP_FLAGS_DCM_M       BIT(28)
1268 #define HTT_PPDU_STATS_USER_RATE_RESP_FLAGS_LDPC_M      BIT(29)
1269 
1270 struct htt_ppdu_stats_user_rate {
1271     u8 tid_num;
1272     u8 reserved0;
1273     u16 sw_peer_id;
1274     u32 info0; /* %HTT_PPDU_STATS_USER_RATE_INFO0_*/
1275     u16 ru_end;
1276     u16 ru_start;
1277     u16 resp_ru_end;
1278     u16 resp_ru_start;
1279     u32 info1; /* %HTT_PPDU_STATS_USER_RATE_INFO1_ */
1280     u32 rate_flags; /* %HTT_PPDU_STATS_USER_RATE_FLAGS_ */
1281     /* Note: resp_rate_info is only valid for if resp_type is UL */
1282     u32 resp_rate_flags; /* %HTT_PPDU_STATS_USER_RATE_RESP_FLAGS_ */
1283 } __packed;
1284 
1285 #define HTT_PPDU_STATS_TX_INFO_FLAGS_RATECODE_M     GENMASK(7, 0)
1286 #define HTT_PPDU_STATS_TX_INFO_FLAGS_IS_AMPDU_M     BIT(8)
1287 #define HTT_PPDU_STATS_TX_INFO_FLAGS_BA_ACK_FAILED_M    GENMASK(10, 9)
1288 #define HTT_PPDU_STATS_TX_INFO_FLAGS_BW_M       GENMASK(13, 11)
1289 #define HTT_PPDU_STATS_TX_INFO_FLAGS_SGI_M      BIT(14)
1290 #define HTT_PPDU_STATS_TX_INFO_FLAGS_PEERID_M       GENMASK(31, 16)
1291 
1292 #define HTT_TX_INFO_IS_AMSDU(_flags) \
1293             FIELD_GET(HTT_PPDU_STATS_TX_INFO_FLAGS_IS_AMPDU_M, _flags)
1294 #define HTT_TX_INFO_BA_ACK_FAILED(_flags) \
1295             FIELD_GET(HTT_PPDU_STATS_TX_INFO_FLAGS_BA_ACK_FAILED_M, _flags)
1296 #define HTT_TX_INFO_RATECODE(_flags) \
1297             FIELD_GET(HTT_PPDU_STATS_TX_INFO_FLAGS_RATECODE_M, _flags)
1298 #define HTT_TX_INFO_PEERID(_flags) \
1299             FIELD_GET(HTT_PPDU_STATS_TX_INFO_FLAGS_PEERID_M, _flags)
1300 
1301 struct htt_tx_ppdu_stats_info {
1302     struct htt_tlv tlv_hdr;
1303     u32 tx_success_bytes;
1304     u32 tx_retry_bytes;
1305     u32 tx_failed_bytes;
1306     u32 flags; /* %HTT_PPDU_STATS_TX_INFO_FLAGS_ */
1307     u16 tx_success_msdus;
1308     u16 tx_retry_msdus;
1309     u16 tx_failed_msdus;
1310     u16 tx_duration; /* united in us */
1311 } __packed;
1312 
1313 enum  htt_ppdu_stats_usr_compln_status {
1314     HTT_PPDU_STATS_USER_STATUS_OK,
1315     HTT_PPDU_STATS_USER_STATUS_FILTERED,
1316     HTT_PPDU_STATS_USER_STATUS_RESP_TIMEOUT,
1317     HTT_PPDU_STATS_USER_STATUS_RESP_MISMATCH,
1318     HTT_PPDU_STATS_USER_STATUS_ABORT,
1319 };
1320 
1321 #define HTT_PPDU_STATS_USR_CMPLTN_CMN_FLAGS_LONG_RETRY_M    GENMASK(3, 0)
1322 #define HTT_PPDU_STATS_USR_CMPLTN_CMN_FLAGS_SHORT_RETRY_M   GENMASK(7, 4)
1323 #define HTT_PPDU_STATS_USR_CMPLTN_CMN_FLAGS_IS_AMPDU_M      BIT(8)
1324 #define HTT_PPDU_STATS_USR_CMPLTN_CMN_FLAGS_RESP_TYPE_M     GENMASK(12, 9)
1325 
1326 #define HTT_USR_CMPLTN_IS_AMPDU(_val) \
1327         FIELD_GET(HTT_PPDU_STATS_USR_CMPLTN_CMN_FLAGS_IS_AMPDU_M, _val)
1328 #define HTT_USR_CMPLTN_LONG_RETRY(_val) \
1329         FIELD_GET(HTT_PPDU_STATS_USR_CMPLTN_CMN_FLAGS_LONG_RETRY_M, _val)
1330 #define HTT_USR_CMPLTN_SHORT_RETRY(_val) \
1331         FIELD_GET(HTT_PPDU_STATS_USR_CMPLTN_CMN_FLAGS_SHORT_RETRY_M, _val)
1332 
1333 struct htt_ppdu_stats_usr_cmpltn_cmn {
1334     u8 status;
1335     u8 tid_num;
1336     u16 sw_peer_id;
1337     /* RSSI value of last ack packet (units = dB above noise floor) */
1338     u32 ack_rssi;
1339     u16 mpdu_tried;
1340     u16 mpdu_success;
1341     u32 flags; /* %HTT_PPDU_STATS_USR_CMPLTN_CMN_FLAGS_LONG_RETRIES*/
1342 } __packed;
1343 
1344 #define HTT_PPDU_STATS_ACK_BA_INFO_NUM_MPDU_M   GENMASK(8, 0)
1345 #define HTT_PPDU_STATS_ACK_BA_INFO_NUM_MSDU_M   GENMASK(24, 9)
1346 #define HTT_PPDU_STATS_ACK_BA_INFO_TID_NUM  GENMASK(31, 25)
1347 
1348 #define HTT_PPDU_STATS_NON_QOS_TID  16
1349 
1350 struct htt_ppdu_stats_usr_cmpltn_ack_ba_status {
1351     u32 ppdu_id;
1352     u16 sw_peer_id;
1353     u16 reserved0;
1354     u32 info; /* %HTT_PPDU_STATS_USR_CMPLTN_CMN_INFO_ */
1355     u16 current_seq;
1356     u16 start_seq;
1357     u32 success_bytes;
1358 } __packed;
1359 
1360 struct htt_ppdu_stats_usr_cmn_array {
1361     struct htt_tlv tlv_hdr;
1362     u32 num_ppdu_stats;
1363     /* tx_ppdu_stats_info is filled by multiple struct htt_tx_ppdu_stats_info
1364      * elements.
1365      * tx_ppdu_stats_info is variable length, with length =
1366      *     number_of_ppdu_stats * sizeof (struct htt_tx_ppdu_stats_info)
1367      */
1368     struct htt_tx_ppdu_stats_info tx_ppdu_info[];
1369 } __packed;
1370 
1371 struct htt_ppdu_user_stats {
1372     u16 peer_id;
1373     u32 tlv_flags;
1374     bool is_valid_peer_id;
1375     struct htt_ppdu_stats_user_rate rate;
1376     struct htt_ppdu_stats_usr_cmpltn_cmn cmpltn_cmn;
1377     struct htt_ppdu_stats_usr_cmpltn_ack_ba_status ack_ba;
1378 };
1379 
1380 #define HTT_PPDU_STATS_MAX_USERS    8
1381 #define HTT_PPDU_DESC_MAX_DEPTH 16
1382 
1383 struct htt_ppdu_stats {
1384     struct htt_ppdu_stats_common common;
1385     struct htt_ppdu_user_stats user_stats[HTT_PPDU_STATS_MAX_USERS];
1386 };
1387 
1388 struct htt_ppdu_stats_info {
1389     u32 ppdu_id;
1390     struct htt_ppdu_stats ppdu_stats;
1391     struct list_head list;
1392 };
1393 
1394 /**
1395  * @brief target -> host packet log message
1396  *
1397  * @details
1398  * The following field definitions describe the format of the packet log
1399  * message sent from the target to the host.
1400  * The message consists of a 4-octet header,followed by a variable number
1401  * of 32-bit character values.
1402  *
1403  * |31                         16|15  12|11   10|9    8|7            0|
1404  * |------------------------------------------------------------------|
1405  * |        payload_size         | rsvd |pdev_id|mac_id|   msg type   |
1406  * |------------------------------------------------------------------|
1407  * |                              payload                             |
1408  * |------------------------------------------------------------------|
1409  *   - MSG_TYPE
1410  *     Bits 7:0
1411  *     Purpose: identifies this as a pktlog message
1412  *     Value: HTT_T2H_MSG_TYPE_PKTLOG
1413  *   - mac_id
1414  *     Bits 9:8
1415  *     Purpose: identifies which MAC/PHY instance generated this pktlog info
1416  *     Value: 0-3
1417  *   - pdev_id
1418  *     Bits 11:10
1419  *     Purpose: pdev_id
1420  *     Value: 0-3
1421  *     0 (for rings at SOC level),
1422  *     1/2/3 PDEV -> 0/1/2
1423  *   - payload_size
1424  *     Bits 31:16
1425  *     Purpose: explicitly specify the payload size
1426  *     Value: payload size in bytes (payload size is a multiple of 4 bytes)
1427  */
1428 struct htt_pktlog_msg {
1429     u32 hdr;
1430     u8 payload[];
1431 };
1432 
1433 /**
1434  * @brief host -> target FW extended statistics retrieve
1435  *
1436  * @details
1437  * The following field definitions describe the format of the HTT host
1438  * to target FW extended stats retrieve message.
1439  * The message specifies the type of stats the host wants to retrieve.
1440  *
1441  * |31          24|23          16|15           8|7            0|
1442  * |-----------------------------------------------------------|
1443  * |   reserved   | stats type   |   pdev_mask  |   msg type   |
1444  * |-----------------------------------------------------------|
1445  * |                   config param [0]                        |
1446  * |-----------------------------------------------------------|
1447  * |                   config param [1]                        |
1448  * |-----------------------------------------------------------|
1449  * |                   config param [2]                        |
1450  * |-----------------------------------------------------------|
1451  * |                   config param [3]                        |
1452  * |-----------------------------------------------------------|
1453  * |                         reserved                          |
1454  * |-----------------------------------------------------------|
1455  * |                        cookie LSBs                        |
1456  * |-----------------------------------------------------------|
1457  * |                        cookie MSBs                        |
1458  * |-----------------------------------------------------------|
1459  * Header fields:
1460  *  - MSG_TYPE
1461  *    Bits 7:0
1462  *    Purpose: identifies this is a extended stats upload request message
1463  *    Value: 0x10
1464  *  - PDEV_MASK
1465  *    Bits 8:15
1466  *    Purpose: identifies the mask of PDEVs to retrieve stats from
1467  *    Value: This is a overloaded field, refer to usage and interpretation of
1468  *           PDEV in interface document.
1469  *           Bit   8    :  Reserved for SOC stats
1470  *           Bit 9 - 15 :  Indicates PDEV_MASK in DBDC
1471  *                         Indicates MACID_MASK in DBS
1472  *  - STATS_TYPE
1473  *    Bits 23:16
1474  *    Purpose: identifies which FW statistics to upload
1475  *    Value: Defined by htt_dbg_ext_stats_type (see htt_stats.h)
1476  *  - Reserved
1477  *    Bits 31:24
1478  *  - CONFIG_PARAM [0]
1479  *    Bits 31:0
1480  *    Purpose: give an opaque configuration value to the specified stats type
1481  *    Value: stats-type specific configuration value
1482  *           Refer to htt_stats.h for interpretation for each stats sub_type
1483  *  - CONFIG_PARAM [1]
1484  *    Bits 31:0
1485  *    Purpose: give an opaque configuration value to the specified stats type
1486  *    Value: stats-type specific configuration value
1487  *           Refer to htt_stats.h for interpretation for each stats sub_type
1488  *  - CONFIG_PARAM [2]
1489  *    Bits 31:0
1490  *    Purpose: give an opaque configuration value to the specified stats type
1491  *    Value: stats-type specific configuration value
1492  *           Refer to htt_stats.h for interpretation for each stats sub_type
1493  *  - CONFIG_PARAM [3]
1494  *    Bits 31:0
1495  *    Purpose: give an opaque configuration value to the specified stats type
1496  *    Value: stats-type specific configuration value
1497  *           Refer to htt_stats.h for interpretation for each stats sub_type
1498  *  - Reserved [31:0] for future use.
1499  *  - COOKIE_LSBS
1500  *    Bits 31:0
1501  *    Purpose: Provide a mechanism to match a target->host stats confirmation
1502  *        message with its preceding host->target stats request message.
1503  *    Value: LSBs of the opaque cookie specified by the host-side requestor
1504  *  - COOKIE_MSBS
1505  *    Bits 31:0
1506  *    Purpose: Provide a mechanism to match a target->host stats confirmation
1507  *        message with its preceding host->target stats request message.
1508  *    Value: MSBs of the opaque cookie specified by the host-side requestor
1509  */
1510 
1511 struct htt_ext_stats_cfg_hdr {
1512     u8 msg_type;
1513     u8 pdev_mask;
1514     u8 stats_type;
1515     u8 reserved;
1516 } __packed;
1517 
1518 struct htt_ext_stats_cfg_cmd {
1519     struct htt_ext_stats_cfg_hdr hdr;
1520     u32 cfg_param0;
1521     u32 cfg_param1;
1522     u32 cfg_param2;
1523     u32 cfg_param3;
1524     u32 reserved;
1525     u32 cookie_lsb;
1526     u32 cookie_msb;
1527 } __packed;
1528 
1529 /* htt stats config default params */
1530 #define HTT_STAT_DEFAULT_RESET_START_OFFSET 0
1531 #define HTT_STAT_DEFAULT_CFG0_ALL_HWQS 0xffffffff
1532 #define HTT_STAT_DEFAULT_CFG0_ALL_TXQS 0xffffffff
1533 #define HTT_STAT_DEFAULT_CFG0_ALL_CMDQS 0xffff
1534 #define HTT_STAT_DEFAULT_CFG0_ALL_RINGS 0xffff
1535 #define HTT_STAT_DEFAULT_CFG0_ACTIVE_PEERS 0xff
1536 #define HTT_STAT_DEFAULT_CFG0_CCA_CUMULATIVE 0x00
1537 #define HTT_STAT_DEFAULT_CFG0_ACTIVE_VDEVS 0x00
1538 
1539 /* HTT_DBG_EXT_STATS_PEER_INFO
1540  * PARAMS:
1541  * @config_param0:
1542  *  [Bit0] - [0] for sw_peer_id, [1] for mac_addr based request
1543  *  [Bit15 : Bit 1] htt_peer_stats_req_mode_t
1544  *  [Bit31 : Bit16] sw_peer_id
1545  * @config_param1:
1546  *  peer_stats_req_type_mask:32 (enum htt_peer_stats_tlv_enum)
1547  *   0 bit htt_peer_stats_cmn_tlv
1548  *   1 bit htt_peer_details_tlv
1549  *   2 bit htt_tx_peer_rate_stats_tlv
1550  *   3 bit htt_rx_peer_rate_stats_tlv
1551  *   4 bit htt_tx_tid_stats_tlv/htt_tx_tid_stats_v1_tlv
1552  *   5 bit htt_rx_tid_stats_tlv
1553  *   6 bit htt_msdu_flow_stats_tlv
1554  * @config_param2: [Bit31 : Bit0] mac_addr31to0
1555  * @config_param3: [Bit15 : Bit0] mac_addr47to32
1556  *                [Bit31 : Bit16] reserved
1557  */
1558 #define HTT_STAT_PEER_INFO_MAC_ADDR BIT(0)
1559 #define HTT_STAT_DEFAULT_PEER_REQ_TYPE 0x7f
1560 
1561 /* Used to set different configs to the specified stats type.*/
1562 struct htt_ext_stats_cfg_params {
1563     u32 cfg0;
1564     u32 cfg1;
1565     u32 cfg2;
1566     u32 cfg3;
1567 };
1568 
1569 /**
1570  * @brief target -> host extended statistics upload
1571  *
1572  * @details
1573  * The following field definitions describe the format of the HTT target
1574  * to host stats upload confirmation message.
1575  * The message contains a cookie echoed from the HTT host->target stats
1576  * upload request, which identifies which request the confirmation is
1577  * for, and a single stats can span over multiple HTT stats indication
1578  * due to the HTT message size limitation so every HTT ext stats indication
1579  * will have tag-length-value stats information elements.
1580  * The tag-length header for each HTT stats IND message also includes a
1581  * status field, to indicate whether the request for the stat type in
1582  * question was fully met, partially met, unable to be met, or invalid
1583  * (if the stat type in question is disabled in the target).
1584  * A Done bit 1's indicate the end of the of stats info elements.
1585  *
1586  *
1587  * |31                         16|15    12|11|10 8|7   5|4       0|
1588  * |--------------------------------------------------------------|
1589  * |                   reserved                   |    msg type   |
1590  * |--------------------------------------------------------------|
1591  * |                         cookie LSBs                          |
1592  * |--------------------------------------------------------------|
1593  * |                         cookie MSBs                          |
1594  * |--------------------------------------------------------------|
1595  * |      stats entry length     | rsvd   | D|  S |   stat type   |
1596  * |--------------------------------------------------------------|
1597  * |                   type-specific stats info                   |
1598  * |                      (see htt_stats.h)                       |
1599  * |--------------------------------------------------------------|
1600  * Header fields:
1601  *  - MSG_TYPE
1602  *    Bits 7:0
1603  *    Purpose: Identifies this is a extended statistics upload confirmation
1604  *             message.
1605  *    Value: 0x1c
1606  *  - COOKIE_LSBS
1607  *    Bits 31:0
1608  *    Purpose: Provide a mechanism to match a target->host stats confirmation
1609  *        message with its preceding host->target stats request message.
1610  *    Value: LSBs of the opaque cookie specified by the host-side requestor
1611  *  - COOKIE_MSBS
1612  *    Bits 31:0
1613  *    Purpose: Provide a mechanism to match a target->host stats confirmation
1614  *        message with its preceding host->target stats request message.
1615  *    Value: MSBs of the opaque cookie specified by the host-side requestor
1616  *
1617  * Stats Information Element tag-length header fields:
1618  *  - STAT_TYPE
1619  *    Bits 7:0
1620  *    Purpose: identifies the type of statistics info held in the
1621  *        following information element
1622  *    Value: htt_dbg_ext_stats_type
1623  *  - STATUS
1624  *    Bits 10:8
1625  *    Purpose: indicate whether the requested stats are present
1626  *    Value: htt_dbg_ext_stats_status
1627  *  - DONE
1628  *    Bits 11
1629  *    Purpose:
1630  *        Indicates the completion of the stats entry, this will be the last
1631  *        stats conf HTT segment for the requested stats type.
1632  *    Value:
1633  *        0 -> the stats retrieval is ongoing
1634  *        1 -> the stats retrieval is complete
1635  *  - LENGTH
1636  *    Bits 31:16
1637  *    Purpose: indicate the stats information size
1638  *    Value: This field specifies the number of bytes of stats information
1639  *       that follows the element tag-length header.
1640  *       It is expected but not required that this length is a multiple of
1641  *       4 bytes.
1642  */
1643 
1644 #define HTT_T2H_EXT_STATS_INFO1_DONE    BIT(11)
1645 #define HTT_T2H_EXT_STATS_INFO1_LENGTH   GENMASK(31, 16)
1646 
1647 struct ath11k_htt_extd_stats_msg {
1648     u32 info0;
1649     u64 cookie;
1650     u32 info1;
1651     u8 data[];
1652 } __packed;
1653 
1654 #define HTT_MAC_ADDR_L32_0  GENMASK(7, 0)
1655 #define HTT_MAC_ADDR_L32_1  GENMASK(15, 8)
1656 #define HTT_MAC_ADDR_L32_2  GENMASK(23, 16)
1657 #define HTT_MAC_ADDR_L32_3  GENMASK(31, 24)
1658 #define HTT_MAC_ADDR_H16_0  GENMASK(7, 0)
1659 #define HTT_MAC_ADDR_H16_1  GENMASK(15, 8)
1660 
1661 struct htt_mac_addr {
1662     u32 mac_addr_l32;
1663     u32 mac_addr_h16;
1664 };
1665 
1666 static inline void ath11k_dp_get_mac_addr(u32 addr_l32, u16 addr_h16, u8 *addr)
1667 {
1668     if (IS_ENABLED(CONFIG_CPU_BIG_ENDIAN)) {
1669         addr_l32 = swab32(addr_l32);
1670         addr_h16 = swab16(addr_h16);
1671     }
1672 
1673     memcpy(addr, &addr_l32, 4);
1674     memcpy(addr + 4, &addr_h16, ETH_ALEN - 4);
1675 }
1676 
1677 int ath11k_dp_service_srng(struct ath11k_base *ab,
1678                struct ath11k_ext_irq_grp *irq_grp,
1679                int budget);
1680 int ath11k_dp_htt_connect(struct ath11k_dp *dp);
1681 void ath11k_dp_vdev_tx_attach(struct ath11k *ar, struct ath11k_vif *arvif);
1682 void ath11k_dp_free(struct ath11k_base *ab);
1683 int ath11k_dp_alloc(struct ath11k_base *ab);
1684 int ath11k_dp_pdev_alloc(struct ath11k_base *ab);
1685 void ath11k_dp_pdev_pre_alloc(struct ath11k_base *ab);
1686 void ath11k_dp_pdev_free(struct ath11k_base *ab);
1687 int ath11k_dp_tx_htt_srng_setup(struct ath11k_base *ab, u32 ring_id,
1688                 int mac_id, enum hal_ring_type ring_type);
1689 int ath11k_dp_peer_setup(struct ath11k *ar, int vdev_id, const u8 *addr);
1690 void ath11k_dp_peer_cleanup(struct ath11k *ar, int vdev_id, const u8 *addr);
1691 void ath11k_dp_srng_cleanup(struct ath11k_base *ab, struct dp_srng *ring);
1692 int ath11k_dp_srng_setup(struct ath11k_base *ab, struct dp_srng *ring,
1693              enum hal_ring_type type, int ring_num,
1694              int mac_id, int num_entries);
1695 void ath11k_dp_link_desc_cleanup(struct ath11k_base *ab,
1696                  struct dp_link_desc_bank *desc_bank,
1697                  u32 ring_type, struct dp_srng *ring);
1698 int ath11k_dp_link_desc_setup(struct ath11k_base *ab,
1699                   struct dp_link_desc_bank *link_desc_banks,
1700                   u32 ring_type, struct hal_srng *srng,
1701                   u32 n_link_desc);
1702 void ath11k_dp_shadow_start_timer(struct ath11k_base *ab,
1703                   struct hal_srng   *srng,
1704                   struct ath11k_hp_update_timer *update_timer);
1705 void ath11k_dp_shadow_stop_timer(struct ath11k_base *ab,
1706                  struct ath11k_hp_update_timer *update_timer);
1707 void ath11k_dp_shadow_init_timer(struct ath11k_base *ab,
1708                  struct ath11k_hp_update_timer *update_timer,
1709                  u32 interval, u32 ring_id);
1710 void ath11k_dp_stop_shadow_timers(struct ath11k_base *ab);
1711 
1712 #endif