summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2016-05-25 03:26:56 -0700
committerLinux Build Service Account <lnxbuild@localhost>2016-05-25 03:26:56 -0700
commitb2ed0531ca669023f141bf3d854e083aae0eb113 (patch)
tree00eebe5884aea542cec8b28eba0c02ec5516d7f1
parent07d6d01e32a32e79d32782bf1346d4fc8a335e89 (diff)
parentbb03b13932c5b4d41c3da24f9f92a0652122a2e6 (diff)
Promotion of wlan-cld2.driver.lnx.1.0-00020.
CRs Change ID Subject -------------------------------------------------------------------------------------------------------------- 865207 I6949546fa35fc0913274dcc18bf86958f15911b3 qcacld-2.0: CL 1515711 – update fw common interface file 1020079 I00f9fb0c8231fd69f6c108ced8028eb19315006e qcacld-2.0: Update ICMP and ICMPV6 WOW wake up stats 882723 If1f85bf82aff2e4f877d6c53a30d8c218ce541e4 qcacld-2.0: Fix reset variable abortScan 1018993 Ie7735b06ca5ae370077c962a645296ba054ac5d4 qcacld-2.0: Ensure that phy mode from ini is considered 1019083 I92049ee9e430262d38d3ad55806ee29b6042e68e qcacld-2.0: Dont open SME session for AP2, if scan was d 1016872 I55028533ebbf03910755da1b35c2fa57d97ce43b qcacld-2.0: Send disconnect event to upper layers upon d 1018376 Iae5420114ba7cfa2f98dc6c346d99d2f820c8503 qcacld-2.0: Update allowed action frames to FW for non S 1012420 I378917d9d56c4d3ef13bfe8c3bf62adc6d5e7aa6 qcacld-2.0: Implement Private NL CMD handling for roamin 865207 I4acd731ec8850766d4d47715ff78b813281d0b6a qcacld-2.0: CL 1511668 – update fw common interface file 1020713 I10a9cf8c53ded7d9db4bff0761f7b86a9021011a qcacld-2.0: Pass the correct userData in wpalTimerCback 865207 If23531dd3c1c221a0b421ce25466790c05be1400 qcacld-2.0: CL 1515730 – update fw common interface file 688141 I5675c27286437d89c0e924b1fc4e86168011121e Release 4.0.11.84 1014544 I9d1a7bb63a921b3d8d1c25d2e77d4a7632a301d3 qcacld-2.0: Initialize TDLS context in HDD when a peer i 1019078 I7411348d9f44fa4e9a713224ce708eeeae42640e qcacld-2.0: Remove 11P channels from update channel list 941772 I61d48299b4af361c214e2ab8bb1fa848161431de qcacld-2.0: Add vendor command to scale TX power 1015244 Icebc46062b1ea4b7f5affa171f760123dbb9fcb7 qcacld-2.0: Process disassociate with invalid reason cod 1016886 I1037c60837a90472fee312e8654197ea7f68702e qcacld-2.0: Do not send RSO_START if bssid set in connec 898375 I74d5c739cade19941320ee02eddc09e4fc74b105 qcacld-2.0: Validate pHashTable 865207 I0db10a599f4bbbdf23e5968fa5dab59b722efa30 qcacld-2.0: CL 1513397 – update fw common interface file 1017801 I5c3874fddfbbfc66dd7cd8f8825af92620c16d2d Revert "qcacld-2.0: Allow power save to be controlled by 972671 I7861ead27dff6b8dd45fbeafae8cf4c6f1ca4523 qcacld-2.0: Fix out of bound access in csrScanSmeScanRes 688141 Ib218abc1d045fc18b0c87c13c74c14b23fbe676a Release 4.0.11.85 1012545 I2589b8fb020c7804c8576541155eac9ac630f2af qcacld-2.0: Disable runtime PM if OBSS protection is ena 1005367 Id50c96dd322b5ca4db34cf2df901730d8b103251 qcacld-2.0: Add support to get per chain rssi stats 978673 I78d7b4deadb6cccdfd81f8431b6dd7c013e05340 qcacld-2.0: Reduce roaming delay by moving tdls cb after 1015265 I05a57d7f64c9f775afb7f591f1b6e08ae7cfdfaa qcacld-2.0: Restart SAP on receiving channel avoidance i 1019620 I2e2fbb1fd514c6dbc8b97895a3bb01998b1a0072 qcacld-2.0: Fix incorrect debug level in wmi_config_debu 1017191 I54c8d9a321c91b2735300ffba22eadafdb9de106 qcacld-2.0: Adjust uart enable pin of 9379 868916 I6c6111fc1aacb524da463914d357710a7f125f4a qcacld-2.0: Reduce expiration time of traffic timer duri 975923 Ice6492aa191da0af3fe4fc9b58dfddcb2a59d6d0 qcacld-2.0: Fix out of bound issue in wlan_logging_proc_ 1018539 I91b14377acfed6ccdde4315c4796ef1adbfd18c3 qcacld-2.0: Fix the bug in populating the ll stats 688141 Icdfed83e93fefed6cc7096461f38f4a6365ebaf5 Release 4.0.11.86 879769 I6c3d6a4798f1537d66612472240a778949c62015 qcacld-2.0: Fix DTIM conversion during roaming Change-Id: I7d7cdec074b60786dc76e3aa5bef92581e372e04 CRs-Fixed: 978673, 972671, 1019083, 1016886, 1020713, 1020079, 865207, 1012545, 1019078, 1018993, 868916, 941772, 975923, 1015244, 1012420, 879769, 1017801, 688141, 882723, 1015265, 1019620, 1017191, 1016872, 1018539, 1018376, 898375, 1005367, 1014544
-rw-r--r--CORE/HDD/inc/wlan_hdd_cfg.h6
-rw-r--r--CORE/HDD/inc/wlan_hdd_cfg80211.h73
-rw-r--r--CORE/HDD/inc/wlan_hdd_hostapd.h27
-rw-r--r--CORE/HDD/inc/wlan_hdd_main.h8
-rw-r--r--CORE/HDD/src/wlan_hdd_assoc.c59
-rw-r--r--CORE/HDD/src/wlan_hdd_cfg.c10
-rw-r--r--CORE/HDD/src/wlan_hdd_cfg80211.c394
-rw-r--r--CORE/HDD/src/wlan_hdd_hostapd.c4
-rw-r--r--CORE/HDD/src/wlan_hdd_main.c50
-rw-r--r--CORE/HDD/src/wlan_hdd_wext.c7
-rw-r--r--CORE/MAC/inc/qwlan_version.h4
-rw-r--r--CORE/MAC/inc/sirApi.h12
-rw-r--r--CORE/MAC/src/dph/dphHashTable.c5
-rw-r--r--CORE/MAC/src/pe/lim/limProcessActionFrame.c4
-rw-r--r--CORE/MAC/src/pe/lim/limProcessDisassocFrame.c5
-rw-r--r--CORE/MAC/src/pe/lim/limProcessMlmRspMessages.c2
-rw-r--r--CORE/SAP/src/sapApiLinkCntl.c15
-rw-r--r--CORE/SAP/src/sapFsm.c10
-rw-r--r--CORE/SAP/src/sapModule.c8
-rw-r--r--CORE/SERVICES/BMI/ol_fw.c8
-rw-r--r--CORE/SERVICES/COMMON/ieee80211_defines.h8
-rw-r--r--CORE/SERVICES/COMMON/wma_api.h3
-rw-r--r--CORE/SERVICES/COMMON/wmi_tlv_defs.h8
-rw-r--r--CORE/SERVICES/COMMON/wmi_unified.h90
-rw-r--r--CORE/SERVICES/COMMON/wmi_version.h2
-rw-r--r--CORE/SERVICES/WMA/wma.c272
-rw-r--r--CORE/SERVICES/WMA/wma.h5
-rw-r--r--CORE/SME/inc/csrApi.h6
-rw-r--r--CORE/SME/inc/csrInternal.h2
-rw-r--r--CORE/SME/inc/pmcApi.h9
-rw-r--r--CORE/SME/inc/sme_Api.h5
-rw-r--r--CORE/SME/src/csr/csrApiRoam.c24
-rw-r--r--CORE/SME/src/csr/csrApiScan.c48
-rw-r--r--CORE/SME/src/pmc/pmcApi.c11
-rw-r--r--CORE/SME/src/sme_common/sme_Api.c47
-rw-r--r--CORE/SVC/src/logging/wlan_logging_sock_svc.c7
-rw-r--r--CORE/UTILS/FWLOG/dbglog_host.c3
-rw-r--r--CORE/VOSS/src/vos_timer.c2
38 files changed, 1126 insertions, 137 deletions
diff --git a/CORE/HDD/inc/wlan_hdd_cfg.h b/CORE/HDD/inc/wlan_hdd_cfg.h
index 168c907f0760..77bcc2bd4733 100644
--- a/CORE/HDD/inc/wlan_hdd_cfg.h
+++ b/CORE/HDD/inc/wlan_hdd_cfg.h
@@ -3825,6 +3825,11 @@ enum dot11p_mode {
#define CFG_TGT_GTX_USR_CFG_MAX (32)
#define CFG_TGT_GTX_USR_CFG_DEFAULT (32)
+#define CFG_CH_AVOID_SAP_RESTART_NAME "sap_ch_avoid_restart"
+#define CFG_CH_AVOID_SAP_RESTART_MIN (0)
+#define CFG_CH_AVOID_SAP_RESTART_MAX (1)
+#define CFG_CH_AVOID_SAP_RESTART_DEFAULT (0)
+
/*---------------------------------------------------------------------------
Type declarations
-------------------------------------------------------------------------*/
@@ -4583,6 +4588,7 @@ struct hdd_config {
/* parameter to control GTX */
uint32_t tgt_gtx_usr_cfg;
+ bool sap_restrt_ch_avoid;
};
typedef struct hdd_config hdd_config_t;
diff --git a/CORE/HDD/inc/wlan_hdd_cfg80211.h b/CORE/HDD/inc/wlan_hdd_cfg80211.h
index 54174cc0aa8e..94f5a8c78173 100644
--- a/CORE/HDD/inc/wlan_hdd_cfg80211.h
+++ b/CORE/HDD/inc/wlan_hdd_cfg80211.h
@@ -137,7 +137,8 @@ typedef struct {
enum qca_nl80211_vendor_subcmds {
QCA_NL80211_VENDOR_SUBCMD_UNSPEC = 0,
QCA_NL80211_VENDOR_SUBCMD_TEST = 1,
- /* subcmds 2..9 not yet allocated */
+ /* subcmds 2..8 not yet allocated */
+ QCA_NL80211_VENDOR_SUBCMD_ROAMING = 9,
QCA_NL80211_VENDOR_SUBCMD_AVOID_FREQUENCY = 10,
QCA_NL80211_VENDOR_SUBCMD_DFS_CAPABILITY = 11,
QCA_NL80211_VENDOR_SUBCMD_NAN = 12,
@@ -263,6 +264,8 @@ enum qca_nl80211_vendor_subcmds {
/* subcommand to get link properties */
QCA_NL80211_VENDOR_SUBCMD_LINK_PROPERTIES = 101,
QCA_NL80211_VENDOR_SUBCMD_SETBAND = 105,
+ QCA_NL80211_VENDOR_SUBCMD_SET_TXPOWER_SCALE = 109,
+ QCA_NL80211_VENDOR_SUBCMD_SET_TXPOWER_SCALE_DECR_DB = 115,
QCA_NL80211_VENDOR_SUBCMD_ACS_POLICY = 116,
QCA_NL80211_VENDOR_SUBCMD_STA_CONNECT_ROAM_POLICY = 117,
QCA_NL80211_VENDOR_SUBCMD_SET_SAP_CONFIG = 118,
@@ -406,7 +409,7 @@ enum qca_wlan_vendor_attr_get_tdls_capabilities {
/* keep last */
QCA_WLAN_VENDOR_ATTR_TDLS_GET_CAPS_AFTER_LAST,
QCA_WLAN_VENDOR_ATTR_TDLS_GET_CAPS_MAX =
- QCA_WLAN_VENDOR_ATTR_TDLS_GET_CAPS_AFTER_LAST - 1,
+ QCA_WLAN_VENDOR_ATTR_TDLS_GET_CAPS_AFTER_LAST - 1,
};
enum qca_wlan_vendor_attr {
@@ -417,9 +420,11 @@ enum qca_wlan_vendor_attr {
QCA_WLAN_VENDOR_ATTR_NAN = 2,
/* used by QCA_NL80211_VENDOR_SUBCMD_STATS_EXT */
QCA_WLAN_VENDOR_ATTR_STATS_EXT = 3,
+ /* used by QCA_NL80211_VENDOR_SUBCMD_STATS_EXT */
QCA_WLAN_VENDOR_ATTR_IFINDEX = 4,
- /* used by QCA_NL80211_VENDOR_SUBCMD_LINK_PROPERTIES */
+ /* used by QCA_NL80211_VENDOR_SUBCMD_ROAMING */
+ QCA_WLAN_VENDOR_ATTR_ROAMING_POLICY = 5,
QCA_WLAN_VENDOR_ATTR_MAC_ADDR = 6,
/* used by QCA_NL80211_VENDOR_SUBCMD_GET_FEATURES */
@@ -431,7 +436,7 @@ enum qca_wlan_vendor_attr {
/* keep last */
QCA_WLAN_VENDOR_ATTR_AFTER_LAST,
QCA_WLAN_VENDOR_ATTR_MAX =
- QCA_WLAN_VENDOR_ATTR_AFTER_LAST - 1
+ QCA_WLAN_VENDOR_ATTR_AFTER_LAST - 1
};
#ifdef FEATURE_WLAN_EXTSCAN
@@ -832,7 +837,7 @@ enum qca_wlan_vendor_attr_ll_stats_get
/* keep last */
QCA_WLAN_VENDOR_ATTR_LL_STATS_GET_AFTER_LAST,
QCA_WLAN_VENDOR_ATTR_LL_STATS_GET_MAX =
- QCA_WLAN_VENDOR_ATTR_LL_STATS_GET_AFTER_LAST - 1
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_GET_AFTER_LAST - 1
};
enum qca_wlan_vendor_attr_ll_stats_clr
@@ -844,7 +849,7 @@ enum qca_wlan_vendor_attr_ll_stats_clr
QCA_WLAN_VENDOR_ATTR_LL_STATS_CLR_CONFIG_STOP_RSP,
QCA_WLAN_VENDOR_ATTR_LL_STATS_CLR_AFTER_LAST,
QCA_WLAN_VENDOR_ATTR_LL_STATS_CLR_MAX =
- QCA_WLAN_VENDOR_ATTR_LL_STATS_CLR_AFTER_LAST - 1
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_CLR_AFTER_LAST - 1
};
/**
@@ -866,7 +871,7 @@ enum qca_wlan_vendor_attr_ll_stats_results_type {
QCA_WLAN_VENDOR_ATTR_LL_STATS_TYPE_AFTER_LAST,
QCA_WLAN_VENDOR_ATTR_LL_STATS_TYPE_MAX =
- QCA_WLAN_VENDOR_ATTR_LL_STATS_TYPE_AFTER_LAST - 1
+ QCA_WLAN_VENDOR_ATTR_LL_STATS_TYPE_AFTER_LAST - 1
};
enum qca_wlan_vendor_attr_ll_stats_results
@@ -1540,7 +1545,7 @@ enum qca_wlan_vendor_attr_acs_offload {
/* keep last */
QCA_WLAN_VENDOR_ATTR_ACS_AFTER_LAST,
QCA_WLAN_VENDOR_ATTR_ACS_MAX =
- QCA_WLAN_VENDOR_ATTR_ACS_AFTER_LAST - 1
+ QCA_WLAN_VENDOR_ATTR_ACS_AFTER_LAST - 1
};
enum qca_wlan_vendor_acs_hw_mode {
@@ -1882,6 +1887,39 @@ enum qca_wlan_vendor_attr_sap_config {
QCA_WLAN_VENDOR_ATTR_SAP_CONFIG_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
);
@@ -2047,4 +2085,23 @@ static inline void wlan_hdd_clear_link_layer_stats(hdd_adapter_t *adapter) {}
struct cfg80211_bss *wlan_hdd_cfg80211_inform_bss_frame(hdd_adapter_t *pAdapter,
tSirBssDescription *bss_desc);
+
+#if defined(CFG80211_DISCONNECTED_V2) || \
+(LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0))
+static inline void wlan_hdd_cfg80211_indicate_disconnect(struct net_device *dev,
+ bool from_ap,
+ int reason)
+{
+ cfg80211_disconnected(dev, reason, NULL, 0,
+ from_ap, GFP_KERNEL);
+}
+#else
+static inline void wlan_hdd_cfg80211_indicate_disconnect(struct net_device *dev,
+ bool from_ap,
+ int reason)
+{
+ cfg80211_disconnected(dev, reason, NULL, 0,
+ GFP_KERNEL);
+}
+#endif
#endif
diff --git a/CORE/HDD/inc/wlan_hdd_hostapd.h b/CORE/HDD/inc/wlan_hdd_hostapd.h
index 8fe456aadf52..1e18dbf533bc 100644
--- a/CORE/HDD/inc/wlan_hdd_hostapd.h
+++ b/CORE/HDD/inc/wlan_hdd_hostapd.h
@@ -173,16 +173,18 @@ hdd_change_sta_conn_pending_status(hdd_context_t *hdd_ctx,
static inline bool
hdd_is_sap_restart_required(hdd_context_t *hdd_ctx)
{
- bool status;
+ bool status = false;
spin_lock(&hdd_ctx->sap_update_info_lock);
- status = hdd_ctx->is_sap_restart_required;
+ if (!hdd_ctx->is_ch_avoid_in_progress)
+ status = hdd_ctx->is_sap_restart_required;
spin_unlock(&hdd_ctx->sap_update_info_lock);
return status;
}
/**
* hdd_change_sap_restart_required_status() - This function will change the
- * value of is_sap_restart_required
+ * value of is_sap_restart_required
+ *
* @hdd_ctx: pointer to hdd context
* @value: value to set
*
@@ -199,4 +201,23 @@ hdd_change_sap_restart_required_status(hdd_context_t *hdd_ctx,
spin_unlock(&hdd_ctx->sap_update_info_lock);
}
+/**
+ * hdd_change_ch_avoidance_status() - update is_ch_avoid_in_progress flag
+ *
+ * @hdd_ctx: pointer to hdd context
+ * @value: value to set
+ *
+ * This function will change the value of is_ch_avoid_in_progress
+ *
+ * Return: none
+ */
+static inline void
+hdd_change_ch_avoidance_status(hdd_context_t *hdd_ctx,
+ bool value)
+{
+ spin_lock(&hdd_ctx->sap_update_info_lock);
+ hdd_ctx->is_ch_avoid_in_progress = value;
+ spin_unlock(&hdd_ctx->sap_update_info_lock);
+}
+
#endif // end #if !defined( WLAN_HDD_HOSTAPD_H )
diff --git a/CORE/HDD/inc/wlan_hdd_main.h b/CORE/HDD/inc/wlan_hdd_main.h
index 1d63c2ea397e..652136e6b918 100644
--- a/CORE/HDD/inc/wlan_hdd_main.h
+++ b/CORE/HDD/inc/wlan_hdd_main.h
@@ -399,6 +399,7 @@ typedef struct hdd_stats_s
tCsrGlobalClassCStatsInfo ClassC_stat;
tCsrGlobalClassDStatsInfo ClassD_stat;
tCsrPerStaStatsInfo perStaStats;
+ struct csr_per_chain_rssi_stats_info per_chain_rssi_stats;
hdd_tx_rx_stats_t hddTxRxStats;
#ifdef WLAN_FEATURE_11W
hdd_pmf_stats_t hddPmfStats;
@@ -926,6 +927,7 @@ typedef struct multicast_addr_list
* @scan: scan context to prevent/allow runtime pm
* @roc : remain on channel runtime pm context
* @dfs : Dynamic frequency selection runtime pm context
+ * @obss: Obss protection runtime pm context
*
* Prevent Runtime PM for scan, roc and dfs.
*/
@@ -933,6 +935,7 @@ struct hdd_runtime_pm_context {
void *scan;
void *roc;
void *dfs;
+ void *obss;
};
/**
@@ -1718,6 +1721,8 @@ struct hdd_context_s
struct work_struct sap_start_work;
bool is_sap_restart_required;
+ bool is_ch_avoid_in_progress;
+
bool is_sta_connection_pending;
spinlock_t sap_update_info_lock;
spinlock_t sta_update_info_lock;
@@ -2219,4 +2224,7 @@ static inline void wlan_hdd_restart_sap(hdd_adapter_t *ap_adapter)
int hdd_reassoc(hdd_adapter_t *pAdapter, const tANI_U8 *bssid,
const tANI_U8 channel, const handoff_src src);
+
+void hdd_sap_restart_handle(struct work_struct *work);
+
#endif // end #if !defined( WLAN_HDD_MAIN_H )
diff --git a/CORE/HDD/src/wlan_hdd_assoc.c b/CORE/HDD/src/wlan_hdd_assoc.c
index 3e5814a34e07..ae548cc08030 100644
--- a/CORE/HDD/src/wlan_hdd_assoc.c
+++ b/CORE/HDD/src/wlan_hdd_assoc.c
@@ -988,9 +988,12 @@ static eHalStatus hdd_DisConnectHandler( hdd_adapter_t *pAdapter, tCsrRoamInfo *
#endif /* QCA_PKT_PROTO_TRACE */
/* HDD has initiated disconnect, do not send disconnect indication
- * to kernel.
+ * to kernel. Sending disconnected event to kernel for userspace
+ * initiated disconnect will be handled by diconnect handler call
+ * to cfg80211_disconnected
*/
- if (eConnectionState_Disconnecting == pHddStaCtx->conn_info.connState)
+ if ((eConnectionState_Disconnecting == pHddStaCtx->conn_info.connState) ||
+ (eConnectionState_NotConnected == pHddStaCtx->conn_info.connState))
{
VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
FL(" HDD has initiated a disconnect, no need to send"
@@ -1031,12 +1034,12 @@ static eHalStatus hdd_DisConnectHandler( hdd_adapter_t *pAdapter, tCsrRoamInfo *
pr_info(
"wlan: disconnected due to poor signal, rssi is %d dB\n",
pRoamInfo->rxRssi);
- cfg80211_disconnected(dev, pRoamInfo->reasonCode, NULL, 0,
- GFP_KERNEL);
+ wlan_hdd_cfg80211_indicate_disconnect(dev, true,
+ WLAN_REASON_UNSPECIFIED);
}
else
- cfg80211_disconnected(dev, WLAN_REASON_UNSPECIFIED, NULL, 0,
- GFP_KERNEL);
+ wlan_hdd_cfg80211_indicate_disconnect(dev, true,
+ WLAN_REASON_UNSPECIFIED);
hddLog(VOS_TRACE_LEVEL_INFO_HIGH,
FL("sent disconnected event to nl80211, reason code %d"),
@@ -1609,7 +1612,7 @@ void hdd_PerformRoamSetKeyComplete(hdd_adapter_t *pAdapter)
*
* Return: void.
*/
-static void hdd_sap_restart_handle(struct work_struct *work)
+void hdd_sap_restart_handle(struct work_struct *work)
{
hdd_adapter_t *sap_adapter;
hdd_context_t *hdd_ctx = container_of(work,
@@ -1628,9 +1631,15 @@ static void hdd_sap_restart_handle(struct work_struct *work)
vos_ssr_unprotect(__func__);
return;
}
- wlan_hdd_start_sap(sap_adapter);
- hdd_change_sap_restart_required_status(hdd_ctx, false);
+ if (hdd_ctx->is_ch_avoid_in_progress) {
+ sap_adapter->sessionCtx.ap.sapConfig.channel = AUTO_CHANNEL_SELECT;
+ wlan_hdd_restart_sap(sap_adapter);
+ hdd_change_ch_avoidance_status(hdd_ctx, false);
+ } else {
+ wlan_hdd_start_sap(sap_adapter);
+ hdd_change_sap_restart_required_status(hdd_ctx, false);
+ }
vos_ssr_unprotect(__func__);
}
@@ -1790,10 +1799,6 @@ static eHalStatus hdd_AssociationCompletionHandler( hdd_adapter_t *pAdapter, tCs
}
#endif
-#ifdef FEATURE_WLAN_TDLS
- wlan_hdd_tdls_connection_callback(pAdapter);
-#endif
-
#ifdef QCA_PKT_PROTO_TRACE
/* STA Associated, update into trace buffer */
if (pHddCtx->cfg_ini->gEnableDebugLog)
@@ -1989,6 +1994,10 @@ static eHalStatus hdd_AssociationCompletionHandler( hdd_adapter_t *pAdapter, tCs
NULL,
pRoamInfo->pBssDesc );
}
+
+#ifdef FEATURE_WLAN_TDLS
+ wlan_hdd_tdls_connection_callback(pAdapter);
+#endif
}
else
{
@@ -2242,9 +2251,13 @@ static eHalStatus hdd_AssociationCompletionHandler( hdd_adapter_t *pAdapter, tCs
* creating workqueue then our main thread might go to sleep which
* is not acceptable.
*/
- vos_init_work(&pHddCtx->sap_start_work,
- hdd_sap_restart_handle);
- schedule_work(&pHddCtx->sap_start_work);
+
+ /*
+ * If channel avoidance is intiated, don't schedule the work.
+ * Channel avoidance takes care restarting SAP.
+ */
+ if (true == hdd_is_sap_restart_required(pHddCtx))
+ schedule_work(&pHddCtx->sap_start_work);
}
@@ -4011,8 +4024,20 @@ hdd_smeRoamCallback(void *pContext, tCsrRoamInfo *pRoamInfo, tANI_U32 roamId,
eSME_FULL_PWR_NEEDED_BY_HDD);
}
}
+ if ((pHddCtx) &&
+ (FULL_POWER == pmcGetPmcState(pHddCtx->hHal)) &&
+ (VOS_TRUE == pHddStaCtx->hdd_ReassocScenario) &&
+ (eCSR_ROAM_RESULT_NONE == roamResult)) {
+ hddLog(LOG1,
+ FL("Device in full power, Stop and start traffic timer for roaming"));
+ pmcStopTrafficTimer(pHddCtx->hHal);
+
+ if (pmcStartTrafficTimer(pHddCtx->hHal,
+ TRAFFIC_TIMER_ROAMING) != eHAL_STATUS_SUCCESS)
+ hddLog(LOGP, FL("Cannot start traffic timer"));
+ }
halStatus = hdd_RoamSetKeyCompleteHandler( pAdapter, pRoamInfo, roamId, roamStatus, roamResult );
- if (eCSR_ROAM_RESULT_AUTHENTICATED == roamResult) {
+ if (eCSR_ROAM_RESULT_NONE == roamResult) {
pHddStaCtx->hdd_ReassocScenario = VOS_FALSE;
hddLog(LOG1,
FL("hdd_ReassocScenario set to: %d, set key complete, session: %d"),
diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c
index 6130a7f54faa..a4ae6863208a 100644
--- a/CORE/HDD/src/wlan_hdd_cfg.c
+++ b/CORE/HDD/src/wlan_hdd_cfg.c
@@ -4575,6 +4575,13 @@ REG_TABLE_ENTRY g_registry_table[] =
CFG_TGT_GTX_USR_CFG_DEFAULT,
CFG_TGT_GTX_USR_CFG_MIN,
CFG_TGT_GTX_USR_CFG_MAX),
+
+ REG_VARIABLE(CFG_CH_AVOID_SAP_RESTART_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, sap_restrt_ch_avoid,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_CH_AVOID_SAP_RESTART_DEFAULT,
+ CFG_CH_AVOID_SAP_RESTART_MIN,
+ CFG_CH_AVOID_SAP_RESTART_MAX)
};
@@ -5389,6 +5396,9 @@ void print_hdd_cfg(hdd_context_t *pHddCtx)
CFG_TGT_GTX_USR_CFG_NAME,
pHddCtx->cfg_ini->tgt_gtx_usr_cfg);
+ hddLog(LOG2, "Name = [%s] Value = [%u]",
+ CFG_CH_AVOID_SAP_RESTART_NAME,
+ pHddCtx->cfg_ini->sap_restrt_ch_avoid);
hdd_ndp_print_ini_config(pHddCtx);
}
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index a39c683ddbd1..f939dfb10156 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -129,6 +129,8 @@
#define MAX_REMAIN_ON_CHANNEL_DURATION (5000)
#define HDD_WAKE_LOCK_SCAN_DURATION (5 * 1000) /* in msec */
+#define WLAN_HDD_TGT_NOISE_FLOOR_DBM (-96)
+
/* For IBSS, enable obss, fromllb, overlapOBSS & overlapFromllb protection
check. The bit map is defined in:
@@ -185,6 +187,8 @@
#define WLAN_AKM_SUITE_FT_PSK 0x000FAC04
#endif
+#define MAX_TXPOWER_SCALE 4
+
#define HDD_CHANNEL_14 14
#define WLAN_HDD_MAX_FEATURE_SET 8
@@ -10390,6 +10394,7 @@ static uint32_t hdd_send_wakelock_stats(hdd_context_t *hdd_ctx,
uint32_t nl_buf_len;
uint32_t total_rx_data_wake, rx_multicast_cnt;
uint32_t ipv6_rx_multicast_addr_cnt;
+ uint32_t icmpv6_cnt;
ENTER();
@@ -10419,6 +10424,8 @@ static uint32_t hdd_send_wakelock_stats(hdd_context_t *hdd_ctx,
data->wow_ipv6_mcast_ns_stats);
hddLog(LOG1, "wow_ipv6_mcast_na_stats %d",
data->wow_ipv6_mcast_na_stats);
+ hddLog(LOG1, "wow_icmpv4_count %d", data->wow_icmpv4_count);
+ hddLog(LOG1, "wow_icmpv6_uc_bc_count %d", data->wow_icmpv6_uc_bc_count);
ipv6_rx_multicast_addr_cnt =
data->wow_ipv6_mcast_wake_up_count +
@@ -10426,6 +10433,12 @@ static uint32_t hdd_send_wakelock_stats(hdd_context_t *hdd_ctx,
data->wow_ipv6_mcast_ns_stats +
data->wow_ipv6_mcast_na_stats;
+ icmpv6_cnt =
+ data->wow_icmpv6_uc_bc_count +
+ data->wow_ipv6_mcast_ra_stats +
+ data->wow_ipv6_mcast_ns_stats +
+ data->wow_ipv6_mcast_na_stats;
+
rx_multicast_cnt =
data->wow_ipv4_mcast_wake_up_count +
ipv6_rx_multicast_addr_cnt;
@@ -10435,7 +10448,6 @@ static uint32_t hdd_send_wakelock_stats(hdd_context_t *hdd_ctx,
data->wow_bcast_wake_up_count +
rx_multicast_cnt;
-
if (nla_put_u32(skb, PARAM_TOTAL_CMD_EVENT_WAKE, 0) ||
nla_put_u32(skb, PARAM_CMD_EVENT_WAKE_CNT_PTR, 0) ||
nla_put_u32(skb, PARAM_CMD_EVENT_WAKE_CNT_SZ, 0) ||
@@ -10451,9 +10463,9 @@ static uint32_t hdd_send_wakelock_stats(hdd_context_t *hdd_ctx,
nla_put_u32(skb, PARAM_RX_BROADCAST_CNT,
data->wow_bcast_wake_up_count) ||
nla_put_u32(skb, PARAM_ICMP_PKT,
- data->wow_ipv4_mcast_wake_up_count) ||
+ data->wow_icmpv4_count) ||
nla_put_u32(skb, PARAM_ICMP6_PKT,
- ipv6_rx_multicast_addr_cnt) ||
+ icmpv6_cnt) ||
nla_put_u32(skb, PARAM_ICMP6_RA,
data->wow_ipv6_mcast_ra_stats) ||
nla_put_u32(skb, PARAM_ICMP6_NA,
@@ -10991,6 +11003,257 @@ static int wlan_hdd_cfg80211_sap_configuration_set(struct wiphy *wiphy,
return ret;
}
+static const struct
+nla_policy qca_wlan_vendor_attr[QCA_WLAN_VENDOR_ATTR_MAX+1] = {
+ [QCA_WLAN_VENDOR_ATTR_ROAMING_POLICY] = {.type = NLA_U32},
+ [QCA_WLAN_VENDOR_ATTR_MAC_ADDR] = {.type = NLA_BINARY,
+ .len = VOS_MAC_ADDR_SIZE},
+};
+
+/**
+ * __wlan_hdd_cfg80211_fast_roaming() - enable/disable roaming
+ * @wiphy: Pointer to wireless phy
+ * @wdev: Pointer to wireless device
+ * @data: Pointer to data
+ * @data_len: Length of @data
+ *
+ * This function is used to enable/disable roaming using vendor commands
+ *
+ * Return: 0 on success, negative errno on failure
+ */
+static int __wlan_hdd_cfg80211_fast_roaming(struct wiphy *wiphy,
+ struct wireless_dev *wdev,
+ const void *data, int data_len)
+{
+ hdd_context_t *hdd_ctx = wiphy_priv(wiphy);
+ struct net_device *dev = wdev->netdev;
+ hdd_adapter_t *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
+ struct nlattr *tb[QCA_WLAN_VENDOR_ATTR_MAX + 1];
+ uint32_t is_fast_roam_enabled;
+ int ret;
+
+ ENTER();
+
+ ret = wlan_hdd_validate_context(hdd_ctx);
+ if (0 != ret)
+ return ret;
+
+ if (VOS_FTM_MODE == hdd_get_conparam()) {
+ hddLog(LOGE, FL("Command not allowed in FTM mode"));
+ return -EINVAL;
+ }
+
+ ret = nla_parse(tb, QCA_WLAN_VENDOR_ATTR_MAX, data, data_len,
+ qca_wlan_vendor_attr);
+ if (ret) {
+ hddLog(LOGE, FL("Invalid ATTR"));
+ return -EINVAL;
+ }
+
+ /* Parse and fetch Enable flag */
+ if (!tb[QCA_WLAN_VENDOR_ATTR_ROAMING_POLICY]) {
+ hddLog(LOGE, FL("attr enable failed"));
+ return -EINVAL;
+ }
+
+ is_fast_roam_enabled = nla_get_u32(
+ tb[QCA_WLAN_VENDOR_ATTR_ROAMING_POLICY]);
+ hddLog(LOG1, FL("isFastRoamEnabled %d"), is_fast_roam_enabled);
+
+ /* Update roaming */
+ ret = sme_config_fast_roaming(hdd_ctx->hHal, adapter->sessionId,
+ is_fast_roam_enabled);
+ if (ret)
+ hddLog(LOGE, FL("sme_config_fast_roaming failed"));
+ EXIT();
+ return ret;
+}
+
+/**
+ * wlan_hdd_cfg80211_fast_roaming() - enable/disable roaming
+ * @wiphy: Pointer to wireless phy
+ * @wdev: Pointer to wireless device
+ * @data: Pointer to data
+ * @data_len: Length of @data
+ *
+ * Wrapper function of __wlan_hdd_cfg80211_fast_roaming()
+ *
+ * Return: 0 on success, negative errno on failure
+ */
+static int wlan_hdd_cfg80211_fast_roaming(struct wiphy *wiphy,
+ struct wireless_dev *wdev,
+ const void *data, int data_len)
+{
+ int ret;
+
+ vos_ssr_protect(__func__);
+ ret = __wlan_hdd_cfg80211_fast_roaming(wiphy, wdev,
+ data, data_len);
+ vos_ssr_unprotect(__func__);
+
+ return ret;
+}
+
+/**
+ * __wlan_hdd_cfg80211_txpower_scale () - txpower scaling
+ * @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_txpower_scale(struct wiphy *wiphy,
+ struct wireless_dev *wdev,
+ const void *data,
+ int data_len)
+{
+ hdd_context_t *hdd_ctx = wiphy_priv(wiphy);
+ struct net_device *dev = wdev->netdev;
+ hdd_adapter_t *adapter;
+ int ret;
+ struct nlattr *tb[QCA_WLAN_VENDOR_ATTR_TXPOWER_SCALE_MAX + 1];
+ uint8_t scale_value;
+ VOS_STATUS status;
+
+ ENTER();
+
+ ret = wlan_hdd_validate_context(hdd_ctx);
+ if (ret)
+ return ret;
+
+ adapter = WLAN_HDD_GET_PRIV_PTR(dev);
+
+ if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_TXPOWER_SCALE_MAX,
+ data, data_len, NULL)) {
+ hddLog(LOGE, "Invalid ATTR");
+ return -EINVAL;
+ }
+
+ if (!tb[QCA_WLAN_VENDOR_ATTR_TXPOWER_SCALE]) {
+ hddLog(LOGE, "attr tx power scale failed");
+ return -EINVAL;
+ }
+
+ scale_value = nla_get_u8(tb
+ [QCA_WLAN_VENDOR_ATTR_TXPOWER_SCALE]);
+
+ if (scale_value > MAX_TXPOWER_SCALE) {
+ hddLog(LOGE, "Invalid tx power scale level");
+ return -EINVAL;
+ }
+
+ status = wma_set_tx_power_scale(adapter->sessionId, scale_value);
+
+ if (VOS_STATUS_SUCCESS != status) {
+ hddLog(LOGE, "Set tx power scale failed");
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+/**
+ * wlan_hdd_cfg80211_txpower_scale () - txpower scaling
+ * @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_txpower_scale(struct wiphy *wiphy,
+ struct wireless_dev *wdev,
+ const void *data,
+ int data_len)
+{
+ int ret;
+
+ vos_ssr_protect(__func__);
+ ret = __wlan_hdd_cfg80211_txpower_scale(wiphy, wdev,
+ data, data_len);
+ vos_ssr_unprotect(__func__);
+
+ return ret;
+}
+
+/**
+ * __wlan_hdd_cfg80211_txpower_scale_decr_db () - txpower scaling
+ * @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_txpower_scale_decr_db(struct wiphy *wiphy,
+ struct wireless_dev *wdev,
+ const void *data,
+ int data_len)
+{
+ hdd_context_t *hdd_ctx = wiphy_priv(wiphy);
+ struct net_device *dev = wdev->netdev;
+ hdd_adapter_t *adapter;
+ int ret;
+ struct nlattr *tb[QCA_WLAN_VENDOR_ATTR_TXPOWER_SCALE_DECR_DB_MAX + 1];
+ uint8_t scale_value;
+ VOS_STATUS status;
+
+ ret = wlan_hdd_validate_context(hdd_ctx);
+ if (ret)
+ return ret;
+
+ adapter = WLAN_HDD_GET_PRIV_PTR(dev);
+
+ if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_TXPOWER_SCALE_DECR_DB_MAX,
+ data, data_len, NULL)) {
+ hddLog(LOGE, "Invalid ATTR");
+ return -EINVAL;
+ }
+
+ if (!tb[QCA_WLAN_VENDOR_ATTR_TXPOWER_SCALE_DECR_DB]) {
+ hddLog(LOGE, "attr tx power decrease db value failed");
+ return -EINVAL;
+ }
+
+ scale_value = nla_get_u8(tb
+ [QCA_WLAN_VENDOR_ATTR_TXPOWER_SCALE_DECR_DB]);
+
+ status = wma_set_tx_power_scale_decr_db(adapter->sessionId,
+ scale_value);
+
+ if (VOS_STATUS_SUCCESS != status) {
+ hddLog(LOGE,"Set tx power decrease db failed");
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+/**
+ * wlan_hdd_cfg80211_txpower_scale_decr_db () - txpower scaling
+ * @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_txpower_scale_decr_db(struct wiphy *wiphy,
+ struct wireless_dev *wdev,
+ const void *data,
+ int data_len)
+{
+ int ret;
+
+ vos_ssr_protect(__func__);
+ ret = __wlan_hdd_cfg80211_txpower_scale_decr_db(wiphy, wdev,
+ data, data_len);
+ vos_ssr_unprotect(__func__);
+
+ return ret;
+}
+
const struct wiphy_vendor_command hdd_wiphy_vendor_commands[] =
{
{
@@ -11497,6 +11760,32 @@ const struct wiphy_vendor_command hdd_wiphy_vendor_commands[] =
WIPHY_VENDOR_CMD_NEED_RUNNING,
.doit = wlan_hdd_cfg80211_sap_configuration_set
},
+
+ {
+ .info.vendor_id = QCA_NL80211_VENDOR_ID,
+ .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_ROAMING,
+ .flags = WIPHY_VENDOR_CMD_NEED_WDEV |
+ WIPHY_VENDOR_CMD_NEED_NETDEV |
+ WIPHY_VENDOR_CMD_NEED_RUNNING,
+ .doit = wlan_hdd_cfg80211_fast_roaming
+ },
+ {
+ .info.vendor_id = QCA_NL80211_VENDOR_ID,
+ .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_SET_TXPOWER_SCALE,
+ .flags = WIPHY_VENDOR_CMD_NEED_WDEV |
+ WIPHY_VENDOR_CMD_NEED_NETDEV |
+ WIPHY_VENDOR_CMD_NEED_RUNNING,
+ .doit = wlan_hdd_cfg80211_txpower_scale
+ },
+ {
+ .info.vendor_id = QCA_NL80211_VENDOR_ID,
+ .info.subcmd =
+ QCA_NL80211_VENDOR_SUBCMD_SET_TXPOWER_SCALE_DECR_DB,
+ .flags = WIPHY_VENDOR_CMD_NEED_WDEV |
+ WIPHY_VENDOR_CMD_NEED_NETDEV |
+ WIPHY_VENDOR_CMD_NEED_RUNNING,
+ .doit = wlan_hdd_cfg80211_txpower_scale_decr_db
+ },
};
@@ -11692,7 +11981,11 @@ int wlan_hdd_cfg80211_init(struct device *dev,
vos_mem_copy(wiphy->bands[IEEE80211_BAND_2GHZ]->channels,
&hdd_channels_2_4_GHZ[0],
sizeof(hdd_channels_2_4_GHZ));
- if (hdd_is_5g_supported(pHddCtx))
+ if (hdd_is_5g_supported(pHddCtx) &&
+ ((eHDD_DOT11_MODE_11b != pCfg->dot11Mode) ||
+ (eHDD_DOT11_MODE_11g != pCfg->dot11Mode) ||
+ (eHDD_DOT11_MODE_11b_ONLY != pCfg->dot11Mode) ||
+ (eHDD_DOT11_MODE_11g_ONLY != pCfg->dot11Mode)))
{
wiphy->bands[IEEE80211_BAND_5GHZ] = &wlan_hdd_band_5_GHZ;
wiphy->bands[IEEE80211_BAND_5GHZ]->channels =
@@ -13766,6 +14059,10 @@ static int wlan_hdd_cfg80211_start_bss(hdd_adapter_t *pHostapdAdapter,
/* Successfully started Bss update the state bit. */
set_bit(SOFTAP_BSS_STARTED, &pHostapdAdapter->event_flags);
+ /* Disable runtime PM if obss protection is enabled */
+ if (pConfig->obssProtEnabled)
+ vos_runtime_pm_prevent_suspend(pHddCtx->runtime_context.obss);
+
/* Initialize WMM configuation */
hdd_wmm_init(pHostapdAdapter);
wlan_hdd_incr_active_session(pHddCtx, pHostapdAdapter->device_mode);
@@ -14064,6 +14361,7 @@ static int __wlan_hdd_cfg80211_stop_ap (struct wiphy *wiphy,
vos_flush_work(&pHddCtx->sap_start_work);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_WARN,
FL("Canceled the pending restart work"));
+ hdd_change_ch_avoidance_status(pHddCtx, false);
hdd_change_sap_restart_required_status(pHddCtx, false);
}
@@ -14116,6 +14414,8 @@ static int __wlan_hdd_cfg80211_stop_ap (struct wiphy *wiphy,
if (pHddCtx->cfg_ini->enable_dynamic_sta_chainmask)
hdd_decide_dynamic_chain_mask(pHddCtx, HDD_ANTENNA_MODE_INVALID);
+ if (pHddCtx->cfg_ini->apOBSSProtEnabled)
+ vos_runtime_pm_allow_suspend(pHddCtx->runtime_context.obss);
if (status != VOS_STATUS_SUCCESS) {
hddLog(VOS_TRACE_LEVEL_FATAL, FL("Stopping the BSS"));
@@ -14942,6 +15242,15 @@ static int wlan_hdd_tdls_add_station(struct wiphy *wiphy,
return -ENOTSUPP;
}
+ if (!test_bit(TDLS_INIT_DONE, &pAdapter->event_flags)) {
+ hddLog(LOG1, FL("TDLS init was not done!"));
+ if (0 != wlan_hdd_tdls_init(pAdapter)) {
+ hddLog(LOGE, FL("wlan_hdd_tdls_init failed, exit"));
+ return -EINVAL;
+ }
+ set_bit(TDLS_INIT_DONE, &pAdapter->event_flags);
+ }
+
pTdlsPeer = wlan_hdd_tdls_get_peer(pAdapter, mac);
if ( NULL == pTdlsPeer ) {
@@ -17648,9 +17957,11 @@ int wlan_hdd_cfg80211_connect_start( hdd_adapter_t *pAdapter,
vos_mem_copy((void *)(pRoamProfile->SSIDs.SSIDList->SSID.ssId),
ssid, ssid_len);
+ pRoamProfile->do_not_roam = false;
if (bssid)
{
pRoamProfile->BSSIDs.numOfBSSIDs = 1;
+ pRoamProfile->do_not_roam = true;
vos_mem_copy((void *)(pRoamProfile->BSSIDs.bssid), bssid,
VOS_MAC_ADDR_SIZE);
/* Save BSSID in separate variable as well, as RoamProfile
@@ -18842,6 +19153,16 @@ int wlan_hdd_disconnect( hdd_adapter_t *pAdapter, u16 reason )
disconnected:
hdd_connSetConnectionState(pAdapter,
eConnectionState_NotConnected);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)
+ /* Sending disconnect event to userspace for kernel version < 3.11
+ * is handled by __cfg80211_disconnect call to __cfg80211_disconnected
+ */
+ hddLog(LOG1, FL("Send disconnected event to userspace"));
+
+ wlan_hdd_cfg80211_indicate_disconnect(pAdapter->dev, false,
+ WLAN_REASON_UNSPECIFIED);
+#endif
+
EXIT();
return result;
}
@@ -19757,6 +20078,9 @@ static int __wlan_hdd_cfg80211_get_station(struct wiphy *wiphy,
int status, mode = 0, maxHtIdx;
struct index_vht_data_rate_type *supported_vht_mcs_rate;
struct index_data_rate_type *supported_mcs_rate;
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0))
+ bool rssi_stats_valid = FALSE;
+#endif
#ifdef WLAN_FEATURE_11AC
tANI_U32 vht_mcs_map;
@@ -20278,6 +20602,29 @@ static int __wlan_hdd_cfg80211_get_station(struct wiphy *wiphy,
sinfo->txrate.mcs, sinfo->txrate.flags, sinfo->tx_packets,
sinfo->rx_packets);
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0))
+ sinfo->signal_avg = WLAN_HDD_TGT_NOISE_FLOOR_DBM;
+ for (i = 0; i < NUM_CHAINS_MAX; i++) {
+ sinfo->chain_signal_avg[i] =
+ pAdapter->hdd_stats.per_chain_rssi_stats.rssi[i];
+ sinfo->chains |= 1 << i;
+ if (sinfo->chain_signal_avg[i] > sinfo->signal_avg &&
+ sinfo->chain_signal_avg[i] != 0)
+ sinfo->signal_avg = sinfo->chain_signal_avg[i];
+
+ hddLog(LOG1, FL("RSSI for chain %d, vdev_id %d is %d"),
+ i, pAdapter->sessionId, sinfo->chain_signal_avg[i]);
+
+ if (sinfo->chain_signal_avg[i] && !rssi_stats_valid)
+ rssi_stats_valid = TRUE;
+ }
+
+ if (rssi_stats_valid) {
+ sinfo->filled |= STATION_INFO_CHAIN_SIGNAL_AVG;
+ sinfo->filled |= STATION_INFO_SIGNAL_AVG;
+ }
+#endif
+
MTRACE(vos_trace(VOS_MODULE_ID_HDD,
TRACE_CODE_HDD_CFG80211_GET_STA,
pAdapter->sessionId, maxRate));
@@ -20285,6 +20632,34 @@ static int __wlan_hdd_cfg80211_get_station(struct wiphy *wiphy,
return 0;
}
+static int __wlan_hdd_cfg80211_dump_station(struct wiphy *wiphy,
+ struct net_device *dev,
+ int idx, u8 *mac,
+ struct station_info *sinfo)
+{
+ hdd_context_t *hdd_ctx = (hdd_context_t *) wiphy_priv(wiphy);
+
+ hddLog(VOS_TRACE_LEVEL_DEBUG, "%s: idx %d", __func__, idx);
+ if (idx != 0)
+ return -ENOENT;
+ vos_mem_copy(mac, hdd_ctx->cfg_ini->intfMacAddr[0].bytes,
+ VOS_MAC_ADDR_SIZE);
+ return __wlan_hdd_cfg80211_get_station(wiphy, dev, mac, sinfo);
+}
+
+static int wlan_hdd_cfg80211_dump_station(struct wiphy *wiphy,
+ struct net_device *dev,
+ int idx, u8 *mac,
+ struct station_info *sinfo)
+{
+ int ret;
+
+ vos_ssr_protect(__func__);
+ ret = __wlan_hdd_cfg80211_dump_station(wiphy, dev, idx, mac, sinfo);
+ vos_ssr_unprotect(__func__);
+ return ret;
+}
+
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,16,0)) || defined(WITH_BACKPORTS)
static int wlan_hdd_cfg80211_get_station(struct wiphy *wiphy,
struct net_device *dev,
@@ -21227,16 +21602,16 @@ static int __wlan_hdd_cfg80211_sched_scan_start(struct wiphy *wiphy,
}
}
}
- hddLog(VOS_TRACE_LEVEL_INFO,"Channel-List: %s ", chList);
- /*If all channels are DFS and dropped, then ignore the PNO request*/
- if (num_ignore_dfs_ch == request->n_channels)
- {
+ if (!num_ch) {
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
- "%s : All requested channels are DFS channels", __func__);
+ "%s : Channel list empty due to filtering of DSRC,DFS channels",
+ __func__);
ret = -EINVAL;
goto error;
}
+
+ hddLog(VOS_TRACE_LEVEL_INFO,"Channel-List: %s ", chList);
}
/* Filling per profile params */
@@ -25168,6 +25543,7 @@ static struct cfg80211_ops wlan_hdd_cfg80211_ops =
.mgmt_tx_cancel_wait = wlan_hdd_cfg80211_mgmt_tx_cancel_wait,
.set_default_mgmt_key = wlan_hdd_set_default_mgmt_key,
.set_txq_params = wlan_hdd_set_txq_params,
+ .dump_station = wlan_hdd_cfg80211_dump_station,
.get_station = wlan_hdd_cfg80211_get_station,
.set_power_mgmt = wlan_hdd_cfg80211_set_power_mgmt,
.del_station = wlan_hdd_cfg80211_del_station,
diff --git a/CORE/HDD/src/wlan_hdd_hostapd.c b/CORE/HDD/src/wlan_hdd_hostapd.c
index 53d82a8eecc9..40ae5cb925f2 100644
--- a/CORE/HDD/src/wlan_hdd_hostapd.c
+++ b/CORE/HDD/src/wlan_hdd_hostapd.c
@@ -861,6 +861,8 @@ static int hdd_stop_bss_link(hdd_adapter_t *pHostapdAdapter,
clear_bit(SOFTAP_BSS_STARTED, &pHostapdAdapter->event_flags);
wlan_hdd_decr_active_session(pHddCtx, pHostapdAdapter->device_mode);
}
+ if (pHddCtx->cfg_ini->apOBSSProtEnabled)
+ vos_runtime_pm_allow_suspend(pHddCtx->runtime_context.obss);
EXIT();
return (status == VOS_STATUS_SUCCESS) ? 0 : -EBUSY;
}
@@ -5725,6 +5727,8 @@ static int __iw_softap_stopbss(struct net_device *dev,
clear_bit(SOFTAP_BSS_STARTED, &pHostapdAdapter->event_flags);
wlan_hdd_decr_active_session(pHddCtx, pHostapdAdapter->device_mode);
}
+ if (pHddCtx->cfg_ini->apOBSSProtEnabled)
+ vos_runtime_pm_allow_suspend(pHddCtx->runtime_context.obss);
EXIT();
return (status == VOS_STATUS_SUCCESS) ? 0 : -EBUSY;
}
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index cbb737b242de..896e359095c3 100644
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -865,7 +865,7 @@ static void hdd_smps_force_mode_cb(void *context,
}
-#if defined (FEATURE_WLAN_MCC_TO_SCC_SWITCH) || defined (FEATURE_WLAN_STA_AP_MODE_DFS_DISABLE)
+#if defined (FEATURE_WLAN_MCC_TO_SCC_SWITCH) || defined (FEATURE_WLAN_STA_AP_MODE_DFS_DISABLE) || defined (FEATURE_WLAN_CH_AVOID)
/**
* wlan_hdd_restart_sap() - This function is used to restart SAP in driver internally
* @ap_adapter: - Pointer to SAP hdd_adapter_t structure
@@ -925,6 +925,8 @@ void wlan_hdd_restart_sap(hdd_adapter_t *ap_adapter)
wlan_hdd_decr_active_session(pHddCtx, ap_adapter->device_mode);
hddLog(LOGE, FL("SAP Stop Success"));
+ if (pHddCtx->cfg_ini->apOBSSProtEnabled)
+ vos_runtime_pm_allow_suspend(pHddCtx->runtime_context.obss);
if (0 != wlan_hdd_cfg80211_update_apies(ap_adapter)) {
hddLog(LOGE, FL("SAP Not able to set AP IEs"));
WLANSAP_ResetSapConfigAddIE(pConfig, eUPDATE_IE_ALL);
@@ -953,6 +955,8 @@ void wlan_hdd_restart_sap(hdd_adapter_t *ap_adapter)
set_bit(SOFTAP_BSS_STARTED, &ap_adapter->event_flags);
wlan_hdd_incr_active_session(pHddCtx, ap_adapter->device_mode);
pHostapdState->bCommit = TRUE;
+ if (pHddCtx->cfg_ini->apOBSSProtEnabled)
+ vos_runtime_pm_prevent_suspend(pHddCtx->runtime_context.obss);
}
end:
mutex_unlock(&pHddCtx->sap_lock);
@@ -10007,6 +10011,7 @@ void hdd_runtime_suspend_init(hdd_context_t *hdd_ctx)
context->scan = vos_runtime_pm_prevent_suspend_init("scan");
context->roc = vos_runtime_pm_prevent_suspend_init("roc");
context->dfs = vos_runtime_pm_prevent_suspend_init("dfs");
+ context->obss = vos_runtime_pm_prevent_suspend_init("obss");
}
/**
@@ -10027,6 +10032,8 @@ void hdd_runtime_suspend_deinit(hdd_context_t *hdd_ctx)
context->roc = NULL;
vos_runtime_pm_prevent_suspend_deinit(context->dfs);
context->dfs = NULL;
+ vos_runtime_pm_prevent_suspend_deinit(context->obss);
+ context->obss = NULL;
}
/**
@@ -11522,6 +11529,7 @@ VOS_STATUS hdd_stop_adapter( hdd_context_t *pHddCtx, hdd_adapter_t *pAdapter,
vos_flush_work(&pHddCtx->sap_start_work);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
FL("Canceled the pending SAP restart work"));
+ hdd_change_ch_avoidance_status(pHddCtx, false);
hdd_change_sap_restart_required_status(pHddCtx, false);
}
//Any softap specific cleanup here...
@@ -11573,6 +11581,8 @@ VOS_STATUS hdd_stop_adapter( hdd_context_t *pHddCtx, hdd_adapter_t *pAdapter,
updateIE.pAdditionIEBuffer = NULL;
updateIE.append = VOS_FALSE;
updateIE.notify = VOS_FALSE;
+ if (pHddCtx->cfg_ini->apOBSSProtEnabled)
+ vos_runtime_pm_allow_suspend(pHddCtx->runtime_context.obss);
/* Probe bcn reset */
if (sme_UpdateAddIE(WLAN_HDD_GET_HAL_CTX(pAdapter),
&updateIE, eUPDATE_IE_PROBE_BCN)
@@ -11798,8 +11808,8 @@ VOS_STATUS hdd_start_all_adapters( hdd_context_t *pHddCtx )
pAdapter->sessionCtx.station.hdd_ReassocScenario = VOS_FALSE;
/* indicate disconnected event to nl80211 */
- cfg80211_disconnected(pAdapter->dev, WLAN_REASON_UNSPECIFIED,
- NULL, 0, GFP_KERNEL);
+ wlan_hdd_cfg80211_indicate_disconnect(pAdapter->dev, true,
+ WLAN_REASON_UNSPECIFIED);
}
else if (eConnectionState_Connecting == connState)
{
@@ -14968,6 +14978,7 @@ int hdd_wlan_startup(struct device *dev, v_VOID_t *hif_sc)
/* Initialize the RoC Request queue and work. */
hdd_list_init((&pHddCtx->hdd_roc_req_q), MAX_ROC_REQ_QUEUE_ENTRY);
vos_init_delayed_work(&pHddCtx->rocReqWork, wlan_hdd_roc_request_dequeue);
+ vos_init_work(&pHddCtx->sap_start_work, hdd_sap_restart_handle);
if (pHddCtx->cfg_ini->dot11p_mode == WLAN_HDD_11P_STANDALONE) {
/* Create only 802.11p interface */
@@ -16540,8 +16551,6 @@ void hdd_unsafe_channel_restart_sap(hdd_context_t *hdd_ctx)
hdd_adapter_t *adapter;
VOS_STATUS status;
- static bool restart_sap_in_progress = false;
-
status = hdd_get_front_adapter(hdd_ctx, &adapter_node);
while (NULL != adapter_node && VOS_STATUS_SUCCESS == status) {
adapter = adapter_node->pAdapter;
@@ -16574,22 +16583,33 @@ void hdd_unsafe_channel_restart_sap(hdd_context_t *hdd_ctx)
channel_loop++) {
if (((hdd_ctx->unsafe_channel_list[channel_loop] ==
adapter->sessionCtx.ap.operatingChannel)) &&
+ (false == hdd_ctx->is_ch_avoid_in_progress) &&
(adapter->sessionCtx.ap.sapConfig.acs_cfg.
- acs_mode == true) &&
- !restart_sap_in_progress) {
+ acs_mode == true)) {
+ hdd_change_ch_avoidance_status(hdd_ctx, true);
+
+ vos_flush_work(
+ &hdd_ctx->sap_start_work);
+
+ /*
+ * current operating channel
+ * is un-safe channel, restart driver
+ */
hddLog(LOGE,
- FL("Restarting SAP due to unsafe channel"));
+ FL("Restarting SAP due to unsafe channel"));
+
wlan_hdd_send_svc_nlink_msg(
hdd_ctx->radio_index,
WLAN_SVC_LTE_COEX_IND,
NULL,
0);
- restart_sap_in_progress = true;
- /*
- * current operating channel
- * is un-safe channel, restart driver
- */
+
hdd_hostapd_stop(adapter->dev);
+
+ if (hdd_ctx->cfg_ini->sap_restrt_ch_avoid)
+ schedule_work(
+ &hdd_ctx->sap_start_work);
+
return;
}
}
@@ -17457,6 +17477,8 @@ void wlan_hdd_stop_sap(hdd_adapter_t *ap_adapter)
wlan_hdd_decr_active_session(hdd_ctx, ap_adapter->device_mode);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
FL("SAP Stop Success"));
+ if (hdd_ctx->cfg_ini->apOBSSProtEnabled)
+ vos_runtime_pm_allow_suspend(hdd_ctx->runtime_context.obss);
} else {
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
FL("Can't stop ap because its not started"));
@@ -17524,6 +17546,8 @@ void wlan_hdd_start_sap(hdd_adapter_t *ap_adapter)
set_bit(SOFTAP_BSS_STARTED, &ap_adapter->event_flags);
wlan_hdd_incr_active_session(hdd_ctx, ap_adapter->device_mode);
hostapd_state->bCommit = TRUE;
+ if (hdd_ctx->cfg_ini->apOBSSProtEnabled)
+ vos_runtime_pm_prevent_suspend(hdd_ctx->runtime_context.obss);
end:
mutex_unlock(&hdd_ctx->sap_lock);
diff --git a/CORE/HDD/src/wlan_hdd_wext.c b/CORE/HDD/src/wlan_hdd_wext.c
index 7a6657834214..d6cf499036d6 100644
--- a/CORE/HDD/src/wlan_hdd_wext.c
+++ b/CORE/HDD/src/wlan_hdd_wext.c
@@ -3812,6 +3812,7 @@ static void hdd_get_station_statisticsCB(void *pStats, void *pContext)
struct statsContext *pStatsContext;
tCsrSummaryStatsInfo *pSummaryStats;
tCsrGlobalClassAStatsInfo *pClassAStats;
+ struct csr_per_chain_rssi_stats_info *per_chain_rssi_stats;
hdd_adapter_t *pAdapter;
if (ioctl_debug)
@@ -3836,6 +3837,8 @@ static void hdd_get_station_statisticsCB(void *pStats, void *pContext)
pSummaryStats = (tCsrSummaryStatsInfo *)pStats;
pClassAStats = (tCsrGlobalClassAStatsInfo *)( pSummaryStats + 1 );
+ per_chain_rssi_stats = (struct csr_per_chain_rssi_stats_info *)
+ (pClassAStats + 1);
pStatsContext = pContext;
pAdapter = pStatsContext->pAdapter;
if ((NULL == pAdapter) || (STATS_CONTEXT_MAGIC != pStatsContext->magic))
@@ -3861,6 +3864,7 @@ static void hdd_get_station_statisticsCB(void *pStats, void *pContext)
/* copy over the stats. do so as a struct copy */
pAdapter->hdd_stats.summary_stat = *pSummaryStats;
pAdapter->hdd_stats.ClassA_stat = *pClassAStats;
+ pAdapter->hdd_stats.per_chain_rssi_stats = *per_chain_rssi_stats;
/* notify the caller */
complete(&pStatsContext->completion);
@@ -3892,7 +3896,8 @@ VOS_STATUS wlan_hdd_get_station_stats(hdd_adapter_t *pAdapter)
hstatus = sme_GetStatistics(WLAN_HDD_GET_HAL_CTX(pAdapter),
eCSR_HDD,
SME_SUMMARY_STATS |
- SME_GLOBAL_CLASSA_STATS,
+ SME_GLOBAL_CLASSA_STATS |
+ SME_PER_CHAIN_RSSI_STATS,
hdd_get_station_statisticsCB,
0, // not periodic
FALSE, //non-cached results
diff --git a/CORE/MAC/inc/qwlan_version.h b/CORE/MAC/inc/qwlan_version.h
index 8a13c3bd3baa..f72e5638ed5b 100644
--- a/CORE/MAC/inc/qwlan_version.h
+++ b/CORE/MAC/inc/qwlan_version.h
@@ -42,9 +42,9 @@ BRIEF DESCRIPTION:
#define QWLAN_VERSION_MINOR 0
#define QWLAN_VERSION_PATCH 11
#define QWLAN_VERSION_EXTRA ""
-#define QWLAN_VERSION_BUILD 83
+#define QWLAN_VERSION_BUILD 86
-#define QWLAN_VERSIONSTR "4.0.11.83"
+#define QWLAN_VERSIONSTR "4.0.11.86"
#define AR6320_REV1_VERSION 0x5000000
diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h
index 038cdada9012..7874c9f9e5ba 100644
--- a/CORE/MAC/inc/sirApi.h
+++ b/CORE/MAC/inc/sirApi.h
@@ -100,6 +100,8 @@ typedef tANI_U8 tSirVersionString[SIR_VERSION_STRING_LEN];
#define WLAN_EXTSCAN_MAX_SIGNIFICANT_CHANGE_APS 64
#define WLAN_EXTSCAN_MAX_HOTLIST_SSIDS 8
+#define NUM_CHAINS_MAX 2
+
typedef enum
{
eSIR_EXTSCAN_INVALID,
@@ -3782,7 +3784,7 @@ typedef struct sSirSetRSSIFilterReq
* SIR_MAC_ACTION_VHT 21 1
* ----------------------------+------+-------+
*/
-#define ALLOWED_ACTION_FRAMES_BITMAP0 \
+#define ALLOWED_ACTION_FRAMES_BITMAP0_STA \
((1 << SIR_MAC_ACTION_SPECTRUM_MGMT) | \
(1 << SIR_MAC_ACTION_QOS_MGMT) | \
(1 << SIR_MAC_ACTION_PUBLIC_USAGE) | \
@@ -3792,6 +3794,10 @@ typedef struct sSirSetRSSIFilterReq
(1 << SIR_MAC_ACTION_WME) | \
(1 << SIR_MAC_ACTION_VHT))
+#define ALLOWED_ACTION_FRAMES_BITMAP0_SAP \
+ ((ALLOWED_ACTION_FRAMES_BITMAP0_STA) | \
+ (1 << SIR_MAC_ACTION_HT))
+
#define ALLOWED_ACTION_FRAMES_BITMAP1 0x0
#define ALLOWED_ACTION_FRAMES_BITMAP2 0x0
#define ALLOWED_ACTION_FRAMES_BITMAP3 0x0
@@ -6838,6 +6844,8 @@ struct sir_bpf_get_offload {
* @wow_ipv6_mcast_ra_stats: ipv6 multicast ra stats
* @wow_ipv6_mcast_ns_stats: ipv6 multicast ns stats
* @wow_ipv6_mcast_na_stats: ipv6 multicast na stats
+ * @wow_icmpv4_count: ipv4 icmp packet count
+ * @wow_icmpv6_uc_bc_count: ipv6 icmp packet count for unicast and broadcast
*/
struct sir_wake_lock_stats {
uint32_t wow_ucast_wake_up_count;
@@ -6847,6 +6855,8 @@ struct sir_wake_lock_stats {
uint32_t wow_ipv6_mcast_ra_stats;
uint32_t wow_ipv6_mcast_ns_stats;
uint32_t wow_ipv6_mcast_na_stats;
+ uint32_t wow_icmpv4_count;
+ uint32_t wow_icmpv6_uc_bc_count;
};
/**
diff --git a/CORE/MAC/src/dph/dphHashTable.c b/CORE/MAC/src/dph/dphHashTable.c
index ed2c6e06423c..a39886b02587 100644
--- a/CORE/MAC/src/dph/dphHashTable.c
+++ b/CORE/MAC/src/dph/dphHashTable.c
@@ -134,6 +134,11 @@ tpDphHashNode dphLookupHashEntry(tpAniSirGlobal pMac, tANI_U8 staAddr[], tANI_U1
tpDphHashNode ptr = NULL;
tANI_U16 index = hashFunction(pMac, staAddr, pDphHashTable->size);
+ if (!pDphHashTable->pHashTable) {
+ limLog(pMac, LOGE, FL(" pHashTable is NULL "));
+ return ptr;
+ }
+
for (ptr = pDphHashTable->pHashTable[index]; ptr; ptr = ptr->next)
{
if (dphCompareMacAddr(staAddr, ptr->staAddr))
diff --git a/CORE/MAC/src/pe/lim/limProcessActionFrame.c b/CORE/MAC/src/pe/lim/limProcessActionFrame.c
index f359980906ab..d9edc9c7b22a 100644
--- a/CORE/MAC/src/pe/lim/limProcessActionFrame.c
+++ b/CORE/MAC/src/pe/lim/limProcessActionFrame.c
@@ -562,8 +562,10 @@ __limProcessOperatingModeActionFrame(tpAniSirGlobal pMac, tANI_U8 *pRxPacketInfo
}
pSta = dphLookupHashEntry(pMac, pHdr->sa, &aid, &psessionEntry->dph.dphHashTable);
- if (pSta == NULL)
+ if (pSta == NULL) {
+ limLog(pMac, LOGE, FL("Station context not found"));
goto end;
+ }
operMode = pSta->vhtSupportedChannelWidthSet ? eHT_CHANNEL_WIDTH_80MHZ : pSta->htSupportedChannelWidthSet ? eHT_CHANNEL_WIDTH_40MHZ: eHT_CHANNEL_WIDTH_20MHZ;
diff --git a/CORE/MAC/src/pe/lim/limProcessDisassocFrame.c b/CORE/MAC/src/pe/lim/limProcessDisassocFrame.c
index 4e89e3de5ce7..d0fbfc9db049 100644
--- a/CORE/MAC/src/pe/lim/limProcessDisassocFrame.c
+++ b/CORE/MAC/src/pe/lim/limProcessDisassocFrame.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2014 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.
*
@@ -249,6 +249,7 @@ limProcessDisassocFrame(tpAniSirGlobal pMac, tANI_U8 *pRxPacketInfo, tpPESession
case eSIR_MAC_RSN_IE_MISMATCH_REASON:
case eSIR_MAC_1X_AUTH_FAILURE_REASON:
case eSIR_MAC_PREV_AUTH_NOT_VALID_REASON:
+ case eSIR_MAC_PEER_REJECT_MECHANISIM_REASON:
// Valid reasonCode in received Disassociation frame
break;
@@ -272,7 +273,7 @@ limProcessDisassocFrame(tpAniSirGlobal pMac, tANI_U8 *pRxPacketInfo, tpPESession
FL("received Disassoc frame with invalid reasonCode "
"%d from "MAC_ADDRESS_STR), reasonCode,
MAC_ADDR_ARRAY(pHdr->sa));)
- return;
+ break;
}
}
else
diff --git a/CORE/MAC/src/pe/lim/limProcessMlmRspMessages.c b/CORE/MAC/src/pe/lim/limProcessMlmRspMessages.c
index 6df6229e675e..bc7240abdadd 100644
--- a/CORE/MAC/src/pe/lim/limProcessMlmRspMessages.c
+++ b/CORE/MAC/src/pe/lim/limProcessMlmRspMessages.c
@@ -4312,6 +4312,8 @@ void limProcessFinishScanRsp(tpAniSirGlobal pMac, void *body)
{
case eLIM_HAL_FINISH_SCAN_WAIT_STATE:
pMac->lim.gLimHalScanState = eLIM_HAL_IDLE_SCAN_STATE;
+ if (pMac->lim.abortScan)
+ pMac->lim.abortScan = 0;
limCompleteMlmScan(pMac, eSIR_SME_SUCCESS);
if (limIsChanSwitchRunning(pMac))
{
diff --git a/CORE/SAP/src/sapApiLinkCntl.c b/CORE/SAP/src/sapApiLinkCntl.c
index 71b5432b6335..130a8dbe3446 100644
--- a/CORE/SAP/src/sapApiLinkCntl.c
+++ b/CORE/SAP/src/sapApiLinkCntl.c
@@ -514,13 +514,16 @@ WLANSAP_PreStartBssAcsScanCallback
(v_PVOID_t) eSAP_STATUS_SUCCESS);
}
- if(eHAL_STATUS_SUCCESS != sme_CloseSession(halHandle,
- psapContext->sessionId, NULL, NULL))
+ if (psapContext->isScanSessionOpen)
{
- VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
- "In %s CloseSession error", __func__);
- } else {
- psapContext->isScanSessionOpen = eSAP_FALSE;
+ if(eHAL_STATUS_SUCCESS != sme_CloseSession(halHandle,
+ psapContext->sessionId, NULL, NULL))
+ {
+ VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
+ "In %s CloseSession error", __func__);
+ } else {
+ psapContext->isScanSessionOpen = eSAP_FALSE;
+ }
}
psapContext->sessionId = 0xff;
diff --git a/CORE/SAP/src/sapFsm.c b/CORE/SAP/src/sapFsm.c
index 1c85a2665b3e..85c22c987061 100644
--- a/CORE/SAP/src/sapFsm.c
+++ b/CORE/SAP/src/sapFsm.c
@@ -2471,6 +2471,8 @@ sap_OpenSession (tHalHandle hHal, ptSapContext sapContext)
return VOS_STATUS_E_FAILURE;
}
+ sme_set_allowed_action_frames(hHal, ALLOWED_ACTION_FRAMES_BITMAP0_SAP);
+
pMac->sap.sapCtxList [ sapContext->sessionId ].sessionID =
sapContext->sessionId;
pMac->sap.sapCtxList [ sapContext->sessionId ].pSapContext = sapContext;
@@ -3154,6 +3156,14 @@ eHalStatus sap_CloseSession(tHalHandle hHal,
pMac->sap.SapDfsInfo.cac_state = eSAP_DFS_DO_NOT_SKIP_CAC;
sap_CacResetNotify(hHal);
vos_mem_zero(&pMac->sap, sizeof(pMac->sap));
+
+ /*
+ * No valid concurrent AP sessions(SAP/P2PGO), switch back the
+ * allowed action frames bitmask to STA mode and set the same
+ * to FW
+ */
+ sme_set_allowed_action_frames(hHal,
+ ALLOWED_ACTION_FRAMES_BITMAP0_STA);
}
return halstatus;
diff --git a/CORE/SAP/src/sapModule.c b/CORE/SAP/src/sapModule.c
index 0b369cc52dc8..cd73a0899571 100644
--- a/CORE/SAP/src/sapModule.c
+++ b/CORE/SAP/src/sapModule.c
@@ -3864,8 +3864,14 @@ WLANSAP_ACS_CHSelect(v_PVOID_t pvosGCtx,
if (sapContext->isScanSessionOpen == eSAP_FALSE) {
tANI_U32 type, subType;
+#ifdef FEATURE_WLAN_AP_AP_ACS_OPTIMIZE
+ if((sapContext->acs_cfg->skip_scan_status != eSAP_SKIP_ACS_SCAN) &&
+ (VOS_STATUS_SUCCESS ==
+ vos_get_vdev_types(VOS_STA_MODE, &type, &subType))) {
+#else
if(VOS_STATUS_SUCCESS ==
- vos_get_vdev_types(VOS_STA_MODE, &type, &subType)) {
+ vos_get_vdev_types(VOS_STA_MODE, &type, &subType)) {
+#endif
/*
* Open SME Session for scan
*/
diff --git a/CORE/SERVICES/BMI/ol_fw.c b/CORE/SERVICES/BMI/ol_fw.c
index 55461b9ffca9..b8373d4878a6 100644
--- a/CORE/SERVICES/BMI/ol_fw.c
+++ b/CORE/SERVICES/BMI/ol_fw.c
@@ -2232,7 +2232,6 @@ int ol_download_firmware(struct ol_softc *scn)
case AR6320_REV3_VERSION:
case AR6320_REV3_2_VERSION:
case QCA9377_REV1_1_VERSION:
- case QCA9379_REV1_VERSION:
case AR6320_REV4_VERSION:
case AR6320_DEV_VERSION:
/* for SDIO, debug uart output gpio is 29, otherwise it is 6. */
@@ -2242,6 +2241,13 @@ int ol_download_firmware(struct ol_softc *scn)
param = 6;
#endif
break;
+ case QCA9379_REV1_VERSION:
+#if defined(HIF_SDIO) || defined(HIF_USB)
+ param = 19;
+#else
+ param = 6;
+#endif
+ break;
default:
/* Configure GPIO AR9888 UART */
param = 7;
diff --git a/CORE/SERVICES/COMMON/ieee80211_defines.h b/CORE/SERVICES/COMMON/ieee80211_defines.h
index 039718acb24f..cdd308f3bf02 100644
--- a/CORE/SERVICES/COMMON/ieee80211_defines.h
+++ b/CORE/SERVICES/COMMON/ieee80211_defines.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011 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.
*
@@ -528,13 +528,13 @@ typedef struct _ieee80211_scan_request_info {
typedef void (*ieee80211_acs_event_handler) (void *arg, wlan_chan_t channel);
#endif /* EXTERNAL_USE_ONLY */
-#define MAX_CHAINS 3
+#define MAX_CHAINS_SUPPORTED 3
typedef struct _wlan_rssi_info {
int8_t avg_rssi; /* average rssi */
u_int8_t valid_mask; /* bitmap of valid elements in rssi_ctrl/ext array */
- int8_t rssi_ctrl[MAX_CHAINS];
- int8_t rssi_ext[MAX_CHAINS];
+ int8_t rssi_ctrl[MAX_CHAINS_SUPPORTED];
+ int8_t rssi_ext[MAX_CHAINS_SUPPORTED];
} wlan_rssi_info;
typedef enum _wlan_rssi_type {
diff --git a/CORE/SERVICES/COMMON/wma_api.h b/CORE/SERVICES/COMMON/wma_api.h
index 7091bb6197ab..0d1c12436a9e 100644
--- a/CORE/SERVICES/COMMON/wma_api.h
+++ b/CORE/SERVICES/COMMON/wma_api.h
@@ -175,4 +175,7 @@ static inline VOS_STATUS wma_send_egap_conf_params(WMA_HANDLE handle,
extern int wma_scpc_event_handler(void *handle, u_int8_t *event, u_int32_t len);
+VOS_STATUS wma_set_tx_power_scale(uint8_t vdev_id, int value);
+VOS_STATUS wma_set_tx_power_scale_decr_db(uint8_t vdev_id, int value);
+
#endif
diff --git a/CORE/SERVICES/COMMON/wmi_tlv_defs.h b/CORE/SERVICES/COMMON/wmi_tlv_defs.h
index 733fae756ab1..b90cdd7f6f65 100644
--- a/CORE/SERVICES/COMMON/wmi_tlv_defs.h
+++ b/CORE/SERVICES/COMMON/wmi_tlv_defs.h
@@ -709,6 +709,8 @@ typedef enum {
WMITLV_TAG_STRUC_wmi_dbglog_time_stamp_sync_cmd_fixed_param,
WMITLV_TAG_STRUC_wmi_rmc_set_leader_cmd_fixed_param,
WMITLV_TAG_STRUC_wmi_rmc_manual_leader_event_fixed_param,
+ WMITLV_TAG_STRUC_wmi_per_chain_rssi_stats,
+ WMITLV_TAG_STRUC_wmi_rssi_stats,
} WMITLV_TAG_ID;
/*
@@ -3204,7 +3206,9 @@ WMITLV_CREATE_PARAM_STRUC(WMI_HOST_SWBA_EVENTID);
/* Update stats Event */
#define WMITLV_TABLE_WMI_UPDATE_STATS_EVENTID(id,op,buf,len)\
WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_stats_event_fixed_param, wmi_stats_event_fixed_param, fixed_param, WMITLV_SIZE_FIX) \
- WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_BYTE, A_UINT8, data, WMITLV_SIZE_VAR)
+ WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_BYTE, A_UINT8, data, WMITLV_SIZE_VAR) \
+ WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_per_chain_rssi_stats, wmi_per_chain_rssi_stats, chain_stats, WMITLV_SIZE_FIX) \
+ WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_STRUC, wmi_rssi_stats, rssi_stats, WMITLV_SIZE_VAR)
WMITLV_CREATE_PARAM_STRUC(WMI_UPDATE_STATS_EVENTID);
/* For vdev based ht/vht info upload*/
@@ -3681,7 +3685,7 @@ WMITLV_CREATE_PARAM_STRUC(WMI_INST_RSSI_STATS_EVENTID);
#define WMITLV_TABLE_WMI_RADIO_TX_POWER_LEVEL_STATS_EVENTID(id,op,buf,len) \
WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_tx_power_level_stats_evt_fixed_param, wmi_tx_power_level_stats_evt_fixed_param, fixed_param, WMITLV_SIZE_FIX) \
WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_UINT32, A_UINT32, tx_time_per_power_level, WMITLV_SIZE_VAR)
-WMITLV_CREATE_PARAM_STRUC(WMI_RADIO_TX_POWER_LEVEL_STATS_EVENTID)
+WMITLV_CREATE_PARAM_STRUC(WMI_RADIO_TX_POWER_LEVEL_STATS_EVENTID);
#define WMITLV_TABLE_WMI_RMC_NEW_LEADER_EVENTID(id, op, buf, len) \
WMITLV_ELEM(id, op, buf, len, WMITLV_TAG_STRUC_wmi_rmc_manual_leader_event_fixed_param, wmi_rmc_manual_leader_event_fixed_param, fixed_param, WMITLV_SIZE_FIX)
diff --git a/CORE/SERVICES/COMMON/wmi_unified.h b/CORE/SERVICES/COMMON/wmi_unified.h
index 1cb14dc6bad2..3a97eabbada9 100644
--- a/CORE/SERVICES/COMMON/wmi_unified.h
+++ b/CORE/SERVICES/COMMON/wmi_unified.h
@@ -78,6 +78,7 @@ extern "C" {
#define MAX_TX_RATE_VALUES 10 /*Max Tx Rates*/
#define MAX_RSSI_VALUES 10 /*Max Rssi values*/
+#define MAX_CHAINS 8
/* The WLAN_MAX_AC macro cannot be changed without breaking
WMI compatibility. */
@@ -3604,6 +3605,32 @@ typedef struct {
#define WMI_FAST_DIVERSITY_BIT_OFFSET 0
#define WMI_SLOW_DIVERSITY_BIT_OFFSET 1
+#define WMI_SLOW_DIVERSITY_CH0_WEIGHT_SHIFT 2
+#define WMI_SLOW_DIVERSITY_CH0_WEIGHT_MASK \
+ (0xf << WMI_SLOW_DIVERSITY_CH0_WEIGHT_SHIFT)
+#define WMI_SLOW_DIVERSITY_CH0_WEIGHT_GET_BITS(word32) \
+ (((word32) & WMI_SLOW_DIVERSITY_CH0_WEIGHT_MASK) >> \
+ WMI_SLOW_DIVERSITY_CH0_WEIGHT_SHIFT)
+#define WMI_SLOW_DIVERSITY_CH0_WEIGHT_SET_BITS(word32, value) \
+ do { \
+ (word32) &= ~WMI_SLOW_DIVERSITY_CH0_WEIGHT_MASK; \
+ (word32) |= ((value) << WMI_SLOW_DIVERSITY_CH0_WEIGHT_SHIFT) & \
+ WMI_SLOW_DIVERSITY_CH0_WEIGHT_MASK; \
+ } while (0)
+
+#define WMI_SLOW_DIVERSITY_CH1_WEIGHT_SHIFT 6
+#define WMI_SLOW_DIVERSITY_CH1_WEIGHT_MASK \
+ (0xf << WMI_SLOW_DIVERSITY_CH1_WEIGHT_SHIFT)
+#define WMI_SLOW_DIVERSITY_CH1_WEIGHT_GET_BITS(word32) \
+ (((word32) & WMI_SLOW_DIVERSITY_CH1_WEIGHT_MASK) >> \
+ WMI_SLOW_DIVERSITY_CH1_WEIGHT_SHIFT)
+#define WMI_SLOW_DIVERSITY_CH1_WEIGHT_SET_BITS(word32, value) \
+ do { \
+ (word32) &= ~WMI_SLOW_DIVERSITY_CH1_WEIGHT_MASK; \
+ (word32) |= ((value) << WMI_SLOW_DIVERSITY_CH1_WEIGHT_SHIFT) & \
+ WMI_SLOW_DIVERSITY_CH1_WEIGHT_MASK; \
+ } while (0)
+
typedef struct {
A_UINT32 tlv_header; /** TLV tag and len; tag equals WMITLV_TAG_STRUC_wmi_pdev_set_antenna_diversity_cmd_fixed_param */
union {
@@ -3613,8 +3640,18 @@ typedef struct {
*/
A_UINT32 pdev_id;
};
- /** parameter */
- A_UINT32 value; /** bit0 is for enable/disable FAST diversity, and bit1 is for enable/disable SLOW diversity, 0->disable, 1->enable */
+ /**
+ * The following "value" field is divided into bit fields as follows:
+ * bits | purpose
+ * -----+---------------------------------------
+ * 0 | enable/disable FAST diversity
+ * 1 | enable/disable SLOW diversity
+ * 5:2 | chain0 slow-diversity weighting factor
+ * 9:6 | chain1 slow-diversity weighting factor
+ * 31:10| currenty unused (set to 0x0)
+ * Refer to the above WMI_[FAST/SLOW]_DIVERSITY constants.
+ */
+ A_UINT32 value;
} wmi_pdev_set_antenna_diversity_cmd_fixed_param;
#define WMI_MAX_RSSI_THRESHOLD_SUPPORTED 3
@@ -3971,6 +4008,7 @@ typedef enum {
WMI_REQUEST_VDEV_RATE_STAT = 0x20,
WMI_REQUEST_INST_STAT = 0x40,
WMI_REQUEST_MIB_STAT = 0x80,
+ WMI_REQUEST_RSSI_PER_CHAIN_STAT = 0x100,
} wmi_stats_id;
typedef struct {
@@ -4632,6 +4670,24 @@ typedef struct {
} wmi_mib_stats;
typedef struct {
+ /* TLV tag and len; tag equals WMITLV_TAG_STRUC_wmi_rssi_stats */
+ A_UINT32 tlv_header;
+ A_UINT32 vdev_id;
+ A_INT32 rssi_avg_beacon[MAX_CHAINS];
+ A_INT32 rssi_avg_data[MAX_CHAINS];
+ wmi_mac_addr peer_macaddr;
+} wmi_rssi_stats;
+
+typedef struct {
+ /* TLV tag and len; tag equals WMITLV_TAG_STRUC_wmi_per_chain_rssi_stats */
+ A_UINT32 tlv_header;
+ A_UINT32 num_per_chain_rssi_stats;
+ /* This TLV is followed by another TLV of array of structs:
+ * wmi_rssi_stats rssi_stats[num_per_chain_rssi_stats];
+ */
+} wmi_per_chain_rssi_stats;
+
+typedef struct {
A_UINT32 tlv_header; /** TLV tag and len; tag equals WMITLV_TAG_STRUC_wmi_vdev_create_cmd_fixed_param */
/** unique id identifying the VDEV, generated by the caller */
A_UINT32 vdev_id;
@@ -5204,7 +5260,8 @@ typedef enum {
*/
WMI_VDEV_PARAM_TSF_INCREMENT,
- /* Disable/Enable AMPDU of vdev per AC:
+ /*
+ * Disable/Enable AMPDU of vdev per AC:
* bit | AC
* --------
* 0 | VO
@@ -5223,6 +5280,9 @@ typedef enum {
* a bit-or mask of wmi_vdev_param_filter enum values.
*/
WMI_VDEV_PARAM_RX_FILTER,
+
+ /* vdev-specific mgmt tx power in dBm units (signed integer value) */
+ WMI_VDEV_PARAM_MGMT_TX_POWER,
} WMI_VDEV_PARAM;
/* vdev capabilities bit mask */
@@ -6922,7 +6982,7 @@ enum {
WMI_AUTH_AUTO , /* Auto */
WMI_AUTH_WPA , /* WPA */
WMI_AUTH_RSNA , /* WPA2/RSNA */
- WMI_AUTH_CCKM , /* CCK */
+ WMI_AUTH_CCKM , /* CCKM */
WMI_AUTH_WAPI ,/* WAPI */
WMI_AUTH_AUTO_PSK,
WMI_AUTH_WPA_PSK,
@@ -6932,6 +6992,8 @@ enum {
WMI_AUTH_FT_RSNA_PSK,
WMI_AUTH_RSNA_PSK_SHA256,
WMI_AUTH_RSNA_8021X_SHA256,
+ WMI_AUTH_CCKM_WPA,
+ WMI_AUTH_CCKM_RSNA,
};
typedef struct {
@@ -7731,7 +7793,8 @@ typedef enum event_type_e {
WOW_IOAC_SOCK_EVENT,
WOW_NLO_SCAN_COMPLETE_EVENT,
WOW_NAN_DATA_EVENT,
- WOW_NAN_RTT_EVENT,
+ WOW_NAN_RTT_EVENT, /* DEPRECATED, UNUSED */
+ WOW_OEM_RESPONSE_EVENT = WOW_NAN_RTT_EVENT, /* reuse deprecated event value */
WOW_TDLS_CONN_TRACKER_EVENT,
WOW_CRITICAL_LOG_EVENT,
} WOW_WAKE_EVENT_TYPE;
@@ -7779,7 +7842,8 @@ typedef enum wake_reason_e {
WOW_REASON_ACTION_FRAME_RECV,
WOW_REASON_BPF_ALLOW,
WOW_REASON_NAN_DATA,
- WOW_REASON_NAN_RTT,
+ WOW_REASON_NAN_RTT, /* DEPRECATED, UNUSED */
+ WOW_REASON_OEM_RESPONSE_EVENT = WOW_REASON_NAN_RTT, /* reuse deprecated reason value */
WOW_REASON_TDLS_CONN_TRACKER_EVENT,
WOW_REASON_CRITICAL_LOG,
WOW_REASON_DEBUG_TEST = 0xFF,
@@ -14683,12 +14747,14 @@ typedef struct {
A_UINT32 phy_id;
/* supported modulations */
union {
- A_UINT32 supports_11b:1,
- supports_11g:1,
- supports_11a:1,
- supports_11n:1,
- supports_11ac:1,
- supports_11ax:1;
+ struct {
+ A_UINT32 supports_11b:1,
+ supports_11g:1,
+ supports_11a:1,
+ supports_11n:1,
+ supports_11ac:1,
+ supports_11ax:1;
+ };
A_UINT32 supported_flags;
};
/* supported bands, enum WLAN_BAND_CAPABILITY */
diff --git a/CORE/SERVICES/COMMON/wmi_version.h b/CORE/SERVICES/COMMON/wmi_version.h
index d73d10a8af48..864a5bf2e1c5 100644
--- a/CORE/SERVICES/COMMON/wmi_version.h
+++ b/CORE/SERVICES/COMMON/wmi_version.h
@@ -36,7 +36,7 @@
#define __WMI_VER_MINOR_ 0
/** WMI revision number has to be incremented when there is a
* change that may or may not break compatibility. */
-#define __WMI_REVISION_ 248
+#define __WMI_REVISION_ 254
/** The Version Namespace should not be normally changed. Only
* host and firmware of the same WMI namespace will work
diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c
index a99bb596ad15..c9365daa47ee 100644
--- a/CORE/SERVICES/WMA/wma.c
+++ b/CORE/SERVICES/WMA/wma.c
@@ -138,11 +138,13 @@
#define FW_PDEV_STATS_SET 0x1
#define FW_VDEV_STATS_SET 0x2
#define FW_PEER_STATS_SET 0x4
-#define FW_STATS_SET 0x7
+#define FW_RSSI_PER_CHAIN_STATS_SET 0x8
+#define FW_STATS_SET 0xf
/*AR9888/AR6320 noise floor approx value
* similar to the mentioned the TLSHIM
*/
#define WMA_TGT_NOISE_FLOOR_DBM (-96)
+#define WMA_TGT_RSSI_INVALID 96
/*
* Make sure that link monitor and keep alive
@@ -2796,11 +2798,6 @@ static void wma_update_peer_stats(tp_wma_handle wma, wmi_peer_stats *peer_stats)
node->rate_flags, node->nss,
classa_stats->max_pwr);
}
-
- if (node->fw_stats_set & FW_STATS_SET) {
- WMA_LOGD("<--STATS RSP VDEV_ID:%d", vdev_id);
- wma_post_stats(wma, node);
- }
}
}
@@ -2822,6 +2819,109 @@ static void wma_post_link_status(tAniGetLinkStatus *pGetLinkStatus,
}
}
+/**
+ * wma_update_per_chain_rssi_stats() - to store per chain rssi stats for
+ * all vdevs for which the stats were requested into csr stats structure.
+ * @wma: wma handle
+ * @rssi_stats: rssi stats
+ * @rssi_per_chain_stats: buffer where rssi stats to be stored
+ *
+ * This function stores per chain rssi stats received from fw for all vdevs for
+ * which the stats were requested into a csr stats structure.
+ *
+ * Return: void
+ */
+static void wma_update_per_chain_rssi_stats(tp_wma_handle wma,
+ wmi_rssi_stats *rssi_stats,
+ struct csr_per_chain_rssi_stats_info *rssi_per_chain_stats)
+{
+ int i;
+ int8_t bcn_snr, dat_snr;
+
+ for (i = 0; i < NUM_CHAINS_MAX; i++) {
+ bcn_snr = rssi_stats->rssi_avg_beacon[i];
+ dat_snr = rssi_stats->rssi_avg_data[i];
+ WMA_LOGD("chain %d beacon snr %d data snr %d",
+ i, bcn_snr, dat_snr);
+ if ((dat_snr != WMA_TGT_INVALID_SNR_OLD &&
+ dat_snr != WMA_TGT_INVALID_SNR_NEW))
+ rssi_per_chain_stats->rssi[i] = dat_snr;
+ else if ((bcn_snr != WMA_TGT_INVALID_SNR_OLD &&
+ bcn_snr != WMA_TGT_INVALID_SNR_NEW))
+ rssi_per_chain_stats->rssi[i] = bcn_snr;
+ else
+ /*
+ * Firmware sends invalid snr till it sees
+ * Beacon/Data after connection since after
+ * vdev up fw resets the snr to invalid.
+ * In this duartion Host will return an invalid rssi
+ * value.
+ */
+ rssi_per_chain_stats->rssi[i] = WMA_TGT_RSSI_INVALID;
+
+ /*
+ * Get the absolute rssi value from the current rssi value the
+ * sinr value is hardcoded into 0 in the CORE stack
+ */
+ rssi_per_chain_stats->rssi[i] += WMA_TGT_NOISE_FLOOR_DBM;
+ WMI_MAC_ADDR_TO_CHAR_ARRAY(&(rssi_stats->peer_macaddr),
+ rssi_per_chain_stats->peer_mac_addr);
+ }
+}
+
+/**
+ * wma_update_rssi_stats() - to update rssi stats for all vdevs
+ * for which the stats were requested.
+ * @wma: wma handle
+ * @rssi_stats: rssi stats
+ *
+ * This function updates the rssi stats for all vdevs for which
+ * the stats were requested.
+ *
+ * Return: void
+ */
+static void wma_update_rssi_stats(tp_wma_handle wma,
+ wmi_rssi_stats *rssi_stats)
+{
+ tAniGetPEStatsRsp *stats_rsp_params;
+ struct csr_per_chain_rssi_stats_info *rssi_per_chain_stats = NULL;
+ struct wma_txrx_node *node;
+ uint8_t *stats_buf;
+ uint32_t temp_mask;
+ uint8_t vdev_id;
+
+ vdev_id = rssi_stats->vdev_id;
+ node = &wma->interfaces[vdev_id];
+ if (node->stats_rsp) {
+ node->fw_stats_set |= FW_RSSI_PER_CHAIN_STATS_SET;
+ WMA_LOGD("<-- FW RSSI PER CHAIN STATS received for vdevId:%d",
+ vdev_id);
+ stats_rsp_params = (tAniGetPEStatsRsp *) node->stats_rsp;
+ stats_buf = (tANI_U8 *) (stats_rsp_params + 1);
+ temp_mask = stats_rsp_params->statsMask;
+
+ if (temp_mask & (1 << eCsrSummaryStats))
+ stats_buf += sizeof(tCsrSummaryStatsInfo);
+ if (temp_mask & (1 << eCsrGlobalClassAStats))
+ stats_buf += sizeof(tCsrGlobalClassAStatsInfo);
+ if (temp_mask & (1 << eCsrGlobalClassBStats))
+ stats_buf += sizeof(tCsrGlobalClassBStatsInfo);
+ if (temp_mask & (1 << eCsrGlobalClassCStats))
+ stats_buf += sizeof(tCsrGlobalClassCStatsInfo);
+ if (temp_mask & (1 << eCsrGlobalClassDStats))
+ stats_buf += sizeof(tCsrGlobalClassDStatsInfo);
+ if (temp_mask & (1 << eCsrPerStaStats))
+ stats_buf += sizeof(tCsrPerStaStatsInfo);
+
+ if (temp_mask & (1 << csr_per_chain_rssi_stats)) {
+ rssi_per_chain_stats =
+ (struct csr_per_chain_rssi_stats_info *)stats_buf;
+ wma_update_per_chain_rssi_stats(wma, rssi_stats,
+ rssi_per_chain_stats);
+ }
+ }
+}
+
#ifdef WLAN_FEATURE_MEMDUMP
/**
* wma_fw_mem_dump_rsp() - send fw mem dump response to SME
@@ -3079,9 +3179,11 @@ static int wma_stats_event_handler(void *handle, u_int8_t *cmd_param_info,
{
WMI_UPDATE_STATS_EVENTID_param_tlvs *param_buf;
wmi_stats_event_fixed_param *event;
+ wmi_per_chain_rssi_stats *rssi_event;
vos_msg_t vos_msg = {0};
- u_int32_t buf_size;
- u_int8_t *buf;
+ u_int32_t buf_size, buf_data_size;
+ u_int8_t *buf, *temp;
+ bool rssi_stats_present = FALSE;
param_buf = (WMI_UPDATE_STATS_EVENTID_param_tlvs *)cmd_param_info;
if (!param_buf) {
@@ -3094,6 +3196,19 @@ static int wma_stats_event_handler(void *handle, u_int8_t *cmd_param_info,
(event->num_vdev_stats * sizeof(wmi_vdev_stats)) +
(event->num_peer_stats * sizeof(wmi_peer_stats)) +
(event->num_mib_stats * sizeof(wmi_mib_stats));
+ buf_data_size = buf_size - sizeof(*event);
+ if (param_buf->data) {
+ rssi_event = (wmi_per_chain_rssi_stats *)
+ ((uint8_t *)param_buf->data + buf_data_size);
+ if (((rssi_event->tlv_header & 0xFFFF0000) >> 16) ==
+ WMITLV_TAG_STRUC_wmi_per_chain_rssi_stats) {
+ buf_size += sizeof(*rssi_event) +
+ (rssi_event->num_per_chain_rssi_stats *
+ sizeof(wmi_rssi_stats));
+ rssi_stats_present = TRUE;
+ }
+ }
+
buf = vos_mem_malloc(buf_size);
if (!buf) {
WMA_LOGE("%s: Failed alloc memory for buf", __func__);
@@ -3101,8 +3216,18 @@ static int wma_stats_event_handler(void *handle, u_int8_t *cmd_param_info,
}
vos_mem_zero(buf, buf_size);
vos_mem_copy(buf, event, sizeof(*event));
- vos_mem_copy(buf + sizeof(*event), (u_int8_t *)param_buf->data,
- (buf_size - sizeof(*event)));
+ temp = buf + sizeof(*event);
+ vos_mem_copy(temp, (u_int8_t *)param_buf->data,
+ buf_data_size);
+ temp += buf_data_size;
+ if (rssi_stats_present) {
+ vos_mem_copy(temp, (u_int8_t *)param_buf->chain_stats,
+ sizeof(*param_buf->chain_stats));
+ temp += sizeof(*param_buf->chain_stats);
+ vos_mem_copy(temp, (u_int8_t *)param_buf->rssi_stats,
+ (rssi_event->num_per_chain_rssi_stats *
+ sizeof(wmi_rssi_stats)));
+ }
vos_msg.type = WDA_FW_STATS_IND;
vos_msg.bodyptr = buf;
vos_msg.bodyval = 0;
@@ -3265,6 +3390,9 @@ static void wma_fw_stats_ind(tp_wma_handle wma, u_int8_t *buf)
wmi_vdev_stats *vdev_stats;
wmi_peer_stats *peer_stats;
wmi_mib_stats *mib_stats;
+ wmi_rssi_stats *rssi_stats;
+ wmi_per_chain_rssi_stats *rssi_event;
+ struct wma_txrx_node *node;
u_int8_t i, *temp;
temp = buf + sizeof(*event);
@@ -3312,6 +3440,30 @@ static void wma_fw_stats_ind(tp_wma_handle wma, u_int8_t *buf)
temp += sizeof(wmi_mib_stats);
}
}
+
+ rssi_event = (wmi_per_chain_rssi_stats *)temp;
+ if ((rssi_event->tlv_header & 0xFFFF0000) >> 16 ==
+ WMITLV_TAG_STRUC_wmi_per_chain_rssi_stats) {
+ WMA_LOGD("%s: num_rssi_stats %u", __func__,
+ rssi_event->num_per_chain_rssi_stats);
+ if (rssi_event->num_per_chain_rssi_stats > 0) {
+ temp += sizeof(*rssi_event);
+ for (i = 0; i < rssi_event->num_per_chain_rssi_stats;
+ i++) {
+ rssi_stats = (wmi_rssi_stats *)temp;
+ wma_update_rssi_stats(wma, rssi_stats);
+ temp += sizeof(wmi_rssi_stats);
+ }
+ }
+ }
+
+ for (i = 0; i < wma->max_bssid; i++) {
+ node = &wma->interfaces[i];
+ if (node->fw_stats_set & FW_PEER_STATS_SET) {
+ WMA_LOGD("<--STATS RSP VDEV_ID:%d", i);
+ wma_post_stats(wma, node);
+ }
+ }
}
#ifdef FEATURE_WLAN_EXTSCAN
@@ -4559,7 +4711,7 @@ static int wma_unified_link_peer_stats_event_handler(void *handle,
wmi_rate_stats *rate_stats;
tSirLLStatsResults *link_stats_results;
u_int8_t *results, *t_peer_stats, *t_rate_stats;
- u_int32_t count, num_rates=0;
+ u_int32_t count, num_rates=0, rate_cnt;
u_int32_t next_res_offset, next_peer_offset, next_rate_offset;
size_t peer_info_size, peer_stats_size, rate_stats_size;
size_t link_stats_results_size;
@@ -4647,7 +4799,7 @@ static int wma_unified_link_peer_stats_event_handler(void *handle,
next_res_offset = peer_stats_size;
next_peer_offset = WMI_TLV_HDR_SIZE;
next_rate_offset = WMI_TLV_HDR_SIZE;
- for (count = 0; count < fixed_param->num_peers; count++) {
+ for (rate_cnt = 0; rate_cnt < fixed_param->num_peers; rate_cnt++) {
WMA_LOGD("Peer Info:");
WMA_LOGD("peer_type %u capabilities %u num_rates %u",
peer_stats->peer_type, peer_stats->capabilities,
@@ -20599,7 +20751,7 @@ static void wma_extscan_wow_event_callback(void *handle, void *event,
*/
static void wma_wow_wake_up_stats_display(tp_wma_handle wma)
{
- WMA_LOGA("uc %d bc %d v4_mc %d v6_mc %d ra %d ns %d na %d pno_match %d pno_complete %d gscan %d low_rssi %d rssi_breach %d",
+ WMA_LOGA("uc %d bc %d v4_mc %d v6_mc %d ra %d ns %d na %d pno_match %d pno_complete %d gscan %d low_rssi %d rssi_breach %d icmp %d icmpv6 %d",
wma->wow_ucast_wake_up_count,
wma->wow_bcast_wake_up_count,
wma->wow_ipv4_mcast_wake_up_count,
@@ -20611,7 +20763,9 @@ static void wma_wow_wake_up_stats_display(tp_wma_handle wma)
wma->wow_pno_complete_wake_up_count,
wma->wow_gscan_wake_up_count,
wma->wow_low_rssi_wake_up_count,
- wma->wow_rssi_breach_wake_up_count);
+ wma->wow_rssi_breach_wake_up_count,
+ wma->wow_icmpv4_count,
+ wma->wow_icmpv6_uc_bc_count);
return;
}
@@ -20675,12 +20829,18 @@ static void wma_wow_wake_up_stats(tp_wma_handle wma, uint8_t *data,
switch(event) {
case WOW_REASON_PATTERN_MATCH_FOUND:
- if (WMA_ICMP_V6_RA_TYPE == *data) {
- wma->wow_ipv6_mcast_ra_stats++;
- } else if (WMA_BCAST_MAC_ADDR == *data) {
+ if (WMA_BCAST_MAC_ADDR == *data) {
wma->wow_bcast_wake_up_count++;
+ if (WMA_ICMP_PROTOCOL == *(data + WMA_IPV4_PROTOCOL))
+ wma->wow_icmpv4_count++;
+ if ((len > WMA_ICMP_V6_TYPE_OFFSET) &&
+ (WMA_ICMP_V6_HEADER_TYPE ==
+ *(data + WMA_ICMP_V6_HEADER_OFFSET)))
+ wma->wow_icmpv6_uc_bc_count++;
} else if (WMA_MCAST_IPV4_MAC_ADDR == *data) {
wma->wow_ipv4_mcast_wake_up_count++;
+ if (WMA_ICMP_PROTOCOL == *(data + WMA_IPV4_PROTOCOL))
+ wma->wow_icmpv4_count++;
} else if (WMA_MCAST_IPV6_MAC_ADDR == *data) {
wma->wow_ipv6_mcast_wake_up_count++;
if (len > WMA_ICMP_V6_TYPE_OFFSET)
@@ -20689,6 +20849,12 @@ static void wma_wow_wake_up_stats(tp_wma_handle wma, uint8_t *data,
WMA_LOGA("ICMP_V6 data len %d", len);
} else {
wma->wow_ucast_wake_up_count++;
+ if (WMA_ICMP_PROTOCOL == *(data + WMA_IPV4_PROTOCOL))
+ wma->wow_icmpv4_count++;
+ if ((len > WMA_ICMP_V6_TYPE_OFFSET) &&
+ (WMA_ICMP_V6_HEADER_TYPE ==
+ *(data + WMA_ICMP_V6_HEADER_OFFSET)))
+ wma->wow_icmpv6_uc_bc_count++;
}
break;
@@ -23088,6 +23254,10 @@ tAniGetPEStatsRsp * wma_get_stats_rsp_buf(tAniGetPEStatsReq *get_stats_param)
case eCsrPerStaStats:
len += sizeof(tCsrPerStaStatsInfo);
break;
+ case csr_per_chain_rssi_stats:
+ len +=
+ sizeof(struct csr_per_chain_rssi_stats_info);
+ break;
}
}
@@ -23163,7 +23333,7 @@ static void wma_get_stats_req(WMA_HANDLE handle,
WMITLV_TAG_STRUC_wmi_request_stats_cmd_fixed_param,
WMITLV_GET_STRUCT_TLVLEN(wmi_request_stats_cmd_fixed_param));
cmd->stats_id = WMI_REQUEST_PEER_STAT|WMI_REQUEST_PDEV_STAT|
- WMI_REQUEST_VDEV_STAT;
+ WMI_REQUEST_VDEV_STAT|WMI_REQUEST_RSSI_PER_CHAIN_STAT;
cmd->vdev_id = get_stats_param->sessionId;
WMI_CHAR_ARRAY_TO_MAC_ADDR(node->bssid, &cmd->peer_macaddr);
WMA_LOGD("STATS REQ VDEV_ID:%d-->", cmd->vdev_id);
@@ -29356,6 +29526,9 @@ VOS_STATUS wma_get_wakelock_stats(struct sir_wake_lock_stats *wake_lock_stats)
wma_handle->wow_ipv6_mcast_ns_stats;
wake_lock_stats->wow_ipv6_mcast_na_stats =
wma_handle->wow_ipv6_mcast_na_stats;
+ wake_lock_stats->wow_icmpv4_count = wma_handle->wow_icmpv4_count;
+ wake_lock_stats->wow_icmpv6_uc_bc_count =
+ wma_handle->wow_icmpv6_uc_bc_count;
return VOS_STATUS_SUCCESS;
}
@@ -36122,3 +36295,66 @@ int wma_btc_set_bt_wlan_interval(tp_wma_handle wma_handle,
return 0;
}
+/**
+ * wma_set_tx_power_scale() - set tx power scale
+ * @vdev_id: vdev id
+ * @value: value
+ *
+ * Return: VOS_STATUS_SUCCESS for success or error code.
+ */
+VOS_STATUS wma_set_tx_power_scale(uint8_t vdev_id, int value)
+{
+ void *vos_context = vos_get_global_context(VOS_MODULE_ID_WDA, NULL);
+ VOS_STATUS ret;
+ tp_wma_handle wma_handle = (tp_wma_handle) vos_get_context(
+ VOS_MODULE_ID_WDA, vos_context);
+
+ if (NULL == wma_handle) {
+ WMA_LOGE("%s: wma_handle is NULL", __func__);
+ return VOS_STATUS_E_FAILURE;
+ }
+
+ if (!(wma_handle->interfaces[vdev_id].vdev_up)) {
+ WMA_LOGE("%s: vdev id %d is not up", __func__, vdev_id);
+ return VOS_STATUS_E_FAILURE;
+ }
+
+ ret = wmi_unified_vdev_set_param_send(wma_handle->wmi_handle, vdev_id,
+ WMI_VDEV_PARAM_TXPOWER_SCALE, value);
+ if (ret != VOS_STATUS_SUCCESS)
+ WMA_LOGE("Set tx power value failed");
+
+ return ret;
+}
+
+/**
+ * wma_set_tx_power_scale_decr_db() - decrease power by DB value
+ * @vdev_id: vdev id
+ * @value: value
+ *
+ * Return: CDF_STATUS_SUCCESS for success or error code.
+ */
+VOS_STATUS wma_set_tx_power_scale_decr_db(uint8_t vdev_id, int value)
+{
+ void *vos_context = vos_get_global_context(VOS_MODULE_ID_WDA, NULL);
+ VOS_STATUS ret;
+ tp_wma_handle wma_handle = (tp_wma_handle) vos_get_context(
+ VOS_MODULE_ID_WDA, vos_context);
+
+ if (NULL == wma_handle) {
+ WMA_LOGE("%s: wma_handle is NULL", __func__);
+ return VOS_STATUS_E_FAILURE;
+ }
+
+ if (!(wma_handle->interfaces[vdev_id].vdev_up)) {
+ WMA_LOGE("%s: vdev id %d is not up", __func__, vdev_id);
+ return VOS_STATUS_E_FAILURE;
+ }
+
+ ret = wmi_unified_vdev_set_param_send(wma_handle->wmi_handle, vdev_id,
+ WMI_VDEV_PARAM_TXPOWER_SCALE_DECR_DB, value);
+ if (ret != VOS_STATUS_SUCCESS)
+ WMA_LOGE("Decrease tx power value failed");
+
+ return ret;
+}
diff --git a/CORE/SERVICES/WMA/wma.h b/CORE/SERVICES/WMA/wma.h
index e6c2ff4a96b7..9bd3dee0e2ab 100644
--- a/CORE/SERVICES/WMA/wma.h
+++ b/CORE/SERVICES/WMA/wma.h
@@ -170,6 +170,8 @@
#define WMA_ICMP_V6_HEADER_OFFSET (6 + 6 + 2 + 6)
/* WMA_ICMP_V6_TYPE_OFFSET = sa(6) + da(6) + eth_type(2) + 40 */
#define WMA_ICMP_V6_TYPE_OFFSET (6 + 6 + 2 + 40)
+/* WMA_IPV4_PROTOCOL = sa(6) + da(6) + eth_type(2) + 9 */
+#define WMA_IPV4_PROTOCOL (6 + 6 + 2 + 9)
#define WMA_ICMP_V6_HEADER_TYPE (0x3A)
#define WMA_ICMP_V6_RA_TYPE (0x86)
@@ -178,6 +180,7 @@
#define WMA_BCAST_MAC_ADDR (0xFF)
#define WMA_MCAST_IPV4_MAC_ADDR (0x01)
#define WMA_MCAST_IPV6_MAC_ADDR (0x33)
+#define WMA_ICMP_PROTOCOL (0x01)
typedef struct probeTime_dwellTime {
u_int8_t dwell_time;
@@ -855,6 +858,8 @@ typedef struct wma_handle {
uint32_t wow_ipv6_mcast_ra_stats;
uint32_t wow_ipv6_mcast_ns_stats;
uint32_t wow_ipv6_mcast_na_stats;
+ uint32_t wow_icmpv4_count;
+ uint32_t wow_icmpv6_uc_bc_count;
uint32_t wow_wakeup_enable_mask;
uint32_t wow_wakeup_disable_mask;
uint16_t max_mgmt_tx_fail_count;
diff --git a/CORE/SME/inc/csrApi.h b/CORE/SME/inc/csrApi.h
index 0b5fa746c524..53c403aa32b7 100644
--- a/CORE/SME/inc/csrApi.h
+++ b/CORE/SME/inc/csrApi.h
@@ -1014,6 +1014,7 @@ typedef struct tagCsrRoamProfile
/* addIe params */
tSirAddIeParams addIeParams;
uint8_t sap_dot11mc;
+ bool do_not_roam;
}tCsrRoamProfile;
@@ -1616,6 +1617,11 @@ typedef struct tagCsrPerStaStatsInfo
tANI_U32 tx_mpdu_in_ampdu_cnt;
} tCsrPerStaStatsInfo;
+struct csr_per_chain_rssi_stats_info {
+ int8 rssi[NUM_CHAINS_MAX];
+ tSirMacAddr peer_mac_addr;
+};
+
typedef struct tagCsrRoamSetKey
{
eCsrEncryptionType encType;
diff --git a/CORE/SME/inc/csrInternal.h b/CORE/SME/inc/csrInternal.h
index 8d2ae8df0342..1cb1d7b8914c 100644
--- a/CORE/SME/inc/csrInternal.h
+++ b/CORE/SME/inc/csrInternal.h
@@ -270,6 +270,7 @@ typedef enum
eCsrGlobalClassCStats,
eCsrGlobalClassDStats,
eCsrPerStaStats,
+ csr_per_chain_rssi_stats,
eCsrMaxStats
}eCsrRoamStatsClassTypes;
@@ -1091,6 +1092,7 @@ typedef struct tagCsrRoamStruct
tCsrGlobalClassCStatsInfo classCStatsInfo;
tCsrGlobalClassDStatsInfo classDStatsInfo;
tCsrPerStaStatsInfo perStaStatsInfo[CSR_MAX_STA];
+ struct csr_per_chain_rssi_stats_info per_chain_rssi_stats;
tDblLinkList statsClientReqList;
tDblLinkList peStatsReqList;
tCsrTlStatsReqInfo tlStatsReqInfo;
diff --git a/CORE/SME/inc/pmcApi.h b/CORE/SME/inc/pmcApi.h
index 6052b3f79f23..7b915b99785a 100644
--- a/CORE/SME/inc/pmcApi.h
+++ b/CORE/SME/inc/pmcApi.h
@@ -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.
*
@@ -56,6 +56,13 @@
//should be large enough to allow the auth, DHCP handshake to complete
#define BMPS_TRAFFIC_TIMER_ALLOW_SECURITY_DHCP 8000 //unit = ms
+/*
+ * This timer value is used to start the timer right after key completion
+ * during roaming. This should be small enough to allow STA to enter PS
+ * immediately after key completion as no DHCP phase during roaming.
+ */
+#define TRAFFIC_TIMER_ROAMING 100
+
#define PMC_IS_CHIP_ACCESSIBLE(pmcState) ( (IMPS != (pmcState)) && (REQUEST_IMPS != (pmcState)) && \
(STANDBY != (pmcState)) && (REQUEST_STANDBY != (pmcState)) )
diff --git a/CORE/SME/inc/sme_Api.h b/CORE/SME/inc/sme_Api.h
index fad5c7fe15b8..06250009356b 100644
--- a/CORE/SME/inc/sme_Api.h
+++ b/CORE/SME/inc/sme_Api.h
@@ -74,6 +74,7 @@
#define SME_GLOBAL_CLASSC_STATS 8
#define SME_GLOBAL_CLASSD_STATS 16
#define SME_PER_STA_STATS 32
+#define SME_PER_CHAIN_RSSI_STATS 64
#define SME_INVALID_COUNTRY_CODE "XX"
@@ -2816,6 +2817,9 @@ eHalStatus sme_UpdateIsFastRoamIniFeatureEnabled(tHalHandle hHal,
tANI_U8 sessionId,
const v_BOOL_t isFastRoamIniFeatureEnabled);
+eHalStatus sme_config_fast_roaming(tHalHandle hhal, tANI_U8 session_id,
+ const bool is_fast_roam_enabled);
+
/*--------------------------------------------------------------------------
\brief sme_UpdateIsMAWCIniFeatureEnabled() -
Enable/disable LFR MAWC support at runtime
@@ -4575,4 +4579,5 @@ eHalStatus sme_update_sta_roam_policy(tHalHandle hal_handle,
uint8_t session_id);
eHalStatus sme_register_p2p_ack_ind_callback(tHalHandle hal,
sir_p2p_ack_ind_callback callback);
+void sme_set_allowed_action_frames(tHalHandle hal, uint32_t bitmap0);
#endif //#if !defined( __SME_API_H )
diff --git a/CORE/SME/src/csr/csrApiRoam.c b/CORE/SME/src/csr/csrApiRoam.c
index 452cf6997d96..0d313b7df2ed 100644
--- a/CORE/SME/src/csr/csrApiRoam.c
+++ b/CORE/SME/src/csr/csrApiRoam.c
@@ -506,6 +506,9 @@ eHalStatus csrUpdateChannelList(tpAniSirGlobal pMac)
for (i = 0; i < pScan->base20MHzChannels.numChannels; i++)
{
+ if (vos_is_dsrc_channel(vos_chan_to_freq(
+ pScan->base20MHzChannels.channelList[i])))
+ continue;
channel = pScan->base20MHzChannels.channelList[i];
channel_state =
vos_nv_getChannelEnabledState(channel);
@@ -6945,6 +6948,7 @@ eHalStatus csrRoamCopyProfile(tpAniSirGlobal pMac, tCsrRoamProfile *pDstProfile,
pDstProfile->wps_state = pSrcProfile->wps_state;
pDstProfile->ieee80211d = pSrcProfile->ieee80211d;
pDstProfile->sap_dot11mc = pSrcProfile->sap_dot11mc;
+ pDstProfile->do_not_roam = pSrcProfile->do_not_roam;
vos_mem_copy(&pDstProfile->Keys, &pSrcProfile->Keys,
sizeof(pDstProfile->Keys));
#ifdef WLAN_FEATURE_VOWIFI_11R
@@ -16329,6 +16333,14 @@ void csrRoamStatsRspProcessor(tpAniSirGlobal pMac, tSirSmeRsp *pSirMsg)
pStats += sizeof(tCsrPerStaStatsInfo);
length -= sizeof(tCsrPerStaStatsInfo);
break;
+ case csr_per_chain_rssi_stats:
+ smsLog(pMac, LOG2,
+ FL("csrRoamStatsRspProcessor:Per Chain RSSI stats"));
+ vos_mem_copy((tANI_U8 *)&pMac->roam.per_chain_rssi_stats,
+ pStats, sizeof(struct csr_per_chain_rssi_stats_info));
+ pStats += sizeof(struct csr_per_chain_rssi_stats_info);
+ length -= sizeof(struct csr_per_chain_rssi_stats_info);
+ break;
default:
smsLog( pMac, LOGW, FL("csrRoamStatsRspProcessor:unknown stats type"));
break;
@@ -17440,6 +17452,12 @@ eHalStatus csrRoamOffloadScan(tpAniSirGlobal pMac, tANI_U8 sessionId,
"%s:pSession is null", __func__);
return eHAL_STATUS_FAILURE;
}
+
+ if ((ROAM_SCAN_OFFLOAD_START == command) && pSession->pCurRoamProfile &&
+ pSession->pCurRoamProfile->do_not_roam) {
+ smsLog(pMac, LOGE, FL("Supplicant disabled driver roaming"));
+ return eHAL_STATUS_FAILURE;
+ }
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
if (pSession->roamOffloadSynchParams.bRoamSynchInProgress
&& (ROAM_SCAN_OFFLOAD_STOP == command))
@@ -18256,6 +18274,12 @@ void csrRoamReportStatistics(tpAniSirGlobal pMac, tANI_U32 statsMask,
sizeof(tCsrPerStaStatsInfo));
pStats += sizeof(tCsrPerStaStatsInfo);
break;
+ case csr_per_chain_rssi_stats:
+ smsLog(pMac, LOG2, FL("Per Chain RSSI stats"));
+ vos_mem_copy(pStats, (tANI_U8 *)&pMac->roam.per_chain_rssi_stats,
+ sizeof(struct csr_per_chain_rssi_stats_info));
+ pStats += sizeof(struct csr_per_chain_rssi_stats_info);
+ break;
default:
smsLog( pMac, LOGE, FL("Unknown stats type and counter %d"), counter);
break;
diff --git a/CORE/SME/src/csr/csrApiScan.c b/CORE/SME/src/csr/csrApiScan.c
index bb73db4ca659..86bc234458c2 100644
--- a/CORE/SME/src/csr/csrApiScan.c
+++ b/CORE/SME/src/csr/csrApiScan.c
@@ -5437,7 +5437,7 @@ eHalStatus csrScanSmeScanResponse( tpAniSirGlobal pMac, void *pMsgBuf )
tListElem *pEntry;
tSmeCmd *pCommand;
eCsrScanStatus scanStatus;
- tSirSmeScanRsp *pScanRsp = (tSirSmeScanRsp *)pMsgBuf;
+ tSirSmeScanRsp *pScanRsp;
tSmeGetScanChnRsp *pScanChnInfo;
tANI_BOOLEAN fRemoveCommand = eANI_BOOLEAN_TRUE;
eCsrScanReason reason = eCsrScanOther;
@@ -5453,7 +5453,6 @@ eHalStatus csrScanSmeScanResponse( tpAniSirGlobal pMac, void *pMsgBuf )
pCommand = GET_BASE_ADDR( pEntry, tSmeCmd, Link );
if ( eSmeCommandScan == pCommand->command )
{
- scanStatus = (eSIR_SME_SUCCESS == pScanRsp->statusCode) ? eCSR_SCAN_SUCCESS : eCSR_SCAN_FAILURE;
reason = pCommand->u.scanCmd.reason;
switch(pCommand->u.scanCmd.reason)
{
@@ -5461,6 +5460,9 @@ eHalStatus csrScanSmeScanResponse( tpAniSirGlobal pMac, void *pMsgBuf )
case eCsrScanAbortNormalScan:
case eCsrScanBGScanAbort:
case eCsrScanBGScanEnable:
+ pScanRsp = (tSirSmeScanRsp *)pMsgBuf;
+ scanStatus = (eSIR_SME_SUCCESS == pScanRsp->statusCode) ?
+ eCSR_SCAN_SUCCESS : eCSR_SCAN_FAILURE;
break;
case eCsrScanGetScanChnInfo:
pScanChnInfo = (tSmeGetScanChnRsp *)pMsgBuf;
@@ -5472,14 +5474,22 @@ eHalStatus csrScanSmeScanResponse( tpAniSirGlobal pMac, void *pMsgBuf )
csrScanAgeResults(pMac, pScanChnInfo);
break;
case eCsrScanForCapsChange:
+ pScanRsp = (tSirSmeScanRsp *)pMsgBuf;
+ scanStatus = (eSIR_SME_SUCCESS == pScanRsp->statusCode) ?
+ eCSR_SCAN_SUCCESS : eCSR_SCAN_FAILURE;
csrScanProcessScanResults( pMac, pCommand, pScanRsp, &fRemoveCommand );
break;
case eCsrScanP2PFindPeer:
- scanStatus = ((eSIR_SME_SUCCESS == pScanRsp->statusCode) && (pScanRsp->length > 50)) ? eCSR_SCAN_FOUND_PEER : eCSR_SCAN_FAILURE;
- csrScanProcessScanResults( pMac, pCommand, pScanRsp, NULL );
- break;
+ pScanRsp = (tSirSmeScanRsp *)pMsgBuf;
+ scanStatus = ((eSIR_SME_SUCCESS == pScanRsp->statusCode) &&
+ (pScanRsp->length > 50)) ? eCSR_SCAN_FOUND_PEER : eCSR_SCAN_FAILURE;
+ csrScanProcessScanResults( pMac, pCommand, pScanRsp, NULL );
+ break;
case eCsrScanSetBGScanParam:
default:
+ pScanRsp = (tSirSmeScanRsp *)pMsgBuf;
+ scanStatus = (eSIR_SME_SUCCESS == pScanRsp->statusCode) ?
+ eCSR_SCAN_SUCCESS : eCSR_SCAN_FAILURE;
if(csrScanProcessScanResults( pMac, pCommand, pScanRsp, &fRemoveCommand ))
{
/*
@@ -5504,16 +5514,17 @@ eHalStatus csrScanSmeScanResponse( tpAniSirGlobal pMac, void *pMsgBuf )
csrReleaseScanCommand(pMac, pCommand, scanStatus);
- }
+ }
smeProcessPendingQueue( pMac );
}
#ifdef FEATURE_WLAN_SCAN_PNO
- else if (pMac->pnoOffload &&
- !HAL_STATUS_SUCCESS(csrSavePnoScanResults(pMac, pScanRsp,
- pScanRsp->sessionId)))
- {
- smsLog( pMac, LOGE, "CSR: Unable to store scan results for PNO" );
- status = eHAL_STATUS_FAILURE;
+ else if (pMac->pnoOffload) {
+ pScanRsp = (tSirSmeScanRsp *)pMsgBuf;
+ if (!HAL_STATUS_SUCCESS(csrSavePnoScanResults(pMac, pScanRsp,
+ pScanRsp->sessionId))) {
+ smsLog( pMac, LOGE, "CSR: Unable to store scan results for PNO" );
+ status = eHAL_STATUS_FAILURE;
+ }
}
#endif
else
@@ -5523,12 +5534,13 @@ eHalStatus csrScanSmeScanResponse( tpAniSirGlobal pMac, void *pMsgBuf )
}
}
#ifdef FEATURE_WLAN_SCAN_PNO
- else if (pMac->pnoOffload &&
- !HAL_STATUS_SUCCESS(csrSavePnoScanResults(pMac, pScanRsp,
- pScanRsp->sessionId)))
- {
- smsLog( pMac, LOGE, "CSR: Unable to store scan results for PNO" );
- status = eHAL_STATUS_FAILURE;
+ else if (pMac->pnoOffload) {
+ pScanRsp = (tSirSmeScanRsp *)pMsgBuf;
+ if (!HAL_STATUS_SUCCESS(csrSavePnoScanResults(pMac, pScanRsp,
+ pScanRsp->sessionId))) {
+ smsLog( pMac, LOGE, "CSR: Unable to store scan results for PNO" );
+ status = eHAL_STATUS_FAILURE;
+ }
}
#endif
else if (pMac->pnoOffload == FALSE)
diff --git a/CORE/SME/src/pmc/pmcApi.c b/CORE/SME/src/pmc/pmcApi.c
index dbadeef6216e..552c65078b5f 100644
--- a/CORE/SME/src/pmc/pmcApi.c
+++ b/CORE/SME/src/pmc/pmcApi.c
@@ -3570,8 +3570,6 @@ eHalStatus PmcOffloadEnableStaModePowerSave(tHalHandle hHal,
if(!pmc->configStaPsEnabled)
{
eHalStatus status;
-
- pmc->configStaPsEnabled = TRUE;
status = pmcOffloadEnableStaPsHandler(pMac, sessionId);
if((eHAL_STATUS_SUCCESS == status) ||
@@ -3581,6 +3579,7 @@ eHalStatus PmcOffloadEnableStaModePowerSave(tHalHandle hHal,
smsLog(pMac, LOG2,
FL("Successful Queued Enabling Sta Mode Ps Request"));
+ pmc->configStaPsEnabled = TRUE;
return eHAL_STATUS_SUCCESS;
}
else
@@ -3613,7 +3612,6 @@ eHalStatus PmcOffloadDisableStaModePowerSave(tHalHandle hHal,
eHalStatus status = eHAL_STATUS_SUCCESS;
if (pmc->configStaPsEnabled) {
- pmc->configDefStaPsEnabled = FALSE;
status = pmcOffloadDisableStaPsHandler(pMac, sessionId);
} else {
/*
@@ -4127,13 +4125,6 @@ eHalStatus PmcOffloadEnableDeferredStaModePowerSave(tHalHandle hHal,
eHalStatus status = eHAL_STATUS_FAILURE;
tANI_U32 timer_value;
- if (!pmc->configStaPsEnabled)
- {
- smsLog(pMac, LOGE,
- FL("STA Mode Config PowerSave is not enabled"));
- return status;
- }
-
if (!pMac->pmcOffloadInfo.staPsEnabled)
{
smsLog(pMac, LOGE,
diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c
index ab150e7c3896..b36e47f5102c 100644
--- a/CORE/SME/src/sme_common/sme_Api.c
+++ b/CORE/SME/src/sme_common/sme_Api.c
@@ -2255,7 +2255,7 @@ eHalStatus sme_HDDReadyInd(tHalHandle hHal)
*
* Return: None
*/
-static void sme_set_allowed_action_frames(tHalHandle hal)
+void sme_set_allowed_action_frames(tHalHandle hal, uint32_t bitmap0)
{
eHalStatus status;
tpAniSirGlobal mac = PMAC_STRUCT(hal);
@@ -2275,8 +2275,7 @@ static void sme_set_allowed_action_frames(tHalHandle hal)
sizeof(*sir_allowed_action_frames));
sir_allowed_action_frames->operation = WOW_ACTION_WAKEUP_OPERATION_SET;
- sir_allowed_action_frames->action_category_map[0] =
- (ALLOWED_ACTION_FRAMES_BITMAP0);
+ sir_allowed_action_frames->action_category_map[0] = bitmap0;
sir_allowed_action_frames->action_category_map[1] =
(ALLOWED_ACTION_FRAMES_BITMAP1);
sir_allowed_action_frames->action_category_map[2] =
@@ -2377,7 +2376,7 @@ eHalStatus sme_Start(tHalHandle hHal)
pMac->sme.state = SME_STATE_START;
}while (0);
- sme_set_allowed_action_frames(hHal);
+ sme_set_allowed_action_frames(hHal, ALLOWED_ACTION_FRAMES_BITMAP0_STA);
return status;
}
@@ -10597,6 +10596,46 @@ eHalStatus sme_UpdateIsFastRoamIniFeatureEnabled
return eHAL_STATUS_SUCCESS;
}
+/**
+ * sme_config_fast_roaming() - enable/disable LFR support at runtime
+ * @hhal - The handle returned by macOpen.
+ * @session_id - Session Identifier
+ * @is_fast_roam_enabled - flag to enable/disable roaming
+ *
+ * When Supplicant issues enabled/disable fast roaming on the basis
+ * of the Bssid modification in network block (e.g. AutoJoin mode N/W block)
+ *
+ * Return: eHalStatus
+ */
+
+eHalStatus sme_config_fast_roaming(tHalHandle hhal, tANI_U8 session_id,
+ const bool is_fast_roam_enabled)
+{
+ tpAniSirGlobal pmac = PMAC_STRUCT(hhal);
+ tCsrRoamSession *psession = CSR_GET_SESSION(pmac, session_id);
+ eHalStatus status;
+
+ if (!pmac->roam.configParam.isFastRoamIniFeatureEnabled) {
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
+ FL("FastRoam is disabled through ini"));
+ if (!is_fast_roam_enabled)
+ return eHAL_STATUS_SUCCESS;
+ return eHAL_STATUS_FAILURE;
+ }
+
+ if (is_fast_roam_enabled && psession && psession->pCurRoamProfile)
+ psession->pCurRoamProfile->do_not_roam = false;
+ status = csrNeighborRoamUpdateFastRoamingEnabled(pmac,
+ session_id, is_fast_roam_enabled);
+ if (!HAL_STATUS_SUCCESS(status)) {
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR,
+ FL("csrNeighborRoamUpdateFastRoamingEnabled failed"));
+ return eHAL_STATUS_FAILURE;
+ }
+
+ return eHAL_STATUS_SUCCESS;
+}
+
/*--------------------------------------------------------------------------
\brief sme_UpdateIsMAWCIniFeatureEnabled() -
Enable/disable LFR MAWC support at runtime
diff --git a/CORE/SVC/src/logging/wlan_logging_sock_svc.c b/CORE/SVC/src/logging/wlan_logging_sock_svc.c
index 1dd4dc0a2e86..104659e91446 100644
--- a/CORE/SVC/src/logging/wlan_logging_sock_svc.c
+++ b/CORE/SVC/src/logging/wlan_logging_sock_svc.c
@@ -831,6 +831,13 @@ static int wlan_logging_proc_sock_rx_msg(struct sk_buff *skb)
return -EINVAL;
}
+ if (wnl->wmsg.length > skb->data_len) {
+ LOGGING_TRACE(VOS_TRACE_LEVEL_ERROR,
+ "%s: invalid length msgLen:%x skb data_len:%x\n",
+ __func__, wnl->wmsg.length, skb->data_len);
+ return -EINVAL;
+ }
+
if (gapp_pid != INVALID_PID) {
if (wnl->nlh.nlmsg_pid > gapp_pid) {
gapp_pid = wnl->nlh.nlmsg_pid;
diff --git a/CORE/UTILS/FWLOG/dbglog_host.c b/CORE/UTILS/FWLOG/dbglog_host.c
index c1275ffe163d..a1ba79c0c8b6 100644
--- a/CORE/UTILS/FWLOG/dbglog_host.c
+++ b/CORE/UTILS/FWLOG/dbglog_host.c
@@ -1378,7 +1378,8 @@ wmi_config_debug_module_cmd(wmi_unified_t wmi_handle, A_UINT32 param, A_UINT32
}
}
- AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("wmi_dbg_cfg_send: param 0x%x val 0x%x \n ", param, val));
+ AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("wmi_dbg_cfg_send: param 0x%x val 0x%x \n",
+ param, val));
status = wmi_unified_cmd_send(wmi_handle, buf,
len, WMI_DBGLOG_CFG_CMDID);
diff --git a/CORE/VOSS/src/vos_timer.c b/CORE/VOSS/src/vos_timer.c
index 6c318aff5413..f0e28a05af0e 100644
--- a/CORE/VOSS/src/vos_timer.c
+++ b/CORE/VOSS/src/vos_timer.c
@@ -189,7 +189,7 @@ static void vos_linux_timer_callback (unsigned long data)
if (vos_is_wd_thread(threadId)) {
VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO,
"TIMER callback: running on wd thread");
- callback(NULL);
+ callback(userData);
return;
}