qcacld-3.0: Add support for init/deinit with obj manager framework

Create the psoc, pdev, vdev, peer hierarchy by calling obj manager
API's in driver init/deinit code.

Change-Id: I804fd56fff0f72d69274dda2667efb6b681e4dda
CRs-Fixed: 1097219
This commit is contained in:
Selvaraj, Sridhar
2016-12-29 16:11:48 +05:30
committed by qcabuildsw
szülő 3eebf18f9b
commit 0672a1213d
14 fájl változott, egészen pontosan 496 új sor hozzáadva és 56 régi sor törölve

16
Kbuild
Fájl megtekintése

@@ -745,6 +745,20 @@ CDS_OBJS := $(CDS_SRC_DIR)/cds_api.o \
$(CDS_SRC_DIR)/cds_utils.o
###### UMAC OBJMGR ########
UMAC_OBJMGR_DIR := $(WLAN_COMMON_ROOT)/umac/cmn_services/obj_mgr
UMAC_OBJMGR_INC := -I$(WLAN_COMMON_INC)/umac/cmn_services/obj_mgr/inc \
-I$(WLAN_COMMON_INC)/umac/cmn_services/obj_mgr/src \
-I$(WLAN_COMMON_INC)/umac/cmn_services/inc \
-I$(WLAN_COMMON_INC)/umac/global_umac_dispatcher/lmac_if/inc
UMAC_OBJMGR_OBJS := $(UMAC_OBJMGR_DIR)/src/wlan_objmgr_global_obj.o \
$(UMAC_OBJMGR_DIR)/src/wlan_objmgr_pdev_obj.o \
$(UMAC_OBJMGR_DIR)/src/wlan_objmgr_peer_obj.o \
$(UMAC_OBJMGR_DIR)/src/wlan_objmgr_psoc_obj.o \
$(UMAC_OBJMGR_DIR)/src/wlan_objmgr_vdev_obj.o
########### BMI ###########
BMI_DIR := core/bmi
@@ -1090,6 +1104,7 @@ INCS += $(HIF_INC) \
$(BMI_INC) \
$(HAL_INC)
INCS += $(UMAC_OBJMGR_INC)
INCS += $(TARGET_INC)
INCS += $(NLINK_INC) \
@@ -1134,6 +1149,7 @@ OBJS += $(HIF_OBJS) \
$(HTT_OBJS) \
$(HAL_OBJS)
OBJS += $(UMAC_OBJMGR_OBJS)
OBJS += $(WLAN_LOGGING_OBJS)
OBJS += $(NLINK_OBJS)
OBJS += $(PTT_OBJS)

Fájl megtekintése

@@ -48,6 +48,7 @@
#include <qdf_threads.h>
#include <qdf_mc_timer.h>
#include <cds_pack_align.h>
#include <wlan_objmgr_psoc_obj.h>
/* Amount of time to wait for WMA to perform an asynchronous activity.
* This value should be larger than the timeout used by WMI to wait for
@@ -200,11 +201,11 @@ void cds_deinit(void);
QDF_STATUS cds_pre_enable(v_CONTEXT_t cds_context);
QDF_STATUS cds_open(void);
QDF_STATUS cds_open(struct wlan_objmgr_psoc *psoc);
QDF_STATUS cds_enable(v_CONTEXT_t cds_context);
QDF_STATUS cds_enable(struct wlan_objmgr_psoc *psoc, v_CONTEXT_t cds_context);
QDF_STATUS cds_disable(v_CONTEXT_t cds_context);
QDF_STATUS cds_disable(struct wlan_objmgr_psoc *psoc, v_CONTEXT_t cds_context);
/**
* cds_flush_cache_rx_queue() - flush cache rx queue frame
@@ -215,7 +216,7 @@ void cds_flush_cache_rx_queue(void);
QDF_STATUS cds_post_disable(v_CONTEXT_t cds_context);
QDF_STATUS cds_close(v_CONTEXT_t cds_context);
QDF_STATUS cds_close(struct wlan_objmgr_psoc *psoc, v_CONTEXT_t cds_context);
void *cds_get_context(QDF_MODULE_ID moduleId);

Fájl megtekintése

@@ -263,7 +263,7 @@ static QDF_STATUS cds_deregister_all_modules(void)
*
* Return: QDF status
*/
QDF_STATUS cds_open(void)
QDF_STATUS cds_open(struct wlan_objmgr_psoc *psoc)
{
QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
tSirRetStatus sirStatus = eSIR_SUCCESS;
@@ -386,7 +386,7 @@ QDF_STATUS cds_open(void)
}
/*Open the WMA module */
qdf_status = wma_open(gp_cds_context,
qdf_status = wma_open(psoc, gp_cds_context,
hdd_update_tgt_cfg,
hdd_dfs_indicate_radar, cds_cfg);
@@ -443,7 +443,7 @@ QDF_STATUS cds_open(void)
/* Now proceed to open the MAC */
sirStatus =
mac_open(&(gp_cds_context->pMACContext),
mac_open(psoc, &(gp_cds_context->pMACContext),
gp_cds_context->pHDDContext, cds_cfg);
if (eSIR_SUCCESS != sirStatus) {
@@ -481,8 +481,7 @@ QDF_STATUS cds_open(void)
"%s: CDS successfully Opened", __func__);
cds_register_all_modules();
dispatcher_psoc_open();
dispatcher_psoc_open(psoc);
return QDF_STATUS_SUCCESS;
err_sme_close:
@@ -639,11 +638,12 @@ QDF_STATUS cds_pre_enable(v_CONTEXT_t cds_context)
/**
* cds_enable() - start/enable cds module
* @psoc: Psoc pointer
* @cds_context: CDS context
*
* Return: QDF status
*/
QDF_STATUS cds_enable(v_CONTEXT_t cds_context)
QDF_STATUS cds_enable(struct wlan_objmgr_psoc *psoc, v_CONTEXT_t cds_context)
{
QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
tSirRetStatus sirStatus = eSIR_SUCCESS;
@@ -729,7 +729,7 @@ QDF_STATUS cds_enable(v_CONTEXT_t cds_context)
QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_INFO,
"%s: CDS Start is successful!!", __func__);
dispatcher_psoc_enable();
dispatcher_psoc_enable(psoc);
return QDF_STATUS_SUCCESS;
@@ -776,11 +776,12 @@ err_wma_stop:
/**
* cds_disable() - stop/disable cds module
* @psoc: Psoc pointer
* @cds_context: CDS context
*
* Return: QDF status
*/
QDF_STATUS cds_disable(v_CONTEXT_t cds_context)
QDF_STATUS cds_disable(struct wlan_objmgr_psoc *psoc, v_CONTEXT_t cds_context)
{
QDF_STATUS qdf_status;
void *handle;
@@ -790,8 +791,8 @@ QDF_STATUS cds_disable(v_CONTEXT_t cds_context)
* ongoing transaction with FW. Always keep it before wma_stop() as
* wma_stop() does target PDEV suspend.
*/
dispatcher_psoc_disable();
dispatcher_psoc_disable(psoc);
qdf_status = wma_stop(cds_context, HAL_STOP_TYPE_RF_KILL);
@@ -883,6 +884,7 @@ QDF_STATUS cds_post_disable(v_CONTEXT_t cds_context)
/**
* cds_close() - close cds module
* @psoc: Psoc pointer
* @cds_context: CDS context
*
* This API allows user to close modules registered
@@ -890,7 +892,7 @@ QDF_STATUS cds_post_disable(v_CONTEXT_t cds_context)
*
* Return: QDF status
*/
QDF_STATUS cds_close(v_CONTEXT_t cds_context)
QDF_STATUS cds_close(struct wlan_objmgr_psoc *psoc, v_CONTEXT_t cds_context)
{
QDF_STATUS qdf_status;
@@ -977,7 +979,7 @@ QDF_STATUS cds_close(v_CONTEXT_t cds_context)
cds_deregister_all_modules();
dispatcher_psoc_close();
dispatcher_psoc_close(psoc);
return QDF_STATUS_SUCCESS;
}

Fájl megtekintése

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2012-2016 The Linux Foundation. All rights reserved.
* Copyright (c) 2012-2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -64,6 +64,12 @@
#include <cdp_txrx_peer_ops.h>
#include "wlan_hdd_nan_datapath.h"
#include "wlan_tgt_def_config.h"
#include <wlan_objmgr_cmn.h>
#include <wlan_objmgr_global_obj.h>
#include <wlan_objmgr_psoc_obj.h>
#include <wlan_objmgr_pdev_obj.h>
#include <wlan_objmgr_vdev_obj.h>
#include <wlan_objmgr_peer_obj.h>
/*---------------------------------------------------------------------------
Preprocessor definitions and constants
@@ -267,6 +273,9 @@
/* session ID invalid */
#define HDD_SESSION_ID_INVALID 0xFF
/* Default Psoc id */
#define DEFAULT_PSOC_ID 1
/*
* Generic asynchronous request/response support
*
@@ -903,6 +912,7 @@ struct hdd_adapter_s {
uint32_t magic;
void *pHddCtx;
struct wlan_objmgr_vdev *hdd_vdev;
void *txrx_vdev;
@@ -1299,6 +1309,9 @@ struct hdd_context_s {
/** Global CDS context */
v_CONTEXT_t pcds_context;
struct wlan_objmgr_psoc *hdd_psoc;
struct wlan_objmgr_pdev *hdd_pdev;
/** HAL handle...*/
tHalHandle hHal;
@@ -1994,4 +2007,98 @@ static inline int wlan_hdd_validate_session_id(u8 session_id)
bool hdd_is_roaming_in_progress(void);
void hdd_set_roaming_in_progress(bool value);
/**
* hdd_create_and_store_psoc() - Create psoc object and store in hdd context
* @hdd_ctx: Hdd context
* @psoc_id: Psoc Id
*
* This API creates Psoc object with given @psoc_id and store the psoc reference
* to hdd context
*
* Return: QDF_STATUS
*/
QDF_STATUS hdd_create_and_store_psoc(hdd_context_t *hdd_ctx, uint8_t psoc_id);
/**
* hdd_destroy_and_release_psoc() - Deletes the psoc object
* @hdd_ctx: Hdd context
*
* This API deletes psoc object and release its reference from hdd context
*
* Return: QDF_STATUS
*/
QDF_STATUS hdd_destroy_and_release_psoc(hdd_context_t *hdd_ctx);
/**
* hdd_create_and_store_pdev() - Create pdev object and store in hdd context
* @hdd_ctx: Hdd context
*
* This API creates the pdev object and store the pdev reference to hdd context
*
* Return: QDF_STATUS
*/
QDF_STATUS hdd_create_and_store_pdev(hdd_context_t *hdd_ctx);
/**
* hdd_destroy_and_release_pdev() - Deletes the pdev object
* @hdd_ctx: Hdd context
*
* This API deletes pdev object and release its reference from hdd context
*
* Return: QDF_STATUS
*/
QDF_STATUS hdd_destroy_and_release_pdev(hdd_context_t *hdd_ctx);
/**
* hdd_create_and_store_vdev() - Create vdev object and store in hdd adapter
* @pdev: pdev pointer
* @adapter: hdd adapter
*
* This API creates the vdev object and store the vdev reference to the
* given @adapter. Also, creates a self peer for the vdev. If the adapter
* session id and vdev id of the new vdev object doesnot match, destroys the
* created vdev object and returns failure
*
* Return: QDF_STATUS
*/
QDF_STATUS hdd_create_and_store_vdev(struct wlan_objmgr_pdev *pdev,
hdd_adapter_t *adapter);
/**
* hdd_destroy_and_release_vdev() - Delete the vdev object
* @hdd_ctx: Hdd context
*
* This API deletes vdev object and release its reference from hdd adapter
*
* Return: QDF_STATUS
*/
QDF_STATUS hdd_destroy_and_release_vdev(hdd_adapter_t *adapter);
/**
* hdd_add_peer_object() - Create and add the peer object to the vdev
* @vdev: vdev pointer
* @adapter_mode: adapter mode
* @mac_addr: Peer mac address
*
* This API creates and adds the peer object to the given @vdev. The peer type
* (STA, AP or IBSS) is assigned based on adapter mode. For example, if adapter
* mode is STA, peer is AP.
*
* Return: QDF_STATUS
*/
QDF_STATUS hdd_add_peer_object(struct wlan_objmgr_vdev *vdev,
enum tQDF_ADAPTER_MODE adapter_mode,
uint8_t *mac_addr);
/**
* hdd_remove_peer_object() - Delete and remove the peer from vdev
* @vdev: vdev pointer
* @mac_addr: Peer Mac address
*
* This API finds the peer object from given @mac_addr and deletes the same.
*
* Return: QDF_STATUS
*/
QDF_STATUS hdd_remove_peer_object(struct wlan_objmgr_vdev *vdev,
uint8_t *mac_addr);
#endif /* end #if !defined(WLAN_HDD_MAIN_H) */

Fájl megtekintése

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2012-2016 The Linux Foundation. All rights reserved.
* Copyright (c) 2012-2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -1190,6 +1190,7 @@ static void hdd_send_association_event(struct net_device *dev,
int we_event;
char *msg;
struct qdf_mac_addr peerMacAddr;
QDF_STATUS qdf_status;
/* Added to find the auth type on the fly at run time */
/* rather than with cfg to see if FT is enabled */
@@ -1272,6 +1273,14 @@ static void hdd_send_association_event(struct net_device *dev,
pCsrRoamInfo->chan_info.reg_info_1;
chan_info.reg_info_2 =
pCsrRoamInfo->chan_info.reg_info_2;
qdf_status = hdd_add_peer_object(pAdapter->hdd_vdev,
pAdapter->device_mode,
peerMacAddr.bytes);
if (QDF_IS_STATUS_ERROR(qdf_status))
hdd_err("Peer object "MAC_ADDRESS_STR" add fails!",
MAC_ADDR_ARRAY(peerMacAddr.bytes));
/* send peer status indication to oem app */
hdd_send_peer_status_ind_to_oem_app(&peerMacAddr,
ePeerConnected,
@@ -1304,6 +1313,13 @@ static void hdd_send_association_event(struct net_device *dev,
ETH_ALEN);
hdd_err("wlan: new IBSS connection to " MAC_ADDRESS_STR,
MAC_ADDR_ARRAY(pHddStaCtx->conn_info.bssId.bytes));
qdf_status = hdd_add_peer_object(pAdapter->hdd_vdev,
QDF_IBSS_MODE,
pCsrRoamInfo->bssid.bytes);
if (QDF_IS_STATUS_ERROR(qdf_status))
hdd_err("Peer object "MAC_ADDRESS_STR" add fails!",
MAC_ADDR_ARRAY(pCsrRoamInfo->bssid.bytes));
} else { /* Not Associated */
hdd_err("wlan: disconnected");
memset(wrqu.ap_addr.sa_data, '\0', ETH_ALEN);
@@ -1327,6 +1343,13 @@ static void hdd_send_association_event(struct net_device *dev,
NULL,
pAdapter->device_mode);
}
qdf_status = hdd_remove_peer_object(pAdapter->hdd_vdev,
peerMacAddr.bytes);
if (QDF_IS_STATUS_ERROR(qdf_status))
hdd_err("Peer obj "MAC_ADDRESS_STR" delete fails",
MAC_ADDR_ARRAY(peerMacAddr.bytes));
hdd_lpass_notify_disconnect(pAdapter);
/* Update tdls module about the disconnection event */
wlan_hdd_tdls_notify_disconnect(pAdapter);
@@ -3310,8 +3333,8 @@ roam_roam_connect_status_update_handler(hdd_adapter_t *pAdapter,
eCsrRoamResult roamResult)
{
QDF_STATUS qdf_status;
hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
switch (roamResult) {
case eCSR_ROAM_RESULT_IBSS_NEW_PEER:
{
@@ -3423,6 +3446,12 @@ roam_roam_connect_status_update_handler(hdd_adapter_t *pAdapter,
pHddCtx->sta_to_adapter[pRoamInfo->staId] = NULL;
pHddStaCtx->ibss_sta_generation++;
qdf_status = hdd_remove_peer_object(pAdapter->hdd_vdev,
pRoamInfo->peerMac.bytes);
if (QDF_IS_STATUS_ERROR(qdf_status))
hdd_err("Peer obj "MAC_ADDRESS_STR" delete fails",
MAC_ADDR_ARRAY(pRoamInfo->peerMac.bytes));
cfg80211_del_sta(pAdapter->dev,
(const u8 *)&pRoamInfo->peerMac.bytes,
GFP_KERNEL);

Fájl megtekintése

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2012-2016 The Linux Foundation. All rights reserved.
* Copyright (c) 2012-2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -1671,6 +1671,18 @@ QDF_STATUS hdd_hostapd_sap_event_cb(tpSap_Event pSapEvent,
chan_info,
pHostapdAdapter->device_mode);
}
qdf_status = hdd_add_peer_object(pHostapdAdapter->hdd_vdev,
pHostapdAdapter->device_mode,
pSapEvent->sapevt.
sapStationAssocReassocCompleteEvent.
staMac.bytes);
if (QDF_IS_STATUS_ERROR(qdf_status))
hdd_err("Peer object "MAC_ADDRESS_STR" add fails!",
MAC_ADDR_ARRAY(pSapEvent->sapevt.
sapStationAssocReassocCompleteEvent.
staMac.bytes));
hdd_green_ap_add_sta(pHddCtx);
break;
@@ -1783,6 +1795,15 @@ QDF_STATUS hdd_hostapd_sap_event_cb(tpSap_Event pSapEvent,
NULL,
pHostapdAdapter->device_mode);
}
qdf_status = hdd_remove_peer_object(pHostapdAdapter->hdd_vdev,
pSapEvent->sapevt.
sapStationDisassocCompleteEvent.
staMac.bytes);
if (QDF_IS_STATUS_ERROR(qdf_status))
hdd_err("Peer obj "MAC_ADDRESS_STR" delete fails",
MAC_ADDR_ARRAY(pSapEvent->sapevt.
sapStationDisassocCompleteEvent.
staMac.bytes));
#ifdef MSM_PLATFORM
/*stop timer in sap/p2p_go */
if (pHddApCtx->bApActive == false) {
@@ -5751,7 +5772,6 @@ QDF_STATUS hdd_init_ap_mode(hdd_adapter_t *pAdapter)
struct net_device *dev = pAdapter->dev;
hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
QDF_STATUS status;
QDF_STATUS qdf_status;
v_CONTEXT_t p_cds_context = (WLAN_HDD_GET_CTX(pAdapter))->pcds_context;
v_CONTEXT_t sapContext = NULL;
int ret;
@@ -5788,12 +5808,15 @@ QDF_STATUS hdd_init_ap_mode(hdd_adapter_t *pAdapter)
&session_id);
if (!QDF_IS_STATUS_SUCCESS(status)) {
hdd_err("ERROR: wlansap_start failed!!");
wlansap_close(sapContext);
pAdapter->sessionCtx.ap.sapContext = NULL;
return status;
}
pAdapter->sessionId = session_id;
status = hdd_create_and_store_vdev(pHddCtx->hdd_pdev, pAdapter);
if (QDF_IS_STATUS_ERROR(status))
goto error_vdev_create;
/* Allocate the Wireless Extensions state structure */
phostapdBuf = WLAN_HDD_GET_HOSTAP_STATE_PTR(pAdapter);
@@ -5807,25 +5830,19 @@ QDF_STATUS hdd_init_ap_mode(hdd_adapter_t *pAdapter)
status = hdd_set_hostapd(pAdapter);
if (!QDF_IS_STATUS_SUCCESS(status)) {
hdd_err("ERROR: hdd_set_hostapd failed!!");
wlansap_close(sapContext);
pAdapter->sessionCtx.ap.sapContext = NULL;
return status;
goto error_init_ap_mode;
}
qdf_status = qdf_event_create(&phostapdBuf->qdf_event);
if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
status = qdf_event_create(&phostapdBuf->qdf_event);
if (!QDF_IS_STATUS_SUCCESS(status)) {
hdd_err("ERROR: Hostapd HDD qdf event init failed!!");
wlansap_close(sapContext);
pAdapter->sessionCtx.ap.sapContext = NULL;
return qdf_status;
goto error_init_ap_mode;
}
qdf_status = qdf_event_create(&phostapdBuf->qdf_stop_bss_event);
if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
status = qdf_event_create(&phostapdBuf->qdf_stop_bss_event);
if (!QDF_IS_STATUS_SUCCESS(status)) {
hdd_err("ERROR: Hostapd HDD stop bss event init failed!!");
wlansap_close(sapContext);
pAdapter->sessionCtx.ap.sapContext = NULL;
return qdf_status;
goto error_init_ap_mode;
}
init_completion(&pAdapter->session_close_comp_var);
@@ -5867,6 +5884,11 @@ QDF_STATUS hdd_init_ap_mode(hdd_adapter_t *pAdapter)
error_wmm_init:
hdd_softap_deinit_tx_rx(pAdapter);
error_init_ap_mode:
status = hdd_destroy_and_release_vdev(pAdapter);
if (QDF_IS_STATUS_ERROR(status))
hdd_err("vdev delete failed");
error_vdev_create:
wlansap_close(sapContext);
pAdapter->sessionCtx.ap.sapContext = NULL;
EXIT();
@@ -6040,6 +6062,10 @@ QDF_STATUS hdd_unregister_hostapd(hdd_adapter_t *pAdapter, bool rtnl_held)
hdd_err("Failed:WLANSAP_close");
pAdapter->sessionCtx.ap.sapContext = NULL;
status = hdd_destroy_and_release_vdev(pAdapter);
if (QDF_IS_STATUS_ERROR(status))
hdd_err("vdev delete failed");
EXIT();
return 0;
}

Fájl megtekintése

@@ -109,6 +109,12 @@
#include <wlan_hdd_napi.h>
#include "wlan_hdd_disa.h"
#include <dispatcher_init_deinit.h>
#include <wlan_objmgr_cmn.h>
#include <wlan_objmgr_global_obj.h>
#include <wlan_objmgr_psoc_obj.h>
#include <wlan_objmgr_pdev_obj.h>
#include <wlan_objmgr_vdev_obj.h>
#include <wlan_objmgr_peer_obj.h>
#ifdef MODULE
#define WLAN_MODULE_NAME module_name(THIS_MODULE)
@@ -1322,6 +1328,13 @@ void hdd_update_tgt_cfg(void *context, void *param)
struct wma_tgt_cfg *cfg = param;
uint8_t temp_band_cap;
struct cds_config_info *cds_cfg = cds_get_ini_config();
QDF_STATUS qdf_status;
qdf_status = hdd_create_and_store_pdev(hdd_ctx);
if (QDF_IS_STATUS_ERROR(qdf_status)) {
hdd_err("Pdev creation fails!");
QDF_BUG(0);
}
if (cds_cfg) {
if (hdd_ctx->config->enable_sub_20_channel_width !=
@@ -1775,7 +1788,13 @@ int hdd_wlan_start_modules(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter,
goto ol_cds_free;
}
status = cds_open();
status = hdd_create_and_store_psoc(hdd_ctx, DEFAULT_PSOC_ID);
if (QDF_IS_STATUS_ERROR(status)) {
hdd_err("Psoc creation fails!");
goto ol_cds_free;
}
status = cds_open(hdd_ctx->hdd_psoc);
if (!QDF_IS_STATUS_SUCCESS(status)) {
hdd_err("Failed to Open CDS: %d", status);
goto ol_cds_free;
@@ -1832,7 +1851,7 @@ int hdd_wlan_start_modules(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter,
return 0;
close:
cds_close(p_cds_context);
cds_close(hdd_ctx->hdd_psoc, p_cds_context);
ol_cds_free:
ol_cds_free();
@@ -2670,10 +2689,13 @@ QDF_STATUS hdd_init_station_mode(hdd_adapter_t *adapter)
hdd_alert("Session is not opened within timeout period code %ld",
rc);
adapter->sessionId = HDD_SESSION_ID_INVALID;
status = QDF_STATUS_E_FAILURE;
goto error_sme_open;
return QDF_STATUS_E_FAILURE;
}
status = hdd_create_and_store_vdev(hdd_ctx->hdd_pdev, adapter);
if (QDF_IS_STATUS_ERROR(status))
goto error_vdev_create;
sme_set_vdev_ies_per_band(hdd_ctx->hHal, adapter->sessionId);
/* Register wireless extensions */
qdf_ret_status = hdd_register_wext(pWlanDev);
@@ -2742,6 +2764,10 @@ error_wmm_init:
error_init_txrx:
hdd_unregister_wext(pWlanDev);
error_register_wext:
status = hdd_destroy_and_release_vdev(adapter);
if (QDF_IS_STATUS_ERROR(status))
hdd_err("vdev delete failed");
error_vdev_create:
if (test_bit(SME_SESSION_OPENED, &adapter->event_flags)) {
INIT_COMPLETION(adapter->session_close_comp_var);
if (QDF_STATUS_SUCCESS == sme_close_session(hdd_ctx->hHal,
@@ -2894,6 +2920,7 @@ static void hdd_cleanup_adapter(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter,
bool rtnl_held)
{
struct net_device *pWlanDev = NULL;
QDF_STATUS qdf_status;
if (adapter)
pWlanDev = adapter->dev;
@@ -2902,6 +2929,10 @@ static void hdd_cleanup_adapter(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter,
return;
}
qdf_status = hdd_destroy_and_release_vdev(adapter);
if (QDF_IS_STATUS_ERROR(qdf_status))
hdd_err("vdev delete failed");
hdd_debugfs_exit(adapter);
if (adapter->scan_info.default_scan_ies) {
@@ -3506,6 +3537,7 @@ static void hdd_wait_for_sme_close_sesion(hdd_context_t *hdd_ctx,
hdd_adapter_t *adapter)
{
unsigned long rc;
QDF_STATUS qdf_status;
if (!test_bit(SME_SESSION_OPENED, &adapter->event_flags)) {
hdd_err("session is not opened:%d", adapter->sessionId);
@@ -3532,6 +3564,10 @@ static void hdd_wait_for_sme_close_sesion(hdd_context_t *hdd_ctx,
clear_bit(SME_SESSION_OPENED, &adapter->event_flags);
return;
}
qdf_status = hdd_destroy_and_release_vdev(adapter);
if (QDF_IS_STATUS_ERROR(qdf_status))
hdd_err("vdev delete failed");
adapter->sessionId = HDD_SESSION_ID_INVALID;
}
}
@@ -7716,7 +7752,7 @@ int hdd_configure_cds(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter)
* Start CDS which starts up the SME/MAC/HAL modules and everything
* else
*/
status = cds_enable(hdd_ctx->pcds_context);
status = cds_enable(hdd_ctx->hdd_psoc, hdd_ctx->pcds_context);
if (!QDF_IS_STATUS_SUCCESS(status)) {
hdd_alert("cds_enable failed");
@@ -7747,7 +7783,7 @@ hdd_features_deinit:
hdd_deregister_cb(hdd_ctx);
wlan_hdd_cfg80211_deregister_frames(adapter);
cds_disable:
cds_disable(hdd_ctx->pcds_context);
cds_disable(hdd_ctx->hdd_psoc, hdd_ctx->pcds_context);
out:
return -EINVAL;
@@ -7778,7 +7814,7 @@ static int hdd_deconfigure_cds(hdd_context_t *hdd_ctx)
ret = -EINVAL;
}
qdf_status = cds_disable(hdd_ctx->pcds_context);
qdf_status = cds_disable(hdd_ctx->hdd_psoc, hdd_ctx->pcds_context);
if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
hdd_err("Failed to Disable the CDS Modules! :%d",
qdf_status);
@@ -7810,7 +7846,6 @@ int hdd_wlan_stop_modules(hdd_context_t *hdd_ctx)
ENTER();
qdf_ctx = cds_get_context(QDF_MODULE_ID_QDF_DEVICE);
if (!qdf_ctx) {
hdd_err("QDF device context NULL");
@@ -7862,13 +7897,21 @@ int hdd_wlan_stop_modules(hdd_context_t *hdd_ctx)
ret = -EINVAL;
QDF_ASSERT(0);
}
qdf_status = cds_close(hdd_ctx->pcds_context);
qdf_status = cds_close(hdd_ctx->hdd_psoc, hdd_ctx->pcds_context);
if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
hdd_warn("Failed to stop CDS:%d", qdf_status);
ret = -EINVAL;
QDF_ASSERT(0);
}
qdf_status = hdd_destroy_and_release_pdev(hdd_ctx);
if (QDF_IS_STATUS_ERROR(qdf_status))
hdd_err("Pdev delete failed");
qdf_status = hdd_destroy_and_release_psoc(hdd_ctx);
if (QDF_IS_STATUS_ERROR(qdf_status))
hdd_err("Psoc delete failed");
hif_ctx = cds_get_context(QDF_MODULE_ID_HIF);
if (!hif_ctx) {
hdd_err("Hif context is Null");
@@ -9870,6 +9913,191 @@ bool hdd_is_roaming_in_progress(void)
return hdd_ctx->roaming_in_progress;
}
QDF_STATUS hdd_create_and_store_psoc(hdd_context_t *hdd_ctx, uint8_t psoc_id)
{
struct wlan_objmgr_psoc *psoc;
psoc = wlan_objmgr_psoc_obj_create(psoc_id, WLAN_DEV_OL);
if (!psoc)
return QDF_STATUS_E_FAILURE;
hdd_ctx->hdd_psoc = psoc;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS hdd_destroy_and_release_psoc(hdd_context_t *hdd_ctx)
{
struct wlan_objmgr_psoc *psoc = hdd_ctx->hdd_psoc;
hdd_ctx->hdd_psoc = NULL;
if (psoc) {
wlan_objmgr_psoc_obj_delete(psoc);
return QDF_STATUS_SUCCESS;
} else
return QDF_STATUS_E_FAILURE;
}
QDF_STATUS hdd_create_and_store_pdev(hdd_context_t *hdd_ctx)
{
struct wlan_objmgr_psoc *psoc = hdd_ctx->hdd_psoc;
struct wlan_objmgr_pdev *pdev;
if (!psoc) {
hdd_err("Psoc NULL");
return QDF_STATUS_E_FAILURE;
}
pdev = wlan_objmgr_pdev_obj_create(psoc, NULL);
if (!pdev) {
hdd_err("pdev obj create failed");
return QDF_STATUS_E_FAILURE;
}
hdd_ctx->hdd_pdev = pdev;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS hdd_destroy_and_release_pdev(hdd_context_t *hdd_ctx)
{
struct wlan_objmgr_pdev *pdev = hdd_ctx->hdd_pdev;
hdd_ctx->hdd_pdev = NULL;
if (pdev) {
wlan_objmgr_pdev_obj_delete(pdev);
return QDF_STATUS_SUCCESS;
} else
return QDF_STATUS_E_FAILURE;
}
QDF_STATUS hdd_create_and_store_vdev(struct wlan_objmgr_pdev *pdev,
hdd_adapter_t *adapter)
{
struct wlan_objmgr_vdev *vdev;
struct wlan_objmgr_peer *peer;
struct wlan_vdev_create_params vdev_params;
vdev_params.opmode = adapter->device_mode;
qdf_mem_copy(vdev_params.macaddr, adapter->macAddressCurrent.bytes,
QDF_NET_MAC_ADDR_MAX_LEN);
if (!pdev) {
hdd_err("pdev NULL");
return QDF_STATUS_E_FAILURE;
}
vdev = wlan_objmgr_vdev_obj_create(pdev, &vdev_params);
if (!vdev) {
hdd_err("vdev obj create fails");
return QDF_STATUS_E_FAILURE;
}
if (adapter->sessionId != wlan_vdev_get_id(vdev)) {
hdd_err("session id and vdev id mismatch");
wlan_objmgr_vdev_obj_delete(vdev);
QDF_ASSERT(0);
return QDF_STATUS_E_FAILURE;
}
peer = wlan_objmgr_peer_obj_create(vdev, WLAN_PEER_SELF,
vdev_params.macaddr);
if (!peer) {
hdd_err("obj manager self peer create fails for adapter %d",
adapter->device_mode);
wlan_objmgr_vdev_obj_delete(vdev);
return QDF_STATUS_E_FAILURE;
}
adapter->hdd_vdev = vdev;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS hdd_destroy_and_release_vdev(hdd_adapter_t *adapter)
{
struct wlan_objmgr_vdev *vdev = adapter->hdd_vdev;
adapter->hdd_vdev = NULL;
if (vdev) {
if (hdd_remove_peer_object(vdev,
wlan_vdev_mlme_get_macaddr(vdev))) {
hdd_err("Self peer delete fails");
return QDF_STATUS_E_FAILURE;
}
wlan_objmgr_vdev_obj_delete(vdev);
return QDF_STATUS_SUCCESS;
} else
return QDF_STATUS_E_FAILURE;
}
QDF_STATUS hdd_add_peer_object(struct wlan_objmgr_vdev *vdev,
enum tQDF_ADAPTER_MODE adapter_mode,
uint8_t *mac_addr)
{
enum wlan_peer_type peer_type;
if ((adapter_mode == QDF_STA_MODE) ||
(adapter_mode == QDF_P2P_CLIENT_MODE))
peer_type = WLAN_PEER_AP;
else if ((adapter_mode == QDF_SAP_MODE) ||
(adapter_mode == QDF_P2P_GO_MODE))
peer_type = WLAN_PEER_STA;
else if (adapter_mode == QDF_IBSS_MODE)
peer_type = WLAN_PEER_IBSS;
else {
hdd_err("Unsupported device mode %d", adapter_mode);
return QDF_STATUS_E_FAILURE;
}
if (!vdev) {
hdd_err("vdev NULL");
QDF_ASSERT(0);
return QDF_STATUS_E_FAILURE;
}
if (!wlan_objmgr_peer_obj_create(vdev, peer_type, mac_addr))
return QDF_STATUS_E_FAILURE;
hdd_info("Peer object "MAC_ADDRESS_STR" add success!",
MAC_ADDR_ARRAY(mac_addr));
return QDF_STATUS_SUCCESS;
}
QDF_STATUS hdd_remove_peer_object(struct wlan_objmgr_vdev *vdev,
uint8_t *mac_addr)
{
struct wlan_objmgr_psoc *psoc;
struct wlan_objmgr_peer *peer;
if (!vdev) {
hdd_err("vdev NULL");
QDF_ASSERT(0);
return QDF_STATUS_E_FAILURE;
}
psoc = wlan_vdev_get_psoc(vdev);
if (!psoc) {
hdd_err("Psoc NUll");
QDF_ASSERT(0);
return QDF_STATUS_E_FAILURE;
}
peer = wlan_objmgr_find_peer(psoc, mac_addr);
if (peer) {
if (wlan_objmgr_peer_obj_delete(peer))
return QDF_STATUS_E_FAILURE;
hdd_info("Peer obj "MAC_ADDRESS_STR" deleted",
MAC_ADDR_ARRAY(mac_addr));
return QDF_STATUS_SUCCESS;
}
hdd_err("Peer obj "MAC_ADDRESS_STR" not found",
MAC_ADDR_ARRAY(mac_addr));
return QDF_STATUS_E_FAILURE;
}
/* Register the module init/exit functions */
module_init(hdd_module_init);
module_exit(hdd_module_exit);

Fájl megtekintése

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2016 The Linux Foundation. All rights reserved.
* Copyright (c) 2016-2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -105,6 +105,7 @@ static int hdd_close_ndi(hdd_adapter_t *adapter)
int rc;
hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
uint32_t timeout = WLAN_WAIT_TIME_SESSIONOPENCLOSE;
QDF_STATUS qdf_status;
ENTER();
@@ -139,6 +140,10 @@ static int hdd_close_ndi(hdd_adapter_t *adapter)
msecs_to_jiffies(timeout));
if (!rc)
hdd_err("session close timeout");
qdf_status = hdd_destroy_and_release_vdev(adapter);
if (QDF_IS_STATUS_ERROR(qdf_status))
hdd_err("vdev delete failed");
}
}
@@ -1885,6 +1890,12 @@ int hdd_init_nan_data_mode(struct hdd_adapter_s *adapter)
goto error_sme_open;
}
status = hdd_create_and_store_vdev(hdd_ctx->hdd_pdev, adapter);
if (QDF_IS_STATUS_ERROR(status)) {
ret_val = -EAGAIN;
goto error_vdev_create;
}
/* Register wireless extensions */
ret_val = hdd_register_wext(wlan_dev);
if (0 > ret_val) {
@@ -1931,6 +1942,10 @@ error_init_txrx:
hdd_unregister_wext(wlan_dev);
error_register_wext:
status = hdd_destroy_and_release_vdev(adapter);
if (QDF_IS_STATUS_ERROR(status))
hdd_err("vdev delete failed");
error_vdev_create:
if (test_bit(SME_SESSION_OPENED, &adapter->event_flags)) {
INIT_COMPLETION(adapter->session_close_comp_var);
if (QDF_STATUS_SUCCESS ==

Fájl megtekintése

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2012-2016 The Linux Foundation. All rights reserved.
* Copyright (c) 2012-2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -52,6 +52,7 @@
#include "p2p_api.h"
#include <lim_ft_defs.h>
#include "wlan_objmgr_psoc_obj.h"
/* Check if this definition can actually move here from halInternal.h even for Volans. In that case */
/* this featurization can be removed. */
@@ -973,6 +974,7 @@ typedef struct sAniSirGlobal {
uint8_t user_configured_nss;
bool sta_prefer_80MHz_over_160MHz;
bool is_11d_hint;
struct wlan_objmgr_psoc *psoc;
} tAniSirGlobal;
typedef enum {

Fájl megtekintése

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2011-2016 The Linux Foundation. All rights reserved.
* Copyright (c) 2011-2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -43,8 +43,8 @@
tSirRetStatus mac_start(tHalHandle hHal, void *pHalMacStartParams);
tSirRetStatus mac_stop(tHalHandle hHal, tHalStopType stopType);
tSirRetStatus mac_open(tHalHandle *pHalHandle, tHddHandle hHdd,
struct cds_config_info *cds_cfg);
tSirRetStatus mac_open(struct wlan_objmgr_psoc *psoc, tHalHandle *pHalHandle,
tHddHandle hHdd, struct cds_config_info *cds_cfg);
tSirRetStatus mac_close(tHalHandle hHal);
#endif /* __MAC_INIT_API_H */

Fájl megtekintése

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2011-2016 The Linux Foundation. All rights reserved.
* Copyright (c) 2011-2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -103,8 +103,8 @@ tSirRetStatus mac_stop(tHalHandle hHal, tHalStopType stopType)
\return tSirRetStatus
-------------------------------------------------------------*/
tSirRetStatus mac_open(tHalHandle *pHalHandle, tHddHandle hHdd,
struct cds_config_info *cds_cfg)
tSirRetStatus mac_open(struct wlan_objmgr_psoc *psoc, tHalHandle *pHalHandle,
tHddHandle hHdd, struct cds_config_info *cds_cfg)
{
tpAniSirGlobal p_mac = NULL;
tSirRetStatus status = eSIR_SUCCESS;
@@ -130,6 +130,9 @@ tSirRetStatus mac_open(tHalHandle *pHalHandle, tHddHandle hHdd,
* dependant)
*/
p_mac->hHdd = hHdd;
/* Increase psoc ref count once APIs are available in object manager */
p_mac->psoc = psoc;
*pHalHandle = (tHalHandle) p_mac;
{
@@ -184,6 +187,8 @@ tSirRetStatus mac_close(tHalHandle hHal)
log_deinit(pMac);
/* Decrease psoc ref count once APIs are available in object manager */
pMac->psoc = NULL;
/* Finally, de-allocate the global MAC datastructure: */
qdf_mem_free(pMac);

Fájl megtekintése

@@ -49,6 +49,7 @@
#include "cdp_txrx_cmn.h"
#include "dbglog.h"
#include "cds_ieee80211_common.h"
#include "wlan_objmgr_psoc_obj.h"
/* Platform specific configuration for max. no. of fragments */
#define QCA_OL_11AC_TX_MAX_FRAGS 2
@@ -1279,6 +1280,7 @@ struct extended_caps {
* @htc_handle: htc handle
* @cds_context: cds handle
* @mac_context: mac context
* @psoc: psoc context
* @wma_ready_event: wma rx ready event
* @wma_resume_event: wma resume event
* @target_suspend: target suspend event
@@ -1411,6 +1413,7 @@ typedef struct {
void *htc_handle;
void *cds_context;
void *mac_context;
struct wlan_objmgr_psoc *psoc;
qdf_event_t wma_ready_event;
qdf_event_t wma_resume_event;
qdf_event_t target_suspend;

Fájl megtekintése

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2012-2016 The Linux Foundation. All rights reserved.
* Copyright (c) 2012-2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -698,7 +698,7 @@ QDF_STATUS wma_tx_packet(void *pWMA,
uint8_t txFlag, uint8_t sessionId, bool tdlsflag,
uint16_t channel_freq);
QDF_STATUS wma_open(void *p_cds_context,
QDF_STATUS wma_open(struct wlan_objmgr_psoc *psoc, void *p_cds_context,
wma_tgt_cfg_cb pTgtUpdCB,
wma_dfs_radar_indication_cb radar_ind_cb,
struct cds_config_info *cds_cfg);

Fájl megtekintése

@@ -1841,7 +1841,7 @@ wma_register_tx_ops_handler(struct wlan_lmac_if_tx_ops *tx_ops)
*/
static void wma_target_if_open(tp_wma_handle wma_handle)
{
struct wlan_objmgr_psoc *psoc = cds_get_psoc_by_id(0);
struct wlan_objmgr_psoc *psoc = wma_handle->psoc;
if (!psoc)
return;
@@ -1862,7 +1862,7 @@ static void wma_target_if_open(tp_wma_handle wma_handle)
*/
static void wma_target_if_close(tp_wma_handle wma_handle)
{
struct wlan_objmgr_psoc *psoc = cds_get_psoc_by_id(0);
struct wlan_objmgr_psoc *psoc = wma_handle->psoc;
if (!psoc)
return;
@@ -1876,6 +1876,7 @@ static void wma_target_if_close(tp_wma_handle wma_handle) {};
/**
* wma_open() - Allocate wma context and initialize it.
* @psoc: Psoc pointer
* @cds_context: cds context
* @wma_tgt_cfg_cb: tgt config callback fun
* @radar_ind_cb: dfs radar indication callback
@@ -1883,7 +1884,7 @@ static void wma_target_if_close(tp_wma_handle wma_handle) {};
*
* Return: 0 on success, errno on failure
*/
QDF_STATUS wma_open(void *cds_context,
QDF_STATUS wma_open(struct wlan_objmgr_psoc *psoc, void *cds_context,
wma_tgt_cfg_cb tgt_cfg_cb,
wma_dfs_radar_indication_cb radar_ind_cb,
struct cds_config_info *cds_cfg)
@@ -1935,6 +1936,9 @@ QDF_STATUS wma_open(void *cds_context,
qdf_wake_lock_create(&wma_handle->wow_wake_lock, "wlan_wow_wl");
}
/* Increase psoc ref count once APIs are available in object manager */
wma_handle->psoc = psoc;
/* Attach mc_thread context processing function */
ops.wma_process_fw_event_handler_cbk = wma_process_fw_event_handler;
/* attach the wmi */
@@ -3528,6 +3532,8 @@ QDF_STATUS wma_close(void *cds_ctx)
wmi_desc_pool_deinit(wma_handle);
}
/* Decrease psoc ref count once APIs are available in object manager */
wma_handle->psoc = NULL;
wma_target_if_close(wma_handle);
WMA_LOGD("%s: Exit", __func__);