1 /*
2  * Copyright (c) 2012-2021 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for
6  * any purpose with or without fee is hereby granted, provided that the
7  * above copyright notice and this permission notice appear in all
8  * copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17  * PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 #ifndef __WEXT_IW_H__
21 #define __WEXT_IW_H__
22 
23 #include <linux/version.h>
24 #include <linux/module.h>
25 #include <linux/netdevice.h>
26 #include <linux/wireless.h>
27 #include <net/iw_handler.h>
28 #include <linux/timer.h>
29 #include "qdf_event.h"
30 
31 struct hdd_context;
32 struct sap_config;
33 
34 /*
35  * order of parameters in addTs private ioctl
36  */
37 #define HDD_WLAN_WMM_PARAM_HANDLE                       0
38 #define HDD_WLAN_WMM_PARAM_TID                          1
39 #define HDD_WLAN_WMM_PARAM_DIRECTION                    2
40 #define HDD_WLAN_WMM_PARAM_APSD                         3
41 #define HDD_WLAN_WMM_PARAM_USER_PRIORITY                4
42 #define HDD_WLAN_WMM_PARAM_NOMINAL_MSDU_SIZE            5
43 #define HDD_WLAN_WMM_PARAM_MAXIMUM_MSDU_SIZE            6
44 #define HDD_WLAN_WMM_PARAM_MINIMUM_DATA_RATE            7
45 #define HDD_WLAN_WMM_PARAM_MEAN_DATA_RATE               8
46 #define HDD_WLAN_WMM_PARAM_PEAK_DATA_RATE               9
47 #define HDD_WLAN_WMM_PARAM_MAX_BURST_SIZE              10
48 #define HDD_WLAN_WMM_PARAM_MINIMUM_PHY_RATE            11
49 #define HDD_WLAN_WMM_PARAM_SURPLUS_BANDWIDTH_ALLOWANCE 12
50 #define HDD_WLAN_WMM_PARAM_SERVICE_INTERVAL            13
51 #define HDD_WLAN_WMM_PARAM_SUSPENSION_INTERVAL         14
52 #define HDD_WLAN_WMM_PARAM_BURST_SIZE_DEFN             15
53 #define HDD_WLAN_WMM_PARAM_ACK_POLICY                  16
54 #define HDD_WLAN_WMM_PARAM_INACTIVITY_INTERVAL         17
55 #define HDD_WLAN_WMM_PARAM_MAX_SERVICE_INTERVAL        18
56 #define HDD_WLAN_WMM_PARAM_COUNT                       19
57 
58 #define MHZ 6
59 
60 #define WE_MAX_STR_LEN                                 IW_PRIV_SIZE_MASK
61 #define WLAN_HDD_UI_BAND_AUTO                          0
62 #define WLAN_HDD_UI_BAND_5_GHZ                         1
63 #define WLAN_HDD_UI_BAND_2_4_GHZ                       2
64 
65 enum hdd_wlan_wmm_direction {
66 	HDD_WLAN_WMM_DIRECTION_UPSTREAM = 0,
67 	HDD_WLAN_WMM_DIRECTION_DOWNSTREAM = 1,
68 	HDD_WLAN_WMM_DIRECTION_BIDIRECTIONAL = 2,
69 };
70 
71 enum hdd_wlan_wmm_power_save {
72 	HDD_WLAN_WMM_POWER_SAVE_LEGACY = 0,
73 	HDD_WLAN_WMM_POWER_SAVE_UAPSD = 1,
74 };
75 
76 typedef enum {
77 	/* TSPEC/re-assoc done, async */
78 	HDD_WLAN_WMM_STATUS_SETUP_SUCCESS = 0,
79 	/* no need to setup TSPEC since ACM=0 and no UAPSD desired,
80 	 * sync + async
81 	 */
82 	HDD_WLAN_WMM_STATUS_SETUP_SUCCESS_NO_ACM_NO_UAPSD = 1,
83 	/* no need to setup TSPEC since ACM=0 and UAPSD already exists,
84 	 * sync + async
85 	 */
86 	HDD_WLAN_WMM_STATUS_SETUP_SUCCESS_NO_ACM_UAPSD_EXISTING = 2,
87 	/* TSPEC result pending, sync */
88 	HDD_WLAN_WMM_STATUS_SETUP_PENDING = 3,
89 	/* TSPEC/re-assoc failed, sync + async */
90 	HDD_WLAN_WMM_STATUS_SETUP_FAILED = 4,
91 	/* Request rejected due to invalid params, sync + async */
92 	HDD_WLAN_WMM_STATUS_SETUP_FAILED_BAD_PARAM = 5,
93 	/* TSPEC request rejected since AP!=QAP, sync */
94 	HDD_WLAN_WMM_STATUS_SETUP_FAILED_NO_WMM = 6,
95 
96 	/* TSPEC modification/re-assoc successful, async */
97 	HDD_WLAN_WMM_STATUS_MODIFY_SUCCESS = 7,
98 	/* TSPEC modification a no-op since ACM=0 and
99 	 * no change in UAPSD, sync + async
100 	 */
101 	HDD_WLAN_WMM_STATUS_MODIFY_SUCCESS_NO_ACM_NO_UAPSD = 8,
102 	/* TSPEC modification a no-op since ACM=0 and
103 	 * requested U-APSD already exists, sync + async
104 	 */
105 	HDD_WLAN_WMM_STATUS_MODIFY_SUCCESS_NO_ACM_UAPSD_EXISTING = 9,
106 	/* TSPEC result pending, sync */
107 	HDD_WLAN_WMM_STATUS_MODIFY_PENDING = 10,
108 	/* TSPEC modification failed, prev TSPEC in effect, sync + async */
109 	HDD_WLAN_WMM_STATUS_MODIFY_FAILED = 11,
110 	/* TSPEC modification request rejected due to invalid params,
111 	 * sync + async
112 	 */
113 	HDD_WLAN_WMM_STATUS_MODIFY_FAILED_BAD_PARAM = 12,
114 
115 	/* TSPEC release successful, sync and also async */
116 	HDD_WLAN_WMM_STATUS_RELEASE_SUCCESS = 13,
117 	/* TSPEC release pending, sync */
118 	HDD_WLAN_WMM_STATUS_RELEASE_PENDING = 14,
119 	/* TSPEC release failed, sync + async */
120 	HDD_WLAN_WMM_STATUS_RELEASE_FAILED = 15,
121 	/* TSPEC release rejected due to invalid params, sync */
122 	HDD_WLAN_WMM_STATUS_RELEASE_FAILED_BAD_PARAM = 16,
123 	/* TSPEC modified due to the mux'ing of requests on ACs, async */
124 
125 	HDD_WLAN_WMM_STATUS_MODIFIED = 17,
126 	/* TSPEC revoked by AP, async */
127 	HDD_WLAN_WMM_STATUS_LOST = 18,
128 	/* some internal failure like memory allocation failure, etc, sync */
129 	HDD_WLAN_WMM_STATUS_INTERNAL_FAILURE = 19,
130 
131 	/* U-APSD failed during setup but OTA setup (whether TSPEC exchange or
132 	 * re-assoc) was done so app should release this QoS, async
133 	 */
134 	HDD_WLAN_WMM_STATUS_SETUP_UAPSD_SET_FAILED = 20,
135 	/* U-APSD failed during modify, but OTA setup (whether TSPEC exchange or
136 	 * re-assoc) was done so app should release this QoS, async
137 	 */
138 	HDD_WLAN_WMM_STATUS_MODIFY_UAPSD_SET_FAILED = 21
139 } hdd_wlan_wmm_status_e;
140 
141 /** Enable 11d */
142 #define ENABLE_11D  1
143 
144 /** Disable 11d */
145 #define DISABLE_11D 0
146 
147 #define HDD_RTSCTS_EN_MASK                  0xF
148 #define HDD_RTSCTS_ENABLE                   1
149 #define HDD_CTS_ENABLE                      2
150 
151 #define HDD_AUTO_RATE_SGI    0x8
152 
153 /* Packet Types. */
154 #define WLAN_KEEP_ALIVE_UNSOLICIT_ARP_RSP     2
155 #define WLAN_KEEP_ALIVE_NULL_PKT              1
156 
157 /*
158  * Defines for fw_test command
159  */
160 #define HDD_FWTEST_PARAMS 3
161 #define HDD_FWTEST_SU_PARAM_ID 53
162 #define HDD_FWTEST_MU_PARAM_ID 2
163 #define HDD_FWTEST_SU_DEFAULT_VALUE 100
164 #define HDD_FWTEST_MU_DEFAULT_VALUE 40
165 #define HDD_FWTEST_MAX_VALUE 500
166 
167 #ifdef WLAN_WEXT_SUPPORT_ENABLE
168 /**
169  * hdd_register_wext() - register wext context
170  * @dev: net device handle
171  *
172  * Registers wext interface context for a given net device
173  *
174  * Returns: None
175  */
176 void hdd_register_wext(struct net_device *dev);
177 
178 /**
179  * hdd_wext_unregister() - unregister wext context with rtnl lock dependency
180  * @dev: net device from which wireless extensions are being unregistered
181  * @rtnl_held: flag which indicates if caller is holding the rtnl_lock
182  *
183  * Unregisters wext context for a given net device. This behaves the
184  * same as hdd_unregister_wext() except it does not take the rtnl_lock
185  * if the caller is already holding it.
186  *
187  * Returns: None
188  */
189 void hdd_wext_unregister(struct net_device *dev,
190 			 bool rtnl_held);
191 
192 static inline
hdd_wext_send_event(struct net_device * dev,unsigned int cmd,union iwreq_data * wrqu,const char * extra)193 void hdd_wext_send_event(struct net_device *dev, unsigned int cmd,
194 			 union iwreq_data *wrqu, const char *extra)
195 {
196 	wireless_send_event(dev, cmd, wrqu, extra);
197 }
198 
199 /**
200  * hdd_wlan_get_stats() - Get txrx stats in SAP mode
201  * @link_info: Link info pointer in HDD adapter
202  * @length:   Size of the data copied
203  * @buffer:   Pointer to char buffer.
204  * @buf_len:  Length of the char buffer.
205  *
206  * This function called when the "iwpriv wlan0 get_stats" command is given.
207  * It used to collect the txrx stats when the device is configured in SAP mode.
208  *
209  * Return - none
210  */
211 void hdd_wlan_get_stats(struct wlan_hdd_link_info *link_info, uint16_t *length,
212 			char *buffer, uint16_t buf_len);
213 
214 void hdd_wlan_list_fw_profile(uint16_t *length,
215 			      char *buffer, uint16_t buf_len);
216 
217 int iw_set_var_ints_getnone(struct net_device *dev,
218 			   struct iw_request_info *info,
219 			   union iwreq_data *wrqu, char *extra);
220 
221 int iw_set_three_ints_getnone(struct net_device *dev,
222 			     struct iw_request_info *info,
223 			     union iwreq_data *wrqu, char *extra);
224 
225 int hdd_priv_get_data(struct iw_point *p_priv_data,
226 		     union iwreq_data *wrqu);
227 
228 void *mem_alloc_copy_from_user_helper(const void *wrqu_data, size_t len);
229 
230 /**
231  * hdd_we_set_short_gi() - Set adapter Short GI
232  * @link_info: Link info pointer in HDD adapter
233  * @sgi: new sgi value
234  *
235  * Return: 0 on success, negative errno on failure
236  */
237 int hdd_we_set_short_gi(struct wlan_hdd_link_info *link_info, int sgi);
238 
239 /**
240  * hdd_assemble_rate_code() - assemble rate code to be sent to FW
241  * @preamble: rate preamble
242  * @nss: number of streams
243  * @rate: rate index
244  *
245  * Rate code assembling is different for targets which are 11ax capable.
246  * Check for the target support and assemble the rate code accordingly.
247  *
248  * Return: assembled rate code
249  */
250 int hdd_assemble_rate_code(uint8_t preamble, uint8_t nss, uint8_t rate);
251 
252 /**
253  * hdd_set_11ax_rate() - set 11ax rate
254  * @adapter: adapter being modified
255  * @value: new 11ax rate code
256  * @sap_config: pointer to SAP config to check HW mode
257  *              this will be NULL for call from STA persona
258  *
259  * Return: 0 on success, negative errno on failure
260  */
261 int hdd_set_11ax_rate(struct hdd_adapter *adapter, int value,
262 		      struct sap_config *sap_config);
263 
264 /**
265  * hdd_we_update_phymode() - handle change in PHY mode
266  * @link_info: Link info pointer in HDD adapter.
267  * @new_phymode: new PHY mode for the device
268  *
269  * This function is called when the device is set to a new PHY mode.
270  * It takes a holistic look at the desired PHY mode along with the
271  * configured capabilities of the driver and the reported capabilities
272  * of the hardware in order to correctly configure all PHY-related
273  * parameters.
274  *
275  * Return: 0 on success, negative errno value on error
276  */
277 int hdd_we_update_phymode(struct wlan_hdd_link_info *link_info,
278 			  int new_phymode);
279 
280 /**
281  * wlan_hdd_set_btcoex_mode() - set BTCoex Mode
282  * @link_info: Link info pointer in HDD adapter
283  * @value: new BTCoex mode for the adapter
284  *
285  * This function is called to set a BTCoex Operation Mode
286  *
287  * Return: 0 on success, negative errno value on error
288  */
289 int wlan_hdd_set_btcoex_mode(struct wlan_hdd_link_info *link_info, int value);
290 
291 /**
292  * wlan_hdd_set_btcoex_rssi_threshold() - set RSSI threshold
293  * @link_info: Link info pointer in HDD adapter
294  * @value: new RSSI Threshold for the adapter
295  *
296  * This function is called to set a new RSSI threshold for
297  * change of Coex operating mode from TDD to FDD
298  *
299  * Return: 0 on success, negative errno value on error
300  */
301 int wlan_hdd_set_btcoex_rssi_threshold(struct wlan_hdd_link_info *link_info,
302 				       int value);
303 
304 struct iw_request_info;
305 
306 /**
307  * hdd_check_private_wext_control() - Check to see if private
308  *      wireless extensions ioctls are allowed
309  * @hdd_ctx: Global HDD context
310  * @info: Wireless extensions ioctl information passed by the kernel
311  *
312  * This function will examine the "private_wext_control" configuration
313  * item to determine whether or not private wireless extensions ioctls
314  * are allowed.
315  *
316  * Return: 0 if the ioctl is allowed to be processed, -ENOTSUPP if the
317  * ioctls have been disabled. Note that in addition to returning
318  * status, this function will log a message if the ioctls are disabled
319  * or deprecated.
320  */
321 int hdd_check_private_wext_control(struct hdd_context *hdd_ctx,
322 				   struct iw_request_info *info);
323 
324 #ifdef CONFIG_DP_TRACE
325 void hdd_set_dump_dp_trace(uint16_t cmd_type, uint16_t count);
326 #else
327 static inline
hdd_set_dump_dp_trace(uint16_t cmd_type,uint16_t count)328 void hdd_set_dump_dp_trace(uint16_t cmd_type, uint16_t count) {}
329 #endif
330 #else /* WLAN_WEXT_SUPPORT_ENABLE */
hdd_register_wext(struct net_device * dev)331 static inline void hdd_register_wext(struct net_device *dev)
332 {
333 }
334 
hdd_wext_unregister(struct net_device * dev,bool rtnl_locked)335 static inline void hdd_wext_unregister(struct net_device *dev,
336 				       bool rtnl_locked)
337 {
338 }
339 
340 static inline
hdd_wext_send_event(struct net_device * dev,unsigned int cmd,union iwreq_data * wrqu,const char * extra)341 void hdd_wext_send_event(struct net_device *dev, unsigned int cmd,
342 			 union iwreq_data *wrqu, const char *extra)
343 {
344 }
345 #endif /* WLAN_WEXT_SUPPORT_ENABLE */
346 
347 #if defined(WLAN_WEXT_SUPPORT_ENABLE) && defined(HASTINGS_BT_WAR)
348 int hdd_hastings_bt_war_enable_fw(struct hdd_context *hdd_ctx);
349 int hdd_hastings_bt_war_disable_fw(struct hdd_context *hdd_ctx);
350 #else
351 static inline
hdd_hastings_bt_war_enable_fw(struct hdd_context * hdd_ctx)352 int hdd_hastings_bt_war_enable_fw(struct hdd_context *hdd_ctx)
353 {
354 	return -ENOTSUPP;
355 }
356 
357 static inline
hdd_hastings_bt_war_disable_fw(struct hdd_context * hdd_ctx)358 int hdd_hastings_bt_war_disable_fw(struct hdd_context *hdd_ctx)
359 {
360 	return -ENOTSUPP;
361 }
362 
363 #endif
364 
365 #endif /* __WEXT_IW_H__ */
366