diff options
| author | Linux Build Service Account <lnxbuild@localhost> | 2016-05-25 03:26:56 -0700 |
|---|---|---|
| committer | Linux Build Service Account <lnxbuild@localhost> | 2016-05-25 03:26:56 -0700 |
| commit | b2ed0531ca669023f141bf3d854e083aae0eb113 (patch) | |
| tree | 00eebe5884aea542cec8b28eba0c02ec5516d7f1 | |
| parent | 07d6d01e32a32e79d32782bf1346d4fc8a335e89 (diff) | |
| parent | bb03b13932c5b4d41c3da24f9f92a0652122a2e6 (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
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; } |
