|
@@ -441,78 +441,17 @@ static bool mlme_vdev_state_up_event(void *ctx, uint16_t event,
|
|
|
|
|
|
switch (event) {
|
|
|
case WLAN_VDEV_SM_EV_START_SUCCESS:
|
|
|
- mlme_vdev_update_beacon(vdev_mlme, BEACON_INIT,
|
|
|
- event_data_len, event_data);
|
|
|
- if (mlme_vdev_up_send(vdev_mlme, event_data_len,
|
|
|
- event_data) != QDF_STATUS_SUCCESS)
|
|
|
- mlme_vdev_sm_deliver_event(vdev_mlme,
|
|
|
- WLAN_VDEV_SM_EV_UP_FAIL,
|
|
|
- event_data_len, event_data);
|
|
|
+ if (wlan_vdev_mlme_is_mlo_ap(vdev))
|
|
|
+ mlme_vdev_sm_transition_to(vdev_mlme,
|
|
|
+ WLAN_VDEV_SS_MLO_SYNC_WAIT);
|
|
|
else
|
|
|
- mlme_vdev_notify_up_complete(vdev_mlme, event_data_len,
|
|
|
- event_data);
|
|
|
-
|
|
|
- status = true;
|
|
|
- break;
|
|
|
-
|
|
|
- case WLAN_VDEV_SM_EV_SUSPEND_RESTART:
|
|
|
- case WLAN_VDEV_SM_EV_HOST_RESTART:
|
|
|
- case WLAN_VDEV_SM_EV_CSA_RESTART:
|
|
|
- /* These events are not supported in STA mode */
|
|
|
- if (mode == QDF_STA_MODE)
|
|
|
- QDF_BUG(0);
|
|
|
- /* fallthrough */
|
|
|
- case WLAN_VDEV_SM_EV_DOWN:
|
|
|
- mlme_vdev_sm_transition_to(vdev_mlme, WLAN_VDEV_S_SUSPEND);
|
|
|
- mlme_vdev_sm_deliver_event(vdev_mlme, event,
|
|
|
- event_data_len, event_data);
|
|
|
- status = true;
|
|
|
- break;
|
|
|
-
|
|
|
- case WLAN_VDEV_SM_EV_RADAR_DETECTED:
|
|
|
- /* These events are not supported in STA mode */
|
|
|
- if (mode == QDF_STA_MODE)
|
|
|
- QDF_BUG(0);
|
|
|
- mlme_vdev_sm_transition_to(vdev_mlme, WLAN_VDEV_S_SUSPEND);
|
|
|
- mlme_vdev_sm_deliver_event(vdev_mlme,
|
|
|
- WLAN_VDEV_SM_EV_CSA_RESTART,
|
|
|
- event_data_len, event_data);
|
|
|
- status = true;
|
|
|
- break;
|
|
|
-
|
|
|
- case WLAN_VDEV_SM_EV_UP_HOST_RESTART:
|
|
|
- /* Reinit beacon, send template to FW(use ping-pong buffer) */
|
|
|
- mlme_vdev_update_beacon(vdev_mlme, BEACON_UPDATE,
|
|
|
- event_data_len, event_data);
|
|
|
- /* fallthrough */
|
|
|
- case WLAN_VDEV_SM_EV_START:
|
|
|
- /* notify that UP command is completed */
|
|
|
- mlme_vdev_notify_up_complete(vdev_mlme,
|
|
|
- event_data_len, event_data);
|
|
|
- status = true;
|
|
|
- break;
|
|
|
-
|
|
|
- case WLAN_VDEV_SM_EV_FW_VDEV_RESTART:
|
|
|
- mlme_vdev_sm_transition_to(vdev_mlme, WLAN_VDEV_S_START);
|
|
|
- mlme_vdev_sm_deliver_event(vdev_mlme,
|
|
|
- WLAN_VDEV_SM_EV_RESTART_REQ,
|
|
|
- event_data_len, event_data);
|
|
|
- status = true;
|
|
|
- break;
|
|
|
-
|
|
|
- case WLAN_VDEV_SM_EV_UP_FAIL:
|
|
|
- mlme_vdev_sm_transition_to(vdev_mlme, WLAN_VDEV_S_SUSPEND);
|
|
|
+ mlme_vdev_sm_transition_to(vdev_mlme,
|
|
|
+ WLAN_VDEV_SS_UP_ACTIVE);
|
|
|
mlme_vdev_sm_deliver_event(vdev_mlme, event,
|
|
|
event_data_len, event_data);
|
|
|
status = true;
|
|
|
break;
|
|
|
|
|
|
- case WLAN_VDEV_SM_EV_ROAM:
|
|
|
- mlme_vdev_notify_roam_start(vdev_mlme, event_data_len,
|
|
|
- event_data);
|
|
|
- status = true;
|
|
|
- break;
|
|
|
-
|
|
|
default:
|
|
|
status = false;
|
|
|
break;
|
|
@@ -1643,6 +1582,233 @@ static bool mlme_vdev_subst_stop_down_progress_event(void *ctx,
|
|
|
return status;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * mlme_vdev_subst_mlo_sync_wait_entry() - Entry API for mlo sync wait sub state
|
|
|
+ * @ctx: VDEV MLME object
|
|
|
+ *
|
|
|
+ * API to perform operations on moving to MLO-SYNC-WAIT substate
|
|
|
+ *
|
|
|
+ * Return: void
|
|
|
+ */
|
|
|
+static void mlme_vdev_subst_mlo_sync_wait_entry(void *ctx)
|
|
|
+{
|
|
|
+ struct vdev_mlme_obj *vdev_mlme = (struct vdev_mlme_obj *)ctx;
|
|
|
+ struct wlan_objmgr_vdev *vdev;
|
|
|
+
|
|
|
+ vdev = vdev_mlme->vdev;
|
|
|
+
|
|
|
+ if (wlan_vdev_mlme_get_state(vdev) != WLAN_VDEV_S_UP)
|
|
|
+ QDF_BUG(0);
|
|
|
+
|
|
|
+ mlme_vdev_set_substate(vdev, WLAN_VDEV_SS_MLO_SYNC_WAIT);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * mlme_vdev_subst_mlo_sync_wait_exit() - Exit API for mlo sync wait sub state
|
|
|
+ * @ctx: VDEV MLME object
|
|
|
+ *
|
|
|
+ * API to perform operations on moving out of MLO-SYNC-WAIT substate
|
|
|
+ *
|
|
|
+ * Return: void
|
|
|
+ */
|
|
|
+static void mlme_vdev_subst_mlo_sync_wait_exit(void *ctx)
|
|
|
+{
|
|
|
+ /* NONE */
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * mlme_vdev_subst_mlo_sync_wait_event() - Event handler API for mlo sync wait
|
|
|
+ * substate
|
|
|
+ * @ctx: VDEV MLME object
|
|
|
+ *
|
|
|
+ * API to handle events in MLO-SYNC-WAIT substate
|
|
|
+ *
|
|
|
+ * Return: SUCCESS: on handling event
|
|
|
+ * FAILURE: on ignoring the event
|
|
|
+ */
|
|
|
+static bool mlme_vdev_subst_mlo_sync_wait_event(void *ctx, uint16_t event,
|
|
|
+ uint16_t event_data_len,
|
|
|
+ void *event_data)
|
|
|
+{
|
|
|
+ struct vdev_mlme_obj *vdev_mlme = (struct vdev_mlme_obj *)ctx;
|
|
|
+ bool status;
|
|
|
+
|
|
|
+ switch (event) {
|
|
|
+ case WLAN_VDEV_SM_EV_START_SUCCESS:
|
|
|
+ mlme_vdev_up_notify_mlo_mgr(vdev_mlme);
|
|
|
+ status = true;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case WLAN_VDEV_SM_EV_MLO_SYNC_COMPLETE:
|
|
|
+ mlme_vdev_sm_transition_to(vdev_mlme, WLAN_VDEV_SS_UP_ACTIVE);
|
|
|
+ mlme_vdev_sm_deliver_event(vdev_mlme, event,
|
|
|
+ event_data_len, event_data);
|
|
|
+ status = true;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case WLAN_VDEV_SM_EV_DOWN:
|
|
|
+ mlme_vdev_sm_transition_to(vdev_mlme, WLAN_VDEV_S_STOP);
|
|
|
+ mlme_vdev_sm_deliver_event(vdev_mlme, WLAN_VDEV_SM_EV_STOP_REQ,
|
|
|
+ event_data_len, event_data);
|
|
|
+ status = true;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case WLAN_VDEV_SM_EV_RADAR_DETECTED:
|
|
|
+ mlme_vdev_sm_transition_to(vdev_mlme, WLAN_VDEV_S_START);
|
|
|
+ mlme_vdev_sm_deliver_event(vdev_mlme,
|
|
|
+ WLAN_VDEV_SM_EV_RESTART_REQ,
|
|
|
+ event_data_len, event_data);
|
|
|
+ status = true;
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ status = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ return status;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * mlme_vdev_subst_up_active_entry() - Entry API for up active sub state
|
|
|
+ * @ctx: VDEV MLME object
|
|
|
+ *
|
|
|
+ * API to perform operations on moving to UP-ACTIVE substate
|
|
|
+ *
|
|
|
+ * Return: void
|
|
|
+ */
|
|
|
+static void mlme_vdev_subst_up_active_entry(void *ctx)
|
|
|
+{
|
|
|
+ struct vdev_mlme_obj *vdev_mlme = (struct vdev_mlme_obj *)ctx;
|
|
|
+ struct wlan_objmgr_vdev *vdev;
|
|
|
+
|
|
|
+ vdev = vdev_mlme->vdev;
|
|
|
+
|
|
|
+ if (wlan_vdev_mlme_get_state(vdev) != WLAN_VDEV_S_UP)
|
|
|
+ QDF_BUG(0);
|
|
|
+
|
|
|
+ mlme_vdev_set_substate(vdev, WLAN_VDEV_SS_UP_ACTIVE);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * mlme_vdev_subst_up_active_exit() - Exit API for up active sub state
|
|
|
+ * @ctx: VDEV MLME object
|
|
|
+ *
|
|
|
+ * API to perform operations on moving out of UP-ACTIVE substate
|
|
|
+ *
|
|
|
+ * Return: void
|
|
|
+ */
|
|
|
+static void mlme_vdev_subst_up_active_exit(void *ctx)
|
|
|
+{
|
|
|
+ /* NONE */
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * mlme_vdev_subst_up_active_event() - Event handler API for up active substate
|
|
|
+ * @ctx: VDEV MLME object
|
|
|
+ *
|
|
|
+ * API to handle events in UP-ACTIVE substate
|
|
|
+ *
|
|
|
+ * Return: SUCCESS: on handling event
|
|
|
+ * FAILURE: on ignoring the event
|
|
|
+ */
|
|
|
+static bool mlme_vdev_subst_up_active_event(void *ctx, uint16_t event,
|
|
|
+ uint16_t event_data_len,
|
|
|
+ void *event_data)
|
|
|
+{
|
|
|
+ struct vdev_mlme_obj *vdev_mlme = (struct vdev_mlme_obj *)ctx;
|
|
|
+ enum QDF_OPMODE mode;
|
|
|
+ struct wlan_objmgr_vdev *vdev;
|
|
|
+ bool status;
|
|
|
+
|
|
|
+ vdev = vdev_mlme->vdev;
|
|
|
+ mode = wlan_vdev_mlme_get_opmode(vdev);
|
|
|
+
|
|
|
+ switch (event) {
|
|
|
+ case WLAN_VDEV_SM_EV_START_SUCCESS:
|
|
|
+ if (wlan_vdev_mlme_is_mlo_ap(vdev))
|
|
|
+ QDF_BUG(0);
|
|
|
+ /* fallthrough */
|
|
|
+ case WLAN_VDEV_SM_EV_MLO_SYNC_COMPLETE:
|
|
|
+ mlme_vdev_update_beacon(vdev_mlme, BEACON_INIT,
|
|
|
+ event_data_len, event_data);
|
|
|
+ if (mlme_vdev_up_send(vdev_mlme, event_data_len,
|
|
|
+ event_data) != QDF_STATUS_SUCCESS)
|
|
|
+ mlme_vdev_sm_deliver_event(vdev_mlme,
|
|
|
+ WLAN_VDEV_SM_EV_UP_FAIL,
|
|
|
+ event_data_len, event_data);
|
|
|
+ else
|
|
|
+ mlme_vdev_notify_up_complete(vdev_mlme, event_data_len,
|
|
|
+ event_data);
|
|
|
+ status = true;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case WLAN_VDEV_SM_EV_SUSPEND_RESTART:
|
|
|
+ case WLAN_VDEV_SM_EV_HOST_RESTART:
|
|
|
+ case WLAN_VDEV_SM_EV_CSA_RESTART:
|
|
|
+ /* These events are not supported in STA mode */
|
|
|
+ if (mode == QDF_STA_MODE)
|
|
|
+ QDF_BUG(0);
|
|
|
+ /* fallthrough */
|
|
|
+ case WLAN_VDEV_SM_EV_DOWN:
|
|
|
+ mlme_vdev_sm_transition_to(vdev_mlme, WLAN_VDEV_S_SUSPEND);
|
|
|
+ mlme_vdev_sm_deliver_event(vdev_mlme, event,
|
|
|
+ event_data_len, event_data);
|
|
|
+ status = true;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case WLAN_VDEV_SM_EV_RADAR_DETECTED:
|
|
|
+ /* These events are not supported in STA mode */
|
|
|
+ if (mode == QDF_STA_MODE)
|
|
|
+ QDF_BUG(0);
|
|
|
+ mlme_vdev_sm_transition_to(vdev_mlme, WLAN_VDEV_S_SUSPEND);
|
|
|
+ mlme_vdev_sm_deliver_event(vdev_mlme,
|
|
|
+ WLAN_VDEV_SM_EV_CSA_RESTART,
|
|
|
+ event_data_len, event_data);
|
|
|
+ status = true;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case WLAN_VDEV_SM_EV_UP_HOST_RESTART:
|
|
|
+ /* Reinit beacon, send template to FW(use ping-pong buffer) */
|
|
|
+ mlme_vdev_update_beacon(vdev_mlme, BEACON_UPDATE,
|
|
|
+ event_data_len, event_data);
|
|
|
+ /* fallthrough */
|
|
|
+ case WLAN_VDEV_SM_EV_START:
|
|
|
+ /* notify that UP command is completed */
|
|
|
+ mlme_vdev_notify_up_complete(vdev_mlme,
|
|
|
+ event_data_len, event_data);
|
|
|
+ status = true;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case WLAN_VDEV_SM_EV_FW_VDEV_RESTART:
|
|
|
+ mlme_vdev_sm_transition_to(vdev_mlme, WLAN_VDEV_S_START);
|
|
|
+ mlme_vdev_sm_deliver_event(vdev_mlme,
|
|
|
+ WLAN_VDEV_SM_EV_RESTART_REQ,
|
|
|
+ event_data_len, event_data);
|
|
|
+ status = true;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case WLAN_VDEV_SM_EV_UP_FAIL:
|
|
|
+ mlme_vdev_sm_transition_to(vdev_mlme, WLAN_VDEV_S_SUSPEND);
|
|
|
+ mlme_vdev_sm_deliver_event(vdev_mlme, event,
|
|
|
+ event_data_len, event_data);
|
|
|
+ status = true;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case WLAN_VDEV_SM_EV_ROAM:
|
|
|
+ mlme_vdev_notify_roam_start(vdev_mlme, event_data_len,
|
|
|
+ event_data);
|
|
|
+ status = true;
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ status = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ return status;
|
|
|
+}
|
|
|
+
|
|
|
|
|
|
static const char *vdev_sm_event_names[] = {
|
|
|
"EV_START",
|
|
@@ -1676,6 +1842,7 @@ static const char *vdev_sm_event_names[] = {
|
|
|
"EV_ROAM",
|
|
|
"EV_STOP_REQ",
|
|
|
"EV_CHAN_SWITCH_DISABLED",
|
|
|
+ "EV_MLO_SYNC_COMPLETE",
|
|
|
};
|
|
|
|
|
|
struct wlan_sm_state_info sm_info[] = {
|
|
@@ -1859,6 +2026,26 @@ struct wlan_sm_state_info sm_info[] = {
|
|
|
NULL,
|
|
|
NULL,
|
|
|
},
|
|
|
+ {
|
|
|
+ (uint8_t)WLAN_VDEV_SS_MLO_SYNC_WAIT,
|
|
|
+ (uint8_t)WLAN_VDEV_S_UP,
|
|
|
+ (uint8_t)WLAN_SM_ENGINE_STATE_NONE,
|
|
|
+ false,
|
|
|
+ "UP-MLO-SYNC-WAIT",
|
|
|
+ mlme_vdev_subst_mlo_sync_wait_entry,
|
|
|
+ mlme_vdev_subst_mlo_sync_wait_exit,
|
|
|
+ mlme_vdev_subst_mlo_sync_wait_event
|
|
|
+ },
|
|
|
+ {
|
|
|
+ (uint8_t)WLAN_VDEV_SS_UP_ACTIVE,
|
|
|
+ (uint8_t)WLAN_VDEV_S_UP,
|
|
|
+ (uint8_t)WLAN_SM_ENGINE_STATE_NONE,
|
|
|
+ false,
|
|
|
+ "UP-UP-ACTIVE",
|
|
|
+ mlme_vdev_subst_up_active_entry,
|
|
|
+ mlme_vdev_subst_up_active_exit,
|
|
|
+ mlme_vdev_subst_up_active_event
|
|
|
+ },
|
|
|
{
|
|
|
(uint8_t)WLAN_VDEV_SS_MAX,
|
|
|
(uint8_t)WLAN_SM_ENGINE_STATE_NONE,
|