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