Merge "qcacld-3.0: Check concurrency before STA vdev start" into wlan-cld3.driver.lnx.2.0
This commit is contained in:

committed by
Gerrit - the friendly Code Review server

commit
18afc2c7e9
@@ -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
|
||||||
|
@@ -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,14 +2188,18 @@ 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");
|
}
|
||||||
goto done;
|
chan = pm_conc_connection_list[list[0]].chan;
|
||||||
|
if (!policy_mgr_allow_multiple_sta_connections(psoc, channel,
|
||||||
|
chan))
|
||||||
|
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,
|
||||||
|
wmi_service_sta_plus_sta_support))
|
||||||
|
return false;
|
||||||
|
|
||||||
if (wmi_service_enabled(wmi_handle,
|
if (second_sta_chan && second_sta_chan != first_sta_chan &&
|
||||||
wmi_service_sta_plus_sta_support))
|
wlan_reg_is_same_band_channels(second_sta_chan, first_sta_chan)) {
|
||||||
return true;
|
policy_mgr_err("STA+STA MCC isn't permitted");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
policy_mgr_debug("Concurrent STA connections are not supported");
|
return true;
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool policy_mgr_dual_beacon_on_single_mac_scc_capable(
|
bool policy_mgr_dual_beacon_on_single_mac_scc_capable(
|
||||||
|
@@ -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.
|
||||||
|
Reference in New Issue
Block a user