1*60bac4d6SBjoern A. Zeeb /* SPDX-License-Identifier: BSD-3-Clause-Clear */
2*60bac4d6SBjoern A. Zeeb /*
3*60bac4d6SBjoern A. Zeeb * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
4*60bac4d6SBjoern A. Zeeb */
5*60bac4d6SBjoern A. Zeeb
6*60bac4d6SBjoern A. Zeeb #ifndef ATH12K_DP_CMN_H
7*60bac4d6SBjoern A. Zeeb #define ATH12K_DP_CMN_H
8*60bac4d6SBjoern A. Zeeb
9*60bac4d6SBjoern A. Zeeb #include "cmn_defs.h"
10*60bac4d6SBjoern A. Zeeb
11*60bac4d6SBjoern A. Zeeb struct ath12k_hw_group;
12*60bac4d6SBjoern A. Zeeb
13*60bac4d6SBjoern A. Zeeb /*
14*60bac4d6SBjoern A. Zeeb * ML Peer IDs start from 8192, assuming max SLO clients count 1536,
15*60bac4d6SBjoern A. Zeeb * then max peer id shall be 9728, therefore rounding the peer table size
16*60bac4d6SBjoern A. Zeeb * to the nearest next power of 2 i.e 16384.
17*60bac4d6SBjoern A. Zeeb */
18*60bac4d6SBjoern A. Zeeb #define MAX_DP_PEER_LIST_SIZE 16384
19*60bac4d6SBjoern A. Zeeb
20*60bac4d6SBjoern A. Zeeb struct ath12k_dp_hw {
21*60bac4d6SBjoern A. Zeeb struct ath12k_dp_peer __rcu *dp_peers[MAX_DP_PEER_LIST_SIZE];
22*60bac4d6SBjoern A. Zeeb
23*60bac4d6SBjoern A. Zeeb /* Lock for protection of dp_peer_list and peers */
24*60bac4d6SBjoern A. Zeeb spinlock_t peer_lock;
25*60bac4d6SBjoern A. Zeeb struct list_head dp_peers_list;
26*60bac4d6SBjoern A. Zeeb };
27*60bac4d6SBjoern A. Zeeb
28*60bac4d6SBjoern A. Zeeb struct ath12k_dp_hw_group {
29*60bac4d6SBjoern A. Zeeb struct ath12k_dp *dp[ATH12K_MAX_DEVICES];
30*60bac4d6SBjoern A. Zeeb };
31*60bac4d6SBjoern A. Zeeb
32*60bac4d6SBjoern A. Zeeb struct ath12k_dp_link_vif {
33*60bac4d6SBjoern A. Zeeb u32 vdev_id;
34*60bac4d6SBjoern A. Zeeb u8 search_type;
35*60bac4d6SBjoern A. Zeeb u8 hal_addr_search_flags;
36*60bac4d6SBjoern A. Zeeb u8 pdev_idx;
37*60bac4d6SBjoern A. Zeeb u8 lmac_id;
38*60bac4d6SBjoern A. Zeeb u16 ast_idx;
39*60bac4d6SBjoern A. Zeeb u16 ast_hash;
40*60bac4d6SBjoern A. Zeeb u16 tcl_metadata;
41*60bac4d6SBjoern A. Zeeb u8 vdev_id_check_en;
42*60bac4d6SBjoern A. Zeeb int bank_id;
43*60bac4d6SBjoern A. Zeeb };
44*60bac4d6SBjoern A. Zeeb
45*60bac4d6SBjoern A. Zeeb struct ath12k_dp_vif {
46*60bac4d6SBjoern A. Zeeb u8 tx_encap_type;
47*60bac4d6SBjoern A. Zeeb u32 key_cipher;
48*60bac4d6SBjoern A. Zeeb atomic_t mcbc_gsn;
49*60bac4d6SBjoern A. Zeeb struct ath12k_dp_link_vif dp_link_vif[ATH12K_NUM_MAX_LINKS];
50*60bac4d6SBjoern A. Zeeb };
51*60bac4d6SBjoern A. Zeeb
52*60bac4d6SBjoern A. Zeeb /* TODO: Move this to a separate dp_stats file */
53*60bac4d6SBjoern A. Zeeb struct ath12k_per_peer_tx_stats {
54*60bac4d6SBjoern A. Zeeb u32 succ_bytes;
55*60bac4d6SBjoern A. Zeeb u32 retry_bytes;
56*60bac4d6SBjoern A. Zeeb u32 failed_bytes;
57*60bac4d6SBjoern A. Zeeb u32 duration;
58*60bac4d6SBjoern A. Zeeb u16 succ_pkts;
59*60bac4d6SBjoern A. Zeeb u16 retry_pkts;
60*60bac4d6SBjoern A. Zeeb u16 failed_pkts;
61*60bac4d6SBjoern A. Zeeb u16 ru_start;
62*60bac4d6SBjoern A. Zeeb u16 ru_tones;
63*60bac4d6SBjoern A. Zeeb u8 ba_fails;
64*60bac4d6SBjoern A. Zeeb u8 ppdu_type;
65*60bac4d6SBjoern A. Zeeb u32 mu_grpid;
66*60bac4d6SBjoern A. Zeeb u32 mu_pos;
67*60bac4d6SBjoern A. Zeeb bool is_ampdu;
68*60bac4d6SBjoern A. Zeeb };
69*60bac4d6SBjoern A. Zeeb
70*60bac4d6SBjoern A. Zeeb struct ath12k_dp_peer_create_params {
71*60bac4d6SBjoern A. Zeeb struct ieee80211_sta *sta;
72*60bac4d6SBjoern A. Zeeb bool is_mlo;
73*60bac4d6SBjoern A. Zeeb u16 peer_id;
74*60bac4d6SBjoern A. Zeeb bool ucast_ra_only;
75*60bac4d6SBjoern A. Zeeb };
76*60bac4d6SBjoern A. Zeeb
77*60bac4d6SBjoern A. Zeeb struct ath12k_dp_link_peer_rate_info {
78*60bac4d6SBjoern A. Zeeb struct rate_info txrate;
79*60bac4d6SBjoern A. Zeeb u64 rx_duration;
80*60bac4d6SBjoern A. Zeeb u64 tx_duration;
81*60bac4d6SBjoern A. Zeeb u8 rssi_comb;
82*60bac4d6SBjoern A. Zeeb s8 signal_avg;
83*60bac4d6SBjoern A. Zeeb };
84*60bac4d6SBjoern A. Zeeb
85*60bac4d6SBjoern A. Zeeb static inline struct ath12k_dp_link_vif *
ath12k_dp_vif_to_dp_link_vif(struct ath12k_dp_vif * dp_vif,u8 link_id)86*60bac4d6SBjoern A. Zeeb ath12k_dp_vif_to_dp_link_vif(struct ath12k_dp_vif *dp_vif, u8 link_id)
87*60bac4d6SBjoern A. Zeeb {
88*60bac4d6SBjoern A. Zeeb return &dp_vif->dp_link_vif[link_id];
89*60bac4d6SBjoern A. Zeeb }
90*60bac4d6SBjoern A. Zeeb
91*60bac4d6SBjoern A. Zeeb void ath12k_dp_cmn_device_deinit(struct ath12k_dp *dp);
92*60bac4d6SBjoern A. Zeeb int ath12k_dp_cmn_device_init(struct ath12k_dp *dp);
93*60bac4d6SBjoern A. Zeeb void ath12k_dp_cmn_hw_group_unassign(struct ath12k_dp *dp,
94*60bac4d6SBjoern A. Zeeb struct ath12k_hw_group *ag);
95*60bac4d6SBjoern A. Zeeb void ath12k_dp_cmn_hw_group_assign(struct ath12k_dp *dp,
96*60bac4d6SBjoern A. Zeeb struct ath12k_hw_group *ag);
97*60bac4d6SBjoern A. Zeeb int ath12k_dp_link_peer_assign(struct ath12k_dp *dp, struct ath12k_dp_hw *dp_hw,
98*60bac4d6SBjoern A. Zeeb u8 vdev_id, struct ieee80211_sta *sta, u8 *addr,
99*60bac4d6SBjoern A. Zeeb u8 link_id, u32 hw_link_id);
100*60bac4d6SBjoern A. Zeeb void ath12k_dp_link_peer_unassign(struct ath12k_dp *dp, struct ath12k_dp_hw *dp_hw,
101*60bac4d6SBjoern A. Zeeb u8 vdev_id, u8 *addr, u32 hw_link_id);
102*60bac4d6SBjoern A. Zeeb void
103*60bac4d6SBjoern A. Zeeb ath12k_dp_link_peer_get_sta_rate_info_stats(struct ath12k_dp *dp, const u8 *addr,
104*60bac4d6SBjoern A. Zeeb struct ath12k_dp_link_peer_rate_info *info);
105*60bac4d6SBjoern A. Zeeb void ath12k_dp_link_peer_reset_rx_stats(struct ath12k_dp *dp, const u8 *addr);
106*60bac4d6SBjoern A. Zeeb #endif
107