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