Merge "qcacld-3.0: Check concurrency before STA vdev start" into wlan-cld3.driver.lnx.2.0

This commit is contained in:
CNSS_WLAN Service
2019-10-18 09:09:08 -07:00
committed by Gerrit - the friendly Code Review server
3 changed files with 62 additions and 17 deletions

View File

@@ -2955,15 +2955,17 @@ bool policy_mgr_allow_sap_go_concurrency(struct wlan_objmgr_psoc *psoc,
uint32_t vdev_id); uint32_t vdev_id);
/** /**
* policy_mgr_allow_multiple_sta_connections() - API to get FW support * policy_mgr_allow_multiple_sta_connections() - check whether multiple STA
* concurrency is allowed and F/W supported
* @psoc: Pointer to soc * @psoc: Pointer to soc
* * @second_sta_chan: 2nd STA channel
* This function checks FW support for simultaneous connections on * @first_sta_chan: 2nd STA channel
* concurrent STA interfaces.
* *
* Return: true if supports else false. * Return: true if supports else false.
*/ */
bool policy_mgr_allow_multiple_sta_connections(struct wlan_objmgr_psoc *psoc); bool policy_mgr_allow_multiple_sta_connections(struct wlan_objmgr_psoc *psoc,
uint8_t second_sta_chan,
uint8_t first_sta_chan);
/** /**
* policy_mgr_dual_beacon_on_single_mac_scc_capable() - get capability that * policy_mgr_dual_beacon_on_single_mac_scc_capable() - get capability that

View File

@@ -34,6 +34,7 @@
#include "wlan_objmgr_vdev_obj.h" #include "wlan_objmgr_vdev_obj.h"
#include "wlan_nan_api.h" #include "wlan_nan_api.h"
#include "nan_public_structs.h" #include "nan_public_structs.h"
#include "wlan_reg_services_api.h"
/* invalid channel id. */ /* invalid channel id. */
#define INVALID_CHANNEL_ID 0 #define INVALID_CHANNEL_ID 0
@@ -2114,6 +2115,7 @@ bool policy_mgr_is_concurrency_allowed(struct wlan_objmgr_psoc *psoc,
uint32_t list[MAX_NUMBER_OF_CONC_CONNECTIONS]; uint32_t list[MAX_NUMBER_OF_CONC_CONNECTIONS];
struct policy_mgr_psoc_priv_obj *pm_ctx; struct policy_mgr_psoc_priv_obj *pm_ctx;
bool sta_sap_scc_on_dfs_chan; bool sta_sap_scc_on_dfs_chan;
uint8_t chan;
pm_ctx = policy_mgr_get_context(psoc); pm_ctx = policy_mgr_get_context(psoc);
if (!pm_ctx) { if (!pm_ctx) {
@@ -2186,13 +2188,17 @@ bool policy_mgr_is_concurrency_allowed(struct wlan_objmgr_psoc *psoc,
} }
} }
/* Check for STA+STA concurrency */
count = policy_mgr_mode_specific_connection_count(psoc, PM_STA_MODE, count = policy_mgr_mode_specific_connection_count(psoc, PM_STA_MODE,
list); list);
if (mode == PM_STA_MODE && count) {
/* Check for STA+STA concurrency */ if (count >= 2) {
if (mode == PM_STA_MODE && count && policy_mgr_err("3rd STA isn't permitted");
!policy_mgr_allow_multiple_sta_connections(psoc)) { goto done;
policy_mgr_err("No 2nd STA connection, already one STA is connected"); }
chan = pm_conc_connection_list[list[0]].chan;
if (!policy_mgr_allow_multiple_sta_connections(psoc, channel,
chan))
goto done; goto done;
} }
@@ -3753,7 +3759,9 @@ bool policy_mgr_allow_sap_go_concurrency(struct wlan_objmgr_psoc *psoc,
return true; return true;
} }
bool policy_mgr_allow_multiple_sta_connections(struct wlan_objmgr_psoc *psoc) bool policy_mgr_allow_multiple_sta_connections(struct wlan_objmgr_psoc *psoc,
uint8_t second_sta_chan,
uint8_t first_sta_chan)
{ {
struct wmi_unified *wmi_handle; struct wmi_unified *wmi_handle;
@@ -3762,13 +3770,17 @@ bool policy_mgr_allow_multiple_sta_connections(struct wlan_objmgr_psoc *psoc)
policy_mgr_debug("Invalid WMI handle"); policy_mgr_debug("Invalid WMI handle");
return false; return false;
} }
if (!wmi_service_enabled(wmi_handle,
if (wmi_service_enabled(wmi_handle,
wmi_service_sta_plus_sta_support)) wmi_service_sta_plus_sta_support))
return true;
policy_mgr_debug("Concurrent STA connections are not supported");
return false; return false;
if (second_sta_chan && second_sta_chan != first_sta_chan &&
wlan_reg_is_same_band_channels(second_sta_chan, first_sta_chan)) {
policy_mgr_err("STA+STA MCC isn't permitted");
return false;
}
return true;
} }
bool policy_mgr_dual_beacon_on_single_mac_scc_capable( bool policy_mgr_dual_beacon_on_single_mac_scc_capable(

View File

@@ -63,6 +63,7 @@
#include <wlan_crypto_global_api.h> #include <wlan_crypto_global_api.h>
#include "wlan_qct_sys.h" #include "wlan_qct_sys.h"
#include "wlan_blm_api.h" #include "wlan_blm_api.h"
#include "wlan_policy_mgr_i.h"
#define RSN_AUTH_KEY_MGMT_SAE WLAN_RSN_SEL(WLAN_AKM_SAE) #define RSN_AUTH_KEY_MGMT_SAE WLAN_RSN_SEL(WLAN_AKM_SAE)
#define MAX_PWR_FCC_CHAN_12 8 #define MAX_PWR_FCC_CHAN_12 8
@@ -5379,6 +5380,20 @@ static bool csr_roam_select_bss(struct mac_context *mac_ctx,
bool status = false; bool status = false;
struct tag_csrscan_result *scan_result = NULL; struct tag_csrscan_result *scan_result = NULL;
tCsrScanResultInfo *result = NULL; tCsrScanResultInfo *result = NULL;
enum QDF_OPMODE op_mode;
struct wlan_objmgr_vdev *vdev;
enum policy_mgr_con_mode mode;
vdev = wlan_objmgr_get_vdev_by_id_from_pdev(mac_ctx->pdev,
session_id,
WLAN_LEGACY_SME_ID);
if (!vdev) {
sme_err("Vdev ref error");
return true;
}
op_mode = wlan_vdev_mlme_get_opmode(vdev);
wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
while (*roam_bss_entry) { while (*roam_bss_entry) {
scan_result = GET_BASE_ADDR(*roam_bss_entry, struct scan_result = GET_BASE_ADDR(*roam_bss_entry, struct
@@ -5394,6 +5409,22 @@ static bool csr_roam_select_bss(struct mac_context *mac_ctx,
chan_id = wlan_reg_freq_to_chan( chan_id = wlan_reg_freq_to_chan(
mac_ctx->pdev, mac_ctx->pdev,
result->BssDescriptor.chan_freq); result->BssDescriptor.chan_freq);
mode = policy_mgr_convert_device_mode_to_qdf_type(op_mode);
/* If concurrency is not allowed select next bss */
if (!policy_mgr_is_concurrency_allowed(mac_ctx->psoc,
mode,
chan_id,
HW_MODE_20_MHZ)) {
sme_err("Concurrency not allowed for this channel %d bssid %pM, selecting next",
chan_id, result->BssDescriptor.bssId);
*roam_state = eCsrStopRoamingDueToConcurrency;
status = true;
*roam_bss_entry = csr_ll_next(&bss_list->List,
*roam_bss_entry,
LL_ACCESS_LOCK);
continue;
}
/* /*
* check if channel is allowed for current hw mode, if not fetch * check if channel is allowed for current hw mode, if not fetch
* next BSS. * next BSS.