xref: /wlan-dirver/qca-wifi-host-cmn/dp/inc/cdp_txrx_misc.h (revision 6ecd284e5a94a1c96e26d571dd47419ac305990d)
1 /*
2  * Copyright (c) 2016-2018 The Linux Foundation. All rights reserved.
3  *
4  * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5  *
6  *
7  * Permission to use, copy, modify, and/or distribute this software for
8  * any purpose with or without fee is hereby granted, provided that the
9  * above copyright notice and this permission notice appear in all
10  * copies.
11  *
12  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19  * PERFORMANCE OF THIS SOFTWARE.
20  */
21 
22 /*
23  * This file was originally distributed by Qualcomm Atheros, Inc.
24  * under proprietary terms before Copyright ownership was assigned
25  * to the Linux Foundation.
26  */
27 /**
28  * @file cdp_txrx_misc.h
29  * @brief Define the host data path miscelleneous API functions
30  * called by the host control SW and the OS interface module
31  */
32 #ifndef _CDP_TXRX_MISC_H_
33 #define _CDP_TXRX_MISC_H_
34 
35 #include "cdp_txrx_handle.h"
36 /**
37  * cdp_tx_non_std() - Allow the control-path SW to send data frames
38  *
39  * @soc - data path soc handle
40  * @data_vdev - which vdev should transmit the tx data frames
41  * @tx_spec - what non-standard handling to apply to the tx data frames
42  * @msdu_list - NULL-terminated list of tx MSDUs
43  *
44  * Generally, all tx data frames come from the OS shim into the txrx layer.
45  * However, there are rare cases such as TDLS messaging where the UMAC
46  * control-path SW creates tx data frames.
47  *  This UMAC SW can call this function to provide the tx data frames to
48  *  the txrx layer.
49  *  The UMAC SW can request a callback for these data frames after their
50  *  transmission completes, by using the ol_txrx_data_tx_cb_set function
51  *  to register a tx completion callback, and by specifying
52  *  ol_tx_spec_no_free as the tx_spec arg when giving the frames to
53  *  ol_tx_non_std.
54  *  The MSDUs need to have the appropriate L2 header type (802.3 vs. 802.11),
55  *  as specified by ol_cfg_frame_type().
56  *
57  *  Return: null - success, skb - failure
58  */
59 static inline qdf_nbuf_t
60 cdp_tx_non_std(ol_txrx_soc_handle soc, struct cdp_vdev *vdev,
61 		enum ol_tx_spec tx_spec, qdf_nbuf_t msdu_list)
62 {
63 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
64 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
65 			"%s invalid instance", __func__);
66 		return NULL;
67 	}
68 
69 	if (soc->ops->misc_ops->tx_non_std)
70 		return soc->ops->misc_ops->tx_non_std(
71 			vdev, tx_spec, msdu_list);
72 	return NULL;
73 }
74 
75 /**
76  * cdp_set_ibss_vdev_heart_beat_timer() - Update ibss vdev heart
77  * beat timer
78  * @soc - data path soc handle
79  * @vdev - vdev handle
80  * @timer_value_sec - new heart beat timer value
81  *
82  * Return: Old timer value set in vdev.
83  */
84 static inline uint16_t
85 cdp_set_ibss_vdev_heart_beat_timer(ol_txrx_soc_handle soc,
86 		struct cdp_vdev *vdev, uint16_t timer_value_sec)
87 {
88 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
89 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
90 			"%s invalid instance", __func__);
91 		return 0;
92 	}
93 
94 	if (soc->ops->misc_ops->set_ibss_vdev_heart_beat_timer)
95 		return soc->ops->misc_ops->set_ibss_vdev_heart_beat_timer(
96 			vdev, timer_value_sec);
97 
98 	return 0;
99 }
100 
101 /**
102  * cdp_set_wisa_mode() - set wisa mode
103  * @soc - data path soc handle
104  * @vdev - vdev handle
105  * @enable - enable or disable
106  *
107  * Return: QDF_STATUS_SUCCESS mode enable success
108  */
109 static inline QDF_STATUS
110 cdp_set_wisa_mode(ol_txrx_soc_handle soc, struct cdp_vdev *vdev, bool enable)
111 {
112 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
113 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
114 			"%s invalid instance", __func__);
115 		return QDF_STATUS_E_INVAL;
116 	}
117 
118 	if (soc->ops->misc_ops->set_wisa_mode)
119 		return soc->ops->misc_ops->set_wisa_mode(vdev, enable);
120 	return QDF_STATUS_SUCCESS;
121 }
122 
123 /**
124  * cdp_data_stall_cb_register() - register data stall callback
125  * @soc - data path soc handle
126  * @cb - callback function
127  *
128  * Return: QDF_STATUS_SUCCESS register success
129  */
130 static inline QDF_STATUS cdp_data_stall_cb_register(ol_txrx_soc_handle soc,
131 						    data_stall_detect_cb cb)
132 {
133 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
134 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
135 			"%s invalid instance", __func__);
136 		return QDF_STATUS_E_INVAL;
137 	}
138 
139 	if (soc->ops->misc_ops->txrx_data_stall_cb_register)
140 		return soc->ops->misc_ops->txrx_data_stall_cb_register(cb);
141 	return QDF_STATUS_SUCCESS;
142 }
143 
144 /**
145  * cdp_data_stall_cb_deregister() - de-register data stall callback
146  * @soc - data path soc handle
147  * @cb - callback function
148  *
149  * Return: QDF_STATUS_SUCCESS de-register success
150  */
151 static inline QDF_STATUS cdp_data_stall_cb_deregister(ol_txrx_soc_handle soc,
152 						      data_stall_detect_cb cb)
153 {
154 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
155 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
156 			"%s invalid instance", __func__);
157 		return QDF_STATUS_E_INVAL;
158 	}
159 
160 	if (soc->ops->misc_ops->txrx_data_stall_cb_deregister)
161 		return soc->ops->misc_ops->txrx_data_stall_cb_deregister(cb);
162 	return QDF_STATUS_SUCCESS;
163 }
164 
165 /**
166  * cdp_post_data_stall_event() - post data stall event
167  * @soc - data path soc handle
168  * @indicator: Module triggering data stall
169  * @data_stall_type: data stall event type
170  * @pdev_id: pdev id
171  * @vdev_id_bitmap: vdev id bitmap
172  * @recovery_type: data stall recovery type
173  *
174  * Return: None
175  */
176 static inline void
177 cdp_post_data_stall_event(ol_txrx_soc_handle soc,
178 			  enum data_stall_log_event_indicator indicator,
179 			  enum data_stall_log_event_type data_stall_type,
180 			  uint32_t pdev_id, uint32_t vdev_id_bitmap,
181 			  enum data_stall_log_recovery_type recovery_type)
182 {
183 	if (!soc || !soc->ops) {
184 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
185 			"%s invalid instance", __func__);
186 		QDF_BUG(0);
187 		return;
188 	}
189 
190 	if (!soc->ops->misc_ops ||
191 	    !soc->ops->misc_ops->txrx_post_data_stall_event)
192 		return;
193 
194 	soc->ops->misc_ops->txrx_post_data_stall_event(
195 				indicator, data_stall_type, pdev_id,
196 				vdev_id_bitmap, recovery_type);
197 }
198 
199 /**
200  * cdp_set_wmm_param() - set wmm parameter
201  * @soc - data path soc handle
202  * @pdev - device instance pointer
203  * @wmm_param - wmm parameter
204  *
205  * Return: none
206  */
207 static inline void
208 cdp_set_wmm_param(ol_txrx_soc_handle soc, struct cdp_pdev *pdev,
209 		      struct ol_tx_wmm_param_t wmm_param)
210 {
211 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
212 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
213 			"%s invalid instance", __func__);
214 		return;
215 	}
216 
217 	if (soc->ops->misc_ops->set_wmm_param)
218 		return soc->ops->misc_ops->set_wmm_param(
219 			pdev, wmm_param);
220 
221 	return;
222 }
223 
224 /**
225  * cdp_runtime_suspend() - suspend
226  * @soc - data path soc handle
227  * @pdev - device instance pointer
228  *
229  * Return: QDF_STATUS_SUCCESS suspend success
230  */
231 static inline QDF_STATUS cdp_runtime_suspend(ol_txrx_soc_handle soc,
232 		struct cdp_pdev *pdev)
233 {
234 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
235 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
236 			"%s invalid instance", __func__);
237 		return QDF_STATUS_E_INVAL;
238 	}
239 
240 	if (soc->ops->misc_ops->runtime_suspend)
241 		return soc->ops->misc_ops->runtime_suspend(pdev);
242 
243 	return QDF_STATUS_SUCCESS;
244 }
245 
246 /**
247  * cdp_runtime_resume() - resume
248  * @soc - data path soc handle
249  * @pdev - device instance pointer
250  *
251  * Return: QDF_STATUS_SUCCESS suspend success
252  */
253 static inline QDF_STATUS cdp_runtime_resume(ol_txrx_soc_handle soc,
254 		struct cdp_pdev *pdev)
255 {
256 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
257 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
258 			"%s invalid instance", __func__);
259 		return QDF_STATUS_E_INVAL;
260 	}
261 
262 	if (soc->ops->misc_ops->runtime_resume)
263 		return soc->ops->misc_ops->runtime_resume(pdev);
264 
265 	return QDF_STATUS_SUCCESS;
266 }
267 
268 /**
269  * cdp_hl_tdls_flag_reset() - tdls flag reset
270  * @soc - data path soc handle
271  * @vdev - virtual interface handle pointer
272  * @flag
273  *
274  * Return: none
275  */
276 static inline void
277 cdp_hl_tdls_flag_reset(ol_txrx_soc_handle soc, struct cdp_vdev *vdev, bool flag)
278 {
279 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
280 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
281 			"%s invalid instance", __func__);
282 		return;
283 	}
284 
285 	if (soc->ops->misc_ops->hl_tdls_flag_reset)
286 		return soc->ops->misc_ops->hl_tdls_flag_reset(vdev, flag);
287 
288 	return;
289 }
290 
291 /**
292  * cdp_get_opmode() - get vdev operation mode
293  * @soc - data path soc handle
294  * @vdev - virtual interface instance
295  *
296  * Return virtual device operational mode
297  *      op_mode_ap,
298  *      op_mode_ibss,
299  *      op_mode_sta,
300  *      op_mode_monitor,
301  *      op_mode_ocb,
302  *
303  * return interface id
304  *        0 unknown interface
305  */
306 static inline int
307 cdp_get_opmode(ol_txrx_soc_handle soc, struct cdp_vdev *vdev)
308 {
309 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
310 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
311 			"%s invalid instance", __func__);
312 		return 0;
313 	}
314 
315 	if (soc->ops->misc_ops->get_opmode)
316 		return soc->ops->misc_ops->get_opmode(vdev);
317 	return 0;
318 }
319 
320 /**
321  * cdp_get_vdev_id() - get vdev id
322  * @soc - data path soc handle
323  * @vdev - virtual interface instance
324  *
325  * get virtual interface id
326  *
327  * return interface id
328  *        0 unknown interface
329  */
330 static inline uint16_t
331 cdp_get_vdev_id(ol_txrx_soc_handle soc, struct cdp_vdev *vdev)
332 {
333 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
334 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
335 			"%s invalid instance", __func__);
336 		return 0;
337 	}
338 
339 	if (soc->ops->misc_ops->get_vdev_id)
340 		return soc->ops->misc_ops->get_vdev_id(vdev);
341 	return 0;
342 }
343 
344 /**
345  * cdp_get_tx_ack_stats() - get tx ack count for vdev
346  * @soc - data path soc handle
347  * @vdev_id - vdev id
348  *
349  * return tx ack count
350  *          0 invalid count
351  */
352 static inline uint32_t
353 cdp_get_tx_ack_stats(ol_txrx_soc_handle soc, uint8_t vdev_id)
354 {
355 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
356 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
357 			"%s invalid instance", __func__);
358 		return 0;
359 	}
360 
361 	if (soc->ops->misc_ops->get_tx_ack_stats)
362 		return soc->ops->misc_ops->get_tx_ack_stats(vdev_id);
363 	return 0;
364 }
365 
366 /**
367  * cdp_bad_peer_txctl_set_setting() - TBD
368  * @soc - data path soc handle
369  * @pdev - data path device instance
370  * @enable -
371  * @period -
372  * @txq_limit -
373  *
374  * TBD
375  *
376  * Return: none
377  */
378 static inline void
379 cdp_bad_peer_txctl_set_setting(ol_txrx_soc_handle soc, struct cdp_pdev *pdev,
380 		int enable, int period, int txq_limit)
381 {
382 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
383 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
384 			"%s invalid instance", __func__);
385 		return;
386 	}
387 
388 	if (soc->ops->misc_ops->bad_peer_txctl_set_setting)
389 		return soc->ops->misc_ops->bad_peer_txctl_set_setting(pdev,
390 			enable, period, txq_limit);
391 	return;
392 }
393 
394 /**
395  * cdp_bad_peer_txctl_update_threshold() - TBD
396  * @soc - data path soc handle
397  * @pdev - data path device instance
398  * @level -
399  * @tput_thresh -
400  * @tx_limit -
401  *
402  * TBD
403  *
404  * Return: none
405  */
406 static inline void
407 cdp_bad_peer_txctl_update_threshold(ol_txrx_soc_handle soc,
408 		struct cdp_pdev *pdev,
409 		int level, int tput_thresh, int tx_limit)
410 {
411 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
412 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
413 			"%s invalid instance", __func__);
414 		return;
415 	}
416 
417 	if (soc->ops->misc_ops->bad_peer_txctl_update_threshold)
418 		return soc->ops->misc_ops->bad_peer_txctl_update_threshold(
419 			pdev, level, tput_thresh, tx_limit);
420 	return;
421 }
422 
423 /**
424  * cdp_mark_first_wakeup_packet() - set flag to indicate that
425  *    fw is compatible for marking first packet after wow wakeup
426  * @soc - data path soc handle
427  * @value: 1 for enabled/ 0 for disabled
428  *
429  * Return: None
430  */
431 static inline void cdp_mark_first_wakeup_packet(ol_txrx_soc_handle soc,
432 		uint8_t value)
433 {
434 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
435 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
436 			"%s invalid instance", __func__);
437 		return;
438 	}
439 
440 	if (soc->ops->misc_ops->mark_first_wakeup_packet)
441 		return soc->ops->misc_ops->mark_first_wakeup_packet(value);
442 	return;
443 }
444 
445 
446 /**
447  * cds_update_mac_id() - update mac_id for vdev
448  * @soc - data path soc handle
449  * @vdev_id: vdev id
450  * @mac_id: mac id
451  *
452  * Return: none
453  */
454 static inline void cdp_update_mac_id(void *psoc, uint8_t vdev_id,
455 		uint8_t mac_id)
456 {
457 	ol_txrx_soc_handle soc = psoc;
458 
459 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
460 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
461 			"%s invalid instance", __func__);
462 		return;
463 	}
464 
465 	if (soc->ops->misc_ops->update_mac_id)
466 		return soc->ops->misc_ops->update_mac_id(vdev_id, mac_id);
467 	return;
468 }
469 
470 /**
471  * cdp_flush_rx_frames() - flush cached rx frames
472  * @soc - data path soc handle
473  * @peer: peer
474  * @drop: set flag to drop frames
475  *
476  * Return: None
477  */
478 static inline void cdp_flush_rx_frames(ol_txrx_soc_handle soc, void *peer,
479 		bool drop)
480 {
481 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
482 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
483 			"%s invalid instance", __func__);
484 		return;
485 	}
486 
487 	if (soc->ops->misc_ops->flush_rx_frames)
488 		return soc->ops->misc_ops->flush_rx_frames(peer, drop);
489 	return;
490 }
491 
492 /*
493  * cdp_get_intra_bss_fwd_pkts_count() - to get the total tx and rx packets
494  *   that has been forwarded from txrx layer without going to upper layers.
495  * @vdev_id: vdev id
496  * @fwd_tx_packets: pointer to forwarded tx packets count parameter
497  * @fwd_rx_packets: pointer to forwarded rx packets count parameter
498  *
499  * Return: status -> A_OK - success, A_ERROR - failure
500  */
501 static inline A_STATUS cdp_get_intra_bss_fwd_pkts_count(
502 		ol_txrx_soc_handle soc, uint8_t vdev_id,
503 		uint64_t *fwd_tx_packets, uint64_t *fwd_rx_packets)
504 {
505 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
506 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
507 			"%s invalid instance", __func__);
508 		return 0;
509 	}
510 
511 	if (soc->ops->misc_ops->get_intra_bss_fwd_pkts_count)
512 		return soc->ops->misc_ops->get_intra_bss_fwd_pkts_count(
513 			vdev_id, fwd_tx_packets, fwd_rx_packets);
514 
515 	return 0;
516 }
517 
518 /**
519  * cdp_pkt_log_init() - API to initialize packet log
520  * @handle: pdev handle
521  * @scn: HIF context
522  *
523  * Return: void
524  */
525 static inline void cdp_pkt_log_init(ol_txrx_soc_handle soc,
526 		struct cdp_pdev *pdev, void *scn)
527 {
528 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
529 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
530 			"%s invalid instance", __func__);
531 		return;
532 	}
533 
534 	if (soc->ops->misc_ops->pkt_log_init)
535 		return soc->ops->misc_ops->pkt_log_init(pdev, scn);
536 
537 	return;
538 }
539 
540 /**
541  * cdp_pkt_log_con_service() - API to connect packet log service
542  * @handle: pdev handle
543  * @scn: HIF context
544  *
545  * Return: void
546  */
547 static inline void cdp_pkt_log_con_service(ol_txrx_soc_handle soc,
548 		struct cdp_pdev *pdev, void *scn)
549 {
550 	if (!soc || !soc->ops || !soc->ops->misc_ops) {
551 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
552 			"%s invalid instance", __func__);
553 		return;
554 	}
555 
556 	if (soc->ops->misc_ops->pkt_log_con_service)
557 		return soc->ops->misc_ops->pkt_log_con_service(pdev, scn);
558 
559 	return;
560 }
561 #endif /* _CDP_TXRX_MISC_H_ */
562