summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavide Garberi <dade.garberi@gmail.com>2019-07-20 23:30:08 +0200
committerDavide Garberi <dade.garberi@gmail.com>2019-07-20 23:30:26 +0200
commit921bfcef4a132f6406e286bd45486d87abb94e68 (patch)
tree30f7a24b9996457f230c6e057c975ca22cd5d635
parent6fba3d56fa329e7070587509046859fd7eb0294e (diff)
parent1f5d51b1f324df8e85e9d394228328169bf2e0dd (diff)
qcacld-2.0: Merge LA.UM.7.5.2.r1-03300-8x96.0 of https://source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/qcacld-2.0/ into lineage-16.0lineage-16.0
1f5d51b1f324 qcacld-2.0: limit time for scan when miracast is running b70247d7b061 Merge f66a9554da973ef80498e3f0a6547fa31a7b9872 on remote branch f66a9554da97 Merge "qcacld-2.0: Add GPIO config and output setting" into wlan-cld2.driver.lnx.1.0 33637ee1202e Merge "qcacld-2.0: Set SAE auth type for PMKID cached connect request" into wlan-cld2.driver.lnx.1.0 63c5d97cad35 Merge "qcacld-2.0: Define FEATURE_LARGE_PREALLOC" into wlan-cld2.driver.lnx.1.0 852b602554ec Merge "qcacld-2.0: Fix potential memory leak and wrong bw value" into wlan-cld2.driver.lnx.1.0 627784f616e0 qcacld-2.0: Add GPIO config and output setting 83165da2e435 qcacld-2.0: Set SAE auth type for PMKID cached connect request 17ea8f0bfd51 qcacld-2.0: Fix potential memory leak and wrong bw value 198d5b8aacd5 qcacld-2.0: Define FEATURE_LARGE_PREALLOC 318cd86a7e13 qcacld-2.0: Provide iwpriv to configure candidate channel eb7b0783fc30 Merge "qcacld-2.0: Avoid buffer leakage when handle 11w rmf" into wlan-cld2.driver.lnx.1.0 5ec1870384fa qcacld-2.0: Fix build error in third party platform 76561bc8756f Merge "qcacld-2.0: Update API in driver to support kernel version 3.10" into wlan-cld2.driver.lnx.1.0 3fb22c62d595 Merge "qcacld-2.0: Add ini key disable smart antenna" into wlan-cld2.driver.lnx.1.0 3c9b3e72e908 qcacld-2.0: Update API in driver to support kernel version 3.10 ef5df17d55a6 qcacld-2.0: Avoid buffer leakage when handle 11w rmf b5cb975999a0 qcacld-2.0: Add ini key disable smart antenna 04cd86af2ff9 qcacld-2.0: Trigger recovery in rx-hash no-match Change-Id: I3e32e3dd43cba894c1bc5dc0a36538478093281b Signed-off-by: Davide Garberi <dade.garberi@gmail.com>
-rw-r--r--drivers/staging/qcacld-2.0/CORE/CLD_TXRX/HTT/htt_rx.c7
-rw-r--r--drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TLSHIM/tl_shim.c3
-rw-r--r--drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_rx.c7
-rw-r--r--drivers/staging/qcacld-2.0/CORE/CLD_TXRX/TXRX/ol_tx_send.c10
-rw-r--r--drivers/staging/qcacld-2.0/CORE/HDD/inc/qc_sap_ioctl.h1
-rw-r--r--drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_assoc.h6
-rw-r--r--drivers/staging/qcacld-2.0/CORE/HDD/inc/wlan_hdd_cfg.h40
-rw-r--r--drivers/staging/qcacld-2.0/CORE/HDD/src/wlan_hdd_assoc.c6
-rw-r--r--drivers/staging/qcacld-2.0/CORE/HDD/src/wlan_hdd_cfg.c15
-rw-r--r--drivers/staging/qcacld-2.0/CORE/HDD/src/wlan_hdd_cfg80211.c15
-rw-r--r--drivers/staging/qcacld-2.0/CORE/HDD/src/wlan_hdd_hostapd.c13
-rw-r--r--drivers/staging/qcacld-2.0/CORE/HDD/src/wlan_hdd_main.c38
-rw-r--r--drivers/staging/qcacld-2.0/CORE/HDD/src/wlan_hdd_main_module.c88
-rw-r--r--drivers/staging/qcacld-2.0/CORE/MAC/src/include/sirParams.h3
-rw-r--r--drivers/staging/qcacld-2.0/CORE/SAP/src/sapFsm.c21
-rw-r--r--drivers/staging/qcacld-2.0/CORE/SAP/src/sapInternal.h5
-rw-r--r--drivers/staging/qcacld-2.0/CORE/SERVICES/COMMON/wma_api.h2
-rw-r--r--drivers/staging/qcacld-2.0/CORE/SERVICES/SA/smart_ant.h22
-rw-r--r--drivers/staging/qcacld-2.0/CORE/SERVICES/SA/smart_antenna.c85
-rw-r--r--drivers/staging/qcacld-2.0/CORE/SERVICES/WMA/wma.c104
-rw-r--r--drivers/staging/qcacld-2.0/CORE/SME/inc/sme_Api.h8
-rw-r--r--drivers/staging/qcacld-2.0/CORE/SME/src/csr/csrApiRoam.c2
-rw-r--r--drivers/staging/qcacld-2.0/CORE/SME/src/csr/csrApiScan.c4
-rw-r--r--drivers/staging/qcacld-2.0/CORE/SME/src/sme_common/sme_Api.c103
-rw-r--r--drivers/staging/qcacld-2.0/CORE/VOSS/inc/vos_api.h9
-rw-r--r--drivers/staging/qcacld-2.0/CORE/VOSS/src/vos_api.c40
-rw-r--r--drivers/staging/qcacld-2.0/CORE/WDA/inc/legacy/halMsgApi.h26
-rw-r--r--drivers/staging/qcacld-2.0/CORE/WDA/inc/wlan_qct_wda.h3
-rw-r--r--drivers/staging/qcacld-2.0/Kbuild14
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