From f0cac26bbbc3b8a37075ca56015f4b5a9a6643b1 Mon Sep 17 00:00:00 2001 From: Pragaspathi Thilagaraj Date: Thu, 30 Jun 2022 12:49:24 +0530 Subject: [PATCH] qcacmn: Add support to delete all pasn peers Add support to delete all pasn peers Change-Id: I2c3d95cb8994693d8944d69624d2db0992f2f03d CRs-Fixed: 3158523 --- .../linux/wifi_pos/inc/os_if_wifi_pos_utils.h | 1 + .../vdev_mgr/src/target_if_vdev_mgr_rx_ops.c | 2 + .../vdev_mgr/src/target_if_vdev_mgr_tx_ops.c | 5 + .../wifi_pos/src/target_if_wifi_pos_rx_ops.c | 3 + .../wifi_pos/src/target_if_wifi_pos_tx_ops.c | 4 + .../lmac_if/inc/wlan_lmac_if_def.h | 9 + .../inc/wlan_vdev_mgr_tgt_if_rx_defs.h | 4 + .../inc/wlan_vdev_mgr_tgt_if_tx_defs.h | 3 + umac/wifi_pos/inc/wifi_pos_pasn_api.h | 59 +++++++ umac/wifi_pos/inc/wifi_pos_public_struct.h | 5 + umac/wifi_pos/{src => inc}/wifi_pos_ucfg_i.h | 0 umac/wifi_pos/inc/wifi_pos_utils_i.h | 2 + umac/wifi_pos/src/wifi_pos_pasn_api.c | 155 +++++++++++++++++- wmi/src/wmi_unified_tlv.c | 29 +++- 14 files changed, 278 insertions(+), 3 deletions(-) rename umac/wifi_pos/{src => inc}/wifi_pos_ucfg_i.h (100%) diff --git a/os_if/linux/wifi_pos/inc/os_if_wifi_pos_utils.h b/os_if/linux/wifi_pos/inc/os_if_wifi_pos_utils.h index 16a59a54e0..26a6cbafe6 100644 --- a/os_if/linux/wifi_pos/inc/os_if_wifi_pos_utils.h +++ b/os_if/linux/wifi_pos/inc/os_if_wifi_pos_utils.h @@ -24,6 +24,7 @@ #include "qdf_types.h" #include "qdf_status.h" #include +#include "wifi_pos_public_struct.h" #if defined(WIFI_POS_CONVERGED) && defined(WLAN_FEATURE_RTT_11AZ_SUPPORT) /** diff --git a/target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_rx_ops.c b/target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_rx_ops.c index 909967c212..622cdc341b 100644 --- a/target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_rx_ops.c +++ b/target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_rx_ops.c @@ -526,6 +526,8 @@ static int target_if_vdev_mgr_peer_delete_all_response_handler( goto err; } + vdev_peer_del_all_resp.peer_type_bitmap = vdev_rsp->peer_type_bitmap; + status = rx_ops->vdev_mgr_peer_delete_all_response( psoc, &vdev_peer_del_all_resp); diff --git a/target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_tx_ops.c b/target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_tx_ops.c index 7c65769747..9d0ee1ad13 100644 --- a/target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_tx_ops.c +++ b/target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_tx_ops.c @@ -1178,6 +1178,11 @@ static QDF_STATUS target_if_vdev_mgr_peer_delete_all_send( } vdev_rsp->expire_time = PEER_DELETE_ALL_RESPONSE_TIMER; + vdev_rsp->peer_type_bitmap = param->peer_type_bitmap; + + mlme_debug("VDEV_%d: PSOC_%d vdev delete all: bitmap:%d", vdev_id, + wlan_psoc_get_id(psoc), vdev_rsp->peer_type_bitmap); + target_if_vdev_mgr_rsp_timer_start(psoc, vdev_rsp, PEER_DELETE_ALL_RESPONSE_BIT); diff --git a/target_if/wifi_pos/src/target_if_wifi_pos_rx_ops.c b/target_if/wifi_pos/src/target_if_wifi_pos_rx_ops.c index 2ed2c68e31..4e51082baa 100644 --- a/target_if/wifi_pos/src/target_if_wifi_pos_rx_ops.c +++ b/target_if/wifi_pos/src/target_if_wifi_pos_rx_ops.c @@ -281,5 +281,8 @@ void target_if_wifi_pos_register_rx_ops(struct wlan_lmac_if_rx_ops *rx_ops) wifi_pos_handle_ranging_peer_create_rsp; wifi_pos_rx_ops->wifi_pos_ranging_peer_delete_cb = wifi_pos_handle_ranging_peer_delete; + wifi_pos_rx_ops->wifi_pos_vdev_delete_all_ranging_peers_rsp_cb = + wifi_pos_vdev_delete_all_ranging_peers_rsp; } #endif + diff --git a/target_if/wifi_pos/src/target_if_wifi_pos_tx_ops.c b/target_if/wifi_pos/src/target_if_wifi_pos_tx_ops.c index 41ed2e9dc3..5eaead31c2 100644 --- a/target_if/wifi_pos/src/target_if_wifi_pos_tx_ops.c +++ b/target_if/wifi_pos/src/target_if_wifi_pos_tx_ops.c @@ -29,6 +29,8 @@ #include "target_if_wifi_pos.h" #include "target_if_wifi_pos_tx_ops.h" #include "wifi_pos_utils_i.h" +#include "wifi_pos_api.h" +#include "wifi_pos_pasn_api.h" #include "target_if.h" /** @@ -311,6 +313,8 @@ void target_if_wifi_pos_register_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops) wifi_pos_tx_ops->data_req_tx = target_if_wifi_pos_oem_data_req; wifi_pos_tx_ops->wifi_pos_parse_measreq_chan_info = target_if_wifi_pos_parse_measreq_chan_info; + wifi_pos_tx_ops->wifi_pos_vdev_delete_all_ranging_peers_cb = + wifi_pos_vdev_delete_all_ranging_peers; target_if_wifi_pos_register_11az_ops(wifi_pos_tx_ops); } diff --git a/umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h b/umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h index fa415c8525..135e3cab12 100644 --- a/umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h +++ b/umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h @@ -892,6 +892,9 @@ struct wlan_lmac_if_iot_sim_tx_ops { * request buffer. * @send_rtt_pasn_auth_status: Send PASN peers authentication status * @send_rtt_pasn_deauth: Send PASN peer deauth command + * @wifi_pos_delete_all_vdev_ranging_peers_cb: Delete all ranging peers for + * given vdev. This is called before vdev delete to cleanup all the ranging + * peers of that vdev. */ struct wlan_lmac_if_wifi_pos_tx_ops { QDF_STATUS (*wifi_pos_register_events)(struct wlan_objmgr_psoc *psoc); @@ -914,6 +917,8 @@ struct wlan_lmac_if_wifi_pos_tx_ops { struct wlan_pasn_auth_status *data); QDF_STATUS (*send_rtt_pasn_deauth)(struct wlan_objmgr_psoc *psoc, struct qdf_mac_addr *peer_mac); + QDF_STATUS (*wifi_pos_vdev_delete_all_ranging_peers_cb) + (struct wlan_objmgr_vdev *vdev); }; #endif @@ -1909,6 +1914,8 @@ struct wlan_lmac_if_iot_sim_rx_ops { * confirm event for PASN Peer. * @wifi_pos_ranging_peer_delete_cb: Ranging peer delete handle function * pointer. + * @wifi_pos_vdev_delete_all_ranging_peers_rsp_cb: Callback to handle vdev + * delete all ranging peers response */ struct wlan_lmac_if_wifi_pos_rx_ops { int (*oem_rsp_event_rx)(struct wlan_objmgr_psoc *psoc, @@ -1926,6 +1933,8 @@ struct wlan_lmac_if_wifi_pos_rx_ops { (struct wlan_objmgr_psoc *psoc, struct wlan_pasn_request *info, uint8_t vdev_id, uint8_t num_peers); + QDF_STATUS (*wifi_pos_vdev_delete_all_ranging_peers_rsp_cb) + (struct wlan_objmgr_psoc *psoc, uint8_t vdev_id); }; #endif diff --git a/umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mgr_tgt_if_rx_defs.h b/umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mgr_tgt_if_rx_defs.h index 5acd1c9087..543bb6eff1 100644 --- a/umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mgr_tgt_if_rx_defs.h +++ b/umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mgr_tgt_if_rx_defs.h @@ -108,6 +108,7 @@ defined(QCA_WIFI_QCA5018) * @timer_status: status of timer * @rsp_timer_inuse: Status bit to inform whether the rsp timer is inuse * @vdev_id: vdev object id + * @peer_type_bitmap: Peer type bitmap */ struct vdev_response_timer { struct wlan_objmgr_psoc *psoc; @@ -117,6 +118,7 @@ struct vdev_response_timer { QDF_STATUS timer_status; qdf_atomic_t rsp_timer_inuse; uint8_t vdev_id; + uint32_t peer_type_bitmap; }; /** @@ -165,10 +167,12 @@ struct vdev_delete_response { * struct peer_delete_all_response - peer delete all response structure * @vdev_id: vdev id * @status: FW status for vdev delete all peer request + * @peer_type_bitmap: bitmap of peer type to delete from enum wlan_peer_type */ struct peer_delete_all_response { uint8_t vdev_id; uint8_t status; + uint32_t peer_type_bitmap; }; /** diff --git a/umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mgr_tgt_if_tx_defs.h b/umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mgr_tgt_if_tx_defs.h index 13307fd47d..dddd84c0d7 100644 --- a/umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mgr_tgt_if_tx_defs.h +++ b/umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mgr_tgt_if_tx_defs.h @@ -757,9 +757,12 @@ struct vdev_down_params { /** * struct peer_delete_all_params - peer delete all request parameter * @vdev_id: vdev id + * @peer_type_bitmap: Bitmap of type with bits corresponding to value from + * enum wlan_peer_type */ struct peer_delete_all_params { uint8_t vdev_id; + uint32_t peer_type_bitmap; }; #define AC_MAX 4 diff --git a/umac/wifi_pos/inc/wifi_pos_pasn_api.h b/umac/wifi_pos/inc/wifi_pos_pasn_api.h index 89868054c0..742a64ec1e 100644 --- a/umac/wifi_pos/inc/wifi_pos_pasn_api.h +++ b/umac/wifi_pos/inc/wifi_pos_pasn_api.h @@ -134,6 +134,48 @@ wifi_pos_send_pasn_auth_status(struct wlan_objmgr_psoc *psoc, QDF_STATUS wifi_pos_send_pasn_peer_deauth(struct wlan_objmgr_psoc *psoc, struct qdf_mac_addr *peer_mac); + +/** + * wifi_pos_get_pasn_peer_count() - Wifi POS get total pasn peer count + * @vdev: Pointer to vdev object + * + * Return: Total number of pasn peers + */ +uint8_t +wifi_pos_get_pasn_peer_count(struct wlan_objmgr_vdev *vdev); + +/** + * wifi_pos_update_pasn_peer_count() - Increment pasn peer count + * @vdev: Pointer to vdev object + * @is_increment: flag to indicate if peer count needs to be incremented + * + * Return: None + */ +void wifi_pos_update_pasn_peer_count(struct wlan_objmgr_vdev *vdev, + bool is_increment); + +/** + * wifi_pos_vdev_delete_all_ranging_peers() - Delete all ranging peers + * associated with given vdev id + * @psoc: Psoc pointer + * @vdev_id: vdev id + * + * Return: QDF_STATUS + */ +QDF_STATUS +wifi_pos_vdev_delete_all_ranging_peers(struct wlan_objmgr_vdev *vdev); + +/** + * wifi_pos_vdev_delete_all_ranging_peers_rsp() - Delete all vdev peers response + * handler + * @psoc: Psoc pointer + * @vdev_id: vdev id + * + * Return: QDF_STATUS + */ +QDF_STATUS +wifi_pos_vdev_delete_all_ranging_peers_rsp(struct wlan_objmgr_psoc *psoc, + uint8_t vdev_id); #else static inline QDF_STATUS wifi_pos_handle_ranging_peer_create(struct wlan_objmgr_psoc *psoc, @@ -179,5 +221,22 @@ wifi_pos_send_pasn_peer_deauth(struct wlan_objmgr_psoc *psoc, { return QDF_STATUS_SUCCESS; } + +static inline void +wifi_pos_update_pasn_peer_count(struct wlan_objmgr_vdev *vdev, + bool is_increment) +{} + +static inline uint8_t +wifi_pos_get_pasn_peer_count(struct wlan_objmgr_vdev *vdev) +{ + return 0; +} + +static inline QDF_STATUS +wifi_pos_vdev_delete_all_ranging_peers(struct wlan_objmgr_vdev *vdev) +{ + return QDF_STATUS_SUCCESS; +} #endif /* WIFI_POS_CONVERGED && WLAN_FEATURE_RTT_11AZ_SUPPORT */ #endif /* _WIFI_POS_PASN_API_H_ */ diff --git a/umac/wifi_pos/inc/wifi_pos_public_struct.h b/umac/wifi_pos/inc/wifi_pos_public_struct.h index 48407506dc..b24a3944c4 100644 --- a/umac/wifi_pos/inc/wifi_pos_public_struct.h +++ b/umac/wifi_pos/inc/wifi_pos_public_struct.h @@ -104,9 +104,14 @@ struct wifi_pos_11az_context { /** * struct wifi_pos_vdev_priv_obj - Wifi Pos module vdev private object * @pasn_context: 11az security peers context. + * @num_pasn_peers: Total number of PASN peers + * @is_delete_all_pasn_peer_in_progress: Delete all the VDEV PASN peers in + * progress */ struct wifi_pos_vdev_priv_obj { struct wifi_pos_11az_context pasn_context; + uint8_t num_pasn_peers; + bool is_delete_all_pasn_peer_in_progress; }; /** diff --git a/umac/wifi_pos/src/wifi_pos_ucfg_i.h b/umac/wifi_pos/inc/wifi_pos_ucfg_i.h similarity index 100% rename from umac/wifi_pos/src/wifi_pos_ucfg_i.h rename to umac/wifi_pos/inc/wifi_pos_ucfg_i.h diff --git a/umac/wifi_pos/inc/wifi_pos_utils_i.h b/umac/wifi_pos/inc/wifi_pos_utils_i.h index 465067ac38..04c4a89ba2 100644 --- a/umac/wifi_pos/inc/wifi_pos_utils_i.h +++ b/umac/wifi_pos/inc/wifi_pos_utils_i.h @@ -220,6 +220,7 @@ typedef void (*wifi_pos_send_rsp_handler)(struct wlan_objmgr_psoc *, uint32_t, * struct wifi_pos_legacy_ops - wifi pos module legacy callbacks * @pasn_peer_create_cb: PASN peer create callback * @pasn_peer_delete_cb: PASN peer delete callback + * @pasn_vdev_delete_resume_cb: PASN resume vdev delete callback */ struct wifi_pos_legacy_ops { QDF_STATUS (*pasn_peer_create_cb)(struct wlan_objmgr_psoc *psoc, @@ -229,6 +230,7 @@ struct wifi_pos_legacy_ops { struct qdf_mac_addr *peer_addr, uint8_t vdev_id, bool no_fw_peer_delete); + QDF_STATUS (*pasn_vdev_delete_resume_cb)(struct wlan_objmgr_vdev *vdev); }; /** diff --git a/umac/wifi_pos/src/wifi_pos_pasn_api.c b/umac/wifi_pos/src/wifi_pos_pasn_api.c index 2dbca716f4..62da384860 100644 --- a/umac/wifi_pos/src/wifi_pos_pasn_api.c +++ b/umac/wifi_pos/src/wifi_pos_pasn_api.c @@ -33,6 +33,39 @@ #include "wlan_objmgr_psoc_obj.h" #include "wlan_objmgr_peer_obj.h" #include "wlan_lmac_if_def.h" +#include "wlan_vdev_mgr_tgt_if_tx_api.h" + +#if defined(WIFI_POS_CONVERGED) && defined(WLAN_FEATURE_RTT_11AZ_SUPPORT) +uint8_t wifi_pos_get_pasn_peer_count(struct wlan_objmgr_vdev *vdev) +{ + struct wifi_pos_vdev_priv_obj *vdev_pos_obj; + + vdev_pos_obj = wifi_pos_get_vdev_priv_obj(vdev); + if (!vdev_pos_obj) { + wifi_pos_err("Wifi pos vdev priv obj is null"); + return 0; + } + + return vdev_pos_obj->num_pasn_peers; +} + +void wifi_pos_update_pasn_peer_count(struct wlan_objmgr_vdev *vdev, + bool is_increment) +{ + struct wifi_pos_vdev_priv_obj *vdev_pos_obj; + + vdev_pos_obj = wifi_pos_get_vdev_priv_obj(vdev); + if (!vdev_pos_obj) { + wifi_pos_err("Wifi pos vdev priv obj is null"); + return; + } + + if (is_increment) + vdev_pos_obj->num_pasn_peers++; + else + vdev_pos_obj->num_pasn_peers--; +} +#endif void wifi_pos_set_11az_failed_peers(struct wlan_objmgr_vdev *vdev, struct qdf_mac_addr *mac_addr) @@ -313,7 +346,7 @@ QDF_STATUS wifi_pos_handle_ranging_peer_create(struct wlan_objmgr_psoc *psoc, struct wlan_objmgr_vdev *vdev; struct wifi_pos_vdev_priv_obj *vdev_pos_obj; struct wifi_pos_11az_context *pasn_context; - QDF_STATUS status; + QDF_STATUS status = QDF_STATUS_SUCCESS; uint8_t i; legacy_cb = wifi_pos_get_legacy_ops(psoc); @@ -369,6 +402,7 @@ QDF_STATUS wifi_pos_handle_ranging_peer_create(struct wlan_objmgr_psoc *psoc, continue; } + wifi_pos_update_pasn_peer_count(vdev, true); if (req[i].is_ltf_keyseed_required) { peer = wlan_objmgr_get_peer_by_mac(psoc, req[i].peer_mac.bytes, @@ -444,9 +478,11 @@ wifi_pos_handle_ranging_peer_create_rsp(struct wlan_objmgr_psoc *psoc, wifi_pos_debug("Received peer create response for " QDF_MAC_ADDR_FMT " status:%d pending_count:%d", QDF_MAC_ADDR_REF(peer_mac->bytes), peer_create_status, pasn_context->num_pending_peer_creation); - if (peer_create_status) + if (peer_create_status) { wifi_pos_move_peers_to_fail_list(vdev, peer_mac, WLAN_WIFI_POS_PASN_PEER_TYPE_MAX); + wifi_pos_update_pasn_peer_count(vdev, false); + } status = wifi_pos_check_and_initiate_pasn_authentication(psoc, vdev, pasn_context); @@ -464,10 +500,32 @@ QDF_STATUS wifi_pos_handle_ranging_peer_delete(struct wlan_objmgr_psoc *psoc, struct wlan_objmgr_peer *peer; struct wlan_pasn_request *del_peer_list; struct wlan_objmgr_vdev *vdev; + struct wifi_pos_vdev_priv_obj *vdev_pos_obj; bool no_fw_peer_delete; uint8_t peer_count = 0, i; QDF_STATUS status = QDF_STATUS_SUCCESS; + vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id, + WLAN_WIFI_POS_CORE_ID); + if (!vdev) { + wifi_pos_err("Vdev object is null"); + return QDF_STATUS_E_FAILURE; + } + + vdev_pos_obj = wifi_pos_get_vdev_priv_obj(vdev); + if (!vdev_pos_obj) { + wlan_objmgr_vdev_release_ref(vdev, WLAN_WIFI_POS_CORE_ID); + wifi_pos_err("Wifi pos vdev priv obj is null"); + return QDF_STATUS_E_FAILURE; + } + + if (vdev_pos_obj->is_delete_all_pasn_peer_in_progress) { + wlan_objmgr_vdev_release_ref(vdev, WLAN_WIFI_POS_CORE_ID); + wifi_pos_err("Vdev delete all peer in progress. Ignore indvidual peer delete"); + return QDF_STATUS_SUCCESS; + } + wlan_objmgr_vdev_release_ref(vdev, WLAN_WIFI_POS_CORE_ID); + legacy_cb = wifi_pos_get_legacy_ops(psoc); if (!legacy_cb || !legacy_cb->pasn_peer_delete_cb) { wifi_pos_err("legacy callback is not registered"); @@ -640,3 +698,96 @@ bool wifi_pos_is_ltf_keyseed_required_for_peer(struct wlan_objmgr_peer *peer) return peer_priv->is_ltf_keyseed_required; } + +static +void wifi_pos_delete_objmgr_ranging_peer(struct wlan_objmgr_vdev *vdev, + void *object, void *arg) +{ + struct wlan_objmgr_peer *peer = object; + QDF_STATUS status; + + status = wlan_objmgr_peer_obj_delete(peer); + if (QDF_IS_STATUS_ERROR(status)) + wifi_pos_err("Failed to delete peer"); +} + +QDF_STATUS +wifi_pos_vdev_delete_all_ranging_peers(struct wlan_objmgr_vdev *vdev) +{ + QDF_STATUS status; + struct vdev_mlme_obj *vdev_mlme; + struct wifi_pos_vdev_priv_obj *vdev_pos_obj; + struct peer_delete_all_params param; + + vdev_pos_obj = wifi_pos_get_vdev_priv_obj(vdev); + if (!vdev_pos_obj) { + wifi_pos_err("Wifi pos vdev priv obj is null"); + return QDF_STATUS_E_FAILURE; + } + + if (!vdev_pos_obj->num_pasn_peers) + return QDF_STATUS_SUCCESS; + + vdev_pos_obj->is_delete_all_pasn_peer_in_progress = true; + status = wlan_objmgr_iterate_peerobj_list(vdev, + wifi_pos_delete_objmgr_ranging_peer, + NULL, WLAN_WIFI_POS_CORE_ID); + if (QDF_IS_STATUS_ERROR(status)) + wifi_pos_err("Delete objmgr peers failed"); + + vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); + if (!vdev_mlme) { + wifi_pos_err(" VDEV MLME component object is NULL"); + return QDF_STATUS_E_FAILURE; + } + + param.vdev_id = wlan_vdev_get_id(vdev); + param.peer_type_bitmap = BIT(WLAN_PEER_RTT_PASN); + + status = tgt_vdev_mgr_peer_delete_all_send(vdev_mlme, ¶m); + if (QDF_IS_STATUS_ERROR(status)) + wifi_pos_err("Send vdev delete all peers failed"); + + return status; +} + +QDF_STATUS +wifi_pos_vdev_delete_all_ranging_peers_rsp(struct wlan_objmgr_psoc *psoc, + uint8_t vdev_id) +{ + struct wifi_pos_legacy_ops *legacy_cb; + struct wlan_objmgr_vdev *vdev; + struct wifi_pos_vdev_priv_obj *vdev_pos_obj; + QDF_STATUS status; + + vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id, + WLAN_WIFI_POS_CORE_ID); + if (!vdev) { + wifi_pos_err(" VDEV is NULL"); + return QDF_STATUS_E_FAILURE; + } + + vdev_pos_obj = wifi_pos_get_vdev_priv_obj(vdev); + if (!vdev_pos_obj) { + wifi_pos_err("Wifi pos vdev priv obj is null"); + wlan_objmgr_vdev_release_ref(vdev, WLAN_WIFI_POS_CORE_ID); + return QDF_STATUS_E_FAILURE; + } + + vdev_pos_obj->is_delete_all_pasn_peer_in_progress = false; + + legacy_cb = wifi_pos_get_legacy_ops(psoc); + if (!legacy_cb || !legacy_cb->pasn_vdev_delete_resume_cb) { + wlan_objmgr_vdev_release_ref(vdev, WLAN_WIFI_POS_CORE_ID); + wifi_pos_err("legacy callbacks is not registered"); + return QDF_STATUS_E_FAILURE; + } + + status = legacy_cb->pasn_vdev_delete_resume_cb(vdev); + if (QDF_IS_STATUS_ERROR(status)) + wifi_pos_err("Delete all PASN peer failed"); + + wlan_objmgr_vdev_release_ref(vdev, WLAN_WIFI_POS_CORE_ID); + + return status; +} diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c index 1a28bd9a90..19cedfde02 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/wmi/src/wmi_unified_tlv.c @@ -1396,6 +1396,30 @@ static QDF_STATUS send_peer_delete_cmd_tlv(wmi_unified_t wmi, return 0; } +static void +wmi_get_converted_peer_bitmap(uint32_t src_peer_bitmap, uint32_t *dst_bitmap) +{ + if (QDF_HAS_PARAM(src_peer_bitmap, WLAN_PEER_SELF)) + WMI_VDEV_DELETE_ALL_PEER_BITMAP_SET(dst_bitmap, + WMI_PEER_TYPE_DEFAULT); + + if (QDF_HAS_PARAM(src_peer_bitmap, WLAN_PEER_AP)) + WMI_VDEV_DELETE_ALL_PEER_BITMAP_SET(dst_bitmap, + WMI_PEER_TYPE_BSS); + + if (QDF_HAS_PARAM(src_peer_bitmap, WLAN_PEER_TDLS)) + WMI_VDEV_DELETE_ALL_PEER_BITMAP_SET(dst_bitmap, + WMI_PEER_TYPE_TDLS); + + if (QDF_HAS_PARAM(src_peer_bitmap, WLAN_PEER_NDP)) + WMI_VDEV_DELETE_ALL_PEER_BITMAP_SET(dst_bitmap, + WMI_PEER_TYPE_NAN_DATA); + + if (QDF_HAS_PARAM(src_peer_bitmap, WLAN_PEER_RTT_PASN)) + WMI_VDEV_DELETE_ALL_PEER_BITMAP_SET(dst_bitmap, + WMI_PEER_TYPE_PASN); +} + /** * send_peer_delete_all_cmd_tlv() - send PEER delete all command to fw * @wmi: wmi handle @@ -1422,8 +1446,11 @@ static QDF_STATUS send_peer_delete_all_cmd_tlv( WMITLV_GET_STRUCT_TLVLEN (wmi_vdev_delete_all_peer_cmd_fixed_param)); cmd->vdev_id = param->vdev_id; + wmi_get_converted_peer_bitmap(param->peer_type_bitmap, + cmd->peer_type_bitmap); - wmi_debug("vdev_id %d", cmd->vdev_id); + wmi_debug("vdev_id %d peer_type_bitmap:%d", cmd->vdev_id, + param->peer_type_bitmap); wmi_mtrace(WMI_VDEV_DELETE_ALL_PEER_CMDID, cmd->vdev_id, 0); if (wmi_unified_cmd_send(wmi, buf, len, WMI_VDEV_DELETE_ALL_PEER_CMDID)) {