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
This commit is contained in:
Srinivas Pitla
2018-06-14 16:05:03 +05:30
gecommit door nshrivas
bovenliggende bc7748c852
commit be8dac4d5d
15 gewijzigde bestanden met toevoegingen van 1056 en 3 verwijderingen

Bestand weergeven

@@ -27,6 +27,7 @@
#include <wlan_ftm_init_deinit_api.h>
#include <wlan_mgmt_txrx_utils_api.h>
#include <wlan_serialization_api.h>
#include <wlan_vdev_mlme_main.h>
#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));

Bestand weergeven

@@ -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;

Bestand weergeven

@@ -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,
};

Bestand weergeven

@@ -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 \

Bestand weergeven

@@ -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,
};
/**

Bestand weergeven

@@ -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);
};
/**

Bestand weergeven

@@ -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];

Bestand weergeven

@@ -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

Bestand weergeven

@@ -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 <qdf_types.h>
#include <qdf_trace.h>
#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_ */

Bestand weergeven

@@ -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

Bestand weergeven

@@ -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 <wlan_objmgr_cmn.h>
#include <wlan_objmgr_global_obj.h>
#include <wlan_objmgr_vdev_obj.h>
#include <wlan_mlme_dbg.h>
#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;
}

Bestand weergeven

@@ -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 <wlan_mlme_dbg.h>
#include <wlan_sm_engine.h>
#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;
}

Bestand weergeven

@@ -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

Bestand weergeven

@@ -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

Bestand weergeven

@@ -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 <wlan_objmgr_vdev_obj.h>
#include <wlan_mlme_dbg.h>
#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);