diff options
| author | Linux Build Service Account <lnxbuild@localhost> | 2019-12-31 02:55:14 -0800 |
|---|---|---|
| committer | Linux Build Service Account <lnxbuild@localhost> | 2019-12-31 02:55:14 -0800 |
| commit | ace28df813c122ed15787f62135cf3a3920fe326 (patch) | |
| tree | 115332a6cb25fc3d6776ed200bc9a6a762e3d071 | |
| parent | 246a581a325f4bb948b9b0c3d3acedb4ea2bf79b (diff) | |
| parent | 01acdfec1f8eaa8bd2753a64051e589cc288778b (diff) | |
Merge 01acdfec1f8eaa8bd2753a64051e589cc288778b on remote branch
Change-Id: Ief67dfa0dc4231abcda4595b18974dc12c96123b
| -rw-r--r-- | core/hdd/inc/wlan_hdd_cfg.h | 27 | ||||
| -rw-r--r-- | core/hdd/src/wlan_hdd_cfg.c | 42 | ||||
| -rw-r--r-- | core/hdd/src/wlan_hdd_ipa.c | 42 | ||||
| -rw-r--r-- | core/hdd/src/wlan_hdd_main.c | 12 | ||||
| -rw-r--r-- | core/hdd/src/wlan_hdd_power.c | 6 | ||||
| -rw-r--r-- | core/mac/inc/ani_global.h | 4 | ||||
| -rw-r--r-- | core/mac/inc/qwlan_version.h | 4 | ||||
| -rw-r--r-- | core/mac/src/pe/lim/lim_process_sme_req_messages.c | 4 | ||||
| -rw-r--r-- | core/mac/src/pe/rrm/rrm_api.c | 35 | ||||
| -rw-r--r-- | core/mac/src/pe/sch/sch_beacon_process.c | 3 | ||||
| -rw-r--r-- | core/sme/src/csr/csr_api_roam.c | 9 | ||||
| -rw-r--r-- | core/sme/src/csr/csr_api_scan.c | 4 | ||||
| -rw-r--r-- | core/sme/src/qos/sme_qos.c | 63 | ||||
| -rw-r--r-- | core/wma/src/wma_dev_if.c | 7 |
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) { |
