浏览代码

qcacmn: Fix roam abort for 2nd sta connect

During wlan0 vdev0 roaming, before roam sync received,  2nd sta wlan1
vdev2 connect req came, disabled RSO of vdev0, so vdev0 roam aborted, and
disconnected.

To fix it, serialize roaming disable during connect too, don’t disable
roaming of other connected sta until serialization allowed in
wlan_serialization_activate_cmd ->cm_connect_active

Change-Id: Ic2e626154b570a1691b8f3d684d21d8a107d09dc
CRs-Fixed: 3510787
Jianmin Zhu 2 年之前
父节点
当前提交
a013c998bd

+ 3 - 1
umac/cmn_services/interface_mgr/inc/wlan_if_mgr_public_struct.h

@@ -51,6 +51,7 @@
  * @WLAN_IF_MGR_EV_AP_CSA_START: Event to handle CSA start
  * @WLAN_IF_MGR_EV_AP_CSA_COMPLETE: Event to handle csa complete
  * @WLAN_IF_MGR_EV_STA_CSA_COMPLETE: Event to handle STA/P2P_CLI CSA completion
+ * @WLAN_IF_MGR_EV_CONNECT_ACTIVE:Event to handle connect active request
  * @WLAN_IF_MGR_EV_MAX: Max event
  */
 enum wlan_if_mgr_evt {
@@ -74,7 +75,8 @@ enum wlan_if_mgr_evt {
 	WLAN_IF_MGR_EV_AP_CSA_START = 17,
 	WLAN_IF_MGR_EV_AP_CSA_COMPLETE = 18,
 	WLAN_IF_MGR_EV_STA_CSA_COMPLETE = 19,
-	WLAN_IF_MGR_EV_MAX = 20,
+	WLAN_IF_MGR_EV_CONNECT_ACTIVE = 20,
+	WLAN_IF_MGR_EV_MAX = 21,
 };
 
 /**

+ 15 - 0
umac/cmn_services/interface_mgr/inc/wlan_if_mgr_sta.h

@@ -36,6 +36,21 @@
 QDF_STATUS if_mgr_connect_start(struct wlan_objmgr_vdev *vdev,
 				struct if_mgr_event_data *event_data);
 
+/**
+ * if_mgr_connect_active() - connect active event handler
+ * @vdev: vdev object
+ * @event_data: Interface mgr event data
+ *
+ * Interface manager connect active event handler, disable roaming of other
+ * sta.
+ *
+ * Context: It should run in thread context
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS if_mgr_connect_active(struct wlan_objmgr_vdev *vdev,
+				 struct if_mgr_event_data *event_data);
+
 /**
  * if_mgr_connect_complete() - connect complete event handler
  * @vdev: vdev object

+ 5 - 0
umac/cmn_services/interface_mgr/src/wlan_if_mgr_core.c

@@ -53,6 +53,7 @@ const char *if_mgr_get_event_str(enum wlan_if_mgr_evt event)
 	CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_CSA_START);
 	CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_CSA_COMPLETE);
 	CASE_RETURN_STRING(WLAN_IF_MGR_EV_STA_CSA_COMPLETE);
+	CASE_RETURN_STRING(WLAN_IF_MGR_EV_CONNECT_ACTIVE);
 	default:
 		return "Unknown";
 	}
@@ -166,6 +167,10 @@ QDF_STATUS if_mgr_deliver_event(struct wlan_objmgr_vdev *vdev,
 	case WLAN_IF_MGR_EV_STA_CSA_COMPLETE:
 		status = if_mgr_sta_csa_complete(vdev, event_data);
 		break;
+	case WLAN_IF_MGR_EV_CONNECT_ACTIVE:
+		status = if_mgr_connect_active(vdev, event_data);
+		break;
+
 	default:
 		status = if_mgr_deliver_mbss_event(vdev, event, event_data);
 	}

+ 8 - 0
umac/mlme/connection_mgr/core/src/wlan_cm_connect.c

@@ -2112,12 +2112,20 @@ void cm_fill_vdev_crypto_params(struct cnx_mgr *cm_ctx,
 				   req->crypto.rsn_caps);
 }
 
+static QDF_STATUS
+cm_if_mgr_inform_connect_active(struct wlan_objmgr_vdev *vdev)
+{
+	return if_mgr_deliver_event(vdev, WLAN_IF_MGR_EV_CONNECT_ACTIVE, NULL);
+}
+
 QDF_STATUS cm_connect_active(struct cnx_mgr *cm_ctx, wlan_cm_id *cm_id)
 {
 	struct cm_req *cm_req;
 	QDF_STATUS status;
 	struct wlan_cm_connect_req *req;
 
+	cm_if_mgr_inform_connect_active(cm_ctx->vdev);
+
 	cm_ctx->active_cm_id = *cm_id;
 	cm_req = cm_get_req_by_cm_id(cm_ctx, *cm_id);
 	if (!cm_req) {