diff --git a/dp/inc/cdp_txrx_cmn_struct.h b/dp/inc/cdp_txrx_cmn_struct.h index 074f9a992a59..63645f8e21b4 100644 --- a/dp/inc/cdp_txrx_cmn_struct.h +++ b/dp/inc/cdp_txrx_cmn_struct.h @@ -440,13 +440,16 @@ struct cdp_soc_t { * to set values in vdev * @CDP_ENABLE_NAWDS: set nawds enable/disable * @CDP_ENABLE_MCAST_EN: enable/disable multicast enhancement - * + * @CDP_ENABLE_WDS: wds sta + * @CDP_ENABLE_PROXYSTA: proxy sta + * @CDP_UPDATE_TDLS_FLAGS: tdls link flags */ enum cdp_vdev_param_type { CDP_ENABLE_NAWDS, CDP_ENABLE_MCAST_EN, CDP_ENABLE_WDS, CDP_ENABLE_PROXYSTA, + CDP_UPDATE_TDLS_FLAGS, }; #define TXRX_FW_STATS_TXSTATS 1 diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index a571e525c5dd..c1330f93f590 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -3212,6 +3212,8 @@ static void dp_set_vdev_param(struct cdp_vdev *vdev_handle, case CDP_ENABLE_PROXYSTA: vdev->proxysta_vdev = val; break; + case CDP_UPDATE_TDLS_FLAGS: + vdev->tdls_link_connected = val; default: break; } diff --git a/dp/wifi3.0/dp_tx.c b/dp/wifi3.0/dp_tx.c index f7af96520beb..503b3a21640b 100644 --- a/dp/wifi3.0/dp_tx.c +++ b/dp/wifi3.0/dp_tx.c @@ -1995,13 +1995,20 @@ QDF_STATUS dp_tx_vdev_attach(struct dp_vdev *vdev) void dp_tx_vdev_update_search_flags(struct dp_vdev *vdev) { /* + * Enable both AddrY (SA based search) and AddrX (Da based search) + * for TDLS link + * * Enable AddrY (SA based search) only for non-WDS STA and * ProxySTA VAP modes. * * In all other VAP modes, only DA based search should be * enabled */ - if ((vdev->opmode == wlan_op_mode_sta && + if (vdev->opmode == wlan_op_mode_sta && + vdev->tdls_link_connected) + vdev->hal_desc_addr_search_flags = + (HAL_TX_DESC_ADDRX_EN | HAL_TX_DESC_ADDRY_EN); + else if ((vdev->opmode == wlan_op_mode_sta && (!vdev->wds_enabled || vdev->proxysta_vdev))) vdev->hal_desc_addr_search_flags = HAL_TX_DESC_ADDRY_EN; else diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index bf9591403f6a..ff983f63c824 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -920,6 +920,8 @@ struct dp_vdev { privacy_exemption privacy_filters[MAX_PRIVACY_FILTERS]; uint32_t filters_num; #endif + /* TDLS Link status */ + bool tdls_link_connected; /* VDEV operating mode */ enum wlan_op_mode opmode; diff --git a/umac/tdls/core/src/wlan_tdls_cmds_process.c b/umac/tdls/core/src/wlan_tdls_cmds_process.c index 35cd7f3e7df8..80a7ef387397 100644 --- a/umac/tdls/core/src/wlan_tdls_cmds_process.c +++ b/umac/tdls/core/src/wlan_tdls_cmds_process.c @@ -1693,6 +1693,13 @@ QDF_STATUS tdls_process_enable_link(struct tdls_oper_request *req) tdls_increment_peer_count(soc_obj); feature = soc_obj->tdls_configs.tdls_feature_flags; + if (soc_obj->tdls_dp_vdev_update) + soc_obj->tdls_dp_vdev_update(&soc_obj->soc, + peer->sta_id, + soc_obj->tdls_update_dp_vdev_flags, + ((peer->link_status == + TDLS_LINK_CONNECTED) ? true : false)); + tdls_debug("TDLS buffer sta: %d, uapsd_mask %d", TDLS_IS_BUFFER_STA_ENABLED(feature), soc_obj->tdls_configs.tdls_uapsd_mask); @@ -1911,6 +1918,13 @@ QDF_STATUS tdls_process_remove_force_peer(struct tdls_oper_request *req) tdls_set_peer_link_status(peer, TDLS_LINK_TEARING, TDLS_LINK_UNSPECIFIED); + if (soc_obj->tdls_dp_vdev_update) + soc_obj->tdls_dp_vdev_update(&soc_obj->soc, + peer->sta_id, + soc_obj->tdls_update_dp_vdev_flags, + ((peer->link_status == + TDLS_LINK_CONNECTED) ? true : false)); + if (soc_obj->tdls_event_cb) { qdf_mem_copy(ind.peer_mac, macaddr, QDF_MAC_ADDR_SIZE); ind.vdev = vdev; diff --git a/umac/tdls/core/src/wlan_tdls_ct.c b/umac/tdls/core/src/wlan_tdls_ct.c index 2e8b60e8b656..d6e73f69746b 100644 --- a/umac/tdls/core/src/wlan_tdls_ct.c +++ b/umac/tdls/core/src/wlan_tdls_ct.c @@ -536,6 +536,13 @@ void tdls_indicate_teardown(struct tdls_vdev_priv_obj *tdls_vdev, TDLS_LINK_UNSPECIFIED); tdls_notice("Teardown reason %d", reason); + if (tdls_soc->tdls_dp_vdev_update) + tdls_soc->tdls_dp_vdev_update(&tdls_soc->soc, + curr_peer->sta_id, + tdls_soc->tdls_update_dp_vdev_flags, + ((curr_peer->link_status == + TDLS_LINK_CONNECTED) ? true : false)); + indication.reason = reason; indication.vdev = tdls_vdev->vdev; qdf_mem_copy(indication.peer_mac, curr_peer->peer_mac.bytes, diff --git a/umac/tdls/core/src/wlan_tdls_main.h b/umac/tdls/core/src/wlan_tdls_main.h index f6096f2ef3e3..b250c4d3d8b3 100644 --- a/umac/tdls/core/src/wlan_tdls_main.h +++ b/umac/tdls/core/src/wlan_tdls_main.h @@ -181,6 +181,7 @@ struct tdls_set_state_info { * @tdls_del_sta_req: store eWNI_SME_TDLS_DEL_STA_REQ value * @tdls_update_peer_state: store WMA_UPDATE_TDLS_PEER_STATE value * @tdls_del_all_peers:store eWNI_SME_DEL_ALL_TDLS_PEERS + * @tdls_update_dp_vdev_flags store CDP_UPDATE_TDLS_FLAGS * @tdls_idle_peer_data: provide information about idle peer * @tdls_ct_spinlock: connection tracker spin lock */ @@ -215,6 +216,7 @@ struct tdls_soc_priv_obj { void *tdls_evt_cb_data; tdls_register_tl_peer_callback tdls_reg_tl_peer; tdls_deregister_tl_peer_callback tdls_dereg_tl_peer; + tdls_dp_vdev_update_flags_callback tdls_dp_vdev_update; void *tdls_tl_peer_data; qdf_list_t tx_q_ack; enum tdls_conc_cap tdls_con_cap; @@ -223,6 +225,7 @@ struct tdls_soc_priv_obj { uint16_t tdls_del_sta_req; uint16_t tdls_update_peer_state; uint16_t tdls_del_all_peers; + uint32_t tdls_update_dp_vdev_flags; struct tdls_ct_idle_peer_data tdls_idle_peer_data; qdf_spinlock_t tdls_ct_spinlock; }; diff --git a/umac/tdls/dispatcher/inc/wlan_tdls_public_structs.h b/umac/tdls/dispatcher/inc/wlan_tdls_public_structs.h index 3632af50a163..974fca313b81 100644 --- a/umac/tdls/dispatcher/inc/wlan_tdls_public_structs.h +++ b/umac/tdls/dispatcher/inc/wlan_tdls_public_structs.h @@ -530,6 +530,14 @@ typedef QDF_STATUS (*tdls_register_tl_peer_callback)(void *userdata, typedef QDF_STATUS (*tdls_deregister_tl_peer_callback)(void *userdata, uint32_t vdev_id, uint8_t sta_id); + +/* This callback is used to update datapath vdev flags */ +typedef QDF_STATUS +(*tdls_dp_vdev_update_flags_callback)(void *cbk_data, + uint8_t sta_id, + uint32_t vdev_param, + bool is_link_up); + /** * struct tdls_start_params - tdls start params * @config: tdls user config @@ -537,12 +545,15 @@ typedef QDF_STATUS (*tdls_deregister_tl_peer_callback)(void *userdata, * @tdls_add_sta_req: pass eWNI_SME_TDLS_ADD_STA_REQ value * @tdls_del_sta_req: pass eWNI_SME_TDLS_DEL_STA_REQ value * @tdls_update_peer_state: pass WMA_UPDATE_TDLS_PEER_STATE value + * @tdls_del_all_peers: pass eWNI_SME_DEL_ALL_TDLS_PEERS + * @tdls_update_dp_vdev_flags: pass CDP_UPDATE_TDLS_FLAGS * @tdls_event_cb: tdls event callback * @tdls_evt_cb_data: tdls event data * @ack_cnf_cb: tdls tx ack callback to indicate the tx status * @tx_ack_cnf_cb_data: tdls tx ack user data * @tdls_reg_tl_peer: tdls register tdls peer * @tdls_dereg_tl_peer: tdls deregister tdls peer + * @tdls_dp_vdev_update: update vdev flags in datapath * @tdls_tl_peer_data: userdata for register/deregister TDLS peer */ struct tdls_start_params { @@ -552,6 +563,7 @@ struct tdls_start_params { uint16_t tdls_del_sta_req; uint16_t tdls_update_peer_state; uint16_t tdls_del_all_peers; + uint32_t tdls_update_dp_vdev_flags; tdls_rx_callback tdls_rx_cb; void *tdls_rx_cb_data; tdls_wmm_check tdls_wmm_cb; @@ -562,6 +574,7 @@ struct tdls_start_params { void *tx_ack_cnf_cb_data; tdls_register_tl_peer_callback tdls_reg_tl_peer; tdls_deregister_tl_peer_callback tdls_dereg_tl_peer; + tdls_dp_vdev_update_flags_callback tdls_dp_vdev_update; void *tdls_tl_peer_data; }; diff --git a/umac/tdls/dispatcher/src/wlan_tdls_ucfg_api.c b/umac/tdls/dispatcher/src/wlan_tdls_ucfg_api.c index 2dca630659d0..427c183ae420 100644 --- a/umac/tdls/dispatcher/src/wlan_tdls_ucfg_api.c +++ b/umac/tdls/dispatcher/src/wlan_tdls_ucfg_api.c @@ -217,6 +217,7 @@ QDF_STATUS ucfg_tdls_update_config(struct wlan_objmgr_psoc *psoc, soc_obj->tdls_del_sta_req = req->tdls_del_sta_req; soc_obj->tdls_update_peer_state = req->tdls_update_peer_state; soc_obj->tdls_del_all_peers = req->tdls_del_all_peers; + soc_obj->tdls_update_dp_vdev_flags = req->tdls_update_dp_vdev_flags; tdls_pm_call_backs.tdls_notify_increment_session = tdls_notify_increment_session;