1 /*
2  * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2022 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 /*
21  * DOC: contains ocb structure definitions
22  */
23 
24 #ifndef _WLAN_OCB_STRUCTS_H_
25 #define _WLAN_OCB_STRUCTS_H_
26 #include <qdf_status.h>
27 #include "qca_vendor.h"
28 
29 /* Don't add the RX stats header to packets received on this channel */
30 #define OCB_CHANNEL_FLAG_DISABLE_RX_STATS_HDR	(1 << 0)
31 
32 /* The size of the utc time in bytes. */
33 #define OCB_SIZE_UTC_TIME                       (10)
34 
35 /* The size of the utc time error in bytes. */
36 #define OCB_SIZE_UTC_TIME_ERROR                 (5)
37 
38 /**
39  * struct ocb_utc_param - parameters to set UTC time
40  * @vdev_id: vdev id
41  * @utc_time: number of nanoseconds from Jan 1st 1958
42  * @time_error: the error in the UTC time. All 1's for unknown
43  */
44 struct ocb_utc_param {
45 	uint32_t vdev_id;
46 	uint8_t utc_time[OCB_SIZE_UTC_TIME];
47 	uint8_t time_error[OCB_SIZE_UTC_TIME_ERROR];
48 };
49 
50 /**
51  * struct ocb_timing_advert_param - parameters to start/stop
52  *  timing advertisement
53  * @vdev_id: vdev id
54  * @chan_freq: frequency on which to advertise (unit in Mhz)
55  * @repeat_rate: the number of times it will send TA in 5 seconds
56  * @timestamp_offset: offset of the timestamp field in the TA frame
57  * @time_value_offset: offset of the time_value field in the TA frame
58  * @template_length: size in bytes of the TA frame
59  * @template_value: the TA frame
60  */
61 struct ocb_timing_advert_param {
62 	uint32_t vdev_id;
63 	uint32_t chan_freq;
64 	uint32_t repeat_rate;
65 	uint32_t timestamp_offset;
66 	uint32_t time_value_offset;
67 	uint32_t template_length;
68 	uint8_t *template_value;
69 };
70 
71 /**
72  * struct ocb_dcc_get_stats_param - parameters to get DCC stats
73  * @vdev_id: vdev id
74  * @channel_count: number of dcc channels
75  * @request_array_len: size in bytes of the request array
76  * @request_array: the request array
77  */
78 struct ocb_dcc_get_stats_param {
79 	uint32_t vdev_id;
80 	uint32_t channel_count;
81 	uint32_t request_array_len;
82 	void *request_array;
83 };
84 
85 /**
86  * struct ocb_dcc_update_ndl_param - parameters to update NDL
87  * @vdev_id: vdev id
88  * @channel_count: number of channels to be updated
89  * @dcc_ndl_chan_list_len: size in bytes of the ndl_chan array
90  * @dcc_ndl_chan_list: the ndl_chan array
91  * @dcc_ndl_active_state_list_len: size in bytes of the active_state array
92  * @dcc_ndl_active_state_list: the active state array
93  */
94 struct ocb_dcc_update_ndl_param {
95 	uint32_t vdev_id;
96 	uint32_t channel_count;
97 	uint32_t dcc_ndl_chan_list_len;
98 	void *dcc_ndl_chan_list;
99 	uint32_t dcc_ndl_active_state_list_len;
100 	void *dcc_ndl_active_state_list;
101 };
102 
103 /**
104  * struct ocb_config_schdl - parameters for channel scheduling
105  * @chan_freq: frequency of the channel (unit in Mhz)
106  * @total_duration: duration of the schedule (unit in ms)
107  * @guard_interval: guard interval on the start of the schedule (unit in ms)
108  */
109 struct ocb_config_schdl {
110 	uint32_t chan_freq;
111 	uint32_t total_duration;
112 	uint32_t guard_interval;
113 };
114 
115 /**
116  * struct ocb_wmm_param - WMM parameters
117  * @aifsn: AIFS number
118  * @cwmin: value of CWmin
119  * @cwmax: value of CWmax
120  */
121 struct ocb_wmm_param {
122 	uint8_t aifsn;
123 	uint8_t cwmin;
124 	uint8_t cwmax;
125 };
126 
127 /**
128  * struct ocb_config_chan - parameters to configure a channel
129  * @chan_freq: frequency of the channel (unit in MHz)
130  * @bandwidth: bandwidth of the channel, either 10 or 20 MHz
131  * @mac_address: MAC address assigned to this channel
132  * @qos_params: QoS parameters
133  * @max_pwr: maximum transmit power of the channel (dBm)
134  * @min_pwr: minimum transmit power of the channel (dBm)
135  * @reg_pwr: maximum transmit power specified by the regulatory domain (dBm)
136  * @antenna_max: maximum antenna gain specified by the regulatory domain (dB)
137  * @flags: bit0: 0 enable RX stats on this channel; 1 disable RX stats
138  *         bit1: flag to indicate TSF expiry time in TX control.
139  *               0 relative time is used. 1 absolute time is used.
140  *         bit2: Frame mode from user layer.
141  *               0 for 802.3 frame, 1 for 802.11 frame.
142  * @ch_mode: channel mode
143  */
144 struct ocb_config_chan {
145 	uint32_t chan_freq;
146 	uint32_t bandwidth;
147 	struct qdf_mac_addr mac_address;
148 	struct ocb_wmm_param qos_params[QCA_WLAN_AC_ALL];
149 	uint32_t max_pwr;
150 	uint32_t min_pwr;
151 	uint8_t reg_pwr;
152 	uint8_t antenna_max;
153 	uint16_t flags;
154 	uint32_t ch_mode;
155 };
156 
157 /**
158  * struct ocb_config - parameters for OCB vdev config
159  * @vdev_id: vdev id
160  * @channel_count: number of channels
161  * @schedule_size: size of the channel schedule
162  * @flags: reserved
163  * @channels: array of OCB channels
164  * @schedule: array of OCB schedule elements
165  * @dcc_ndl_chan_list_len: size in bytes of the ndl_chan array
166  * @dcc_ndl_chan_list: array of dcc channel info
167  * @dcc_ndl_active_state_list_len: size in bytes of the active state array
168  * @dcc_ndl_active_state_list: array of active states
169  */
170 struct ocb_config {
171 	uint32_t vdev_id;
172 	uint32_t channel_count;
173 	uint32_t schedule_size;
174 	uint32_t flags;
175 	struct ocb_config_chan *channels;
176 	struct ocb_config_schdl *schedule;
177 	uint32_t dcc_ndl_chan_list_len;
178 	void *dcc_ndl_chan_list;
179 	uint32_t dcc_ndl_active_state_list_len;
180 	void *dcc_ndl_active_state_list;
181 };
182 
183 /**
184  * enum ocb_channel_config_status - ocb config status
185  * @OCB_CHANNEL_CONFIG_SUCCESS: success
186  * @OCB_CHANNEL_CONFIG_FAIL: failure
187  * @OCB_CHANNEL_CONFIG_STATUS_MAX: place holder, not a real status
188  */
189 enum ocb_channel_config_status {
190 	OCB_CHANNEL_CONFIG_SUCCESS = 0,
191 	OCB_CHANNEL_CONFIG_FAIL,
192 	OCB_CHANNEL_CONFIG_STATUS_MAX
193 };
194 
195 /**
196  * struct ocb_set_config_response - ocb config status
197  * @status: response status. OCB_CHANNEL_CONFIG_SUCCESS for success.
198  */
199 struct ocb_set_config_response {
200 	enum ocb_channel_config_status status;
201 };
202 
203 /**
204  * struct ocb_get_tsf_timer_response - TSF timer response
205  * @vdev_id: vdev id
206  * @timer_high: higher 32-bits of the timer
207  * @timer_low: lower 32-bits of the timer
208  */
209 struct ocb_get_tsf_timer_response {
210 	uint32_t vdev_id;
211 	uint32_t timer_high;
212 	uint32_t timer_low;
213 };
214 
215 /**
216  * struct ocb_get_tsf_timer_param - parameters to get tsf timer
217  * @vdev_id: vdev id
218  */
219 struct ocb_get_tsf_timer_param {
220 	uint32_t vdev_id;
221 };
222 
223 /**
224  * struct ocb_dcc_get_stats_response - DCC stats response
225  * @vdev_id: vdev id
226  * @num_channels: number of dcc channels
227  * @channel_stats_array_len: size in bytes of the stats array
228  * @channel_stats_array: the stats array
229  */
230 struct ocb_dcc_get_stats_response {
231 	uint32_t vdev_id;
232 	uint32_t num_channels;
233 	uint32_t channel_stats_array_len;
234 	void *channel_stats_array;
235 };
236 
237 /**
238  * struct ocb_dcc_clear_stats_param - parameters to clear DCC stats
239  * @vdev_id: vdev id
240  * @dcc_stats_bitmap: bitmap of clear option
241  */
242 struct ocb_dcc_clear_stats_param {
243 	uint32_t vdev_id;
244 	uint32_t dcc_stats_bitmap;
245 };
246 
247 /**
248  * struct ocb_dcc_update_ndl_response - NDP update response
249  * @vdev_id: vdev id
250  * @status: response status
251  */
252 struct ocb_dcc_update_ndl_response {
253 	uint32_t vdev_id;
254 	uint32_t status;
255 };
256 
257 /**
258  * struct wlan_ocb_rx_ops - structure containing rx ops for OCB
259  * @ocb_set_config_status: fp to get channel config status
260  * @ocb_tsf_timer: fp to get TSF timer
261  * @ocb_dcc_ndl_update: fp to get NDL update status
262  * @ocb_dcc_stats_indicate: fp to get DCC stats
263  */
264 struct wlan_ocb_rx_ops {
265 	QDF_STATUS (*ocb_set_config_status)(struct wlan_objmgr_psoc *psoc,
266 					    uint32_t status);
267 	QDF_STATUS (*ocb_tsf_timer)(struct wlan_objmgr_psoc *psoc,
268 				struct ocb_get_tsf_timer_response *response);
269 	QDF_STATUS (*ocb_dcc_ndl_update)(struct wlan_objmgr_psoc *psoc,
270 				struct ocb_dcc_update_ndl_response *resp);
271 	QDF_STATUS (*ocb_dcc_stats_indicate)(struct wlan_objmgr_psoc *psoc,
272 		struct ocb_dcc_get_stats_response *response, bool indicate);
273 };
274 
275 /**
276  * struct wlan_ocb_tx_ops - structures containing tx ops for OCB
277  * @ocb_set_config: fp to set channel config
278  * @ocb_set_utc_time: fp to set utc time
279  * @ocb_start_timing_advert: fp to start timing advertisement
280  * @ocb_stop_timing_advert: fp to stop timing advertisement
281  * @ocb_get_tsf_timer: fp to get tsf timer
282  * @ocb_dcc_get_stats: fp to get DCC stats
283  * @ocb_dcc_clear_stats: fp to clear DCC stats
284  * @ocb_dcc_update_ndl: fp to update ndl
285  * @ocb_reg_ev_handler: fp to register event handler
286  * @ocb_unreg_ev_handler: fp to unregister event handler
287  */
288 struct wlan_ocb_tx_ops {
289 	QDF_STATUS (*ocb_set_config)(struct wlan_objmgr_psoc *psoc,
290 			struct ocb_config *config);
291 	QDF_STATUS (*ocb_set_utc_time)(struct wlan_objmgr_psoc *psoc,
292 			struct ocb_utc_param *utc);
293 	QDF_STATUS (*ocb_start_timing_advert)(struct wlan_objmgr_psoc *psoc,
294 			struct ocb_timing_advert_param *timing_advert);
295 	QDF_STATUS (*ocb_stop_timing_advert)(struct wlan_objmgr_psoc *psoc,
296 			struct ocb_timing_advert_param *timing_advert);
297 	QDF_STATUS (*ocb_get_tsf_timer)(struct wlan_objmgr_psoc *psoc,
298 			struct ocb_get_tsf_timer_param *request);
299 	QDF_STATUS (*ocb_dcc_get_stats)(struct wlan_objmgr_psoc *psoc,
300 			struct ocb_dcc_get_stats_param *get_stats_param);
301 	QDF_STATUS (*ocb_dcc_clear_stats)(struct wlan_objmgr_psoc *psoc,
302 			struct ocb_dcc_clear_stats_param *clear_stats);
303 	QDF_STATUS (*ocb_dcc_update_ndl)(struct wlan_objmgr_psoc *psoc,
304 			struct ocb_dcc_update_ndl_param *update_ndl_param);
305 	QDF_STATUS (*ocb_reg_ev_handler)(struct wlan_objmgr_psoc *psoc,
306 					 void *arg);
307 	QDF_STATUS (*ocb_unreg_ev_handler)(struct wlan_objmgr_psoc *psoc,
308 					   void *arg);
309 };
310 
311 typedef void (*ocb_sync_callback)(void *context, void *response);
312 
313 /**
314  * struct ocb_callbacks - structure containing callback to legacy driver
315  * @ocb_set_config_context: context for set channel config callback
316  * @ocb_set_config_callback: set channel config callback
317  * @ocb_get_tsf_timer_context: context for get tsf timer callback
318  * @ocb_get_tsf_timer_callback: get tsf timer callback
319  * @ocb_dcc_get_stats_context: context for get DCC stats callback
320  * @ocb_dcc_get_stats_callback: get DCC stats callback
321  * @ocb_dcc_update_ndl_context: context for NDL update callback
322  * @ocb_dcc_update_ndl_callback: NDL update callback
323  * @ocb_dcc_stats_event_context: context for DCC stats event callback
324  * @ocb_dcc_stats_event_callback: DCC stats event callback
325  * @start_ocb_vdev: start ocb callback
326  */
327 struct ocb_callbacks {
328 	void *ocb_set_config_context;
329 	ocb_sync_callback ocb_set_config_callback;
330 	void *ocb_get_tsf_timer_context;
331 	ocb_sync_callback ocb_get_tsf_timer_callback;
332 	void *ocb_dcc_get_stats_context;
333 	ocb_sync_callback ocb_dcc_get_stats_callback;
334 	void *ocb_dcc_update_ndl_context;
335 	ocb_sync_callback ocb_dcc_update_ndl_callback;
336 	void *ocb_dcc_stats_event_context;
337 	ocb_sync_callback ocb_dcc_stats_event_callback;
338 	QDF_STATUS (*start_ocb_vdev)(struct ocb_config *config);
339 };
340 #endif
341