Browse Source

qcacld-3.0: Credit Management changes for Genoa

1) Genoa FW by default enables HI_ACS_FLAGS_SDIO_REDUCE_TX_COMPL_SET.
When this flag is enabled, credits are reported through
HTT_T2H_MSG_TYPE_TX_CREDIT_UPDATE_IND and not through
HTT_T2H_MSG_TYPE_TX_COMPL_IND.
However when TSF and PTP features are enabled we need to get TX
Completions from FW.
Since credits can also be updated through TX Completions
we need to disable updation of credits through TX Completion for Genoa.

2) Enable flag : cfg_ctx->tx_free_at_download to free ol tx descriptors at
   download.

Change-Id: I176dc8391ded9fc57f8be2b465effd8ae84eda49
CRs-fixed: 2268757
Ajit Pal Singh 6 years ago
parent
commit
c31d10199c

+ 12 - 1
core/dp/htt/htt.c

@@ -422,6 +422,16 @@ htt_pdev_alloc(ol_txrx_pdev_handle txrx_pdev,
 
 	/* for efficiency, store a local copy of the is_high_latency flag */
 	pdev->cfg.is_high_latency = ol_cfg_is_high_latency(pdev->ctrl_pdev);
+	/*
+	 * Credit reporting through HTT_T2H_MSG_TYPE_TX_CREDIT_UPDATE_IND
+	 * enabled or not.
+	 */
+	pdev->cfg.credit_update_enabled =
+		ol_cfg_is_credit_update_enabled(pdev->ctrl_pdev);
+
+	pdev->cfg.request_tx_comp = cds_is_ptp_rx_opt_enabled() ||
+		cds_is_packet_log_enabled();
+
 	pdev->cfg.default_tx_comp_req =
 			!ol_cfg_tx_free_at_download(pdev->ctrl_pdev);
 
@@ -522,7 +532,8 @@ htt_attach(struct htt_pdev_t *pdev, int desc_pool_size)
 		 */
 		pdev->download_len = 5000;
 
-		if (ol_cfg_tx_free_at_download(pdev->ctrl_pdev))
+		if (ol_cfg_tx_free_at_download(pdev->ctrl_pdev) &&
+		    !pdev->cfg.request_tx_comp)
 			pdev->tx_send_complete_part2 =
 						ol_tx_download_done_hl_free;
 		else

+ 2 - 1
core/dp/htt/htt_t2h.c

@@ -817,7 +817,8 @@ void htt_t2h_msg_handler(void *context, HTC_PACKET *pkt)
 			}
 		}
 
-		if (pdev->cfg.is_high_latency) {
+		if (pdev->cfg.is_high_latency &&
+		    !pdev->cfg.credit_update_enabled) {
 			old_credit = qdf_atomic_read(
 						&pdev->htt_tx_credit.target_delta);
 			if (((old_credit + num_msdus) > MAX_TARGET_TX_CREDIT) ||

+ 9 - 0
core/dp/htt/htt_types.h

@@ -245,6 +245,15 @@ struct htt_pdev_t {
 		int default_tx_comp_req;
 		int ce_classify_enabled;
 		uint8_t is_first_wakeup_packet;
+		/*
+		 * To track if credit reporting through
+		 * HTT_T2H_MSG_TYPE_TX_CREDIT_UPDATE_IND is enabled/disabled.
+		 * In Genoa(QCN7605) credits are reported through
+		 * HTT_T2H_MSG_TYPE_TX_CREDIT_UPDATE_IND only.
+		 */
+		u8 credit_update_enabled;
+		/* Explicitly request TX completions. */
+		u8 request_tx_comp;
 	} cfg;
 	struct {
 		uint8_t major;

+ 18 - 1
core/dp/ol/inc/ol_cfg.h

@@ -89,7 +89,13 @@ struct txrx_pdev_cfg_t {
 	uint32_t tx_flow_start_queue_offset;
 #endif
 	bool flow_steering_enabled;
-
+	/*
+	 * To track if credit reporting through
+	 * HTT_T2H_MSG_TYPE_TX_CREDIT_UPDATE_IND is enabled/disabled.
+	 * In Genoa(QCN7605) credits are reported through
+	 * HTT_T2H_MSG_TYPE_TX_CREDIT_UPDATE_IND only.
+	 */
+	u8 credit_update_enabled;
 	struct ol_tx_sched_wrr_ac_specs_t ac_specs[TX_WMM_AC_NUM];
 };
 
@@ -137,6 +143,17 @@ struct cdp_cfg *ol_pdev_cfg_attach(qdf_device_t osdev, void *pcfg_param);
  */
 int ol_cfg_is_high_latency(struct cdp_cfg *cfg_pdev);
 
+/**
+ * @brief Specify whether credit reporting through
+ * HTT_T2H_MSG_TYPE_TX_CREDIT_UPDATE_IND is enabled by default.
+ * In Genoa credits are reported only through
+ * HTT_T2H_MSG_TYPE_TX_CREDIT_UPDATE_IND
+ * @details
+ * @param pdev - handle to the physical device
+ * @return 1 -> enabled -OR- 0 -> disabled
+ */
+int ol_cfg_is_credit_update_enabled(struct cdp_cfg *cfg_pdev);
+
 /**
  * @brief Specify the range of peer IDs.
  * @details

+ 24 - 1
core/dp/txrx/ol_cfg.c

@@ -45,6 +45,22 @@ void ol_tx_set_flow_control_parameters(struct cdp_cfg *cfg_pdev,
 
 #ifdef CONFIG_HL_SUPPORT
 
+#ifdef CONFIG_CREDIT_REP_THROUGH_CREDIT_UPDATE
+static inline
+void ol_pdev_cfg_credit_update(struct txrx_pdev_cfg_t *cfg_ctx)
+{
+	cfg_ctx->tx_free_at_download = 1;
+	cfg_ctx->credit_update_enabled = 1;
+}
+#else
+static inline
+void ol_pdev_cfg_credit_update(struct txrx_pdev_cfg_t *cfg_ctx)
+{
+	cfg_ctx->tx_free_at_download = 0;
+	cfg_ctx->credit_update_enabled = 0;
+}
+#endif /* CONFIG_CREDIT_REP_THROUGH_CREDIT_UPDATE */
+
 /**
  * ol_pdev_cfg_param_update() - assign download size of tx frame for txrx
  *				    pdev that will be used across datapath
@@ -58,7 +74,7 @@ void ol_pdev_cfg_param_update(struct txrx_pdev_cfg_t *cfg_ctx)
 	cfg_ctx->is_high_latency = 1;
 	/* 802.1Q and SNAP / LLC headers are accounted for elsewhere */
 	cfg_ctx->tx_download_size = 1500;
-	cfg_ctx->tx_free_at_download = 0;
+	ol_pdev_cfg_credit_update(cfg_ctx);
 }
 #else
 
@@ -165,6 +181,13 @@ int ol_cfg_is_high_latency(struct cdp_cfg *cfg_pdev)
 	return cfg->is_high_latency;
 }
 
+int ol_cfg_is_credit_update_enabled(struct cdp_cfg *cfg_pdev)
+{
+	struct txrx_pdev_cfg_t *cfg = (struct txrx_pdev_cfg_t *)cfg_pdev;
+
+	return cfg->credit_update_enabled;
+}
+
 int ol_cfg_max_peer_id(struct cdp_cfg *cfg_pdev)
 {
 	struct txrx_pdev_cfg_t *cfg = (struct txrx_pdev_cfg_t *)cfg_pdev;

+ 4 - 2
core/dp/txrx/ol_tx.c

@@ -1018,7 +1018,8 @@ qdf_nbuf_t
 ol_tx_hl(ol_txrx_vdev_handle vdev, qdf_nbuf_t msdu_list)
 {
 	struct ol_txrx_pdev_t *pdev = vdev->pdev;
-	int tx_comp_req = pdev->cfg.default_tx_comp_req;
+	int tx_comp_req = pdev->cfg.default_tx_comp_req ||
+		pdev->cfg.request_tx_comp;
 
 	return ol_tx_hl_base(vdev, OL_TX_SPEC_STD, msdu_list, tx_comp_req);
 }
@@ -1029,7 +1030,8 @@ ol_tx_non_std_hl(struct ol_txrx_vdev_t *vdev,
 		 qdf_nbuf_t msdu_list)
 {
 	struct ol_txrx_pdev_t *pdev = vdev->pdev;
-	int tx_comp_req = pdev->cfg.default_tx_comp_req;
+	int tx_comp_req = pdev->cfg.default_tx_comp_req ||
+		pdev->cfg.request_tx_comp;
 
 	if (!tx_comp_req) {
 		if ((tx_spec == OL_TX_SPEC_NO_FREE) &&

+ 8 - 1
core/dp/txrx/ol_tx_send.c

@@ -811,7 +811,14 @@ ol_tx_completion_handler(ol_txrx_pdev_handle pdev,
 			qdf_nbuf_data_addr(netbuf),
 			sizeof(qdf_nbuf_data(netbuf)), tx_desc->id, status));
 		htc_pm_runtime_put(pdev->htt_pdev->htc_pdev);
-		ol_tx_desc_update_group_credit(pdev, tx_desc_id, 1, 0, status);
+		/*
+		 * If credits are reported through credit_update_ind then do not
+		 * update group credits on tx_complete_ind.
+		 */
+		if (!pdev->cfg.credit_update_enabled)
+			ol_tx_desc_update_group_credit(pdev,
+						       tx_desc_id,
+						       1, 0, status);
 		/* Per SDU update of byte count */
 		byte_cnt += qdf_nbuf_len(netbuf);
 		if (OL_TX_DESC_NO_REFS(tx_desc)) {

+ 11 - 0
core/dp/txrx/ol_txrx.c

@@ -1421,6 +1421,17 @@ ol_txrx_pdev_attach(ol_txrx_soc_handle soc, struct cdp_cfg *ctrl_pdev,
 
 	/* init LL/HL cfg here */
 	pdev->cfg.is_high_latency = ol_cfg_is_high_latency(ctrl_pdev);
+	/*
+	 * Credit reporting through HTT_T2H_MSG_TYPE_TX_CREDIT_UPDATE_IND
+	 * enabled or not.
+	 */
+	pdev->cfg.credit_update_enabled =
+		ol_cfg_is_credit_update_enabled(ctrl_pdev);
+
+	/* Explicitly request TX Completions from FW */
+	pdev->cfg.request_tx_comp = cds_is_ptp_rx_opt_enabled() ||
+		cds_is_packet_log_enabled();
+
 	pdev->cfg.default_tx_comp_req = !ol_cfg_tx_free_at_download(ctrl_pdev);
 
 	/* store provided params */

+ 2 - 0
core/dp/txrx/ol_txrx_types.h

@@ -608,6 +608,8 @@ struct ol_txrx_pdev_t {
 		int host_addba;
 		int ll_pause_txq_limit;
 		int default_tx_comp_req;
+		u8 credit_update_enabled;
+		u8 request_tx_comp;
 	} cfg;
 
 	/* WDI subscriber's event list */