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