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
parent 3eebf18f9b
commit 0672a1213d
14 changed files with 496 additions and 56 deletions

16
Kbuild
View File

@@ -745,6 +745,20 @@ CDS_OBJS := $(CDS_SRC_DIR)/cds_api.o \
$(CDS_SRC_DIR)/cds_utils.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 ###########
BMI_DIR := core/bmi BMI_DIR := core/bmi
@@ -1090,6 +1104,7 @@ INCS += $(HIF_INC) \
$(BMI_INC) \ $(BMI_INC) \
$(HAL_INC) $(HAL_INC)
INCS += $(UMAC_OBJMGR_INC)
INCS += $(TARGET_INC) INCS += $(TARGET_INC)
INCS += $(NLINK_INC) \ INCS += $(NLINK_INC) \
@@ -1134,6 +1149,7 @@ OBJS += $(HIF_OBJS) \
$(HTT_OBJS) \ $(HTT_OBJS) \
$(HAL_OBJS) $(HAL_OBJS)
OBJS += $(UMAC_OBJMGR_OBJS)
OBJS += $(WLAN_LOGGING_OBJS) OBJS += $(WLAN_LOGGING_OBJS)
OBJS += $(NLINK_OBJS) OBJS += $(NLINK_OBJS)
OBJS += $(PTT_OBJS) OBJS += $(PTT_OBJS)

View File

@@ -48,6 +48,7 @@
#include <qdf_threads.h> #include <qdf_threads.h>
#include <qdf_mc_timer.h> #include <qdf_mc_timer.h>
#include <cds_pack_align.h> #include <cds_pack_align.h>
#include <wlan_objmgr_psoc_obj.h>
/* Amount of time to wait for WMA to perform an asynchronous activity. /* 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 * 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_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 * 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_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); void *cds_get_context(QDF_MODULE_ID moduleId);

View File

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

View File

@@ -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. * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
* *
@@ -64,6 +64,12 @@
#include <cdp_txrx_peer_ops.h> #include <cdp_txrx_peer_ops.h>
#include "wlan_hdd_nan_datapath.h" #include "wlan_hdd_nan_datapath.h"
#include "wlan_tgt_def_config.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 Preprocessor definitions and constants
@@ -267,6 +273,9 @@
/* session ID invalid */ /* session ID invalid */
#define HDD_SESSION_ID_INVALID 0xFF #define HDD_SESSION_ID_INVALID 0xFF
/* Default Psoc id */
#define DEFAULT_PSOC_ID 1
/* /*
* Generic asynchronous request/response support * Generic asynchronous request/response support
* *
@@ -903,6 +912,7 @@ struct hdd_adapter_s {
uint32_t magic; uint32_t magic;
void *pHddCtx; void *pHddCtx;
struct wlan_objmgr_vdev *hdd_vdev;
void *txrx_vdev; void *txrx_vdev;
@@ -1299,6 +1309,9 @@ struct hdd_context_s {
/** Global CDS context */ /** Global CDS context */
v_CONTEXT_t pcds_context; v_CONTEXT_t pcds_context;
struct wlan_objmgr_psoc *hdd_psoc;
struct wlan_objmgr_pdev *hdd_pdev;
/** HAL handle...*/ /** HAL handle...*/
tHalHandle hHal; tHalHandle hHal;
@@ -1994,4 +2007,98 @@ static inline int wlan_hdd_validate_session_id(u8 session_id)
bool hdd_is_roaming_in_progress(void); bool hdd_is_roaming_in_progress(void);
void hdd_set_roaming_in_progress(bool value); 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) */ #endif /* end #if !defined(WLAN_HDD_MAIN_H) */

View File

@@ -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. * 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; int we_event;
char *msg; char *msg;
struct qdf_mac_addr peerMacAddr; struct qdf_mac_addr peerMacAddr;
QDF_STATUS qdf_status;
/* Added to find the auth type on the fly at run time */ /* Added to find the auth type on the fly at run time */
/* rather than with cfg to see if FT is enabled */ /* 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; pCsrRoamInfo->chan_info.reg_info_1;
chan_info.reg_info_2 = chan_info.reg_info_2 =
pCsrRoamInfo->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 */ /* send peer status indication to oem app */
hdd_send_peer_status_ind_to_oem_app(&peerMacAddr, hdd_send_peer_status_ind_to_oem_app(&peerMacAddr,
ePeerConnected, ePeerConnected,
@@ -1304,6 +1313,13 @@ static void hdd_send_association_event(struct net_device *dev,
ETH_ALEN); ETH_ALEN);
hdd_err("wlan: new IBSS connection to " MAC_ADDRESS_STR, hdd_err("wlan: new IBSS connection to " MAC_ADDRESS_STR,
MAC_ADDR_ARRAY(pHddStaCtx->conn_info.bssId.bytes)); 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 */ } else { /* Not Associated */
hdd_err("wlan: disconnected"); hdd_err("wlan: disconnected");
memset(wrqu.ap_addr.sa_data, '\0', ETH_ALEN); memset(wrqu.ap_addr.sa_data, '\0', ETH_ALEN);
@@ -1327,6 +1343,13 @@ static void hdd_send_association_event(struct net_device *dev,
NULL, NULL,
pAdapter->device_mode); 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); hdd_lpass_notify_disconnect(pAdapter);
/* Update tdls module about the disconnection event */ /* Update tdls module about the disconnection event */
wlan_hdd_tdls_notify_disconnect(pAdapter); wlan_hdd_tdls_notify_disconnect(pAdapter);
@@ -3310,8 +3333,8 @@ roam_roam_connect_status_update_handler(hdd_adapter_t *pAdapter,
eCsrRoamResult roamResult) eCsrRoamResult roamResult)
{ {
QDF_STATUS qdf_status; QDF_STATUS qdf_status;
hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter); hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
switch (roamResult) { switch (roamResult) {
case eCSR_ROAM_RESULT_IBSS_NEW_PEER: 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; pHddCtx->sta_to_adapter[pRoamInfo->staId] = NULL;
pHddStaCtx->ibss_sta_generation++; 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, cfg80211_del_sta(pAdapter->dev,
(const u8 *)&pRoamInfo->peerMac.bytes, (const u8 *)&pRoamInfo->peerMac.bytes,
GFP_KERNEL); GFP_KERNEL);

View File

@@ -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. * 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, chan_info,
pHostapdAdapter->device_mode); 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); hdd_green_ap_add_sta(pHddCtx);
break; break;
@@ -1783,6 +1795,15 @@ QDF_STATUS hdd_hostapd_sap_event_cb(tpSap_Event pSapEvent,
NULL, NULL,
pHostapdAdapter->device_mode); 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 #ifdef MSM_PLATFORM
/*stop timer in sap/p2p_go */ /*stop timer in sap/p2p_go */
if (pHddApCtx->bApActive == false) { if (pHddApCtx->bApActive == false) {
@@ -5751,7 +5772,6 @@ QDF_STATUS hdd_init_ap_mode(hdd_adapter_t *pAdapter)
struct net_device *dev = pAdapter->dev; struct net_device *dev = pAdapter->dev;
hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter); hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
QDF_STATUS status; QDF_STATUS status;
QDF_STATUS qdf_status;
v_CONTEXT_t p_cds_context = (WLAN_HDD_GET_CTX(pAdapter))->pcds_context; v_CONTEXT_t p_cds_context = (WLAN_HDD_GET_CTX(pAdapter))->pcds_context;
v_CONTEXT_t sapContext = NULL; v_CONTEXT_t sapContext = NULL;
int ret; int ret;
@@ -5788,12 +5808,15 @@ QDF_STATUS hdd_init_ap_mode(hdd_adapter_t *pAdapter)
&session_id); &session_id);
if (!QDF_IS_STATUS_SUCCESS(status)) { if (!QDF_IS_STATUS_SUCCESS(status)) {
hdd_err("ERROR: wlansap_start failed!!"); hdd_err("ERROR: wlansap_start failed!!");
wlansap_close(sapContext);
pAdapter->sessionCtx.ap.sapContext = NULL; pAdapter->sessionCtx.ap.sapContext = NULL;
return status; return status;
} }
pAdapter->sessionId = session_id; 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 */ /* Allocate the Wireless Extensions state structure */
phostapdBuf = WLAN_HDD_GET_HOSTAP_STATE_PTR(pAdapter); 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); status = hdd_set_hostapd(pAdapter);
if (!QDF_IS_STATUS_SUCCESS(status)) { if (!QDF_IS_STATUS_SUCCESS(status)) {
hdd_err("ERROR: hdd_set_hostapd failed!!"); hdd_err("ERROR: hdd_set_hostapd failed!!");
wlansap_close(sapContext); goto error_init_ap_mode;
pAdapter->sessionCtx.ap.sapContext = NULL;
return status;
} }
qdf_status = qdf_event_create(&phostapdBuf->qdf_event); status = qdf_event_create(&phostapdBuf->qdf_event);
if (!QDF_IS_STATUS_SUCCESS(qdf_status)) { if (!QDF_IS_STATUS_SUCCESS(status)) {
hdd_err("ERROR: Hostapd HDD qdf event init failed!!"); hdd_err("ERROR: Hostapd HDD qdf event init failed!!");
wlansap_close(sapContext); goto error_init_ap_mode;
pAdapter->sessionCtx.ap.sapContext = NULL;
return qdf_status;
} }
qdf_status = qdf_event_create(&phostapdBuf->qdf_stop_bss_event); status = qdf_event_create(&phostapdBuf->qdf_stop_bss_event);
if (!QDF_IS_STATUS_SUCCESS(qdf_status)) { if (!QDF_IS_STATUS_SUCCESS(status)) {
hdd_err("ERROR: Hostapd HDD stop bss event init failed!!"); hdd_err("ERROR: Hostapd HDD stop bss event init failed!!");
wlansap_close(sapContext); goto error_init_ap_mode;
pAdapter->sessionCtx.ap.sapContext = NULL;
return qdf_status;
} }
init_completion(&pAdapter->session_close_comp_var); init_completion(&pAdapter->session_close_comp_var);
@@ -5867,6 +5884,11 @@ QDF_STATUS hdd_init_ap_mode(hdd_adapter_t *pAdapter)
error_wmm_init: error_wmm_init:
hdd_softap_deinit_tx_rx(pAdapter); 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); wlansap_close(sapContext);
pAdapter->sessionCtx.ap.sapContext = NULL; pAdapter->sessionCtx.ap.sapContext = NULL;
EXIT(); EXIT();
@@ -6040,6 +6062,10 @@ QDF_STATUS hdd_unregister_hostapd(hdd_adapter_t *pAdapter, bool rtnl_held)
hdd_err("Failed:WLANSAP_close"); hdd_err("Failed:WLANSAP_close");
pAdapter->sessionCtx.ap.sapContext = NULL; pAdapter->sessionCtx.ap.sapContext = NULL;
status = hdd_destroy_and_release_vdev(pAdapter);
if (QDF_IS_STATUS_ERROR(status))
hdd_err("vdev delete failed");
EXIT(); EXIT();
return 0; return 0;
} }

View File

@@ -109,6 +109,12 @@
#include <wlan_hdd_napi.h> #include <wlan_hdd_napi.h>
#include "wlan_hdd_disa.h" #include "wlan_hdd_disa.h"
#include <dispatcher_init_deinit.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 #ifdef MODULE
#define WLAN_MODULE_NAME module_name(THIS_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; struct wma_tgt_cfg *cfg = param;
uint8_t temp_band_cap; uint8_t temp_band_cap;
struct cds_config_info *cds_cfg = cds_get_ini_config(); 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 (cds_cfg) {
if (hdd_ctx->config->enable_sub_20_channel_width != 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; 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)) { if (!QDF_IS_STATUS_SUCCESS(status)) {
hdd_err("Failed to Open CDS: %d", status); hdd_err("Failed to Open CDS: %d", status);
goto ol_cds_free; goto ol_cds_free;
@@ -1832,7 +1851,7 @@ int hdd_wlan_start_modules(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter,
return 0; return 0;
close: close:
cds_close(p_cds_context); cds_close(hdd_ctx->hdd_psoc, p_cds_context);
ol_cds_free: ol_cds_free:
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", hdd_alert("Session is not opened within timeout period code %ld",
rc); rc);
adapter->sessionId = HDD_SESSION_ID_INVALID; adapter->sessionId = HDD_SESSION_ID_INVALID;
status = QDF_STATUS_E_FAILURE; return QDF_STATUS_E_FAILURE;
goto error_sme_open;
} }
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); sme_set_vdev_ies_per_band(hdd_ctx->hHal, adapter->sessionId);
/* Register wireless extensions */ /* Register wireless extensions */
qdf_ret_status = hdd_register_wext(pWlanDev); qdf_ret_status = hdd_register_wext(pWlanDev);
@@ -2742,6 +2764,10 @@ error_wmm_init:
error_init_txrx: error_init_txrx:
hdd_unregister_wext(pWlanDev); hdd_unregister_wext(pWlanDev);
error_register_wext: 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)) { if (test_bit(SME_SESSION_OPENED, &adapter->event_flags)) {
INIT_COMPLETION(adapter->session_close_comp_var); INIT_COMPLETION(adapter->session_close_comp_var);
if (QDF_STATUS_SUCCESS == sme_close_session(hdd_ctx->hHal, 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) bool rtnl_held)
{ {
struct net_device *pWlanDev = NULL; struct net_device *pWlanDev = NULL;
QDF_STATUS qdf_status;
if (adapter) if (adapter)
pWlanDev = adapter->dev; pWlanDev = adapter->dev;
@@ -2902,6 +2929,10 @@ static void hdd_cleanup_adapter(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter,
return; 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); hdd_debugfs_exit(adapter);
if (adapter->scan_info.default_scan_ies) { 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) hdd_adapter_t *adapter)
{ {
unsigned long rc; unsigned long rc;
QDF_STATUS qdf_status;
if (!test_bit(SME_SESSION_OPENED, &adapter->event_flags)) { if (!test_bit(SME_SESSION_OPENED, &adapter->event_flags)) {
hdd_err("session is not opened:%d", adapter->sessionId); 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); clear_bit(SME_SESSION_OPENED, &adapter->event_flags);
return; 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; 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 * Start CDS which starts up the SME/MAC/HAL modules and everything
* else * 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)) { if (!QDF_IS_STATUS_SUCCESS(status)) {
hdd_alert("cds_enable failed"); hdd_alert("cds_enable failed");
@@ -7747,7 +7783,7 @@ hdd_features_deinit:
hdd_deregister_cb(hdd_ctx); hdd_deregister_cb(hdd_ctx);
wlan_hdd_cfg80211_deregister_frames(adapter); wlan_hdd_cfg80211_deregister_frames(adapter);
cds_disable: cds_disable:
cds_disable(hdd_ctx->pcds_context); cds_disable(hdd_ctx->hdd_psoc, hdd_ctx->pcds_context);
out: out:
return -EINVAL; return -EINVAL;
@@ -7778,7 +7814,7 @@ static int hdd_deconfigure_cds(hdd_context_t *hdd_ctx)
ret = -EINVAL; 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)) { if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
hdd_err("Failed to Disable the CDS Modules! :%d", hdd_err("Failed to Disable the CDS Modules! :%d",
qdf_status); qdf_status);
@@ -7810,7 +7846,6 @@ int hdd_wlan_stop_modules(hdd_context_t *hdd_ctx)
ENTER(); ENTER();
qdf_ctx = cds_get_context(QDF_MODULE_ID_QDF_DEVICE); qdf_ctx = cds_get_context(QDF_MODULE_ID_QDF_DEVICE);
if (!qdf_ctx) { if (!qdf_ctx) {
hdd_err("QDF device context NULL"); hdd_err("QDF device context NULL");
@@ -7862,13 +7897,21 @@ int hdd_wlan_stop_modules(hdd_context_t *hdd_ctx)
ret = -EINVAL; ret = -EINVAL;
QDF_ASSERT(0); 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)) { if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
hdd_warn("Failed to stop CDS:%d", qdf_status); hdd_warn("Failed to stop CDS:%d", qdf_status);
ret = -EINVAL; ret = -EINVAL;
QDF_ASSERT(0); 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); hif_ctx = cds_get_context(QDF_MODULE_ID_HIF);
if (!hif_ctx) { if (!hif_ctx) {
hdd_err("Hif context is Null"); hdd_err("Hif context is Null");
@@ -9870,6 +9913,191 @@ bool hdd_is_roaming_in_progress(void)
return hdd_ctx->roaming_in_progress; 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 */ /* Register the module init/exit functions */
module_init(hdd_module_init); module_init(hdd_module_init);
module_exit(hdd_module_exit); module_exit(hdd_module_exit);

View File

@@ -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. * 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; int rc;
hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(adapter); hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
uint32_t timeout = WLAN_WAIT_TIME_SESSIONOPENCLOSE; uint32_t timeout = WLAN_WAIT_TIME_SESSIONOPENCLOSE;
QDF_STATUS qdf_status;
ENTER(); ENTER();
@@ -139,6 +140,10 @@ static int hdd_close_ndi(hdd_adapter_t *adapter)
msecs_to_jiffies(timeout)); msecs_to_jiffies(timeout));
if (!rc) if (!rc)
hdd_err("session close timeout"); 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; 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 */ /* Register wireless extensions */
ret_val = hdd_register_wext(wlan_dev); ret_val = hdd_register_wext(wlan_dev);
if (0 > ret_val) { if (0 > ret_val) {
@@ -1931,6 +1942,10 @@ error_init_txrx:
hdd_unregister_wext(wlan_dev); hdd_unregister_wext(wlan_dev);
error_register_wext: 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)) { if (test_bit(SME_SESSION_OPENED, &adapter->event_flags)) {
INIT_COMPLETION(adapter->session_close_comp_var); INIT_COMPLETION(adapter->session_close_comp_var);
if (QDF_STATUS_SUCCESS == if (QDF_STATUS_SUCCESS ==

View File

@@ -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. * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
* *
@@ -52,6 +52,7 @@
#include "p2p_api.h" #include "p2p_api.h"
#include <lim_ft_defs.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 */ /* Check if this definition can actually move here from halInternal.h even for Volans. In that case */
/* this featurization can be removed. */ /* this featurization can be removed. */
@@ -973,6 +974,7 @@ typedef struct sAniSirGlobal {
uint8_t user_configured_nss; uint8_t user_configured_nss;
bool sta_prefer_80MHz_over_160MHz; bool sta_prefer_80MHz_over_160MHz;
bool is_11d_hint; bool is_11d_hint;
struct wlan_objmgr_psoc *psoc;
} tAniSirGlobal; } tAniSirGlobal;
typedef enum { typedef enum {

View File

@@ -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. * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
* *
@@ -43,8 +43,8 @@
tSirRetStatus mac_start(tHalHandle hHal, void *pHalMacStartParams); tSirRetStatus mac_start(tHalHandle hHal, void *pHalMacStartParams);
tSirRetStatus mac_stop(tHalHandle hHal, tHalStopType stopType); tSirRetStatus mac_stop(tHalHandle hHal, tHalStopType stopType);
tSirRetStatus mac_open(tHalHandle *pHalHandle, tHddHandle hHdd, tSirRetStatus mac_open(struct wlan_objmgr_psoc *psoc, tHalHandle *pHalHandle,
struct cds_config_info *cds_cfg); tHddHandle hHdd, struct cds_config_info *cds_cfg);
tSirRetStatus mac_close(tHalHandle hHal); tSirRetStatus mac_close(tHalHandle hHal);
#endif /* __MAC_INIT_API_H */ #endif /* __MAC_INIT_API_H */

View File

@@ -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. * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
* *
@@ -103,8 +103,8 @@ tSirRetStatus mac_stop(tHalHandle hHal, tHalStopType stopType)
\return tSirRetStatus \return tSirRetStatus
-------------------------------------------------------------*/ -------------------------------------------------------------*/
tSirRetStatus mac_open(tHalHandle *pHalHandle, tHddHandle hHdd, tSirRetStatus mac_open(struct wlan_objmgr_psoc *psoc, tHalHandle *pHalHandle,
struct cds_config_info *cds_cfg) tHddHandle hHdd, struct cds_config_info *cds_cfg)
{ {
tpAniSirGlobal p_mac = NULL; tpAniSirGlobal p_mac = NULL;
tSirRetStatus status = eSIR_SUCCESS; tSirRetStatus status = eSIR_SUCCESS;
@@ -130,6 +130,9 @@ tSirRetStatus mac_open(tHalHandle *pHalHandle, tHddHandle hHdd,
* dependant) * dependant)
*/ */
p_mac->hHdd = hHdd; p_mac->hHdd = hHdd;
/* Increase psoc ref count once APIs are available in object manager */
p_mac->psoc = psoc;
*pHalHandle = (tHalHandle) p_mac; *pHalHandle = (tHalHandle) p_mac;
{ {
@@ -184,6 +187,8 @@ tSirRetStatus mac_close(tHalHandle hHal)
log_deinit(pMac); log_deinit(pMac);
/* Decrease psoc ref count once APIs are available in object manager */
pMac->psoc = NULL;
/* Finally, de-allocate the global MAC datastructure: */ /* Finally, de-allocate the global MAC datastructure: */
qdf_mem_free(pMac); qdf_mem_free(pMac);

View File

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

View File

@@ -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. * 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, uint8_t txFlag, uint8_t sessionId, bool tdlsflag,
uint16_t channel_freq); 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_tgt_cfg_cb pTgtUpdCB,
wma_dfs_radar_indication_cb radar_ind_cb, wma_dfs_radar_indication_cb radar_ind_cb,
struct cds_config_info *cds_cfg); struct cds_config_info *cds_cfg);

View File

@@ -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) 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) if (!psoc)
return; 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) 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) if (!psoc)
return; return;
@@ -1876,6 +1876,7 @@ static void wma_target_if_close(tp_wma_handle wma_handle) {};
/** /**
* wma_open() - Allocate wma context and initialize it. * wma_open() - Allocate wma context and initialize it.
* @psoc: Psoc pointer
* @cds_context: cds context * @cds_context: cds context
* @wma_tgt_cfg_cb: tgt config callback fun * @wma_tgt_cfg_cb: tgt config callback fun
* @radar_ind_cb: dfs radar indication callback * @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 * 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_tgt_cfg_cb tgt_cfg_cb,
wma_dfs_radar_indication_cb radar_ind_cb, wma_dfs_radar_indication_cb radar_ind_cb,
struct cds_config_info *cds_cfg) 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"); 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 */ /* Attach mc_thread context processing function */
ops.wma_process_fw_event_handler_cbk = wma_process_fw_event_handler; ops.wma_process_fw_event_handler_cbk = wma_process_fw_event_handler;
/* attach the wmi */ /* attach the wmi */
@@ -3528,6 +3532,8 @@ QDF_STATUS wma_close(void *cds_ctx)
wmi_desc_pool_deinit(wma_handle); 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_target_if_close(wma_handle);
WMA_LOGD("%s: Exit", __func__); WMA_LOGD("%s: Exit", __func__);