From be8dac4d5d60afd364d10289e199310bbccc45f1 Mon Sep 17 00:00:00 2001 From: Srinivas Pitla Date: Thu, 14 Jun 2018 16:05:03 +0530 Subject: [PATCH] qcacmn: Define VDEV MLME component object This change defines VDEV MLME object, and registers with object manager to be notified on creation/destroy, and also initializes MLME SM Change-Id: I75bb7de7326e4bbed21ef9653427c4e0694c3ffc CRs-Fixed: 2307722 --- .../dispatcher/src/dispatcher_init_deinit.c | 8 + qdf/inc/qdf_types.h | 2 + qdf/linux/src/qdf_trace.c | 2 + spectral/Kbuild | 2 + umac/cmn_services/inc/wlan_cmn.h | 2 + .../obj_mgr/inc/wlan_objmgr_pdev_obj.h | 2 + .../obj_mgr/inc/wlan_objmgr_vdev_obj.h | 10 +- umac/mlme/include/wlan_vdev_mlme.h | 496 ++++++++++++++++++ .../dispatcher/inc/wlan_mlme_dbg.h | 43 ++ .../dispatcher/inc/wlan_vdev_mlme_main.h | 76 +++ .../dispatcher/src/wlan_vdev_mlme_main.c | 158 ++++++ umac/mlme/vdev_mgr/core/src/vdev_mlme_sm.c | 51 ++ umac/mlme/vdev_mgr/core/src/vdev_mlme_sm.h | 125 +++++ .../dispatcher/inc/wlan_vdev_mlme_api.h | 36 ++ .../dispatcher/src/wlan_vdev_mlme_api.c | 46 ++ 15 files changed, 1056 insertions(+), 3 deletions(-) create mode 100644 umac/mlme/include/wlan_vdev_mlme.h create mode 100644 umac/mlme/mlme_objmgr/dispatcher/inc/wlan_mlme_dbg.h create mode 100644 umac/mlme/mlme_objmgr/dispatcher/inc/wlan_vdev_mlme_main.h create mode 100644 umac/mlme/mlme_objmgr/dispatcher/src/wlan_vdev_mlme_main.c create mode 100644 umac/mlme/vdev_mgr/core/src/vdev_mlme_sm.c create mode 100644 umac/mlme/vdev_mgr/core/src/vdev_mlme_sm.h create mode 100644 umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mlme_api.h create mode 100644 umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mlme_api.c diff --git a/init_deinit/dispatcher/src/dispatcher_init_deinit.c b/init_deinit/dispatcher/src/dispatcher_init_deinit.c index 2e6a175a04..5c44533b8c 100644 --- a/init_deinit/dispatcher/src/dispatcher_init_deinit.c +++ b/init_deinit/dispatcher/src/dispatcher_init_deinit.c @@ -27,6 +27,7 @@ #include #include #include +#include #ifdef WLAN_POLICY_MGR_ENABLE #include "wlan_policy_mgr_api.h" #endif @@ -973,6 +974,9 @@ QDF_STATUS dispatcher_init(void) if (QDF_IS_STATUS_ERROR(cfg_dispatcher_init())) goto cfg_init_fail; + if (QDF_STATUS_SUCCESS != wlan_vdev_mlme_init()) + goto vdev_mlme_init_fail; + /* * scheduler INIT has to be the last as each component's * initialization has to happen first and then at the end @@ -984,6 +988,8 @@ QDF_STATUS dispatcher_init(void) return QDF_STATUS_SUCCESS; scheduler_init_fail: + wlan_vdev_mlme_deinit(); +vdev_mlme_init_fail: cfg_dispatcher_deinit(); cfg_init_fail: dispatcher_ftm_deinit(); @@ -1041,6 +1047,8 @@ QDF_STATUS dispatcher_deinit(void) QDF_BUG(QDF_STATUS_SUCCESS == scheduler_deinit()); + QDF_BUG(QDF_STATUS_SUCCESS == wlan_vdev_mlme_deinit()); + status = cfg_dispatcher_deinit(); QDF_BUG(QDF_IS_STATUS_SUCCESS(status)); diff --git a/qdf/inc/qdf_types.h b/qdf/inc/qdf_types.h index 3fe538189b..e3e5a6000c 100644 --- a/qdf/inc/qdf_types.h +++ b/qdf/inc/qdf_types.h @@ -361,6 +361,7 @@ typedef void (*qdf_timer_func_t)(void *); * @QDF_MODULE_ID_MBSSIE: MBSS IE ID * @QDF_MODULE_ID_FWOL: FW Offload module ID * @QDF_MODULE_ID_SM_ENGINE: SM engine module ID + * @QDF_MODULE_ID_CMN_MLME: CMN MLME module ID * @QDF_MODULE_ID_ANY: anything * @QDF_MODULE_ID_MAX: Max place holder module ID */ @@ -469,6 +470,7 @@ typedef enum { QDF_MODULE_ID_MBSSIE, QDF_MODULE_ID_FWOL, QDF_MODULE_ID_SM_ENGINE, + QDF_MODULE_ID_CMN_MLME, QDF_MODULE_ID_ANY, QDF_MODULE_ID_MAX, } QDF_MODULE_ID; diff --git a/qdf/linux/src/qdf_trace.c b/qdf/linux/src/qdf_trace.c index fbd5c6a8fe..a379d92061 100644 --- a/qdf/linux/src/qdf_trace.c +++ b/qdf/linux/src/qdf_trace.c @@ -2835,6 +2835,7 @@ struct category_name_info g_qdf_category_name[MAX_SUPPORTED_CATEGORY] = { [QDF_MODULE_ID_MBSSIE] = {"MBSSIE"}, [QDF_MODULE_ID_FWOL] = {"fwol"}, [QDF_MODULE_ID_SM_ENGINE] = {"SM_ENGINE"}, + [QDF_MODULE_ID_CMN_MLME] = {"CMN_MLME"}, [QDF_MODULE_ID_ANY] = {"ANY"}, }; qdf_export_symbol(g_qdf_category_name); @@ -3285,6 +3286,7 @@ static void set_default_trace_levels(struct category_info *cinfo) [QDF_MODULE_ID_MBSSIE] = QDF_TRACE_LEVEL_INFO, [QDF_MODULE_ID_FWOL] = QDF_TRACE_LEVEL_NONE, [QDF_MODULE_ID_SM_ENGINE] = QDF_TRACE_LEVEL_DEBUG, + [QDF_MODULE_ID_CMN_MLME] = QDF_TRACE_LEVEL_INFO, [QDF_MODULE_ID_ANY] = QDF_TRACE_LEVEL_INFO, }; diff --git a/spectral/Kbuild b/spectral/Kbuild index a37d209661..a30b951d2d 100644 --- a/spectral/Kbuild +++ b/spectral/Kbuild @@ -104,6 +104,8 @@ INCS += -I$(obj)/$(DEPTH)/include -I$(obj)/$(DEPTH)/umac/include \ -I$(obj)/$(DEPTH)/cmn_dev/umac/cmn_services/serialization/core/inc \ -I$(obj)/$(DEPTH)/cmn_dev/umac/regulatory/dispatcher/inc \ -I$(obj)/$(DEPTH)/cmn_dev/target_if/regulatory/inc \ + -I$(obj)/$(DEPTH)/cmn_dev/umac/mlme/mlme_objmgr/dispatcher/inc/ \ + -I$(obj)/$(DEPTH)/cmn_dev/umac/mlme/vdev_mgr/dispatcher/inc \ PERF_PWR_OFFLOAD_INC += -I$(PERF_PWR_OFFLOAD_DIR_PATH)/wlan/include \ -I$(PERF_PWR_OFFLOAD_DIR_PATH)/wlan/ath_pktlog/include \ diff --git a/umac/cmn_services/inc/wlan_cmn.h b/umac/cmn_services/inc/wlan_cmn.h index bc654a3e38..9deffaf044 100644 --- a/umac/cmn_services/inc/wlan_cmn.h +++ b/umac/cmn_services/inc/wlan_cmn.h @@ -442,12 +442,14 @@ enum wlan_peer_type { * @WLAN_BAND_2_4_GHZ: 2.4 GHz band * @WLAN_BAND_5_GHZ: 5 GHz band * @WLAN_BAND_4_9_GHZ: 4.9 GHz band + * @WLAN_BAND_NUM_MAX: Max num band */ enum wlan_band { WLAN_BAND_ALL, WLAN_BAND_2_4_GHZ, WLAN_BAND_5_GHZ, WLAN_BAND_4_9_GHZ, + WLAN_BAND_NUM_MAX, }; /** diff --git a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_pdev_obj.h b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_pdev_obj.h index 3dcdf17537..e83980ac6b 100644 --- a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_pdev_obj.h +++ b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_pdev_obj.h @@ -137,9 +137,11 @@ struct wlan_objmgr_pdev_nif { * struct wlan_objmgr_pdev_mlme - pdev object mlme structure * @pdev_op_flags: PDEV operation flags, can be used to know the * operation status (deletion progress, etc) + * @mlme_register_ops: Call back to register MLME legacy APIs */ struct wlan_objmgr_pdev_mlme { uint32_t pdev_op_flags; + QDF_STATUS (*mlme_register_ops)(void *vdev_mlme); }; /** diff --git a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h index d8dad81b06..7c0e467723 100644 --- a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h +++ b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h @@ -284,7 +284,8 @@ struct wlan_channel { /** * struct wlan_objmgr_vdev_mlme - VDEV MLME specific sub structure * @vdev_opmode: Opmode of VDEV - * @mlme_state: VDEV state + * @mlme_state: VDEV MLME SM state + * @mlme_state: VDEV MLME SM substate * @bss_chan: BSS channel * @des_chan: Desired channel, for STA Desired may not be used * @nss: Num. Spatial streams @@ -296,6 +297,7 @@ struct wlan_channel { * @vdev_feat_ext_caps: VDEV Extended feature caps * @max_rate: MAX rate * @tx_mgmt_rate: TX Mgmt. Rate + * @per_band_mgmt_rate: Per-band TX Mgmt. Rate * @vdev_op_flags: Operation flags * @mataddr[]: MAT address * @macaddr[]: VDEV self MAC address @@ -305,8 +307,9 @@ struct wlan_channel { struct wlan_objmgr_vdev_mlme { enum QDF_OPMODE vdev_opmode; enum wlan_vdev_state mlme_state; - struct wlan_channel *bss_chan; /* Define wlan_channel */ - struct wlan_channel *des_chan; /*TODO ??? */ + enum wlan_vdev_state mlme_substate; + struct wlan_channel *bss_chan; + struct wlan_channel *des_chan; uint8_t nss; uint8_t tx_chainmask; uint8_t rx_chainmask; @@ -316,6 +319,7 @@ struct wlan_objmgr_vdev_mlme { uint32_t vdev_feat_ext_caps; uint32_t max_rate; uint32_t tx_mgmt_rate; + uint32_t per_band_mgmt_rate[WLAN_BAND_NUM_MAX]; uint32_t vdev_op_flags; uint8_t mataddr[QDF_MAC_ADDR_SIZE]; uint8_t macaddr[QDF_MAC_ADDR_SIZE]; diff --git a/umac/mlme/include/wlan_vdev_mlme.h b/umac/mlme/include/wlan_vdev_mlme.h new file mode 100644 index 0000000000..f82a5475dc --- /dev/null +++ b/umac/mlme/include/wlan_vdev_mlme.h @@ -0,0 +1,496 @@ +/* + * Copyright (c) 2018 The Linux Foundation. All rights reserved. + * + * Permission to use, copy, modify, and/or distribute this software for + * any purpose with or without fee is hereby granted, provided that the + * above copyright notice and this permission notice appear in all + * copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL + * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE + * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +/** + * DOC: Define VDEV MLME structure and APIs + */ +#ifndef _WLAN_VDEV_MLME_H_ +#define _WLAN_VDEV_MLME_H_ + +struct vdev_mlme_obj; + +/** + * struct vdev_mlme_proto - VDEV protocol strucutre + */ +struct vdev_mlme_proto { +}; + +/** + * enum beacon_update_op - Beacon update op type + * @BEACON_INIT: Initialize beacon + * @BEACON_REINIT: Re-initialize beacon + * @BEACON_UPDATE: Update dynamic fields of beacon + * @BEACON_CSA: Enable CSA IE + * @BEACON_FREE: Beacon buffer free + */ +enum beacon_update_op { + BEACON_INIT, + BEACON_REINIT, + BEACON_UPDATE, + BEACON_CSA, + BEACON_FREE, +}; + +/** + * 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 + */ +struct vdev_mlme_ops { + QDF_STATUS (*mlme_vdev_validate_basic_params)( + struct vdev_mlme_obj *vdev_mlme); + 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); + 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); + QDF_STATUS (*mlme_vdev_disconnect_peers)( + struct vdev_mlme_obj *vdev_mlme); + 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); + QDF_STATUS (*mlme_vdev_notify_down_complete)( + struct vdev_mlme_obj *vdev_mlme); + QDF_STATUS (*mlme_vdev_legacy_hdl_create)( + struct vdev_mlme_obj *vdev_mlme); + QDF_STATUS (*mlme_vdev_legacy_hdl_post_create)( + 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 component object + * @vdev_proto: VDEV MLME proto substructure + * @sm_lock: VDEV SM lock + * @sm_hdl: VDEV SM handle + * @ops: VDEV MLME callback table + * @legacy_vdev_ptr: VDEV MLME legacy pointer + */ +struct vdev_mlme_obj { + struct vdev_mlme_proto vdev_proto; +#ifdef VDEV_SM_LOCK_SUPPORT + qdf_spinlock_t sm_lock; +#endif + struct wlan_sm *sm_hdl; + struct wlan_objmgr_vdev *vdev; + struct vdev_mlme_ops *ops; + void *legacy_vdev_ptr; +}; + +/** + * mlme_vdev_validate_basic_params - Validate basic params + * @vdev_mlme_obj: VDEV MLME comp object + * + * API validate MLME VDEV basic parameters + * + * Return: SUCCESS on successful validation + * FAILURE, if any parameter is not initialized + */ +static inline QDF_STATUS mlme_vdev_validate_basic_params( + struct vdev_mlme_obj *vdev_mlme) +{ + 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); + + return ret; +} + +/** + * mlme_vdev_reset_proto_params - Reset VDEV protocol params + * @vdev_mlme_obj: VDEV MLME comp object + * + * API resets the protocol params fo vdev + * + * Return: SUCCESS on successful reset + * FAILURE, if it fails due to any + */ +static inline QDF_STATUS mlme_vdev_reset_proto_params( + struct vdev_mlme_obj *vdev_mlme) +{ + 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); + + return ret; +} + +/** + * mlme_vdev_start_send - Invokes VDEV start operation + * @vdev_mlme_obj: VDEV MLME comp object + * + * 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) +{ + 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); + + return ret; +} + +/** + * mlme_vdev_restart_send - Invokes VDEV restart operation + * @vdev_mlme_obj: VDEV MLME comp object + * + * 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) +{ + 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); + + return ret; +} + +/** + * mlme_vdev_start_continue - VDEV start response handling + * @vdev_mlme_obj: VDEV MLME comp object + * + * API invokes VDEV start response actions + * + * Return: SUCCESS on successful completion of start response operation + * FAILURE, if it fails due to any + */ +static inline QDF_STATUS mlme_vdev_start_continue( + struct vdev_mlme_obj *vdev_mlme) +{ + 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); + + return ret; +} + +/** + * mlme_vdev_up_send - VDEV up operation + * @vdev_mlme_obj: VDEV MLME comp object + * + * 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) +{ + 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); + + return ret; +} + +/** + * mlme_vdev_notify_up_complete - VDEV up state transition notification + * @vdev_mlme_obj: VDEV MLME comp object + * + * API notifies MLME on moving to UP state + * + * Return: SUCCESS on successful completion of up notification + * FAILURE, if it fails due to any + */ +static inline QDF_STATUS mlme_vdev_notify_up_complete( + struct vdev_mlme_obj *vdev_mlme) +{ + 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); + + return ret; +} + +/** + * mlme_vdev_update_beacon - Updates beacon + * @vdev_mlme_obj: VDEV MLME comp object + * @op: beacon update type + * + * API updates/allocates/frees the beacon + * + * Return: SUCCESS on successful update of beacon + * 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) +{ + 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); + + return ret; +} + +/** + * mlme_vdev_disconnect_peers - Disconnect peers + * @vdev_mlme_obj: VDEV MLME comp object + * + * API trigger stations disconnection with AP VDEV or AP disconnection with STA + * VDEV + * + * Return: SUCCESS on successful invocation of station disconnection + * FAILURE, if it fails due to any + */ +static inline QDF_STATUS mlme_vdev_disconnect_peers( + struct vdev_mlme_obj *vdev_mlme) +{ + 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); + + return ret; +} + +/** + * mlme_vdev_dfs_cac_timer_stop - Stop CAC timer + * @vdev_mlme_obj: VDEV MLME comp object + * + * API stops the CAC timer through DFS API + * + * Return: SUCCESS on successful CAC timer stop + * FAILURE, if it fails due to any + */ +static inline QDF_STATUS mlme_vdev_dfs_cac_timer_stop( + struct vdev_mlme_obj *vdev_mlme) +{ + 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); + + return ret; +} + +/** + * mlme_vdev_stop_send - Invokes VDEV stop operation + * @vdev_mlme_obj: VDEV MLME comp object + * + * 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) +{ + 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); + + return ret; +} + +/** + * mlme_vdev_stop_continue - VDEV stop response handling + * @vdev_mlme_obj: VDEV MLME comp object + * + * API invokes VDEV stop response actions + * + * Return: SUCCESS on successful completion of stop response operation + * FAILURE, if it fails due to any + */ +static inline QDF_STATUS mlme_vdev_stop_continue( + struct vdev_mlme_obj *vdev_mlme) +{ + 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); + + return ret; +} + +/** + * mlme_vdev_down_send - VDEV down operation + * @vdev_mlme_obj: VDEV MLME comp object + * + * 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) +{ + 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); + + return ret; +} + +/** + * mlme_vdev_notify_down_complete - VDEV init state transition notification + * @vdev_mlme_obj: VDEV MLME comp object + * + * API notifies MLME on moving to INIT state + * + * Return: SUCCESS on successful completion of down notification + * FAILURE, if it fails due to any + */ +static inline QDF_STATUS mlme_vdev_notify_down_complete( + struct vdev_mlme_obj *vdev_mlme) +{ + 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); + + return ret; +} + +/** + * mlme_vdev_legacy_hdl_create - VDEV legacy pointer allocation + * @vdev_mlme_obj: VDEV MLME comp object + * + * API invokes legacy pointer allocation and initialization + * + * Return: SUCCESS on successful creation of legacy handle + * FAILURE, if it fails due to any + */ +static inline QDF_STATUS mlme_vdev_legacy_hdl_create( + struct vdev_mlme_obj *vdev_mlme) +{ + QDF_STATUS ret = QDF_STATUS_SUCCESS; + + if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_legacy_hdl_create) + ret = vdev_mlme->ops->mlme_vdev_legacy_hdl_create(vdev_mlme); + + return ret; +} + +/** + * mlme_vdev_legacy_hdl_post_create - VDEV post legacy pointer allocation + * @vdev_mlme_obj: VDEV MLME comp object + * + * API invokes post legacy pointer allocation operation + * + * Return: SUCCESS on successful creation of legacy handle + * FAILURE, if it fails due to any + */ +static inline QDF_STATUS mlme_vdev_legacy_hdl_post_create( + struct vdev_mlme_obj *vdev_mlme) +{ + QDF_STATUS ret = QDF_STATUS_SUCCESS; + + 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); + + return ret; +} + +/** + * mlme_vdev_legacy_hdl_destroy - VDEV legacy pointer free + * @vdev_mlme_obj: VDEV MLME comp object + * + * API invokes legacy pointer free + * + * Return: SUCCESS on successful free of legacy handle + * FAILURE, if it fails due to any + */ +static inline QDF_STATUS mlme_vdev_legacy_hdl_destroy( + struct vdev_mlme_obj *vdev_mlme) +{ + QDF_STATUS ret = QDF_STATUS_SUCCESS; + + if ((vdev_mlme->ops) && vdev_mlme->ops->mlme_vdev_legacy_hdl_destroy) + ret = vdev_mlme->ops->mlme_vdev_legacy_hdl_destroy(vdev_mlme); + + return ret; +} + +#endif diff --git a/umac/mlme/mlme_objmgr/dispatcher/inc/wlan_mlme_dbg.h b/umac/mlme/mlme_objmgr/dispatcher/inc/wlan_mlme_dbg.h new file mode 100644 index 0000000000..9ddf168735 --- /dev/null +++ b/umac/mlme/mlme_objmgr/dispatcher/inc/wlan_mlme_dbg.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2018 The Linux Foundation. All rights reserved. + * + * Permission to use, copy, modify, and/or distribute this software for + * any purpose with or without fee is hereby granted, provided that the + * above copyright notice and this permission notice appear in all + * copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL + * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE + * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + /** + * DOC: Define the debug utils for MLME + */ +#ifndef _WLAN_MLME_DBG_H_ +#define _WLAN_MLME_DBG_H_ + +#include +#include + +#define mlme_alert(format, args...) \ + QDF_TRACE_FATAL(QDF_MODULE_ID_CMN_MLME, format, ## args) + +#define mlme_err(format, args...) \ + QDF_TRACE_ERROR(QDF_MODULE_ID_CMN_MLME, format, ## args) + +#define mlme_warn(format, args...) \ + QDF_TRACE_WARN(QDF_MODULE_ID_CMN_MLME, format, ## args) + +#define mlme_info(format, args...) \ + QDF_TRACE_INFO(QDF_MODULE_ID_CMN_MLME, format, ## args) + +#define mlme_debug(format, args...) \ + QDF_TRACE_DEBUG(QDF_MODULE_ID_CMN_MLME, format, ## args) + +#endif /* _WLAN_MLME_DBG_H_ */ + diff --git a/umac/mlme/mlme_objmgr/dispatcher/inc/wlan_vdev_mlme_main.h b/umac/mlme/mlme_objmgr/dispatcher/inc/wlan_vdev_mlme_main.h new file mode 100644 index 0000000000..eb732206d4 --- /dev/null +++ b/umac/mlme/mlme_objmgr/dispatcher/inc/wlan_vdev_mlme_main.h @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2018 The Linux Foundation. All rights reserved. + * + * Permission to use, copy, modify, and/or distribute this software for + * any purpose with or without fee is hereby granted, provided that the + * above copyright notice and this permission notice appear in all + * copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL + * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE + * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +/** + * DOC: Define VDEV MLME init/deinit APIs + */ + +#ifndef _WLAN_VDEV_MLME_MAIN_H_ +#define _WLAN_VDEV_MLME_MAIN_H_ + +#ifdef CMN_VDEV_MLME_SM_ENABLE +/** + * wlan_vdev_mlme_init - Initializes MLME component + * + * Registers callbacks with object manager for create/destroy + * + * Return: SUCCESS on successful registration + * FAILURE, if registration fails + */ +QDF_STATUS wlan_vdev_mlme_init(void); + +/** + * wlan_vdev_mlme_deinit - Uninitializes MLME component + * + * Unregisters callbacks with object manager for create/destroy + * + * Return: SUCCESS on successful registration + * FAILURE, if registration fails + */ +QDF_STATUS wlan_vdev_mlme_deinit(void); + +#else + +/** + * wlan_vdev_mlme_init - Initializes MLME component + * + * Registers callbacks with object manager for create/destroy + * + * Return: SUCCESS on successful registration + * FAILURE, if registration fails + */ +static inline QDF_STATUS wlan_vdev_mlme_init(void) +{ + return QDF_STATUS_SUCCESS; +} + +/** + * wlan_vdev_mlme_deinit - Uninitializes MLME component + * + * Unregisters callbacks with object manager for create/destroy + * + * Return: SUCCESS on successful registration + * FAILURE, if registration fails + */ +static inline QDF_STATUS wlan_vdev_mlme_deinit(void) +{ + return QDF_STATUS_SUCCESS; +} +#endif +#endif + diff --git a/umac/mlme/mlme_objmgr/dispatcher/src/wlan_vdev_mlme_main.c b/umac/mlme/mlme_objmgr/dispatcher/src/wlan_vdev_mlme_main.c new file mode 100644 index 0000000000..f6166ca111 --- /dev/null +++ b/umac/mlme/mlme_objmgr/dispatcher/src/wlan_vdev_mlme_main.c @@ -0,0 +1,158 @@ +/* + * Copyright (c) 2018 The Linux Foundation. All rights reserved. + * + * Permission to use, copy, modify, and/or distribute this software for + * any purpose with or without fee is hereby granted, provided that the + * above copyright notice and this permission notice appear in all + * copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL + * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE + * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +/** + * DOC: Implements MLME component object creation/initialization/destroy + */ + +#include +#include +#include +#include +#include "include/wlan_vdev_mlme.h" +#include "vdev_mgr/core/src/vdev_mlme_sm.h" + +static QDF_STATUS mlme_vdev_obj_create_handler(struct wlan_objmgr_vdev *vdev, + void *arg) +{ + struct vdev_mlme_obj *vdev_mlme; + struct wlan_objmgr_pdev *pdev; + + if (!vdev) { + mlme_err(" VDEV is NULL"); + return QDF_STATUS_E_FAILURE; + } + + pdev = wlan_vdev_get_pdev(vdev); + if (!pdev) { + mlme_err(" PDEV is NULL"); + return QDF_STATUS_E_FAILURE; + } + + vdev_mlme = qdf_mem_malloc(sizeof(*vdev_mlme)); + if (!vdev_mlme) { + mlme_err(" MLME component object alloc failed"); + return QDF_STATUS_E_NOMEM; + } + + vdev_mlme->vdev = vdev; + + if (pdev->pdev_mlme.mlme_register_ops(vdev_mlme) + != QDF_STATUS_SUCCESS) { + mlme_err("Callbacks registration is failed"); + goto init_failed; + } + + if (mlme_vdev_sm_create(vdev_mlme) != QDF_STATUS_SUCCESS) { + mlme_err("SME creation failed"); + goto init_failed; + } + + if (mlme_vdev_legacy_hdl_create(vdev_mlme) != QDF_STATUS_SUCCESS) { + mlme_err("Legacy vdev object creation failed"); + goto legacy_hdl_create_failed; + } + + wlan_objmgr_vdev_component_obj_attach((struct wlan_objmgr_vdev *)vdev, + WLAN_UMAC_COMP_MLME, + (void *)vdev_mlme, + QDF_STATUS_SUCCESS); + + if (mlme_vdev_legacy_hdl_post_create(vdev_mlme) != QDF_STATUS_SUCCESS) { + mlme_err("Legacy vdev object post creation failed"); + goto legacy_hdl_post_create_failed; + } + + return QDF_STATUS_SUCCESS; + +legacy_hdl_post_create_failed: + mlme_vdev_legacy_hdl_destroy(vdev_mlme); + wlan_objmgr_vdev_component_obj_detach(vdev, WLAN_UMAC_COMP_MLME, + vdev_mlme); +legacy_hdl_create_failed: + mlme_vdev_sm_destroy(vdev_mlme); +init_failed: + qdf_mem_free(vdev_mlme); + + return QDF_STATUS_E_FAILURE; +} + +static QDF_STATUS mlme_vdev_obj_destroy_handler(struct wlan_objmgr_vdev *vdev, + void *arg) +{ + struct vdev_mlme_obj *vdev_mlme; + + if (!vdev) { + mlme_err(" VDEV is NULL"); + return QDF_STATUS_E_FAILURE; + } + + vdev_mlme = wlan_objmgr_vdev_get_comp_private_obj(vdev, + WLAN_UMAC_COMP_MLME); + if (!vdev_mlme) { + mlme_err(" VDEV MLME component object is NULL"); + return QDF_STATUS_E_FAILURE; + } + + mlme_vdev_sm_destroy(vdev_mlme); + + mlme_vdev_legacy_hdl_destroy(vdev_mlme); + + wlan_objmgr_vdev_component_obj_detach(vdev, WLAN_UMAC_COMP_MLME, + vdev_mlme); + qdf_mem_free(vdev_mlme); + + return QDF_STATUS_SUCCESS; +} + +QDF_STATUS wlan_vdev_mlme_init(void) +{ + if (wlan_objmgr_register_vdev_create_handler(WLAN_UMAC_COMP_MLME, + mlme_vdev_obj_create_handler, NULL) + != QDF_STATUS_SUCCESS) + return QDF_STATUS_E_FAILURE; + + if (wlan_objmgr_register_vdev_destroy_handler(WLAN_UMAC_COMP_MLME, + mlme_vdev_obj_destroy_handler, NULL) + != QDF_STATUS_SUCCESS) { + if (wlan_objmgr_unregister_vdev_create_handler( + WLAN_UMAC_COMP_MLME, + mlme_vdev_obj_create_handler, NULL) + != QDF_STATUS_SUCCESS) + return QDF_STATUS_E_FAILURE; + + return QDF_STATUS_E_FAILURE; + } + + return QDF_STATUS_SUCCESS; +} + +QDF_STATUS wlan_vdev_mlme_deinit(void) +{ + if (wlan_objmgr_unregister_vdev_create_handler(WLAN_UMAC_COMP_MLME, + mlme_vdev_obj_create_handler, NULL) + != QDF_STATUS_SUCCESS) + return QDF_STATUS_E_FAILURE; + + if (wlan_objmgr_unregister_vdev_destroy_handler(WLAN_UMAC_COMP_MLME, + mlme_vdev_obj_destroy_handler, NULL) + != QDF_STATUS_SUCCESS) + return QDF_STATUS_E_FAILURE; + + return QDF_STATUS_SUCCESS; +} diff --git a/umac/mlme/vdev_mgr/core/src/vdev_mlme_sm.c b/umac/mlme/vdev_mgr/core/src/vdev_mlme_sm.c new file mode 100644 index 0000000000..79228f2927 --- /dev/null +++ b/umac/mlme/vdev_mgr/core/src/vdev_mlme_sm.c @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2018 The Linux Foundation. All rights reserved. + * + * Permission to use, copy, modify, and/or distribute this software for + * any purpose with or without fee is hereby granted, provided that the + * above copyright notice and this permission notice appear in all + * copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL + * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE + * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +/** + * DOC: Implements VDEV MLME SM + */ + +#include +#include +#include "include/wlan_vdev_mlme.h" +#include "vdev_mlme_sm.h" + +QDF_STATUS mlme_vdev_sm_create(struct vdev_mlme_obj *vdev_mlme) +{ + struct wlan_sm *sm; + + sm = wlan_sm_create("VDEV MLME", vdev_mlme, 0, NULL, 0, NULL, 0); + if (!sm) { + mlme_err("VDEV MLME SM allocation failed"); + return QDF_STATUS_E_FAILURE; + } + vdev_mlme->sm_hdl = sm; + + mlme_vdev_sm_spinlock_create(vdev_mlme); + + return QDF_STATUS_SUCCESS; +} + +QDF_STATUS mlme_vdev_sm_destroy(struct vdev_mlme_obj *vdev_mlme) +{ + mlme_vdev_sm_spinlock_destroy(vdev_mlme); + + wlan_sm_delete(vdev_mlme->sm_hdl); + + return QDF_STATUS_SUCCESS; +} diff --git a/umac/mlme/vdev_mgr/core/src/vdev_mlme_sm.h b/umac/mlme/vdev_mgr/core/src/vdev_mlme_sm.h new file mode 100644 index 0000000000..4c0be66df3 --- /dev/null +++ b/umac/mlme/vdev_mgr/core/src/vdev_mlme_sm.h @@ -0,0 +1,125 @@ +/* + * Copyright (c) 2018 The Linux Foundation. All rights reserved. + * + * Permission to use, copy, modify, and/or distribute this software for + * any purpose with or without fee is hereby granted, provided that the + * above copyright notice and this permission notice appear in all + * copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL + * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE + * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +/** + * DOC: Declares VDEV MLME SM APIs and structures + */ + +#ifndef _VDEV_MLME_SM_H_ +#define _VDEV_MLME_SM_H_ + +/** + * mlme_vdev_sm_create - Invoke SME creation for VDEV + * @vdev_mlme_obj: VDEV MLME comp object + * + * API allocates VDEV MLME SM and initializes SM lock + * + * Return: SUCCESS on successful allocation + * FAILURE, if registration fails + */ +QDF_STATUS mlme_vdev_sm_create(struct vdev_mlme_obj *vdev_mlme); + +/** + * mlme_vdev_sm_destroy - Invoke SME destroy for VDEV + * @vdev_mlme_obj: VDEV MLME comp object + * + * API frees VDEV MLME SM and destroys the SM lock + * + * Return: SUCCESS on successful destroy + * FAILURE, if registration fails + */ +QDF_STATUS mlme_vdev_sm_destroy(struct vdev_mlme_obj *vdev_mlme); + +#ifdef VDEV_SM_LOCK_SUPPORT +/** + * mlme_vdev_sm_spinlock_create - Create VDEV MLME spinlock + * @vdev_mlme_obj: VDEV MLME comp object + * + * Creates VDEV MLME spinlock + * + * Return: void + */ +static inline void mlme_vdev_sm_spinlock_create( + struct vdev_mlme_obj *vdev_mlme) +{ + qdf_spinlock_create(&vdev_mlme->sm_lock); +} + +/** + * mlme_vdev_sm_spinlock_destroy - Destroy VDEV MLME spinlock + * @vdev_mlme_obj: VDEV MLME comp object + * + * Destroy VDEV MLME spinlock + * + * Return: void + */ +static inline void mlme_vdev_sm_spinlock_destroy( + struct vdev_mlme_obj *vdev_mlme) +{ + qdf_spinlock_destroy(&vdev_mlme->sm_lock); +} + +/** + * mlme_vdev_sm_spin_lock - acquire spinlock + * @vdev_mlme_obj: vdev mlme comp object + * + * acquire vdev mlme spinlock + * + * return: void + */ +static inline void mlme_vdev_sm_spin_lock(struct vdev_mlme_obj *vdev_mlme) +{ + qdf_spin_lock_bh(&vdev_mlme->sm_lock); +} + +/** + * mlme_vdev_sm_spin_unlock - release spinlock + * @vdev_mlme_obj: vdev mlme comp object + * + * release vdev mlme spinlock + * + * return: void + */ +static inline void mlme_vdev_sm_spin_unlock(struct vdev_mlme_obj *vdev_mlme) +{ + qdf_spin_unlock_bh(&vdev_mlme->sm_lock); +} + +#else +static inline void mlme_vdev_sm_spinlock_create(struct vdev_mlme_obj *vdev_mlme) +{ + mlme_info("VDEV SM lock is disabled!!!"); +} + +static inline void mlme_vdev_sm_spinlock_destroy( + struct vdev_mlme_obj *vdev_mlme) +{ + mlme_info("VDEV SM lock is disabled!!!"); +} + +static inline void mlme_vdev_sm_spin_lock(struct vdev_mlme_obj *vdev_mlme) +{ +} + +static inline void mlme_vdev_sm_spin_unlock(struct vdev_mlme_obj *vdev_mlme) +{ +} +#endif + +#endif + diff --git a/umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mlme_api.h b/umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mlme_api.h new file mode 100644 index 0000000000..338fc5f4e7 --- /dev/null +++ b/umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mlme_api.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2018 The Linux Foundation. All rights reserved. + * + * Permission to use, copy, modify, and/or distribute this software for + * any purpose with or without fee is hereby granted, provided that the + * above copyright notice and this permission notice appear in all + * copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL + * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE + * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +/** + * DOC: Define VDEV MLME public APIs + */ + +#ifndef _WLAN_VDEV_MLME_API_H_ +#define _WLAN_VDEV_MLME_API_H_ + +/** + * wlan_vdev_mlme_get_legacy_hdl - Returns legacy handle + * + * Retrieves legacy handle from vdev mlme component object + * + * Return: legacy handle on SUCCESS + * NULL, if it fails to retrieve + */ +void *wlan_vdev_mlme_get_legacy_hdl(struct wlan_objmgr_vdev *vdev); + +#endif diff --git a/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mlme_api.c b/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mlme_api.c new file mode 100644 index 0000000000..27a4c9d112 --- /dev/null +++ b/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mlme_api.c @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2018 The Linux Foundation. All rights reserved. + * + * Permission to use, copy, modify, and/or distribute this software for + * any purpose with or without fee is hereby granted, provided that the + * above copyright notice and this permission notice appear in all + * copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL + * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE + * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +/** + * DOC: Implements VDEV MLME public APIs + */ + +#include +#include +#include "include/wlan_vdev_mlme.h" + +void *wlan_vdev_mlme_get_legacy_hdl(struct wlan_objmgr_vdev *vdev) +{ + struct vdev_mlme_obj *vdev_mlme; + + if (!vdev) { + mlme_err("vdev is NULL"); + return NULL; + } + + vdev_mlme = wlan_objmgr_vdev_get_comp_private_obj(vdev, + WLAN_UMAC_COMP_MLME); + if (!vdev_mlme) { + mlme_err(" MLME component object is NULL"); + return NULL; + } + + return vdev_mlme->legacy_vdev_ptr; +} + +qdf_export_symbol(wlan_vdev_mlme_get_legacy_hdl);