Ver código fonte

qcacmn: Fix link peer is deleted before assoc peer

When vdev1 connected, if find vdev0 isn't connected, disconnect vdev1 in
async way by sending msg to scheduler thread, and disconnect vdev0 cmd is
enqueued to serialization before disconnect vdev1 cmd, so vdev0 assoc peer
delete happens before vdev1 link peer, F/W assert happens.

To fix it, when vdev1 connected, if find vdev0 isn't connected, disconnect
vdev1 in sync way, and let disconnect vdev1 cmd enqueue to serialization
queue header instead of tail, make sure it is activated befored disconnect
vdev0 cmd.

Change-Id: I80b1c8f6528bdd58e953851e164e5bfce2b3bd4a
CRs-Fixed: 3339030
Jianmin Zhu 2 anos atrás
pai
commit
1aaeca79da

+ 4 - 0
umac/mlme/connection_mgr/core/src/wlan_cm_disconnect.c

@@ -228,6 +228,10 @@ static QDF_STATUS cm_ser_disconnect_req(struct wlan_objmgr_pdev *pdev,
 	cmd.cmd_timeout_duration = DISCONNECT_TIMEOUT;
 	cmd.vdev = cm_ctx->vdev;
 	cmd.is_blocking = cm_ser_get_blocking_cmd();
+	if (wlan_vdev_mlme_is_link_sta_vdev(cmd.vdev)) {
+		mlme_debug("Set link dev disconnect cmd as high priority");
+		cmd.is_high_priority = true;
+	}
 
 	ser_cmd_status = wlan_serialization_request(&cmd);
 	switch (ser_cmd_status) {

+ 3 - 1
umac/mlo_mgr/src/wlan_mlo_mgr_sta.c

@@ -964,7 +964,9 @@ void mlo_sta_link_connect_notify(struct wlan_objmgr_vdev *vdev,
 		mlo_debug("Handle pending disconnect for vdev %d",
 			  wlan_vdev_get_id(vdev));
 		if (assoc_vdev != vdev)
-			mlo_handle_pending_disconnect(vdev);
+			mlo_disconnect(vdev, CM_MLME_DISCONNECT,
+				       REASON_DEAUTH_NETWORK_LEAVING,
+				       NULL);
 		return;
 	}