1*60bac4d6SBjoern A. Zeeb /* SPDX-License-Identifier: BSD-3-Clause-Clear */ 2*60bac4d6SBjoern A. Zeeb /* 3*60bac4d6SBjoern A. Zeeb * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved. 4*60bac4d6SBjoern A. Zeeb * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. 5*60bac4d6SBjoern A. Zeeb */ 6*60bac4d6SBjoern A. Zeeb 7*60bac4d6SBjoern A. Zeeb #ifndef ATH12K_DP_PEER_H 8*60bac4d6SBjoern A. Zeeb #define ATH12K_DP_PEER_H 9*60bac4d6SBjoern A. Zeeb 10*60bac4d6SBjoern A. Zeeb #include "dp_rx.h" 11*60bac4d6SBjoern A. Zeeb 12*60bac4d6SBjoern A. Zeeb #define ATH12K_DP_PEER_ID_INVALID 0x3FFF 13*60bac4d6SBjoern A. Zeeb 14*60bac4d6SBjoern A. Zeeb struct ppdu_user_delayba { 15*60bac4d6SBjoern A. Zeeb u16 sw_peer_id; 16*60bac4d6SBjoern A. Zeeb u32 info0; 17*60bac4d6SBjoern A. Zeeb u16 ru_end; 18*60bac4d6SBjoern A. Zeeb u16 ru_start; 19*60bac4d6SBjoern A. Zeeb u32 info1; 20*60bac4d6SBjoern A. Zeeb u32 rate_flags; 21*60bac4d6SBjoern A. Zeeb u32 resp_rate_flags; 22*60bac4d6SBjoern A. Zeeb }; 23*60bac4d6SBjoern A. Zeeb 24*60bac4d6SBjoern A. Zeeb #define ATH12K_PEER_ML_ID_VALID BIT(13) 25*60bac4d6SBjoern A. Zeeb 26*60bac4d6SBjoern A. Zeeb struct ath12k_rx_peer_rate_stats { 27*60bac4d6SBjoern A. Zeeb u64 ht_mcs_count[HAL_RX_MAX_MCS_HT + 1]; 28*60bac4d6SBjoern A. Zeeb u64 vht_mcs_count[HAL_RX_MAX_MCS_VHT + 1]; 29*60bac4d6SBjoern A. Zeeb u64 he_mcs_count[HAL_RX_MAX_MCS_HE + 1]; 30*60bac4d6SBjoern A. Zeeb u64 be_mcs_count[HAL_RX_MAX_MCS_BE + 1]; 31*60bac4d6SBjoern A. Zeeb u64 nss_count[HAL_RX_MAX_NSS]; 32*60bac4d6SBjoern A. Zeeb u64 bw_count[HAL_RX_BW_MAX]; 33*60bac4d6SBjoern A. Zeeb u64 gi_count[HAL_RX_GI_MAX]; 34*60bac4d6SBjoern A. Zeeb u64 legacy_count[HAL_RX_MAX_NUM_LEGACY_RATES]; 35*60bac4d6SBjoern A. Zeeb u64 rx_rate[HAL_RX_BW_MAX][HAL_RX_GI_MAX][HAL_RX_MAX_NSS][HAL_RX_MAX_MCS_HT + 1]; 36*60bac4d6SBjoern A. Zeeb }; 37*60bac4d6SBjoern A. Zeeb 38*60bac4d6SBjoern A. Zeeb struct ath12k_rx_peer_stats { 39*60bac4d6SBjoern A. Zeeb u64 num_msdu; 40*60bac4d6SBjoern A. Zeeb u64 num_mpdu_fcs_ok; 41*60bac4d6SBjoern A. Zeeb u64 num_mpdu_fcs_err; 42*60bac4d6SBjoern A. Zeeb u64 tcp_msdu_count; 43*60bac4d6SBjoern A. Zeeb u64 udp_msdu_count; 44*60bac4d6SBjoern A. Zeeb u64 other_msdu_count; 45*60bac4d6SBjoern A. Zeeb u64 ampdu_msdu_count; 46*60bac4d6SBjoern A. Zeeb u64 non_ampdu_msdu_count; 47*60bac4d6SBjoern A. Zeeb u64 stbc_count; 48*60bac4d6SBjoern A. Zeeb u64 beamformed_count; 49*60bac4d6SBjoern A. Zeeb u64 coding_count[HAL_RX_SU_MU_CODING_MAX]; 50*60bac4d6SBjoern A. Zeeb u64 tid_count[IEEE80211_NUM_TIDS + 1]; 51*60bac4d6SBjoern A. Zeeb u64 pream_cnt[HAL_RX_PREAMBLE_MAX]; 52*60bac4d6SBjoern A. Zeeb u64 reception_type[HAL_RX_RECEPTION_TYPE_MAX]; 53*60bac4d6SBjoern A. Zeeb u64 rx_duration; 54*60bac4d6SBjoern A. Zeeb u64 dcm_count; 55*60bac4d6SBjoern A. Zeeb u64 ru_alloc_cnt[HAL_RX_RU_ALLOC_TYPE_MAX]; 56*60bac4d6SBjoern A. Zeeb struct ath12k_rx_peer_rate_stats pkt_stats; 57*60bac4d6SBjoern A. Zeeb struct ath12k_rx_peer_rate_stats byte_stats; 58*60bac4d6SBjoern A. Zeeb }; 59*60bac4d6SBjoern A. Zeeb 60*60bac4d6SBjoern A. Zeeb struct ath12k_wbm_tx_stats { 61*60bac4d6SBjoern A. Zeeb u64 wbm_tx_comp_stats[HAL_WBM_REL_HTT_TX_COMP_STATUS_MAX]; 62*60bac4d6SBjoern A. Zeeb }; 63*60bac4d6SBjoern A. Zeeb 64*60bac4d6SBjoern A. Zeeb struct ath12k_dp_peer_stats { 65*60bac4d6SBjoern A. Zeeb struct ath12k_rx_peer_stats *rx_stats; 66*60bac4d6SBjoern A. Zeeb struct ath12k_wbm_tx_stats *wbm_tx_stats; 67*60bac4d6SBjoern A. Zeeb }; 68*60bac4d6SBjoern A. Zeeb 69*60bac4d6SBjoern A. Zeeb DECLARE_EWMA(avg_rssi, 10, 8) 70*60bac4d6SBjoern A. Zeeb 71*60bac4d6SBjoern A. Zeeb struct ath12k_dp_link_peer { 72*60bac4d6SBjoern A. Zeeb struct list_head list; 73*60bac4d6SBjoern A. Zeeb struct ieee80211_sta *sta; 74*60bac4d6SBjoern A. Zeeb struct ath12k_dp_peer *dp_peer; 75*60bac4d6SBjoern A. Zeeb int vdev_id; 76*60bac4d6SBjoern A. Zeeb u8 addr[ETH_ALEN]; 77*60bac4d6SBjoern A. Zeeb int peer_id; 78*60bac4d6SBjoern A. Zeeb u16 ast_hash; 79*60bac4d6SBjoern A. Zeeb u8 pdev_idx; 80*60bac4d6SBjoern A. Zeeb u16 hw_peer_id; 81*60bac4d6SBjoern A. Zeeb 82*60bac4d6SBjoern A. Zeeb struct ppdu_user_delayba ppdu_stats_delayba; 83*60bac4d6SBjoern A. Zeeb bool delayba_flag; 84*60bac4d6SBjoern A. Zeeb bool is_authorized; 85*60bac4d6SBjoern A. Zeeb bool mlo; 86*60bac4d6SBjoern A. Zeeb /* protected by ab->data_lock */ 87*60bac4d6SBjoern A. Zeeb 88*60bac4d6SBjoern A. Zeeb u16 ml_id; 89*60bac4d6SBjoern A. Zeeb 90*60bac4d6SBjoern A. Zeeb /* any other ML info common for all partners can be added 91*60bac4d6SBjoern A. Zeeb * here and would be same for all partner peers. 92*60bac4d6SBjoern A. Zeeb */ 93*60bac4d6SBjoern A. Zeeb u8 ml_addr[ETH_ALEN]; 94*60bac4d6SBjoern A. Zeeb 95*60bac4d6SBjoern A. Zeeb /* To ensure only certain work related to dp is done once */ 96*60bac4d6SBjoern A. Zeeb bool primary_link; 97*60bac4d6SBjoern A. Zeeb 98*60bac4d6SBjoern A. Zeeb /* for reference to ath12k_link_sta */ 99*60bac4d6SBjoern A. Zeeb u8 link_id; 100*60bac4d6SBjoern A. Zeeb 101*60bac4d6SBjoern A. Zeeb /* peer addr based rhashtable list pointer */ 102*60bac4d6SBjoern A. Zeeb struct rhash_head rhash_addr; 103*60bac4d6SBjoern A. Zeeb 104*60bac4d6SBjoern A. Zeeb u8 hw_link_id; 105*60bac4d6SBjoern A. Zeeb u32 rx_tid_active_bitmask; 106*60bac4d6SBjoern A. Zeeb 107*60bac4d6SBjoern A. Zeeb /* link stats */ 108*60bac4d6SBjoern A. Zeeb struct rate_info txrate; 109*60bac4d6SBjoern A. Zeeb struct rate_info last_txrate; 110*60bac4d6SBjoern A. Zeeb u64 rx_duration; 111*60bac4d6SBjoern A. Zeeb u64 tx_duration; 112*60bac4d6SBjoern A. Zeeb u8 rssi_comb; 113*60bac4d6SBjoern A. Zeeb struct ewma_avg_rssi avg_rssi; 114*60bac4d6SBjoern A. Zeeb struct ath12k_dp_peer_stats peer_stats; 115*60bac4d6SBjoern A. Zeeb u32 tx_retry_failed; 116*60bac4d6SBjoern A. Zeeb u32 tx_retry_count; 117*60bac4d6SBjoern A. Zeeb }; 118*60bac4d6SBjoern A. Zeeb 119*60bac4d6SBjoern A. Zeeb void ath12k_dp_link_peer_unmap_event(struct ath12k_base *ab, u16 peer_id); 120*60bac4d6SBjoern A. Zeeb void ath12k_dp_link_peer_map_event(struct ath12k_base *ab, u8 vdev_id, u16 peer_id, 121*60bac4d6SBjoern A. Zeeb u8 *mac_addr, u16 ast_hash, u16 hw_peer_id); 122*60bac4d6SBjoern A. Zeeb 123*60bac4d6SBjoern A. Zeeb struct ath12k_dp_peer { 124*60bac4d6SBjoern A. Zeeb struct list_head list; 125*60bac4d6SBjoern A. Zeeb bool is_mlo; 126*60bac4d6SBjoern A. Zeeb bool dp_setup_done; 127*60bac4d6SBjoern A. Zeeb 128*60bac4d6SBjoern A. Zeeb u8 ucast_keyidx; 129*60bac4d6SBjoern A. Zeeb u8 addr[ETH_ALEN]; 130*60bac4d6SBjoern A. Zeeb 131*60bac4d6SBjoern A. Zeeb u8 mcast_keyidx; 132*60bac4d6SBjoern A. Zeeb bool ucast_ra_only; 133*60bac4d6SBjoern A. Zeeb int peer_id; 134*60bac4d6SBjoern A. Zeeb struct ieee80211_sta *sta; 135*60bac4d6SBjoern A. Zeeb 136*60bac4d6SBjoern A. Zeeb u8 hw_links[ATH12K_GROUP_MAX_RADIO]; 137*60bac4d6SBjoern A. Zeeb 138*60bac4d6SBjoern A. Zeeb u16 sec_type_grp; 139*60bac4d6SBjoern A. Zeeb u16 sec_type; 140*60bac4d6SBjoern A. Zeeb 141*60bac4d6SBjoern A. Zeeb /* Info used in MMIC verification of * RX fragments */ 142*60bac4d6SBjoern A. Zeeb struct crypto_shash *tfm_mmic; 143*60bac4d6SBjoern A. Zeeb struct ieee80211_key_conf *keys[WMI_MAX_KEY_INDEX + 1]; 144*60bac4d6SBjoern A. Zeeb struct ath12k_dp_link_peer __rcu *link_peers[ATH12K_NUM_MAX_LINKS]; 145*60bac4d6SBjoern A. Zeeb struct ath12k_reoq_buf reoq_bufs[IEEE80211_NUM_TIDS + 1]; 146*60bac4d6SBjoern A. Zeeb struct ath12k_dp_rx_tid rx_tid[IEEE80211_NUM_TIDS + 1]; 147*60bac4d6SBjoern A. Zeeb }; 148*60bac4d6SBjoern A. Zeeb 149*60bac4d6SBjoern A. Zeeb struct ath12k_dp_link_peer * 150*60bac4d6SBjoern A. Zeeb ath12k_dp_link_peer_find_by_vdev_and_addr(struct ath12k_dp *dp, 151*60bac4d6SBjoern A. Zeeb int vdev_id, const u8 *addr); 152*60bac4d6SBjoern A. Zeeb struct ath12k_dp_link_peer * 153*60bac4d6SBjoern A. Zeeb ath12k_dp_link_peer_find_by_addr(struct ath12k_dp *dp, const u8 *addr); 154*60bac4d6SBjoern A. Zeeb bool ath12k_dp_link_peer_exist_by_vdev_id(struct ath12k_dp *dp, int vdev_id); 155*60bac4d6SBjoern A. Zeeb struct ath12k_dp_link_peer * 156*60bac4d6SBjoern A. Zeeb ath12k_dp_link_peer_find_by_ast(struct ath12k_dp *dp, int ast_hash); 157*60bac4d6SBjoern A. Zeeb struct ath12k_dp_link_peer * 158*60bac4d6SBjoern A. Zeeb ath12k_dp_link_peer_find_by_pdev_and_addr(struct ath12k_dp *dp, u8 pdev_idx, 159*60bac4d6SBjoern A. Zeeb const u8 *addr); 160*60bac4d6SBjoern A. Zeeb struct ath12k_link_sta *ath12k_dp_link_peer_to_link_sta(struct ath12k_base *ab, 161*60bac4d6SBjoern A. Zeeb struct ath12k_dp_link_peer *peer); 162*60bac4d6SBjoern A. Zeeb int ath12k_dp_link_peer_rhash_tbl_init(struct ath12k_dp *dp); 163*60bac4d6SBjoern A. Zeeb void ath12k_dp_link_peer_rhash_tbl_destroy(struct ath12k_dp *dp); 164*60bac4d6SBjoern A. Zeeb int ath12k_dp_link_peer_rhash_add(struct ath12k_dp *dp, 165*60bac4d6SBjoern A. Zeeb struct ath12k_dp_link_peer *peer); 166*60bac4d6SBjoern A. Zeeb void ath12k_dp_link_peer_rhash_delete(struct ath12k_dp *dp, 167*60bac4d6SBjoern A. Zeeb struct ath12k_dp_link_peer *peer); 168*60bac4d6SBjoern A. Zeeb int ath12k_dp_peer_create(struct ath12k_dp_hw *dp_hw, u8 *addr, 169*60bac4d6SBjoern A. Zeeb struct ath12k_dp_peer_create_params *params); 170*60bac4d6SBjoern A. Zeeb void ath12k_dp_peer_delete(struct ath12k_dp_hw *dp_hw, u8 *addr, 171*60bac4d6SBjoern A. Zeeb struct ieee80211_sta *sta); 172*60bac4d6SBjoern A. Zeeb struct ath12k_dp_peer *ath12k_dp_peer_find_by_addr(struct ath12k_dp_hw *dp_hw, u8 *addr); 173*60bac4d6SBjoern A. Zeeb struct ath12k_dp_peer *ath12k_dp_peer_find_by_addr_and_sta(struct ath12k_dp_hw *dp_hw, 174*60bac4d6SBjoern A. Zeeb u8 *addr, 175*60bac4d6SBjoern A. Zeeb struct ieee80211_sta *sta); 176*60bac4d6SBjoern A. Zeeb u16 ath12k_dp_peer_get_peerid_index(struct ath12k_dp *dp, u16 peer_id); 177*60bac4d6SBjoern A. Zeeb struct ath12k_dp_peer *ath12k_dp_peer_find_by_peerid(struct ath12k_pdev_dp *dp_pdev, 178*60bac4d6SBjoern A. Zeeb u16 peer_id); 179*60bac4d6SBjoern A. Zeeb struct ath12k_dp_link_peer * 180*60bac4d6SBjoern A. Zeeb ath12k_dp_link_peer_find_by_peerid(struct ath12k_pdev_dp *dp_pdev, u16 peer_id); 181*60bac4d6SBjoern A. Zeeb void ath12k_dp_link_peer_free(struct ath12k_dp_link_peer *peer); 182*60bac4d6SBjoern A. Zeeb #endif 183