1 /*
2  * Copyright (c) 2022 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 
17 /*
18  * DOC: contains CoAP south bound interface definitions
19  */
20 
21 #include <wlan_coap_main.h>
22 #include <wlan_coap_tgt_api.h>
23 #include <wlan_lmac_if_def.h>
24 #include "wlan_objmgr_pdev_obj.h"
25 
26 static inline struct wlan_lmac_if_coap_tx_ops *
wlan_psoc_get_coap_txops(struct wlan_objmgr_psoc * psoc)27 wlan_psoc_get_coap_txops(struct wlan_objmgr_psoc *psoc)
28 {
29 	struct wlan_lmac_if_tx_ops *tx_ops;
30 
31 	tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
32 	if (!tx_ops) {
33 		coap_err("tx_ops is NULL");
34 		return NULL;
35 	}
36 
37 	return &tx_ops->coap_ops;
38 }
39 
40 static inline struct wlan_lmac_if_coap_tx_ops *
wlan_vdev_get_coap_txops(struct wlan_objmgr_vdev * vdev)41 wlan_vdev_get_coap_txops(struct wlan_objmgr_vdev *vdev)
42 {
43 	struct wlan_objmgr_psoc *psoc;
44 
45 	psoc = wlan_vdev_get_psoc(vdev);
46 	if (!psoc) {
47 		coap_err("NULL psoc");
48 		return NULL;
49 	}
50 
51 	return wlan_psoc_get_coap_txops(psoc);
52 }
53 
tgt_coap_attach(struct wlan_objmgr_psoc * psoc)54 QDF_STATUS tgt_coap_attach(struct wlan_objmgr_psoc *psoc)
55 {
56 	struct wlan_lmac_if_coap_tx_ops *coap_tx_ops;
57 
58 	if (!psoc) {
59 		coap_err("psoc is null");
60 		return QDF_STATUS_E_NULL_VALUE;
61 	}
62 
63 	coap_tx_ops = wlan_psoc_get_coap_txops(psoc);
64 	if (!coap_tx_ops) {
65 		coap_err("tx_ops is null!");
66 		return QDF_STATUS_E_NULL_VALUE;
67 	}
68 
69 	if (!coap_tx_ops->attach) {
70 		coap_err("attach function is null!");
71 		return QDF_STATUS_E_NULL_VALUE;
72 	}
73 
74 	return coap_tx_ops->attach(psoc);
75 }
76 
tgt_coap_detach(struct wlan_objmgr_psoc * psoc)77 QDF_STATUS tgt_coap_detach(struct wlan_objmgr_psoc *psoc)
78 {
79 	struct wlan_lmac_if_coap_tx_ops *coap_tx_ops;
80 
81 	if (!psoc) {
82 		coap_err("psoc is null");
83 		return QDF_STATUS_E_NULL_VALUE;
84 	}
85 
86 	coap_tx_ops = wlan_psoc_get_coap_txops(psoc);
87 	if (!coap_tx_ops) {
88 		coap_err("tx_ops is null!");
89 		return QDF_STATUS_E_NULL_VALUE;
90 	}
91 
92 	if (!coap_tx_ops->detach) {
93 		coap_err("coap_detach function is null!");
94 		return QDF_STATUS_E_NULL_VALUE;
95 	}
96 
97 	return coap_tx_ops->detach(psoc);
98 }
99 
100 QDF_STATUS
tgt_send_coap_offload_reply_enable(struct wlan_objmgr_vdev * vdev,struct coap_offload_reply_param * param)101 tgt_send_coap_offload_reply_enable(struct wlan_objmgr_vdev *vdev,
102 				   struct coap_offload_reply_param *param)
103 {
104 	struct wlan_lmac_if_coap_tx_ops *coap_ops;
105 
106 	if (!vdev) {
107 		coap_err("NULL vdev");
108 		return QDF_STATUS_E_NULL_VALUE;
109 	}
110 
111 	coap_ops = wlan_vdev_get_coap_txops(vdev);
112 	if (coap_ops && coap_ops->offload_reply_enable)
113 		return coap_ops->offload_reply_enable(vdev, param);
114 
115 	return QDF_STATUS_SUCCESS;
116 }
117 
118 QDF_STATUS
tgt_send_coap_offload_reply_disable(struct wlan_objmgr_vdev * vdev,uint32_t req_id)119 tgt_send_coap_offload_reply_disable(struct wlan_objmgr_vdev *vdev,
120 				    uint32_t req_id)
121 {
122 	struct wlan_lmac_if_coap_tx_ops *coap_ops;
123 
124 	if (!vdev) {
125 		coap_err("NULL vdev");
126 		return QDF_STATUS_E_NULL_VALUE;
127 	}
128 
129 	coap_ops = wlan_vdev_get_coap_txops(vdev);
130 	if (coap_ops && coap_ops->offload_reply_disable)
131 		return coap_ops->offload_reply_disable(vdev, req_id);
132 
133 	return QDF_STATUS_SUCCESS;
134 }
135 
136 QDF_STATUS
tgt_send_coap_offload_periodic_tx_enable(struct wlan_objmgr_vdev * vdev,struct coap_offload_periodic_tx_param * param)137 tgt_send_coap_offload_periodic_tx_enable(struct wlan_objmgr_vdev *vdev,
138 			struct coap_offload_periodic_tx_param *param)
139 {
140 	struct wlan_lmac_if_coap_tx_ops *coap_ops;
141 
142 	if (!vdev) {
143 		coap_err("NULL vdev");
144 		return QDF_STATUS_E_NULL_VALUE;
145 	}
146 
147 	coap_ops = wlan_vdev_get_coap_txops(vdev);
148 	if (coap_ops && coap_ops->offload_periodic_tx_enable)
149 		return coap_ops->offload_periodic_tx_enable(vdev, param);
150 
151 	return QDF_STATUS_SUCCESS;
152 }
153 
154 QDF_STATUS
tgt_send_coap_offload_periodic_tx_disable(struct wlan_objmgr_vdev * vdev,uint32_t req_id)155 tgt_send_coap_offload_periodic_tx_disable(struct wlan_objmgr_vdev *vdev,
156 					  uint32_t req_id)
157 {
158 	struct wlan_lmac_if_coap_tx_ops *coap_ops;
159 
160 	if (!vdev) {
161 		coap_err("NULL vdev");
162 		return QDF_STATUS_E_NULL_VALUE;
163 	}
164 
165 	coap_ops = wlan_vdev_get_coap_txops(vdev);
166 	if (coap_ops && coap_ops->offload_periodic_tx_disable)
167 		return coap_ops->offload_periodic_tx_disable(vdev, req_id);
168 
169 	return QDF_STATUS_SUCCESS;
170 }
171 
172 QDF_STATUS
tgt_send_coap_offload_cache_get(struct wlan_objmgr_vdev * vdev,uint32_t req_id)173 tgt_send_coap_offload_cache_get(struct wlan_objmgr_vdev *vdev, uint32_t req_id)
174 {
175 	struct wlan_lmac_if_coap_tx_ops *coap_ops;
176 
177 	if (!vdev) {
178 		coap_err("NULL vdev");
179 		return QDF_STATUS_E_NULL_VALUE;
180 	}
181 
182 	coap_ops = wlan_vdev_get_coap_txops(vdev);
183 	if (coap_ops && coap_ops->offload_cache_get)
184 		return coap_ops->offload_cache_get(vdev, req_id);
185 
186 	return QDF_STATUS_SUCCESS;
187 }
188