diff --git a/core/mac/src/pe/include/lim_session.h b/core/mac/src/pe/include/lim_session.h index 5da5e94c64da..b691b7374f52 100644 --- a/core/mac/src/pe/include/lim_session.h +++ b/core/mac/src/pe/include/lim_session.h @@ -366,6 +366,7 @@ struct pe_session { uint32_t peerAIDBitmap[2]; bool tdls_prohibited; bool tdls_chan_swit_prohibited; + bool tdls_send_set_state_disable; #endif bool fWaitForProbeRsp; bool fIgnoreCapsChange; diff --git a/core/mac/src/pe/lim/lim_process_probe_rsp_frame.c b/core/mac/src/pe/lim/lim_process_probe_rsp_frame.c index 661e8a3fd020..b5080f2ee4a5 100644 --- a/core/mac/src/pe/lim/lim_process_probe_rsp_frame.c +++ b/core/mac/src/pe/lim/lim_process_probe_rsp_frame.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011-2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2011-2019 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -221,6 +221,8 @@ lim_process_probe_rsp_frame(struct mac_context *mac_ctx, uint8_t *rx_Packet_info * from AP, delete all TDLS peers before * leaving BSS and proceed for channel switch */ + lim_update_tdls_set_state_for_fw(session_entry, + false); lim_delete_tdls_peers(mac_ctx, session_entry); lim_update_channel_switch(mac_ctx, diff --git a/core/mac/src/pe/lim/lim_process_tdls.c b/core/mac/src/pe/lim/lim_process_tdls.c index 18d65ac7cd85..f589a5ab95c9 100644 --- a/core/mac/src/pe/lim/lim_process_tdls.c +++ b/core/mac/src/pe/lim/lim_process_tdls.c @@ -3163,6 +3163,12 @@ skip: } } +void lim_update_tdls_set_state_for_fw(struct pe_session *session_entry, + bool value) +{ + session_entry->tdls_send_set_state_disable = value; +} + /** * lim_delete_tdls_peers() - delete tdls peers * @@ -3187,13 +3193,22 @@ QDF_STATUS lim_delete_tdls_peers(struct mac_context *mac_ctx, if (lim_is_roam_synch_in_progress(session_entry)) return QDF_STATUS_SUCCESS; - - tgt_tdls_peers_deleted_notification(mac_ctx->psoc, - session_entry->smeSessionId); + /* In case of CSA, Only peers in lim and TDLS component + * needs to be removed and set state disable command + * should not be sent to fw as there is no way to enable + * TDLS in FW after vdev restart. + */ + if (session_entry->tdls_send_set_state_disable) { + tgt_tdls_peers_deleted_notification(mac_ctx->psoc, + session_entry-> + smeSessionId); + } tgt_tdls_delete_all_peers_indication(mac_ctx->psoc, session_entry->smeSessionId); + /* reset the set_state_disable flag */ + session_entry->tdls_send_set_state_disable = true; pe_debug("Exit"); return QDF_STATUS_SUCCESS; } diff --git a/core/mac/src/pe/lim/lim_send_sme_rsp_messages.c b/core/mac/src/pe/lim/lim_send_sme_rsp_messages.c index 7533a95ee3b5..adb4fb4b3363 100644 --- a/core/mac/src/pe/lim/lim_send_sme_rsp_messages.c +++ b/core/mac/src/pe/lim/lim_send_sme_rsp_messages.c @@ -1898,11 +1898,12 @@ void lim_handle_csa_offload_msg(struct mac_context *mac_ctx, qdf_mem_free(csa_offload_ind); goto err; } - /* * on receiving channel switch announcement from AP, delete all * TDLS peers before leaving BSS and proceed for channel switch */ + + lim_update_tdls_set_state_for_fw(session_entry, false); lim_delete_tdls_peers(mac_ctx, session_entry); lim_ch_switch = &session_entry->gLimChannelSwitch; diff --git a/core/mac/src/pe/lim/lim_session.c b/core/mac/src/pe/lim/lim_session.c index c52662f1a7ae..375e5835ec9a 100644 --- a/core/mac/src/pe/lim/lim_session.c +++ b/core/mac/src/pe/lim/lim_session.c @@ -632,6 +632,7 @@ struct pe_session *pe_create_session(struct mac_context *mac, session_ptr->tdls_prohibited = false; session_ptr->tdls_chan_swit_prohibited = false; #endif + lim_update_tdls_set_state_for_fw(session_ptr, true); session_ptr->fWaitForProbeRsp = 0; session_ptr->fIgnoreCapsChange = 0; session_ptr->ignore_assoc_disallowed = mac->ignore_assoc_disallowed; diff --git a/core/mac/src/pe/lim/lim_types.h b/core/mac/src/pe/lim/lim_types.h index bbe58b8ca2cb..0aaf3dd8b4e2 100644 --- a/core/mac/src/pe/lim/lim_types.h +++ b/core/mac/src/pe/lim/lim_types.h @@ -607,6 +607,18 @@ QDF_STATUS lim_process_tdls_add_sta_rsp(struct mac_context *mac, void *msg, stru void lim_process_tdls_del_sta_rsp(struct mac_context *mac_ctx, struct scheduler_msg *lim_msg, struct pe_session *session_entry); + +/** + * lim_update_tdls_state_in_fw() - Update TDLS state in FW + * + * @session_entry - PE sessions + * @value -value to be updated + * + * + * Return: void + */ +void lim_update_tdls_set_state_for_fw(struct pe_session *session_entry, + bool value); #else static inline QDF_STATUS lim_delete_tdls_peers(struct mac_context *mac_ctx, struct pe_session *session_entry) @@ -617,6 +629,11 @@ static inline void lim_init_tdls_data(struct mac_context *mac, struct pe_session *pe_session) { +} + +static inline void lim_update_tdls_set_state_for_fw(struct pe_session + *session_entry, bool value) +{ } #endif diff --git a/core/mac/src/pe/lim/lim_utils.c b/core/mac/src/pe/lim/lim_utils.c index d7ec25505bf6..2b2e4848405a 100644 --- a/core/mac/src/pe/lim/lim_utils.c +++ b/core/mac/src/pe/lim/lim_utils.c @@ -4148,6 +4148,11 @@ void lim_update_sta_run_time_ht_switch_chnl_params(struct mac_context *mac, (ePhyChanBondState) pHTInfo->secondaryChannelOffset; pe_session->htRecommendedTxWidthSet = (uint8_t) pHTInfo->recommendedTxWidthSet; + + /* Before restarting vdev, delete the tdls peers */ + lim_update_tdls_set_state_for_fw(pe_session, false); + lim_delete_tdls_peers(mac, pe_session); + lim_ht_switch_chnl_req(pe_session); /* In case of IBSS, if STA should update HT Info IE in its beacons. */ diff --git a/core/mac/src/pe/sch/sch_beacon_process.c b/core/mac/src/pe/sch/sch_beacon_process.c index abd629da24e6..0acaf4747a7f 100644 --- a/core/mac/src/pe/sch/sch_beacon_process.c +++ b/core/mac/src/pe/sch/sch_beacon_process.c @@ -858,9 +858,11 @@ static void __sch_beacon_process_for_session(struct mac_context *mac_ctx, * delete all TDLS peers before leaving BSS and proceed * for channel switch */ - if (LIM_IS_STA_ROLE(session)) + if (LIM_IS_STA_ROLE(session)) { + lim_update_tdls_set_state_for_fw(session, + false); lim_delete_tdls_peers(mac_ctx, session); - + } lim_update_channel_switch(mac_ctx, bcn, session); } else if (session->gLimSpecMgmt.dot11hChanSwState == eLIM_11H_CHANSW_RUNNING) {