1 /*
2  * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for
5  * any purpose with or without fee is hereby granted, provided that the
6  * above copyright notice and this permission notice appear in all
7  * copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16  * PERFORMANCE OF THIS SOFTWARE.
17  */
18  /**
19   * DOC: Declare various struct, macros which are used for private to DP.
20   *
21   * Note: This file shall not contain public API's prototype/declarations.
22   *
23   */
24 
25 #ifndef _WLAN_DP_PRIV_STRUCT_H_
26 #define _WLAN_DP_PRIV_STRUCT_H_
27 
28 #include "wlan_dp_public_struct.h"
29 #include "cdp_txrx_cmn.h"
30 #include "wlan_dp_cfg.h"
31 #include "wlan_dp_objmgr.h"
32 #include <cdp_txrx_misc.h>
33 #include <wlan_dp_rx_thread.h>
34 #include "qdf_periodic_work.h"
35 #include <cds_api.h>
36 #include "pld_common.h"
37 #include "wlan_dp_nud_tracking.h"
38 #include <i_qdf_net_stats.h>
39 #include <qdf_types.h>
40 #include "htc_api.h"
41 #include "wlan_dp_wfds.h"
42 
43 #ifndef NUM_TX_RX_HISTOGRAM
44 #define NUM_TX_RX_HISTOGRAM 128
45 #endif
46 
47 #define NUM_TX_RX_HISTOGRAM_MASK (NUM_TX_RX_HISTOGRAM - 1)
48 
49 #if defined(WLAN_FEATURE_DP_BUS_BANDWIDTH) && defined(FEATURE_RUNTIME_PM)
50 /**
51  * enum dp_rtpm_tput_policy_state - states to track runtime_pm tput policy
52  * @DP_RTPM_TPUT_POLICY_STATE_INVALID: invalid state
53  * @DP_RTPM_TPUT_POLICY_STATE_REQUIRED: state indicating runtime_pm is required
54  * @DP_RTPM_TPUT_POLICY_STATE_NOT_REQUIRED: state indicating runtime_pm is NOT
55  * required
56  */
57 enum dp_rtpm_tput_policy_state {
58 	DP_RTPM_TPUT_POLICY_STATE_INVALID,
59 	DP_RTPM_TPUT_POLICY_STATE_REQUIRED,
60 	DP_RTPM_TPUT_POLICY_STATE_NOT_REQUIRED
61 };
62 
63 /**
64  * struct dp_rtpm_tput_policy_context - RTPM throughput policy context
65  * @curr_state: current state of throughput policy (RTPM require or not)
66  * @wake_lock: wakelock for QDF wake_lock acquire/release APIs
67  * @rtpm_lock: lock use for QDF rutime PM prevent/allow APIs
68  * @high_tput_vote: atomic variable to keep track of voting
69  */
70 struct dp_rtpm_tput_policy_context {
71 	enum dp_rtpm_tput_policy_state curr_state;
72 	qdf_wake_lock_t wake_lock;
73 	qdf_runtime_lock_t rtpm_lock;
74 	qdf_atomic_t high_tput_vote;
75 };
76 #endif
77 
78 #define FISA_FLOW_MAX_AGGR_COUNT        16 /* max flow aggregate count */
79 
80 /**
81  * struct wlan_dp_psoc_cfg - DP configuration parameters.
82  * @tx_orphan_enable: Enable/Disable tx orphan
83  * @rx_mode: rx mode for packet processing
84  * @tx_comp_loop_pkt_limit: max # of packets to be processed
85  * @rx_reap_loop_pkt_limit: max # of packets to be reaped
86  * @rx_hp_oos_update_limit: max # of HP OOS (out of sync)
87  * @rx_softirq_max_yield_duration_ns: max duration for RX softirq
88  * @periodic_stats_timer_interval: Print selective stats on this specified
89  * interval
90  * @periodic_stats_timer_duration: duration for which periodic timer should run
91  * @bus_bw_super_high_threshold: bus bandwidth super high threshold
92  * @bus_bw_ultra_high_threshold: bus bandwidth ultra high threshold
93  * @bus_bw_very_high_threshold: bus bandwidth very high threshold
94  * @bus_bw_mid_high_threshold: bus bandwidth mid high threshold
95  * @bus_bw_dbs_threshold: bus bandwidth for DBS mode threshold
96  * @bus_bw_high_threshold: bus bandwidth high threshold
97  * @bus_bw_medium_threshold: bandwidth threshold for medium bandwidth
98  * @bus_bw_low_threshold: bandwidth threshold for low bandwidth
99  * @bus_bw_compute_interval: bus bandwidth compute interval
100  * @enable_tcp_delack: enable Dynamic Configuration of Tcp Delayed Ack
101  * @enable_tcp_limit_output: enable TCP limit output
102  * @enable_tcp_adv_win_scale: enable  TCP adv window scaling
103  * @tcp_delack_thres_high: High Threshold inorder to trigger TCP Del Ack
104  * indication
105  * @tcp_delack_thres_low: Low Threshold inorder to trigger TCP Del Ack
106  * indication
107  * @tcp_tx_high_tput_thres: High Threshold inorder to trigger High Tx
108  * Throughput requirement.
109  * @tcp_delack_timer_count: Del Ack Timer Count inorder to trigger TCP Del Ack
110  * indication
111  * @enable_tcp_param_update: enable tcp parameter update
112  * @bus_low_cnt_threshold: Threshold count to trigger low Tput GRO flush skip
113  * @enable_latency_crit_clients: Enable the handling of latency critical clients
114  * * @del_ack_enable: enable Dynamic Configuration of Tcp Delayed Ack
115  * @del_ack_threshold_high: High Threshold inorder to trigger TCP delay ack
116  * @del_ack_threshold_low: Low Threshold inorder to trigger TCP delay ack
117  * @del_ack_timer_value: Timeout value (ms) to send out all TCP del ack frames
118  * @del_ack_pkt_count: The maximum number of TCP delay ack frames
119  * @rx_thread_ul_affinity_mask: CPU mask to affine Rx_thread
120  * @rx_thread_affinity_mask: CPU mask to affine Rx_thread
121  * @cpu_map_list: RPS map for different RX queues
122  * @multicast_replay_filter: enable filtering of replayed multicast packets
123  * @rx_wakelock_timeout: Amount of time to hold wakelock for RX unicast packets
124  * @num_dp_rx_threads: number of dp rx threads
125  * @enable_dp_trace: Enable/Disable DP trace
126  * @dp_trace_config: DP trace configuration
127  * @enable_nud_tracking: Enable/Disable nud tracking
128  * @pkt_bundle_threshold_high: tx bundle high threshold
129  * @pkt_bundle_threshold_low: tx bundle low threshold
130  * @pkt_bundle_timer_value: tx bundle timer value in ms
131  * @pkt_bundle_size: tx bundle size
132  * @dp_proto_event_bitmap: Control for which protocol type diag log should be
133  * sent
134  * @fisa_enable: Enable/Disable FISA
135  * @icmp_req_to_fw_mark_interval: Interval to mark the ICMP Request packet to
136  * be sent to FW.
137  * @lro_enable: Enable/Disable lro
138  * @gro_enable: Enable/Disable gro
139  * @is_rx_fisa_enabled: flag to enable/disable FISA Rx
140  * @is_rx_fisa_lru_del_enabled: flag to enable/disable FST entry delete
141  */
142 struct wlan_dp_psoc_cfg {
143 	bool tx_orphan_enable;
144 
145 	uint32_t rx_mode;
146 	uint32_t tx_comp_loop_pkt_limit;
147 	uint32_t rx_reap_loop_pkt_limit;
148 	uint32_t rx_hp_oos_update_limit;
149 	uint64_t rx_softirq_max_yield_duration_ns;
150 #ifdef WLAN_FEATURE_PERIODIC_STA_STATS
151 	uint32_t periodic_stats_timer_interval;
152 	uint32_t periodic_stats_timer_duration;
153 #endif /* WLAN_FEATURE_PERIODIC_STA_STATS */
154 #ifdef WLAN_FEATURE_DP_BUS_BANDWIDTH
155 	uint32_t bus_bw_super_high_threshold;
156 	uint32_t bus_bw_ultra_high_threshold;
157 	uint32_t bus_bw_very_high_threshold;
158 	uint32_t bus_bw_dbs_threshold;
159 	uint32_t bus_bw_mid_high_threshold;
160 	uint32_t bus_bw_high_threshold;
161 	uint32_t bus_bw_medium_threshold;
162 	uint32_t bus_bw_low_threshold;
163 	uint32_t bus_bw_compute_interval;
164 	uint32_t enable_tcp_delack;
165 	bool     enable_tcp_limit_output;
166 	uint32_t enable_tcp_adv_win_scale;
167 	uint32_t tcp_delack_thres_high;
168 	uint32_t tcp_delack_thres_low;
169 	uint32_t tcp_tx_high_tput_thres;
170 	uint32_t tcp_delack_timer_count;
171 	bool     enable_tcp_param_update;
172 	uint32_t bus_low_cnt_threshold;
173 	bool enable_latency_crit_clients;
174 #endif /*WLAN_FEATURE_DP_BUS_BANDWIDTH*/
175 
176 #ifdef QCA_SUPPORT_TXRX_DRIVER_TCP_DEL_ACK
177 	bool del_ack_enable;
178 	uint32_t del_ack_threshold_high;
179 	uint32_t del_ack_threshold_low;
180 	uint16_t del_ack_timer_value;
181 	uint16_t del_ack_pkt_count;
182 #endif
183 	uint32_t rx_thread_ul_affinity_mask;
184 	uint32_t rx_thread_affinity_mask;
185 	uint8_t cpu_map_list[CFG_DP_RPS_RX_QUEUE_CPU_MAP_LIST_LEN];
186 	bool multicast_replay_filter;
187 	uint32_t rx_wakelock_timeout;
188 	uint8_t num_dp_rx_threads;
189 #ifdef CONFIG_DP_TRACE
190 	bool enable_dp_trace;
191 	uint8_t dp_trace_config[DP_TRACE_CONFIG_STRING_LENGTH];
192 #endif
193 	uint8_t enable_nud_tracking;
194 
195 #ifdef WLAN_SUPPORT_TXRX_HL_BUNDLE
196 	uint32_t pkt_bundle_threshold_high;
197 	uint32_t pkt_bundle_threshold_low;
198 	uint16_t pkt_bundle_timer_value;
199 	uint16_t pkt_bundle_size;
200 #endif
201 	uint32_t dp_proto_event_bitmap;
202 	uint32_t fisa_enable;
203 
204 	int icmp_req_to_fw_mark_interval;
205 
206 	bool lro_enable;
207 	bool gro_enable;
208 #ifdef WLAN_SUPPORT_RX_FISA
209 	bool is_rx_fisa_enabled;
210 	bool is_rx_fisa_lru_del_enabled;
211 #endif
212 };
213 
214 /**
215  * struct tx_rx_histogram: structure to keep track of tx and rx packets
216  *				received over 100ms intervals
217  * @interval_rx:	# of rx packets received in the last 100ms interval
218  * @interval_tx:	# of tx packets received in the last 100ms interval
219  * @next_vote_level:	pld_bus_width_type voting level (high or low)
220  *			determined on the basis of total tx and rx packets
221  *			received in the last 100ms interval
222  * @next_rx_level:	pld_bus_width_type voting level (high or low)
223  *			determined on the basis of rx packets received in the
224  *			last 100ms interval
225  * @next_tx_level:	pld_bus_width_type voting level (high or low)
226  *			determined on the basis of tx packets received in the
227  *			last 100ms interval
228  * @is_rx_pm_qos_high: Capture rx_pm_qos voting
229  * @is_tx_pm_qos_high: Capture tx_pm_qos voting
230  * @qtime: timestamp when the record is added
231  *
232  * The structure keeps track of throughput requirements of wlan driver.
233  * An entry is added if either of next_vote_level, next_rx_level or
234  * next_tx_level changes. An entry is not added for every 100ms interval.
235  */
236 struct tx_rx_histogram {
237 	uint64_t interval_rx;
238 	uint64_t interval_tx;
239 	uint32_t next_vote_level;
240 	uint32_t next_rx_level;
241 	uint32_t next_tx_level;
242 	bool is_rx_pm_qos_high;
243 	bool is_tx_pm_qos_high;
244 	uint64_t qtime;
245 };
246 
247 /**
248  * struct dp_stats - DP stats
249  * @tx_rx_stats : Tx/Rx debug stats
250  * @arp_stats: arp debug stats
251  * @dns_stats: dns debug stats
252  * @tcp_stats: tcp debug stats
253  * @icmpv4_stats: icmpv4 debug stats
254  * @dhcp_stats: dhcp debug stats
255  * @eapol_stats: eapol debug stats
256  */
257 struct dp_stats {
258 	struct dp_tx_rx_stats tx_rx_stats;
259 	struct dp_arp_stats arp_stats;
260 	struct dp_dns_stats dns_stats;
261 	struct dp_tcp_stats tcp_stats;
262 	struct dp_icmpv4_stats icmpv4_stats;
263 	struct dp_dhcp_stats dhcp_stats;
264 	struct dp_eapol_stats eapol_stats;
265 };
266 
267 /**
268  * enum dhcp_phase - Per Peer DHCP Phases
269  * @DHCP_PHASE_ACK: upon receiving DHCP_ACK/NAK message in REQUEST phase or
270  *         DHCP_DELINE message in OFFER phase
271  * @DHCP_PHASE_DISCOVER: upon receiving DHCP_DISCOVER message in ACK phase
272  * @DHCP_PHASE_OFFER: upon receiving DHCP_OFFER message in DISCOVER phase
273  * @DHCP_PHASE_REQUEST: upon receiving DHCP_REQUEST message in OFFER phase or
274  *         ACK phase (Renewal process)
275  */
276 enum dhcp_phase {
277 	DHCP_PHASE_ACK,
278 	DHCP_PHASE_DISCOVER,
279 	DHCP_PHASE_OFFER,
280 	DHCP_PHASE_REQUEST
281 };
282 
283 /**
284  * enum dhcp_nego_status - Per Peer DHCP Negotiation Status
285  * @DHCP_NEGO_STOP: when the peer is in ACK phase or client disassociated
286  * @DHCP_NEGO_IN_PROGRESS: when the peer is in DISCOVER or REQUEST
287  *         (Renewal process) phase
288  */
289 enum dhcp_nego_status {
290 	DHCP_NEGO_STOP,
291 	DHCP_NEGO_IN_PROGRESS
292 };
293 
294 /*
295  * Pending frame type of EAP_FAILURE, bit number used in "pending_eap_frm_type"
296  * of sta_info.
297  */
298 #define DP_PENDING_TYPE_EAP_FAILURE  0
299 
300 enum bss_intf_state {
301 	BSS_INTF_STOP,
302 	BSS_INTF_START,
303 };
304 
305 struct wlan_dp_sta_info {
306 	struct qdf_mac_addr sta_mac;
307 	unsigned long pending_eap_frm_type;
308 	enum dhcp_phase dhcp_phase;
309 	enum dhcp_nego_status dhcp_nego_status;
310 };
311 
312 struct wlan_dp_conn_info {
313 	struct qdf_mac_addr bssid;
314 	struct qdf_mac_addr peer_macaddr;
315 	uint8_t proxy_arp_service;
316 	uint8_t is_authenticated;
317 };
318 
319 /**
320  * struct link_monitoring - link speed monitoring related info
321  * @enabled: Is link speed monitoring feature enabled
322  * @rx_linkspeed_threshold: link speed good/bad threshold
323  * @is_rx_linkspeed_good: true means rx link speed good, false means bad
324  */
325 struct link_monitoring {
326 	uint8_t enabled;
327 	uint32_t rx_linkspeed_threshold;
328 	uint8_t is_rx_linkspeed_good;
329 };
330 
331 /**
332  * struct direct_link_info - direct link configuration items
333  * @config_set: is the direct link config active
334  * @low_latency: is low latency enabled
335  */
336 struct direct_link_info {
337 	bool config_set;
338 	bool low_latency;
339 };
340 
341 /**
342  * struct dp_fisa_reo_mismatch_stats - reo mismatch sub-case stats for FISA
343  * @allow_cce_match: packet allowed due to cce mismatch
344  * @allow_fse_metdata_mismatch: packet allowed since it belongs to same flow,
345  *			only fse_metadata is not same.
346  * @allow_non_aggr: packet allowed due to any other reason.
347  */
348 struct dp_fisa_reo_mismatch_stats {
349 	uint32_t allow_cce_match;
350 	uint32_t allow_fse_metdata_mismatch;
351 	uint32_t allow_non_aggr;
352 };
353 
354 /**
355  * struct dp_fisa_stats - FISA stats
356  * @invalid_flow_index: flow index invalid from RX HW TLV
357  * @update_deferred: workqueue deferred due to suspend
358  * @reo_mismatch: REO ID mismatch
359  * @incorrect_rdi: Incorrect REO dest indication in TLV
360  *		   (typically used for RDI = 0)
361  */
362 struct dp_fisa_stats {
363 	uint32_t invalid_flow_index;
364 	uint32_t update_deferred;
365 	struct dp_fisa_reo_mismatch_stats reo_mismatch;
366 	uint32_t incorrect_rdi;
367 };
368 
369 /**
370  * enum fisa_aggr_ret - FISA aggregation return code
371  * @FISA_AGGR_DONE: FISA aggregation done
372  * @FISA_AGGR_NOT_ELIGIBLE: Not eligible for FISA aggregation
373  * @FISA_FLUSH_FLOW: FISA flow flushed
374  */
375 enum fisa_aggr_ret {
376 	FISA_AGGR_DONE,
377 	FISA_AGGR_NOT_ELIGIBLE,
378 	FISA_FLUSH_FLOW
379 };
380 
381 /**
382  * struct fisa_pkt_hist - FISA Packet history structure
383  * @tlv_hist: array of TLV history
384  * @ts_hist: array of timestamps of fisa packets
385  * @idx: index indicating the next location to be used in the array.
386  */
387 struct fisa_pkt_hist {
388 	uint8_t *tlv_hist;
389 	qdf_time_t ts_hist[FISA_FLOW_MAX_AGGR_COUNT];
390 	uint32_t idx;
391 };
392 
393 /**
394  * struct dp_fisa_rx_sw_ft - FISA Flow table entry
395  * @hw_fse: HAL Rx Flow Search Entry which matches HW definition
396  * @flow_hash: Flow hash value
397  * @flow_id_toeplitz: toeplitz hash value
398  * @flow_id: Flow index, equivalent to hash value truncated to FST size
399  * @stats: Stats tracking for this flow
400  * @is_ipv4_addr_entry: Flag indicating whether flow is IPv4 address tuple
401  * @is_valid: Flag indicating whether flow is valid
402  * @is_populated: Flag indicating whether flow is populated
403  * @is_flow_udp: Flag indicating whether flow is UDP stream
404  * @is_flow_tcp: Flag indicating whether flow is TCP stream
405  * @head_skb: HEAD skb where flow is aggregated
406  * @cumulative_l4_checksum: Cumulative L4 checksum
407  * @adjusted_cumulative_ip_length: Cumulative IP length
408  * @cur_aggr: Current aggregate length of flow
409  * @napi_flush_cumulative_l4_checksum: Cumulative L4 chekcsum for current
410  *				       NAPI flush
411  * @napi_flush_cumulative_ip_length: Cumulative IP length
412  * @last_skb: The last skb aggregated in the FISA flow
413  * @head_skb_ip_hdr_offset: IP header offset
414  * @head_skb_l4_hdr_offset: L4 header offset
415  * @rx_flow_tuple_info: RX tuple information
416  * @napi_id: NAPI ID (REO ID) on which the flow is being received
417  * @vdev: VDEV handle corresponding to the FLOW
418  * @vdev_id: DP vdev id
419  * @dp_intf: DP interface handle corresponding to the flow
420  * @bytes_aggregated: Number of bytes currently aggregated
421  * @flush_count: Number of Flow flushes done
422  * @aggr_count: Aggregation count
423  * @do_not_aggregate: Flag to indicate not to aggregate this flow
424  * @hal_cumultive_ip_len: HAL cumulative IP length
425  * @dp_ctx: DP component handle
426  * @soc_hdl: DP SoC handle
427  * @last_hal_aggr_count: last aggregate count fetched from RX PKT TLV
428  * @cur_aggr_gso_size: Current aggreagtesd GSO size
429  * @head_skb_udp_hdr: UDP header address for HEAD skb
430  * @frags_cumulative_len:
431  * @cmem_offset: CMEM offset
432  * @metadata:
433  * @reo_dest_indication: REO destination indication for the FLOW
434  * @flow_init_ts: FLOW init timestamp
435  * @last_accessed_ts: Timestamp when the flow was last accessed
436  * @pkt_hist: FISA aggreagtion packets history
437  * @same_mld_vdev_mismatch: Packets flushed after vdev_mismatch on same MLD
438  * @add_timestamp: FISA entry created timestamp
439  */
440 struct dp_fisa_rx_sw_ft {
441 	void *hw_fse;
442 	uint32_t flow_hash;
443 	uint32_t flow_id_toeplitz;
444 	uint32_t flow_id;
445 	struct cdp_flow_stats stats;
446 	uint8_t is_ipv4_addr_entry;
447 	uint8_t is_valid;
448 	uint8_t is_populated;
449 	uint8_t is_flow_udp;
450 	uint8_t is_flow_tcp;
451 	qdf_nbuf_t head_skb;
452 	uint16_t cumulative_l4_checksum;
453 	uint16_t adjusted_cumulative_ip_length;
454 	uint16_t cur_aggr;
455 	uint16_t napi_flush_cumulative_l4_checksum;
456 	uint16_t napi_flush_cumulative_ip_length;
457 	qdf_nbuf_t last_skb;
458 	uint32_t head_skb_ip_hdr_offset;
459 	uint32_t head_skb_l4_hdr_offset;
460 	struct cdp_rx_flow_tuple_info rx_flow_tuple_info;
461 	uint8_t napi_id;
462 	struct dp_vdev *vdev;
463 	uint8_t vdev_id;
464 	struct wlan_dp_intf *dp_intf;
465 	uint64_t bytes_aggregated;
466 	uint32_t flush_count;
467 	uint32_t aggr_count;
468 	uint8_t do_not_aggregate;
469 	uint16_t hal_cumultive_ip_len;
470 	struct wlan_dp_psoc_context *dp_ctx;
471 	/* TODO - Only reference needed to this is to get vdev.
472 	 * Once that ref is removed, this field can be deleted
473 	 */
474 	struct dp_soc *soc_hdl;
475 	uint32_t last_hal_aggr_count;
476 	uint32_t cur_aggr_gso_size;
477 	qdf_net_udphdr_t *head_skb_udp_hdr;
478 	uint16_t frags_cumulative_len;
479 	uint32_t cmem_offset;
480 	uint32_t metadata;
481 	uint32_t reo_dest_indication;
482 	qdf_time_t flow_init_ts;
483 	qdf_time_t last_accessed_ts;
484 #ifdef WLAN_SUPPORT_RX_FISA_HIST
485 	struct fisa_pkt_hist pkt_hist;
486 #endif
487 	uint64_t same_mld_vdev_mismatch;
488 	uint64_t add_timestamp;
489 };
490 
491 #define DP_RX_GET_SW_FT_ENTRY_SIZE sizeof(struct dp_fisa_rx_sw_ft)
492 #define MAX_FSE_CACHE_FL_HST 10
493 /**
494  * struct fse_cache_flush_history - Debug history cache flush
495  * @timestamp: Entry update timestamp
496  * @flows_added: Number of flows added for this flush
497  * @flows_deleted: Number of flows deleted for this flush
498  */
499 struct fse_cache_flush_history {
500 	uint64_t timestamp;
501 	uint32_t flows_added;
502 	uint32_t flows_deleted;
503 };
504 
505 /**
506  * struct dp_rx_fst - FISA handle
507  * @base: Software (DP) FST
508  * @dp_ctx: DP component handle
509  * @hal_rx_fst: Pointer to HAL FST
510  * @hal_rx_fst_base_paddr: Base physical address of HAL RX HW FST
511  * @max_entries: Maximum number of flows FSE supports
512  * @num_entries: Num entries in flow table
513  * @max_skid_length: SKID Length
514  * @hash_mask: Hash mask to obtain legitimate hash entry
515  * @dp_rx_fst_lock: Lock for adding/deleting entries of FST
516  * @add_flow_count: Num of flows added
517  * @del_flow_count: Num of flows deleted
518  * @hash_collision_cnt: Num hash collisions
519  * @soc_hdl: DP SoC handle
520  * @fse_cache_flush_posted: Num FSE cache flush cmds posted
521  * @fse_cache_flush_timer: FSE cache flush timer
522  * @fse_cache_flush_allow: Flag to indicate if FSE cache flush is allowed
523  * @cache_fl_rec: FSE cache flush history
524  * @stats: FISA stats
525  * @fst_update_work: FST CMEM update work
526  * @fst_update_wq: FST CMEM update workqueue
527  * @fst_update_list: List to post event to CMEM update work
528  * @meta_counter:
529  * @cmem_ba:
530  * @dp_rx_sw_ft_lock: SW FST lock
531  * @cmem_resp_event: CMEM response event indicator
532  * @flow_deletion_supported: Flag to indicate if flow delete is supported
533  * @fst_in_cmem: Flag to indicate if FST is stored in CMEM
534  * @pm_suspended: Flag to indicate if driver is suspended
535  * @fst_wq_defer:
536  * @rx_hash_enabled: Flag to indicate if Hash based routing supported
537  * @rx_toeplitz_hash_key: hash key
538  * @rx_pkt_tlv_size: RX packet TLV size
539  */
540 struct dp_rx_fst {
541 	uint8_t *base;
542 	struct wlan_dp_psoc_context *dp_ctx;
543 	struct hal_rx_fst *hal_rx_fst;
544 	uint64_t hal_rx_fst_base_paddr;
545 	uint16_t max_entries;
546 	uint16_t num_entries;
547 	uint16_t max_skid_length;
548 	uint32_t hash_mask;
549 	qdf_spinlock_t dp_rx_fst_lock;
550 	uint32_t add_flow_count;
551 	uint32_t del_flow_count;
552 	uint32_t hash_collision_cnt;
553 	struct dp_soc *soc_hdl;
554 	qdf_atomic_t fse_cache_flush_posted;
555 	qdf_timer_t fse_cache_flush_timer;
556 	bool fse_cache_flush_allow;
557 	struct fse_cache_flush_history cache_fl_rec[MAX_FSE_CACHE_FL_HST];
558 	struct dp_fisa_stats stats;
559 
560 	/* CMEM params */
561 	qdf_work_t fst_update_work;
562 	qdf_workqueue_t *fst_update_wq;
563 	qdf_list_t fst_update_list;
564 	uint32_t meta_counter;
565 	uint32_t cmem_ba;
566 	qdf_spinlock_t dp_rx_sw_ft_lock[MAX_REO_DEST_RINGS];
567 	qdf_event_t cmem_resp_event;
568 	bool flow_deletion_supported;
569 	bool fst_in_cmem;
570 	qdf_atomic_t pm_suspended;
571 	bool fst_wq_defer;
572 	bool rx_hash_enabled;
573 	uint8_t *rx_toeplitz_hash_key;
574 	uint16_t rx_pkt_tlv_size;
575 };
576 
577 /**
578  * struct wlan_dp_intf - DP interface object related info
579  * @dp_ctx: DP context reference
580  * @link_monitoring: Link monitoring related info
581  * @mac_addr: Device MAC address
582  * @device_mode: Device Mode
583  * @intf_id: Interface ID
584  * @node: list node for membership in the interface list
585  * @dev: netdev reference
586  * @txrx_ops: Interface tx-rx ops
587  * @dp_stats: Device TX/RX statistics
588  * @is_sta_periodic_stats_enabled: Indicate whether to display sta periodic
589  * stats
590  * @periodic_stats_timer_count: count of periodic stats timer
591  * @periodic_stats_timer_counter: periodic stats timer counter
592  * @sta_periodic_stats_lock: sta periodic stats lock
593  * @stats: netdev stats
594  * @con_status: con_status value
595  * @dad: dad value
596  * @pkt_type_bitmap: packet type bitmap value
597  * @track_arp_ip: track ARP ip
598  * @dns_payload: dns payload
599  * @track_dns_domain_len: dns domain length
600  * @track_src_port: track source port value
601  * @track_dest_port: track destination port value
602  * @track_dest_ipv4: track destination ipv4 value
603  * @prev_rx_packets: Rx packets received N/W interface
604  * @prev_tx_packets: Tx packets transmitted on N/W interface
605  * @prev_tx_bytes: Tx bytes transmitted on N/W interface
606  * @prev_fwd_tx_packets: forwarded tx packets count
607  * @prev_fwd_rx_packets: forwarded rx packets count
608  * @nud_tracking: NUD tracking
609  * @mic_work: Work to handle MIC error
610  * @num_active_task: Active task count
611  * @sap_tx_block_mask: SAP TX block mask
612  * @gro_disallowed: GRO disallowed flag
613  * @gro_flushed: GRO flushed flag
614  * @fisa_disallowed: Flag to indicate fisa aggregation not to be done for a
615  *		     particular rx_context
616  * @fisa_force_flushed: Flag to indicate FISA flow has been flushed for a
617  *			particular rx_context
618  * @runtime_disable_rx_thread: Runtime Rx thread flag
619  * @rx_stack: function pointer Rx packet handover
620  * @tx_fn: function pointer to send Tx packet
621  * @bss_state: AP BSS state
622  * @qdf_sta_eap_frm_done_event: EAP frame event management
623  * @traffic_end_ind: store traffic end indication info
624  * @direct_link_config: direct link configuration parameters
625  * @num_links: Number of links for this DP interface
626  * @def_link: Pointer to default link (usually used for TX operation)
627  * @dp_link_list_lock: Lock to protect dp_link_list operatiosn
628  * @dp_link_list: List of dp_links for this DP interface
629  */
630 struct wlan_dp_intf {
631 	struct wlan_dp_psoc_context *dp_ctx;
632 
633 	struct link_monitoring link_monitoring;
634 
635 	struct qdf_mac_addr mac_addr;
636 
637 	enum QDF_OPMODE device_mode;
638 
639 	qdf_list_node_t node;
640 
641 	qdf_netdev_t dev;
642 	struct ol_txrx_ops txrx_ops;
643 	struct dp_stats dp_stats;
644 #ifdef WLAN_FEATURE_PERIODIC_STA_STATS
645 	bool is_sta_periodic_stats_enabled;
646 	uint16_t periodic_stats_timer_count;
647 	uint32_t periodic_stats_timer_counter;
648 	qdf_mutex_t sta_periodic_stats_lock;
649 #endif /* WLAN_FEATURE_PERIODIC_STA_STATS */
650 	qdf_net_dev_stats stats;
651 	bool con_status;
652 	bool dad;
653 	uint32_t pkt_type_bitmap;
654 	uint32_t track_arp_ip;
655 	uint8_t dns_payload[256];
656 	uint32_t track_dns_domain_len;
657 	uint32_t track_src_port;
658 	uint32_t track_dest_port;
659 	uint32_t track_dest_ipv4;
660 #ifdef WLAN_FEATURE_DP_BUS_BANDWIDTH
661 	unsigned long prev_rx_packets;
662 	unsigned long prev_tx_packets;
663 	unsigned long prev_tx_bytes;
664 	uint64_t prev_fwd_tx_packets;
665 	uint64_t prev_fwd_rx_packets;
666 #endif /*WLAN_FEATURE_DP_BUS_BANDWIDTH*/
667 	struct dp_mic_work mic_work;
668 #ifdef WLAN_NUD_TRACKING
669 	struct dp_nud_tracking_info nud_tracking;
670 #endif
671 	qdf_atomic_t num_active_task;
672 	uint32_t sap_tx_block_mask;
673 
674 	qdf_atomic_t gro_disallowed;
675 	uint8_t gro_flushed[DP_MAX_RX_THREADS];
676 
677 #ifdef WLAN_SUPPORT_RX_FISA
678 	/*
679 	 * Params used for controlling the fisa aggregation dynamically
680 	 */
681 	uint8_t fisa_disallowed[MAX_REO_DEST_RINGS];
682 	uint8_t fisa_force_flushed[MAX_REO_DEST_RINGS];
683 #endif
684 
685 	bool runtime_disable_rx_thread;
686 
687 	enum bss_intf_state bss_state;
688 	qdf_event_t qdf_sta_eap_frm_done_event;
689 	struct dp_traffic_end_indication traffic_end_ind;
690 #ifdef FEATURE_DIRECT_LINK
691 	struct direct_link_info direct_link_config;
692 #endif
693 	uint8_t num_links;
694 	struct wlan_dp_link *def_link;
695 	qdf_spinlock_t dp_link_list_lock;
696 	qdf_list_t dp_link_list;
697 };
698 
699 #define WLAN_DP_LINK_MAGIC 0x5F44505F4C494E4B	/* "_DP_LINK" in ASCII */
700 
701 /**
702  * struct wlan_dp_link - DP link (corresponds to objmgr vdev)
703  * @node: list node for membership in the DP links list
704  * @magic: magic number to identify validity of dp_link
705  * @link_id: ID for this DP link (Same as vdev_id)
706  * @mac_addr: mac address of this link
707  * @dp_intf: Parent DP interface for this DP link
708  * @vdev: object manager vdev context
709  * @vdev_lock: vdev spin lock
710  * @conn_info: STA connection information
711  * @destroyed: flag to indicate dp_link destroyed (logical delete)
712  * @cdp_vdev_registered: flag to indicate if corresponding CDP vdev
713  *			 is registered
714  * @cdp_vdev_deleted: flag to indicate if corresponding CDP vdev is deleted
715  * @inactive_list_elem: list node for membership in dp link inactive list
716  */
717 struct wlan_dp_link {
718 	qdf_list_node_t node;
719 	uint64_t magic;
720 	uint8_t link_id;
721 	struct qdf_mac_addr mac_addr;
722 	struct wlan_dp_intf *dp_intf;
723 	struct wlan_objmgr_vdev *vdev;
724 	qdf_spinlock_t vdev_lock;
725 	struct wlan_dp_conn_info conn_info;
726 	uint8_t destroyed;
727 	uint8_t cdp_vdev_registered;
728 	uint8_t	cdp_vdev_deleted;
729 	TAILQ_ENTRY(wlan_dp_link) inactive_list_elem;
730 };
731 
732 /**
733  * enum RX_OFFLOAD - Receive offload modes
734  * @CFG_LRO_ENABLED: Large Rx offload
735  * @CFG_GRO_ENABLED: Generic Rx Offload
736  */
737 enum RX_OFFLOAD {
738 	CFG_LRO_ENABLED = 1,
739 	CFG_GRO_ENABLED,
740 };
741 
742 #ifdef FEATURE_DIRECT_LINK
743 /**
744  * struct dp_direct_link_context - Datapath Direct Link context
745  * @dp_ctx: pointer to DP psoc priv context
746  * @lpass_ep_id: LPASS data msg service endpoint id
747  * @direct_link_refill_ring_hdl: Direct Link refill ring handle
748  * @dl_wfds: pointer to direct link WFDS context
749  */
750 struct dp_direct_link_context {
751 	struct wlan_dp_psoc_context *dp_ctx;
752 	HTC_ENDPOINT_ID lpass_ep_id;
753 	struct dp_srng *direct_link_refill_ring_hdl;
754 	struct dp_direct_link_wfds_context *dl_wfds;
755 };
756 #endif
757 
758 /**
759  * struct wlan_dp_psoc_context - psoc related data required for DP
760  * @psoc: object manager psoc context
761  * @pdev: object manager pdev context
762  * @qdf_dev: qdf device
763  * @dp_cfg: place holder for DP configuration
764  * @cdp_soc: CDP SoC handle
765  * @hif_handle: HIF handle
766  * @hal_soc: HAL SoC handle
767  * @intf_list_lock: DP interfaces list lock
768  * @intf_list: DP interfaces list
769  * @rps: rps
770  * @dynamic_rps: dynamic rps
771  * @enable_rxthread: Enable/Disable rx thread
772  * @enable_dp_rx_threads: Enable/Disable DP rx threads
773  * @napi_enable: Enable/Disable napi
774  * @dp_ops: DP callbacks registered from other modules
775  * @sb_ops: South bound direction call backs registered in DP
776  * @nb_ops: North bound direction call backs registered in DP
777  * @en_tcp_delack_no_lro: Enable/Disable tcp delack no lro
778  * @no_rx_offload_pkt_cnt: no of rx offload packet count
779  * @no_tx_offload_pkt_cnt: no of tx offload packet count
780  * @is_suspend: to check whether syetem suspend or not
781  * @is_wiphy_suspended: to check whether wiphy suspend or not
782  * @num_latency_critical_clients: num latency critical clients
783  * @high_bus_bw_request: high bus bandwidth request
784  * @bw_vote_time: bus bandwidth vote time
785  * @bus_bw_work: work for periodically computing DDR bus bandwidth requirements
786  * @cur_vote_level: Current vote level
787  * @prev_no_rx_offload_pkts: no of previous rx offload packets
788  * @prev_rx_offload_pkts: previous rx offload packets
789  * @prev_no_tx_offload_pkts: no of previous tx offload packets
790  * @prev_tx_offload_pkts: previous tx offload packets
791  * @cur_tx_level: Current Tx level
792  * @prev_tx: previous tx
793  * @low_tput_gro_enable: Enable/Disable low tput gro
794  * @bus_bw_lock: Bus bandwidth work lock
795  * @cur_rx_level: Current Rx level
796  * @bus_low_vote_cnt: bus low level count
797  * @disable_rx_ol_in_concurrency: disable RX offload in concurrency scenarios
798  * @disable_rx_ol_in_low_tput: disable RX offload in tput scenarios
799  * @txrx_hist_idx: txrx histogram index
800  * @rx_high_ind_cnt: rx high_ind count
801  * @receive_offload_cb: receive offload cb
802  * @dp_agg_param: DP aggregation parameter
803  * @dp_agg_param.rx_aggregation:
804  * @dp_agg_param.gro_force_flush:
805  * @dp_agg_param.tc_based_dyn_gro:
806  * @dp_agg_param.tc_ingress_prio:
807  * @rtpm_tput_policy_ctx: Runtime Tput policy context
808  * @txrx_hist: TxRx histogram
809  * @bbm_ctx: bus bandwidth manager context
810  * @dp_direct_link_lock: Direct link mutex lock
811  * @dp_direct_link_ctx: DP Direct Link context
812  * @arp_connectivity_map: ARP connectivity map
813  * @rx_wake_lock: rx wake lock
814  * @ol_enable: Enable/Disable offload
815  * @rx_fst: FST handle
816  * @fst_cmem_base: FST base in CMEM
817  * @fst_in_cmem: Flag indicating if FST is in CMEM or not
818  * @fisa_enable: Flag to indicate if FISA is enabled or not
819  * @fisa_lru_del_enable: Flag to indicate if LRU flow delete is enabled
820  * @fisa_dynamic_aggr_size_support: Indicate dynamic aggr size programming support
821  * @skip_fisa_param: FISA skip params structure
822  * @skip_fisa_param.skip_fisa: Flag to skip FISA aggr inside @skip_fisa_param
823  * @skip_fisa_param.fisa_force_flush: Force flush inside @skip_fisa_param
824  * @fst_cmem_size: CMEM size for FISA flow table
825  * @inactive_dp_link_list: inactive DP links list
826  * @dp_link_del_lock: DP link delete operation lock
827  */
828 struct wlan_dp_psoc_context {
829 	struct wlan_objmgr_psoc *psoc;
830 	struct wlan_objmgr_pdev *pdev;
831 	qdf_device_t qdf_dev;
832 	struct wlan_dp_psoc_cfg dp_cfg;
833 	ol_txrx_soc_handle cdp_soc;
834 	struct hif_opaque_softc *hif_handle;
835 	void *hal_soc;
836 
837 	qdf_spinlock_t intf_list_lock;
838 	qdf_list_t intf_list;
839 
840 	bool rps;
841 	bool dynamic_rps;
842 	bool enable_rxthread;
843 	bool enable_dp_rx_threads;
844 	bool napi_enable;
845 
846 	struct wlan_dp_psoc_callbacks dp_ops;
847 	struct wlan_dp_psoc_sb_ops sb_ops;
848 	struct wlan_dp_psoc_nb_ops nb_ops;
849 
850 	bool en_tcp_delack_no_lro;
851 	uint64_t no_rx_offload_pkt_cnt;
852 	uint64_t no_tx_offload_pkt_cnt;
853 	bool is_suspend;
854 	bool is_wiphy_suspended;
855 	qdf_atomic_t num_latency_critical_clients;
856 	uint8_t high_bus_bw_request;
857 	uint64_t bw_vote_time;
858 #ifdef WLAN_FEATURE_DP_BUS_BANDWIDTH
859 	struct qdf_periodic_work bus_bw_work;
860 	int cur_vote_level;
861 	qdf_spinlock_t bus_bw_lock;
862 	int cur_rx_level;
863 	uint64_t prev_no_rx_offload_pkts;
864 	uint64_t prev_rx_offload_pkts;
865 	uint64_t prev_no_tx_offload_pkts;
866 	uint64_t prev_tx_offload_pkts;
867 	int cur_tx_level;
868 	uint64_t prev_tx;
869 	qdf_atomic_t low_tput_gro_enable;
870 	uint32_t bus_low_vote_cnt;
871 #ifdef FEATURE_RUNTIME_PM
872 	struct dp_rtpm_tput_policy_context rtpm_tput_policy_ctx;
873 #endif
874 #endif /*WLAN_FEATURE_DP_BUS_BANDWIDTH*/
875 	qdf_atomic_t disable_rx_ol_in_concurrency;
876 	qdf_atomic_t disable_rx_ol_in_low_tput;
877 
878 	uint16_t txrx_hist_idx;
879 	struct tx_rx_histogram *txrx_hist;
880 
881 	uint32_t rx_high_ind_cnt;
882 #ifdef FEATURE_BUS_BANDWIDTH_MGR
883 	struct bbm_context *bbm_ctx;
884 #endif
885 
886 	QDF_STATUS(*receive_offload_cb)(struct wlan_dp_intf *, qdf_nbuf_t nbuf);
887 
888 	struct {
889 		qdf_atomic_t rx_aggregation;
890 		uint8_t gro_force_flush[DP_MAX_RX_THREADS];
891 		bool tc_based_dyn_gro;
892 		uint32_t tc_ingress_prio;
893 	}
894 	dp_agg_param;
895 
896 	uint32_t arp_connectivity_map;
897 
898 	qdf_wake_lock_t rx_wake_lock;
899 
900 	enum RX_OFFLOAD ol_enable;
901 #ifdef FEATURE_DIRECT_LINK
902 	qdf_mutex_t dp_direct_link_lock;
903 	struct dp_direct_link_context *dp_direct_link_ctx;
904 #endif
905 #ifdef WLAN_SUPPORT_RX_FISA
906 	struct dp_rx_fst *rx_fst;
907 	uint64_t fst_cmem_base;
908 	bool fst_in_cmem;
909 	uint8_t fisa_enable;
910 	uint8_t fisa_lru_del_enable;
911 	bool fisa_dynamic_aggr_size_support;
912 	/*
913 	 * Params used for controlling the fisa aggregation dynamically
914 	 */
915 	struct {
916 		qdf_atomic_t skip_fisa;
917 		uint8_t fisa_force_flush[MAX_REO_DEST_RINGS];
918 	} skip_fisa_param;
919 
920 	/*
921 	 * CMEM address and size for FST in CMEM, This is the address
922 	 * shared during init time.
923 	 */
924 	uint64_t fst_cmem_size;
925 
926 #endif
927 	TAILQ_HEAD(, wlan_dp_link) inactive_dp_link_list;
928 	qdf_spinlock_t dp_link_del_lock;
929 };
930 
931 #ifdef WLAN_DP_PROFILE_SUPPORT
932 /**
933  * enum wlan_dp_cfg_param_type - param context type
934  * @DP_TX_DESC_NUM_CFG: Number of TX desc
935  * @DP_TX_EXT_DESC_NUM_CFG: Number of TX ext desc
936  * @DP_TX_RING_SIZE_CFG: TX ring size
937  * @DP_TX_COMPL_RING_SIZE_CFG: TX completion ring size
938  * @DP_RX_SW_DESC_NUM_CFG: Number of RX S.W descriptors
939  * @DP_REO_DST_RING_SIZE_CFG: RX ring size
940  * @DP_RXDMA_BUF_RING_SIZE_CFG: RXDMA BUF ring size
941  * @DP_RXDMA_REFILL_RING_SIZE_CFG: RXDMA refill ring size
942  * @DP_RX_REFILL_POOL_NUM_CFG: Refill buffer pool size
943  */
944 enum wlan_dp_cfg_param_type {
945 	DP_TX_DESC_NUM_CFG,
946 	DP_TX_EXT_DESC_NUM_CFG,
947 	DP_TX_RING_SIZE_CFG,
948 	DP_TX_COMPL_RING_SIZE_CFG,
949 	DP_RX_SW_DESC_NUM_CFG,
950 	DP_REO_DST_RING_SIZE_CFG,
951 	DP_RXDMA_BUF_RING_SIZE_CFG,
952 	DP_RXDMA_REFILL_RING_SIZE_CFG,
953 	DP_RX_REFILL_POOL_NUM_CFG,
954 };
955 
956 /**
957  * struct wlan_dp_memory_profile_ctx - element representing DP config param info
958  * @param_type: DP config param type
959  * @size: size/length of the param to be selected
960  */
961 struct wlan_dp_memory_profile_ctx {
962 	enum wlan_dp_cfg_param_type param_type;
963 	uint32_t size;
964 };
965 
966 /**
967  * struct wlan_dp_memory_profile_info - Current memory profile info
968  * @is_selected: profile is selected or not
969  * @ctx: DP memory profile context
970  * @size: size of profile
971  */
972 struct wlan_dp_memory_profile_info {
973 	bool is_selected;
974 	struct wlan_dp_memory_profile_ctx *ctx;
975 	int size;
976 };
977 #endif
978 
979 #endif /* end  of _WLAN_DP_PRIV_STRUCT_H_ */
980