xref: /linux/drivers/net/wireless/intel/iwlwifi/mld/low_latency.h (revision 1a9239bb4253f9076b5b4b2a1a4e8d7defd77a95)
1*d1e879ecSMiri Korenblit /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
2*d1e879ecSMiri Korenblit /*
3*d1e879ecSMiri Korenblit  * Copyright (C) 2024 Intel Corporation
4*d1e879ecSMiri Korenblit  */
5*d1e879ecSMiri Korenblit #ifndef __iwl_mld_low_latency_h__
6*d1e879ecSMiri Korenblit #define __iwl_mld_low_latency_h__
7*d1e879ecSMiri Korenblit 
8*d1e879ecSMiri Korenblit /**
9*d1e879ecSMiri Korenblit  * struct iwl_mld_low_latency_packets_counters - Packets counters
10*d1e879ecSMiri Korenblit  * @lock: synchronize the counting in data path against the worker
11*d1e879ecSMiri Korenblit  * @vo_vi: per-mac, counts the number of TX and RX voice and video packets
12*d1e879ecSMiri Korenblit  */
13*d1e879ecSMiri Korenblit struct iwl_mld_low_latency_packets_counters {
14*d1e879ecSMiri Korenblit 	spinlock_t lock;
15*d1e879ecSMiri Korenblit 	u32 vo_vi[NUM_MAC_INDEX_DRIVER];
16*d1e879ecSMiri Korenblit } ____cacheline_aligned_in_smp;
17*d1e879ecSMiri Korenblit 
18*d1e879ecSMiri Korenblit /**
19*d1e879ecSMiri Korenblit  * enum iwl_mld_low_latency_cause - low-latency set causes
20*d1e879ecSMiri Korenblit  *
21*d1e879ecSMiri Korenblit  * @LOW_LATENCY_TRAFFIC: indicates low-latency traffic was detected
22*d1e879ecSMiri Korenblit  * @LOW_LATENCY_DEBUGFS: low-latency mode set from debugfs
23*d1e879ecSMiri Korenblit  * @LOW_LATENCY_VIF_TYPE: low-latency mode set because of vif type (AP)
24*d1e879ecSMiri Korenblit  */
25*d1e879ecSMiri Korenblit enum iwl_mld_low_latency_cause {
26*d1e879ecSMiri Korenblit 	LOW_LATENCY_TRAFFIC	= BIT(0),
27*d1e879ecSMiri Korenblit 	LOW_LATENCY_DEBUGFS	= BIT(1),
28*d1e879ecSMiri Korenblit 	LOW_LATENCY_VIF_TYPE	= BIT(2),
29*d1e879ecSMiri Korenblit };
30*d1e879ecSMiri Korenblit 
31*d1e879ecSMiri Korenblit /**
32*d1e879ecSMiri Korenblit  * struct iwl_mld_low_latency - Manage low-latency detection and activation.
33*d1e879ecSMiri Korenblit  * @work: this work is used to detect low-latency by monitoring the number of
34*d1e879ecSMiri Korenblit  *	voice and video packets transmitted in a period of time. If the
35*d1e879ecSMiri Korenblit  *	threshold is reached, low-latency is activated. When active,
36*d1e879ecSMiri Korenblit  *	it is deactivated if the threshold is not reached within a
37*d1e879ecSMiri Korenblit  *	10-second period.
38*d1e879ecSMiri Korenblit  * @timestamp: timestamp of the last update.
39*d1e879ecSMiri Korenblit  * @window_start: per-mac, timestamp of the start of the current window. when
40*d1e879ecSMiri Korenblit  *	the window is over, the counters are reset.
41*d1e879ecSMiri Korenblit  * @pkts_counters: per-queue array voice/video packet counters
42*d1e879ecSMiri Korenblit  * @result: per-mac latest low-latency result
43*d1e879ecSMiri Korenblit  * @stopped: if true, ignore the requests to update the counters
44*d1e879ecSMiri Korenblit  */
45*d1e879ecSMiri Korenblit struct iwl_mld_low_latency {
46*d1e879ecSMiri Korenblit 	struct wiphy_delayed_work work;
47*d1e879ecSMiri Korenblit 	unsigned long timestamp;
48*d1e879ecSMiri Korenblit 	unsigned long window_start[NUM_MAC_INDEX_DRIVER];
49*d1e879ecSMiri Korenblit 	struct iwl_mld_low_latency_packets_counters *pkts_counters;
50*d1e879ecSMiri Korenblit 	bool result[NUM_MAC_INDEX_DRIVER];
51*d1e879ecSMiri Korenblit 	bool stopped;
52*d1e879ecSMiri Korenblit };
53*d1e879ecSMiri Korenblit 
54*d1e879ecSMiri Korenblit int iwl_mld_low_latency_init(struct iwl_mld *mld);
55*d1e879ecSMiri Korenblit void iwl_mld_low_latency_free(struct iwl_mld *mld);
56*d1e879ecSMiri Korenblit void iwl_mld_low_latency_restart_cleanup(struct iwl_mld *mld);
57*d1e879ecSMiri Korenblit void iwl_mld_vif_update_low_latency(struct iwl_mld *mld,
58*d1e879ecSMiri Korenblit 				    struct ieee80211_vif *vif,
59*d1e879ecSMiri Korenblit 				    bool low_latency,
60*d1e879ecSMiri Korenblit 				    enum iwl_mld_low_latency_cause cause);
61*d1e879ecSMiri Korenblit void iwl_mld_low_latency_update_counters(struct iwl_mld *mld,
62*d1e879ecSMiri Korenblit 					 struct ieee80211_hdr *hdr,
63*d1e879ecSMiri Korenblit 					 struct ieee80211_sta *sta,
64*d1e879ecSMiri Korenblit 					 u8 queue);
65*d1e879ecSMiri Korenblit void iwl_mld_low_latency_stop(struct iwl_mld *mld);
66*d1e879ecSMiri Korenblit void iwl_mld_low_latency_restart(struct iwl_mld *mld);
67*d1e879ecSMiri Korenblit 
68*d1e879ecSMiri Korenblit #endif /* __iwl_mld_low_latency_h__ */
69