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: target_if_twt.c 19 * This file contains twt component's target related function definitions 20 */ 21 #include <target_if_twt.h> 22 #include <target_if_twt_cmd.h> 23 #include <target_if_twt_evt.h> 24 #include <target_if_ext_twt.h> 25 #include "twt/core/src/wlan_twt_common.h" 26 #include "twt/core/src/wlan_twt_priv.h" 27 28 QDF_STATUS 29 target_if_twt_register_events(struct wlan_objmgr_psoc *psoc) 30 { 31 QDF_STATUS status; 32 struct wmi_unified *wmi_handle; 33 34 if (!psoc) { 35 target_if_err("psoc obj is null!"); 36 return QDF_STATUS_E_NULL_VALUE; 37 } 38 39 wmi_handle = get_wmi_unified_hdl_from_psoc(psoc); 40 if (!wmi_handle) { 41 target_if_err("wmi_handle is null!"); 42 return QDF_STATUS_E_INVAL; 43 } 44 45 status = wmi_unified_register_event_handler(wmi_handle, 46 wmi_twt_enable_complete_event_id, 47 target_if_twt_en_complete_event_handler, 48 WMI_RX_WORK_CTX); 49 if (QDF_IS_STATUS_ERROR(status)) { 50 target_if_err("Failed to register twt enable event cb"); 51 if (status == QDF_STATUS_E_NOSUPPORT) 52 status = QDF_STATUS_SUCCESS; 53 return status; 54 } 55 56 status = wmi_unified_register_event_handler(wmi_handle, 57 wmi_twt_disable_complete_event_id, 58 target_if_twt_disable_comp_event_handler, 59 WMI_RX_WORK_CTX); 60 if (QDF_IS_STATUS_ERROR(status)) { 61 target_if_err("Failed to register twt disable event cb"); 62 if (status == QDF_STATUS_E_NOSUPPORT) 63 status = QDF_STATUS_SUCCESS; 64 return status; 65 } 66 67 status = target_if_twt_register_ext_events(psoc); 68 if (QDF_IS_STATUS_ERROR(status)) { 69 target_if_err("Failed to register twt ext events"); 70 if (status == QDF_STATUS_E_NOSUPPORT) 71 status = QDF_STATUS_SUCCESS; 72 return status; 73 } 74 75 return status; 76 } 77 78 QDF_STATUS 79 target_if_twt_deregister_events(struct wlan_objmgr_psoc *psoc) 80 { 81 QDF_STATUS status; 82 struct wmi_unified *wmi_handle; 83 84 if (!psoc) { 85 target_if_err("psoc is NULL!"); 86 return QDF_STATUS_E_INVAL; 87 } 88 89 wmi_handle = get_wmi_unified_hdl_from_psoc(psoc); 90 if (!wmi_handle) { 91 target_if_err("wmi_handle is null"); 92 return QDF_STATUS_E_NULL_VALUE; 93 } 94 95 status = wmi_unified_unregister_event_handler(wmi_handle, 96 wmi_twt_enable_complete_event_id); 97 if (QDF_IS_STATUS_ERROR(status)) { 98 target_if_err("Failed to deregister twt enable event cb"); 99 if (status == QDF_STATUS_E_NOSUPPORT) 100 status = QDF_STATUS_SUCCESS; 101 return status; 102 } 103 104 status = wmi_unified_unregister_event_handler(wmi_handle, 105 wmi_twt_disable_complete_event_id); 106 if (QDF_IS_STATUS_ERROR(status)) { 107 target_if_err("Failed to deregister twt disable event cb"); 108 if (status == QDF_STATUS_E_NOSUPPORT) 109 status = QDF_STATUS_SUCCESS; 110 return status; 111 } 112 113 status = target_if_twt_deregister_ext_events(psoc); 114 if (QDF_IS_STATUS_ERROR(status)) { 115 target_if_err("Failed to deregister twt ext events"); 116 if (status == QDF_STATUS_E_NOSUPPORT) 117 status = QDF_STATUS_SUCCESS; 118 return status; 119 } 120 121 return status; 122 } 123 124 QDF_STATUS 125 target_if_twt_register_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops) 126 { 127 struct wlan_lmac_if_twt_tx_ops *twt_tx_ops; 128 QDF_STATUS status; 129 130 if (!tx_ops) { 131 target_if_err("txops is NULL"); 132 return QDF_STATUS_E_FAILURE; 133 } 134 135 twt_tx_ops = &tx_ops->twt_tx_ops; 136 twt_tx_ops->enable_req = target_if_twt_enable_req; 137 twt_tx_ops->disable_req = target_if_twt_disable_req; 138 twt_tx_ops->register_events = target_if_twt_register_events; 139 twt_tx_ops->deregister_events = target_if_twt_deregister_events; 140 141 status = target_if_twt_register_ext_tx_ops(twt_tx_ops); 142 if (QDF_IS_STATUS_ERROR(status)) { 143 target_if_err("Failed to register twt ext tx ops"); 144 return status; 145 } 146 147 return status; 148 } 149 150 QDF_STATUS 151 target_if_twt_set_twt_ack_support(struct wlan_objmgr_psoc *psoc, 152 bool val) 153 { 154 struct twt_psoc_priv_obj *twt_psoc; 155 156 if (!psoc) { 157 target_if_err("null psoc"); 158 return QDF_STATUS_E_FAILURE; 159 } 160 161 twt_psoc = wlan_objmgr_psoc_get_comp_private_obj(psoc, 162 WLAN_UMAC_COMP_TWT); 163 if (!twt_psoc) { 164 target_if_err("null twt psoc priv obj"); 165 return QDF_STATUS_E_FAILURE; 166 } 167 168 twt_psoc->twt_caps.twt_ack_supported = val; 169 return QDF_STATUS_SUCCESS; 170 } 171 172 QDF_STATUS 173 target_if_twt_fill_tgt_caps(struct wlan_objmgr_psoc *psoc, 174 wmi_unified_t wmi_handle) 175 { 176 struct twt_psoc_priv_obj *twt_psoc; 177 struct twt_tgt_caps *caps = NULL; 178 179 if (!psoc || !wmi_handle) { 180 target_if_err("null wmi_handle or psoc"); 181 return QDF_STATUS_E_FAILURE; 182 } 183 184 twt_psoc = wlan_objmgr_psoc_get_comp_private_obj(psoc, 185 WLAN_UMAC_COMP_TWT); 186 if (!twt_psoc) { 187 target_if_err("null twt psoc priv obj"); 188 return QDF_STATUS_E_FAILURE; 189 } 190 191 caps = &twt_psoc->twt_caps; 192 193 if (wmi_service_enabled(wmi_handle, wmi_service_twt_requestor)) 194 caps->twt_requestor = true; 195 else 196 caps->twt_requestor = false; 197 198 if (wmi_service_enabled(wmi_handle, wmi_service_twt_responder)) 199 caps->twt_responder = true; 200 else 201 caps->twt_responder = false; 202 203 if (wmi_service_enabled(wmi_handle, wmi_service_bcast_twt_support)) 204 caps->legacy_bcast_twt_support = true; 205 else 206 caps->legacy_bcast_twt_support = false; 207 208 if (wmi_service_enabled(wmi_handle, wmi_service_twt_bcast_req_support)) 209 caps->twt_bcast_req_support = true; 210 else 211 caps->twt_bcast_req_support = false; 212 213 if (wmi_service_enabled(wmi_handle, wmi_service_twt_bcast_resp_support)) 214 caps->twt_bcast_res_support = true; 215 else 216 caps->twt_bcast_res_support = false; 217 218 if (wmi_service_enabled(wmi_handle, wmi_service_twt_nudge)) 219 caps->twt_nudge_enabled = true; 220 else 221 caps->twt_nudge_enabled = false; 222 223 if (wmi_service_enabled(wmi_handle, wmi_service_all_twt)) 224 caps->all_twt_enabled = true; 225 else 226 caps->all_twt_enabled = false; 227 228 if (wmi_service_enabled(wmi_handle, wmi_service_twt_statistics)) 229 caps->twt_stats_enabled = true; 230 else 231 caps->twt_stats_enabled = false; 232 233 target_if_debug("req:%d res:%d legacy_bcast_twt_support:%d", 234 caps->twt_requestor, 235 caps->twt_responder, 236 caps->legacy_bcast_twt_support); 237 target_if_debug("twt_bcast_req_support:%d twt_bcast_res_support:%d", 238 caps->twt_bcast_req_support, 239 caps->twt_bcast_res_support); 240 target_if_debug("nudge_enabled:%d all_twt_enabled:%d stats_enabled:%d", 241 caps->twt_nudge_enabled, 242 caps->all_twt_enabled, 243 caps->twt_stats_enabled); 244 return QDF_STATUS_SUCCESS; 245 } 246 247