Browse Source

qcacmn: MLO 3 link simultaneous tx transmission

MLO 3 link simultaneous tx transmission.

Change-Id: I1f92e49a5ea634f99e354dd02737c74bae20c483
CRs-Fixed: 3634563
Himanshu Batra 1 năm trước cách đây
mục cha
commit
7dbcea96f9

+ 2 - 0
dp/inc/cdp_txrx_cmn_struct.h

@@ -474,6 +474,7 @@ enum cdp_peer_type {
  * @is_primary_link: set true for MLO primary link peer
  * @is_primary_link: set true for MLO primary link peer
  * @primary_umac_id: primary umac_id
  * @primary_umac_id: primary umac_id
  * @num_links: number of links in MLO
  * @num_links: number of links in MLO
+ * @is_bridge_peer: flag to indicate if peer is bridge peer or not
  */
  */
 struct cdp_peer_setup_info {
 struct cdp_peer_setup_info {
 	uint8_t *mld_peer_mac;
 	uint8_t *mld_peer_mac;
@@ -481,6 +482,7 @@ struct cdp_peer_setup_info {
 		is_primary_link:1;
 		is_primary_link:1;
 	uint8_t primary_umac_id;
 	uint8_t primary_umac_id;
 	uint8_t num_links;
 	uint8_t num_links;
+	uint8_t is_bridge_peer;
 };
 };
 
 
 /**
 /**

+ 10 - 0
dp/inc/cdp_txrx_ops.h

@@ -2523,6 +2523,16 @@ struct cdp_sawf_ops {
 				uint8_t start_or_stop, uint8_t *peer_mac,
 				uint8_t start_or_stop, uint8_t *peer_mac,
 				uint16_t peer_id);
 				uint16_t peer_id);
 #endif
 #endif
+#ifdef WLAN_FEATURE_11BE_MLO_3_LINK_TX
+	uint16_t
+	(*get_peer_msduq)(struct net_device *netdev, uint8_t *dest_mac,
+			  uint32_t dscp_pcp, bool pcp);
+	QDF_STATUS
+	(*sawf_3_link_peer_flow_count)(struct cdp_soc_t *hdl,
+				       uint8_t *mac_addr,
+				       uint16_t peer_id,
+				       uint32_t mark_metadata);
+#endif
 };
 };
 #endif
 #endif
 
 

+ 33 - 0
dp/inc/cdp_txrx_sawf.h

@@ -451,4 +451,37 @@ cdp_swaf_peer_sla_configuration(ol_txrx_soc_handle soc, uint8_t *mac_addr,
 	return QDF_STATUS_E_FAILURE;
 	return QDF_STATUS_E_FAILURE;
 }
 }
 #endif
 #endif
+
+#ifdef WLAN_FEATURE_11BE_MLO_3_LINK_TX
+static inline
+uint16_t cdp_sawf_get_peer_msduq(ol_txrx_soc_handle soc,
+				 struct net_device *netdev, uint8_t *dest_mac,
+				 uint32_t dscp_pcp, bool pcp)
+{
+	if (!soc || !soc->ops || !soc->ops->sawf_ops ||
+	    !soc->ops->sawf_ops->get_peer_msduq) {
+		dp_cdp_debug("Invalid Instance");
+		QDF_BUG(0);
+		return false;
+	}
+
+	return soc->ops->sawf_ops->get_peer_msduq
+		(netdev, dest_mac, dscp_pcp, pcp);
+}
+
+static inline QDF_STATUS
+cdp_sawf_3_link_peer_flow_count(ol_txrx_soc_handle soc, uint8_t *mac_addr,
+				uint16_t peer_id, uint32_t mark_metadata)
+{
+	if (!soc || !soc->ops || !soc->ops->sawf_ops ||
+	    !soc->ops->sawf_ops->sawf_3_link_peer_flow_count) {
+		dp_cdp_debug("Invalid Instance");
+		QDF_BUG(0);
+		return false;
+	}
+
+	return soc->ops->sawf_ops->sawf_3_link_peer_flow_count
+		(soc, mac_addr, peer_id, mark_metadata);
+}
+#endif
 #endif /* _CDP_TXRX_SAWF_H_ */
 #endif /* _CDP_TXRX_SAWF_H_ */

+ 29 - 12
dp/wifi3.0/be/dp_be_tx.c

@@ -973,45 +973,54 @@ bool dp_tx_mlo_is_mcast_primary_be(struct dp_soc *soc,
  * @nbuf: skb buffer
  * @nbuf: skb buffer
  * @msdu_info: msdu info
  * @msdu_info: msdu info
  *
  *
- * Return: void
+ * Return: tid value in mark metadata
  */
  */
-void dp_sawf_config_be(struct dp_soc *soc, uint32_t *hal_tx_desc_cached,
-		       uint16_t *fw_metadata, qdf_nbuf_t nbuf,
-		       struct dp_tx_msdu_info_s *msdu_info)
+uint8_t dp_sawf_config_be(struct dp_soc *soc, uint32_t *hal_tx_desc_cached,
+			  uint16_t *fw_metadata, qdf_nbuf_t nbuf,
+			  struct dp_tx_msdu_info_s *msdu_info)
 {
 {
 	uint8_t q_id = 0;
 	uint8_t q_id = 0;
+	uint8_t tid = HTT_TX_EXT_TID_INVALID;
 
 
 	q_id = dp_sawf_queue_id_get(nbuf);
 	q_id = dp_sawf_queue_id_get(nbuf);
 
 
 	if (q_id == DP_SAWF_DEFAULT_Q_INVALID)
 	if (q_id == DP_SAWF_DEFAULT_Q_INVALID)
-		return;
-	msdu_info->tid = (q_id & (CDP_DATA_TID_MAX - 1));
+		return HTT_TX_EXT_TID_INVALID;
+
+	tid = (q_id & (CDP_DATA_TID_MAX - 1));
+	if (msdu_info)
+		msdu_info->tid = tid;
+
 	hal_tx_desc_set_hlos_tid(hal_tx_desc_cached,
 	hal_tx_desc_set_hlos_tid(hal_tx_desc_cached,
 				 (q_id & (CDP_DATA_TID_MAX - 1)));
 				 (q_id & (CDP_DATA_TID_MAX - 1)));
 
 
 	if ((q_id >= DP_SAWF_DEFAULT_QUEUE_MIN) &&
 	if ((q_id >= DP_SAWF_DEFAULT_QUEUE_MIN) &&
 	    (q_id < DP_SAWF_DEFAULT_QUEUE_MAX))
 	    (q_id < DP_SAWF_DEFAULT_QUEUE_MAX))
-		return;
+		return tid;
 
 
 	if (!wlan_cfg_get_sawf_config(soc->wlan_cfg_ctx))
 	if (!wlan_cfg_get_sawf_config(soc->wlan_cfg_ctx))
-		return;
+		return tid;
 
 
-	dp_sawf_tcl_cmd(fw_metadata, nbuf);
+	if (fw_metadata)
+		dp_sawf_tcl_cmd(fw_metadata, nbuf);
 	hal_tx_desc_set_flow_override_enable(hal_tx_desc_cached,
 	hal_tx_desc_set_flow_override_enable(hal_tx_desc_cached,
 					     DP_TX_FLOW_OVERRIDE_ENABLE);
 					     DP_TX_FLOW_OVERRIDE_ENABLE);
 	hal_tx_desc_set_flow_override(hal_tx_desc_cached,
 	hal_tx_desc_set_flow_override(hal_tx_desc_cached,
 				      DP_TX_FLOW_OVERRIDE_GET(q_id));
 				      DP_TX_FLOW_OVERRIDE_GET(q_id));
 	hal_tx_desc_set_who_classify_info_sel(hal_tx_desc_cached,
 	hal_tx_desc_set_who_classify_info_sel(hal_tx_desc_cached,
 					      DP_TX_WHO_CLFY_INF_SEL_GET(q_id));
 					      DP_TX_WHO_CLFY_INF_SEL_GET(q_id));
+
+	return tid;
 }
 }
 
 
 #else
 #else
 
 
 static inline
 static inline
-void dp_sawf_config_be(struct dp_soc *soc, uint32_t *hal_tx_desc_cached,
-		       uint16_t *fw_metadata, qdf_nbuf_t nbuf,
-		       struct dp_tx_msdu_info_s *msdu_info)
+uint8_t dp_sawf_config_be(struct dp_soc *soc, uint32_t *hal_tx_desc_cached,
+			  uint16_t *fw_metadata, qdf_nbuf_t nbuf,
+			  struct dp_tx_msdu_info_s *msdu_info)
 {
 {
+	return HTT_TX_EXT_TID_INVALID;
 }
 }
 
 
 static inline
 static inline
@@ -1848,6 +1857,7 @@ qdf_nbuf_t dp_tx_fast_send_be(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
 	void *hal_tx_desc;
 	void *hal_tx_desc;
 	uint8_t tid = HTT_TX_EXT_TID_INVALID;
 	uint8_t tid = HTT_TX_EXT_TID_INVALID;
 	uint8_t xmit_type = qdf_nbuf_get_vdev_xmit_type(nbuf);
 	uint8_t xmit_type = qdf_nbuf_get_vdev_xmit_type(nbuf);
+	uint8_t sawf_tid = HTT_TX_EXT_TID_INVALID;
 
 
 	if (qdf_unlikely(vdev_id >= MAX_VDEV_CNT))
 	if (qdf_unlikely(vdev_id >= MAX_VDEV_CNT))
 		return nbuf;
 		return nbuf;
@@ -1930,6 +1940,13 @@ qdf_nbuf_t dp_tx_fast_send_be(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
 	hal_tx_desc_cached[5] = vdev->lmac_id << TCL_DATA_CMD_PMAC_ID_LSB;
 	hal_tx_desc_cached[5] = vdev->lmac_id << TCL_DATA_CMD_PMAC_ID_LSB;
 	hal_tx_desc_cached[5] |= vdev->vdev_id << TCL_DATA_CMD_VDEV_ID_LSB;
 	hal_tx_desc_cached[5] |= vdev->vdev_id << TCL_DATA_CMD_VDEV_ID_LSB;
 
 
+	if (qdf_unlikely(dp_sawf_tag_valid_get(nbuf))) {
+		sawf_tid = dp_sawf_config_be(soc, hal_tx_desc_cached,
+					     NULL, nbuf, NULL);
+		if (sawf_tid != HTT_TX_EXT_TID_INVALID)
+			tid = sawf_tid;
+	}
+
 	if (tid != HTT_TX_EXT_TID_INVALID) {
 	if (tid != HTT_TX_EXT_TID_INVALID) {
 		hal_tx_desc_cached[5] |= tid << TCL_DATA_CMD_HLOS_TID_LSB;
 		hal_tx_desc_cached[5] |= tid << TCL_DATA_CMD_HLOS_TID_LSB;
 		hal_tx_desc_cached[5] |= 1 << TCL_DATA_CMD_HLOS_TID_OVERWRITE_LSB;
 		hal_tx_desc_cached[5] |= 1 << TCL_DATA_CMD_HLOS_TID_OVERWRITE_LSB;

+ 5 - 1
dp/wifi3.0/dp_main.c

@@ -5948,7 +5948,7 @@ QDF_STATUS dp_peer_mlo_setup(
 
 
 		/* associate mld and link peer */
 		/* associate mld and link peer */
 		dp_link_peer_add_mld_peer(peer, mld_peer);
 		dp_link_peer_add_mld_peer(peer, mld_peer);
-		dp_mld_peer_add_link_peer(mld_peer, peer);
+		dp_mld_peer_add_link_peer(mld_peer, peer, setup_info->is_bridge_peer);
 
 
 		mld_peer->txrx_peer->is_mld_peer = 1;
 		mld_peer->txrx_peer->is_mld_peer = 1;
 		dp_peer_unref_delete(mld_peer, DP_MOD_ID_CDP);
 		dp_peer_unref_delete(mld_peer, DP_MOD_ID_CDP);
@@ -12564,6 +12564,10 @@ static struct cdp_sawf_ops dp_ops_sawf = {
 	.swaf_peer_sla_configuration = dp_swaf_peer_sla_configuration,
 	.swaf_peer_sla_configuration = dp_swaf_peer_sla_configuration,
 	.sawf_peer_flow_count = dp_sawf_peer_flow_count,
 	.sawf_peer_flow_count = dp_sawf_peer_flow_count,
 #endif
 #endif
+#ifdef WLAN_FEATURE_11BE_MLO_3_LINK_TX
+	.get_peer_msduq = dp_sawf_get_peer_msduq,
+	.sawf_3_link_peer_flow_count = dp_sawf_3_link_peer_flow_count,
+#endif
 };
 };
 #endif
 #endif
 
 

+ 4 - 1
dp/wifi3.0/dp_peer.h

@@ -1735,12 +1735,14 @@ void dp_mld_peer_deinit_link_peers_info(struct dp_peer *mld_peer)
  * dp_mld_peer_add_link_peer() - add link peer info to mld peer
  * dp_mld_peer_add_link_peer() - add link peer info to mld peer
  * @mld_peer: mld dp peer pointer
  * @mld_peer: mld dp peer pointer
  * @link_peer: link dp peer pointer
  * @link_peer: link dp peer pointer
+ * @is_bridge_peer: flag to indicate if peer is bridge peer
  *
  *
  * Return: None
  * Return: None
  */
  */
 static inline
 static inline
 void dp_mld_peer_add_link_peer(struct dp_peer *mld_peer,
 void dp_mld_peer_add_link_peer(struct dp_peer *mld_peer,
-			       struct dp_peer *link_peer)
+			       struct dp_peer *link_peer,
+			       uint8_t is_bridge_peer)
 {
 {
 	int i;
 	int i;
 	struct dp_peer_link_info *link_peer_info;
 	struct dp_peer_link_info *link_peer_info;
@@ -1757,6 +1759,7 @@ void dp_mld_peer_add_link_peer(struct dp_peer *mld_peer,
 			link_peer_info->vdev_id = link_peer->vdev->vdev_id;
 			link_peer_info->vdev_id = link_peer->vdev->vdev_id;
 			link_peer_info->chip_id =
 			link_peer_info->chip_id =
 				dp_get_chip_id(link_peer->vdev->pdev->soc);
 				dp_get_chip_id(link_peer->vdev->pdev->soc);
+			link_peer_info->is_bridge_peer = is_bridge_peer;
 			mld_peer->num_links++;
 			mld_peer->num_links++;
 			break;
 			break;
 		}
 		}

+ 5 - 0
dp/wifi3.0/dp_types.h

@@ -4439,12 +4439,14 @@ struct dp_peer_mesh_latency_parameter {
  * @vdev_id: Vdev ID for current link peer
  * @vdev_id: Vdev ID for current link peer
  * @is_valid: flag for link peer info valid or not
  * @is_valid: flag for link peer info valid or not
  * @chip_id: chip id
  * @chip_id: chip id
+ * @is_bridge_peer: flag to indicate if peer is bridge peer
  */
  */
 struct dp_peer_link_info {
 struct dp_peer_link_info {
 	union dp_align_mac_addr mac_addr;
 	union dp_align_mac_addr mac_addr;
 	uint8_t vdev_id;
 	uint8_t vdev_id;
 	uint8_t is_valid;
 	uint8_t is_valid;
 	uint8_t chip_id;
 	uint8_t chip_id;
+	uint8_t is_bridge_peer;
 };
 };
 
 
 /**
 /**
@@ -5066,6 +5068,9 @@ struct dp_peer {
 	struct dp_peer_link_info link_peers[DP_MAX_MLO_LINKS];
 	struct dp_peer_link_info link_peers[DP_MAX_MLO_LINKS];
 	uint8_t num_links;
 	uint8_t num_links;
 	DP_MUTEX_TYPE link_peers_info_lock;
 	DP_MUTEX_TYPE link_peers_info_lock;
+#ifdef WLAN_FEATURE_11BE_MLO_3_LINK_TX
+	uint32_t flow_cnt[CDP_DATA_TID_MAX];
+#endif
 #endif
 #endif
 #ifdef CONFIG_SAWF_DEF_QUEUES
 #ifdef CONFIG_SAWF_DEF_QUEUES
 	struct dp_peer_sawf *sawf;
 	struct dp_peer_sawf *sawf;