Parcourir la source

qcacld-3.0: Prevent RSO stop sent after vdev down

When roam invoke from user space fails, internal disconnection
is triggered from csr. This queues disassociate command to lim
and then RSO command is also posted to lim. When disassociate
get processed, vdev down is sent, pe session is deleted and
roam offload flag at wma is cleared. When RSO stop is received
at wma, the roam offload flag is cleared and wma returns
failure without sending RSO command. So in STA+STA scenario,
after disconnection on 1st sta, roaming will be enabled on
2nd sta, but since RSO stop was not sent on 1st sta, firmware
will assert as btm offload is not disabled at the 1st STA.

Disable roaming first, followed by vdev stop/vdev down to
firmware.

Change-Id: I3f2f873cf50536b6f31bc0113ff737d6d95a520d
CRs-Fixed: 2672573
Pragaspathi Thilagaraj il y a 5 ans
Parent
commit
9851bcda03
2 fichiers modifiés avec 26 ajouts et 9 suppressions
  1. 3 4
      core/sme/src/common/sme_api.c
  2. 23 5
      core/sme/src/csr/csr_api_roam.c

+ 3 - 4
core/sme/src/common/sme_api.c

@@ -6538,10 +6538,9 @@ QDF_STATUS sme_stop_roaming(mac_handle_t mac_handle, uint8_t session_id,
 		return QDF_STATUS_E_FAILURE;
 	}
 
-	if (reason == REASON_DRIVER_DISABLED && requestor) {
-		mlme_set_operations_bitmap(mac_ctx->psoc, session_id, requestor,
-					   false);
-	}
+	if (reason == REASON_DRIVER_DISABLED && requestor)
+		mlme_set_operations_bitmap(mac_ctx->psoc, session_id,
+					   requestor, false);
 
 	status = csr_post_roam_state_change(mac_ctx, session_id,
 					    ROAM_RSO_STOPPED,

+ 23 - 5
core/sme/src/csr/csr_api_roam.c

@@ -9305,6 +9305,20 @@ QDF_STATUS csr_roam_disconnect_internal(struct mac_context *mac, uint32_t sessio
 	return status;
 }
 
+#if defined(WLAN_FEATURE_HOST_ROAM) || defined(WLAN_FEATURE_ROAM_OFFLOAD)
+static void
+csr_disable_roaming_offload(struct mac_context *mac_ctx, uint32_t vdev_id)
+{
+	sme_stop_roaming(MAC_HANDLE(mac_ctx), vdev_id,
+			 REASON_DRIVER_DISABLED,
+			 RSO_INVALID_REQUESTOR);
+}
+#else
+static inline void
+csr_disable_roaming_offload(struct mac_context *mac_ctx, uint32_t session_id)
+{}
+#endif
+
 QDF_STATUS csr_roam_disconnect(struct mac_context *mac_ctx, uint32_t session_id,
 			       eCsrRoamDisconnectReason reason,
 			       tSirMacReasonCodes mac_reason)
@@ -9317,7 +9331,10 @@ QDF_STATUS csr_roam_disconnect(struct mac_context *mac_ctx, uint32_t session_id,
 	}
 
 	session->discon_in_progress = true;
+
 	csr_roam_cancel_roaming(mac_ctx, session_id);
+	csr_disable_roaming_offload(mac_ctx, session_id);
+
 	csr_roam_remove_duplicate_command(mac_ctx, session_id, NULL,
 					  eCsrForcedDisassoc);
 
@@ -21701,13 +21718,14 @@ static QDF_STATUS csr_process_roam_sync_callback(struct mac_context *mac_ctx,
 	case SIR_ROAMING_INVOKE_FAIL:
 		sme_debug("Roaming triggered failed source %d nud behaviour %d",
 			  vdev_roam_params->source, mac_ctx->nud_fail_behaviour);
+
+		/* Userspace roam req fail, disconnect with AP */
 		if (vdev_roam_params->source == USERSPACE_INITIATED ||
-		    mac_ctx->nud_fail_behaviour == DISCONNECT_AFTER_ROAM_FAIL) {
-			/* Userspace roam req fail, disconnect with AP */
+		    mac_ctx->nud_fail_behaviour == DISCONNECT_AFTER_ROAM_FAIL)
 			csr_roam_disconnect(mac_ctx, session_id,
-					eCSR_DISCONNECT_REASON_DEAUTH,
-					eSIR_MAC_USER_TRIGGERED_ROAM_FAILURE);
-		}
+				    eCSR_DISCONNECT_REASON_DEAUTH,
+				    eSIR_MAC_USER_TRIGGERED_ROAM_FAILURE);
+
 		vdev_roam_params->roam_invoke_in_progress = false;
 		goto end;
 	case SIR_ROAM_SYNCH_PROPAGATION: