diff options
| -rw-r--r-- | fw/htt.h | 28 | ||||
| -rw-r--r-- | fw/htt_ppdu_stats.h | 18 | ||||
| -rw-r--r-- | fw/htt_stats.h | 209 | ||||
| -rwxr-xr-x | fw/wmi_services.h | 2 | ||||
| -rwxr-xr-x | fw/wmi_tlv_defs.h | 7 | ||||
| -rwxr-xr-x | fw/wmi_unified.h | 70 | ||||
| -rwxr-xr-x | fw/wmi_version.h | 2 |
7 files changed, 317 insertions, 19 deletions
@@ -167,9 +167,10 @@ * 3.50 Add learning_frame flag to htt_tx_msdu_desc_ext2_t * 3.51 Add SW peer ID and TID num to HTT TX WBM COMPLETION * 3.52 Add HTT_T2H FLOW_POOL_RESIZE msg def + * 3.53 Update HTT_T2H FLOW_POOL_RESIZE msg def */ #define HTT_CURRENT_VERSION_MAJOR 3 -#define HTT_CURRENT_VERSION_MINOR 52 +#define HTT_CURRENT_VERSION_MINOR 53 #define HTT_NUM_TX_FRAG_DESC 1024 @@ -10485,18 +10486,18 @@ typedef struct { * * The message would appear as follows: * - * |31 24|23 16|15 8|7 0| - * |----------------+----------------+----------------+----------------| - * | flow Pool ID | reserved0 | Msg type | + * |31 16|15 8|7 0| + * |---------------------------------+----------------+----------------| + * | reserved0 | Msg type | * |-------------------------------------------------------------------| - * | reserved1 | flow pool new size | + * | flow pool new size | flow pool ID | * |-------------------------------------------------------------------| * * The message is interpreted as follows: * b'0:7 - msg_type: This will be set to * HTT_T2H_MSG_TYPE_FLOW_POOL_RESIZE * - * b'8:15 - flow pool ID: Existing flow pool ID + * b'0:15 - flow pool ID: Existing flow pool ID * * b'16:31 - flow pool new size: new pool size for exisiting flow pool ID * @@ -10504,19 +10505,18 @@ typedef struct { PREPACK struct htt_flow_pool_resize_t { A_UINT32 msg_type:8, - reserved0:8, - flow_pool_id:16; - A_UINT32 flow_pool_new_size:16, - reserved1:16; + reserved0:24; + A_UINT32 flow_pool_id:16, + flow_pool_new_size:16; } POSTPACK; #define HTT_FLOW_POOL_RESIZE_SZ (sizeof(struct htt_flow_pool_resize_t)) -#define HTT_FLOW_POOL_RESIZE_FLOW_POOL_ID_M 0xffff0000 -#define HTT_FLOW_POOL_RESIZE_FLOW_POOL_ID_S 16 +#define HTT_FLOW_POOL_RESIZE_FLOW_POOL_ID_M 0x0000ffff +#define HTT_FLOW_POOL_RESIZE_FLOW_POOL_ID_S 0 -#define HTT_FLOW_POOL_RESIZE_FLOW_POOL_NEW_SIZE_M 0x0000ffff -#define HTT_FLOW_POOL_RESIZE_FLOW_POOL_NEW_SIZE_S 0 +#define HTT_FLOW_POOL_RESIZE_FLOW_POOL_NEW_SIZE_M 0xffff0000 +#define HTT_FLOW_POOL_RESIZE_FLOW_POOL_NEW_SIZE_S 16 #define HTT_FLOW_POOL_RESIZE_FLOW_POOL_ID_GET(_var) \ diff --git a/fw/htt_ppdu_stats.h b/fw/htt_ppdu_stats.h index a3eaa25f983b..d2f2f49c99fd 100644 --- a/fw/htt_ppdu_stats.h +++ b/fw/htt_ppdu_stats.h @@ -506,6 +506,18 @@ typedef struct { ((_var) |= ((_val) << HTT_PPDU_STATS_USER_COMMON_TLV_BW_S)); \ } while (0) +#define HTT_PPDU_STATS_USER_COMMON_TLV_DELAYED_BA_M 0x00004000 +#define HTT_PPDU_STATS_USER_COMMON_TLV_DELAYED_BA_S 14 + +#define HTT_PPDU_STATS_USER_COMMON_TLV_DELAYED_BA_GET(_var) \ + (((_var) & HTT_PPDU_STATS_USER_COMMON_TLV_DELAYED_BA_M) >> \ + HTT_PPDU_STATS_USER_COMMON_TLV_DELAYED_BA_S) + +#define HTT_PPDU_STATS_USER_COMMON_TLV_DELAYED_BA_SET(_var, _val) \ + do { \ + HTT_CHECK_SET_VAL(HTT_PPDU_STATS_USER_COMMON_TLV_DELAYED_BA, _val); \ + ((_var) |= ((_val) << HTT_PPDU_STATS_USER_COMMON_TLV_DELAYED_BA_S)); \ + } while (0) #define HTT_PPDU_STATS_USER_COMMON_TLV_FRAME_CTRL_M 0x0000ffff #define HTT_PPDU_STATS_USER_COMMON_TLV_FRAME_CTRL_S 0 @@ -552,7 +564,8 @@ typedef struct { /* BIT [ 0 : 0] :- mcast * BIT [ 9 : 1] :- mpdus_tried * BIT [ 13: 10] :- bw - HTT_PPDU_STATS_BW - * BIT [ 31: 14] :- rsvd + * BIT [ 14: 14] : - delayed_ba + * BIT [ 31: 15] :- rsvd */ union { A_UINT32 bw__mpdus_tried__mcast; @@ -560,7 +573,8 @@ typedef struct { A_UINT32 mcast: 1, mpdus_tried: 9, bw: 4, - reserved0: 18; + delayed_ba: 1, + reserved0: 17; }; }; diff --git a/fw/htt_stats.h b/fw/htt_stats.h index d343aa0242f6..447d0f0b36ef 100644 --- a/fw/htt_stats.h +++ b/fw/htt_stats.h @@ -346,6 +346,13 @@ typedef enum { HTT_STATS_RX_REFILL_REO_ERR_TAG = 78, /* htt_rx_soc_fw_refill_ring_num_reo_err_tlv_v */ HTT_STATS_RX_REO_RESOURCE_STATS_TAG = 79, /* htt_rx_reo_debug_stats_tlv_v */ HTT_STATS_TX_SOUNDING_STATS_TAG = 80, /* htt_tx_sounding_stats_tlv */ + HTT_STATS_TX_PDEV_TX_PPDU_STATS_TAG = 81, /* htt_tx_pdev_stats_tx_ppdu_stats_tlv_v */ + HTT_STATS_TX_PDEV_TRIED_MPDU_CNT_HIST_TAG = 82, /* htt_tx_pdev_stats_tried_mpdu_cnt_hist_tlv_v */ + HTT_STATS_TX_HWQ_TRIED_MPDU_CNT_HIST_TAG = 83, /* htt_tx_hwq_tried_mpdu_cnt_hist_tlv_v */ + HTT_STATS_TX_HWQ_TXOP_USED_CNT_HIST_TAG = 84, /* htt_tx_hwq_txop_used_cnt_hist_tlv_v */ + HTT_STATS_TX_DE_FW2WBM_RING_FULL_HIST_TAG = 85, /* htt_tx_de_fw2wbm_ring_full_hist_tlv */ + HTT_STATS_SCHED_TXQ_SCHED_ORDER_SU_TAG = 86, /* htt_sched_txq_sched_order_su_tlv */ + HTT_STATS_SCHED_TXQ_SCHED_INELIGIBILITY_TAG = 87, /* htt_sched_txq_sched_eligibility_tlv */ HTT_STATS_MAX_TAG, } htt_tlv_tag_t; @@ -402,6 +409,7 @@ typedef enum { #define HTT_TX_PDEV_MAX_SIFS_BURST_HIST_STATS 10 #define HTT_TX_PDEV_MAX_PHY_ERR_STATS 18 #define HTT_TX_PDEV_SCHED_TX_MODE_MAX 4 +#define HTT_TX_PDEV_NUM_SCHED_ORDER_LOG 20 #define HTT_RX_STATS_REFILL_MAX_RING 4 #define HTT_RX_STATS_RXDMA_MAX_ERR 16 @@ -463,7 +471,7 @@ typedef struct { A_UINT32 illgl_rate_phy_err; /* wal pdev continous xretry */ A_UINT32 cont_xretry; - /* wal pdev continous xretry */ + /* wal pdev tx timeout */ A_UINT32 tx_timeout; /* wal pdev resets */ A_UINT32 pdev_resets; @@ -535,6 +543,14 @@ typedef struct { * (acked, no ack, flush, TTL, etc) */ A_UINT32 local_data_freed; + + /* Num MPDUs tried by SW */ + A_UINT32 mpdu_tried; + /* Num of waiting seq posted in isr completion handler */ + A_UINT32 isr_wait_seq_posted; + + A_UINT32 tx_active_dur_us_low; + A_UINT32 tx_active_dur_us_high; } htt_tx_pdev_stats_cmn_tlv; #define HTT_TX_PDEV_STATS_URRN_TLV_SZ(_num_elems) (sizeof(A_UINT32) * (_num_elems)) @@ -572,6 +588,34 @@ typedef struct { A_UINT32 sifs_hist_status[1]; /* HTT_TX_PDEV_SIFS_BURST_HIST_STATS */ } htt_tx_pdev_stats_sifs_hist_tlv_v; +typedef struct { + htt_tlv_hdr_t tlv_hdr; + A_UINT32 num_data_ppdus_legacy_su; + A_UINT32 num_data_ppdus_ac_su; + A_UINT32 num_data_ppdus_ax_su; + A_UINT32 num_data_ppdus_ac_su_txbf; + A_UINT32 num_data_ppdus_ax_su_txbf; +} htt_tx_pdev_stats_tx_ppdu_stats_tlv_v; + +#define HTT_TX_PDEV_STATS_TRIED_MPDU_CNT_HIST_TLV_SZ(_num_elems) (sizeof(A_UINT32) * (_num_elems)) +/* NOTE: Variable length TLV, use length spec to infer array size . + * + * Tried_mpdu_cnt_hist is the histogram of MPDUs tries per HWQ. + * The tries here is the count of the MPDUS within a PPDU that the + * HW had attempted to transmit on air, for the HWSCH Schedule + * command submitted by FW.It is not the retry attempts. + * The histogram bins are 0-29, 30-59, 60-89 and so on. The are + * 10 bins in this histogram. They are defined in FW using the + * following macros + * #define WAL_MAX_TRIED_MPDU_CNT_HISTOGRAM 9 + * #define WAL_TRIED_MPDU_CNT_HISTOGRAM_INTERVAL 30 + * + */ +typedef struct { + htt_tlv_hdr_t tlv_hdr; + A_UINT32 tried_mpdu_cnt_hist[1]; /* HTT_TX_PDEV_TRIED_MPDU_CNT_HIST */ + A_UINT32 hist_bin_size; +} htt_tx_pdev_stats_tried_mpdu_cnt_hist_tlv_v; /* STATS_TYPE: HTT_DBG_EXT_STATS_PDEV_TX * TLV_TAGS: @@ -581,6 +625,8 @@ typedef struct { * - HTT_STATS_TX_PDEV_FLUSH_TAG * - HTT_STATS_TX_PDEV_PHY_ERR_TAG * - HTT_STATS_TX_PDEV_SIFS_HIST_TAG + * - HTT_STATS_TX_PDEV_TX_PPDU_STATS_TAG + * - HTT_STATS_TX_PDEV_TRIED_MPDU_CNT_HIST_TAG */ /* NOTE: * This structure is for documentation, and cannot be safely used directly. @@ -593,6 +639,8 @@ typedef struct _htt_tx_pdev_stats { htt_tx_pdev_stats_flush_tlv_v flush_tlv; htt_tx_pdev_stats_phy_err_tlv_v phy_err_tlv; htt_tx_pdev_stats_sifs_hist_tlv_v sifs_hist_tlv; + htt_tx_pdev_stats_tx_ppdu_stats_tlv_v tx_su_tlv; + htt_tx_pdev_stats_tried_mpdu_cnt_hist_tlv_v tried_mpdu_cnt_hist_tlv; } htt_tx_pdev_stats_t; /* == SOC ERROR STATS == */ @@ -1279,6 +1327,8 @@ typedef struct { A_UINT32 mpdu_ack_fail_cnt; /* mpdus tried but ack was not received */ A_UINT32 mpdu_filt_cnt; /* This will include sched cmd flush and time based discard */ A_UINT32 false_mpdu_ack_count; /* Number of MPDUs for which ACK was sucessful but no Tx happened */ + + A_UINT32 txq_timeout; /* Number of times txq timeout happened */ } htt_tx_hwq_stats_cmn_tlv; #define HTT_TX_HWQ_DIFS_LATENCY_STATS_TLV_SZ(_num_elems) ( sizeof(A_UINT32) + /* hist_intvl */ \ @@ -1318,6 +1368,45 @@ typedef struct { A_UINT32 fes_result[1]; /* HTT_TX_HWQ_MAX_FES_RESULT_STATS */ } htt_tx_hwq_fes_result_stats_tlv_v; +#define HTT_TX_HWQ_TRIED_MPDU_CNT_HIST_TLV_SZ(_num_elems) (sizeof(A_UINT32) * (_num_elems)) +/* NOTE: Variable length TLV, use length spec to infer array size + * + * The hwq_tried_mpdu_cnt_hist is a histogram of MPDUs tries per HWQ. + * The tries here is the count of the MPDUS within a PPDU that the HW + * had attempted to transmit on air, for the HWSCH Schedule command + * submitted by FW in this HWQ .It is not the retry attempts. The + * histogram bins are 0-29, 30-59, 60-89 and so on. The are 10 bins + * in this histogram. + * they are defined in FW using the following macros + * #define WAL_MAX_TRIED_MPDU_CNT_HISTOGRAM 9 + * #define WAL_TRIED_MPDU_CNT_HISTOGRAM_INTERVAL 30 + * + * */ +typedef struct { + htt_tlv_hdr_t tlv_hdr; + /* Histogram of number of mpdus on tried mpdu */ + A_UINT32 tried_mpdu_cnt_hist[1]; /* HTT_TX_HWQ_TRIED_MPDU_CNT_HIST */ + A_UINT32 hist_bin_size; +} htt_tx_hwq_tried_mpdu_cnt_hist_tlv_v; + +#define HTT_TX_HWQ_TXOP_USED_CNT_HIST_TLV_SZ(_num_elems) (sizeof(A_UINT32) * (_num_elems)) +/* NOTE: Variable length TLV, use length spec to infer array size + * + * The txop_used_cnt_hist is the histogram of txop per burst. After + * completing the burst, we identify the txop used in the burst and + * incr the corresponding bin. + * Each bin represents 1ms & we have 10 bins in this histogram. + * they are deined in FW using the following macros + * #define WAL_MAX_TXOP_USED_CNT_HISTOGRAM 10 + * #define WAL_TXOP_USED_HISTOGRAM_INTERVAL 1000 ( 1 ms ) + * + * */ +typedef struct { + htt_tlv_hdr_t tlv_hdr; + /* Histogram of txop used cnt */ + A_UINT32 txop_used_cnt_hist[1]; /* HTT_TX_HWQ_TXOP_USED_CNT_HIST */ +} htt_tx_hwq_txop_used_cnt_hist_tlv_v; + /* STATS_TYPE : HTT_DBG_EXT_STATS_PDEV_TX_HWQ * TLV_TAGS: * - HTT_STATS_STRING_TAG @@ -1326,10 +1415,17 @@ typedef struct { * - HTT_STATS_TX_HWQ_CMD_RESULT_TAG * - HTT_STATS_TX_HWQ_CMD_STALL_TAG * - HTT_STATS_TX_HWQ_FES_STATUS_TAG + * - HTT_STATS_TX_HWQ_TRIED_MPDU_CNT_HIST_TAG + * - HTT_STATS_TX_HWQ_TXOP_USED_CNT_HIST_TAG */ /* NOTE: * This structure is for documentation, and cannot be safely used directly. * Instead, use the constituent TLV structures to fill/parse. + * General HWQ stats Mechanism: + * Once the host request for the stats, FW fill all the HWQ TAGS in a buffer + * for all the HWQ requested. & the FW send the buffer to host. In the + * buffer the HWQ ID is filled in mac_id__hwq_id, thus identifying each + * HWQ distinctly. */ typedef struct _htt_tx_hwq_stats { htt_stats_string_tlv hwq_str_tlv; @@ -1338,6 +1434,8 @@ typedef struct _htt_tx_hwq_stats { htt_tx_hwq_cmd_result_stats_tlv_v cmd_result_tlv; htt_tx_hwq_cmd_stall_stats_tlv_v cmd_stall_tlv; htt_tx_hwq_fes_result_stats_tlv_v fes_stats_tlv; + htt_tx_hwq_tried_mpdu_cnt_hist_tlv_v tried_mpdu_tlv; + htt_tx_hwq_txop_used_cnt_hist_tlv_v txop_used_tlv; } htt_tx_hwq_stats_t; /* == TX SELFGEN STATS == */ @@ -1575,6 +1673,52 @@ typedef struct { A_UINT32 sched_cmd_reaped[1]; /* HTT_TX_PDEV_SCHED_TX_MODE_MAX */ } htt_sched_txq_cmd_reaped_tlv_v; +#define HTT_SCHED_TXQ_SCHED_ORDER_SU_TLV_SZ(_num_elems) (sizeof(A_UINT32) * (_num_elems)) + +/* NOTE: Variable length TLV, use length spec to infer array size */ +typedef struct { + htt_tlv_hdr_t tlv_hdr; + /* + * sched_order_su contains the peer IDs of peers chosen in the last + * NUM_SCHED_ORDER_LOG scheduler instances. + * The array is circular; it's unspecified which array element corresponds + * to the most recent scheduler invocation, and which corresponds to + * the (NUM_SCHED_ORDER_LOG-1) most recent scheduler invocation. + */ + A_UINT32 sched_order_su[1]; /* HTT_TX_PDEV_NUM_SCHED_ORDER_LOG */ +} htt_sched_txq_sched_order_su_tlv_v; + +typedef enum { + HTT_SCHED_TID_SKIP_SCHED_MASK_DISABLED = 0, /* Skip the tid when WAL_TID_DISABLE_TX_SCHED_MASK is true */ + HTT_SCHED_TID_SKIP_NOTIFY_MPDU, /* Skip the tid's 2nd sched_cmd when 1st cmd is ongoing */ + HTT_SCHED_TID_SKIP_MPDU_STATE_INVALID, /* Skip the tid when MPDU state is invalid */ + HTT_SCHED_TID_SKIP_SCHED_DISABLED, /* Skip the tid when scheduling is disabled for that tid */ + HTT_SCHED_TID_SKIP_TQM_BYPASS_CMD_PENDING, /* Skip the TQM bypass tid when it has pending sched_cmd */ + HTT_SCHED_TID_SKIP_SECOND_SU_SCHEDULE, /* Skip tid from 2nd SU schedule when any of the following flag is set + WAL_TX_TID(SEND_BAR | TQM_MPDU_STATE_VALID | SEND_QOS_NULL | TQM_NOTIFY_MPDU | SENDN_PENDING) */ + HTT_SCHED_TID_SKIP_CMD_SLOT_NOT_AVAIL, /* Skip the tid when command slot is not available */ + HTT_SCHED_TID_SKIP_NO_ENQ, /* Skip the tid when num_frames is zero with g_disable_remove_tid as true */ + HTT_SCHED_TID_SKIP_LOW_ENQ, /* Skip the tid when enqueue is low */ + HTT_SCHED_TID_SKIP_PAUSED, /* Skipping the paused tid(sendn-frames) */ + HTT_SCHED_TID_SKIP_UL, /* UL tid skip */ + HTT_SCHED_TID_REMOVE_PAUSED, /* Removing the paused tid when number of sendn frames is zero */ + HTT_SCHED_TID_REMOVE_NO_ENQ, /* Remove tid with zero queue depth */ + HTT_SCHED_TID_REMOVE_UL, /* UL tid remove */ + HTT_SCHED_TID_QUERY, /* Moving to next user and adding tid in prepend list when qstats update is pending */ + HTT_SCHED_TID_SU_ONLY, /* Tid is eligible and TX_SCHED_SU_ONLY is true */ + HTT_SCHED_TID_ELIGIBLE, /* Tid is eligible for scheduling */ + HTT_SCHED_INELIGIBILITY_MAX, +} htt_sched_txq_sched_ineligibility_tlv_enum; + +#define HTT_SCHED_TXQ_SCHED_INELIGIBILITY_TLV_SZ(_num_elems) (sizeof(A_UINT32) * (_num_elems)) + +/* NOTE: Variable length TLV, use length spec to infer array size */ +typedef struct { + htt_tlv_hdr_t tlv_hdr; + /* sched_ineligibility counts the number of occurrences of different reasons for tid ineligibility during eligibility checks per txq in scheduling */ + A_UINT32 sched_ineligibility[1]; /* indexed by htt_sched_txq_sched_ineligibility_tlv_enum */ +} htt_sched_txq_sched_ineligibility_tlv_v; + #define HTT_TX_PDEV_STATS_SCHED_PER_TXQ_MAC_ID_M 0x000000ff #define HTT_TX_PDEV_STATS_SCHED_PER_TXQ_MAC_ID_S 0 @@ -1647,6 +1791,8 @@ typedef struct { A_UINT32 num_tqm_sched_algo_trigger; /* Num of schedules for notify frame */ A_UINT32 notify_sched; + /* Duration based sendn termination */ + A_UINT32 dur_based_sendn_term; } htt_tx_pdev_stats_sched_per_txq_tlv; #define HTT_STATS_TX_SCHED_CMN_MAC_ID_M 0x000000ff @@ -1678,6 +1824,8 @@ typedef struct { * - HTT_STATS_TX_PDEV_SCHEDULER_TXQ_STATS_TAG * - HTT_STATS_SCHED_TXQ_CMD_POSTED_TAG * - HTT_STATS_SCHED_TXQ_CMD_REAPED_TAG + * - HTT_STATS_SCHED_TXQ_SCHED_ORDER_SU_TAG + * - HTT_STATS_SCHED_TXQ_SCHED_INELIGIBILITY_TAG */ /* NOTE: * This structure is for documentation, and cannot be safely used directly. @@ -1689,6 +1837,8 @@ typedef struct { htt_tx_pdev_stats_sched_per_txq_tlv txq_tlv; htt_sched_txq_cmd_posted_tlv_v cmd_posted_tlv; htt_sched_txq_cmd_reaped_tlv_v cmd_reaped_tlv; + htt_sched_txq_sched_order_su_tlv_v sched_order_su_tlv; + htt_sched_txq_sched_ineligibility_tlv_v sched_ineligibility_tlv; } txq[1]; } htt_stats_tx_sched_t; @@ -1752,6 +1902,22 @@ typedef struct { A_UINT32 enqueue_notify; A_UINT32 notify_mpdu_at_head; A_UINT32 notify_mpdu_state_valid; +/* + * On receiving TQM_FLOW_NOT_EMPTY_STATUS from TQM, (on MSDUs being enqueued + * the flow is non empty), if the number of MSDUs is greater than the threshold, + * notify is incremented. UDP_THRESH counters are for UDP MSDUs, and NONUDP are + * for non-UDP MSDUs. + * MSDUQ_SWNOTIFY_UDP_THRESH1 threshold - sched_udp_notify1 is incremented + * MSDUQ_SWNOTIFY_UDP_THRESH2 threshold - sched_udp_notify2 is incremented + * MSDUQ_SWNOTIFY_NONUDP_THRESH1 threshold - sched_nonudp_notify1 is incremented + * MSDUQ_SWNOTIFY_NONUDP_THRESH2 threshold - sched_nonudp_notify2 is incremented + * + * Notify signifies that we trigger the scheduler. + */ + A_UINT32 sched_udp_notify1; + A_UINT32 sched_udp_notify2; + A_UINT32 sched_nonudp_notify1; + A_UINT32 sched_nonudp_notify2; } htt_tx_tqm_pdev_stats_tlv_v; #define HTT_TX_TQM_CMN_STATS_MAC_ID_M 0x000000ff @@ -1905,6 +2071,8 @@ typedef struct { A_UINT32 eapol_lookup_failed; A_UINT32 qpeer_not_allow_data; A_UINT32 fse_tid_override; + A_UINT32 ipv6_jumbogram_zero_length; + A_UINT32 qos_to_non_qos_in_prog; } htt_tx_de_classify_failed_stats_tlv; typedef struct { @@ -1938,6 +2106,15 @@ typedef struct { A_UINT32 fse_hwqueue_send_to_host; A_UINT32 mcast_entry; A_UINT32 bcast_entry; + A_UINT32 htt_update_peer_cache; + A_UINT32 htt_learning_frame; + A_UINT32 fse_invalid_peer; + /* + * mec_notify is HTT TX WBM multicast echo check notification + * from firmware to host. FW sends SA addresses to host for all + * multicast/broadcast packets received on STA side. + */ + A_UINT32 mec_notify; } htt_tx_de_classify_stats_tlv; typedef struct { @@ -1988,6 +2165,22 @@ typedef struct { ((_var) |= ((_val) << HTT_TX_DE_CMN_STATS_MAC_ID_S)); \ } while (0) +/* + * The htt_tx_de_fw2wbm_ring_full_hist_tlv is a histogram of time we waited + * for the fw2wbm ring buffer. we are requesting a buffer in FW2WBM release + * ring,which may fail, due to non availability of buffer. Hence we sleep for + * 200us & again request for it. This is a histogram of time we wait, with + * bin of 200ms & there are 10 bin (2 seconds max) + * They are defined by the following macros in FW + * #define ENTRIES_PER_BIN_COUNT 1000 // per bin 1000 * 200us = 200ms + * #define RING_FULL_BIN_ENTRIES (WAL_TX_DE_FW2WBM_ALLOC_TIMEOUT_COUNT / + * ENTRIES_PER_BIN_COUNT) + */ +typedef struct { + htt_tlv_hdr_t tlv_hdr; + A_UINT32 fw2wbm_ring_full_hist[1]; +} htt_tx_de_fw2wbm_ring_full_hist_tlv; + typedef struct { htt_tlv_hdr_t tlv_hdr; /* BIT [ 7 : 0] :- mac_id @@ -2007,6 +2200,7 @@ typedef struct { /* STATS_TYPE : HTT_DBG_EXT_STATS_TX_DE_INFO * TLV_TAGS: * - HTT_STATS_TX_DE_CMN_TAG + * - HTT_STATS_TX_DE_FW2WBM_RING_FULL_HIST_TAG * - HTT_STATS_TX_DE_EAPOL_PACKETS_TAG * - HTT_STATS_TX_DE_CLASSIFY_STATS_TAG * - HTT_STATS_TX_DE_CLASSIFY_FAILED_TAG @@ -2021,6 +2215,7 @@ typedef struct { */ typedef struct { htt_tx_de_cmn_stats_tlv cmn_tlv; + htt_tx_de_fw2wbm_ring_full_hist_tlv fw2wbm_hist_tlv; htt_tx_de_eapol_packets_stats_tlv eapol_stats_tlv; htt_tx_de_classify_stats_tlv classify_stats_tlv; htt_tx_de_classify_failed_stats_tlv classify_failed_tlv; @@ -2641,6 +2836,8 @@ typedef struct { /* == PDEV RX RATE CTRL STATS == */ +#define HTT_RX_PDEV_STATS_NUM_LEGACY_CCK_STATS 4 +#define HTT_RX_PDEV_STATS_NUM_LEGACY_OFDM_STATS 8 #define HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS 12 #define HTT_RX_PDEV_STATS_NUM_GI_COUNTERS 4 #define HTT_RX_PDEV_STATS_NUM_DCM_COUNTERS 5 @@ -2689,6 +2886,16 @@ typedef struct { /* Counters to track number of rx packets in each GI in each mcs (0-11) */ A_UINT32 rx_gi[HTT_RX_PDEV_STATS_NUM_GI_COUNTERS][HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS]; A_INT32 rssi_in_dbm; /* rx Signal Strength value in dBm unit */ + + A_UINT32 rx_11ax_su_ext; + A_UINT32 rx_11ac_mumimo; + A_UINT32 rx_11ax_mumimo; + A_UINT32 rx_11ax_ofdma; + A_UINT32 txbf; + A_UINT32 rx_legacy_cck_rate[HTT_RX_PDEV_STATS_NUM_LEGACY_CCK_STATS]; + A_UINT32 rx_legacy_ofdm_rate[HTT_RX_PDEV_STATS_NUM_LEGACY_OFDM_STATS]; + A_UINT32 rx_active_dur_us_low; + A_UINT32 rx_active_dur_us_high; } htt_rx_pdev_rate_stats_tlv; diff --git a/fw/wmi_services.h b/fw/wmi_services.h index e9bbeff19d90..cd02da96c3e9 100755 --- a/fw/wmi_services.h +++ b/fw/wmi_services.h @@ -255,6 +255,8 @@ typedef enum { WMI_SERVICE_DUAL_BEACON_ON_SINGLE_MAC_MCC_SUPPORT=159, /* Support dual beacon on different channel on single MAC */ WMI_SERVICE_MOTION_DET=160, /* support for motion detection config */ WMI_SERVICE_INFRA_MBSSID=161, /* support infra multi-BSSID feature */ + WMI_SERVICE_OBSS_SPATIAL_REUSE=162, /* support spatial reuse feature */ + WMI_SERVICE_VDEV_DIFFERENT_BEACON_INTERVAL_SUPPORT=163, /* Support different beacon intervals on different VDEVs */ /******* ADD NEW SERVICES HERE *******/ diff --git a/fw/wmi_tlv_defs.h b/fw/wmi_tlv_defs.h index ad92b283122a..dfe45b4ef8b2 100755 --- a/fw/wmi_tlv_defs.h +++ b/fw/wmi_tlv_defs.h @@ -923,6 +923,7 @@ typedef enum { WMITLV_TAG_STRUC_wmi_motion_det_event, WMITLV_TAG_STRUC_wmi_motion_det_base_line_event, WMITLV_TAG_STRUC_wmi_ndp_transport_ip_param, + WMITLV_TAG_STRUC_wmi_obss_spatial_reuse_set_cmd_fixed_param, } WMITLV_TAG_ID; /* @@ -1300,6 +1301,7 @@ typedef enum { OP(WMI_MOTION_DET_BASE_LINE_CONFIG_PARAM_CMDID) \ OP(WMI_MOTION_DET_START_STOP_CMDID) \ OP(WMI_MOTION_DET_BASE_LINE_START_STOP_CMDID) \ + OP(WMI_PDEV_OBSS_PD_SPATIAL_REUSE_CMDID) \ /* add new CMD_LIST elements above this line */ @@ -3746,6 +3748,11 @@ WMITLV_CREATE_PARAM_STRUC(WMI_TWT_RESUME_DIALOG_CMDID); WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_peer_tid_configurations_cmd_fixed_param, wmi_peer_tid_configurations_cmd_fixed_param, fixed_param, WMITLV_SIZE_FIX) WMITLV_CREATE_PARAM_STRUC(WMI_PEER_TID_CONFIGURATIONS_CMDID); +/* OBSS_PD Spatial_Reuse cnmd */ +#define WMITLV_TABLE_WMI_PDEV_OBSS_PD_SPATIAL_REUSE_CMDID(id,op,buf,len) \ + WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_obss_spatial_reuse_set_cmd_fixed_param, wmi_obss_spatial_reuse_set_cmd_fixed_param, fixed_param, WMITLV_SIZE_FIX) +WMITLV_CREATE_PARAM_STRUC(WMI_PDEV_OBSS_PD_SPATIAL_REUSE_CMDID); + /************************** TLV definitions of WMI events *******************************/ diff --git a/fw/wmi_unified.h b/fw/wmi_unified.h index 90f6dddfd0d6..7ff381b07919 100755 --- a/fw/wmi_unified.h +++ b/fw/wmi_unified.h @@ -244,6 +244,7 @@ typedef enum { WMI_GRP_11K_OFFLOAD, /* 0x3d */ WMI_GRP_TWT, /* 0x3e TWT (Target Wake Time) for STA and AP */ WMI_GRP_MOTION_DET, /* 0x3f */ + WMI_GRP_SPATIAL_REUSE, /* 0x40 */ } WMI_GRP_ID; #define WMI_CMD_GRP_START_ID(grp_id) (((grp_id) << 12) | 0x1) @@ -1139,6 +1140,9 @@ typedef enum { WMI_MOTION_DET_BASE_LINE_CONFIG_PARAM_CMDID, WMI_MOTION_DET_START_STOP_CMDID, WMI_MOTION_DET_BASE_LINE_START_STOP_CMDID, + + /** WMI commands related to OBSS PD Spatial Reuse **/ + WMI_PDEV_OBSS_PD_SPATIAL_REUSE_CMDID = WMI_CMD_GRP_START_ID(WMI_GRP_SPATIAL_REUSE), } WMI_CMD_ID; typedef enum { @@ -4156,6 +4160,14 @@ typedef struct { A_UINT32 vdev_id; A_UINT32 desc_id; /* echoed in tx_compl_event */ A_UINT32 chanfreq; /* MHz units */ + /* WMI_MGMT_TX_SEND_CMDID is used for both pass by value and + * pass by reference WMI management frames. + * + * a) If the command is for pass by reference, + * paddr_lo and padd_hi will hold the address of remote/host buffer + * b) If the command is for pass by value, + * paddr_lo and paddr_hi will be NULL. + */ A_UINT32 paddr_lo; A_UINT32 paddr_hi; A_UINT32 frame_len; @@ -5079,6 +5091,19 @@ typedef enum { WMI_PDEV_PARAM_SET_UL_BSR_TRIG_INTERVAL, /* 0xA2 */ /** Use simplified equal RU allocation for DL and UL OFDMA */ WMI_PDEV_PARAM_EQUAL_RU_ALLOCATION_ENABLE, /* 0xA3 */ + /** Enable/disable MWS-COEX 4G (LTE) Quick FTDM. + * 0 - Don't allow quick FTDM Policy (Default) + * 1 - Allow quick FTDM policy. + */ + WMI_PDEV_PARAM_MWSCOEX_4G_ALLOW_QUICK_FTDM, /* 0xA4 */ + /** Set MWS-COEX 5G-NR power limit. + * 0: Don't apply user specific power limit, + * use internal power limit (Default) + * 1-2: invalid value (ignored) + * 3-21: apply the specified value as the external power limit, in dBm + * >21: invalid value (ignored) + */ + WMI_PDEV_PARAM_MWSCOEX_SET_5GNR_PWR_LIMIT, /* 0xA5 */ } WMI_PDEV_PARAM; typedef struct { @@ -6276,6 +6301,8 @@ typedef struct { A_UINT32 pdev_id; /** pdev_id for identifying the MAC. See macros starting with WMI_PDEV_ID_ for values. In non-DBDC case host should set it to 0. */ /** number of beacon stats event structures (wmi_bcn_stats) */ A_UINT32 num_bcn_stats; + /** number of extended peer stats event structures (wmi_peer_extd_stats) */ + A_UINT32 num_peer_extd_stats; /* This TLV is followed by another TLV of array of bytes * A_UINT8 data[]; @@ -6955,7 +6982,10 @@ typedef struct { A_UINT32 last_tx_rate_code; /** TX power used by peer - units are 0.5 dBm */ A_INT32 last_tx_power; - A_UINT32 reserved[4]; /** for future use - add new peer stats here */ + + /* Total number of received multicast & broadcast data frames corresponding to this peer */ + A_UINT32 rx_mc_bc_cnt; /* 1 in the MSB of rx_mc_bc_cnt represents a valid data */ + A_UINT32 reserved[3]; /** for future use - add new peer stats here */ } wmi_peer_extd_stats; typedef struct { @@ -8622,6 +8652,12 @@ typedef enum { /** Uplink OFDMA PPDU bandwidth (0: 20MHz, 1: 40MHz, 2: 80Mhz, 3: 160MHz)*/ WMI_VDEV_PARAM_UL_PPDU_BW, /* 0x8E */ + /** Enable/Disable FW handling MU EDCA change from AP (1: En, 0:Dis) */ + WMI_VDEV_PARAM_MU_EDCA_FW_UPDATE_EN, /* 0x8F */ + + /** Update dot11ObssNbruToleranceTime in fw. Param value: seconds */ + WMI_VDEV_PARAM_UPDATE_OBSS_RU_TOLERANCE_TIME, /* 0x90 */ + /*=== ADD NEW VDEV PARAM TYPES ABOVE THIS LINE === * The below vdev param types are used for prototyping, and are @@ -20651,6 +20687,17 @@ typedef enum wmi_coex_config_type { arg2-arg5: BT information parameters */ WMI_COEX_CONFIG_SINK_WLAN_TDM = 21, /* config interval (ms units) (arg1 BT, arg2 WLAN) for A2DP SINK + WLAN */ WMI_COEX_CONFIG_COEX_ENABLE_MCC_TDM = 22, /* config disable/enable COEX TDM for MCC */ + WMI_COEX_CONFIG_LOWRSSI_A2DPOPP_TDM = 23, /* config interval (ms units) (arg1 BT, arg2 WLAN) for STA + A2dp + OPP + LOWRSSI */ + WMI_COEX_CONFIG_BTC_MODE = 24, /* config BTC mode, arg1 mode: 0 TDD/1 FDD/2 Hybrid*/ + WMI_COEX_CONFIG_ANTENNA_ISOLATION = 25, /* config isolation between BT and WLAN antenna, arg1 isolation in db*/ + WMI_COEX_CONFIG_BT_LOW_RSSI_THRESHOLD = 26,/*config BT low rssi threshold (dbm units)*/ + WMI_COEX_CONFIG_BT_INTERFERENCE_LEVEL = 27,/*config bt interference level (dbm units) + arg1 low - lower limit + arg2 low - upper limit + arg3 medium - lower limit + arg4 medium - upper limit + arg5 high - lower limit + arg6 high - upper limit */ } WMI_COEX_CONFIG_TYPE; typedef struct { @@ -23130,6 +23177,27 @@ typedef struct { * phase (in %); reserved for future */ } wmi_motion_det_base_line_event; +/* Below structures are related to OBSS_PD_SPATIAL Reuse */ +typedef struct { + /** TLV tag and len; tag equals + * WMITLV_TAG_STRUC_wmi_obss_set_cmd_fixed_param */ + A_UINT32 tlv_header; + /** Enable/Disable Spatial Reuse */ + A_UINT32 enable; + /* + * In the below fields, "OBSS level" refers to the power of the + * signals received from "Other BSS". + * Spatial reuse will only be permitted if the Other BSS's signal power + * is witin the min to max range specified by the below fields. + */ + /** Minimum OBSS level to use */ + A_INT32 obss_min; /* RSSI in dBm */ + /** Maximum OBSS level to use */ + A_INT32 obss_max; /* RSSI in dBm */ + /** Vdev id*/ + A_UINT32 vdev_id; +} wmi_obss_spatial_reuse_set_cmd_fixed_param; + /* ADD NEW DEFS HERE */ diff --git a/fw/wmi_version.h b/fw/wmi_version.h index 27922aa84a3e..1336842ac4db 100755 --- a/fw/wmi_version.h +++ b/fw/wmi_version.h @@ -36,7 +36,7 @@ #define __WMI_VER_MINOR_ 0 /** WMI revision number has to be incremented when there is a * change that may or may not break compatibility. */ -#define __WMI_REVISION_ 551 +#define __WMI_REVISION_ 558 /** The Version Namespace should not be normally changed. Only * host and firmware of the same WMI namespace will work |
