1 /*
2  * Copyright (c) 2020, The Linux Foundation. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are
6  * met:
7  *     * Redistributions of source code must retain the above copyright
8  *       notice, this list of conditions and the following disclaimer.
9  *     * Redistributions in binary form must reproduce the above
10  *       copyright notice, this list of conditions and the following
11  *       disclaimer in the documentation and/or other materials provided
12  *       with the distribution.
13  *     * Neither the name of The Linux Foundation nor the names of its
14  *       contributors may be used to endorse or promote products derived
15  *       from this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29 
30 #ifndef WPA_DRIVER_COMMON_LIB
31 #define WPA_DRIVER_COMMON_LIB
32 
33 #include "android_drv.h"
34 #define OUI_LEN		3
35 #define MAX_CMD_LEN	32
36 #define MAC_ADDR_LEN	6
37 #define COUNTRY_LEN	4
38 
39 #define IEEE80211_HE_OPERATION_VHT_OPER_MASK 0x00004000
40 #define IEEE80211_HE_OPERATION_CO_LOC_BSS_MASK 0x00008000
41 #define IEEE80211_HE_OPERATION_6G_OPER_MASK 0x00020000
42 
43 #define HE_OPER_VHT_CH_WIDTH_OFFSET 0
44 #define HE_OPER_VHT_CENTER_FRQ_SEG0_OFFSET 1
45 #define HE_OPER_VHT_CENTER_FRQ_SEG1_OFFSET 2
46 #define HE_OPER_VHT_MAX_OFFSET 2
47 
48 #define HE_OPER_CO_LOCATED_MAX_OFFSET 0
49 
50 #define HE_OPER_6G_PARAMS_OFFSET 1
51 
52 #define HE_OPER_6G_PARAMS_SUB_CH_BW_MASK 0X03
53 
54 #define CHANNEL_BW_INVALID 255
55 
56 /* Define short names */
57 #define GET_STATION_INFO_AKM \
58 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_AKM
59 #define GET_STATION_INFO_HT_OPERATION \
60 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_HT_OPERATION
61 #define GET_STATION_INFO_VHT_OPERATION \
62 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_VHT_OPERATION
63 #define GET_STATION_INFO_REMOTE_LAST_RX_RATE \
64 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_LAST_RX_RATE
65 #define GET_STATION_INFO_REMOTE_SUPPORTED_MODE \
66 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_SUPPORTED_MODE
67 #define GET_STATION_INFO_REMOTE_CH_WIDTH \
68 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_CH_WIDTH
69 #define GET_STATION_INFO_REMOTE_RX_RETRY_COUNT \
70 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_RX_RETRY_COUNT
71 #define GET_STATION_INFO_REMOTE_RX_BC_MC_COUNT \
72 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_RX_BC_MC_COUNT
73 #define GET_STATION_INFO_BEACON_IES \
74 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_BEACON_IES
75 #define GET_STATION_INFO_DRIVER_DISCONNECT_REASON \
76 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_DRIVER_DISCONNECT_REASON
77 #define GET_STATION_INFO_ASSOC_REQ_IES \
78 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_ASSOC_REQ_IES
79 #define GET_STATION_INFO_HE_OPERATION \
80 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_HE_OPERATION
81 #define GET_STATION_INFO_MAX \
82 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_MAX
83 
84 #define GET_STA_INFO_MAC \
85 	QCA_WLAN_VENDOR_ATTR_GET_STA_INFO_MAC
86 #define GET_STA_INFO_RX_RETRY_COUNT \
87 	QCA_WLAN_VENDOR_ATTR_GET_STA_INFO_RX_RETRY_COUNT
88 #define GET_STA_INFO_RX_BC_MC_COUNT \
89 	QCA_WLAN_VENDOR_ATTR_GET_STA_INFO_RX_BC_MC_COUNT
90 #define GET_STA_INFO_TX_RETRY_SUCCEED \
91 	QCA_WLAN_VENDOR_ATTR_GET_STA_INFO_TX_RETRY_SUCCEED
92 #define GET_STA_INFO_TX_RETRY_EXHAUSTED \
93 	QCA_WLAN_VENDOR_ATTR_GET_STA_INFO_TX_RETRY_EXHAUSTED
94 #define GET_STA_INFO_TARGET_TX_TOTAL \
95 	QCA_WLAN_VENDOR_ATTR_GET_STA_INFO_TARGET_TX_TOTAL
96 #define GET_STA_INFO_TARGET_TX_RETRY \
97 	QCA_WLAN_VENDOR_ATTR_GET_STA_INFO_TARGET_TX_RETRY
98 #define GET_STA_INFO_TARGET_TX_RETRY_EXHAUSTED \
99 	QCA_WLAN_VENDOR_ATTR_GET_STA_INFO_TARGET_TX_RETRY_EXHAUSTED
100 #define GET_STA_INFO_ANI_LEVEL \
101 	QCA_WLAN_VENDOR_ATTR_GET_STA_INFO_ANI_LEVEL
102 #define GET_STA_INFO_LATEST_TX_RATE \
103 	QCA_WLAN_VENDOR_ATTR_GET_STA_INFO_LATEST_TX_RATE
104 #define GET_STA_INFO_LATEST_RIX \
105 	QCA_WLAN_VENDOR_ATTR_GET_STA_INFO_LATEST_RIX
106 #define GET_STA_INFO_TSF_OUT_OF_SYNC_COUNT \
107 	QCA_WLAN_VENDOR_ATTR_GET_STA_INFO_TSF_OUT_OF_SYNC_COUNT
108 #define GET_STA_INFO_LATEST_TX_POWER \
109 	QCA_WLAN_VENDOR_ATTR_GET_STA_INFO_LATEST_TX_POWER
110 #define GET_STA_INFO_ROAM_TRIGGER_REASON \
111 	QCA_WLAN_VENDOR_ATTR_GET_STA_INFO_ROAM_TRIGGER_REASON
112 #define GET_STA_INFO_TARGET_POWER_24G_1MBPS \
113 	QCA_WLAN_VENDOR_ATTR_GET_STA_INFO_TARGET_POWER_24G_1MBPS
114 #define GET_STA_INFO_TARGET_POWER_24G_6MBPS \
115 	QCA_WLAN_VENDOR_ATTR_GET_STA_INFO_TARGET_POWER_24G_6MBPS
116 #define GET_STA_INFO_TARGET_POWER_5G_6MBPS \
117 	QCA_WLAN_VENDOR_ATTR_GET_STA_INFO_TARGET_POWER_5G_6MBPS
118 #define GET_STA_INFO_ROAM_FAIL_REASON \
119 	QCA_WLAN_VENDOR_ATTR_GET_STA_INFO_ROAM_FAIL_REASON
120 #define GET_STA_INFO_ROAM_INVOKE_FAIL_REASON \
121 	QCA_WLAN_VENDOR_ATTR_GET_STA_INFO_ROAM_INVOKE_FAIL_REASON
122 #define GET_STA_INFO_MAX \
123 	QCA_WLAN_VENDOR_ATTR_GET_STA_INFO_MAX
124 
125 struct bss_info {
126 	uint8_t oui[OUI_LEN];
127 	char ssid[MAX_SSID_LEN + 1];
128 	int channel;
129 	int bw;
130 	int rssi;
131 	int data_rate;
132 	/* 0 : 11b, 1 : 11g, 2 : 11n, 3 : 11a, 4 : 11ac */
133 	int mode_80211;
134 	/* 0 : SISO, 1 : MIMO (2X2), 2 : MIMO (3X3), 3 : MIMO (4X4) */
135 	int snr;
136 	int noise;
137 	int akm;
138 	int roaming_count;
139 	/* 0: None, 1: 11k, 2: 11v, 3: 11kv */
140 	int mode_11kv;
141 	/* Bit mask value of 11kv support */
142 	int mask_11kv;
143 	u32 disc_reasn_code;
144 	u32 ani_level;
145 	u32 roam_trigger_reason;
146 	u32 roam_fail_reason;
147 	u32 roam_invoke_fail_reason;
148 	u32 tsf_out_of_sync_count;
149 	u32 latest_tx_power;
150 	u32 latest_tx_rate;
151 	u32 target_power_24g_1mbps;
152 	u32 target_power_24g_6mbps;
153 	u32 target_power_5g_6mbps;
154 };
155 
156 enum get_info_cmd {
157 	GETSTATSBSSINFO = 1,
158 	SETCELLSWITCHMODE = 2,
159 	GET_DRIVER_SUPPORTED_FEATURES = 3,
160 };
161 
162 struct resp_info {
163 	u32 subcmd;
164 	char *reply_buf;
165 	int reply_buf_len;
166 	enum get_info_cmd cmd_type;
167 	uint8_t mac_addr[MAC_ADDR_LEN];
168 	u32 freq;
169 	uint8_t country[COUNTRY_LEN];
170 };
171 
172 #define QCA_NL80211_VENDOR_SUBCMD_GET_STATION 121
173 
174 #ifndef CHANWIDTH_USE_HT
175 #define CHANWIDTH_USE_HT VHT_CHANWIDTH_USE_HT
176 #endif /* CHANWIDTH_USE_HT */
177 #ifndef CHANWIDTH_80MHZ
178 #define CHANWIDTH_80MHZ VHT_CHANWIDTH_80MHZ
179 #endif /* CHANWIDTH_80MHZ */
180 #ifndef CHANWIDTH_160MHZ
181 #define CHANWIDTH_160MHZ VHT_CHANWIDTH_160MHZ
182 #endif /* CHANWIDTH_160MHZ */
183 #ifndef CHANWIDTH_80P80MHZ
184 #define CHANWIDTH_80P80MHZ VHT_CHANWIDTH_80P80MHZ
185 #endif /* CHANWIDTH_80P80MHZ */
186 
187 /* HE channel widths */
188 
189 #define HE_CHANWIDTH_20MHZ     0
190 #define HE_CHANWIDTH_40MHZ     1
191 #define HE_CHANWIDTH_80MHZ     2
192 #define HE_CHANWIDTH_160MHZ    3
193 
194 /**
195  * enum qca_wlan_vendor_attr_get_station - Sub commands used by
196  * QCA_NL80211_VENDOR_SUBCMD_GET_STATION to get the corresponding
197  * station information. The information obtained through these
198  * commands signify the current info in connected state and
199  * latest cached information during the connected state , if queried
200  * when in disconnected state.
201  */
202 enum qca_wlan_vendor_attr_get_station {
203 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INVALID = 0,
204 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO,
205 	QCA_WLAN_VENDOR_ATTR_GET_STATION_ASSOC_FAIL_REASON,
206 	QCA_WLAN_VENDOR_ATTR_GET_STATION_REMOTE,
207 
208 	/* keep last */
209 	QCA_WLAN_VENDOR_ATTR_GET_STATION_AFTER_LAST,
210 	QCA_WLAN_VENDOR_ATTR_GET_STATION_MAX =
211 	QCA_WLAN_VENDOR_ATTR_GET_STATION_AFTER_LAST - 1,
212 };
213 
214 /**
215  * enum qca_wlan_vendor_attr_get_station_info - Station Info queried
216  * through QCA_NL80211_VENDOR_SUBCMD_GET_STATION.
217  */
218 enum qca_wlan_vendor_attr_get_station_info {
219 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_INVALID = 0,
220 	/*
221 	 * Get the standard NL attributes Nested with this attribute.
222 	 * Ex : Query BW , BITRATE32 , NSS , Signal , Noise of the Link -
223 	 * NL80211_ATTR_SSID / NL80211_ATTR_SURVEY_INFO (Connected Channel) /
224 	 * NL80211_ATTR_STA_INFO
225 	 */
226 	QCA_WLAN_VENDOR_ATTR_GET_STATION_LINK_INFO_ATTR,
227 	/*
228 	 * Get the standard NL attributes Nested with this attribute.
229 	 * Ex : Query HT/VHT Capability advertized by the AP.
230 	 * NL80211_ATTR_VHT_CAPABILITY / NL80211_ATTR_HT_CAPABILITY
231 	 */
232 	QCA_WLAN_VENDOR_ATTR_GET_STATION_AP_INFO_ATTR,
233 
234 	/* Number of successful Roam attempts before a disconnect,
235 	 * Unsigned 32 bit value
236 	 */
237 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_ROAM_COUNT,
238 
239 	/* Authentication Key Management Type used for the connected session.
240 	 * Signified by enum qca_wlan_auth_type
241 	 */
242 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_AKM,
243 
244 	/* 802.11 Mode of the connected Session,
245 	 * signified by enum qca_wlan_802_11_mode
246 	 */
247 	QCA_WLAN_VENDOR_ATTR_802_11_MODE,
248 
249 	/* HS20 Indication Element */
250 	QCA_WLAN_VENDOR_ATTR_GET_STATION_AP_INFO_HS20_INDICATION,
251 
252 	/* HT/VHT operation elements */
253 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_HT_OPERATION,
254 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_VHT_OPERATION,
255 
256 	/* Status Code Corresponding to the Association Failure.
257 	 * Unsigned 32 bit value
258 	 */
259 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_ASSSOC_FAIL_REASON,
260 
261 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_MAX_PHY_RATE,
262 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_TX_PACKETS,
263 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_TX_BYTES,
264 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_RX_PACKETS,
265 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_RX_BYTES,
266 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_LAST_TX_RATE,
267 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_LAST_RX_RATE,
268 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_WMM,
269 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_SUPPORTED_MODE,
270 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_AMPDU,
271 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_TX_STBC,
272 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_RX_STBC,
273 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_CH_WIDTH,
274 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_SGI_ENABLE,
275 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_PAD,
276 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_RX_RETRY_COUNT,
277 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_RX_BC_MC_COUNT,
278 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_TX_FAILURE,
279 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_AVG_RSSI_PER_CHAIN,
280 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_TX_RETRY_SUCCEED,
281 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_RX_LAST_PKT_RSSI,
282 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_TX_RETRY,
283 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_TX_RETRY_EXHAUST,
284 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_TX_TOTAL_FW,
285 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_TX_RETRY_FW,
286 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_TX_RETRY_EXHAUST_FW,
287 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_BEACON_IES,
288 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_DRIVER_DISCONNECT_REASON,
289 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_ASSOC_REQ_IES,
290 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_HE_OPERATION,
291 
292 	/* keep last */
293 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_AFTER_LAST,
294 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_MAX =
295 	QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_AFTER_LAST - 1,
296 };
297 
298 #define NOISE_FLOOR_DBM (96)
299 
300 #define WMI_MAX_CHAINS (3)
301 
302 enum qca_vendor_wlan_chan_width {
303 	QCA_VENDOR_WLAN_CHAN_WIDTH_20 = 0,
304 	QCA_VENDOR_WLAN_CHAN_WIDTH_40 = 1,
305 	QCA_VENDOR_WLAN_CHAN_WIDTH_80 = 2,
306 	QCA_VENDOR_WLAN_CHAN_WIDTH_80_80 = 3,
307 	QCA_VENDOR_WLAN_CHAN_WIDTH_160 = 4,
308 };
309 
310 enum qca_vendor_wlan_802_11_mode {
311 	QCA_VENDOR_WLAN_802_11_MODE_B = 0,
312 	QCA_VENDOR_WLAN_802_11_MODE_G = 1,
313 	QCA_VENDOR_WLAN_802_11_MODE_N = 2,
314 	QCA_VENDOR_WLAN_802_11_MODE_A = 3,
315 	QCA_VENDOR_WLAN_802_11_MODE_AC = 4,
316 	QCA_VENDOR_WLAN_802_11_MODE_AX = 5,
317 };
318 
319 enum qca_vendor_wlan_phy_mode {
320 	QCA_VENDOR_WLAN_PHY_MODE_LEGACY = 0,
321 	QCA_VENDOR_WLAN_PHY_MODE_HT = 1,
322 	QCA_VENDOR_WLAN_PHY_MODE_VHT = 2,
323 	QCA_VENDOR_WLAN_PHY_MODE_HE = 3,
324 };
325 
326 struct assoc_req_ie_flags {
327 	u8 ht_supported:1;
328 	u8 vht_supported:1;
329 	u8 he_supported:1;
330 };
331 
332 struct remote_sta_info {
333 	u8 num_sta;
334 	u8 num_request_vendor_sta_info;
335 	u8 num_received_vendor_sta_info;
336 	u8 num_request_nl80211_sta_info;
337 	u8 num_received_nl80211_sta_info;
338 	u8 mac_addr[MAC_ADDR_LEN];
339 	u32 rx_retry_pkts;
340 	u32 rx_bcmc_pkts;
341 	u16 cap;
342 	u32 freq;
343 	u8 bandwidth;
344 	s8 rssi;
345 	u32 data_rate;
346 	u32 dot11_mode;
347 	u32 reason;
348 	u8 supported_mode;
349 	u32 tx_pckts;
350 	u32 tx_failures;
351 	u32 tx_rate;
352 	s32 avg_rssi_per_chain[WMI_MAX_CHAINS];
353 	u32 tx_pkts_retried;
354 	u32 tx_pkts_retry_exhausted;
355 	s32 rx_lastpkt_rssi;
356 	u32 tx_pkts_total;
357 	u32 tx_pkts_retries;
358 	u32 tx_pkts_fw_total;
359 	u32 tx_pkts_fw_retries;
360 	u32 tx_pkts_fw_retry_exhausted;
361 	u32 ani_level;
362 	u32 roam_trigger_reason;
363 	u32 roam_fail_reason;
364 	u32 roam_invoke_fail_reason;
365 	u32 tsf_out_of_sync_count;
366 	u32 latest_tx_power;
367 	u32 latest_tx_rate;
368 	u32 latest_rix;
369 	u32 target_power_24g_1mbps;
370 	u32 target_power_24g_6mbps;
371 	u32 target_power_5g_6mbps;
372 	u8 *supp_op_classes; /* Supported Operating Classes element, if
373 			      * received, starting from the Length field */
374 	u8 *supp_channels;
375 	u32 supported_band;
376 	bool show_band;
377 	struct assoc_req_ie_flags flags;
378 	uint8_t country[COUNTRY_LEN];
379 };
380 
381 #endif
382