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 definitions for CoAP core functions
19   */
20  
21  #include <wlan_coap_tgt_api.h>
22  #include <wlan_coap_main.h>
23  #include <wlan_objmgr_global_obj.h>
24  
wlan_coap_enable(struct wlan_objmgr_psoc * psoc)25  QDF_STATUS wlan_coap_enable(struct wlan_objmgr_psoc *psoc)
26  {
27  	return tgt_coap_attach(psoc);
28  }
29  
wlan_coap_disable(struct wlan_objmgr_psoc * psoc)30  QDF_STATUS wlan_coap_disable(struct wlan_objmgr_psoc *psoc)
31  {
32  	return tgt_coap_detach(psoc);
33  }
34  
35  static QDF_STATUS
wlan_coap_vdev_obj_create_handler(struct wlan_objmgr_vdev * vdev,void * arg)36  wlan_coap_vdev_obj_create_handler(struct wlan_objmgr_vdev *vdev, void *arg)
37  {
38  	struct wlan_coap_comp_priv *coap_priv;
39  	QDF_STATUS status;
40  
41  	if (!vdev)
42  		return QDF_STATUS_E_INVAL;
43  
44  	coap_priv = qdf_mem_malloc(sizeof(struct wlan_coap_comp_priv));
45  	if (!coap_priv)
46  		return QDF_STATUS_E_NOMEM;
47  
48  	status = wlan_objmgr_vdev_component_obj_attach(vdev,
49  						       WLAN_UMAC_COMP_COAP,
50  						       (void *)coap_priv,
51  						       QDF_STATUS_SUCCESS);
52  	if (QDF_IS_STATUS_ERROR(status))
53  		qdf_mem_free(coap_priv);
54  
55  	return status;
56  }
57  
58  static QDF_STATUS
wlan_coap_vdev_obj_destroy_handler(struct wlan_objmgr_vdev * vdev,void * arg)59  wlan_coap_vdev_obj_destroy_handler(struct wlan_objmgr_vdev *vdev, void *arg)
60  {
61  	void *coap_priv;
62  
63  	if (!vdev) {
64  		coap_err("Vdev NULL");
65  		return QDF_STATUS_E_INVAL;
66  	}
67  
68  	coap_priv = wlan_get_vdev_coap_obj(vdev);
69  	if (!coap_priv) {
70  		coap_err("coap_priv NULL");
71  		return QDF_STATUS_E_INVAL;
72  	}
73  
74  	wlan_objmgr_vdev_component_obj_detach(vdev, WLAN_UMAC_COMP_COAP,
75  					      coap_priv);
76  	qdf_mem_free(coap_priv);
77  	return QDF_STATUS_SUCCESS;
78  }
79  
wlan_coap_init(void)80  QDF_STATUS wlan_coap_init(void)
81  {
82  	QDF_STATUS status = QDF_STATUS_SUCCESS;
83  
84  	status = wlan_objmgr_register_vdev_create_handler(WLAN_UMAC_COMP_COAP,
85  				wlan_coap_vdev_obj_create_handler, NULL);
86  	if (status != QDF_STATUS_SUCCESS)
87  		return status;
88  
89  	status = wlan_objmgr_register_vdev_destroy_handler(WLAN_UMAC_COMP_COAP,
90  				wlan_coap_vdev_obj_destroy_handler, NULL);
91  	if (QDF_IS_STATUS_SUCCESS(status))
92  		return status;
93  
94  	wlan_objmgr_unregister_vdev_create_handler(WLAN_UMAC_COMP_COAP,
95  				wlan_coap_vdev_obj_create_handler, NULL);
96  	return status;
97  }
98  
wlan_coap_deinit(void)99  QDF_STATUS wlan_coap_deinit(void)
100  {
101  	wlan_objmgr_unregister_vdev_create_handler(WLAN_UMAC_COMP_COAP,
102  				wlan_coap_vdev_obj_create_handler, NULL);
103  	wlan_objmgr_unregister_vdev_destroy_handler(WLAN_UMAC_COMP_COAP,
104  				wlan_coap_vdev_obj_destroy_handler, NULL);
105  	return QDF_STATUS_SUCCESS;
106  }
107  
108  QDF_STATUS
wlan_coap_offload_reply_enable(struct wlan_objmgr_vdev * vdev,struct coap_offload_reply_param * params)109  wlan_coap_offload_reply_enable(struct wlan_objmgr_vdev *vdev,
110  			       struct coap_offload_reply_param *params)
111  {
112  	return tgt_send_coap_offload_reply_enable(vdev, params);
113  }
114  
115  QDF_STATUS
wlan_coap_offload_reply_disable(struct wlan_objmgr_vdev * vdev,uint32_t req_id,coap_cache_get_callback cbk,void * context)116  wlan_coap_offload_reply_disable(struct wlan_objmgr_vdev *vdev, uint32_t req_id,
117  				coap_cache_get_callback cbk, void *context)
118  {
119  	struct wlan_coap_comp_priv *coap_priv;
120  
121  	if (!vdev) {
122  		coap_err("Vdev NULL");
123  		return QDF_STATUS_E_INVAL;
124  	}
125  
126  	coap_priv = wlan_get_vdev_coap_obj(vdev);
127  	coap_priv->req_id = req_id;
128  	coap_priv->cache_get_context = context;
129  	coap_priv->cache_get_cbk = cbk;
130  	return tgt_send_coap_offload_reply_disable(vdev, req_id);
131  }
132  
133  QDF_STATUS
wlan_coap_offload_periodic_tx_enable(struct wlan_objmgr_vdev * vdev,struct coap_offload_periodic_tx_param * params)134  wlan_coap_offload_periodic_tx_enable(struct wlan_objmgr_vdev *vdev,
135  			struct coap_offload_periodic_tx_param *params)
136  {
137  	return tgt_send_coap_offload_periodic_tx_enable(vdev, params);
138  }
139  
140  QDF_STATUS
wlan_coap_offload_periodic_tx_disable(struct wlan_objmgr_vdev * vdev,uint32_t req_id)141  wlan_coap_offload_periodic_tx_disable(struct wlan_objmgr_vdev *vdev,
142  				      uint32_t req_id)
143  {
144  	return tgt_send_coap_offload_periodic_tx_disable(vdev, req_id);
145  }
146  
147  QDF_STATUS
wlan_coap_offload_cache_get(struct wlan_objmgr_vdev * vdev,uint32_t req_id,coap_cache_get_callback cbk,void * context)148  wlan_coap_offload_cache_get(struct wlan_objmgr_vdev *vdev, uint32_t req_id,
149  			    coap_cache_get_callback cbk, void *context)
150  {
151  	struct wlan_coap_comp_priv *coap_priv;
152  
153  	if (!vdev) {
154  		coap_err("Vdev NULL");
155  		return QDF_STATUS_E_INVAL;
156  	}
157  
158  	coap_priv = wlan_get_vdev_coap_obj(vdev);
159  	coap_priv->req_id = req_id;
160  	coap_priv->cache_get_context = context;
161  	coap_priv->cache_get_cbk = cbk;
162  	return tgt_send_coap_offload_cache_get(vdev, req_id);
163  }
164