summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2019-12-31 02:55:14 -0800
committerLinux Build Service Account <lnxbuild@localhost>2019-12-31 02:55:14 -0800
commitace28df813c122ed15787f62135cf3a3920fe326 (patch)
tree115332a6cb25fc3d6776ed200bc9a6a762e3d071
parent246a581a325f4bb948b9b0c3d3acedb4ea2bf79b (diff)
parent01acdfec1f8eaa8bd2753a64051e589cc288778b (diff)
Merge 01acdfec1f8eaa8bd2753a64051e589cc288778b on remote branch
Change-Id: Ief67dfa0dc4231abcda4595b18974dc12c96123b
-rw-r--r--core/hdd/inc/wlan_hdd_cfg.h27
-rw-r--r--core/hdd/src/wlan_hdd_cfg.c42
-rw-r--r--core/hdd/src/wlan_hdd_ipa.c42
-rw-r--r--core/hdd/src/wlan_hdd_main.c12
-rw-r--r--core/hdd/src/wlan_hdd_power.c6
-rw-r--r--core/mac/inc/ani_global.h4
-rw-r--r--core/mac/inc/qwlan_version.h4
-rw-r--r--core/mac/src/pe/lim/lim_process_sme_req_messages.c4
-rw-r--r--core/mac/src/pe/rrm/rrm_api.c35
-rw-r--r--core/mac/src/pe/sch/sch_beacon_process.c3
-rw-r--r--core/sme/src/csr/csr_api_roam.c9
-rw-r--r--core/sme/src/csr/csr_api_scan.c4
-rw-r--r--core/sme/src/qos/sme_qos.c63
-rw-r--r--core/wma/src/wma_dev_if.c7
14 files changed, 204 insertions, 58 deletions
diff --git a/core/hdd/inc/wlan_hdd_cfg.h b/core/hdd/inc/wlan_hdd_cfg.h
index 09b887cdb178..11817f9704af 100644
--- a/core/hdd/inc/wlan_hdd_cfg.h
+++ b/core/hdd/inc/wlan_hdd_cfg.h
@@ -12721,6 +12721,32 @@ enum hw_filter_mode {
#define CFG_ACTION_OUI_CONNECT_1X1_WITH_1_CHAIN_NAME "gActionOUIConnect1x1with1TxRxChain"
#define CFG_ACTION_OUI_CONNECT_1X1_WITH_1_CHAIN_DEFAULT "001018 06 02FFF0040000 BC 21 40 001018 06 02FFF0050000 BC 21 40 001018 06 02FFF4050000 BC 21 40"
+/*
+ * <ini>
+ * gActionOUIDisableAggressiveEDCA - Used to specify action OUIs to control
+ * EDCA configuration when join the candidate AP
+ *
+ * This ini is used to specify AP OUIs. The station's EDCA should follow the
+ * APs' when connecting to those AP, even if the gEnableEdcaParams is set.
+ * For example, it follows the AP's EDCA whose OUI is 0050F2 with the
+ * following setting:
+ * gActionOUIDisableAggressiveEDCA=0050F2 00 01
+ * Explain: 0050F2: OUI
+ * 00: data length is 0
+ * 01: info mask, only OUI present in Info mask
+ * Refer to gEnableActionOUI for more detail about the format.
+ *
+ * Related: gEnableEdcaParams, gEnableActionOUI
+ *
+ * Supported Feature: Action OUIs
+ *
+ * Usage: External
+ *
+ * </ini>
+ */
+#define CFG_ACTION_OUI_DISABLE_AGGRESSIVE_EDCA "gActionOUIDisableAggressiveEDCA"
+#define CFG_ACTION_OUI_DISABLE_AGGRESSIVE_EDCA_DEFAULT ""
+
/* End of action oui inis */
/*
@@ -16400,6 +16426,7 @@ struct hdd_config {
uint8_t action_oui_ito_alternate[MAX_ACTION_OUI_STRING_LEN];
uint8_t action_oui_switch_to_11n[MAX_ACTION_OUI_STRING_LEN];
uint8_t action_oui_connect_1x1_with_1_chain[MAX_ACTION_OUI_STRING_LEN];
+ uint8_t action_oui_disable_aggressive_edca[MAX_ACTION_OUI_STRING_LEN];
uint8_t rssi_weightage;
uint8_t ht_caps_weightage;
uint8_t vht_caps_weightage;
diff --git a/core/hdd/src/wlan_hdd_cfg.c b/core/hdd/src/wlan_hdd_cfg.c
index 2f32051f1764..edda70828e15 100644
--- a/core/hdd/src/wlan_hdd_cfg.c
+++ b/core/hdd/src/wlan_hdd_cfg.c
@@ -5100,6 +5100,12 @@ struct reg_table_entry g_registry_table[] = {
VAR_FLAGS_OPTIONAL,
(void *)CFG_ACTION_OUI_CONNECT_1X1_WITH_1_CHAIN_DEFAULT),
+ REG_VARIABLE_STRING(CFG_ACTION_OUI_DISABLE_AGGRESSIVE_EDCA,
+ WLAN_PARAM_String,
+ struct hdd_config, action_oui_disable_aggressive_edca,
+ VAR_FLAGS_OPTIONAL,
+ (void *)CFG_ACTION_OUI_DISABLE_AGGRESSIVE_EDCA_DEFAULT),
+
REG_VARIABLE(CFG_DTIM_1CHRX_ENABLE_NAME, WLAN_PARAM_Integer,
struct hdd_config, enable_dtim_1chrx,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
@@ -6829,32 +6835,36 @@ static void hdd_cfg_print_action_oui(hdd_context_t *hdd_ctx)
struct hdd_config *config = hdd_ctx->config;
hdd_debug("Name = [%s] value = [%u]",
- CFG_ENABLE_ACTION_OUI,
- config->enable_action_oui);
+ CFG_ENABLE_ACTION_OUI,
+ config->enable_action_oui);
hdd_debug("Name = [%s] value = [%s]",
- CFG_ACTION_OUI_CONNECT_1X1_NAME,
- config->action_oui_connect_1x1);
+ CFG_ACTION_OUI_CONNECT_1X1_NAME,
+ config->action_oui_connect_1x1);
hdd_debug("Name = [%s] value = [%s]",
- CFG_ACTION_OUI_ITO_EXTENSION_NAME,
- config->action_oui_ito_extension);
+ CFG_ACTION_OUI_ITO_EXTENSION_NAME,
+ config->action_oui_ito_extension);
hdd_debug("Name = [%s] value = [%s]",
- CFG_ACTION_OUI_CCKM_1X1_NAME,
- config->action_oui_cckm_1x1);
+ CFG_ACTION_OUI_CCKM_1X1_NAME,
+ config->action_oui_cckm_1x1);
hdd_debug("Name = [%s] value = [%s]",
- CFG_ACTION_OUI_ITO_ALTERNATE_NAME,
- config->action_oui_ito_alternate);
+ CFG_ACTION_OUI_ITO_ALTERNATE_NAME,
+ config->action_oui_ito_alternate);
hdd_debug("Name = [%s] value = [%s]",
- CFG_ACTION_OUI_SWITCH_TO_11N_MODE_NAME,
- config->action_oui_switch_to_11n);
+ CFG_ACTION_OUI_SWITCH_TO_11N_MODE_NAME,
+ config->action_oui_switch_to_11n);
hdd_debug("Name = [%s] value = [%s]",
- CFG_ACTION_OUI_CONNECT_1X1_WITH_1_CHAIN_NAME,
- config->action_oui_connect_1x1_with_1_chain);
+ CFG_ACTION_OUI_CONNECT_1X1_WITH_1_CHAIN_NAME,
+ config->action_oui_connect_1x1_with_1_chain);
+
+ hdd_debug("Name = [%s] value = [%s]",
+ CFG_ACTION_OUI_DISABLE_AGGRESSIVE_EDCA,
+ config->action_oui_disable_aggressive_edca);
}
@@ -9964,6 +9974,10 @@ void hdd_set_all_sme_action_ouis(hdd_context_t *hdd_ctx)
hdd_set_sme_action_oui(hdd_ctx, ini_string,
WMI_ACTION_OUI_CONNECT_1x1_WITH_1_CHAIN);
+ ini_string = config->action_oui_disable_aggressive_edca;
+ ini_string[MAX_ACTION_OUI_STRING_LEN - 1] = '\0';
+ hdd_set_sme_action_oui(hdd_ctx, ini_string,
+ WMI_ACTION_OUI_DISABLE_AGGRESSIVE_EDCA);
}
/* End of action oui functions */
diff --git a/core/hdd/src/wlan_hdd_ipa.c b/core/hdd/src/wlan_hdd_ipa.c
index d582e6ba8fc3..f2275fc5e09f 100644
--- a/core/hdd/src/wlan_hdd_ipa.c
+++ b/core/hdd/src/wlan_hdd_ipa.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013-2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2013-2019 The Linux Foundation. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@@ -658,6 +658,7 @@ static int hdd_ipa_uc_enable_pipes(struct hdd_ipa_priv *hdd_ipa);
static int hdd_ipa_wdi_init(struct hdd_ipa_priv *hdd_ipa);
static void hdd_ipa_send_pkt_to_tl(struct hdd_ipa_iface_context *iface_context,
struct ipa_rx_data *ipa_tx_desc);
+static int hdd_ipa_setup_sys_pipe(struct hdd_ipa_priv *hdd_ipa);
/**
* hdd_ipa_uc_get_db_paddr() - Get Doorbell physical address
@@ -4062,6 +4063,19 @@ static void hdd_ipa_uc_loaded_handler(struct hdd_ipa_priv *ipa_ctxt)
return;
}
+ /* Setup IPA sys_pipe for MCC */
+ if (hdd_ipa_uc_sta_is_enabled(ipa_ctxt->hdd_ctx)) {
+ ret = hdd_ipa_setup_sys_pipe(ipa_ctxt);
+ if (ret) {
+ HDD_IPA_LOG(QDF_TRACE_LEVEL_ERROR,
+ "ipa sys pipes setup failed ret=%d", ret);
+ return;
+ }
+
+ INIT_WORK(&ipa_ctxt->mcc_work,
+ hdd_ipa_mcc_work_handler);
+ }
+
/* Connect pipe */
ret = hdd_ipa_wdi_conn_pipes(ipa_ctxt, ipa_res);
if (ret) {
@@ -7503,14 +7517,6 @@ static QDF_STATUS __hdd_ipa_init(hdd_context_t *hdd_ctx)
hdd_ipa->sta_connected = 0;
hdd_ipa->ipa_pipes_down = true;
hdd_ipa->wdi_enabled = false;
- /* Setup IPA sys_pipe for MCC */
- if (hdd_ipa_uc_sta_is_enabled(hdd_ipa->hdd_ctx)) {
- ret = hdd_ipa_setup_sys_pipe(hdd_ipa);
- if (ret)
- goto fail_create_sys_pipe;
-
- INIT_WORK(&hdd_ipa->mcc_work, hdd_ipa_mcc_work_handler);
- }
ret = hdd_ipa_wdi_init(hdd_ipa);
if (ret) {
@@ -7518,15 +7524,25 @@ static QDF_STATUS __hdd_ipa_init(hdd_context_t *hdd_ctx)
"ipa wdi init failed ret=%d", ret);
if (ret == -EACCES) {
if (hdd_ipa_uc_send_wdi_control_msg(false))
- goto fail_create_sys_pipe;
+ goto ipa_wdi_destroy;
} else {
- goto fail_create_sys_pipe;
+ goto ipa_wdi_destroy;
+ }
+ } else {
+ /* Setup IPA sys_pipe for MCC */
+ if (hdd_ipa_uc_sta_is_enabled(hdd_ipa->hdd_ctx)) {
+ ret = hdd_ipa_setup_sys_pipe(hdd_ipa);
+ if (ret)
+ goto ipa_wdi_destroy;
+
+ INIT_WORK(&hdd_ipa->mcc_work,
+ hdd_ipa_mcc_work_handler);
}
}
} else {
ret = hdd_ipa_setup_sys_pipe(hdd_ipa);
if (ret)
- goto fail_create_sys_pipe;
+ goto ipa_wdi_destroy;
}
init_completion(&hdd_ipa->ipa_resource_comp);
@@ -7534,7 +7550,7 @@ static QDF_STATUS __hdd_ipa_init(hdd_context_t *hdd_ctx)
HDD_IPA_LOG(QDF_TRACE_LEVEL_DEBUG, "exit: success");
return QDF_STATUS_SUCCESS;
-fail_create_sys_pipe:
+ipa_wdi_destroy:
hdd_ipa_wdi_destroy_rm(hdd_ipa);
fail_setup_rm:
qdf_spinlock_destroy(&hdd_ipa->pm_lock);
diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c
index b322a0b128fd..6747d89d69e5 100644
--- a/core/hdd/src/wlan_hdd_main.c
+++ b/core/hdd/src/wlan_hdd_main.c
@@ -5086,6 +5086,18 @@ QDF_STATUS hdd_stop_adapter(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter,
hdd_wait_for_sme_close_sesion(hdd_ctx, adapter, false);
break;
+ case QDF_MONITOR_MODE:
+ wlan_hdd_scan_abort(adapter);
+ hdd_deregister_tx_flow_control(adapter);
+
+ /*
+ * It is possible that the caller of this function does not
+ * wish to close the session
+ */
+ if (bCloseSession)
+ hdd_wait_for_sme_close_sesion(hdd_ctx, adapter, true);
+ break;
+
case QDF_SAP_MODE:
if (test_bit(ACS_PENDING, &adapter->event_flags)) {
cds_flush_delayed_work(&adapter->acs_pending_work);
diff --git a/core/hdd/src/wlan_hdd_power.c b/core/hdd/src/wlan_hdd_power.c
index 81f52aeb8ebb..7e95159b4ae0 100644
--- a/core/hdd/src/wlan_hdd_power.c
+++ b/core/hdd/src/wlan_hdd_power.c
@@ -70,6 +70,7 @@
#include <wlan_logging_sock_svc.h>
#include "cds_utils.h"
#include "wlan_hdd_packet_filter_api.h"
+#include "cds_concurrency.h"
/* Preprocessor definitions and constants */
#define HDD_SSR_BRING_UP_TIME 30000
@@ -2034,6 +2035,11 @@ static int __wlan_hdd_cfg80211_suspend_wlan(struct wiphy *wiphy,
}
mutex_unlock(&pHddCtx->iface_change_lock);
+ if (cds_is_connection_in_progress(NULL, NULL)) {
+ hdd_err("Suspend rejected: conn in progress");
+ return -EINVAL;
+ }
+
/* If RADAR detection is in progress (HDD), prevent suspend. The flag
* "dfs_cac_block_tx" is set to true when RADAR is found and stay true
* until CAC is done for a SoftAP which is in started state.
diff --git a/core/mac/inc/ani_global.h b/core/mac/inc/ani_global.h
index bfb3d7cb2476..9e4866866985 100644
--- a/core/mac/inc/ani_global.h
+++ b/core/mac/inc/ani_global.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2019 The Linux Foundation. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@@ -1016,6 +1016,8 @@ typedef struct sAniSirGlobal {
/* 11k Offload Support */
bool is_11k_offload_supported;
+ /* if true, it is forced to follow the AP's edca */
+ bool follow_ap_edca;
uint32_t peer_rssi;
uint32_t peer_txrate;
uint32_t peer_rxrate;
diff --git a/core/mac/inc/qwlan_version.h b/core/mac/inc/qwlan_version.h
index 41f78238e231..d60887bdae29 100644
--- a/core/mac/inc/qwlan_version.h
+++ b/core/mac/inc/qwlan_version.h
@@ -32,9 +32,9 @@
#define QWLAN_VERSION_MAJOR 5
#define QWLAN_VERSION_MINOR 1
#define QWLAN_VERSION_PATCH 1
-#define QWLAN_VERSION_EXTRA "M"
+#define QWLAN_VERSION_EXTRA "T"
#define QWLAN_VERSION_BUILD 75
-#define QWLAN_VERSIONSTR "5.1.1.75M"
+#define QWLAN_VERSIONSTR "5.1.1.75T"
#endif /* QWLAN_VERSION_H */
diff --git a/core/mac/src/pe/lim/lim_process_sme_req_messages.c b/core/mac/src/pe/lim/lim_process_sme_req_messages.c
index 27e338bc77bc..e5e33917fb9c 100644
--- a/core/mac/src/pe/lim/lim_process_sme_req_messages.c
+++ b/core/mac/src/pe/lim/lim_process_sme_req_messages.c
@@ -1216,7 +1216,7 @@ static QDF_STATUS lim_send_hal_start_scan_offload_req(tpAniSirGlobal pMac,
}
len = sizeof(tSirScanOffloadReq) +
- (pScanReq->channelList.numChannels) +
+ pScanReq->channelList.numChannels +
pScanReq->uIEFieldLen + pScanReq->oui_field_len;
pScanOffloadReq = qdf_mem_malloc(len);
@@ -1324,7 +1324,7 @@ static QDF_STATUS lim_send_hal_start_scan_offload_req(tpAniSirGlobal pMac,
pScanReq->probe_req_ie_bitmap,
PROBE_REQ_BITMAP_LEN * sizeof(uint32_t));
pScanOffloadReq->oui_field_offset = sizeof(tSirScanOffloadReq) +
- (pScanOffloadReq->channelList.numChannels) +
+ pScanOffloadReq->channelList.numChannels +
pScanOffloadReq->uIEFieldLen;
if (pScanOffloadReq->num_vendor_oui != 0) {
qdf_mem_copy(
diff --git a/core/mac/src/pe/rrm/rrm_api.c b/core/mac/src/pe/rrm/rrm_api.c
index e67d9bbe74ae..e001fbbb26fb 100644
--- a/core/mac/src/pe/rrm/rrm_api.c
+++ b/core/mac/src/pe/rrm/rrm_api.c
@@ -572,6 +572,11 @@ rrm_process_beacon_report_req(tpAniSirGlobal pMac,
}
if (pBeaconReq->measurement_request.Beacon.RequestedInfo.present) {
+ if (!pBeaconReq->measurement_request.Beacon.RequestedInfo.
+ num_requested_eids) {
+ pe_debug("802.11k BCN RPT: Requested num of EID is 0");
+ return eRRM_FAILURE;
+ }
pCurrentReq->request.Beacon.reqIes.pElementIds =
qdf_mem_malloc(sizeof(uint8_t) *
pBeaconReq->measurement_request.Beacon.
@@ -580,6 +585,7 @@ rrm_process_beacon_report_req(tpAniSirGlobal pMac,
pe_err("Unable to allocate memory for request IEs buffer");
return eRRM_FAILURE;
}
+
pCurrentReq->request.Beacon.reqIes.num =
pBeaconReq->measurement_request.Beacon.RequestedInfo.
num_requested_eids;
@@ -587,6 +593,11 @@ rrm_process_beacon_report_req(tpAniSirGlobal pMac,
pBeaconReq->measurement_request.Beacon.
RequestedInfo.requested_eids,
pCurrentReq->request.Beacon.reqIes.num);
+ pe_debug("802.11k BCN RPT: Requested EIDs: num:[%d]",
+ pCurrentReq->request.Beacon.reqIes.num);
+ QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_DEBUG,
+ pCurrentReq->request.Beacon.reqIes.pElementIds,
+ pCurrentReq->request.Beacon.reqIes.num);
}
if (pBeaconReq->measurement_request.Beacon.num_APChannelReport) {
@@ -1137,28 +1148,30 @@ tSirRetStatus rrm_process_beacon_req(tpAniSirGlobal mac_ctx, tSirMacAddr peer,
*/
static
tSirRetStatus update_rrm_report(tpAniSirGlobal mac_ctx,
- tpSirMacRadioMeasureReport report,
+ tpSirMacRadioMeasureReport *report,
tDot11fRadioMeasurementRequest *rrm_req,
uint8_t *num_report, int index)
{
- if (report == NULL) {
+ tpSirMacRadioMeasureReport rrm_report;
+
+ if (!*report) {
/*
* Allocate memory to send reports for
* any subsequent requests.
*/
- report = qdf_mem_malloc(sizeof(*report) *
+ *report = qdf_mem_malloc(sizeof(tSirMacRadioMeasureReport) *
(rrm_req->num_MeasurementRequest - index));
- if (NULL == report) {
- pe_err("Unable to allocate memory during RRM Req processing");
+ if (!*report) {
+ pe_err("Fail to alloc mem during RRM Req processing");
return eSIR_MEM_ALLOC_FAILED;
}
- pe_debug("rrm beacon type incapable of %d report",
- *num_report);
+ pe_debug("rrm beacon type incapable of %d report", *num_report);
}
- report[*num_report].incapable = 1;
- report[*num_report].type =
+ rrm_report = *report;
+ rrm_report[*num_report].incapable = 1;
+ rrm_report[*num_report].type =
rrm_req->MeasurementRequest[index].measurement_type;
- report[*num_report].token =
+ rrm_report[*num_report].token =
rrm_req->MeasurementRequest[index].measurement_token;
(*num_report)++;
return eSIR_SUCCESS;
@@ -1240,7 +1253,7 @@ rrm_process_radio_measurement_request(tpAniSirGlobal mac_ctx,
break;
default:
/* Send a report with incapabale bit set. */
- status = update_rrm_report(mac_ctx, report, rrm_req,
+ status = update_rrm_report(mac_ctx, &report, rrm_req,
&num_report, i);
if (eSIR_SUCCESS != status)
return status;
diff --git a/core/mac/src/pe/sch/sch_beacon_process.c b/core/mac/src/pe/sch/sch_beacon_process.c
index 787e43a0a545..be88a0a11551 100644
--- a/core/mac/src/pe/sch/sch_beacon_process.c
+++ b/core/mac/src/pe/sch/sch_beacon_process.c
@@ -976,7 +976,8 @@ sch_beacon_edca_process(tpAniSirGlobal pMac, tSirMacEdcaParamSetIE *edca,
session->gLimEdcaParams[EDCA_AC_VI] = edca->acvi;
session->gLimEdcaParams[EDCA_AC_VO] = edca->acvo;
- if (pMac->roam.configParam.enable_edca_params) {
+ if (pMac->roam.configParam.enable_edca_params &&
+ !pMac->follow_ap_edca) {
session->gLimEdcaParams[EDCA_AC_VO].aci.aifsn =
pMac->roam.configParam.edca_vo_aifs;
session->gLimEdcaParams[EDCA_AC_VI].aci.aifsn =
diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c
index debd009b3727..6d7f23d21bcb 100644
--- a/core/sme/src/csr/csr_api_roam.c
+++ b/core/sme/src/csr/csr_api_roam.c
@@ -16019,6 +16019,15 @@ QDF_STATUS csr_send_join_req_msg(tpAniSirGlobal pMac, uint32_t sessionId,
csr_dump_vendor_ies((uint8_t *)pBssDescription->ieFields,
ieLen);
+ is_vendor_ap_present = csr_check_vendor_ap_present(pMac,
+ pBssDescription,
+ ucDot11Mode, pIes, ieLen,
+ WMI_ACTION_OUI_DISABLE_AGGRESSIVE_EDCA);
+ if (is_vendor_ap_present)
+ pMac->follow_ap_edca = true;
+ else
+ pMac->follow_ap_edca = false;
+
is_vendor_ap_present = csr_check_vendor_ap_present(
pMac, pBssDescription,
ucDot11Mode, pIes, ieLen,
diff --git a/core/sme/src/csr/csr_api_scan.c b/core/sme/src/csr/csr_api_scan.c
index 949134f96488..f2b9b69c2d35 100644
--- a/core/sme/src/csr/csr_api_scan.c
+++ b/core/sme/src/csr/csr_api_scan.c
@@ -5877,8 +5877,8 @@ static void csr_populate_ie_whitelist_attrs(tSirSmeScanReq *msg,
qdf_mem_copy(msg->probe_req_ie_bitmap, scan_req->probe_req_ie_bitmap,
PROBE_REQ_BITMAP_LEN * sizeof(uint32_t));
msg->oui_field_len = scan_req->num_vendor_oui * sizeof(*scan_req->voui);
- msg->oui_field_offset = (sizeof(tSirSmeScanReq) +
- (scan_req->ChannelInfo.numOfChannels)) +
+ msg->oui_field_offset = sizeof(tSirSmeScanReq) +
+ scan_req->ChannelInfo.numOfChannels +
scan_req->uIEFieldLen;
if (scan_req->num_vendor_oui != 0)
diff --git a/core/sme/src/qos/sme_qos.c b/core/sme/src/qos/sme_qos.c
index 184715046dea..a9872543d6e0 100644
--- a/core/sme/src/qos/sme_qos.c
+++ b/core/sme/src/qos/sme_qos.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2019 The Linux Foundation. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@@ -4878,6 +4878,54 @@ static QDF_STATUS sme_qos_process_reassoc_failure_ev(tpAniSirGlobal pMac,
return QDF_STATUS_SUCCESS;
}
+#ifdef WLAN_FEATURE_ROAM_OFFLOAD
+#ifdef FEATURE_WLAN_ESE
+static bool sme_qos_ft_handoff_required(tpAniSirGlobal pmac,
+ uint8_t session_id)
+{
+ tCsrRoamSession *csr_roam_session;
+
+ if (csr_roam_is11r_assoc(pmac, session_id))
+ return true;
+
+ csr_roam_session = CSR_GET_SESSION(pmac, session_id);
+
+ if (csr_roam_session->roam_synch_in_progress &&
+ csr_roam_is_ese_assoc(pmac, session_id) &&
+ csr_roam_session->connectedInfo.nTspecIeLength)
+ return true;
+
+ return false;
+}
+#else
+static inline bool sme_qos_ft_handoff_required(tpAniSirGlobal pmac,
+ uint8_t session_id)
+{
+ return csr_roam_is11r_assoc(pmac, session_id) ? true : false;
+}
+#endif
+#else
+static inline bool sme_qos_ft_handoff_required(tpAniSirGlobal pmac,
+ uint8_t session_id)
+{
+ return false;
+}
+#endif
+
+#ifdef FEATURE_WLAN_ESE
+static inline bool sme_qos_legacy_handoff_required(tpAniSirGlobal pmac,
+ uint8_t session_id)
+{
+ return csr_roam_is_ese_assoc(pmac, session_id) ? false : true;
+}
+#else
+static inline bool sme_qos_legacy_handoff_required(tpAniSirGlobal pmac,
+ uint8_t session_id)
+{
+ return true;
+}
+#endif
+
/*
* sme_qos_process_handoff_assoc_req_ev() - Function to process the
* SME_QOS_CSR_HANDOFF_ASSOC_REQ event indication from CSR
@@ -4926,16 +4974,13 @@ static QDF_STATUS sme_qos_process_handoff_assoc_req_ev(tpAniSirGlobal pMac,
break;
}
}
-#ifdef WLAN_FEATURE_ROAM_OFFLOAD
- if (csr_roam_is11r_assoc(pMac, sessionId))
+
+ if (sme_qos_ft_handoff_required(pMac, sessionId))
pSession->ftHandoffInProgress = true;
-#endif
+
/* If FT handoff/ESE in progress, legacy handoff need not be enabled */
- if (!pSession->ftHandoffInProgress
-#ifdef FEATURE_WLAN_ESE
- && !csr_roam_is_ese_assoc(pMac, sessionId)
-#endif
- )
+ if (!pSession->ftHandoffInProgress &&
+ sme_qos_legacy_handoff_required(pMac, sessionId))
pSession->handoffRequested = true;
/* this session no longer needs UAPSD */
diff --git a/core/wma/src/wma_dev_if.c b/core/wma/src/wma_dev_if.c
index 2c6d0e91c380..5d06b0141c2d 100644
--- a/core/wma/src/wma_dev_if.c
+++ b/core/wma/src/wma_dev_if.c
@@ -690,9 +690,10 @@ QDF_STATUS wma_vdev_detach(tp_wma_handle wma_handle,
if (iface->type == WMI_VDEV_TYPE_STA)
wma_pno_stop(wma_handle, vdev_id);
- /* P2P Device */
- if ((iface->type == WMI_VDEV_TYPE_AP) &&
- (iface->sub_type == WMI_UNIFIED_VDEV_SUBTYPE_P2P_DEVICE)) {
+ if (((iface->type == WMI_VDEV_TYPE_AP) &&
+ (iface->sub_type == WMI_UNIFIED_VDEV_SUBTYPE_P2P_DEVICE)) ||
+ (iface->type == WMI_VDEV_TYPE_OCB) ||
+ (iface->type == WMI_VDEV_TYPE_MONITOR)) {
status = wma_self_peer_remove(wma_handle,
pdel_sta_self_req_param, generateRsp);
if ((status != QDF_STATUS_SUCCESS) && generateRsp) {