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