1 /* 2 * Copyright (c) 2020, The Linux Foundation. All rights reserved. 3 * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. 4 * 5 * Permission to use, copy, modify, and/or distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 */ 17 18 /** 19 * DOC: Public API implementation of ftm time_sync called by north bound iface. 20 */ 21 22 #include "ftm_time_sync_ucfg_api.h" 23 #include "ftm_time_sync_main.h" 24 #include <qdf_str.h> 25 ucfg_ftm_time_sync_init(void)26 QDF_STATUS ucfg_ftm_time_sync_init(void) 27 { 28 QDF_STATUS status; 29 30 status = wlan_objmgr_register_psoc_create_handler( 31 WLAN_UMAC_COMP_FTM_TIME_SYNC, 32 ftm_time_sync_psoc_create_notification, 33 NULL); 34 if (QDF_IS_STATUS_ERROR(status)) { 35 ftm_time_sync_err("Failed to register psoc create handler"); 36 return status; 37 } 38 39 status = wlan_objmgr_register_psoc_destroy_handler( 40 WLAN_UMAC_COMP_FTM_TIME_SYNC, 41 ftm_time_sync_psoc_destroy_notification, 42 NULL); 43 if (QDF_IS_STATUS_ERROR(status)) { 44 ftm_time_sync_err("Failed to register psoc delete handler"); 45 goto fail_destroy_psoc; 46 } 47 48 status = wlan_objmgr_register_vdev_create_handler( 49 WLAN_UMAC_COMP_FTM_TIME_SYNC, 50 ftm_time_sync_vdev_create_notification, NULL); 51 if (QDF_IS_STATUS_ERROR(status)) { 52 ftm_time_sync_err("Failed to register vdev create handler"); 53 goto fail_create_vdev; 54 } 55 56 status = wlan_objmgr_register_vdev_destroy_handler( 57 WLAN_UMAC_COMP_FTM_TIME_SYNC, 58 ftm_time_sync_vdev_destroy_notification, NULL); 59 if (QDF_IS_STATUS_ERROR(status)) { 60 ftm_time_sync_err("Failed to register vdev destroy handler"); 61 goto fail_destroy_vdev; 62 } 63 return status; 64 65 fail_destroy_vdev: 66 wlan_objmgr_unregister_vdev_create_handler( 67 WLAN_UMAC_COMP_FTM_TIME_SYNC, 68 ftm_time_sync_vdev_create_notification, NULL); 69 70 fail_create_vdev: 71 wlan_objmgr_unregister_psoc_destroy_handler( 72 WLAN_UMAC_COMP_FTM_TIME_SYNC, 73 ftm_time_sync_psoc_destroy_notification, NULL); 74 75 fail_destroy_psoc: 76 wlan_objmgr_unregister_psoc_create_handler( 77 WLAN_UMAC_COMP_FTM_TIME_SYNC, 78 ftm_time_sync_psoc_create_notification, NULL); 79 80 return status; 81 } 82 ucfg_ftm_time_sync_deinit(void)83 void ucfg_ftm_time_sync_deinit(void) 84 { 85 QDF_STATUS status; 86 87 status = wlan_objmgr_unregister_vdev_destroy_handler( 88 WLAN_UMAC_COMP_FTM_TIME_SYNC, 89 ftm_time_sync_vdev_destroy_notification, 90 NULL); 91 if (QDF_IS_STATUS_ERROR(status)) 92 ftm_time_sync_err("Failed to unregister vdev delete handler"); 93 94 status = wlan_objmgr_unregister_vdev_create_handler( 95 WLAN_UMAC_COMP_FTM_TIME_SYNC, 96 ftm_time_sync_vdev_create_notification, NULL); 97 if (!QDF_IS_STATUS_ERROR(status)) 98 ftm_time_sync_err("Failed to unregister vdev create handler"); 99 100 status = wlan_objmgr_unregister_psoc_destroy_handler( 101 WLAN_UMAC_COMP_FTM_TIME_SYNC, 102 ftm_time_sync_psoc_destroy_notification, 103 NULL); 104 if (QDF_IS_STATUS_ERROR(status)) 105 ftm_time_sync_err("Failed to unregister psoc destroy handler"); 106 107 status = wlan_objmgr_unregister_psoc_create_handler( 108 WLAN_UMAC_COMP_FTM_TIME_SYNC, 109 ftm_time_sync_psoc_create_notification, 110 NULL); 111 if (QDF_IS_STATUS_ERROR(status)) 112 ftm_time_sync_err("Failed to unregister psoc create handler"); 113 } 114 ucfg_is_ftm_time_sync_enable(struct wlan_objmgr_psoc * psoc)115 bool ucfg_is_ftm_time_sync_enable(struct wlan_objmgr_psoc *psoc) 116 { 117 return ftm_time_sync_is_enable(psoc); 118 } 119 ucfg_ftm_time_sync_set_enable(struct wlan_objmgr_psoc * psoc,bool enable)120 void ucfg_ftm_time_sync_set_enable(struct wlan_objmgr_psoc *psoc, bool enable) 121 { 122 return ftm_time_sync_set_enable(psoc, enable); 123 } 124 ucfg_ftm_time_sync_update_sta_connect_state(struct wlan_objmgr_vdev * vdev,enum ftm_time_sync_sta_state sta_state,struct qdf_mac_addr bssid)125 void ucfg_ftm_time_sync_update_sta_connect_state( 126 struct wlan_objmgr_vdev *vdev, 127 enum ftm_time_sync_sta_state sta_state, 128 struct qdf_mac_addr bssid) 129 { 130 struct wlan_objmgr_psoc *psoc; 131 enum ftm_time_sync_role role; 132 133 psoc = wlan_vdev_get_psoc(vdev); 134 if (!psoc) { 135 ftm_time_sync_err("Failed to get psoc"); 136 return; 137 } 138 139 role = ftm_time_sync_get_role(psoc); 140 if (role == FTM_TIMESYNC_TARGET_ROLE) { 141 if (sta_state == FTM_TIME_SYNC_STA_CONNECTED) 142 ftm_time_sync_send_trigger(vdev); 143 else 144 ftm_time_sync_stop(vdev); 145 146 ftm_time_sync_update_bssid(vdev, bssid); 147 } 148 } 149 ucfg_ftm_time_sync_update_bss_state(struct wlan_objmgr_vdev * vdev,enum ftm_time_sync_bss_state ap_state)150 void ucfg_ftm_time_sync_update_bss_state(struct wlan_objmgr_vdev *vdev, 151 enum ftm_time_sync_bss_state ap_state) 152 { 153 struct wlan_objmgr_psoc *psoc; 154 enum ftm_time_sync_role role; 155 156 psoc = wlan_vdev_get_psoc(vdev); 157 if (!psoc) { 158 ftm_time_sync_err("Failed to get psoc"); 159 return; 160 } 161 162 if (!ftm_time_sync_is_enable(psoc)) 163 return; 164 165 role = ftm_time_sync_get_role(psoc); 166 if (role == FTM_TIMESYNC_INITIATOR_ROLE) { 167 if (ap_state == FTM_TIME_SYNC_BSS_STARTED) 168 ftm_time_sync_send_trigger(vdev); 169 else 170 ftm_time_sync_stop(vdev); 171 } 172 } 173 ucfg_ftm_time_sync_show(struct wlan_objmgr_vdev * vdev,char * buf)174 ssize_t ucfg_ftm_time_sync_show(struct wlan_objmgr_vdev *vdev, char *buf) 175 { 176 return ftm_time_sync_show(vdev, buf); 177 } 178