1 /*
2 * Copyright (c) 2022-2023 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 * DOC: define internal APIs related to the mlme component, legacy APIs are
18 * called for the time being, but will be cleaned up after convergence
19 */
20 #include "wifi_pos_api.h"
21 #include "wlan_wifi_pos_interface.h"
22 #include "wma_pasn_peer_api.h"
23
24 #if defined(WIFI_POS_CONVERGED) && defined(WLAN_FEATURE_RTT_11AZ_SUPPORT)
25 /**
26 * wlan_wifi_pos_pasn_peer_create() - Callback to create ranging peer
27 * @psoc: Pointer to PSOC
28 * @peer_addr: Address of the peer for which PASN peer is to be created
29 * @vdev_id: Vdev id
30 *
31 * Return: QDF_STATUS
32 */
wlan_wifi_pos_pasn_peer_create(struct wlan_objmgr_psoc * psoc,struct qdf_mac_addr * peer_addr,uint8_t vdev_id)33 static QDF_STATUS wlan_wifi_pos_pasn_peer_create(struct wlan_objmgr_psoc *psoc,
34 struct qdf_mac_addr *peer_addr,
35 uint8_t vdev_id)
36 {
37 return wma_pasn_peer_create(psoc, peer_addr, vdev_id);
38 }
39
40 /**
41 * wlan_wifi_pos_pasn_peer_delete() - Callback to delete ranging peer
42 * @psoc: Pointer to PSOC
43 * @peer_addr: Address of the peer for which PASN peer is to be deleted
44 * @vdev_id: Vdev id
45 * @no_fw_peer_delete: if true do not seend peer delete to firmware
46 *
47 * Return: QDF_STATUS
48 */
wlan_wifi_pos_pasn_peer_delete(struct wlan_objmgr_psoc * psoc,struct qdf_mac_addr * peer_addr,uint8_t vdev_id,bool no_fw_peer_delete)49 static QDF_STATUS wlan_wifi_pos_pasn_peer_delete(struct wlan_objmgr_psoc *psoc,
50 struct qdf_mac_addr *peer_addr,
51 uint8_t vdev_id,
52 bool no_fw_peer_delete)
53 {
54 return wma_pasn_peer_remove(psoc, peer_addr, vdev_id,
55 no_fw_peer_delete);
56 }
57
58 /**
59 * wlan_wifi_pos_vdev_delete_resume() - Resume vdev delete operation
60 * after deleting all pasn peers
61 * @vdev: Pointer to objmgr vdev
62 *
63 * Return: QDF_STATUS
64 */
65 static QDF_STATUS
wlan_wifi_pos_vdev_delete_resume(struct wlan_objmgr_vdev * vdev)66 wlan_wifi_pos_vdev_delete_resume(struct wlan_objmgr_vdev *vdev)
67 {
68 return wma_pasn_peer_delete_all_complete(vdev);
69 }
70
71 bool
wlan_wifi_pos_pasn_peer_delete_all(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id)72 wlan_wifi_pos_pasn_peer_delete_all(struct wlan_objmgr_psoc *psoc,
73 uint8_t vdev_id)
74 {
75 struct wlan_objmgr_vdev *vdev;
76 QDF_STATUS status;
77 struct scheduler_msg msg = {0};
78 struct pasn_peer_delete_msg *req;
79
80 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
81 WLAN_WIFI_POS_TGT_IF_ID);
82 if (!vdev) {
83 mlme_err("Vdev is not found for id:%d", vdev_id);
84 return false;
85 }
86
87 if (!(vdev->vdev_mlme.vdev_opmode == QDF_STA_MODE ||
88 vdev->vdev_mlme.vdev_opmode == QDF_SAP_MODE)) {
89 wlan_objmgr_vdev_release_ref(vdev, WLAN_WIFI_POS_TGT_IF_ID);
90 return false;
91 }
92
93 if (!wifi_pos_get_pasn_peer_count(vdev) ||
94 wifi_pos_is_delete_all_peer_in_progress(vdev)) {
95 wlan_objmgr_vdev_release_ref(vdev, WLAN_WIFI_POS_TGT_IF_ID);
96 return false;
97 }
98
99 wlan_objmgr_vdev_release_ref(vdev, WLAN_WIFI_POS_TGT_IF_ID);
100
101 req = qdf_mem_malloc(sizeof(*req));
102 if (!req)
103 return false;
104
105 req->vdev_id = vdev_id;
106
107 msg.type = WIFI_POS_PASN_PEER_DELETE_ALL;
108 msg.bodyptr = req;
109
110 status = scheduler_post_message(QDF_MODULE_ID_WIFIPOS,
111 QDF_MODULE_ID_PE,
112 QDF_MODULE_ID_PE, &msg);
113 if (QDF_IS_STATUS_ERROR(status)) {
114 qdf_mem_free(req);
115 mlme_err("Delete all pasn peers failed");
116 return false;
117 }
118
119 return true;
120 }
121
122 static struct wifi_pos_legacy_ops wifi_pos_ops = {
123 .pasn_peer_create_cb = wlan_wifi_pos_pasn_peer_create,
124 .pasn_peer_delete_cb = wlan_wifi_pos_pasn_peer_delete,
125 .pasn_vdev_delete_resume_cb = wlan_wifi_pos_vdev_delete_resume,
126 };
127
128 QDF_STATUS
wifi_pos_register_legacy_ops(struct wlan_objmgr_psoc * psoc)129 wifi_pos_register_legacy_ops(struct wlan_objmgr_psoc *psoc)
130 {
131 return wifi_pos_set_legacy_ops(psoc, &wifi_pos_ops);
132 }
133
134 QDF_STATUS
wifi_pos_deregister_legacy_ops(struct wlan_objmgr_psoc * psoc)135 wifi_pos_deregister_legacy_ops(struct wlan_objmgr_psoc *psoc)
136 {
137 return wifi_pos_set_legacy_ops(psoc, NULL);
138 }
139 #endif
140