فهرست منبع

qcacmn: Intra-BSS MLO changes for WKK v2

Use destination chip and pmac IDs from TLV.
Build flag for HW assist feature is not enabled yet,
so code is not exercised.

Change-Id: Ia9175d6597a7a2780f451d99a9f8ece7a16049e5
CRs-Fixed: 3262344
Manoj Ekbote 2 سال پیش
والد
کامیت
eddc343b43
3فایلهای تغییر یافته به همراه72 افزوده شده و 33 حذف شده
  1. 32 24
      dp/wifi3.0/be/dp_be_rx.c
  2. 36 7
      hal/wifi3.0/be/hal_be_rx.h
  3. 4 2
      hal/wifi3.0/be/hal_be_rx_tlv.h

+ 32 - 24
dp/wifi3.0/be/dp_be_rx.c

@@ -149,7 +149,7 @@ dp_rx_set_msdu_lmac_id(qdf_nbuf_t nbuf, uint32_t peer_mdata)
  * dp_rx_process_be() - Brain of the Rx processing functionality
  *		     Called from the bottom half (tasklet/NET_RX_SOFTIRQ)
  * @int_ctx: per interrupt context
- * @hal_ring: opaque pointer to the HAL Rx Ring, which will be serviced
+ * @hal_ring_hdl: opaque pointer to the HAL Rx Ring, which will be serviced
  * @reo_ring_num: ring number (0, 1, 2 or 3) of the reo ring.
  * @quota: No. of units (packets) that can be serviced in one shot.
  *
@@ -1329,13 +1329,6 @@ static inline bool
 dp_rx_intrabss_fwd_mlo_allow(struct dp_txrx_peer *ta_peer,
 			     struct dp_txrx_peer *da_peer)
 {
-	/* one of TA/DA peer should belong to MLO connection peer,
-	 * only MLD peer type is as expected
-	 */
-	if (!IS_MLO_DP_MLD_TXRX_PEER(ta_peer) &&
-	    !IS_MLO_DP_MLD_TXRX_PEER(da_peer))
-		return false;
-
 	/* TA peer and DA peer's vdev should be partner MLO vdevs */
 	if (dp_peer_find_mac_addr_cmp(&ta_peer->vdev->mld_mac_addr,
 				      &da_peer->vdev->mld_mac_addr))
@@ -1355,38 +1348,51 @@ dp_rx_intrabss_fwd_mlo_allow(struct dp_txrx_peer *ta_peer,
 #ifdef INTRA_BSS_FWD_OFFLOAD
 /**
  * dp_rx_intrabss_ucast_check_be() - Check if intrabss is allowed
-				     for unicast frame
- * @soc: SOC handle
+ *				     for unicast frame
  * @nbuf: RX packet buffer
  * @ta_peer: transmitter DP peer handle
+ * @rx_tlv_hdr: Rx TLV header
  * @msdu_metadata: MSDU meta data info
- * @p_tx_vdev_id: get vdev id for Intra-BSS TX
+ * @params: params to be filled in
  *
  * Return: true - intrabss allowed
-	   false - not allow
+ *	   false - not allow
  */
 static bool
 dp_rx_intrabss_ucast_check_be(qdf_nbuf_t nbuf,
 			      struct dp_txrx_peer *ta_peer,
+			      uint8_t *rx_tlv_hdr,
 			      struct hal_rx_msdu_metadata *msdu_metadata,
 			      struct dp_be_intrabss_params *params)
 {
-	uint16_t da_peer_id;
-	struct dp_txrx_peer *da_peer;
-	dp_txrx_ref_handle txrx_ref_handle = NULL;
+	uint8_t dest_chip_id, dest_chip_pmac_id;
+	struct dp_vdev_be *be_vdev =
+		dp_get_be_vdev_from_dp_vdev(ta_peer->vdev);
+	struct dp_soc_be *be_soc =
+		dp_get_be_soc_from_dp_soc(params->dest_soc);
 
 	if (!qdf_nbuf_is_intra_bss(nbuf))
 		return false;
 
-	da_peer_id = dp_rx_peer_metadata_peer_id_get_be(
-						params->dest_soc,
-						msdu_metadata->da_idx);
-	da_peer = dp_txrx_peer_get_ref_by_id(params->dest_soc, da_peer_id,
-					     &txrx_ref_handle, DP_MOD_ID_RX);
-	if (!da_peer)
+	hal_rx_tlv_get_dest_chip_pmac_id(rx_tlv_hdr,
+					 &dest_chip_id,
+					 &dest_chip_pmac_id);
+	qdf_assert_always(dest_chip_id <= (DP_MLO_MAX_DEST_CHIP_ID - 1));
+
+	if (dest_chip_id == be_soc->mlo_chip_id) {
+		/* TODO: adding to self list is better */
+		params->tx_vdev_id = ta_peer->vdev->vdev_id;
+		return true;
+	}
+
+	params->dest_soc =
+		dp_mlo_get_soc_ref_by_chip_id(be_soc->ml_ctxt,
+					      dest_chip_id);
+	if (!params->dest_soc)
 		return false;
-	params->tx_vdev_id = da_peer->vdev->vdev_id;
-	dp_txrx_peer_unref_delete(txrx_ref_handle, DP_MOD_ID_RX);
+
+	params->tx_vdev_id =
+		be_vdev->partner_vdev_list[dest_chip_id][dest_chip_pmac_id];
 
 	return true;
 }
@@ -1395,6 +1401,7 @@ dp_rx_intrabss_ucast_check_be(qdf_nbuf_t nbuf,
 static bool
 dp_rx_intrabss_ucast_check_be(qdf_nbuf_t nbuf,
 			      struct dp_txrx_peer *ta_peer,
+			      uint8_t *rx_tlv_hdr,
 			      struct hal_rx_msdu_metadata *msdu_metadata,
 			      struct dp_be_intrabss_params *params)
 {
@@ -1492,6 +1499,7 @@ rel_da_peer:
 static bool
 dp_rx_intrabss_ucast_check_be(qdf_nbuf_t nbuf,
 			      struct dp_txrx_peer *ta_peer,
+			      uint8_t *rx_tlv_hdr,
 			      struct hal_rx_msdu_metadata *msdu_metadata,
 			      struct dp_be_intrabss_params *params)
 {
@@ -1670,7 +1678,7 @@ bool dp_rx_intrabss_fwd_be(struct dp_soc *soc, struct dp_txrx_peer *ta_peer,
 		return true;
 
 	params.dest_soc = soc;
-	if (dp_rx_intrabss_ucast_check_be(nbuf, ta_peer,
+	if (dp_rx_intrabss_ucast_check_be(nbuf, ta_peer, rx_tlv_hdr,
 					  &msdu_metadata, &params)) {
 		ret = dp_rx_intrabss_ucast_fwd(params.dest_soc, ta_peer,
 					       params.tx_vdev_id,

+ 36 - 7
hal/wifi3.0/be/hal_be_rx.h

@@ -21,6 +21,7 @@
 #define _HAL_BE_RX_H_
 
 #include "hal_be_hw_headers.h"
+#include "hal_be_rx_tlv.h"
 #include "hal_rx.h"
 #include <wbm_release_ring_rx.h>
 
@@ -224,20 +225,28 @@
 #define HAL_RX_PEER_ID_GET(msdu_metadata) \
 	(((msdu_metadata)->da_idx) & HAL_RX_DA_IDX_PEER_ID_MASK)
 
+#define HAL_RX_TLV_DEST_CHIP_ID_GET(_rx_pkt_tlv)	\
+	HAL_RX_MSDU_END(_rx_pkt_tlv).dest_chip_id
+
+#ifdef INTRA_BSS_FWD_OFFLOAD
+#define HAL_RX_TLV_DEST_CHIP_PMAC_ID_GET(_rx_pkt_tlv)	\
+	HAL_RX_MSDU_END(_rx_pkt_tlv).dest_chip_pmac_id
+#endif
+
 /**
  * enum hal_be_rx_wbm_error_source: Indicates which module initiated the
  * release of this buffer or descriptor
  *
- * @ HAL_BE_RX_WBM_ERR_SRC_RXDMA: RXDMA released this buffer or descriptor
- * @ HAL_BE_RX_WBM_ERR_SRC_REO: REO released this buffer or descriptor
- * @ HAL_BE_RX_WBM_ERR_SRC_FW_RX: FW released this buffer or descriptor from the
+ * @HAL_BE_RX_WBM_ERR_SRC_RXDMA: RXDMA released this buffer or descriptor
+ * @HAL_BE_RX_WBM_ERR_SRC_REO: REO released this buffer or descriptor
+ * @HAL_BE_RX_WBM_ERR_SRC_FW_RX: FW released this buffer or descriptor from the
  *				RX path
- * @ HAL_BE_RX_WBM_ERR_SRC_SW_RX: SW released this buffer or descriptor from the
+ * @HAL_BE_RX_WBM_ERR_SRC_SW_RX: SW released this buffer or descriptor from the
  *				RX path
- * @ HAL_BE_RX_WBM_ERR_SRC_TQM : TQM released this buffer or descriptor
- * @ HAL_BE_RX_WBM_ERR_SRC_FW_TX: FW released this buffer or descriptor from the
+ * @HAL_BE_RX_WBM_ERR_SRC_TQM : TQM released this buffer or descriptor
+ * @HAL_BE_RX_WBM_ERR_SRC_FW_TX: FW released this buffer or descriptor from the
  *				RX path
- * @ HAL_BE_RX_WBM_ERR_SRC_SW_TX: SW released this buffer or descriptor from the
+ * @HAL_BE_RX_WBM_ERR_SRC_SW_TX: SW released this buffer or descriptor from the
  *				RX path
  */
 enum hal_be_rx_wbm_error_source {
@@ -509,4 +518,24 @@ static inline uint8_t hal_rx_sw_exception_get_be(void *reo_desc)
 {
 	return HAL_RX_GET(reo_desc, REO_DESTINATION_RING, SW_EXCEPTION);
 }
+
+#ifdef INTRA_BSS_FWD_OFFLOAD
+/**
+ * hal_rx_tlv_get_dest_chip_pmac_id() - Get destination chip and PMAC ID
+ * @buf: Rx TLV buffer
+ * @d_chip_id: chip id being filled in
+ * @d_chip_pmac_id: chip pmac id being filled in
+ *
+ * Return: void
+ */
+static inline void
+hal_rx_tlv_get_dest_chip_pmac_id(uint8_t *buf,
+				 uint8_t *d_chip_id, uint8_t *d_chip_pmac_id)
+{
+	struct rx_pkt_tlvs *rx_pkt_tlvs = (struct rx_pkt_tlvs *)buf;
+
+	*d_chip_id = HAL_RX_TLV_DEST_CHIP_ID_GET(rx_pkt_tlvs);
+	*d_chip_pmac_id = HAL_RX_TLV_DEST_CHIP_PMAC_ID_GET(rx_pkt_tlvs);
+}
+#endif /* INTRA_BSS_FWD_OFFLOAD */
 #endif /* _HAL_BE_RX_H_ */

+ 4 - 2
hal/wifi3.0/be/hal_be_rx_tlv.h

@@ -85,7 +85,8 @@ struct rx_msdu_end_compact {
 		 wds_learning_event			:  1,
 		 wds_roaming_event			:  1,
 		 wds_keep_alive_event			:  1,
-		 reserved_9b				:  9;
+		 dest_chip_pmac_id			:  1,
+		 reserved_9b				:  8;
 	uint32_t msdu_length				: 14,
 		 stbc					:  1,
 		 ipsec_esp				:  1,
@@ -240,7 +241,8 @@ struct rx_msdu_end_compact {
 		 aggregation_count			:  8;
 	uint32_t reserved_8a				: 24,
 		 key_id_octet				:  8;
-	uint32_t reserved_9b				:  9,
+	uint32_t reserved_9b				:  8,
+		 dest_chip_pmac_id			:  1,
 		 wds_keep_alive_event			:  1,
 		 wds_roaming_event			:  1,
 		 wds_learning_event			:  1,