Browse Source

qcacld-3.0: Fix tx flow control inconsistency during ssr

qcacld-2.0 to qcacld-3.0 Propagation.

Connection fails after ssr due to the tx queues are paused by tx flow
control and ssr happens before tx resume, and the tx queues cannot be
resumed because of the unpaired status of pause map.

Resume tx queues and update pause map at the beginning of ssr if the tx
queues are paused by tx flow control.

CRs-Fixed: 2146129
Change-Id: Ib1ed8360c6effa4a47fc1702650375bf2380e65c
Ke Huang 6 years ago
parent
commit
c067b8d863
1 changed files with 27 additions and 0 deletions
  1. 27 0
      core/hdd/src/wlan_hdd_main.c

+ 27 - 0
core/hdd/src/wlan_hdd_main.c

@@ -5633,6 +5633,29 @@ static void hdd_reset_scan_operation(struct hdd_context *hdd_ctx,
 	}
 }
 
+#ifdef QCA_LL_LEGACY_TX_FLOW_CONTROL
+/**
+ * hdd_adapter_abort_tx_flow() - Abort the tx flow control
+ * @pAdapter: pointer to hdd_adapter_t
+ *
+ * Resume tx and stop the tx flow control timer if the tx is paused
+ * and the flow control timer is running. This function is called by
+ * SSR to avoid the inconsistency of tx status before and after SSR.
+ *
+ * Return: void
+ */
+static void hdd_adapter_abort_tx_flow(struct hdd_adapter *adapter)
+{
+	if (adapter->hdd_stats.tx_rx_stats.is_txflow_paused &&
+		QDF_TIMER_STATE_RUNNING ==
+		qdf_mc_timer_get_current_state(
+			&adapter->tx_flow_control_timer)) {
+		hdd_tx_resume_timer_expired_handler(adapter);
+		qdf_mc_timer_stop(&adapter->tx_flow_control_timer);
+	}
+}
+#endif
+
 QDF_STATUS hdd_reset_all_adapters(struct hdd_context *hdd_ctx)
 {
 	struct hdd_adapter *adapter;
@@ -5651,6 +5674,10 @@ QDF_STATUS hdd_reset_all_adapters(struct hdd_context *hdd_ctx)
 			 qdf_opmode_str(adapter->device_mode),
 			 adapter->device_mode);
 
+#ifdef QCA_LL_LEGACY_TX_FLOW_CONTROL
+		hdd_adapter_abort_tx_flow(adapter);
+#endif
+
 		if ((adapter->device_mode == QDF_STA_MODE) ||
 		    (adapter->device_mode == QDF_P2P_CLIENT_MODE)) {
 			/* Stop tdls timers */