Browse Source

qcacld-3.0: Fix WLAN IPA disconnection handling

When wlan driver unloading is in progress, IPA_OPCODE_TX/RX_SUSPEND
will not be processed and resource_unloading may be left as true.
Moroever since driver will be unloaded, IPA_OPCODE_TX/RX_SUSPEND
interaction between Host and FW will not be necessary.

Fix is to disable IPA pipes directly when handling disconnection
if wlan driver unloading is in progress.

Change-Id: Ia4af1ab04052b1a9bab44105760de50ad6263dbb
CRs-Fixed: 2279044
jiad 6 years ago
parent
commit
3a321f3cfb
1 changed files with 24 additions and 3 deletions
  1. 24 3
      components/ipa/core/src/wlan_ipa_core.c

+ 24 - 3
components/ipa/core/src/wlan_ipa_core.c

@@ -1597,8 +1597,19 @@ static QDF_STATUS __wlan_ipa_wlan_evt(qdf_netdev_t net_dev, uint8_t device_mode,
 			/* Disable IPA UC TX PIPE when STA disconnected */
 			if ((ipa_ctx->num_iface == 1) &&
 			    wlan_ipa_is_fw_wdi_activated(ipa_ctx) &&
-			    !ipa_ctx->ipa_pipes_down)
-				wlan_ipa_uc_handle_last_discon(ipa_ctx);
+			    !ipa_ctx->ipa_pipes_down) {
+				if (cds_is_driver_unloading()) {
+					/*
+					 * We disable WDI pipes directly here
+					 * since IPA_OPCODE_TX/RX_SUSPEND
+					 * message will not be processed when
+					 * unloading WLAN driver is in progress
+					 */
+					wlan_ipa_uc_disable_pipes(ipa_ctx);
+				} else {
+					wlan_ipa_uc_handle_last_discon(ipa_ctx);
+				}
+			}
 		}
 
 		if (wlan_ipa_uc_sta_is_enabled(ipa_ctx->config) &&
@@ -1793,7 +1804,17 @@ static QDF_STATUS __wlan_ipa_wlan_evt(qdf_netdev_t net_dev, uint8_t device_mode,
 			if ((false == ipa_ctx->resource_unloading) &&
 			    wlan_ipa_is_fw_wdi_activated(ipa_ctx) &&
 			    !ipa_ctx->ipa_pipes_down) {
-				wlan_ipa_uc_handle_last_discon(ipa_ctx);
+				if (cds_is_driver_unloading()) {
+					/*
+					 * We disable WDI pipes directly here
+					 * since IPA_OPCODE_TX/RX_SUSPEND
+					 * message will not be processed when
+					 * unloading WLAN driver is in progress
+					 */
+					wlan_ipa_uc_disable_pipes(ipa_ctx);
+				} else {
+					wlan_ipa_uc_handle_last_discon(ipa_ctx);
+				}
 			}
 
 			if (wlan_ipa_uc_sta_is_enabled(ipa_ctx->config) &&