Bladeren bron

qcacmn: MLO Multicast Support for ML Reconfig

Add support for GET MLO Multicast API to check
if the vdev is primary multicast vdev.
Enhanced SET MLO Multicast API to reset primary
multicast flag for all partner vdevs.

Change-Id: Ic88949ce922bb1d0fd34349058d254de0d1f563c
CRs-Fixed: 3322523
Kenvish Butani 2 jaren geleden
bovenliggende
commit
620ad50e89
6 gewijzigde bestanden met toevoegingen van 94 en 29 verwijderingen
  1. 11 6
      dp/inc/cdp_txrx_cmn_struct.h
  2. 57 0
      dp/wifi3.0/be/dp_be.c
  3. 0 15
      dp/wifi3.0/be/dp_be.h
  4. 11 8
      dp/wifi3.0/dp_main.c
  5. 7 0
      dp/wifi3.0/dp_types.h
  6. 8 0
      dp/wifi3.0/li/dp_li.c

+ 11 - 6
dp/inc/cdp_txrx_cmn_struct.h

@@ -1431,18 +1431,20 @@ enum cdp_pdev_bpr_param {
 	CDP_BPR_ENABLE,
 };
 
-/*
- * cdp_vdev_param_type: different types of parameters
- *			to set values in vdev
+/**
+ * enum cdp_vdev_param_type - different types of parameters
+ *			      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_MEC: MEC enable flags
  * @CDP_ENABLE_PROXYSTA: proxy sta
  * @CDP_UPDATE_TDLS_FLAGS: tdls link flags
+ * @CDP_CFG_WDS_AGING_TIMER: modify/stop wds aging timer
  * @CDP_ENABLE_AP_BRIDGE: set ap_bridging enable/disable
- * @CDP_ENABLE_CIPHER : set cipher type based on security
+ * @CDP_ENABLE_CIPHER: set cipher type based on security
  * @CDP_ENABLE_QWRAP_ISOLATION: qwrap isolation mode
+ * @CDP_UPDATE_MULTIPASS: enable/disable multipass
  * @CDP_TX_ENCAP_TYPE: tx encap type
  * @CDP_RX_DECAP_TYPE: rx decap type
  * @CDP_MESH_RX_FILTER: set mesh rx filter
@@ -1456,9 +1458,12 @@ enum cdp_pdev_bpr_param {
  * @CDP_CFG_WDS_EXT: enable/disable wds ext feature
  * @CDP_ENABLE_PEER_AUTHORIZE: enable peer authorize flag
  * @CDP_ENABLE_PEER_TID_LATENCY: set peer tid latency enable flag
- * @CDP_SET_VAP_MESH_TID : Set latency tid in vap
+ * @CDP_SET_VAP_MESH_TID: Set latency tid in vap
+ * @CDP_SKIP_BAR_UPDATE_AP: enable/disable bar
  * @CDP_UPDATE_DSCP_TO_TID_MAP: Set DSCP to TID map id
- * @CDP_SET_MCAST_VDEV : Set primary mcast vdev
+ * @CDP_SET_MCAST_VDEV: Set primary mcast vdev
+ * @CDP_SET_MCAST_VDEV_HW_UPDATE: Not in use
+ * @CDP_DROP_3ADDR_MCAST: enable/disable drop 3addr multicast flag
  * @CDP_ENABLE_WRAP: qwrap ap
  * @CDP_ENABLE_TRAFFIC_END_INDICATION: enable/disable traffic end indication
  */

+ 57 - 0
dp/wifi3.0/be/dp_be.c

@@ -1949,6 +1949,16 @@ static void dp_bank_reconfig_be(struct dp_soc *soc, struct dp_vdev *vdev)
 
 #if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_MLO_MULTI_CHIP) && \
 	defined(WLAN_MCAST_MLO)
+static void dp_mlo_mcast_reset_pri_mcast(struct dp_vdev_be *be_vdev,
+					 struct dp_vdev *ptnr_vdev,
+					 void *arg)
+{
+	struct dp_vdev_be *be_ptnr_vdev =
+				dp_get_be_vdev_from_dp_vdev(ptnr_vdev);
+
+	be_ptnr_vdev->mcast_primary = false;
+}
+
 static void dp_txrx_set_mlo_mcast_primary_vdev_param_be(
 					struct dp_vdev_be *be_vdev,
 					cdp_config_param_type val)
@@ -1968,17 +1978,53 @@ static void dp_txrx_set_mlo_mcast_primary_vdev_param_be(
 		dp_mcast_mlo_iter_ptnr_soc(be_soc,
 					   dp_tx_mcast_mlo_reinject_routing_set,
 					   (void *)&be_vdev->mcast_primary);
+		dp_mcast_mlo_iter_ptnr_vdev(be_soc, be_vdev,
+					    dp_mlo_mcast_reset_pri_mcast,
+					    (void *)&be_vdev->mcast_primary,
+					    DP_MOD_ID_TX_MCAST);
 	} else {
 		hal_tx_vdev_mcast_ctrl_set(hal_soc, vdev_id,
 					   HAL_TX_MCAST_CTRL_DROP);
 	}
 }
+
+/**
+ * dp_txrx_get_vdev_mcast_param_be() - Target specific ops for getting vdev
+ *                                      params related to multicast
+ * @soc: DP soc handle
+ * @vdev: pointer to vdev structure
+ * @val: buffer address
+ *
+ * Return: QDF_STATUS
+ */
+static
+QDF_STATUS dp_txrx_get_vdev_mcast_param_be(struct dp_soc *soc,
+					   struct dp_vdev *vdev,
+					   cdp_config_param_type *val)
+{
+	struct dp_vdev_be *be_vdev = dp_get_be_vdev_from_dp_vdev(vdev);
+
+	if (be_vdev->mcast_primary)
+		val->cdp_vdev_param_mcast_vdev = true;
+	else
+		val->cdp_vdev_param_mcast_vdev = false;
+
+	return QDF_STATUS_SUCCESS;
+}
 #else
 static void dp_txrx_set_mlo_mcast_primary_vdev_param_be(
 					struct dp_vdev_be *be_vdev,
 					cdp_config_param_type val)
 {
 }
+
+static
+QDF_STATUS dp_txrx_get_vdev_mcast_param_be(struct dp_soc *soc,
+					   struct dp_vdev *vdev,
+					   cdp_config_param_type *val)
+{
+	return QDF_STATUS_SUCCESS;
+}
 #endif
 
 #ifdef DP_TX_IMPLICIT_RBM_MAPPING
@@ -1998,6 +2044,16 @@ static void dp_tx_implicit_rbm_set_be(struct dp_soc *soc,
 }
 #endif
 
+/**
+ * dp_txrx_set_vdev_param_be() - Target specific ops while setting vdev params
+ * @soc: DP soc handle
+ * @vdev: pointer to vdev structure
+ * @param: parameter type to get value
+ * @val: value
+ *
+ * Return: QDF_STATUS
+ */
+static
 QDF_STATUS dp_txrx_set_vdev_param_be(struct dp_soc *soc,
 				     struct dp_vdev *vdev,
 				     enum cdp_vdev_param_type param,
@@ -2344,5 +2400,6 @@ void dp_initialize_arch_ops_be(struct dp_arch_ops *arch_ops)
 	arch_ops->print_mlo_ast_stats = dp_print_mlo_ast_stats_be;
 	arch_ops->peer_get_reo_hash = dp_peer_get_reo_hash_be;
 	arch_ops->reo_remap_config = dp_reo_remap_config_be;
+	arch_ops->txrx_get_vdev_mcast_param = dp_txrx_get_vdev_mcast_param_be;
 	dp_initialize_arch_ops_be_ipa(arch_ops);
 }

+ 0 - 15
dp/wifi3.0/be/dp_be.h

@@ -851,19 +851,4 @@ void dp_mlo_update_link_to_pdev_unmap(struct dp_soc *soc, struct dp_pdev *pdev)
 {
 }
 #endif
-
-/*
- * dp_txrx_set_vdev_param_be: target specific ops while setting vdev params
- * @soc : DP soc handle
- * @vdev: pointer to vdev structure
- * @param: parameter type to get value
- * @val: value
- *
- * return: QDF_STATUS
- */
-QDF_STATUS dp_txrx_set_vdev_param_be(struct dp_soc *soc,
-				     struct dp_vdev *vdev,
-				     enum cdp_vdev_param_type param,
-				     cdp_config_param_type val);
-
 #endif

+ 11 - 8
dp/wifi3.0/dp_main.c

@@ -10797,14 +10797,14 @@ dp_calculate_delay_stats(struct cdp_soc_t *cdp_soc, uint8_t vdev_id,
 	return QDF_STATUS_SUCCESS;
 }
 
-/*
- * dp_get_vdev_param: function to get parameters from vdev
- * @cdp_soc : DP soc handle
+/**
+ * dp_get_vdev_param() - function to get parameters from vdev
+ * @cdp_soc: DP soc handle
  * @vdev_id: id of DP vdev handle
  * @param: parameter type to get value
  * @val: buffer address
  *
- * return: status
+ * Return: status
  */
 static QDF_STATUS dp_get_vdev_param(struct cdp_soc_t *cdp_soc, uint8_t vdev_id,
 				    enum cdp_vdev_param_type param,
@@ -10860,6 +10860,9 @@ static QDF_STATUS dp_get_vdev_param(struct cdp_soc_t *cdp_soc, uint8_t vdev_id,
 	case CDP_DROP_3ADDR_MCAST:
 		val->cdp_drop_3addr_mcast = vdev->drop_3addr_mcast;
 		break;
+	case CDP_SET_MCAST_VDEV:
+		soc->arch_ops.txrx_get_vdev_mcast_param(soc, vdev, val);
+		break;
 	default:
 		dp_cdp_err("%pK: param value %d is wrong",
 			   soc, param);
@@ -10871,14 +10874,14 @@ static QDF_STATUS dp_get_vdev_param(struct cdp_soc_t *cdp_soc, uint8_t vdev_id,
 	return QDF_STATUS_SUCCESS;
 }
 
-/*
- * dp_set_vdev_param: function to set parameters in vdev
- * @cdp_soc : DP soc handle
+/**
+ * dp_set_vdev_param() - function to set parameters in vdev
+ * @cdp_soc: DP soc handle
  * @vdev_id: id of DP vdev handle
  * @param: parameter type to get value
  * @val: value
  *
- * return: QDF_STATUS
+ * Return: QDF_STATUS
  */
 static QDF_STATUS
 dp_set_vdev_param(struct cdp_soc_t *cdp_soc, uint8_t vdev_id,

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

@@ -262,6 +262,7 @@ enum dp_mod_id {
 	DP_MOD_ID_REINJECT,
 	DP_MOD_ID_SCS,
 	DP_MOD_ID_UMAC_RESET,
+	DP_MOD_ID_TX_MCAST,
 	DP_MOD_ID_MAX,
 };
 
@@ -1838,6 +1839,8 @@ enum dp_context_type {
  * 				      source from HAL desc for wbm release ring
  * @dp_service_near_full_srngs: Handler for servicing the near full IRQ
  * @txrx_set_vdev_param: target specific ops while setting vdev params
+ * @txrx_get_vdev_mcast_param: target specific ops for getting vdev
+ *			       params related to multicast
  * @dp_srng_test_and_update_nf_params: Check if the srng is in near full state
  *				and set the near-full params.
  * @ipa_get_bank_id: Get TCL bank id used by IPA
@@ -1945,6 +1948,10 @@ struct dp_arch_ops {
 					  enum cdp_vdev_param_type param,
 					  cdp_config_param_type val);
 
+	QDF_STATUS (*txrx_get_vdev_mcast_param)(struct dp_soc *soc,
+						struct dp_vdev *vdev,
+						cdp_config_param_type *val);
+
 	/* Misc Arch Ops */
 	qdf_size_t (*txrx_get_context_size)(enum dp_context_type);
 #ifdef WIFI_MONITOR_SUPPORT

+ 8 - 0
dp/wifi3.0/li/dp_li.c

@@ -583,6 +583,13 @@ static struct dp_soc *dp_rx_replensih_soc_get_li(struct dp_soc *soc,
 	return soc;
 }
 
+static QDF_STATUS dp_txrx_get_vdev_mcast_param_li(struct dp_soc *soc,
+						  struct dp_vdev *vdev,
+						  cdp_config_param_type *val)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
 void dp_initialize_arch_ops_li(struct dp_arch_ops *arch_ops)
 {
 #ifndef QCA_HOST_MODE_WIFI_DISABLED
@@ -643,6 +650,7 @@ void dp_initialize_arch_ops_li(struct dp_arch_ops *arch_ops)
 	arch_ops->reo_remap_config = dp_reo_remap_config_li;
 	arch_ops->dp_rx_replenish_soc_get = dp_rx_replensih_soc_get_li;
 	arch_ops->get_reo_qdesc_addr = dp_rx_get_reo_qdesc_addr_li;
+	arch_ops->txrx_get_vdev_mcast_param = dp_txrx_get_vdev_mcast_param_li;
 }
 
 #ifdef QCA_DP_TX_HW_SW_NBUF_DESC_PREFETCH