Prechádzať zdrojové kódy

qcacmn: Implement VDEV MLME State machine

This change implement VDEV MLME State machine based on design,
and handles valid events in each state and invokes legacy callback
APIs to perform state specific operations

Change-Id: I38a11778cba31276c720bc13c085ade60b1fb0c4
CRs-Fixed: 2307722
Srinivas Pitla 6 rokov pred
rodič
commit
90713473d1

+ 18 - 22
umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h

@@ -31,6 +31,7 @@
 #include "wlan_objmgr_cmn.h"
 #include "wlan_objmgr_pdev_obj.h"
 #include "wlan_objmgr_psoc_obj.h"
+#include "wlan_vdev_mlme_main.h"
 
 	/* CONF: privacy enabled */
 #define WLAN_VDEV_F_PRIVACY              0x00000001
@@ -218,27 +219,6 @@
 /* Invalid VDEV identifier */
 #define WLAN_INVALID_VDEV_ID 255
 
-/**
- * enum wlan_vdev_state - VDEV state
- * @WLAN_VDEV_S_INIT:    Default state, IDLE state
- * @WLAN_VDEV_S_SCAN:    SCAN state
- * @WLAN_VDEV_S_JOIN:    Join state
- * @WLAN_VDEV_S_DFS_WAIT:CAC period
- * @WLAN_VDEV_S_RUN:     RUN state
- * @WLAN_VDEV_S_STOP:    STOP state
- * @WLAN_VDEV_S_RESET:   RESET state, STOP+INIT+JOIN
- * @WLAN_VDEV_S_MAX:     MAX state
- */
-enum wlan_vdev_state {
-	WLAN_VDEV_S_INIT     = 0,
-	WLAN_VDEV_S_SCAN     = 1,
-	WLAN_VDEV_S_JOIN     = 2,
-	WLAN_VDEV_S_DFS_WAIT = 3,
-	WLAN_VDEV_S_RUN      = 4,
-	WLAN_VDEV_S_STOP     = 5,
-	WLAN_VDEV_S_RESET    = 6,
-	WLAN_VDEV_S_MAX,
-};
 
 /**
  * struct wlan_vdev_create_params - Create params, HDD/OSIF passes this
@@ -1295,6 +1275,21 @@ static inline enum wlan_vdev_state wlan_vdev_mlme_get_state(
 	return vdev->vdev_mlme.mlme_state;
 }
 
+#ifdef CMN_VDEV_MLME_SM_ENABLE
+/**
+ * wlan_vdev_mlme_get_substate() - get mlme substate
+ * @vdev: VDEV object
+ *
+ * API to get VDEV MLME substate
+ *
+ * Return: substate of VDEV MLME
+ */
+static inline enum wlan_vdev_state wlan_vdev_mlme_get_substate(
+				struct wlan_objmgr_vdev *vdev)
+{
+	return vdev->vdev_mlme.mlme_substate;
+}
+#else
 /**
  * wlan_vdev_mlme_set_state() - set mlme state
  * @vdev: VDEV object
@@ -1305,11 +1300,12 @@ static inline enum wlan_vdev_state wlan_vdev_mlme_get_state(
  * Return: void
  */
 static inline void wlan_vdev_mlme_set_state(struct wlan_objmgr_vdev *vdev,
-					enum wlan_vdev_state state)
+						enum wlan_vdev_state state)
 {
 	if (state < WLAN_VDEV_S_MAX)
 		vdev->vdev_mlme.mlme_state = state;
 }
+#endif
 
 /**
  * wlan_vdev_set_selfpeer() - set self peer

+ 96 - 10
umac/cmn_services/utils/inc/wlan_utility.h

@@ -38,6 +38,18 @@ struct wlan_find_vdev_filter {
 	struct wlan_objmgr_vdev *found_vdev;
 };
 
+#ifdef CMN_VDEV_MLME_SM_ENABLE
+/**
+ * struct wlan_vdev_ch_check_filter - vdev chan check filter object
+ * @flag:     matches or not
+ * @vdev:     vdev to be checked against all the active vdevs
+ */
+struct wlan_vdev_ch_check_filter {
+	uint8_t flag;
+	struct wlan_objmgr_vdev *vdev;
+};
+#endif
+
 /**
  * wlan_chan_to_freq() - converts channel to frequency
  * @chan: channel number
@@ -126,9 +138,9 @@ bool wlan_is_emulation_platform(uint32_t phy_version);
 
 /**
  * wlan_get_pdev_id_from_vdev_id() - Helper func to derive pdev id from vdev_id
- * @psoc    : psoc object
- * @vdev_id : vdev identifier
- * @dbg_id  : object manager debug id
+ * @psoc: psoc object
+ * @vdev_id: vdev identifier
+ * @dbg_id: object manager debug id
  *
  * This function is used to derive the pdev id from vdev id for a psoc
  *
@@ -142,9 +154,9 @@ uint32_t wlan_get_pdev_id_from_vdev_id(struct wlan_objmgr_psoc *psoc,
 /**
  * wlan_util_get_vdev_by_ifname() - function to return vdev object from psoc
  * matching given interface name
- * @psoc    : psoc object
- * @ifname  : interface name
- * @ref_id  : object manager ref id
+ * @psoc: psoc object
+ * @ifname: interface name
+ * @ref_id: object manager ref id
  *
  * This function returns vdev object from psoc by interface name. If found this
  * will also take reference with given ref_id
@@ -167,12 +179,86 @@ struct wlan_objmgr_vdev *wlan_util_get_vdev_by_ifname(
 uint8_t *wlan_util_vdev_get_if_name(struct wlan_objmgr_vdev *vdev);
 
 /*
- * wlan_util_is_vap_active() - Check for vap active
+ * wlan_util_is_vdev_active() - Check for vdev active
  * @pdev: pdev pointer
  * @dbg_id: debug id for ref counting
  *
- * @Return: QDF_STATUS_SUCCESS in case of vap active
+ * @Return: QDF_STATUS_SUCCESS in case of vdev active
+ */
+QDF_STATUS wlan_util_is_vdev_active(struct wlan_objmgr_pdev *pdev,
+				    wlan_objmgr_ref_dbgid dbg_id);
+
+/*
+ * wlan_vdev_is_up() - Check for vdev is in UP state
+ * @vdev: vdev pointer
+ *
+ * @Return: true in case of vdev is in UP state
+ */
+bool wlan_vdev_is_up(struct wlan_objmgr_vdev *vdev);
+
+/**
+ * wlan_util_pdev_vdevs_deschan_match() - function to check des channel matches
+ *                                        with other vdevs in pdev
+ * @pdev: pdev object
+ * @vdev: vdev object
+ * @ref_id: object manager ref id
+ *
+ * This function checks the vdev desired channel with other vdev channels
+ *
+ * Return : SUCCESS, if it matches, otherwise FAILURE
+ */
+QDF_STATUS wlan_util_pdev_vdevs_deschan_match(struct wlan_objmgr_pdev *pdev,
+					      struct wlan_objmgr_vdev *vdev,
+					      wlan_objmgr_ref_dbgid dbg_id);
+
+/**
+ * wlan_util_change_map_index() - function to set/reset given index bit
+ * @map: bitmpap
+ * @id: bit index
+ * @set: 1 for set, 0 of reset
+ *
+ * This function set/reset given index bit
+ *
+ * Return : void
  */
-QDF_STATUS wlan_util_is_vap_active(struct wlan_objmgr_pdev *pdev,
-				   wlan_objmgr_ref_dbgid dbg_id);
+void wlan_util_change_map_index(uint32_t *map, uint8_t id, uint8_t set);
+
+/**
+ * wlan_util_map_index_is_set() - function to check whether given index bit is
+ *                                set
+ * @map: bitmpap
+ * @id: bit index
+ *
+ * This function checks the given index bit is set
+ *
+ * Return : true, if bit is set, otherwise false
+ */
+bool wlan_util_map_index_is_set(uint32_t *map, uint8_t id);
+
+/**
+ * wlan_pdev_chan_change_pending_vdevs() - function to test/set channel change
+ *                                         pending flag
+ * @pdev: pdev object
+ * @vdev_id_map: bitmap to derive channel change vdevs
+ * @ref_id: object manager ref id
+ *
+ * This function test/set channel change pending flag
+ *
+ * Return : SUCCESS, if it iterates through all vdevs, otherwise FAILURE
+ */
+QDF_STATUS wlan_pdev_chan_change_pending_vdevs(struct wlan_objmgr_pdev *pdev,
+					       uint32_t *vdev_id_map,
+					       wlan_objmgr_ref_dbgid dbg_id);
+
+/**
+ * wlan_chan_eq() - function to check whether both channels are same
+ * @chan1: channel1 object
+ * @chan2: channel2 object
+ *
+ * This function checks the chan1 and chan2 are same
+ *
+ * Return : SUCCESS, if it matches, otherwise FAILURE
+ */
+QDF_STATUS wlan_chan_eq(struct wlan_channel *chan1, struct wlan_channel *chan2);
+
 #endif /* _WLAN_UTILITY_H_ */

+ 184 - 11
umac/cmn_services/utils/src/wlan_utility.c

@@ -26,6 +26,7 @@
 #include "wlan_osif_priv.h"
 #include <net/cfg80211.h>
 #include <qdf_module.h>
+#include <wlan_vdev_mlme_api.h>
 
 uint32_t wlan_chan_to_freq(uint8_t chan)
 {
@@ -257,36 +258,208 @@ uint8_t *wlan_util_vdev_get_if_name(struct wlan_objmgr_vdev *vdev)
 }
 qdf_export_symbol(wlan_util_vdev_get_if_name);
 
-static void wlan_vap_active(struct wlan_objmgr_pdev *pdev,
-			void *object,
-			void *arg)
+#ifdef CMN_VDEV_MLME_SM_ENABLE
+static void wlan_vdev_active(struct wlan_objmgr_pdev *pdev, void *object,
+			     void *arg)
+{
+	struct wlan_objmgr_vdev *vdev = (struct wlan_objmgr_vdev *)object;
+	uint8_t *flag = (uint8_t *)arg;
+
+	wlan_vdev_obj_lock(vdev);
+	if (wlan_vdev_mlme_is_active(vdev) == QDF_STATUS_SUCCESS)
+		*flag = 1;
+
+	wlan_vdev_obj_unlock(vdev);
+}
+
+bool wlan_vdev_is_up(struct wlan_objmgr_vdev *vdev)
+{
+	bool ret_val = false;
+
+	if (wlan_vdev_allow_connect_n_tx(vdev) == QDF_STATUS_SUCCESS)
+		ret_val = true;
+
+	return ret_val;
+}
+
+qdf_export_symbol(wlan_vdev_is_up);
+#else
+static void wlan_vdev_active(struct wlan_objmgr_pdev *pdev, void *object,
+			     void *arg)
 {
 	struct wlan_objmgr_vdev *vdev = (struct wlan_objmgr_vdev *)object;
 	uint8_t *flag = (uint8_t *)arg;
 
 	wlan_vdev_obj_lock(vdev);
 	if ((wlan_vdev_mlme_get_state(vdev) == WLAN_VDEV_S_RUN) ||
-		(wlan_vdev_mlme_get_state(vdev) == WLAN_VDEV_S_DFS_WAIT)) {
+		(wlan_vdev_mlme_get_state(vdev) == WLAN_VDEV_S_DFS_WAIT))
 		*flag = 1;
-	}
+
 	wlan_vdev_obj_unlock(vdev);
 }
 
-QDF_STATUS wlan_util_is_vap_active(struct wlan_objmgr_pdev *pdev,
-				   wlan_objmgr_ref_dbgid dbg_id)
+bool wlan_vdev_is_up(struct wlan_objmgr_vdev *vdev)
+{
+	bool ret_val = false;
+
+	wlan_vdev_obj_lock(vdev);
+	if (wlan_vdev_mlme_get_state(vdev) == WLAN_VDEV_S_RUN)
+		ret_val = true;
+
+	wlan_vdev_obj_unlock(vdev);
+
+	return ret_val;
+}
+
+qdf_export_symbol(wlan_vdev_is_up);
+#endif
+
+QDF_STATUS wlan_util_is_vdev_active(struct wlan_objmgr_pdev *pdev,
+				    wlan_objmgr_ref_dbgid dbg_id)
 {
 	uint8_t flag = 0;
 
 	if (!pdev)
 		return QDF_STATUS_E_INVAL;
 
-	wlan_objmgr_pdev_iterate_obj_list(pdev,
-				WLAN_VDEV_OP,
-				wlan_vap_active,
-				&flag, 0, dbg_id);
+	wlan_objmgr_pdev_iterate_obj_list(pdev, WLAN_VDEV_OP, wlan_vdev_active,
+					  &flag, 0, dbg_id);
 
 	if (flag == 1)
 		return QDF_STATUS_SUCCESS;
 
 	return QDF_STATUS_E_INVAL;
 }
+
+#ifdef CMN_VDEV_MLME_SM_ENABLE
+void wlan_util_change_map_index(uint32_t *map, uint8_t id, uint8_t set)
+{
+	uint8_t map_index = 0;
+	uint8_t map_entry_size = 32;
+	uint8_t adjust_index = 0;
+
+	/*
+	 * Derive map_index and adjust_index to find actual DWORD
+	 * the id map is present
+	 */
+	while ((id - adjust_index) >= map_entry_size) {
+		map_index++;
+		adjust_index = map_index * map_entry_size;
+	}
+	if (set)
+		map[map_index] |= (1 << (id - adjust_index));
+	else
+		map[map_index] &= ~(1 << (id - adjust_index));
+}
+
+bool wlan_util_map_index_is_set(uint32_t *map, uint8_t id)
+{
+	uint8_t map_index = 0;
+	uint8_t map_entry_size = 32;
+	uint8_t adjust_index = 0;
+
+	/*
+	 * Derive map_index and adjust_index to find actual DWORD
+	 * the id map is present
+	 */
+	while ((id - adjust_index) >= map_entry_size) {
+		map_index++;
+		adjust_index = map_index * map_entry_size;
+	}
+	if (map[map_index] & (1 << (id - adjust_index)))
+		return true;
+
+	return false;
+}
+
+static void wlan_vdev_chan_change_pending(struct wlan_objmgr_pdev *pdev,
+					  void *object, void *arg)
+{
+	struct wlan_objmgr_vdev *vdev = (struct wlan_objmgr_vdev *)object;
+	uint32_t *vdev_id_map = (uint32_t *)arg;
+	uint8_t id = 0;
+	struct wlan_objmgr_psoc *psoc;
+
+	psoc = wlan_pdev_get_psoc(pdev);
+	if (!psoc)
+		return;
+
+	wlan_vdev_obj_lock(vdev);
+	if (wlan_vdev_chan_config_valid(vdev) == QDF_STATUS_SUCCESS) {
+		id = wlan_vdev_get_id(vdev);
+		/* Invalid vdev id */
+		if (id >= wlan_psoc_get_max_vdev_count(psoc))
+			return;
+
+		wlan_util_change_map_index(vdev_id_map, id, 1);
+	}
+
+	wlan_vdev_obj_unlock(vdev);
+}
+
+QDF_STATUS wlan_pdev_chan_change_pending_vdevs(struct wlan_objmgr_pdev *pdev,
+					       uint32_t *vdev_id_map,
+					       wlan_objmgr_ref_dbgid dbg_id)
+{
+	if (!pdev)
+		return QDF_STATUS_E_INVAL;
+
+	wlan_objmgr_pdev_iterate_obj_list(pdev, WLAN_VDEV_OP,
+					  wlan_vdev_chan_change_pending,
+					  vdev_id_map, 0, dbg_id);
+
+	return QDF_STATUS_SUCCESS;
+}
+
+QDF_STATUS wlan_chan_eq(struct wlan_channel *chan1, struct wlan_channel *chan2)
+{
+	if (!qdf_mem_cmp(chan1, chan2, sizeof(struct wlan_channel)))
+		return QDF_STATUS_SUCCESS;
+
+	return QDF_STATUS_E_FAILURE;
+}
+
+static void wlan_pdev_chan_match(struct wlan_objmgr_pdev *pdev,	void *object,
+				 void *arg)
+{
+	struct wlan_objmgr_vdev *comp_vdev = (struct wlan_objmgr_vdev *)object;
+	struct wlan_vdev_ch_check_filter *ch_filter = arg;
+
+	if (ch_filter->flag)
+		return;
+
+	wlan_vdev_obj_lock(comp_vdev);
+	wlan_vdev_obj_lock(ch_filter->vdev);
+
+	if (wlan_vdev_chan_config_valid(ch_filter->vdev) == QDF_STATUS_SUCCESS)
+		if (wlan_chan_eq(wlan_vdev_mlme_get_des_chan(comp_vdev),
+				 wlan_vdev_mlme_get_des_chan(ch_filter->vdev))
+				 != QDF_STATUS_SUCCESS)
+			ch_filter->flag = 1;
+
+	wlan_vdev_obj_unlock(ch_filter->vdev);
+	wlan_vdev_obj_unlock(comp_vdev);
+}
+
+QDF_STATUS wlan_util_pdev_vdevs_deschan_match(struct wlan_objmgr_pdev *pdev,
+					      struct wlan_objmgr_vdev *vdev,
+					      wlan_objmgr_ref_dbgid dbg_id)
+{
+	struct wlan_vdev_ch_check_filter ch_filter;
+
+	if (!pdev)
+		return QDF_STATUS_E_INVAL;
+
+	ch_filter.flag = 0;
+	ch_filter.vdev = vdev;
+
+	wlan_objmgr_pdev_iterate_obj_list(pdev, WLAN_VDEV_OP,
+					  wlan_pdev_chan_match, &ch_filter, 0,
+					  dbg_id);
+
+	if (ch_filter.flag == 0)
+		return QDF_STATUS_SUCCESS;
+
+	return QDF_STATUS_E_FAILURE;
+}
+#endif

+ 2 - 1
umac/green_ap/core/src/wlan_green_ap_main.c

@@ -56,7 +56,8 @@ static QDF_STATUS wlan_green_ap_ant_ps_reset
 	 * Add protection against green AP enabling interrupts
 	 * when not valid or no VAPs exist
 	 */
-	if (wlan_util_is_vap_active(pdev, WLAN_GREEN_AP_ID) == QDF_STATUS_SUCCESS)
+	if (wlan_util_is_vdev_active(pdev, WLAN_GREEN_AP_ID) ==
+						QDF_STATUS_SUCCESS)
 		green_ap_tx_ops->reset_dev(pdev);
 	else
 		green_ap_err("Green AP tried to enable IRQs when invalid");

+ 1 - 1
umac/green_ap/dispatcher/src/wlan_green_ap_ucfg_api.c

@@ -238,7 +238,7 @@ QDF_STATUS ucfg_green_ap_config(struct wlan_objmgr_pdev *pdev, uint8_t val)
 
 		ucfg_green_ap_set_ps_config(pdev, val);
 
-		if (wlan_util_is_vap_active(pdev, WLAN_GREEN_AP_ID) ==
+		if (wlan_util_is_vdev_active(pdev, WLAN_GREEN_AP_ID) ==
 					    QDF_STATUS_SUCCESS)
 			wlan_green_ap_start(pdev);
 	} else {

+ 257 - 102
umac/mlme/include/wlan_vdev_mlme.h

@@ -46,69 +46,111 @@ enum beacon_update_op {
 	BEACON_FREE,
 };
 
+/**
+ * enum vdev_cmd_type - Command type
+ * @START_REQ:      Start request
+ * @RESTART_REQ:    Restart request
+ */
+enum vdev_cmd_type {
+	START_REQ,
+	RESTART_REQ,
+};
+
 /**
  * struct vdev_mlme_ops - VDEV MLME operation callbacks strucutre
- * @mlme_vdev_validate_basic_params:   callback to validate basic params of VDEV
- * @mlme_vdev_reset_proto_params:      callback to Reset protocol params
- * @mlme_vdev_start_send:              callback to initiate actions of VDEV MLME
- *                                     start operation
- * @mlme_vdev_restart_send:            callback to initiate actions of VDEV MLME
- *                                     restart operation
- * @mlme_vdev_start_continue:          callback to initiate operations on
- *                                     LMAC/FW start response
- * @mlme_vdev_up_send:                 callback to initiate actions of VDEV MLME
- *                                     up operation
- * @mlme_vdev_notify_up_complete:      callback to notify VDEV MLME on moving to
- *                                     UP state
- * @mlme_vdev_update_beacon:           callback to initiate beacon update
- * @mlme_vdev_disconnect_peers:        callback to initiate disconnection of
- *                                     peers
- * @mlme_vdev_dfs_cac_timer_stop:      callback to stop the DFS CAC timer
- * @mlme_vdev_stop_send:               callback to initiate actions of VDEV MLME
- *                                     stop operation
- * @mlme_vdev_stop_continue:           callback to initiate operations on
- *                                     LMAC/FW stop response
- * @mlme_vdev_bss_peer_delete_continue:callback to initiate operations on BSS
- *                                     peer delete completion
- * @mlme_vdev_down_send:               callback to initiate actions of VDEV MLME
- *                                     down operation
- * @mlme_vdev_legacy_hdl_create:       callback to invoke creation of legacy
- *                                     vdev object
- * @mlme_vdev_legacy_hdl_post_create:  callback to invoke post creation actions
- *                                     of legacy vdev object
- * @mlme_vdev_legacy_hdl_destroy:      callback to invoke destroy of legacy
- *                                     vdev object
+ * @mlme_vdev_validate_basic_params:    callback to validate VDEV basic params
+ * @mlme_vdev_reset_proto_params:       callback to Reset protocol params
+ * @mlme_vdev_start_send:               callback to initiate actions of VDEV
+ *                                      MLME start operation
+ * @mlme_vdev_restart_send:             callback to initiate actions of VDEV
+ *                                      MLME restart operation
+ * @mlme_vdev_stop_start_send:          callback to block start/restart VDEV
+ *                                      request command
+ * @mlme_vdev_start_continue:           callback to initiate operations on
+ *                                      LMAC/FW start response
+ * @mlme_vdev_up_send:                  callback to initiate actions of VDEV
+ *                                      MLME up operation
+ * @mlme_vdev_notify_up_complete:       callback to notify VDEV MLME on moving
+ *                                      to UP state
+ * @mlme_vdev_update_beacon:            callback to initiate beacon update
+ * @mlme_vdev_disconnect_peers:         callback to initiate disconnection of
+ *                                      peers
+ * @mlme_vdev_dfs_cac_timer_stop:       callback to stop the DFS CAC timer
+ * @mlme_vdev_stop_send:                callback to initiate actions of VDEV
+ *                                      MLME stop operation
+ * @mlme_vdev_stop_continue:            callback to initiate operations on
+ *                                      LMAC/FW stop response
+ * @mlme_vdev_bss_peer_delete_continue: callback to initiate operations on BSS
+ *                                      peer delete completion
+ * @mlme_vdev_down_send:                callback to initiate actions of VDEV
+ *                                      MLME down operation
+ * @mlme_vdev_legacy_hdl_create:        callback to invoke creation of legacy
+ *                                      vdev object
+ * @mlme_vdev_legacy_hdl_post_create:   callback to invoke post creation actions
+ *                                      of legacy vdev object
+ * @mlme_vdev_legacy_hdl_destroy:       callback to invoke destroy of legacy
+ *                                      vdev object
  */
 struct vdev_mlme_ops {
 	QDF_STATUS (*mlme_vdev_validate_basic_params)(
-					struct vdev_mlme_obj *vdev_mlme);
+				struct vdev_mlme_obj *vdev_mlme,
+				uint16_t event_data_len, void *event_data);
 	QDF_STATUS (*mlme_vdev_reset_proto_params)(
-					struct vdev_mlme_obj *vdev_mlme);
-	QDF_STATUS (*mlme_vdev_start_send)(struct vdev_mlme_obj *vdev_mlme);
-	QDF_STATUS (*mlme_vdev_restart_send)(struct vdev_mlme_obj *vdev_mlme);
-	QDF_STATUS (*mlme_vdev_start_continue)(struct vdev_mlme_obj *vdev_mlme);
-	QDF_STATUS (*mlme_vdev_up_send)(struct vdev_mlme_obj *vdev_mlme);
+				struct vdev_mlme_obj *vdev_mlme,
+				uint16_t event_data_len, void *event_data);
+	QDF_STATUS (*mlme_vdev_start_send)(
+				struct vdev_mlme_obj *vdev_mlme,
+				uint16_t event_data_len, void *event_data);
+	QDF_STATUS (*mlme_vdev_restart_send)(
+				struct vdev_mlme_obj *vdev_mlme,
+				uint16_t event_data_len, void *event_data);
+	QDF_STATUS (*mlme_vdev_stop_start_send)(
+				struct vdev_mlme_obj *vdev_mlme,
+				enum vdev_cmd_type type,
+				uint16_t event_data_len, void *event_data);
+	QDF_STATUS (*mlme_vdev_start_continue)(
+				struct vdev_mlme_obj *vdev_mlme,
+				uint16_t event_data_len, void *event_data);
+	QDF_STATUS (*mlme_vdev_sta_conn_start)(
+				struct vdev_mlme_obj *vdev_mlme,
+				uint16_t event_data_len, void *event_data);
+	QDF_STATUS (*mlme_vdev_start_req_failed)(
+				struct vdev_mlme_obj *vdev_mlme,
+				uint16_t event_data_len, void *event_data);
+	QDF_STATUS (*mlme_vdev_up_send)(
+				struct vdev_mlme_obj *vdev_mlme,
+				uint16_t event_data_len, void *event_data);
 	QDF_STATUS (*mlme_vdev_notify_up_complete)(
-					struct vdev_mlme_obj *vdev_mlme);
-	QDF_STATUS (*mlme_vdev_update_beacon)(struct vdev_mlme_obj *vdev_mlme,
-					      enum beacon_update_op op);
+				struct vdev_mlme_obj *vdev_mlme,
+				uint16_t event_data_len, void *event_data);
+	QDF_STATUS (*mlme_vdev_update_beacon)(
+				struct vdev_mlme_obj *vdev_mlme,
+				enum beacon_update_op op,
+				uint16_t event_data_len, void *event_data);
 	QDF_STATUS (*mlme_vdev_disconnect_peers)(
-					struct vdev_mlme_obj *vdev_mlme);
+				struct vdev_mlme_obj *vdev_mlme,
+				uint16_t event_data_len, void *event_data);
 	QDF_STATUS (*mlme_vdev_dfs_cac_timer_stop)(
-					struct vdev_mlme_obj *vdev_mlme);
-	QDF_STATUS (*mlme_vdev_stop_send)(struct vdev_mlme_obj *vdev_mlme);
-	QDF_STATUS (*mlme_vdev_stop_continue)(struct vdev_mlme_obj *vdev_mlme);
-	QDF_STATUS (*mlme_vdev_bss_peer_delete_continue)(
-					struct vdev_mlme_obj *vdev_mlme);
-	QDF_STATUS (*mlme_vdev_down_send)(struct vdev_mlme_obj *vdev_mlme);
+				struct vdev_mlme_obj *vdev_mlme,
+				uint16_t event_data_len, void *event_data);
+	QDF_STATUS (*mlme_vdev_stop_send)(
+				struct vdev_mlme_obj *vdev_mlme,
+				uint16_t event_data_len, void *event_data);
+	QDF_STATUS (*mlme_vdev_stop_continue)(
+				struct vdev_mlme_obj *vdev_mlme,
+				uint16_t event_data_len, void *event_data);
+	QDF_STATUS (*mlme_vdev_down_send)(
+				struct vdev_mlme_obj *vdev_mlme,
+				uint16_t event_data_len, void *event_data);
 	QDF_STATUS (*mlme_vdev_notify_down_complete)(
-					struct vdev_mlme_obj *vdev_mlme);
+				struct vdev_mlme_obj *vdev_mlme,
+				uint16_t event_data_len, void *event_data);
 	QDF_STATUS (*mlme_vdev_legacy_hdl_create)(
-					struct vdev_mlme_obj *vdev_mlme);
+				struct vdev_mlme_obj *vdev_mlme);
 	QDF_STATUS (*mlme_vdev_legacy_hdl_post_create)(
-					struct vdev_mlme_obj *vdev_mlme);
+				struct vdev_mlme_obj *vdev_mlme);
 	QDF_STATUS (*mlme_vdev_legacy_hdl_destroy)(
-					struct vdev_mlme_obj *vdev_mlme);
+				struct vdev_mlme_obj *vdev_mlme);
 
 };
 
@@ -134,6 +176,8 @@ struct vdev_mlme_obj {
 /**
  * mlme_vdev_validate_basic_params - Validate basic params
  * @vdev_mlme_obj:  VDEV MLME comp object
+ * @event_data_len: data size
+ * @event_data: event data
  *
  * API validate MLME VDEV basic parameters
  *
@@ -141,13 +185,14 @@ struct vdev_mlme_obj {
  *         FAILURE, if any parameter is not initialized
  */
 static inline QDF_STATUS mlme_vdev_validate_basic_params(
-				struct vdev_mlme_obj *vdev_mlme)
+				struct vdev_mlme_obj *vdev_mlme,
+				uint16_t event_data_len, void *event_data)
 {
 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
 
 	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_validate_basic_params)
 		ret = vdev_mlme->ops->mlme_vdev_validate_basic_params(
-								vdev_mlme);
+					vdev_mlme, event_data_len, event_data);
 
 	return ret;
 }
@@ -155,6 +200,8 @@ static inline QDF_STATUS mlme_vdev_validate_basic_params(
 /**
  * mlme_vdev_reset_proto_params - Reset VDEV protocol params
  * @vdev_mlme_obj:  VDEV MLME comp object
+ * @event_data_len: data size
+ * @event_data: event data
  *
  * API resets the protocol params fo vdev
  *
@@ -162,12 +209,14 @@ static inline QDF_STATUS mlme_vdev_validate_basic_params(
  *         FAILURE, if it fails due to any
  */
 static inline QDF_STATUS mlme_vdev_reset_proto_params(
-				struct vdev_mlme_obj *vdev_mlme)
+				struct vdev_mlme_obj *vdev_mlme,
+				uint16_t event_data_len, void *event_data)
 {
 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
 
 	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_reset_proto_params)
-		ret = vdev_mlme->ops->mlme_vdev_reset_proto_params(vdev_mlme);
+		ret = vdev_mlme->ops->mlme_vdev_reset_proto_params(
+					vdev_mlme, event_data_len, event_data);
 
 	return ret;
 }
@@ -175,18 +224,23 @@ static inline QDF_STATUS mlme_vdev_reset_proto_params(
 /**
  * mlme_vdev_start_send - Invokes VDEV start operation
  * @vdev_mlme_obj:  VDEV MLME comp object
+ * @event_data_len: data size
+ * @event_data: event data
  *
  * API invokes VDEV start operation
  *
  * Return: SUCCESS on successful completion of start operation
  *         FAILURE, if it fails due to any
  */
-static inline QDF_STATUS mlme_vdev_start_send(struct vdev_mlme_obj *vdev_mlme)
+static inline QDF_STATUS mlme_vdev_start_send(
+				struct vdev_mlme_obj *vdev_mlme,
+				uint16_t event_data_len, void *event_data)
 {
 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
 
 	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_start_send)
-		ret = vdev_mlme->ops->mlme_vdev_start_send(vdev_mlme);
+		ret = vdev_mlme->ops->mlme_vdev_start_send(
+					vdev_mlme, event_data_len, event_data);
 
 	return ret;
 }
@@ -194,18 +248,48 @@ static inline QDF_STATUS mlme_vdev_start_send(struct vdev_mlme_obj *vdev_mlme)
 /**
  * mlme_vdev_restart_send - Invokes VDEV restart operation
  * @vdev_mlme_obj:  VDEV MLME comp object
+ * @event_data_len: data size
+ * @event_data: event data
  *
  * API invokes VDEV restart operation
  *
  * Return: SUCCESS on successful completion of restart operation
  *         FAILURE, if it fails due to any
  */
-static inline QDF_STATUS mlme_vdev_restart_send(struct vdev_mlme_obj *vdev_mlme)
+static inline QDF_STATUS mlme_vdev_restart_send(
+				struct vdev_mlme_obj *vdev_mlme,
+				uint16_t event_data_len, void *event_data)
 {
 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
 
 	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_restart_send)
-		ret = vdev_mlme->ops->mlme_vdev_restart_send(vdev_mlme);
+		ret = vdev_mlme->ops->mlme_vdev_restart_send(
+					vdev_mlme, event_data_len, event_data);
+
+	return ret;
+}
+
+/**
+ * mlme_vdev_stop_start_send - Invoke block VDEV restart operation
+ * @vdev_mlme_obj:  VDEV MLME comp object
+ * @restart: restart req/start req
+ * @event_data_len: data size
+ * @event_data: event data
+ *
+ * API invokes stops pending VDEV restart operation
+ *
+ * Return: SUCCESS alsways
+ */
+static inline QDF_STATUS mlme_vdev_stop_start_send(
+				struct vdev_mlme_obj *vdev_mlme,
+				uint8_t restart,
+				uint16_t event_data_len, void *event_data)
+{
+	QDF_STATUS ret = QDF_STATUS_SUCCESS;
+
+	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_stop_start_send)
+		ret = vdev_mlme->ops->mlme_vdev_stop_start_send(
+				vdev_mlme, restart, event_data_len, event_data);
 
 	return ret;
 }
@@ -213,6 +297,8 @@ static inline QDF_STATUS mlme_vdev_restart_send(struct vdev_mlme_obj *vdev_mlme)
 /**
  * mlme_vdev_start_continue - VDEV start response handling
  * @vdev_mlme_obj:  VDEV MLME comp object
+ * @event_data_len: data size
+ * @event_data: event data
  *
  * API invokes VDEV start response actions
  *
@@ -220,12 +306,62 @@ static inline QDF_STATUS mlme_vdev_restart_send(struct vdev_mlme_obj *vdev_mlme)
  *         FAILURE, if it fails due to any
  */
 static inline QDF_STATUS mlme_vdev_start_continue(
-				struct vdev_mlme_obj *vdev_mlme)
+				struct vdev_mlme_obj *vdev_mlme,
+				uint16_t event_data_len, void *event_data)
 {
 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
 
 	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_start_continue)
-		ret = vdev_mlme->ops->mlme_vdev_start_continue(vdev_mlme);
+		ret = vdev_mlme->ops->mlme_vdev_start_continue(
+					vdev_mlme, event_data_len, event_data);
+
+	return ret;
+}
+
+/**
+ * mlme_vdev_start_req_failed - Invoke Station VDEV connection, if it pause
+ * @vdev_mlme_obj:  VDEV MLME comp object
+ * @event_data_len: data size
+ * @event_data: event data
+ *
+ * API invokes on START fail response
+ *
+ * Return: SUCCESS on successful invocation of callback
+ *         FAILURE, if it fails due to any
+ */
+static inline QDF_STATUS mlme_vdev_start_req_failed(
+				struct vdev_mlme_obj *vdev_mlme,
+				uint16_t event_data_len, void *event_data)
+{
+	QDF_STATUS ret = QDF_STATUS_SUCCESS;
+
+	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_start_req_failed)
+		ret = vdev_mlme->ops->mlme_vdev_start_req_failed(
+					vdev_mlme, event_data_len, event_data);
+
+	return ret;
+}
+
+/**
+ * mlme_vdev_sta_conn_start - Invoke Station VDEV connection, if it pause
+ * @vdev_mlme_obj:  VDEV MLME comp object
+ * @event_data_len: data size
+ * @event_data: event data
+ *
+ * API invokes connection SM to start station connection
+ *
+ * Return: SUCCESS on successful invocation of connection sm
+ *         FAILURE, if it fails due to any
+ */
+static inline QDF_STATUS mlme_vdev_sta_conn_start(
+				struct vdev_mlme_obj *vdev_mlme,
+				uint16_t event_data_len, void *event_data)
+{
+	QDF_STATUS ret = QDF_STATUS_SUCCESS;
+
+	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_sta_conn_start)
+		ret = vdev_mlme->ops->mlme_vdev_sta_conn_start(
+					vdev_mlme, event_data_len, event_data);
 
 	return ret;
 }
@@ -233,18 +369,23 @@ static inline QDF_STATUS mlme_vdev_start_continue(
 /**
  * mlme_vdev_up_send - VDEV up operation
  * @vdev_mlme_obj:  VDEV MLME comp object
+ * @event_data_len: data size
+ * @event_data: event data
  *
  * API invokes VDEV up operations
  *
  * Return: SUCCESS on successful completion of up operation
  *         FAILURE, if it fails due to any
  */
-static inline QDF_STATUS mlme_vdev_up_send(struct vdev_mlme_obj *vdev_mlme)
+static inline QDF_STATUS mlme_vdev_up_send(
+				struct vdev_mlme_obj *vdev_mlme,
+				uint16_t event_data_len, void *event_data)
 {
 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
 
 	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_up_send)
-		ret = vdev_mlme->ops->mlme_vdev_up_send(vdev_mlme);
+		ret = vdev_mlme->ops->mlme_vdev_up_send(
+					vdev_mlme, event_data_len, event_data);
 
 	return ret;
 }
@@ -252,6 +393,8 @@ static inline QDF_STATUS mlme_vdev_up_send(struct vdev_mlme_obj *vdev_mlme)
 /**
  * mlme_vdev_notify_up_complete - VDEV up state transition notification
  * @vdev_mlme_obj:  VDEV MLME comp object
+ * @event_data_len: data size
+ * @event_data: event data
  *
  * API notifies MLME on moving to UP state
  *
@@ -259,12 +402,14 @@ static inline QDF_STATUS mlme_vdev_up_send(struct vdev_mlme_obj *vdev_mlme)
  *         FAILURE, if it fails due to any
  */
 static inline QDF_STATUS mlme_vdev_notify_up_complete(
-			      struct vdev_mlme_obj *vdev_mlme)
+				struct vdev_mlme_obj *vdev_mlme,
+				uint16_t event_data_len, void *event_data)
 {
 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
 
 	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_notify_up_complete)
-		ret = vdev_mlme->ops->mlme_vdev_notify_up_complete(vdev_mlme);
+		ret = vdev_mlme->ops->mlme_vdev_notify_up_complete(
+					vdev_mlme, event_data_len, event_data);
 
 	return ret;
 }
@@ -273,6 +418,8 @@ static inline QDF_STATUS mlme_vdev_notify_up_complete(
  * mlme_vdev_update_beacon - Updates beacon
  * @vdev_mlme_obj:  VDEV MLME comp object
  * @op: beacon update type
+ * @event_data_len: data size
+ * @event_data: event data
  *
  * API updates/allocates/frees the beacon
  *
@@ -280,13 +427,15 @@ static inline QDF_STATUS mlme_vdev_notify_up_complete(
  *         FAILURE, if it fails due to any
  */
 static inline QDF_STATUS mlme_vdev_update_beacon(
-						struct vdev_mlme_obj *vdev_mlme,
-						enum beacon_update_op op)
+				struct vdev_mlme_obj *vdev_mlme,
+				enum beacon_update_op op,
+				uint16_t event_data_len, void *event_data)
 {
 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
 
 	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_update_beacon)
-		ret = vdev_mlme->ops->mlme_vdev_update_beacon(vdev_mlme, op);
+		ret = vdev_mlme->ops->mlme_vdev_update_beacon(vdev_mlme, op,
+						event_data_len, event_data);
 
 	return ret;
 }
@@ -294,6 +443,8 @@ static inline QDF_STATUS mlme_vdev_update_beacon(
 /**
  * mlme_vdev_disconnect_peers - Disconnect peers
  * @vdev_mlme_obj:  VDEV MLME comp object
+ * @event_data_len: data size
+ * @event_data: event data
  *
  * API trigger stations disconnection with AP VDEV or AP disconnection with STA
  * VDEV
@@ -302,12 +453,14 @@ static inline QDF_STATUS mlme_vdev_update_beacon(
  *         FAILURE, if it fails due to any
  */
 static inline QDF_STATUS mlme_vdev_disconnect_peers(
-			      struct vdev_mlme_obj *vdev_mlme)
+				struct vdev_mlme_obj *vdev_mlme,
+				uint16_t event_data_len, void *event_data)
 {
 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
 
 	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_disconnect_peers)
-		ret = vdev_mlme->ops->mlme_vdev_disconnect_peers(vdev_mlme);
+		ret = vdev_mlme->ops->mlme_vdev_disconnect_peers(
+					vdev_mlme, event_data_len, event_data);
 
 	return ret;
 }
@@ -315,6 +468,8 @@ static inline QDF_STATUS mlme_vdev_disconnect_peers(
 /**
  * mlme_vdev_dfs_cac_timer_stop - Stop CAC timer
  * @vdev_mlme_obj:  VDEV MLME comp object
+ * @event_data_len: data size
+ * @event_data: event data
  *
  * API stops the CAC timer through DFS API
  *
@@ -322,12 +477,14 @@ static inline QDF_STATUS mlme_vdev_disconnect_peers(
  *         FAILURE, if it fails due to any
  */
 static inline QDF_STATUS mlme_vdev_dfs_cac_timer_stop(
-			      struct vdev_mlme_obj *vdev_mlme)
+				struct vdev_mlme_obj *vdev_mlme,
+				uint16_t event_data_len, void *event_data)
 {
 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
 
 	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_dfs_cac_timer_stop)
-		ret = vdev_mlme->ops->mlme_vdev_dfs_cac_timer_stop(vdev_mlme);
+		ret = vdev_mlme->ops->mlme_vdev_dfs_cac_timer_stop(
+					vdev_mlme, event_data_len, event_data);
 
 	return ret;
 }
@@ -335,18 +492,23 @@ static inline QDF_STATUS mlme_vdev_dfs_cac_timer_stop(
 /**
  * mlme_vdev_stop_send - Invokes VDEV stop operation
  * @vdev_mlme_obj:  VDEV MLME comp object
+ * @event_data_len: data size
+ * @event_data: event data
  *
  * API invokes VDEV stop operation
  *
  * Return: SUCCESS on successful completion of stop operation
  *         FAILURE, if it fails due to any
  */
-static inline QDF_STATUS mlme_vdev_stop_send(struct vdev_mlme_obj *vdev_mlme)
+static inline QDF_STATUS mlme_vdev_stop_send(
+				struct vdev_mlme_obj *vdev_mlme,
+				uint16_t event_data_len, void *event_data)
 {
 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
 
 	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_stop_send)
-		ret = vdev_mlme->ops->mlme_vdev_stop_send(vdev_mlme);
+		ret = vdev_mlme->ops->mlme_vdev_stop_send(
+					vdev_mlme, event_data_len, event_data);
 
 	return ret;
 }
@@ -354,6 +516,8 @@ static inline QDF_STATUS mlme_vdev_stop_send(struct vdev_mlme_obj *vdev_mlme)
 /**
  * mlme_vdev_stop_continue - VDEV stop response handling
  * @vdev_mlme_obj:  VDEV MLME comp object
+ * @event_data_len: data size
+ * @event_data: event data
  *
  * API invokes VDEV stop response actions
  *
@@ -361,34 +525,15 @@ static inline QDF_STATUS mlme_vdev_stop_send(struct vdev_mlme_obj *vdev_mlme)
  *         FAILURE, if it fails due to any
  */
 static inline QDF_STATUS mlme_vdev_stop_continue(
-						struct vdev_mlme_obj *vdev_mlme)
+				struct vdev_mlme_obj *vdev_mlme,
+				uint16_t event_data_len, void *event_data)
 {
 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
 
 	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_stop_continue)
-		ret = vdev_mlme->ops->mlme_vdev_stop_continue(vdev_mlme);
-
-	return ret;
-}
-
-/**
- * mlme_vdev_bss_peer_delete_continue - VDEV BSS peer delete complete
- * @vdev_mlme_obj:  VDEV MLME comp object
- *
- * API invokes VDEV BSS peer delete complete operation
- *
- * Return: SUCCESS on successful completion of BSS peer delete handling
- *         FAILURE, if it fails due to any
- */
-static inline QDF_STATUS mlme_vdev_bss_peer_delete_continue(
-			      struct vdev_mlme_obj *vdev_mlme)
-{
-	QDF_STATUS ret = QDF_STATUS_SUCCESS;
-
-	if ((vdev_mlme->ops) &&
-	    vdev_mlme->ops->mlme_vdev_bss_peer_delete_continue)
-		ret = vdev_mlme->ops->mlme_vdev_bss_peer_delete_continue(
-								vdev_mlme);
+		ret = vdev_mlme->ops->mlme_vdev_stop_continue(vdev_mlme,
+							      event_data_len,
+							      event_data);
 
 	return ret;
 }
@@ -396,18 +541,23 @@ static inline QDF_STATUS mlme_vdev_bss_peer_delete_continue(
 /**
  * mlme_vdev_down_send - VDEV down operation
  * @vdev_mlme_obj:  VDEV MLME comp object
+ * @event_data_len: data size
+ * @event_data: event data
  *
  * API invokes VDEV down operation
  *
  * Return: SUCCESS on successful completion of VDEV down operation
  *         FAILURE, if it fails due to any
  */
-static inline QDF_STATUS mlme_vdev_down_send(struct vdev_mlme_obj *vdev_mlme)
+static inline QDF_STATUS mlme_vdev_down_send(
+				struct vdev_mlme_obj *vdev_mlme,
+				uint16_t event_data_len, void *event_data)
 {
 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
 
 	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_down_send)
-		ret = vdev_mlme->ops->mlme_vdev_down_send(vdev_mlme);
+		ret = vdev_mlme->ops->mlme_vdev_down_send(
+					vdev_mlme, event_data_len, event_data);
 
 	return ret;
 }
@@ -415,6 +565,8 @@ static inline QDF_STATUS mlme_vdev_down_send(struct vdev_mlme_obj *vdev_mlme)
 /**
  * mlme_vdev_notify_down_complete - VDEV init state transition notification
  * @vdev_mlme_obj:  VDEV MLME comp object
+ * @event_data_len: data size
+ * @event_data: event data
  *
  * API notifies MLME on moving to INIT state
  *
@@ -422,12 +574,14 @@ static inline QDF_STATUS mlme_vdev_down_send(struct vdev_mlme_obj *vdev_mlme)
  *         FAILURE, if it fails due to any
  */
 static inline QDF_STATUS mlme_vdev_notify_down_complete(
-					struct vdev_mlme_obj *vdev_mlme)
+				struct vdev_mlme_obj *vdev_mlme,
+				uint16_t event_data_len, void *event_data)
 {
 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
 
 	if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_notify_down_complete)
-		ret = vdev_mlme->ops->mlme_vdev_notify_down_complete(vdev_mlme);
+		ret = vdev_mlme->ops->mlme_vdev_notify_down_complete(
+					vdev_mlme, event_data_len, event_data);
 
 	return ret;
 }
@@ -466,7 +620,8 @@ static inline QDF_STATUS mlme_vdev_legacy_hdl_post_create(
 {
 	QDF_STATUS ret = QDF_STATUS_SUCCESS;
 
-	if (vdev_mlme->ops && vdev_mlme->ops->mlme_vdev_legacy_hdl_post_create)
+	if ((vdev_mlme->ops) &&
+	    vdev_mlme->ops->mlme_vdev_legacy_hdl_post_create)
 		ret = vdev_mlme->ops->mlme_vdev_legacy_hdl_post_create(
 								vdev_mlme);
 

+ 132 - 1
umac/mlme/mlme_objmgr/dispatcher/inc/wlan_vdev_mlme_main.h

@@ -24,6 +24,116 @@
 #define _WLAN_VDEV_MLME_MAIN_H_
 
 #ifdef CMN_VDEV_MLME_SM_ENABLE
+/**
+ * enum wlan_vdev_state - VDEV state
+ * @WLAN_VDEV_S_INIT:                     Default state, IDLE state
+ * @WLAN_VDEV_S_START:                    START  state
+ * @WLAN_VDEV_S_DFS_CAC_WAIT:             CAC period
+ * @WLAN_VDEV_S_UP:                       UP state
+ * @WLAN_VDEV_S_SUSPEND:                  Suspend state
+ * @WLAN_VDEV_S_STOP:                     STOP state
+ * @WLAN_VDEV_S_MAX:                      MAX state
+ * @WLAN_VDEV_SS_START_START_PROGRESS:    Start progress sub state
+ * @WLAN_VDEV_SS_START_RESTART_PROGRESS:  Restart progress sub state
+ * @WLAN_VDEV_SS_START_CONN_PROGRESS:     Start connection progress sub state
+ * @WLAN_VDEV_SS_START_DISCONN_PROGRESS:  Start Disconnection progress sub state
+ * @WLAN_VDEV_SS_SUSPEND_SUSPEND_DOWN:    Suspend down sub state
+ * @WLAN_VDEV_SS_SUSPEND_SUSPEND_RESTART: Suspend restart sub state
+ * @WLAN_VDEV_SS_SUSPEND_HOST_RESTART:    Suspend host restart sub state
+ * @WLAN_VDEV_SS_SUSPEND_CSA_RESTART:     Suspend CSA restart sub state
+ * @WLAN_VDEV_SS_STOP_STOP_PROGRESS:      Stop progress sub state
+ * @WLAN_VDEV_SS_STOP_DOWN_PROGRESS:      Stop down progress sub state
+ * @WLAN_VDEV_SS_IDLE:                    Idle sub state (used, only if a state
+ *                                        does not have substate)
+ * @WLAN_VDEV_SS_MAX:                     Max substate
+ */
+enum wlan_vdev_state {
+	WLAN_VDEV_S_INIT = 0,
+	WLAN_VDEV_S_START = 1,
+	WLAN_VDEV_S_DFS_CAC_WAIT = 2,
+	WLAN_VDEV_S_UP = 3,
+	WLAN_VDEV_S_SUSPEND = 4,
+	WLAN_VDEV_S_STOP = 5,
+	WLAN_VDEV_S_MAX = 6,
+	WLAN_VDEV_SS_START_START_PROGRESS = 7,
+	WLAN_VDEV_SS_START_RESTART_PROGRESS = 8,
+	WLAN_VDEV_SS_START_CONN_PROGRESS = 9,
+	WLAN_VDEV_SS_START_DISCONN_PROGRESS = 10,
+	WLAN_VDEV_SS_SUSPEND_SUSPEND_DOWN = 11,
+	WLAN_VDEV_SS_SUSPEND_SUSPEND_RESTART = 12,
+	WLAN_VDEV_SS_SUSPEND_HOST_RESTART = 13,
+	WLAN_VDEV_SS_SUSPEND_CSA_RESTART = 14,
+	WLAN_VDEV_SS_STOP_STOP_PROGRESS = 15,
+	WLAN_VDEV_SS_STOP_DOWN_PROGRESS = 16,
+	WLAN_VDEV_SS_IDLE = 17,
+	WLAN_VDEV_SS_MAX = 18,
+};
+
+/**
+ * enum wlan_vdev_sm_evt - VDEV SM event
+ * @WLAN_VDEV_SM_EV_START:               Start VDEV UP operation
+ * @WLAN_VDEV_SM_EV_START_REQ:           Invokes VDEV START handshake
+ * @WLAN_VDEV_SM_EV_RESTART_REQ:         Invokes VDEV RESTART handshake
+ * @WLAN_VDEV_SM_EV_START_RESP:          Notification on START resp
+ * @WLAN_VDEV_SM_EV_RESTART_RESP:        Notification on RESTART resp
+ * @WLAN_VDEV_SM_EV_START_REQ_FAIL:      Notification on START req failure
+ * @WLAN_VDEV_SM_EV_RESTART_REQ_FAIL:    Notification on RESTART req failure
+ * @WLAN_VDEV_SM_EV_START_SUCCESS:       Notification of Join Success
+ * @WLAN_VDEV_SM_EV_CONN_PROGRESS:       Invoke Connection/up process
+ * @WLAN_VDEV_SM_EV_STA_CONN_START:      Invoke Station Connection process
+ * @WLAN_VDEV_SM_EV_DFS_CAC_WAIT:        Invoke DFS CAC WAIT timer
+ * @WLAN_VDEV_SM_EV_DFS_CAC_COMPLETED:   Notifies on CAC completion
+ * @WLAN_VDEV_SM_EV_DOWN:                Invokes VDEV DOWN operation
+ * @WLAN_VDEV_SM_EV_CONNECTION_FAIL:     Notifications for UP/connection failure
+ * @WLAN_VDEV_SM_EV_STOP_RESP:           Notifcation of stop response
+ * @WLAN_VDEV_SM_EV_STOP_FAIL:           Notification of stop req failure
+ * @WLAN_VDEV_SM_EV_DOWN_FAIL:           Notification of down failure
+ * @WLAN_VDEV_SM_EV_DISCONNECT_COMPLETE: Notification of Peer cleanup complete
+ * @WLAN_VDEV_SM_EV_SUPSEND_RESTART:     Invokes suspend restart operation
+ * @WLAN_VDEV_SM_EV_HOST_RESTART:        Invokes host only restart operation
+ * @WLAN_VDEV_SM_EV_UP_HOST_RESTART:     Moves to UP state without sending UP
+ *                                       command to lower layers
+ * @WLAN_VDEV_SM_EV_FW_VDEV_RESTART:     Invokes FW only restart
+ * @WLAN_VDEV_SM_EV_UP_FAIL:             Notification of up command failure
+ * @WLAN_VDEV_SM_EV_RADAR_DETECTED:      Notification of RADAR detected, Random
+ *                                       channel should be selected before
+ *                                       triggering this event
+ * @WLAN_VDEV_SM_EV_CSA_RESTART:         Invokes CSA IE operation
+ * @WLAN_VDEV_SM_EV_CSA_COMPLETE:        Notifiction of CSA process complete
+ * @WLAN_VDEV_SM_EV_MLME_DOWN_REQ:       Invoke DOWN command operation
+ * @WLAN_VDEV_SM_EV_DOWN_COMPLETE:       Notification of DOWN complete
+ */
+enum wlan_vdev_sm_evt {
+	WLAN_VDEV_SM_EV_START = 0,
+	WLAN_VDEV_SM_EV_START_REQ,
+	WLAN_VDEV_SM_EV_RESTART_REQ,
+	WLAN_VDEV_SM_EV_START_RESP,
+	WLAN_VDEV_SM_EV_RESTART_RESP,
+	WLAN_VDEV_SM_EV_START_REQ_FAIL,
+	WLAN_VDEV_SM_EV_RESTART_REQ_FAIL,
+	WLAN_VDEV_SM_EV_START_SUCCESS,
+	WLAN_VDEV_SM_EV_CONN_PROGRESS,
+	WLAN_VDEV_SM_EV_STA_CONN_START,
+	WLAN_VDEV_SM_EV_DFS_CAC_WAIT = 10,
+	WLAN_VDEV_SM_EV_DFS_CAC_COMPLETED,
+	WLAN_VDEV_SM_EV_DOWN,
+	WLAN_VDEV_SM_EV_CONNECTION_FAIL,
+	WLAN_VDEV_SM_EV_STOP_RESP,
+	WLAN_VDEV_SM_EV_STOP_FAIL,
+	WLAN_VDEV_SM_EV_DOWN_FAIL,
+	WLAN_VDEV_SM_EV_DISCONNECT_COMPLETE,
+	WLAN_VDEV_SM_EV_SUPSEND_RESTART,
+	WLAN_VDEV_SM_EV_HOST_RESTART,
+	WLAN_VDEV_SM_EV_UP_HOST_RESTART = 20,
+	WLAN_VDEV_SM_EV_FW_VDEV_RESTART,
+	WLAN_VDEV_SM_EV_UP_FAIL,
+	WLAN_VDEV_SM_EV_RADAR_DETECTED,
+	WLAN_VDEV_SM_EV_CSA_RESTART,
+	WLAN_VDEV_SM_EV_CSA_COMPLETE,
+	WLAN_VDEV_SM_EV_MLME_DOWN_REQ,
+	WLAN_VDEV_SM_EV_DOWN_COMPLETE,
+};
+
 /**
  * wlan_vdev_mlme_init - Initializes MLME component
  *
@@ -46,6 +156,28 @@ QDF_STATUS wlan_vdev_mlme_deinit(void);
 
 #else
 
+/**
+ * enum wlan_vdev_state - VDEV state
+ * @WLAN_VDEV_S_INIT:    Default state, IDLE state
+ * @WLAN_VDEV_S_SCAN:    SCAN state
+ * @WLAN_VDEV_S_JOIN:    Join state
+ * @WLAN_VDEV_S_DFS_WAIT:CAC period
+ * @WLAN_VDEV_S_RUN:     RUN state
+ * @WLAN_VDEV_S_STOP:    STOP state
+ * @WLAN_VDEV_S_RESET:   RESET state, STOP+INIT+JOIN
+ * @WLAN_VDEV_S_MAX:     MAX state
+ */
+enum wlan_vdev_state {
+	WLAN_VDEV_S_INIT     = 0,
+	WLAN_VDEV_S_SCAN     = 1,
+	WLAN_VDEV_S_JOIN     = 2,
+	WLAN_VDEV_S_DFS_WAIT = 3,
+	WLAN_VDEV_S_RUN      = 4,
+	WLAN_VDEV_S_STOP     = 5,
+	WLAN_VDEV_S_RESET    = 6,
+	WLAN_VDEV_S_MAX,
+};
+
 /**
  * wlan_vdev_mlme_init - Initializes MLME component
  *
@@ -73,4 +205,3 @@ static inline QDF_STATUS wlan_vdev_mlme_deinit(void)
 }
 #endif
 #endif
-

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 1778 - 0
umac/mlme/vdev_mgr/core/src/vdev_mlme_sm.c


+ 33 - 4
umac/mlme/vdev_mgr/core/src/vdev_mlme_sm.h

@@ -23,6 +23,38 @@
 #ifndef _VDEV_MLME_SM_H_
 #define _VDEV_MLME_SM_H_
 
+#ifdef CMN_VDEV_MLME_SM_ENABLE
+/**
+ * mlme_vdev_sm_deliver_event() - Delivers event to VDEV MLME SM
+ * @vdev_mlme: MLME VDEV comp object
+ * @event: MLME event
+ * @event_data_len: data size
+ * @event_data: event data
+ *
+ * API to dispatch event to VDEV MLME SM
+ *
+ * Return: SUCCESS: on handling event
+ *         FAILURE: on ignoring the event
+ */
+QDF_STATUS mlme_vdev_sm_deliver_event(struct vdev_mlme_obj *vdev_mlme,
+				      enum wlan_vdev_sm_evt event,
+				      uint16_t event_data_len,
+				      void *event_data);
+
+#ifdef SM_ENG_HIST_ENABLE
+/**
+ * mlme_vdev_sm_history_print() - Prints SM history
+ * @vdev_mlme: MLME VDEV comp object
+ *
+ * API to print SM history
+ *
+ * Return: void
+ */
+void mlme_vdev_sm_history_print(struct vdev_mlme_obj *vdev_mlme);
+#endif
+
+#endif
+
 /**
  * mlme_vdev_sm_create - Invoke SME creation for VDEV
  * @vdev_mlme_obj:  VDEV MLME comp object
@@ -54,8 +86,7 @@ QDF_STATUS mlme_vdev_sm_destroy(struct vdev_mlme_obj *vdev_mlme);
  *
  * Return: void
  */
-static inline void mlme_vdev_sm_spinlock_create(
-						struct vdev_mlme_obj *vdev_mlme)
+static inline void mlme_vdev_sm_spinlock_create(struct vdev_mlme_obj *vdev_mlme)
 {
 	qdf_spinlock_create(&vdev_mlme->sm_lock);
 }
@@ -120,6 +151,4 @@ static inline void mlme_vdev_sm_spin_unlock(struct vdev_mlme_obj *vdev_mlme)
 {
 }
 #endif
-
 #endif
-

+ 102 - 0
umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mlme_api.h

@@ -23,6 +23,16 @@
 #ifndef _WLAN_VDEV_MLME_API_H_
 #define _WLAN_VDEV_MLME_API_H_
 
+/**
+ * wlan_vdev_mlme_get_cmpt_obj - Returns MLME component object
+ *
+ * Retrieves MLME component object from VDEV object
+ *
+ * Return: comp handle on SUCCESS
+ *         NULL, if it fails to retrieve
+ */
+struct vdev_mlme_obj *wlan_vdev_mlme_get_cmpt_obj(
+						struct wlan_objmgr_vdev *vdev);
 /**
  * wlan_vdev_mlme_get_legacy_hdl - Returns legacy handle
  *
@@ -33,4 +43,96 @@
  */
 void *wlan_vdev_mlme_get_legacy_hdl(struct wlan_objmgr_vdev *vdev);
 
+#ifdef CMN_VDEV_MLME_SM_ENABLE
+/**
+ * wlan_vdev_mlme_sm_deliver_evt() - Delivers event to VDEV MLME SM
+ * @vdev: Object manager VDEV object
+ * @event: MLME event
+ * @event_data_len: data size
+ * @event_data: event data
+ *
+ * API to dispatch event to VDEV MLME SM with lock acquired
+ *
+ * Return: SUCCESS: on handling event
+ *         FAILURE: on ignoring the event
+ */
+QDF_STATUS wlan_vdev_mlme_sm_deliver_evt(struct wlan_objmgr_vdev *vdev,
+					 enum wlan_vdev_sm_evt event,
+					 uint16_t event_data_len,
+					 void *event_data);
+
+/**
+ * wlan_vdev_mlme_sm_deliver_evt_sync() - Delivers event to VDEV MLME SM sync
+ * @vdev: Object manager VDEV object
+ * @event: MLME event
+ * @event_data_len: data size
+ * @event_data: event data
+ *
+ * API to dispatch event to VDEV MLME SM with lock acquired
+ *
+ * Return: SUCCESS: on handling event
+ *         FAILURE: on ignoring the event
+ */
+QDF_STATUS wlan_vdev_mlme_sm_deliver_evt_sync(struct wlan_objmgr_vdev *vdev,
+					      enum wlan_vdev_sm_evt event,
+					      uint16_t event_data_len,
+					      void *event_data);
+
+#ifdef SM_ENG_HIST_ENABLE
+/**
+ * wlan_vdev_mlme_sm_history_print() - Prints SM history
+ * @vdev: Object manager VDEV object
+ *
+ * API to print SM history
+ *
+ * Return: void
+ */
+void wlan_vdev_mlme_sm_history_print(struct wlan_objmgr_vdev *vdev);
+
+#endif
+
+/**
+ * wlan_vdev_allow_connect_n_tx() - Checks whether VDEV is in operational state
+ * @vdev: Object manager VDEV object
+ *
+ * API to checks the VDEV MLME SM state to allow tx or connections
+ *
+ * Return: SUCCESS: to allow tx or connection
+ *         FAILURE: otherwise failure
+ */
+QDF_STATUS wlan_vdev_allow_connect_n_tx(struct wlan_objmgr_vdev *vdev);
+
+/**
+ * wlan_vdev_mlme_is_active() - Checks whether VDEV is in active state
+ * @vdev: Object manager VDEV object
+ *
+ * API to checks the VDEV MLME SM state to check channel is configured in FW
+ *
+ * Return: SUCCESS: valid channel is configured
+ *         FAILURE: otherwise failure
+ */
+QDF_STATUS wlan_vdev_mlme_is_active(struct wlan_objmgr_vdev *vdev);
+
+/**
+ * wlan_vdev_chan_config_valid() - Checks whether VDEV chan config valid
+ * @vdev: Object manager VDEV object
+ *
+ * API to checks the VDEV MLME SM state to check channel is configured in Host
+ *
+ * Return: SUCCESS: valid channel is configured
+ *         FAILURE: otherwise failure
+ */
+QDF_STATUS wlan_vdev_chan_config_valid(struct wlan_objmgr_vdev *vdev);
+
+/**
+ * wlan_vdev_is_going_down() - Checks whether VDEV is being brought down
+ * @vdev: Object manager VDEV object
+ *
+ * API to checks the VDEV MLME SM state to check VDEV is being brought down
+ *
+ * Return: SUCCESS: valid channel is configured
+ *         FAILURE: otherwise failure
+ */
+QDF_STATUS wlan_vdev_is_going_down(struct wlan_objmgr_vdev *vdev);
+#endif
 #endif

+ 135 - 2
umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mlme_api.c

@@ -23,8 +23,10 @@
 #include <wlan_objmgr_vdev_obj.h>
 #include <wlan_mlme_dbg.h>
 #include "include/wlan_vdev_mlme.h"
+#include "../../core/src/vdev_mlme_sm.h"
+#include <wlan_vdev_mlme_api.h>
 
-void *wlan_vdev_mlme_get_legacy_hdl(struct wlan_objmgr_vdev *vdev)
+struct vdev_mlme_obj *wlan_vdev_mlme_get_cmpt_obj(struct wlan_objmgr_vdev *vdev)
 {
 	struct vdev_mlme_obj *vdev_mlme;
 
@@ -40,7 +42,138 @@ void *wlan_vdev_mlme_get_legacy_hdl(struct wlan_objmgr_vdev *vdev)
 		return NULL;
 	}
 
-	return vdev_mlme->legacy_vdev_ptr;
+	return vdev_mlme;
+}
+
+void *wlan_vdev_mlme_get_legacy_hdl(struct wlan_objmgr_vdev *vdev)
+{
+	struct vdev_mlme_obj *vdev_mlme;
+
+	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
+	if (vdev_mlme)
+		return vdev_mlme->legacy_vdev_ptr;
+
+	return NULL;
 }
 
 qdf_export_symbol(wlan_vdev_mlme_get_legacy_hdl);
+
+#ifdef CMN_VDEV_MLME_SM_ENABLE
+QDF_STATUS wlan_vdev_mlme_sm_deliver_evt(struct wlan_objmgr_vdev *vdev,
+					 enum wlan_vdev_sm_evt event,
+					 uint16_t event_data_len,
+					 void *event_data)
+{
+	struct vdev_mlme_obj *vdev_mlme;
+	QDF_STATUS status;
+
+	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
+	if (!vdev_mlme) {
+		mlme_err("vdev component object is NULL");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	mlme_vdev_sm_spin_lock(vdev_mlme);
+	status = mlme_vdev_sm_deliver_event(vdev_mlme, event, event_data_len,
+					    event_data);
+	mlme_vdev_sm_spin_unlock(vdev_mlme);
+
+	return status;
+}
+
+qdf_export_symbol(wlan_vdev_mlme_sm_deliver_evt);
+
+QDF_STATUS wlan_vdev_mlme_sm_deliver_evt_sync(struct wlan_objmgr_vdev *vdev,
+					      enum wlan_vdev_sm_evt event,
+					      uint16_t event_data_len,
+					      void *event_data)
+{
+	struct vdev_mlme_obj *vdev_mlme;
+	QDF_STATUS status;
+
+	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
+	if (!vdev_mlme) {
+		mlme_err("vdev component object is NULL");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	status = mlme_vdev_sm_deliver_event(vdev_mlme, event, event_data_len,
+					    event_data);
+
+	return status;
+}
+
+qdf_export_symbol(wlan_vdev_mlme_sm_deliver_evt_sync);
+
+#ifdef SM_ENG_HIST_ENABLE
+void wlan_vdev_mlme_sm_history_print(struct wlan_objmgr_vdev *vdev)
+{
+	struct vdev_mlme_obj *vdev_mlme;
+
+	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
+	if (!vdev_mlme) {
+		mlme_err("vdev component object is NULL");
+		return;
+	}
+
+	mlme_vdev_sm_history_print(vdev_mlme);
+}
+#endif
+
+QDF_STATUS wlan_vdev_allow_connect_n_tx(struct wlan_objmgr_vdev *vdev)
+{
+	enum wlan_vdev_state state;
+	enum wlan_vdev_state substate;
+
+	state = wlan_vdev_mlme_get_state(vdev);
+	substate = wlan_vdev_mlme_get_substate(vdev);
+	if ((state == WLAN_VDEV_S_UP) ||
+	    ((state == WLAN_VDEV_S_SUSPEND) &&
+	     (substate == WLAN_VDEV_SS_SUSPEND_CSA_RESTART)))
+		return QDF_STATUS_SUCCESS;
+
+	return QDF_STATUS_E_FAILURE;
+}
+
+QDF_STATUS wlan_vdev_mlme_is_active(struct wlan_objmgr_vdev *vdev)
+{
+	enum wlan_vdev_state state;
+
+	state = wlan_vdev_mlme_get_state(vdev);
+	if ((state == WLAN_VDEV_S_UP) ||  (state == WLAN_VDEV_S_DFS_CAC_WAIT) ||
+	    (state == WLAN_VDEV_S_SUSPEND))
+		return QDF_STATUS_SUCCESS;
+
+	return QDF_STATUS_E_FAILURE;
+}
+
+qdf_export_symbol(wlan_vdev_mlme_is_active);
+
+QDF_STATUS wlan_vdev_chan_config_valid(struct wlan_objmgr_vdev *vdev)
+{
+	enum wlan_vdev_state state;
+	enum wlan_vdev_state substate;
+
+	state = wlan_vdev_mlme_get_state(vdev);
+	substate = wlan_vdev_mlme_get_substate(vdev);
+	if (!((state == WLAN_VDEV_S_INIT) || (state == WLAN_VDEV_S_STOP)))
+		return QDF_STATUS_SUCCESS;
+
+	return QDF_STATUS_E_FAILURE;
+}
+
+QDF_STATUS wlan_vdev_is_going_down(struct wlan_objmgr_vdev *vdev)
+{
+	enum wlan_vdev_state state;
+	enum wlan_vdev_state substate;
+
+	state = wlan_vdev_mlme_get_state(vdev);
+	substate = wlan_vdev_mlme_get_substate(vdev);
+	if ((state == WLAN_VDEV_S_STOP) ||
+	    ((state == WLAN_VDEV_S_SUSPEND) &&
+	     (substate == WLAN_VDEV_SS_SUSPEND_SUSPEND_DOWN)))
+		return QDF_STATUS_SUCCESS;
+
+	return QDF_STATUS_E_FAILURE;
+}
+#endif

Niektoré súbory nie sú zobrazené, pretože je v týchto rozdielových dátach zmenené mnoho súborov