Jelajahi Sumber

qcacmn: Update address search flags for TDLS

Add support to set address search flags in WLAN Tx Descriptor
for TDLS operation

Change-Id: Iafb15fb1efd84a4bef436062368401a5496e4468
CRs-Fixed: 2041759
Kabilan Kannan 8 tahun lalu
induk
melakukan
56bfd8fdb3

+ 4 - 1
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

+ 2 - 0
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;
 	}

+ 8 - 1
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

+ 2 - 0
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;

+ 14 - 0
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;

+ 7 - 0
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,

+ 3 - 0
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;
 };

+ 13 - 0
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;
 };
 

+ 1 - 0
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;