浏览代码

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 年之前
父节点
当前提交
5b4c2d3d0c
共有 2 个文件被更改,包括 9 次插入5 次删除
  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
  * @QDF_VDEV_SM_OUT_OF_SYNC: Vdev SM is out of sync and connect req received
  * when already connected
  * when already connected
  * @QDF_STATS_REQ_TIMEDOUT: Stats request timedout
  * @QDF_STATS_REQ_TIMEDOUT: Stats request timedout
- * @QDF_RSO_STOP_RSP_TIMEOUT: Firmware hasn't sent RSO stop response
  */
  */
 enum qdf_hang_reason {
 enum qdf_hang_reason {
 	QDF_REASON_UNSPECIFIED,
 	QDF_REASON_UNSPECIFIED,
@@ -1469,7 +1468,6 @@ enum qdf_hang_reason {
 	QDF_VDEV_SM_OUT_OF_SYNC,
 	QDF_VDEV_SM_OUT_OF_SYNC,
 	QDF_STATS_REQ_TIMEDOUT,
 	QDF_STATS_REQ_TIMEDOUT,
 	QDF_TX_DESC_LEAK,
 	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,
 	} else if (qdf_atomic_test_bit(RSO_STOP_RESPONSE_BIT,
 				       &vdev_rsp->rsp_status)) {
 				       &vdev_rsp->rsp_status)) {
 		rsp_pos = RSO_STOP_RESPONSE_BIT;
 		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_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);
 		target_if_send_rso_stop_failure_rsp(psoc, vdev_id);
 	} else {
 	} else {
 		mlme_err("PSOC_%d VDEV_%d: Unknown error",
 		mlme_err("PSOC_%d VDEV_%d: Unknown error",