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