diff --git a/dp/inc/cdp_txrx_cmn_struct.h b/dp/inc/cdp_txrx_cmn_struct.h index 444813202f..6596dda117 100644 --- a/dp/inc/cdp_txrx_cmn_struct.h +++ b/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 * @primary_umac_id: primary umac_id * @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 { uint8_t *mld_peer_mac; @@ -481,6 +482,7 @@ struct cdp_peer_setup_info { is_primary_link:1; uint8_t primary_umac_id; uint8_t num_links; + uint8_t is_bridge_peer; }; /** diff --git a/dp/inc/cdp_txrx_ops.h b/dp/inc/cdp_txrx_ops.h index a9a1489889..82871aca06 100644 --- a/dp/inc/cdp_txrx_ops.h +++ b/dp/inc/cdp_txrx_ops.h @@ -2523,6 +2523,16 @@ struct cdp_sawf_ops { uint8_t start_or_stop, uint8_t *peer_mac, uint16_t peer_id); #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 diff --git a/dp/inc/cdp_txrx_sawf.h b/dp/inc/cdp_txrx_sawf.h index ea6a33ad72..d9d134ec7e 100644 --- a/dp/inc/cdp_txrx_sawf.h +++ b/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; } #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_ */ diff --git a/dp/wifi3.0/be/dp_be_tx.c b/dp/wifi3.0/be/dp_be_tx.c index 24f8a2d9d5..3c8cdb9722 100644 --- a/dp/wifi3.0/be/dp_be_tx.c +++ b/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 * @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 tid = HTT_TX_EXT_TID_INVALID; q_id = dp_sawf_queue_id_get(nbuf); 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, (q_id & (CDP_DATA_TID_MAX - 1))); if ((q_id >= DP_SAWF_DEFAULT_QUEUE_MIN) && (q_id < DP_SAWF_DEFAULT_QUEUE_MAX)) - return; + return tid; 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, DP_TX_FLOW_OVERRIDE_ENABLE); hal_tx_desc_set_flow_override(hal_tx_desc_cached, DP_TX_FLOW_OVERRIDE_GET(q_id)); hal_tx_desc_set_who_classify_info_sel(hal_tx_desc_cached, DP_TX_WHO_CLFY_INF_SEL_GET(q_id)); + + return tid; } #else 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 @@ -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; uint8_t tid = HTT_TX_EXT_TID_INVALID; 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)) 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->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) { 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; diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 0f5a5f18e0..4fb2935758 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -5948,7 +5948,7 @@ QDF_STATUS dp_peer_mlo_setup( /* associate mld and link 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; 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, .sawf_peer_flow_count = dp_sawf_peer_flow_count, #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 diff --git a/dp/wifi3.0/dp_peer.h b/dp/wifi3.0/dp_peer.h index 630e8aec58..e54028c30c 100644 --- a/dp/wifi3.0/dp_peer.h +++ b/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 * @mld_peer: mld dp peer pointer * @link_peer: link dp peer pointer + * @is_bridge_peer: flag to indicate if peer is bridge peer * * Return: None */ static inline 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; 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->chip_id = dp_get_chip_id(link_peer->vdev->pdev->soc); + link_peer_info->is_bridge_peer = is_bridge_peer; mld_peer->num_links++; break; } diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index cdd2524f9e..0c760f2ef4 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -4439,12 +4439,14 @@ struct dp_peer_mesh_latency_parameter { * @vdev_id: Vdev ID for current link peer * @is_valid: flag for link peer info valid or not * @chip_id: chip id + * @is_bridge_peer: flag to indicate if peer is bridge peer */ struct dp_peer_link_info { union dp_align_mac_addr mac_addr; uint8_t vdev_id; uint8_t is_valid; 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]; uint8_t num_links; 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 #ifdef CONFIG_SAWF_DEF_QUEUES struct dp_peer_sawf *sawf;