diff options
29 files changed, 640 insertions, 60 deletions
diff --git a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/HTT/htt_rx.c b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/HTT/htt_rx.c index b2840abcf629..a6ad4b837033 100644 --- a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/HTT/htt_rx.c +++ b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/HTT/htt_rx.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011-2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2011-2019 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -3354,7 +3354,10 @@ htt_rx_hash_list_lookup(struct htt_pdev_t *pdev, u_int32_t paddr) if (netbuf == NULL) { adf_os_print("rx hash: %s: no entry found for 0x%x!!!\n", __FUNCTION__, paddr); - HTT_ASSERT_ALWAYS(0); + if (vos_is_self_recovery_enabled()) + vos_trigger_recovery(false); + else + HTT_ASSERT_ALWAYS(0); } return netbuf; diff --git a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TLSHIM/tl_shim.c b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TLSHIM/tl_shim.c index c4d70b6dee65..7f44e92e24fd 100644 --- a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TLSHIM/tl_shim.c +++ b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TLSHIM/tl_shim.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2019 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -850,6 +850,7 @@ static int tlshim_mgmt_rx_process(void *context, u_int8_t *data, if (efrm - (uint8_t *)wh < sizeof(*wh) + vos_get_mmie_size()) { TLSHIM_LOGE("Invalid frame length"); + vos_pkt_return_packet(rx_pkt); return 0; } key_id = (u_int16_t)*(efrm - vos_get_mmie_size() + 2); diff --git a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_rx.c b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_rx.c index d36ed4803595..95b1c0de160f 100644 --- a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_rx.c +++ b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_rx.c @@ -433,6 +433,10 @@ static void ol_pop_rx_stats(htt_pdev_handle htt_pdev, static struct sa_rx_stats_feedback *ol_rx_feedback_alloc(uint32_t mpdu_num) { struct sa_rx_stats_feedback *fb; + + if (!sa_get_handle()) + return NULL; + fb = adf_os_mem_alloc(NULL, sizeof(struct sa_rx_stats_feedback) + mpdu_num * sizeof(struct sa_rx_mpdu_stats)); @@ -1909,6 +1913,9 @@ static void ol_pop_user_common_array_tlv(ol_txrx_pdev_handle pdev, struct ol_txrx_peer_t *peer; struct sa_tx_stats_feedback ppdu_stats; + if (!sa_get_handle()) + return; + tag_buf++; ppdu_num = *tag_buf; tag_buf++; diff --git a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_tx_send.c b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_tx_send.c index 7823b3aa0f59..007dfd418ed3 100644 --- a/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_tx_send.c +++ b/drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_tx_send.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011-2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2011-2019 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -887,20 +887,20 @@ ol_tx_dump_group_credit_stats(ol_txrx_pdev_handle pdev) for (j = 0; j < OL_TX_MAX_TXQ_GROUPS; j++) { adf_os_spin_lock_bh(&pdev->grp_stat_spinlock); curr_credit = pdev->grp_stats.stats[curr_index].grp[j].credit; - if (!is_break) - old_credit = pdev->grp_stats.stats[old_index].grp[j].credit; mem_vdevs = pdev->grp_stats.stats[curr_index].grp[j].member_vdevs; adf_os_spin_unlock_bh(&pdev->grp_stat_spinlock); - if (!is_break) + if (!is_break) { + old_credit = pdev->grp_stats.stats[old_index].grp[j].credit; VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_ERROR, "%4d: %5d: %6d %6d %8x",curr_index, j, curr_credit, (curr_credit - old_credit), mem_vdevs); - else + } else { VOS_TRACE(VOS_MODULE_ID_TXRX, VOS_TRACE_LEVEL_ERROR, "%4d: %5d: %6d %6s %8x",curr_index, j, curr_credit, "NA", mem_vdevs); + } } if (is_break) diff --git a/drivers/staging/qcacld-2.0/CORE/HDD/inc/qc_sap_ioctl.h b/drivers/staging/qcacld-2.0/CORE/HDD/inc/qc_sap_ioctl.h index 18d7df8cb804..4c16bb0e7d5b 100644 --- a/drivers/staging/qcacld-2.0/CORE/HDD/inc/qc_sap_ioctl.h +++ b/drivers/staging/qcacld-2.0/CORE/HDD/inc/qc_sap_ioctl.h @@ -272,6 +272,7 @@ enum { QCSAP_ENABLE_RTS_BURSTING, QCSAP_ENABLE_DYNAMIC_BW, QCSAP_GET_DYNAMIC_BW, + QCSAP_SET_CANDIDATE_CH, }; int iw_get_channel_list(struct net_device *dev, diff --git a/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_assoc.h b/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_assoc.h index 45fe33c7b9ea..166ca054eb37 100644 --- a/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_assoc.h +++ b/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_assoc.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2019 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -138,12 +138,16 @@ struct hdd_conn_flag { * @mcs: mcs index if struct describes a 802.11n bitrate * @legacy: bitrate in 100kbit/s for 802.11abg * @nss: number of streams (VHT only) + * @bw: bandwidth (from &enum rate_info_bw) */ struct rate_info_ex { uint8_t flags; uint8_t mcs; uint16_t legacy; uint8_t nss; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 0, 0)) + uint8_t bw; +#endif }; /**This structure stores the connection information */ diff --git a/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_cfg.h b/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_cfg.h index fd3796afbebf..56ab7a2c1058 100644 --- a/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_cfg.h +++ b/drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_cfg.h @@ -5673,6 +5673,42 @@ FG_BTC_BT_INTERVAL_PAGE_P2P_STA_DEFAULT #define CFG_IS_PER_CHAIN_STATS_ENABLED_MIN (0) #define CFG_IS_PER_CHAIN_STATS_ENABLED_MAX (1) +#ifdef WLAN_SMART_ANTENNA_FEATURE +/* + * <ini> + * smart_antenna_cfg - Config parameters for smart antenna + * @Min: 0 + * @Max: 0xFF + * @Default: 0 + * + * This ini is used for smart antenna config. Subfields of the + * parameter looks like this: + * + * |31 10|9 1| 0 | + * |---------------------+-------------+-------| + * | rsvd | debug level | Enable| + * |---------------------+-------------+-------| + * b'0: - enable/disable: 1 enable/ 0 disable + * b'1:9 - debug level. 0001: fatal error + * 0010: error + * 0100: debug + * 1000: info + * Relate: None + * + * Supported Feature: Smart Antenna + * Usage: External + * + * </ini> + */ +#define CFG_SMART_ANTENNA_PARAM "smart_antenna_cfg" +#define CFG_SMART_ANTENNA_PARAM_DEFAULT (0) +#define CFG_SMART_ANTENNA_PARAM_MIN (0) +#define CFG_SMART_ANTENNA_PARAM_MAX (0xFF) + +#define SMART_ANT_ENABLED 1 +#else +#define SMART_ANT_ENABLED 0 +#endif /*--------------------------------------------------------------------------- Type declarations -------------------------------------------------------------------------*/ @@ -6611,6 +6647,10 @@ struct hdd_config { bool is_sae_enabled; #endif bool per_chain_stats_enabled; + +#ifdef WLAN_SMART_ANTENNA_FEATURE + uint32_t smart_antenna_cfg; +#endif }; typedef struct hdd_config hdd_config_t; diff --git a/drivers/staging/qcacld-2.0/CORE/HDD/src/wlan_hdd_assoc.c b/drivers/staging/qcacld-2.0/CORE/HDD/src/wlan_hdd_assoc.c index 154eb8879021..aeea0895a12e 100644 --- a/drivers/staging/qcacld-2.0/CORE/HDD/src/wlan_hdd_assoc.c +++ b/drivers/staging/qcacld-2.0/CORE/HDD/src/wlan_hdd_assoc.c @@ -5626,6 +5626,12 @@ int hdd_set_csr_auth_type ( hdd_adapter_t *pAdapter, eCsrAuthType RSNAuthType) hddLog(LOG1, "updated profile authtype as %d", RSNAuthType); } else #endif + if ((RSNAuthType == eCSR_AUTH_TYPE_SAE) && + ((pWextState->authKeyMgmt & IW_AUTH_KEY_MGMT_802_1X) + == IW_AUTH_KEY_MGMT_802_1X)) { + /* SAE case */ + pRoamProfile->AuthType.authType[0] = eCSR_AUTH_TYPE_SAE; + } else if ((RSNAuthType == eCSR_AUTH_TYPE_OWE) && ((pWextState->authKeyMgmt & IW_AUTH_KEY_MGMT_802_1X) == IW_AUTH_KEY_MGMT_802_1X)) { diff --git a/drivers/staging/qcacld-2.0/CORE/HDD/src/wlan_hdd_cfg.c b/drivers/staging/qcacld-2.0/CORE/HDD/src/wlan_hdd_cfg.c index 6cacd10bfe40..e49b5611de34 100644 --- a/drivers/staging/qcacld-2.0/CORE/HDD/src/wlan_hdd_cfg.c +++ b/drivers/staging/qcacld-2.0/CORE/HDD/src/wlan_hdd_cfg.c @@ -5482,9 +5482,18 @@ REG_TABLE_ENTRY g_registry_table[] = REG_VARIABLE(CFG_IS_PER_CHAIN_STATS_ENABLED_NAME, WLAN_PARAM_Integer, struct hdd_config, per_chain_stats_enabled, VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT, - CFG_IS_SAE_ENABLED_DEFAULT, - CFG_IS_SAE_ENABLED_MIN, - CFG_IS_SAE_ENABLED_MAX), + CFG_IS_PER_CHAIN_STATS_ENABLED_DEFAULT, + CFG_IS_PER_CHAIN_STATS_ENABLED_MIN, + CFG_IS_PER_CHAIN_STATS_ENABLED_MAX), + +#ifdef WLAN_SMART_ANTENNA_FEATURE + REG_VARIABLE(CFG_SMART_ANTENNA_PARAM, WLAN_PARAM_Integer, + struct hdd_config, smart_antenna_cfg, + VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT, + CFG_SMART_ANTENNA_PARAM_DEFAULT, + CFG_SMART_ANTENNA_PARAM_MIN, + CFG_SMART_ANTENNA_PARAM_MAX), +#endif }; diff --git a/drivers/staging/qcacld-2.0/CORE/HDD/src/wlan_hdd_cfg80211.c b/drivers/staging/qcacld-2.0/CORE/HDD/src/wlan_hdd_cfg80211.c index 8857c403c74b..bb705ea79433 100644 --- a/drivers/staging/qcacld-2.0/CORE/HDD/src/wlan_hdd_cfg80211.c +++ b/drivers/staging/qcacld-2.0/CORE/HDD/src/wlan_hdd_cfg80211.c @@ -14376,6 +14376,9 @@ static int32_t hdd_add_tx_bitrate(struct sk_buff *skb, txrate.mcs = hdd_sta_ctx->cache_conn_info.txrate.mcs; txrate.legacy = hdd_sta_ctx->cache_conn_info.txrate.legacy; txrate.nss = hdd_sta_ctx->cache_conn_info.txrate.nss; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 0, 0)) + txrate.bw = hdd_sta_ctx->cache_conn_info.txrate.bw; +#endif bitrate = cfg80211_calculate_bitrate(&txrate); @@ -14383,6 +14386,9 @@ static int32_t hdd_add_tx_bitrate(struct sk_buff *skb, hdd_sta_ctx->cache_conn_info.txrate.mcs = txrate.mcs; hdd_sta_ctx->cache_conn_info.txrate.legacy = txrate.legacy; hdd_sta_ctx->cache_conn_info.txrate.nss = txrate.nss; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 0, 0)) + hdd_sta_ctx->cache_conn_info.txrate.bw = txrate.bw; +#endif /* report 16-bit bitrate only if we can */ bitrate_compat = bitrate < (1UL << 16) ? bitrate : 0; @@ -25012,7 +25018,11 @@ static int __wlan_hdd_cfg80211_connect( struct wiphy *wiphy, req->bssid, req->ssid, req->ssid_len); if (bss) { - cfg80211_assoc_timeout(ndev, bss); +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)) + cfg80211_assoc_timeout(ndev,bss); +#else + cfg80211_send_assoc_timeout(ndev, bss->bssid); +#endif return -ETIMEDOUT; } } @@ -27734,6 +27744,9 @@ static int __wlan_hdd_cfg80211_get_station(struct wiphy *wiphy, pHddStaCtx->conn_info.txrate.mcs = sinfo->txrate.mcs; pHddStaCtx->conn_info.txrate.legacy = sinfo->txrate.legacy; pHddStaCtx->conn_info.txrate.nss = sinfo->txrate.nss; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 0, 0)) + pHddStaCtx->conn_info.txrate.bw = sinfo->txrate.bw; +#endif vos_mem_copy(&pHddStaCtx->cache_conn_info.txrate, &pHddStaCtx->conn_info.txrate, sizeof(pHddStaCtx->conn_info.txrate)); diff --git a/drivers/staging/qcacld-2.0/CORE/HDD/src/wlan_hdd_hostapd.c b/drivers/staging/qcacld-2.0/CORE/HDD/src/wlan_hdd_hostapd.c index 0cdf00ad0811..d1735ff2e893 100644 --- a/drivers/staging/qcacld-2.0/CORE/HDD/src/wlan_hdd_hostapd.c +++ b/drivers/staging/qcacld-2.0/CORE/HDD/src/wlan_hdd_hostapd.c @@ -4633,6 +4633,15 @@ static __iw_softap_setparam(struct net_device *dev, set_value, PDEV_CMD); break; + case QCSAP_SET_CANDIDATE_CH: + { + ptSapContext sap_ctx = WLAN_HDD_GET_SAP_CTX_PTR(pHostapdAdapter); + + hddLog(LOG1, "QCSAP_SET_CANDIDATE_CH val %d", set_value); + sap_ctx->candidate_ch = set_value; + break; + } + default: hddLog(LOGE, FL("Invalid setparam command %d value %d"), sub_cmd, set_value); @@ -7414,6 +7423,10 @@ static const struct iw_priv_args hostapd_private_args[] = { 0, "cwmenable" }, + { QCSAP_SET_CANDIDATE_CH, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, + 0, + "candidate_ch" }, { QCSAP_IOCTL_GETPARAM, 0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getparam" }, diff --git a/drivers/staging/qcacld-2.0/CORE/HDD/src/wlan_hdd_main.c b/drivers/staging/qcacld-2.0/CORE/HDD/src/wlan_hdd_main.c index 72a1309126cf..3a455aea26d4 100644 --- a/drivers/staging/qcacld-2.0/CORE/HDD/src/wlan_hdd_main.c +++ b/drivers/staging/qcacld-2.0/CORE/HDD/src/wlan_hdd_main.c @@ -187,6 +187,9 @@ static struct kparam_string fwpath = { static char *country_code; static int enable_11d = -1; static int enable_dfs_chan_scan = -1; +#ifdef FEATURE_LARGE_PREALLOC +static char *version_string = QWLAN_VERSIONSTR; +#endif #ifndef MODULE static int wlan_hdd_inited; @@ -18295,7 +18298,9 @@ static int hdd_driver_init( void) return ret_status; } - +#ifdef FEATURE_LARGE_PREALLOC +EXPORT_SYMBOL(hdd_driver_init); +#endif /**--------------------------------------------------------------------------- \brief hdd_module_init() - Init Function @@ -18307,6 +18312,7 @@ static int hdd_driver_init( void) \return - 0 for success, non zero for failure --------------------------------------------------------------------------*/ +#ifndef FEATURE_LARGE_PREALLOC #ifdef MODULE static int __init hdd_module_init ( void) { @@ -18319,6 +18325,7 @@ static int __init hdd_module_init ( void) return 0; } #endif /* #ifdef MODULE */ +#endif /* #ifndef FEATURE_LARGE_PREALLOC*/ static struct timer_list unload_timer; static bool unload_timer_started; @@ -18510,6 +18517,9 @@ done: hdd_wlan_wakelock_destroy(); pr_info("%s: driver unloaded\n", WLAN_MODULE_NAME); } +#ifdef FEATURE_LARGE_PREALLOC +EXPORT_SYMBOL(hdd_driver_exit); +#endif /**--------------------------------------------------------------------------- @@ -18522,6 +18532,7 @@ done: \return - None --------------------------------------------------------------------------*/ +#ifndef FEATURE_LARGE_PREALLOC static void __exit hdd_module_exit(void) { hdd_driver_exit(); @@ -18615,6 +18626,7 @@ static int con_mode_handler(const char *kmessage, #endif #endif /* #ifdef MODULE */ +#endif /**--------------------------------------------------------------------------- \brief hdd_get_conparam() - @@ -20867,6 +20879,7 @@ void hdd_initialize_adapter_common(hdd_adapter_t *adapter) } //Register the module init/exit functions +#ifndef FEATURE_LARGE_PREALLOC module_init(hdd_module_init); module_exit(hdd_module_exit); @@ -20905,3 +20918,26 @@ module_param(enable_11d, int, module_param(country_code, charp, S_IRUSR | S_IRGRP | S_IROTH); +#else /* FEATURE_LARGE_PREALLOC */ + +/** + * register_wlan_module_parameters_callback() - set module params + * @con_mode_set: con_mode + * @country_code_set: pointer to country code + * @version_string_set: pointer to version string + * + * At the time of driver startup, set basic initial params + * + * No return + */ +void register_wlan_module_parameters_callback(int con_mode_set, + char* country_code_set, + char* version_string_set +) +{ + con_mode = con_mode_set; + country_code = country_code_set; + version_string = version_string_set; +} +EXPORT_SYMBOL(register_wlan_module_parameters_callback); +#endif /* #ifndef FEATURE_LARGE_PREALLOC */ diff --git a/drivers/staging/qcacld-2.0/CORE/HDD/src/wlan_hdd_main_module.c b/drivers/staging/qcacld-2.0/CORE/HDD/src/wlan_hdd_main_module.c new file mode 100644 index 000000000000..941be50461fb --- /dev/null +++ b/drivers/staging/qcacld-2.0/CORE/HDD/src/wlan_hdd_main_module.c @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2019 The Linux Foundation. All rights reserved. + * + * Permission to use, copy, modify, and/or distribute this software for + * any purpose with or without fee is hereby granted, provided that the + * above copyright notice and this permission notice appear in all + * copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL + * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE + * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ +/*Gerbera - WiFi*/ +/* + */ + + +/*======================================================================== + + \file wlan_hdd_main_module.c + + \brief WLAN Host Device Driver module interface implementation + + ========================================================================*/ + +/*-------------------------------------------------------------------------- + Include Files + ------------------------------------------------------------------------*/ +#include <linux/module.h> +#include "qwlan_version.h" + +static char *country_code; +static char *version_string = QWLAN_VERSIONSTR; +static int con_mode; + +extern void register_wlan_module_parameters_callback(int con_mode_set, + char* country_code_set, + char* version_string_set +); + +extern int hdd_driver_init(void); +extern void hdd_driver_exit(void); + +static int __init hdd_module_init ( void) +{ + register_wlan_module_parameters_callback( + con_mode, + country_code, + version_string + ); + + return hdd_driver_init(); +} + +void __exit hdd_module_exit(void) +{ + hdd_driver_exit(); + + register_wlan_module_parameters_callback( + con_mode, + country_code, + version_string + ); +} + +//Register the module init/exit functions +module_init(hdd_module_init); +module_exit(hdd_module_exit); + +MODULE_DESCRIPTION("WLAN HOST DEVICE DRIVER"); + +#if defined(QCA_WIFI_FTM) +module_param(con_mode, int, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); +#else +module_param_call(con_mode, con_mode_handler, param_get_int, &con_mode, + S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); +#endif + +module_param(country_code, charp, + S_IRUSR | S_IRGRP | S_IROTH); + +module_param(version_string, charp, + S_IRUSR | S_IRGRP | S_IROTH); diff --git a/drivers/staging/qcacld-2.0/CORE/MAC/src/include/sirParams.h b/drivers/staging/qcacld-2.0/CORE/MAC/src/include/sirParams.h index 6e9b5b30545c..7ac71e536731 100644 --- a/drivers/staging/qcacld-2.0/CORE/MAC/src/include/sirParams.h +++ b/drivers/staging/qcacld-2.0/CORE/MAC/src/include/sirParams.h @@ -826,6 +826,9 @@ struct sir_mgmt_msg { #define SIR_HAL_SET_LL_STAT_PRIMARY_PEER (SIR_HAL_ITC_MSG_TYPES_BEGIN + 388) #define SIR_HAL_SET_RX_SMART_ANTENNA (SIR_HAL_ITC_MSG_TYPES_BEGIN + 389) +#define SIR_HAL_SET_GPIO_CFG (SIR_HAL_ITC_MSG_TYPES_BEGIN + 390) +#define SIR_HAL_SET_GPIO_OUTPUT (SIR_HAL_ITC_MSG_TYPES_BEGIN + 391) + #define SIR_HAL_MSG_TYPES_END (SIR_HAL_MSG_TYPES_BEGIN + 0x1FF) // CFG message types diff --git a/drivers/staging/qcacld-2.0/CORE/SAP/src/sapFsm.c b/drivers/staging/qcacld-2.0/CORE/SAP/src/sapFsm.c index 0f10c9e70a44..2f36b0144643 100644 --- a/drivers/staging/qcacld-2.0/CORE/SAP/src/sapFsm.c +++ b/drivers/staging/qcacld-2.0/CORE/SAP/src/sapFsm.c @@ -4206,7 +4206,15 @@ sapFsm v_U8_t ch; /* find a new available channel */ - ch = sapRandomChannelSel(sapContext); + if (sapContext->candidate_ch && + !VOS_IS_DFS_CH(sapContext->candidate_ch) && + sapContext->candidate_ch != sapContext->channel) { + ch = sapContext->candidate_ch; + VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_DEBUG, + FL("Candidate channel exist, ch= %d"), ch); + } else { + ch = sapRandomChannelSel(sapContext); + } if (ch == 0) { /* No available channel found */ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, @@ -5409,7 +5417,16 @@ v_U8_t sapIndicateRadar(ptSapContext sapContext, tSirSmeDfsEventInd *dfs_event) * (5) Create the available channel list with the above rules */ - target_channel = sapRandomChannelSel(sapContext); + if (sapContext->candidate_ch && + !VOS_IS_DFS_CH(sapContext->candidate_ch) && + sapContext->candidate_ch != sapContext->channel) { + target_channel = sapContext->candidate_ch; + VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_DEBUG, + FL("Candidate channel exist, ch= %d"), target_channel); + } else { + target_channel = sapRandomChannelSel(sapContext); + } + if (0 == target_channel) { sapSignalHDDevent(sapContext, NULL, eSAP_DFS_NO_AVAILABLE_CHANNEL, diff --git a/drivers/staging/qcacld-2.0/CORE/SAP/src/sapInternal.h b/drivers/staging/qcacld-2.0/CORE/SAP/src/sapInternal.h index 79da55f8b182..aa95f05e0c84 100644 --- a/drivers/staging/qcacld-2.0/CORE/SAP/src/sapInternal.h +++ b/drivers/staging/qcacld-2.0/CORE/SAP/src/sapInternal.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2017 The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2017, 2019 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -181,6 +181,9 @@ typedef struct sSapContext { v_U32_t channel; v_U32_t secondary_ch; + // Include the candidate channel of AP + v_U32_t candidate_ch; + // Include the SME(CSR) sessionId here v_U8_t sessionId; diff --git a/drivers/staging/qcacld-2.0/CORE/SERVICES/COMMON/wma_api.h b/drivers/staging/qcacld-2.0/CORE/SERVICES/COMMON/wma_api.h index 0b8e197094b0..35094bbeb272 100644 --- a/drivers/staging/qcacld-2.0/CORE/SERVICES/COMMON/wma_api.h +++ b/drivers/staging/qcacld-2.0/CORE/SERVICES/COMMON/wma_api.h @@ -193,4 +193,6 @@ void wma_tx_failure_cb(void *ctx, uint32_t num_msdu, VOS_STATUS wma_set_ac_txq_optimize(void *wda_handle, uint8_t value); VOS_STATUS wma_set_rx_antanna(void *wma_handle, uint8_t pdev_id, uint32_t matrix); +VOS_STATUS wma_set_gpio_cfg(void *handle, struct hal_gpio_cfg *gpio_cfg); +VOS_STATUS wma_set_gpio_output(void *handle, struct hal_gpio_output *output); #endif diff --git a/drivers/staging/qcacld-2.0/CORE/SERVICES/SA/smart_ant.h b/drivers/staging/qcacld-2.0/CORE/SERVICES/SA/smart_ant.h index 3186817ecf7b..650293fbc238 100644 --- a/drivers/staging/qcacld-2.0/CORE/SERVICES/SA/smart_ant.h +++ b/drivers/staging/qcacld-2.0/CORE/SERVICES/SA/smart_ant.h @@ -42,10 +42,10 @@ } \ } while (0) -#define SMART_ANTENNA_FATAL 0x0001 -#define SMART_ANTENNA_ERROR 0x0010 -#define SMART_ANTENNA_DEBUG 0x0100 -#define SMART_ANTENNA_INFO 0x1000 +#define SMART_ANTENNA_FATAL BIT(0) +#define SMART_ANTENNA_ERROR BIT(1) +#define SMART_ANTENNA_DEBUG BIT(2) +#define SMART_ANTENNA_INFO BIT(3) #define SMART_ANTENNA_DEFAULT_LEVEL \ SMART_ANTENNA_FATAL | SMART_ANTENNA_ERROR | \ SMART_ANTENNA_DEBUG | SMART_ANTENNA_INFO @@ -54,6 +54,18 @@ #define SA_MAX_SUPPORTED_RATES 128 #define SMART_ANTENNA_DEFAULT_INTERFACE "dft" +#define SMART_ANTENNA_ENABLED_MASK 0x1 +#define SMART_ANTENNA_ENABLED_SHIFT 0 + +#define SMART_ANTENNA_DEBUG_LEVEL_MASK 0x1e +#define SMART_ANTENNA_DEBUG_LEVEL_SHIFT 0x1 + +#define SMART_ANTENNA(cfg, field) \ + (((cfg) & SMART_ANTENNA_##field##_MASK) >> \ + SMART_ANTENNA_##field##_SHIFT) +#define SMART_ANTENNA_ENABLED(cfg) SMART_ANTENNA(cfg, ENABLED) +#define SMART_ANTENNA_DEBUG_LEVEL(cfg) SMART_ANTENNA(cfg, DEBUG_LEVEL) + /* State of this module */ #define SMART_ANT_STATE_ATTACHED BIT(0) #define SMART_ANT_STATE_INIT_DONE BIT(1) @@ -88,7 +100,7 @@ struct smart_ant { adf_os_atomic_t sa_init; struct sa_ops sap_ops; struct smartantenna_ops *sa_callbacks; - adf_os_spinlock_t sa_lock; + rwlock_t node_ref_lock; TAILQ_HEAD(, sa_node) node_list; }; #endif diff --git a/drivers/staging/qcacld-2.0/CORE/SERVICES/SA/smart_antenna.c b/drivers/staging/qcacld-2.0/CORE/SERVICES/SA/smart_antenna.c index 8e14c94c165e..add1a511e982 100644 --- a/drivers/staging/qcacld-2.0/CORE/SERVICES/SA/smart_antenna.c +++ b/drivers/staging/qcacld-2.0/CORE/SERVICES/SA/smart_antenna.c @@ -115,6 +115,19 @@ static int __smart_ant_deinit(struct smart_ant *sa) return SMART_ANT_STATUS_SUCCESS; } +union sa_mac { + uint8_t raw[6]; + struct { + uint32_t bytes_abcd; + uint16_t bytes_ef; + } align4; +}; + +static inline bool sa_mac_compare(union sa_mac *addr1, union sa_mac *addr2) +{ + return ((addr1->align4.bytes_abcd == addr2->align4.bytes_abcd) & + (addr1->align4.bytes_ef == addr2->align4.bytes_ef)); +} /** * sa_get_node() - Get one node from the node list and increase the ref count * @sa: smart antenna handle @@ -127,26 +140,29 @@ static struct sa_node * sa_get_node(struct smart_ant *sa, uint8_t *mac_addr, bool inc) { - struct sa_node *node, *tmp_node; + struct sa_node *node; if (!sa || !mac_addr) return NULL; - adf_os_spin_lock(&sa->sa_lock); - TAILQ_FOREACH_SAFE(node, &sa->node_list, sa_elm, tmp_node) { - adf_os_spin_unlock(&sa->sa_lock); - if (vos_mem_compare(node->node_info.mac_addr, mac_addr, 6)) { - SA_DPRINTK(sa, SMART_ANTENNA_DEBUG, - "%s: Node found "MAC_ADDRESS_STR, - __func__, MAC_ADDR_ARRAY(mac_addr)); - if (inc == true) - adf_os_atomic_inc(&node->ref_count); - return node; + if (!read_trylock(&sa->node_ref_lock)) + return NULL; + + node = NULL; + TAILQ_FOREACH(node, &sa->node_list, sa_elm) { + if (sa_mac_compare((union sa_mac *)node->node_info.mac_addr, + (union sa_mac *)mac_addr)) { + if (adf_os_atomic_inc_return(&node->ref_count) <= 1) + node = NULL; + break; } - adf_os_spin_lock(&sa->sa_lock); } - adf_os_spin_unlock(&sa->sa_lock); - return NULL; + read_unlock(&sa->node_ref_lock); + + SA_DPRINTK(sa, SMART_ANTENNA_DEBUG, + "%s: Node%p found "MAC_ADDRESS_STR, + __func__, node, MAC_ADDR_ARRAY(mac_addr)); + return node; } /** @@ -162,12 +178,12 @@ static void sa_put_node(struct smart_ant *sa, struct sa_node *node) return; if (adf_os_atomic_dec_and_test(&node->ref_count)) { + write_lock(&sa->node_ref_lock); + TAILQ_REMOVE(&sa->node_list, node, sa_elm); + write_unlock(&sa->node_ref_lock); SA_DPRINTK(sa, SMART_ANTENNA_DEBUG, "%s: Node "MAC_ADDRESS_STR" is released", __func__, MAC_ADDR_ARRAY(node->node_info.mac_addr)); - adf_os_spin_lock(&sa->sa_lock); - TAILQ_REMOVE(&sa->node_list, node, sa_elm); - adf_os_spin_unlock(&sa->sa_lock); vos_mem_free(node); } } @@ -183,7 +199,7 @@ static void __smart_ant_node_connect(struct smart_ant *sa, { void *node_ccp; struct smartantenna_ops *sa_ops; - struct sa_node *new_node, *old_node, *tmp_node; + struct sa_node *new_node, *old_node; if (sa == NULL) { SA_DPRINTK(sa, SMART_ANTENNA_FATAL, @@ -236,22 +252,21 @@ static void __smart_ant_node_connect(struct smart_ant *sa, new_node->node_ccp = node_ccp; /* insert the SA node to list */ - adf_os_spin_lock(&sa->sa_lock); - TAILQ_FOREACH_SAFE(old_node, &sa->node_list, sa_elm, tmp_node) { - adf_os_spin_unlock(&sa->sa_lock); + write_lock(&sa->node_ref_lock); + TAILQ_FOREACH(old_node, &sa->node_list, sa_elm) { if (vos_mem_compare(old_node->node_info.mac_addr, node_info->mac_addr, 6)) { + old_node->node_ccp = node_ccp; + write_unlock(&sa->node_ref_lock); SA_DPRINTK(sa, SMART_ANTENNA_DEBUG, "%s: Node already exists in the connected list.", __func__); - old_node->node_ccp = node_ccp; goto error; } - adf_os_spin_lock(&sa->sa_lock); } adf_os_atomic_set(&new_node->ref_count, 1); TAILQ_INSERT_TAIL(&sa->node_list, new_node, sa_elm); - adf_os_spin_unlock(&sa->sa_lock); + write_unlock(&sa->node_ref_lock); return; error: @@ -481,7 +496,8 @@ struct smart_ant *sa_get_handle(void) return &g_smart_ant_handle; } else { SA_DPRINTK((struct smart_ant *)NULL, SMART_ANTENNA_DEBUG, - "%s: Smart Antenna Module is attached.", __func__); + "%s: Smart Antenna Module is not attached.", + __func__); return NULL; } } @@ -502,10 +518,20 @@ struct sa_ops *sa_get_ops(void) */ void smart_antenna_attach(void) { - SA_DPRINTK((struct smart_ant *)NULL, SMART_ANTENNA_DEBUG, - "%s: Smart Antenna Module is attached.", __func__); + uint32_t cfg; vos_mem_zero(&g_smart_ant_handle, sizeof(struct smart_ant)); - g_smart_ant_handle.sa_debug_mask = SMART_ANTENNA_DEFAULT_LEVEL; + + cfg = vos_get_smart_ant_cfg(); + SA_DPRINTK((struct smart_ant *)NULL, SMART_ANTENNA_DEBUG, + "%s: Smart Antenna default config is %d", __func__, cfg); + if (!SMART_ANTENNA_ENABLED(cfg)) + return; + + SA_DPRINTK((struct smart_ant *)NULL, SMART_ANTENNA_DEBUG, + "%s: Smart Antenna Module is attached, Debug level 0x%x", + __func__, SMART_ANTENNA_DEBUG_LEVEL(cfg)); + g_smart_ant_handle.sa_debug_mask = + SMART_ANTENNA_DEBUG_LEVEL(cfg); g_smart_ant_handle.smart_ant_enabled = false; g_smart_ant_handle.smart_ant_state |= SMART_ANT_STATE_ATTACHED; g_smart_ant_handle.curchan = SMART_ANT_UNSUPPORTED_CHANNEL; @@ -523,7 +549,7 @@ void smart_antenna_attach(void) g_smart_ant_handle.sap_ops.sa_get_config = __smart_ant_get_config; TAILQ_INIT(&g_smart_ant_handle.node_list); - adf_os_spinlock_init(&g_smart_ant_handle.sa_lock); + rwlock_init(&g_smart_ant_handle.node_ref_lock); } /** @@ -535,5 +561,4 @@ void smart_antenna_deattach(void) SA_DPRINTK((struct smart_ant *)NULL, SMART_ANTENNA_DEBUG, "%s: Smart Antenna Module is deattached.", __func__); g_smart_ant_handle.smart_ant_state &= ~SMART_ANT_STATE_ATTACHED; - adf_os_spinlock_destroy(&g_smart_ant_handle.sa_lock); } diff --git a/drivers/staging/qcacld-2.0/CORE/SERVICES/WMA/wma.c b/drivers/staging/qcacld-2.0/CORE/SERVICES/WMA/wma.c index e5b3741d0f72..18a48f942f35 100644 --- a/drivers/staging/qcacld-2.0/CORE/SERVICES/WMA/wma.c +++ b/drivers/staging/qcacld-2.0/CORE/SERVICES/WMA/wma.c @@ -35839,6 +35839,16 @@ VOS_STATUS wma_mc_process_msg(v_VOID_t *vos_context, vos_msg_t *msg) case WDA_SET_RX_ANTENNA: wma_set_rx_antanna(wma_handle, 0, msg->bodyval); break; + case WDA_SET_GPIO_CFG: + wma_set_gpio_cfg(wma_handle, + (struct hal_gpio_cfg *)msg->bodyptr); + vos_mem_free(msg->bodyptr); + break; + case WDA_SET_GPIO_OUTPUT: + wma_set_gpio_output(wma_handle, + (struct hal_gpio_output *)msg->bodyptr); + vos_mem_free(msg->bodyptr); + break; default: WMA_LOGD("unknow msg type %x", msg->type); /* Do Nothing? MSG Body should be freed at here */ @@ -42405,3 +42415,97 @@ VOS_STATUS wma_set_rx_antanna(void *handle, } return VOS_STATUS_SUCCESS; } + +/** + * wma_set_gpio_cfg() - Set GPIO config + * @handle: pointer to wma handle + * @gpio_cfg: parameters for GPIO config + * + * Return: VOS_STATUS_SUCCESS for success. + */ +VOS_STATUS wma_set_gpio_cfg(void *handle, struct hal_gpio_cfg *gpio_cfg) +{ + tp_wma_handle wma_handle; + wmi_buf_t buf; + int status; + uint32_t tag; + wmi_gpio_config_cmd_fixed_param *cmd; + int len = sizeof(*cmd); + + if (!handle) { + WMA_LOGP(FL("Invalid handle.")); + return VOS_STATUS_E_INVAL; + } + + wma_handle = handle; + buf = wmi_buf_alloc(wma_handle->wmi_handle, len); + if (!buf) { + WMA_LOGP("%s: failed to allocate memory for WMI_GPIO_CONFIG_CMDID", + __func__); + return VOS_STATUS_E_NOMEM; + } + + cmd = (wmi_gpio_config_cmd_fixed_param *)wmi_buf_data(buf); + tag = WMITLV_TAG_STRUC_wmi_gpio_config_cmd_fixed_param; + len = WMITLV_GET_STRUCT_TLVLEN(wmi_gpio_config_cmd_fixed_param); + WMITLV_SET_HDR(&cmd->tlv_header, tag, len); + cmd->gpio_num = gpio_cfg->gpio_num; + cmd->input = gpio_cfg->input; + cmd->intr_mode = gpio_cfg->intr_mode; + cmd->mux_config_val = gpio_cfg->mux_config_val; + status = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, + sizeof(*cmd), + WMI_GPIO_CONFIG_CMDID); + if (status) { + WMA_LOGE("Failed to send WMI_GPIO_CONFIG_CMDID"); + wmi_buf_free(buf); + return VOS_STATUS_E_FAILURE; + } + return VOS_STATUS_SUCCESS; +} + +/** + * wma_set_gpio_cfg() - Set GPIO config + * @handle: pointer to wma handle + * @output: parameters for GPIO output + * + * Return: VOS_STATUS_SUCCESS for success. + */ +VOS_STATUS wma_set_gpio_output(void *handle, struct hal_gpio_output *output) +{ + tp_wma_handle wma_handle; + wmi_buf_t buf; + int status; + uint32_t tag; + wmi_gpio_output_cmd_fixed_param *cmd; + int len = sizeof(*cmd); + + if (!handle) { + WMA_LOGP(FL("Invalid handle.")); + return VOS_STATUS_E_INVAL; + } + + wma_handle = handle; + buf = wmi_buf_alloc(wma_handle->wmi_handle, len); + if (!buf) { + WMA_LOGP("%s: failed to allocate memory for WMI_GPIO_OUTPUT_CMDID", + __func__); + return VOS_STATUS_E_NOMEM; + } + + cmd = (wmi_gpio_output_cmd_fixed_param *)wmi_buf_data(buf); + tag = WMITLV_TAG_STRUC_wmi_gpio_output_cmd_fixed_param; + len = WMITLV_GET_STRUCT_TLVLEN(wmi_gpio_output_cmd_fixed_param); + WMITLV_SET_HDR(&cmd->tlv_header, tag, len); + cmd->gpio_num = output->gpio_num; + cmd->set = output->set; + status = wmi_unified_cmd_send(wma_handle->wmi_handle, buf, + sizeof(*cmd), + WMI_GPIO_OUTPUT_CMDID); + if (status) { + WMA_LOGE("Failed to send WMI_GPIO_OUTPUT_CMDID"); + wmi_buf_free(buf); + return VOS_STATUS_E_FAILURE; + } + return VOS_STATUS_SUCCESS; +} diff --git a/drivers/staging/qcacld-2.0/CORE/SME/inc/sme_Api.h b/drivers/staging/qcacld-2.0/CORE/SME/inc/sme_Api.h index b0d7801d23e6..4351669b4277 100644 --- a/drivers/staging/qcacld-2.0/CORE/SME/inc/sme_Api.h +++ b/drivers/staging/qcacld-2.0/CORE/SME/inc/sme_Api.h @@ -5047,4 +5047,12 @@ static inline eHalStatus sme_set_rx_antenna(tHalHandle hal, } #endif +eHalStatus sme_set_gpio_cfg(tHalHandle hal, uint32_t gpio_num, + uint32_t input, uint32_t pull_type, + uint32_t intr_mode, uint32_t mux_config_val); + + +eHalStatus sme_set_gpio_output(tHalHandle hal, + uint32_t gpio_num, + uint32_t set); #endif //#if !defined( __SME_API_H ) diff --git a/drivers/staging/qcacld-2.0/CORE/SME/src/csr/csrApiRoam.c b/drivers/staging/qcacld-2.0/CORE/SME/src/csr/csrApiRoam.c index b830967cd646..a16c5b51a669 100644 --- a/drivers/staging/qcacld-2.0/CORE/SME/src/csr/csrApiRoam.c +++ b/drivers/staging/qcacld-2.0/CORE/SME/src/csr/csrApiRoam.c @@ -11044,6 +11044,8 @@ void csrRoamCheckForLinkStatusChange( tpAniSirGlobal pMac, tSirSmeRsp *pSirMsg ) if (!pCommand) { smsLog(pMac, LOGE, FL("cannot allocate memory")); + if (pRoamInfo) + vos_mem_free(pRoamInfo); return; } vos_mem_set(pCommand, sizeof(tSmeCmd), 0); diff --git a/drivers/staging/qcacld-2.0/CORE/SME/src/csr/csrApiScan.c b/drivers/staging/qcacld-2.0/CORE/SME/src/csr/csrApiScan.c index 166875e4a747..2668b47850d0 100644 --- a/drivers/staging/qcacld-2.0/CORE/SME/src/csr/csrApiScan.c +++ b/drivers/staging/qcacld-2.0/CORE/SME/src/csr/csrApiScan.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011-2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2011-2019 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -6466,7 +6466,7 @@ eHalStatus csrScanCopyRequest(tpAniSirGlobal pMac, tCsrScanRequest *pDstReq, tCs ((eCSR_SCAN_P2P_DISCOVERY == pSrcReq->requestType) && CSR_IS_SOCIAL_CHANNEL(pSrcReq->ChannelInfo.ChannelList[index])))) { - if( ((pSrcReq->skipDfsChnlInP2pSearch || + if( ((pSrcReq->skipDfsChnlInP2pSearch || pMac->sme.miracast_value || skip_dfs_chnl) && (NV_CHANNEL_DFS == vos_nv_getChannelEnabledState(pSrcReq->ChannelInfo.ChannelList[index])) ) #ifdef FEATURE_WLAN_LFR diff --git a/drivers/staging/qcacld-2.0/CORE/SME/src/sme_common/sme_Api.c b/drivers/staging/qcacld-2.0/CORE/SME/src/sme_common/sme_Api.c index eb098a1ee997..4b5d6aa17465 100644 --- a/drivers/staging/qcacld-2.0/CORE/SME/src/sme_common/sme_Api.c +++ b/drivers/staging/qcacld-2.0/CORE/SME/src/sme_common/sme_Api.c @@ -9957,7 +9957,6 @@ eHalStatus sme_WakeReasonIndCallback (tHalHandle hHal, void* pMsg) eHalStatus sme_SetMaxTxPowerPerBand(eCsrBand band, v_S7_t dB, tHalHandle hal) { - vos_msg_t msg; eHalStatus status; tSmeCmd *set_max_tx_pwr_per_band; tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal); @@ -9972,9 +9971,6 @@ eHalStatus sme_SetMaxTxPowerPerBand(eCsrBand band, v_S7_t dB, FL("band : %d power %d dB"), band, dB); - MTRACE(vos_trace(VOS_MODULE_ID_SME, - TRACE_CODE_SME_TX_WDA_MSG, NO_SESSION, msg.type)); - status = sme_AcquireGlobalLock(&mac_ctx->sme); if (HAL_STATUS_SUCCESS(status)) { set_max_tx_pwr_per_band = csrGetCommandBuffer(mac_ctx); @@ -21291,3 +21287,102 @@ eHalStatus sme_set_rx_antenna(tHalHandle hal, return hal_status; } #endif + +/** + * sme_set_gpio_cfg() - Set GPIO config + * @gpio_num: GPIO number to be setup + * @input: 0 - Output/ 1 - Input + * @pull_type: Pull type + * @intr_mode: Interrupt mode + * @mux_config_val: mux_config_val + * + * Return: HAL_STATUS + */ +eHalStatus sme_set_gpio_cfg(tHalHandle hal, uint32_t gpio_num, + uint32_t input, uint32_t pull_type, + uint32_t intr_mode, uint32_t mux_config_val) +{ + vos_msg_t vos_message; + tpAniSirGlobal mac = PMAC_STRUCT(hal); + eHalStatus hal_status = eHAL_STATUS_SUCCESS; + VOS_STATUS vos_status; + struct hal_gpio_cfg *gpio_cfg; + + hal_status = sme_AcquireGlobalLock(&mac->sme); + if (HAL_STATUS_SUCCESS(hal_status)) { + gpio_cfg = vos_mem_malloc(sizeof(*gpio_cfg)); + if (!gpio_cfg) { + hal_status = eHAL_STATUS_FAILED_ALLOC; + VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR, + "SAE: memory allocation failed"); + } else { + gpio_cfg->gpio_num = gpio_num; + gpio_cfg->input = input; + gpio_cfg->pull_type = pull_type; + gpio_cfg->intr_mode = intr_mode; + gpio_cfg->mux_config_val = mux_config_val; + vos_message.type = WDA_SET_GPIO_CFG; + vos_message.bodyptr = gpio_cfg; + VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_DEBUG, + "Post GPIO config message. gpio_num=%d, input=%d, pull_type=%d, intr_mode=%d, mux_config_val=%d", + gpio_num, input, pull_type, + intr_mode, mux_config_val); + + vos_status = vos_mq_post_message(VOS_MQ_ID_WDA, + &vos_message); + if (!VOS_IS_STATUS_SUCCESS(vos_status)) { + hal_status = eHAL_STATUS_FAILURE; + vos_mem_free(gpio_cfg); + } + } + sme_ReleaseGlobalLock(&mac->sme); + } + + return hal_status; +} + +/** + * sme_set_gpio_output() - Set GPIO ouput + * @gpio_num: GPIO number to be setup + * @set: Set the GPIO pin + * + * Return: HAL_STATUS + */ +eHalStatus sme_set_gpio_output(tHalHandle hal, + uint32_t gpio_num, + uint32_t set) +{ + vos_msg_t vos_message; + tpAniSirGlobal mac = PMAC_STRUCT(hal); + eHalStatus hal_status = eHAL_STATUS_SUCCESS; + VOS_STATUS vos_status; + struct hal_gpio_output *gpio_output; + + hal_status = sme_AcquireGlobalLock(&mac->sme); + if (HAL_STATUS_SUCCESS(hal_status)) { + gpio_output = vos_mem_malloc(sizeof(*gpio_output)); + if (!gpio_output) { + hal_status = eHAL_STATUS_FAILED_ALLOC; + VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR, + "SAE: memory allocation failed"); + } else { + gpio_output->gpio_num = gpio_num; + gpio_output->set = set; + vos_message.type = WDA_SET_GPIO_OUTPUT; + vos_message.bodyptr = gpio_output; + VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_DEBUG, + "Post GPIO output messagee. gpio_num=%d, set=%d", + gpio_num, set); + + vos_status = vos_mq_post_message(VOS_MQ_ID_WDA, + &vos_message); + if (!VOS_IS_STATUS_SUCCESS(vos_status)) { + hal_status = eHAL_STATUS_FAILURE; + vos_mem_free(gpio_output); + } + } + sme_ReleaseGlobalLock(&mac->sme); + } + + return hal_status; +} diff --git a/drivers/staging/qcacld-2.0/CORE/VOSS/inc/vos_api.h b/drivers/staging/qcacld-2.0/CORE/VOSS/inc/vos_api.h index 2fab5cc8df84..7f457359c661 100644 --- a/drivers/staging/qcacld-2.0/CORE/VOSS/inc/vos_api.h +++ b/drivers/staging/qcacld-2.0/CORE/VOSS/inc/vos_api.h @@ -405,6 +405,7 @@ v_U64_t vos_get_monotonic_boottime_ns(void); v_U64_t vos_get_bootbased_boottime_ns(void); +bool vos_is_self_recovery_enabled(void); void vos_trigger_recovery(bool); #ifdef FEATURE_WLAN_D0WOW @@ -469,4 +470,12 @@ int qca_request_firmware(const struct firmware **firmware_p, const char *name, struct device *device); +#ifdef WLAN_SMART_ANTENNA_FEATURE +uint32_t vos_get_smart_ant_cfg(void); +#else +static inline uint32_t vos_get_smart_ant_cfg(void) +{ + return 0; +} +#endif #endif // if !defined __VOS_API_H diff --git a/drivers/staging/qcacld-2.0/CORE/VOSS/src/vos_api.c b/drivers/staging/qcacld-2.0/CORE/VOSS/src/vos_api.c index ff597ed77c6e..3d24490cb648 100644 --- a/drivers/staging/qcacld-2.0/CORE/VOSS/src/vos_api.c +++ b/drivers/staging/qcacld-2.0/CORE/VOSS/src/vos_api.c @@ -2669,6 +2669,31 @@ bool vos_is_ocb_tx_per_pkt_stats_enabled(void) } #endif +/** + * vos_is_self_recovery_enabled() - API to get self recovery enabled + * + * Return: true if self recovery enabled, false otherwise + */ +bool vos_is_self_recovery_enabled(void) +{ + hdd_context_t *hdd_ctx; + + if (gpVosContext == NULL) { + VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, + "%s: global voss context is NULL", __func__); + return false; + } + + hdd_ctx = (hdd_context_t *)(gpVosContext->pHDDContext); + if ((NULL == hdd_ctx) || (NULL == hdd_ctx->cfg_ini)) { + VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL, + "%s: Hdd Context is Null", __func__); + return false; + } + + return hdd_ctx->cfg_ini->enableSelfRecovery; +} + VOS_STATUS vos_config_silent_recovery(pVosContextType vos_context) { struct ol_softc *scn; @@ -3362,7 +3387,7 @@ v_U64_t vos_get_monotonic_boottime_ns(void) return timespec_to_ns(&ts); } -#if (LINUX_VERSION_CODE > KERNEL_VERSION(3, 10, 0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 17, 0)) v_U64_t vos_get_bootbased_boottime_ns(void) { return ktime_get_boot_ns(); @@ -3710,3 +3735,16 @@ int qca_request_firmware(const struct firmware **firmware_p, #endif } +#ifdef WLAN_SMART_ANTENNA_FEATURE +uint32_t vos_get_smart_ant_cfg(void) +{ + hdd_context_t *hdd_ctx; + v_CONTEXT_t vos_context = vos_get_global_context(0, NULL); + + hdd_ctx = vos_get_context(VOS_MODULE_ID_HDD, vos_context); + if (!hdd_ctx) + return 0; + else + return hdd_ctx->cfg_ini->smart_antenna_cfg; +} +#endif diff --git a/drivers/staging/qcacld-2.0/CORE/WDA/inc/legacy/halMsgApi.h b/drivers/staging/qcacld-2.0/CORE/WDA/inc/legacy/halMsgApi.h index 823033fe7a61..605e63514b4a 100644 --- a/drivers/staging/qcacld-2.0/CORE/WDA/inc/legacy/halMsgApi.h +++ b/drivers/staging/qcacld-2.0/CORE/WDA/inc/legacy/halMsgApi.h @@ -1576,4 +1576,30 @@ struct hal_primary_params { uint8_t session_id; tSirMacAddr bssid; }; + +/** + * struct hal_gpio_cfg - GPIO config paramters + * @gpio_num: GPIO number to be setup + * @input: 0 - Output/ 1 - Input + * @pull_type: Pull type + * @intr_mode: Interrupt mode + * @mux_config_val: mux_config_val + */ +struct hal_gpio_cfg { + uint32_t gpio_num; + uint32_t input; + uint32_t pull_type; + uint32_t intr_mode; + uint32_t mux_config_val; +}; + +/** + * struct hal_gpio_output - GPIO output parameters + * @gpio_num: GPIO number to be setup + * @set: Set the GPIO pin + */ +struct hal_gpio_output { + uint32_t gpio_num; + uint32_t set; +}; #endif /* _HALMSGAPI_H_ */ diff --git a/drivers/staging/qcacld-2.0/CORE/WDA/inc/wlan_qct_wda.h b/drivers/staging/qcacld-2.0/CORE/WDA/inc/wlan_qct_wda.h index 98336cf75ee7..7706409821a3 100644 --- a/drivers/staging/qcacld-2.0/CORE/WDA/inc/wlan_qct_wda.h +++ b/drivers/staging/qcacld-2.0/CORE/WDA/inc/wlan_qct_wda.h @@ -1120,7 +1120,8 @@ tSirRetStatus uMacPostCtrlMsg(void* pSirGlobal, tSirMbMsg* pMb); #define WDA_SET_HPCS_PULSE_PARAMS SIR_HAL_SET_HPCS_PULSE_PARMAS #define WDA_SET_RX_ANTENNA SIR_HAL_SET_RX_SMART_ANTENNA - +#define WDA_SET_GPIO_CFG SIR_HAL_SET_GPIO_CFG +#define WDA_SET_GPIO_OUTPUT SIR_HAL_SET_GPIO_OUTPUT tSirRetStatus wdaPostCtrlMsg(tpAniSirGlobal pMac, tSirMsgQ *pMsg); #define HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME 0x40 // Bit 6 will be used to control BD rate for Management frames diff --git a/drivers/staging/qcacld-2.0/Kbuild b/drivers/staging/qcacld-2.0/Kbuild index 9e1b9f62bcc2..796e2a693220 100644 --- a/drivers/staging/qcacld-2.0/Kbuild +++ b/drivers/staging/qcacld-2.0/Kbuild @@ -1799,9 +1799,18 @@ endif ifeq ($(CONFIG_VOS_MEM_PRE_ALLOC),y) ifneq ($(CONFIG_WCNSS_MEM_PRE_ALLOC), y) CDEFINES += -DCONFIG_VOS_MEM_PRE_ALLOC + +ifeq ($(CONFIG_FEATURE_LARGE_PREALLOC),y) +CDEFINES += -DFEATURE_LARGE_PREALLOC +obj-m += $(MODNAME).o +$(MODNAME)-y += $(HDD_SRC_DIR)/wlan_hdd_main_module.o +OBJS +=$(VOSS_SRC_DIR)/vos_memory_prealloc.o +else obj-m += wlan_prealloc.o wlan_prealloc-y += $(VOSS_SRC_DIR)/vos_memory_prealloc.o endif + +endif endif ifeq ($(CONFIG_DPTRACE_ENABLE), y) @@ -1875,5 +1884,10 @@ CDEFINES += -DWLAN_SMART_ANTENNA_FEATURE endif # Module information used by KBuild framework +ifeq ($(CONFIG_FEATURE_LARGE_PREALLOC),y) +obj-$(CONFIG_QCA_CLD_WLAN) += wlan_prealloc.o +wlan_prealloc-y := $(OBJS) +else obj-$(CONFIG_QCA_CLD_WLAN) += $(MODNAME).o $(MODNAME)-y := $(OBJS) +endif |