1 /* 2 * Copyright (c) 2019-2020 The Linux Foundation. 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 #include <wlan_cfr_utils_api.h> 20 #include <wlan_cfr_tgt_api.h> 21 #include <qdf_module.h> 22 #include <cfr_defs_i.h> 23 #include <wlan_objmgr_global_obj.h> 24 #include <wlan_objmgr_pdev_obj.h> 25 26 QDF_STATUS wlan_cfr_init(void) 27 { 28 if (wlan_objmgr_register_psoc_create_handler(WLAN_UMAC_COMP_CFR, 29 wlan_cfr_psoc_obj_create_handler, NULL) 30 != QDF_STATUS_SUCCESS) { 31 return QDF_STATUS_E_FAILURE; 32 } 33 if (wlan_objmgr_register_psoc_destroy_handler(WLAN_UMAC_COMP_CFR, 34 wlan_cfr_psoc_obj_destroy_handler, NULL) 35 != QDF_STATUS_SUCCESS) { 36 return QDF_STATUS_E_FAILURE; 37 } 38 if (wlan_objmgr_register_pdev_create_handler(WLAN_UMAC_COMP_CFR, 39 wlan_cfr_pdev_obj_create_handler, NULL) 40 != QDF_STATUS_SUCCESS) { 41 return QDF_STATUS_E_FAILURE; 42 } 43 if (wlan_objmgr_register_pdev_destroy_handler(WLAN_UMAC_COMP_CFR, 44 wlan_cfr_pdev_obj_destroy_handler, NULL) 45 != QDF_STATUS_SUCCESS) { 46 return QDF_STATUS_E_FAILURE; 47 } 48 if (wlan_objmgr_register_peer_create_handler(WLAN_UMAC_COMP_CFR, 49 wlan_cfr_peer_obj_create_handler, NULL) 50 != QDF_STATUS_SUCCESS) { 51 return QDF_STATUS_E_FAILURE; 52 } 53 if (wlan_objmgr_register_peer_destroy_handler(WLAN_UMAC_COMP_CFR, 54 wlan_cfr_peer_obj_destroy_handler, NULL) 55 != QDF_STATUS_SUCCESS) { 56 return QDF_STATUS_E_FAILURE; 57 } 58 59 return QDF_STATUS_SUCCESS; 60 } 61 62 QDF_STATUS wlan_cfr_deinit(void) 63 { 64 if (wlan_objmgr_unregister_psoc_create_handler(WLAN_UMAC_COMP_CFR, 65 wlan_cfr_psoc_obj_create_handler, NULL) 66 != QDF_STATUS_SUCCESS) { 67 return QDF_STATUS_E_FAILURE; 68 } 69 if (wlan_objmgr_unregister_psoc_destroy_handler(WLAN_UMAC_COMP_CFR, 70 wlan_cfr_psoc_obj_destroy_handler, NULL) 71 != QDF_STATUS_SUCCESS) { 72 return QDF_STATUS_E_FAILURE; 73 } 74 if (wlan_objmgr_unregister_pdev_create_handler(WLAN_UMAC_COMP_CFR, 75 wlan_cfr_pdev_obj_create_handler, NULL) 76 != QDF_STATUS_SUCCESS) { 77 return QDF_STATUS_E_FAILURE; 78 } 79 if (wlan_objmgr_unregister_pdev_destroy_handler(WLAN_UMAC_COMP_CFR, 80 wlan_cfr_pdev_obj_destroy_handler, NULL) 81 != QDF_STATUS_SUCCESS) { 82 return QDF_STATUS_E_FAILURE; 83 } 84 if (wlan_objmgr_unregister_peer_create_handler(WLAN_UMAC_COMP_CFR, 85 wlan_cfr_peer_obj_create_handler, NULL) 86 != QDF_STATUS_SUCCESS) { 87 return QDF_STATUS_E_FAILURE; 88 } 89 if (wlan_objmgr_unregister_peer_destroy_handler(WLAN_UMAC_COMP_CFR, 90 wlan_cfr_peer_obj_destroy_handler, NULL) 91 != QDF_STATUS_SUCCESS) { 92 return QDF_STATUS_E_FAILURE; 93 } 94 return QDF_STATUS_SUCCESS; 95 } 96 97 QDF_STATUS wlan_cfr_pdev_open(struct wlan_objmgr_pdev *pdev) 98 { 99 int status; 100 101 if (wlan_cfr_is_feature_disabled(pdev)) { 102 cfr_err("cfr is disabled"); 103 return QDF_STATUS_COMP_DISABLED; 104 } 105 /* chip specific init */ 106 status = tgt_cfr_init_pdev(pdev); 107 108 if (status != QDF_STATUS_SUCCESS) { 109 cfr_err("tgt_cfr_init_pdev failed with %d\n", status); 110 return QDF_STATUS_SUCCESS; 111 } 112 113 /* RealyFS init */ 114 status = cfr_streamfs_init(pdev); 115 116 if (status != QDF_STATUS_SUCCESS) { 117 cfr_err("cfr_streamfs_init failed with %d\n", status); 118 return QDF_STATUS_SUCCESS; 119 } 120 121 return QDF_STATUS_SUCCESS; 122 } 123 124 QDF_STATUS wlan_cfr_pdev_close(struct wlan_objmgr_pdev *pdev) 125 { 126 int status = QDF_STATUS_SUCCESS; 127 128 if (wlan_cfr_is_feature_disabled(pdev)) { 129 cfr_err("cfr is disabled"); 130 return QDF_STATUS_COMP_DISABLED; 131 } 132 /* 133 * DBR does not have close as of now; 134 * but this is getting added as part for new gerrit 135 * Once we have that support we will add it. 136 */ 137 status = cfr_streamfs_remove(pdev); 138 139 return status; 140 } 141 142 QDF_STATUS cfr_initialize_pdev(struct wlan_objmgr_pdev *pdev) 143 { 144 int status = QDF_STATUS_SUCCESS; 145 146 if (wlan_cfr_is_feature_disabled(pdev)) { 147 cfr_err("cfr is disabled"); 148 return QDF_STATUS_COMP_DISABLED; 149 } 150 151 /* chip specific init */ 152 153 status = tgt_cfr_init_pdev(pdev); 154 155 if (status != QDF_STATUS_SUCCESS) 156 cfr_err("cfr_initialize_pdev status=%d\n", status); 157 158 return status; 159 } 160 qdf_export_symbol(cfr_initialize_pdev); 161 162 QDF_STATUS cfr_deinitialize_pdev(struct wlan_objmgr_pdev *pdev) 163 { 164 int status = QDF_STATUS_SUCCESS; 165 166 if (wlan_cfr_is_feature_disabled(pdev)) { 167 cfr_err("cfr is disabled"); 168 return QDF_STATUS_COMP_DISABLED; 169 } 170 171 /* chip specific deinit */ 172 173 status = tgt_cfr_deinit_pdev(pdev); 174 175 if (status != QDF_STATUS_SUCCESS) 176 cfr_err("cfr_deinitialize_pdev status=%d\n", status); 177 178 return status; 179 } 180 qdf_export_symbol(cfr_deinitialize_pdev); 181 182 uint8_t count_set_bits(uint32_t value) 183 { 184 uint8_t count = 0; 185 186 while (value) { 187 value &= (value - 1); 188 count++; 189 } 190 191 return count; 192 } 193 194 qdf_export_symbol(count_set_bits); 195 196 #ifdef WLAN_ENH_CFR_ENABLE 197 void wlan_cfr_rx_tlv_process(struct wlan_objmgr_pdev *pdev, void *nbuf) 198 { 199 tgt_cfr_rx_tlv_process(pdev, nbuf); 200 } 201 202 qdf_export_symbol(wlan_cfr_rx_tlv_process); 203 #endif 204 205 bool wlan_cfr_is_feature_disabled(struct wlan_objmgr_pdev *pdev) 206 { 207 if (!pdev) { 208 cfr_err("PDEV is NULL!"); 209 return true; 210 } 211 212 return (wlan_pdev_nif_feat_ext_cap_get(pdev, WLAN_PDEV_FEXT_CFR_EN) ? 213 false : true); 214 } 215 216 qdf_export_symbol(wlan_cfr_is_feature_disabled); 217