1  /*
2   * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
3   *
4   * Permission to use, copy, modify, and/or distribute this software for any
5   * purpose with or without fee is hereby granted, provided that the above
6   * copyright notice and this permission notice appear in all copies.
7   *
8   * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9   * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10   * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11   * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12   * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13   * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14   * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15   */
16  #ifndef _CDP_TXRX_MLO_H_
17  #define _CDP_TXRX_MLO_H_
18  #include "cdp_txrx_ops.h"
19  
20  struct cdp_mlo_ctxt;
21  
22  static inline
cdp_mlo_ctxt_attach(ol_txrx_soc_handle soc,struct cdp_ctrl_mlo_mgr * ctrl_ctxt)23  struct cdp_mlo_ctxt *cdp_mlo_ctxt_attach(ol_txrx_soc_handle soc,
24  					 struct cdp_ctrl_mlo_mgr *ctrl_ctxt)
25  {
26  	if (!soc || !soc->ops) {
27  		QDF_BUG(0);
28  		return NULL;
29  	}
30  
31  	if (!soc->ops->mlo_ops ||
32  	    !soc->ops->mlo_ops->mlo_ctxt_attach)
33  		return NULL;
34  
35  	return soc->ops->mlo_ops->mlo_ctxt_attach(ctrl_ctxt);
36  }
37  
38  static inline
cdp_mlo_ctxt_detach(ol_txrx_soc_handle soc,struct cdp_mlo_ctxt * ml_ctxt)39  void cdp_mlo_ctxt_detach(ol_txrx_soc_handle soc,
40  			 struct cdp_mlo_ctxt *ml_ctxt)
41  {
42  	if (!soc || !soc->ops) {
43  		QDF_BUG(0);
44  		return;
45  	}
46  
47  	if (!soc->ops->mlo_ops ||
48  	    !soc->ops->mlo_ops->mlo_ctxt_detach)
49  		return;
50  
51  	soc->ops->mlo_ops->mlo_ctxt_detach(ml_ctxt);
52  }
53  
cdp_soc_mlo_soc_setup(ol_txrx_soc_handle soc,struct cdp_mlo_ctxt * mlo_ctx)54  static inline void cdp_soc_mlo_soc_setup(ol_txrx_soc_handle soc,
55  					 struct cdp_mlo_ctxt *mlo_ctx)
56  {
57  	if (!soc || !soc->ops) {
58  		QDF_BUG(0);
59  		return;
60  	}
61  
62  	if (!soc->ops->mlo_ops ||
63  	    !soc->ops->mlo_ops->mlo_soc_setup)
64  		return;
65  
66  	soc->ops->mlo_ops->mlo_soc_setup(soc, mlo_ctx);
67  }
68  
cdp_soc_mlo_soc_teardown(ol_txrx_soc_handle soc,struct cdp_mlo_ctxt * mlo_ctx,bool is_force_down)69  static inline void cdp_soc_mlo_soc_teardown(ol_txrx_soc_handle soc,
70  					    struct cdp_mlo_ctxt *mlo_ctx,
71  					    bool is_force_down)
72  {
73  	if (!soc || !soc->ops) {
74  		QDF_BUG(0);
75  		return;
76  	}
77  
78  	if (!soc->ops->mlo_ops ||
79  	    !soc->ops->mlo_ops->mlo_soc_teardown)
80  		return;
81  
82  	soc->ops->mlo_ops->mlo_soc_teardown(soc, mlo_ctx, is_force_down);
83  }
84  
cdp_mlo_setup_complete(ol_txrx_soc_handle soc,struct cdp_mlo_ctxt * mlo_ctx)85  static inline void cdp_mlo_setup_complete(ol_txrx_soc_handle soc,
86  					  struct cdp_mlo_ctxt *mlo_ctx)
87  {
88  	if (!soc || !soc->ops) {
89  		QDF_BUG(0);
90  		return;
91  	}
92  
93  	if (!soc->ops->mlo_ops ||
94  	    !soc->ops->mlo_ops->mlo_setup_complete)
95  		return;
96  
97  	soc->ops->mlo_ops->mlo_setup_complete(mlo_ctx);
98  }
99  
100  /*
101   * cdp_mlo_update_delta_tsf2 - Update delta_tsf2
102   * @soc: soc handle
103   * @pdev_id: pdev id
104   * @delta_tsf2: delta_tsf2
105   *
106   * return: none
107   */
cdp_mlo_update_delta_tsf2(ol_txrx_soc_handle soc,uint8_t pdev_id,uint64_t delta_tsf2)108  static inline void cdp_mlo_update_delta_tsf2(ol_txrx_soc_handle soc,
109  					     uint8_t pdev_id,
110  					     uint64_t delta_tsf2)
111  {
112  	if (!soc || !soc->ops) {
113  		QDF_BUG(0);
114  		return;
115  	}
116  
117  	if (!soc->ops->mlo_ops ||
118  	    !soc->ops->mlo_ops->mlo_update_delta_tsf2)
119  		return;
120  
121  	soc->ops->mlo_ops->mlo_update_delta_tsf2(soc, pdev_id, delta_tsf2);
122  }
123  
124  /*
125   * cdp_mlo_update_delta_tqm - Update delta_tqm
126   * @soc: soc handle
127   * @delta_tqm: delta_tqm
128   *
129   * return: none
130   */
cdp_mlo_update_delta_tqm(ol_txrx_soc_handle soc,uint64_t delta_tqm)131  static inline void cdp_mlo_update_delta_tqm(ol_txrx_soc_handle soc,
132  					    uint64_t delta_tqm)
133  {
134  	if (!soc || !soc->ops) {
135  		QDF_BUG(0);
136  		return;
137  	}
138  
139  	if (!soc->ops->mlo_ops ||
140  	    !soc->ops->mlo_ops->mlo_update_delta_tqm)
141  		return;
142  
143  	soc->ops->mlo_ops->mlo_update_delta_tqm(soc, delta_tqm);
144  }
145  
146  /*
147   * cdp_mlo_get_mld_vdev_stats - Get MLD vdev stats
148   * @soc: soc handle
149   * @vdev_id: vdev_id of one of the vdev's of the MLD group
150   * @buf: buffer to hold vdev_stats
151   * @link_vdev_only: flag to indicate if stats are required for specific vdev
152   *
153   * return: QDF_STATUS
154   */
155  static inline QDF_STATUS
cdp_mlo_get_mld_vdev_stats(ol_txrx_soc_handle soc,uint8_t vdev_id,struct cdp_vdev_stats * buf,bool link_vdev_only)156  cdp_mlo_get_mld_vdev_stats(ol_txrx_soc_handle soc,
157  			   uint8_t vdev_id, struct cdp_vdev_stats *buf,
158  			   bool link_vdev_only)
159  {
160  	if (!soc || !soc->ops) {
161  		QDF_BUG(0);
162  		return QDF_STATUS_E_FAILURE;
163  	}
164  
165  	if (!soc->ops->mlo_ops || !soc->ops->mlo_ops->mlo_get_mld_vdev_stats)
166  		return QDF_STATUS_E_FAILURE;
167  
168  	return soc->ops->mlo_ops->mlo_get_mld_vdev_stats(soc,
169  							 vdev_id,
170  							 buf,
171  							 link_vdev_only);
172  }
173  #endif /*_CDP_TXRX_MLO_H_*/
174