Browse Source

qcacmn: Skip recovery if no rso stop rsp from FW

Current issue:
During disconnect host sends RSO STOP command to FW
and expects a response from FW before continuing disconnect.
If roaming is disabled (from supplicant or due to race condition)
before sending RSO STOP cmd then FW does not respond to the request
and host will assert.

Solution:
To handle this case after rso timer stop expiry continue with
disconnect and clean up the rso state.

Change-Id: Iac7b25d881702b87f946fe0ecfba02b1d806f06b
CRs-Fixed: 3301394
Amruta Kulkarni 2 years ago
parent
commit
5b4c2d3d0c
2 changed files with 9 additions and 5 deletions
  1. 0 2
      qdf/inc/qdf_types.h
  2. 9 3
      target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_rx_ops.c

+ 0 - 2
qdf/inc/qdf_types.h

@@ -1437,7 +1437,6 @@ enum qdf_suspend_type {
  * @QDF_VDEV_SM_OUT_OF_SYNC: Vdev SM is out of sync and connect req received
  * when already connected
  * @QDF_STATS_REQ_TIMEDOUT: Stats request timedout
- * @QDF_RSO_STOP_RSP_TIMEOUT: Firmware hasn't sent RSO stop response
  */
 enum qdf_hang_reason {
 	QDF_REASON_UNSPECIFIED,
@@ -1469,7 +1468,6 @@ enum qdf_hang_reason {
 	QDF_VDEV_SM_OUT_OF_SYNC,
 	QDF_STATS_REQ_TIMEDOUT,
 	QDF_TX_DESC_LEAK,
-	QDF_RSO_STOP_RSP_TIMEOUT,
 };
 
 /**

+ 9 - 3
target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_rx_ops.c

@@ -175,10 +175,16 @@ void target_if_vdev_mgr_rsp_timer_cb(void *arg)
 	} else if (qdf_atomic_test_bit(RSO_STOP_RESPONSE_BIT,
 				       &vdev_rsp->rsp_status)) {
 		rsp_pos = RSO_STOP_RESPONSE_BIT;
-		recovery_reason = QDF_RSO_STOP_RSP_TIMEOUT;
 		target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, rsp_pos);
-		target_if_vdev_mgr_handle_recovery(psoc, vdev_id,
-						   recovery_reason, rsp_pos);
+		/**
+		 * FW did not respond to rso stop cmd, as roaming is
+		 * disabled either due to race condition
+		 * that happened during previous disconnect OR
+		 * supplicant disabled roaming.
+		 * To solve this issue, skip recovery and host will
+		 * continue disconnect and cleanup rso state.
+		 */
+		mlme_debug("No rsp from FW received , continue with disconnect");
 		target_if_send_rso_stop_failure_rsp(psoc, vdev_id);
 	} else {
 		mlme_err("PSOC_%d VDEV_%d: Unknown error",