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