Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/contrib/dev/iwlwifi/mld/scan.h
48285 views
1
/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
2
/*
3
* Copyright (C) 2024-2025 Intel Corporation
4
*/
5
#ifndef __iwl_mld_scan_h__
6
#define __iwl_mld_scan_h__
7
8
int iwl_mld_alloc_scan_cmd(struct iwl_mld *mld);
9
10
int iwl_mld_regular_scan_start(struct iwl_mld *mld, struct ieee80211_vif *vif,
11
struct cfg80211_scan_request *req,
12
struct ieee80211_scan_ies *ies);
13
14
void iwl_mld_int_mlo_scan(struct iwl_mld *mld, struct ieee80211_vif *vif);
15
16
void iwl_mld_handle_scan_iter_complete_notif(struct iwl_mld *mld,
17
struct iwl_rx_packet *pkt);
18
19
int iwl_mld_scan_stop(struct iwl_mld *mld, int type, bool notify);
20
21
int iwl_mld_sched_scan_start(struct iwl_mld *mld,
22
struct ieee80211_vif *vif,
23
struct cfg80211_sched_scan_request *req,
24
struct ieee80211_scan_ies *ies,
25
int type);
26
27
void iwl_mld_handle_match_found_notif(struct iwl_mld *mld,
28
struct iwl_rx_packet *pkt);
29
30
void iwl_mld_handle_scan_complete_notif(struct iwl_mld *mld,
31
struct iwl_rx_packet *pkt);
32
33
int iwl_mld_mac80211_get_survey(struct ieee80211_hw *hw, int idx,
34
struct survey_info *survey);
35
36
void iwl_mld_handle_channel_survey_notif(struct iwl_mld *mld,
37
struct iwl_rx_packet *pkt);
38
39
#define WFA_TPC_IE_LEN 9
40
41
static inline int iwl_mld_scan_max_template_size(void)
42
{
43
#define MAC_HDR_LEN 24
44
#define DS_IE_LEN 3
45
#define SSID_IE_LEN 2
46
47
/* driver create the 802.11 header, WFA TPC IE, DS parameter and SSID IE */
48
#define DRIVER_TOTAL_IES_LEN \
49
(MAC_HDR_LEN + WFA_TPC_IE_LEN + DS_IE_LEN + SSID_IE_LEN)
50
51
BUILD_BUG_ON(SCAN_OFFLOAD_PROBE_REQ_SIZE < DRIVER_TOTAL_IES_LEN);
52
53
return SCAN_OFFLOAD_PROBE_REQ_SIZE - DRIVER_TOTAL_IES_LEN;
54
}
55
56
void iwl_mld_report_scan_aborted(struct iwl_mld *mld);
57
58
enum iwl_mld_scan_status {
59
IWL_MLD_SCAN_NONE = 0,
60
IWL_MLD_SCAN_REGULAR = BIT(0),
61
IWL_MLD_SCAN_SCHED = BIT(1),
62
IWL_MLD_SCAN_NETDETECT = BIT(2),
63
IWL_MLD_SCAN_INT_MLO = BIT(3),
64
};
65
66
/* enum iwl_mld_pass_all_sched_results_states - Defines the states for
67
* handling/passing scheduled scan results to mac80211
68
* @SCHED_SCAN_PASS_ALL_STATE_DISABLED: Don't pass all scan results, only when
69
* a match found.
70
* @SCHED_SCAN_PASS_ALL_STATE_ENABLED: Pass all scan results is enabled
71
* (no filtering).
72
* @SCHED_SCAN_PASS_ALL_STATE_FOUND: A scan result is found, pass it on the
73
* next scan iteration complete notification.
74
*/
75
enum iwl_mld_pass_all_sched_results_states {
76
SCHED_SCAN_PASS_ALL_STATE_DISABLED,
77
SCHED_SCAN_PASS_ALL_STATE_ENABLED,
78
SCHED_SCAN_PASS_ALL_STATE_FOUND,
79
};
80
81
/**
82
* enum iwl_mld_traffic_load - Levels of traffic load
83
*
84
* @IWL_MLD_TRAFFIC_LOW: low traffic load
85
* @IWL_MLD_TRAFFIC_MEDIUM: medium traffic load
86
* @IWL_MLD_TRAFFIC_HIGH: high traffic load
87
*/
88
enum iwl_mld_traffic_load {
89
IWL_MLD_TRAFFIC_LOW,
90
IWL_MLD_TRAFFIC_MEDIUM,
91
IWL_MLD_TRAFFIC_HIGH,
92
};
93
94
/**
95
* struct iwl_mld_scan - Scan data
96
* @status: scan status, a combination of %enum iwl_mld_scan_status,
97
* reflects the %scan.uid_status array.
98
* @uid_status: array to track the scan status per uid.
99
* @start_tsf: start time of last scan in TSF of the link that requested
100
* the scan.
101
* @last_ebs_failed: true if the last EBS (Energy Based Scan) failed.
102
* @pass_all_sched_res: see %enum iwl_mld_pass_all_sched_results_states.
103
* @fw_link_id: the current (regular) scan fw link id, used by scan
104
* complete notif.
105
* @traffic_load: traffic load related data
106
* @traffic_load.last_stats_ts_usec: The timestamp of the last statistics
107
* notification, used to calculate the elapsed time between two
108
* notifications and determine the traffic load
109
* @traffic_load.status: The current traffic load status, see
110
* &enum iwl_mld_traffic_load
111
* @cmd_size: size of %cmd.
112
* @cmd: pointer to scan cmd buffer (allocated once in op mode start).
113
* @last_6ghz_passive_jiffies: stores the last 6GHz passive scan time
114
* in jiffies.
115
* @last_start_time_jiffies: stores the last start time in jiffies
116
* (interface up/reset/resume).
117
* @last_mlo_scan_time: start time of the last MLO scan in nanoseconds since
118
* boot.
119
*/
120
struct iwl_mld_scan {
121
/* Add here fields that need clean up on restart */
122
struct_group(zeroed_on_hw_restart,
123
unsigned int status;
124
u32 uid_status[IWL_MAX_UMAC_SCANS];
125
u64 start_tsf;
126
bool last_ebs_failed;
127
enum iwl_mld_pass_all_sched_results_states pass_all_sched_res;
128
u8 fw_link_id;
129
struct {
130
u32 last_stats_ts_usec;
131
enum iwl_mld_traffic_load status;
132
} traffic_load;
133
);
134
/* And here fields that survive a fw restart */
135
size_t cmd_size;
136
void *cmd;
137
unsigned long last_6ghz_passive_jiffies;
138
unsigned long last_start_time_jiffies;
139
u64 last_mlo_scan_time;
140
};
141
142
/**
143
* struct iwl_mld_survey_channel - per-channel survey information
144
*
145
* Driver version of &struct survey_info with just the data we want to report.
146
*
147
* @time: time in ms the radio was on the channel
148
* @time_busy: time in ms the channel was sensed busy
149
* @noise: channel noise in dBm
150
*/
151
struct iwl_mld_survey_channel {
152
u32 time;
153
u32 time_busy;
154
s8 noise;
155
};
156
157
/**
158
* struct iwl_mld_survey - survey information
159
*
160
* Survey information for all available channels.
161
*
162
* @bands: per-band array for per-channel survey data, points into @channels
163
* @n_channels: Number of @channels entries that are allocated
164
* @channels: per-channel information
165
*/
166
struct iwl_mld_survey {
167
struct iwl_mld_survey_channel *bands[NUM_NL80211_BANDS];
168
169
int n_channels;
170
struct iwl_mld_survey_channel channels[] __counted_by(n_channels);
171
};
172
173
#endif /* __iwl_mld_scan_h__ */
174
175