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_api.c 20 * This file defines the APIs of TWT component. 21 */ 22 #include <wlan_twt_api.h> 23 #include "twt/core/src/wlan_twt_objmgr_handler.h" 24 #include "twt/core/src/wlan_twt_common.h" 25 26 struct wlan_lmac_if_twt_tx_ops * 27 wlan_twt_get_tx_ops(struct wlan_objmgr_psoc *psoc) 28 { 29 struct wlan_lmac_if_tx_ops *tx_ops; 30 31 if (!psoc) { 32 twt_err("psoc is null"); 33 return NULL; 34 } 35 36 tx_ops = wlan_psoc_get_lmac_if_txops(psoc); 37 if (!tx_ops) { 38 twt_err("tx_ops is NULL"); 39 return NULL; 40 } 41 42 return &tx_ops->twt_tx_ops; 43 } 44 45 struct wlan_lmac_if_twt_rx_ops * 46 wlan_twt_get_rx_ops(struct wlan_objmgr_psoc *psoc) 47 { 48 struct wlan_lmac_if_rx_ops *rx_ops; 49 50 if (!psoc) { 51 twt_err("psoc is null"); 52 return NULL; 53 } 54 55 rx_ops = wlan_psoc_get_lmac_if_rxops(psoc); 56 if (!rx_ops) { 57 twt_err("rx_ops is NULL"); 58 return NULL; 59 } 60 61 return &rx_ops->twt_rx_ops; 62 } 63 64 struct twt_psoc_priv_obj* 65 wlan_twt_psoc_get_comp_private_obj(struct wlan_objmgr_psoc *psoc) 66 { 67 struct twt_psoc_priv_obj *twt_psoc; 68 69 twt_psoc = wlan_objmgr_psoc_get_comp_private_obj(psoc, 70 WLAN_UMAC_COMP_TWT); 71 if (!twt_psoc) { 72 twt_err("TWT PSOC component object is NULL"); 73 return NULL; 74 } 75 76 return twt_psoc; 77 } 78 79 QDF_STATUS wlan_twt_init(void) 80 { 81 QDF_STATUS status = QDF_STATUS_E_FAILURE; 82 83 status = wlan_objmgr_register_psoc_create_handler 84 (WLAN_UMAC_COMP_TWT, 85 wlan_twt_psoc_obj_create_handler, 86 NULL); 87 if (QDF_IS_STATUS_ERROR(status)) { 88 twt_err("Failed to register psoc create handler"); 89 goto wlan_twt_psoc_init_fail1; 90 } 91 92 status = wlan_objmgr_register_psoc_destroy_handler 93 (WLAN_UMAC_COMP_TWT, 94 wlan_twt_psoc_obj_destroy_handler, 95 NULL); 96 if (QDF_IS_STATUS_ERROR(status)) { 97 twt_err("Failed to register psoc destroy handler"); 98 goto wlan_twt_psoc_init_fail2; 99 } 100 101 status = wlan_objmgr_register_vdev_create_handler 102 (WLAN_UMAC_COMP_TWT, 103 wlan_twt_vdev_obj_create_handler, 104 NULL); 105 if (QDF_IS_STATUS_ERROR(status)) { 106 twt_err("Failed to register vdev create handler"); 107 goto wlan_twt_vdev_init_fail1; 108 } 109 110 status = wlan_objmgr_register_vdev_destroy_handler 111 (WLAN_UMAC_COMP_TWT, 112 wlan_twt_vdev_obj_destroy_handler, 113 NULL); 114 if (QDF_IS_STATUS_ERROR(status)) { 115 twt_err("Failed to register vdev destroy handler"); 116 goto wlan_twt_vdev_init_fail2; 117 } 118 119 status = wlan_objmgr_register_peer_create_handler 120 (WLAN_UMAC_COMP_TWT, 121 wlan_twt_peer_obj_create_handler, 122 NULL); 123 if (QDF_IS_STATUS_ERROR(status)) { 124 twt_err("Failed to register peer create handler"); 125 goto wlan_twt_peer_init_fail1; 126 } 127 128 status = wlan_objmgr_register_peer_destroy_handler 129 (WLAN_UMAC_COMP_TWT, 130 wlan_twt_peer_obj_destroy_handler, 131 NULL); 132 if (QDF_IS_STATUS_ERROR(status)) { 133 twt_err("Failed to register peer destroy handler"); 134 goto wlan_twt_peer_init_fail2; 135 } 136 137 return QDF_STATUS_SUCCESS; 138 139 wlan_twt_peer_init_fail2: 140 wlan_objmgr_unregister_peer_create_handler 141 (WLAN_UMAC_COMP_TWT, 142 wlan_twt_peer_obj_create_handler, 143 NULL); 144 wlan_twt_peer_init_fail1: 145 wlan_objmgr_unregister_vdev_destroy_handler 146 (WLAN_UMAC_COMP_TWT, 147 wlan_twt_vdev_obj_destroy_handler, 148 NULL); 149 wlan_twt_vdev_init_fail2: 150 wlan_objmgr_unregister_vdev_create_handler 151 (WLAN_UMAC_COMP_TWT, 152 wlan_twt_vdev_obj_create_handler, 153 NULL); 154 wlan_twt_vdev_init_fail1: 155 wlan_objmgr_unregister_psoc_destroy_handler 156 (WLAN_UMAC_COMP_TWT, 157 wlan_twt_psoc_obj_destroy_handler, 158 NULL); 159 wlan_twt_psoc_init_fail2: 160 wlan_objmgr_unregister_psoc_create_handler 161 (WLAN_UMAC_COMP_TWT, 162 wlan_twt_psoc_obj_create_handler, 163 NULL); 164 wlan_twt_psoc_init_fail1: 165 return status; 166 } 167 168 QDF_STATUS wlan_twt_deinit(void) 169 { 170 QDF_STATUS status = QDF_STATUS_E_FAILURE; 171 172 status = wlan_objmgr_unregister_psoc_create_handler 173 (WLAN_UMAC_COMP_TWT, 174 wlan_twt_psoc_obj_create_handler, 175 NULL); 176 if (QDF_IS_STATUS_ERROR(status)) 177 twt_err("Failed to unregister psoc create handler"); 178 179 status = wlan_objmgr_unregister_psoc_destroy_handler 180 (WLAN_UMAC_COMP_TWT, 181 wlan_twt_psoc_obj_destroy_handler, 182 NULL); 183 if (QDF_IS_STATUS_ERROR(status)) 184 twt_err("Failed to unregister psoc destroy handler"); 185 186 status = wlan_objmgr_unregister_vdev_create_handler 187 (WLAN_UMAC_COMP_TWT, 188 wlan_twt_vdev_obj_create_handler, 189 NULL); 190 if (QDF_IS_STATUS_ERROR(status)) 191 twt_err("Failed to unregister vdev create handler"); 192 193 status = wlan_objmgr_unregister_vdev_destroy_handler 194 (WLAN_UMAC_COMP_TWT, 195 wlan_twt_vdev_obj_destroy_handler, 196 NULL); 197 if (QDF_IS_STATUS_ERROR(status)) 198 twt_err("Failed to unregister vdev destroy handler"); 199 200 status = wlan_objmgr_unregister_peer_create_handler 201 (WLAN_UMAC_COMP_TWT, 202 wlan_twt_peer_obj_create_handler, 203 NULL); 204 if (QDF_IS_STATUS_ERROR(status)) 205 twt_err("Failed to unregister peer create handler"); 206 207 status = wlan_objmgr_unregister_peer_destroy_handler 208 (WLAN_UMAC_COMP_TWT, 209 wlan_twt_peer_obj_destroy_handler, 210 NULL); 211 if (QDF_IS_STATUS_ERROR(status)) 212 twt_err("Failed to unregister peer destroy handler"); 213 214 return status; 215 } 216 217 QDF_STATUS twt_psoc_enable(struct wlan_objmgr_psoc *psoc) 218 { 219 QDF_STATUS status = QDF_STATUS_E_NULL_VALUE; 220 struct wlan_lmac_if_twt_tx_ops *tx_ops; 221 222 tx_ops = wlan_twt_get_tx_ops(psoc); 223 if (!tx_ops) { 224 twt_err("tx_ops is null"); 225 return QDF_STATUS_E_NULL_VALUE; 226 } 227 228 if (tx_ops->register_events) { 229 status = tx_ops->register_events(psoc); 230 231 if (QDF_IS_STATUS_ERROR(status)) 232 twt_err("twt_register_events failed (status=%d)", 233 status); 234 } 235 236 return status; 237 } 238 239 QDF_STATUS twt_psoc_disable(struct wlan_objmgr_psoc *psoc) 240 { 241 QDF_STATUS status = QDF_STATUS_E_NULL_VALUE; 242 struct wlan_lmac_if_twt_tx_ops *tx_ops; 243 244 tx_ops = wlan_twt_get_tx_ops(psoc); 245 if (!tx_ops) { 246 twt_err("tx_ops is null"); 247 return QDF_STATUS_E_NULL_VALUE; 248 } 249 250 if (tx_ops->deregister_events) { 251 status = tx_ops->deregister_events(psoc); 252 253 if (QDF_IS_STATUS_ERROR(status)) 254 twt_err("twt_deregister_events failed (status=%d)", 255 status); 256 } 257 return status; 258 } 259 260 QDF_STATUS 261 wlan_set_peer_twt_capabilities(struct wlan_objmgr_psoc *psoc, 262 struct qdf_mac_addr *peer_mac, 263 uint8_t peer_cap) 264 { 265 return wlan_twt_set_peer_capabilities(psoc, peer_mac, peer_cap); 266 } 267