Merge commit '0219ae6' into wlan-cmn.driver.lnx.1.0-dev

Sync up wlan-cmn.driver.lnx.1.0-dev to CAF 5.0.0.160
from 5.0.0.149 release as baseline for subsequent win
and mcl convergence refactoring.

* commit '0219ae6': (554 commits)
  Release 5.0.0.160
  qcacld-3.0: Add wma handler for vdev delete and peer delete responses
  Release 5.0.0.159
  qcacld-3.0: Fix Compilation error on WLAN_FEATURE_11W disabled
  qcacld-3.0: Update channel width and center freq
  qcacld-3.0: Move sta state to not connected after try disconnect
  qcacld-3.0: Remove #ifdef FEATURE_WLAN_LFR from HDD
  qcacld-3.0: Remove RRM ie in Assoc Req based on AP capability
  qcacld-3.0: Fix fw statistics parsing on the host
  qcacld-3.0: Fix IPA-uc callback in NON-SMP system
  qcacld-3.0: SAP DFS-3 Feature support in DFS layer
  qcacld-3.0: SAP DFS-3 Feature support in WMA
  qcacld-3.0: correct phy_mode in hdd_chan_change_notify
  qcacld-3.0: move hif_bus_open to hif_open
  qcacld-3.0: Remove hif_claim_device
  qcacld-3.0: Remove epping context from cds
  qcacld-3.0: Enable Tx beamformee in SAP mode
  qcacld-3.0: Set the IMPS enable/disable based on INI
  qcacld-3.0: Fix memory leak in case of fw reset stats command
  qcacld-3.0: Use appropriate API to get total free descriptors
  ...
  qcacld-3.0: Enable athdiag debug support for SNOC devices
  qcacld-3.0: Remove support of power gating parameters
  qcacld-3.0: Add log in vos_mem_alloc if kzalloc takes more than 3 seconds

Change-Id: I903d2b6edfb715570daffbcfcdb46866f04737dc
CRs-Fixed: 688141
This commit is contained in:
Prakash Dhavali 2016-03-01 09:05:38 -08:00
commit abcec8c47e
245 changed files with 15124 additions and 10344 deletions

30
Kbuild
View file

@ -130,6 +130,9 @@ ifeq ($(KERNEL_BUILD), 0)
CONFIG_WLAN_LRO := n
endif
endif
# Flag to enable LFR Subnet Detection
CONFIG_LFR_SUBNET_DETECTION := y
endif
ifneq ($(CONFIG_MOBILE_ROUTER), y)
@ -250,10 +253,6 @@ CONFIG_FEATURE_SECURE_FIRMWARE := 0
#Flag to enable Stats Ext implementation
CONFIG_FEATURE_STATS_EXT := 1
#Flag to force the inclusion of the 802.11p channels because support
#for these channels has not yet been added to the kernel.
CONFIG_STATICALLY_ADD_11P_CHANNELS := n
ifeq ($(CONFIG_CFG80211),y)
HAVE_CFG80211 := 1
else
@ -338,6 +337,10 @@ ifeq ($(CONFIG_WLAN_FEATURE_MEMDUMP),y)
HDD_OBJS += $(HDD_SRC_DIR)/wlan_hdd_memdump.o
endif
ifeq ($(CONFIG_LFR_SUBNET_DETECTION), y)
HDD_OBJS += $(HDD_SRC_DIR)/wlan_hdd_subnet_detect.o
endif
########### HOST DIAG LOG ###########
HOST_DIAG_LOG_DIR := core/utils/host_diag_log
@ -907,6 +910,10 @@ CDEFINES += -DADRASTEA_SHADOW_REGISTERS
CDEFINES += -DADRASTEA_RRI_ON_DDR
endif
ifneq (y,$(filter y,$(CONFIG_CNSS_EOS) $(CONFIG_ICNSS) $(CONFIG_CNSS_ADRASTEA)))
CDEFINES += -DQCA_WIFI_2_0
endif
ifeq ($(CONFIG_WLAN_FASTPATH), y)
CDEFINES += -DWLAN_FEATURE_FASTPATH
endif
@ -1266,6 +1273,16 @@ ifeq (y, $(filter y, $(CONFIG_CNSS_ADRASTEA) $(CONFIG_ICNSS)))
CDEFINES += -DWLAN_FEATURE_RX_FULL_REORDER_OL
endif
# Enable athdiag procfs debug support for adrastea
ifeq (y, $(filter y, $(CONFIG_CNSS_ADRASTEA) $(CONFIG_ICNSS)))
CDEFINES += -DCONFIG_ATH_PROCFS_DIAG_SUPPORT
endif
# Enable 11AC TX compact feature for adrastea
ifeq (y, $(filter y, $(CONFIG_CNSS_ADRASTEA) $(CONFIG_ICNSS)))
CDEFINES += -DATH_11AC_TXCOMPACT
endif
# NOTE: CONFIG_64BIT_PADDR requires CONFIG_HELIUMPLUS
ifeq (y,$(filter y,$(CONFIG_CNSS_EOS) $(CONFIG_ICNSS)))
CONFIG_HELIUMPLUS := y
@ -1275,6 +1292,7 @@ CONFIG_FEATURE_TSO_DEBUG := y
ifeq ($(CONFIG_HELIUMPLUS),y)
CDEFINES += -DHELIUMPLUS_PADDR64
CDEFINES += -DHELIUMPLUS
CDEFINES += -DAR900B
ifeq ($(CONFIG_64BIT_PADDR),y)
CDEFINES += -DHTT_PADDR64
endif
@ -1308,8 +1326,8 @@ ifeq ($(CONFIG_WLAN_FEATURE_MEMDUMP),y)
CDEFINES += -DWLAN_FEATURE_MEMDUMP
endif
ifeq ($(CONFIG_STATICALLY_ADD_11P_CHANNELS),y)
CDEFINES += -DFEATURE_STATICALLY_ADD_11P_CHANNELS
ifeq ($(CONFIG_LFR_SUBNET_DETECTION), y)
CDEFINES += -DFEATURE_LFR_SUBNET_DETECTION
endif
KBUILD_CPPFLAGS += $(CDEFINES)

View file

@ -107,4 +107,8 @@ config WLAN_FEATURE_RX_WAKELOCK
bool "Enable RX wake lock feature"
default n
config FEATURE_LFR_SUBNET_DETECTION
bool "Enable LFR Subnet Change Detection"
default n
endif # QCA_CLD_WLAN

View file

@ -311,8 +311,6 @@ gEnableDFSChnlScan=1
gAllowDFSChannelRoam=1
gVhtChannelWidth=2
gEnableLogp=1
# Enable Automatic Tx Power control
@ -369,6 +367,9 @@ gEnableRXLDPC=1
#Enable/Disable Tx beamforming
gTxBFEnable=1
#Enable/Disable Tx beamformee in SAP mode
gEnableTxBFeeSAP=1
# Enable Tx beamforming in VHT20MHz
# Valid values are 0,1. If commented out, the default value is 0.
# 0=disable, 1=enable
@ -420,9 +421,6 @@ gEnablePowerSaveOffload=2
#Enable firmware uart print
gEnablefwprint=0
#Enable firmware log
gEnablefwlog=1
#IPA config
gIPAConfig=0
gIPADescSize=800
@ -464,7 +462,7 @@ isP2pDeviceAddrAdministrated=0
gEnableRxThread=1
#Enable NAPI
gEnableNAPI=0
gEnableNAPI=1
# Set Thermal Power limit
TxPower2g=10

View file

@ -1,5 +1,5 @@
/*
* copyright (c) 2014-2015 The Linux Foundation. All rights reserved.
* copyright (c) 2014-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -110,9 +110,8 @@ void bmi_cleanup(struct ol_softc *scn)
CDF_STATUS bmi_done(struct ol_softc *scn)
{
CDF_STATUS status = CDF_STATUS_SUCCESS;
hif_claim_device(scn, scn);
if (IHELIUM_NO_BMI)
if (NO_BMI)
return status;
status = bmi_done_local(scn);
@ -175,7 +174,7 @@ CDF_STATUS bmi_download_firmware(struct ol_softc *scn)
uint32_t address;
int32_t ret;
if (IHELIUM_NO_BMI)
if (NO_BMI)
return CDF_STATUS_SUCCESS; /* no BMI for Q6 bring up */
if (!scn) {

View file

@ -429,7 +429,7 @@ CDF_STATUS bmi_firmware_download(struct ol_softc *scn)
{
CDF_STATUS status;
if (IHELIUM_NO_BMI)
if (NO_BMI)
return CDF_STATUS_SUCCESS;
status = bmi_init(scn);

View file

@ -118,10 +118,10 @@ typedef enum _ATH_BIN_FILE {
ATH_SETUP_FILE,
} ATH_BIN_FILE;
#if defined(QCA_WIFI_3_0_IHELIUM) || defined(QCA_WIFI_3_0_ADRASTEA)
#define IHELIUM_NO_BMI 1
#if defined(QCA_WIFI_3_0_ADRASTEA)
#define NO_BMI 1
#else
#define IHELIUM_NO_BMI 0
#define NO_BMI 0
#endif
CDF_STATUS bmi_execute(uint32_t address, uint32_t *param,

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2014-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2014-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -81,7 +81,7 @@ static int ol_check_fw_hash(const u8 *data, u32 fw_size, ATH_BIN_FILE file)
break;
case ATH_FIRMWARE_FILE:
#ifdef QCA_WIFI_FTM
if (cds_get_conparam() == CDF_FTM_MODE) {
if (cds_get_conparam() == CDF_GLOBAL_FTM_MODE) {
hash = fw_hash.utf;
break;
}
@ -173,7 +173,7 @@ static int __ol_transfer_bin_file(struct ol_softc *scn, ATH_BIN_FILE file,
break;
}
#ifdef QCA_WIFI_FTM
if (cds_get_conparam() == CDF_FTM_MODE) {
if (cds_get_conparam() == CDF_GLOBAL_FTM_MODE) {
#if defined(CONFIG_CNSS)
filename = scn->fw_files.utf_file;
#else
@ -201,7 +201,7 @@ static int __ol_transfer_bin_file(struct ol_softc *scn, ATH_BIN_FILE file,
return 0;
case ATH_BOARD_DATA_FILE:
#ifdef QCA_WIFI_FTM
if (cds_get_conparam() == CDF_FTM_MODE) {
if (cds_get_conparam() == CDF_GLOBAL_FTM_MODE) {
#if defined(CONFIG_CNSS)
filename = scn->fw_files.utf_board_data;
#else
@ -225,7 +225,7 @@ static int __ol_transfer_bin_file(struct ol_softc *scn, ATH_BIN_FILE file,
#endif
break;
case ATH_SETUP_FILE:
if (cds_get_conparam() != CDF_FTM_MODE &&
if (cds_get_conparam() != CDF_GLOBAL_FTM_MODE &&
!WLAN_IS_EPPING_ENABLED(cds_get_conparam())) {
#ifdef CONFIG_CNSS
BMI_INFO("%s: no Setup file defined", __func__);
@ -618,17 +618,17 @@ void ol_target_failure(void *instance, CDF_STATUS status)
}
scn->target_status = OL_TRGET_STATUS_RESET;
if (cds_is_logp_in_progress()) {
BMI_ERR("%s: LOGP is in progress, ignore!\n", __func__);
if (cds_is_driver_recovering()) {
BMI_ERR("%s: Recovery in progress, ignore!\n", __func__);
return;
}
if (cds_is_load_unload_in_progress()) {
if (cds_is_load_or_unload_in_progress()) {
BMI_ERR("%s: Loading/Unloading is in progress, ignore!",
__func__);
return;
}
cds_set_logp_in_progress(true);
cds_set_recovery_in_progress(true);
#ifdef CONFIG_CNSS
ret = hif_check_fw_reg(scn);

View file

@ -62,7 +62,7 @@ static inline void cdf_atomic_init(cdf_atomic_t *v)
*
* Return: The current value of the variable
*/
static inline uint32_t cdf_atomic_read(cdf_atomic_t *v)
static inline int32_t cdf_atomic_read(cdf_atomic_t *v)
{
return __cdf_atomic_read(v);
}
@ -101,6 +101,18 @@ static inline void cdf_atomic_add(int i, cdf_atomic_t *v)
__cdf_atomic_add(i, v);
}
/**
* cdf_atomic_sub() - Subtract a value from an atomic variable.
* @i: the amount by which to decrease the atomic counter
* @v: a pointer to an opaque atomic variable
*
* Return: none
*/
static inline void cdf_atomic_sub(int i, cdf_atomic_t *v)
{
__cdf_atomic_sub(i, v);
}
/**
* cdf_atomic_dec_and_test() - decrement an atomic variable and check if the
* new value is zero
@ -110,7 +122,7 @@ static inline void cdf_atomic_add(int i, cdf_atomic_t *v)
* true (non-zero) if the new value is zero,
* or false (0) if the new value is non-zero
*/
static inline uint32_t cdf_atomic_dec_and_test(cdf_atomic_t *v)
static inline int32_t cdf_atomic_dec_and_test(cdf_atomic_t *v)
{
return __cdf_atomic_dec_and_test(v);
}
@ -132,7 +144,7 @@ static inline void cdf_atomic_set(cdf_atomic_t *v, int i)
*
* Return: The current value of the variable
*/
static inline uint32_t cdf_atomic_inc_return(cdf_atomic_t *v)
static inline int32_t cdf_atomic_inc_return(cdf_atomic_t *v)
{
return __cdf_atomic_inc_return(v);
}

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2014 The Linux Foundation. All rights reserved.
* Copyright (c) 2014, 2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -96,7 +96,6 @@ static inline void cdf_destroy_bh(cdf_handle_t hdl, cdf_bh_t *bh)
/**
* cdf_create_work() - create a work/task queue, This runs in non-interrupt
* context, so can be preempted by H/W & S/W intr
* @hdl: OS handle
* @work: Work instance
* @func: Deferred function to run at bottom half non-interrupt
* context
@ -105,34 +104,20 @@ static inline void cdf_destroy_bh(cdf_handle_t hdl, cdf_bh_t *bh)
* Return: None
*/
static inline void
cdf_create_work(cdf_handle_t hdl, cdf_work_t *work,
cdf_create_work(cdf_work_t *work,
cdf_defer_fn_t func, void *arg)
{
__cdf_init_work(hdl, work, func, arg);
__cdf_init_work(work, func, arg);
}
/**
* cdf_sched_work() - schedule a deferred task on non-interrupt context
* @hdl: OS handle
* @work: Work instance
*
* Return: None
*/
static inline void cdf_sched_work(cdf_handle_t hdl, cdf_work_t *work)
static inline void cdf_schedule_work(cdf_work_t *work)
{
__cdf_sched_work(hdl, work);
__cdf_schedule_work(work);
}
/**
* cdf_destroy_work() - destroy the deferred task (synchronous)
* @hdl: OS handle
* @work: Work instance
*
* Return: None
*/
static inline void cdf_destroy_work(cdf_handle_t hdl, cdf_work_t *work)
{
__cdf_disable_work(hdl, work);
}
#endif /*__CDF_DEFER_H*/

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2014-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2014-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -262,6 +262,16 @@ CDF_STATUS cdf_wake_lock_release(cdf_wake_lock_t *pLock, uint32_t reason);
*/
CDF_STATUS cdf_wake_lock_destroy(cdf_wake_lock_t *pLock);
struct hif_pm_runtime_lock;
typedef struct hif_pm_runtime_lock *cdf_runtime_lock_t;
CDF_STATUS cdf_runtime_pm_get(void);
CDF_STATUS cdf_runtime_pm_put(void);
CDF_STATUS cdf_runtime_pm_prevent_suspend(cdf_runtime_lock_t lock);
CDF_STATUS cdf_runtime_pm_allow_suspend(cdf_runtime_lock_t lock);
cdf_runtime_lock_t cdf_runtime_lock_init(const char *name);
void cdf_runtime_lock_deinit(cdf_runtime_lock_t lock);
/**
* cdf_spinlock_acquire() - acquires a spin lock
* @lock: Spin lock to acquire

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2014-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2014-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -266,7 +266,7 @@ typedef enum {
#define cdf_snprint __cdf_snprint
/**
* typedef enum tCDF_CON_MODE - Concurrency role.
* enum tCDF_ADAPTER_MODE - adapter role.
*
* @CDF_STA_MODE: STA mode
* @CDF_SAP_MODE: SAP mode
@ -282,18 +282,35 @@ typedef enum {
* These are generic IDs that identify the various roles
* in the software system
*/
typedef enum {
enum tCDF_ADAPTER_MODE {
CDF_STA_MODE = 0,
CDF_SAP_MODE = 1,
CDF_P2P_CLIENT_MODE,
CDF_P2P_GO_MODE,
CDF_FTM_MODE = 5,
CDF_FTM_MODE,
CDF_IBSS_MODE,
CDF_P2P_DEVICE_MODE,
CDF_EPPING_MODE,
CDF_OCB_MODE,
CDF_MAX_NO_OF_MODE
} tCDF_CON_MODE;
};
/**
* enum tCDF_GLOBAL_CON_MODE - global config mode when
* driver is loaded.
*
* @CDF_GLOBAL_MISSION_MODE: mission mode (STA, SAP...)
* @CDF_GLOBAL_FTM_MODE: FTM mode
* @CDF_GLOBAL_EPPING_MODE: EPPING mode
* @CDF_GLOBAL_MAX_MODE: Max place holder
*/
enum tCDF_GLOBAL_CON_MODE {
CDF_GLOBAL_MISSION_MODE,
CDF_GLOBAL_FTM_MODE = 5,
CDF_GLOBAL_EPPING_MODE = 8,
CDF_GLOBAL_MAX_MODE
};
#ifdef WLAN_OPEN_P2P_INTERFACE
/* This should match with WLAN_MAX_INTERFACES */
@ -353,6 +370,7 @@ struct cdf_mac_addr {
#define CDF_MAC_ADDR_ZERO_INITIALIZER { { 0, 0, 0, 0, 0, 0 } }
#define CDF_IPV4_ADDR_SIZE (4)
#define CDF_IPV6_ADDR_SIZE (16)
/**
* struct cdf_tso_frag_t - fragments of a single TCP segment
@ -490,4 +508,14 @@ struct cdf_tso_info_t {
*/
#define CDF_CE_TX_PKT_OFFSET_BIT_M 0x0fff0000
/**
* enum cdf_suspend_type - type of suspend
* CDF_SYSTEM_SUSPEND: System suspend triggered wlan suspend
* CDF_RUNTIME_SUSPEND: Runtime pm inactivity timer triggered wlan suspend
*/
enum cdf_suspend_type {
CDF_SYSTEM_SUSPEND,
CDF_RUNTIME_SUSPEND
};
#endif /* if !defined __CDF_TYPES_H */

View file

@ -140,7 +140,7 @@ CDF_INLINE_FN bool cdf_is_macaddr_equal(struct cdf_mac_addr *pMacAddr1,
*
*
* Return: true if the MacAddress is all Zeros
* flase if the MacAddress is not all Zeros.
* false if the MacAddress is not all Zeros.
*
*/
CDF_INLINE_FN bool cdf_is_macaddr_zero(struct cdf_mac_addr *pMacAddr)

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2014-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2014-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -46,6 +46,7 @@
#include "i_host_diag_core_event.h"
#include "cds_api.h"
#include "ani_global.h"
#include "hif.h"
/* Preprocessor Definitions and Constants */
#define LINUX_LOCK_COOKIE 0x12345678
@ -489,3 +490,158 @@ CDF_STATUS cdf_wake_lock_destroy(cdf_wake_lock_t *pLock)
#endif
return CDF_STATUS_SUCCESS;
}
/**
* cdf_runtime_pm_get() - do a get opperation on the device
*
* A get opperation will prevent a runtime suspend untill a
* corresponding put is done. This api should be used when sending
* data.
*
* CONTRARY TO THE REGULAR RUNTIME PM, WHEN THE BUS IS SUSPENDED,
* THIS API WILL ONLY REQUEST THE RESUME AND NOT TO A GET!!!
*
* return: success if the bus is up and a get has been issued
* otherwise an error code.
*/
CDF_STATUS cdf_runtime_pm_get(void)
{
void *ol_sc;
int ret;
ol_sc = cds_get_context(CDF_MODULE_ID_HIF);
if (ol_sc == NULL) {
CDF_ASSERT(0);
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
"%s: HIF context is null!", __func__);
return CDF_STATUS_E_INVAL;
}
ret = hif_pm_runtime_get(ol_sc);
if (ret)
return CDF_STATUS_E_FAILURE;
return CDF_STATUS_SUCCESS;
}
/**
* cdf_runtime_pm_put() - do a put opperation on the device
*
* A put opperation will allow a runtime suspend after a corresponding
* get was done. This api should be used when sending data.
*
* This api will return a failure if the hif module hasn't been initialized
*
* return: CDF_STATUS_SUCCESS if the put is performed
*/
CDF_STATUS cdf_runtime_pm_put(void)
{
void *ol_sc;
int ret;
ol_sc = cds_get_context(CDF_MODULE_ID_HIF);
if (ol_sc == NULL) {
CDF_ASSERT(0);
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
"%s: HIF context is null!", __func__);
return CDF_STATUS_E_INVAL;
}
ret = hif_pm_runtime_put(ol_sc);
if (ret)
return CDF_STATUS_E_FAILURE;
return CDF_STATUS_SUCCESS;
}
/**
* cdf_runtime_pm_prevent_suspend() - prevent a runtime bus suspend
* @lock: an opaque context for tracking
*
* The lock can only be acquired once per lock context and is tracked.
*
* return: CDF_STATUS_SUCCESS or failure code.
*/
CDF_STATUS cdf_runtime_pm_prevent_suspend(cdf_runtime_lock_t lock)
{
void *ol_sc;
int ret;
ol_sc = cds_get_context(CDF_MODULE_ID_HIF);
if (ol_sc == NULL) {
CDF_ASSERT(0);
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
"%s: HIF context is null!", __func__);
return CDF_STATUS_E_INVAL;
}
ret = hif_pm_runtime_prevent_suspend(ol_sc, lock);
if (ret)
return CDF_STATUS_E_FAILURE;
return CDF_STATUS_SUCCESS;
}
/**
* cdf_runtime_pm_prevent_suspend() - prevent a runtime bus suspend
* @lock: an opaque context for tracking
*
* The lock can only be acquired once per lock context and is tracked.
*
* return: CDF_STATUS_SUCCESS or failure code.
*/
CDF_STATUS cdf_runtime_pm_allow_suspend(cdf_runtime_lock_t lock)
{
void *ol_sc;
int ret;
ol_sc = cds_get_context(CDF_MODULE_ID_HIF);
if (ol_sc == NULL) {
CDF_ASSERT(0);
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
"%s: HIF context is null!", __func__);
return CDF_STATUS_E_INVAL;
}
ret = hif_pm_runtime_allow_suspend(ol_sc, lock);
if (ret)
return CDF_STATUS_E_FAILURE;
return CDF_STATUS_SUCCESS;
}
/**
* cdf_runtime_lock_init() - initialize runtime lock
* @name: name of the runtime lock
*
* Initialize a runtime pm lock. This lock can be used
* to prevent the runtime pm system from putting the bus
* to sleep.
*
* Return: runtime_pm_lock_t
*/
cdf_runtime_lock_t cdf_runtime_lock_init(const char *name)
{
return hif_runtime_lock_init(name);
}
/**
* cdf_runtime_lock_deinit() - deinitialize runtime pm lock
* @lock: the lock to deinitialize
*
* Ensures the lock is released. Frees the runtime lock.
*
* Return: void
*/
void cdf_runtime_lock_deinit(cdf_runtime_lock_t lock)
{
hif_runtime_lock_deinit(lock);
}

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2014-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2014-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -247,7 +247,6 @@ static void cdf_timer_clean(void);
*/
void cdf_mc_timer_manager_init(void)
{
/* Initalizing the list with maximum size of 60000 */
cdf_list_init(&cdf_timer_list, 1000);
cdf_spinlock_init(&cdf_timer_list_lock);
return;

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2014-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2014-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -36,6 +36,7 @@
#include "cdf_nbuf.h"
#include "cdf_trace.h"
#include "cdf_lock.h"
#include "cdf_mc_timer.h"
#if defined(CONFIG_CNSS)
#include <net/cnss.h>
@ -47,6 +48,7 @@
#ifdef MEMORY_DEBUG
#include <cdf_list.h>
#include <linux/stacktrace.h>
cdf_list_t cdf_mem_list;
cdf_spinlock_t cdf_mem_list_lock;
@ -56,16 +58,23 @@ static uint8_t WLAN_MEM_HEADER[] = { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
static uint8_t WLAN_MEM_TAIL[] = { 0x80, 0x81, 0x82, 0x83, 0x84, 0x85,
0x86, 0x87 };
#define CDF_MEM_MAX_STACK_TRACE 16
struct s_cdf_mem_struct {
cdf_list_node_t pNode;
char *fileName;
unsigned int lineNum;
unsigned int size;
#ifdef WLAN_OPEN_SOURCE
unsigned long stack_trace[CDF_MEM_MAX_STACK_TRACE];
struct stack_trace trace;
#endif
uint8_t header[8];
};
#endif
/* Preprocessor Definitions and Constants */
#define CDF_GET_MEMORY_TIME_THRESHOLD 3000
/* Type Declarations */
@ -73,6 +82,51 @@ struct s_cdf_mem_struct {
/* External Function implementation */
#ifdef MEMORY_DEBUG
#ifdef WLAN_OPEN_SOURCE
/**
* cdf_mem_save_stack_trace() - Save stack trace of the caller
* @mem_struct: Pointer to the memory structure where to save the stack trace
*
* Return: None
*/
static inline void cdf_mem_save_stack_trace(struct s_cdf_mem_struct *mem_struct)
{
struct stack_trace *trace = &mem_struct->trace;
trace->nr_entries = 0;
trace->max_entries = CDF_MEM_MAX_STACK_TRACE;
trace->entries = mem_struct->stack_trace;
trace->skip = 2;
save_stack_trace(trace);
}
/**
* cdf_mem_print_stack_trace() - Print saved stack trace
* @mem_struct: Pointer to the memory structure which has the saved stack trace
* to be printed
*
* Return: None
*/
static inline void cdf_mem_print_stack_trace(struct s_cdf_mem_struct
*mem_struct)
{
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_FATAL,
"Call stack for the source of leaked memory:");
print_stack_trace(&mem_struct->trace, 1);
}
#else
static inline void cdf_mem_save_stack_trace(struct s_cdf_mem_struct *mem_struct)
{
}
static inline void cdf_mem_print_stack_trace(struct s_cdf_mem_struct
*mem_struct)
{
}
#endif
/**
* cdf_mem_init() - initialize cdf memory debug functionality
@ -142,6 +196,7 @@ void cdf_mem_clean(void)
mleak_cnt = 0;
}
mleak_cnt++;
cdf_mem_print_stack_trace(memStruct);
kfree((void *)memStruct);
}
} while (cdf_status == CDF_STATUS_SUCCESS);
@ -194,6 +249,7 @@ void *cdf_mem_malloc_debug(size_t size, char *fileName, uint32_t lineNum)
void *memPtr = NULL;
uint32_t new_size;
int flags = GFP_KERNEL;
unsigned long time_before_kzalloc;
if (size > (1024 * 1024) || size == 0) {
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
@ -217,8 +273,19 @@ void *cdf_mem_malloc_debug(size_t size, char *fileName, uint32_t lineNum)
flags = GFP_ATOMIC;
new_size = size + sizeof(struct s_cdf_mem_struct) + 8;
time_before_kzalloc = cdf_mc_timer_get_system_time();
memStruct = (struct s_cdf_mem_struct *)kzalloc(new_size, flags);
/**
* If time taken by kmalloc is greater than
* CDF_GET_MEMORY_TIME_THRESHOLD msec
*/
if (cdf_mc_timer_get_system_time() - time_before_kzalloc >=
CDF_GET_MEMORY_TIME_THRESHOLD)
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
"%s: kzalloc took %lu msec for size %zu called from %pS at line %d",
__func__,
cdf_mc_timer_get_system_time() - time_before_kzalloc,
size, (void *)_RET_IP_, lineNum);
if (memStruct != NULL) {
CDF_STATUS cdf_status;
@ -226,6 +293,7 @@ void *cdf_mem_malloc_debug(size_t size, char *fileName, uint32_t lineNum)
memStruct->fileName = fileName;
memStruct->lineNum = lineNum;
memStruct->size = size;
cdf_mem_save_stack_trace(memStruct);
cdf_mem_copy(&memStruct->header[0],
&WLAN_MEM_HEADER[0], sizeof(WLAN_MEM_HEADER));
@ -324,9 +392,9 @@ void cdf_mem_free(void *ptr)
void *cdf_mem_malloc(size_t size)
{
int flags = GFP_KERNEL;
#ifdef CONFIG_WCNSS_MEM_PRE_ALLOC
void *pmem;
#endif
void *memPtr = NULL;
unsigned long time_before_kzalloc;
if (size > (1024 * 1024) || size == 0) {
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
"%s: called with invalid arg; passed in %zu !!",
@ -336,6 +404,7 @@ void *cdf_mem_malloc(size_t size)
#if defined(CONFIG_CNSS) && defined(CONFIG_WCNSS_MEM_PRE_ALLOC)
if (size > WCNSS_PRE_ALLOC_GET_THRESHOLD) {
void *pmem;
pmem = wcnss_prealloc_get(size);
if (NULL != pmem) {
memset(pmem, 0, size);
@ -346,8 +415,20 @@ void *cdf_mem_malloc(size_t size)
if (in_interrupt() || irqs_disabled() || in_atomic())
flags = GFP_ATOMIC;
return kzalloc(size, flags);
time_before_kzalloc = cdf_mc_timer_get_system_time();
memPtr = kzalloc(size, flags);
/**
* If time taken by kmalloc is greater than
* CDF_GET_MEMORY_TIME_THRESHOLD msec
*/
if (cdf_mc_timer_get_system_time() - time_before_kzalloc >=
CDF_GET_MEMORY_TIME_THRESHOLD)
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
"%s: kzalloc took %lu msec for size %zu called from %pS",
__func__,
cdf_mc_timer_get_system_time() - time_before_kzalloc,
size, (void *)_RET_IP_);
return memPtr;
}
/**

View file

@ -40,7 +40,7 @@ static inline CDF_STATUS __cdf_atomic_init(__cdf_atomic_t *v)
return CDF_STATUS_SUCCESS;
}
static inline uint32_t __cdf_atomic_read(__cdf_atomic_t *v)
static inline int32_t __cdf_atomic_read(__cdf_atomic_t *v)
{
return atomic_read(v);
}
@ -60,7 +60,19 @@ static inline void __cdf_atomic_add(int i, __cdf_atomic_t *v)
atomic_add(i, v);
}
static inline uint32_t __cdf_atomic_dec_and_test(__cdf_atomic_t *v)
/**
* cdf_atomic_sub() - Subtract a value from an atomic variable
* @i: the amount by which to decrease the atomic counter
* @v: a pointer to an opaque atomic variable
*
* Return: none
*/
static inline void __cdf_atomic_sub(int i, __cdf_atomic_t *v)
{
atomic_sub(i, v);
}
static inline int32_t __cdf_atomic_dec_and_test(__cdf_atomic_t *v)
{
return atomic_dec_and_test(v);
}
@ -70,7 +82,7 @@ static inline void __cdf_atomic_set(__cdf_atomic_t *v, int i)
atomic_set(v, i);
}
static inline uint32_t __cdf_atomic_inc_return(__cdf_atomic_t *v)
static inline int32_t __cdf_atomic_inc_return(__cdf_atomic_t *v)
{
return atomic_inc_return(v);
}

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2014-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2014-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -52,8 +52,7 @@ typedef struct {
extern void __cdf_defer_func(struct work_struct *work);
static inline CDF_STATUS
__cdf_init_work(cdf_handle_t hdl,
__cdf_work_t *work, cdf_defer_fn_t func, void *arg)
__cdf_init_work(__cdf_work_t *work, cdf_defer_fn_t func, void *arg)
{
/*Initilize func and argument in work struct */
work->fn = func;
@ -66,18 +65,12 @@ __cdf_init_work(cdf_handle_t hdl,
return CDF_STATUS_SUCCESS;
}
static inline CDF_STATUS __cdf_sched_work(cdf_handle_t hdl, __cdf_work_t *work)
static inline CDF_STATUS __cdf_schedule_work(__cdf_work_t *work)
{
schedule_work(&work->work);
return CDF_STATUS_SUCCESS;
}
static inline CDF_STATUS
__cdf_disable_work(cdf_handle_t hdl, __cdf_work_t *work)
{
return CDF_STATUS_SUCCESS;
}
static inline CDF_STATUS __cdf_init_bh(cdf_handle_t hdl,
struct tasklet_struct *bh,
cdf_defer_fn_t func, void *arg)

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2014-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2014-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -55,13 +55,139 @@
*/
#define CDS_WMA_TIMEOUT (15000)
CDF_STATUS cds_alloc_global_context(v_CONTEXT_t *p_cds_context);
/**
* enum cds_driver_state - Driver state
* @CDS_DRIVER_STATE_UNINITIALIZED: Driver is in uninitialized state.
* CDS_DRIVER_STATE_LOADED: Driver is loaded and functional.
* CDS_DRIVER_STATE_LOADING: Driver probe is in progress.
* CDS_DRIVER_STATE_UNLOADING: Driver remove is in progress.
* CDS_DRIVER_STATE_RECOVERING: Recovery in progress.
*/
enum cds_driver_state {
CDS_DRIVER_STATE_UNINITIALIZED = 0,
CDS_DRIVER_STATE_LOADED = BIT(0),
CDS_DRIVER_STATE_LOADING = BIT(1),
CDS_DRIVER_STATE_UNLOADING = BIT(2),
CDS_DRIVER_STATE_RECOVERING = BIT(3),
};
CDF_STATUS cds_free_global_context(v_CONTEXT_t *p_cds_context);
#define __CDS_IS_DRIVER_STATE(_state, _mask) (((_state) & (_mask)) == (_mask))
void cds_set_driver_state(enum cds_driver_state);
void cds_clear_driver_state(enum cds_driver_state);
enum cds_driver_state cds_get_driver_state(void);
/**
* cds_is_driver_loading() - Is driver load in progress
*
* Return: true if driver is loading and false otherwise.
*/
static inline bool cds_is_driver_loading(void)
{
enum cds_driver_state state = cds_get_driver_state();
return __CDS_IS_DRIVER_STATE(state, CDS_DRIVER_STATE_LOADING);
}
/**
* cds_is_driver_unloading() - Is driver unload in progress
*
* Return: true if driver is unloading and false otherwise.
*/
static inline bool cds_is_driver_unloading(void)
{
enum cds_driver_state state = cds_get_driver_state();
return __CDS_IS_DRIVER_STATE(state, CDS_DRIVER_STATE_UNLOADING);
}
/**
* cds_is_driver_recovering() - Is recovery in progress
*
* Return: true if recovery in progress and false otherwise.
*/
static inline bool cds_is_driver_recovering(void)
{
enum cds_driver_state state = cds_get_driver_state();
return __CDS_IS_DRIVER_STATE(state, CDS_DRIVER_STATE_RECOVERING);
}
/**
* cds_is_load_or_unload_in_progress() - Is driver load OR unload in progress
*
* Return: true if driver is loading OR unloading and false otherwise.
*/
static inline bool cds_is_load_or_unload_in_progress(void)
{
enum cds_driver_state state = cds_get_driver_state();
return __CDS_IS_DRIVER_STATE(state, CDS_DRIVER_STATE_LOADING) ||
__CDS_IS_DRIVER_STATE(state, CDS_DRIVER_STATE_UNLOADING);
}
/**
* cds_set_recovery_in_progress() - Set recovery in progress
* @value: value to set
*
* Return: none
*/
static inline void cds_set_recovery_in_progress(uint8_t value)
{
if (value)
cds_set_driver_state(CDS_DRIVER_STATE_RECOVERING);
else
cds_clear_driver_state(CDS_DRIVER_STATE_RECOVERING);
}
/**
* cds_set_load_in_progress() - Set load in progress
* @value: value to set
*
* Return: none
*/
static inline void cds_set_load_in_progress(uint8_t value)
{
if (value)
cds_set_driver_state(CDS_DRIVER_STATE_LOADING);
else
cds_clear_driver_state(CDS_DRIVER_STATE_LOADING);
}
/**
* cds_set_driver_loaded() - Set load completed
* @value: value to set
*
* Return: none
*/
static inline void cds_set_driver_loaded(uint8_t value)
{
if (value)
cds_set_driver_state(CDS_DRIVER_STATE_LOADED);
else
cds_clear_driver_state(CDS_DRIVER_STATE_LOADED);
}
/**
* cds_set_unload_in_progress() - Set unload in progress
* @value: value to set
*
* Return: none
*/
static inline void cds_set_unload_in_progress(uint8_t value)
{
if (value)
cds_set_driver_state(CDS_DRIVER_STATE_UNLOADING);
else
cds_clear_driver_state(CDS_DRIVER_STATE_UNLOADING);
}
v_CONTEXT_t cds_init(void);
void cds_deinit(void);
CDF_STATUS cds_pre_enable(v_CONTEXT_t cds_context);
CDF_STATUS cds_open(v_CONTEXT_t *p_cds_context, uint32_t hddContextSize);
CDF_STATUS cds_open(void);
CDF_STATUS cds_enable(v_CONTEXT_t cds_context);
@ -77,21 +203,13 @@ void *cds_get_context(CDF_MODULE_ID moduleId);
v_CONTEXT_t cds_get_global_context(void);
uint8_t cds_is_logp_in_progress(void);
void cds_set_logp_in_progress(uint8_t value);
uint8_t cds_is_load_unload_in_progress(void);
uint8_t cds_is_unload_in_progress(void);
void cds_set_load_unload_in_progress(uint8_t value);
CDF_STATUS cds_alloc_context(void *p_cds_context, CDF_MODULE_ID moduleID,
void **ppModuleContext, uint32_t size);
CDF_STATUS cds_free_context(void *p_cds_context, CDF_MODULE_ID moduleID,
void *pModuleContext);
CDF_STATUS cds_get_vdev_types(tCDF_CON_MODE mode, uint32_t *type,
CDF_STATUS cds_get_vdev_types(enum tCDF_ADAPTER_MODE mode, uint32_t *type,
uint32_t *subType);
void cds_flush_work(void *work);

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2012-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -463,138 +463,30 @@ struct cds_conc_connection_info {
bool in_use;
};
bool cds_is_connection_in_progress(hdd_context_t *hdd_ctx);
void cds_dump_concurrency_info(hdd_context_t *pHddCtx);
void cds_set_concurrency_mode(hdd_context_t *pHddCtx, tCDF_CON_MODE mode);
void cds_clear_concurrency_mode(hdd_context_t *pHddCtx,
tCDF_CON_MODE mode);
uint32_t cds_get_connection_count(hdd_context_t *hdd_ctx);
/**
* cds_is_sta_connection_pending() - This function will check if sta connection
* is pending or not.
* @hdd_ctx: pointer to hdd context
*
* This function will return the status of flag is_sta_connection_pending
*
* Return: true or false
*/
static inline bool
cds_is_sta_connection_pending(hdd_context_t *hdd_ctx)
{
bool status;
spin_lock(&hdd_ctx->sta_update_info_lock);
status = hdd_ctx->is_sta_connection_pending;
spin_unlock(&hdd_ctx->sta_update_info_lock);
return status;
}
/**
* cds_change_sta_conn_pending_status() - This function will change the value
* of is_sta_connection_pending
* @hdd_ctx: pointer to hdd context
* @value: value to set
*
* This function will change the value of is_sta_connection_pending
*
* Return: none
*/
static inline void
cds_change_sta_conn_pending_status(hdd_context_t *hdd_ctx,
bool value)
{
spin_lock(&hdd_ctx->sta_update_info_lock);
hdd_ctx->is_sta_connection_pending = value;
spin_unlock(&hdd_ctx->sta_update_info_lock);
}
/**
* cds_is_sap_restart_required() - This function will check if sap restart
* is pending or not.
* @hdd_ctx: pointer to hdd context.
*
* This function will return the status of flag is_sap_restart_required.
*
* Return: true or false
*/
static inline bool
cds_is_sap_restart_required(hdd_context_t *hdd_ctx)
{
bool status;
spin_lock(&hdd_ctx->sap_update_info_lock);
status = hdd_ctx->is_sap_restart_required;
spin_unlock(&hdd_ctx->sap_update_info_lock);
return status;
}
/**
* cds_change_sap_restart_required_status() - This function will change the
* value of is_sap_restart_required
* @hdd_ctx: pointer to hdd context
* @value: value to set
*
* This function will change the value of is_sap_restart_required
*
* Return: none
*/
static inline void
cds_change_sap_restart_required_status(hdd_context_t *hdd_ctx,
bool value)
{
spin_lock(&hdd_ctx->sap_update_info_lock);
hdd_ctx->is_sap_restart_required = value;
spin_unlock(&hdd_ctx->sap_update_info_lock);
}
/**
* cds_set_connection_in_progress() - to set the connection in progress flag
* @hdd_ctx: pointer to hdd context
* @value: value to set
*
* This function will set the passed value to connection in progress flag.
* If value is previously being set to true then no need to set it again.
*
* Return: true if value is being set correctly and false otherwise.
*/
static inline bool
cds_set_connection_in_progress(hdd_context_t *hdd_ctx,
bool value)
{
bool status = true;
spin_lock(&hdd_ctx->connection_status_lock);
/*
* if the value is set to true previously and if someone is
* trying to make it true again then it could be some race
* condition being triggered. Avoid this situation by returning
* false
*/
if (hdd_ctx->connection_in_progress && value)
status = false;
else
hdd_ctx->connection_in_progress = value;
spin_unlock(&hdd_ctx->connection_status_lock);
return status;
}
bool cds_is_connection_in_progress(void);
void cds_dump_concurrency_info(void);
void cds_set_concurrency_mode(enum tCDF_ADAPTER_MODE mode);
void cds_clear_concurrency_mode(enum tCDF_ADAPTER_MODE mode);
uint32_t cds_get_connection_count(void);
bool cds_is_sta_connection_pending(void);
void cds_change_sta_conn_pending_status(bool value);
void cds_change_sap_restart_required_status(bool value);
bool cds_set_connection_in_progress(bool value);
int cds_cfg80211_get_concurrency_matrix(struct wiphy *wiphy,
struct wireless_dev *wdev,
const void *data,
int data_len);
uint32_t cds_get_concurrency_mode(void);
CDF_STATUS cds_check_and_restart_sap(hdd_context_t *hdd_ctx,
eCsrRoamResult roam_result,
CDF_STATUS cds_check_and_restart_sap(eCsrRoamResult roam_result,
hdd_station_ctx_t *hdd_sta_ctx);
void cds_handle_conc_rule1(hdd_context_t *hdd_ctx,
hdd_adapter_t *adapter,
void cds_handle_conc_rule1(hdd_adapter_t *adapter,
tCsrRoamProfile *roam_profile);
#ifdef FEATURE_WLAN_CH_AVOID
bool cds_handle_conc_rule2(hdd_context_t *hdd_ctx,
hdd_adapter_t *adapter,
bool cds_handle_conc_rule2(hdd_adapter_t *adapter,
tCsrRoamProfile *roam_profile,
uint32_t *roam_id);
#else
static inline bool cds_handle_conc_rule2(hdd_context_t *hdd_ctx,
hdd_adapter_t *adapter,
static inline bool cds_handle_conc_rule2(hdd_adapter_t *adapter,
tCsrRoamProfile *roam_profile,
uint32_t *roam_id)
{
@ -607,10 +499,11 @@ bool cds_check_for_session_conc(uint8_t session_id, uint8_t channel);
CDF_STATUS cds_handle_conc_multiport(uint8_t session_id, uint8_t channel);
#ifdef FEATURE_WLAN_FORCE_SAP_SCC
void cds_force_sap_on_scc(hdd_context_t *hdd_ctx, eCsrRoamResult roam_result);
void cds_force_sap_on_scc(eCsrRoamResult roam_result,
uint8_t channel_id);
#else
static inline void cds_force_sap_on_scc(hdd_context_t *hdd_ctx,
eCsrRoamResult roam_result)
static inline void cds_force_sap_on_scc(eCsrRoamResult roam_result,
uint8_t channel_id)
{
}
@ -618,19 +511,17 @@ static inline void cds_force_sap_on_scc(hdd_context_t *hdd_ctx,
#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
void cds_check_concurrent_intf_and_restart_sap(
hdd_context_t *hdd_ctx,
hdd_station_ctx_t *hdd_sta_ctx,
hdd_adapter_t *adapter);
#else
static inline void cds_check_concurrent_intf_and_restart_sap(
hdd_context_t *hdd_ctx,
hdd_station_ctx_t *hdd_sta_ctx,
hdd_adapter_t *adapter)
{
}
#endif /* FEATURE_WLAN_MCC_TO_SCC_SWITCH */
uint8_t cds_is_mcc_in_24G(hdd_context_t *hdd_ctx);
uint8_t cds_is_mcc_in_24G(void);
int32_t cds_set_mas(hdd_adapter_t *adapter, uint8_t mas_value);
int cds_set_mcc_p2p_quota(hdd_adapter_t *hostapd_adapter,
uint32_t set_value);
@ -651,58 +542,48 @@ static inline void cds_restart_sap(hdd_adapter_t *ap_adapter)
*/
#ifdef FEATURE_WLAN_STA_AP_MODE_DFS_DISABLE
void cds_check_and_restart_sap_with_non_dfs_acs(hdd_context_t *hdd_ctx);
void cds_check_and_restart_sap_with_non_dfs_acs(void);
#else
static inline void cds_check_and_restart_sap_with_non_dfs_acs(
hdd_context_t *hdd_ctx)
static inline void cds_check_and_restart_sap_with_non_dfs_acs(void)
{
}
#endif /* FEATURE_WLAN_STA_AP_MODE_DFS_DISABLE */
void cds_incr_active_session(hdd_context_t *pHddCtx, tCDF_CON_MODE mode,
void cds_incr_active_session(enum tCDF_ADAPTER_MODE mode,
uint8_t sessionId);
void cds_decr_active_session(hdd_context_t *pHddCtx, tCDF_CON_MODE mode,
void cds_decr_active_session(enum tCDF_ADAPTER_MODE mode,
uint8_t sessionId);
void cds_decr_session_set_pcl(hdd_context_t *hdd_ctx,
tCDF_CON_MODE mode,
void cds_decr_session_set_pcl(enum tCDF_ADAPTER_MODE mode,
uint8_t session_id);
CDF_STATUS cds_init_policy_mgr(hdd_context_t *hdd_ctx);
CDF_STATUS cds_get_pcl(hdd_context_t *hdd_ctx, enum cds_con_mode mode,
CDF_STATUS cds_init_policy_mgr(void);
CDF_STATUS cds_deinit_policy_mgr(void);
CDF_STATUS cds_get_pcl(enum cds_con_mode mode,
uint8_t *pcl_Channels, uint32_t *len);
bool cds_allow_concurrency(hdd_context_t *hdd_ctx, enum cds_con_mode mode,
bool cds_allow_concurrency(enum cds_con_mode mode,
uint8_t channel, enum hw_mode_bandwidth bw);
enum cds_conc_priority_mode cds_get_first_connection_pcl_table_index(
hdd_context_t *hdd_ctx);
enum cds_one_connection_mode cds_get_second_connection_pcl_table_index(
hdd_context_t *hdd_ctx);
enum cds_two_connection_mode cds_get_third_connection_pcl_table_index(
hdd_context_t *hdd_ctx);
CDF_STATUS cds_mode_switch_dbs_to_mcc(hdd_context_t *hdd_ctx);
CDF_STATUS cds_mode_switch_mcc_to_dbs(hdd_context_t *hdd_ctx);
CDF_STATUS cds_incr_connection_count(hdd_context_t *hdd_ctx,
uint32_t vdev_id);
CDF_STATUS cds_update_connection_info(hdd_context_t *hdd_ctx,
uint32_t vdev_id);
CDF_STATUS cds_decr_connection_count(hdd_context_t *hdd_ctx,
uint32_t vdev_id);
enum cds_conc_priority_mode cds_get_first_connection_pcl_table_index(void);
enum cds_one_connection_mode cds_get_second_connection_pcl_table_index(void);
enum cds_two_connection_mode cds_get_third_connection_pcl_table_index(void);
CDF_STATUS cds_incr_connection_count(uint32_t vdev_id);
CDF_STATUS cds_update_connection_info(uint32_t vdev_id);
CDF_STATUS cds_decr_connection_count(uint32_t vdev_id);
CDF_STATUS cds_current_connections_update(uint32_t session_id,
uint8_t channel,
enum cds_conn_update_reason);
bool cds_is_ibss_conn_exist(uint8_t *ibss_channel);
#ifdef MPC_UT_FRAMEWORK
CDF_STATUS cds_incr_connection_count_utfw(hdd_context_t *hdd_ctx,
CDF_STATUS cds_incr_connection_count_utfw(
uint32_t vdev_id, uint32_t tx_streams, uint32_t rx_streams,
uint32_t chain_mask, uint32_t type, uint32_t sub_type,
uint32_t channelid, uint32_t mac_id);
CDF_STATUS cds_update_connection_info_utfw(hdd_context_t *hdd_ctx,
CDF_STATUS cds_update_connection_info_utfw(
uint32_t vdev_id, uint32_t tx_streams, uint32_t rx_streams,
uint32_t chain_mask, uint32_t type, uint32_t sub_type,
uint32_t channelid, uint32_t mac_id);
CDF_STATUS cds_decr_connection_count_utfw(hdd_context_t *hdd_ctx,
CDF_STATUS cds_decr_connection_count_utfw(
uint32_t del_all, uint32_t vdev_id);
struct cds_conc_connection_info *cds_get_conn_info(hdd_context_t *hdd_ctx,
uint32_t *len);
enum cds_pcl_type get_pcl_from_first_conn_table(
enum cds_con_mode type,
struct cds_conc_connection_info *cds_get_conn_info(uint32_t *len);
enum cds_pcl_type get_pcl_from_first_conn_table(enum cds_con_mode type,
enum cds_conc_priority_mode sys_pref);
enum cds_pcl_type get_pcl_from_second_conn_table(
enum cds_one_connection_mode idx, enum cds_con_mode type,
@ -711,39 +592,33 @@ enum cds_pcl_type get_pcl_from_third_conn_table(
enum cds_two_connection_mode idx, enum cds_con_mode type,
enum cds_conc_priority_mode sys_pref, uint8_t dbs_capable);
#else
static inline CDF_STATUS cds_incr_connection_count_utfw(
hdd_context_t *hdd_ctx, uint32_t vdev_id,
static inline CDF_STATUS cds_incr_connection_count_utfw(uint32_t vdev_id,
uint32_t tx_streams, uint32_t rx_streams,
uint32_t chain_mask, uint32_t type, uint32_t sub_type,
uint32_t channelid, uint32_t mac_id)
{
return CDF_STATUS_SUCCESS;
}
static inline CDF_STATUS cds_update_connection_info_utfw(
hdd_context_t *hdd_ctx, uint32_t vdev_id,
static inline CDF_STATUS cds_update_connection_info_utfw(uint32_t vdev_id,
uint32_t tx_streams, uint32_t rx_streams,
uint32_t chain_mask, uint32_t type, uint32_t sub_type,
uint32_t channelid, uint32_t mac_id)
{
return CDF_STATUS_SUCCESS;
}
static inline CDF_STATUS cds_decr_connection_count_utfw(
hdd_context_t *hdd_ctx,
uint32_t del_all, uint32_t vdev_id)
static inline CDF_STATUS cds_decr_connection_count_utfw(uint32_t del_all,
uint32_t vdev_id)
{
return CDF_STATUS_SUCCESS;
}
static inline struct cds_conc_connection_info *cds_get_conn_info(
hdd_context_t *hdd_ctx, uint32_t *len)
static inline struct cds_conc_connection_info *cds_get_conn_info(uint32_t *len)
{
return NULL;
}
#endif
enum cds_con_mode cds_convert_device_mode_to_hdd_type(
device_mode_t device_mode);
uint32_t cds_get_connection_count(hdd_context_t *hdd_ctx);
CDF_STATUS cds_soc_set_hw_mode(hdd_context_t *hdd_ctx,
uint32_t session_id,
CDF_STATUS cds_soc_set_hw_mode(uint32_t session_id,
enum hw_mode_ss_config mac0_ss,
enum hw_mode_bandwidth mac0_bw,
enum hw_mode_ss_config mac1_ss,
@ -751,43 +626,30 @@ CDF_STATUS cds_soc_set_hw_mode(hdd_context_t *hdd_ctx,
enum hw_mode_dbs_capab dbs,
enum hw_mode_agile_dfs_capab dfs,
enum cds_conn_update_reason reason);
enum cds_conc_next_action cds_need_opportunistic_upgrade(
hdd_context_t *hdd_ctx);
CDF_STATUS cds_next_actions(
hdd_context_t *hdd_ctx, uint32_t session_id,
enum cds_conc_next_action cds_need_opportunistic_upgrade(void);
CDF_STATUS cds_next_actions(uint32_t session_id,
enum cds_conc_next_action action,
enum cds_conn_update_reason reason);
void cds_set_dual_mac_scan_config(hdd_context_t *hdd_ctx,
uint8_t dbs_val,
void cds_set_dual_mac_scan_config(uint8_t dbs_val,
uint8_t dbs_plus_agile_scan_val,
uint8_t single_mac_scan_with_dbs_val);
void cds_set_dual_mac_fw_mode_config(hdd_context_t *hdd_ctx,
uint8_t dbs,
void cds_set_dual_mac_fw_mode_config(uint8_t dbs,
uint8_t dfs);
void cds_soc_set_dual_mac_cfg_cb(enum set_hw_mode_status status,
uint32_t scan_config,
uint32_t fw_mode_config);
bool cds_map_concurrency_mode(hdd_context_t *hdd_ctx,
tCDF_CON_MODE *old_mode, enum cds_con_mode *new_mode);
bool cds_map_concurrency_mode(enum tCDF_ADAPTER_MODE *old_mode,
enum cds_con_mode *new_mode);
CDF_STATUS cds_get_channel_from_scan_result(hdd_adapter_t *adapter,
tCsrRoamProfile *roam_profile, uint8_t *channel);
tCDF_CON_MODE cds_get_conparam(void);
enum tCDF_GLOBAL_CON_MODE cds_get_conparam(void);
bool cds_concurrent_open_sessions_running(void);
bool cds_max_concurrent_connections_reached(void);
void cds_clear_concurrent_session_count(void);
bool cds_is_multiple_active_sta_sessions(void);
bool cds_is_sta_active_connection_exists(void);
#ifdef WLAN_FEATURE_MBSSID
bool cds_concurrent_beaconing_sessions_running(void);
#else
static inline bool cds_concurrent_beaconing_sessions_running(void)
{
return true;
}
#endif
CDF_STATUS cdf_wait_for_connection_update(void);
CDF_STATUS cdf_reset_connection_update(void);
CDF_STATUS cdf_set_connection_update(void);

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2014-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2014-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -109,6 +109,9 @@ void cds_pkt_proto_trace_init(void);
---------------------------------------------------------------------------*/
void cds_pkt_proto_trace_close(void);
#else
static inline void cds_pkt_proto_trace_init(void) { }
static inline void cds_pkt_proto_trace_close(void) {}
#endif /* QCA_PKT_PROTO_TRACE */
/**

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2014-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2014-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -39,7 +39,35 @@
#include "cdf_status.h"
#define CDS_COUNTRY_CODE_LEN 2
#define CDS_MAC_ADDRESS_LEN 6
#define CDS_MAC_ADDRESS_LEN 6
#define CDS_CHANNEL_STATE(chan_enum) reg_channels[chan_enum].state
#define CDS_CHANNEL_NUM(chan_enum) chan_mapping[chan_enum].chan_num
#define CDS_CHANNEL_FREQ(chan_enum) chan_mapping[chan_enum].center_freq
#define CDS_IS_DFS_CH(chan_num) (cds_get_channel_state((chan_num)) == \
CHANNEL_STATE_DFS)
#define CDS_IS_PASSIVE_OR_DISABLE_CH(chan_num) \
(cds_get_channel_state(chan_num) != CHANNEL_STATE_ENABLE)
#define CDS_MIN_24GHZ_CHANNEL_NUMBER chan_mapping[MIN_24GHZ_CHANNEL].chan_num
#define CDS_MAX_24GHZ_CHANNEL_NUMBER chan_mapping[MAX_24GHZ_CHANNEL].chan_num
#define CDS_MIN_5GHZ_CHANNEL_NUMBER chan_mapping[MIN_5GHZ_CHANNEL].chan_num
#define CDS_MAX_5GHZ_CHANNEL_NUMBER chan_mapping[MAX_5GHZ_CHANNEL].chan_num
#define CDS_IS_CHANNEL_5GHZ(chan_num) \
((chan_num >= CDS_MIN_5GHZ_CHANNEL_NUMBER) && \
(chan_num <= CDS_MAX_5GHZ_CHANNEL_NUMBER))
#define CDS_IS_CHANNEL_24GHZ(chan_num) \
((chan_num >= CDS_MIN_24GHZ_CHANNEL_NUMBER) && \
(chan_num <= CDS_MAX_24GHZ_CHANNEL_NUMBER))
#define CDS_IS_SAME_BAND_CHANNELS(chan_num1, chan_num2) \
(chan_num1 && chan_num2 && \
(CDS_IS_CHANNEL_5GHZ(chan_num1) == CDS_IS_CHANNEL_5GHZ(chan_num2)))
#define CDS_MIN_11P_CHANNEL chan_mapping[MIN_59GHZ_CHANNEL].chan_num
typedef enum {
REGDOMAIN_FCC,
@ -49,8 +77,7 @@ typedef enum {
REGDOMAIN_COUNT
} v_REGDOMAIN_t;
typedef enum {
/* 2.4GHz Band */
enum channel_enum {
RF_CHAN_1 = 0,
RF_CHAN_2,
RF_CHAN_3,
@ -66,16 +93,6 @@ typedef enum {
RF_CHAN_13,
RF_CHAN_14,
/* 4.9GHz Band */
RF_CHAN_240,
RF_CHAN_244,
RF_CHAN_248,
RF_CHAN_252,
RF_CHAN_208,
RF_CHAN_212,
RF_CHAN_216,
/* 5GHz Low & Mid U-NII Band */
RF_CHAN_36,
RF_CHAN_40,
RF_CHAN_44,
@ -85,7 +102,6 @@ typedef enum {
RF_CHAN_60,
RF_CHAN_64,
/* 5GHz Mid Band - ETSI & FCC */
RF_CHAN_100,
RF_CHAN_104,
RF_CHAN_108,
@ -97,17 +113,14 @@ typedef enum {
RF_CHAN_132,
RF_CHAN_136,
RF_CHAN_140,
RF_CHAN_144,
/* 5GHz High U-NII Band */
RF_CHAN_149,
RF_CHAN_153,
RF_CHAN_157,
RF_CHAN_161,
RF_CHAN_165,
/* 802.11p */
RF_CHAN_170,
RF_CHAN_171,
RF_CHAN_172,
@ -134,19 +147,14 @@ typedef enum {
RF_CHAN_BOND_9,
RF_CHAN_BOND_10,
RF_CHAN_BOND_11,
RF_CHAN_BOND_242, /* 4.9GHz Band */
RF_CHAN_BOND_246,
RF_CHAN_BOND_250,
RF_CHAN_BOND_210,
RF_CHAN_BOND_214,
RF_CHAN_BOND_38, /* 5GHz Low & Mid U-NII Band */
RF_CHAN_BOND_38,
RF_CHAN_BOND_42,
RF_CHAN_BOND_46,
RF_CHAN_BOND_50,
RF_CHAN_BOND_54,
RF_CHAN_BOND_58,
RF_CHAN_BOND_62,
RF_CHAN_BOND_102, /* 5GHz Mid Band - ETSI & FCC */
RF_CHAN_BOND_102,
RF_CHAN_BOND_106,
RF_CHAN_BOND_110,
RF_CHAN_BOND_114,
@ -156,21 +164,19 @@ typedef enum {
RF_CHAN_BOND_130,
RF_CHAN_BOND_134,
RF_CHAN_BOND_138,
RF_CHAN_BOND_142,
RF_CHAN_BOND_151, /* 5GHz High U-NII Band */
RF_CHAN_BOND_151,
RF_CHAN_BOND_155,
RF_CHAN_BOND_159,
RF_CHAN_BOND_163,
NUM_RF_CHANNELS,
MIN_2_4GHZ_CHANNEL = RF_CHAN_1,
MAX_2_4GHZ_CHANNEL = RF_CHAN_14,
NUM_24GHZ_CHANNELS = (MAX_2_4GHZ_CHANNEL - MIN_2_4GHZ_CHANNEL + 1),
MIN_24GHZ_CHANNEL = RF_CHAN_1,
MAX_24GHZ_CHANNEL = RF_CHAN_14,
NUM_24GHZ_CHANNELS = (MAX_24GHZ_CHANNEL - MIN_24GHZ_CHANNEL + 1),
MIN_5GHZ_CHANNEL = RF_CHAN_240,
MIN_5GHZ_CHANNEL = RF_CHAN_36,
MAX_5GHZ_CHANNEL = RF_CHAN_184,
NUM_5GHZ_CHANNELS = (MAX_5GHZ_CHANNEL - MIN_5GHZ_CHANNEL + 1),
@ -184,49 +190,108 @@ typedef enum {
NUM_40MHZ_RF_CHANNELS =
(MAX_40MHZ_RF_CHANNEL - MIN_40MHZ_RF_CHANNEL + 1),
MIN_5_9GHZ_CHANNEL = RF_CHAN_170,
MAX_5_9GHZ_CHANNEL = RF_CHAN_184,
MIN_59GHZ_CHANNEL = RF_CHAN_170,
MAX_59GHZ_CHANNEL = RF_CHAN_184,
INVALID_RF_CHANNEL = 0xBAD,
RF_CHANNEL_INVALID_MAX_FIELD = 0x7FFFFFFF
} eRfChannels;
};
typedef enum {
/**
* enum channel_state: channel state
*
* @CHANNEL_STATE_DISABLE: channel disabled
* @CHANNEL_STATE_ENABLE: tx/rx enabled
* @CHANNEL_STATE_DFS: rx enabled, tx DFS
* @CHANNEL_STATE_INVALID: not a valid channel
*/
enum channel_state {
CHANNEL_STATE_DISABLE,
CHANNEL_STATE_ENABLE,
CHANNEL_STATE_DFS,
CHANNEL_STATE_INVALID
} CHANNEL_STATE;
};
typedef int8_t tPowerdBm;
typedef struct {
uint32_t enabled:4;
/**
* struct regulatory_channel: regulatory channel
*
* @state: channel state
* @flags: channel flags
* @pwr_limit: channel tx power limit
*/
struct regulatory_channel {
uint32_t state:4;
uint32_t flags:28;
tPowerdBm pwrLimit;
} sRegulatoryChannel;
int8_t pwr_limit;
};
typedef struct {
sRegulatoryChannel channels[NUM_RF_CHANNELS];
} sRegulatoryDomain;
/**
* struct chan_map: channel mapping
*
* @center_freq: channel center freq
* @chan_num: channel number
*/
struct chan_map {
uint16_t center_freq;
uint16_t chan_num;
};
typedef struct {
uint16_t targetFreq;
uint16_t channelNum;
} tRfChannelProps;
/**
* struct channel_power: channel power
*
* @chan_num: channel number
* @power: tx power
*/
struct channel_power {
uint8_t chan_num;
int8_t power;
};
typedef struct {
uint8_t chanId;
tPowerdBm pwr;
} tChannelListWithPower;
/**
* enum country_src: country source
*
* @SOURCE_QUERY: source query
* @SOURCE_CORE: source regulatory core
* @SOURCE_DRIVER: source driver
* @SOURCE_USERSPACE: source userspace
* @SOURCE_11D: source 11D
*/
enum country_src {
SOURCE_QUERY,
SOURCE_CORE,
SOURCE_DRIVER,
SOURCE_USERSPACE,
SOURCE_11D
};
typedef enum {
COUNTRY_INIT,
COUNTRY_IE,
COUNTRY_USER,
COUNTRY_QUERY,
COUNTRY_MAX = COUNTRY_QUERY
} v_CountryInfoSource_t;
/**
* struct regulatory: regulatory information
*
* @reg_domain: regulatory domain pair
* @eeprom_rd_ext: eeprom value
* @country_code: current country in integer
* @alpha2: current alpha2
* @def_country: default country alpha2
* @def_region: DFS region
* @ctl_2g: 2G CTL value
* @ctl_5g: 5G CTL value
* @reg_pair: pointer to regulatory pair
* @cc_src: country code src
* @reg_flags: kernel regulatory flags
*/
struct regulatory {
uint32_t reg_domain;
uint32_t eeprom_rd_ext;
uint16_t country_code;
uint8_t alpha2[CDS_COUNTRY_CODE_LEN + 1];
uint8_t def_country[CDS_COUNTRY_CODE_LEN + 1];
uint8_t dfs_region;
uint8_t ctl_2g;
uint8_t ctl_5g;
const void *regpair;
enum country_src cc_src;
uint32_t reg_flags;
};
/**
* enum chan_width: channel width
@ -249,62 +314,33 @@ enum channel_width {
CHAN_WIDTH_160MHZ
};
/**
* @country_code_t : typedef for country code. One extra
* char for holding null character
*/
typedef uint8_t country_code_t[CDS_COUNTRY_CODE_LEN + 1];
typedef struct {
sRegulatoryDomain regDomains[REGDOMAIN_COUNT];
country_code_t default_country;
} t_reg_table;
extern struct regulatory_channel reg_channels[NUM_RF_CHANNELS];
extern const struct chan_map chan_mapping[NUM_RF_CHANNELS];
CDF_STATUS cds_get_reg_domain_from_country_code(v_REGDOMAIN_t *pRegDomain,
const country_code_t countryCode,
v_CountryInfoSource_t source);
const uint8_t *country_alpha2,
enum country_src source);
CDF_STATUS cds_read_default_country(country_code_t default_country);
CDF_STATUS cds_read_default_country(uint8_t *default_country);
CDF_STATUS cds_get_channel_list_with_power(tChannelListWithPower
*pChannels20MHz,
uint8_t *pNum20MHzChannelsFound,
tChannelListWithPower
*pChannels40MHz,
uint8_t *pNum40MHzChannelsFound);
CDF_STATUS cds_get_channel_list_with_power(struct channel_power
*base_channels,
uint8_t *num_base_channels,
struct channel_power
*channel_40mhz,
uint8_t *num_channels_40mhz);
CDF_STATUS cds_set_reg_domain(void *clientCtxt, v_REGDOMAIN_t regId);
CDF_STATUS cds_set_reg_domain(void *client_ctxt, v_REGDOMAIN_t reg_domain);
CHANNEL_STATE cds_get_channel_state(uint32_t rfChannel);
#define CDS_IS_DFS_CH(channel) (cds_get_channel_state((channel)) == \
CHANNEL_STATE_DFS)
#define CDS_IS_PASSIVE_OR_DISABLE_CH(channel) \
(cds_get_channel_state((channel)) != CHANNEL_STATE_ENABLE)
#define CDS_MAX_24GHz_CHANNEL_NUMBER \
(rf_channels[MAX_2_4GHZ_CHANNEL].channelNum)
#define CDS_MIN_5GHz_CHANNEL_NUMBER (rf_channels[RF_CHAN_36].channelNum)
#define CDS_MAX_5GHz_CHANNEL_NUMBER (rf_channels[MAX_5GHZ_CHANNEL].channelNum)
#define CDS_IS_CHANNEL_5GHZ(chnNum) \
(((chnNum) >= CDS_MIN_5GHz_CHANNEL_NUMBER) && ((chnNum) <= CDS_MAX_5GHz_CHANNEL_NUMBER))
#define CDS_IS_CHANNEL_24GHZ(chnNum) \
(((chnNum) > 0) && ((chnNum) <= CDS_MAX_24GHz_CHANNEL_NUMBER))
#define CDS_IS_SAME_BAND_CHANNELS(ch1, ch2) \
(ch1 && ch2 && \
(CDS_IS_CHANNEL_5GHZ(ch1) == CDS_IS_CHANNEL_5GHZ(ch2)))
enum channel_state cds_get_channel_state(uint32_t chan_num);
CDF_STATUS cds_regulatory_init(void);
CDF_STATUS cds_get_dfs_region(uint8_t *dfs_region);
CDF_STATUS cds_set_dfs_region(uint8_t dfs_region);
bool cds_is_dsrc_channel(uint16_t);
CHANNEL_STATE cds_get_bonded_channel_state(uint32_t chan_num,
enum channel_width ch_width);
enum channel_state cds_get_bonded_channel_state(uint32_t chan_num,
enum channel_width chan_width);
enum channel_width cds_get_max_channel_bw(uint32_t chan_num);
#endif /* __CDS_REG_SERVICE_H */

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2011, 2014 The Linux Foundation. All rights reserved.
* Copyright (c) 2011, 2014-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -301,24 +301,6 @@ typedef struct {
uint8_t pwrlvl;
} COMMON_MODE_POWER;
typedef enum {
COUNTRY_CODE_SET_BY_CORE,
COUNTRY_CODE_SET_BY_DRIVER,
COUNTRY_CODE_SET_BY_USER
} COUNTRY_CODE_SOURCE;
struct regulatory {
uint32_t reg_domain;
uint32_t eeprom_rd_ext;
uint16_t country_code;
uint8_t alpha2[3];
uint8_t dfs_region;
uint8_t ctl_2g;
uint8_t ctl_5g;
const void *regpair;
COUNTRY_CODE_SOURCE cc_src;
uint32_t reg_flags;
};
/* Multi-Device RegDomain Support */
typedef struct ath_hal_reg_dmn_tables {
/* regDomainPairs: Map of 8-bit regdomain values to unitary reg domain */
@ -1094,5 +1076,7 @@ int32_t cds_get_country_from_alpha2(uint8_t *alpha2);
void cds_fill_send_ctl_info_to_fw(struct regulatory *reg, uint32_t modesAvail,
uint32_t modeSelect);
void cds_set_wma_dfs_region(struct regulatory *reg);
void cds_set_ch_params(uint8_t ch, uint32_t phy_mode,
chan_params_t *ch_params);
#endif /* REGULATORY_H */

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2014-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2012-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -250,14 +250,9 @@ typedef struct _cds_context_type {
/* MAC Module Context */
void *pMACContext;
#ifndef WLAN_FEATURE_MBSSID
/* SAP Context */
void *pSAPContext;
#endif
cdf_event_t ProbeEvent;
volatile uint8_t isLogpInProgress;
uint32_t driver_state;
cdf_event_t wmaCompleteEvent;
@ -268,7 +263,6 @@ typedef struct _cds_context_type {
void *htc_ctx;
void *epping_ctx;
/*
* cdf_ctx will be used by cdf
* while allocating dma memory
@ -281,8 +275,6 @@ typedef struct _cds_context_type {
/* Configuration handle used to get system configuration */
void *cfg_ctx;
volatile uint8_t isLoadUnloadInProgress;
bool is_wakelock_log_enabled;
uint32_t wakelock_log_level;
uint32_t connectivity_log_level;
@ -292,6 +284,7 @@ typedef struct _cds_context_type {
struct cds_log_complete log_complete;
cdf_spinlock_t bug_report_lock;
cdf_event_t connection_update_done_evt;
cdf_mutex_t cdf_conc_list_lock;
} cds_context_type, *p_cds_contextType;
@ -444,8 +437,7 @@ void cdf_timer_module_init(void);
void cds_ssr_protect_init(void);
void cds_ssr_protect(const char *caller_func);
void cds_ssr_unprotect(const char *caller_func);
bool cds_is_ssr_ready(const char *caller_func);
#define cds_wait_for_work_thread_completion(func) cds_is_ssr_ready(func)
bool cds_wait_for_external_threads_completion(const char *caller_func);
int cds_get_gfp_flags(void);
#endif /* #if !defined __CDS_SCHED_H */

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2014-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2012-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -40,7 +40,6 @@
#include "sme_api.h"
#include "mac_init_api.h"
#include "wlan_qct_sys.h"
#include "wlan_hdd_misc.h"
#include "i_cds_packet.h"
#include "cds_reg_service.h"
#include "wma_types.h"
@ -80,70 +79,56 @@ static uint8_t cds_multicast_logging;
void cds_sys_probe_thread_cback(void *pUserData);
/**
* cds_alloc_global_context() - allocate CDS global context
* @p_cds_context: A pointer to where to store the CDS Context
* cds_init() - Initialize CDS
*
* cds_alloc_global_context() function allocates the CDS global Context,
* but does not initialize all the members. This overal initialization will
* happen at cds_open().
* This function allocates the resource required for CDS, but does not
* initialize all the members. This overall initialization will happen at
* cds_open().
*
* Return: CDF status
* Return: Global context on success and NULL on failure.
*/
CDF_STATUS cds_alloc_global_context(v_CONTEXT_t *p_cds_context)
v_CONTEXT_t cds_init(void)
{
if (p_cds_context == NULL)
return CDF_STATUS_E_FAILURE;
cdf_mc_timer_manager_init();
cdf_mem_init();
/* allocate the CDS Context */
*p_cds_context = NULL;
gp_cds_context = &g_cds_context;
cdf_mem_zero(gp_cds_context, sizeof(cds_context_type));
*p_cds_context = gp_cds_context;
gp_cds_context->cdf_ctx = &g_cdf_ctx;
cdf_mem_zero(&g_cdf_ctx, sizeof(g_cdf_ctx));
/* initialize the spinlock */
cdf_trace_spin_lock_init();
/* it is the right time to initialize MTRACE structures */
#if defined(TRACE_RECORD)
cdf_trace_init();
#endif
cdf_dp_trace_init();
return CDF_STATUS_SUCCESS;
} /* cds_alloc_global_context() */
cds_ssr_protect_init();
return gp_cds_context;
}
/**
* cds_free_global_context() - free CDS global context
* @p_cds_context: A pointer to where the CDS Context was stored
* cds_deinit() - Deinitialize CDS
*
* cds_free_global_context() function frees the CDS Context.
*
* Return: CDF status
* This function frees the CDS resources
*/
CDF_STATUS cds_free_global_context(v_CONTEXT_t *p_cds_context)
void cds_deinit(void)
{
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_INFO,
"%s: De-allocating the CDS Context", __func__);
if (gp_cds_context == NULL)
return;
if ((p_cds_context == NULL) || (*p_cds_context == NULL)) {
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
"%s: vOS Context is Null", __func__);
return CDF_STATUS_E_FAILURE;
}
if (gp_cds_context != *p_cds_context) {
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
"%s: Context mismatch", __func__);
return CDF_STATUS_E_FAILURE;
}
gp_cds_context->cdf_ctx = NULL;
*p_cds_context = gp_cds_context = NULL;
gp_cds_context = NULL;
return CDF_STATUS_SUCCESS;
} /* cds_free_global_context() */
cdf_mem_zero(&g_cds_context, sizeof(g_cds_context));
cdf_mc_timer_exit();
cdf_mem_exit();
return;
}
#ifdef WLAN_FEATURE_NAN
/**
@ -167,8 +152,6 @@ static void cds_set_nan_enable(tMacOpenParameters *param,
/**
* cds_open() - open the CDS Module
* @p_cds_context: A pointer to where the CDS Context was stored
* @hddContextSize: Size of the HDD context to allocate.
*
* cds_open() function opens the CDS Scheduler
* Upon successful initialization:
@ -181,7 +164,7 @@ static void cds_set_nan_enable(tMacOpenParameters *param,
*
* Return: CDF status
*/
CDF_STATUS cds_open(v_CONTEXT_t *p_cds_context, uint32_t hddContextSize)
CDF_STATUS cds_open(void)
{
CDF_STATUS cdf_status = CDF_STATUS_SUCCESS;
int iter = 0;
@ -462,8 +445,6 @@ CDF_STATUS cds_open(v_CONTEXT_t *p_cds_context, uint32_t hddContextSize)
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_INFO_HIGH,
"%s: CDS successfully Opened", __func__);
*p_cds_context = gp_cds_context;
return CDF_STATUS_SUCCESS;
err_sme_close:
@ -851,6 +832,9 @@ CDF_STATUS cds_close(v_CONTEXT_t cds_context)
}
cds_deinit_log_completion();
gp_cds_context->pHDDContext = NULL;
return CDF_STATUS_SUCCESS;
}
@ -878,14 +862,6 @@ void *cds_get_context(CDF_MODULE_ID moduleId)
}
switch (moduleId) {
#ifndef WLAN_FEATURE_MBSSID
case CDF_MODULE_ID_SAP:
{
pModContext = gp_cds_context->pSAPContext;
break;
}
#endif
case CDF_MODULE_ID_HDD:
{
pModContext = gp_cds_context->pHDDContext;
@ -983,113 +959,67 @@ v_CONTEXT_t cds_get_global_context(void)
} /* cds_get_global_context() */
/**
* cds_is_logp_in_progress() - check if ssr/self recovery is going on
* cds_get_driver_state() - Get current driver state
*
* Return: true if ssr/self recvoery is going on else false
* This API returns current driver state stored in global context.
*
* Return: Driver state enum
*/
uint8_t cds_is_logp_in_progress(void)
enum cds_driver_state cds_get_driver_state(void)
{
if (gp_cds_context == NULL) {
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
"%s: global cds context is NULL", __func__);
return 1;
return CDS_DRIVER_STATE_UNINITIALIZED;
}
return gp_cds_context->isLogpInProgress;
return gp_cds_context->driver_state;
}
/**
* cds_set_logp_in_progress() - set ssr/self recovery in progress
* @value: value to set
* cds_set_driver_state() - Set current driver state
* @state: Driver state to be set to.
*
* Return: none
* This API sets driver state to state. This API only sets the state and doesn't
* clear states, please make sure to use cds_clear_driver_state to clear any
* state if required.
*
* Return: None
*/
void cds_set_logp_in_progress(uint8_t value)
void cds_set_driver_state(enum cds_driver_state state)
{
hdd_context_t *pHddCtx = NULL;
if (gp_cds_context == NULL) {
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
"%s: global cds context is NULL", __func__);
"%s: global cds context is NULL: %x", __func__,
state);
return;
}
gp_cds_context->isLogpInProgress = value;
/* HDD uses it's own context variable to check if SSR in progress,
* instead of modifying all HDD APIs set the HDD context variable
* here
*/
pHddCtx = cds_get_context(CDF_MODULE_ID_HDD);
if (!pHddCtx) {
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_FATAL,
"%s: HDD context is Null", __func__);
gp_cds_context->driver_state |= state;
}
/**
* cds_clear_driver_state() - Clear current driver state
* @state: Driver state to be cleared.
*
* This API clears driver state. This API only clears the state, please make
* sure to use cds_set_driver_state to set any new states.
*
* Return: None
*/
void cds_clear_driver_state(enum cds_driver_state state)
{
if (gp_cds_context == NULL) {
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
"%s: global cds context is NULL: %x", __func__,
state);
return;
}
pHddCtx->isLogpInProgress = value;
}
/**
* cds_is_load_unload_in_progress() - check if driver load/unload in progress
*
* Return: true if load/unload is going on else false
*/
uint8_t cds_is_load_unload_in_progress(void)
{
if (gp_cds_context == NULL) {
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
"%s: global cds context is NULL", __func__);
return 0;
}
return gp_cds_context->isLoadUnloadInProgress;
}
/**
* cds_is_unload_in_progress() - check if driver unload in
* progress
*
* Return: true if unload is going on else false
*/
uint8_t cds_is_unload_in_progress(void)
{
hdd_context_t *hdd_ctx = NULL;
if (gp_cds_context == NULL) {
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
"%s: global cds context is NULL", __func__);
return 0;
}
hdd_ctx = cds_get_context(CDF_MODULE_ID_HDD);
if (hdd_ctx == NULL) {
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
"%s: HDD context is NULL", __func__);
return 0;
}
return hdd_ctx->isUnloadInProgress;
}
/**
* cds_set_load_unload_in_progress() - set load/unload in progress
* @value: value to set
*
* Return: none
*/
void cds_set_load_unload_in_progress(uint8_t value)
{
if (gp_cds_context == NULL) {
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
"%s: global cds context is NULL", __func__);
return;
}
gp_cds_context->isLoadUnloadInProgress = value;
#ifdef CONFIG_CNSS
if (value)
cnss_set_driver_status(CNSS_LOAD_UNLOAD);
else
cnss_set_driver_status(CNSS_INITIALIZED);
#endif
gp_cds_context->driver_state &= ~state;
}
/**
@ -1125,15 +1055,6 @@ CDF_STATUS cds_alloc_context(void *p_cds_context, CDF_MODULE_ID moduleID,
}
switch (moduleID) {
#ifndef WLAN_FEATURE_MBSSID
case CDF_MODULE_ID_SAP:
{
pGpModContext = &(gp_cds_context->pSAPContext);
break;
}
#endif
case CDF_MODULE_ID_WMA:
{
pGpModContext = &(gp_cds_context->pWMAContext);
@ -1147,10 +1068,6 @@ CDF_STATUS cds_alloc_context(void *p_cds_context, CDF_MODULE_ID moduleID,
}
case CDF_MODULE_ID_EPPING:
{
pGpModContext = &(gp_cds_context->epping_ctx);
break;
}
case CDF_MODULE_ID_SME:
case CDF_MODULE_ID_PE:
case CDF_MODULE_ID_HDD:
@ -1221,14 +1138,6 @@ CDF_STATUS cds_free_context(void *p_cds_context, CDF_MODULE_ID moduleID,
}
switch (moduleID) {
#ifndef WLAN_FEATURE_MBSSID
case CDF_MODULE_ID_SAP:
{
pGpModContext = &(gp_cds_context->pSAPContext);
break;
}
#endif
case CDF_MODULE_ID_WMA:
{
pGpModContext = &(gp_cds_context->pWMAContext);
@ -1241,18 +1150,13 @@ CDF_STATUS cds_free_context(void *p_cds_context, CDF_MODULE_ID moduleID,
break;
}
case CDF_MODULE_ID_EPPING:
{
pGpModContext = &(gp_cds_context->epping_ctx);
break;
}
case CDF_MODULE_ID_TXRX:
{
pGpModContext = &(gp_cds_context->pdev_txrx_ctx);
break;
}
case CDF_MODULE_ID_EPPING:
case CDF_MODULE_ID_HDD:
case CDF_MODULE_ID_SME:
case CDF_MODULE_ID_PE:
@ -1568,7 +1472,7 @@ CDF_STATUS cds_shutdown(v_CONTEXT_t cds_context)
*
* Return: WMI vdev type
*/
CDF_STATUS cds_get_vdev_types(tCDF_CON_MODE mode, uint32_t *type,
CDF_STATUS cds_get_vdev_types(enum tCDF_ADAPTER_MODE mode, uint32_t *type,
uint32_t *sub_type)
{
CDF_STATUS status = CDF_STATUS_SUCCESS;
@ -1598,7 +1502,8 @@ CDF_STATUS cds_get_vdev_types(tCDF_CON_MODE mode, uint32_t *type,
*type = WMI_VDEV_TYPE_OCB;
break;
default:
hddLog(CDF_TRACE_LEVEL_ERROR, "Invalid device mode %d", mode);
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
"Invalid device mode %d", mode);
status = CDF_STATUS_E_INVAL;
break;
}
@ -1679,12 +1584,12 @@ void cds_trigger_recovery(void)
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
"CRASH_INJECT command is timed out!");
#ifdef CONFIG_CNSS
if (cds_is_logp_in_progress()) {
if (cds_is_driver_recovering()) {
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
"LOGP is in progress, ignore!");
"Recovery is in progress, ignore!");
return;
}
cds_set_logp_in_progress(true);
cds_set_recovery_in_progress(true);
cnss_schedule_recovery_work();
#endif
@ -1726,7 +1631,7 @@ void cds_set_wakelock_logging(bool value)
p_cds_context = cds_get_global_context();
if (!p_cds_context) {
CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
"cds context is Invald");
return;
}
@ -1747,7 +1652,7 @@ bool cds_is_wakelock_enabled(void)
p_cds_context = cds_get_global_context();
if (!p_cds_context) {
CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
"cds context is Invald");
return false;
}
@ -1771,7 +1676,7 @@ void cds_set_ring_log_level(uint32_t ring_id, uint32_t log_level)
p_cds_context = cds_get_global_context();
if (!p_cds_context) {
CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
"%s: cds context is Invald", __func__);
return;
}
@ -1824,7 +1729,7 @@ enum wifi_driver_log_level cds_get_ring_log_level(uint32_t ring_id)
p_cds_context = cds_get_global_context();
if (!p_cds_context) {
CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
"%s: cds context is Invald", __func__);
return WLAN_LOG_LEVEL_OFF;
}
@ -1886,7 +1791,7 @@ void cds_init_log_completion(void)
p_cds_context = cds_get_global_context();
if (!p_cds_context) {
CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
"%s: cds context is Invalid", __func__);
return;
}
@ -1915,7 +1820,7 @@ void cds_deinit_log_completion(void)
p_cds_context = cds_get_global_context();
if (!p_cds_context) {
CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
"%s: cds context is Invalid", __func__);
return;
}
@ -1942,7 +1847,7 @@ CDF_STATUS cds_set_log_completion(uint32_t is_fatal,
p_cds_context = cds_get_global_context();
if (!p_cds_context) {
CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
"%s: cds context is Invalid", __func__);
return CDF_STATUS_E_FAILURE;
}
@ -1974,7 +1879,7 @@ void cds_get_log_completion(uint32_t *is_fatal,
p_cds_context = cds_get_global_context();
if (!p_cds_context) {
CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
"%s: cds context is Invalid", __func__);
return;
}
@ -2000,7 +1905,7 @@ bool cds_is_log_report_in_progress(void)
p_cds_context = cds_get_global_context();
if (!p_cds_context) {
CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
"%s: cds context is Invalid", __func__);
return true;
}
@ -2030,13 +1935,13 @@ CDF_STATUS cds_flush_logs(uint32_t is_fatal,
p_cds_context = cds_get_global_context();
if (!p_cds_context) {
CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
"%s: cds context is Invalid", __func__);
return CDF_STATUS_E_FAILURE;
}
if (cds_is_log_report_in_progress() == true) {
CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
"%s: Bug report already in progress - dropping! type:%d, indicator=%d reason_code=%d",
__func__, is_fatal, indicator, reason_code);
return CDF_STATUS_E_FAILURE;
@ -2044,18 +1949,18 @@ CDF_STATUS cds_flush_logs(uint32_t is_fatal,
status = cds_set_log_completion(is_fatal, indicator, reason_code);
if (CDF_STATUS_SUCCESS != status) {
CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
"%s: Failed to set log trigger params", __func__);
return CDF_STATUS_E_FAILURE;
}
CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_INFO,
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_INFO,
"%s: Triggering bug report: type:%d, indicator=%d reason_code=%d",
__func__, is_fatal, indicator, reason_code);
ret = sme_send_flush_logs_cmd_to_fw(p_cds_context->pMACContext);
if (0 != ret) {
CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
"%s: Failed to send flush FW log", __func__);
cds_init_log_completion();
return CDF_STATUS_E_FAILURE;

File diff suppressed because it is too large Load diff

View file

@ -259,12 +259,9 @@ void cds_pkt_proto_trace_init(void)
/* Init spin lock to protect global memory */
cdf_spinlock_init(&trace_buffer_lock);
trace_buffer_order = 0;
trace_buffer =
cdf_mem_malloc(CDS_PKT_TRAC_MAX_TRACE_BUF *
sizeof(cds_pkt_proto_trace_t));
cdf_mem_zero((void *)trace_buffer,
CDS_PKT_TRAC_MAX_TRACE_BUF *
sizeof(cds_pkt_proto_trace_t));
trace_buffer = cdf_mem_malloc(CDS_PKT_TRAC_MAX_TRACE_BUF *
sizeof(cds_pkt_proto_trace_t));
/* Register callback function to NBUF
* Lower layer event also will be reported to here */

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2014-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2014-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -42,30 +42,20 @@
#define WORLD_SKU_MASK 0x00F0
#define WORLD_SKU_PREFIX 0x0060
#define MAX_COUNTRY_COUNT 300
#define REG_WAIT_TIME 50
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)) || defined(WITH_BACKPORTS)
#define IEEE80211_CHAN_PASSIVE_SCAN IEEE80211_CHAN_NO_IR
#define IEEE80211_CHAN_NO_IBSS IEEE80211_CHAN_NO_IR
#endif
static v_REGDOMAIN_t temp_reg_domain = REGDOMAIN_COUNT;
/* true if init happens thru init time driver hint */
static bool init_by_driver = false;
/* true if init happens thru init time callback from regulatory core.
this should be set to true during driver reload */
static bool init_by_reg_core = false;
#define REG_WAIT_TIME 50
#define REG_RULE_2412_2462 REG_RULE(2412-10, 2462+10, 40, 0, 20, 0)
#define REG_RULE_2467_2472 REG_RULE(2467-10, 2472+10, 40, 0, 20, \
NL80211_RRF_PASSIVE_SCAN)
#define REG_RULE_2484 REG_RULE(2484-10, 2484+10, 40, 0, 20, \
NL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_OFDM)
NL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_OFDM)
#define REG_RULE_5180_5320 REG_RULE(5180-10, 5320+10, 80, 0, 20, \
NL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_IBSS)
@ -133,162 +123,7 @@ static const struct ieee80211_regdomain cds_world_regdom_67_68_6A_6C = {
}
};
typedef struct {
uint8_t regDomain;
country_code_t countryCode;
} CountryInfo_t;
typedef struct {
uint16_t countryCount;
CountryInfo_t countryInfo[MAX_COUNTRY_COUNT];
} CountryInfoTable_t;
static CountryInfoTable_t country_info_table = {
/* the first entry in the table is always the world domain */
138,
{
{REGDOMAIN_WORLD, {'0', '0'}}, /* WORLD DOMAIN */
{REGDOMAIN_FCC, {'A', 'D'}}, /* ANDORRA */
{REGDOMAIN_ETSI, {'A', 'E'}}, /* UAE */
{REGDOMAIN_ETSI, {'A', 'L'}}, /* ALBANIA */
{REGDOMAIN_ETSI, {'A', 'M'}}, /* ARMENIA */
{REGDOMAIN_ETSI, {'A', 'N'}}, /* NETHERLANDS ANTILLES */
{REGDOMAIN_FCC, {'A', 'R'}}, /* ARGENTINA */
{REGDOMAIN_FCC, {'A', 'S'}}, /* AMERICAN SOMOA */
{REGDOMAIN_ETSI, {'A', 'T'}}, /* AUSTRIA */
{REGDOMAIN_FCC, {'A', 'U'}}, /* AUSTRALIA */
{REGDOMAIN_ETSI, {'A', 'W'}}, /* ARUBA */
{REGDOMAIN_ETSI, {'A', 'Z'}}, /* AZERBAIJAN */
{REGDOMAIN_ETSI, {'B', 'A'}}, /* BOSNIA AND HERZEGOVINA */
{REGDOMAIN_FCC, {'B', 'B'}}, /* BARBADOS */
{REGDOMAIN_ETSI, {'B', 'D'}}, /* BANGLADESH */
{REGDOMAIN_ETSI, {'B', 'E'}}, /* BELGIUM */
{REGDOMAIN_ETSI, {'B', 'G'}}, /* BULGARIA */
{REGDOMAIN_ETSI, {'B', 'H'}}, /* BAHRAIN */
{REGDOMAIN_ETSI, {'B', 'L'}}, /* */
{REGDOMAIN_FCC, {'B', 'M'}}, /* BERMUDA */
{REGDOMAIN_ETSI, {'B', 'N'}}, /* BRUNEI DARUSSALAM */
{REGDOMAIN_ETSI, {'B', 'O'}}, /* BOLIVIA */
{REGDOMAIN_ETSI, {'B', 'R'}}, /* BRAZIL */
{REGDOMAIN_FCC, {'B', 'S'}}, /* BAHAMAS */
{REGDOMAIN_ETSI, {'B', 'Y'}}, /* BELARUS */
{REGDOMAIN_ETSI, {'B', 'Z'}}, /* BELIZE */
{REGDOMAIN_FCC, {'C', 'A'}}, /* CANADA */
{REGDOMAIN_ETSI, {'C', 'H'}}, /* SWITZERLAND */
{REGDOMAIN_ETSI, {'C', 'L'}}, /* CHILE */
{REGDOMAIN_FCC, {'C', 'N'}}, /* CHINA */
{REGDOMAIN_FCC, {'C', 'O'}}, /* COLOMBIA */
{REGDOMAIN_ETSI, {'C', 'R'}}, /* COSTA RICA */
{REGDOMAIN_ETSI, {'C', 'S'}},
{REGDOMAIN_ETSI, {'C', 'Y'}}, /* CYPRUS */
{REGDOMAIN_ETSI, {'C', 'Z'}}, /* CZECH REPUBLIC */
{REGDOMAIN_ETSI, {'D', 'E'}}, /* GERMANY */
{REGDOMAIN_ETSI, {'D', 'K'}}, /* DENMARK */
{REGDOMAIN_FCC, {'D', 'O'}}, /* DOMINICAN REPUBLIC */
{REGDOMAIN_ETSI, {'D', 'Z'}}, /* ALGERIA */
{REGDOMAIN_ETSI, {'E', 'C'}}, /* ECUADOR */
{REGDOMAIN_ETSI, {'E', 'E'}}, /* ESTONIA */
{REGDOMAIN_ETSI, {'E', 'G'}}, /* EGYPT */
{REGDOMAIN_ETSI, {'E', 'S'}}, /* SPAIN */
{REGDOMAIN_ETSI, {'F', 'I'}}, /* FINLAND */
{REGDOMAIN_ETSI, {'F', 'R'}}, /* FRANCE */
{REGDOMAIN_ETSI, {'G', 'B'}}, /* UNITED KINGDOM */
{REGDOMAIN_FCC, {'G', 'D'}}, /* GRENADA */
{REGDOMAIN_ETSI, {'G', 'E'}}, /* GEORGIA */
{REGDOMAIN_ETSI, {'G', 'F'}}, /* FRENCH GUIANA */
{REGDOMAIN_ETSI, {'G', 'L'}}, /* GREENLAND */
{REGDOMAIN_ETSI, {'G', 'P'}}, /* GUADELOUPE */
{REGDOMAIN_ETSI, {'G', 'R'}}, /* GREECE */
{REGDOMAIN_FCC, {'G', 'T'}}, /* GUATEMALA */
{REGDOMAIN_FCC, {'G', 'U'}}, /* GUAM */
{REGDOMAIN_ETSI, {'H', 'U'}}, /* HUNGARY */
{REGDOMAIN_FCC, {'I', 'D'}}, /* INDONESIA */
{REGDOMAIN_ETSI, {'I', 'E'}}, /* IRELAND */
{REGDOMAIN_ETSI, {'I', 'L'}}, /* ISRAEL */
{REGDOMAIN_ETSI, {'I', 'N'}}, /* INDIA */
{REGDOMAIN_ETSI, {'I', 'R'}}, /* IRAN, ISLAMIC REPUBLIC OF */
{REGDOMAIN_ETSI, {'I', 'S'}}, /* ICELNAD */
{REGDOMAIN_ETSI, {'I', 'T'}}, /* ITALY */
{REGDOMAIN_FCC, {'J', 'M'}}, /* JAMAICA */
{REGDOMAIN_JAPAN, {'J', 'P'}}, /* JAPAN */
{REGDOMAIN_ETSI, {'J', 'O'}}, /* JORDAN */
{REGDOMAIN_ETSI, {'K', 'E'}}, /* KENYA */
{REGDOMAIN_ETSI, {'K', 'H'}}, /* CAMBODIA */
{REGDOMAIN_ETSI, {'K', 'P'}}, /* KOREA, DEMOCRATIC PEOPLE's REPUBLIC OF */
{REGDOMAIN_ETSI, {'K', 'R'}}, /* KOREA, REPUBLIC OF */
{REGDOMAIN_ETSI, {'K', 'W'}}, /* KUWAIT */
{REGDOMAIN_ETSI, {'K', 'Z'}}, /* KAZAKHSTAN */
{REGDOMAIN_ETSI, {'L', 'B'}}, /* LEBANON */
{REGDOMAIN_ETSI, {'L', 'I'}}, /* LIECHTENSTEIN */
{REGDOMAIN_ETSI, {'L', 'K'}}, /* SRI-LANKA */
{REGDOMAIN_ETSI, {'L', 'T'}}, /* LITHUANIA */
{REGDOMAIN_ETSI, {'L', 'U'}}, /* LUXEMBOURG */
{REGDOMAIN_ETSI, {'L', 'V'}}, /* LATVIA */
{REGDOMAIN_ETSI, {'M', 'A'}}, /* MOROCCO */
{REGDOMAIN_ETSI, {'M', 'C'}}, /* MONACO */
{REGDOMAIN_ETSI, {'M', 'K'}}, /* MACEDONIA, THE FORMER YUGOSLAV REPUBLIC OF */
{REGDOMAIN_FCC, {'M', 'N'}}, /* MONGOLIA */
{REGDOMAIN_FCC, {'M', 'O'}}, /* MACAO */
{REGDOMAIN_FCC, {'M', 'P'}}, /* NORTHERN MARIANA ISLANDS */
{REGDOMAIN_ETSI, {'M', 'Q'}}, /* MARTINIQUE */
{REGDOMAIN_FCC, {'M', 'T'}}, /* MALTA */
{REGDOMAIN_ETSI, {'M', 'U'}}, /* MAURITIUS */
{REGDOMAIN_ETSI, {'M', 'W'}}, /* MALAWI */
{REGDOMAIN_FCC, {'M', 'X'}}, /* MEXICO */
{REGDOMAIN_ETSI, {'M', 'Y'}}, /* MALAYSIA */
{REGDOMAIN_ETSI, {'N', 'G'}}, /* NIGERIA */
{REGDOMAIN_FCC, {'N', 'I'}}, /* NICARAGUA */
{REGDOMAIN_ETSI, {'N', 'L'}}, /* NETHERLANDS */
{REGDOMAIN_ETSI, {'N', 'O'}}, /* NORWAY */
{REGDOMAIN_ETSI, {'N', 'P'}}, /* NEPAL */
{REGDOMAIN_FCC, {'N', 'Z'}}, /* NEW-ZEALAND */
{REGDOMAIN_FCC, {'O', 'M'}}, /* OMAN */
{REGDOMAIN_FCC, {'P', 'A'}}, /* PANAMA */
{REGDOMAIN_ETSI, {'P', 'E'}}, /* PERU */
{REGDOMAIN_ETSI, {'P', 'F'}}, /* FRENCH POLYNESIA */
{REGDOMAIN_ETSI, {'P', 'G'}}, /* PAPUA NEW GUINEA */
{REGDOMAIN_FCC, {'P', 'H'}}, /* PHILIPPINES */
{REGDOMAIN_ETSI, {'P', 'K'}}, /* PAKISTAN */
{REGDOMAIN_ETSI, {'P', 'L'}}, /* POLAND */
{REGDOMAIN_FCC, {'P', 'R'}}, /* PUERTO RICO */
{REGDOMAIN_FCC, {'P', 'S'}}, /* PALESTINIAN TERRITORY, OCCUPIED */
{REGDOMAIN_ETSI, {'P', 'T'}}, /* PORTUGAL */
{REGDOMAIN_FCC, {'P', 'Y'}}, /* PARAGUAY */
{REGDOMAIN_ETSI, {'Q', 'A'}}, /* QATAR */
{REGDOMAIN_ETSI, {'R', 'E'}}, /* REUNION */
{REGDOMAIN_ETSI, {'R', 'O'}}, /* ROMAINIA */
{REGDOMAIN_ETSI, {'R', 'S'}}, /* SERBIA */
{REGDOMAIN_ETSI, {'R', 'U'}}, /* RUSSIA */
{REGDOMAIN_FCC, {'R', 'W'}}, /* RWANDA */
{REGDOMAIN_ETSI, {'S', 'A'}}, /* SAUDI ARABIA */
{REGDOMAIN_ETSI, {'S', 'E'}}, /* SWEDEN */
{REGDOMAIN_ETSI, {'S', 'G'}}, /* SINGAPORE */
{REGDOMAIN_ETSI, {'S', 'I'}}, /* SLOVENNIA */
{REGDOMAIN_ETSI, {'S', 'K'}}, /* SLOVAKIA */
{REGDOMAIN_ETSI, {'S', 'V'}}, /* EL SALVADOR */
{REGDOMAIN_ETSI, {'S', 'Y'}}, /* SYRIAN ARAB REPUBLIC */
{REGDOMAIN_ETSI, {'T', 'H'}}, /* THAILAND */
{REGDOMAIN_ETSI, {'T', 'N'}}, /* TUNISIA */
{REGDOMAIN_ETSI, {'T', 'R'}}, /* TURKEY */
{REGDOMAIN_ETSI, {'T', 'T'}}, /* TRINIDAD AND TOBAGO */
{REGDOMAIN_FCC, {'T', 'W'}}, /* TAIWAN, PRIVINCE OF CHINA */
{REGDOMAIN_FCC, {'T', 'Z'}}, /* TANZANIA, UNITED REPUBLIC OF */
{REGDOMAIN_ETSI, {'U', 'A'}}, /* UKRAINE */
{REGDOMAIN_ETSI, {'U', 'G'}}, /* UGANDA */
{REGDOMAIN_FCC, {'U', 'S'}}, /* USA */
{REGDOMAIN_ETSI, {'U', 'Y'}}, /* URUGUAY */
{REGDOMAIN_FCC, {'U', 'Z'}}, /* UZBEKISTAN */
{REGDOMAIN_ETSI, {'V', 'E'}}, /* VENEZUELA */
{REGDOMAIN_FCC, {'V', 'I'}}, /* VIRGIN ISLANDS, US */
{REGDOMAIN_ETSI, {'V', 'N'}}, /* VIETNAM */
{REGDOMAIN_ETSI, {'Y', 'E'}}, /* YEMEN */
{REGDOMAIN_ETSI, {'Y', 'T'}}, /* MAYOTTE */
{REGDOMAIN_ETSI, {'Z', 'A'}}, /* SOUTH AFRICA */
{REGDOMAIN_ETSI, {'Z', 'W'}}, /* ZIMBABWE */
}
};
const tRfChannelProps rf_channels[NUM_RF_CHANNELS] = {
const struct chan_map chan_mapping[NUM_RF_CHANNELS] = {
{2412, 1},
{2417, 2},
{2422, 3},
@ -303,13 +138,6 @@ const tRfChannelProps rf_channels[NUM_RF_CHANNELS] = {
{2467, 12},
{2472, 13},
{2484, 14},
{4920, 240},
{4940, 244},
{4960, 248},
{4980, 252},
{5040, 208},
{5060, 212},
{5080, 216},
{5180, 36},
{5200, 40},
{5220, 44},
@ -359,11 +187,6 @@ const tRfChannelProps rf_channels[NUM_RF_CHANNELS] = {
{2452, 9},
{2457, 10},
{2462, 11},
{4930, 242},
{4950, 246},
{4970, 250},
{5050, 210},
{5070, 214},
{5190, 38},
{5210, 42},
{5230, 46},
@ -385,27 +208,12 @@ const tRfChannelProps rf_channels[NUM_RF_CHANNELS] = {
{5755, 151},
{5775, 155},
{5795, 159},
{5815, 163, },
{5815, 163},
};
static t_reg_table reg_table;
const sRegulatoryChannel *reg_channels =
reg_table.regDomains[0].channels;
/**
* cds_is_wwr_sku() - is regdomain world sku
* @regd: integer regulatory domain
*
* Return: bool
*/
static inline bool cds_is_wwr_sku(u16 regd)
{
return ((regd & COUNTRY_ERD_FLAG) != COUNTRY_ERD_FLAG) &&
(((regd & WORLD_SKU_MASK) == WORLD_SKU_PREFIX) ||
(regd == WORLD));
}
struct regulatory_channel reg_channels[NUM_RF_CHANNELS];
static bool init_by_driver;
static bool init_by_reg_core;
/**
* cds_is_world_regdomain() - whether world regdomain
@ -413,9 +221,14 @@ static inline bool cds_is_wwr_sku(u16 regd)
*
* Return: bool
*/
bool cds_is_world_regdomain(uint32_t regd)
bool cds_is_world_regdomain(uint32_t reg_domain)
{
return cds_is_wwr_sku(regd & ~WORLDWIDE_ROAMING_FLAG);
uint32_t temp_regd = reg_domain & ~WORLDWIDE_ROAMING_FLAG;
return ((temp_regd & COUNTRY_ERD_FLAG) != COUNTRY_ERD_FLAG) &&
(((temp_regd & WORLD_SKU_MASK) == WORLD_SKU_PREFIX) ||
(temp_regd == WORLD));
}
@ -546,11 +359,11 @@ static void cds_update_regulatory_info(hdd_context_t *hdd_ctx)
*
* Return: CDF_STATUS_SUCCESS
*/
CDF_STATUS cds_get_channel_list_with_power(tChannelListWithPower *
base_channels,
CDF_STATUS cds_get_channel_list_with_power(struct channel_power
*base_channels,
uint8_t *num_base_channels,
tChannelListWithPower *
channels_40mhz,
struct channel_power
*channels_40mhz,
uint8_t *num_40mhz_channels)
{
CDF_STATUS status = CDF_STATUS_SUCCESS;
@ -559,19 +372,19 @@ CDF_STATUS cds_get_channel_list_with_power(tChannelListWithPower *
if (base_channels && num_base_channels) {
count = 0;
for (i = 0; i <= RF_CHAN_14; i++) {
if (reg_channels[i].enabled) {
base_channels[count].chanId =
rf_channels[i].channelNum;
base_channels[count++].pwr =
reg_channels[i].pwrLimit;
if (reg_channels[i].state) {
base_channels[count].chan_num =
chan_mapping[i].chan_num;
base_channels[count++].power =
reg_channels[i].pwr_limit;
}
}
for (i = RF_CHAN_36; i <= RF_CHAN_184; i++) {
if (reg_channels[i].enabled) {
base_channels[count].chanId =
rf_channels[i].channelNum;
base_channels[count++].pwr =
reg_channels[i].pwrLimit;
if (reg_channels[i].state) {
base_channels[count].chan_num =
chan_mapping[i].chan_num;
base_channels[count++].power =
reg_channels[i].pwr_limit;
}
}
*num_base_channels = count;
@ -581,20 +394,20 @@ CDF_STATUS cds_get_channel_list_with_power(tChannelListWithPower *
count = 0;
for (i = RF_CHAN_BOND_3; i <= RF_CHAN_BOND_11; i++) {
if (reg_channels[i].enabled) {
channels_40mhz[count].chanId =
rf_channels[i].channelNum;
channels_40mhz[count++].pwr =
reg_channels[i].pwrLimit;
if (reg_channels[i].state) {
channels_40mhz[count].chan_num =
chan_mapping[i].chan_num;
channels_40mhz[count++].power =
reg_channels[i].pwr_limit;
}
}
for (i = RF_CHAN_BOND_38; i <= RF_CHAN_BOND_163; i++) {
if (reg_channels[i].enabled) {
channels_40mhz[count].chanId =
rf_channels[i].channelNum;
channels_40mhz[count++].pwr =
reg_channels[i].pwrLimit;
if (reg_channels[i].state) {
channels_40mhz[count].chan_num =
chan_mapping[i].chan_num;
channels_40mhz[count++].power =
reg_channels[i].pwr_limit;
}
}
*num_40mhz_channels = count;
@ -609,19 +422,27 @@ CDF_STATUS cds_get_channel_list_with_power(tChannelListWithPower *
*
* Return: CDF_STATUS
*/
CDF_STATUS cds_read_default_country(country_code_t default_country)
CDF_STATUS cds_read_default_country(uint8_t *default_country)
{
CDF_STATUS status = CDF_STATUS_SUCCESS;
hdd_context_t *hdd_ctx;
hdd_ctx = cds_get_context(CDF_MODULE_ID_HDD);
if (!hdd_ctx) {
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
"invalid hdd_ctx pointer");
return CDF_STATUS_E_FAULT;
}
memcpy(default_country,
reg_table.default_country,
sizeof(country_code_t));
hdd_ctx->reg.def_country,
CDS_COUNTRY_CODE_LEN + 1);
pr_info("DefaultCountry is %c%c\n",
default_country[0],
default_country[1]);
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_INFO,
"default country is %c%c\n",
default_country[0],
default_country[1]);
return status;
return CDF_STATUS_SUCCESS;
}
/**
@ -630,12 +451,12 @@ CDF_STATUS cds_read_default_country(country_code_t default_country)
*
* Return: enum for the channel
*/
static eRfChannels cds_get_channel_enum(uint32_t chan_num)
static enum channel_enum cds_get_channel_enum(uint32_t chan_num)
{
uint32_t loop;
for (loop = 0; loop <= RF_CHAN_184; loop++)
if (rf_channels[loop].channelNum == chan_num)
if (chan_mapping[loop].chan_num == chan_num)
return loop;
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
@ -647,19 +468,19 @@ static eRfChannels cds_get_channel_enum(uint32_t chan_num)
/**
* cds_get_channel_state() - get the channel state
* @channel_num: channel number
* @chan_num: channel number
*
* Return: CHANNEL_STATE
* Return: channel state
*/
CHANNEL_STATE cds_get_channel_state(uint32_t chan_num)
enum channel_state cds_get_channel_state(uint32_t chan_num)
{
eRfChannels chan_enum;
enum channel_enum chan_enum;
chan_enum = cds_get_channel_enum(chan_num);
if (INVALID_RF_CHANNEL == chan_enum)
return CHANNEL_STATE_INVALID;
else
return reg_channels[chan_enum].enabled;
return reg_channels[chan_enum].state;
}
@ -667,19 +488,19 @@ CHANNEL_STATE cds_get_channel_state(uint32_t chan_num)
* cds_get_bonded_channel_state() - get the bonded channel state
* @channel_num: channel number
*
* Return: CHANNEL_STATE
* Return: channel state
*/
CHANNEL_STATE cds_get_bonded_channel_state(uint32_t chan_num,
enum channel_state cds_get_bonded_channel_state(uint32_t chan_num,
enum channel_width ch_width)
{
eRfChannels chan_enum;
enum channel_enum chan_enum;
bool bw_enabled = false;
chan_enum = cds_get_channel_enum(chan_num);
if (INVALID_RF_CHANNEL == chan_enum)
return CHANNEL_STATE_INVALID;
if (reg_channels[chan_enum].enabled) {
if (reg_channels[chan_enum].state) {
if (CHAN_WIDTH_5MHZ == ch_width)
bw_enabled = 1;
else if (CHAN_WIDTH_10MHZ == ch_width)
@ -700,7 +521,7 @@ CHANNEL_STATE cds_get_bonded_channel_state(uint32_t chan_num,
}
if (bw_enabled)
return reg_channels[chan_enum].enabled;
return reg_channels[chan_enum].state;
else
return CHANNEL_STATE_DISABLE;
}
@ -713,13 +534,13 @@ CHANNEL_STATE cds_get_bonded_channel_state(uint32_t chan_num,
*/
enum channel_width cds_get_max_channel_bw(uint32_t chan_num)
{
eRfChannels chan_enum;
enum channel_enum chan_enum;
enum channel_width chan_bw = CHAN_WIDTH_0MHZ;
chan_enum = cds_get_channel_enum(chan_num);
if ((INVALID_RF_CHANNEL != chan_enum) &&
(CHANNEL_STATE_DISABLE != reg_channels[chan_enum].enabled)) {
(CHANNEL_STATE_DISABLE != reg_channels[chan_enum].state)) {
if (!(reg_channels[chan_enum].flags &
IEEE80211_CHAN_NO_160MHZ))
@ -755,10 +576,6 @@ static int cds_bw20_ch_index_to_bw40_ch_index(int k)
m = k - RF_CHAN_1 + RF_CHAN_BOND_3;
if (m > RF_CHAN_BOND_11)
m = RF_CHAN_BOND_11;
} else if (k >= RF_CHAN_240 && k <= RF_CHAN_216) {
m = k - RF_CHAN_240 + RF_CHAN_BOND_242;
if (m > RF_CHAN_BOND_214)
m = RF_CHAN_BOND_214;
} else if (k >= RF_CHAN_36 && k <= RF_CHAN_64) {
m = k - RF_CHAN_36 + RF_CHAN_BOND_38;
if (m > RF_CHAN_BOND_62)
@ -786,31 +603,31 @@ static int cds_bw20_ch_index_to_bw40_ch_index(int k)
*/
CDF_STATUS cds_set_dfs_region(uint8_t dfs_region)
{
hdd_context_t *hdd_ctx_ptr = NULL;
hdd_context_t *hdd_ctx;
hdd_ctx_ptr = cds_get_context(CDF_MODULE_ID_HDD);
hdd_ctx = cds_get_context(CDF_MODULE_ID_HDD);
if (NULL == hdd_ctx_ptr)
if (NULL == hdd_ctx)
return CDF_STATUS_E_EXISTS;
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)) || defined(WITH_BACKPORTS)
hdd_ctx_ptr->reg.dfs_region = dfs_region;
hdd_ctx->reg.dfs_region = dfs_region;
#else
/* remap the ctl code to dfs region code */
switch (hdd_ctx_ptr->reg.ctl_5g) {
switch (hdd_ctx->reg.ctl_5g) {
case FCC:
hdd_ctx_ptr->reg.dfs_region = DFS_FCC_DOMAIN;
hdd_ctx->reg.dfs_region = DFS_FCC_DOMAIN;
break;
case ETSI:
hdd_ctx_ptr->reg.dfs_region = DFS_ETSI_DOMAIN;
hdd_ctx->reg.dfs_region = DFS_ETSI_DOMAIN;
break;
case MKK:
hdd_ctx_ptr->reg.dfs_region = DFS_MKK4_DOMAIN;
hdd_ctx->reg.dfs_region = DFS_MKK4_DOMAIN;
break;
default:
/* set default dfs_region to FCC */
hdd_ctx_ptr->reg.dfs_region = DFS_FCC_DOMAIN;
hdd_ctx->reg.dfs_region = DFS_FCC_DOMAIN;
break;
}
#endif
@ -826,14 +643,14 @@ CDF_STATUS cds_set_dfs_region(uint8_t dfs_region)
*/
CDF_STATUS cds_get_dfs_region(uint8_t *dfs_region)
{
hdd_context_t *hdd_ctx_ptr = NULL;
hdd_context_t *hdd_ctx;
hdd_ctx_ptr = cds_get_context(CDF_MODULE_ID_HDD);
hdd_ctx = cds_get_context(CDF_MODULE_ID_HDD);
if (NULL == hdd_ctx_ptr)
if (NULL == hdd_ctx)
return CDF_STATUS_E_EXISTS;
*dfs_region = hdd_ctx_ptr->reg.dfs_region;
*dfs_region = hdd_ctx->reg.dfs_region;
return CDF_STATUS_SUCCESS;
}
@ -847,14 +664,11 @@ CDF_STATUS cds_get_dfs_region(uint8_t *dfs_region)
* CDF_STATUS_E_EMPTY country table empty
*/
CDF_STATUS cds_get_reg_domain_from_country_code(v_REGDOMAIN_t *reg_domain_ptr,
const country_code_t
country_code,
v_CountryInfoSource_t source)
const uint8_t *country_alpha2,
enum country_src source)
{
v_CONTEXT_t cds_context = NULL;
hdd_context_t *hdd_ctx = NULL;
struct wiphy *wiphy = NULL;
int i;
if (NULL == reg_domain_ptr) {
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
@ -862,26 +676,24 @@ CDF_STATUS cds_get_reg_domain_from_country_code(v_REGDOMAIN_t *reg_domain_ptr,
return CDF_STATUS_E_FAULT;
}
*reg_domain_ptr = REGDOMAIN_COUNT;
*reg_domain_ptr = 0;
if (NULL == country_code) {
if (SOURCE_QUERY == source)
return CDF_STATUS_SUCCESS;
if (NULL == country_alpha2) {
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
("Country code array is NULL"));
return CDF_STATUS_E_FAULT;
}
if (0 == country_info_table.countryCount) {
if (cds_is_driver_recovering()) {
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
("Reg domain table is empty"));
return CDF_STATUS_E_EMPTY;
"SSR in progress, return");
return CDF_STATUS_SUCCESS;
}
cds_context = cds_get_global_context();
if (NULL != cds_context)
hdd_ctx = cds_get_context(CDF_MODULE_ID_HDD);
else
return CDF_STATUS_E_EXISTS;
hdd_ctx = cds_get_context(CDF_MODULE_ID_HDD);
if (NULL == hdd_ctx) {
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
@ -891,51 +703,19 @@ CDF_STATUS cds_get_reg_domain_from_country_code(v_REGDOMAIN_t *reg_domain_ptr,
wiphy = hdd_ctx->wiphy;
if (cds_is_logp_in_progress()) {
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
"SSR in progress, return");
*reg_domain_ptr = temp_reg_domain;
return CDF_STATUS_SUCCESS;
}
temp_reg_domain = REGDOMAIN_COUNT;
for (i = 0; i < country_info_table.countryCount &&
REGDOMAIN_COUNT == temp_reg_domain; i++) {
if (memcmp(country_code,
country_info_table.countryInfo[i].countryCode,
CDS_COUNTRY_CODE_LEN) == 0) {
temp_reg_domain =
country_info_table.countryInfo[i].regDomain;
break;
}
}
if (REGDOMAIN_COUNT == temp_reg_domain) {
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
("Country does not map to any Regulatory domain"));
temp_reg_domain = REGDOMAIN_WORLD;
}
if (COUNTRY_QUERY == source) {
*reg_domain_ptr = temp_reg_domain;
return CDF_STATUS_SUCCESS;
}
if ((COUNTRY_INIT == source) && (false == init_by_reg_core)) {
if ((SOURCE_DRIVER == source) && (false == init_by_reg_core)) {
init_by_driver = true;
if (('0' != country_code[0]) || ('0' != country_code[1])) {
if (('0' != country_alpha2[0]) || ('0' != country_alpha2[1])) {
INIT_COMPLETION(hdd_ctx->reg_init);
regulatory_hint(wiphy, country_code);
regulatory_hint(wiphy, country_alpha2);
wait_for_completion_timeout(&hdd_ctx->reg_init,
msecs_to_jiffies(REG_WAIT_TIME));
}
} else if (COUNTRY_IE == source || COUNTRY_USER == source) {
regulatory_hint_user(country_code,
} else if (SOURCE_11D == source || SOURCE_USERSPACE == source) {
regulatory_hint_user(country_alpha2,
NL80211_USER_REG_HINT_USER);
}
*reg_domain_ptr = temp_reg_domain;
return CDF_STATUS_SUCCESS;
}
@ -948,26 +728,13 @@ CDF_STATUS cds_get_reg_domain_from_country_code(v_REGDOMAIN_t *reg_domain_ptr,
*/
bool cds_is_dsrc_channel(uint16_t center_freq)
{
switch (center_freq) {
case 5852:
case 5860:
case 5870:
case 5880:
case 5890:
case 5900:
case 5910:
case 5920:
case 5875:
case 5905:
if (center_freq >= 5852 &&
center_freq <= 5920)
return 1;
}
return 0;
}
#ifdef FEATURE_STATICALLY_ADD_11P_CHANNELS
#define DEFAULT_11P_POWER (30)
#endif
/**
* cds_process_regulatory_data() - process regulatory data
* @wiphy: wiphy
@ -976,16 +743,15 @@ bool cds_is_dsrc_channel(uint16_t center_freq)
* Return: int
*/
static int cds_process_regulatory_data(struct wiphy *wiphy,
uint8_t band_capability, bool reset)
uint8_t band_capability,
bool reset)
{
int i, j, m;
int k = 0, n = 0;
hdd_context_t *hdd_ctx;
const struct ieee80211_reg_rule *reg_rule;
struct ieee80211_channel *chan;
sRegulatoryChannel *temp_chan_k;
sRegulatoryChannel *temp_chan_n;
sRegulatoryChannel *temp_chan;
struct regulatory_channel *temp_chan_k, *temp_chan_n, *temp_chan;
hdd_ctx = cds_get_context(CDF_MODULE_ID_HDD);
if (NULL == hdd_ctx) {
@ -1023,13 +789,8 @@ static int cds_process_regulatory_data(struct wiphy *wiphy,
n = cds_bw20_ch_index_to_bw40_ch_index(k);
chan = &(wiphy->bands[i]->channels[j]);
temp_chan_k =
&(reg_table.regDomains[temp_reg_domain].
channels[k]);
temp_chan_n =
&(reg_table.regDomains[temp_reg_domain].
channels[n]);
temp_chan_k = &(reg_channels[k]);
temp_chan_n = &(reg_channels[n]);
if ((!reset) &&
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)) || defined(WITH_BACKPORTS)
@ -1086,21 +847,12 @@ static int cds_process_regulatory_data(struct wiphy *wiphy,
}
}
#ifdef FEATURE_STATICALLY_ADD_11P_CHANNELS
if (is_dsrc_channel(chan->center_freq)) {
temp_chan_k->enabled =
CHANNEL_STATE_ENABLE;
temp_chan_k->pwrLimit =
DEFAULT_11P_POWER;
temp_chan_k->flags = chan->flags;
} else
#endif
if (chan->flags & IEEE80211_CHAN_DISABLED) {
temp_chan_k->enabled =
temp_chan_k->state =
CHANNEL_STATE_DISABLE;
temp_chan_k->flags = chan->flags;
if (n != -1) {
temp_chan_n->enabled =
temp_chan_n->state =
CHANNEL_STATE_DISABLE;
temp_chan_n->flags = chan->flags;
}
@ -1119,8 +871,8 @@ static int cds_process_regulatory_data(struct wiphy *wiphy,
chan->flags |=
IEEE80211_CHAN_PASSIVE_SCAN;
#endif
temp_chan_k->enabled = CHANNEL_STATE_DFS;
temp_chan_k->pwrLimit =
temp_chan_k->state = CHANNEL_STATE_DFS;
temp_chan_k->pwr_limit =
chan->max_power;
temp_chan_k->flags = chan->flags;
@ -1128,12 +880,12 @@ static int cds_process_regulatory_data(struct wiphy *wiphy,
if ((chan->flags &
IEEE80211_CHAN_NO_HT40) ==
IEEE80211_CHAN_NO_HT40) {
temp_chan_n->enabled =
temp_chan_n->state =
CHANNEL_STATE_DISABLE;
} else {
temp_chan_n->enabled =
temp_chan_n->state =
CHANNEL_STATE_DFS;
temp_chan_n->pwrLimit =
temp_chan_n->pwr_limit =
chan->max_power-3;
}
temp_chan_n->flags = chan->flags;
@ -1142,19 +894,19 @@ static int cds_process_regulatory_data(struct wiphy *wiphy,
IEEE80211_CHAN_NO_80MHZ) == 0)
hdd_ctx->isVHT80Allowed = 1;
} else {
temp_chan_k->enabled = CHANNEL_STATE_ENABLE;
temp_chan_k->pwrLimit = chan->max_power;
temp_chan_k->state = CHANNEL_STATE_ENABLE;
temp_chan_k->pwr_limit = chan->max_power;
temp_chan_k->flags = chan->flags;
if (n != -1) {
if ((chan->flags &
IEEE80211_CHAN_NO_HT40) ==
IEEE80211_CHAN_NO_HT40) {
temp_chan_n->enabled =
temp_chan_n->state =
CHANNEL_STATE_DISABLE;
} else {
temp_chan_n->enabled =
temp_chan_n->state =
CHANNEL_STATE_ENABLE;
temp_chan_n->pwrLimit =
temp_chan_n->pwr_limit =
chan->max_power - 3;
}
temp_chan_n->flags = chan->flags;
@ -1168,9 +920,8 @@ static int cds_process_regulatory_data(struct wiphy *wiphy,
if (0 == (hdd_ctx->reg.eeprom_rd_ext &
(1 << WHAL_REG_EXT_FCC_CH_144))) {
temp_chan = &(reg_table.regDomains[temp_reg_domain].
channels[RF_CHAN_144]);
temp_chan->enabled =
temp_chan = &(reg_channels[RF_CHAN_144]);
temp_chan->state =
CHANNEL_STATE_DISABLE;
}
@ -1220,8 +971,6 @@ void __hdd_reg_notifier(struct wiphy *wiphy,
{
hdd_context_t *hdd_ctx = wiphy_priv(wiphy);
eCsrBand band_capability = eCSR_BAND_ALL;
country_code_t country_code;
int i;
bool vht80_allowed;
bool reset = false;
@ -1238,7 +987,7 @@ void __hdd_reg_notifier(struct wiphy *wiphy,
return;
}
if (hdd_ctx->isUnloadInProgress || hdd_ctx->isLogpInProgress) {
if (cds_is_driver_unloading() || cds_is_driver_recovering()) {
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
"%s: Unloading or SSR in Progress, Ignore!!!",
__func__);
@ -1279,17 +1028,17 @@ void __hdd_reg_notifier(struct wiphy *wiphy,
}
if (NL80211_REGDOM_SET_BY_CORE == request->initiator) {
hdd_ctx->reg.cc_src = COUNTRY_CODE_SET_BY_CORE;
hdd_ctx->reg.cc_src = SOURCE_CORE;
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)) || defined(WITH_BACKPORTS)
if (wiphy->regulatory_flags & REGULATORY_CUSTOM_REG)
#else
if (wiphy->flags & WIPHY_FLAG_CUSTOM_REGULATORY)
if (wiphy->flags & WIPHY_FLAG_CUSTOM_REGULATORY)
#endif
reset = true;
reset = true;
} else if (NL80211_REGDOM_SET_BY_DRIVER == request->initiator)
hdd_ctx->reg.cc_src = COUNTRY_CODE_SET_BY_DRIVER;
hdd_ctx->reg.cc_src = SOURCE_DRIVER;
else {
hdd_ctx->reg.cc_src = COUNTRY_CODE_SET_BY_USER;
hdd_ctx->reg.cc_src = SOURCE_USERSPACE;
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 14, 0)) && !defined(WITH_BACKPORTS)
if ((request->alpha2[0] == '0') &&
(request->alpha2[1] == '0') &&
@ -1300,31 +1049,11 @@ void __hdd_reg_notifier(struct wiphy *wiphy,
#endif
}
/* first lookup the country in the local database */
country_code[0] = request->alpha2[0];
country_code[1] = request->alpha2[1];
hdd_ctx->reg.alpha2[0] = request->alpha2[0];
hdd_ctx->reg.alpha2[1] = request->alpha2[1];
cds_update_regulatory_info(hdd_ctx);
temp_reg_domain = REGDOMAIN_COUNT;
for (i = 0; i < country_info_table.countryCount &&
REGDOMAIN_COUNT == temp_reg_domain; i++) {
if (memcmp(country_code,
country_info_table.countryInfo[i].countryCode,
CDS_COUNTRY_CODE_LEN) == 0) {
temp_reg_domain =
country_info_table.countryInfo[i].regDomain;
break;
}
}
if (REGDOMAIN_COUNT == temp_reg_domain)
temp_reg_domain = REGDOMAIN_WORLD;
vht80_allowed = hdd_ctx->isVHT80Allowed;
if (cds_process_regulatory_data(wiphy, band_capability,
reset) == 0) {
@ -1337,16 +1066,8 @@ void __hdd_reg_notifier(struct wiphy *wiphy,
if (NL80211_REGDOM_SET_BY_DRIVER == request->initiator)
complete(&hdd_ctx->reg_init);
if (request->alpha2[0] == '0'
&& request->alpha2[1] == '0') {
sme_generic_change_country_code(hdd_ctx->hHal,
country_code,
REGDOMAIN_COUNT);
} else {
sme_generic_change_country_code(hdd_ctx->hHal,
country_code,
temp_reg_domain);
}
sme_generic_change_country_code(hdd_ctx->hHal,
hdd_ctx->reg.alpha2);
cds_fill_and_send_ctl_to_fw(&hdd_ctx->reg);
@ -1381,21 +1102,15 @@ void hdd_reg_notifier(struct wiphy *wiphy,
*/
CDF_STATUS cds_regulatory_init(void)
{
v_CONTEXT_t cds_context = NULL;
hdd_context_t *hdd_ctx = NULL;
struct wiphy *wiphy = NULL;
int ret_val = 0;
struct regulatory *reg_info;
cds_context = cds_get_global_context();
if (!cds_context)
return CDF_STATUS_E_FAULT;
hdd_ctx = cds_get_context(CDF_MODULE_ID_HDD);
if (!hdd_ctx) {
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
("Invalid pHddCtx pointer"));
"invalid hdd_ctx pointer");
return CDF_STATUS_E_FAULT;
}
@ -1405,8 +1120,6 @@ CDF_STATUS cds_regulatory_init(void)
cds_regulatory_wiphy_init(hdd_ctx, reg_info, wiphy);
temp_reg_domain = REGDOMAIN_WORLD;
if (cds_process_regulatory_data(wiphy,
hdd_ctx->config->
nBandCapability, true) != 0) {
@ -1415,7 +1128,7 @@ CDF_STATUS cds_regulatory_init(void)
return CDF_STATUS_E_FAULT;
}
reg_info->cc_src = COUNTRY_CODE_SET_BY_DRIVER;
reg_info->cc_src = SOURCE_DRIVER;
ret_val = cds_fill_some_regulatory_info(reg_info);
if (ret_val) {
@ -1423,8 +1136,8 @@ CDF_STATUS cds_regulatory_init(void)
return ret_val;
}
reg_table.default_country[0] = reg_info->alpha2[0];
reg_table.default_country[1] = reg_info->alpha2[1];
hdd_ctx->reg.def_country[0] = reg_info->alpha2[0];
hdd_ctx->reg.def_country[1] = reg_info->alpha2[1];
init_completion(&hdd_ctx->reg_init);
@ -1449,7 +1162,29 @@ CDF_STATUS cds_set_reg_domain(void *client_ctxt, v_REGDOMAIN_t reg_domain)
return CDF_STATUS_E_INVAL;
}
reg_channels = reg_table.regDomains[reg_domain].channels;
return CDF_STATUS_SUCCESS;
}
/**
* cds_set_ch_params() - set channel parameters
* @ch: channel
* @phy_mode: physical mode
* @ch_param: channel parameters will be returned
*
* Return: None
*/
void cds_set_ch_params(uint8_t ch, uint32_t phy_mode,
chan_params_t *ch_params)
{
tHalHandle *hal_ctx = cds_get_context(CDF_MODULE_ID_PE);
if (!hal_ctx) {
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
("Invalid hal_ctx pointer"));
return;
}
/*
* TODO: remove SME call and move the SME set channel
* param functionality to CDS.
*/
sme_set_ch_params(hal_ctx, phy_mode, ch, 0, ch_params);
}

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2014-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2014-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -120,7 +120,7 @@ cds_cpu_hotplug_notify(struct notifier_block *block,
if ((NULL == pSchedContext) || (NULL == pSchedContext->ol_rx_thread))
return NOTIFY_OK;
if (cds_is_load_unload_in_progress())
if (cds_is_load_or_unload_in_progress())
return NOTIFY_OK;
num_cpus = num_possible_cpus();
@ -342,10 +342,6 @@ static int cds_mc_thread(void *Arg)
}
set_user_nice(current, -2);
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0))
daemonize("MC_Thread");
#endif
/* Ack back to the context from which the main controller thread
* has been created
*/
@ -357,15 +353,15 @@ static int cds_mc_thread(void *Arg)
/* Get the Global CDS Context */
p_cds_context = cds_get_global_context();
if (!p_cds_context) {
hddLog(CDF_TRACE_LEVEL_FATAL, "%s: Global CDS context is Null",
__func__);
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_FATAL,
"%s: Global CDS context is Null", __func__);
return 0;
}
pHddCtx = cds_get_context(CDF_MODULE_ID_HDD);
if (!pHddCtx) {
hddLog(CDF_TRACE_LEVEL_FATAL, "%s: HDD context is Null",
__func__);
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_FATAL,
"%s: HDD context is Null", __func__);
return 0;
}
@ -1147,7 +1143,7 @@ static void cds_print_external_threads(void)
while (i < MAX_SSR_PROTECT_LOG) {
if (!ssr_protect_log[i].free) {
CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
"PID %d is stuck at %s", ssr_protect_log[i].pid,
ssr_protect_log[i].func);
}
@ -1190,7 +1186,7 @@ void cds_ssr_protect(const char *caller_func)
spin_unlock_irqrestore(&ssr_protect_lock, irq_flags);
if (!status)
CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
"Could not track PID %d call %s: log is full",
current->pid, caller_func);
}
@ -1229,19 +1225,19 @@ void cds_ssr_unprotect(const char *caller_func)
spin_unlock_irqrestore(&ssr_protect_lock, irq_flags);
if (!status)
CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
"Untracked call %s", caller_func);
}
/**
* cds_is_ssr_ready() - check if the calling execution can proceed with ssr
*
* cds_wait_for_external_threads_completion() - wait for external threads
* completion before proceeding further
* @caller_func: name of calling function.
*
* Return: true if there is no active entry points in driver
* false if there is at least one active entry in driver
*/
bool cds_is_ssr_ready(const char *caller_func)
bool cds_wait_for_external_threads_completion(const char *caller_func)
{
int count = MAX_SSR_WAIT_ITERATIONS;
@ -1263,8 +1259,24 @@ bool cds_is_ssr_ready(const char *caller_func)
return false;
}
CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_INFO,
"Allowing SSR for %s", caller_func);
CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_INFO,
"Allowing SSR/Driver unload for %s", caller_func);
return true;
}
/**
* cds_get_gfp_flags(): get GFP flags
*
* Based on the scheduled context, return GFP flags
* Return: gfp flags
*/
int cds_get_gfp_flags(void)
{
int flags = GFP_KERNEL;
if (in_interrupt() || in_atomic() || irqs_disabled())
flags = GFP_ATOMIC;
return flags;
}

View file

@ -42,8 +42,29 @@
Include Files
------------------------------------------------------------------------*/
#include "cdf_types.h"
/*
/**
* Rx Packet Struct
* Buffer for the packet received from WMA has pointers to 802.11
* frame fields and additional information based on the type of frame.
* @channel: Channel number
* @snr: Signal to noise ratio
* @rssi: Received signal strength indicator, normalized to -96 dBm as
* normal noise floor by adding -96 to snr. All the configured
* thresholds in the driver assume that noise floor is -96 dBm.
* @timestamp: System timestamp when frame was received. Set to jiffies.
* @mpdu_hdr_ptr: Pointer to beginning of 802.11 MPDU
* @mpdu_data_ptr: Pointer to beginning of payload
* @mpdu_len: Length of 802.11 MPDU
* @mpdu_hdr_len: Length of 802.11 MPDU header
* @mpdu_data_len: Length of 802.11 MPDU payload
* @offloadScanLearn: Bit set to 1 for beacons received during roaming scan
* @roamCandidateInd: Bit set to 1 when roaming candidate is found by fw
* @scan: Bit set to 1 if packet received during scanning
* @scan_src: Source of scan
* @dpuFeedback: DPU feedback for frame
* @sessionId: PE session
* @tsf_delta: Delta between tsf in frame and local value of tsf
* @rssi_raw: rssi based on actual noise floor in hardware.
*/
typedef struct {
uint8_t channel;
@ -62,6 +83,7 @@ typedef struct {
uint8_t dpuFeedback;
uint8_t sessionId;
uint32_t tsf_delta;
uint32_t rssi_raw;
} t_packetmeta, *tp_packetmeta;
/* implementation specific cds packet type */

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2011, 2014-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2011, 2014-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -43,6 +43,7 @@
#include <ol_htt_api.h>
#include <htt_internal.h>
#include <ol_htt_tx_api.h>
#include "hif.h"
#define HTT_HTC_PKT_POOL_INIT_SIZE 100 /* enough for a large A-MPDU */
@ -405,6 +406,7 @@ int htt_htc_attach(struct htt_pdev_t *pdev)
connect.EpCallbacks.EpTxComplete = htt_h2t_send_complete;
connect.EpCallbacks.EpTxCompleteMultiple = NULL;
connect.EpCallbacks.EpRecv = htt_t2h_msg_handler;
connect.EpCallbacks.ep_resume_tx_queue = htt_tx_resume_handler;
/* rx buffers currently are provided by HIF, not by EpRecvRefill */
connect.EpCallbacks.EpRecvRefill = NULL;
@ -424,7 +426,7 @@ int htt_htc_attach(struct htt_pdev_t *pdev)
#endif
/* connect to control service */
connect.ServiceID = HTT_DATA_MSG_SVC;
connect.service_id = HTT_DATA_MSG_SVC;
status = htc_connect_service(pdev->htc_pdev, &connect, &response);

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2011-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2011-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -417,7 +417,7 @@ A_STATUS htt_h2t_rx_ring_cfg_msg_ll(struct htt_pdev_t *pdev)
cdf_nbuf_data(msg),
cdf_nbuf_len(msg),
pdev->htc_endpoint,
1); /* tag - not relevant here */
HTC_TX_PACKET_TAG_RUNTIME_PUT);
SET_HTC_PACKET_NET_BUF_CONTEXT(&pkt->htc_pkt, msg);
@ -439,6 +439,7 @@ htt_h2t_dbg_stats_get(struct htt_pdev_t *pdev,
struct htt_htc_pkt *pkt;
cdf_nbuf_t msg;
uint32_t *msg_word;
uint16_t htc_tag = 1;
pkt = htt_htc_pkt_alloc(pdev);
if (!pkt)
@ -452,6 +453,9 @@ htt_h2t_dbg_stats_get(struct htt_pdev_t *pdev,
return -EINVAL; /* failure */
}
if (stats_type_reset_mask)
htc_tag = HTC_TX_PACKET_TAG_RUNTIME_PUT;
/* show that this is not a tx frame download
* (not required, but helpful)
*/
@ -503,7 +507,7 @@ htt_h2t_dbg_stats_get(struct htt_pdev_t *pdev,
cdf_nbuf_data(msg),
cdf_nbuf_len(msg),
pdev->htc_endpoint,
1); /* tag - not relevant here */
htc_tag); /* tag - not relevant here */
SET_HTC_PACKET_NET_BUF_CONTEXT(&pkt->htc_pkt, msg);
@ -559,7 +563,7 @@ A_STATUS htt_h2t_sync_msg(struct htt_pdev_t *pdev, uint8_t sync_cnt)
cdf_nbuf_data(msg),
cdf_nbuf_len(msg),
pdev->htc_endpoint,
1); /* tag - not relevant here */
HTC_TX_PACKET_TAG_RUNTIME_PUT);
SET_HTC_PACKET_NET_BUF_CONTEXT(&pkt->htc_pkt, msg);
@ -626,7 +630,7 @@ htt_h2t_aggr_cfg_msg(struct htt_pdev_t *pdev,
cdf_nbuf_data(msg),
cdf_nbuf_len(msg),
pdev->htc_endpoint,
1); /* tag - not relevant here */
HTC_TX_PACKET_TAG_RUNTIME_PUT);
SET_HTC_PACKET_NET_BUF_CONTEXT(&pkt->htc_pkt, msg);
@ -648,6 +652,100 @@ htt_h2t_aggr_cfg_msg(struct htt_pdev_t *pdev,
* Return: 0 success
* A_NO_MEMORY No memory fail
*/
#ifdef QCA_WIFI_2_0
/* Rome Support only WDI 1.0 */
int htt_h2t_ipa_uc_rsc_cfg_msg(struct htt_pdev_t *pdev)
{
struct htt_htc_pkt *pkt;
cdf_nbuf_t msg;
uint32_t *msg_word;
pkt = htt_htc_pkt_alloc(pdev);
if (!pkt)
return A_NO_MEMORY;
/* show that this is not a tx frame download
* (not required, but helpful)
*/
pkt->msdu_id = HTT_TX_COMPL_INV_MSDU_ID;
pkt->pdev_ctxt = NULL; /* not used during send-done callback */
/* reserve room for HTC header */
msg = cdf_nbuf_alloc(pdev->osdev, HTT_MSG_BUF_SIZE(HTT_WDI_IPA_CFG_SZ),
HTC_HEADER_LEN + HTC_HDR_ALIGNMENT_PADDING, 4,
false);
if (!msg) {
htt_htc_pkt_free(pdev, pkt);
return A_NO_MEMORY;
}
/* set the length of the message */
cdf_nbuf_put_tail(msg, HTT_WDI_IPA_CFG_SZ);
/* fill in the message contents */
msg_word = (uint32_t *) cdf_nbuf_data(msg);
/* rewind beyond alignment pad to get to the HTC header reserved area */
cdf_nbuf_push_head(msg, HTC_HDR_ALIGNMENT_PADDING);
*msg_word = 0;
HTT_WDI_IPA_CFG_TX_PKT_POOL_SIZE_SET(*msg_word,
pdev->ipa_uc_tx_rsc.alloc_tx_buf_cnt);
HTT_H2T_MSG_TYPE_SET(*msg_word, HTT_H2T_MSG_TYPE_WDI_IPA_CFG);
msg_word++;
*msg_word = 0;
HTT_WDI_IPA_CFG_TX_COMP_RING_BASE_ADDR_SET(*msg_word,
(unsigned int)pdev->ipa_uc_tx_rsc.tx_comp_base.paddr);
msg_word++;
*msg_word = 0;
HTT_WDI_IPA_CFG_TX_COMP_RING_SIZE_SET(*msg_word,
(unsigned int)ol_cfg_ipa_uc_tx_max_buf_cnt(pdev->ctrl_pdev));
msg_word++;
*msg_word = 0;
HTT_WDI_IPA_CFG_TX_COMP_WR_IDX_ADDR_SET(*msg_word,
(unsigned int)pdev->ipa_uc_tx_rsc.tx_comp_idx_paddr);
msg_word++;
*msg_word = 0;
HTT_WDI_IPA_CFG_TX_CE_WR_IDX_ADDR_SET(*msg_word,
(unsigned int)pdev->ipa_uc_tx_rsc.tx_ce_idx.paddr);
msg_word++;
*msg_word = 0;
HTT_WDI_IPA_CFG_RX_IND_RING_BASE_ADDR_SET(*msg_word,
(unsigned int)pdev->ipa_uc_rx_rsc.rx_ind_ring_base.paddr);
msg_word++;
*msg_word = 0;
HTT_WDI_IPA_CFG_RX_IND_RING_SIZE_SET(*msg_word,
(unsigned int)ol_cfg_ipa_uc_rx_ind_ring_size(pdev->ctrl_pdev));
msg_word++;
*msg_word = 0;
HTT_WDI_IPA_CFG_RX_IND_RD_IDX_ADDR_SET(*msg_word,
(unsigned int)pdev->ipa_uc_rx_rsc.rx_ipa_prc_done_idx.paddr);
msg_word++;
*msg_word = 0;
HTT_WDI_IPA_CFG_RX_IND_WR_IDX_ADDR_SET(*msg_word,
(unsigned int)pdev->ipa_uc_rx_rsc.rx_rdy_idx_paddr);
SET_HTC_PACKET_INFO_TX(&pkt->htc_pkt,
htt_h2t_send_complete_free_netbuf,
cdf_nbuf_data(msg),
cdf_nbuf_len(msg),
pdev->htc_endpoint,
HTC_TX_PACKET_TAG_RUNTIME_PUT);
SET_HTC_PACKET_NET_BUF_CONTEXT(&pkt->htc_pkt, msg);
htc_send_pkt(pdev->htc_pdev, &pkt->htc_pkt);
return A_OK;
}
#else
int htt_h2t_ipa_uc_rsc_cfg_msg(struct htt_pdev_t *pdev)
{
struct htt_htc_pkt *pkt;
@ -791,6 +889,7 @@ int htt_h2t_ipa_uc_rsc_cfg_msg(struct htt_pdev_t *pdev)
return A_OK;
}
#endif
/**
* htt_h2t_ipa_uc_set_active() - Propagate WDI path enable/disable to firmware

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2011, 2014-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2011, 2014-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -413,6 +413,7 @@ static inline void htt_print_rx_desc(struct htt_host_rx_desc_base *rx_desc)
#endif
void htt_tx_resume_handler(void *);
#ifdef ATH_11AC_TXCOMPACT
#define HTT_TX_SCHED htt_tx_sched
#else

View file

@ -2288,6 +2288,74 @@ fail1:
}
#ifdef IPA_OFFLOAD
#ifdef QCA_WIFI_3_0
/**
* htt_rx_ipa_uc_alloc_wdi2_rsc() - Allocate WDI2.0 resources
* @pdev: htt context
* @rx_ind_ring_elements: rx ring elements
*
* Return: 0 success
*/
int htt_rx_ipa_uc_alloc_wdi2_rsc(struct htt_pdev_t *pdev,
unsigned int rx_ind_ring_elements)
{
/* Allocate RX2 indication ring */
/* RX2 IND ring element
* 4bytes: pointer
* 2bytes: VDEV ID
* 2bytes: length */
pdev->ipa_uc_rx_rsc.rx2_ind_ring_base.vaddr =
cdf_os_mem_alloc_consistent(
pdev->osdev,
rx_ind_ring_elements *
sizeof(struct ipa_uc_rx_ring_elem_t),
&pdev->ipa_uc_rx_rsc.rx2_ind_ring_base.paddr,
cdf_get_dma_mem_context((&pdev->ipa_uc_rx_rsc.
rx2_ind_ring_base),
memctx));
if (!pdev->ipa_uc_rx_rsc.rx2_ind_ring_base.vaddr) {
cdf_print("%s: RX IND RING alloc fail", __func__);
return -ENOBUFS;
}
/* RX indication ring size, by bytes */
pdev->ipa_uc_rx_rsc.rx2_ind_ring_size =
rx_ind_ring_elements * sizeof(struct ipa_uc_rx_ring_elem_t);
cdf_mem_zero(pdev->ipa_uc_rx_rsc.rx2_ind_ring_base.vaddr,
pdev->ipa_uc_rx_rsc.rx2_ind_ring_size);
/* Allocate RX process done index */
pdev->ipa_uc_rx_rsc.rx2_ipa_prc_done_idx.vaddr =
cdf_os_mem_alloc_consistent(
pdev->osdev,
4,
&pdev->ipa_uc_rx_rsc.rx2_ipa_prc_done_idx.paddr,
cdf_get_dma_mem_context((&pdev->ipa_uc_rx_rsc.
rx_ipa_prc_done_idx),
memctx));
if (!pdev->ipa_uc_rx_rsc.rx2_ipa_prc_done_idx.vaddr) {
cdf_print("%s: RX PROC DONE IND alloc fail", __func__);
cdf_os_mem_free_consistent(
pdev->osdev,
pdev->ipa_uc_rx_rsc.rx2_ind_ring_size,
pdev->ipa_uc_rx_rsc.rx2_ind_ring_base.vaddr,
pdev->ipa_uc_rx_rsc.rx2_ind_ring_base.paddr,
cdf_get_dma_mem_context((&pdev->ipa_uc_rx_rsc.
rx2_ind_ring_base),
memctx));
return -ENOBUFS;
}
cdf_mem_zero(pdev->ipa_uc_rx_rsc.rx2_ipa_prc_done_idx.vaddr, 4);
return 0;
}
#else
int htt_rx_ipa_uc_alloc_wdi2_rsc(struct htt_pdev_t *pdev,
unsigned int rx_ind_ring_elements)
{
return 0;
}
#endif
/**
* htt_rx_ipa_uc_attach() - attach htt ipa uc rx resource
* @pdev: htt context
@ -2298,6 +2366,12 @@ fail1:
int htt_rx_ipa_uc_attach(struct htt_pdev_t *pdev,
unsigned int rx_ind_ring_elements)
{
int ret = 0;
/* Allocate RX indication ring */
/* RX IND ring element
* 4bytes: pointer
* 2bytes: VDEV ID
* 2bytes: length */
pdev->ipa_uc_rx_rsc.rx_ind_ring_base.vaddr =
cdf_os_mem_alloc_consistent(
pdev->osdev,
@ -2341,37 +2415,20 @@ int htt_rx_ipa_uc_attach(struct htt_pdev_t *pdev,
}
cdf_mem_zero(pdev->ipa_uc_rx_rsc.rx_ipa_prc_done_idx.vaddr, 4);
pdev->ipa_uc_rx_rsc.rx2_ind_ring_base.vaddr =
cdf_os_mem_alloc_consistent(
pdev->osdev,
rx_ind_ring_elements *
sizeof(cdf_dma_addr_t),
&pdev->ipa_uc_rx_rsc.rx2_ind_ring_base.paddr,
cdf_get_dma_mem_context((&pdev->ipa_uc_rx_rsc.
rx2_ind_ring_base),
memctx));
if (!pdev->ipa_uc_rx_rsc.rx2_ind_ring_base.vaddr) {
cdf_print("%s: RX IND RING alloc fail", __func__);
return -ENOBUFS;
}
ret = htt_rx_ipa_uc_alloc_wdi2_rsc(pdev, rx_ind_ring_elements);
return ret;
}
/* RX indication ring size, by bytes */
pdev->ipa_uc_rx_rsc.rx2_ind_ring_size =
rx_ind_ring_elements * sizeof(cdf_dma_addr_t);
cdf_mem_zero(pdev->ipa_uc_rx_rsc.rx2_ind_ring_base.vaddr,
pdev->ipa_uc_rx_rsc.rx2_ind_ring_size);
/* Allocate RX process done index */
pdev->ipa_uc_rx_rsc.rx2_ipa_prc_done_idx.vaddr =
cdf_os_mem_alloc_consistent(
pdev->osdev,
4,
&pdev->ipa_uc_rx_rsc.rx2_ipa_prc_done_idx.paddr,
cdf_get_dma_mem_context((&pdev->ipa_uc_rx_rsc.
rx_ipa_prc_done_idx),
memctx));
if (!pdev->ipa_uc_rx_rsc.rx2_ipa_prc_done_idx.vaddr) {
cdf_print("%s: RX PROC DONE IND alloc fail", __func__);
#ifdef QCA_WIFI_3_0
/**
* htt_rx_ipa_uc_free_wdi2_rsc() - Free WDI2.0 resources
* @pdev: htt context
*
* Return: None
*/
void htt_rx_ipa_uc_free_wdi2_rsc(struct htt_pdev_t *pdev)
{
if (pdev->ipa_uc_rx_rsc.rx2_ind_ring_base.vaddr) {
cdf_os_mem_free_consistent(
pdev->osdev,
pdev->ipa_uc_rx_rsc.rx2_ind_ring_size,
@ -2380,11 +2437,26 @@ int htt_rx_ipa_uc_attach(struct htt_pdev_t *pdev,
cdf_get_dma_mem_context((&pdev->ipa_uc_rx_rsc.
rx2_ind_ring_base),
memctx));
return -ENOBUFS;
}
cdf_mem_zero(pdev->ipa_uc_rx_rsc.rx2_ipa_prc_done_idx.vaddr, 4);
return 0;
if (pdev->ipa_uc_rx_rsc.rx2_ipa_prc_done_idx.vaddr) {
cdf_os_mem_free_consistent(
pdev->osdev,
4,
pdev->ipa_uc_rx_rsc.
rx_ipa_prc_done_idx.vaddr,
pdev->ipa_uc_rx_rsc.rx2_ipa_prc_done_idx.paddr,
cdf_get_dma_mem_context((&pdev->ipa_uc_rx_rsc.
rx_ipa_prc_done_idx),
memctx));
}
}
#else
void htt_rx_ipa_uc_free_wdi2_rsc(struct htt_pdev_t *pdev)
{
return;
}
#endif
int htt_rx_ipa_uc_detach(struct htt_pdev_t *pdev)
{
@ -2406,32 +2478,12 @@ int htt_rx_ipa_uc_detach(struct htt_pdev_t *pdev)
pdev->ipa_uc_rx_rsc.
rx_ipa_prc_done_idx.vaddr,
pdev->ipa_uc_rx_rsc.rx_ipa_prc_done_idx.paddr,
cdf_get_dma_mem_context((&pdev->ipa_uc_rx_rsc.
rx_ipa_prc_done_idx),
memctx));
}
if (pdev->ipa_uc_rx_rsc.rx2_ind_ring_base.vaddr) {
cdf_os_mem_free_consistent(
pdev->osdev,
pdev->ipa_uc_rx_rsc.rx2_ind_ring_size,
pdev->ipa_uc_rx_rsc.rx2_ind_ring_base.vaddr,
pdev->ipa_uc_rx_rsc.rx2_ind_ring_base.paddr,
cdf_get_dma_mem_context((&pdev->ipa_uc_rx_rsc.
rx2_ind_ring_base),
memctx));
}
if (pdev->ipa_uc_rx_rsc.rx2_ipa_prc_done_idx.vaddr) {
cdf_os_mem_free_consistent(
pdev->osdev,
4,
pdev->ipa_uc_rx_rsc.
rx_ipa_prc_done_idx.vaddr,
pdev->ipa_uc_rx_rsc.rx2_ipa_prc_done_idx.paddr,
cdf_get_dma_mem_context((&pdev->ipa_uc_rx_rsc.
rx2_ipa_prc_done_idx),
memctx));
}
htt_rx_ipa_uc_free_wdi2_rsc(pdev);
return 0;
}
#endif /* IPA_OFFLOAD */

View file

@ -141,6 +141,7 @@ void htt_t2h_lp_msg_handler(void *context, cdf_nbuf_t htt_t2h_msg)
switch (msg_type) {
case HTT_T2H_MSG_TYPE_VERSION_CONF:
{
cdf_runtime_pm_put();
pdev->tgt_ver.major = HTT_VER_CONF_MAJOR_GET(*msg_word);
pdev->tgt_ver.minor = HTT_VER_CONF_MINOR_GET(*msg_word);
cdf_print
@ -287,6 +288,7 @@ void htt_t2h_lp_msg_handler(void *context, cdf_nbuf_t htt_t2h_msg)
ol_tx_single_completion_handler(pdev->txrx_pdev,
compl_msg->status,
compl_msg->desc_id);
cdf_runtime_pm_put();
HTT_TX_SCHED(pdev);
} else {
cdf_print("Ignoring HTT_T2H_MSG_TYPE_MGMT_TX_COMPL_IND indication\n");
@ -302,6 +304,7 @@ void htt_t2h_lp_msg_handler(void *context, cdf_nbuf_t htt_t2h_msg)
cookie |= ((uint64_t) (*(msg_word + 2))) << 32;
stats_info_list = (uint8_t *) (msg_word + 3);
cdf_runtime_pm_put();
ol_txrx_fw_stats_handler(pdev->txrx_pdev, cookie,
stats_info_list);
break;
@ -357,6 +360,7 @@ void htt_t2h_lp_msg_handler(void *context, cdf_nbuf_t htt_t2h_msg)
uint8_t *op_msg_buffer;
uint8_t *msg_start_ptr;
cdf_runtime_pm_put();
msg_start_ptr = (uint8_t *) msg_word;
op_code =
HTT_WDI_IPA_OP_RESPONSE_OP_CODE_GET(*msg_word);
@ -475,6 +479,11 @@ void htt_t2h_msg_handler(void *context, HTC_PACKET *pkt)
peer_id = HTT_RX_IND_PEER_ID_GET(*msg_word);
tid = HTT_RX_IND_EXT_TID_GET(*msg_word);
if (tid >= OL_TXRX_NUM_EXT_TIDS) {
cdf_print("HTT_T2H_MSG_TYPE_RX_IND, invalid tid %d\n",
tid);
break;
}
num_msdu_bytes =
HTT_RX_IND_FW_RX_DESC_BYTES_GET(
*(msg_word + 2 + HTT_RX_PPDU_DESC_SIZE32));

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2011, 2014-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2011, 2014-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -252,8 +252,6 @@ static inline void htt_tx_desc_get_size(struct htt_pdev_t *pdev)
+ (ol_cfg_netbuf_frags_max(pdev->ctrl_pdev) + 1) * 8
/* 2x uint32_t */
+ 4; /* uint32_t fragmentation list terminator */
if (pdev->tx_descs.size < sizeof(uint32_t *))
pdev->tx_descs.size = sizeof(uint32_t *);
}
/**
@ -320,6 +318,7 @@ int htt_tx_attach(struct htt_pdev_t *pdev, int desc_pool_elems)
uint16_t num_page, num_desc_per_page;
htt_tx_desc_get_size(pdev);
/*
* Make sure tx_descs.size is a multiple of 4-bytes.
* It should be, but round up just to be sure.
@ -626,6 +625,24 @@ int htt_tx_send_std(htt_pdev_handle pdev, cdf_nbuf_t msdu, uint16_t msdu_id)
}
#ifdef FEATURE_RUNTIME_PM
/**
* htt_tx_resume_handler() - resume callback for the htt endpoint
* @context: a pointer to the htt context
*
* runs htt_tx_sched.
*/
void htt_tx_resume_handler(void *context)
{
struct htt_pdev_t *pdev = (struct htt_pdev_t *) context;
htt_tx_sched(pdev);
}
#else
void
htt_tx_resume_handler(void *context) { }
#endif
cdf_nbuf_t
htt_tx_send_batch(htt_pdev_handle pdev, cdf_nbuf_t head_msdu, int num_msdus)
{
@ -833,6 +850,149 @@ void htt_tx_desc_display(void *tx_desc)
#endif
#ifdef IPA_OFFLOAD
#ifdef QCA_WIFI_2_0
/**
* htt_tx_ipa_uc_wdi_tx_buf_alloc() - Alloc WDI TX buffers
* @pdev: htt context
* @uc_tx_buf_sz: TX buffer size
* @uc_tx_buf_cnt: TX Buffer count
* @uc_tx_partition_base: IPA UC TX partition base value
*
* Allocate WDI TX buffers. Also note Rome supports only WDI 1.0.
*
* Return: 0 success
*/
int htt_tx_ipa_uc_wdi_tx_buf_alloc(struct htt_pdev_t *pdev,
unsigned int uc_tx_buf_sz,
unsigned int uc_tx_buf_cnt,
unsigned int uc_tx_partition_base)
{
unsigned int tx_buffer_count;
cdf_nbuf_t buffer_vaddr;
cdf_dma_addr_t buffer_paddr;
uint32_t *header_ptr;
uint32_t *ring_vaddr;
#define IPA_UC_TX_BUF_FRAG_DESC_OFFSET 16
#define IPA_UC_TX_BUF_FRAG_HDR_OFFSET 32
ring_vaddr = pdev->ipa_uc_tx_rsc.tx_comp_base.vaddr;
/* Allocate TX buffers as many as possible */
for (tx_buffer_count = 0;
tx_buffer_count < (uc_tx_buf_cnt - 1); tx_buffer_count++) {
buffer_vaddr = cdf_nbuf_alloc(pdev->osdev,
uc_tx_buf_sz, 0, 4, false);
if (!buffer_vaddr) {
cdf_print("%s: TX BUF alloc fail, loop index: %d",
__func__, tx_buffer_count);
return tx_buffer_count;
}
/* Init buffer */
cdf_mem_zero(cdf_nbuf_data(buffer_vaddr), uc_tx_buf_sz);
header_ptr = (uint32_t *) cdf_nbuf_data(buffer_vaddr);
/* HTT control header */
*header_ptr = HTT_IPA_UC_OFFLOAD_TX_HEADER_DEFAULT;
header_ptr++;
/* PKT ID */
*header_ptr |= ((uint16_t) uc_tx_partition_base +
tx_buffer_count) << 16;
cdf_nbuf_map(pdev->osdev, buffer_vaddr, CDF_DMA_BIDIRECTIONAL);
buffer_paddr = cdf_nbuf_get_frag_paddr_lo(buffer_vaddr, 0);
header_ptr++;
*header_ptr = (uint32_t) (buffer_paddr +
IPA_UC_TX_BUF_FRAG_DESC_OFFSET);
header_ptr++;
*header_ptr = 0xFFFFFFFF;
/* FRAG Header */
header_ptr++;
*header_ptr = buffer_paddr + IPA_UC_TX_BUF_FRAG_HDR_OFFSET;
*ring_vaddr = buffer_paddr;
pdev->ipa_uc_tx_rsc.tx_buf_pool_vaddr_strg[tx_buffer_count] =
buffer_vaddr;
/* Memory barrier to ensure actual value updated */
ring_vaddr++;
}
return tx_buffer_count;
}
#else
int htt_tx_ipa_uc_wdi_tx_buf_alloc(struct htt_pdev_t *pdev,
unsigned int uc_tx_buf_sz,
unsigned int uc_tx_buf_cnt,
unsigned int uc_tx_partition_base)
{
unsigned int tx_buffer_count;
cdf_nbuf_t buffer_vaddr;
uint32_t buffer_paddr;
uint32_t *header_ptr;
uint32_t *ring_vaddr;
#define IPA_UC_TX_BUF_FRAG_DESC_OFFSET 20
#define IPA_UC_TX_BUF_FRAG_HDR_OFFSET 64
#define IPA_UC_TX_BUF_TSO_HDR_SIZE 6
ring_vaddr = pdev->ipa_uc_tx_rsc.tx_comp_base.vaddr;
/* Allocate TX buffers as many as possible */
for (tx_buffer_count = 0;
tx_buffer_count < (uc_tx_buf_cnt - 1); tx_buffer_count++) {
buffer_vaddr = cdf_nbuf_alloc(pdev->osdev,
uc_tx_buf_sz, 0, 4, false);
if (!buffer_vaddr) {
cdf_print("%s: TX BUF alloc fail, loop index: %d",
__func__, tx_buffer_count);
return tx_buffer_count;
}
/* Init buffer */
cdf_mem_zero(cdf_nbuf_data(buffer_vaddr), uc_tx_buf_sz);
header_ptr = (uint32_t *) cdf_nbuf_data(buffer_vaddr);
/* HTT control header */
*header_ptr = HTT_IPA_UC_OFFLOAD_TX_HEADER_DEFAULT;
header_ptr++;
/* PKT ID */
*header_ptr |= ((uint16_t) uc_tx_partition_base +
tx_buffer_count) << 16;
cdf_nbuf_map(pdev->osdev, buffer_vaddr, CDF_DMA_BIDIRECTIONAL);
buffer_paddr = cdf_nbuf_get_frag_paddr_lo(buffer_vaddr, 0);
header_ptr++;
/* Frag Desc Pointer */
/* 64bits descriptor, Low 32bits */
*header_ptr = (uint32_t) (buffer_paddr +
IPA_UC_TX_BUF_FRAG_DESC_OFFSET);
header_ptr++;
/* 64bits descriptor, high 32bits */
*header_ptr = 0;
header_ptr++;
/* chanreq, peerid */
*header_ptr = 0xFFFFFFFF;
header_ptr++;
/* FRAG Header */
/* 6 words TSO header */
header_ptr += IPA_UC_TX_BUF_TSO_HDR_SIZE;
*header_ptr = buffer_paddr + IPA_UC_TX_BUF_FRAG_HDR_OFFSET;
*ring_vaddr = buffer_paddr;
pdev->ipa_uc_tx_rsc.tx_buf_pool_vaddr_strg[tx_buffer_count] =
buffer_vaddr;
/* Memory barrier to ensure actual value updated */
ring_vaddr += 2;
}
return tx_buffer_count;
}
#endif
/**
* htt_tx_ipa_uc_attach() - attach htt ipa uc tx resource
* @pdev: htt context
@ -848,11 +1008,6 @@ int htt_tx_ipa_uc_attach(struct htt_pdev_t *pdev,
unsigned int uc_tx_buf_cnt,
unsigned int uc_tx_partition_base)
{
unsigned int tx_buffer_count;
cdf_nbuf_t buffer_vaddr;
cdf_dma_addr_t buffer_paddr;
uint32_t *header_ptr;
uint32_t *ring_vaddr;
int return_code = 0;
unsigned int tx_comp_ring_size;
@ -900,61 +1055,9 @@ int htt_tx_ipa_uc_attach(struct htt_pdev_t *pdev,
cdf_mem_zero(pdev->ipa_uc_tx_rsc.tx_buf_pool_vaddr_strg,
uc_tx_buf_cnt * sizeof(cdf_nbuf_t));
ring_vaddr = pdev->ipa_uc_tx_rsc.tx_comp_base.vaddr;
/* Allocate TX buffers as many as possible */
for (tx_buffer_count = 0;
tx_buffer_count < (uc_tx_buf_cnt - 1); tx_buffer_count++) {
buffer_vaddr = cdf_nbuf_alloc(pdev->osdev,
uc_tx_buf_sz, 0, 4, false);
if (!buffer_vaddr) {
cdf_print("%s: TX BUF alloc fail, loop index: %d",
__func__, tx_buffer_count);
return 0;
}
pdev->ipa_uc_tx_rsc.alloc_tx_buf_cnt = htt_tx_ipa_uc_wdi_tx_buf_alloc(
pdev, uc_tx_buf_sz, uc_tx_buf_cnt, uc_tx_partition_base);
/* Init buffer */
cdf_mem_zero(cdf_nbuf_data(buffer_vaddr), uc_tx_buf_sz);
header_ptr = (uint32_t *) cdf_nbuf_data(buffer_vaddr);
/* HTT control header */
*header_ptr = HTT_IPA_UC_OFFLOAD_TX_HEADER_DEFAULT;
header_ptr++;
/* PKT ID */
*header_ptr |= ((uint16_t) uc_tx_partition_base +
tx_buffer_count) << 16;
cdf_nbuf_map(pdev->osdev, buffer_vaddr, CDF_DMA_BIDIRECTIONAL);
buffer_paddr = cdf_nbuf_get_frag_paddr_lo(buffer_vaddr, 0);
header_ptr++;
/* Frag Desc Pointer */
/* 64bits descriptor, Low 32bits */
*header_ptr = (uint32_t) (buffer_paddr + 20);
header_ptr++;
/* 64bits descriptor, high 32bits */
*header_ptr = 0;
header_ptr++;
/* chanreq, peerid */
*header_ptr = 0xFFFFFFFF;
header_ptr++;
/* FRAG Header */
/* 6 words TSO header */
header_ptr += 6;
*header_ptr = buffer_paddr + 64;
*ring_vaddr = buffer_paddr;
pdev->ipa_uc_tx_rsc.tx_buf_pool_vaddr_strg[tx_buffer_count] =
buffer_vaddr;
/* Memory barrier to ensure actual value updated */
ring_vaddr += 2;
}
pdev->ipa_uc_tx_rsc.alloc_tx_buf_cnt = tx_buffer_count;
return 0;

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2011, 2014-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2011, 2014-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -82,7 +82,7 @@ struct ol_txrx_stats_req {
#define ol_txrx_debug(vdev, debug_specs) 0
#define ol_txrx_fw_stats_cfg(vdev, type, val) 0
#define ol_txrx_fw_stats_get(vdev, req) 0
#define ol_txrx_fw_stats_get(vdev, req, response_expected) 0
#define ol_txrx_aggr_cfg(vdev, max_subfrms_ampdu, max_subfrms_amsdu) 0
#else /*---------------------------------------------------------------------*/
@ -95,7 +95,8 @@ void ol_txrx_fw_stats_cfg(ol_txrx_vdev_handle vdev,
uint8_t cfg_stats_type, uint32_t cfg_val);
int ol_txrx_fw_stats_get(ol_txrx_vdev_handle vdev,
struct ol_txrx_stats_req *req);
struct ol_txrx_stats_req *req,
bool response_expected);
int ol_txrx_aggr_cfg(ol_txrx_vdev_handle vdev,
int max_subfrms_ampdu, int max_subfrms_amsdu);

View file

@ -56,6 +56,20 @@ void ol_tx_set_flow_control_parameters(struct txrx_pdev_cfg_t *cfg_ctx,
}
#endif
#if CFG_TGT_DEFAULT_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK
static inline
uint8_t ol_defrag_timeout_check(void)
{
return 1;
}
#else
static inline
uint8_t ol_defrag_timeout_check(void)
{
return 0;
}
#endif
/* FIX THIS -
* For now, all these configuration parameters are hardcoded.
* Many of these should actually be determined dynamically instead.
@ -79,9 +93,7 @@ ol_pdev_handle ol_pdev_cfg_attach(cdf_device_t osdev,
cfg_ctx->tx_download_size = 16;
/* temporarily diabled PN check for Riva/Pronto */
cfg_ctx->rx_pn_check = 1;
#if CFG_TGT_DEFAULT_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK
cfg_ctx->defrag_timeout_check = 1;
#endif
cfg_ctx->defrag_timeout_check = ol_defrag_timeout_check();
cfg_ctx->max_peer_id = 511;
cfg_ctx->max_vdev = CFG_TGT_NUM_VDEV;
cfg_ctx->pn_rx_fwd_check = 1;

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2011-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2011-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -98,7 +98,7 @@ void ol_rx_trigger_restore(htt_pdev_handle htt_pdev, cdf_nbuf_t head_msdu,
}
if (!htt_pdev->rx_ring.htt_rx_restore) {
cds_set_logp_in_progress(true);
cds_set_recovery_in_progress(true);
htt_pdev->rx_ring.htt_rx_restore = 1;
schedule_work(&ol_rx_restore_work);
}

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2011-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2011-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -504,6 +504,7 @@ ol_tx_completion_handler(ol_txrx_pdev_handle pdev,
tx_desc->status = status;
netbuf = tx_desc->netbuf;
cdf_runtime_pm_put();
cdf_nbuf_trace_update(netbuf, trace_str);
/* Per SDU update of byte count */
byte_cnt += cdf_nbuf_len(netbuf);

View file

@ -313,9 +313,11 @@ void ol_tx_set_desc_global_pool_size(uint32_t num_msdu_desc)
cdf_print("%s: pdev is NULL\n", __func__);
return;
}
pdev->num_msdu_desc = num_msdu_desc + TX_FLOW_MGMT_POOL_SIZE;
TXRX_PRINT(TXRX_PRINT_LEVEL_ERR, "Global pool size: %d = %d + %d\n",
pdev->num_msdu_desc, num_msdu_desc, TX_FLOW_MGMT_POOL_SIZE);
pdev->num_msdu_desc = num_msdu_desc;
if (!ol_tx_get_is_mgmt_over_wmi_enabled())
pdev->num_msdu_desc += TX_FLOW_MGMT_POOL_SIZE;
TXRX_PRINT(TXRX_PRINT_LEVEL_ERR, "Global pool size: %d\n",
pdev->num_msdu_desc);
return;
}
@ -330,6 +332,32 @@ uint32_t ol_tx_get_desc_global_pool_size(struct ol_txrx_pdev_t *pdev)
{
return pdev->num_msdu_desc;
}
/**
* ol_tx_get_total_free_desc() - get total free descriptors
* @pdev: pdev handle
*
* Return: total free descriptors
*/
static inline
uint32_t ol_tx_get_total_free_desc(struct ol_txrx_pdev_t *pdev)
{
struct ol_tx_flow_pool_t *pool = NULL;
uint32_t free_desc;
free_desc = pdev->tx_desc.num_free;
cdf_spin_lock_bh(&pdev->tx_desc.flow_pool_list_lock);
TAILQ_FOREACH(pool, &pdev->tx_desc.flow_pool_list,
flow_pool_list_elem) {
cdf_spin_lock_bh(&pool->flow_pool_lock);
free_desc += pool->avail_desc;
cdf_spin_unlock_bh(&pool->flow_pool_lock);
}
cdf_spin_unlock_bh(&pdev->tx_desc.flow_pool_list_lock);
return free_desc;
}
#else
/**
* ol_tx_get_desc_global_pool_size() - get global pool size
@ -342,6 +370,19 @@ uint32_t ol_tx_get_desc_global_pool_size(struct ol_txrx_pdev_t *pdev)
{
return ol_cfg_target_tx_credit(pdev->ctrl_pdev);
}
/**
* ol_tx_get_total_free_desc() - get total free descriptors
* @pdev: pdev handle
*
* Return: total free descriptors
*/
static inline
uint32_t ol_tx_get_total_free_desc(struct ol_txrx_pdev_t *pdev)
{
return pdev->tx_desc.num_free;
}
#endif
/**
@ -1642,11 +1683,6 @@ void ol_txrx_peer_unref_delete(ol_txrx_peer_handle peer)
/* check whether the parent vdev has no peers left */
if (TAILQ_EMPTY(&vdev->peer_list)) {
/*
* Now that there are no references to the peer, we can
* release the peer reference lock.
*/
cdf_spin_unlock_bh(&pdev->peer_ref_mutex);
/*
* Check if the parent vdev was waiting for its peers
* to be deleted, in order for it to be deleted too.
@ -1657,6 +1693,12 @@ void ol_txrx_peer_unref_delete(ol_txrx_peer_handle peer)
void *vdev_delete_context =
vdev->delete.context;
/*
* Now that there are no references to the peer,
* we can release the peer reference lock.
*/
cdf_spin_unlock_bh(&pdev->peer_ref_mutex);
TXRX_PRINT(TXRX_PRINT_LEVEL_INFO1,
"%s: deleting vdev object %p "
"(%02x:%02x:%02x:%02x:%02x:%02x)"
@ -1672,9 +1714,12 @@ void ol_txrx_peer_unref_delete(ol_txrx_peer_handle peer)
cdf_mem_free(vdev);
if (vdev_delete_cb)
vdev_delete_cb(vdev_delete_context);
} else {
cdf_spin_unlock_bh(&pdev->peer_ref_mutex);
}
} else
} else {
cdf_spin_unlock_bh(&pdev->peer_ref_mutex);
}
/*
* 'array' is allocated in addba handler and is supposed to be
@ -1853,7 +1898,7 @@ int ol_txrx_get_tx_pending(ol_txrx_pdev_handle pdev_handle)
total = ol_tx_get_desc_global_pool_size(pdev);
return total - pdev->tx_desc.num_free;
return total - ol_tx_get_total_free_desc(pdev);
}
void ol_txrx_discard_tx_pending(ol_txrx_pdev_handle pdev_handle)
@ -1920,7 +1965,8 @@ ol_txrx_fw_stats_cfg(ol_txrx_vdev_handle vdev,
}
A_STATUS
ol_txrx_fw_stats_get(ol_txrx_vdev_handle vdev, struct ol_txrx_stats_req *req)
ol_txrx_fw_stats_get(ol_txrx_vdev_handle vdev, struct ol_txrx_stats_req *req,
bool response_expected)
{
struct ol_txrx_pdev_t *pdev = vdev->pdev;
uint64_t cookie;
@ -1961,6 +2007,9 @@ ol_txrx_fw_stats_get(ol_txrx_vdev_handle vdev, struct ol_txrx_stats_req *req)
while (cdf_semaphore_acquire(pdev->osdev, req->wait.sem_ptr))
;
if (response_expected == false)
cdf_mem_free(non_volatile_req);
return A_OK;
}
#endif
@ -2728,16 +2777,20 @@ void ol_txrx_ipa_uc_fw_op_event_handler(void *context,
if (cdf_unlikely(!pdev)) {
CDF_TRACE(CDF_MODULE_ID_TXRX, CDF_TRACE_LEVEL_ERROR,
"%s: Invalid context", __func__);
cdf_mem_free(rxpkt);
return;
}
if (pdev->ipa_uc_op_cb)
if (pdev->ipa_uc_op_cb) {
pdev->ipa_uc_op_cb(rxpkt, pdev->osif_dev);
else
} else {
CDF_TRACE(CDF_MODULE_ID_TXRX, CDF_TRACE_LEVEL_ERROR,
"%s: ipa_uc_op_cb NULL", __func__);
cdf_mem_free(rxpkt);
}
}
#ifdef QCA_CONFIG_SMP
/**
* ol_txrx_ipa_uc_op_response() - Handle OP command response from firmware
* @pdev: handle to the HTT instance
@ -2766,6 +2819,20 @@ void ol_txrx_ipa_uc_op_response(ol_txrx_pdev_handle pdev, uint8_t *op_msg)
pkt->staId = 0;
cds_indicate_rxpkt(sched_ctx, pkt);
}
#else
void ol_txrx_ipa_uc_op_response(ol_txrx_pdev_handle pdev,
uint8_t *op_msg)
{
if (pdev->ipa_uc_op_cb) {
pdev->ipa_uc_op_cb(op_msg, pdev->osif_dev);
} else {
CDF_TRACE(CDF_MODULE_ID_TXRX, CDF_TRACE_LEVEL_ERROR,
"%s: IPA callback function is not registered", __func__);
cdf_mem_free(op_msg);
return;
}
}
#endif
/**
* ol_txrx_ipa_uc_register_op_cb() - Register OP handler function

View file

@ -430,6 +430,9 @@ int ol_tx_delete_flow_pool(struct ol_tx_flow_pool_t *pool)
cdf_spin_unlock_bh(&pool->flow_pool_lock);
pdev->tx_desc.num_invalid_bin++;
TXRX_PRINT(TXRX_PRINT_LEVEL_ERR,
"%s: invalid pool created %d\n",
__func__, pdev->tx_desc.num_invalid_bin);
if (pdev->tx_desc.num_invalid_bin > MAX_INVALID_BIN)
ASSERT(0);
@ -477,6 +480,9 @@ int ol_tx_free_invalid_flow_pool(struct ol_tx_flow_pool_t *pool)
cdf_spin_unlock_bh(&pool->flow_pool_lock);
pdev->tx_desc.num_invalid_bin--;
TXRX_PRINT(TXRX_PRINT_LEVEL_ERR,
"%s: invalid pool deleted %d\n",
__func__, pdev->tx_desc.num_invalid_bin);
return ol_tx_delete_flow_pool(pool);
}

View file

@ -109,7 +109,7 @@ struct sQcSapreq_wscie {
* Retrieve the WPS PBC Probe Request IEs.
*/
typedef struct sQcSapreq_WPSPBCProbeReqIES {
uint8_t macaddr[QCSAP_ADDR_LEN];
struct cdf_mac_addr macaddr;
uint16_t probeReqIELen;
uint8_t probeReqIE[512];
} sQcSapreq_WPSPBCProbeReqIES_t;

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2013-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2013-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -51,10 +51,6 @@
/* Timeout (in ms) for Link to Up before Registering Station */
#define ASSOC_LINKUP_TIMEOUT 60
/* In pronto case, IBSS owns the first peer for bss peer.
In Rome case, IBSS uses the 2nd peer as bss peer */
#define IBSS_BROADCAST_STAID 1
/* Type Declarations */
/**
* typedef eConnectionState - Connection states
@ -256,4 +252,13 @@ CDF_STATUS hdd_change_peer_state(hdd_adapter_t *pAdapter,
uint8_t sta_id,
enum ol_txrx_peer_state sta_state,
bool roam_synch_in_progress);
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
bool hdd_is_roam_sync_in_progress(tCsrRoamInfo *roaminfo);
#else
static inline bool hdd_is_roam_sync_in_progress(tCsrRoamInfo *roaminfo)
{
return false;
}
#endif
#endif

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2012-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -138,6 +138,21 @@
#define CFG_MAX_RX_AMPDU_FACTOR_MAX WNI_CFG_MAX_RX_AMPDU_FACTOR_STAMAX
#define CFG_MAX_RX_AMPDU_FACTOR_DEFAULT WNI_CFG_MAX_RX_AMPDU_FACTOR_STADEF
/* Configuration option for HT MPDU density (Table 8-125 802.11-2012)
* 0 for no restriction
* 1 for 1/4 micro sec
* 2 for 1/2 micro sec
* 3 for 1 micro sec
* 4 for 2 micro sec
* 5 for 4 micro sec
* 6 for 8 micro sec
* 7 for 16 micro sec
*/
#define CFG_HT_MPDU_DENSITY_NAME "ght_mpdu_density"
#define CFG_HT_MPDU_DENSITY_MIN WNI_CFG_MPDU_DENSITY_STAMIN
#define CFG_HT_MPDU_DENSITY_MAX WNI_CFG_MPDU_DENSITY_STAMAX
#define CFG_HT_MPDU_DENSITY_DEFAULT WNI_CFG_MPDU_DENSITY_STADEF
/* Configuration added to enable/disable CTS2SELF in */
/* Adaptive RX drain feature */
#define CFG_ENABLE_ADAPT_RX_DRAIN_NAME "gEnableAdaptRxDrain"
@ -230,7 +245,6 @@ typedef enum {
#define CFG_RSSI_CATEGORY_GAP_MAX (100)
#define CFG_RSSI_CATEGORY_GAP_DEFAULT (5)
#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_ESE) || defined(FEATURE_WLAN_LFR)
#define CFG_ROAM_PREFER_5GHZ "gRoamPrefer5GHz"
#define CFG_ROAM_PREFER_5GHZ_MIN (0)
#define CFG_ROAM_PREFER_5GHZ_MAX (1)
@ -244,7 +258,6 @@ typedef enum {
#define CFG_ROAM_INTRA_BAND_MIN (0)
#define CFG_ROAM_INTRA_BAND_MAX (1)
#define CFG_ROAM_INTRA_BAND_DEFAULT (0)
#endif
#define CFG_SHORT_PREAMBLE_NAME "gShortPreamble"
#define CFG_SHORT_PREAMBLE_MIN WNI_CFG_SHORT_PREAMBLE_STAMIN
@ -618,7 +631,6 @@ typedef enum {
#define CFG_ESE_FEATURE_ENABLED_DEFAULT (0) /* disabled */
#endif /* FEATURE_WLAN_ESE */
#ifdef FEATURE_WLAN_LFR
#define CFG_LFR_FEATURE_ENABLED_NAME "FastRoamEnabled"
#define CFG_LFR_FEATURE_ENABLED_MIN (0)
#define CFG_LFR_FEATURE_ENABLED_MAX (1)
@ -628,9 +640,7 @@ typedef enum {
#define CFG_LFR_MAWC_FEATURE_ENABLED_MIN (0)
#define CFG_LFR_MAWC_FEATURE_ENABLED_MAX (1)
#define CFG_LFR_MAWC_FEATURE_ENABLED_DEFAULT (0) /* disabled */
#endif /* FEATURE_WLAN_LFR */
#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_ESE) || defined(FEATURE_WLAN_LFR)
/* This flag will control fasttransition in case of 11r and ese. */
/* Basically with this the whole neighbor roam, pre-auth, reassoc */
/* can be turned ON/OFF. */
@ -670,8 +680,6 @@ typedef enum {
#define CFG_ROAM_SCAN_HOME_AWAY_TIME_DEFAULT (CFG_ROAM_SCAN_HOME_AWAY_TIME_MIN)
/* disabled by default */
#endif /* (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_ESE) || defined(FEATURE_WLAN_LFR) */
#ifdef FEATURE_WLAN_OKC
#define CFG_OKC_FEATURE_ENABLED_NAME "OkcEnabled"
#define CFG_OKC_FEATURE_ENABLED_MIN (0)
@ -832,11 +840,6 @@ typedef enum {
#define CFG_QOS_IMPLICIT_SETUP_ENABLED_MAX (1)
#define CFG_QOS_IMPLICIT_SETUP_ENABLED_DEFAULT (1)
#define CFG_ENABLE_LOGP_NAME "gEnableLogp"
#define CFG_ENABLE_LOGP_MIN (0)
#define CFG_ENABLE_LOGP_MAX (1)
#define CFG_ENABLE_LOGP_DEFAULT (0)
#if defined WLAN_FEATURE_VOWIFI_11R
#define CFG_FT_RESOURCE_REQ_NAME "gFTResourceReqSupported"
#define CFG_FT_RESOURCE_REQ_MIN (0)
@ -869,7 +872,6 @@ typedef enum {
#define CFG_BCN_EARLY_TERM_WAKE_MAX (255)
#define CFG_BCN_EARLY_TERM_WAKE_DEFAULT (3)
#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
#define CFG_NEIGHBOR_SCAN_TIMER_PERIOD_NAME "gNeighborScanTimerPeriod"
#define CFG_NEIGHBOR_SCAN_TIMER_PERIOD_MIN (3)
#define CFG_NEIGHBOR_SCAN_TIMER_PERIOD_MAX (300)
@ -949,7 +951,6 @@ typedef enum {
#define CFG_ROAM_BEACON_RSSI_WEIGHT_MIN (0)
#define CFG_ROAM_BEACON_RSSI_WEIGHT_MAX (16)
#define CFG_ROAM_BEACON_RSSI_WEIGHT_DEFAULT (14)
#endif /* WLAN_FEATURE_NEIGHBOR_ROAMING */
#define CFG_QOS_WMM_BURST_SIZE_DEFN_NAME "burstSizeDefinition"
#define CFG_QOS_WMM_BURST_SIZE_DEFN_MIN (0)
@ -1246,6 +1247,29 @@ typedef enum {
#define CFG_ENABLE_GREEN_AP_FEATURE_MIN (0)
#define CFG_ENABLE_GREEN_AP_FEATURE_MAX (1)
#define CFG_ENABLE_GREEN_AP_FEATURE_DEFAULT (1)
/* Enhanced Green AP (EGAP) flags/params */
#define CFG_ENABLE_EGAP_ENABLE_FEATURE "gEnableEGAP"
#define CFG_ENABLE_EGAP_ENABLE_FEATURE_MIN (0)
#define CFG_ENABLE_EGAP_ENABLE_FEATURE_MAX (1)
#define CFG_ENABLE_EGAP_ENABLE_FEATURE_DEFAULT (0)
#define CFG_ENABLE_EGAP_INACT_TIME_FEATURE "gEGAPInactTime"
#define CFG_ENABLE_EGAP_INACT_TIME_FEATURE_MIN (0)
#define CFG_ENABLE_EGAP_INACT_TIME_FEATURE_MAX (5000)
#define CFG_ENABLE_EGAP_INACT_TIME_FEATURE_DEFAULT (1000)
#define CFG_ENABLE_EGAP_WAIT_TIME_FEATURE "gEGAPWaitTime"
#define CFG_ENABLE_EGAP_WAIT_TIME_FEATURE_MIN (0)
#define CFG_ENABLE_EGAP_WAIT_TIME_FEATURE_MAX (5000)
#define CFG_ENABLE_EGAP_WAIT_TIME_FEATURE_DEFAULT (100)
#define CFG_ENABLE_EGAP_FLAGS_FEATURE "gEGAPFeatures"
#define CFG_ENABLE_EGAP_FLAGS_FEATURE_MIN (0)
#define CFG_ENABLE_EGAP_FLAGS_FEATURE_MAX (15)
#define CFG_ENABLE_EGAP_FLAGS_FEATURE_DEFAULT (7)
/* end Enhanced Green AP flags/params */
#endif
#ifdef FEATURE_WLAN_FORCE_SAP_SCC
@ -1538,22 +1562,35 @@ typedef enum {
#define CFG_TDLS_TX_STATS_PERIOD "gTDLSTxStatsPeriod"
#define CFG_TDLS_TX_STATS_PERIOD_MIN (10)
#define CFG_TDLS_TX_STATS_PERIOD_MAX (4294967295UL)
#define CFG_TDLS_TX_STATS_PERIOD_DEFAULT (5000)
#define CFG_TDLS_TX_STATS_PERIOD_DEFAULT (500)
#define CFG_TDLS_TX_PACKET_THRESHOLD "gTDLSTxPacketThreshold"
#define CFG_TDLS_TX_PACKET_THRESHOLD_MIN (0)
#define CFG_TDLS_TX_PACKET_THRESHOLD_MAX (4294967295UL)
#define CFG_TDLS_TX_PACKET_THRESHOLD_DEFAULT (100)
#define CFG_TDLS_TX_PACKET_THRESHOLD_DEFAULT (10)
#define CFG_TDLS_MAX_DISCOVERY_ATTEMPT "gTDLSMaxDiscoveryAttempt"
#define CFG_TDLS_MAX_DISCOVERY_ATTEMPT_MIN (1)
#define CFG_TDLS_MAX_DISCOVERY_ATTEMPT_MAX (100)
#define CFG_TDLS_MAX_DISCOVERY_ATTEMPT_DEFAULT (5)
/* teardown notification interval (gTDLSIdleTimeout) should be multiple of
* setup notification (gTDLSTxStatsPeriod) interval.
* e.g.
* if setup notification (gTDLSTxStatsPeriod) interval = 500, then
* teardown notification (gTDLSIdleTimeout) interval should be 1000,
* 1500, 2000, 2500...
*/
#define CFG_TDLS_IDLE_TIMEOUT "gTDLSIdleTimeout"
#define CFG_TDLS_IDLE_TIMEOUT_MIN (500)
#define CFG_TDLS_IDLE_TIMEOUT_MAX (40000)
#define CFG_TDLS_IDLE_TIMEOUT_DEFAULT (5000)
#define CFG_TDLS_IDLE_PACKET_THRESHOLD "gTDLSIdlePacketThreshold"
#define CFG_TDLS_IDLE_PACKET_THRESHOLD_MIN (0)
#define CFG_TDLS_IDLE_PACKET_THRESHOLD_MAX (40000)
#define CFG_TDLS_IDLE_PACKET_THRESHOLD_DEFAULT (5)
#define CFG_TDLS_IDLE_PACKET_THRESHOLD_DEFAULT (3)
#define CFG_TDLS_RSSI_TRIGGER_THRESHOLD "gTDLSRSSITriggerThreshold"
#define CFG_TDLS_RSSI_TRIGGER_THRESHOLD_MIN (-120)
@ -1641,6 +1678,20 @@ typedef enum {
#define CFG_TDLS_SCAN_ENABLE_MIN (0)
#define CFG_TDLS_SCAN_ENABLE_MAX (1)
#define CFG_TDLS_SCAN_ENABLE_DEFAULT (0)
/* TDLS peer kickout threshold to fw
* Firmware will use this value to determine, when to send TDLS
* peer kick out event to host.
* E.g.
* if peer kick out threshold is 10, then firmware will wait for 10
* consecutive packet failures and then send TDLS kickout
* notification to host driver
*/
#define CFG_TDLS_PEER_KICKOUT_THRESHOLD "gTDLSPeerKickoutThreshold"
#define CFG_TDLS_PEER_KICKOUT_THRESHOLD_MIN (10)
#define CFG_TDLS_PEER_KICKOUT_THRESHOLD_MAX (5000)
#define CFG_TDLS_PEER_KICKOUT_THRESHOLD_DEFAULT (96)
#endif
/* Enable/Disable LPWR Image(cMEM uBSP) Transition */
@ -1681,6 +1732,15 @@ typedef enum {
#define CFG_VHT_SU_BEAMFORMEE_CAP_FEATURE_MAX (WNI_CFG_VHT_SU_BEAMFORMEE_CAP_STAMAX)
#define CFG_VHT_SU_BEAMFORMEE_CAP_FEATURE_DEFAULT (WNI_CFG_VHT_SU_BEAMFORMEE_CAP_STADEF)
/*
* Enable / Disable Tx beamformee in SAP mode
* Default: Disable
*/
#define CFG_VHT_ENABLE_TXBF_SAP_MODE "gEnableTxBFeeSAP"
#define CFG_VHT_ENABLE_TXBF_SAP_MODE_MIN (0)
#define CFG_VHT_ENABLE_TXBF_SAP_MODE_MAX (1)
#define CFG_VHT_ENABLE_TXBF_SAP_MODE_DEFAULT (0)
#define CFG_VHT_CSN_BEAMFORMEE_ANT_SUPPORTED "gTxBFCsnValue"
#define CFG_VHT_CSN_BEAMFORMEE_ANT_SUPPORTED_MIN (WNI_CFG_VHT_CSN_BEAMFORMEE_ANT_SUPPORTED_STAMIN)
#define CFG_VHT_CSN_BEAMFORMEE_ANT_SUPPORTED_MAX (WNI_CFG_VHT_CSN_BEAMFORMEE_ANT_SUPPORTED_STAMAX - 1)
@ -1887,7 +1947,11 @@ typedef enum {
#define CFG_ENABLE_FW_LOG_NAME "gEnablefwlog"
#define CFG_ENABLE_FW_LOG_DISABLE (0)
#define CFG_ENABLE_FW_LOG_ENABLE (1)
#ifdef QCA_WIFI_3_0_ADRASTEA
#define CFG_ENABLE_FW_LOG_DEFAULT (CFG_ENABLE_FW_LOG_DISABLE)
#else
#define CFG_ENABLE_FW_LOG_DEFAULT (CFG_ENABLE_FW_LOG_ENABLE)
#endif
/*
* Enable/Disable SSR for USB
@ -2776,6 +2840,43 @@ enum dot11p_mode {
#define CFG_FIRST_SCAN_BUCKET_THRESHOLD_MAX (-30)
#define CFG_FIRST_SCAN_BUCKET_THRESHOLD_DEFAULT (-30)
#ifdef FEATURE_LFR_SUBNET_DETECTION
/*
* Enable IP subnet detection during legacy fast roming version 3.
* Legacy fast roaming could roam across IP subnets without host
* processors' knowledge. This feature enables firmware to wake up
* the host processor if it successfully determines change in the IP subnet.
* Change in IP subnet could potentially cause disruption in IP connnectivity
* if IP address is not refreshed.
*/
#define CFG_ENABLE_LFR_SUBNET_DETECTION "gLFRSubnetDetectionEnable"
#define CFG_ENABLE_LFR_SUBNET_MIN (0)
#define CFG_ENABLE_LFR_SUBNET_MAX (1)
#define CFG_ENABLE_LFR_SUBNET_DEFAULT (1)
#endif /* FEATURE_LFR_SUBNET_DETECTION */
/* Option to report rssi in cfg80211_inform_bss_frame()
* 0 = use rssi value based on noise floor = -96 dBm
* 1 = use rssi value based on actual noise floor in hardware
*/
#define CFG_INFORM_BSS_RSSI_RAW_NAME "gInformBssRssiRaw"
#define CFG_INFORM_BSS_RSSI_RAW_MIN (0)
#define CFG_INFORM_BSS_RSSI_RAW_MAX (1)
#define CFG_INFORM_BSS_RSSI_RAW_DEFAULT (1)
#ifdef QCA_WIFI_3_0_EMU
/*
* On M2M emulation platform we have a fixed mapping between macs, hence
* vdev transition & MCC support is not possible on this platform. But MPR
* platform doesn't have these limitations. This config allows at runtime
* enable/disable vdev transition & MCC support depending on the platform
* it is running on
*/
#define CFG_ENABLE_M2M_LIMITATION "gEnableM2MLimitation"
#define CFG_ENABLE_M2M_LIMITATION_MIN (0)
#define CFG_ENABLE_M2M_LIMITATION_MAX (1)
#define CFG_ENABLE_M2M_LIMITATION_DEFAULT (1)
#endif /* QCA_WIFI_3_0_EMU */
/*---------------------------------------------------------------------------
Type declarations
-------------------------------------------------------------------------*/
@ -2794,7 +2895,6 @@ struct hdd_config {
bool fSupplicantCountryCodeHasPriority;
uint32_t HeartbeatThresh24;
char PowerUsageControl[4];
bool fIsLogpEnabled;
bool fIsImpsEnabled;
bool is_ps_enabled;
uint32_t nBmpsModListenInterval;
@ -2850,7 +2950,6 @@ struct hdd_config {
bool fFTResourceReqSupported;
#endif
#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
uint16_t nNeighborScanPeriod;
uint8_t nNeighborLookupRssiThreshold;
uint8_t delay_before_vdev_stop;
@ -2869,7 +2968,6 @@ struct hdd_config {
uint32_t nhi_rssi_scan_rssi_delta;
uint32_t nhi_rssi_scan_delay;
int32_t nhi_rssi_scan_rssi_ub;
#endif
/* Additional Handoff params */
uint32_t nRoamingTime;
@ -2922,19 +3020,15 @@ struct hdd_config {
uint32_t InfraUapsdBeSuspIntv;
uint32_t InfraUapsdBkSrvIntv;
uint32_t InfraUapsdBkSuspIntv;
#ifdef FEATURE_WLAN_LFR
bool isFastRoamIniFeatureEnabled;
bool MAWCEnabled;
#endif
#ifdef FEATURE_WLAN_ESE
uint32_t InfraInactivityInterval;
bool isEseIniFeatureEnabled;
#endif
#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_ESE) || defined(FEATURE_WLAN_LFR)
bool isFastTransitionEnabled;
uint8_t RoamRssiDiff;
bool isWESModeEnabled;
#endif
#ifdef FEATURE_WLAN_OKC
bool isOkcIniFeatureEnabled;
#endif
@ -3043,12 +3137,10 @@ struct hdd_config {
int32_t linkSpeedRssiHigh;
int32_t linkSpeedRssiMid;
int32_t linkSpeedRssiLow;
#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_ESE) || defined(FEATURE_WLAN_LFR)
bool nRoamPrefer5GHz;
bool nRoamIntraBand;
uint8_t nProbes;
uint16_t nRoamScanHomeAwayTime;
#endif
uint8_t enableMCC;
uint8_t allowMCCGODiffBI;
bool isP2pDeviceAddrAdministrated;
@ -3058,6 +3150,7 @@ struct hdd_config {
uint8_t vhtRxMCS;
uint8_t vhtTxMCS;
bool enableTxBF;
bool enable_txbf_sap_mode;
uint8_t txBFCsnValue;
bool enable_su_tx_bformer;
uint8_t vhtRxMCS2x2;
@ -3087,6 +3180,7 @@ struct hdd_config {
uint32_t fTDLSTxStatsPeriod;
uint32_t fTDLSTxPacketThreshold;
uint32_t fTDLSMaxDiscoveryAttempt;
uint32_t tdls_idle_timeout;
uint32_t fTDLSIdlePacketThreshold;
int32_t fTDLSRSSITriggerThreshold;
int32_t fTDLSRSSITeardownThreshold;
@ -3104,6 +3198,7 @@ struct hdd_config {
uint8_t fTDLSPrefOffChanNum;
uint8_t fTDLSPrefOffChanBandwidth;
uint8_t enable_tdls_scan;
uint32_t tdls_peer_kickout_threshold;
#endif
#ifdef WLAN_SOFTAP_VSTA_FEATURE
bool fEnableVSTASupport;
@ -3247,6 +3342,10 @@ struct hdd_config {
#ifdef FEATURE_GREEN_AP
bool enableGreenAP;
bool enable_egap;
uint32_t egap_feature_flag;
uint32_t egap_inact_time;
uint32_t egap_wait_time;
#endif
uint8_t force_sap_acs;
uint8_t force_sap_acs_st_ch;
@ -3355,6 +3454,14 @@ struct hdd_config {
int8_t early_stop_scan_min_threshold;
int8_t early_stop_scan_max_threshold;
int8_t first_scan_bucket_threshold;
uint8_t ht_mpdu_density;
#ifdef FEATURE_LFR_SUBNET_DETECTION
bool enable_lfr_subnet_detection;
#endif
uint8_t inform_bss_rssi_raw;
#ifdef QCA_WIFI_3_0_EMU
bool enable_m2m_limitation;
#endif
};
#define VAR_OFFSET(_Struct, _Var) (offsetof(_Struct, _Var))
@ -3444,7 +3551,7 @@ typedef enum {
typedef struct tREG_TABLE_ENTRY {
char *RegName; /* variable name in the qcom_cfg.ini file */
WLAN_PARAMETER_TYPE RegType; /* variable type in the hdd_config_t structure */
WLAN_PARAMETER_TYPE RegType; /* variable type in hdd_config struct */
unsigned long Flags; /* Specify optional parms and if RangeCheck is performed */
unsigned short VarOffset; /* offset to field from the base address of the structure */
unsigned short VarSize; /* size (in bytes) of the field */

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2014 The Linux Foundation. All rights reserved.
* Copyright (c) 2014-2015 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -51,8 +51,8 @@ typedef struct {
uint8_t offloadType;
uint8_t enableOrDisable;
union {
uint8_t hostIpv4Addr[4];
uint8_t hostIpv6Addr[16];
uint8_t hostIpv4Addr[SIR_IPV4_ADDR_LEN];
uint8_t hostIpv6Addr[SIR_MAC_IPV6_ADDR_LEN];
} params;
struct cdf_mac_addr bssId;
} tHostOffloadRequest, *tpHostOffloadRequest;

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2012-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -156,8 +156,9 @@
#define WLAN_CHIP_VERSION "WCNSS"
#ifndef HDD_DISALLOW_LEGACY_HDDLOG
#define hddLog(level, args ...) CDF_TRACE(CDF_MODULE_ID_HDD, level, ## args)
#endif
#define hdd_log(level, args...) CDF_TRACE(CDF_MODULE_ID_HDD, level, ## args)
#define hdd_logfl(level, format, args...) hdd_log(level, FL(format), ## args)
@ -529,14 +530,23 @@ typedef struct beacon_data_s {
int dtim_period;
} beacon_data_t;
/* MAINTAIN 1 - 1 CORRESPONDENCE WITH tCDF_CON_MODE */
/**
* enum device_mode: Maintain one to one correspondence with tCDF_ADAPTER_MODE
* @WLAN_HDD_INFRA_STATION: station mode
* @WLAN_HDD_SOFTAP: sap mode
* @WLAN_HDD_P2P_CLIENT: p2p client mode
* @WLAN_HDD_P2P_GO: p2p go mode
* @WLAN_HDD_FTM: ftm mode
* @WLAN_HDD_IBSS: ibss mode
* @WLAN_HDD_P2P_DEVICE: p2p device mode
* @WLAN_HDD_OCB: ocb mode
*/
typedef enum device_mode {
WLAN_HDD_INFRA_STATION,
WLAN_HDD_SOFTAP,
WLAN_HDD_P2P_CLIENT,
WLAN_HDD_P2P_GO,
/* Mode 5 is reserved for FTM */
WLAN_HDD_FTM = 5,
WLAN_HDD_FTM,
WLAN_HDD_IBSS,
WLAN_HDD_P2P_DEVICE,
WLAN_HDD_OCB
@ -623,12 +633,6 @@ typedef struct hdd_cfg80211_state_s {
eP2PActionFrameState actionFrmState;
} hdd_cfg80211_state_t;
typedef enum {
HDD_SSR_NOT_REQUIRED,
HDD_SSR_REQUIRED,
HDD_SSR_DISABLED,
} e_hdd_ssr_required;
struct hdd_station_ctx {
/** Handle to the Wireless Extension State */
hdd_wext_state_t WextState;
@ -642,9 +646,7 @@ struct hdd_station_ctx {
roaming_info_t roam_info;
#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_ESE) || defined(FEATURE_WLAN_LFR)
int ft_carrier_on;
#endif
#ifdef WLAN_FEATURE_GTK_OFFLOAD
tSirGtkOffloadParams gtkOffloadReqParams;
@ -662,6 +664,8 @@ struct hdd_station_ctx {
/* STA ctx debug variables */
int staDebugState;
uint8_t broadcast_ibss_staid;
};
#define BSS_STOP 0
@ -813,13 +817,20 @@ struct hdd_netif_queue_history {
struct hdd_adapter_s {
void *pHddCtx;
/* Magic cookie for adapter sanity verification. Note that this
* needs to be at the beginning of the private data structure so
* that it will exists at the beginning of dev->priv and hence
* will always be in mapped memory
*/
uint32_t magic;
device_mode_t device_mode;
void *pHddCtx;
/** Handle to the network device */
struct net_device *dev;
device_mode_t device_mode;
/** IPv4 notifier callback for handling ARP offload on change in IP */
struct work_struct ipv4NotifierWorkQueue;
#ifdef WLAN_NS_OFFLOAD
@ -939,8 +950,6 @@ struct hdd_adapter_s {
#endif
uint8_t addr_filter_pattern;
/* Magic cookie for adapter sanity verification */
uint32_t magic;
bool higherDtimTransition;
bool survey_idx;
@ -1127,12 +1136,6 @@ struct hdd_context_s {
bool is_ol_rx_thread_suspended;
#endif
volatile bool isLogpInProgress;
bool isLoadInProgress;
bool isUnloadInProgress;
/* Track whether Mcast/Bcast Filter is enabled. */
bool hdd_mcastbcast_filter_set;
@ -1142,10 +1145,6 @@ struct hdd_context_s {
/* Lock to avoid race condition during start/stop bss */
struct mutex sap_lock;
#ifdef WLAN_KD_READY_NOTIFIER
bool kd_nl_init;
#endif /* WLAN_KD_READY_NOTIFIER */
#ifdef FEATURE_OEM_DATA_SUPPORT
/* OEM App registered or not */
bool oem_app_registered;
@ -1203,7 +1202,7 @@ struct hdd_context_s {
/* Use below lock to protect access to isSchedScanUpdatePending
* since it will be accessed in two different contexts.
*/
spinlock_t schedScan_lock;
cdf_spinlock_t sched_scan_lock;
/* Flag keeps track of wiphy suspend/resume */
bool isWiphySuspended;
@ -1320,8 +1319,7 @@ struct hdd_context_s {
cdf_mc_timer_t dbs_opportunistic_timer;
bool connection_in_progress;
spinlock_t connection_status_lock;
cdf_mutex_t hdd_conc_list_lock;
cdf_spinlock_t connection_status_lock;
uint16_t hdd_txrx_hist_idx;
struct hdd_tx_rx_histogram hdd_txrx_hist[NUM_TX_RX_HISTOGRAM];
@ -1336,6 +1334,9 @@ struct hdd_context_s {
/*---------------------------------------------------------------------------
Function declarations and documentation
-------------------------------------------------------------------------*/
int hdd_validate_channel_and_bandwidth(hdd_adapter_t *adapter,
uint32_t chan_number,
phy_ch_width chan_bw);
#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
void wlan_hdd_check_sta_ap_concurrent_ch_intf(void *sta_pAdapter);
#endif
@ -1363,10 +1364,10 @@ CDF_STATUS hdd_add_adapter_front(hdd_context_t *pHddCtx,
hdd_adapter_t *hdd_open_adapter(hdd_context_t *pHddCtx, uint8_t session_type,
const char *name, tSirMacAddr macAddr,
uint8_t rtnl_held);
bool rtnl_held);
CDF_STATUS hdd_close_adapter(hdd_context_t *pHddCtx, hdd_adapter_t *pAdapter,
uint8_t rtnl_held);
CDF_STATUS hdd_close_all_adapters(hdd_context_t *pHddCtx);
bool rtnl_held);
CDF_STATUS hdd_close_all_adapters(hdd_context_t *pHddCtx, bool rtnl_held);
CDF_STATUS hdd_stop_all_adapters(hdd_context_t *pHddCtx);
CDF_STATUS hdd_reset_all_adapters(hdd_context_t *pHddCtx);
CDF_STATUS hdd_start_all_adapters(hdd_context_t *pHddCtx);
@ -1385,8 +1386,8 @@ uint8_t *wlan_hdd_get_intf_addr(hdd_context_t *pHddCtx);
void wlan_hdd_release_intf_addr(hdd_context_t *pHddCtx, uint8_t *releaseAddr);
uint8_t hdd_get_operating_channel(hdd_context_t *pHddCtx, device_mode_t mode);
void hdd_set_conparam(uint32_t newParam);
tCDF_CON_MODE hdd_get_conparam(void);
void hdd_set_conparam(uint32_t con_param);
enum tCDF_GLOBAL_CON_MODE hdd_get_conparam(void);
void hdd_abort_mac_scan(hdd_context_t *pHddCtx, uint8_t sessionId,
eCsrAbortReason reason);
@ -1397,8 +1398,6 @@ void wlan_hdd_reset_prob_rspies(hdd_adapter_t *pHostapdAdapter);
void hdd_prevent_suspend(uint32_t reason);
void hdd_allow_suspend(uint32_t reason);
void hdd_prevent_suspend_timeout(uint32_t timeout, uint32_t reason);
bool hdd_is_ssr_required(void);
void hdd_set_ssr_required(e_hdd_ssr_required value);
void wlan_hdd_cfg80211_update_wiphy_caps(struct wiphy *wiphy);
CDF_STATUS hdd_set_ibss_power_save_params(hdd_adapter_t *pAdapter);
@ -1425,6 +1424,9 @@ static inline void hdd_stop_bus_bw_computer_timer(hdd_adapter_t *pAdapter)
}
#endif
int hdd_init(void);
void hdd_deinit(void);
int hdd_wlan_startup(struct device *dev, void *hif_sc);
void __hdd_wlan_exit(void);
int hdd_wlan_notify_modem_power_state(int state);
@ -1453,23 +1455,6 @@ bool hdd_is_5g_supported(hdd_context_t *pHddCtx);
int wlan_hdd_scan_abort(hdd_adapter_t *pAdapter);
#ifdef WLAN_FEATURE_STATS_EXT
void wlan_hdd_cfg80211_stats_ext_init(hdd_context_t *pHddCtx);
#endif
#ifdef WLAN_FEATURE_LINK_LAYER_STATS
void wlan_hdd_cfg80211_link_layer_stats_init(hdd_context_t *pHddCtx);
static inline bool hdd_link_layer_stats_supported(void)
{
return true;
}
#else
static inline bool hdd_link_layer_stats_supported(void)
{
return false;
}
#endif /* WLAN_FEATURE_LINK_LAYER_STATS */
void hdd_get_fw_version(hdd_context_t *hdd_ctx,
uint32_t *major_spid, uint32_t *minor_spid,
uint32_t *siid, uint32_t *crmid);
@ -1496,10 +1481,8 @@ static inline bool hdd_is_memdump_supported(void)
void hdd_update_macaddr(struct hdd_config *config,
struct cdf_mac_addr hw_macaddr);
#if defined(FEATURE_WLAN_LFR)
void wlan_hdd_disable_roaming(hdd_adapter_t *pAdapter);
void wlan_hdd_enable_roaming(hdd_adapter_t *pAdapter);
#endif
CDF_STATUS hdd_post_cds_enable_config(hdd_context_t *pHddCtx);
@ -1517,7 +1500,6 @@ void wlan_hdd_start_sap(hdd_adapter_t *ap_adapter);
static inline void wlan_hdd_stop_sap(hdd_adapter_t *ap_adapter) {}
static inline void wlan_hdd_start_sap(hdd_adapter_t *ap_adapter) {}
#endif
cdf_wake_lock_t *hdd_wlan_get_wake_lock_ptr(void);
#ifdef QCA_CONFIG_SMP
int wlan_hdd_get_cpu(void);
@ -1537,7 +1519,10 @@ void wlan_hdd_clear_tx_rx_histogram(hdd_context_t *pHddCtx);
void wlan_hdd_display_netif_queue_history(hdd_context_t *hdd_ctx);
void wlan_hdd_clear_netif_queue_history(hdd_context_t *hdd_ctx);
const char *hdd_get_fwpath(void);
void hdd_indicate_mgmt_frame(tSirSmeMgmtFrameInd *frame_ind);
hdd_adapter_t *hdd_get_adapter_by_sme_session_id(hdd_context_t *hdd_ctx,
uint32_t sme_session_id);
phy_ch_width hdd_map_nl_chan_width(enum nl80211_chan_width ch_width);
uint8_t wlan_hdd_find_opclass(tHalHandle hal, uint8_t channel,
uint8_t bw_offset);

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2012-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -25,8 +25,6 @@
* to the Linux Foundation.
*/
#ifdef FEATURE_OEM_DATA_SUPPORT
/**
* DOC: wlan_hdd_oemdata.h
*
@ -36,6 +34,8 @@
#ifndef __WLAN_HDD_OEM_DATA_H__
#define __WLAN_HDD_OEM_DATA_H__
#ifdef FEATURE_OEM_DATA_SUPPORT
#ifndef OEM_DATA_REQ_SIZE
#define OEM_DATA_REQ_SIZE 280
#endif
@ -166,7 +166,10 @@ int iw_get_oem_data_cap(struct net_device *dev, struct iw_request_info *info,
int oem_activate_service(struct hdd_context_s *hdd_ctx);
void hdd_send_oem_data_rsp_msg(int length, uint8_t *oemDataRsp);
#endif /* __WLAN_HDD_OEM_DATA_H__ */
#else
static inline int oem_activate_service(struct hdd_context_s *hdd_ctx)
{
return 0;
}
#endif /* FEATURE_OEM_DATA_SUPPORT */
#endif /* __WLAN_HDD_OEM_DATA_H__ */

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2012-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -38,7 +38,6 @@
#define WAIT_CANCEL_REM_CHAN 1000
#define WAIT_REM_CHAN_READY 1000
#define WAIT_CHANGE_CHANNEL_FOR_OFFCHANNEL_TX 3000
#define ESTIMATED_ROC_DUR_REQD_FOR_ACTION_TX 20
#define COMPLETE_EVENT_PROPOGATE_TIME 10
#ifdef QCA_WIFI_3_0_EMU
@ -61,19 +60,9 @@
#define P2P_ROC_DURATION_MULTIPLIER_GO_ABSENT 5
#endif
#ifdef WLAN_FEATURE_11W
#define WLAN_HDD_SET_WEP_FRM_FC(__fc__) ((__fc__) = ((__fc__) | 0x40))
#endif /* WLAN_FEATURE_11W */
#define HDD_P2P_MAX_ROC_DURATION 1000
#define MAX_ROC_REQ_QUEUE_ENTRY 10
enum hdd_rx_flags {
HDD_RX_FLAG_DECRYPTED = 1 << 0,
HDD_RX_FLAG_MMIC_STRIPPED = 1 << 1,
HDD_RX_FLAG_IV_STRIPPED = 1 << 2,
};
#define P2P_POWER_SAVE_TYPE_OPPORTUNISTIC (1 << 0)
#define P2P_POWER_SAVE_TYPE_PERIODIC_NOA (1 << 1)
#define P2P_POWER_SAVE_TYPE_SINGLE_NOA (1 << 2)
@ -103,38 +92,23 @@ typedef struct p2p_app_setP2pPs {
} p2p_app_setP2pPs_t;
int wlan_hdd_cfg80211_remain_on_channel(struct wiphy *wiphy,
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
struct wireless_dev *wdev,
#else
struct net_device *dev,
#endif
struct ieee80211_channel *chan,
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0))
enum nl80211_channel_type channel_type,
#endif
unsigned int duration, u64 *cookie);
int wlan_hdd_cfg80211_cancel_remain_on_channel(struct wiphy *wiphy,
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
struct wireless_dev *wdev,
#else
struct net_device *dev,
#endif
u64 cookie);
int wlan_hdd_cfg80211_mgmt_tx_cancel_wait(struct wiphy *wiphy,
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
struct wireless_dev *wdev,
#else
struct net_device *dev,
#endif
u64 cookie);
int hdd_set_p2p_ps(struct net_device *dev, void *msgData);
int hdd_set_p2p_opps(struct net_device *dev, uint8_t *command);
int hdd_set_p2p_noa(struct net_device *dev, uint8_t *command);
void hdd_indicate_mgmt_frame(hdd_adapter_t *pAdapter,
void __hdd_indicate_mgmt_frame(hdd_adapter_t *pAdapter,
uint32_t nFrameLength, uint8_t *pbFrames,
uint8_t frameType, uint32_t rxChan, int8_t rxRssi);
@ -147,54 +121,22 @@ void wlan_hdd_cancel_existing_remain_on_channel(hdd_adapter_t *pAdapter);
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0))
int wlan_hdd_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
struct cfg80211_mgmt_tx_params *params, u64 *cookie);
#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
#else
int wlan_hdd_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
struct ieee80211_channel *chan, bool offchan,
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0))
enum nl80211_channel_type channel_type,
bool channel_type_valid,
#endif
unsigned int wait,
const u8 *buf, size_t len, bool no_cck,
bool dont_wait_for_ack, u64 *cookie);
#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 3, 0))
int wlan_hdd_mgmt_tx(struct wiphy *wiphy, struct net_device *dev,
struct ieee80211_channel *chan, bool offchan,
enum nl80211_channel_type channel_type,
bool channel_type_valid, unsigned int wait,
const u8 *buf, size_t len, bool no_cck,
bool dont_wait_for_ack, u64 *cookie);
#else
int wlan_hdd_mgmt_tx(struct wiphy *wiphy, struct net_device *dev,
struct ieee80211_channel *chan, bool offchan,
enum nl80211_channel_type channel_type,
bool channel_type_valid, unsigned int wait,
const u8 *buf, size_t len, u64 *cookie);
#endif
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 7, 0))
struct wireless_dev *wlan_hdd_add_virtual_intf(struct wiphy *wiphy,
const char *name,
enum nl80211_iftype type,
u32 *flags,
struct vif_params *params);
#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
struct wireless_dev *wlan_hdd_add_virtual_intf(struct wiphy *wiphy, char *name,
enum nl80211_iftype type,
u32 *flags,
struct vif_params *params);
#else
struct net_device *wlan_hdd_add_virtual_intf(struct wiphy *wiphy, char *name,
enum nl80211_iftype type,
u32 *flags,
struct vif_params *params);
#endif
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
int wlan_hdd_del_virtual_intf(struct wiphy *wiphy, struct wireless_dev *wdev);
#else
int wlan_hdd_del_virtual_intf(struct wiphy *wiphy, struct net_device *dev);
#endif
void wlan_hdd_cleanup_remain_on_channel_ctx(hdd_adapter_t *pAdapter);

View file

@ -39,18 +39,6 @@
#ifdef WLAN_FEATURE_PACKET_FILTERING
#define HDD_MAX_CMP_PER_PACKET_FILTER 5
#define HDD_FILTER_IPV6_MC_UC 1
#define HDD_FILTER_IPV6_MC 0
#define HDD_FILTER_ID_IPV6_MC 10
#define HDD_FILTER_ID_IPV6_UC 11
#define HDD_IPV6_MC_CMP_DATA 0x33
#define HDD_IPV6_UC_CMP_DATA 0x01
#define HDD_IPV6_CMP_DATA_0 0x86
#define HDD_IPV6_CMP_DATA_1 0xDD
#define HDD_WLAN_MAC_ADDR_LEN 6
#define HDD_MAX_NUM_MULTICAST_ADDRESS 10
/**
* enum pkt_filter_protocol_layer - packet filter protocol layer
@ -167,14 +155,10 @@ void hdd_ipv6_notifier_work_queue(struct work_struct *work);
#endif
int wlan_hdd_cfg80211_get_txpower(struct wiphy *wiphy,
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
struct wireless_dev *wdev,
#endif
int *dbm);
int wlan_hdd_cfg80211_set_txpower(struct wiphy *wiphy,
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
struct wireless_dev *wdev,
#endif
enum nl80211_tx_power_setting type,
int dbm);
int wlan_hdd_cfg80211_set_power_mgmt(struct wiphy *wiphy,

View file

@ -34,20 +34,6 @@
#ifdef FEATURE_WLAN_TDLS
#define TDLS_SUB_DISCOVERY_PERIOD 100
#define TDLS_MAX_DISCOVER_REQS_PER_TIMER 1
#define TDLS_DISCOVERY_PERIOD 3600000
#define TDLS_TX_STATS_PERIOD 3600000
#define TDLS_IMPLICIT_TRIGGER_PKT_THRESHOLD 100
#define TDLS_RX_IDLE_TIMEOUT 5000
#define TDLS_RSSI_TRIGGER_HYSTERESIS 50
/*
* Before UpdateTimer expires, we want to timeout discovery response
* should not be more than 2000.
@ -115,9 +101,6 @@ typedef struct {
*/
typedef struct {
struct wiphy *wiphy;
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0))
struct net_device *dev;
#endif
struct cfg80211_scan_request *scan_request;
int magic;
int attempt;
@ -134,12 +117,15 @@ typedef struct {
* @eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY: suppress implicit trigger,
* but respond to the peer
* @eTDLS_SUPPORT_ENABLED: implicit trigger
* @eTDLS_SUPPORT_EXTERNAL_CONTROL: External control means implicit
* trigger but only to a peer mac configured by user space.
*/
typedef enum {
eTDLS_SUPPORT_NOT_ENABLED = 0,
eTDLS_SUPPORT_DISABLED,
eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY,
eTDLS_SUPPORT_ENABLED,
eTDLS_SUPPORT_EXTERNAL_CONTROL,
} eTDLSSupportMode;
/**
@ -394,6 +380,9 @@ typedef struct {
* @puapsd_mask: puapsd mask
* @puapsd_inactivity_time: puapsd inactivity time
* @puapsd_rx_frame_threshold: puapsd rx frame threshold
* @teardown_notification_ms: tdls teardown notification interval
* @tdls_peer_kickout_threshold: tdls packets threshold
* for peer kickout operation
*/
typedef struct {
uint32_t vdev_id;
@ -409,6 +398,8 @@ typedef struct {
uint32_t puapsd_mask;
uint32_t puapsd_inactivity_time;
uint32_t puapsd_rx_frame_threshold;
uint32_t teardown_notification_ms;
uint32_t tdls_peer_kickout_threshold;
} tdlsInfo_t;
int wlan_hdd_tdls_init(hdd_adapter_t *pAdapter);
@ -492,15 +483,9 @@ hddTdlsPeer_t *wlan_hdd_tdls_is_progress(hdd_context_t *pHddCtx,
int wlan_hdd_tdls_copy_scan_context(hdd_context_t *pHddCtx,
struct wiphy *wiphy,
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0))
struct net_device *dev,
#endif
struct cfg80211_scan_request *request);
int wlan_hdd_tdls_scan_callback(hdd_adapter_t *pAdapter, struct wiphy *wiphy,
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0))
struct net_device *dev,
#endif
struct cfg80211_scan_request *request);
void wlan_hdd_tdls_scan_done_callback(hdd_adapter_t *pAdapter);
@ -523,6 +508,10 @@ int wlan_hdd_tdls_set_extctrl_param(hdd_adapter_t *pAdapter,
int wlan_hdd_tdls_set_force_peer(hdd_adapter_t *pAdapter, const uint8_t *mac,
bool forcePeer);
int wlan_hdd_tdls_update_peer_mac(hdd_adapter_t *adapter,
const uint8_t *mac,
uint32_t peer_state);
int wlan_hdd_tdls_extctrl_deconfig_peer(hdd_adapter_t *pAdapter,
const uint8_t *peer);
int wlan_hdd_tdls_extctrl_config_peer(hdd_adapter_t *pAdapter,
@ -618,6 +607,7 @@ int hdd_set_tdls_offchannel(hdd_context_t *hdd_ctx, int offchannel);
int hdd_set_tdls_secoffchanneloffset(hdd_context_t *hdd_ctx, int offchanoffset);
int hdd_set_tdls_offchannelmode(hdd_adapter_t *adapter, int offchanmode);
int hdd_set_tdls_scan_type(hdd_context_t *hdd_ctx, int val);
void hdd_tdls_pre_init(hdd_context_t *hdd_ctx);
#else
static inline void hdd_tdls_notify_mode_change(hdd_adapter_t *adapter,
@ -631,6 +621,8 @@ wlan_hdd_tdls_disable_offchan_and_teardown_links(hdd_context_t *hddctx)
static inline void wlan_hdd_tdls_exit(hdd_adapter_t *adapter)
{
}
static inline void hdd_tdls_pre_init(hdd_context_t *hdd_ctx) { }
#endif /* End of FEATURE_WLAN_TDLS */
#endif /* __HDD_TDLS_H */

View file

@ -108,7 +108,8 @@
ENUM(TRACE_CODE_HDD_CFG80211_SUSPEND_WLAN) \
ENUM(TRACE_CODE_HDD_CFG80211_SET_MAC_ACL) \
ENUM(TRACE_CODE_HDD_CFG80211_TESTMODE) \
ENUM(TRACE_CODE_HDD_CFG80211_DUMP_SURVEY)
ENUM(TRACE_CODE_HDD_CFG80211_DUMP_SURVEY) \
ENUM(TRACE_CODE_HDD_RX_SME_MSG)
enum {
#undef ENUM

View file

@ -42,25 +42,10 @@
#define HDD_ETHERTYPE_802_1_X 0x888E
#define HDD_ETHERTYPE_802_1_X_FRAME_OFFSET 12
#define HDD_ETHERTYPE_802_1_X_SIZE 2
#ifdef FEATURE_WLAN_WAPI
#define HDD_ETHERTYPE_WAI 0x88b4
#endif
#define HDD_80211_HEADER_LEN 24
#define HDD_80211_HEADER_QOS_CTL 2
#define HDD_LLC_HDR_LEN 6
#define HDD_FRAME_TYPE_MASK 0x0c
#define HDD_FRAME_SUBTYPE_MASK 0xf0
#define HDD_FRAME_TYPE_DATA 0x08
#define HDD_FRAME_TYPE_MGMT 0x00
#define HDD_FRAME_SUBTYPE_QOSDATA 0x80
#define HDD_FRAME_SUBTYPE_DEAUTH 0xC0
#define HDD_FRAME_SUBTYPE_DISASSOC 0xA0
#define HDD_DEST_ADDR_OFFSET 6
#define HDD_MAC_HDR_SIZE 6
#define HDD_PSB_CFG_INVALID 0xFF
#define HDD_PSB_CHANGED 0xFF
#define SME_QOS_UAPSD_CFG_BK_CHANGED_MASK 0xF1
@ -68,8 +53,6 @@
#define SME_QOS_UAPSD_CFG_VI_CHANGED_MASK 0xF4
#define SME_QOS_UAPSD_CFG_VO_CHANGED_MASK 0xF8
#define HDD_ETH_HEADER_LEN 14
int hdd_hard_start_xmit(struct sk_buff *skb, struct net_device *dev);
void hdd_tx_timeout(struct net_device *dev);
CDF_STATUS hdd_init_tx_rx(hdd_adapter_t *pAdapter);

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2012-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -143,12 +143,6 @@ typedef enum {
/** Maximum Length of WPA/RSN IE */
#define MAX_WPA_RSN_IE_LEN 40
/** Maximum Number of WEP KEYS */
#define MAX_WEP_KEYS 4
/** Ether Address Length */
#define ETHER_ADDR_LEN 6
/** Enable 11d */
#define ENABLE_11D 1

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2012-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -36,6 +36,7 @@
#include <ani_global.h>
#include "dot11f.h"
#include "wlan_hdd_power.h"
#include "wlan_hdd_trace.h"
#include <linux/ieee80211.h>
#include <linux/wireless.h>
#include <linux/etherdevice.h>
@ -729,8 +730,9 @@ static void hdd_send_association_event(struct net_device *dev,
return;
}
cds_incr_active_session(pHddCtx, pAdapter->device_mode,
pAdapter->sessionId);
if (!hdd_is_roam_sync_in_progress(pCsrRoamInfo))
cds_incr_active_session(pAdapter->device_mode,
pAdapter->sessionId);
memcpy(wrqu.ap_addr.sa_data, pCsrRoamInfo->pBssDesc->bssId,
sizeof(pCsrRoamInfo->pBssDesc->bssId));
@ -814,8 +816,7 @@ static void hdd_send_association_event(struct net_device *dev,
#endif
} else if (eConnectionState_IbssConnected == /* IBss Associated */
pHddStaCtx->conn_info.connState) {
cds_incr_active_session(pHddCtx, pAdapter->device_mode,
pAdapter->sessionId);
cds_update_connection_info(pAdapter->sessionId);
memcpy(wrqu.ap_addr.sa_data, pHddStaCtx->conn_info.bssId.bytes,
ETH_ALEN);
pr_info("wlan: new IBSS connection to " MAC_ADDRESS_STR "\n",
@ -825,11 +826,9 @@ static void hdd_send_association_event(struct net_device *dev,
pr_info("wlan: disconnected\n");
memset(wrqu.ap_addr.sa_data, '\0', ETH_ALEN);
cds_decr_session_set_pcl(
pHddCtx, pAdapter->device_mode,
pAdapter->device_mode,
pAdapter->sessionId);
#if defined(FEATURE_WLAN_LFR)
wlan_hdd_enable_roaming(pAdapter);
#endif
#ifdef FEATURE_WLAN_AUTO_SHUTDOWN
wlan_hdd_auto_shutdown_enable(pHddCtx, true);
@ -871,15 +870,14 @@ static void hdd_send_association_event(struct net_device *dev,
hdd_stop_bus_bw_compute_timer(pAdapter);
#endif
}
cds_dump_concurrency_info(pHddCtx);
cds_dump_concurrency_info();
/* Send SCC/MCC Switching event to IPA */
hdd_ipa_send_mcc_scc_msg(pHddCtx, pHddCtx->mcc_mode);
msg = NULL;
/*During the WLAN uninitialization,supplicant is stopped before the
driver so not sending the status of the connection to supplicant */
if ((pHddCtx->isLoadInProgress != true) &&
(pHddCtx->isUnloadInProgress != true)) {
if (cds_is_load_or_unload_in_progress()) {
wireless_send_event(dev, we_event, &wrqu, msg);
#ifdef FEATURE_WLAN_ESE
if (eConnectionState_Associated ==
@ -1046,15 +1044,19 @@ static CDF_STATUS hdd_dis_connect_handler(hdd_adapter_t *pAdapter,
* To avoid wpa_supplicant sending "HANGED" CMD
* to ICS UI.
*/
if (eCSR_ROAM_LOSTLINK == roamStatus)
if (eCSR_ROAM_LOSTLINK == roamStatus) {
if (pRoamInfo->reasonCode ==
eSIR_MAC_PEER_STA_REQ_LEAVING_BSS_REASON)
pr_info("wlan: disconnected due to poor signal, rssi is %d dB\n", pRoamInfo->rxRssi);
cfg80211_disconnected(dev, pRoamInfo->
reasonCode, NULL,
0, GFP_KERNEL);
else
} else {
cfg80211_disconnected(dev,
WLAN_REASON_UNSPECIFIED,
NULL, 0,
GFP_KERNEL);
}
hdd_info("sent disconnected event to nl80211, rssi: %d",
pAdapter->rssi);
@ -1064,8 +1066,7 @@ static CDF_STATUS hdd_dis_connect_handler(hdd_adapter_t *pAdapter,
* before the driver so not sending the status of the
* connection to supplicant.
*/
if ((pHddCtx->isLoadInProgress != true) &&
(pHddCtx->isUnloadInProgress != true)) {
if (cds_is_load_or_unload_in_progress()) {
#ifdef WLAN_FEATURE_P2P_DEBUG
if (pAdapter->device_mode == WLAN_HDD_P2P_CLIENT) {
if (global_p2p_connection_status ==
@ -1093,12 +1094,11 @@ static CDF_STATUS hdd_dis_connect_handler(hdd_adapter_t *pAdapter,
#endif
if (eCSR_ROAM_IBSS_LEAVE == roamStatus) {
uint8_t i;
sta_id = IBSS_BROADCAST_STAID;
sta_id = pHddStaCtx->broadcast_ibss_staid;
vstatus = hdd_roam_deregister_sta(pAdapter, sta_id);
if (!CDF_IS_STATUS_SUCCESS(vstatus)) {
hddLog(LOGE,
FL("hdd_roam_deregister_sta() failed for staID %d Status=%d [0x%x]"),
sta_id, status, status);
hdd_err("hdd_roam_deregister_sta() failed for staID %d Status=%d [0x%x]",
sta_id, status, status);
status = CDF_STATUS_E_FAILURE;
}
pHddCtx->sta_to_adapter[sta_id] = NULL;
@ -1364,6 +1364,7 @@ static void hdd_send_re_assoc_event(struct net_device *dev,
unsigned int len = 0;
u8 *pFTAssocRsp = NULL;
uint8_t *rspRsnIe = kmalloc(IW_GENERIC_IE_MAX, GFP_KERNEL);
uint8_t *assoc_req_ies = kmalloc(IW_GENERIC_IE_MAX, GFP_KERNEL);
uint32_t rspRsnLength = 0;
struct ieee80211_channel *chan;
hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
@ -1376,9 +1377,13 @@ static void hdd_send_re_assoc_event(struct net_device *dev,
if (!rspRsnIe) {
hddLog(LOGE, FL("Unable to allocate RSN IE"));
return;
goto done;
}
if (!assoc_req_ies) {
hdd_err("Unable to allocate Assoc Req IE");
goto done;
}
if (pCsrRoamInfo == NULL) {
hddLog(LOGE, FL("Invalid CSR roam info"));
goto done;
@ -1409,9 +1414,10 @@ static void hdd_send_re_assoc_event(struct net_device *dev,
* active session count should still be the same and hence upon
* successful reassoc decrement the active session count here.
*/
cds_decr_session_set_pcl(
pHddCtx, pAdapter->device_mode,
pAdapter->sessionId);
if (!hdd_is_roam_sync_in_progress(pCsrRoamInfo))
cds_decr_session_set_pcl(
pAdapter->device_mode,
pAdapter->sessionId);
/* Send the Assoc Resp, the supplicant needs this for initial Auth */
len = pCsrRoamInfo->nAssocRspLength - FT_ASSOC_RSP_IES_OFFSET;
@ -1439,8 +1445,9 @@ static void hdd_send_re_assoc_event(struct net_device *dev,
cdf_mem_copy(buf_ptr, &roam_profile.SSID.ssId[0],
roam_profile.SSID.length);
ssid_ie_len = 2 + roam_profile.SSID.length;
hddLog(LOG2, FL("SSIDIE:"));
hddLog(CDF_TRACE_LEVEL_DEBUG, buf_ssid_ie, ssid_ie_len);
hdd_notice("SSIDIE:");
CDF_TRACE_HEX_DUMP(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_DEBUG,
buf_ssid_ie, ssid_ie_len);
final_req_ie = kmalloc(IW_GENERIC_IE_MAX, GFP_KERNEL);
if (final_req_ie == NULL)
goto done;
@ -1451,37 +1458,46 @@ static void hdd_send_re_assoc_event(struct net_device *dev,
cdf_mem_copy(rspRsnIe, pFTAssocRsp, len);
cdf_mem_zero(final_req_ie + (ssid_ie_len + reqRsnLength),
IW_GENERIC_IE_MAX - (ssid_ie_len + reqRsnLength));
hddLog(LOG2, FL("Req RSN IE:"));
hddLog(CDF_TRACE_LEVEL_DEBUG, final_req_ie,
(ssid_ie_len + reqRsnLength));
hdd_notice("Req RSN IE:");
CDF_TRACE_HEX_DUMP(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_DEBUG,
final_req_ie, (ssid_ie_len + reqRsnLength));
cfg80211_roamed_bss(dev, bss,
final_req_ie, (ssid_ie_len + reqRsnLength),
rspRsnIe, rspRsnLength, GFP_KERNEL);
cdf_mem_copy(assoc_req_ies,
(u8 *)pCsrRoamInfo->pbFrames + pCsrRoamInfo->nBeaconLength,
pCsrRoamInfo->nAssocReqLength);
hdd_notice("ReAssoc Req IE dump");
CDF_TRACE_HEX_DUMP(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_DEBUG,
assoc_req_ies, pCsrRoamInfo->nAssocReqLength);
wlan_hdd_send_roam_auth_event(pHddCtx, pCsrRoamInfo->bssid.bytes,
reqRsnIe, reqRsnLength, rspRsnIe, rspRsnLength,
assoc_req_ies, pCsrRoamInfo->nAssocReqLength,
rspRsnIe, rspRsnLength,
pCsrRoamInfo);
done:
sme_roam_free_connect_profile(hal_handle, &roam_profile);
sme_roam_free_connect_profile(&roam_profile);
if (final_req_ie)
kfree(final_req_ie);
kfree(rspRsnIe);
kfree(assoc_req_ies);
}
/**
* hdd_is_roam_sync_in_progress()- Check if roam offloaded
* @roaminfo - Roaming Information
*
* Return: roam sync status if roaming offloaded else false
*/
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
static inline bool hdd_is_roam_sync_in_progress(tCsrRoamInfo *roaminfo)
bool hdd_is_roam_sync_in_progress(tCsrRoamInfo *roaminfo)
{
return roaminfo->roamSynchInProgress;
}
#else
static inline bool hdd_is_roam_sync_in_progress(tCsrRoamInfo *roaminfo)
{
return false;
if (roaminfo)
return roaminfo->roamSynchInProgress;
else
return false;
}
#endif
@ -1697,10 +1713,7 @@ static CDF_STATUS hdd_association_completion_handler(hdd_adapter_t *pAdapter,
CDF_STATUS cdf_status = CDF_STATUS_E_FAILURE;
uint8_t reqRsnIe[DOT11F_IE_RSN_MAX_LEN];
uint32_t reqRsnLength = DOT11F_IE_RSN_MAX_LEN;
#if defined(FEATURE_WLAN_ESE) || defined(FEATURE_WLAN_LFR) || \
defined(WLAN_FEATURE_VOWIFI_11R)
int ft_carrier_on = false;
#endif
bool hddDisconInProgress = false;
unsigned long rc;
@ -1709,13 +1722,6 @@ defined(WLAN_FEATURE_VOWIFI_11R)
return CDF_STATUS_E_FAILURE;
}
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
if (pRoamInfo && pRoamInfo->roamSynchInProgress) {
/* change logging before release */
hddLog(LOG3, "LFR3:hdd_association_completion_handler");
}
#endif
/* HDD has initiated disconnect, do not send connect result indication
* to kernel as it will be handled by __cfg80211_disconnect.
*/
@ -1753,7 +1759,7 @@ defined(WLAN_FEATURE_VOWIFI_11R)
/* Indicate 'connect' status to user space */
hdd_send_association_event(dev, pRoamInfo);
if (cds_is_mcc_in_24G(pHddCtx)) {
if (cds_is_mcc_in_24G()) {
if (pHddCtx->miracast_value)
cds_set_mas(pAdapter, pHddCtx->miracast_value);
}
@ -1770,49 +1776,38 @@ defined(WLAN_FEATURE_VOWIFI_11R)
* will come to know that the device is getting
* activated properly.
*/
#if defined(WLAN_FEATURE_VOWIFI_11R) || defined(FEATURE_WLAN_ESE) || \
defined(FEATURE_WLAN_LFR)
if (pHddStaCtx->ft_carrier_on == false) {
#endif
/*
* Enable Linkup Event Servicing which allows the net device
* notifier to set the linkup event variable.
*/
pAdapter->isLinkUpSvcNeeded = true;
/*
* Enable Linkup Event Servicing which allows the net
* device notifier to set the linkup event variable.
*/
pAdapter->isLinkUpSvcNeeded = true;
/*
* Enable Linkup Event Servicing which allows the net device
* notifier to set the linkup event variable.
*/
pAdapter->isLinkUpSvcNeeded = true;
/* Switch on the Carrier to activate the device */
wlan_hdd_netif_queue_control(pAdapter,
WLAN_NETIF_CARRIER_ON,
WLAN_CONTROL_PATH);
/* Switch on the Carrier to activate the device */
wlan_hdd_netif_queue_control(pAdapter, WLAN_NETIF_CARRIER_ON,
WLAN_CONTROL_PATH);
/*
* Wait for the Link to up to ensure all the queues
* are set properly by the kernel.
*/
rc = wait_for_completion_timeout(
&pAdapter->linkup_event_var,
msecs_to_jiffies(ASSOC_LINKUP_TIMEOUT)
);
if (!rc)
hdd_warn("Warning:ASSOC_LINKUP_TIMEOUT");
/*
* Wait for the Link to up to ensure all the queues are set
* properly by the kernel.
*/
rc = wait_for_completion_timeout(&pAdapter->
linkup_event_var,
msecs_to_jiffies
(ASSOC_LINKUP_TIMEOUT));
if (!rc)
hddLog(LOGW, FL("Warning:ASSOC_LINKUP_TIMEOUT"));
/*
* Disable Linkup Event Servicing - no more service required
* from the net device notifier call.
*/
pAdapter->isLinkUpSvcNeeded = false;
#if defined(WLAN_FEATURE_VOWIFI_11R) || defined(FEATURE_WLAN_ESE) || \
defined(FEATURE_WLAN_LFR)
} else {
pHddStaCtx->ft_carrier_on = false;
ft_carrier_on = true;
}
#endif
/*
* Disable Linkup Event Servicing - no more service
* required from the net device notifier call.
*/
pAdapter->isLinkUpSvcNeeded = false;
} else {
pHddStaCtx->ft_carrier_on = false;
ft_carrier_on = true;
}
if ((WLAN_MAX_STA_COUNT + 3) > pRoamInfo->staId)
pHddCtx->sta_to_adapter[pRoamInfo->staId] = pAdapter;
else
@ -1830,8 +1825,7 @@ defined(FEATURE_WLAN_LFR)
wlan_hdd_auto_shutdown_enable(pHddCtx, false);
#endif
cds_check_concurrent_intf_and_restart_sap(pHddCtx,
pHddStaCtx,
cds_check_concurrent_intf_and_restart_sap(pHddStaCtx,
pAdapter);
#ifdef FEATURE_WLAN_TDLS
@ -1947,10 +1941,11 @@ defined(FEATURE_WLAN_LFR)
* decrement the active session
* count here.
*/
cds_decr_session_set_pcl
(pHddCtx,
pAdapter->device_mode,
pAdapter->sessionId);
if (!hdd_is_roam_sync_in_progress
(pRoamInfo))
cds_decr_session_set_pcl
(pAdapter->device_mode,
pAdapter->sessionId);
hddLog(LOG1,
FL("ft_carrier_on is %d, sending roamed indication"),
ft_carrier_on);
@ -1963,6 +1958,15 @@ defined(FEATURE_WLAN_LFR)
"assocReqlen %d assocRsplen %d",
assocReqlen,
assocRsplen);
hdd_notice(
"Reassoc Req IE dump");
CDF_TRACE_HEX_DUMP(
CDF_MODULE_ID_HDD,
CDF_TRACE_LEVEL_DEBUG,
pFTAssocReq,
assocReqlen);
cfg80211_roamed(dev, chan,
pRoamInfo->
bssid.bytes,
@ -2039,17 +2043,13 @@ defined(FEATURE_WLAN_LFR)
&rspRsnLength,
rspRsnIe);
if (!hddDisconInProgress) {
#if defined(FEATURE_WLAN_ESE) || defined(FEATURE_WLAN_LFR)
if (ft_carrier_on)
hdd_send_re_assoc_event(dev,
pAdapter,
pRoamInfo,
reqRsnIe,
reqRsnLength);
else
#endif /* FEATURE_WLAN_ESE */
{
else {
hddLog(LOG1,
FL("sending connect indication to nl80211:for bssid "
MAC_ADDRESS_STR
@ -2073,9 +2073,7 @@ defined(FEATURE_WLAN_LFR)
}
if (!hddDisconInProgress) {
cfg80211_put_bss(
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0))
pHddCtx->wiphy,
#endif
bss);
/*
@ -2309,11 +2307,17 @@ defined(FEATURE_WLAN_LFR)
WLAN_CONTROL_PATH);
}
if (CDF_STATUS_SUCCESS != cds_check_and_restart_sap(pHddCtx,
if (CDF_STATUS_SUCCESS != cds_check_and_restart_sap(
roamResult, pHddStaCtx))
return CDF_STATUS_E_FAILURE;
cds_force_sap_on_scc(pHddCtx, roamResult);
if (NULL != pRoamInfo && NULL != pRoamInfo->pBssDesc) {
cds_force_sap_on_scc(roamResult,
pRoamInfo->pBssDesc->channelId);
} else {
hdd_err("pRoamInfo profile is not set properly");
return CDF_STATUS_E_FAILURE;
}
return CDF_STATUS_SUCCESS;
}
@ -2348,6 +2352,8 @@ static void hdd_roam_ibss_indication_handler(hdd_adapter_t *pAdapter,
{
hdd_context_t *pHddCtx =
(hdd_context_t *) pAdapter->pHddCtx;
hdd_station_ctx_t *hdd_sta_ctx =
WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
struct cdf_mac_addr broadcastMacAddr =
CDF_MAC_ADDR_BROADCAST_INITIALIZER;
@ -2367,10 +2373,13 @@ static void hdd_roam_ibss_indication_handler(hdd_adapter_t *pAdapter,
/* notify wmm */
hdd_wmm_connect(pAdapter, pRoamInfo,
eCSR_BSS_TYPE_IBSS);
pHddCtx->sta_to_adapter[IBSS_BROADCAST_STAID] =
hdd_sta_ctx->broadcast_ibss_staid = pRoamInfo->staId;
pHddCtx->sta_to_adapter[pRoamInfo->staId] =
pAdapter;
hdd_roam_register_sta(pAdapter, pRoamInfo,
IBSS_BROADCAST_STAID,
pRoamInfo->staId,
&broadcastMacAddr,
pRoamInfo->pBssDesc);
@ -2426,12 +2435,16 @@ static void hdd_roam_ibss_indication_handler(hdd_adapter_t *pAdapter,
GFP_KERNEL);
#endif
cfg80211_put_bss(
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0))
pHddCtx->wiphy,
#endif
bss);
}
if (eCSR_ROAM_RESULT_IBSS_STARTED == roamResult) {
cds_incr_active_session(pAdapter->device_mode,
pAdapter->sessionId);
} else if (eCSR_ROAM_RESULT_IBSS_JOIN_SUCCESS == roamResult ||
eCSR_ROAM_RESULT_IBSS_COALESCED == roamResult) {
cds_update_connection_info(pAdapter->sessionId);
}
break;
}
@ -2589,9 +2602,7 @@ static CDF_STATUS roam_ibss_connect_handler(hdd_adapter_t *pAdapter,
return CDF_STATUS_E_FAILURE;
}
cfg80211_put_bss(
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0))
WLAN_HDD_GET_CTX(pAdapter)->wiphy,
#endif
bss);
return CDF_STATUS_SUCCESS;
@ -2704,9 +2715,6 @@ roam_roam_connect_status_update_handler(hdd_adapter_t *pAdapter,
pHddCtx->sta_to_adapter[pRoamInfo->staId] = pAdapter;
pHddCtx->sta_to_adapter[IBSS_BROADCAST_STAID] =
pAdapter;
/* Register the Station with TL for the new peer. */
cdf_status = hdd_roam_register_sta(pAdapter,
pRoamInfo,
@ -3812,6 +3820,27 @@ hdd_indicate_ese_bcn_report_ind(const hdd_adapter_t *pAdapter,
#endif /* FEATURE_WLAN_ESE && FEATURE_WLAN_ESE_UPLOAD */
/**
* hdd_is_8021x_sha256_auth_type() - check authentication type to 8021x_sha256
* @pHddStaCtx: Station Context
*
* API to check if the connection authentication type is 8021x_sha256.
*
* Return: bool
*/
#ifdef WLAN_FEATURE_11W
static inline bool hdd_is_8021x_sha256_auth_type(hdd_station_ctx_t *pHddStaCtx)
{
return eCSR_AUTH_TYPE_RSN_8021X_SHA256 ==
pHddStaCtx->conn_info.authType;
}
#else
static inline bool hdd_is_8021x_sha256_auth_type(hdd_station_ctx_t *pHddStaCtx)
{
return false;
}
#endif
/**
* hdd_sme_roam_callback() - hdd sme roam callback
* @pContext: pointer to adapter context
@ -3846,14 +3875,15 @@ hdd_sme_roam_callback(void *pContext, tCsrRoamInfo *pRoamInfo, uint32_t roamId,
pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
MTRACE(cdf_trace(CDF_MODULE_ID_HDD, TRACE_CODE_HDD_RX_SME_MSG,
pAdapter->sessionId, roamStatus));
switch (roamStatus) {
case eCSR_ROAM_SESSION_OPENED:
set_bit(SME_SESSION_OPENED, &pAdapter->event_flags);
complete(&pAdapter->session_open_comp_var);
break;
#if defined(WLAN_FEATURE_VOWIFI_11R) || defined(FEATURE_WLAN_ESE) || \
defined(FEATURE_WLAN_LFR)
/*
* We did pre-auth,then we attempted a 11r or ese reassoc.
* reassoc failed due to failure, timeout, reject from ap
@ -3894,72 +3924,32 @@ defined(FEATURE_WLAN_LFR)
* doing disassoc at this time. This saves 30-60 msec
* after reassoc.
*/
{
hddLog(LOG1, FL("Disabling queues"));
wlan_hdd_netif_queue_control(pAdapter, WLAN_NETIF_TX_DISABLE,
WLAN_CONTROL_PATH);
status =
hdd_roam_deregister_sta(pAdapter,
pHddStaCtx->conn_info.
staId[0]);
if (!CDF_IS_STATUS_SUCCESS(status)) {
hddLog(LOGW,
FL
("hdd_roam_deregister_sta() failed to for staID %d. Status=%d [0x%x]"),
pHddStaCtx->conn_info.staId[0],
status, status);
wlan_hdd_netif_queue_control(pAdapter,
WLAN_NETIF_TX_DISABLE,
WLAN_CONTROL_PATH);
status = hdd_roam_deregister_sta(pAdapter,
pHddStaCtx->conn_info.staId[0]);
if (!CDF_IS_STATUS_SUCCESS(status))
cdf_ret_status = CDF_STATUS_E_FAILURE;
}
}
pHddStaCtx->ft_carrier_on = true;
pHddStaCtx->hdd_ReassocScenario = true;
hddLog(LOG1,
FL("hdd_ReassocScenario set to: %d, due to eCSR_ROAM_FT_START, session: %d"),
pHddStaCtx->hdd_ReassocScenario, pAdapter->sessionId);
break;
#endif
case eCSR_ROAM_SHOULD_ROAM:
/* Dont need to do anything */
{
hdd_station_ctx_t *pHddStaCtx =
WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
/* notify apps that we can't pass traffic anymore */
hddLog(LOG1, FL("Disabling queues"));
wlan_hdd_netif_queue_control(pAdapter,
WLAN_NETIF_TX_DISABLE,
WLAN_CONTROL_PATH);
#if defined(WLAN_FEATURE_VOWIFI_11R) || defined(FEATURE_WLAN_ESE) || \
defined(FEATURE_WLAN_LFR)
if (pHddStaCtx->ft_carrier_on == false) {
#endif
wlan_hdd_netif_queue_control(pAdapter,
WLAN_NETIF_CARRIER_OFF,
WLAN_CONTROL_PATH);
#if defined(WLAN_FEATURE_VOWIFI_11R) || defined(FEATURE_WLAN_ESE) || \
defined(FEATURE_WLAN_LFR)
}
#endif
#if !(defined(WLAN_FEATURE_VOWIFI_11R) || defined(FEATURE_WLAN_ESE) || \
defined(FEATURE_WLAN_LFR))
/*
* We should clear all sta register with TL, for now, only one.
*/
status =
hdd_roam_deregister_sta(pAdapter,
pHddStaCtx->conn_info.
staId[0]);
if (!CDF_IS_STATUS_SUCCESS(status)) {
hddLog(LOGW,
FL
("hdd_roam_deregister_sta() failed to for staID %d. Status=%d [0x%x]"),
pHddStaCtx->conn_info.staId[0],
status, status);
cdf_ret_status = CDF_STATUS_E_FAILURE;
}
#endif
}
break;
case eCSR_ROAM_LOSTLINK:
if (roamResult == eCSR_ROAM_RESULT_LOSTLINK) {
@ -4086,18 +4076,15 @@ defined(FEATURE_WLAN_LFR))
hdd_send_ft_event(pAdapter);
break;
#endif
#if defined(FEATURE_WLAN_LFR) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0))
case eCSR_ROAM_PMK_NOTIFY:
if (eCSR_AUTH_TYPE_RSN == pHddStaCtx->conn_info.authType ||
eCSR_AUTH_TYPE_RSN_8021X_SHA256 ==
pHddStaCtx->conn_info.authType) {
if (eCSR_AUTH_TYPE_RSN == pHddStaCtx->conn_info.authType
|| hdd_is_8021x_sha256_auth_type(pHddStaCtx)) {
/* notify the supplicant of a new candidate */
cdf_ret_status =
wlan_hdd_cfg80211_pmksa_candidate_notify(
pAdapter, pRoamInfo, 1, false);
}
break;
#endif
#ifdef FEATURE_WLAN_LFR_METRICS
case eCSR_ROAM_PREAUTH_INIT_NOTIFY:
@ -4138,14 +4125,6 @@ defined(FEATURE_WLAN_LFR))
}
break;
#endif
case eCSR_ROAM_INDICATE_MGMT_FRAME:
hdd_indicate_mgmt_frame(pAdapter,
pRoamInfo->nFrameLength,
pRoamInfo->pbFrames,
pRoamInfo->frameType,
pRoamInfo->rxChan, pRoamInfo->rxRssi);
break;
case eCSR_ROAM_REMAIN_CHAN_READY:
hdd_remain_chan_ready_handler(pAdapter, pRoamInfo->roc_scan_id);
break;
@ -4426,7 +4405,7 @@ static int32_t hdd_process_genie(hdd_adapter_t *pAdapter,
* in the bssid.
*/
cdf_mem_copy(PMKIDCache[i].BSSID.bytes,
bssid, ETHER_ADDR_LEN);
bssid, CDF_MAC_ADDR_SIZE);
cdf_mem_copy(PMKIDCache[i].PMKID,
dot11RSNIE.pmkid[i], CSR_RSN_PMKID_SIZE);
}

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2012-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -45,7 +45,6 @@
#include <wlan_hdd_misc.h>
#include <wlan_hdd_napi.h>
#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_ESE) || defined(FEATURE_WLAN_LFR)
static void
cb_notify_set_roam_prefer5_g_hz(hdd_context_t *pHddCtx, unsigned long notifyId)
{
@ -95,7 +94,6 @@ cb_notify_set_roam_scan_home_away_time(hdd_context_t *pHddCtx, unsigned long not
pHddCtx->config->nRoamScanHomeAwayTime,
true);
}
#endif
#ifdef FEATURE_WLAN_OKC
static void
@ -106,7 +104,6 @@ cb_notify_set_okc_feature_enabled(hdd_context_t *pHddCtx, unsigned long notifyId
}
#endif
#ifdef FEATURE_WLAN_LFR
static void
notify_is_fast_roam_ini_feature_enabled(hdd_context_t *pHddCtx,
unsigned long notifyId)
@ -126,7 +123,6 @@ notify_is_mawc_ini_feature_enabled(hdd_context_t *pHddCtx, unsigned long notifyI
sme_update_is_mawc_ini_feature_enabled(pHddCtx->hHal,
pHddCtx->config->MAWCEnabled);
}
#endif
#ifdef FEATURE_WLAN_ESE
static void
@ -149,7 +145,6 @@ cb_notify_set_fw_rssi_monitoring(hdd_context_t *pHddCtx, unsigned long notifyId)
fEnableFwRssiMonitoring);
}
#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
static void cb_notify_set_opportunistic_scan_threshold_diff(hdd_context_t *pHddCtx,
unsigned long notifyId)
{
@ -275,8 +270,6 @@ cb_notify_set_dfs_scan_mode(hdd_context_t *pHddCtx, unsigned long notifyId)
pHddCtx->config->allowDFSChannelRoam);
}
#endif
static void cb_notify_set_enable_ssr(hdd_context_t *pHddCtx,
unsigned long notifyId)
{
@ -430,13 +423,6 @@ REG_TABLE_ENTRY g_registry_table[] = {
VAR_FLAGS_OPTIONAL,
(void *)CFG_POWER_USAGE_DEFAULT),
REG_VARIABLE(CFG_ENABLE_LOGP_NAME, WLAN_PARAM_Integer,
struct hdd_config, fIsLogpEnabled,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
CFG_ENABLE_LOGP_DEFAULT,
CFG_ENABLE_LOGP_MIN,
CFG_ENABLE_LOGP_MAX),
REG_VARIABLE(CFG_ENABLE_IMPS_NAME, WLAN_PARAM_Integer,
struct hdd_config, fIsImpsEnabled,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
@ -500,6 +486,13 @@ REG_TABLE_ENTRY g_registry_table[] = {
CFG_MAX_RX_AMPDU_FACTOR_MIN,
CFG_MAX_RX_AMPDU_FACTOR_MAX),
REG_VARIABLE(CFG_HT_MPDU_DENSITY_NAME, WLAN_PARAM_Integer,
struct hdd_config, ht_mpdu_density,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK ,
CFG_HT_MPDU_DENSITY_DEFAULT,
CFG_HT_MPDU_DENSITY_MIN,
CFG_HT_MPDU_DENSITY_MAX),
REG_VARIABLE(CFG_FIXED_RATE_NAME, WLAN_PARAM_Integer,
struct hdd_config, TxRate,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK,
@ -1021,7 +1014,6 @@ REG_TABLE_ENTRY g_registry_table[] = {
cb_notify_set_ese_feature_enabled, 0),
#endif /* FEATURE_WLAN_ESE */
#ifdef FEATURE_WLAN_LFR
/* flag to turn ON/OFF Legacy Fast Roaming */
REG_DYNAMIC_VARIABLE(CFG_LFR_FEATURE_ENABLED_NAME, WLAN_PARAM_Integer,
struct hdd_config, isFastRoamIniFeatureEnabled,
@ -1043,9 +1035,6 @@ REG_TABLE_ENTRY g_registry_table[] = {
CFG_LFR_MAWC_FEATURE_ENABLED_MAX,
notify_is_mawc_ini_feature_enabled, 0),
#endif /* FEATURE_WLAN_LFR */
#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_ESE) || defined(FEATURE_WLAN_LFR)
/* flag to turn ON/OFF 11r and ESE FastTransition */
REG_DYNAMIC_VARIABLE(CFG_FAST_TRANSITION_ENABLED_NAME,
WLAN_PARAM_Integer,
@ -1076,7 +1065,6 @@ REG_TABLE_ENTRY g_registry_table[] = {
CFG_ENABLE_WES_MODE_NAME_MIN,
CFG_ENABLE_WES_MODE_NAME_MAX,
cb_notify_set_wes_mode, 0),
#endif
#ifdef FEATURE_WLAN_OKC
REG_DYNAMIC_VARIABLE(CFG_OKC_FEATURE_ENABLED_NAME, WLAN_PARAM_Integer,
struct hdd_config, isOkcIniFeatureEnabled,
@ -1343,7 +1331,6 @@ REG_TABLE_ENTRY g_registry_table[] = {
CFG_FT_RESOURCE_REQ_MAX),
#endif
#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
REG_DYNAMIC_VARIABLE(CFG_NEIGHBOR_SCAN_TIMER_PERIOD_NAME,
WLAN_PARAM_Integer,
struct hdd_config, nNeighborScanPeriod,
@ -1532,8 +1519,6 @@ REG_TABLE_ENTRY g_registry_table[] = {
cb_notify_set_roam_scan_hi_rssi_scan_params,
eCSR_HI_RSSI_SCAN_RSSI_UB_ID),
#endif /* WLAN_FEATURE_NEIGHBOR_ROAMING */
REG_VARIABLE(CFG_QOS_WMM_BURST_SIZE_DEFN_NAME, WLAN_PARAM_Integer,
struct hdd_config, burstSizeDefinition,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
@ -1926,7 +1911,6 @@ REG_TABLE_ENTRY g_registry_table[] = {
CFG_LINK_SPEED_RSSI_LOW_MAX,
NULL, 0),
#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_ESE) || defined(FEATURE_WLAN_LFR)
REG_DYNAMIC_VARIABLE(CFG_ROAM_PREFER_5GHZ, WLAN_PARAM_Integer,
struct hdd_config, nRoamPrefer5GHz,
VAR_FLAGS_OPTIONAL |
@ -1963,8 +1947,6 @@ REG_TABLE_ENTRY g_registry_table[] = {
CFG_ROAM_SCAN_HOME_AWAY_TIME_MAX,
cb_notify_set_roam_scan_home_away_time, 0),
#endif
REG_VARIABLE(CFG_P2P_DEVICE_ADDRESS_ADMINISTRATED_NAME,
WLAN_PARAM_Integer,
struct hdd_config, isP2pDeviceAddrAdministrated,
@ -2232,6 +2214,13 @@ REG_TABLE_ENTRY g_registry_table[] = {
CFG_TDLS_MAX_DISCOVERY_ATTEMPT_MIN,
CFG_TDLS_MAX_DISCOVERY_ATTEMPT_MAX),
REG_VARIABLE(CFG_TDLS_IDLE_TIMEOUT, WLAN_PARAM_Integer,
struct hdd_config, tdls_idle_timeout,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
CFG_TDLS_IDLE_TIMEOUT_DEFAULT,
CFG_TDLS_IDLE_TIMEOUT_MIN,
CFG_TDLS_IDLE_TIMEOUT_MAX),
REG_VARIABLE(CFG_TDLS_IDLE_PACKET_THRESHOLD, WLAN_PARAM_Integer,
struct hdd_config, fTDLSIdlePacketThreshold,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
@ -2344,6 +2333,14 @@ REG_TABLE_ENTRY g_registry_table[] = {
CFG_TDLS_SCAN_ENABLE_DEFAULT,
CFG_TDLS_SCAN_ENABLE_MIN,
CFG_TDLS_SCAN_ENABLE_MAX),
REG_VARIABLE(CFG_TDLS_PEER_KICKOUT_THRESHOLD, WLAN_PARAM_Integer,
struct hdd_config, tdls_peer_kickout_threshold,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
CFG_TDLS_PEER_KICKOUT_THRESHOLD_DEFAULT,
CFG_TDLS_PEER_KICKOUT_THRESHOLD_MIN,
CFG_TDLS_PEER_KICKOUT_THRESHOLD_MAX),
#endif
#ifdef WLAN_SOFTAP_VSTA_FEATURE
@ -2418,6 +2415,13 @@ REG_TABLE_ENTRY g_registry_table[] = {
CFG_VHT_SU_BEAMFORMEE_CAP_FEATURE_MIN,
CFG_VHT_SU_BEAMFORMEE_CAP_FEATURE_MAX),
REG_VARIABLE(CFG_VHT_ENABLE_TXBF_SAP_MODE, WLAN_PARAM_Integer,
struct hdd_config, enable_txbf_sap_mode,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
CFG_VHT_ENABLE_TXBF_SAP_MODE_DEFAULT,
CFG_VHT_ENABLE_TXBF_SAP_MODE_MIN,
CFG_VHT_ENABLE_TXBF_SAP_MODE_MAX),
REG_VARIABLE(CFG_VHT_ENABLE_TXBF_IN_20MHZ, WLAN_PARAM_Integer,
struct hdd_config, enableTxBFin20MHz,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
@ -3093,6 +3097,30 @@ REG_TABLE_ENTRY g_registry_table[] = {
CFG_ENABLE_GREEN_AP_FEATURE_DEFAULT,
CFG_ENABLE_GREEN_AP_FEATURE_MIN,
CFG_ENABLE_GREEN_AP_FEATURE_MAX),
REG_VARIABLE(CFG_ENABLE_EGAP_ENABLE_FEATURE, WLAN_PARAM_Integer,
struct hdd_config, enable_egap,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
CFG_ENABLE_EGAP_ENABLE_FEATURE_DEFAULT,
CFG_ENABLE_EGAP_ENABLE_FEATURE_MIN,
CFG_ENABLE_EGAP_ENABLE_FEATURE_MAX),
REG_VARIABLE(CFG_ENABLE_EGAP_INACT_TIME_FEATURE, WLAN_PARAM_Integer,
struct hdd_config, egap_inact_time,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
CFG_ENABLE_EGAP_INACT_TIME_FEATURE_DEFAULT,
CFG_ENABLE_EGAP_INACT_TIME_FEATURE_MIN,
CFG_ENABLE_EGAP_INACT_TIME_FEATURE_MAX),
REG_VARIABLE(CFG_ENABLE_EGAP_WAIT_TIME_FEATURE, WLAN_PARAM_Integer,
struct hdd_config, egap_wait_time,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
CFG_ENABLE_EGAP_WAIT_TIME_FEATURE_DEFAULT,
CFG_ENABLE_EGAP_WAIT_TIME_FEATURE_MIN,
CFG_ENABLE_EGAP_WAIT_TIME_FEATURE_MAX),
REG_VARIABLE(CFG_ENABLE_EGAP_FLAGS_FEATURE, WLAN_PARAM_Integer,
struct hdd_config, egap_feature_flag,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
CFG_ENABLE_EGAP_FLAGS_FEATURE_DEFAULT,
CFG_ENABLE_EGAP_FLAGS_FEATURE_MIN,
CFG_ENABLE_EGAP_FLAGS_FEATURE_MAX),
#endif
REG_VARIABLE(CFG_IGNORE_CAC_NAME, WLAN_PARAM_Integer,
@ -3618,6 +3646,31 @@ REG_TABLE_ENTRY g_registry_table[] = {
CFG_FIRST_SCAN_BUCKET_THRESHOLD_MIN,
CFG_FIRST_SCAN_BUCKET_THRESHOLD_MAX),
#ifdef FEATURE_LFR_SUBNET_DETECTION
REG_VARIABLE(CFG_ENABLE_LFR_SUBNET_DETECTION, WLAN_PARAM_Integer,
struct hdd_config, enable_lfr_subnet_detection,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
CFG_ENABLE_LFR_SUBNET_DEFAULT,
CFG_ENABLE_LFR_SUBNET_MIN,
CFG_ENABLE_LFR_SUBNET_MAX),
#endif
REG_VARIABLE(CFG_INFORM_BSS_RSSI_RAW_NAME, WLAN_PARAM_Integer,
struct hdd_config, inform_bss_rssi_raw,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
CFG_INFORM_BSS_RSSI_RAW_DEFAULT,
CFG_INFORM_BSS_RSSI_RAW_MIN,
CFG_INFORM_BSS_RSSI_RAW_MAX),
#ifdef QCA_WIFI_3_0_EMU
REG_VARIABLE(CFG_ENABLE_M2M_LIMITATION, WLAN_PARAM_Integer,
struct hdd_config, enable_m2m_limitation,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
CFG_ENABLE_LFR_SUBNET_DEFAULT,
CFG_ENABLE_LFR_SUBNET_MIN,
CFG_ENABLE_LFR_SUBNET_MAX),
#endif
};
@ -4581,22 +4634,18 @@ void hdd_cfg_print(hdd_context_t *pHddCtx)
"Name = [gTxPowerCap] Value = [%u] dBm ",
pHddCtx->config->nTxPowerCap);
#endif
#ifdef FEATURE_WLAN_LFR
CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_INFO_HIGH,
"Name = [FastRoamEnabled] Value = [%u] ",
pHddCtx->config->isFastRoamIniFeatureEnabled);
CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_INFO_HIGH,
"Name = [MAWCEnabled] Value = [%u] ",
pHddCtx->config->MAWCEnabled);
#endif
#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_ESE) || defined(FEATURE_WLAN_LFR)
CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_INFO_HIGH,
"Name = [RoamRssiDiff] Value = [%u] ",
pHddCtx->config->RoamRssiDiff);
CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_INFO_HIGH,
"Name = [isWESModeEnabled] Value = [%u] ",
pHddCtx->config->isWESModeEnabled);
#endif
#ifdef FEATURE_WLAN_OKC
CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_INFO_HIGH,
"Name = [OkcEnabled] Value = [%u] ",
@ -4725,7 +4774,6 @@ void hdd_cfg_print(hdd_context_t *pHddCtx)
pHddCtx->config->fFTResourceReqSupported);
#endif
#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_INFO_HIGH,
"Name = [nNeighborLookupRssiThreshold] Value = [%u] ",
pHddCtx->config->nNeighborLookupRssiThreshold);
@ -4780,7 +4828,6 @@ void hdd_cfg_print(hdd_context_t *pHddCtx)
CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_INFO_HIGH,
"Name = [nhi_rssi_scan_rssi_ub] Value = [%u] ",
pHddCtx->config->nhi_rssi_scan_rssi_ub);
#endif
CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_INFO_HIGH,
"Name = [burstSizeDefinition] Value = [0x%x] ",
pHddCtx->config->burstSizeDefinition);
@ -5010,6 +5057,18 @@ void hdd_cfg_print(hdd_context_t *pHddCtx)
CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_INFO_HIGH,
"Name = [gEnableGreenAp] Value = [%u] ",
pHddCtx->config->enableGreenAP);
CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_INFO_HIGH,
"Name = [gEenableEGAP] Value = [%u] ",
pHddCtx->config->enable_egap);
CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_INFO_HIGH,
"Name = [gEGAPInactTime] Value = [%u] ",
pHddCtx->config->egap_inact_time);
CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_INFO_HIGH,
"Name = [gEGAPWaitTime] Value = [%u] ",
pHddCtx->config->egap_wait_time);
CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_INFO_HIGH,
"Name = [gEGAPFeatures] Value = [%u] ",
pHddCtx->config->egap_feature_flag);
#endif
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_INFO_HIGH,
@ -5167,6 +5226,16 @@ void hdd_cfg_print(hdd_context_t *pHddCtx)
hddLog(LOGE, "Name = [%s] Value = [%d]",
CFG_FIRST_SCAN_BUCKET_THRESHOLD_NAME,
pHddCtx->config->first_scan_bucket_threshold);
hddLog(LOGE, "Name = [%s] Value = [%u]",
CFG_HT_MPDU_DENSITY_NAME,
pHddCtx->config->ht_mpdu_density);
#ifdef FEATURE_LFR_SUBNET_DETECTION
hddLog(LOGE, "Name = [%s] Value = [%d]",
CFG_ENABLE_LFR_SUBNET_DETECTION,
pHddCtx->config->enable_lfr_subnet_detection);
#endif
}
@ -5429,20 +5498,14 @@ eCsrPhyMode hdd_cfg_xlate_to_csr_phy_mode(eHddDot11Mode dot11Mode)
*/
CDF_STATUS hdd_set_idle_ps_config(hdd_context_t *pHddCtx, uint32_t val)
{
struct hdd_config *pConfig = pHddCtx->config;
CDF_STATUS status = CDF_STATUS_SUCCESS;
hddLog(LOG1, "hdd_set_idle_ps_config: Enter Val %d", val);
if (pConfig->fIsImpsEnabled) {
status = sme_set_idle_powersave_config(pHddCtx->pcds_context,
pHddCtx->hHal, val);
if (CDF_STATUS_SUCCESS != status) {
hddLog(LOGE, "Fail to Set Idle PS Config val %d", val);
}
} else {
hddLog(LOG1, "hdd_set_idle_ps_config: IMPS not enabled in ini");
}
status = sme_set_idle_powersave_config(pHddCtx->pcds_context,
pHddCtx->hHal, val);
if (CDF_STATUS_SUCCESS != status)
hddLog(LOGE, "Fail to Set Idle PS Config val %d", val);
return status;
}
@ -5465,10 +5528,11 @@ static void hdd_set_fine_time_meas_cap(hdd_context_t *hdd_ctx,
/* Make sure only supported capabilities are enabled in INI */
capability &= CFG_FINE_TIME_MEAS_CAPABILITY_MAX;
sme_config->fine_time_meas_cap = capability;
sme_config->csrConfig.fine_time_meas_cap = capability;
hddLog(LOG1, FL("fine time meas capability - INI: %04x Enabled: %04x"),
config->fine_time_meas_cap, sme_config->fine_time_meas_cap);
config->fine_time_meas_cap,
sme_config->csrConfig.fine_time_meas_cap);
return;
}
@ -5594,6 +5658,14 @@ bool hdd_update_config_dat(hdd_context_t *pHddCtx)
"Could not pass on WNI_CFG_HT_AMPDU_PARAMS_MAX_RX_AMPDU_FACTOR to CFG");
}
if (sme_cfg_set_int(pHddCtx->hHal, WNI_CFG_MPDU_DENSITY,
pConfig->ht_mpdu_density) ==
CDF_STATUS_E_FAILURE) {
fStatus = false;
hddLog(LOGE,
"Could not pass on WNI_CFG_MPDU_DENSITY to CFG");
}
if (sme_cfg_set_int
(pHddCtx->hHal, WNI_CFG_SHORT_PREAMBLE,
pConfig->fIsShortPreamble) == CDF_STATUS_E_FAILURE) {
@ -6283,14 +6355,15 @@ bool hdd_update_config_dat(hdd_context_t *pHddCtx)
void hdd_set_pno_channel_prediction_config(
tpSmeConfigParams sme_config, hdd_context_t *hdd_ctx)
{
sme_config->dual_mac_feature_disable =
sme_config->csrConfig.dual_mac_feature_disable =
hdd_ctx->config->dual_mac_feature_disable;
sme_config->pno_channel_prediction =
sme_config->csrConfig.pno_channel_prediction =
hdd_ctx->config->pno_channel_prediction;
sme_config->top_k_num_of_channels =
sme_config->csrConfig.top_k_num_of_channels =
hdd_ctx->config->top_k_num_of_channels;
sme_config->stationary_thresh = hdd_ctx->config->stationary_thresh;
sme_config->channel_prediction_full_scan =
sme_config->csrConfig.stationary_thresh =
hdd_ctx->config->stationary_thresh;
sme_config->csrConfig.channel_prediction_full_scan =
hdd_ctx->config->channel_prediction_full_scan;
}
#endif
@ -6403,6 +6476,8 @@ CDF_STATUS hdd_set_sme_config(hdd_context_t *pHddCtx)
#ifdef WLAN_FEATURE_11AC
smeConfig->csrConfig.nVhtChannelWidth = pConfig->vhtChannelWidth;
smeConfig->csrConfig.enableTxBF = pConfig->enableTxBF;
smeConfig->csrConfig.enable_txbf_sap_mode =
pConfig->enable_txbf_sap_mode;
smeConfig->csrConfig.txBFCsnValue = pConfig->txBFCsnValue;
smeConfig->csrConfig.enable2x2 = pConfig->enable2x2;
smeConfig->csrConfig.enableVhtFor24GHz = pConfig->enableVhtFor24GHzBand;
@ -6429,20 +6504,16 @@ CDF_STATUS hdd_set_sme_config(hdd_context_t *pHddCtx)
smeConfig->csrConfig.nTxPowerCap = pConfig->nTxPowerCap;
smeConfig->csrConfig.fEnableBypass11d = pConfig->enableBypass11d;
smeConfig->csrConfig.fEnableDFSChnlScan = pConfig->enableDFSChnlScan;
#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_ESE) || defined(FEATURE_WLAN_LFR)
smeConfig->csrConfig.nRoamPrefer5GHz = pConfig->nRoamPrefer5GHz;
smeConfig->csrConfig.nRoamIntraBand = pConfig->nRoamIntraBand;
smeConfig->csrConfig.nProbes = pConfig->nProbes;
smeConfig->csrConfig.nRoamScanHomeAwayTime =
pConfig->nRoamScanHomeAwayTime;
#endif
smeConfig->csrConfig.fFirstScanOnly2GChnl =
pConfig->enableFirstScan2GOnly;
/* FIXME 11d config is hardcoded */
if (CDF_SAP_MODE != hdd_get_conparam())
smeConfig->csrConfig.Csr11dinfo.Channels.numChannels = 0;
smeConfig->csrConfig.Csr11dinfo.Channels.numChannels = 0;
hdd_set_power_save_offload_config(pHddCtx);
@ -6450,11 +6521,9 @@ CDF_STATUS hdd_set_sme_config(hdd_context_t *pHddCtx)
smeConfig->csrConfig.csr11rConfig.IsFTResourceReqSupported =
pConfig->fFTResourceReqSupported;
#endif
#ifdef FEATURE_WLAN_LFR
smeConfig->csrConfig.isFastRoamIniFeatureEnabled =
pConfig->isFastRoamIniFeatureEnabled;
smeConfig->csrConfig.MAWCEnabled = pConfig->MAWCEnabled;
#endif
#ifdef FEATURE_WLAN_ESE
smeConfig->csrConfig.isEseIniFeatureEnabled =
pConfig->isEseIniFeatureEnabled;
@ -6462,12 +6531,10 @@ CDF_STATUS hdd_set_sme_config(hdd_context_t *pHddCtx)
pConfig->isFastTransitionEnabled = true;
}
#endif
#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_ESE) || defined(FEATURE_WLAN_LFR)
smeConfig->csrConfig.isFastTransitionEnabled =
pConfig->isFastTransitionEnabled;
smeConfig->csrConfig.RoamRssiDiff = pConfig->RoamRssiDiff;
smeConfig->csrConfig.isWESModeEnabled = pConfig->isWESModeEnabled;
#endif
smeConfig->csrConfig.isRoamOffloadScanEnabled =
pConfig->isRoamOffloadScanEnabled;
smeConfig->csrConfig.bFastRoamInConIniFeatureEnabled =
@ -6477,7 +6544,6 @@ CDF_STATUS hdd_set_sme_config(hdd_context_t *pHddCtx)
/* Disable roaming in concurrency if roam scan offload is disabled */
smeConfig->csrConfig.bFastRoamInConIniFeatureEnabled = 0;
}
#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
smeConfig->csrConfig.neighborRoamConfig.nNeighborLookupRssiThreshold =
pConfig->nNeighborLookupRssiThreshold;
smeConfig->csrConfig.neighborRoamConfig.delay_before_vdev_stop =
@ -6518,7 +6584,6 @@ CDF_STATUS hdd_set_sme_config(hdd_context_t *pHddCtx)
pConfig->nhi_rssi_scan_delay;
smeConfig->csrConfig.neighborRoamConfig.nhi_rssi_scan_rssi_ub =
pConfig->nhi_rssi_scan_rssi_ub;
#endif
smeConfig->csrConfig.addTSWhenACMIsOff = pConfig->AddTSWhenACMIsOff;
smeConfig->csrConfig.fValidateList = pConfig->fValidateScanList;
smeConfig->csrConfig.allowDFSChannelRoam = pConfig->allowDFSChannelRoam;
@ -6553,17 +6618,18 @@ CDF_STATUS hdd_set_sme_config(hdd_context_t *pHddCtx)
#ifdef FEATURE_WLAN_SCAN_PNO
/* Update PNO offoad status */
smeConfig->pnoOffload = pHddCtx->config->PnoOffload;
smeConfig->csrConfig.pnoOffload = pHddCtx->config->PnoOffload;
#endif
/* Update maximum interfaces information */
smeConfig->max_intf_count = pHddCtx->max_intf_count;
smeConfig->csrConfig.max_intf_count = pHddCtx->max_intf_count;
smeConfig->fEnableDebugLog = pHddCtx->config->gEnableDebugLog;
smeConfig->csrConfig.fEnableDebugLog = pHddCtx->config->gEnableDebugLog;
smeConfig->enable5gEBT = pHddCtx->config->enable5gEBT;
smeConfig->csrConfig.enable5gEBT = pHddCtx->config->enable5gEBT;
smeConfig->enableSelfRecovery = pHddCtx->config->enableSelfRecovery;
smeConfig->csrConfig.enableSelfRecovery =
pHddCtx->config->enableSelfRecovery;
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
smeConfig->csrConfig.isRoamOffloadEnabled =
pHddCtx->config->isRoamOffloadEnabled;
@ -6575,25 +6641,25 @@ CDF_STATUS hdd_set_sme_config(hdd_context_t *pHddCtx)
smeConfig->csrConfig.is_sta_connection_in_5gz_enabled =
pHddCtx->config->is_sta_connection_in_5gz_enabled;
smeConfig->f_sta_miracast_mcc_rest_time_val =
smeConfig->csrConfig.f_sta_miracast_mcc_rest_time_val =
pHddCtx->config->sta_miracast_mcc_rest_time_val;
#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
smeConfig->sap_channel_avoidance =
smeConfig->csrConfig.sap_channel_avoidance =
pHddCtx->config->sap_channel_avoidance;
#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
smeConfig->f_prefer_non_dfs_on_radar =
smeConfig->csrConfig.f_prefer_non_dfs_on_radar =
pHddCtx->config->prefer_non_dfs_on_radar;
smeConfig->is_ps_enabled = pHddCtx->config->is_ps_enabled;
smeConfig->csrConfig.is_ps_enabled = pHddCtx->config->is_ps_enabled;
hdd_set_fine_time_meas_cap(pHddCtx, smeConfig);
cds_set_multicast_logging(pHddCtx->config->multicast_host_fw_msgs);
smeConfig->csrConfig.sendDeauthBeforeCon = pConfig->sendDeauthBeforeCon;
smeConfig->policy_manager_enabled =
smeConfig->csrConfig.policy_manager_enabled =
pHddCtx->config->policy_manager_enabled;
smeConfig->csrConfig.max_scan_count =
pHddCtx->config->max_scan_count;
@ -6603,11 +6669,11 @@ CDF_STATUS hdd_set_sme_config(hdd_context_t *pHddCtx)
(pHddCtx->config->dot11p_mode != WLAN_HDD_11P_DISABLED);
hdd_set_pno_channel_prediction_config(smeConfig, pHddCtx);
smeConfig->early_stop_scan_enable =
smeConfig->csrConfig.early_stop_scan_enable =
pHddCtx->config->early_stop_scan_enable;
smeConfig->early_stop_scan_min_threshold =
smeConfig->csrConfig.early_stop_scan_min_threshold =
pHddCtx->config->early_stop_scan_min_threshold;
smeConfig->early_stop_scan_max_threshold =
smeConfig->csrConfig.early_stop_scan_max_threshold =
pHddCtx->config->early_stop_scan_max_threshold;
smeConfig->csrConfig.first_scan_bucket_threshold =
pHddCtx->config->first_scan_bucket_threshold;

File diff suppressed because it is too large Load diff

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2012-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -249,6 +249,9 @@ typedef enum {
* @QCA_NL80211_VENDOR_SUBCMD_TRIGGER_SCAN: venodr scan command
* @QCA_NL80211_VENDOR_SUBCMD_SCAN_DONE: vendor scan complete
* @QCA_NL80211_VENDOR_SUBCMD_OTA_TEST: enable OTA test
* @QCA_NL80211_VENDOR_SUBCMD_GW_PARAM_CONFIG: set gateway parameters
* @QCA_NL80211_VENDOR_SUBCMD_SET_TXPOWER_SCALE: set tx power by percentage
* @QCA_NL80211_VENDOR_SUBCMD_SET_TXPOWER_SCALE_DECR_DB: reduce tx power by DB
*/
enum qca_nl80211_vendor_subcmds {
@ -350,6 +353,8 @@ enum qca_nl80211_vendor_subcmds {
/* subcommand to get link properties */
QCA_NL80211_VENDOR_SUBCMD_LINK_PROPERTIES = 101,
/* LFR Subnet Detection */
QCA_NL80211_VENDOR_SUBCMD_GW_PARAM_CONFIG = 102,
/* DBS subcommands */
QCA_NL80211_VENDOR_SUBCMD_GET_PREFERRED_FREQ_LIST = 103,
@ -361,6 +366,10 @@ enum qca_nl80211_vendor_subcmds {
/* OTA test subcommand */
QCA_NL80211_VENDOR_SUBCMD_OTA_TEST = 108,
/* Tx power scaling subcommands */
QCA_NL80211_VENDOR_SUBCMD_SET_TXPOWER_SCALE = 109,
/* Tx power scaling in db subcommands */
QCA_NL80211_VENDOR_SUBCMD_SET_TXPOWER_SCALE_DECR_DB = 115,
};
@ -420,6 +429,8 @@ enum qca_nl80211_vendor_subcmds {
* @QCA_NL80211_VENDOR_SUBCMD_SCAN_INDEX: vendor scan index
* @QCA_NL80211_VENDOR_SUBCMD_SCAN_DONE_INDEX:
* vendor scan complete event index
* @QCA_NL80211_VENDOR_SUBCMD_GW_PARAM_CONFIG_INDEX:
* update gateway parameters index
*/
enum qca_nl80211_vendor_subcmds_index {
@ -488,6 +499,7 @@ enum qca_nl80211_vendor_subcmds_index {
QCA_NL80211_VENDOR_SUBCMD_DCC_STATS_EVENT_INDEX,
QCA_NL80211_VENDOR_SUBCMD_SCAN_INDEX,
QCA_NL80211_VENDOR_SUBCMD_SCAN_DONE_INDEX,
QCA_NL80211_VENDOR_SUBCMD_GW_PARAM_CONFIG_INDEX,
};
/**
@ -1548,6 +1560,7 @@ enum qca_wlan_vendor_attr_set_no_dfs_flag {
* @QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_KEY_REPLAY_CTR: Replay Counter
* @QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_PTK_KCK: KCK of the PTK
* @QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_PTK_KEK: KEK of the PTK
* @QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_SUBNET_STATUS: subnet change status
*/
enum qca_wlan_vendor_attr_roam_auth {
QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_INVALID = 0,
@ -1558,6 +1571,7 @@ enum qca_wlan_vendor_attr_roam_auth {
QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_KEY_REPLAY_CTR,
QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_PTK_KCK,
QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_PTK_KEK,
QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_SUBNET_STATUS,
QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_AFTER_LAST,
QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_MAX =
QCA_WLAN_VENDOR_ATTR_ROAM_AUTH_AFTER_LAST - 1
@ -2165,6 +2179,23 @@ enum qca_vendor_attr_probable_oper_channel {
QCA_WLAN_VENDOR_ATTR_PROBABLE_OPER_CHANNEL_AFTER_LAST - 1
};
/**
* enum qca_wlan_vendor_attr_gw_param_config - gateway param config
* @QCA_WLAN_VENDOR_ATTR_GW_PARAM_CONFIG_INVALID: Invalid
* @QCA_WLAN_VENDOR_ATTR_GW_PARAM_CONFIG_GW_MAC_ADDR: gateway mac addr
* @QCA_WLAN_VENDOR_ATTR_GW_PARAM_CONFIG_IPV4_ADDR: ipv4 addr
* @QCA_WLAN_VENDOR_ATTR_GW_PARAM_CONFIG_IPV6_ADDR: ipv6 addr
*/
enum qca_wlan_vendor_attr_gw_param_config {
QCA_WLAN_VENDOR_ATTR_GW_PARAM_CONFIG_INVALID = 0,
QCA_WLAN_VENDOR_ATTR_GW_PARAM_CONFIG_GW_MAC_ADDR,
QCA_WLAN_VENDOR_ATTR_GW_PARAM_CONFIG_IPV4_ADDR,
QCA_WLAN_VENDOR_ATTR_GW_PARAM_CONFIG_IPV6_ADDR,
QCA_WLAN_VENDOR_ATTR_GW_PARAM_CONFIG_AFTER_LAST,
QCA_WLAN_VENDOR_ATTR_GW_PARAM_CONFIG_MAX =
QCA_WLAN_VENDOR_ATTR_GW_PARAM_CONFIG_AFTER_LAST - 1,
};
/**
* enum drv_dbs_capability - DBS capability
* @DRV_DBS_CAPABILITY_DISABLED: DBS disabled
@ -2194,14 +2225,45 @@ enum qca_vendor_attr_ota_test {
QCA_WLAN_VENDOR_ATTR_OTA_TEST_AFTER_LAST - 1
};
/** enum qca_vendor_attr_txpower_scale - vendor sub commands index
* @QCA_WLAN_VENDOR_ATTR_TXPOWER_SCALE_INVALID: invalid value
* @QCA_WLAN_VENDOR_ATTR_TXPOWER_SCALE: scaling value
* @QCA_WLAN_VENDOR_ATTR_TXPOWER_SCALE_AFTER_LAST: last value
* @QCA_WLAN_VENDOR_ATTR_TXPOWER_SCALE_MAX: max value
*/
enum qca_vendor_attr_txpower_scale {
QCA_WLAN_VENDOR_ATTR_TXPOWER_SCALE_INVALID,
/* 8-bit unsigned value to indicate the scaling of tx power */
QCA_WLAN_VENDOR_ATTR_TXPOWER_SCALE,
/* keep last */
QCA_WLAN_VENDOR_ATTR_TXPOWER_SCALE_AFTER_LAST,
QCA_WLAN_VENDOR_ATTR_TXPOWER_SCALE_MAX =
QCA_WLAN_VENDOR_ATTR_TXPOWER_SCALE_AFTER_LAST - 1
};
/**
* enum qca_vendor_attr_txpower_scale_decr_db - vendor sub commands index
* @QCA_WLAN_VENDOR_ATTR_TXPOWER_SCALE_DECR_DB_INVALID: invalid value
* @QCA_WLAN_VENDOR_ATTR_TXPOWER_SCALE_DECR_DB: scaling value
* @QCA_WLAN_VENDOR_ATTR_TXPOWER_SCALE_DECR_DB_AFTER_LAST: last value
* @QCA_WLAN_VENDOR_ATTR_TXPOWER_SCALE_DECR_DB_MAX: max value
*/
enum qca_vendor_attr_txpower_scale_decr_db {
QCA_WLAN_VENDOR_ATTR_TXPOWER_SCALE_DECR_DB_INVALID,
/* 8-bit unsigned value to indicate the scaling of tx power */
QCA_WLAN_VENDOR_ATTR_TXPOWER_SCALE_DECR_DB,
/* keep last */
QCA_WLAN_VENDOR_ATTR_TXPOWER_SCALE_DECR_DB_AFTER_LAST,
QCA_WLAN_VENDOR_ATTR_TXPOWER_SCALE_DECR_DB_MAX =
QCA_WLAN_VENDOR_ATTR_TXPOWER_SCALE_DECR_DB_AFTER_LAST - 1
};
struct cfg80211_bss *wlan_hdd_cfg80211_update_bss_db(hdd_adapter_t *pAdapter,
tCsrRoamInfo *pRoamInfo);
#ifdef FEATURE_WLAN_LFR
int wlan_hdd_cfg80211_pmksa_candidate_notify(hdd_adapter_t *pAdapter,
tCsrRoamInfo *pRoamInfo,
int index, bool preauth);
#endif
#ifdef FEATURE_WLAN_LFR_METRICS
CDF_STATUS wlan_hdd_cfg80211_roam_metrics_preauth(hdd_adapter_t *pAdapter,
@ -2222,12 +2284,9 @@ void wlan_hdd_cfg80211_set_key_wapi(hdd_adapter_t *pAdapter, uint8_t key_index,
const uint8_t *mac_addr, const uint8_t *key,
int key_Len);
#endif
struct wiphy *wlan_hdd_cfg80211_wiphy_alloc(int priv_size);
hdd_context_t *hdd_cfg80211_wiphy_alloc(int priv_size);
int wlan_hdd_cfg80211_scan(struct wiphy *wiphy,
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0))
struct net_device *dev,
#endif
struct cfg80211_scan_request *request);
int wlan_hdd_cfg80211_init(struct device *dev,
@ -2240,13 +2299,8 @@ void wlan_hdd_cfg80211_register_frames(hdd_adapter_t *pAdapter);
void wlan_hdd_cfg80211_deregister_frames(hdd_adapter_t *pAdapter);
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0))
void hdd_reg_notifier(struct wiphy *wiphy,
struct regulatory_request *request);
#else
int hdd_reg_notifier(struct wiphy *wiphy,
struct regulatory_request *request);
#endif
extern void hdd_conn_set_connection_state(hdd_adapter_t *pAdapter,
eConnectionState connState);

View file

@ -1,5 +1,5 @@
/*
* Copyright (c)2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2015-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -633,7 +633,7 @@ void wlan_hdd_one_connection_scenario(hdd_context_t *hdd_ctx)
CDF_STATUS ret;
/* flush the entire table first */
ret = cds_init_policy_mgr(hdd_ctx);
ret = cds_init_policy_mgr();
if (!CDF_IS_STATUS_SUCCESS(ret)) {
hdd_err("Policy manager initialization failed");
return;
@ -641,7 +641,7 @@ void wlan_hdd_one_connection_scenario(hdd_context_t *hdd_ctx)
for (sub_type = 0; sub_type < CDS_MAX_NUM_OF_MODE; sub_type++) {
/* validate one connection is created or no */
if (cds_get_connection_count(hdd_ctx) != 0) {
if (cds_get_connection_count() != 0) {
hddLog(LOGE,
FL("Test failed - No. of connection is not 0"));
return;
@ -651,7 +651,7 @@ void wlan_hdd_one_connection_scenario(hdd_context_t *hdd_ctx)
pcl_type = get_pcl_from_first_conn_table(sub_type, system_pref);
/* check PCL value for second connection is correct or no */
cds_get_pcl(hdd_ctx, sub_type, pcl, &pcl_len);
cds_get_pcl(sub_type, pcl, &pcl_len);
status = wlan_hdd_validate_pcl(hdd_ctx,
pcl_type, pcl, pcl_len, 0, 0,
reason, sizeof(reason));
@ -688,7 +688,7 @@ void wlan_hdd_two_connections_scenario(hdd_context_t *hdd_ctx,
type = wlan_hdd_valid_type_of_persona(sub_type);
/* flush the entire table first */
ret = cds_init_policy_mgr(hdd_ctx);
ret = cds_init_policy_mgr();
if (!CDF_IS_STATUS_SUCCESS(ret)) {
hdd_err("Policy manager initialization failed");
return;
@ -697,11 +697,11 @@ void wlan_hdd_two_connections_scenario(hdd_context_t *hdd_ctx,
/* sub_type mapping between HDD and WMA are different */
wlan_hdd_map_subtypes_hdd_wma(&dummy_type, &sub_type);
/* add first connection as STA */
cds_incr_connection_count_utfw(hdd_ctx, vdevid, tx_stream,
cds_incr_connection_count_utfw(vdevid, tx_stream,
rx_stream, chain_mask, type, dummy_type,
channel_id, mac_id);
/* validate one connection is created or no */
if (cds_get_connection_count(hdd_ctx) != 1) {
if (cds_get_connection_count() != 1) {
hddLog(LOGE,
FL("Test failed - No. of connection is not 1"));
return;
@ -710,8 +710,7 @@ void wlan_hdd_two_connections_scenario(hdd_context_t *hdd_ctx,
while (next_sub_type < CDS_MAX_NUM_OF_MODE) {
/* get the PCL value & check the channels accordingly */
second_index =
cds_get_second_connection_pcl_table_index(
hdd_ctx);
cds_get_second_connection_pcl_table_index();
if (CDS_MAX_ONE_CONNECTION_MODE == second_index) {
/* not valid combination*/
hddLog(LOGE, FL("couldn't find index for 2nd connection pcl table"));
@ -724,7 +723,7 @@ void wlan_hdd_two_connections_scenario(hdd_context_t *hdd_ctx,
next_sub_type, system_pref,
wma_is_hw_dbs_capable());
/* check PCL for second connection is correct or no */
cds_get_pcl(hdd_ctx, next_sub_type, pcl, &pcl_len);
cds_get_pcl(next_sub_type, pcl, &pcl_len);
status = wlan_hdd_validate_pcl(hdd_ctx,
pcl_type, pcl, pcl_len, channel_id, 0,
reason, sizeof(reason));
@ -787,7 +786,7 @@ void wlan_hdd_three_connections_scenario(hdd_context_t *hdd_ctx,
type_1 = wlan_hdd_valid_type_of_persona(sub_type_1);
/* flush the entire table first */
ret = cds_init_policy_mgr(hdd_ctx);
ret = cds_init_policy_mgr();
if (!CDF_IS_STATUS_SUCCESS(ret)) {
hdd_err("Policy manager initialization failed");
return;
@ -796,11 +795,11 @@ void wlan_hdd_three_connections_scenario(hdd_context_t *hdd_ctx,
/* sub_type mapping between HDD and WMA are different */
wlan_hdd_map_subtypes_hdd_wma(&dummy_type_1, &sub_type_1);
/* add first connection as STA */
cds_incr_connection_count_utfw(hdd_ctx, vdevid_1,
cds_incr_connection_count_utfw(vdevid_1,
tx_stream_1, rx_stream_1, chain_mask_1, type_1,
dummy_type_1, channel_id_1, mac_id_1);
/* validate one connection is created or no */
if (cds_get_connection_count(hdd_ctx) != 1) {
if (cds_get_connection_count() != 1) {
hddLog(LOGE,
FL("Test fail - No. of connection not 1"));
return;
@ -812,11 +811,11 @@ void wlan_hdd_three_connections_scenario(hdd_context_t *hdd_ctx,
/* sub_type mapping between HDD and WMA are different */
wlan_hdd_map_subtypes_hdd_wma(&dummy_type_2,
&sub_type_2);
cds_incr_connection_count_utfw(hdd_ctx, vdevid_2,
cds_incr_connection_count_utfw(vdevid_2,
tx_stream_2, rx_stream_2, chain_mask_2, type_2,
dummy_type_2, channel_id_2, mac_id_2);
/* validate two connections are created or no */
if (cds_get_connection_count(hdd_ctx) != 2) {
if (cds_get_connection_count() != 2) {
hddLog(LOGE,
FL("Test fail - No. connection not 2"));
return;
@ -824,8 +823,7 @@ void wlan_hdd_three_connections_scenario(hdd_context_t *hdd_ctx,
next_sub_type = CDS_STA_MODE;
while (next_sub_type < CDS_MAX_NUM_OF_MODE) {
third_index =
cds_get_third_connection_pcl_table_index(
hdd_ctx);
cds_get_third_connection_pcl_table_index();
if (CDS_MAX_TWO_CONNECTION_MODE ==
third_index) {
/* not valid combination */
@ -839,7 +837,7 @@ void wlan_hdd_three_connections_scenario(hdd_context_t *hdd_ctx,
third_index, next_sub_type,
system_pref,
wma_is_hw_dbs_capable());
cds_get_pcl(hdd_ctx, next_sub_type,
cds_get_pcl(next_sub_type,
pcl, &pcl_len);
status = wlan_hdd_validate_pcl(hdd_ctx,
pcl_type, pcl, pcl_len,
@ -858,7 +856,7 @@ void wlan_hdd_three_connections_scenario(hdd_context_t *hdd_ctx,
next_sub_type++;
}
/* remove entry to make a room for next iteration */
cds_decr_connection_count(hdd_ctx, vdevid_2);
cds_decr_connection_count(vdevid_2);
}
next_sub_type = CDS_STA_MODE;
}

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2015-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -25,6 +25,9 @@
* to the Linux Foundation.
*/
/* denote that this file does not allow legacy hddLog */
#define HDD_DISALLOW_LEGACY_HDDLOG 1
#include <linux/platform_device.h>
#include <linux/pci.h>
#ifdef HIF_PCI
@ -40,6 +43,7 @@
#include "cds_sched.h"
#include "osdep.h"
#include "hif.h"
#include "htc.h"
#include "epping_main.h"
#include "wlan_hdd_main.h"
#include "wlan_hdd_power.h"
@ -47,6 +51,7 @@
#include "wma_api.h"
#include "wlan_hdd_napi.h"
#include "cds_concurrency.h"
#include "qwlan_version.h"
#ifdef MODULE
#define WLAN_MODULE_NAME module_name(THIS_MODULE)
@ -72,6 +77,112 @@
#define WLAN_HDD_UNREGISTER_DRIVER(wlan_drv_ops) \
icnss_unregister_driver(wlan_drv_ops)
#endif /* HIF_PCI */
#define DISABLE_KRAIT_IDLE_PS_VAL 1
/*
* In BMI Phase we are only sending small chunk (256 bytes) of the FW image at
* a time, and wait for the completion interrupt to start the next transfer.
* During this phase, the KRAIT is entering IDLE/StandAlone(SA) Power Save(PS).
* The delay incurred for resuming from IDLE/SA PS is huge during driver load.
* So prevent APPS IDLE/SA PS durint driver load for reducing interrupt latency.
*/
#ifdef CONFIG_CNSS
static inline void hdd_request_pm_qos(int val)
{
cnss_request_pm_qos(val);
}
static inline void hdd_remove_pm_qos(void)
{
cnss_remove_pm_qos();
}
#else
static inline void hdd_request_pm_qos(int val)
{
}
static inline void hdd_remove_pm_qos(void)
{
}
#endif
/**
* hdd_hif_open() - HIF open helper
* @dev: wlan device structure
* @bdev: bus device structure
* @bid: bus identifier for shared busses
* @bus_type: underlying bus type
* @reinit: true if we are reinitializing the driver during recovery phase
*
* This function brings-up HIF layer during load/recovery phase.
*
* Return: 0 on success and errno on failure.
*/
static int hdd_hif_open(struct device *dev, void *bdev, const hif_bus_id *bid,
enum ath_hal_bus_type bus_type, bool reinit)
{
CDF_STATUS status;
int ret = 0;
void *hif_ctx;
status = hif_open(bus_type);
if (!CDF_IS_STATUS_SUCCESS(status)) {
hdd_err("hif_open error = %d", status);
return cdf_status_to_os_return(status);
}
hif_ctx = cds_get_context(CDF_MODULE_ID_HIF);
ret = hdd_napi_create();
if (hdd_napi_enabled(HDD_NAPI_ANY)) {
hdd_info("hdd_napi_create returned: %d", status);
if (ret <= 0) {
hdd_err("NAPI creation error, rc: 0x%x, reinit = %d",
status, reinit);
ret = -EFAULT;
goto err_hif_close;
}
}
status = hif_enable(hif_ctx, dev, bdev, bid, bus_type,
(reinit == true) ? HIF_ENABLE_TYPE_REINIT :
HIF_ENABLE_TYPE_PROBE);
if (!CDF_IS_STATUS_SUCCESS(status)) {
hdd_err("hif_enable error = %d, reinit = %d",
status, reinit);
ret = cdf_status_to_os_return(status);
goto err_napi_destroy;
}
return 0;
err_napi_destroy:
hdd_napi_destroy(true);
err_hif_close:
hif_close(hif_ctx);
return ret;
}
/**
* hdd_hif_close() - HIF close helper
* @hif_ctx: HIF context
*
* Helper function to close HIF
*/
static void hdd_hif_close(void *hif_ctx)
{
if (hif_ctx == NULL)
return;
hif_disable(hif_ctx, HIF_DISABLE_TYPE_REMOVE);
hdd_napi_destroy(true);
hif_close(hif_ctx);
}
/**
* wlan_hdd_probe() - handles probe request
@ -91,72 +202,90 @@ static int wlan_hdd_probe(struct device *dev, void *bdev, const hif_bus_id *bid,
{
void *hif_ctx;
CDF_STATUS status;
int ret;
int ret = 0;
pr_info("%s: %sprobing driver v%s\n", WLAN_MODULE_NAME,
reinit ? "re-" : "", QWLAN_VERSIONSTR);
hdd_prevent_suspend(WIFI_POWER_EVENT_WAKELOCK_DRIVER_INIT);
/*
* The Krait is going to Idle/Stand Alone Power Save
* more aggressively which is resulting in the longer driver load time.
* The Fix is to not allow Krait to enter Idle Power Save during driver
* load.
*/
hdd_request_pm_qos(DISABLE_KRAIT_IDLE_PS_VAL);
if (reinit) {
cds_set_recovery_in_progress(true);
} else {
ret = hdd_init();
if (ret)
goto out;
cds_set_load_in_progress(true);
}
if (WLAN_IS_EPPING_ENABLED(cds_get_conparam())) {
status = epping_open();
if (status != CDF_STATUS_SUCCESS)
return status;
goto err_hdd_deinit;
}
status = hif_open();
if (status != CDF_STATUS_SUCCESS) {
hddLog(LOGE, FL("hif_open error = %d"), status);
return -EFAULT;
}
ret = hdd_hif_open(dev, bdev, bid, bus_type, reinit);
if (ret)
goto err_epping_close;
hif_ctx = cds_get_context(CDF_MODULE_ID_HIF);
if (reinit)
hdd_napi_destroy(true);
status = hdd_napi_create();
if (hdd_napi_enabled(HDD_NAPI_ANY)) {
hdd_info("hdd_napi_create returned: %d\n", status);
if (status <= 0) {
hdd_err("NAPI creation error, rc: 0x%x, reinit = %d",
status, reinit);
ret = -EFAULT;
goto end;
}
}
status = hif_enable(hif_ctx, dev, bdev, bid,
bus_type, (reinit == true) ?
HIF_ENABLE_TYPE_REINIT : HIF_ENABLE_TYPE_PROBE);
if (status != CDF_STATUS_SUCCESS) {
hdd_err("hif_enable error = %d, reinit = %d",
status, reinit);
ret = -EIO;
goto end;
}
if (reinit)
ret = hdd_wlan_re_init(hif_ctx);
else
ret = hdd_wlan_startup(dev, hif_ctx);
end:
if (ret) {
if (WLAN_IS_EPPING_ENABLED(cds_get_conparam())) {
hif_pktlogmod_exit(hif_ctx);
epping_disable();
htc_destroy(cds_get_context(CDF_MODULE_ID_HTC));
hif_disable(hif_ctx, (reinit == true) ?
HIF_ENABLE_TYPE_REINIT : HIF_ENABLE_TYPE_PROBE);
cds_free_context(NULL, CDF_MODULE_ID_HTC, NULL);
epping_close();
} else {
hif_pktlogmod_exit(hif_ctx);
__hdd_wlan_exit();
hif_disable(hif_ctx, HIF_DISABLE_TYPE_REMOVE);
}
hif_close(hif_ctx);
if (ret)
goto err_hif_close;
hif_enable_power_management(hif_ctx);
if (reinit) {
cds_set_recovery_in_progress(false);
} else {
cds_set_load_in_progress(false);
cds_set_driver_loaded(true);
}
if (reinit)
cds_set_logp_in_progress(false);
hdd_allow_suspend(WIFI_POWER_EVENT_WAKELOCK_DRIVER_INIT);
hdd_remove_pm_qos();
return 0;
err_hif_close:
hdd_hif_close(hif_ctx);
err_epping_close:
if (WLAN_IS_EPPING_ENABLED(cds_get_conparam()))
epping_close();
err_hdd_deinit:
cds_set_load_in_progress(false);
hdd_deinit();
out:
hdd_allow_suspend(WIFI_POWER_EVENT_WAKELOCK_DRIVER_INIT);
hdd_remove_pm_qos();
return ret;
}
#ifdef CONFIG_CNSS
static inline void hdd_cnss_driver_unloading(void)
{
cnss_set_driver_status(CNSS_LOAD_UNLOAD);
}
#else
static inline void hdd_cnss_driver_unloading(void) { }
#endif
/**
* wlan_hdd_remove() - wlan_hdd_remove
*
@ -168,38 +297,41 @@ end:
static void wlan_hdd_remove(void)
{
void *hif_ctx;
v_CONTEXT_t p_cds_context = NULL;
/* Get the global cds context */
p_cds_context = cds_get_global_context();
pr_info("%s: Removing driver v%s\n", WLAN_MODULE_NAME,
QWLAN_VERSIONSTR);
/* Wait for recovery to complete */
while (cds_is_driver_recovering()) {
hdd_alert("Recovery in progress; wait here!!!");
msleep(1000);
}
cds_set_driver_loaded(false);
cds_set_unload_in_progress(true);
if (!cds_wait_for_external_threads_completion(__func__))
hdd_err("External threads are still active attempting driver unload anyway");
hdd_cnss_driver_unloading();
hif_ctx = cds_get_context(CDF_MODULE_ID_HIF);
hif_disable_power_management(hif_ctx);
hif_pktlogmod_exit(hif_ctx);
if (WLAN_IS_EPPING_ENABLED(cds_get_conparam())) {
hif_pktlogmod_exit(hif_ctx);
epping_disable();
htc_destroy(cds_get_context(CDF_MODULE_ID_HTC));
hif_disable(hif_ctx, HIF_DISABLE_TYPE_REMOVE);
cds_free_context(NULL, CDF_MODULE_ID_HTC, NULL);
epping_close();
} else {
hif_pktlogmod_exit(hif_ctx);
__hdd_wlan_exit();
hif_disable(hif_ctx, HIF_DISABLE_TYPE_REMOVE);
}
hdd_napi_destroy(true);
hif_close(hif_ctx);
hdd_hif_close(hif_ctx);
cds_free_global_context(&p_cds_context);
hdd_deinit();
#ifdef WLAN_LOGGING_SOCK_SVC_ENABLE
wlan_logging_sock_deinit_svc();
#endif
cdf_wake_lock_destroy(hdd_wlan_get_wake_lock_ptr());
pr_info("%s: driver unloaded\n", WLAN_MODULE_NAME);
pr_info("%s: Driver Removed\n", WLAN_MODULE_NAME);
}
/**
@ -214,29 +346,26 @@ static void wlan_hdd_shutdown(void)
{
void *hif_ctx = cds_get_context(CDF_MODULE_ID_HIF);
if (cds_is_load_unload_in_progress()) {
hddLog(LOGE,
FL("Load/unload in progress, ignore SSR shutdown"));
if (cds_is_load_or_unload_in_progress()) {
hdd_err("Load/unload in progress, ignore SSR shutdown");
return;
}
/* this is for cases, where shutdown invoked from CNSS */
cds_set_logp_in_progress(true);
cds_set_recovery_in_progress(true);
if (cds_get_conparam() != CDF_FTM_MODE &&
if (cds_get_conparam() != CDF_GLOBAL_FTM_MODE &&
!WLAN_IS_EPPING_ENABLED(cds_get_conparam()))
hif_pktlogmod_exit(hif_ctx);
if (!cds_is_ssr_ready(__func__))
hddLog(LOGE,
FL("Host is not ready for SSR, attempting anyway"));
if (!cds_wait_for_external_threads_completion(__func__))
hdd_err("Host is not ready for SSR, attempting anyway");
if (!WLAN_IS_EPPING_ENABLED(cds_get_conparam())) {
hif_disable_isr(hif_ctx);
hdd_wlan_shutdown();
}
hif_disable(hif_ctx, HIF_DISABLE_TYPE_SHUTDOWN);
hif_close(hif_ctx);
hdd_hif_close(hif_ctx);
}
/**
@ -268,7 +397,7 @@ void wlan_hdd_notify_handler(int state)
int ret = 0;
ret = hdd_wlan_notify_modem_power_state(state);
if (ret < 0)
hddLog(LOGE, FL("Fail to send notify"));
hdd_err("Fail to send notify");
}
}
@ -364,7 +493,7 @@ static int __wlan_hdd_bus_resume(void)
int status = wlan_hdd_validate_context(hdd_ctx);
if (0 != status) {
hddLog(LOGE, FL("HDD context is not valid"));
hdd_err("HDD context is not valid");
return status;
}
@ -400,6 +529,117 @@ static int wlan_hdd_bus_resume(void)
return ret;
}
#ifdef FEATURE_RUNTIME_PM
/**
* __wlan_hdd_runtime_suspend() - suspend the wlan bus without apps suspend
*
* Each layer is responsible for its own suspend actions. wma_runtime_suspend
* takes care of the parts of the 802.11 suspend that we want to do for runtime
* suspend.
*
* Return: 0 or errno
*/
static int __wlan_hdd_runtime_suspend(void)
{
void *hdd_ctx = cds_get_context(CDF_MODULE_ID_HDD);
int status = wlan_hdd_validate_context(hdd_ctx);
if (0 != status)
goto process_failure;
status = hif_pre_runtime_suspend();
if (status)
goto process_failure;
status = htc_runtime_suspend();
if (status)
goto process_failure;
status = wma_runtime_suspend();
if (status)
goto resume_htc;
status = hif_runtime_suspend();
if (status)
goto resume_wma;
status = cnss_auto_suspend();
if (status)
goto resume_hif;
hif_process_runtime_suspend_success();
return status;
resume_hif:
CDF_BUG(!hif_runtime_resume());
resume_wma:
CDF_BUG(!wma_runtime_resume());
resume_htc:
CDF_BUG(!htc_runtime_resume());
process_failure:
hif_process_runtime_suspend_failure();
return status;
}
/**
* wlan_hdd_runtime_suspend() - suspend the wlan bus without apps suspend
*
* This function is called by the platform driver to suspend the
* wlan bus separately from system suspend
*
* Return: 0 or errno
*/
static int wlan_hdd_runtime_suspend(void)
{
int ret;
cds_ssr_protect(__func__);
ret = __wlan_hdd_runtime_suspend();
cds_ssr_unprotect(__func__);
return ret;
}
/**
* __wlan_hdd_runtime_resume() - resume the wlan bus from runtime suspend
*
* Sets the runtime pm state and coordinates resume between hif wma and
* ol_txrx.
*
* Return: success since failure is a bug
*/
static int __wlan_hdd_runtime_resume(void)
{
hif_pre_runtime_resume();
CDF_BUG(!cnss_auto_resume());
CDF_BUG(!hif_runtime_resume());
CDF_BUG(!wma_runtime_resume());
CDF_BUG(!htc_runtime_resume());
hif_process_runtime_resume_success();
return 0;
}
/**
* wlan_hdd_runtime_resume() - resume the wlan bus from runtime suspend
*
* This function is called by the platform driver to resume the
* wlan bus separately from system suspend
*
* Return: success since failure is a bug
*/
static int wlan_hdd_runtime_resume(void)
{
int ret;
cds_ssr_protect(__func__);
ret = __wlan_hdd_runtime_resume();
cds_ssr_unprotect(__func__);
return ret;
}
#endif
#ifdef HIF_PCI
/**
* wlan_hdd_pci_probe() - probe callback for pci platform driver
@ -494,6 +734,32 @@ static int wlan_hdd_pci_resume(struct pci_dev *pdev)
{
return wlan_hdd_bus_resume();
}
#ifdef FEATURE_RUNTIME_PM
/**
* wlan_hdd_pci_runtime_suspend() - wlan_hdd_pci_suspend
* @pdev: pdev
* @state: state
*
* Return: success or errno
*/
static int wlan_hdd_pci_runtime_suspend(struct pci_dev *pdev)
{
return wlan_hdd_runtime_suspend();
}
/**
* wlan_hdd_pci_runtime_resume() - runtime resume callback to register with pci
* @pdev: pci device id
*
* Return: success or errno
*/
static int wlan_hdd_pci_runtime_resume(struct pci_dev *pdev)
{
return wlan_hdd_runtime_resume();
}
#endif
#else
/**
* wlan_hdd_snoc_probe() - wlan_hdd_snoc_probe
@ -585,6 +851,14 @@ static struct pci_device_id wlan_hdd_pci_id_table[] = {
};
#ifdef CONFIG_CNSS
#ifdef FEATURE_RUNTIME_PM
struct cnss_wlan_runtime_ops runtime_pm_ops = {
.runtime_suspend = wlan_hdd_pci_runtime_suspend,
.runtime_resume = wlan_hdd_pci_runtime_resume,
};
#endif
struct cnss_wlan_driver wlan_drv_ops = {
.name = "wlan_hdd_pci",
.id_table = wlan_hdd_pci_id_table,
@ -598,6 +872,9 @@ struct cnss_wlan_driver wlan_drv_ops = {
.suspend = wlan_hdd_pci_suspend,
.resume = wlan_hdd_pci_resume,
#endif /* ATH_BUS_PM */
#ifdef FEATURE_RUNTIME_PM
.runtime_ops = &runtime_pm_ops,
#endif
};
#else
MODULE_DEVICE_TABLE(pci, wlan_hdd_pci_id_table);
@ -610,6 +887,7 @@ struct pci_driver wlan_drv_ops = {
.suspend = wlan_hdd_pci_suspend,
.resume = wlan_hdd_pci_resume,
#endif /* ATH_BUS_PM */
};
#endif /* CONFIG_CNSS */
#else

View file

@ -501,6 +501,9 @@ fail:
* @ctx: Pointer to hdd context
* @pData: Pointer to ext scan result event
*
* This callback execute in atomic context and must not invoke any
* blocking calls.
*
* Return: none
*/
static void
@ -510,6 +513,7 @@ wlan_hdd_cfg80211_extscan_hotlist_match_ind(void *ctx,
hdd_context_t *pHddCtx = ctx;
struct sk_buff *skb = NULL;
uint32_t i, index;
int flags = cds_get_gfp_flags();
ENTER();
@ -529,7 +533,7 @@ wlan_hdd_cfg80211_extscan_hotlist_match_ind(void *ctx,
pHddCtx->wiphy,
NULL,
EXTSCAN_EVENT_BUF_SIZE + NLMSG_HDRLEN,
index, GFP_KERNEL);
index, flags);
if (!skb) {
hddLog(LOGE, FL("cfg80211_vendor_event_alloc failed"));
@ -618,7 +622,7 @@ wlan_hdd_cfg80211_extscan_hotlist_match_ind(void *ctx,
goto fail;
}
cfg80211_vendor_event(skb, GFP_KERNEL);
cfg80211_vendor_event(skb, flags);
EXIT();
return;
@ -633,6 +637,9 @@ fail:
* @ctx: Pointer to hdd context
* @pData: Pointer to signif wifi change event
*
* This callback execute in atomic context and must not invoke any
* blocking calls.
*
* Return: none
*/
static void
@ -645,6 +652,7 @@ wlan_hdd_cfg80211_extscan_signif_wifi_change_results_ind(
tSirWifiSignificantChange *ap_info;
int32_t *rssi;
uint32_t i, j;
int flags = cds_get_gfp_flags();
ENTER();
@ -660,7 +668,7 @@ wlan_hdd_cfg80211_extscan_signif_wifi_change_results_ind(
NULL,
EXTSCAN_EVENT_BUF_SIZE + NLMSG_HDRLEN,
QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_SIGNIFICANT_CHANGE_INDEX,
GFP_KERNEL);
flags);
if (!skb) {
hddLog(LOGE, FL("cfg80211_vendor_event_alloc failed"));
@ -738,7 +746,7 @@ wlan_hdd_cfg80211_extscan_signif_wifi_change_results_ind(
goto fail;
}
cfg80211_vendor_event(skb, GFP_KERNEL);
cfg80211_vendor_event(skb, flags);
return;
fail:
@ -752,6 +760,9 @@ fail:
* @ctx: Pointer to hdd context
* @pData: Pointer to full scan result event
*
* This callback execute in atomic context and must not invoke any
* blocking calls.
*
* Return: none
*/
static void
@ -764,6 +775,7 @@ wlan_hdd_cfg80211_extscan_full_scan_result_event(void *ctx,
#ifdef CONFIG_CNSS
struct timespec ts;
#endif
int flags = cds_get_gfp_flags();
ENTER();
@ -784,7 +796,7 @@ wlan_hdd_cfg80211_extscan_full_scan_result_event(void *ctx,
NULL,
EXTSCAN_EVENT_BUF_SIZE + NLMSG_HDRLEN,
QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_FULL_SCAN_RESULT_INDEX,
GFP_KERNEL);
flags);
if (!skb) {
hddLog(LOGE, FL("cfg80211_vendor_event_alloc failed"));
@ -867,7 +879,7 @@ wlan_hdd_cfg80211_extscan_full_scan_result_event(void *ctx,
goto nla_put_failure;
}
cfg80211_vendor_event(skb, GFP_KERNEL);
cfg80211_vendor_event(skb, flags);
EXIT();
return;
@ -881,6 +893,9 @@ nla_put_failure:
* @ctx: Pointer to hdd context
* @pData: Pointer to scan results available indication param
*
* This callback execute in atomic context and must not invoke any
* blocking calls.
*
* Return: none
*/
static void
@ -890,6 +905,7 @@ wlan_hdd_cfg80211_extscan_scan_res_available_event(
{
hdd_context_t *pHddCtx = (hdd_context_t *) ctx;
struct sk_buff *skb = NULL;
int flags = cds_get_gfp_flags();
ENTER();
@ -905,7 +921,7 @@ wlan_hdd_cfg80211_extscan_scan_res_available_event(
NULL,
EXTSCAN_EVENT_BUF_SIZE + NLMSG_HDRLEN,
QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_SCAN_RESULTS_AVAILABLE_INDEX,
GFP_KERNEL);
flags);
if (!skb) {
hddLog(LOGE, FL("cfg80211_vendor_event_alloc failed"));
@ -924,7 +940,7 @@ wlan_hdd_cfg80211_extscan_scan_res_available_event(
goto nla_put_failure;
}
cfg80211_vendor_event(skb, GFP_KERNEL);
cfg80211_vendor_event(skb, flags);
EXIT();
return;
@ -938,6 +954,9 @@ nla_put_failure:
* @ctx: Pointer to hdd context
* @pData: Pointer to scan event indication param
*
* This callback execute in atomic context and must not invoke any
* blocking calls.
*
* Return: none
*/
static void
@ -947,6 +966,7 @@ wlan_hdd_cfg80211_extscan_scan_progress_event(void *ctx,
{
hdd_context_t *pHddCtx = (hdd_context_t *) ctx;
struct sk_buff *skb = NULL;
int flags = cds_get_gfp_flags();
ENTER();
@ -962,7 +982,7 @@ wlan_hdd_cfg80211_extscan_scan_progress_event(void *ctx,
NULL,
EXTSCAN_EVENT_BUF_SIZE + NLMSG_HDRLEN,
QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_SCAN_EVENT_INDEX,
GFP_KERNEL);
flags);
if (!skb) {
hddLog(LOGE, FL("cfg80211_vendor_event_alloc failed"));
@ -983,7 +1003,7 @@ wlan_hdd_cfg80211_extscan_scan_progress_event(void *ctx,
goto nla_put_failure;
}
cfg80211_vendor_event(skb, GFP_KERNEL);
cfg80211_vendor_event(skb, flags);
EXIT();
return;
@ -999,6 +1019,8 @@ nla_put_failure:
*
* This function reads the matched network data and fills NL vendor attributes
* and send it to upper layer.
* This callback execute in atomic context and must not invoke any
* blocking calls.
*
* Return: 0 on success, error number otherwise
*/
@ -1009,6 +1031,7 @@ wlan_hdd_cfg80211_extscan_epno_match_found(void *ctx,
hdd_context_t *pHddCtx = (hdd_context_t *)ctx;
struct sk_buff *skb = NULL;
uint32_t len, i;
int flags = cds_get_gfp_flags();
ENTER();
@ -1037,7 +1060,7 @@ wlan_hdd_cfg80211_extscan_epno_match_found(void *ctx,
NULL,
EXTSCAN_EVENT_BUF_SIZE + NLMSG_HDRLEN,
QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_PNO_NETWORK_FOUND_INDEX,
GFP_KERNEL);
flags);
if (!skb) {
hddLog(LOGE, FL("cfg80211_vendor_event_alloc failed"));
@ -1095,7 +1118,7 @@ wlan_hdd_cfg80211_extscan_epno_match_found(void *ctx,
nla_nest_end(skb, nla_aps);
}
cfg80211_vendor_event(skb, GFP_KERNEL);
cfg80211_vendor_event(skb, flags);
return;
fail:
@ -1110,6 +1133,8 @@ fail:
*
* This function reads the match network %data and fill in the skb with
* NL attributes and send up the NL event
* This callback execute in atomic context and must not invoke any
* blocking calls.
*
* Return: none
*/
@ -1120,8 +1145,8 @@ wlan_hdd_cfg80211_passpoint_match_found(void *ctx,
hdd_context_t *pHddCtx = ctx;
struct sk_buff *skb = NULL;
uint32_t len, i, num_matches = 1, more_data = 0;
struct nlattr *nla_aps;
struct nlattr *nla_bss;
struct nlattr *nla_aps, *nla_bss;
int flags = cds_get_gfp_flags();
ENTER();
@ -1142,7 +1167,7 @@ wlan_hdd_cfg80211_passpoint_match_found(void *ctx,
NULL,
EXTSCAN_EVENT_BUF_SIZE + NLMSG_HDRLEN,
QCA_NL80211_VENDOR_SUBCMD_EXTSCAN_PNO_PASSPOINT_NETWORK_FOUND_INDEX,
GFP_KERNEL);
flags);
if (!skb) {
hddLog(LOGE, FL("cfg80211_vendor_event_alloc failed"));
@ -1225,7 +1250,7 @@ wlan_hdd_cfg80211_passpoint_match_found(void *ctx,
}
nla_nest_end(skb, nla_aps);
cfg80211_vendor_event(skb, GFP_KERNEL);
cfg80211_vendor_event(skb, flags);
return;
fail:
@ -1242,6 +1267,8 @@ fail:
* This function will take an SSID match event that was generated by
* firmware and will convert it into a cfg80211 vendor event which is
* sent to userspace.
* This callback execute in atomic context and must not invoke any
* blocking calls.
*
* Return: none
*/
@ -1252,6 +1279,7 @@ wlan_hdd_cfg80211_extscan_hotlist_ssid_match_ind(void *ctx,
hdd_context_t *hdd_ctx = ctx;
struct sk_buff *skb;
uint32_t i, index;
int flags = cds_get_gfp_flags();
ENTER();
@ -1273,8 +1301,7 @@ wlan_hdd_cfg80211_extscan_hotlist_ssid_match_ind(void *ctx,
skb = cfg80211_vendor_event_alloc(hdd_ctx->wiphy,
NULL,
EXTSCAN_EVENT_BUF_SIZE + NLMSG_HDRLEN,
index,
GFP_KERNEL);
index, flags);
if (!skb) {
hddLog(LOGE, FL("cfg80211_vendor_event_alloc failed"));
@ -1367,7 +1394,7 @@ wlan_hdd_cfg80211_extscan_hotlist_ssid_match_ind(void *ctx,
}
}
cfg80211_vendor_event(skb, GFP_KERNEL);
cfg80211_vendor_event(skb, flags);
return;
fail:
@ -1691,7 +1718,7 @@ static int __wlan_hdd_cfg80211_extscan_get_capabilities(struct wiphy *wiphy,
ENTER();
if (CDF_FTM_MODE == hdd_get_conparam()) {
if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
hdd_err("Command not allowed in FTM mode");
return -EPERM;
}
@ -1825,7 +1852,7 @@ static int __wlan_hdd_cfg80211_extscan_get_cached_results(struct wiphy *wiphy,
ENTER();
if (CDF_FTM_MODE == hdd_get_conparam()) {
if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
hdd_err("Command not allowed in FTM mode");
return -EPERM;
}
@ -1973,7 +2000,7 @@ __wlan_hdd_cfg80211_extscan_set_bssid_hotlist(struct wiphy *wiphy,
ENTER();
if (CDF_FTM_MODE == hdd_get_conparam()) {
if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
hdd_err("Command not allowed in FTM mode");
return -EPERM;
}
@ -2170,7 +2197,7 @@ __wlan_hdd_cfg80211_extscan_set_significant_change(struct wiphy *wiphy,
ENTER();
if (CDF_FTM_MODE == hdd_get_conparam()) {
if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
hdd_err("Command not allowed in FTM mode");
return -EPERM;
}
@ -2452,7 +2479,7 @@ __wlan_hdd_cfg80211_extscan_get_valid_channels(struct wiphy *wiphy,
ENTER();
if (CDF_FTM_MODE == hdd_get_conparam()) {
if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
hdd_err("Command not allowed in FTM mode");
return -EPERM;
}
@ -3117,7 +3144,7 @@ __wlan_hdd_cfg80211_extscan_start(struct wiphy *wiphy,
ENTER();
if (CDF_FTM_MODE == hdd_get_conparam()) {
if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
hdd_err("Command not allowed in FTM mode");
return -EPERM;
}
@ -3327,7 +3354,7 @@ __wlan_hdd_cfg80211_extscan_stop(struct wiphy *wiphy,
ENTER();
if (CDF_FTM_MODE == hdd_get_conparam()) {
if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
hdd_err("Command not allowed in FTM mode");
return -EPERM;
}
@ -3454,7 +3481,7 @@ __wlan_hdd_cfg80211_extscan_reset_bssid_hotlist(struct wiphy *wiphy,
ENTER();
if (CDF_FTM_MODE == hdd_get_conparam()) {
if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
hdd_err("Command not allowed in FTM mode");
return -EPERM;
}
@ -3579,7 +3606,7 @@ __wlan_hdd_cfg80211_extscan_reset_significant_change(struct wiphy
ENTER();
if (CDF_FTM_MODE == hdd_get_conparam()) {
if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
hdd_err("Command not allowed in FTM mode");
return -EPERM;
}
@ -3795,7 +3822,7 @@ static int __wlan_hdd_cfg80211_set_epno_list(struct wiphy *wiphy,
if (ret_val)
return ret_val;
if (CDF_FTM_MODE == hdd_get_conparam()) {
if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
hdd_err("Command not allowed in FTM mode");
return -EPERM;
}
@ -4001,7 +4028,7 @@ static int __wlan_hdd_cfg80211_set_passpoint_list(struct wiphy *wiphy,
if (ret)
return ret;
if (CDF_FTM_MODE == hdd_get_conparam()) {
if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
hdd_err("Command not allowed in FTM mode");
return -EPERM;
}
@ -4117,7 +4144,7 @@ static int __wlan_hdd_cfg80211_reset_passpoint_list(struct wiphy *wiphy,
if (ret)
return ret;
if (CDF_FTM_MODE == hdd_get_conparam()) {
if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
hdd_err("Command not allowed in FTM mode");
return -EPERM;
}
@ -4243,7 +4270,7 @@ __wlan_hdd_cfg80211_extscan_set_ssid_hotlist(struct wiphy *wiphy,
ENTER();
if (CDF_FTM_MODE == hdd_get_conparam()) {
if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
hdd_err("Command not allowed in FTM mode");
return -EPERM;
}
@ -4463,7 +4490,7 @@ __wlan_hdd_cfg80211_extscan_reset_ssid_hotlist(struct wiphy *wiphy,
ENTER();
if (CDF_FTM_MODE == hdd_get_conparam()) {
if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
hdd_err("Command not allowed in FTM mode");
return -EPERM;
}

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2012-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -659,7 +659,7 @@ int wlan_hdd_ftm_close(hdd_context_t *hdd_ctx)
wlan_ftm_stop(hdd_ctx);
}
hdd_close_all_adapters(hdd_ctx);
hdd_close_all_adapters(hdd_ctx, false);
cdf_status = cds_sched_close(cds_context);
if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2014-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2014-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -26,6 +26,9 @@
*
*/
/* denote that this file does not allow legacy hddLog */
#define HDD_DISALLOW_LEGACY_HDDLOG 1
/* Include Files */
#include <wlan_hdd_main.h>
#include <wlan_hdd_misc.h>
@ -77,6 +80,7 @@ enum hdd_green_ap_event {
* @ps_state: Current state
* @ps_event: Event to trigger when timer expires
* @ps_timer: Event timer
* @egap_support: Enhanced Green AP support flag
*/
struct hdd_green_ap_ctx {
uint8_t ps_enable;
@ -88,6 +92,8 @@ struct hdd_green_ap_ctx {
enum hdd_green_ap_event ps_event;
cdf_mc_timer_t ps_timer;
bool egap_support;
};
/**
@ -120,7 +126,7 @@ static int hdd_wlan_green_ap_enable(hdd_adapter_t *adapter,
{
int ret;
hddLog(LOG1, FL("Set Green-AP val: %d"), enable);
hdd_notice("Set Green-AP val: %d", enable);
ret = wma_cli_set_command(adapter->sessionId,
WMI_PDEV_GREEN_AP_PS_ENABLE_CMDID,
@ -146,8 +152,8 @@ static void hdd_wlan_green_ap_mc(struct hdd_context_s *hdd_ctx,
if (green_ap == NULL)
return;
hddLog(LOG1, FL("Green-AP event: %d, state: %d, num_nodes: %d"),
event, green_ap->ps_state, green_ap->num_nodes);
hdd_notice("Green-AP event: %d, state: %d, num_nodes: %d",
event, green_ap->ps_state, green_ap->num_nodes);
/* handle the green ap ps event */
switch (event) {
@ -174,13 +180,13 @@ static void hdd_wlan_green_ap_mc(struct hdd_context_s *hdd_ctx,
break;
default:
hddLog(LOGE, FL("invalid event %d"), event);
hdd_err("invalid event %d", event);
break;
}
/* Confirm that power save is enabled before doing state transitions */
if (!green_ap->ps_enable) {
hddLog(CDF_TRACE_LEVEL_INFO, FL("Green-AP is disabled"));
hdd_notice("Green-AP is disabled");
hdd_wlan_green_ap_update(hdd_ctx,
GREEN_AP_PS_IDLE_STATE,
GREEN_AP_PS_WAIT_EVENT);
@ -189,7 +195,7 @@ static void hdd_wlan_green_ap_mc(struct hdd_context_s *hdd_ctx,
adapter = hdd_get_adapter(hdd_ctx, WLAN_HDD_SOFTAP);
if (adapter == NULL) {
hddLog(LOGE, FL("Green-AP no SAP adapter"));
hdd_err("Green-AP no SAP adapter");
goto done;
}
@ -236,7 +242,7 @@ static void hdd_wlan_green_ap_mc(struct hdd_context_s *hdd_ctx,
case GREEN_AP_PS_ON_STATE:
if (green_ap->num_nodes) {
if (hdd_wlan_green_ap_enable(adapter, 0)) {
hddLog(LOGE, FL("FAILED TO SET GREEN-AP mode"));
hdd_err("FAILED TO SET GREEN-AP mode");
goto done;
}
hdd_wlan_green_ap_update(hdd_ctx,
@ -251,7 +257,7 @@ static void hdd_wlan_green_ap_mc(struct hdd_context_s *hdd_ctx,
GREEN_AP_PS_ON_EVENT);
if (hdd_wlan_green_ap_enable(adapter, 0)) {
hddLog(LOGE, FL("FAILED TO SET GREEN-AP mode"));
hdd_err("FAILED TO SET GREEN-AP mode");
goto done;
}
@ -261,7 +267,7 @@ static void hdd_wlan_green_ap_mc(struct hdd_context_s *hdd_ctx,
break;
default:
hddLog(LOGE, FL("invalid state %d"), green_ap->ps_state);
hdd_err("invalid state %d", green_ap->ps_state);
hdd_wlan_green_ap_update(hdd_ctx, GREEN_AP_PS_OFF_STATE,
GREEN_AP_PS_WAIT_EVENT);
break;
@ -283,7 +289,7 @@ static void hdd_wlan_green_ap_timer_fn(void *ctx)
struct hdd_green_ap_ctx *green_ap;
if (0 != wlan_hdd_validate_context(hdd_ctx)) {
hddLog(CDF_TRACE_LEVEL_ERROR, FL("HDD context is not valid"));
hdd_err("HDD context is not valid");
return;
}
@ -307,7 +313,7 @@ static CDF_STATUS hdd_wlan_green_ap_attach(struct hdd_context_s *hdd_ctx)
green_ap = cdf_mem_malloc(sizeof(*green_ap));
if (!green_ap) {
hddLog(LOGP, FL("Memory allocation for Green-AP failed!"));
hdd_alert("Memory allocation for Green-AP failed!");
status = CDF_STATUS_E_NOMEM;
goto error;
}
@ -344,7 +350,7 @@ static CDF_STATUS hdd_wlan_green_ap_deattach(struct hdd_context_s *hdd_ctx)
ENTER();
if (green_ap == NULL) {
hddLog(LOG1, FL("Green-AP is not enabled"));
hdd_notice("Green-AP is not enabled");
status = CDF_STATUS_E_NOSUPPORT;
goto done;
}
@ -356,7 +362,7 @@ static CDF_STATUS hdd_wlan_green_ap_deattach(struct hdd_context_s *hdd_ctx)
/* Destroy the Green AP timer */
if (!CDF_IS_STATUS_SUCCESS(cdf_mc_timer_destroy(&green_ap->ps_timer)))
hddLog(LOG1, FL("Cannot deallocate Green-AP's timer"));
hdd_notice("Cannot deallocate Green-AP's timer");
/* release memory */
cdf_mem_zero(green_ap, sizeof(*green_ap));
@ -378,7 +384,7 @@ done:
void hdd_wlan_green_ap_init(struct hdd_context_s *hdd_ctx)
{
if (!CDF_IS_STATUS_SUCCESS(hdd_wlan_green_ap_attach(hdd_ctx)))
hddLog(LOGE, FL("Failed to allocate Green-AP resource"));
hdd_err("Failed to allocate Green-AP resource");
}
/**
@ -390,7 +396,7 @@ void hdd_wlan_green_ap_init(struct hdd_context_s *hdd_ctx)
void hdd_wlan_green_ap_deinit(struct hdd_context_s *hdd_ctx)
{
if (!CDF_IS_STATUS_SUCCESS(hdd_wlan_green_ap_deattach(hdd_ctx)))
hddLog(LOGE, FL("Cannot deallocate Green-AP resource"));
hdd_err("Cannot deallocate Green-AP resource");
}
/**
@ -403,16 +409,38 @@ void hdd_wlan_green_ap_start_bss(struct hdd_context_s *hdd_ctx)
{
struct hdd_config *cfg = hdd_ctx->config;
/* check if the firmware and ini are both enabled the egap,
* and also the feature_flag enable, then we enable the egap
*/
if (hdd_ctx->green_ap_ctx->egap_support && cfg->enable_egap &&
cfg->egap_feature_flag) {
hdd_notice("Set EGAP - enabled: %d, flag: %x, inact_time: %d, wait_time: %d",
cfg->enable_egap, cfg->egap_feature_flag,
cfg->egap_inact_time, cfg->egap_wait_time);
if (!sme_send_egap_conf_params(cfg->enable_egap,
cfg->egap_inact_time,
cfg->egap_wait_time,
cfg->egap_feature_flag)) {
/* EGAP is enabled, disable host GAP */
hdd_wlan_green_ap_mc(hdd_ctx, GREEN_AP_PS_STOP_EVENT);
goto exit;
}
/* fall through, if send_egap_conf_params() failed,
* then check host GAP and enable it accordingly
*/
}
if (!(CDF_STA_MASK & hdd_ctx->concurrency_mode) &&
cfg->enable2x2 && cfg->enableGreenAP) {
hdd_wlan_green_ap_mc(hdd_ctx, GREEN_AP_PS_START_EVENT);
} else {
hdd_wlan_green_ap_mc(hdd_ctx, GREEN_AP_PS_STOP_EVENT);
hddLog(LOG1,
"Green-AP: is disabled, due to sta_concurrency: %d, enable2x2: %d, enableGreenAP: %d",
CDF_STA_MASK & hdd_ctx->concurrency_mode,
cfg->enable2x2, cfg->enableGreenAP);
hdd_notice("Green-AP: is disabled, due to sta_concurrency: %d, enable2x2: %d, enableGreenAP: %d",
CDF_STA_MASK & hdd_ctx->concurrency_mode,
cfg->enable2x2, cfg->enableGreenAP);
}
exit:
return;
}
/**
@ -447,3 +475,18 @@ void hdd_wlan_green_ap_del_sta(struct hdd_context_s *hdd_ctx)
{
hdd_wlan_green_ap_mc(hdd_ctx, GREEN_AP_DEL_STA_EVENT);
}
/**
* hdd_wlan_set_egap_support() - helper function to set egap support flag
* @hdd_ctx: pointer to hdd context
* @param: pointer to target configuration
*
* Return: None
*/
void hdd_wlan_set_egap_support(hdd_context_t *hdd_ctx, void *param)
{
struct wma_tgt_cfg *cfg = (struct wma_tgt_cfg *) param;
if (hdd_ctx && cfg)
hdd_ctx->green_ap_ctx->egap_support = cfg->egap_support;
}

View file

@ -43,6 +43,7 @@ void hdd_wlan_green_ap_start_bss(struct hdd_context_s *hdd_ctx);
void hdd_wlan_green_ap_stop_bss(struct hdd_context_s *hdd_ctx);
void hdd_wlan_green_ap_add_sta(struct hdd_context_s *hdd_ctx);
void hdd_wlan_green_ap_del_sta(struct hdd_context_s *hdd_ctx);
void hdd_wlan_set_egap_support(struct hdd_context_s *hdd_ctx, void *param);
#else
static inline void hdd_wlan_green_ap_init(struct hdd_context_s *hdd_ctx) {}
static inline void hdd_wlan_green_ap_deinit(struct hdd_context_s *hdd_ctx) {}
@ -50,5 +51,8 @@ static inline void hdd_wlan_green_ap_start_bss(struct hdd_context_s *hdd_ctx) {}
static inline void hdd_wlan_green_ap_stop_bss(struct hdd_context_s *hdd_ctx) {}
static inline void hdd_wlan_green_ap_add_sta(struct hdd_context_s *hdd_ctx) {}
static inline void hdd_wlan_green_ap_del_sta(struct hdd_context_s *hdd_ctx) {}
static inline void hdd_wlan_set_egap_support(struct hdd_context_s *hdd_ctx,
void *param) {}
#endif /* FEATURE_GREEN_AP */
#endif /* __WLAN_HDD_GREEN_AP_H */

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2012-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -222,12 +222,12 @@ static int __hdd_hostapd_open(struct net_device *dev)
MTRACE(cdf_trace(CDF_MODULE_ID_HDD,
TRACE_CODE_HDD_HOSTAPD_OPEN_REQUEST, NO_SESSION, 0));
if (WLAN_HDD_GET_CTX(pAdapter)->isLoadInProgress ||
WLAN_HDD_GET_CTX(pAdapter)->isUnloadInProgress) {
hddLog(LOGE,
FL("Driver load/unload in progress, ignore adapter open"));
if (cds_is_load_or_unload_in_progress()) {
hdd_err("Driver load/unload in progress, ignore, state: 0x%x",
cds_get_driver_state());
goto done;
}
/* Enable all Tx queues */
hddLog(LOG1, FL("Enabling queues"));
wlan_hdd_netif_queue_control(pAdapter,
@ -556,8 +556,7 @@ static int hdd_stop_bss_link(hdd_adapter_t *pHostapdAdapter,
hddLog(LOGE, FL("Deleting SAP/P2P link!!!!!!"));
clear_bit(SOFTAP_BSS_STARTED, &pHostapdAdapter->event_flags);
cds_decr_session_set_pcl(pHddCtx,
pHostapdAdapter->device_mode,
cds_decr_session_set_pcl(pHostapdAdapter->device_mode,
pHostapdAdapter->sessionId);
}
EXIT();
@ -589,7 +588,7 @@ static void hdd_issue_stored_joinreq(hdd_adapter_t *sta_adapter,
}
hal_handle = WLAN_HDD_GET_HAL_CTX(sta_adapter);
if (true == cds_is_sta_connection_pending(hdd_ctx)) {
if (true == cds_is_sta_connection_pending()) {
MTRACE(cdf_trace(CDF_MODULE_ID_HDD,
TRACE_CODE_HDD_ISSUE_JOIN_REQ,
sta_adapter->sessionId, roam_id));
@ -601,10 +600,96 @@ static void hdd_issue_stored_joinreq(hdd_adapter_t *sta_adapter,
hdd_conn_set_connection_state(sta_adapter,
eConnectionState_NotConnected);
}
cds_change_sta_conn_pending_status(hdd_ctx, false);
cds_change_sta_conn_pending_status(false);
}
}
#ifdef WLAN_FEATURE_MBSSID
static eCsrPhyMode
hdd_sap_get_phymode(hdd_adapter_t *hostapd_adapter)
{
return wlansap_get_phymode(WLAN_HDD_GET_SAP_CTX_PTR(hostapd_adapter));
}
#else
static eCsrPhyMode
hdd_sap_get_phymode(hdd_adapter_t *hostapd_adapter)
{
return wlansap_get_phymode(
(WLAN_HDD_GET_CTX(hostapd_adapter))->pcds_context);
}
#endif
/**
* hdd_update_chandef() - Function to update channel width and center freq
* @hostapd_adapter: hostapd adapter
* @chandef: cfg80211 chan def
* @cb_mode: chan offset
*
* This function will be called to update channel width and center freq
*
* Return: None
*/
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)) || defined(WITH_BACKPORTS)
static inline void
hdd_update_chandef(hdd_adapter_t *hostapd_adapter,
struct cfg80211_chan_def *chandef,
ePhyChanBondState cb_mode)
{
uint16_t ch_width;
hdd_ap_ctx_t *phdd_ap_ctx;
uint8_t center_chan, chan;
phdd_ap_ctx = WLAN_HDD_GET_AP_CTX_PTR(hostapd_adapter);
ch_width = phdd_ap_ctx->sapConfig.acs_cfg.ch_width;
switch (ch_width) {
case eHT_CHANNEL_WIDTH_20MHZ:
case eHT_CHANNEL_WIDTH_40MHZ:
hdd_info("ch_width %d, won't update", ch_width);
break;
case eHT_CHANNEL_WIDTH_80MHZ:
chan = cds_freq_to_chan(chandef->chan->center_freq);
chandef->width = NL80211_CHAN_WIDTH_80;
switch (cb_mode) {
case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED:
case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
center_chan = chan + 2;
break;
case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
center_chan = chan + 6;
break;
case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED:
center_chan = chan - 2;
break;
case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
center_chan = chan - 6;
break;
default:
center_chan = chan;
break;
}
chandef->center_freq1 = cds_chan_to_freq(center_chan);
break;
case eHT_CHANNEL_WIDTH_160MHZ:
default:
/* Todo, please add related codes if support 160MHZ or others */
hdd_err("unsupport ch_width %d", ch_width);
break;
}
}
#else
static inline void
hdd_update_chandef(hdd_adapter_t *hostapd_adapter,
struct cfg80211_chan_def *chandef,
ePhyChanBondState cb_mode)
{
}
#endif
/**
* hdd_chan_change_notify() - Function to notify hostapd about channel change
* @hostapd_adapter hostapd adapter
@ -642,7 +727,7 @@ CDF_STATUS hdd_chan_change_notify(hdd_adapter_t *hostapd_adapter,
return CDF_STATUS_E_FAILURE;
}
phy_mode = sme_get_phy_mode(hal);
phy_mode = hdd_sap_get_phymode(hostapd_adapter);
if (oper_chan <= 14)
cb_mode = sme_get_cb_phy_state_from_cb_ini_value(
@ -670,8 +755,15 @@ CDF_STATUS hdd_chan_change_notify(hdd_adapter_t *hostapd_adapter,
break;
}
hdd_info("%s: phy_mode %d cb_mode %d chann_type %d oper_chan %d",
__func__, phy_mode, cb_mode, channel_type, oper_chan);
cfg80211_chandef_create(&chandef, chan, channel_type);
if ((phy_mode == eCSR_DOT11_MODE_11ac) ||
(phy_mode == eCSR_DOT11_MODE_11ac_ONLY))
hdd_update_chandef(hostapd_adapter, &chandef, cb_mode);
cfg80211_ch_switch_notify(dev, &chandef);
return CDF_STATUS_SUCCESS;
@ -999,7 +1091,7 @@ CDF_STATUS hdd_hostapd_sap_event_cb(tpSap_Event pSapEvent,
wrqu.data.length = strlen(startBssEvent);
we_event = IWEVCUSTOM;
we_custom_event_generic = we_custom_start_event;
cds_dump_concurrency_info(pHddCtx);
cds_dump_concurrency_info();
/* Send SCC/MCC Switching event to IPA */
hdd_ipa_send_mcc_scc_msg(pHddCtx, pHddCtx->mcc_mode);
break; /* Event will be sent after Switch-Case stmt */
@ -1309,9 +1401,7 @@ CDF_STATUS hdd_hostapd_sap_event_cb(tpSap_Event pSapEvent,
(const u8 *)&pSapEvent->sapevt.
sapStationAssocReassocCompleteEvent.ies[0];
staInfo.assoc_req_ies_len = iesLen;
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 31))
staInfo.filled |= STATION_INFO_ASSOC_REQ_IES;
#endif
cfg80211_new_sta(dev,
(const u8 *)&pSapEvent->sapevt.
sapStationAssocReassocCompleteEvent.
@ -1487,13 +1577,12 @@ CDF_STATUS hdd_hostapd_sap_event_cb(tpSap_Event pSapEvent,
WPSPBCProbeReq.probeReqIE,
pHddApCtx->WPSPBCProbeReq.probeReqIELen);
cdf_mem_copy(pHddApCtx->WPSPBCProbeReq.peerMacAddr,
pSapEvent->sapevt.sapPBCProbeReqEvent.
WPSPBCProbeReq.peerMacAddr,
CDF_MAC_ADDR_SIZE);
cdf_copy_macaddr(&pHddApCtx->WPSPBCProbeReq.peer_macaddr,
&pSapEvent->sapevt.sapPBCProbeReqEvent.
WPSPBCProbeReq.peer_macaddr);
hddLog(LOG1, "WPS PBC probe req " MAC_ADDRESS_STR,
MAC_ADDR_ARRAY(pHddApCtx->WPSPBCProbeReq.
peerMacAddr));
peer_macaddr.bytes));
memset(&wreq, 0, sizeof(wreq));
wreq.data.length = strlen(message); /* This is length of message */
wireless_send_event(dev, IWEVCUSTOM, &wreq,
@ -1522,17 +1611,6 @@ CDF_STATUS hdd_hostapd_sap_event_cb(tpSap_Event pSapEvent,
cdf_mem_free(pSapEvent->sapevt.sapAssocStaListEvent.pAssocStas); /* Release caller allocated memory here */
pSapEvent->sapevt.sapAssocStaListEvent.pAssocStas = NULL;
return CDF_STATUS_SUCCESS;
case eSAP_INDICATE_MGMT_FRAME:
hdd_indicate_mgmt_frame(pHostapdAdapter,
pSapEvent->sapevt.sapManagementFrameInfo.
nFrameLength,
pSapEvent->sapevt.sapManagementFrameInfo.
pbFrames,
pSapEvent->sapevt.sapManagementFrameInfo.
frameType,
pSapEvent->sapevt.sapManagementFrameInfo.
rxChan, 0);
return CDF_STATUS_SUCCESS;
case eSAP_REMAIN_CHAN_READY:
hdd_remain_chan_ready_handler(pHostapdAdapter,
pSapEvent->sapevt.sap_roc_ind.scan_id);
@ -1716,7 +1794,8 @@ CDF_STATUS hdd_hostapd_sap_event_cb(tpSap_Event pSapEvent,
FL("Channel change indication from peer for channel %d"),
pSapEvent->sapevt.sap_chan_cng_ind.new_chan);
if (hdd_softap_set_channel_change(dev,
pSapEvent->sapevt.sap_chan_cng_ind.new_chan))
pSapEvent->sapevt.sap_chan_cng_ind.new_chan,
CH_WIDTH_MAX))
return CDF_STATUS_E_FAILURE;
else
return CDF_STATUS_SUCCESS;
@ -1795,7 +1874,7 @@ stopbss:
we_custom_event_generic = we_custom_event;
wireless_send_event(dev, we_event, &wrqu,
(char *)we_custom_event_generic);
cds_dump_concurrency_info(pHddCtx);
cds_dump_concurrency_info();
/* Send SCC/MCC Switching event to IPA */
hdd_ipa_send_mcc_scc_msg(pHddCtx, pHddCtx->mcc_mode);
}
@ -1908,10 +1987,13 @@ int hdd_softap_unpack_ie(tHalHandle halHandle,
*
* @dev: pointer to the net device.
* @target_channel: target channel number.
* @target_bw: Target bandwidth to move.
* If no bandwidth is specified, the value is CH_WIDTH_MAX
*
* Return: 0 for success, non zero for failure
*/
int hdd_softap_set_channel_change(struct net_device *dev, int target_channel)
int hdd_softap_set_channel_change(struct net_device *dev, int target_channel,
phy_ch_width target_bw)
{
CDF_STATUS status;
int ret = 0;
@ -1932,6 +2014,13 @@ int hdd_softap_set_channel_change(struct net_device *dev, int target_channel)
return ret;
}
ret = hdd_validate_channel_and_bandwidth(pHostapdAdapter,
target_channel, target_bw);
if (ret) {
hdd_err("Invalid CH and BW combo");
return ret;
}
sta_adapter = hdd_get_adapter(pHddCtx, WLAN_HDD_INFRA_STATION);
/*
* conc_custom_rule1:
@ -1975,12 +2064,13 @@ int hdd_softap_set_channel_change(struct net_device *dev, int target_channel)
p_cds_context,
#endif
(uint32_t)
target_channel);
target_channel,
target_bw);
if (CDF_STATUS_SUCCESS != status) {
hddLog(LOGE,
FL("SAP set channel failed for channel = %d"),
target_channel);
FL("SAP set channel failed for channel = %d, bw:%d"),
target_channel, target_bw);
/*
* If channel change command fails then clear the
* radar found flag and also restart the netif
@ -2302,7 +2392,8 @@ static __iw_softap_setparam(struct net_device *dev,
hddLog(LOG1,
"SET Channel Change to new channel= %d",
set_value);
ret = hdd_softap_set_channel_change(dev, set_value);
ret = hdd_softap_set_channel_change(dev, set_value,
CH_WIDTH_MAX);
} else {
hddLog(LOGE,
FL("Channel Change Failed, Device in test mode"));
@ -3631,10 +3722,10 @@ static int __iw_softap_get_channel_list(struct net_device *dev,
curBand, bandStartChannel, bandEndChannel);
for (i = bandStartChannel; i <= bandEndChannel; i++) {
if ((CHANNEL_STATE_ENABLE == reg_channels[i].enabled) ||
(CHANNEL_STATE_DFS == reg_channels[i].enabled)) {
if ((CHANNEL_STATE_ENABLE == CDS_CHANNEL_STATE(i)) ||
(CHANNEL_STATE_DFS == CDS_CHANNEL_STATE(i))) {
channel_list->channels[num_channels] =
rf_channels[i].channelNum;
CDS_CHANNEL_NUM(i);
num_channels++;
}
}
@ -3766,9 +3857,8 @@ int __iw_get_wpspbc_probe_req_ies(struct net_device *dev,
cdf_mem_copy(&WPSPBCProbeReqIEs.probeReqIE,
pHddApCtx->WPSPBCProbeReq.probeReqIE,
WPSPBCProbeReqIEs.probeReqIELen);
cdf_mem_copy(&WPSPBCProbeReqIEs.macaddr,
pHddApCtx->WPSPBCProbeReq.peerMacAddr,
CDF_MAC_ADDR_SIZE);
cdf_copy_macaddr(&WPSPBCProbeReqIEs.macaddr,
&pHddApCtx->WPSPBCProbeReq.peer_macaddr);
if (copy_to_user(wrqu->data.pointer,
(void *)&WPSPBCProbeReqIEs,
sizeof(WPSPBCProbeReqIEs))) {
@ -3776,8 +3866,8 @@ int __iw_get_wpspbc_probe_req_ies(struct net_device *dev,
return -EFAULT;
}
wrqu->data.length = 12 + WPSPBCProbeReqIEs.probeReqIELen;
hddLog(LOG1, FL("Macaddress : " MAC_ADDRESS_STR),
MAC_ADDR_ARRAY(WPSPBCProbeReqIEs.macaddr));
hdd_info("Macaddress : " MAC_ADDRESS_STR,
MAC_ADDR_ARRAY(WPSPBCProbeReqIEs.macaddr.bytes));
up(&pHddApCtx->semWpsPBCOverlapInd);
EXIT();
return 0;
@ -4980,8 +5070,7 @@ __iw_softap_stopbss(struct net_device *dev,
}
}
clear_bit(SOFTAP_BSS_STARTED, &pHostapdAdapter->event_flags);
cds_decr_session_set_pcl(hdd_ctx,
pHostapdAdapter->device_mode,
cds_decr_session_set_pcl(pHostapdAdapter->device_mode,
pHostapdAdapter->sessionId);
}
EXIT();
@ -6386,10 +6475,6 @@ static int wlan_hdd_set_channel(struct wiphy *wiphy,
smeConfig.csrConfig.
channelBondingMode5GHz =
eCSR_INI_SINGLE_CHANNEL_CENTERED;
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0))
sap_config->ch_width_orig =
eHT_CHANNEL_WIDTH_20MHZ;
#endif
sap_config->sec_ch = 0;
break;
@ -6639,19 +6724,6 @@ static void wlan_hdd_add_extra_ie(hdd_adapter_t *pHostapdAdapter,
return;
}
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 4, 0))
/**
* wlan_hdd_cfg80211_alloc_new_beacon() - alloc beacon in ap mode
* @pAdapter: Pointer to hostapd adapter
* @ppBeacon: Pointer to pointer to beacon data
* @params: Pointer to beacon parameters
*
* Return: 0 for success non-zero for failure
*/
int wlan_hdd_cfg80211_alloc_new_beacon(hdd_adapter_t *pAdapter,
beacon_data_t **ppBeacon,
struct beacon_parameters *params)
#else
/**
* wlan_hdd_cfg80211_alloc_new_beacon() - alloc beacon in ap mode
* @pAdapter: Pointer to hostapd adapter
@ -6665,7 +6737,6 @@ int wlan_hdd_cfg80211_alloc_new_beacon(hdd_adapter_t *pAdapter,
beacon_data_t **ppBeacon,
struct cfg80211_beacon_data *params,
int dtim_period)
#endif
{
int size;
beacon_data_t *beacon = NULL;
@ -6729,17 +6800,10 @@ int wlan_hdd_cfg80211_alloc_new_beacon(hdd_adapter_t *pAdapter,
FL("Mem allocation for beacon failed"));
return -ENOMEM;
}
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 4, 0))
if (params->dtim_period)
beacon->dtim_period = params->dtim_period;
else if (old)
beacon->dtim_period = old->dtim_period;
#else
if (dtim_period)
beacon->dtim_period = dtim_period;
else if (old)
beacon->dtim_period = old->dtim_period;
#endif
/* -----------------------------------------------
* | head | tail | proberesp_ies | assocresp_ies |
* -----------------------------------------------
@ -7225,17 +7289,6 @@ setup_acs_overrides:
return 0;
}
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 4, 0))
/**
* wlan_hdd_cfg80211_start_bss() - start bss
* @pHostapdAdapter: Pointer to hostapd adapter
* @params: Pointer to start bss beacon parameters
*
* Return: 0 for success non-zero for failure
*/
static int wlan_hdd_cfg80211_start_bss(hdd_adapter_t *pHostapdAdapter,
struct beacon_parameters *params)
#else
/**
* wlan_hdd_cfg80211_start_bss() - start bss
* @pHostapdAdapter: Pointer to hostapd adapter
@ -7250,7 +7303,6 @@ static int wlan_hdd_cfg80211_start_bss(hdd_adapter_t *pHostapdAdapter,
struct cfg80211_beacon_data *params,
const u8 *ssid, size_t ssid_len,
enum nl80211_hidden_ssid hidden_ssid)
#endif
{
tsap_Config_t *pConfig;
beacon_data_t *pBeacon = NULL;
@ -7278,7 +7330,7 @@ static int wlan_hdd_cfg80211_start_bss(hdd_adapter_t *pHostapdAdapter,
uint16_t prev_rsn_length = 0;
ENTER();
if (cds_is_connection_in_progress(pHddCtx)) {
if (cds_is_connection_in_progress()) {
hdd_err("Can't start BSS: connection is in progress");
return -EINVAL;
}
@ -7509,33 +7561,6 @@ static int wlan_hdd_cfg80211_start_bss(hdd_adapter_t *pHostapdAdapter,
pConfig->SSIDinfo.ssidHidden = false;
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 4, 0))
if (params->ssid != NULL) {
cdf_mem_copy(pConfig->SSIDinfo.ssid.ssId, params->ssid,
params->ssid_len);
pConfig->SSIDinfo.ssid.length = params->ssid_len;
switch (params->hidden_ssid) {
case NL80211_HIDDEN_SSID_NOT_IN_USE:
hddLog(LOG1, "HIDDEN_SSID_NOT_IN_USE");
pConfig->SSIDinfo.ssidHidden = eHIDDEN_SSID_NOT_IN_USE;
break;
case NL80211_HIDDEN_SSID_ZERO_LEN:
hddLog(LOG1, "HIDDEN_SSID_ZERO_LEN");
pConfig->SSIDinfo.ssidHidden = eHIDDEN_SSID_ZERO_LEN;
break;
case NL80211_HIDDEN_SSID_ZERO_CONTENTS:
hddLog(LOG1, "HIDDEN_SSID_ZERO_CONTENTS");
pConfig->SSIDinfo.ssidHidden =
eHIDDEN_SSID_ZERO_CONTENTS;
break;
default:
hddLog(LOGE, "Wrong hidden_ssid param %d",
params->hidden_ssid);
break;
}
}
#else
if (ssid != NULL) {
cdf_mem_copy(pConfig->SSIDinfo.ssid.ssId, ssid, ssid_len);
pConfig->SSIDinfo.ssid.length = ssid_len;
@ -7559,7 +7584,6 @@ static int wlan_hdd_cfg80211_start_bss(hdd_adapter_t *pHostapdAdapter,
break;
}
}
#endif
cdf_mem_copy(pConfig->self_macaddr.bytes,
pHostapdAdapter->macAddressCurrent.bytes,
@ -7655,16 +7679,6 @@ static int wlan_hdd_cfg80211_start_bss(hdd_adapter_t *pHostapdAdapter,
sme_config.csrConfig.WMMSupportMode = eCsrRoamWmmNoQos;
sme_update_config(pHddCtx->hHal, &sme_config);
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0))
/* Linux kernel < 3.8 does not support ch width param. So for
* 11AC get from ch width from ini file only if ht40 is enabled
* VHT80 depends on HT40 config.
*/
if (pConfig->SapHw_mode == eCSR_DOT11_MODE_11ac)
if (pConfig->ch_width_orig == NL80211_CHAN_WIDTH_40)
pConfig->ch_width_orig = iniConfig->vhtChannelWidth;
#endif
if (pConfig->ch_width_orig == NL80211_CHAN_WIDTH_80P80) {
if (pHddCtx->isVHT80Allowed == false)
pConfig->ch_width_orig = CH_WIDTH_40MHZ;
@ -7740,7 +7754,7 @@ static int wlan_hdd_cfg80211_start_bss(hdd_adapter_t *pHostapdAdapter,
return 0;
}
if (!cds_allow_concurrency(pHddCtx,
if (!cds_allow_concurrency(
cds_convert_device_mode_to_hdd_type(
pHostapdAdapter->device_mode),
pConfig->channel, HW_MODE_20_MHZ)) {
@ -7749,7 +7763,7 @@ static int wlan_hdd_cfg80211_start_bss(hdd_adapter_t *pHostapdAdapter,
return -EINVAL;
}
if (!cds_set_connection_in_progress(pHddCtx, true)) {
if (!cds_set_connection_in_progress(true)) {
hdd_err("Can't start BSS: set connnection in progress failed");
return -EINVAL;
}
@ -7772,7 +7786,7 @@ static int wlan_hdd_cfg80211_start_bss(hdd_adapter_t *pHostapdAdapter,
pHostapdAdapter->dev);
if (!CDF_IS_STATUS_SUCCESS(status)) {
wlansap_reset_sap_config_add_ie(pConfig, eUPDATE_IE_ALL);
cds_set_connection_in_progress(pHddCtx, false);
cds_set_connection_in_progress(false);
hddLog(LOGE, FL("SAP Start Bss fail"));
return -EINVAL;
}
@ -7787,7 +7801,7 @@ static int wlan_hdd_cfg80211_start_bss(hdd_adapter_t *pHostapdAdapter,
if (!CDF_IS_STATUS_SUCCESS(status)) {
hddLog(LOGE,
FL("ERROR: HDD cdf wait for single_event failed!!"));
cds_set_connection_in_progress(pHddCtx, false);
cds_set_connection_in_progress(false);
sme_get_command_q_status(hHal);
#ifdef WLAN_FEATURE_MBSSID
wlansap_stop_bss(WLAN_HDD_GET_SAP_CTX_PTR(pHostapdAdapter));
@ -7801,7 +7815,7 @@ static int wlan_hdd_cfg80211_start_bss(hdd_adapter_t *pHostapdAdapter,
set_bit(SOFTAP_BSS_STARTED, &pHostapdAdapter->event_flags);
/* Initialize WMM configuation */
hdd_wmm_init(pHostapdAdapter);
cds_incr_active_session(pHddCtx, pHostapdAdapter->device_mode,
cds_incr_active_session(pHostapdAdapter->device_mode,
pHostapdAdapter->sessionId);
#ifdef DHCP_SERVER_OFFLOAD
if (iniConfig->enableDHCPServerOffload)
@ -7822,216 +7836,13 @@ static int wlan_hdd_cfg80211_start_bss(hdd_adapter_t *pHostapdAdapter,
}
#endif
cds_set_connection_in_progress(pHddCtx, false);
cds_set_connection_in_progress(false);
pHostapdState->bCommit = true;
EXIT();
return 0;
}
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 4, 0))
/**
* __wlan_hdd_cfg80211_add_beacon() - add beacon in soft ap mode
* @wiphy: Pointer to wiphy structure
* @dev: Pointer to net_device structure
* @params: Pointer to add beacon parameters
*
* Return: 0 for success non-zero for failure
*/
static int __wlan_hdd_cfg80211_add_beacon(struct wiphy *wiphy,
struct net_device *dev,
struct beacon_parameters *params)
{
hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
hdd_context_t *pHddCtx;
int status;
ENTER();
if (CDF_FTM_MODE == hdd_get_conparam()) {
hddLog(LOGE, FL("Command not allowed in FTM mode"));
return -EINVAL;
}
MTRACE(cdf_trace(CDF_MODULE_ID_HDD,
TRACE_CODE_HDD_CFG80211_ADD_BEACON,
pAdapter->sessionId, params->interval));
hddLog(LOG2, FL("Device mode %s(%d)"),
hdd_device_mode_to_string(pAdapter->device_mode),
pAdapter->device_mode);
pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
status = wlan_hdd_validate_context(pHddCtx);
if (0 != status)
return status;
if (!cds_allow_concurrency(pHddCtx,
cds_convert_device_mode_to_hdd_type(
pAdapter->device_mode), 0, HDD_20_MHZ)) {
hddLog(LOGE,
FL("This concurrency combination is not allowed"));
return -EINVAL;
}
if ((pAdapter->device_mode == WLAN_HDD_SOFTAP) ||
(pAdapter->device_mode == WLAN_HDD_P2P_GO)) {
beacon_data_t *old, *new;
old = pAdapter->sessionCtx.ap.beacon;
if (old) {
hddLog(LOGW,
FL("already beacon info added to session(%d)"),
pAdapter->sessionId);
return -EALREADY;
}
status =
wlan_hdd_cfg80211_alloc_new_beacon(pAdapter,
&new, params);
if (status != CDF_STATUS_SUCCESS) {
hddLog(LOGE,
FL("Error!!! Allocating the new beacon"));
return -EINVAL;
}
pAdapter->sessionCtx.ap.beacon = new;
status = wlan_hdd_cfg80211_start_bss(pAdapter, params);
if (0 != status) {
pAdapter->sessionCtx.ap.beacon = NULL;
kfree(new);
}
}
EXIT();
return status;
}
/**
* wlan_hdd_cfg80211_add_beacon() - add beacon in sap mode
* @wiphy: Pointer to wiphy
* @dev: Pointer to netdev
* @param: Pointer to beacon parameters
*
* Return: zero for success non-zero for failure
*/
int wlan_hdd_cfg80211_add_beacon(struct wiphy *wiphy,
struct net_device *dev,
struct beacon_parameters *params)
{
int ret;
cds_ssr_protect(__func__);
ret = __wlan_hdd_cfg80211_add_beacon(wiphy, dev, params);
cds_ssr_unprotect(__func__);
return ret;
}
/**
* __wlan_hdd_cfg80211_set_beacon() - set beacon in soft ap mode
* @wiphy: Pointer to wiphy structure
* @dev: Pointer to net_device structure
* @params: Pointer to set beacon parameters
*
* Return: 0 for success non-zero for failure
*/
static int __wlan_hdd_cfg80211_set_beacon(struct wiphy *wiphy,
struct net_device *dev,
struct beacon_parameters *params)
{
hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
hdd_context_t *pHddCtx;
int status;
ENTER();
if (CDF_FTM_MODE == hdd_get_conparam()) {
hddLog(LOGE, FL("Command not allowed in FTM mode"));
return -EINVAL;
}
MTRACE(cdf_trace(CDF_MODULE_ID_HDD,
TRACE_CODE_HDD_CFG80211_SET_BEACON,
pAdapter->sessionId, pHddStaCtx->conn_info.authType));
hddLog(LOG1, FL("Device_mode %s(%d)"),
hdd_device_mode_to_string(pAdapter->device_mode),
pAdapter->device_mode);
pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
status = wlan_hdd_validate_context(pHddCtx);
if (0 != status)
return status;
if ((pAdapter->device_mode == WLAN_HDD_SOFTAP) ||
(pAdapter->device_mode == WLAN_HDD_P2P_GO)) {
beacon_data_t *old, *new;
old = pAdapter->sessionCtx.ap.beacon;
if (!old) {
hddLog(LOGE,
FL("session(%d) old and new heads points to NULL"),
pAdapter->sessionId);
return -ENOENT;
}
status =
wlan_hdd_cfg80211_alloc_new_beacon(pAdapter,
&new, params);
if (status != CDF_STATUS_SUCCESS) {
hddLog(LOGE,
FL("Error!!! Allocating the new beacon"));
return -EINVAL;
}
pAdapter->sessionCtx.ap.beacon = new;
status = wlan_hdd_cfg80211_start_bss(pAdapter, params);
}
EXIT();
return status;
}
/**
* wlan_hdd_cfg80211_set_beacon() - set beacon in sap mode
* @wiphy: Pointer to wiphy
* @dev: Pointer to netdev
* @param: Pointer to beacon parameters
*
* Return: zero for success non-zero for failure
*/
int wlan_hdd_cfg80211_set_beacon(struct wiphy *wiphy,
struct net_device *dev,
struct beacon_parameters *params)
{
int ret;
cds_ssr_protect(__func__);
ret = __wlan_hdd_cfg80211_set_beacon(wiphy, dev, params);
cds_ssr_unprotect(__func__);
return ret;
}
#endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(3, 4, 0)) */
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 4, 0))
/**
* __wlan_hdd_cfg80211_del_beacon() - stop soft ap
* @wiphy: Pointer to wiphy structure
* @dev: Pointer to net_device structure
*
* Return: 0 for success non-zero for failure
*/
static int __wlan_hdd_cfg80211_del_beacon(struct wiphy *wiphy,
struct net_device *dev)
#else
/**
* __wlan_hdd_cfg80211_stop_ap() - stop soft ap
* @wiphy: Pointer to wiphy structure
@ -8041,7 +7852,6 @@ static int __wlan_hdd_cfg80211_del_beacon(struct wiphy *wiphy,
*/
static int __wlan_hdd_cfg80211_stop_ap(struct wiphy *wiphy,
struct net_device *dev)
#endif
{
hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
hdd_context_t *pHddCtx = NULL;
@ -8057,7 +7867,7 @@ static int __wlan_hdd_cfg80211_stop_ap(struct wiphy *wiphy,
ENTER();
if (CDF_FTM_MODE == hdd_get_conparam()) {
if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
hddLog(LOGE, FL("Command not allowed in FTM mode"));
return -EINVAL;
}
@ -8166,8 +7976,7 @@ static int __wlan_hdd_cfg80211_stop_ap(struct wiphy *wiphy,
}
clear_bit(SOFTAP_BSS_STARTED, &pAdapter->event_flags);
/*BSS stopped, clear the active sessions for this device mode*/
cds_decr_session_set_pcl(pHddCtx,
pAdapter->device_mode,
cds_decr_session_set_pcl(pAdapter->device_mode,
pAdapter->sessionId);
pAdapter->sessionCtx.ap.beacon = NULL;
kfree(old);
@ -8211,7 +8020,6 @@ static int __wlan_hdd_cfg80211_stop_ap(struct wiphy *wiphy,
return ret;
}
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0))
/**
* wlan_hdd_get_channel_bw() - get channel bandwidth
* @width: input channel width in nl80211_chan_width value
@ -8247,28 +8055,7 @@ static enum hw_mode_bandwidth wlan_hdd_get_channel_bw(
return ch_bw;
}
#endif
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 4, 0)) && !defined(WITH_BACKPORTS)
/**
* wlan_hdd_cfg80211_del_beacon() - delete beacon in sap mode
* @wiphy: Pointer to wiphy
* @dev: Pointer to netdev
*
* Return: zero for success non-zero for failure
*/
int wlan_hdd_cfg80211_del_beacon(struct wiphy *wiphy,
struct net_device *dev)
{
int ret;
cds_ssr_protect(__func__);
ret = __wlan_hdd_cfg80211_del_beacon(wiphy, dev);
cds_ssr_unprotect(__func__);
return ret;
}
#else
/**
* wlan_hdd_cfg80211_stop_ap() - stop sap
* @wiphy: Pointer to wiphy
@ -8287,9 +8074,7 @@ int wlan_hdd_cfg80211_stop_ap(struct wiphy *wiphy,
return ret;
}
#endif
#if (LINUX_VERSION_CODE > KERNEL_VERSION(3, 3, 0))
/**
* __wlan_hdd_cfg80211_start_ap() - start soft ap mode
* @wiphy: Pointer to wiphy structure
@ -8310,7 +8095,7 @@ static int __wlan_hdd_cfg80211_start_ap(struct wiphy *wiphy,
ENTER();
if (CDF_FTM_MODE == hdd_get_conparam()) {
if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
hddLog(LOGE, FL("Command not allowed in FTM mode"));
return -EINVAL;
}
@ -8333,16 +8118,12 @@ static int __wlan_hdd_cfg80211_start_ap(struct wiphy *wiphy,
hdd_device_mode_to_string(pAdapter->device_mode),
pAdapter->device_mode);
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0))
channel_width = wlan_hdd_get_channel_bw(params->chandef.width);
channel = ieee80211_frequency_to_channel(
params->chandef.chan->center_freq);
#else
channel_width = HW_MODE_20_MHZ;
channel = 0;
#endif
/* check if concurrency is allowed */
if (!cds_allow_concurrency(pHddCtx,
if (!cds_allow_concurrency(
cds_convert_device_mode_to_hdd_type(
pAdapter->device_mode),
channel,
@ -8376,9 +8157,7 @@ static int __wlan_hdd_cfg80211_start_ap(struct wiphy *wiphy,
|| (pAdapter->device_mode == WLAN_HDD_P2P_GO)
) {
beacon_data_t *old, *new;
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0))
enum nl80211_channel_type channel_type;
#endif
old = pAdapter->sessionCtx.ap.beacon;
@ -8421,10 +8200,8 @@ static int __wlan_hdd_cfg80211_start_ap(struct wiphy *wiphy,
pAdapter->sessionCtx.ap.sapConfig.authType =
eSAP_AUTO_SWITCH;
}
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0))
pAdapter->sessionCtx.ap.sapConfig.ch_width_orig =
params->chandef.width;
#endif
status =
wlan_hdd_cfg80211_start_bss(pAdapter,
&params->beacon,
@ -8476,7 +8253,7 @@ static int __wlan_hdd_cfg80211_change_beacon(struct wiphy *wiphy,
ENTER();
if (CDF_FTM_MODE == hdd_get_conparam()) {
if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
hddLog(LOGE, FL("Command not allowed in FTM mode"));
return -EINVAL;
}
@ -8541,5 +8318,3 @@ int wlan_hdd_cfg80211_change_beacon(struct wiphy *wiphy,
return ret;
}
#endif /* (LINUX_VERSION_CODE > KERNEL_VERSION(3, 3, 0)) */

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2013-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2013-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -58,7 +58,8 @@ eCsrAuthType
hdd_translate_rsn_to_csr_auth_type(uint8_t auth_suite[4]);
int hdd_softap_set_channel_change(struct net_device *dev,
int target_channel);
int target_channel,
phy_ch_width target_bw);
eCsrEncryptionType
hdd_translate_rsn_to_csr_encryption_type(uint8_t cipher_suite[4]);
@ -99,29 +100,13 @@ CDF_STATUS hdd_set_sap_ht2040_mode(hdd_adapter_t *pHostapdAdapter,
uint8_t channel_type);
#endif
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 4, 0))
int wlan_hdd_cfg80211_add_beacon(struct wiphy *wiphy,
struct net_device *dev,
struct beacon_parameters *params);
int wlan_hdd_cfg80211_set_beacon(struct wiphy *wiphy,
struct net_device *dev,
struct beacon_parameters *params);
#endif
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 4, 0))
int wlan_hdd_cfg80211_del_beacon(struct wiphy *wiphy,
struct net_device *dev);
#else
int wlan_hdd_cfg80211_stop_ap(struct wiphy *wiphy,
struct net_device *dev);
#endif
#if (LINUX_VERSION_CODE > KERNEL_VERSION(3, 3, 0))
int wlan_hdd_cfg80211_start_ap(struct wiphy *wiphy,
struct net_device *dev,
struct cfg80211_ap_settings *params);
#endif
int wlan_hdd_cfg80211_change_beacon(struct wiphy *wiphy,
struct net_device *dev,

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2012-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -34,6 +34,7 @@
#include "wlan_hdd_power.h"
#include "wlan_hdd_driver_ops.h"
#include "cds_concurrency.h"
#include "wlan_hdd_hostapd.h"
#include "wlan_hdd_p2p.h"
#include <linux/ctype.h>
@ -260,7 +261,6 @@ CDF_STATUS hdd_get_tsm_stats(hdd_adapter_t *adapter,
}
#endif /*FEATURE_WLAN_ESE && FEATURE_WLAN_ESE_UPLOAD */
#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_ESE) || defined(FEATURE_WLAN_LFR)
static void hdd_get_band_helper(hdd_context_t *hdd_ctx, int *pBand)
{
eCsrBand band = -1;
@ -520,9 +520,6 @@ static int hdd_parse_reassoc_command_v1_data(const uint8_t *pValue,
return 0;
}
#endif /* WLAN_FEATURE_VOWIFI_11R || FEATURE_WLAN_ESE || FEATURE_WLAN_ESE FEATURE_WLAN_LFR */
#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_ESE) || defined(FEATURE_WLAN_LFR)
/**
* hdd_reassoc() - perform a userspace-directed reassoc
* @adapter: Adapter upon which the command was received
@ -695,9 +692,6 @@ static int hdd_parse_reassoc(hdd_adapter_t *adapter, const char *command)
return ret;
}
#endif /* WLAN_FEATURE_VOWIFI_11R || FEATURE_WLAN_ESE || FEATURE_WLAN_ESE FEATURE_WLAN_LFR */
#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_ESE) || defined(FEATURE_WLAN_LFR)
/**
* hdd_sendactionframe() - send a userspace-supplied action frame
* @adapter: Adapter upon which the command was received
@ -836,15 +830,9 @@ hdd_sendactionframe(hdd_adapter_t *adapter, const uint8_t *bssid,
ret = wlan_hdd_mgmt_tx(NULL, &adapter->wdev, &params, &cookie);
#else
ret = wlan_hdd_mgmt_tx(NULL,
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
&(adapter->wdev),
#else
adapter->dev,
#endif
&chan, 0,
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0))
NL80211_CHAN_HT20, 1,
#endif
dwell_time, frame, frame_len, 1, 1, &cookie);
#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0) */
@ -979,9 +967,6 @@ hdd_parse_sendactionframe(hdd_adapter_t *adapter, const char *command)
return ret;
}
#endif /* WLAN_FEATURE_VOWIFI_11R || FEATURE_WLAN_ESE || FEATURE_WLAN_ESE FEATURE_WLAN_LFR */
#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_ESE) || defined(FEATURE_WLAN_LFR)
/**
* hdd_parse_channellist() - HDD Parse channel list
* @pValue: Pointer to input channel list
@ -1277,7 +1262,6 @@ hdd_parse_set_roam_scan_channels(hdd_adapter_t *adapter, const char *command)
return ret;
}
#endif /* WLAN_FEATURE_VOWIFI_11R || FEATURE_WLAN_ESE || FEATURE_WLAN_LFR */
#if defined(FEATURE_WLAN_ESE) && defined(FEATURE_WLAN_ESE_UPLOAD)
/**
@ -1723,7 +1707,7 @@ static int hdd_set_app_type1_parser(hdd_adapter_t *adapter,
tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(adapter);
char id[20], password[20];
tSirAppType1Params params;
int rc, i;
int rc;
rc = wlan_hdd_validate_context(hdd_ctx);
if (0 != rc) {
@ -1739,9 +1723,7 @@ static int hdd_set_app_type1_parser(hdd_adapter_t *adapter,
memset(&params, 0, sizeof(tSirAppType1Params));
params.vdev_id = adapter->sessionId;
for (i = 0; i < ETHER_ADDR_LEN; i++)
params.wakee_mac_addr[i] =
adapter->macAddressCurrent.bytes[i];
cdf_copy_macaddr(&params.wakee_mac_addr, &adapter->macAddressCurrent);
params.id_length = strlen(id);
cdf_mem_copy(params.identification_id, id, params.id_length);
@ -1750,7 +1732,7 @@ static int hdd_set_app_type1_parser(hdd_adapter_t *adapter,
CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_INFO,
"%s: %d %pM %.8s %u %.16s %u",
__func__, params.vdev_id, params.wakee_mac_addr,
__func__, params.vdev_id, params.wakee_mac_addr.bytes,
params.identification_id, params.id_length,
params.password, params.pass_length);
@ -1782,7 +1764,7 @@ static int hdd_set_app_type2_parser(hdd_adapter_t *adapter,
hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
tHalHandle hHal = WLAN_HDD_GET_HAL_CTX(adapter);
char mac_addr[20], rc4_key[20];
unsigned int gateway_mac[6], i;
unsigned int gateway_mac[CDF_MAC_ADDR_SIZE];
tSirAppType2Params params;
int ret;
@ -1831,8 +1813,8 @@ static int hdd_set_app_type2_parser(hdd_adapter_t *adapter,
return -EINVAL;
}
for (i = 0; i < ETHER_ADDR_LEN; i++)
params.gateway_mac[i] = (uint8_t) gateway_mac[i];
cdf_mem_copy(&params.gateway_mac.bytes, (uint8_t *) &gateway_mac,
CDF_MAC_ADDR_SIZE);
params.rc4_key_len = strlen(rc4_key);
cdf_mem_copy(params.rc4_key, rc4_key, params.rc4_key_len);
@ -2120,15 +2102,15 @@ static void hdd_get_link_status_cb(uint8_t status, void *context)
static int wlan_hdd_get_link_status(hdd_adapter_t *adapter)
{
hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
hdd_station_ctx_t *pHddStaCtx =
WLAN_HDD_GET_STATION_CTX_PTR(adapter);
struct statsContext context;
CDF_STATUS hstatus;
unsigned long rc;
if (hdd_ctx->isLogpInProgress) {
hddLog(LOGW, FL("LOGP in Progress. Ignore!!!"));
if (cds_is_driver_recovering()) {
hdd_warn("Recovery in Progress. State: 0x%x Ignore!!!",
cds_get_driver_state());
return 0;
}
@ -4669,7 +4651,7 @@ static int drv_cmd_miracast(hdd_adapter_t *adapter,
return -EBUSY;
}
if (cds_is_mcc_in_24G(pHddCtx))
if (cds_is_mcc_in_24G())
return cds_set_mas(adapter, filterType);
exit:
@ -5308,6 +5290,12 @@ static int drv_cmd_tdls_off_channel(hdd_adapter_t *adapter,
if (ret != 1)
return -EINVAL;
if (CDS_IS_DFS_CH(set_value)) {
hdd_err("DFS channel %d is passed for hdd_set_tdls_offchannel",
set_value);
return -EINVAL;
}
hddLog(LOG1, FL("Tdls offchannel num: %d"), set_value);
ret = hdd_set_tdls_offchannel(hdd_ctx, set_value);
@ -5956,6 +5944,123 @@ static int drv_cmd_set_fcc_channel(hdd_adapter_t *adapter,
return ret;
}
/**
* hdd_parse_set_channel_switch_command() - Parse and validate CHANNEL_SWITCH
* command
* @value: Pointer to the command
* @chan_number: Pointer to the channel number
* @chan_bw: Pointer to the channel bandwidth
*
* Parses and provides the channel number and channel width from the input
* command which is expected to be of the format: CHANNEL_SWITCH <CH> <BW>
* <CH> is channel number to move (where 1 = channel 1, 149 = channel 149, ...)
* <BW> is bandwidth to move (where 20 = BW 20, 40 = BW 40, 80 = BW 80)
*
* Return: 0 for success, non-zero for failure
*/
static int hdd_parse_set_channel_switch_command(uint8_t *value,
uint32_t *chan_number,
uint32_t *chan_bw)
{
const uint8_t *in_ptr = value;
int ret;
in_ptr = strnchr(value, strlen(value), SPACE_ASCII_VALUE);
/* no argument after the command */
if (NULL == in_ptr) {
hdd_err("No argument after the command");
return -EINVAL;
}
/* no space after the command */
if (SPACE_ASCII_VALUE != *in_ptr) {
hdd_err("No space after the command ");
return -EINVAL;
}
/* remove empty spaces and move the next argument */
while ((SPACE_ASCII_VALUE == *in_ptr) && ('\0' != *in_ptr))
in_ptr++;
/* no argument followed by spaces */
if ('\0' == *in_ptr) {
hdd_err("No argument followed by spaces");
return -EINVAL;
}
/* get the two arguments: channel number and bandwidth */
ret = sscanf(in_ptr, "%u %u", chan_number, chan_bw);
if (ret != 2) {
hdd_err("Arguments retrieval from cmd string failed");
return -EINVAL;
}
return 0;
}
/**
* drv_cmd_set_channel_switch() - Switch SAP/P2P-GO operating channel
* @adapter: HDD adapter
* @hdd_ctx: HDD context
* @command: Pointer to the input command CHANNEL_SWITCH
* @command_len: Command len
* @priv_data: Private data
*
* Handles private IOCTL CHANNEL_SWITCH command to switch the operating channel
* of SAP/P2P-GO
*
* Return: 0 for success, non-zero for failure
*/
static int drv_cmd_set_channel_switch(hdd_adapter_t *adapter,
hdd_context_t *hdd_ctx,
uint8_t *command,
uint8_t command_len,
hdd_priv_data_t *priv_data)
{
struct net_device *dev = adapter->dev;
int status;
uint32_t chan_number = 0, chan_bw = 0;
uint8_t *value = command;
phy_ch_width width;
if ((adapter->device_mode != WLAN_HDD_P2P_GO) &&
(adapter->device_mode != WLAN_HDD_SOFTAP)) {
hdd_err("IOCTL CHANNEL_SWITCH not supported for mode %d",
adapter->device_mode);
return -EINVAL;
}
status = hdd_parse_set_channel_switch_command(value,
&chan_number, &chan_bw);
if (status) {
hdd_err("Invalid CHANNEL_SWITCH command");
return status;
}
if ((chan_bw != 20) && (chan_bw != 40) && (chan_bw != 80)) {
hdd_err("BW %d is not allowed for CHANNEL_SWITCH", chan_bw);
return -EINVAL;
}
if (chan_bw == 80)
width = CH_WIDTH_80MHZ;
else if (chan_bw == 40)
width = CH_WIDTH_40MHZ;
else
width = CH_WIDTH_20MHZ;
hdd_info("CH:%d BW:%d", chan_number, chan_bw);
status = hdd_softap_set_channel_change(dev, chan_number, width);
if (status) {
hdd_err("Set channel change fail");
return status;
}
return 0;
}
/*
* The following table contains all supported WLAN HDD
* IOCTL driver commands and the handler for each of them.
@ -5971,23 +6076,16 @@ static const hdd_drv_cmd_t hdd_drv_cmds[] = {
{"SET_AP_WPS_P2P_IE", drv_cmd_dummy},
{"BTCOEXSCAN", drv_cmd_dummy},
{"RXFILTER", drv_cmd_dummy},
#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
{"SETROAMTRIGGER", drv_cmd_set_roam_trigger},
{"GETROAMTRIGGER", drv_cmd_get_roam_trigger},
{"SETROAMSCANPERIOD", drv_cmd_set_roam_scan_period},
{"GETROAMSCANPERIOD", drv_cmd_get_roam_scan_period},
{"SETROAMSCANREFRESHPERIOD", drv_cmd_set_roam_scan_refresh_period},
{"GETROAMSCANREFRESHPERIOD", drv_cmd_get_roam_scan_refresh_period},
#ifdef FEATURE_WLAN_LFR
{"SETROAMMODE", drv_cmd_set_roam_mode},
{"GETROAMMODE", drv_cmd_get_roam_mode},
#endif
#endif
#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_ESE) || defined(FEATURE_WLAN_LFR)
{"SETROAMDELTA", drv_cmd_set_roam_delta},
{"GETROAMDELTA", drv_cmd_get_roam_delta},
#endif
#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_ESE) || defined(FEATURE_WLAN_LFR)
{"GETBAND", drv_cmd_get_band},
{"SETROAMSCANCHANNELS", drv_cmd_set_roam_scan_channels},
{"GETROAMSCANCHANNELS", drv_cmd_get_roam_scan_channels},
@ -6015,10 +6113,7 @@ static const hdd_drv_cmd_t hdd_drv_cmds[] = {
{"GETOPPORTUNISTICRSSIDIFF", drv_cmd_get_opportunistic_rssi_diff},
{"SETROAMRESCANRSSIDIFF", drv_cmd_set_roam_rescan_rssi_diff},
{"GETROAMRESCANRSSIDIFF", drv_cmd_get_roam_rescan_rssi_diff},
#endif /* WLAN_FEATURE_VOWIFI_11R || FEATURE_WLAN_ESE || FEATURE_WLAN_LFR */
#ifdef FEATURE_WLAN_LFR
{"SETFASTROAM", drv_cmd_set_fast_roam},
#endif
#ifdef WLAN_FEATURE_VOWIFI_11R
{"SETFASTTRANSITION", drv_cmd_set_fast_transition},
{"FASTREASSOC", drv_cmd_fast_reassoc},
@ -6070,6 +6165,7 @@ static const hdd_drv_cmd_t hdd_drv_cmds[] = {
{"RXFILTER-REMOVE", drv_cmd_rx_filter_remove},
{"RXFILTER-ADD", drv_cmd_rx_filter_add},
{"SET_FCC_CHANNEL", drv_cmd_set_fcc_channel},
{"CHANNEL_SWITCH", drv_cmd_set_channel_switch},
};
/**
@ -6141,7 +6237,7 @@ static int hdd_driver_command(hdd_adapter_t *adapter,
ENTER();
if (CDF_FTM_MODE == hdd_get_conparam()) {
if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
hddLog(LOGE, FL("Command not allowed in FTM mode"));
return -EINVAL;
}
@ -6279,7 +6375,7 @@ static int __hdd_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
goto exit;
}
#if defined(QCA_WIFI_FTM) && defined(LINUX_QCMBR)
if (CDF_FTM_MODE == hdd_get_conparam()) {
if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
if (SIOCIOCTLTX99 == cmd) {
ret = wlan_hdd_qcmbr_unified_ioctl(adapter, ifr);
goto exit;

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2013-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2013-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -1237,21 +1237,11 @@ hdd_ipa_uc_rm_notify_handler(void *context, enum ipa_rm_event event)
hdd_ipa_uc_enable_pipes(hdd_ipa);
}
cdf_mutex_release(&hdd_ipa->ipa_lock);
if (hdd_ipa->pending_cons_req) {
ipa_rm_notify_completion(IPA_RM_RESOURCE_GRANTED,
IPA_RM_RESOURCE_WLAN_CONS);
}
hdd_ipa->pending_cons_req = false;
break;
case IPA_RM_RESOURCE_RELEASED:
/* Differed RM Released */
hdd_ipa->resource_unloading = false;
if (hdd_ipa->pending_cons_req) {
ipa_rm_notify_completion(IPA_RM_RESOURCE_RELEASED,
IPA_RM_RESOURCE_WLAN_CONS);
}
hdd_ipa->pending_cons_req = false;
break;
default:
@ -1377,6 +1367,11 @@ static void hdd_ipa_uc_op_cb(struct op_msg_type *op_msg, void *usr_ctxt)
if (HDD_IPA_UC_NUM_WDI_PIPE == hdd_ipa->activated_fw_pipe) {
hdd_ipa->resource_loading = false;
hdd_ipa_uc_proc_pending_event(hdd_ipa);
if (hdd_ipa->pending_cons_req)
ipa_rm_notify_completion(
IPA_RM_RESOURCE_GRANTED,
IPA_RM_RESOURCE_WLAN_CONS);
hdd_ipa->pending_cons_req = false;
}
cdf_mutex_release(&hdd_ipa->ipa_lock);
}
@ -1387,16 +1382,14 @@ static void hdd_ipa_uc_op_cb(struct op_msg_type *op_msg, void *usr_ctxt)
hdd_ipa->activated_fw_pipe--;
if (!hdd_ipa->activated_fw_pipe) {
hdd_ipa_uc_disable_pipes(hdd_ipa);
if ((hdd_ipa_is_rm_enabled(hdd_ipa->hdd_ctx)) &&
(!ipa_rm_release_resource(IPA_RM_RESOURCE_WLAN_PROD))) {
/* Sync return success from IPA
* Enable/resume all the PIPEs */
hdd_ipa->resource_unloading = false;
hdd_ipa_uc_proc_pending_event(hdd_ipa);
} else {
hdd_ipa->resource_unloading = false;
hdd_ipa_uc_proc_pending_event(hdd_ipa);
}
if (hdd_ipa_is_rm_enabled(hdd_ipa->hdd_ctx))
ipa_rm_release_resource(
IPA_RM_RESOURCE_WLAN_PROD);
/* Sync return success from IPA
* Enable/resume all the PIPEs */
hdd_ipa->resource_unloading = false;
hdd_ipa_uc_proc_pending_event(hdd_ipa);
hdd_ipa->pending_cons_req = false;
}
cdf_mutex_release(&hdd_ipa->ipa_lock);
}
@ -1410,19 +1403,19 @@ static void hdd_ipa_uc_op_cb(struct op_msg_type *op_msg, void *usr_ctxt)
"CE RING BASE: 0x%llx\n"
"CE RING SIZE: %d\n"
"CE REG ADDR : 0x%llx",
hdd_ipa->ce_sr_base_paddr,
(unsigned long long)hdd_ipa->ce_sr_base_paddr,
hdd_ipa->ce_sr_ring_size,
hdd_ipa->ce_reg_paddr);
(unsigned long long)hdd_ipa->ce_reg_paddr);
CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
"==== IPA_UC WLAN_HOST TX ====\n"
"COMP RING BASE: 0x%llx\n"
"COMP RING SIZE: %d\n"
"NUM ALLOC BUF: %d\n"
"COMP RING DBELL : 0x%llx",
hdd_ipa->tx_comp_ring_base_paddr,
(unsigned long long)hdd_ipa->tx_comp_ring_base_paddr,
hdd_ipa->tx_comp_ring_size,
hdd_ipa->tx_num_alloc_buffer,
hdd_ipa->tx_comp_doorbell_paddr);
(unsigned long long)hdd_ipa->tx_comp_doorbell_paddr);
CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
"==== IPA_UC WLAN_HOST RX ====\n"
"IND RING BASE: 0x%llx\n"
@ -1432,13 +1425,13 @@ static void hdd_ipa_uc_op_cb(struct op_msg_type *op_msg, void *usr_ctxt)
"NUM EXCP PKT : %llu\n"
"NUM TX BCMC : %llu\n"
"NUM TX BCMC ERR : %llu",
hdd_ipa->rx_rdy_ring_base_paddr,
(unsigned long long)hdd_ipa->rx_rdy_ring_base_paddr,
hdd_ipa->rx_rdy_ring_size,
hdd_ipa->rx_ready_doorbell_paddr,
hdd_ipa->rx_proc_done_idx_paddr,
(unsigned long long)hdd_ipa->rx_ready_doorbell_paddr,
(unsigned long long)hdd_ipa->rx_proc_done_idx_paddr,
hdd_ipa->stats.num_rx_excep,
hdd_ipa->stats.num_tx_bcmc,
hdd_ipa->stats.num_tx_bcmc_err);
(unsigned long long)hdd_ipa->stats.num_tx_bcmc_err);
CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
"==== IPA_UC WLAN_HOST CONTROL ====\n"
"SAP NUM STAs: %d\n"
@ -1732,6 +1725,28 @@ end:
cdf_mem_free(op_msg);
}
/**
* hdd_ipa_init_uc_op_work - init ipa uc op work
* @work: struct work_struct
* @work_handler: work_handler
*
* Return: none
*/
#ifdef CONFIG_CNSS
static void hdd_ipa_init_uc_op_work(struct work_struct *work,
work_func_t work_handler)
{
cnss_init_work(work, work_handler);
}
#else
static void hdd_ipa_init_uc_op_work(struct work_struct *work,
work_func_t work_handler)
{
INIT_WORK(work, work_handler);
}
#endif
/**
* hdd_ipa_uc_ol_init() - Initialize IPA uC offload
* @hdd_ctx: Global HDD context
@ -1835,7 +1850,7 @@ static CDF_STATUS hdd_ipa_uc_ol_init(hdd_context_t *hdd_ctx)
hdd_ipa_uc_op_event_handler, (void *)hdd_ctx);
for (i = 0; i < HDD_IPA_UC_OPCODE_MAX; i++) {
cnss_init_work(&ipa_ctxt->uc_op_work[i].work,
hdd_ipa_init_uc_op_work(&ipa_ctxt->uc_op_work[i].work,
hdd_ipa_uc_fw_op_event_handler);
ipa_ctxt->uc_op_work[i].msg = NULL;
}
@ -2312,6 +2327,27 @@ int hdd_ipa_set_perf_level(hdd_context_t *hdd_ctx, uint64_t tx_packets,
return 0;
}
/**
* hdd_ipa_init_uc_rm_work - init ipa uc resource manager work
* @work: struct work_struct
* @work_handler: work_handler
*
* Return: none
*/
#ifdef CONFIG_CNSS
static void hdd_ipa_init_uc_rm_work(struct work_struct *work,
work_func_t work_handler)
{
cnss_init_work(work, work_handler);
}
#else
static void hdd_ipa_init_uc_rm_work(struct work_struct *work,
work_func_t work_handler)
{
INIT_WORK(work, work_handler);
}
#endif
/**
* hdd_ipa_setup_rm() - Setup IPA resource management
* @hdd_ipa: Global HDD IPA context
@ -2326,7 +2362,8 @@ static int hdd_ipa_setup_rm(struct hdd_ipa_priv *hdd_ipa)
if (!hdd_ipa_is_rm_enabled(hdd_ipa->hdd_ctx))
return 0;
cnss_init_work(&hdd_ipa->uc_rm_work.work, hdd_ipa_uc_rm_notify_defer);
hdd_ipa_init_uc_rm_work(&hdd_ipa->uc_rm_work.work,
hdd_ipa_uc_rm_notify_defer);
memset(&create_params, 0, sizeof(create_params));
create_params.name = IPA_RM_RESOURCE_WLAN_PROD;
create_params.reg_params.user_data = hdd_ipa;
@ -2461,7 +2498,7 @@ static void hdd_ipa_send_skb_to_network(cdf_nbuf_t skb,
return;
}
if (hdd_ipa->hdd_ctx->isUnloadInProgress) {
if (cds_is_driver_unloading()) {
HDD_IPA_INCREASE_INTERNAL_DROP_COUNT(hdd_ipa);
cdf_nbuf_free(skb);
return;
@ -3752,7 +3789,7 @@ int hdd_ipa_wlan_evt(hdd_adapter_t *adapter, uint8_t sta_id,
if ((!hdd_ipa->num_iface) &&
(HDD_IPA_UC_NUM_WDI_PIPE ==
hdd_ipa->activated_fw_pipe)) {
if (hdd_ipa->hdd_ctx->isUnloadInProgress) {
if (cds_is_driver_unloading()) {
/*
* We disable WDI pipes directly here since
* IPA_OPCODE_TX/RX_SUSPEND message will not be
@ -3795,6 +3832,23 @@ int hdd_ipa_wlan_evt(hdd_adapter_t *adapter, uint8_t sta_id,
cdf_mutex_release(&hdd_ipa->event_lock);
return 0;
}
/* Enable IPA UC Data PIPEs when first STA connected */
if ((0 == hdd_ipa->sap_num_connected_sta) &&
(!hdd_ipa_uc_sta_is_enabled(hdd_ipa->hdd_ctx) ||
!hdd_ipa->sta_connected)) {
ret = hdd_ipa_uc_handle_first_con(hdd_ipa);
if (ret) {
cdf_mutex_release(&hdd_ipa->event_lock);
HDD_IPA_LOG(CDF_TRACE_LEVEL_ERROR,
"%s: handle 1st con ret %d",
adapter->dev->name, ret);
return ret;
}
}
hdd_ipa->sap_num_connected_sta++;
cdf_mutex_release(&hdd_ipa->event_lock);
meta.msg_type = type;
@ -3830,27 +3884,6 @@ int hdd_ipa_wlan_evt(hdd_adapter_t *adapter, uint8_t sta_id,
return ret;
}
hdd_ipa->stats.num_send_msg++;
cdf_mutex_acquire(&hdd_ipa->event_lock);
/* Enable IPA UC Data PIPEs when first STA connected */
if ((0 == hdd_ipa->sap_num_connected_sta)
&& (!hdd_ipa_uc_sta_is_enabled(hdd_ipa->hdd_ctx)
|| !hdd_ipa->sta_connected)) {
ret = hdd_ipa_uc_handle_first_con(hdd_ipa);
if (ret) {
cdf_mutex_release(&hdd_ipa->event_lock);
HDD_IPA_LOG(CDF_TRACE_LEVEL_ERROR,
"%s: handle 1st con ret %d",
adapter->dev->name, ret);
return ret;
}
}
hdd_ipa->sap_num_connected_sta++;
hdd_ipa->pending_cons_req = false;
cdf_mutex_release(&hdd_ipa->event_lock);
return ret;
case WLAN_CLIENT_DISCONNECT:

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2015-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -30,6 +30,9 @@
* WLAN HDD LRO interface implementation
*/
/* denote that this file does not allow legacy hddLog */
#define HDD_DISALLOW_LEGACY_HDDLOG 1
#include <wlan_hdd_includes.h>
#include <cdf_types.h>
#include <wlan_hdd_lro.h>
@ -458,7 +461,7 @@ int hdd_lro_init(hdd_context_t *hdd_ctx)
struct wma_lro_config_cmd_t lro_config;
if (!hdd_ctx->config->lro_enable) {
hdd_err(FL("LRO Disabled"));
hdd_err("LRO Disabled");
return 0;
}

File diff suppressed because it is too large Load diff

View file

@ -368,7 +368,6 @@ static struct proc_dir_entry *proc_file, *proc_dir;
*
* Return: void pointer to hdd_context
*/
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)) || defined(WITH_BACKPORTS)
static void *memdump_get_file_data(struct file *file)
{
void *hdd_ctx;
@ -376,15 +375,6 @@ static void *memdump_get_file_data(struct file *file)
hdd_ctx = PDE_DATA(file_inode(file));
return hdd_ctx;
}
#else
static void *memdump_get_file_data(struct file *file)
{
void *hdd_ctx;
hdd_ctx = PDE(file->f_path.dentry->d_inode)->data;
return hdd_ctx;
}
#endif
/**
* memdump_read() - perform read operation in memory dump proc file
@ -558,7 +548,7 @@ int memdump_init(void)
return -EINVAL;
}
if (CDF_FTM_MODE == hdd_get_conparam()) {
if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
hddLog(LOGE, FL("Not initializing memdump in FTM mode"));
return -EINVAL;
}
@ -612,7 +602,7 @@ void memdump_deinit(void)
return;
}
if (CDF_FTM_MODE == hdd_get_conparam()) {
if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
hddLog(LOGE, FL("Not deinitializing memdump in FTM mode"));
return;
}

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2012-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -25,6 +25,9 @@
* WLAN Host Device Driver NAN API implementation
*/
/* denote that this file does not allow legacy hddLog */
#define HDD_DISALLOW_LEGACY_HDDLOG 1
#include <linux/version.h>
#include <linux/module.h>
#include <linux/kernel.h>
@ -65,7 +68,7 @@ static int __wlan_hdd_cfg80211_nan_request(struct wiphy *wiphy,
if (ret_val)
return ret_val;
if (CDF_FTM_MODE == hdd_get_conparam()) {
if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
hdd_err("Command not allowed in FTM mode");
return -EPERM;
}
@ -131,15 +134,13 @@ static void wlan_hdd_cfg80211_nan_callback(void *ctx, tSirNanEvent *msg)
int status;
if (NULL == msg) {
CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
FL("msg received here is null"));
hdd_err("msg received here is null");
return;
}
status = wlan_hdd_validate_context(hdd_ctx);
if (0 != status) {
CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
FL("HDD context is not valid"));
hdd_err("HDD context is not valid");
return;
}
@ -151,14 +152,12 @@ static void wlan_hdd_cfg80211_nan_callback(void *ctx, tSirNanEvent *msg)
GFP_KERNEL);
if (!vendor_event) {
CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
FL("cfg80211_vendor_event_alloc failed"));
hdd_err("cfg80211_vendor_event_alloc failed");
return;
}
if (nla_put(vendor_event, QCA_WLAN_VENDOR_ATTR_NAN,
msg->event_data_len, msg->event_data)) {
CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
FL("QCA_WLAN_VENDOR_ATTR_NAN put fail"));
hdd_err("QCA_WLAN_VENDOR_ATTR_NAN put fail");
kfree_skb(vendor_event);
return;
}

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2011-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2011-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -121,113 +121,6 @@ static int dot11p_validate_qos_params(struct sir_qos_params qos_params[])
return 0;
}
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 16, 0)) || \
defined(FEATURE_STATICALLY_ADD_11P_CHANNELS)
/*
* If FEATURE_STATICALLY_ADD_11P_CHANNELS
* is defined, IEEE80211_CHAN_NO_10MHZ,
* and IEEE80211_CHAN_NO_20MHZ won't
* be defined.
*/
#define IEEE80211_CHAN_NO_20MHZ (1<<11)
#define IEEE80211_CHAN_NO_10MHZ (1<<12)
#endif
#ifdef FEATURE_STATICALLY_ADD_11P_CHANNELS
#define DOT11P_TX_PWR_MAX 30
#define DOT11P_TX_ANTENNA_MAX 6
#define NUM_DOT11P_CHANNELS 10
/**
* struct chan_info - information for the channel
* @center_freq: center frequency
* @max_bandwidth: maximum bandwidth of the channel in MHz
*/
struct chan_info {
uint32_t center_freq;
uint32_t max_bandwidth;
};
struct chan_info valid_dot11p_channels[NUM_DOT11P_CHANNELS] = {
{5860, 10},
{5870, 10},
{5880, 10},
{5890, 10},
{5900, 10},
{5910, 10},
{5920, 10},
{5875, 20},
{5905, 20},
{5852, 5}
};
/**
* dot11p_validate_channel_static_channels() - validate a DSRC channel
* @center_freq: the channel's center frequency
* @bandwidth: the channel's bandwidth
* @tx_power: transmit power
* @reg_power: (output) the max tx power from the regulatory domain
* @antenna_max: (output) the max antenna gain from the regulatory domain
*
* This function of the function checks the channel parameters against a
* hardcoded list of valid channels based on the FCC rules.
*
* Return: 0 if the channel is valid, error code otherwise.
*/
static int dot11p_validate_channel_static_channels(struct wiphy *wiphy,
uint32_t channel_freq, uint32_t bandwidth, uint32_t tx_power,
uint8_t *reg_power, uint8_t *antenna_max)
{
int i;
for (i = 0; i < NUM_DOT11P_CHANNELS; i++) {
if (channel_freq == valid_dot11p_channels[i].center_freq) {
if (reg_power)
*reg_power = DOT11P_TX_PWR_MAX;
if (antenna_max)
*antenna_max = DOT11P_TX_ANTENNA_MAX;
if (bandwidth == 0)
bandwidth =
valid_dot11p_channels[i].max_bandwidth;
else if (bandwidth >
valid_dot11p_channels[i].max_bandwidth)
return -EINVAL;
if (bandwidth != 5 && bandwidth != 10 &&
bandwidth != 20)
return -EINVAL;
if (tx_power > DOT11P_TX_PWR_MAX)
return -EINVAL;
return 0;
}
}
return -EINVAL;
}
#else
/**
* dot11p_validate_channel_static_channels() - validate a DSRC channel
* @center_freq: the channel's center frequency
* @bandwidth: the channel's bandwidth
* @tx_power: transmit power
* @reg_power: (output) the max tx power from the regulatory domain
* @antenna_max: (output) the max antenna gain from the regulatory domain
*
* This function of the function checks the channel parameters against a
* hardcoded list of valid channels based on the FCC rules.
*
* Return: 0 if the channel is valid, error code otherwise.
*/
static int dot11p_validate_channel_static_channels(struct wiphy *wiphy,
uint32_t channel_freq, uint32_t bandwidth, uint32_t tx_power,
uint8_t *reg_power, uint8_t *antenna_max)
{
return -EINVAL;
}
#endif /* FEATURE_STATICALLY_ADD_11P_CHANNELS */
/**
* dot11p_validate_channel() - validates a DSRC channel
* @center_freq: the channel's center frequency
@ -304,8 +197,7 @@ static int dot11p_validate_channel(struct wiphy *wiphy,
}
}
return dot11p_validate_channel_static_channels(wiphy, channel_freq,
bandwidth, tx_power, reg_power, antenna_max);
return -EINVAL;
}
/**

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2012-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -47,52 +47,6 @@
static struct hdd_context_s *p_hdd_ctx;
/**
* hdd_oem_data_req_callback() - OEM Data request callback handler
* @hHal: MAC handle
* @pContext: User context. For this callback the net device was registered
* @oemDataReqID: The ID of the request
* @oemDataReqStatus: Status of the request
*
* This function reports the results of the request to user space
*
* Return: CDF_STATUS enumeration
*/
static CDF_STATUS hdd_oem_data_req_callback(tHalHandle hHal,
void *pContext,
uint32_t oemDataReqID,
eOemDataReqStatus oemDataReqStatus)
{
CDF_STATUS status = CDF_STATUS_SUCCESS;
struct net_device *dev = (struct net_device *)pContext;
union iwreq_data wrqu;
char buffer[IW_CUSTOM_MAX + 1];
memset(&wrqu, '\0', sizeof(wrqu));
memset(buffer, '\0', sizeof(buffer));
if (oemDataReqStatus == eOEM_DATA_REQ_FAILURE) {
snprintf(buffer, IW_CUSTOM_MAX, "QCOM: OEM-DATA-REQ-FAILED");
hddLog(LOGW, "%s: oem data req %d failed", __func__,
oemDataReqID);
} else if (oemDataReqStatus == eOEM_DATA_REQ_INVALID_MODE) {
snprintf(buffer, IW_CUSTOM_MAX,
"QCOM: OEM-DATA-REQ-INVALID-MODE");
hddLog(LOGW,
"%s: oem data req %d failed because the driver is in invalid mode (IBSS|AP)",
__func__, oemDataReqID);
} else {
snprintf(buffer, IW_CUSTOM_MAX, "QCOM: OEM-DATA-REQ-SUCCESS");
}
wrqu.data.pointer = buffer;
wrqu.data.length = strlen(buffer);
wireless_send_event(dev, IWEVCUSTOM, &wrqu, buffer);
return status;
}
/**
* iw_get_oem_data_cap() - Get OEM Data Capabilities
* @dev: net device upon which the request was received
@ -420,7 +374,14 @@ static CDF_STATUS oem_process_data_req_msg(int oemDataLen, char *oemData)
cdf_mem_zero(&oemDataReqConfig, sizeof(tOemDataReqConfig));
cdf_mem_copy((&oemDataReqConfig)->oemDataReq, oemData, oemDataLen);
oemDataReqConfig.data = cdf_mem_malloc(oemDataLen);
if (!oemDataReqConfig.data) {
hddLog(LOGE, FL("malloc failed for data req buffer"));
return CDF_STATUS_E_NOMEM;
}
oemDataReqConfig.data_len = oemDataLen;
cdf_mem_copy(oemDataReqConfig.data, oemData, oemDataLen);
CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_INFO,
"%s: calling sme_oem_data_req", __func__);
@ -428,8 +389,11 @@ static CDF_STATUS oem_process_data_req_msg(int oemDataLen, char *oemData)
status = sme_oem_data_req(p_hdd_ctx->hHal,
pAdapter->sessionId,
&oemDataReqConfig,
&oemDataReqID,
&hdd_oem_data_req_callback, pAdapter->dev);
&oemDataReqID);
cdf_mem_free(oemDataReqConfig.data);
oemDataReqConfig.data = NULL;
return status;
}

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2012-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -211,19 +211,11 @@ CDF_STATUS wlan_hdd_remain_on_channel_callback(tHalHandle hHal, void *pCtx,
__func__);
}
cfg80211_remain_on_channel_expired(
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
pRemainChanCtx->dev->
ieee80211_ptr,
#else
pRemainChanCtx->dev,
#endif
pRemainChanCtx->
cookie,
&pRemainChanCtx->chan,
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0))
pRemainChanCtx->
chan_type,
#endif
GFP_KERNEL);
pAdapter->last_roc_ts = cdf_mc_timer_get_system_time();
}
@ -827,10 +819,6 @@ void wlan_hdd_roc_request_dequeue(struct work_struct *work)
static int wlan_hdd_request_remain_on_channel(struct wiphy *wiphy,
struct net_device *dev,
struct ieee80211_channel *chan,
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0))
enum nl80211_channel_type
channel_type,
#endif
unsigned int duration,
u64 *cookie,
rem_on_channel_request_type_t
@ -850,21 +838,14 @@ static int wlan_hdd_request_remain_on_channel(struct wiphy *wiphy,
hddLog(LOG1, FL("Device_mode %s(%d)"),
hdd_device_mode_to_string(pAdapter->device_mode),
pAdapter->device_mode);
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0))
hddLog(LOG1,
"chan(hw_val)0x%x chan(centerfreq) %d chan type 0x%x, duration %d",
chan->hw_value, chan->center_freq, channel_type, duration);
#else
hddLog(LOG1,
"chan(hw_val)0x%x chan(centerfreq) %d, duration %d",
chan->hw_value, chan->center_freq, duration);
#endif
pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
ret = wlan_hdd_validate_context(pHddCtx);
if (0 != ret)
return ret;
if (cds_is_connection_in_progress(
(hdd_context_t *) pAdapter->pHddCtx)) {
if (cds_is_connection_in_progress()) {
hddLog(LOGE, FL("Connection is in progress"));
isBusy = true;
}
@ -879,9 +860,6 @@ static int wlan_hdd_request_remain_on_channel(struct wiphy *wiphy,
cdf_mem_zero(pRemainChanCtx, sizeof(*pRemainChanCtx));
cdf_mem_copy(&pRemainChanCtx->chan, chan,
sizeof(struct ieee80211_channel));
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0))
pRemainChanCtx->chan_type = channel_type;
#endif
pRemainChanCtx->duration = duration;
pRemainChanCtx->dev = dev;
*cookie = (uintptr_t) pRemainChanCtx;
@ -955,21 +933,11 @@ static int wlan_hdd_request_remain_on_channel(struct wiphy *wiphy,
}
int __wlan_hdd_cfg80211_remain_on_channel(struct wiphy *wiphy,
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
struct wireless_dev *wdev,
#else
struct net_device *dev,
#endif
struct ieee80211_channel *chan,
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0))
enum nl80211_channel_type
channel_type,
#endif
unsigned int duration, u64 *cookie)
{
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
struct net_device *dev = wdev->netdev;
#endif
hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
hdd_context_t *hdd_ctx;
int ret;
@ -981,7 +949,7 @@ int __wlan_hdd_cfg80211_remain_on_channel(struct wiphy *wiphy,
if (0 != ret)
return ret;
if (CDF_FTM_MODE == hdd_get_conparam()) {
if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
hddLog(LOGE, FL("Command not allowed in FTM mode"));
return -EINVAL;
}
@ -989,10 +957,8 @@ int __wlan_hdd_cfg80211_remain_on_channel(struct wiphy *wiphy,
MTRACE(cdf_trace(CDF_MODULE_ID_HDD,
TRACE_CODE_HDD_REMAIN_ON_CHANNEL,
pAdapter->sessionId, REMAIN_ON_CHANNEL_REQUEST));
ret = wlan_hdd_request_remain_on_channel(wiphy, dev, chan,
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0))
channel_type,
#endif
duration, cookie,
REMAIN_ON_CHANNEL_REQUEST);
EXIT();
@ -1000,30 +966,16 @@ int __wlan_hdd_cfg80211_remain_on_channel(struct wiphy *wiphy,
}
int wlan_hdd_cfg80211_remain_on_channel(struct wiphy *wiphy,
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
struct wireless_dev *wdev,
#else
struct net_device *dev,
#endif
struct ieee80211_channel *chan,
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0))
enum nl80211_channel_type channel_type,
#endif
unsigned int duration, u64 *cookie)
{
int ret;
cds_ssr_protect(__func__);
ret = __wlan_hdd_cfg80211_remain_on_channel(wiphy,
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
wdev,
#else
dev,
#endif
chan,
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0))
channel_type,
#endif
duration, cookie);
cds_ssr_unprotect(__func__);
@ -1073,19 +1025,11 @@ void hdd_remain_chan_ready_handler(hdd_adapter_t *pAdapter,
if (REMAIN_ON_CHANNEL_REQUEST ==
pRemainChanCtx->rem_on_chan_request) {
cfg80211_ready_on_channel(
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
pAdapter->dev->
ieee80211_ptr,
#else
pAdapter->dev,
#endif
(uintptr_t)
pRemainChanCtx,
&pRemainChanCtx->chan,
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0))
pRemainChanCtx->
chan_type,
#endif
pRemainChanCtx->
duration, GFP_KERNEL);
} else if (OFF_CHANNEL_ACTION_TX ==
@ -1109,7 +1053,7 @@ void hdd_remain_chan_ready_handler(hdd_adapter_t *pAdapter,
pRemainChanCtx->action_pkt_buff.frame_ptr,
pRemainChanCtx->action_pkt_buff.frame_length,
NL80211_RXMGMT_FLAG_ANSWERED, GFP_ATOMIC);
#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
#else
cfg80211_rx_mgmt(pAdapter->dev->ieee80211_ptr,
pRemainChanCtx->action_pkt_buff.freq,
0,
@ -1117,21 +1061,6 @@ void hdd_remain_chan_ready_handler(hdd_adapter_t *pAdapter,
frame_ptr,
pRemainChanCtx->action_pkt_buff.
frame_length, GFP_ATOMIC);
#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0))
cfg80211_rx_mgmt(pAdapter->dev,
pRemainChanCtx->action_pkt_buff.freq,
0,
pRemainChanCtx->action_pkt_buff.
frame_ptr,
pRemainChanCtx->action_pkt_buff.
frame_length, GFP_ATOMIC);
#else
cfg80211_rx_mgmt(pAdapter->dev,
pRemainChanCtx->action_pkt_buff.freq,
pRemainChanCtx->action_pkt_buff.
frame_ptr,
pRemainChanCtx->action_pkt_buff.
frame_length, GFP_ATOMIC);
#endif /* LINUX_VERSION_CODE */
cdf_mem_free(pRemainChanCtx->action_pkt_buff.frame_ptr);
@ -1149,16 +1078,10 @@ void hdd_remain_chan_ready_handler(hdd_adapter_t *pAdapter,
}
int __wlan_hdd_cfg80211_cancel_remain_on_channel(struct wiphy *wiphy,
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
struct wireless_dev *wdev,
#else
struct net_device *dev,
#endif
u64 cookie)
{
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
struct net_device *dev = wdev->netdev;
#endif
hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
hdd_cfg80211_state_t *cfgState = WLAN_HDD_GET_CFG_STATE_PTR(pAdapter);
hdd_remain_on_chan_ctx_t *pRemainChanCtx;
@ -1170,7 +1093,7 @@ int __wlan_hdd_cfg80211_cancel_remain_on_channel(struct wiphy *wiphy,
ENTER();
if (CDF_FTM_MODE == hdd_get_conparam()) {
if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
hddLog(LOGE, FL("Command not allowed in FTM mode"));
return -EINVAL;
}
@ -1243,9 +1166,9 @@ int __wlan_hdd_cfg80211_cancel_remain_on_channel(struct wiphy *wiphy,
"%s: timeout waiting for remain on channel ready indication",
__func__);
if (pHddCtx->isLogpInProgress) {
CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
"%s: LOGP in Progress. Ignore!!!", __func__);
if (cds_is_driver_recovering()) {
hdd_err("Recovery in Progress. State: 0x%x Ignore!!!",
cds_get_driver_state());
return -EAGAIN;
}
}
@ -1294,56 +1217,27 @@ int __wlan_hdd_cfg80211_cancel_remain_on_channel(struct wiphy *wiphy,
}
int wlan_hdd_cfg80211_cancel_remain_on_channel(struct wiphy *wiphy,
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
struct wireless_dev *wdev,
#else
struct net_device *dev,
#endif
u64 cookie)
{
int ret;
cds_ssr_protect(__func__);
ret = __wlan_hdd_cfg80211_cancel_remain_on_channel(wiphy,
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
wdev,
#else
dev,
#endif
cookie);
cds_ssr_unprotect(__func__);
return ret;
}
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
int __wlan_hdd_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
struct ieee80211_channel *chan, bool offchan,
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0))
enum nl80211_channel_type channel_type,
bool channel_type_valid,
#endif
unsigned int wait,
const u8 *buf, size_t len, bool no_cck,
bool dont_wait_for_ack, u64 *cookie)
#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 3, 0))
int __wlan_hdd_mgmt_tx(struct wiphy *wiphy, struct net_device *dev,
struct ieee80211_channel *chan, bool offchan,
enum nl80211_channel_type channel_type,
bool channel_type_valid, unsigned int wait,
const u8 *buf, size_t len, bool no_cck,
bool dont_wait_for_ack, u64 *cookie)
#else
int __wlan_hdd_mgmt_tx(struct wiphy *wiphy, struct net_device *dev,
struct ieee80211_channel *chan, bool offchan,
enum nl80211_channel_type channel_type,
bool channel_type_valid, unsigned int wait,
const u8 *buf, size_t len, u64 *cookie)
#endif /* LINUX_VERSION_CODE */
{
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
struct net_device *dev = wdev->netdev;
#endif
hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
hdd_cfg80211_state_t *cfgState = WLAN_HDD_GET_CFG_STATE_PTR(pAdapter);
hdd_remain_on_chan_ctx_t *pRemainChanCtx;
@ -1360,7 +1254,7 @@ int __wlan_hdd_mgmt_tx(struct wiphy *wiphy, struct net_device *dev,
ENTER();
if (CDF_FTM_MODE == hdd_get_conparam()) {
if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
hddLog(LOGE, FL("Command not allowed in FTM mode"));
return -EINVAL;
}
@ -1413,9 +1307,7 @@ int __wlan_hdd_mgmt_tx(struct wiphy *wiphy, struct net_device *dev,
}
#endif
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 3, 0))
noack = dont_wait_for_ack;
#endif
/* If the wait is coming as 0 with off channel set */
/* then set the wait to 200 ms */
@ -1582,9 +1474,6 @@ int __wlan_hdd_mgmt_tx(struct wiphy *wiphy, struct net_device *dev,
INIT_COMPLETION(pAdapter->offchannel_tx_event);
status = wlan_hdd_request_remain_on_channel(wiphy, dev, chan,
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0))
channel_type,
#endif
wait, cookie,
req_type);
if (0 != status) {
@ -1654,6 +1543,8 @@ send_frame:
current_freq = 0;
}
INIT_COMPLETION(pAdapter->tx_action_cnf_event);
if ((WLAN_HDD_INFRA_STATION == pAdapter->device_mode) ||
(WLAN_HDD_P2P_CLIENT == pAdapter->device_mode) ||
(WLAN_HDD_P2P_DEVICE == pAdapter->device_mode)
@ -1713,11 +1604,7 @@ err:
err_rem_channel:
*cookie = (uintptr_t) cfgState;
cfg80211_mgmt_tx_status(
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
pAdapter->dev->ieee80211_ptr,
#else
pAdapter->dev,
#endif
*cookie, buf, len, false, GFP_KERNEL);
EXIT();
return 0;
@ -1726,29 +1613,12 @@ err_rem_channel:
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0))
int wlan_hdd_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
struct cfg80211_mgmt_tx_params *params, u64 *cookie)
#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
#else
int wlan_hdd_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
struct ieee80211_channel *chan, bool offchan,
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0))
enum nl80211_channel_type channel_type,
bool channel_type_valid,
#endif
unsigned int wait,
const u8 *buf, size_t len, bool no_cck,
bool dont_wait_for_ack, u64 *cookie)
#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 3, 0))
int wlan_hdd_mgmt_tx(struct wiphy *wiphy, struct net_device *dev,
struct ieee80211_channel *chan, bool offchan,
enum nl80211_channel_type channel_type,
bool channel_type_valid, unsigned int wait,
const u8 *buf, size_t len, bool no_cck,
bool dont_wait_for_ack, u64 *cookie)
#else
int wlan_hdd_mgmt_tx(struct wiphy *wiphy, struct net_device *dev,
struct ieee80211_channel *chan, bool offchan,
enum nl80211_channel_type channel_type,
bool channel_type_valid, unsigned int wait,
const u8 *buf, size_t len, u64 *cookie)
#endif /* LINUX_VERSION_CODE */
{
int ret;
@ -1760,43 +1630,23 @@ int wlan_hdd_mgmt_tx(struct wiphy *wiphy, struct net_device *dev,
params->wait, params->buf, params->len,
params->no_cck, params->dont_wait_for_ack,
cookie);
#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
#else
ret = __wlan_hdd_mgmt_tx(wiphy, wdev, chan, offchan,
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0))
channel_type, channel_type_valid,
#endif
wait, buf, len, no_cck,
dont_wait_for_ack, cookie);
#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 3, 0))
ret = __wlan_hdd_mgmt_tx(wiphy, dev, chan, offchan,
channel_type, channel_type_valid, wait,
buf, len, no_cck, dont_wait_for_ack, cookie);
#else
ret = __wlan_hdd_mgmt_tx(wiphy, dev, chan, offchan,
channel_type, channel_type_valid, wait,
buf, len, cookie);
#endif /* LINUX_VERSION_CODE */
cds_ssr_unprotect(__func__);
return ret;
}
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
int __wlan_hdd_cfg80211_mgmt_tx_cancel_wait(struct wiphy *wiphy,
struct wireless_dev *wdev,
u64 cookie)
{
return wlan_hdd_cfg80211_cancel_remain_on_channel(wiphy, wdev, cookie);
}
#else
int __wlan_hdd_cfg80211_mgmt_tx_cancel_wait(struct wiphy *wiphy,
struct net_device *dev, u64 cookie)
{
return wlan_hdd_cfg80211_cancel_remain_on_channel(wiphy, dev, cookie);
}
#endif
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
int wlan_hdd_cfg80211_mgmt_tx_cancel_wait(struct wiphy *wiphy,
struct wireless_dev *wdev, u64 cookie)
{
@ -1808,19 +1658,6 @@ int wlan_hdd_cfg80211_mgmt_tx_cancel_wait(struct wiphy *wiphy,
return ret;
}
#else
int wlan_hdd_cfg80211_mgmt_tx_cancel_wait(struct wiphy *wiphy,
struct net_device *dev, u64 cookie)
{
int ret;
cds_ssr_protect(__func__);
ret = __wlan_hdd_cfg80211_mgmt_tx_cancel_wait(wiphy, dev, cookie);
cds_ssr_unprotect(__func__);
return ret;
}
#endif
void hdd_send_action_cnf(hdd_adapter_t *pAdapter, bool actionSendSuccess)
{
@ -1842,11 +1679,7 @@ void hdd_send_action_cnf(hdd_adapter_t *pAdapter, bool actionSendSuccess)
* data while sending tx ack status.
* */
cfg80211_mgmt_tx_status(
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
pAdapter->dev->ieee80211_ptr,
#else
pAdapter->dev,
#endif
cfgState->action_cookie,
cfgState->buf, cfgState->len,
actionSendSuccess, GFP_KERNEL);
@ -2104,24 +1937,11 @@ static uint8_t wlan_hdd_get_session_type(enum nl80211_iftype type)
return sessionType;
}
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 7, 0))
struct wireless_dev *__wlan_hdd_add_virtual_intf(struct wiphy *wiphy,
const char *name,
enum nl80211_iftype type,
u32 *flags,
struct vif_params *params)
#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
struct wireless_dev *__wlan_hdd_add_virtual_intf(struct wiphy *wiphy,
char *name,
enum nl80211_iftype type,
u32 *flags,
struct vif_params *params)
#else
struct net_device *__wlan_hdd_add_virtual_intf(struct wiphy *wiphy, char *name,
enum nl80211_iftype type,
u32 *flags,
struct vif_params *params)
#endif
{
hdd_context_t *pHddCtx = (hdd_context_t *) wiphy_priv(wiphy);
hdd_adapter_t *pAdapter = NULL;
@ -2131,7 +1951,7 @@ struct net_device *__wlan_hdd_add_virtual_intf(struct wiphy *wiphy, char *name,
ENTER();
if (CDF_FTM_MODE == hdd_get_conparam()) {
if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
hddLog(LOGE, FL("Command not allowed in FTM mode"));
return ERR_PTR(-EINVAL);
}
@ -2202,14 +2022,9 @@ struct net_device *__wlan_hdd_add_virtual_intf(struct wiphy *wiphy, char *name,
return ERR_PTR(-ENOSPC);
}
EXIT();
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
return pAdapter->dev->ieee80211_ptr;
#else
return pAdapter->dev;
#endif
}
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 7, 0))
struct wireless_dev *wlan_hdd_add_virtual_intf(struct wiphy *wiphy,
const char *name,
enum nl80211_iftype type,
@ -2223,49 +2038,16 @@ struct wireless_dev *wlan_hdd_add_virtual_intf(struct wiphy *wiphy,
cds_ssr_unprotect(__func__);
return wdev;
}
#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
struct wireless_dev *wlan_hdd_add_virtual_intf(struct wiphy *wiphy, char *name,
enum nl80211_iftype type,
u32 *flags,
struct vif_params *params)
{
struct wireless_dev *wdev;
cds_ssr_protect(__func__);
wdev = __wlan_hdd_add_virtual_intf(wiphy, name, type, flags, params);
cds_ssr_unprotect(__func__);
return wdev;
}
#else
struct net_device *wlan_hdd_add_virtual_intf(struct wiphy *wiphy, char *name,
enum nl80211_iftype type,
u32 *flags,
struct vif_params *params)
{
struct net_device *ndev;
cds_ssr_protect(__func__);
ndev = __wlan_hdd_add_virtual_intf(wiphy, name, type, flags, params);
cds_ssr_unprotect(__func__);
return ndev;
}
#endif
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
int __wlan_hdd_del_virtual_intf(struct wiphy *wiphy, struct wireless_dev *wdev)
#else
int __wlan_hdd_del_virtual_intf(struct wiphy *wiphy, struct net_device *dev)
#endif
{
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
struct net_device *dev = wdev->netdev;
#endif
hdd_context_t *pHddCtx = (hdd_context_t *) wiphy_priv(wiphy);
hdd_adapter_t *pVirtAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
int status;
ENTER();
if (CDF_FTM_MODE == hdd_get_conparam()) {
if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
hddLog(LOGE, FL("Command not allowed in FTM mode"));
return -EINVAL;
}
@ -2291,26 +2073,18 @@ int __wlan_hdd_del_virtual_intf(struct wiphy *wiphy, struct net_device *dev)
return 0;
}
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
int wlan_hdd_del_virtual_intf(struct wiphy *wiphy, struct wireless_dev *wdev)
#else
int wlan_hdd_del_virtual_intf(struct wiphy *wiphy, struct net_device *dev)
#endif
{
int ret;
cds_ssr_protect(__func__);
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
ret = __wlan_hdd_del_virtual_intf(wiphy, wdev);
#else
ret = __wlan_hdd_del_virtual_intf(wiphy, dev);
#endif
cds_ssr_unprotect(__func__);
return ret;
}
void hdd_indicate_mgmt_frame(hdd_adapter_t *pAdapter,
void __hdd_indicate_mgmt_frame(hdd_adapter_t *pAdapter,
uint32_t nFrameLength,
uint8_t *pbFrames,
uint8_t frameType, uint32_t rxChan, int8_t rxRssi)
@ -2614,14 +2388,8 @@ void hdd_indicate_mgmt_frame(hdd_adapter_t *pAdapter,
cfg80211_rx_mgmt(pAdapter->dev->ieee80211_ptr, freq, 0, pbFrames,
nFrameLength, NL80211_RXMGMT_FLAG_ANSWERED,
GFP_ATOMIC);
#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
cfg80211_rx_mgmt(pAdapter->dev->ieee80211_ptr, freq, 0,
pbFrames, nFrameLength, GFP_ATOMIC);
#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 4, 0))
cfg80211_rx_mgmt(pAdapter->dev, freq, 0,
pbFrames, nFrameLength, GFP_ATOMIC);
#else
cfg80211_rx_mgmt(pAdapter->dev, freq,
cfg80211_rx_mgmt(pAdapter->dev->ieee80211_ptr, freq, 0,
pbFrames, nFrameLength, GFP_ATOMIC);
#endif /* LINUX_VERSION_CODE */
}

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2012-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -387,8 +387,8 @@ static void hdd_conf_ns_offload(hdd_adapter_t *pAdapter, bool fenable)
}
offLoadRequest.offloadType = SIR_IPV6_NS_OFFLOAD;
offLoadRequest.enableOrDisable = SIR_OFFLOAD_ENABLE;
cdf_mem_copy(&offLoadRequest.nsOffloadInfo.selfMacAddr,
&pAdapter->macAddressCurrent.bytes, SIR_MAC_ADDR_LEN);
cdf_copy_macaddr(&offLoadRequest.nsOffloadInfo.self_macaddr,
&pAdapter->macAddressCurrent);
/* set number of ns offload address count */
offLoadRequest.num_ns_offload_count = count;
/* Configure the Firmware with this */
@ -511,16 +511,19 @@ void hdd_conf_hostoffload(hdd_adapter_t *pAdapter, bool fenable)
hdd_conf_gtk_offload(pAdapter, fenable);
/* Configure ARP/NS offload during cfg80211 suspend/resume only
* if active mode offload is disabled
/* Configure ARP/NS offload during cfg80211 suspend/resume and
* Enable MC address filtering during cfg80211 suspend
* only if active mode offload is disabled
*/
if (!pHddCtx->config->active_mode_offload) {
hdd_info("configuring unconfigured active mode offloads");
hdd_conf_arp_offload(pAdapter, fenable);
wlan_hdd_set_mc_addr_list(pAdapter, fenable);
if (pHddCtx->config->fhostNSOffload)
hdd_conf_ns_offload(pAdapter, fenable);
}
EXIT();
EXIT();
return;
}
#endif
@ -966,6 +969,23 @@ void wlan_hdd_set_mc_addr_list(hdd_adapter_t *pAdapter, uint8_t set)
}
#endif
/**
* hdd_update_mcastbcast_filter(): cache multi and broadcast filter for suspend
* @hdd_ctx: hdd context
*
* Cache the configured filter to be used in suspend resume.
*/
static void hdd_update_mcastbcast_filter(hdd_context_t *hdd_ctx)
{
if (false == hdd_ctx->sus_res_mcastbcast_filter_valid) {
hdd_ctx->sus_res_mcastbcast_filter =
hdd_ctx->configuredMcastBcastFilter;
hdd_ctx->sus_res_mcastbcast_filter_valid = true;
hdd_info("configuredMCastBcastFilter saved = %d",
hdd_ctx->configuredMcastBcastFilter);
}
}
/**
* hdd_conf_suspend_ind() - Send Suspend notification
* @pHddCtx: HDD Global context
@ -975,69 +995,26 @@ void wlan_hdd_set_mc_addr_list(hdd_adapter_t *pAdapter, uint8_t set)
*
* Return: None.
*/
static void hdd_conf_suspend_ind(hdd_context_t *pHddCtx,
hdd_adapter_t *pAdapter,
static void hdd_send_suspend_ind(hdd_context_t *pHddCtx,
uint32_t conn_state_mask,
void (*callback)(void *callbackContext,
bool suspended),
void *callbackContext)
{
CDF_STATUS cdf_ret_status = CDF_STATUS_E_FAILURE;
tpSirWlanSuspendParam wlanSuspendParam =
cdf_mem_malloc(sizeof(tSirWlanSuspendParam));
if (false == pHddCtx->sus_res_mcastbcast_filter_valid) {
pHddCtx->sus_res_mcastbcast_filter =
pHddCtx->configuredMcastBcastFilter;
pHddCtx->sus_res_mcastbcast_filter_valid = true;
hddLog(CDF_TRACE_LEVEL_INFO, "offload: hdd_conf_suspend_ind");
hddLog(CDF_TRACE_LEVEL_INFO,
"configuredMCastBcastFilter saved = %d",
pHddCtx->configuredMcastBcastFilter);
hdd_info("%s: send wlan suspend indication", __func__);
}
if (NULL == wlanSuspendParam) {
hddLog(CDF_TRACE_LEVEL_FATAL,
"%s: cdf_mem_alloc failed ", __func__);
return;
}
hddLog(CDF_TRACE_LEVEL_INFO,
"%s: send wlan suspend indication", __func__);
/* Configure supported OffLoads */
hdd_conf_hostoffload(pAdapter, true);
wlanSuspendParam->configuredMcstBcstFilterSetting =
pHddCtx->configuredMcastBcastFilter;
/* Enable MC address filtering during cfg80211 suspend if active mode
* mode offload is disabled in INI
*/
if (!pHddCtx->config->active_mode_offload) {
hdd_info("enable mc address filtering");
wlan_hdd_set_mc_addr_list(pAdapter, true);
}
if ((eConnectionState_Associated ==
(WLAN_HDD_GET_STATION_CTX_PTR(pAdapter))->conn_info.connState) ||
(eConnectionState_IbssConnected ==
(WLAN_HDD_GET_STATION_CTX_PTR(pAdapter))->conn_info.connState))
wlanSuspendParam->connectedState = true;
else
wlanSuspendParam->connectedState = false;
wlanSuspendParam->sessionId = pAdapter->sessionId;
cdf_ret_status =
sme_configure_suspend_ind(pHddCtx->hHal, wlanSuspendParam,
sme_configure_suspend_ind(pHddCtx->hHal, conn_state_mask,
callback, callbackContext);
if (CDF_STATUS_SUCCESS == cdf_ret_status) {
pHddCtx->hdd_mcastbcast_filter_set = true;
} else {
hddLog(CDF_TRACE_LEVEL_ERROR,
FL("sme_configure_suspend_ind returned failure %d"),
cdf_ret_status);
cdf_mem_free(wlanSuspendParam);
}
}
@ -1077,14 +1054,27 @@ static void hdd_conf_resume_ind(hdd_adapter_t *pAdapter)
"offload: in hdd_conf_resume_ind, restoring configuredMcastBcastFilter");
hddLog(CDF_TRACE_LEVEL_INFO, "configuredMcastBcastFilter = %d",
pHddCtx->configuredMcastBcastFilter);
}
/* Disable MC address filtering during cfg80211 suspend if active mode
* mode offload is disabled in INI
*/
if (!pHddCtx->config->active_mode_offload) {
hdd_info("disable mc address filtering");
wlan_hdd_set_mc_addr_list(pAdapter, false);
}
/**
* hdd_update_conn_state_mask(): record info needed by wma_suspend_req
* @adapter: adapter to get info from
* @conn_state_mask: mask of connection info
*
* currently only need to send connection info.
*/
static void
hdd_update_conn_state_mask(hdd_adapter_t *adapter, uint32_t *conn_state_mask)
{
eConnectionState connState;
hdd_station_ctx_t *sta_ctx;
sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter);
connState = sta_ctx->conn_info.connState;
if (connState == eConnectionState_Associated ||
connState == eConnectionState_IbssConnected)
*conn_state_mask |= (1 << adapter->sessionId);
}
/**
@ -1103,9 +1093,9 @@ hdd_suspend_wlan(void (*callback)(void *callbackContext, bool suspended),
CDF_STATUS status;
hdd_adapter_t *pAdapter = NULL;
hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL;
uint32_t conn_state_mask = 0;
hddLog(CDF_TRACE_LEVEL_INFO, "%s: WLAN being suspended by OS",
__func__);
hdd_info("%s: WLAN being suspended by OS", __func__);
pHddCtx = cds_get_context(CDF_MODULE_ID_HDD);
if (!pHddCtx) {
@ -1114,12 +1104,14 @@ hdd_suspend_wlan(void (*callback)(void *callbackContext, bool suspended),
return;
}
if (pHddCtx->isLogpInProgress) {
hddLog(CDF_TRACE_LEVEL_ERROR,
"%s: Ignore suspend wlan, LOGP in progress!", __func__);
if (cds_is_driver_recovering()) {
hdd_err("Recovery in Progress. State: 0x%x Ignore suspend!!!",
cds_get_driver_state());
return;
}
hdd_update_mcastbcast_filter(pHddCtx);
status = hdd_get_front_adapter(pHddCtx, &pAdapterNode);
while (NULL != pAdapterNode && CDF_STATUS_SUCCESS == status) {
pAdapter = pAdapterNode->pAdapter;
@ -1129,20 +1121,19 @@ hdd_suspend_wlan(void (*callback)(void *callbackContext, bool suspended),
wlan_hdd_netif_queue_control(pAdapter, WLAN_NETIF_TX_DISABLE,
WLAN_CONTROL_PATH);
/* Send suspend notification down to firmware.
*
* N.B.: Keep this suspend indication at the end
* (before processing next adaptor). This indication
* is considered as trigger point to start WOW (if wow
* is enabled).
*/
hdd_conf_suspend_ind(pHddCtx, pAdapter, callback,
callbackContext);
/* Configure supported OffLoads */
hdd_conf_hostoffload(pAdapter, true);
hdd_update_conn_state_mask(pAdapter, &conn_state_mask);
status = hdd_get_next_adapter(pHddCtx, pAdapterNode, &pNext);
pAdapterNode = pNext;
}
hdd_send_suspend_ind(pHddCtx, conn_state_mask, callback,
callbackContext);
pHddCtx->hdd_wlan_suspended = true;
return;
@ -1170,9 +1161,9 @@ static void hdd_resume_wlan(void)
return;
}
if (pHddCtx->isLogpInProgress) {
hddLog(CDF_TRACE_LEVEL_INFO,
"%s: Ignore resume wlan, LOGP in progress!", __func__);
if (cds_is_driver_recovering()) {
hdd_warn("Recovery in Progress. State: 0x%x Ignore resume!!!",
cds_get_driver_state());
return;
}
@ -1304,8 +1295,7 @@ CDF_STATUS hdd_wlan_shutdown(void)
return CDF_STATUS_E_FAILURE;
}
pHddCtx->isLogpInProgress = true;
cds_set_logp_in_progress(true);
cds_set_recovery_in_progress(true);
cds_clear_concurrent_session_count();
@ -1448,7 +1438,7 @@ CDF_STATUS hdd_wlan_re_init(void *hif_sc)
hdd_set_conparam(0);
/* Re-open CDS, it is a re-open b'se control transport was never closed. */
cdf_status = cds_open(&p_cds_context, 0);
cdf_status = cds_open();
if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {
hddLog(CDF_TRACE_LEVEL_FATAL, "%s: cds_open failed", __func__);
goto err_re_init;
@ -1462,18 +1452,21 @@ CDF_STATUS hdd_wlan_re_init(void *hif_sc)
goto err_cds_close;
}
/* Set the SME configuration parameters. */
cdf_status = hdd_set_sme_config(pHddCtx);
if (CDF_STATUS_SUCCESS != cdf_status) {
hddLog(CDF_TRACE_LEVEL_FATAL, "%s: Failed hdd_set_sme_config",
__func__);
cdf_status = cds_pre_enable(pHddCtx->pcds_context);
if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {
hdd_alert("cds_pre_enable failed");
goto err_cds_close;
}
cdf_status = cds_pre_enable(pHddCtx->pcds_context);
if (!CDF_IS_STATUS_SUCCESS(cdf_status)) {
hddLog(CDF_TRACE_LEVEL_FATAL, "%s: cds_pre_enable failed",
__func__);
/*
* Note that the cds_pre_enable() sequence triggers the cfg download.
* The cfg download must occur before we update the SME config
* since the SME config operation must access the cfg database.
* Set the SME configuration parameters.
*/
cdf_status = hdd_set_sme_config(pHddCtx);
if (CDF_STATUS_SUCCESS != cdf_status) {
hdd_alert("Failed hdd_set_sme_config");
goto err_cds_close;
}
@ -1638,9 +1631,8 @@ err_cds_close:
wiphy_unregister(pHddCtx->wiphy);
wiphy_free(pHddCtx->wiphy);
if (!CDF_IS_STATUS_SUCCESS(cdf_mutex_destroy(
&pHddCtx->hdd_conc_list_lock))) {
hdd_err("Failed to destroy hdd_conc_list_lock");
if (!CDF_IS_STATUS_SUCCESS(cds_deinit_policy_mgr())) {
hdd_err("Failed to deinit policy manager");
/* Proceed and complete the clean up */
}
}
@ -1652,7 +1644,6 @@ err_re_init:
return -EPERM;
success:
pHddCtx->isLogpInProgress = false;
return CDF_STATUS_SUCCESS;
}
@ -1738,7 +1729,7 @@ static int __wlan_hdd_cfg80211_resume_wlan(struct wiphy *wiphy)
ENTER();
if (CDF_FTM_MODE == hdd_get_conparam()) {
if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
hddLog(LOGE, FL("Command not allowed in FTM mode"));
return -EINVAL;
}
@ -1767,16 +1758,16 @@ static int __wlan_hdd_cfg80211_resume_wlan(struct wiphy *wiphy)
MTRACE(cdf_trace(CDF_MODULE_ID_HDD,
TRACE_CODE_HDD_CFG80211_RESUME_WLAN,
NO_SESSION, pHddCtx->isWiphySuspended));
spin_lock(&pHddCtx->schedScan_lock);
cdf_spin_lock(&pHddCtx->sched_scan_lock);
pHddCtx->isWiphySuspended = false;
if (true != pHddCtx->isSchedScanUpdatePending) {
spin_unlock(&pHddCtx->schedScan_lock);
cdf_spin_unlock(&pHddCtx->sched_scan_lock);
hddLog(LOG1, FL("Return resume is not due to PNO indication"));
return 0;
}
/* Reset flag to avoid updatating cfg80211 data old results again */
pHddCtx->isSchedScanUpdatePending = false;
spin_unlock(&pHddCtx->schedScan_lock);
cdf_spin_unlock(&pHddCtx->sched_scan_lock);
status = hdd_get_front_adapter(pHddCtx, &pAdapterNode);
@ -1874,7 +1865,7 @@ static int __wlan_hdd_cfg80211_suspend_wlan(struct wiphy *wiphy,
ENTER();
if (CDF_FTM_MODE == hdd_get_conparam()) {
if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
hddLog(LOGE, FL("Command not allowed in FTM mode"));
return -EINVAL;
}
@ -2094,7 +2085,7 @@ static int __wlan_hdd_cfg80211_set_power_mgmt(struct wiphy *wiphy,
ENTER();
if (CDF_FTM_MODE == hdd_get_conparam()) {
if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
hddLog(LOGE, FL("Command not allowed in FTM mode"));
return -EINVAL;
}
@ -2175,9 +2166,7 @@ int wlan_hdd_cfg80211_set_power_mgmt(struct wiphy *wiphy,
* Return: 0 for success, non-zero for failure
*/
static int __wlan_hdd_cfg80211_set_txpower(struct wiphy *wiphy,
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
struct wireless_dev *wdev,
#endif
enum nl80211_tx_power_setting type,
int dbm)
{
@ -2189,7 +2178,7 @@ static int __wlan_hdd_cfg80211_set_txpower(struct wiphy *wiphy,
ENTER();
if (CDF_FTM_MODE == hdd_get_conparam()) {
if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
hddLog(LOGE, FL("Command not allowed in FTM mode"));
return -EINVAL;
}
@ -2248,18 +2237,14 @@ static int __wlan_hdd_cfg80211_set_txpower(struct wiphy *wiphy,
* Return: 0 for success, non-zero for failure
*/
int wlan_hdd_cfg80211_set_txpower(struct wiphy *wiphy,
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
struct wireless_dev *wdev,
#endif
enum nl80211_tx_power_setting type,
int dbm)
{
int ret;
cds_ssr_protect(__func__);
ret = __wlan_hdd_cfg80211_set_txpower(wiphy,
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
wdev,
#endif
type, dbm);
cds_ssr_unprotect(__func__);
@ -2275,9 +2260,7 @@ int wlan_hdd_cfg80211_set_txpower(struct wiphy *wiphy,
* Return: 0 for success, non-zero for failure
*/
static int __wlan_hdd_cfg80211_get_txpower(struct wiphy *wiphy,
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
struct wireless_dev *wdev,
#endif
int *dbm)
{
@ -2287,7 +2270,7 @@ static int __wlan_hdd_cfg80211_get_txpower(struct wiphy *wiphy,
ENTER();
if (CDF_FTM_MODE == hdd_get_conparam()) {
if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
hddLog(LOGE, FL("Command not allowed in FTM mode"));
return -EINVAL;
}
@ -2327,18 +2310,14 @@ static int __wlan_hdd_cfg80211_get_txpower(struct wiphy *wiphy,
* Return: 0 for success, error number on failure.
*/
int wlan_hdd_cfg80211_get_txpower(struct wiphy *wiphy,
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0) || defined(WITH_BACKPORTS)
struct wireless_dev *wdev,
#endif
int *dbm)
{
int ret;
cds_ssr_protect(__func__);
ret = __wlan_hdd_cfg80211_get_txpower(wiphy,
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0) || defined(WITH_BACKPORTS)
wdev,
#endif
dbm);
cds_ssr_unprotect(__func__);

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2012-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -1014,6 +1014,7 @@ static void hdd_vendor_scan_callback(hdd_adapter_t *adapter,
if (WLAN_HDD_ADAPTER_MAGIC != adapter->magic) {
hdd_err("Invalid adapter magic");
cdf_mem_free(req);
return;
}
skb = cfg80211_vendor_event_alloc(hddctx->wiphy, NULL,
@ -1023,6 +1024,7 @@ static void hdd_vendor_scan_callback(hdd_adapter_t *adapter,
if (!skb) {
hdd_err("skb alloc failed");
cdf_mem_free(req);
return;
}
@ -1067,10 +1069,12 @@ static void hdd_vendor_scan_callback(hdd_adapter_t *adapter,
goto nla_put_failure;
cfg80211_vendor_event(skb, GFP_KERNEL);
cdf_mem_free(req);
return;
nla_put_failure:
kfree_skb(skb);
cdf_mem_free(req);
return;
}
@ -1223,15 +1227,10 @@ static void wlan_hdd_cfg80211_scan_block_cb(struct work_struct *work)
* Return: 0 for success, non zero for failure
*/
static int __wlan_hdd_cfg80211_scan(struct wiphy *wiphy,
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0))
struct net_device *dev,
#endif
struct cfg80211_scan_request *request,
uint8_t source)
{
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 6, 0))
struct net_device *dev = request->wdev->netdev;
#endif
hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
hdd_wext_state_t *pwextBuf = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
@ -1246,7 +1245,7 @@ static int __wlan_hdd_cfg80211_scan(struct wiphy *wiphy,
ENTER();
if (CDF_FTM_MODE == hdd_get_conparam()) {
if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
hddLog(LOGE, FL("Command not allowed in FTM mode"));
return -EINVAL;
}
@ -1328,9 +1327,6 @@ static int __wlan_hdd_cfg80211_scan(struct wiphy *wiphy,
* (return -EBUSY)
*/
status = wlan_hdd_tdls_scan_callback(pAdapter, wiphy,
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0))
dev,
#endif
request);
if (status <= 0) {
if (!status)
@ -1345,7 +1341,7 @@ static int __wlan_hdd_cfg80211_scan(struct wiphy *wiphy,
#endif
/* Check if scan is allowed at this point of time */
if (cds_is_connection_in_progress(pHddCtx)) {
if (cds_is_connection_in_progress()) {
hddLog(LOGE, FL("Scan not allowed"));
return -EBUSY;
}
@ -1598,17 +1594,11 @@ free_mem:
* Return: 0 for success, non zero for failure
*/
int wlan_hdd_cfg80211_scan(struct wiphy *wiphy,
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0))
struct net_device *dev,
#endif
struct cfg80211_scan_request *request)
{
int ret;
cds_ssr_protect(__func__);
ret = __wlan_hdd_cfg80211_scan(wiphy,
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0))
dev,
#endif
request, NL_SCAN);
cds_ssr_unprotect(__func__);
return ret;
@ -1965,15 +1955,15 @@ hdd_sched_scan_callback(void *callbackContext,
return;
}
spin_lock(&pHddCtx->schedScan_lock);
cdf_spin_lock(&pHddCtx->sched_scan_lock);
if (true == pHddCtx->isWiphySuspended) {
pHddCtx->isSchedScanUpdatePending = true;
spin_unlock(&pHddCtx->schedScan_lock);
cdf_spin_unlock(&pHddCtx->sched_scan_lock);
hddLog(LOG1,
FL("Update cfg80211 scan database after it resume"));
return;
}
spin_unlock(&pHddCtx->schedScan_lock);
cdf_spin_unlock(&pHddCtx->sched_scan_lock);
ret = wlan_hdd_cfg80211_update_bss(pHddCtx->wiphy, pAdapter, 0);
@ -2041,7 +2031,7 @@ static int __wlan_hdd_cfg80211_sched_scan_start(struct wiphy *wiphy,
ENTER();
if (CDF_FTM_MODE == hdd_get_conparam()) {
if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
hddLog(LOGE, FL("Command not allowed in FTM mode"));
return -EINVAL;
}
@ -2199,12 +2189,8 @@ static int __wlan_hdd_cfg80211_sched_scan_start(struct wiphy *wiphy,
/*Copying list of valid channel into request */
memcpy(pPnoRequest->aNetworks[i].aChannels, valid_ch, num_ch);
pPnoRequest->aNetworks[i].ucChannelCount = num_ch;
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)
pPnoRequest->aNetworks[i].rssiThreshold =
request->match_sets[i].rssi_thold;
#else
pPnoRequest->aNetworks[i].rssiThreshold = 0; /* Default value */
#endif
}
for (i = 0; i < request->n_ssids; i++) {
@ -2320,7 +2306,7 @@ static int __wlan_hdd_cfg80211_sched_scan_stop(struct wiphy *wiphy,
ENTER();
if (CDF_FTM_MODE == hdd_get_conparam()) {
if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
hddLog(LOGE, FL("Command not allowed in FTM mode"));
return -EINVAL;
}
@ -2332,8 +2318,8 @@ static int __wlan_hdd_cfg80211_sched_scan_stop(struct wiphy *wiphy,
return -ENODEV;
}
/* The return 0 is intentional when isLogpInProgress and
* isLoadUnloadInProgress. We did observe a crash due to a return of
/* The return 0 is intentional when Recovery and Load/Unload in
* progress. We did observe a crash due to a return of
* failure in sched_scan_stop , especially for a case where the unload
* of the happens at the same time. The function __cfg80211_stop_sched_scan
* was clearing rdev->sched_scan_req only when the sched_scan_stop returns
@ -2341,13 +2327,15 @@ static int __wlan_hdd_cfg80211_sched_scan_stop(struct wiphy *wiphy,
* clean up of the second interface will have the dev pointer corresponding
* to the first one leading to a crash.
*/
if (pHddCtx->isLogpInProgress) {
hddLog(LOGE, FL("LOGP in Progress. Ignore!!!"));
if (cds_is_driver_recovering()) {
hdd_err("Recovery in Progress. State: 0x%x Ignore!!!",
cds_get_driver_state());
return ret;
}
if ((pHddCtx->isLoadInProgress) || (pHddCtx->isUnloadInProgress)) {
hddLog(LOGE, FL("Unloading/Loading in Progress. Ignore!!!"));
if (cds_is_load_or_unload_in_progress()) {
hdd_err("Unload/Load in Progress, state: 0x%x. Ignore!!!",
cds_get_driver_state());
return ret;
}

View file

@ -51,9 +51,6 @@ int iw_set_scan(struct net_device *dev, struct iw_request_info *info,
union iwreq_data *wrqu, char *extra);
int wlan_hdd_cfg80211_scan(struct wiphy *wiphy,
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0))
struct net_device *dev,
#endif
struct cfg80211_scan_request *request);
#ifdef FEATURE_WLAN_SCAN_PNO

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2012-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -168,7 +168,6 @@ int hdd_softap_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
sme_ac_enum_type ac = SME_AC_BE;
hdd_adapter_t *pAdapter = (hdd_adapter_t *) netdev_priv(dev);
hdd_ap_ctx_t *pHddApCtx = WLAN_HDD_GET_AP_CTX_PTR(pAdapter);
hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
struct cdf_mac_addr *pDestMacAddress;
uint8_t STAId;
uint8_t proto_type = 0;
@ -181,9 +180,9 @@ int hdd_softap_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
* context may not be reinitialized at this time which may
* lead to a crash.
*/
if (pHddCtx->isLogpInProgress) {
if (cds_is_driver_recovering()) {
CDF_TRACE(CDF_MODULE_ID_HDD_SAP_DATA, CDF_TRACE_LEVEL_INFO_HIGH,
"%s: LOGP in Progress. Ignore!!!", __func__);
"%s: Recovery in Progress. Ignore!!!", __func__);
goto drop_pkt;
}
@ -368,9 +367,9 @@ static void __hdd_softap_tx_timeout(struct net_device *dev)
* recovery here
*/
hdd_ctx = WLAN_HDD_GET_CTX(adapter);
if (hdd_ctx->isLogpInProgress) {
if (cds_is_driver_recovering()) {
CDF_TRACE(CDF_MODULE_ID_HDD_SAP_DATA, CDF_TRACE_LEVEL_ERROR,
"%s: LOGP in Progress. Ignore!!!", __func__);
"%s: Recovery in Progress. Ignore!!!", __func__);
return;
}
}
@ -581,7 +580,7 @@ CDF_STATUS hdd_softap_rx_packet_cbk(void *cds_context,
*/
cdf_net_buf_debug_release_skb(rxBuf);
if (hdd_napi_enabled(HDD_NAPI_ANY))
if (hdd_napi_enabled(HDD_NAPI_ANY) && !pHddCtx->config->enableRxThread)
rxstat = netif_receive_skb(skb);
else
rxstat = netif_rx_ni(skb);
@ -810,10 +809,10 @@ CDF_STATUS hdd_softap_stop_bss(hdd_adapter_t *pAdapter)
/* bss deregister is not allowed during wlan driver loading or
* unloading
*/
if ((pHddCtx->isLoadInProgress) || (pHddCtx->isUnloadInProgress)) {
if (cds_is_load_or_unload_in_progress()) {
CDF_TRACE(CDF_MODULE_ID_HDD_SAP_DATA, CDF_TRACE_LEVEL_ERROR,
"%s:Loading_unloading in Progress. Ignore!!!",
__func__);
"%s: Loading_unloading in Progress, state: 0x%x. Ignore!!!",
__func__, cds_get_driver_state());
return CDF_STATUS_E_PERM;
}

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2012-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -1100,12 +1100,12 @@ static void wlan_hdd_cfg80211_link_layer_stats_callback(void *ctx,
}
/**
* wlan_hdd_cfg80211_link_layer_stats_init() - initialize link layer stats
* hdd_cfg80211_link_layer_stats_init() - Initialize link layer stats
* @pHddCtx: Pointer to hdd context
*
* Return: None
*/
void wlan_hdd_cfg80211_link_layer_stats_init(hdd_context_t *pHddCtx)
void hdd_cfg80211_link_layer_stats_init(hdd_context_t *pHddCtx)
{
sme_set_link_layer_stats_ind_cb(pHddCtx->hHal,
wlan_hdd_cfg80211_link_layer_stats_callback);
@ -1144,7 +1144,7 @@ __wlan_hdd_cfg80211_ll_stats_set(struct wiphy *wiphy,
ENTER();
if (CDF_FTM_MODE == hdd_get_conparam()) {
if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
hdd_err("Command not allowed in FTM mode");
return -EPERM;
}
@ -1270,7 +1270,7 @@ __wlan_hdd_cfg80211_ll_stats_get(struct wiphy *wiphy,
ENTER();
if (CDF_FTM_MODE == hdd_get_conparam()) {
if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
hdd_err("Command not allowed in FTM mode");
return -EPERM;
}
@ -1401,7 +1401,7 @@ __wlan_hdd_cfg80211_ll_stats_clear(struct wiphy *wiphy,
ENTER();
if (CDF_FTM_MODE == hdd_get_conparam()) {
if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
hdd_err("Command not allowed in FTM mode");
return -EPERM;
}
@ -1546,7 +1546,7 @@ static int __wlan_hdd_cfg80211_stats_ext_request(struct wiphy *wiphy,
if (ret_val)
return ret_val;
if (CDF_FTM_MODE == hdd_get_conparam()) {
if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
hdd_err("Command not allowed in FTM mode");
return -EPERM;
}
@ -1723,7 +1723,7 @@ static int __wlan_hdd_cfg80211_get_station(struct wiphy *wiphy,
ENTER();
if (CDF_FTM_MODE == hdd_get_conparam()) {
if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
hddLog(LOGE, FL("Command not allowed in FTM mode"));
return -EINVAL;
}
@ -1753,7 +1753,7 @@ static int __wlan_hdd_cfg80211_get_station(struct wiphy *wiphy,
#ifdef WLAN_FEATURE_LPSS
if (!pAdapter->rssi_send) {
pAdapter->rssi_send = true;
if (pHddCtx->isUnloadInProgress != true)
if (cds_is_driver_unloading())
wlan_hdd_send_status_pkg(pAdapter, pHddStaCtx, 1, 1);
}
#endif
@ -1779,13 +1779,12 @@ static int __wlan_hdd_cfg80211_get_station(struct wiphy *wiphy,
pAdapter->hdd_stats.ClassA_stat.mcs_index = 0;
}
}
#ifdef LINKSPEED_DEBUG_ENABLED
pr_info("RSSI %d, RLMS %u, rate %d, rssi high %d, rssi mid %d, rssi low %d, rate_flags 0x%x, MCS %d\n",
sinfo->signal, pCfg->reportMaxLinkSpeed, myRate,
(int)pCfg->linkSpeedRssiHigh, (int)pCfg->linkSpeedRssiMid,
(int)pCfg->linkSpeedRssiLow, (int)rate_flags,
(int)pAdapter->hdd_stats.ClassA_stat.mcs_index);
#endif /* LINKSPEED_DEBUG_ENABLED */
hdd_info("RSSI %d, RLMS %u, rate %d, rssi high %d, rssi mid %d, rssi low %d, rate_flags 0x%x, MCS %d",
sinfo->signal, pCfg->reportMaxLinkSpeed, myRate,
(int)pCfg->linkSpeedRssiHigh, (int)pCfg->linkSpeedRssiMid,
(int)pCfg->linkSpeedRssiLow, (int)rate_flags,
(int)pAdapter->hdd_stats.ClassA_stat.mcs_index);
if (eHDD_LINK_SPEED_REPORT_ACTUAL != pCfg->reportMaxLinkSpeed) {
/* we do not want to necessarily report the current speed */
@ -2118,6 +2117,13 @@ static int __wlan_hdd_cfg80211_get_station(struct wiphy *wiphy,
#endif /* LINKSPEED_DEBUG_ENABLED */
}
}
if (rate_flags & eHAL_TX_RATE_LEGACY)
hdd_info("Reporting legacy rate %d", sinfo->txrate.legacy);
else
hdd_info("Reporting MCS rate %d flags 0x%x",
sinfo->txrate.mcs, sinfo->txrate.flags);
sinfo->filled |= STATION_INFO_TX_BITRATE;
sinfo->tx_bytes = pAdapter->stats.tx_bytes;
@ -2224,7 +2230,7 @@ static int __wlan_hdd_cfg80211_dump_survey(struct wiphy *wiphy,
ENTER();
if (CDF_FTM_MODE == hdd_get_conparam()) {
if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
hddLog(LOGE, FL("Command not allowed in FTM mode"));
return -EINVAL;
}

View file

@ -90,6 +90,8 @@ struct index_data_rate_type {
*/
#define LL_STATS_EVENT_BUF_SIZE 4096
void hdd_cfg80211_link_layer_stats_init(hdd_context_t *pHddCtx);
/**
* wlan_hdd_cfg80211_ll_stats_set() - set link layer stats
* @wiphy: Pointer to wiphy
@ -134,12 +136,29 @@ int wlan_hdd_cfg80211_ll_stats_clear(struct wiphy *wiphy,
int data_len);
void hdd_init_ll_stats_ctx(void);
static inline bool hdd_link_layer_stats_supported(void)
{
return true;
}
#else
static inline void hdd_cfg80211_link_layer_stats_init(hdd_context_t *pHddCtx)
{
return;
}
static inline void hdd_init_ll_stats_ctx(void)
{
return;
}
static inline bool hdd_link_layer_stats_supported(void)
{
return false;
}
#endif /* End of WLAN_FEATURE_LINK_LAYER_STATS */
#ifdef WLAN_FEATURE_STATS_EXT
@ -156,6 +175,10 @@ int wlan_hdd_cfg80211_stats_ext_request(struct wiphy *wiphy,
struct wireless_dev *wdev,
const void *data,
int data_len);
void wlan_hdd_cfg80211_stats_ext_init(hdd_context_t *pHddCtx);
#else
static inline void wlan_hdd_cfg80211_stats_ext_init(hdd_context_t *pHddCtx) {}
#endif /* End of WLAN_FEATURE_STATS_EXT */
/**

View file

@ -0,0 +1,195 @@
/*
* Copyright (c) 2015 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
*
* 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: wlan_hdd_subnet_detect.c
*
* WLAN Host Device Driver subnet detect API implementation
*/
#include <linux/version.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <net/cfg80211.h>
#include <ani_global.h>
#include "sme_api.h"
#include "wlan_hdd_main.h"
#include "wlan_hdd_subnet_detect.h"
/*
* define short names for the global vendor params
* used by __wlan_hdd_cfg80211_set_gateway_params()
*/
#define PARAM_MAC_ADDR QCA_WLAN_VENDOR_ATTR_GW_PARAM_CONFIG_GW_MAC_ADDR
#define PARAM_IPV4_ADDR QCA_WLAN_VENDOR_ATTR_GW_PARAM_CONFIG_IPV4_ADDR
#define PARAM_IPV6_ADDR QCA_WLAN_VENDOR_ATTR_GW_PARAM_CONFIG_IPV6_ADDR
static const struct nla_policy
policy[QCA_WLAN_VENDOR_ATTR_GW_PARAM_CONFIG_MAX + 1] = {
[PARAM_MAC_ADDR] = {
.type = NLA_BINARY,
.len = CDF_MAC_ADDR_SIZE
},
[PARAM_IPV4_ADDR] = {
.type = NLA_BINARY,
.len = CDF_IPV4_ADDR_SIZE
},
[PARAM_IPV6_ADDR] = {
.type = NLA_BINARY,
.len = CDF_IPV6_ADDR_SIZE
}
};
/**
* __wlan_hdd_cfg80211_set_gateway_params() - set gateway params
* @wiphy: Pointer to wireless phy
* @wdev: Pointer to wireless device
* @data: Pointer to data
* @data_len: Data length
*
* Return: 0 on success, negative errno on failure
*/
static int __wlan_hdd_cfg80211_set_gateway_params(struct wiphy *wiphy,
struct wireless_dev *wdev,
const void *data,
int data_len)
{
struct net_device *dev = wdev->netdev;
hdd_adapter_t *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
hdd_context_t *hdd_ctx = wiphy_priv(wiphy);
struct nlattr *tb[QCA_WLAN_VENDOR_ATTR_GW_PARAM_CONFIG_MAX + 1];
struct gateway_param_update_req req = { 0 };
int ret;
CDF_STATUS status;
ENTER();
ret = wlan_hdd_validate_context(hdd_ctx);
if (0 != ret)
return ret;
/* user may have disabled the feature in INI */
if (!hdd_ctx->config->enable_lfr_subnet_detection) {
hdd_info("LFR Subnet Detection disabled in INI");
return -ENOTSUPP;
}
/* The gateway parameters are only valid in the STA persona
* and only in the connected state.
*/
if (WLAN_HDD_INFRA_STATION != adapter->device_mode) {
hdd_err("Received GW param update for non-STA mode adapter");
return -ENOTSUPP;
}
if (!hdd_conn_is_connected(WLAN_HDD_GET_STATION_CTX_PTR(adapter))) {
hdd_err("Received GW param update in disconnected state!");
return -ENOTSUPP;
}
/* Extract NL parameters
* mac_addr: 6 bytes
* ipv4 addr: 4 bytes
* ipv6 addr: 16 bytes
*/
if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_GW_PARAM_CONFIG_MAX,
data, data_len, policy)) {
hdd_err("Invalid ATTR list");
return -EINVAL;
}
if (!tb[PARAM_MAC_ADDR]) {
hdd_err("request mac addr failed");
return -EINVAL;
}
nla_memcpy(req.gw_mac_addr.bytes, tb[PARAM_MAC_ADDR],
CDF_MAC_ADDR_SIZE);
/* req ipv4_addr_type and ipv6_addr_type are initially false due
* to zeroing the struct
*/
if (tb[PARAM_IPV4_ADDR]) {
nla_memcpy(req.ipv4_addr, tb[PARAM_IPV4_ADDR],
CDF_IPV4_ADDR_SIZE);
req.ipv4_addr_type = true;
}
if (tb[PARAM_IPV6_ADDR]) {
nla_memcpy(&req.ipv6_addr, tb[PARAM_IPV6_ADDR],
CDF_IPV6_ADDR_SIZE);
req.ipv6_addr_type = true;
}
if (!req.ipv4_addr_type && !req.ipv6_addr_type) {
hdd_err("invalid ipv4 or ipv6 gateway address");
return -EINVAL;
}
req.max_retries = 3;
req.timeout = 100; /* in milliseconds */
req.session_id = adapter->sessionId;
hdd_info("**** Gateway Parameters: ****");
hdd_info("session id: %d", req.session_id);
hdd_info("ipv4 addr type: %d", req.ipv4_addr_type);
hdd_info("ipv6 addr type: %d", req.ipv6_addr_type);
hdd_info("gw mac addr: %pM", req.gw_mac_addr.bytes);
hdd_info("ipv4 addr: %pI4", req.ipv4_addr);
hdd_info("ipv6 addr: %pI6c", req.ipv6_addr);
status = sme_gateway_param_update(hdd_ctx->hHal, &req);
if (!CDF_IS_STATUS_SUCCESS(status)) {
hdd_err("sme_gateway_param_update failed(err=%d)", status);
ret = -EINVAL;
}
EXIT();
return ret;
}
/**
* wlan_hdd_cfg80211_set_gateway_params() - set gateway parameters
* @wiphy: wiphy structure pointer
* @wdev: Wireless device structure pointer
* @data: Pointer to the data received
* @data_len: Length of @data
*
* The API is invoked by the user space to set the gateway parameters
* such as mac address and the IP address which is used for detecting
* the IP subnet change
*
* Return: 0 on success; errno on failure
*/
int wlan_hdd_cfg80211_set_gateway_params(struct wiphy *wiphy,
struct wireless_dev *wdev, const void *data, int data_len)
{
int ret;
cds_ssr_protect(__func__);
ret = __wlan_hdd_cfg80211_set_gateway_params(
wiphy, wdev, data, data_len);
cds_ssr_unprotect(__func__);
return ret;
}
#undef PARAM_MAC_ADDR
#undef PARAM_IPV4_ADDR
#undef PARAM_IPV6_ADDR

View file

@ -0,0 +1,44 @@
/*
* Copyright (c) 2015 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
*
* 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.
*/
/*
* This file was originally distributed by Qualcomm Atheros, Inc.
* under proprietary terms before Copyright ownership was assigned
* to the Linux Foundation.
*/
#ifndef __WLAN_HDD_SUBNET_DETECT_H
#define __WLAN_HDD_SUBNET_DETECT_H
/**
* DOC: wlan_hdd_subnet_detect.h
*
* WLAN Host Device Driver subnet detect API specification
*/
#ifdef FEATURE_LFR_SUBNET_DETECTION
struct wiphy;
struct wireless_dev;
int wlan_hdd_cfg80211_set_gateway_params(struct wiphy *wiphy,
struct wireless_dev *wdev, const void *data, int data_len);
#endif /* FEATURE_LFR_SUBNET_DETECTION */
#endif /* __WLAN_HDD_SUBNET_DETECT_H */

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2012-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -419,9 +419,6 @@ static void wlan_hdd_tdls_schedule_scan(struct work_struct *work)
scan_ctx->attempt++;
wlan_hdd_cfg80211_scan(scan_ctx->wiphy,
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0))
scan_ctx->dev,
#endif
scan_ctx->scan_request);
}
@ -438,7 +435,7 @@ static void dump_tdls_state_param_setting(tdlsInfo_t *info)
hddLog(LOG1,
FL(
"Setting tdls state and param in fw: vdev_id: %d, tdls_state: %d, notification_interval_ms: %d, tx_discovery_threshold: %d, tx_teardown_threshold: %d, rssi_teardown_threshold: %d, rssi_delta: %d, tdls_options: 0x%x, peer_traffic_ind_window: %d, peer_traffic_response_timeout: %d, puapsd_mask: 0x%x, puapsd_inactivity_time: %d, puapsd_rx_frame_threshold: %d"
"Setting tdls state and param in fw: vdev_id: %d, tdls_state: %d, notification_interval_ms: %d, tx_discovery_threshold: %d, tx_teardown_threshold: %d, rssi_teardown_threshold: %d, rssi_delta: %d, tdls_options: 0x%x, peer_traffic_ind_window: %d, peer_traffic_response_timeout: %d, puapsd_mask: 0x%x, puapsd_inactivity_time: %d, puapsd_rx_frame_threshold: %d, teardown_notification_ms: %d, tdls_peer_kickout_threshold: %d"
),
info->vdev_id,
info->tdls_state,
@ -452,7 +449,9 @@ static void dump_tdls_state_param_setting(tdlsInfo_t *info)
info->peer_traffic_response_timeout,
info->puapsd_mask,
info->puapsd_inactivity_time,
info->puapsd_rx_frame_threshold);
info->puapsd_rx_frame_threshold,
info->teardown_notification_ms,
info->tdls_peer_kickout_threshold);
}
@ -508,6 +507,21 @@ static void wlan_hdd_tdls_del_non_forced_peers(tdlsCtx_t *hdd_tdls_ctx)
}
}
/**
* hdd_tdls_pre_init - TDLS pre init
* @hdd_ctx: HDD context
*
* tdls_lock is initialized before an hdd_open_adapter ( which is
* invoked by other instances also) to protect the concurrent
* access for the Adapters by TDLS module.
*
* Return: None
*/
void hdd_tdls_pre_init(hdd_context_t *hdd_ctx)
{
mutex_init(&hdd_ctx->tdls_lock);
}
/**
* wlan_hdd_tdls_init() - tdls initializaiton
* @pAdapter: hdd adapter
@ -638,6 +652,8 @@ int wlan_hdd_tdls_init(hdd_adapter_t *pAdapter)
pHddCtx->tdls_mode = eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY;
hddLog(CDF_TRACE_LEVEL_ERROR,
"%s TDLS Implicit trigger not enabled!", __func__);
} else if (true == pHddCtx->config->fTDLSExternalControl) {
pHddCtx->tdls_mode = eTDLS_SUPPORT_EXTERNAL_CONTROL;
} else {
pHddCtx->tdls_mode = eTDLS_SUPPORT_ENABLED;
}
@ -700,7 +716,10 @@ int wlan_hdd_tdls_init(hdd_adapter_t *pAdapter)
pHddCtx->config->fTDLSPuapsdInactivityTimer;
tInfo->puapsd_rx_frame_threshold =
pHddCtx->config->fTDLSRxFrameThreshold;
tInfo->teardown_notification_ms =
pHddCtx->config->tdls_idle_timeout;
tInfo->tdls_peer_kickout_threshold =
pHddCtx->config->tdls_peer_kickout_threshold;
dump_tdls_state_param_setting(tInfo);
cdf_ret_status = sme_update_fw_tdls_state(pHddCtx->hHal, tInfo, true);
@ -767,7 +786,7 @@ void wlan_hdd_tdls_exit(hdd_adapter_t *pAdapter)
/* No need to post message during driver unlaod because MC thread is
already shutdown */
if (!pHddCtx->isUnloadInProgress) {
if (!cds_is_driver_unloading()) {
tInfo = cdf_mem_malloc(sizeof(tdlsInfo_t));
if (NULL != tInfo) {
tInfo->vdev_id = pAdapter->sessionId;
@ -799,7 +818,10 @@ void wlan_hdd_tdls_exit(hdd_adapter_t *pAdapter)
pHddCtx->config->fTDLSPuapsdInactivityTimer;
tInfo->puapsd_rx_frame_threshold =
pHddCtx->config->fTDLSRxFrameThreshold;
tInfo->teardown_notification_ms =
pHddCtx->config->tdls_idle_timeout;
tInfo->tdls_peer_kickout_threshold =
pHddCtx->config->tdls_peer_kickout_threshold;
dump_tdls_state_param_setting(tInfo);
cdf_ret_status =
@ -1351,7 +1373,8 @@ int wlan_hdd_tdls_increment_pkt_count(hdd_adapter_t *pAdapter,
hddTdlsPeer_t *curr_peer;
hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
if (eTDLS_SUPPORT_ENABLED != pHddCtx->tdls_mode)
if (eTDLS_SUPPORT_ENABLED != pHddCtx->tdls_mode &&
eTDLS_SUPPORT_EXTERNAL_CONTROL != pHddCtx->tdls_mode)
return -EINVAL;
curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
@ -1532,11 +1555,11 @@ void wlan_hdd_tdls_set_mode(hdd_context_t *pHddCtx,
pAdapter = pAdapterNode->pAdapter;
pHddTdlsCtx = WLAN_HDD_GET_TDLS_CTX_PTR(pAdapter);
if (NULL != pHddTdlsCtx) {
if (eTDLS_SUPPORT_ENABLED == tdls_mode)
if (eTDLS_SUPPORT_ENABLED == tdls_mode ||
eTDLS_SUPPORT_EXTERNAL_CONTROL == tdls_mode)
wlan_hdd_tdls_implicit_enable(pHddTdlsCtx);
else if ((eTDLS_SUPPORT_DISABLED == tdls_mode) ||
(eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY ==
tdls_mode))
(eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY == tdls_mode))
wlan_hdd_tdls_implicit_disable(pHddTdlsCtx);
}
status = hdd_get_next_adapter(pHddCtx, pAdapterNode, &pNext);
@ -1587,7 +1610,8 @@ int wlan_hdd_tdls_set_params(struct net_device *dev,
}
/* copy the configuration only when given tdls mode is implicit trigger enable */
if (eTDLS_SUPPORT_ENABLED == req_tdls_mode) {
if (eTDLS_SUPPORT_ENABLED == req_tdls_mode ||
eTDLS_SUPPORT_EXTERNAL_CONTROL == req_tdls_mode) {
memcpy(&pHddTdlsCtx->threshold_config, config,
sizeof(tdls_config_params_t));
}
@ -1634,36 +1658,12 @@ int wlan_hdd_tdls_set_params(struct net_device *dev,
pHddCtx->config->fTDLSPuapsdInactivityTimer;
tdlsParams->puapsd_rx_frame_threshold =
pHddCtx->config->fTDLSRxFrameThreshold;
tdlsParams->teardown_notification_ms =
pHddCtx->config->tdls_idle_timeout;
tdlsParams->tdls_peer_kickout_threshold =
pHddCtx->config->tdls_peer_kickout_threshold;
hddLog(LOG1,
"%s: Setting tdls state and param in fw: "
"vdev_id: %d, "
"tdls_state: %d, "
"notification_interval_ms: %d, "
"tx_discovery_threshold: %d, "
"tx_teardown_threshold: %d, "
"rssi_teardown_threshold: %d, "
"rssi_delta: %d, "
"tdls_options: 0x%x, "
"peer_traffic_ind_window: %d, "
"peer_traffic_response_timeout: %d, "
"puapsd_mask: 0x%x, "
"puapsd_inactivity_time: %d, "
"puapsd_rx_frame_threshold: %d ",
__func__,
tdlsParams->vdev_id,
tdlsParams->tdls_state,
tdlsParams->notification_interval_ms,
tdlsParams->tx_discovery_threshold,
tdlsParams->tx_teardown_threshold,
tdlsParams->rssi_teardown_threshold,
tdlsParams->rssi_delta,
tdlsParams->tdls_options,
tdlsParams->peer_traffic_ind_window,
tdlsParams->peer_traffic_response_timeout,
tdlsParams->puapsd_mask,
tdlsParams->puapsd_inactivity_time,
tdlsParams->puapsd_rx_frame_threshold);
dump_tdls_state_param_setting(tdlsParams);
cdf_ret_status = sme_update_fw_tdls_state(pHddCtx->hHal, tdlsParams, true);
if (CDF_STATUS_SUCCESS != cdf_ret_status) {
@ -1716,15 +1716,14 @@ void wlan_hdd_update_tdls_info(hdd_adapter_t *adapter, bool tdls_prohibited,
if (tdls_prohibited) {
hdd_ctx->tdls_mode = eTDLS_SUPPORT_NOT_ENABLED;
} else {
if (false == hdd_ctx->config->fEnableTDLSImplicitTrigger) {
hdd_ctx->tdls_mode =
eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY;
} else {
if (false == hdd_ctx->config->fEnableTDLSImplicitTrigger)
hdd_ctx->tdls_mode = eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY;
else if (true == hdd_ctx->config->fTDLSExternalControl)
hdd_ctx->tdls_mode = eTDLS_SUPPORT_EXTERNAL_CONTROL;
else
hdd_ctx->tdls_mode = eTDLS_SUPPORT_ENABLED;
}
}
mutex_unlock(&hdd_ctx->tdls_lock);
tdls_param = cdf_mem_malloc(sizeof(*tdls_param));
if (!tdls_param) {
hddLog(CDF_TRACE_LEVEL_ERROR,
@ -1768,35 +1767,12 @@ void wlan_hdd_update_tdls_info(hdd_adapter_t *adapter, bool tdls_prohibited,
hdd_ctx->config->fTDLSPuapsdInactivityTimer;
tdls_param->puapsd_rx_frame_threshold =
hdd_ctx->config->fTDLSRxFrameThreshold;
tdls_param->teardown_notification_ms =
hdd_ctx->config->tdls_idle_timeout;
tdls_param->tdls_peer_kickout_threshold =
hdd_ctx->config->tdls_peer_kickout_threshold;
hddLog(CDF_TRACE_LEVEL_DEBUG,
FL("Setting tdls state and param in fw: "
"vdev_id: %d, "
"tdls_state: %d, "
"notification_interval_ms: %d, "
"tx_discovery_threshold: %d, "
"tx_teardown_threshold: %d, "
"rssi_teardown_threshold: %d, "
"rssi_delta: %d, "
"tdls_options: 0x%x, "
"peer_traffic_ind_window: %d, "
"peer_traffic_response_timeout: %d, "
"puapsd_mask: 0x%x, "
"puapsd_inactivity_time: %d, "
"puapsd_rx_frame_threshold: %d "),
tdls_param->vdev_id,
tdls_param->tdls_state,
tdls_param->notification_interval_ms,
tdls_param->tx_discovery_threshold,
tdls_param->tx_teardown_threshold,
tdls_param->rssi_teardown_threshold,
tdls_param->rssi_delta,
tdls_param->tdls_options,
tdls_param->peer_traffic_ind_window,
tdls_param->peer_traffic_response_timeout,
tdls_param->puapsd_mask,
tdls_param->puapsd_inactivity_time,
tdls_param->puapsd_rx_frame_threshold);
dump_tdls_state_param_setting(tdls_param);
cdf_ret_status = sme_update_fw_tdls_state(hdd_ctx->hHal,
tdls_param,
@ -1864,6 +1840,38 @@ int wlan_hdd_tdls_set_extctrl_param(hdd_adapter_t *pAdapter, const uint8_t *mac,
return 0;
}
/**
* wlan_hdd_tdls_update_peer_mac() - Update the peer mac information to firmware
* @adapter: hdd adapter to interface
* @mac: Mac address of the peer to be added
* @peerState: Current state of the peer
*
* This function updates TDLS peer state to firmware. Firmware will update
* connection table based on new peer state.
*
* Return:success (0) or failure (errno value)
*/
int wlan_hdd_tdls_update_peer_mac(hdd_adapter_t *adapter, const uint8_t *mac,
uint32_t peer_state)
{
tSmeTdlsPeerStateParams sme_tdls_peer_state_params = {0};
CDF_STATUS status = CDF_STATUS_E_FAILURE;
hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
sme_tdls_peer_state_params.vdevId = adapter->sessionId;
cdf_mem_copy(&sme_tdls_peer_state_params.peerMacAddr, mac,
sizeof(sme_tdls_peer_state_params.peerMacAddr));
sme_tdls_peer_state_params.peerState = peer_state;
status = sme_update_tdls_peer_state(hdd_ctx->hHal,
&sme_tdls_peer_state_params);
if (CDF_STATUS_SUCCESS != status) {
hddLog(LOGE, FL("sme_UpdateTdlsPeerState failed for "MAC_ADDRESS_STR),
MAC_ADDR_ARRAY(mac));
return -EPERM;
}
return 0;
}
/**
* wlan_hdd_tdls_set_force_peer() - set/clear isForcedPeer flag on a peer
* @pAdapter: HDD adapter
@ -2170,13 +2178,13 @@ void wlan_hdd_tdls_connection_callback(hdd_adapter_t *pAdapter)
FL("update %d"),
pHddTdlsCtx->threshold_config.tx_period_t);
if (eTDLS_SUPPORT_ENABLED == pHddCtx->tdls_mode) {
if (eTDLS_SUPPORT_ENABLED == pHddCtx->tdls_mode ||
eTDLS_SUPPORT_EXTERNAL_CONTROL == pHddCtx->tdls_mode) {
wlan_hdd_tdls_peer_reset_discovery_processed(pHddTdlsCtx);
pHddTdlsCtx->discovery_sent_cnt = 0;
wlan_hdd_tdls_check_power_save_prohibited(pHddTdlsCtx->
pAdapter);
wlan_hdd_tdls_check_power_save_prohibited(pHddTdlsCtx->pAdapter);
}
mutex_unlock(&pHddCtx->tdls_lock);
}
@ -2464,6 +2472,15 @@ static void __wlan_hdd_tdls_pre_setup(struct work_struct *work)
discovery_tries_n,
MAC_ADDR_ARRAY(curr_peer->peerMac));
curr_peer->tdls_support = eTDLS_CAP_NOT_SUPPORTED;
/* Since TDLS discovery attempt reached the
* maximum threshold, so we remove the peer
* from the FW connection table.
*/
if (0 != wlan_hdd_tdls_update_peer_mac(pHddTdlsCtx->pAdapter,
curr_peer->peerMac, eSME_TDLS_PEER_REMOVE_MAC_ADDR))
hddLog(LOGE, FL("TDLS Peer mac update Failed "
MAC_ADDRESS_STR),
MAC_ADDR_ARRAY(curr_peer->peerMac));
goto done;
}
}
@ -2554,9 +2571,6 @@ void wlan_hdd_tdls_pre_setup(struct work_struct *work)
*/
int wlan_hdd_tdls_copy_scan_context(hdd_context_t *pHddCtx,
struct wiphy *wiphy,
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0))
struct net_device *dev,
#endif
struct cfg80211_scan_request *request)
{
tdls_scan_context_t *scan_ctx;
@ -2569,9 +2583,6 @@ int wlan_hdd_tdls_copy_scan_context(hdd_context_t *pHddCtx,
scan_ctx = &pHddCtx->tdls_scan_ctxt;
scan_ctx->wiphy = wiphy;
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0))
scan_ctx->dev = dev;
#endif
scan_ctx->scan_request = request;
EXIT();
@ -2590,18 +2601,11 @@ int wlan_hdd_tdls_copy_scan_context(hdd_context_t *pHddCtx,
*/
static void wlan_hdd_tdls_scan_init_work(hdd_context_t *pHddCtx,
struct wiphy *wiphy,
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0))
struct net_device *dev,
#endif
struct cfg80211_scan_request *request,
unsigned long delay)
{
if (TDLS_CTX_MAGIC != pHddCtx->tdls_scan_ctxt.magic) {
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0))
wlan_hdd_tdls_copy_scan_context(pHddCtx, wiphy, dev, request);
#else
wlan_hdd_tdls_copy_scan_context(pHddCtx, wiphy, request);
#endif
pHddCtx->tdls_scan_ctxt.attempt = 0;
pHddCtx->tdls_scan_ctxt.magic = TDLS_CTX_MAGIC;
}
@ -2620,9 +2624,6 @@ static void wlan_hdd_tdls_scan_init_work(hdd_context_t *pHddCtx,
* 1 = caller can continue to scan
*/
int wlan_hdd_tdls_scan_callback(hdd_adapter_t *pAdapter, struct wiphy *wiphy,
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0))
struct net_device *dev,
#endif
struct cfg80211_scan_request *request)
{
hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
@ -2677,9 +2678,6 @@ int wlan_hdd_tdls_scan_callback(hdd_adapter_t *pAdapter, struct wiphy *wiphy,
pHddCtx->tdls_scan_ctxt.attempt, delay);
wlan_hdd_tdls_scan_init_work(pHddCtx, wiphy,
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0))
dev,
#endif
request,
msecs_to_jiffies(delay));
/* scan should not continue */
@ -2694,6 +2692,7 @@ int wlan_hdd_tdls_scan_callback(hdd_adapter_t *pAdapter, struct wiphy *wiphy,
}
/* while tdls is up, first time scan */
else if (eTDLS_SUPPORT_ENABLED == pHddCtx->tdls_mode ||
eTDLS_SUPPORT_EXTERNAL_CONTROL == pHddCtx->tdls_mode ||
eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY == pHddCtx->tdls_mode) {
/* disable implicit trigger logic & tdls operatoin */
wlan_hdd_tdls_set_mode(pHddCtx, eTDLS_SUPPORT_DISABLED, false);
@ -2778,9 +2777,6 @@ int wlan_hdd_tdls_scan_callback(hdd_adapter_t *pAdapter, struct wiphy *wiphy,
wlan_hdd_tdls_connected_peers(pAdapter), delay);
wlan_hdd_tdls_scan_init_work(pHddCtx, wiphy,
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0))
dev,
#endif
request,
msecs_to_jiffies(delay));
/* scan should not continue */
@ -2820,6 +2816,7 @@ void wlan_hdd_tdls_scan_done_callback(hdd_adapter_t *pAdapter)
/* if tdls was enabled before scan, re-enable tdls mode */
if (eTDLS_SUPPORT_ENABLED == pHddCtx->tdls_mode_last ||
eTDLS_SUPPORT_EXTERNAL_CONTROL == pHddCtx->tdls_mode_last ||
eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY == pHddCtx->tdls_mode_last) {
hddLog(LOG1,
("%s: revert tdls mode %d"), __func__,
@ -2845,7 +2842,7 @@ void wlan_hdd_tdls_timer_restart(hdd_adapter_t *pAdapter,
hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
/* Check whether driver load unload is in progress */
if (cds_is_load_unload_in_progress()) {
if (cds_is_load_or_unload_in_progress()) {
hddLog(LOGE, FL("Driver load/unload is in progress."));
return;
}
@ -3067,7 +3064,7 @@ __wlan_hdd_cfg80211_exttdls_get_status(struct wiphy *wiphy,
ENTER();
if (CDF_FTM_MODE == hdd_get_conparam()) {
if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
hdd_err("Command not allowed in FTM mode");
return -EPERM;
}
@ -3246,7 +3243,7 @@ __wlan_hdd_cfg80211_exttdls_enable(struct wiphy *wiphy,
ENTER();
if (CDF_FTM_MODE == hdd_get_conparam()) {
if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
hdd_err("Command not allowed in FTM mode");
return -EPERM;
}
@ -3365,7 +3362,7 @@ static int __wlan_hdd_cfg80211_exttdls_disable(struct wiphy *wiphy,
struct nlattr *tb[QCA_WLAN_VENDOR_ATTR_TDLS_DISABLE_MAX + 1];
CDF_STATUS status;
if (CDF_FTM_MODE == hdd_get_conparam()) {
if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
hdd_err("Command not allowed in FTM mode");
return -EPERM;
}
@ -3672,6 +3669,7 @@ static int __wlan_hdd_cfg80211_tdls_mgmt(struct wiphy *wiphy,
hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
hdd_context_t *pHddCtx = wiphy_priv(wiphy);
hdd_station_ctx_t *hdd_sta_ctx;
u8 peerMac[CDF_MAC_ADDR_SIZE];
CDF_STATUS status;
int max_sta_failed = 0;
@ -3685,7 +3683,7 @@ static int __wlan_hdd_cfg80211_tdls_mgmt(struct wiphy *wiphy,
#endif
#endif
if (CDF_FTM_MODE == hdd_get_conparam()) {
if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
hddLog(LOGE, FL("Command not allowed in FTM mode"));
return -EINVAL;
}
@ -3708,6 +3706,21 @@ static int __wlan_hdd_cfg80211_tdls_mgmt(struct wiphy *wiphy,
return -ENOTSUPP;
}
hdd_sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
/*
* STA should be connected and authenticated before sending
* any TDLS frames
*/
if ((eConnectionState_Associated !=
hdd_sta_ctx->conn_info.connState) ||
(false == hdd_sta_ctx->conn_info.uIsAuthenticated)) {
hdd_err("STA is not connected or not authenticated. connState %u, uIsAuthenticated %u",
hdd_sta_ctx->conn_info.connState,
hdd_sta_ctx->conn_info.uIsAuthenticated);
return -EAGAIN;
}
/* If any concurrency is detected */
if (((1 << CDF_STA_MODE) != pHddCtx->concurrency_mode) ||
(pHddCtx->no_of_active_sessions[CDF_STA_MODE] > 1)) {
@ -3853,6 +3866,18 @@ static int __wlan_hdd_cfg80211_tdls_mgmt(struct wiphy *wiphy,
return -EINVAL;
}
if ((SIR_MAC_TDLS_DIS_REQ == action_code) ||
(SIR_MAC_TDLS_DIS_RSP == action_code)) {
/* for DIS_REQ/DIS_RSP, supplicant does not consider the return
* status. So no need to wait for tdls_mgmt_comp to
* send ack status.
*/
hdd_info("tx done for frm %u", action_code);
return 0;
}
hdd_info("Wait for tdls_mgmt_comp. Timeout %u ms",
WAIT_TIME_TDLS_MGMT);
rc = wait_for_completion_timeout(&pAdapter->tdls_mgmt_comp,
msecs_to_jiffies(WAIT_TIME_TDLS_MGMT));
@ -3861,22 +3886,23 @@ static int __wlan_hdd_cfg80211_tdls_mgmt(struct wiphy *wiphy,
"%s: Mgmt Tx Completion timed out TxCompletion %u",
__func__, pAdapter->mgmtTxCompletionStatus);
if (pHddCtx->isLogpInProgress) {
CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
"%s: LOGP in Progress. Ignore!!!", __func__);
if (cds_is_driver_recovering()) {
hdd_err("Recovery in Progress. State: 0x%x Ignore!!!",
cds_get_driver_state());
return -EAGAIN;
}
if (pHddCtx->isUnloadInProgress) {
CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
"%s: Unloading/Loading in Progress. Ignore!!!",
__func__);
if (cds_is_driver_unloading()) {
hdd_err("Unload in progress. State: 0x%x Ignore!!!",
cds_get_driver_state());
return -EAGAIN;
}
pAdapter->mgmtTxCompletionStatus = false;
return -EINVAL;
}
hdd_info("Mgmt Tx Completion status %ld TxCompletion %u",
rc, pAdapter->mgmtTxCompletionStatus);
if (max_sta_failed) {
return max_sta_failed;
@ -4024,6 +4050,23 @@ int wlan_hdd_tdls_extctrl_config_peer(hdd_adapter_t *pAdapter,
"%s TDLS Add Force Peer Failed", __func__);
return -EINVAL;
}
/* Update the peer mac to firmware, so firmware
* could update the connection table
*/
if (0 != wlan_hdd_tdls_update_peer_mac(pAdapter, peer,
eSME_TDLS_PEER_ADD_MAC_ADDR)) {
hddLog(LOGE, FL("TDLS Peer mac update Failed " MAC_ADDRESS_STR),
MAC_ADDR_ARRAY(peer));
return -EINVAL;
}
/* validate if off channel is DFS channel */
if (CDS_IS_DFS_CH(chan)) {
hdd_err("Resetting TDLS off-channel from %d to %d",
chan, CFG_TDLS_PREFERRED_OFF_CHANNEL_NUM_DEFAULT);
chan = CFG_TDLS_PREFERRED_OFF_CHANNEL_NUM_DEFAULT;
}
if (0 != wlan_hdd_tdls_set_extctrl_param(pAdapter, peer,
chan, max_latency,
op_class, min_bandwidth)) {
@ -4078,6 +4121,15 @@ int wlan_hdd_tdls_extctrl_deconfig_peer(hdd_adapter_t *pAdapter,
"%s Failed", __func__);
return -EINVAL;
}
/* Update the peer mac to firmware, so firmware
* could update the connection table
*/
if (0 != wlan_hdd_tdls_update_peer_mac(pAdapter, peer,
eSME_TDLS_PEER_REMOVE_MAC_ADDR)) {
hddLog(LOGE, FL("TDLS Peer mac update Failed " MAC_ADDRESS_STR),
MAC_ADDR_ARRAY(peer));
return -EINVAL;
}
if (0 != wlan_hdd_set_callback(pTdlsPeer, NULL)) {
CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
"%s TDLS set callback Failed", __func__);
@ -4110,7 +4162,7 @@ static int __wlan_hdd_cfg80211_tdls_oper(struct wiphy *wiphy,
ENTER();
if (CDF_FTM_MODE == hdd_get_conparam()) {
if (CDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
hddLog(LOGE, FL("Command not allowed in FTM mode"));
return -EINVAL;
}
@ -4265,6 +4317,16 @@ static int __wlan_hdd_cfg80211_tdls_oper(struct wiphy *wiphy,
pTdlsPeer->
op_class_for_pref_off_chan;
if (CDS_IS_DFS_CH(smeTdlsPeerStateParams.
peerCap.prefOffChanNum)) {
hdd_err("Resetting TDLS off-channel from %d to %d",
smeTdlsPeerStateParams.peerCap.
prefOffChanNum,
CFG_TDLS_PREFERRED_OFF_CHANNEL_NUM_DEFAULT);
smeTdlsPeerStateParams.peerCap.prefOffChanNum =
CFG_TDLS_PREFERRED_OFF_CHANNEL_NUM_DEFAULT;
}
CDF_TRACE(CDF_MODULE_ID_HDD,
CDF_TRACE_LEVEL_INFO,
"%s: Peer " MAC_ADDRESS_STR
@ -4593,8 +4655,9 @@ hddTdlsPeer_t *wlan_hdd_tdls_find_first_connected_peer(hdd_adapter_t *adapter)
int hdd_set_tdls_offchannel(hdd_context_t *hdd_ctx, int offchannel)
{
if ((true == hdd_ctx->config->fEnableTDLSOffChannel) &&
(eTDLS_SUPPORT_ENABLED == hdd_ctx->tdls_mode ||
eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY == hdd_ctx->tdls_mode)) {
(eTDLS_SUPPORT_ENABLED == hdd_ctx->tdls_mode ||
eTDLS_SUPPORT_EXTERNAL_CONTROL == hdd_ctx->tdls_mode ||
eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY == hdd_ctx->tdls_mode)) {
if (offchannel < CFG_TDLS_PREFERRED_OFF_CHANNEL_NUM_MIN ||
offchannel > CFG_TDLS_PREFERRED_OFF_CHANNEL_NUM_MAX) {
hddLog(LOGE, FL("Invalid tdls off channel %u"),
@ -4625,8 +4688,9 @@ int hdd_set_tdls_offchannel(hdd_context_t *hdd_ctx, int offchannel)
int hdd_set_tdls_secoffchanneloffset(hdd_context_t *hdd_ctx, int offchanoffset)
{
if ((true == hdd_ctx->config->fEnableTDLSOffChannel) &&
(eTDLS_SUPPORT_ENABLED == hdd_ctx->tdls_mode ||
eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY == hdd_ctx->tdls_mode)) {
(eTDLS_SUPPORT_ENABLED == hdd_ctx->tdls_mode ||
eTDLS_SUPPORT_EXTERNAL_CONTROL == hdd_ctx->tdls_mode ||
eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY == hdd_ctx->tdls_mode)) {
hdd_ctx->tdls_channel_offset = 0;
switch (offchanoffset) {
@ -4696,13 +4760,14 @@ int hdd_set_tdls_offchannelmode(hdd_adapter_t *adapter, int offchanmode)
}
if ((true == hdd_ctx->config->fEnableTDLSOffChannel) &&
(eTDLS_SUPPORT_ENABLED == hdd_ctx->tdls_mode ||
eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY == hdd_ctx->tdls_mode)) {
conn_peer = wlan_hdd_tdls_find_first_connected_peer(adapter);
if (NULL == conn_peer) {
eTDLS_SUPPORT_EXTERNAL_CONTROL == hdd_ctx->tdls_mode ||
eTDLS_SUPPORT_EXPLICIT_TRIGGER_ONLY == hdd_ctx->tdls_mode)) {
conn_peer = wlan_hdd_tdls_find_first_connected_peer(adapter);
if (NULL == conn_peer) {
hddLog(LOGP,
FL("No TDLS Connected Peer"));
return -EPERM;
}
return -EPERM;
}
} else {
hddLog(LOGP,
FL("TDLS Connection not supported"));

View file

@ -50,10 +50,14 @@
static void
hdd_trace_dump(void *mac, tp_cdf_trace_record record, uint16_t index)
{
hddLog(LOG1, "%04d %012llu S%d %-14s %-30s(0x%x)",
index, record->time, record->session,
"HDD Event:", hdd_trace_event_string(record->code),
record->data);
if (TRACE_CODE_HDD_RX_SME_MSG == record->code)
hddLog(LOGE, "%04d %012llu S%d %-14s %-30s(0x%x) ",
index, record->time, record->session, "RX SME MSG:",
get_e_roam_cmd_status_str(record->data), record->data);
else
hddLog(LOGE, "%04d %012llu S%d %-14s %-30s(0x%x) ",
index, record->time, record->session, "HDD Event:",
hdd_trace_event_string(record->code), record->data);
}
/**

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2012-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -305,16 +305,16 @@ int hdd_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
#endif /* QCA_PKT_PROTO_TRACE */
#ifdef QCA_WIFI_FTM
if (hdd_get_conparam() == CDF_FTM_MODE) {
if (hdd_get_conparam() == CDF_GLOBAL_FTM_MODE) {
kfree_skb(skb);
return NETDEV_TX_OK;
}
#endif
++pAdapter->hdd_stats.hddTxRxStats.txXmitCalled;
if (cds_is_logp_in_progress()) {
if (cds_is_driver_recovering()) {
CDF_TRACE(CDF_MODULE_ID_HDD_DATA, CDF_TRACE_LEVEL_WARN,
"LOPG in progress, dropping the packet");
"Recovery in progress, dropping the packet");
++pAdapter->stats.tx_dropped;
++pAdapter->hdd_stats.hddTxRxStats.txXmitDropped;
kfree_skb(skb);
@ -333,7 +333,7 @@ int hdd_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
if ((STAId == HDD_WLAN_INVALID_STA_ID) &&
(cdf_is_macaddr_broadcast(pDestMacAddress) ||
cdf_is_macaddr_group(pDestMacAddress))) {
STAId = IBSS_BROADCAST_STAID;
STAId = pHddStaCtx->broadcast_ibss_staid;
CDF_TRACE(CDF_MODULE_ID_HDD_DATA,
CDF_TRACE_LEVEL_INFO_LOW, "%s: BC/MC packet",
__func__);
@ -347,6 +347,17 @@ int hdd_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
return NETDEV_TX_OK;
}
} else {
if (WLAN_HDD_OCB != pAdapter->device_mode &&
eConnectionState_Associated !=
pHddStaCtx->conn_info.connState) {
CDF_TRACE(CDF_MODULE_ID_HDD_DATA, CDF_TRACE_LEVEL_INFO,
FL("Tx frame in not associated state in %d context"),
pAdapter->device_mode);
++pAdapter->stats.tx_dropped;
++pAdapter->hdd_stats.hddTxRxStats.txXmitDropped;
kfree_skb(skb);
return NETDEV_TX_OK;
}
STAId = pHddStaCtx->conn_info.staId[0];
}
@ -733,7 +744,8 @@ CDF_STATUS hdd_rx_packet_cbk(void *cds_context, cdf_nbuf_t rxBuf, uint8_t staId)
if (HDD_LRO_NO_RX ==
hdd_lro_rx(pHddCtx, pAdapter, skb)) {
if (hdd_napi_enabled(HDD_NAPI_ANY))
if (hdd_napi_enabled(HDD_NAPI_ANY) &&
!pHddCtx->config->enableRxThread)
rxstat = netif_receive_skb(skb);
else
rxstat = netif_rx_ni(skb);

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2011-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2011-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -160,7 +160,7 @@ static const hdd_freq_chan_map_t freq_chan_map[] = {
#define WE_TXRX_FWSTATS_RESET 41
#define WE_SET_MAX_TX_POWER_2_4 42
#define WE_SET_MAX_TX_POWER_5_0 43
#define WE_SET_POWER_GATING 44
/* 44 is unused */
/* Private ioctl for packet powe save */
#define WE_PPS_PAID_MATCH 45
#define WE_PPS_GID_MATCH 46
@ -247,7 +247,7 @@ static const hdd_freq_chan_map_t freq_chan_map[] = {
#define WE_GET_AMSDU 28
#define WE_GET_TXPOW_2G 29
#define WE_GET_TXPOW_5G 30
#define WE_GET_POWER_GATING 31
/* 31 is unused */
#define WE_GET_PPS_PAID_MATCH 32
#define WE_GET_PPS_GID_MATCH 33
#define WE_GET_PPS_EARLY_TIM_CLEAR 34
@ -1109,9 +1109,9 @@ CDF_STATUS wlan_hdd_get_rssi(hdd_adapter_t *pAdapter, int8_t *rssi_value)
"%s: Invalid context, pAdapter", __func__);
return CDF_STATUS_E_FAULT;
}
if ((WLAN_HDD_GET_CTX(pAdapter))->isLogpInProgress) {
CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
"%s:LOGP in Progress. Ignore!!!", __func__);
if (cds_is_driver_recovering()) {
hdd_err("Recovery in Progress. State: 0x%x Ignore!!!",
cds_get_driver_state());
/* return a cached value */
*rssi_value = pAdapter->rssi;
return CDF_STATUS_SUCCESS;
@ -2248,9 +2248,9 @@ static int __iw_get_bitrate(struct net_device *dev,
if (0 != ret)
return ret;
if ((WLAN_HDD_GET_CTX(pAdapter))->isLogpInProgress) {
CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_FATAL,
"%s:LOGP in Progress. Ignore!!!", __func__);
if (cds_is_driver_recovering()) {
hdd_alert("Recovery in Progress. State: 0x%x Ignore!!!",
cds_get_driver_state());
return status;
}
@ -3352,9 +3352,9 @@ CDF_STATUS wlan_hdd_get_class_astats(hdd_adapter_t *pAdapter)
hddLog(CDF_TRACE_LEVEL_ERROR, "%s: pAdapter is NULL", __func__);
return CDF_STATUS_E_FAULT;
}
if ((WLAN_HDD_GET_CTX(pAdapter))->isLogpInProgress) {
CDF_TRACE(CDF_MODULE_ID_HDD, CDF_TRACE_LEVEL_ERROR,
"%s:LOGP in Progress. Ignore!!!", __func__);
if (cds_is_driver_recovering()) {
hdd_err("Recovery in Progress. State: 0x%x Ignore!!!",
cds_get_driver_state());
return CDF_STATUS_SUCCESS;
}
@ -5698,16 +5698,6 @@ static int __iw_setint_getnone(struct net_device *dev,
break;
}
case WE_SET_POWER_GATING:
{
hddLog(LOG1, "WMI_PDEV_PARAM_POWER_GATING_SLEEP val %d",
set_value);
ret = wma_cli_set_command(pAdapter->sessionId,
WMI_PDEV_PARAM_POWER_GATING_SLEEP,
(set_value) ? true : false, PDEV_CMD);
break;
}
/* Firmware debug log */
case WE_DBGLOG_LOG_LEVEL:
{
@ -6681,15 +6671,6 @@ static int __iw_setnone_getint(struct net_device *dev,
break;
}
case WE_GET_POWER_GATING:
{
hddLog(LOG1, "GET WMI_PDEV_PARAM_POWER_GATING_SLEEP");
*value = wma_cli_get_command(pAdapter->sessionId,
WMI_PDEV_PARAM_POWER_GATING_SLEEP,
PDEV_CMD);
break;
}
case WE_GET_PPS_PAID_MATCH:
{
hddLog(LOG1, "GET WMI_VDEV_PPS_PAID_MATCH");
@ -6894,9 +6875,7 @@ static int __iw_set_three_ints_getnone(struct net_device *dev,
return -EPERM;
}
hdd_debug("%d %d %d", value[1], value[2], value[3]);
cds_set_dual_mac_scan_config(hdd_ctx,
value[1], value[2],
value[3]);
cds_set_dual_mac_scan_config(value[1], value[2], value[3]);
break;
default:
hddLog(LOGE, "%s: Invalid IOCTL command %d", __func__, sub_cmd);
@ -7712,7 +7691,7 @@ static int __iw_set_var_ints_getnone(struct net_device *dev,
{
hddLog(LOGE,
FL("<iwpriv wlan0 pm_clist> is called\n"));
cds_incr_connection_count_utfw(hdd_ctx, apps_args[0],
cds_incr_connection_count_utfw(apps_args[0],
apps_args[1], apps_args[2], apps_args[3],
apps_args[4], apps_args[5], apps_args[6],
apps_args[7]);
@ -7723,7 +7702,7 @@ static int __iw_set_var_ints_getnone(struct net_device *dev,
{
hddLog(LOGE,
FL("<iwpriv wlan0 pm_dlist> is called\n"));
cds_decr_connection_count_utfw(hdd_ctx, apps_args[0],
cds_decr_connection_count_utfw(apps_args[0],
apps_args[1]);
}
break;
@ -7732,7 +7711,7 @@ static int __iw_set_var_ints_getnone(struct net_device *dev,
{
hddLog(LOGE,
FL("<iwpriv wlan0 pm_ulist> is called\n"));
cds_update_connection_info_utfw(hdd_ctx, apps_args[0],
cds_update_connection_info_utfw(apps_args[0],
apps_args[1], apps_args[2], apps_args[3],
apps_args[4], apps_args[5], apps_args[6],
apps_args[7]);
@ -7764,7 +7743,7 @@ static int __iw_set_var_ints_getnone(struct net_device *dev,
hddLog(LOGE,
FL("<iwpriv wlan0 pm_pcl> is called\n"));
cds_get_pcl(hdd_ctx, apps_args[0],
cds_get_pcl(apps_args[0],
pcl, &pcl_len);
pr_info("PCL list for role[%d] is {", apps_args[0]);
for (i = 0 ; i < pcl_len; i++)
@ -7780,7 +7759,7 @@ static int __iw_set_var_ints_getnone(struct net_device *dev,
hddLog(LOGE,
FL("<iwpriv wlan0 pm_cinfo> is called\n"));
conn_info = cds_get_conn_info(hdd_ctx, &len);
conn_info = cds_get_conn_info(&len);
pr_info("+-----------------------------+\n");
for (i = 0; i < len; i++) {
pr_info("|table_index[%d]\t\t|\n", i);
@ -7806,7 +7785,7 @@ static int __iw_set_var_ints_getnone(struct net_device *dev,
if (apps_args[0] == 0) {
hddLog(LOGE,
FL("set hw mode for single mac\n"));
cds_soc_set_hw_mode(hdd_ctx,
cds_soc_set_hw_mode(
pAdapter->sessionId,
HW_MODE_SS_2x2,
HW_MODE_80_MHZ,
@ -7817,7 +7796,7 @@ static int __iw_set_var_ints_getnone(struct net_device *dev,
} else if (apps_args[0] == 1) {
hddLog(LOGE,
FL("set hw mode for dual mac\n"));
cds_soc_set_hw_mode(hdd_ctx,
cds_soc_set_hw_mode(
pAdapter->sessionId,
HW_MODE_SS_1x1,
HW_MODE_80_MHZ,
@ -7845,7 +7824,7 @@ static int __iw_set_var_ints_getnone(struct net_device *dev,
bool allow;
hddLog(LOGE,
FL("<iwpriv wlan0 pm_query_allow> is called\n"));
allow = cds_allow_concurrency(hdd_ctx,
allow = cds_allow_concurrency(
apps_args[0], apps_args[1], apps_args[2]);
pr_info("allow %d {0 = don't allow, 1 = allow}", allow);
}
@ -8604,10 +8583,8 @@ static int __iw_set_keepalive_params(struct net_device *dev,
request->destIpv4Addr[0], request->destIpv4Addr[1],
request->destIpv4Addr[2], request->destIpv4Addr[3]);
hdd_info("Dest MAC address: %d:%d:%d:%d:%d:%d",
request->destMacAddr[0], request->destMacAddr[1],
request->destMacAddr[2], request->destMacAddr[3],
request->destMacAddr[4], request->destMacAddr[5]);
hdd_info("Dest MAC address: "MAC_ADDRESS_STR,
MAC_ADDR_ARRAY(request->dest_macaddr.bytes));
break;
}
@ -9534,8 +9511,7 @@ static int __iw_set_two_ints_getnone(struct net_device *dev,
return -EPERM;
}
hdd_debug("%d %d", value[1], value[2]);
cds_set_dual_mac_fw_mode_config(hdd_ctx,
value[1], value[2]);
cds_set_dual_mac_fw_mode_config(value[1], value[2]);
break;
case WE_DUMP_DP_TRACE_LEVEL:
hdd_info("WE_DUMP_DP_TRACE_LEVEL: %d %d",
@ -9917,11 +9893,6 @@ static const struct iw_priv_args we_private_args[] = {
0,
"txpow5g"},
{WE_SET_POWER_GATING,
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
0,
"pwrgating"},
/* Sub-cmds DBGLOG specific commands */
{WE_DBGLOG_LOG_LEVEL,
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
@ -10275,11 +10246,6 @@ static const struct iw_priv_args we_private_args[] = {
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
"get_txpow5g"},
{WE_GET_POWER_GATING,
0,
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
"get_pwrgating"},
{WE_GET_PPS_PAID_MATCH,
0,
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,

View file

@ -81,10 +81,6 @@
#define WLAN_HDD_MAX_DSCP 0x3f
/* DHCP Port number */
#define DHCP_SOURCE_PORT 0x4400
#define DHCP_DESTINATION_PORT 0x4300
#define HDD_WMM_UP_TO_AC_MAP_SIZE 8
const uint8_t hdd_wmm_up_to_ac_map[] = {

View file

@ -522,8 +522,8 @@ bool hdd_enter_wowl(hdd_adapter_t *pAdapter, bool enable_mp, bool enable_pbm)
wowParams.ucMagicPktEnable = enable_mp;
wowParams.sessionId = pAdapter->sessionId;
if (enable_mp) {
cdf_copy_macaddr((struct cdf_mac_addr *) &(wowParams.magicPtrn),
&(pAdapter->macAddressCurrent));
cdf_copy_macaddr(&wowParams.magic_ptrn,
&pAdapter->macAddressCurrent);
}
#ifdef WLAN_WAKEUP_EVENTS
wowParams.ucWoWEAPIDRequestEnable = true;
@ -533,7 +533,7 @@ bool hdd_enter_wowl(hdd_adapter_t *pAdapter, bool enable_mp, bool enable_pbm)
wowParams.ucWoWBSSConnLoss = true;
#endif /* WLAN_WAKEUP_EVENTS */
/* Request to put Libra into WoWL */
/* Request to put FW into WoWL */
cdf_ret_status = sme_enter_wowl(hHal, hdd_wowl_callback, pAdapter,
#ifdef WLAN_WAKEUP_EVENTS
hdd_wowl_wake_indication_callback,

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2013-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2013-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -394,14 +394,6 @@ typedef struct osdrv_callbacks {
*/
int hif_init(OSDRV_CALLBACKS *callbacks);
/*
* This API claims the HIF device and provides a context for handling removal.
* The device removal callback is only called when the OSDRV layer claims
* a device. The claimed context must be non-NULL */
void hif_claim_device(struct ol_softc *scn, void *claimedContext);
/* release the claimed device */
void hif_release_device(struct ol_softc *scn);
/* This API detaches the HTC layer from the HIF device */
void hif_detach_htc(struct ol_softc *scn);
@ -635,18 +627,76 @@ void hif_disable_isr(void *scn);
void hif_reset_soc(void *scn);
void hif_disable_aspm(void);
void hif_save_htc_htt_config_endpoint(int htc_endpoint);
CDF_STATUS hif_open(void);
CDF_STATUS hif_open(enum ath_hal_bus_type bus_type);
void hif_close(void *hif_ctx);
CDF_STATUS hif_enable(void *hif_ctx, struct device *dev, void *bdev,
const hif_bus_id *bid, enum ath_hal_bus_type bus_type,
enum hif_enable_type type);
void hif_disable(void *hif_ctx, enum hif_disable_type type);
void hif_enable_power_gating(void *hif_ctx);
int hif_bus_resume(void);
int hif_bus_suspend(void);
#ifdef FEATURE_RUNTIME_PM
struct hif_pm_runtime_lock;
int hif_pm_runtime_get(void *hif_ctx);
void hif_pm_runtime_get_noresume(void *hif_ctx);
int hif_pm_runtime_put(void *hif_ctx);
struct hif_pm_runtime_lock *hif_runtime_lock_init(const char *name);
void hif_runtime_lock_deinit(struct hif_pm_runtime_lock *lock);
int hif_pm_runtime_prevent_suspend(void *ol_sc,
struct hif_pm_runtime_lock *lock);
int hif_pm_runtime_allow_suspend(void *ol_sc,
struct hif_pm_runtime_lock *lock);
int hif_pm_runtime_prevent_suspend_timeout(void *ol_sc,
struct hif_pm_runtime_lock *lock, unsigned int delay);
#else
struct hif_pm_runtime_lock {
const char *name;
};
static inline void hif_pm_runtime_get_noresume(void *hif_ctx)
{}
static inline int hif_pm_runtime_get(void *hif_ctx)
{ return 0; }
static inline int hif_pm_runtime_put(void *hif_ctx)
{ return 0; }
static inline struct hif_pm_runtime_lock *hif_runtime_lock_init(
const char *name)
{ return NULL; }
static inline void hif_runtime_lock_deinit(struct hif_pm_runtime_lock *lock)
{}
static inline int hif_pm_runtime_prevent_suspend(void *ol_sc,
struct hif_pm_runtime_lock *lock)
{ return 0; }
static inline int hif_pm_runtime_allow_suspend(void *ol_sc,
struct hif_pm_runtime_lock *lock)
{ return 0; }
static inline int hif_pm_runtime_prevent_suspend_timeout(void *ol_sc,
struct hif_pm_runtime_lock *lock, unsigned int delay)
{ return 0; }
#endif
void hif_enable_power_management(void *hif_ctx);
void hif_disable_power_management(void *hif_ctx);
void hif_vote_link_down(void);
void hif_vote_link_up(void);
bool hif_can_suspend_link(void);
int hif_bus_resume(void);
int hif_bus_suspend(void);
#ifdef FEATURE_RUNTIME_PM
int hif_pre_runtime_suspend(void);
void hif_pre_runtime_resume(void);
int hif_runtime_suspend(void);
int hif_runtime_resume(void);
void hif_process_runtime_suspend_success(void);
void hif_process_runtime_suspend_failure(void);
void hif_process_runtime_resume_success(void);
#endif
int dump_ce_register(struct ol_softc *scn);
int ol_copy_ramdump(struct ol_softc *scn);
void hif_pktlogmod_exit(void *hif_ctx);

View file

@ -0,0 +1,37 @@
/*
* Copyright (c) 2015 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
*
* 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.
*/
/*
* This file was originally distributed by Qualcomm Atheros, Inc.
* under proprietary terms before Copyright ownership was assigned
* to the Linux Foundation.
*/
#ifndef _PLATFORM_ICNSS_H_
#define _PLATFORM_ICNSS_H_
#ifdef HIF_PCI
#include "icnss_stub.h"
#else
#include <soc/qcom/icnss.h>
#endif
#endif

View file

@ -1812,11 +1812,7 @@
#define ADRASTEA_A_WIFI_APB_1_A_WFSS_CE_TARGET_HOST_DELTA 0x08
#define ADRASTEA_A_SOC_PCIE_PCIE_SCRATCH_2 0x0013005C
#ifdef QCA_WIFI_3_0_IHELIUM
#define ADRASTEA_A_SOC_CORE_PCIE_INTR_ENABLE_GRP0_Q6_MASK 0xff
#else
#define ADRASTEA_A_SOC_CORE_PCIE_INTR_ENABLE_GRP0_Q6_MASK 0x0
#endif /* QCA_WIFI_3_0_IHELIUM */
/* end: Q6 iHelium emulation registers */
struct targetdef_s adrastea_targetdef = {

View file

@ -56,12 +56,7 @@ static void *get_hif_hdl_from_file(struct file *file)
{
struct ol_softc *scn;
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0))
scn = (struct ol_softc *)PDE_DATA(file_inode(file));
#else
scn = (struct ol_softc *)(
PDE(file->f_path.dentry->d_inode)->data);
#endif
return (void *)scn;
}

View file

@ -275,6 +275,50 @@ struct CE_dest_desc {
#define CE_SENDLIST_ITEMS_MAX 12
/**
* union ce_desc - unified data type for ce descriptors
*
* Both src and destination descriptors follow the same format.
* They use different data structures for different access symantics.
* Here we provice a unifying data type.
*/
union ce_desc {
struct CE_src_desc src_desc;
struct CE_dest_desc dest_desc;
};
/**
* enum hif_ce_event_type - HIF copy engine event type
* @HIF_RX_DESC_POST: event recorded before updating write index of RX ring.
* @HIF_RX_DESC_COMPLETION: event recorded before updating sw index of RX ring.
* @HIF_TX_GATHER_DESC_POST: post gather desc. (no write index update)
* @HIF_TX_DESC_POST: event recorded before updating write index of TX ring.
* @HIF_TX_DESC_COMPLETION: event recorded before updating sw index of TX ring.
* @HIF_IRQ_EVENT: event recorded in the irq before scheduling the bh
* @HIF_CE_TASKLET_ENTRY: records the start of the ce_tasklet
* @HIF_CE_TASKLET_RESCHEDULE: records the rescheduling of the wlan_tasklet
* @HIF_CE_TASKLET_EXIT: records the exit of the wlan tasklet without reschedule
* @HIF_CE_REAP_ENTRY: records when we process completion outside of a bh
* @HIF_CE_REAP_EXIT: records when we process completion outside of a bh
*/
enum hif_ce_event_type {
HIF_RX_DESC_POST,
HIF_RX_DESC_COMPLETION,
HIF_TX_GATHER_DESC_POST,
HIF_TX_DESC_POST,
HIF_TX_DESC_COMPLETION,
HIF_IRQ_EVENT,
HIF_CE_TASKLET_ENTRY,
HIF_CE_TASKLET_RESCHEDULE,
HIF_CE_TASKLET_EXIT,
HIF_CE_REAP_ENTRY,
HIF_CE_REAP_EXIT,
};
void ce_init_ce_desc_event_log(int ce_id, int size);
void hif_record_ce_desc_event(int ce_id, enum hif_ce_event_type type,
union ce_desc *descriptor, void *memory, int index);
enum ce_sendlist_type_e {
CE_SIMPLE_BUFFER_TYPE,
/* TBDXXX: CE_RX_DESC_LIST, */

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2013-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2013-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -166,6 +166,9 @@ struct CE_handle *ce_init(struct ol_softc *scn,
else
CE_state->src_sz_max = attr->src_sz_max;
ce_init_ce_desc_event_log(CE_id,
attr->src_nentries + attr->dest_nentries);
/* source ring setup */
nentries = attr->src_nentries;
if (nentries) {
@ -691,9 +694,9 @@ hif_pci_ce_send_done(struct CE_handle *copyeng, void *ce_context,
if (transfer_context != CE_SENDLIST_ITEM_CTXT) {
if (hif_state->scn->target_status
== OL_TRGET_STATUS_RESET)
return;
msg_callbacks->txCompletionHandler(
cdf_nbuf_free(transfer_context);
else
msg_callbacks->txCompletionHandler(
msg_callbacks->Context,
transfer_context, transfer_id,
toeplitz_hash_result);
@ -752,6 +755,7 @@ hif_pci_ce_recv_data(struct CE_handle *copyeng, void *ce_context,
&hif_state->msg_callbacks_current;
do {
hif_pm_runtime_mark_last_busy(scn->hif_sc->dev);
cdf_nbuf_unmap_single(scn->cdf_dev,
(cdf_nbuf_t) transfer_context,
CDF_DMA_FROM_DEVICE);
@ -759,9 +763,9 @@ hif_pci_ce_recv_data(struct CE_handle *copyeng, void *ce_context,
atomic_inc(&pipe_info->recv_bufs_needed);
hif_post_recv_buffers_for_pipe(pipe_info);
if (hif_state->scn->target_status == OL_TRGET_STATUS_RESET)
return;
hif_ce_do_recv(msg_callbacks, transfer_context,
cdf_nbuf_free(transfer_context);
else
hif_ce_do_recv(msg_callbacks, transfer_context,
nbytes, pipe_info);
/* Set up force_break flag if num of receices reaches
@ -775,6 +779,7 @@ hif_pci_ce_recv_data(struct CE_handle *copyeng, void *ce_context,
} while (ce_completed_recv_next(copyeng, &ce_context, &transfer_context,
&CE_data, &nbytes, &transfer_id,
&flags) == CDF_STATUS_SUCCESS);
}
/* TBDXXX: Set CE High Watermark; invoke txResourceAvailHandler in response */
@ -841,7 +846,11 @@ int hif_completion_thread_startup(struct HIF_CE_state *hif_state)
hif_pci_ce_recv_data, pipe_info,
attr.flags & CE_ATTR_DISABLE_INTR);
}
if (attr.src_nentries)
cdf_spinlock_init(&pipe_info->completion_freeq_lock);
}
A_TARGET_ACCESS_UNLIKELY(scn);
return 0;
}
@ -863,20 +872,6 @@ static void hif_msg_callbacks_install(struct ol_softc *scn)
sizeof(hif_state->msg_callbacks_pending));
}
void hif_claim_device(struct ol_softc *scn, void *claimedContext)
{
struct HIF_CE_state *hif_state = (struct HIF_CE_state *)scn->hif_hdl;
hif_state->claimedContext = claimedContext;
}
void hif_release_device(struct ol_softc *scn)
{
struct HIF_CE_state *hif_state = (struct HIF_CE_state *)scn->hif_hdl;
hif_state->claimedContext = NULL;
}
void
hif_get_default_pipe(struct ol_softc *scn, uint8_t *ULPipe, uint8_t *DLPipe)
{
@ -1161,7 +1156,7 @@ void hif_send_buffer_cleanup_on_pipe(struct HIF_CE_pipe_info *pipe_info)
* htt_h2t_rx_ring_cfg_msg_ll() have already been
* freed in htt_htc_misc_pkt_pool_free() in
* wlantl_close(), so do not free them here again
* by checking whether it's the EndPoint
* by checking whether it's the endpoint
* which they are queued in.
*/
if (id == hif_state->scn->htc_endpoint)
@ -1487,7 +1482,7 @@ static void hif_sleep_entry(void *arg)
if (scn->recovery)
return;
if (cds_is_unload_in_progress())
if (cds_is_driver_unloading())
return;
cdf_spin_lock_irqsave(&hif_state->keep_awake_lock);
@ -1543,7 +1538,7 @@ int hif_set_hia(struct ol_softc *scn)
HIF_TRACE("%s: E", __func__);
if (IHELIUM_BU || ADRASTEA_BU)
if (ADRASTEA_BU)
return CDF_STATUS_SUCCESS;
#ifdef QCA_WIFI_3_0
@ -1799,27 +1794,16 @@ static int hif_wlan_enable(void)
cfg.num_shadow_reg_cfg = shadow_cfg_sz / sizeof(struct shadow_reg_cfg);
cfg.shadow_reg_cfg = (struct icnss_shadow_reg_cfg *) target_shadow_reg_cfg;
switch (con_mode) {
case CDF_FTM_MODE:
if (CDF_GLOBAL_FTM_MODE == con_mode)
mode = ICNSS_FTM;
break;
case CDF_EPPING_MODE:
else if (WLAN_IS_EPPING_ENABLED(cds_get_conparam()))
mode = ICNSS_EPPING;
break;
default:
else
mode = ICNSS_MISSION;
break;
}
return icnss_wlan_enable(&cfg, mode, QWLAN_VERSIONSTR);
}
#if ((!defined(QCA_WIFI_3_0_IHELIUM) && !defined(QCA_WIFI_3_0_ADRASTEA)) || defined(CONFIG_ICNSS))
static inline void cnss_pcie_notify_q6(void)
{
return;
}
#endif
/*
* Called from PCI layer whenever a new PCI device is probed.
* Initializes per-device HIF state and notifies the main
@ -1858,11 +1842,6 @@ int hif_config_ce(hif_handle_t hif_hdl)
HIF_ERROR("%s: hif_wlan_enable error = %d", __func__, ret);
return CDF_STATUS_NOT_INITIALIZED;
}
if (IHELIUM_BU) {
cnss_pcie_notify_q6();
HIF_TRACE("%s: cnss_pcie_notify_q6 done, notice_send= %d",
__func__, scn->notice_send);
}
scn->notice_send = true;

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2015-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -123,8 +123,6 @@ struct HIF_CE_state {
/* current msg callbacks in use */
struct hif_msg_callbacks msg_callbacks_current;
void *claimedContext;
/* Target address used to signal a pending firmware event */
uint32_t fw_indicator_address;

View file

@ -78,6 +78,103 @@ static int war1_allow_sleep;
/* io32 write workaround */
static int hif_ce_war1;
#ifdef CONFIG_SLUB_DEBUG_ON
/**
* struct hif_ce_event - structure for detailing a ce event
* @type: what the event was
* @time: when it happened
* @descriptor: descriptor enqueued or dequeued
* @memory: virtual address that was used
* @index: location of the descriptor in the ce ring;
*/
struct hif_ce_desc_event {
uint16_t index;
enum hif_ce_event_type type;
uint64_t time;
union ce_desc descriptor;
void *memory;
};
/* max history to record per copy engine */
#define HIF_CE_HISTORY_MAX 512
cdf_atomic_t hif_ce_desc_history_index[CE_COUNT_MAX];
struct hif_ce_desc_event hif_ce_desc_history[CE_COUNT_MAX][HIF_CE_HISTORY_MAX];
/**
* get_next_record_index() - get the next record index
* @table_index: atomic index variable to increment
* @array_size: array size of the circular buffer
*
* Increment the atomic index and reserve the value.
* Takes care of buffer wrap.
* Guaranteed to be thread safe as long as fewer than array_size contexts
* try to access the array. If there are more than array_size contexts
* trying to access the array, full locking of the recording process would
* be needed to have sane logging.
*/
static int get_next_record_index(cdf_atomic_t *table_index, int array_size)
{
int record_index = cdf_atomic_inc_return(table_index);
if (record_index == array_size)
cdf_atomic_sub(array_size, table_index);
while (record_index >= array_size)
record_index -= array_size;
return record_index;
}
/**
* hif_record_ce_desc_event() - record ce descriptor events
* @ce_id: which ce is the event occuring on
* @type: what happened
* @descriptor: pointer to the descriptor posted/completed
* @memory: virtual address of buffer related to the descriptor
* @index: index that the descriptor was/will be at.
*/
void hif_record_ce_desc_event(int ce_id, enum hif_ce_event_type type,
union ce_desc *descriptor, void *memory, int index)
{
int record_index = get_next_record_index(
&hif_ce_desc_history_index[ce_id], HIF_CE_HISTORY_MAX);
struct hif_ce_desc_event *event =
&hif_ce_desc_history[ce_id][record_index];
event->type = type;
event->time = cds_get_monotonic_boottime();
if (descriptor != NULL)
event->descriptor = *descriptor;
else
memset(&event->descriptor, 0, sizeof(union ce_desc));
event->memory = memory;
event->index = index;
}
/**
* ce_init_ce_desc_event_log() - initialize the ce event log
* @ce_id: copy engine id for which we are initializing the log
* @size: size of array to dedicate
*
* Currently the passed size is ignored in favor of a precompiled value.
*/
void ce_init_ce_desc_event_log(int ce_id, int size)
{
cdf_atomic_init(&hif_ce_desc_history_index[ce_id]);
}
#else
void hif_record_ce_desc_event(
int ce_id, enum hif_ce_event_type type,
union ce_desc *descriptor, void *memory,
int index)
{
}
inline void ce_init_ce_desc_event_log(int ce_id, int size)
{
}
#endif
/*
* Support for Copy Engine hardware, which is mainly used for
* communication between Host and Target over a PCIe interconnect.
@ -194,6 +291,7 @@ ce_send_nolock(struct CE_handle *copyeng,
return status;
}
{
enum hif_ce_event_type event_type = HIF_TX_GATHER_DESC_POST;
struct CE_src_desc *src_ring_base =
(struct CE_src_desc *)src_ring->base_addr_owner_space;
struct CE_src_desc *shadow_base =
@ -237,10 +335,18 @@ ce_send_nolock(struct CE_handle *copyeng,
/* WORKAROUND */
if (!shadow_src_desc->gather) {
event_type = HIF_TX_DESC_POST;
war_ce_src_ring_write_idx_set(scn, ctrl_addr,
write_index);
}
/* src_ring->write index hasn't been updated event though
* the register has allready been written to.
*/
hif_record_ce_desc_event(CE_state->id, event_type,
(union ce_desc *) shadow_src_desc, per_transfer_context,
src_ring->write_index);
src_ring->write_index = write_index;
status = CDF_STATUS_SUCCESS;
}
@ -442,6 +548,7 @@ int ce_send_fast(struct CE_handle *copyeng, cdf_nbuf_t *msdus,
struct CE_src_desc *shadow_src_desc =
CE_SRC_RING_TO_DESC(shadow_base, write_index);
hif_pm_runtime_get_noresume(scn);
msdu = msdus[i];
/*
@ -513,10 +620,15 @@ int ce_send_fast(struct CE_handle *copyeng, cdf_nbuf_t *msdus,
/* Write the final index to h/w one-shot */
if (i) {
src_ring->write_index = write_index;
/* Don't call WAR_XXX from here
* Just call XXX instead, that has the reqd. intel
*/
war_ce_src_ring_write_idx_set(scn, ctrl_addr, write_index);
if (hif_pm_runtime_get(scn) == 0) {
/* Don't call WAR_XXX from here
* Just call XXX instead, that has the reqd. intel
*/
war_ce_src_ring_write_idx_set(scn, ctrl_addr,
write_index);
hif_pm_runtime_put(scn);
}
}
cdf_spin_unlock_bh(&ce_state->ce_index_lock);
@ -574,6 +686,10 @@ ce_recv_buf_enqueue(struct CE_handle *copyeng,
dest_ring->per_transfer_context[write_index] =
per_recv_context;
hif_record_ce_desc_event(CE_state->id, HIF_RX_DESC_POST,
(union ce_desc *) dest_desc, per_recv_context,
write_index);
/* Update Destination Ring Write Index */
write_index = CE_RING_IDX_INCR(nentries_mask, write_index);
CE_DEST_RING_WRITE_IDX_SET(scn, ctrl_addr, write_index);
@ -764,6 +880,11 @@ ce_completed_recv_next_nolock(struct CE_state *CE_state,
goto done;
}
hif_record_ce_desc_event(CE_state->id, HIF_RX_DESC_COMPLETION,
(union ce_desc *) dest_desc,
dest_ring->per_transfer_context[sw_index],
sw_index);
dest_desc->nbytes = 0;
/* Return data from completed destination descriptor */
@ -925,6 +1046,11 @@ ce_completed_send_next_nolock(struct CE_state *CE_state,
struct CE_src_desc *src_desc =
CE_SRC_RING_TO_DESC(src_ring_base, sw_index);
#endif
hif_record_ce_desc_event(CE_state->id, HIF_TX_DESC_COMPLETION,
(union ce_desc *) shadow_src_desc,
src_ring->per_transfer_context[sw_index],
sw_index);
/* Return data from completed source descriptor */
*bufferp = HIF_CE_DESC_ADDR_TO_DMA(shadow_src_desc);
*nbytesp = shadow_src_desc->nbytes;
@ -1061,7 +1187,7 @@ ce_completed_send_next(struct CE_handle *copyeng,
* within it .
*/
void ce_per_engine_servicereap(struct ol_softc *scn, unsigned int CE_id)
void ce_per_engine_servicereap(struct ol_softc *scn, unsigned int ce_id)
{
void *CE_context;
void *transfer_context;
@ -1070,9 +1196,11 @@ void ce_per_engine_servicereap(struct ol_softc *scn, unsigned int CE_id)
unsigned int id;
unsigned int sw_idx, hw_idx;
uint32_t toeplitz_hash_result;
struct CE_state *CE_state = scn->ce_id_to_state[CE_id];
struct CE_state *CE_state = scn->ce_id_to_state[ce_id];
A_TARGET_ACCESS_BEGIN(scn);
hif_record_ce_desc_event(ce_id, HIF_CE_REAP_ENTRY,
NULL, NULL, 0);
/* Since this function is called from both user context and
* tasklet context the spinlock has to lock the bottom halves.
@ -1100,7 +1228,7 @@ void ce_per_engine_servicereap(struct ol_softc *scn, unsigned int CE_id)
&nbytes, &id, &sw_idx, &hw_idx,
&toeplitz_hash_result) ==
CDF_STATUS_SUCCESS) {
if (CE_id != CE_HTT_H2T_MSG) {
if (ce_id != CE_HTT_H2T_MSG) {
cdf_spin_unlock_bh(
&CE_state->ce_index_lock);
CE_state->send_cb(
@ -1127,6 +1255,9 @@ void ce_per_engine_servicereap(struct ol_softc *scn, unsigned int CE_id)
}
cdf_spin_unlock_bh(&CE_state->ce_index_lock);
hif_record_ce_desc_event(ce_id, HIF_CE_REAP_EXIT,
NULL, NULL, 0);
A_TARGET_ACCESS_END(scn);
}

View file

@ -203,6 +203,9 @@ static void ce_tasklet(unsigned long data)
struct ol_softc *scn = hif_ce_state->scn;
struct CE_state *CE_state = scn->ce_id_to_state[tasklet_entry->ce_id];
hif_record_ce_desc_event(tasklet_entry->ce_id, HIF_CE_TASKLET_ENTRY,
NULL, NULL, 0);
if (cdf_atomic_read(&scn->link_suspended)) {
HIF_ERROR("%s: ce %d tasklet fired after link suspend.",
__func__, tasklet_entry->ce_id);
@ -221,6 +224,8 @@ static void ce_tasklet(unsigned long data)
* Enable the interrupt only when there is no pending frames in
* any of the Copy Engine pipes.
*/
hif_record_ce_desc_event(tasklet_entry->ce_id,
HIF_CE_TASKLET_RESCHEDULE, NULL, NULL, 0);
ce_schedule_tasklet(tasklet_entry);
return;
}
@ -228,6 +233,9 @@ static void ce_tasklet(unsigned long data)
if (scn->target_status != OL_TRGET_STATUS_RESET)
ce_irq_enable(scn, tasklet_entry->ce_id);
hif_record_ce_desc_event(tasklet_entry->ce_id, HIF_CE_TASKLET_EXIT,
NULL, NULL, 0);
cdf_atomic_dec(&scn->active_tasklet_cnt);
}
/**
@ -301,6 +309,7 @@ static irqreturn_t ce_irq_handler(int irq, void *context)
ce_irq_disable(scn, ce_id);
ce_irq_status(scn, ce_id, &host_status);
cdf_atomic_inc(&scn->active_tasklet_cnt);
hif_record_ce_desc_event(ce_id, HIF_IRQ_EVENT, NULL, NULL, 0);
if (hif_napi_enabled(scn, ce_id))
hif_napi_schedule(scn, ce_id);
else

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2015-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -292,7 +292,7 @@ void hif_vote_link_down(void)
scn->linkstate_vote--;
if (scn->linkstate_vote == 0)
hif_bus_prevent_linkdown(false);
hif_bus_prevent_linkdown(scn, false);
}
/**
@ -313,7 +313,7 @@ void hif_vote_link_up(void)
scn->linkstate_vote++;
if (scn->linkstate_vote == 1)
hif_bus_prevent_linkdown(true);
hif_bus_prevent_linkdown(scn, true);
}
/**
@ -511,7 +511,7 @@ void hif_set_fw_info(void *scn, uint32_t target_fw_version)
*
* Return: scn
*/
CDF_STATUS hif_open(void)
CDF_STATUS hif_open(enum ath_hal_bus_type bus_type)
{
struct ol_softc *scn;
v_CONTEXT_t cds_context;
@ -536,6 +536,14 @@ CDF_STATUS hif_open(void)
cdf_atomic_init(&scn->tasklet_from_intr);
init_waitqueue_head(&scn->aps_osdev.event_queue);
scn->linkstate_vote = 0;
status = hif_bus_open(scn, bus_type);
if (status != CDF_STATUS_SUCCESS) {
HIF_ERROR("%s: hif_bus_open error = %d, bus_type = %d",
__func__, status, bus_type);
cds_free_context(cds_context, CDF_MODULE_ID_HIF, scn);
}
return status;
}
@ -592,16 +600,8 @@ CDF_STATUS hif_enable(void *hif_ctx, struct device *dev,
return CDF_STATUS_E_NULL_VALUE;
}
status = hif_bus_open(scn, bus_type);
if (status != CDF_STATUS_SUCCESS) {
HIF_ERROR("%s: hif_bus_open error = %d, bus_type = %d",
__func__, status, bus_type);
return status;
}
status = hif_enable_bus(scn, dev, bdev, bid, type);
if (status != CDF_STATUS_SUCCESS) {
hif_bus_close(scn);
HIF_ERROR("%s: hif_enable_bus error = %d",
__func__, status);
return status;
@ -613,7 +613,6 @@ CDF_STATUS hif_enable(void *hif_ctx, struct device *dev,
if (hif_config_ce(scn)) {
HIF_ERROR("%s: Target probe failed.", __func__);
hif_disable_bus(scn->aps_osdev.bdev);
hif_bus_close(scn);
status = CDF_STATUS_E_FAILURE;
return status;
}
@ -652,7 +651,7 @@ void hif_pktlogmod_exit(void *hif_ctx)
{
struct ol_softc *scn = hif_ctx;
if (scn && cds_get_conparam() != CDF_FTM_MODE &&
if (scn && cds_get_conparam() != CDF_GLOBAL_FTM_MODE &&
!WLAN_IS_EPPING_ENABLED(cds_get_conparam()) && scn->pkt_log_init) {
pktlogmod_exit(scn);
scn->pkt_log_init = false;
@ -664,13 +663,6 @@ void hif_pktlogmod_exit(void *hif_ctx)
}
#endif
#if ((!defined(QCA_WIFI_3_0_IHELIUM) && !defined(QCA_WIFI_3_0_ADRASTEA)) || defined(CONFIG_ICNSS))
static inline void cnss_pcie_notify_q6(void)
{
return;
}
#endif
/**
* hif_wlan_disable(): call the platform driver to disable wlan
*
@ -684,17 +676,12 @@ void hif_wlan_disable(void)
enum icnss_driver_mode mode;
uint32_t con_mode = cds_get_conparam();
switch (con_mode) {
case CDF_FTM_MODE:
if (CDF_GLOBAL_FTM_MODE == con_mode)
mode = ICNSS_FTM;
break;
case CDF_EPPING_MODE:
else if (WLAN_IS_EPPING_ENABLED(cds_get_conparam()))
mode = ICNSS_EPPING;
break;
default:
else
mode = ICNSS_MISSION;
break;
}
icnss_wlan_disable(mode);
}
@ -718,12 +705,6 @@ void hif_disable(void *hif_ctx, enum hif_disable_type type)
if (scn->aps_osdev.bdev)
hif_disable_bus(scn->aps_osdev.bdev);
if (IHELIUM_BU) {
cnss_pcie_notify_q6();
HIF_TRACE("%s: cnss_pcie_notify_q6 done, notice_send= %d",
__func__, scn->notice_send);
}
hif_wlan_disable();
scn->notice_send = false;
@ -782,7 +763,7 @@ void hif_crash_shutdown(void *hif_ctx)
return;
}
if (cds_is_load_unload_in_progress()) {
if (cds_is_load_or_unload_in_progress()) {
HIF_ERROR("%s: Load/unload is in progress, ignore!", __func__);
return;
}

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2013-2015 The Linux Foundation. All rights reserved.
* Copyright (c) 2013-2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@ -73,12 +73,6 @@ bool hif_target_forced_awake(struct ol_softc *scn);
#define MAX_NUM_OF_RECEIVES 1000
#endif /* SLUB_DEBUG_ON / FEATURE_NAPI */
#ifdef QCA_WIFI_3_0_IHELIUM
#define IHELIUM_BU 1
#else
#define IHELIUM_BU 0
#endif
#ifdef QCA_WIFI_3_0_ADRASTEA
#define ADRASTEA_BU 1
#else
@ -101,7 +95,7 @@ bool hif_target_forced_awake(struct ol_softc *scn);
#define AR6320_FW_3_2 (0x32)
#define ADRASTEA_DEVICE_ID (0xabcd)
#define ADRASTEA_DEVICE_ID_P2_E12 (0x7021)
#if (defined(QVIT) || defined (QCA_WIFI_3_0_IHELIUM))
#if (defined(QVIT))
#define QCA6180_DEVICE_ID (0xabcd)
#else
#define QCA6180_DEVICE_ID (0x041)
@ -137,6 +131,6 @@ CDF_STATUS hif_bus_open(struct ol_softc *ol_sc,
CDF_STATUS hif_enable_bus(struct ol_softc *ol_sc, struct device *dev,
void *bdev, const hif_bus_id *bid, enum hif_enable_type type);
void hif_disable_bus(void *bdev);
void hif_bus_prevent_linkdown(bool flag);
void hif_bus_prevent_linkdown(struct ol_softc *scn, bool flag);
#endif /* __HIF_MAIN_H__ */

View file

@ -93,6 +93,17 @@ int icnss_wlan_disable(enum icnss_driver_mode mode)
return 0;
}
/**
* icnss_set_fw_debug_mode() - icnss_set_fw_debug_mode
* @mode: fw debug mode, 0 for QXDM, 1 for WMI
*
* Return: int
*/
int icnss_set_fw_debug_mode(bool mode)
{
return 0;
}
#else
/**
@ -167,6 +178,22 @@ int icnss_wlan_disable(enum icnss_driver_mode con_mode)
cnss_wlan_disable(mode);
return 0;
}
/**
* icnss_set_fw_debug_mode() - call the platform driver to set fw
* debug mode
* @mode: fw debug mode, 0 for QXDM, 1 for WMI
*
* This function passes the fw debug mode to platform driver.
* cnss_set_fw_debug_mode has been hacked to do a qmi handshake with fw.
* This is not needed for rome.
*
* Return: int
*/
int icnss_set_fw_debug_mode(bool mode)
{
return cnss_set_fw_debug_mode(mode);
}
#endif
/**

Some files were not shown because too many files have changed in this diff Show more