Bläddra i källkod

Merge "qca-wifi: CFR: Fixes during initial WMI being sent to FW"

Linux Build Service Account 5 år sedan
förälder
incheckning
c7bccd80bc

+ 13 - 4
target_if/cfr/inc/target_if_cfr_6018.h

@@ -254,18 +254,18 @@ QDF_STATUS cfr_6018_deinit_pdev(
  * entries
  * @pdev: pointer to pdev object
  *
- * Return: Success/Failure status
+ * Return: None
  */
-QDF_STATUS target_if_cfr_start_lut_age_timer(struct wlan_objmgr_pdev *pdev);
+void target_if_cfr_start_lut_age_timer(struct wlan_objmgr_pdev *pdev);
 
 /**
  * target_if_cfr_stop_lut_age_timer() - Stop timer to flush aged-out LUT
  * entries
  * @pdev: pointer to pdev object
  *
- * Return: Success/Failure status
+ * Return: None
  */
-QDF_STATUS target_if_cfr_stop_lut_age_timer(struct wlan_objmgr_pdev *pdev);
+void target_if_cfr_stop_lut_age_timer(struct wlan_objmgr_pdev *pdev);
 
 /**
  * target_if_cfr_dump_lut_enh() - Dump all valid LUT entries
@@ -308,6 +308,15 @@ void target_if_cfr_default_ta_ra_config(struct cfr_rcc_param *rcc_param,
  * Return: none
  */
 void target_if_cfr_rx_tlv_process(struct wlan_objmgr_pdev *pdev, void *nbuf);
+
+/**
+ * target_if_cfr_update_global_cfg() - Update global config after a successful
+ * commit
+ * @pdev: pointer to pdev object
+ *
+ * Return: None
+ */
+void target_if_cfr_update_global_cfg(struct wlan_objmgr_pdev *pdev);
 #else
 static QDF_STATUS cfr_6018_init_pdev(
 		struct wlan_objmgr_psoc *psoc,

+ 7 - 3
target_if/cfr/src/target_if_cfr.c

@@ -255,17 +255,19 @@ void target_if_cfr_default_ta_ra_config(struct cfr_rcc_param *rcc_info,
 	struct ta_ra_cfr_cfg *curr_cfg = NULL;
 	int grp_id;
 
-	uint8_t null_mac[QDF_MAC_ADDR_SIZE] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
+	uint8_t def_mac[QDF_MAC_ADDR_SIZE] = {0xFF, 0xFF, 0xFF,
+		0xFF, 0xFF, 0xFF};
+	uint8_t null_mac[QDF_MAC_ADDR_SIZE] = {0, 0, 0, 0, 0, 0};
 
 	for (grp_id = 0; grp_id < MAX_TA_RA_ENTRIES; grp_id++) {
 		if (qdf_test_bit(grp_id, (unsigned long *)&reset_cfg)) {
 			curr_cfg = &rcc_info->curr[grp_id];
 			qdf_mem_copy(curr_cfg->tx_addr,
-				     null_mac, QDF_MAC_ADDR_SIZE);
+				     def_mac, QDF_MAC_ADDR_SIZE);
 			qdf_mem_copy(curr_cfg->tx_addr_mask,
 				     null_mac, QDF_MAC_ADDR_SIZE);
 			qdf_mem_copy(curr_cfg->rx_addr,
-				     null_mac, QDF_MAC_ADDR_SIZE);
+				     def_mac, QDF_MAC_ADDR_SIZE);
 			qdf_mem_copy(curr_cfg->rx_addr_mask,
 				     null_mac, QDF_MAC_ADDR_SIZE);
 			curr_cfg->bw = 0xf;
@@ -314,6 +316,8 @@ void target_if_enh_cfr_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops)
 		target_if_cfr_dump_lut_enh;
 	tx_ops->cfr_tx_ops.cfr_rx_tlv_process =
 		target_if_cfr_rx_tlv_process;
+	tx_ops->cfr_tx_ops.cfr_update_global_cfg =
+		target_if_cfr_update_global_cfg;
 }
 #else
 void target_if_enh_cfr_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops)

+ 81 - 16
target_if/cfr/src/target_if_cfr_6018.c

@@ -1389,20 +1389,20 @@ static os_timer_func(lut_ageout_timer_task)
 		return;
 	}
 
+	cur_tstamp = qdf_ktime_to_ms(qdf_ktime_get());
+
 	for (i = 0; i < NUM_LUT_ENTRIES; i++) {
 		lut = get_lut_entry(pcfr, i);
 		if (!lut)
 			continue;
 
-		cur_tstamp = qdf_ktime_to_ms(qdf_ktime_get());
-
 		if (lut->dbr_recv && !lut->tx_recv) {
 			diff = cur_tstamp - lut->dbr_tstamp;
 			if (diff > LUT_AGE_THRESHOLD) {
 				cfr_debug("<%d>TXRX event not received for "
-					"%llu ms, release lut entry : "
-					"dma_addr = 0x%pK\n", i, diff,
-					(void *)((uintptr_t)lut->dbr_address));
+					  "%llu ms, release lut entry : "
+					  "dma_addr = 0x%pK\n", i, diff,
+					  (void *)((uintptr_t)lut->dbr_address));
 				target_if_dbr_buf_release(pdev, DBR_MODULE_CFR,
 							  lut->dbr_address,
 							  i, 0);
@@ -1422,19 +1422,16 @@ static os_timer_func(lut_ageout_timer_task)
  * entries
  * @pdev: pointer to pdev object
  *
- * Return: Success/Failure status
+ * Return: None
  */
-QDF_STATUS target_if_cfr_start_lut_age_timer(struct wlan_objmgr_pdev *pdev)
+void target_if_cfr_start_lut_age_timer(struct wlan_objmgr_pdev *pdev)
 {
 	struct pdev_cfr *pcfr;
 
 	pcfr = wlan_objmgr_pdev_get_comp_private_obj(pdev,
 						     WLAN_UMAC_COMP_CFR);
-
 	if (pcfr->lut_timer_init)
 		qdf_timer_mod(&pcfr->lut_age_timer, LUT_AGE_TIMER);
-
-	return QDF_STATUS_SUCCESS;
 }
 
 /**
@@ -1442,19 +1439,83 @@ QDF_STATUS target_if_cfr_start_lut_age_timer(struct wlan_objmgr_pdev *pdev)
  * entries
  * @pdev: pointer to pdev object
  *
- * Return: Success/Failure status
+ * Return: None
  */
-QDF_STATUS target_if_cfr_stop_lut_age_timer(struct wlan_objmgr_pdev *pdev)
+void target_if_cfr_stop_lut_age_timer(struct wlan_objmgr_pdev *pdev)
 {
 	struct pdev_cfr *pcfr;
 
 	pcfr = wlan_objmgr_pdev_get_comp_private_obj(pdev,
 						     WLAN_UMAC_COMP_CFR);
-
 	if (pcfr->lut_timer_init)
 		qdf_timer_stop(&pcfr->lut_age_timer);
+}
 
-	return QDF_STATUS_SUCCESS;
+/**
+ * target_if_cfr_update_global_cfg() - Update global config after a successful
+ * commit
+ * @pdev: pointer to pdev object
+ *
+ * Return: None
+ */
+void target_if_cfr_update_global_cfg(struct wlan_objmgr_pdev *pdev)
+{
+	int grp_id;
+	struct pdev_cfr *pcfr;
+	struct ta_ra_cfr_cfg *curr_cfg = NULL;
+	struct ta_ra_cfr_cfg *glbl_cfg = NULL;
+	unsigned long *modified_in_this_session;
+
+	pcfr = wlan_objmgr_pdev_get_comp_private_obj(pdev,
+						     WLAN_UMAC_COMP_CFR);
+	modified_in_this_session =
+		(unsigned long *)&pcfr->rcc_param.modified_in_curr_session;
+
+	for (grp_id = 0; grp_id < MAX_TA_RA_ENTRIES; grp_id++) {
+		if (qdf_test_bit(grp_id, modified_in_this_session)) {
+			/* Populating global config based on user's input */
+			glbl_cfg = &pcfr->global[grp_id];
+			curr_cfg = &pcfr->rcc_param.curr[grp_id];
+
+			if (curr_cfg->valid_ta)
+				qdf_mem_copy(glbl_cfg->tx_addr,
+					     curr_cfg->tx_addr,
+					     QDF_MAC_ADDR_SIZE);
+
+			if (curr_cfg->valid_ra)
+				qdf_mem_copy(glbl_cfg->rx_addr,
+					     curr_cfg->rx_addr,
+					     QDF_MAC_ADDR_SIZE);
+
+			if (curr_cfg->valid_ta_mask)
+				qdf_mem_copy(glbl_cfg->tx_addr_mask,
+					     curr_cfg->tx_addr_mask,
+					     QDF_MAC_ADDR_SIZE);
+
+			if (curr_cfg->valid_ra_mask)
+				qdf_mem_copy(glbl_cfg->rx_addr_mask,
+					     curr_cfg->rx_addr_mask,
+					     QDF_MAC_ADDR_SIZE);
+
+			if (curr_cfg->valid_bw_mask)
+				glbl_cfg->bw = curr_cfg->bw;
+
+			if (curr_cfg->valid_nss_mask)
+				glbl_cfg->nss = curr_cfg->nss;
+
+			if (curr_cfg->valid_mgmt_subtype)
+				glbl_cfg->mgmt_subtype_filter =
+					curr_cfg->mgmt_subtype_filter;
+
+			if (curr_cfg->valid_ctrl_subtype)
+				glbl_cfg->ctrl_subtype_filter =
+					curr_cfg->ctrl_subtype_filter;
+
+			if (curr_cfg->valid_data_subtype)
+				glbl_cfg->data_subtype_filter =
+					curr_cfg->data_subtype_filter;
+		}
+	}
 }
 
 /**
@@ -1505,10 +1566,14 @@ QDF_STATUS cfr_6018_init_pdev(struct wlan_objmgr_psoc *psoc,
 					   true, MAX_RESET_CFG_ENTRY);
 
 	status = target_if_cfr_config_rcc(pdev, &pcfr->rcc_param);
-	if (status != QDF_STATUS_SUCCESS) {
-		cfr_err("Failed sending WMI to configure default values\n");
+	if (status == QDF_STATUS_SUCCESS) {
+		/* Update global configuration */
+		target_if_cfr_update_global_cfg(pdev);
+	} else {
+		cfr_err("Sending WMI to configure default has failed\n");
 		return status;
 	}
+
 	pcfr->rcc_param.modified_in_curr_session = 0;
 
 	pcfr->cfr_max_sta_count = MAX_CFR_ENABLED_CLIENTS;

+ 10 - 4
umac/cfr/dispatcher/inc/wlan_cfr_tgt_api.h

@@ -123,18 +123,18 @@ QDF_STATUS tgt_cfr_config_rcc(struct wlan_objmgr_pdev *pdev,
  * entries
  * @pdev: pointer to pdev_object
  *
- * Return: succcess / failure
+ * Return: None
  */
-QDF_STATUS tgt_cfr_start_lut_age_timer(struct wlan_objmgr_pdev *pdev);
+void tgt_cfr_start_lut_age_timer(struct wlan_objmgr_pdev *pdev);
 
 /**
  * tgt_cfr_stop_lut_age_timer() - API to stop timer to flush aged out LUT
  * entries
  * @pdev: pointer to pdev_object
  *
- * Return: succcess / failure
+ * Return: None
  */
-QDF_STATUS tgt_cfr_stop_lut_age_timer(struct wlan_objmgr_pdev *pdev);
+void tgt_cfr_stop_lut_age_timer(struct wlan_objmgr_pdev *pdev);
 
 /**
  * tgt_cfr_default_ta_ra_cfg() - API to configure default values in TA_RA mode
@@ -159,5 +159,11 @@ void tgt_cfr_dump_lut_enh(struct wlan_objmgr_pdev *pdev);
  * @nbuf: pointer to cdp_rx_indication_ppdu
  */
 void tgt_cfr_rx_tlv_process(struct wlan_objmgr_pdev *pdev, void *nbuf);
+
+/**
+ * tgt_cfr_update_global_cfg() - Update global config after successful commit
+ * @pdev: pointer to pdev_object
+ */
+void tgt_cfr_update_global_cfg(struct wlan_objmgr_pdev *pdev);
 #endif
 #endif

+ 29 - 18
umac/cfr/dispatcher/src/wlan_cfr_tgt_api.c

@@ -201,40 +201,36 @@ tgt_cfr_config_rcc(struct wlan_objmgr_pdev *pdev,
 	return status;
 }
 
-QDF_STATUS
-tgt_cfr_start_lut_age_timer(struct wlan_objmgr_pdev *pdev)
+void tgt_cfr_start_lut_age_timer(struct wlan_objmgr_pdev *pdev)
 {
-	QDF_STATUS status = QDF_STATUS_SUCCESS;
 	struct wlan_lmac_if_cfr_tx_ops *cfr_tx_ops = NULL;
 	struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
 
+	if (!psoc) {
+		cfr_err("Invalid PSOC: Flush LUT Timer cannot be started\n");
+		return;
+	}
+
 	cfr_tx_ops = wlan_psoc_get_cfr_txops(psoc);
 
 	if (cfr_tx_ops->cfr_start_lut_timer)
-		status = cfr_tx_ops->cfr_start_lut_timer(pdev);
-
-	if (status != QDF_STATUS_SUCCESS)
-		cfr_err("Error occurred with exit code %d\n", status);
-
-	return status;
+		cfr_tx_ops->cfr_start_lut_timer(pdev);
 }
 
-QDF_STATUS
-tgt_cfr_stop_lut_age_timer(struct wlan_objmgr_pdev *pdev)
+void tgt_cfr_stop_lut_age_timer(struct wlan_objmgr_pdev *pdev)
 {
-	QDF_STATUS status = QDF_STATUS_SUCCESS;
 	struct wlan_lmac_if_cfr_tx_ops *cfr_tx_ops = NULL;
 	struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
 
+	if (!psoc) {
+		cfr_err("Invalid PSOC: Flush LUT Timer cannot be stopped\n");
+		return;
+	}
+
 	cfr_tx_ops = wlan_psoc_get_cfr_txops(psoc);
 
 	if (cfr_tx_ops->cfr_stop_lut_timer)
-		status = cfr_tx_ops->cfr_stop_lut_timer(pdev);
-
-	if (status != QDF_STATUS_SUCCESS)
-		cfr_err("Error occurred with exit code %d\n", status);
-
-	return status;
+		cfr_tx_ops->cfr_stop_lut_timer(pdev);
 }
 
 void tgt_cfr_default_ta_ra_cfg(struct wlan_objmgr_pdev *pdev,
@@ -273,4 +269,19 @@ void tgt_cfr_rx_tlv_process(struct wlan_objmgr_pdev *pdev, void *nbuf)
 		cfr_tx_ops->cfr_rx_tlv_process(pdev, nbuf);
 }
 
+void tgt_cfr_update_global_cfg(struct wlan_objmgr_pdev *pdev)
+{
+	struct wlan_lmac_if_cfr_tx_ops *cfr_tx_ops = NULL;
+	struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
+
+	if (!psoc) {
+		cfr_err("Invalid PSOC:Cannot update global config.\n");
+		return;
+	}
+
+	cfr_tx_ops = wlan_psoc_get_cfr_txops(psoc);
+
+	if (cfr_tx_ops->cfr_update_global_cfg)
+		cfr_tx_ops->cfr_update_global_cfg(pdev);
+}
 #endif

+ 17 - 67
umac/cfr/dispatcher/src/wlan_cfr_ucfg_api.c

@@ -604,59 +604,17 @@ QDF_STATUS ucfg_cfr_set_tara_config(struct wlan_objmgr_vdev *vdev,
 	return status;
 }
 
-void cfr_update_global_cfg(struct pdev_cfr *pdev_cfrobj)
+static bool cfr_is_filter_enabled(struct cfr_rcc_param *rcc_param)
 {
-	int grp_id;
-	struct ta_ra_cfr_cfg *curr_cfg = NULL;
-	struct ta_ra_cfr_cfg *glbl_cfg = NULL;
-	unsigned long *modified_in_this_session =
-	 (unsigned long *)&pdev_cfrobj->rcc_param.modified_in_curr_session;
-
-	for (grp_id = 0; grp_id < MAX_TA_RA_ENTRIES; grp_id++) {
-		if (qdf_test_bit(grp_id, modified_in_this_session)) {
-			/* Populating global config based on user's input */
-			glbl_cfg = &pdev_cfrobj->global[grp_id];
-			curr_cfg = &pdev_cfrobj->rcc_param.curr[grp_id];
-
-			if (curr_cfg->valid_ta)
-				qdf_mem_copy(glbl_cfg->tx_addr,
-					     curr_cfg->tx_addr,
-					     QDF_MAC_ADDR_SIZE);
-
-			if (curr_cfg->valid_ra)
-				qdf_mem_copy(glbl_cfg->rx_addr,
-					     curr_cfg->rx_addr,
-					     QDF_MAC_ADDR_SIZE);
-
-			if (curr_cfg->valid_ta_mask)
-				qdf_mem_copy(glbl_cfg->tx_addr_mask,
-					     curr_cfg->tx_addr_mask,
-					     QDF_MAC_ADDR_SIZE);
-
-			if (curr_cfg->valid_ra_mask)
-				qdf_mem_copy(glbl_cfg->rx_addr_mask,
-					     curr_cfg->rx_addr_mask,
-					     QDF_MAC_ADDR_SIZE);
-
-			if (curr_cfg->valid_bw_mask)
-				glbl_cfg->bw = curr_cfg->bw;
-
-			if (curr_cfg->valid_nss_mask)
-				glbl_cfg->nss = curr_cfg->nss;
-
-			if (curr_cfg->valid_mgmt_subtype)
-				glbl_cfg->mgmt_subtype_filter =
-					curr_cfg->mgmt_subtype_filter;
-
-			if (curr_cfg->valid_ctrl_subtype)
-				glbl_cfg->ctrl_subtype_filter =
-					curr_cfg->ctrl_subtype_filter;
-
-			if (curr_cfg->valid_data_subtype)
-				glbl_cfg->data_subtype_filter =
-					curr_cfg->data_subtype_filter;
-		}
-	}
+	if (rcc_param->m_directed_ftm ||
+	    rcc_param->m_all_ftm_ack ||
+	    rcc_param->m_ndpa_ndp_directed ||
+	    rcc_param->m_ndpa_ndp_all ||
+	    rcc_param->m_ta_ra_filter ||
+	    rcc_param->m_all_packet)
+		return true;
+	else
+		return false;
 }
 
 QDF_STATUS ucfg_cfr_get_cfg(struct wlan_objmgr_vdev *vdev)
@@ -670,6 +628,11 @@ QDF_STATUS ucfg_cfr_get_cfg(struct wlan_objmgr_vdev *vdev)
 	status = dev_sanity_check(vdev, &pdev, &pcfr);
 	if (status != QDF_STATUS_SUCCESS)
 		return status;
+	if (!cfr_is_filter_enabled(&pcfr->rcc_param)) {
+		cfr_err(" All RCC modes are disabled.\n");
+		wlan_objmgr_pdev_release_ref(pdev, WLAN_CFR_ID);
+		return status;
+	}
 
 	cfr_err("CAPTURE MODE:\n");
 
@@ -886,19 +849,6 @@ void cfr_set_filter(struct wlan_objmgr_pdev *pdev,
 		       filter_val);
 }
 
-static bool cfr_is_filter_enabled(struct cfr_rcc_param *rcc_param)
-{
-	if (rcc_param->m_directed_ftm ||
-	    rcc_param->m_all_ftm_ack ||
-	    rcc_param->m_ndpa_ndp_directed ||
-	    rcc_param->m_ndpa_ndp_all ||
-	    rcc_param->m_ta_ra_filter ||
-	    rcc_param->m_all_packet)
-		return true;
-	else
-		return false;
-}
-
 /*
  * With the initiation of commit command, this handler will be triggered.
  *
@@ -1010,8 +960,8 @@ QDF_STATUS ucfg_cfr_committed_rcc_config(struct wlan_objmgr_vdev *vdev)
 	status = tgt_cfr_config_rcc(pdev, &pcfr->rcc_param);
 	if (status == QDF_STATUS_SUCCESS) {
 		cfr_info("CFR commit done\n");
-		/* Update glbl cfg */
-		cfr_update_global_cfg(pcfr);
+		/* Update global config */
+		tgt_cfr_update_global_cfg(pdev);
 
 		/* Bring curr_cfg to default state for next commit session */
 		tgt_cfr_default_ta_ra_cfg(pdev, &pcfr->rcc_param,