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 5 * any purpose with or without fee is hereby granted, provided that the 6 * above copyright notice and this permission notice appear in all 7 * copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL 10 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED 11 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE 12 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 13 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 14 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 15 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 16 * PERFORMANCE OF THIS SOFTWARE. 17 */ 18 /** 19 * DOC: wlan_twt_objmgr.c 20 * This file defines the APIs of TWT component. 21 */ 22 #include "wlan_twt_common.h" 23 #include "wlan_twt_priv.h" 24 #include "wlan_twt_objmgr_handler.h" 25 #include "wlan_objmgr_peer_obj.h" 26 #include "include/wlan_mlme_cmn.h" 27 28 QDF_STATUS 29 wlan_twt_psoc_obj_create_handler(struct wlan_objmgr_psoc *psoc, void *arg) 30 { 31 QDF_STATUS status; 32 struct twt_psoc_priv_obj *twt_psoc_obj; 33 34 twt_psoc_obj = qdf_mem_malloc(sizeof(*twt_psoc_obj)); 35 if (!twt_psoc_obj) 36 return QDF_STATUS_E_NOMEM; 37 38 twt_psoc_obj->enable_context.context = NULL; 39 twt_psoc_obj->disable_context.context = NULL; 40 41 status = wlan_objmgr_psoc_component_obj_attach(psoc, 42 WLAN_UMAC_COMP_TWT, 43 (void *)twt_psoc_obj, 44 QDF_STATUS_SUCCESS); 45 46 if (QDF_IS_STATUS_ERROR(status)) { 47 qdf_mem_free(twt_psoc_obj); 48 twt_err("Failed to attach twt psoc priv object"); 49 return status; 50 } 51 52 twt_debug("twt psoc priv obj attach successful"); 53 return status; 54 } 55 56 QDF_STATUS 57 wlan_twt_psoc_obj_destroy_handler(struct wlan_objmgr_psoc *psoc, void *arg) 58 { 59 QDF_STATUS status; 60 struct twt_psoc_priv_obj *twt_psoc_obj; 61 62 twt_psoc_obj = wlan_objmgr_psoc_get_comp_private_obj(psoc, 63 WLAN_UMAC_COMP_TWT); 64 if (!twt_psoc_obj) { 65 twt_err("Failed to get twt obj in psoc"); 66 return QDF_STATUS_E_FAILURE; 67 } 68 69 status = wlan_objmgr_psoc_component_obj_detach(psoc, 70 WLAN_UMAC_COMP_TWT, 71 twt_psoc_obj); 72 73 if (QDF_IS_STATUS_ERROR(status)) 74 twt_err("Failed to detach twt psoc priv object"); 75 76 qdf_mem_free(twt_psoc_obj); 77 78 return status; 79 } 80 81 QDF_STATUS 82 wlan_twt_vdev_obj_create_handler(struct wlan_objmgr_vdev *vdev, void *arg) 83 { 84 QDF_STATUS status; 85 struct twt_vdev_priv_obj *twt_vdev_obj; 86 87 twt_vdev_obj = qdf_mem_malloc(sizeof(*twt_vdev_obj)); 88 if (!twt_vdev_obj) 89 return QDF_STATUS_E_NOMEM; 90 91 twt_vdev_obj->twt_wait_for_notify = false; 92 93 status = wlan_objmgr_vdev_component_obj_attach(vdev, 94 WLAN_UMAC_COMP_TWT, 95 twt_vdev_obj, 96 QDF_STATUS_SUCCESS); 97 98 if (QDF_IS_STATUS_ERROR(status)) { 99 qdf_mem_free(twt_vdev_obj); 100 twt_err("Failed to attach twt vdev priv object"); 101 return status; 102 } 103 104 twt_debug("twt vdev priv obj attach successful"); 105 106 status = mlme_twt_vdev_create_notification(vdev); 107 108 if (QDF_IS_STATUS_ERROR(status)) { 109 twt_err("vdev create notification failed"); 110 return status; 111 } 112 113 return status; 114 } 115 116 QDF_STATUS 117 wlan_twt_vdev_obj_destroy_handler(struct wlan_objmgr_vdev *vdev, void *arg) 118 { 119 QDF_STATUS status; 120 struct twt_vdev_priv_obj *twt_vdev_obj; 121 122 status = mlme_twt_vdev_destroy_notification(vdev); 123 if (QDF_IS_STATUS_ERROR(status)) { 124 twt_err("vdev destroy notification failed"); 125 return status; 126 } 127 128 twt_vdev_obj = wlan_objmgr_vdev_get_comp_private_obj(vdev, 129 WLAN_UMAC_COMP_TWT); 130 if (!twt_vdev_obj) { 131 twt_err("Failed to get twt obj in vdev"); 132 return QDF_STATUS_E_FAILURE; 133 } 134 135 status = wlan_objmgr_vdev_component_obj_detach(vdev, 136 WLAN_UMAC_COMP_TWT, 137 twt_vdev_obj); 138 139 if (QDF_IS_STATUS_ERROR(status)) 140 twt_err("Failed to detach twt vdev priv object"); 141 142 qdf_mem_free(twt_vdev_obj); 143 144 return status; 145 } 146 147 QDF_STATUS 148 wlan_twt_peer_obj_create_handler(struct wlan_objmgr_peer *peer, void *arg) 149 { 150 struct twt_peer_priv_obj *twt_peer_obj = NULL; 151 QDF_STATUS status = QDF_STATUS_E_FAILURE; 152 153 if (!peer) { 154 twt_err("peer is NULL"); 155 return QDF_STATUS_E_FAILURE; 156 } 157 158 twt_peer_obj = qdf_mem_malloc(sizeof(*twt_peer_obj)); 159 if (!twt_peer_obj) 160 return QDF_STATUS_E_NOMEM; 161 162 twt_lock_create(&twt_peer_obj->twt_peer_lock); 163 164 status = wlan_objmgr_peer_component_obj_attach(peer, 165 WLAN_UMAC_COMP_TWT, 166 twt_peer_obj, 167 QDF_STATUS_SUCCESS); 168 169 if (QDF_IS_STATUS_ERROR(status)) { 170 twt_lock_destroy(&twt_peer_obj->twt_peer_lock); 171 qdf_mem_free(twt_peer_obj); 172 twt_err("peer twt object attach failed"); 173 return QDF_STATUS_E_FAILURE; 174 } 175 176 twt_debug("twt peer priv obj attach successful"); 177 return status; 178 } 179 180 QDF_STATUS 181 wlan_twt_peer_obj_destroy_handler(struct wlan_objmgr_peer *peer, void *arg) 182 { 183 struct twt_peer_priv_obj *twt_peer_obj; 184 QDF_STATUS status = QDF_STATUS_E_FAILURE; 185 186 if (!peer) { 187 twt_err("peer is NULL"); 188 return QDF_STATUS_E_INVAL; 189 } 190 191 twt_peer_obj = wlan_objmgr_peer_get_comp_private_obj(peer, 192 WLAN_UMAC_COMP_TWT); 193 if (!twt_peer_obj) { 194 twt_err("twt_peer_obj is NULL"); 195 return QDF_STATUS_E_INVAL; 196 } 197 198 twt_lock_destroy(&twt_peer_obj->twt_peer_lock); 199 200 status = wlan_objmgr_peer_component_obj_detach(peer, WLAN_UMAC_COMP_TWT, 201 twt_peer_obj); 202 if (QDF_IS_STATUS_ERROR(status)) 203 twt_warn("Failed to detach twt peer priv object"); 204 205 qdf_mem_free(twt_peer_obj); 206 twt_debug("peer twt object detached"); 207 return QDF_STATUS_SUCCESS; 208 } 209 210