Merge ac4df9eb9d on remote branch

Change-Id: Icf1e42333f5807ba79af5082b1907b6f3deacb2f
This commit is contained in:
Linux Build Service Account 2023-04-19 01:24:04 -07:00
commit dd3a8007e5
28 changed files with 1604 additions and 711 deletions

2
Kbuild
View file

@ -2615,7 +2615,6 @@ cppflags-$(CONFIG_THERMAL_STATS_SUPPORT) += -DTHERMAL_STATS_SUPPORT
cppflags-$(CONFIG_PTT_SOCK_SVC_ENABLE) += -DPTT_SOCK_SVC_ENABLE
cppflags-$(CONFIG_FEATURE_WLAN_WAPI) += -DFEATURE_WLAN_WAPI
cppflags-$(CONFIG_FEATURE_WLAN_WAPI) += -DATH_SUPPORT_WAPI
cppflags-$(CONFIG_AGEIE_ON_SCAN_RESULTS) += -DWLAN_ENABLE_AGEIE_ON_SCAN_RESULTS
cppflags-$(CONFIG_SOFTAP_CHANNEL_RANGE) += -DSOFTAP_CHANNEL_RANGE
cppflags-$(CONFIG_FEATURE_WLAN_SCAN_PNO) += -DFEATURE_WLAN_SCAN_PNO
cppflags-$(CONFIG_WLAN_FEATURE_PACKET_FILTERING) += -DWLAN_FEATURE_PACKET_FILTERING
@ -2853,6 +2852,7 @@ cppflags-y += -DCONN_MGR_ADV_FEATURE
cppflags-$(CONFIG_QCACLD_WLAN_LFR3) += -DWLAN_FEATURE_ROAM_OFFLOAD
cppflags-$(CONFIG_WLAN_FEATURE_MBSSID) += -DWLAN_FEATURE_MBSSID
cppflags-$(CONFIG_WLAN_FEATURE_P2P_P2P_STA) += -DWLAN_FEATURE_P2P_P2P_STA
ifeq (y,$(findstring y, $(CONFIG_CNSS_GENL) $(CONFIG_CNSS_GENL_MODULE)))
cppflags-y += -DCNSS_GENL

View file

@ -611,6 +611,125 @@ static inline void policy_mgr_change_sap_channel_with_csa(
}
#endif
#ifdef WLAN_FEATURE_P2P_P2P_STA
/**
* policy_mgr_is_p2p_p2p_conc_supported() - p2p concurrency support
* @psoc: pointer to psoc
*
* This API is used to check whether firmware supports p2p concurrency
*
* Return: QDF_STATUS_SUCCESS up on success and any other status for failure.
*/
bool
policy_mgr_is_p2p_p2p_conc_supported(struct wlan_objmgr_psoc *psoc);
#else
static inline bool
policy_mgr_is_p2p_p2p_conc_supported(struct wlan_objmgr_psoc *psoc)
{
return false;
}
#endif
#define GO_FORCE_SCC_DISABLE 0
#define GO_FORCE_SCC_STRICT 1
#define GO_FORCE_SCC_LIBERAL 2
#ifdef WLAN_FEATURE_P2P_P2P_STA
/**
* Stay in MCC for 1 second, in case of first p2p go channel
* needs to be moved to curr go channel
*/
#define WAIT_BEFORE_GO_FORCESCC_RESTART (1000)
/**
* policy_mgr_is_go_scc_strict() - Get GO force SCC enabled or not
* @psoc: psoc object
*
* This function checks if force SCC logic should be used on GO interface
* as a strict mode.
*
* Return: True if p2p needs o be start on provided channel only.
*/
bool policy_mgr_is_go_scc_strict(struct wlan_objmgr_psoc *psoc);
/**
* policy_mgr_check_forcescc_for_other_go() - check if another p2pgo
* is present and find vdev id.
*
* @psoc: psoc object
* @vdev: vdev id
* @freq: frequency
*
* This function checks if another p2p go is there.
*
* Return: vdev_id
*/
uint8_t
policy_mgr_check_forcescc_for_other_go(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id, uint32_t curr_go_freq);
/**
* policy_mgr_process_forcescc_for_go () - start work queue to move first p2p go
* to new p2p go's channel
*
* @psoc: PSOC object information
* @vdev_id: Vdev id
* @ch_freq: Channel frequency to change
* @ch_width: channel width to change
*
* starts delayed work queue of 1 second to move first p2p go to new
* p2p go's channel.
*
* Return: None
*/
void policy_mgr_process_forcescc_for_go(
struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
uint32_t ch_freq, uint32_t ch_width);
/**
* policy_mgr_do_go_plus_go_force_scc() - First p2p go
* to new p2p go's channel
*
* @psoc: PSOC object information
* @vdev_id: Vdev id
* @ch_freq: Channel frequency to change
* @ch_width: channel width to change
*
* Move first p2p go to new
* p2p go's channel.
*
* Return: None
*/
void policy_mgr_do_go_plus_go_force_scc(
struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
uint32_t ch_freq, uint32_t ch_width);
#else
static inline
bool policy_mgr_is_go_scc_strict(struct wlan_objmgr_psoc *psoc)
{
return false;
}
static inline
uint8_t policy_mgr_check_forcescc_for_other_go(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id,
uint32_t curr_go_freq)
{
return WLAN_UMAC_VDEV_ID_MAX;
}
static inline
void policy_mgr_process_forcescc_for_go(
struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
uint32_t ch_freq, uint32_t ch_width)
{}
static inline
void policy_mgr_do_go_plus_go_force_scc(
struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
uint32_t ch_freq, uint32_t ch_width)
{}
#endif
/**
* policy_mgr_set_pcl_for_existing_combo() - SET PCL for existing combo
* @psoc: PSOC object information
@ -3752,4 +3871,18 @@ QDF_STATUS policy_mgr_check_mon_concurrency(struct wlan_objmgr_psoc *psoc);
bool policy_mgr_is_sta_chan_valid_for_connect_and_roam(
struct wlan_objmgr_pdev *pdev,
qdf_freq_t freq);
/**
* policy_mgr_is_3rd_conn_on_same_band_allowed() - Check the third connection
* on same band allowed or not
* list for third connection
* @psoc: PSOC object information
* @mode: Device mode
*
* This function checks whether to allow third connection on same band or not
* based on pcl table
*
* Return: TRUE/FALSE
*/
bool policy_mgr_is_3rd_conn_on_same_band_allowed(struct wlan_objmgr_psoc *psoc,
enum policy_mgr_con_mode mode);
#endif /* __WLAN_POLICY_MGR_API_H */

View file

@ -1,5 +1,6 @@
/*
* Copyright (c) 2012-2020 The Linux Foundation. All rights reserved.
* Copyright (c) 2023 Qualcomm Innovation Center, Inc. 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
@ -548,12 +549,19 @@ CFG_INI_UINT("g_mark_sap_indoor_as_disable", 0, 1, 0, CFG_VALUE_OR_DEFAULT, \
* <ini>
* g_enable_go_force_scc - Enable/Disable force SCC on P2P GO
* @Min: 0
* @Max: 1
* @Max: 2
* @Default: 0
*
* This ini and along with "gWlanMccToSccSwitchMode" is used to enable
* force SCC on P2P GO interface.
*
* GO_FORCE_SCC_DISABLED (value 0): GO force scc disabled and GO can come up
* in MCC mode
* GO_FORCE_SCC_STRICT (value 1): New GO will be forced to form on existing
* GO/STA/GC channel in start bss itself.
* GO_FORCE_SCC_LIBERAL (value 2): After SET KEY is done, do force SCC for the
* first GO to move to new GO channel.
*
* Supported Feature: P2P GO
*
* Usage: External
@ -562,7 +570,7 @@ CFG_INI_UINT("g_mark_sap_indoor_as_disable", 0, 1, 0, CFG_VALUE_OR_DEFAULT, \
*/
#define CFG_P2P_GO_ENABLE_FORCE_SCC \
CFG_INI_UINT("g_enable_go_force_scc", 0, 1, 0, CFG_VALUE_OR_DEFAULT, \
CFG_INI_UINT("g_enable_go_force_scc", 0, 2, 0, CFG_VALUE_OR_DEFAULT, \
"Enable/Disable P2P GO force SCC")
/**

View file

@ -1,5 +1,6 @@
/*
* Copyright (c) 2012-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2023 Qualcomm Innovation Center, Inc. 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
@ -522,6 +523,21 @@ enum policy_mgr_one_connection_mode {
* 2x2
* @PM_P2P_GO_SAP_SBS_5_1x1: P2P GO & SAP connection on 5G SBS
* using 1x1
* @PM_P2P_GO_P2P_GO_SCC_24_1x1: P2P GO & P2P GO SCC on 2.4G using 1x1
* @PM_P2P_GO_P2P_GO_SCC_24_2x2: P2P GO & P2P GO SCC on 2.4G using 2x2
* @PM_P2P_GO_P2P_GO_MCC_24_1x1: P2P GO & P2P GO MCC on 2.4G using 1x1
* @PM_P2P_GO_P2P_GO_MCC_24_2x2: P2P GO & P2P GO MCC on 2.4G using 2x2
* @PM_P2P_GO_P2P_GO_SCC_5_1x1: P2P GO & P2P GO SCC on 5G using 1x1
* @PM_P2P_GO_P2P_GO_SCC_5_2x2: P2P GO & P2P GO SCC on 5G using 2x2
* @PM_P2P_GO_P2P_GO_MCC_5_1x1: P2P GO & P2P GO MCC on 5G using 1x1
* @PM_P2P_GO_P2P_GO_MCC_5_2x2: P2P GO & P2P GO MCC on 5G using 2x2
* @PM_P2P_GO_P2P_GO_MCC_24_5_1x1: P2P GO 2.4G & P2P GO 5G dual band MCC
* using 1x1
* @PM_P2P_GO_P2P_GO_MCC_24_5_2x2: P2P GO 2.4G & P2P GO 5G dual band MCC
* using 2x2
* @PM_P2P_GO_P2P_GO_DBS_1x1: P2P GO & P2P GO on DBS using 1x1
* @PM_P2P_GO_P2P_GO_DBS_2x2: P2P GO & P2P GO on DBS using 2x2
* @PM_P2P_GO_P2P_GO_SBS_5_1x1: P2P GO & P2P GO on SBS using 1x1
* @PM_P2P_CLI_SAP_SCC_24_1x1: CLI & SAP connection on SCC using
* 1x1@2.4 Ghz
* @PM_P2P_CLI_SAP_SCC_24_2x2: CLI & SAP connection on SCC using
@ -547,6 +563,21 @@ enum policy_mgr_one_connection_mode {
* 2x2
* @PM_P2P_CLI_SAP_SBS_5_1x1: P2P CLI & SAP connection on 5G SBS
* using 1x1
* @PM_P2P_CLI_P2P_CLI_SCC_24_1x1: P2P CLI & P2P CLI SCC on 2.4G using 1x1
* @PM_P2P_CLI_P2P_CLI_SCC_24_2x2: P2P CLI & P2P CLI SCC on 2.4G using 2x2
* @PM_P2P_CLI_P2P_CLI_MCC_24_1x1: P2P CLI & P2P CLI MCC on 2.4G using 1x1
* @PM_P2P_CLI_P2P_CLI_MCC_24_2x2: P2P CLI & P2P CLI MCC on 2.4G using 2x2
* @PM_P2P_CLI_P2P_CLI_SCC_5_1x1: P2P CLI & P2P CLI SCC on 5G using 1x1
* @PM_P2P_CLI_P2P_CLI_SCC_5_2x2: P2P CLI & P2P CLI SCC on 5G using 2x2
* @PM_P2P_CLI_P2P_CLI_MCC_5_1x1: P2P CLI & P2P CLI MCC on 5G using 1x1
* @PM_P2P_CLI_P2P_CLI_MCC_5_2x2: P2P CLI & P2P CLI MCC on 5G using 2x2
* @PM_P2P_CLI_P2P_CLI_MCC_24_5_1x1: P2P CLI 2.4G & P2P CLI 5G dual band MCC
* using 1x1
* @PM_P2P_CLI_P2P_CLI_MCC_24_5_2x2: P2P CLI 2.4G & P2P CLI 5G dual band MCC
* using 2x2
* @PM_P2P_CLI_P2P_CLI_DBS_1x1: P2P CLI & P2P CLI on DBS using 1x1
* @PM_P2P_CLI_P2P_CLI_DBS_2x2: P2P CLI & P2P CLI on DBS using 2x2
* @PM_P2P_CLI_P2P_CLI_SBS_5_1x1: P2P CLI & P2P CLI on SBS using 1x1
* @PM_SAP_SAP_SCC_24_1x1: SAP & SAP connection on
* SCC using 1x1@2.4 Ghz
* @PM_SAP_SAP_SCC_24_2x2: SAP & SAP connection on
@ -617,21 +648,6 @@ enum policy_mgr_one_connection_mode {
* @PM_NAN_DISC_NDI_MCC_24_2x2: NAN & NDI connection on MCC using 2x2 on 2.4 GHz
* @PM_NAN_DISC_NDI_DBS_1x1: NAN & NDI connection on DBS using 1x1
* @PM_NAN_DISC_NDI_DBS_2x2: NAN & NDI connection on DBS using 2x2
* @PM_P2P_GO_P2P_GO_SCC_24_1x1: P2P GO & P2P GO SCC on 2.4G using 1x1
* @PM_P2P_GO_P2P_GO_SCC_24_2x2: P2P GO & P2P GO SCC on 2.4G using 2x2
* @PM_P2P_GO_P2P_GO_MCC_24_1x1: P2P GO & P2P GO MCC on 2.4G using 1x1
* @PM_P2P_GO_P2P_GO_MCC_24_2x2: P2P GO & P2P GO MCC on 2.4G using 2x2
* @PM_P2P_GO_P2P_GO_SCC_5_1x1: P2P GO & P2P GO SCC on 5G using 1x1
* @PM_P2P_GO_P2P_GO_SCC_5_2x2: P2P GO & P2P GO SCC on 5G using 2x2
* @PM_P2P_GO_P2P_GO_MCC_5_1x1: P2P GO & P2P GO MCC on 5G using 1x1
* @PM_P2P_GO_P2P_GO_MCC_5_2x2: P2P GO & P2P GO MCC on 5G using 2x2
* @PM_P2P_GO_P2P_GO_MCC_24_5_1x1: P2P GO 2.4G & P2P GO 5G dual band MCC
* using 1x1
* @PM_P2P_GO_P2P_GO_MCC_24_5_2x2: P2P GO 2.4G & P2P GO 5G dual band MCC
* using 2x2
* @PM_P2P_GO_P2P_GO_DBS_1x1: P2P GO & P2P GO on DBS using 1x1
* @PM_P2P_GO_P2P_GO_DBS_2x2: P2P GO & P2P GO on DBS using 2x2
* @PM_P2P_GO_P2P_GO_SBS_5_1x1: P2P GO & P2P GO on SBS using 1x1
*
* These are generic IDs that identify the various roles in the
* software system
@ -702,6 +718,21 @@ enum policy_mgr_two_connection_mode {
PM_P2P_GO_SAP_DBS_1x1,
PM_P2P_GO_SAP_DBS_2x2,
PM_P2P_GO_SAP_SBS_5_1x1,
PM_P2P_GO_SAP_SBS_5_2x2 = PM_P2P_GO_SAP_SBS_5_1x1,
PM_P2P_GO_P2P_GO_SCC_24_1x1,
PM_P2P_GO_P2P_GO_SCC_24_2x2,
PM_P2P_GO_P2P_GO_MCC_24_1x1,
PM_P2P_GO_P2P_GO_MCC_24_2x2,
PM_P2P_GO_P2P_GO_SCC_5_1x1,
PM_P2P_GO_P2P_GO_SCC_5_2x2,
PM_P2P_GO_P2P_GO_MCC_5_1x1,
PM_P2P_GO_P2P_GO_MCC_5_2x2,
PM_P2P_GO_P2P_GO_MCC_24_5_1x1,
PM_P2P_GO_P2P_GO_MCC_24_5_2x2,
PM_P2P_GO_P2P_GO_DBS_1x1,
PM_P2P_GO_P2P_GO_DBS_2x2,
PM_P2P_GO_P2P_GO_SBS_5_1x1,
PM_P2P_GO_P2P_GO_SBS_5_2x2 = PM_P2P_GO_P2P_GO_SBS_5_1x1,
PM_P2P_CLI_SAP_SCC_24_1x1,
PM_P2P_CLI_SAP_SCC_24_2x2,
PM_P2P_CLI_SAP_MCC_24_1x1,
@ -715,6 +746,21 @@ enum policy_mgr_two_connection_mode {
PM_P2P_CLI_SAP_DBS_1x1,
PM_P2P_CLI_SAP_DBS_2x2,
PM_P2P_CLI_SAP_SBS_5_1x1,
PM_P2P_CLI_SAP_SBS_5_2x2 = PM_P2P_CLI_SAP_SBS_5_1x1,
PM_P2P_CLI_P2P_CLI_SCC_24_1x1,
PM_P2P_CLI_P2P_CLI_SCC_24_2x2,
PM_P2P_CLI_P2P_CLI_MCC_24_1x1,
PM_P2P_CLI_P2P_CLI_MCC_24_2x2,
PM_P2P_CLI_P2P_CLI_SCC_5_1x1,
PM_P2P_CLI_P2P_CLI_SCC_5_2x2,
PM_P2P_CLI_P2P_CLI_MCC_5_1x1,
PM_P2P_CLI_P2P_CLI_MCC_5_2x2,
PM_P2P_CLI_P2P_CLI_MCC_24_5_1x1,
PM_P2P_CLI_P2P_CLI_MCC_24_5_2x2,
PM_P2P_CLI_P2P_CLI_DBS_1x1,
PM_P2P_CLI_P2P_CLI_DBS_2x2,
PM_P2P_CLI_P2P_CLI_SBS_5_1x1,
PM_P2P_CLI_P2P_CLI_SBS_5_2x2 = PM_P2P_CLI_P2P_CLI_SBS_5_1x1,
PM_SAP_SAP_SCC_24_1x1,
PM_SAP_SAP_SCC_24_2x2,
PM_SAP_SAP_MCC_24_1x1,
@ -759,19 +805,6 @@ enum policy_mgr_two_connection_mode {
PM_NAN_DISC_NDI_MCC_24_2x2,
PM_NAN_DISC_NDI_DBS_1x1,
PM_NAN_DISC_NDI_DBS_2x2,
PM_P2P_GO_P2P_GO_SCC_24_1x1,
PM_P2P_GO_P2P_GO_SCC_24_2x2,
PM_P2P_GO_P2P_GO_MCC_24_1x1,
PM_P2P_GO_P2P_GO_MCC_24_2x2,
PM_P2P_GO_P2P_GO_SCC_5_1x1,
PM_P2P_GO_P2P_GO_SCC_5_2x2,
PM_P2P_GO_P2P_GO_MCC_5_1x1,
PM_P2P_GO_P2P_GO_MCC_5_2x2,
PM_P2P_GO_P2P_GO_MCC_24_5_1x1,
PM_P2P_GO_P2P_GO_MCC_24_5_2x2,
PM_P2P_GO_P2P_GO_DBS_1x1,
PM_P2P_GO_P2P_GO_DBS_2x2,
PM_P2P_GO_P2P_GO_SBS_5_1x1,
PM_MAX_TWO_CONNECTION_MODE
};
@ -1284,12 +1317,30 @@ struct connection_info {
uint32_t ch_freq;
};
/**
* struct go_plus_go_force_scc - structure to hold p2p go
* params for forcescc restart
*
* @vdev_id: vdev id of first p2p go which needs to do csa
* @ch_freq: ch freq of curr p2p go
* @ch_width: ch width of curr p2p go
*/
struct go_plus_go_force_scc {
uint8_t vdev_id;
uint32_t ch_freq;
uint32_t ch_width;
};
/**
* struct sta_ap_intf_check_work_ctx - sta_ap_intf_check_work
* related info
* @psoc: pointer to PSOC object information
* @go_plus_go_force_scc: structure to hold params of
* curr and first p2p go ctx
*/
struct sta_ap_intf_check_work_ctx {
struct wlan_objmgr_psoc *psoc;
struct go_plus_go_force_scc go_plus_go_force_scc;
};
#endif /* __WLAN_POLICY_MGR_PUBLIC_STRUCT_H */

View file

@ -1,5 +1,6 @@
/*
* Copyright (c) 2012-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2023 Qualcomm Innovation Center, Inc. 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
@ -1974,53 +1975,55 @@ end:
pm_ctx->do_sap_unsafe_ch_check = false;
}
static void __policy_mgr_check_sta_ap_concurrent_ch_intf(void *data)
static void __policy_mgr_check_sta_ap_concurrent_ch_intf(
struct policy_mgr_psoc_priv_obj *pm_ctx)
{
struct wlan_objmgr_psoc *psoc;
struct policy_mgr_psoc_priv_obj *pm_ctx = NULL;
struct sta_ap_intf_check_work_ctx *work_info = NULL;
uint32_t mcc_to_scc_switch, cc_count = 0, i;
QDF_STATUS status;
uint32_t ch_freq;
uint32_t op_ch_freq_list[MAX_NUMBER_OF_CONC_CONNECTIONS];
uint8_t vdev_id[MAX_NUMBER_OF_CONC_CONNECTIONS];
work_info = data;
if (!work_info) {
policy_mgr_err("Invalid work_info");
return;
}
psoc = work_info->psoc;
if (!psoc) {
policy_mgr_err("Invalid psoc");
return;
}
pm_ctx = policy_mgr_get_context(psoc);
if (!pm_ctx) {
policy_mgr_err("Invalid context");
return;
}
/*
* Check if force scc is required for GO + GO case. vdev id will be
* valid in case of GO+GO force scc only. So, for valid vdev id move
* first GO to newly formed GO channel.
*/
policy_mgr_debug("p2p go vdev id: %d",
pm_ctx->sta_ap_intf_check_work_info->go_plus_go_force_scc.vdev_id);
if (pm_ctx->sta_ap_intf_check_work_info->go_plus_go_force_scc.vdev_id <
WLAN_UMAC_VDEV_ID_MAX) {
policy_mgr_do_go_plus_go_force_scc(
pm_ctx->psoc, pm_ctx->sta_ap_intf_check_work_info->go_plus_go_force_scc.vdev_id,
pm_ctx->sta_ap_intf_check_work_info->go_plus_go_force_scc.ch_freq,
pm_ctx->sta_ap_intf_check_work_info->go_plus_go_force_scc.ch_width);
pm_ctx->sta_ap_intf_check_work_info->go_plus_go_force_scc.vdev_id = WLAN_UMAC_VDEV_ID_MAX;
return;
}
mcc_to_scc_switch =
policy_mgr_get_mcc_to_scc_switch_mode(psoc);
policy_mgr_get_mcc_to_scc_switch_mode(pm_ctx->psoc);
policy_mgr_debug("Concurrent open sessions running: %d",
policy_mgr_concurrent_open_sessions_running(psoc));
policy_mgr_concurrent_open_sessions_running(
pm_ctx->psoc));
if (!policy_mgr_is_sap_go_existed(psoc))
if (!policy_mgr_is_sap_go_existed(pm_ctx->psoc))
goto end;
cc_count = policy_mgr_get_mode_specific_conn_info(
psoc, &op_ch_freq_list[cc_count],
pm_ctx->psoc, &op_ch_freq_list[cc_count],
&vdev_id[cc_count], PM_SAP_MODE);
policy_mgr_debug("Number of concurrent SAP: %d", cc_count);
if (cc_count < MAX_NUMBER_OF_CONC_CONNECTIONS)
cc_count = cc_count +
policy_mgr_get_mode_specific_conn_info(
psoc, &op_ch_freq_list[cc_count],
&vdev_id[cc_count], PM_P2P_GO_MODE);
policy_mgr_get_mode_specific_conn_info(
pm_ctx->psoc, &op_ch_freq_list[cc_count],
&vdev_id[cc_count], PM_P2P_GO_MODE);
policy_mgr_debug("Number of beaconing entities (SAP + GO):%d",
cc_count);
if (!cc_count) {
@ -2046,7 +2049,7 @@ static void __policy_mgr_check_sta_ap_concurrent_ch_intf(void *data)
for (i = 0; i < cc_count; i++) {
status = pm_ctx->hdd_cbacks.
wlan_hdd_get_channel_for_sap_restart
(psoc, vdev_id[i], &ch_freq);
(pm_ctx->psoc, vdev_id[i], &ch_freq);
if (status == QDF_STATUS_SUCCESS) {
policy_mgr_debug("SAP vdev id %d restarts due to MCC->SCC switch, old ch freq :%d new ch freq: %d",
vdev_id[i],
@ -2511,6 +2514,56 @@ void policy_mgr_change_sap_channel_with_csa(struct wlan_objmgr_psoc *psoc,
}
#endif
#ifdef WLAN_FEATURE_P2P_P2P_STA
void policy_mgr_do_go_plus_go_force_scc(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id, uint32_t ch_freq,
uint32_t ch_width)
{
uint8_t total_connection;
total_connection = policy_mgr_mode_specific_connection_count(
psoc, PM_P2P_GO_MODE, NULL);
policy_mgr_debug("Total p2p go connection %d", total_connection);
/* If any p2p disconnected, don't do csa */
if (total_connection > 1) {
policy_mgr_change_sap_channel_with_csa(psoc, vdev_id,
ch_freq, ch_width, true);
}
}
void policy_mgr_process_forcescc_for_go(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id, uint32_t ch_freq,
uint32_t ch_width)
{
struct policy_mgr_psoc_priv_obj *pm_ctx;
pm_ctx = policy_mgr_get_context(psoc);
if (!pm_ctx) {
policy_mgr_err("Invalid Context");
return;
}
if (!pm_ctx->sta_ap_intf_check_work_info) {
policy_mgr_err("invalid work info");
return;
}
pm_ctx->sta_ap_intf_check_work_info->go_plus_go_force_scc.vdev_id =
vdev_id;
pm_ctx->sta_ap_intf_check_work_info->go_plus_go_force_scc.ch_freq =
ch_freq;
pm_ctx->sta_ap_intf_check_work_info->go_plus_go_force_scc.ch_width =
ch_width;
if (!qdf_delayed_work_start(&pm_ctx->sta_ap_intf_check_work,
WAIT_BEFORE_GO_FORCESCC_RESTART)) {
policy_mgr_err("change interface request failure");
pm_ctx->sta_ap_intf_check_work_info->go_plus_go_force_scc.vdev_id =
WLAN_UMAC_VDEV_ID_MAX;
}
}
#endif
QDF_STATUS policy_mgr_wait_for_connection_update(struct wlan_objmgr_psoc *psoc)
{
QDF_STATUS status;

File diff suppressed because it is too large Load diff

View file

@ -2616,6 +2616,13 @@ static bool policy_mgr_is_6g_channel_allowed(
return true;
}
#ifdef WLAN_FEATURE_P2P_P2P_STA
bool policy_mgr_is_p2p_p2p_conc_supported(struct wlan_objmgr_psoc *psoc)
{
return wlan_mlme_get_p2p_p2p_conc_support(psoc);
}
#endif
bool policy_mgr_is_concurrency_allowed(struct wlan_objmgr_psoc *psoc,
enum policy_mgr_con_mode mode,
uint32_t ch_freq,
@ -2641,15 +2648,14 @@ bool policy_mgr_is_concurrency_allowed(struct wlan_objmgr_psoc *psoc,
if (num_connections && policy_mgr_is_sub_20_mhz_enabled(psoc)) {
policy_mgr_rl_debug("dont allow concurrency if Sub 20 MHz is enabled");
status = false;
goto done;
return status;
}
if (policy_mgr_max_concurrent_connections_reached(psoc)) {
policy_mgr_rl_debug("Reached max concurrent connections: %d",
pm_ctx->cfg.max_conc_cxns);
policy_mgr_validate_conn_info(psoc);
goto done;
return status;
}
if (ch_freq) {
@ -2668,7 +2674,7 @@ bool policy_mgr_is_concurrency_allowed(struct wlan_objmgr_psoc *psoc,
if (!policy_mgr_allow_new_home_channel(psoc, mode, ch_freq,
num_connections,
is_dfs_ch))
goto done;
return status;
/*
* 1) DFS MCC is not yet supported
@ -2685,13 +2691,13 @@ bool policy_mgr_is_concurrency_allowed(struct wlan_objmgr_psoc *psoc,
*/
if (!policy_mgr_is_5g_channel_allowed(psoc,
ch_freq, list, PM_P2P_GO_MODE))
goto done;
return status;
if (!policy_mgr_is_5g_channel_allowed(psoc,
ch_freq, list, PM_SAP_MODE))
goto done;
return status;
if (!policy_mgr_is_6g_channel_allowed(psoc, mode,
ch_freq))
goto done;
return status;
sta_sap_scc_on_dfs_chan =
policy_mgr_is_sta_sap_scc_allowed_on_dfs_chan(psoc);
@ -2706,14 +2712,14 @@ bool policy_mgr_is_concurrency_allowed(struct wlan_objmgr_psoc *psoc,
}
if (true == match) {
policy_mgr_rl_debug("No MCC, SAP/GO about to come up on DFS channel");
goto done;
return status;
}
if ((policy_mgr_is_hw_dbs_capable(psoc) != true) &&
num_connections) {
if (WLAN_REG_IS_24GHZ_CH_FREQ(ch_freq)) {
if (policy_mgr_is_sap_p2pgo_on_dfs(psoc)) {
policy_mgr_rl_debug("MCC not allowed: SAP/P2PGO on DFS");
goto done;
return status;
}
}
}
@ -2725,21 +2731,26 @@ bool policy_mgr_is_concurrency_allowed(struct wlan_objmgr_psoc *psoc,
if (mode == PM_STA_MODE && count) {
if (count >= 2) {
policy_mgr_rl_debug("3rd STA isn't permitted");
goto done;
return status;
}
sta_freq = pm_conc_connection_list[list[0]].freq;
if (!policy_mgr_allow_multiple_sta_connections(psoc, ch_freq,
sta_freq))
goto done;
return status;
}
if (!policy_mgr_allow_sap_go_concurrency(psoc, mode, ch_freq,
WLAN_INVALID_VDEV_ID)) {
policy_mgr_rl_debug("This concurrency combination is not allowed");
goto done;
return status;
}
/* don't allow two P2P GO on same band */
if (ch_freq && mode == PM_P2P_GO_MODE && num_connections) {
/*
* don't allow two P2P GO on same band, if fw doesn't
* support p2p +p2p concurrency
*/
if (ch_freq && mode == PM_P2P_GO_MODE && num_connections &&
!policy_mgr_is_p2p_p2p_conc_supported(psoc)) {
index = 0;
count = policy_mgr_mode_specific_connection_count(
psoc, PM_P2P_GO_MODE, list);
@ -2750,7 +2761,7 @@ bool policy_mgr_is_concurrency_allowed(struct wlan_objmgr_psoc *psoc,
pm_conc_connection_list[list[index]].freq)) {
policy_mgr_rl_debug("Don't allow P2P GO on same band");
qdf_mutex_release(&pm_ctx->qdf_conc_list_lock);
goto done;
return status;
}
index++;
}
@ -2759,12 +2770,11 @@ bool policy_mgr_is_concurrency_allowed(struct wlan_objmgr_psoc *psoc,
if (!policy_mgr_allow_wapi_concurrency(pm_ctx)) {
policy_mgr_rl_debug("Don't allow new conn when wapi security conn existing");
goto done;
return status;
}
status = true;
done:
return status;
}
@ -4307,8 +4317,6 @@ bool policy_mgr_allow_sap_go_concurrency(struct wlan_objmgr_psoc *psoc,
if (mode != PM_SAP_MODE && mode != PM_P2P_GO_MODE)
return true;
if (policy_mgr_dual_beacon_on_single_mac_mcc_capable(psoc))
return true;
dbs = policy_mgr_is_hw_dbs_capable(psoc);
for (id = 0; id < MAX_NUMBER_OF_CONC_CONNECTIONS; id++) {
if (!pm_conc_connection_list[id].in_use)
@ -4320,6 +4328,18 @@ bool policy_mgr_allow_sap_go_concurrency(struct wlan_objmgr_psoc *psoc,
if (con_mode != PM_SAP_MODE && con_mode != PM_P2P_GO_MODE)
continue;
con_freq = pm_conc_connection_list[id].freq;
if (policy_mgr_is_p2p_p2p_conc_supported(psoc) &&
(mode == PM_P2P_GO_MODE) && (con_mode == PM_P2P_GO_MODE)) {
policy_mgr_debug("GO+GO scc is allowed freq = %d ",
ch_freq);
return true;
}
if (policy_mgr_dual_beacon_on_single_mac_mcc_capable(psoc) &&
(mode == PM_SAP_MODE) && (con_mode == PM_SAP_MODE))
return true;
if (policy_mgr_dual_beacon_on_single_mac_scc_capable(psoc) &&
(ch_freq == con_freq)) {
policy_mgr_debug("SCC enabled, 2 AP on same channel, allow 2nd AP");
@ -4608,6 +4628,63 @@ bool policy_mgr_go_scc_enforced(struct wlan_objmgr_psoc *psoc)
return false;
}
#ifdef WLAN_FEATURE_P2P_P2P_STA
uint8_t
policy_mgr_check_forcescc_for_other_go(struct wlan_objmgr_psoc *psoc,
uint8_t vdev_id, uint32_t freq)
{
struct policy_mgr_psoc_priv_obj *pm_ctx;
uint32_t conn_index;
pm_ctx = policy_mgr_get_context(psoc);
if (!pm_ctx) {
policy_mgr_err("Invalid Context");
return WLAN_UMAC_VDEV_ID_MAX;
}
qdf_mutex_acquire(&pm_ctx->qdf_conc_list_lock);
for (conn_index = 0; conn_index < MAX_NUMBER_OF_CONC_CONNECTIONS;
conn_index++) {
if (pm_conc_connection_list[conn_index].mode ==
PM_P2P_GO_MODE &&
pm_conc_connection_list[conn_index].in_use &&
wlan_reg_is_same_band_freqs(
freq,
pm_conc_connection_list[conn_index].freq) &&
freq != pm_conc_connection_list[conn_index].freq &&
vdev_id != pm_conc_connection_list[conn_index].vdev_id) {
qdf_mutex_release(&pm_ctx->qdf_conc_list_lock);
policy_mgr_debug(
"Existing p2p go vdev_id is %d",
pm_conc_connection_list[conn_index].vdev_id);
return pm_conc_connection_list[conn_index].vdev_id;
}
}
qdf_mutex_release(&pm_ctx->qdf_conc_list_lock);
return WLAN_UMAC_VDEV_ID_MAX;
}
bool policy_mgr_is_go_scc_strict(struct wlan_objmgr_psoc *psoc)
{
struct policy_mgr_psoc_priv_obj *pm_ctx;
bool ret = false;
pm_ctx = policy_mgr_get_context(psoc);
if (!pm_ctx) {
ret = false;
goto return_val;
}
if (pm_ctx->cfg.go_force_scc & GO_FORCE_SCC_STRICT) {
ret = true;
goto return_val;
}
ret = false;
return_val:
policy_mgr_debug("ret val is %d", ret);
return ret;
}
#endif
QDF_STATUS policy_mgr_update_nan_vdev_mac_info(struct wlan_objmgr_psoc *psoc,
uint8_t nan_vdev_id,
uint8_t mac_id)

View file

@ -571,11 +571,32 @@ void pm_dbs_opportunistic_timer_handler(void *data);
enum policy_mgr_con_mode policy_mgr_get_mode(uint8_t type,
uint8_t subtype);
/**
* policy_mgr_get_bw() - Convert phy_ch_width to hw_mode_bandwidth.
* @chan_width: phy_ch_width
*
* Return: hw_mode_bandwidth
*/
enum hw_mode_bandwidth policy_mgr_get_bw(enum phy_ch_width chan_width);
/**
* policy_mgr_get_channel_list() - Get channel list based on PCL and mode
* @psoc: psoc object
* @pcl: pcl type
* @mode: interface mode
* @pcl_channels: pcl channel list buffer
* @pcl_weights: pcl weight buffer
* @pcl_sz: pcl channel list buffer size
* @len: pcl channel number returned from API
*
* Return: QDF_STATUS
*/
QDF_STATUS policy_mgr_get_channel_list(struct wlan_objmgr_psoc *psoc,
enum policy_mgr_pcl_type pcl,
uint32_t *pcl_channels, uint32_t *len,
enum policy_mgr_con_mode mode,
uint8_t *pcl_weights, uint32_t weight_len);
enum policy_mgr_pcl_type pcl,
enum policy_mgr_con_mode mode,
uint32_t *pcl_channels,
uint8_t *pcl_weights,
uint32_t pcl_sz, uint32_t *len);
/**
* policy_mgr_allow_new_home_channel() - Check for allowed number of

View file

@ -1,6 +1,6 @@
/*
* Copyright (c) 2012-2020 The Linux Foundation. All rights reserved.
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. 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
@ -339,6 +339,8 @@ QDF_STATUS policy_mgr_psoc_open(struct wlan_objmgr_psoc *psoc)
return QDF_STATUS_E_FAILURE;
}
pm_ctx->sta_ap_intf_check_work_info->psoc = psoc;
pm_ctx->sta_ap_intf_check_work_info->go_plus_go_force_scc.vdev_id =
WLAN_UMAC_VDEV_ID_MAX;
if (QDF_IS_STATUS_ERROR(qdf_delayed_work_create(
&pm_ctx->sta_ap_intf_check_work,
policy_mgr_check_sta_ap_concurrent_ch_intf,

View file

@ -1,6 +1,6 @@
/*
* Copyright (c) 2012-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. 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
@ -1022,8 +1022,8 @@ QDF_STATUS policy_mgr_get_pcl(struct wlan_objmgr_psoc *psoc,
/* once the PCL enum is obtained find out the exact channel list with
* help from sme_get_cfg_valid_channels
*/
status = policy_mgr_get_channel_list(psoc, pcl, pcl_channels, len, mode,
pcl_weight, weight_len);
status = policy_mgr_get_channel_list(psoc, pcl, mode, pcl_channels,
pcl_weight, weight_len, len);
if (QDF_IS_STATUS_ERROR(status)) {
policy_mgr_err("failed to get channel list:%d", status);
return status;
@ -1729,58 +1729,128 @@ static enum policy_mgr_two_connection_mode
return index;
}
/*
* policy_mgr_check_and_get_third_connection_pcl_table_index_for_scc() -
* This function checks connection mode is in scc or not and returns
* index value based on mode and prvided index inputs.
*
* @scc_2g_1x1: index of scc_2g_1x1 for provided concurrency
* @scc_2g_2x2: index of scc_2g_2x2 for provided concurrency
* @scc_5g_1x1: index of scc_5g_1x1 for provided concurrency
* @scc_5g_2x2: index of scc_5g_2x2 for provided concurrency
*
* Return: policy_mgr_two_connection_mode index
*/
static enum policy_mgr_two_connection_mode
policy_mgr_get_third_connection_pcl_table_index_go_go(void)
policy_mgr_check_and_get_third_connection_pcl_table_index_for_scc(
enum policy_mgr_two_connection_mode scc_2g_1x1,
enum policy_mgr_two_connection_mode scc_2g_2x2,
enum policy_mgr_two_connection_mode scc_5g_1x1,
enum policy_mgr_two_connection_mode scc_5g_2x2)
{
enum policy_mgr_two_connection_mode index = PM_MAX_TWO_CONNECTION_MODE;
/* SCC */
if (pm_conc_connection_list[0].freq ==
pm_conc_connection_list[1].freq) {
pm_conc_connection_list[1].freq) {
if (WLAN_REG_IS_24GHZ_CH_FREQ(
pm_conc_connection_list[0].freq)) {
pm_conc_connection_list[0].freq)) {
if (POLICY_MGR_ONE_ONE ==
pm_conc_connection_list[0].chain_mask)
index = PM_P2P_GO_P2P_GO_SCC_24_1x1;
pm_conc_connection_list[0].chain_mask)
index = scc_2g_1x1;
else
index = PM_P2P_GO_P2P_GO_SCC_24_2x2;
index = scc_2g_2x2;
} else {
if (POLICY_MGR_ONE_ONE ==
pm_conc_connection_list[0].chain_mask)
index = PM_P2P_GO_P2P_GO_SCC_5_1x1;
index = scc_5g_1x1;
else
index = PM_P2P_GO_P2P_GO_SCC_5_2x2;
index = scc_5g_2x2;
}
/* MCC */
} else if (pm_conc_connection_list[0].mac ==
pm_conc_connection_list[1].mac) {
}
return index;
}
/*
* policy_mgr_check_and_get_third_connection_pcl_table_index_for_mcc() -
* This function checks connection mode is in mcc or not and returns
* index value based on mode and prvided index inputs.
*
* @mcc_2g_1x1: index of mcc_2g_1x1 for provided concurrency
* @mcc_2g_2x2: index of mcc_2g_2x2 for provided concurrency
* @mcc_5g_1x1: index of mcc_5g_1x1 for provided concurrency
* @mcc_5g_2x2: index of mcc_5g_2x2 for provided concurrency
* @mcc_24_5_1x1: index of mcc_24_5_1x1 for provided concurrency
* @mcc_24_5_2x2: index of mcc_24_5_2x2 for provided concurrency
*
* Return: policy_mgr_two_connection_mode index
*/
static enum policy_mgr_two_connection_mode
policy_mgr_check_and_get_third_connection_pcl_table_index_for_mcc(
enum policy_mgr_two_connection_mode mcc_2g_1x1,
enum policy_mgr_two_connection_mode mcc_2g_2x2,
enum policy_mgr_two_connection_mode mcc_5g_1x1,
enum policy_mgr_two_connection_mode mcc_5g_2x2,
enum policy_mgr_two_connection_mode mcc_24_5_1x1,
enum policy_mgr_two_connection_mode mcc_24_5_2x2)
{
enum policy_mgr_two_connection_mode index = PM_MAX_TWO_CONNECTION_MODE;
if (pm_conc_connection_list[0].mac == pm_conc_connection_list[1].mac) {
if ((WLAN_REG_IS_24GHZ_CH_FREQ(
pm_conc_connection_list[0].freq)) &&
(WLAN_REG_IS_24GHZ_CH_FREQ(
pm_conc_connection_list[1].freq))) {
pm_conc_connection_list[0].freq)) &&
(WLAN_REG_IS_24GHZ_CH_FREQ(
pm_conc_connection_list[1].freq))) {
if (POLICY_MGR_ONE_ONE ==
pm_conc_connection_list[0].chain_mask)
index = PM_P2P_GO_P2P_GO_MCC_24_1x1;
pm_conc_connection_list[0].chain_mask)
index = mcc_2g_1x1;
else
index = PM_P2P_GO_P2P_GO_MCC_24_2x2;
index = mcc_2g_2x2;
} else if ((WLAN_REG_IS_5GHZ_CH_FREQ(
pm_conc_connection_list[0].freq)) &&
(WLAN_REG_IS_5GHZ_CH_FREQ(
pm_conc_connection_list[1].freq))) {
} else if (!(WLAN_REG_IS_24GHZ_CH_FREQ(
pm_conc_connection_list[0].freq)) &&
!(WLAN_REG_IS_24GHZ_CH_FREQ(
pm_conc_connection_list[1].freq))) {
if (POLICY_MGR_ONE_ONE ==
pm_conc_connection_list[0].chain_mask)
index = PM_P2P_GO_P2P_GO_MCC_5_1x1;
pm_conc_connection_list[0].chain_mask)
index = mcc_5g_1x1;
else
index = PM_P2P_GO_P2P_GO_MCC_5_2x2;
index = mcc_5g_2x2;
} else {
if (POLICY_MGR_ONE_ONE ==
pm_conc_connection_list[0].chain_mask)
index = PM_P2P_GO_P2P_GO_MCC_24_5_1x1;
index = mcc_24_5_1x1;
else
index = PM_P2P_GO_P2P_GO_MCC_24_5_2x2;
index = mcc_24_5_2x2;
}
/* SBS or DBS */
} else if (pm_conc_connection_list[0].mac !=
pm_conc_connection_list[1].mac) {
}
return index;
}
/*
* policy_mgr_check_and_get_third_connection_pcl_table_index_for_dbs() -
* This function checks connection mode is in dbs or sbs and returns index
* value based on mode and prvided index inputs.
*
* @sbs_5g_1x1: index of sbs_5g_1x1 for provided concurrency
* @sbs_5g_2x2: index of sbs_5g_2x2 for provided concurrency
* @dbs_1x1: index of dbs_1x1 for provided concurrency
* @dbs_2x2: index of dbs_2x2 for provided concurrency
*
* Return: policy_mgr_two_connection_mode index
*/
static enum policy_mgr_two_connection_mode
policy_mgr_check_and_get_third_connection_pcl_table_index_for_dbs(
enum policy_mgr_two_connection_mode sbs_5g_1x1,
enum policy_mgr_two_connection_mode sbs_5g_2x2,
enum policy_mgr_two_connection_mode dbs_1x1,
enum policy_mgr_two_connection_mode dbs_2x2)
{
enum policy_mgr_two_connection_mode index = PM_MAX_TWO_CONNECTION_MODE;
if (pm_conc_connection_list[0].mac != pm_conc_connection_list[1].mac) {
/* SBS */
if ((WLAN_REG_IS_5GHZ_CH_FREQ(
pm_conc_connection_list[0].freq)) &&
@ -1788,16 +1858,89 @@ static enum policy_mgr_two_connection_mode
pm_conc_connection_list[1].freq))) {
if (POLICY_MGR_ONE_ONE ==
pm_conc_connection_list[0].chain_mask)
index = PM_P2P_GO_P2P_GO_SBS_5_1x1;
index = sbs_5g_1x1;
else
index = sbs_5g_2x2;
} else {
/* DBS */
if (POLICY_MGR_ONE_ONE ==
pm_conc_connection_list[0].chain_mask)
index = PM_P2P_GO_P2P_GO_DBS_1x1;
index = dbs_1x1;
else
index = PM_P2P_GO_P2P_GO_DBS_2x2;
index = dbs_2x2;
}
}
return index;
}
static enum policy_mgr_two_connection_mode
policy_mgr_get_third_connection_pcl_table_index_cli_cli(void)
{
enum policy_mgr_two_connection_mode index;
index =
policy_mgr_check_and_get_third_connection_pcl_table_index_for_scc(
PM_P2P_CLI_P2P_CLI_SCC_24_1x1,
PM_P2P_CLI_P2P_CLI_SCC_24_2x2,
PM_P2P_CLI_P2P_CLI_SCC_5_1x1,
PM_P2P_CLI_P2P_CLI_SCC_5_2x2);
if (index != PM_MAX_TWO_CONNECTION_MODE)
return index;
index =
policy_mgr_check_and_get_third_connection_pcl_table_index_for_mcc(
PM_P2P_CLI_P2P_CLI_MCC_24_1x1,
PM_P2P_CLI_P2P_CLI_MCC_24_2x2,
PM_P2P_CLI_P2P_CLI_MCC_5_1x1,
PM_P2P_CLI_P2P_CLI_MCC_5_2x2,
PM_P2P_CLI_P2P_CLI_MCC_24_5_1x1,
PM_P2P_CLI_P2P_CLI_MCC_24_5_2x2);
if (index != PM_MAX_TWO_CONNECTION_MODE)
return index;
index =
policy_mgr_check_and_get_third_connection_pcl_table_index_for_dbs(
PM_P2P_CLI_P2P_CLI_SBS_5_1x1,
PM_P2P_CLI_P2P_CLI_SBS_5_2x2,
PM_P2P_CLI_P2P_CLI_DBS_1x1,
PM_P2P_CLI_P2P_CLI_DBS_2x2);
return index;
}
static enum policy_mgr_two_connection_mode
policy_mgr_get_third_connection_pcl_table_index_go_go(void)
{
enum policy_mgr_two_connection_mode index;
index =
policy_mgr_check_and_get_third_connection_pcl_table_index_for_scc(
PM_P2P_GO_P2P_GO_SCC_24_1x1,
PM_P2P_GO_P2P_GO_SCC_24_2x2,
PM_P2P_GO_P2P_GO_SCC_5_1x1,
PM_P2P_GO_P2P_GO_SCC_5_2x2);
if (index != PM_MAX_TWO_CONNECTION_MODE)
return index;
index =
policy_mgr_check_and_get_third_connection_pcl_table_index_for_mcc(
PM_P2P_GO_P2P_GO_MCC_24_1x1,
PM_P2P_GO_P2P_GO_MCC_24_2x2,
PM_P2P_GO_P2P_GO_MCC_5_1x1,
PM_P2P_GO_P2P_GO_MCC_5_2x2,
PM_P2P_GO_P2P_GO_MCC_24_5_1x1,
PM_P2P_GO_P2P_GO_MCC_24_5_2x2);
if (index != PM_MAX_TWO_CONNECTION_MODE)
return index;
index =
policy_mgr_check_and_get_third_connection_pcl_table_index_for_dbs(
PM_P2P_GO_P2P_GO_SBS_5_1x1,
PM_P2P_GO_P2P_GO_SBS_5_2x2,
PM_P2P_GO_P2P_GO_DBS_1x1,
PM_P2P_GO_P2P_GO_DBS_2x2);
return index;
}
@ -1977,6 +2120,11 @@ enum policy_mgr_two_connection_mode
index =
policy_mgr_get_third_connection_pcl_table_index_go_go();
else if ((pm_conc_connection_list[0].mode == PM_P2P_CLIENT_MODE) &&
(pm_conc_connection_list[1].mode == PM_P2P_CLIENT_MODE))
index =
policy_mgr_get_third_connection_pcl_table_index_cli_cli();
policy_mgr_debug("mode0:%d mode1:%d freq0:%d freq1:%d chain:%d index:%d",
pm_conc_connection_list[0].mode,
pm_conc_connection_list[1].mode,
@ -2547,7 +2695,7 @@ QDF_STATUS policy_mgr_get_valid_chan_weights(struct wlan_objmgr_psoc *psoc,
if ((mode == PM_P2P_GO_MODE || mode == PM_P2P_CLIENT_MODE) ||
(mode == PM_STA_MODE &&
policy_mgr_mode_specific_connection_count(psoc, PM_STA_MODE,
NULL) > 0)) {
NULL))) {
/*
* Store the STA mode's parameter and temporarily delete it
* from the concurrency table. This way the allow concurrency
@ -2566,10 +2714,22 @@ QDF_STATUS policy_mgr_get_valid_chan_weights(struct wlan_objmgr_psoc *psoc,
for (i = 0; i < weight->saved_num_chan; i++) {
if (policy_mgr_is_concurrency_allowed
(psoc, mode, weight->saved_chan_list[i],
HW_MODE_20_MHZ)) {
HW_MODE_20_MHZ) &&
(policy_mgr_mode_specific_connection_count
(psoc, PM_P2P_GO_MODE, NULL) ||
policy_mgr_mode_specific_connection_count
(psoc, PM_P2P_CLIENT_MODE, NULL)) &&
policy_mgr_go_scc_enforced(psoc))
/*
* For two port/three port connection where if one p2p
* connection is already present and force scc is enabled
* then enforce Go negotiation channels to be strictly
* based on PCL list.
*/
weight->weighed_valid_list[i] = 0;
else
weight->weighed_valid_list[i] =
WEIGHT_OF_NON_PCL_CHANNELS;
}
WEIGHT_OF_NON_PCL_CHANNELS;
}
/* Restore the connection info */
if (mode == PM_STA_MODE)
@ -2787,3 +2947,82 @@ bool policy_mgr_is_sta_chan_valid_for_connect_and_roam(
return true;
}
bool policy_mgr_is_3rd_conn_on_same_band_allowed(struct wlan_objmgr_psoc *psoc,
enum policy_mgr_con_mode mode)
{
enum policy_mgr_pcl_type pcl = PM_NONE;
enum policy_mgr_conc_priority_mode conc_system_pref = 0;
enum policy_mgr_two_connection_mode third_index = 0;
struct policy_mgr_psoc_priv_obj *pm_ctx;
bool ret = false;
pm_ctx = policy_mgr_get_context(psoc);
if (!pm_ctx) {
policy_mgr_err("context is NULL");
return false;
}
policy_mgr_debug("pref:%d requested mode:%d",
pm_ctx->cur_conc_system_pref, mode);
switch (pm_ctx->cur_conc_system_pref) {
case 0:
conc_system_pref = PM_THROUGHPUT;
break;
case 1:
conc_system_pref = PM_POWERSAVE;
break;
case 2:
conc_system_pref = PM_LATENCY;
break;
default:
policy_mgr_err("unknown cur_conc_system_pref value %d",
pm_ctx->cur_conc_system_pref);
break;
}
third_index = policy_mgr_get_third_connection_pcl_table_index(psoc);
if (PM_MAX_TWO_CONNECTION_MODE == third_index) {
policy_mgr_err(
"couldn't find index for 3rd connection pcl table");
return false;
}
if (policy_mgr_is_hw_dbs_capable(psoc) == true) {
pcl = (*third_connection_pcl_dbs_table)
[third_index][mode][conc_system_pref];
} else {
pcl = (*third_connection_pcl_non_dbs_table)
[third_index][mode][conc_system_pref];
}
policy_mgr_debug("pcl for third connection is %d", pcl);
switch (pcl) {
case PM_SCC_CH:
case PM_SCC_CH_24G:
case PM_SCC_CH_5G:
case PM_24G_SCC_CH:
case PM_5G_SCC_CH:
case PM_SCC_ON_5_SCC_ON_24_24G:
case PM_SCC_ON_5_SCC_ON_24_5G:
case PM_SCC_ON_24_SCC_ON_5_24G:
case PM_SCC_ON_24_SCC_ON_5_5G:
case PM_SCC_ON_5_SCC_ON_24:
case PM_SCC_ON_24_SCC_ON_5:
case PM_24G_SCC_CH_SBS_CH:
case PM_24G_SCC_CH_SBS_CH_5G:
case PM_MCC_CH:
case PM_MCC_CH_24G:
case PM_MCC_CH_5G:
case PM_24G_MCC_CH:
case PM_5G_MCC_CH:
case PM_24G_SBS_CH_MCC_CH:
ret = true;
break;
default:
policy_mgr_debug("Not in SCC case");
ret = false;
break;
}
return ret;
}

View file

@ -1,5 +1,6 @@
/*
* Copyright (c) 2012-2020 The Linux Foundation. All rights reserved.
* Copyright (c) 2023 Qualcomm Innovation Center, Inc. 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
@ -570,8 +571,7 @@ pm_third_connection_pcl_dbs_2x2_table = {
[PM_STA_P2P_GO_SCC_24_2x2] = {
[PM_STA_MODE] = {PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_SAP_MODE] = {PM_5G_SCC_CH, PM_5G_SCC_CH, PM_5G_SCC_CH},
[PM_P2P_CLIENT_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_P2P_CLIENT_MODE] = {PM_5G, PM_5G, PM_5G},
[PM_P2P_GO_MODE] = {PM_5G, PM_5G, PM_5G},
[PM_NAN_DISC_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
@ -590,8 +590,7 @@ pm_third_connection_pcl_dbs_2x2_table = {
[PM_STA_P2P_GO_MCC_24_2x2] = {
[PM_STA_MODE] = {PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_SAP_MODE] = {PM_5G, PM_5G, PM_5G},
[PM_P2P_CLIENT_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_P2P_CLIENT_MODE] = {PM_5G, PM_5G, PM_5G},
[PM_P2P_GO_MODE] = {PM_5G, PM_5G, PM_5G},
[PM_NAN_DISC_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
@ -616,8 +615,7 @@ pm_third_connection_pcl_dbs_2x2_table = {
[PM_SAP_MODE] = {
PM_24G_SCC_CH_SBS_CH_5G, PM_24G_SCC_CH,
PM_24G_SCC_CH_SBS_CH},
[PM_P2P_CLIENT_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_P2P_CLIENT_MODE] = {PM_24G, PM_24G, PM_24G},
[PM_P2P_GO_MODE] = {PM_24G, PM_24G, PM_24G},
[PM_NAN_DISC_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
@ -640,8 +638,7 @@ pm_third_connection_pcl_dbs_2x2_table = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_SAP_MODE] = {
PM_24G_SBS_CH_MCC_CH, PM_24G, PM_24G_MCC_CH},
[PM_P2P_CLIENT_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_P2P_CLIENT_MODE] = {PM_24G, PM_24G, PM_24G},
[PM_P2P_GO_MODE] = {PM_24G, PM_24G, PM_24G},
[PM_NAN_DISC_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
@ -690,8 +687,8 @@ pm_third_connection_pcl_dbs_2x2_table = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_SAP_MODE] = { PM_SCC_ON_5_SCC_ON_24_5G, PM_SCC_ON_5_SCC_ON_24,
PM_SCC_ON_5_SCC_ON_24},
[PM_P2P_CLIENT_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_P2P_CLIENT_MODE] = {PM_SCC_ON_5_SCC_ON_24_5G, PM_SCC_ON_5_SCC_ON_24,
PM_SCC_ON_5_SCC_ON_24},
[PM_P2P_GO_MODE] = {
PM_SCC_ON_5_SCC_ON_24_5G, PM_SCC_ON_5_SCC_ON_24,
PM_SCC_ON_5_SCC_ON_24},
@ -1150,6 +1147,182 @@ pm_third_connection_pcl_dbs_2x2_table = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_NDI_MODE] = {PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE} },
[PM_P2P_CLI_P2P_CLI_SCC_24_1x1] = {
[PM_STA_MODE] = {PM_5G, PM_5G, PM_5G},
[PM_SAP_MODE] = {PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE,
PM_MAX_PCL_TYPE},
[PM_P2P_CLIENT_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_P2P_GO_MODE] = {PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE,
PM_MAX_PCL_TYPE},
[PM_NAN_DISC_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_NDI_MODE] = {PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE,
PM_MAX_PCL_TYPE} },
[PM_P2P_CLI_P2P_CLI_SCC_24_2x2] = {
[PM_STA_MODE] = {PM_5G, PM_5G, PM_5G},
[PM_SAP_MODE] = {PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE,
PM_MAX_PCL_TYPE},
[PM_P2P_CLIENT_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_P2P_GO_MODE] = {PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE,
PM_MAX_PCL_TYPE},
[PM_NAN_DISC_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_NDI_MODE] = {PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE,
PM_MAX_PCL_TYPE} },
[PM_P2P_CLI_P2P_CLI_MCC_24_1x1] = {
[PM_STA_MODE] = {PM_5G, PM_5G, PM_5G},
[PM_SAP_MODE] = {PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE,
PM_MAX_PCL_TYPE},
[PM_P2P_CLIENT_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_P2P_GO_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_NAN_DISC_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_NDI_MODE] = {PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE,
PM_MAX_PCL_TYPE} },
[PM_P2P_CLI_P2P_CLI_MCC_24_2x2] = {
[PM_STA_MODE] = {PM_5G, PM_5G, PM_5G},
[PM_SAP_MODE] = {PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE,
PM_MAX_PCL_TYPE},
[PM_P2P_CLIENT_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_P2P_GO_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_NAN_DISC_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_NDI_MODE] = {PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE,
PM_MAX_PCL_TYPE} },
[PM_P2P_CLI_P2P_CLI_SCC_5_1x1] = {
[PM_STA_MODE] = {PM_24G, PM_24G, PM_24G},
[PM_SAP_MODE] = {PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE,
PM_MAX_PCL_TYPE},
[PM_P2P_CLIENT_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_P2P_GO_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_NAN_DISC_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_NDI_MODE] = {PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE,
PM_MAX_PCL_TYPE} },
[PM_P2P_CLI_P2P_CLI_SCC_5_2x2] = {
[PM_STA_MODE] = {PM_24G, PM_24G, PM_24G},
[PM_SAP_MODE] = {PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE,
PM_MAX_PCL_TYPE},
[PM_P2P_CLIENT_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_P2P_GO_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_NAN_DISC_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_NDI_MODE] = {PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE,
PM_MAX_PCL_TYPE} },
[PM_P2P_CLI_P2P_CLI_MCC_5_1x1] = {
[PM_STA_MODE] = {PM_24G, PM_24G, PM_24G},
[PM_SAP_MODE] = {PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE,
PM_MAX_PCL_TYPE},
[PM_P2P_CLIENT_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_P2P_GO_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_NAN_DISC_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_NDI_MODE] = {PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE,
PM_MAX_PCL_TYPE} },
[PM_P2P_CLI_P2P_CLI_MCC_5_2x2] = {
[PM_STA_MODE] = {PM_24G, PM_24G, PM_24G},
[PM_SAP_MODE] = {PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE,
PM_MAX_PCL_TYPE},
[PM_P2P_CLIENT_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_P2P_GO_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_NAN_DISC_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_NDI_MODE] = {PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE,
PM_MAX_PCL_TYPE} },
[PM_P2P_CLI_P2P_CLI_MCC_24_5_1x1] = {
[PM_STA_MODE] = {PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE,
PM_MAX_PCL_TYPE},
[PM_SAP_MODE] = {PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE,
PM_MAX_PCL_TYPE},
[PM_P2P_CLIENT_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_P2P_GO_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_NAN_DISC_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_NDI_MODE] = {PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE,
PM_MAX_PCL_TYPE} },
[PM_P2P_CLI_P2P_CLI_MCC_24_5_2x2] = {
[PM_STA_MODE] = {PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE,
PM_MAX_PCL_TYPE},
[PM_SAP_MODE] = {PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE,
PM_MAX_PCL_TYPE},
[PM_P2P_CLIENT_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_P2P_GO_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_NAN_DISC_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_NDI_MODE] = {PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE,
PM_MAX_PCL_TYPE} },
[PM_P2P_CLI_P2P_CLI_DBS_1x1] = {
[PM_STA_MODE] = {
PM_SCC_ON_5_SCC_ON_24_5G, PM_SCC_ON_5_SCC_ON_24_5G,
PM_SCC_ON_5_SCC_ON_24_5G},
[PM_SAP_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_P2P_CLIENT_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_P2P_GO_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_NAN_DISC_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_NDI_MODE] = {PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE,
PM_MAX_PCL_TYPE} },
[PM_P2P_CLI_P2P_CLI_DBS_2x2] = {
[PM_STA_MODE] = { PM_SCC_ON_5_SCC_ON_24_5G,
PM_SCC_ON_5_SCC_ON_24_5G,
PM_SCC_ON_5_SCC_ON_24_5G},
[PM_SAP_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_P2P_CLIENT_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_P2P_GO_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_NAN_DISC_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_NDI_MODE] = {PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE,
PM_MAX_PCL_TYPE} },
[PM_P2P_CLI_P2P_CLI_SBS_5_1x1] = {
[PM_STA_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_SAP_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_P2P_CLIENT_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_P2P_GO_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_NAN_DISC_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_NDI_MODE] = {PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE,
PM_MAX_PCL_TYPE} },
[PM_STA_P2P_CLI_SCC_24_1x1] = {
[PM_STA_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
@ -1166,10 +1339,8 @@ pm_third_connection_pcl_dbs_2x2_table = {
[PM_STA_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_SAP_MODE] = {PM_5G, PM_5G, PM_5G},
[PM_P2P_CLIENT_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_P2P_GO_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_P2P_CLIENT_MODE] = {PM_5G, PM_5G, PM_5G},
[PM_P2P_GO_MODE] = {PM_5G, PM_5G, PM_5G},
[PM_NAN_DISC_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_NDI_MODE] = {PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE} },
@ -1190,10 +1361,8 @@ pm_third_connection_pcl_dbs_2x2_table = {
[PM_STA_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_SAP_MODE] = {PM_5G, PM_5G, PM_5G},
[PM_P2P_CLIENT_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_P2P_GO_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_P2P_CLIENT_MODE] = {PM_5G, PM_5G, PM_5G},
[PM_P2P_GO_MODE] = {PM_5G, PM_5G, PM_5G},
[PM_NAN_DISC_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_NDI_MODE] = {PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE} },
@ -1214,10 +1383,8 @@ pm_third_connection_pcl_dbs_2x2_table = {
[PM_STA_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_SAP_MODE] = {PM_24G, PM_24G, PM_24G},
[PM_P2P_CLIENT_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_P2P_GO_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_P2P_CLIENT_MODE] = {PM_24G, PM_24G, PM_24G},
[PM_P2P_GO_MODE] = {PM_24G, PM_24G, PM_24G},
[PM_NAN_DISC_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_NDI_MODE] = {PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE} },
@ -1238,10 +1405,8 @@ pm_third_connection_pcl_dbs_2x2_table = {
[PM_STA_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_SAP_MODE] = {PM_24G, PM_24G, PM_24G},
[PM_P2P_CLIENT_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_P2P_GO_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_P2P_CLIENT_MODE] = {PM_24G, PM_24G, PM_24G},
[PM_P2P_GO_MODE] = {PM_24G, PM_24G, PM_24G},
[PM_NAN_DISC_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_NDI_MODE] = {PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE} },
@ -1288,10 +1453,10 @@ pm_third_connection_pcl_dbs_2x2_table = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_SAP_MODE] = { PM_SCC_ON_5_SCC_ON_24_5G, PM_SCC_ON_5_SCC_ON_24,
PM_SCC_ON_5_SCC_ON_24},
[PM_P2P_CLIENT_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_P2P_GO_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_P2P_CLIENT_MODE] = {PM_SCC_ON_5_SCC_ON_24,
PM_SCC_ON_5_SCC_ON_24, PM_SCC_ON_5_SCC_ON_24},
[PM_P2P_GO_MODE] = {PM_SCC_ON_5_SCC_ON_24,
PM_SCC_ON_5_SCC_ON_24, PM_SCC_ON_5_SCC_ON_24},
[PM_NAN_DISC_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_NDI_MODE] = {PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE} },
@ -1322,8 +1487,7 @@ pm_third_connection_pcl_dbs_2x2_table = {
[PM_NDI_MODE] = {PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE} },
[PM_P2P_GO_P2P_CLI_SCC_24_2x2] = {
[PM_STA_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_STA_MODE] = {PM_5G, PM_5G, PM_5G},
[PM_SAP_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_P2P_CLIENT_MODE] = {
@ -1349,7 +1513,7 @@ pm_third_connection_pcl_dbs_2x2_table = {
[PM_P2P_GO_P2P_CLI_MCC_24_2x2] = {
[PM_STA_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
PM_5G, PM_5G, PM_5G},
[PM_SAP_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_P2P_CLIENT_MODE] = {
@ -1374,8 +1538,7 @@ pm_third_connection_pcl_dbs_2x2_table = {
[PM_NDI_MODE] = {PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE} },
[PM_P2P_GO_P2P_CLI_SCC_5_2x2] = {
[PM_STA_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_STA_MODE] = {PM_24G, PM_24G, PM_24G},
[PM_SAP_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_P2P_CLIENT_MODE] = {
@ -1401,7 +1564,7 @@ pm_third_connection_pcl_dbs_2x2_table = {
[PM_P2P_GO_P2P_CLI_MCC_5_2x2] = {
[PM_STA_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
PM_24G, PM_24G, PM_24G},
[PM_SAP_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_P2P_CLIENT_MODE] = {
@ -1452,8 +1615,8 @@ pm_third_connection_pcl_dbs_2x2_table = {
[PM_NDI_MODE] = {PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE} },
[PM_P2P_GO_P2P_CLI_DBS_2x2] = {
[PM_STA_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_STA_MODE] = {PM_SCC_ON_5_SCC_ON_24_5G, PM_SCC_ON_5_SCC_ON_24,
PM_SCC_ON_5_SCC_ON_24},
[PM_SAP_MODE] = {
PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE},
[PM_P2P_CLIENT_MODE] = {

View file

@ -1,6 +1,6 @@
/*
* Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. 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
@ -3242,4 +3242,22 @@ QDF_STATUS
wlan_mlme_get_channel_bonding_5ghz(struct wlan_objmgr_psoc *psoc,
uint32_t *value);
#ifdef WLAN_FEATURE_P2P_P2P_STA
/**
* wlan_mlme_get_p2p_p2p_conc_support() - Get p2p+p2p conc support
*
* @psoc: pointer to psoc object
* @val : value
*
* Return: Success/failure
*/
bool
wlan_mlme_get_p2p_p2p_conc_support(struct wlan_objmgr_psoc *psoc);
#else
static inline bool
wlan_mlme_get_p2p_p2p_conc_support(struct wlan_objmgr_psoc *psoc)
{
return false;
}
#endif
#endif /* _WLAN_MLME_API_H_ */

View file

@ -1,6 +1,6 @@
/*
* Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. 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
@ -5020,3 +5020,12 @@ wlan_mlme_get_channel_bonding_5ghz(struct wlan_objmgr_psoc *psoc,
*value = mlme_obj->cfg.feature_flags.channel_bonding_mode_5ghz;
return QDF_STATUS_SUCCESS;
}
#ifdef WLAN_FEATURE_P2P_P2P_STA
bool
wlan_mlme_get_p2p_p2p_conc_support(struct wlan_objmgr_psoc *psoc)
{
return wlan_psoc_nif_fw_ext_cap_get(psoc,
WLAN_SOC_EXT_P2P_P2P_CONC_SUPPORT);
}
#endif

View file

@ -1,5 +1,6 @@
/*
* Copyright (c) 2017-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2023 Qualcomm Innovation Center, Inc. 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
@ -136,11 +137,30 @@ static QDF_STATUS p2p_scan_start(struct p2p_roc_context *roc_ctx)
is_dbs = policy_mgr_is_hw_dbs_capable(p2p_soc_obj->soc);
if (go_num)
req->scan_req.dwell_time_passive *=
/* Add fixed 300ms extra ROC time instead of multiplying the
* ROC duration by const value as this causes the ROC to be
* upto 1.5 secs if GO is present. Firmware will advertize NOA
* of 1.5 secs and if supplicant cancels ROC after 200 or 300ms
* then firmware cannot cancel NOA. So when supplicant sends
* next ROC it will be delayed as firmware already is running
* previous NOA. This causes p2p find issues if GO is present.
* So add fixed duration of 300ms and also cap max ROC to 600ms
* when GO is present
*/
req->scan_req.dwell_time_passive +=
P2P_ROC_DURATION_MULTI_GO_PRESENT;
else
req->scan_req.dwell_time_passive *=
P2P_ROC_DURATION_MULTI_GO_ABSENT;
if (go_num && req->scan_req.dwell_time_passive >
P2P_MAX_ROC_DURATION_GO_PRESENT) {
req->scan_req.dwell_time_passive =
P2P_MAX_ROC_DURATION_GO_PRESENT;
} else if (req->scan_req.dwell_time_passive >
P2P_MAX_ROC_DURATION) {
req->scan_req.dwell_time_passive = P2P_MAX_ROC_DURATION;
}
/* this is to protect too huge value if some customers
* give a higher value from supplicant
*/
@ -162,9 +182,6 @@ static QDF_STATUS p2p_scan_start(struct p2p_roc_context *roc_ctx)
P2P_MAX_ROC_DURATION_NON_DBS_NAN_PRESENT)
req->scan_req.dwell_time_passive =
P2P_MAX_ROC_DURATION_NON_DBS_NAN_PRESENT;
} else if (req->scan_req.dwell_time_passive >
P2P_MAX_ROC_DURATION) {
req->scan_req.dwell_time_passive = P2P_MAX_ROC_DURATION;
}
}
p2p_debug("FW requested roc duration is:%d",

View file

@ -1,5 +1,6 @@
/*
* Copyright (c) 2017-2019 The Linux Foundation. All rights reserved.
* Copyright (c) 2023 Qualcomm Innovation Center, Inc. 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
@ -35,8 +36,9 @@
#define P2P_MAX_ROC_DURATION_NON_DBS_NDP_PRESENT 250
#define P2P_MAX_ROC_DURATION_DBS_NAN_PRESENT 450
#define P2P_MAX_ROC_DURATION_NON_DBS_NAN_PRESENT 300
#define P2P_MAX_ROC_DURATION_GO_PRESENT 600
#define P2P_ROC_DURATION_MULTI_GO_PRESENT 6
#define P2P_ROC_DURATION_MULTI_GO_PRESENT 300
#define P2P_ROC_DURATION_MULTI_GO_ABSENT 10
#define P2P_ACTION_FRAME_DEFAULT_WAIT 200
#define P2P_ROC_DEFAULT_DURATION 200

View file

@ -199,6 +199,7 @@ ifeq ($(CONFIG_ARCH_QCS40X), y)
CONFIG_WLAN_CLD_PM_QOS := y
endif
CONFIG_WLAN_FEATURE_MBSSID := y
CONFIG_WLAN_FEATURE_P2P_P2P_STA := y
#Flag to enable Legacy Fast Roaming3(LFR3)
ifeq (y,$(findstring y,$(CONFIG_HELIUMPLUS) $(CONFIG_LITHIUM)))
@ -973,8 +974,6 @@ CONFIG_FEATURE_INTEROP_ISSUES_AP := y
CONFIG_FEATURE_WLAN_WAPI := y
CONFIG_AGEIE_ON_SCAN_RESULTS := y
#Flag to enable FW log parsing support feature
CONFIG_FEATURE_FW_LOG_PARSING := y

View file

@ -1,6 +1,6 @@
/*
* Copyright (c) 2012-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. 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
@ -165,7 +165,7 @@ u8 ccp_rsn_oui_13[HDD_RSN_OUI_SIZE] = {0x50, 0x6F, 0x9A, 0x01};
#define HDD_PEER_AUTHORIZE_WAIT 10
/**
/*
* beacon_filter_table - table of IEs used for beacon filtering
*/
static const int beacon_filter_table[] = {
@ -434,18 +434,6 @@ struct hdd_adapter *hdd_get_sta_connection_in_progress(
hdd_adapter_dev_put_debug(next_adapter,
dbgid);
return adapter;
} else if ((eConnectionState_Associated ==
hdd_sta_ctx->conn_info.conn_state) &&
sme_is_sta_key_exchange_in_progress(
hdd_ctx->mac_handle,
adapter->vdev_id)) {
hdd_debug("vdev_id %d: Key exchange is in progress",
adapter->vdev_id);
hdd_adapter_dev_put_debug(adapter, dbgid);
if (next_adapter)
hdd_adapter_dev_put_debug(next_adapter,
dbgid);
return adapter;
}
}
hdd_adapter_dev_put_debug(adapter, dbgid);

View file

@ -5273,24 +5273,6 @@ int wlan_hdd_cfg80211_start_bss(struct hdd_adapter *adapter,
return -EINVAL;
}
}
/*
* For STA+SAP concurrency support from GUI, first STA connection gets
* triggered and while it is in progress, SAP start also comes up.
* Once STA association is successful, STA connect event is sent to
* kernel which gets queued in kernel workqueue and supplicant won't
* process M1 received from AP and send M2 until this NL80211_CONNECT
* event is received. Workqueue is not scheduled as RTNL lock is already
* taken by hostapd thread which has issued start_bss command to driver.
* Driver cannot complete start_bss as the pending command at the head
* of the SME command pending list is hw_mode_update for STA session
* which cannot be processed as SME is in WAITforKey state for STA
* interface. The start_bss command for SAP interface is queued behind
* the hw_mode_update command and so it cannot be processed until
* hw_mode_update command is processed. This is causing a deadlock so
* disconnect the STA interface first if connection or key exchange is
* in progress and then start SAP interface.
*/
hdd_abort_ongoing_sta_connection(hdd_ctx);
mac_handle = hdd_ctx->mac_handle;
@ -6070,13 +6052,6 @@ static int __wlan_hdd_cfg80211_stop_ap(struct wiphy *wiphy,
hdd_debug("Device_mode %s(%d)",
qdf_opmode_str(adapter->device_mode), adapter->device_mode);
/*
* If a STA connection is in progress in another adapter, disconnect
* the STA and complete the SAP operation. STA will reconnect
* after SAP stop is done.
*/
hdd_abort_ongoing_sta_connection(hdd_ctx);
if (adapter->device_mode == QDF_SAP_MODE) {
wlan_hdd_del_station(adapter);
mac_handle = hdd_ctx->mac_handle;
@ -6361,6 +6336,9 @@ wlan_hdd_ap_ap_force_scc_override(struct hdd_adapter *adapter,
return false;
}
if (adapter->device_mode == QDF_P2P_GO_MODE &&
policy_mgr_is_p2p_p2p_conc_supported(hdd_ctx->psoc))
return false;
if (!policy_mgr_concurrent_beaconing_sessions_running(hdd_ctx->psoc))
return false;
if (policy_mgr_dual_beacon_on_single_mac_mcc_capable(hdd_ctx->psoc))

View file

@ -1,6 +1,6 @@
/*
* Copyright (c) 2012-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. 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
@ -7242,12 +7242,13 @@ static void hdd_close_pre_cac_adapter(struct hdd_context *hdd_ctx)
SAP_PRE_CAC_IFNAME);
if (!pre_cac_adapter)
return;
hdd_ctx->sap_pre_cac_work.fn = NULL;
hdd_ctx->sap_pre_cac_work.arg = NULL;
errno = osif_vdev_sync_trans_start_wait(pre_cac_adapter->dev,
&vdev_sync);
if (errno)
return;
osif_vdev_sync_unregister(pre_cac_adapter->dev);
osif_vdev_sync_wait_for_ops(vdev_sync);
@ -7475,7 +7476,7 @@ QDF_STATUS hdd_stop_adapter(struct hdd_context *hdd_ctx,
sap_ctx = WLAN_HDD_GET_SAP_CTX_PTR(adapter);
if (!wlan_sap_is_pre_cac_context(sap_ctx) &&
(hdd_ctx->sap_pre_cac_work.fn))
cds_flush_work(&hdd_ctx->sap_pre_cac_work);
qdf_flush_work(&hdd_ctx->sap_pre_cac_work);
hdd_close_pre_cac_adapter(hdd_ctx);
@ -7652,7 +7653,7 @@ QDF_STATUS hdd_stop_all_adapters(struct hdd_context *hdd_ctx)
hdd_enter();
if (hdd_ctx->sap_pre_cac_work.fn)
cds_flush_work(&hdd_ctx->sap_pre_cac_work);
qdf_flush_work(&hdd_ctx->sap_pre_cac_work);
hdd_for_each_adapter_dev_held_safe(hdd_ctx, adapter, next_adapter,
NET_DEV_HOLD_STOP_ALL_ADAPTERS) {
@ -18156,6 +18157,7 @@ void hdd_clean_up_pre_cac_interface(struct hdd_context *hdd_ctx)
uint8_t vdev_id;
QDF_STATUS status;
struct hdd_adapter *precac_adapter;
struct sap_context *sap_ctx;
status = wlan_sap_get_pre_cac_vdev_id(hdd_ctx->mac_handle, &vdev_id);
if (QDF_IS_STATUS_ERROR(status)) {
@ -18169,6 +18171,13 @@ void hdd_clean_up_pre_cac_interface(struct hdd_context *hdd_ctx)
return;
}
sap_ctx = WLAN_HDD_GET_SAP_CTX_PTR(precac_adapter);
if (wlan_sap_is_pre_cac_context(sap_ctx) &&
hdd_ctx->sap_pre_cac_work.fn) {
hdd_debug("pre_cac_work already scheduled");
return;
}
qdf_create_work(0, &hdd_ctx->sap_pre_cac_work,
wlan_hdd_sap_pre_cac_failure,
(void *)precac_adapter);

View file

@ -1,6 +1,6 @@
/*
* Copyright (c) 2012-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. 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
@ -803,7 +803,10 @@ struct wireless_dev *__wlan_hdd_add_virtual_intf(struct wiphy *wiphy,
name_assign_type, true);
} else {
uint8_t *device_address;
if (strnstr(name, "p2p", 3) && mode == QDF_STA_MODE) {
hdd_debug("change mode to p2p device");
mode = QDF_P2P_DEVICE_MODE;
}
device_address = wlan_hdd_get_intf_addr(hdd_ctx, mode);
if (!device_address)
return ERR_PTR(-EINVAL);
@ -957,8 +960,8 @@ int __wlan_hdd_del_virtual_intf(struct wiphy *wiphy, struct wireless_dev *wdev)
if (adapter->device_mode == QDF_SAP_MODE &&
wlan_sap_is_pre_cac_active(hdd_ctx->mac_handle)) {
hdd_clean_up_interface(hdd_ctx, adapter);
hdd_clean_up_pre_cac_interface(hdd_ctx);
hdd_clean_up_interface(hdd_ctx, adapter);
} else if (wlan_hdd_is_session_type_monitor(
adapter->device_mode) &&
ucfg_pkt_capture_get_mode(hdd_ctx->psoc) !=

View file

@ -1,5 +1,6 @@
/*
* Copyright (c) 2012-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2023 Qualcomm Innovation Center, Inc. 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
@ -255,7 +256,7 @@ static int __wlan_hdd_request_pre_cac(struct hdd_context *hdd_ctx,
if (pre_cac_adapter) {
/* Flush existing pre_cac work */
if (hdd_ctx->sap_pre_cac_work.fn)
cds_flush_work(&hdd_ctx->sap_pre_cac_work);
qdf_flush_work(&hdd_ctx->sap_pre_cac_work);
} else {
if (policy_mgr_get_connection_count(hdd_ctx->psoc) > 1) {
hdd_err("pre cac not allowed in concurrency");

View file

@ -32,9 +32,9 @@
#define QWLAN_VERSION_MAJOR 2
#define QWLAN_VERSION_MINOR 0
#define QWLAN_VERSION_PATCH 8
#define QWLAN_VERSION_EXTRA "L"
#define QWLAN_VERSION_EXTRA "U"
#define QWLAN_VERSION_BUILD 32
#define QWLAN_VERSIONSTR "2.0.8.32L"
#define QWLAN_VERSIONSTR "2.0.8.32U"
#endif /* QWLAN_VERSION_H */

View file

@ -1,6 +1,6 @@
/*
* Copyright (c) 2011-2020 The Linux Foundation. All rights reserved.
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. 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
@ -356,6 +356,11 @@ lim_post_join_set_link_state_callback(struct mac_context *mac, uint32_t vdev_id,
tLimMlmJoinCnf mlm_join_cnf;
struct pe_session *session_entry;
/*
* Allow defered messages after peer create response
*/
SET_LIM_PROCESS_DEFD_MESGS(mac, true);
session_entry = pe_find_session_by_vdev_id(mac, vdev_id);
if (!session_entry) {
pe_err("vdev_id:%d PE session is NULL", vdev_id);
@ -406,13 +411,22 @@ static void
lim_process_mlm_post_join_suspend_link(struct mac_context *mac_ctx,
struct pe_session *session)
{
QDF_STATUS status;
lim_deactivate_and_change_timer(mac_ctx, eLIM_JOIN_FAIL_TIMER);
/* assign appropriate sessionId to the timer object */
mac_ctx->lim.lim_timers.gLimJoinFailureTimer.sessionId =
session->peSessionId;
wma_add_bss_peer_sta(session->vdev_id, session->bssId, true);
/*
* Defer msgs to LIM till peer create confirm event is received
*/
SET_LIM_PROCESS_DEFD_MESGS(mac_ctx, false);
status = wma_add_bss_peer_sta(session->vdev_id, session->bssId, true);
if (status == QDF_STATUS_E_RESOURCES)
SET_LIM_PROCESS_DEFD_MESGS(mac_ctx, true);
}
/**

View file

@ -1,6 +1,6 @@
/*
* Copyright (c) 2012-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. 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
@ -216,6 +216,30 @@ static void sch_get_csa_ecsa_count_offset(uint8_t *ie, uint32_t ie_len,
}
}
static void
populate_channel_switch_ann(struct mac_context *mac_ctx,
tDot11fBeacon2 *bcn,
struct pe_session *pe_session)
{
populate_dot11f_chan_switch_ann(mac_ctx, &bcn->ChanSwitchAnn,
pe_session);
pe_debug("csa: mode:%d chan:%d count:%d",
bcn->ChanSwitchAnn.switchMode,
bcn->ChanSwitchAnn.newChannel,
bcn->ChanSwitchAnn.switchCount);
if (!pe_session->dfsIncludeChanWrapperIe)
return;
populate_dot11f_chan_switch_wrapper(mac_ctx,
&bcn->ChannelSwitchWrapper,
pe_session);
pe_debug("wrapper: width:%d f0:%d f1:%d",
bcn->ChannelSwitchWrapper.WiderBWChanSwitchAnn.newChanWidth,
bcn->ChannelSwitchWrapper.WiderBWChanSwitchAnn.newCenterChanFreq0,
bcn->ChannelSwitchWrapper.WiderBWChanSwitchAnn.newCenterChanFreq1);
}
/**
* sch_set_fixed_beacon_fields() - sets the fixed params in beacon frame
* @mac_ctx: mac global context
@ -367,15 +391,12 @@ sch_set_fixed_beacon_fields(struct mac_context *mac_ctx, struct pe_session *sess
ext_csa->new_reg_class,
ext_csa->new_channel,
ext_csa->switch_count);
} else {
populate_dot11f_chan_switch_ann(mac_ctx,
&bcn_2->ChanSwitchAnn,
session);
pe_debug("csa: mode:%d chan:%d count:%d",
bcn_2->ChanSwitchAnn.switchMode,
bcn_2->ChanSwitchAnn.newChannel,
bcn_2->ChanSwitchAnn.switchCount);
}
if (session->lim_non_ecsa_cap_num &&
WLAN_REG_IS_24GHZ_CH_FREQ(session->curr_op_freq) &&
!is_6ghz_chsw)
populate_channel_switch_ann(mac_ctx, bcn_2, session);
}
populate_dot11_supp_operating_classes(mac_ctx,
@ -390,55 +411,10 @@ sch_set_fixed_beacon_fields(struct mac_context *mac_ctx, struct pe_session *sess
&bcn_2->PowerConstraints);
populate_dot11f_tpc_report(mac_ctx, &bcn_2->TPCReport, session);
/* Need to insert channel switch announcement here */
if ((LIM_IS_AP_ROLE(session)
|| LIM_IS_P2P_DEVICE_GO(session))
&& session->dfsIncludeChanSwIe == true) {
/*
* Channel switch announcement only if radar is detected
* and SAP has instructed to announce channel switch IEs
* in beacon and probe responses
*/
if (!is_6ghz_chsw) {
populate_dot11f_chan_switch_ann
(mac_ctx, &bcn_2->ChanSwitchAnn,
session);
pe_debug("csa: mode:%d chan:%d count:%d",
bcn_2->ChanSwitchAnn.switchMode,
bcn_2->ChanSwitchAnn.newChannel,
bcn_2->ChanSwitchAnn.switchCount);
}
/*
* TODO: depending the CB mode, extended channel switch
* announcement need to be called
*/
/*
populate_dot11f_ext_chan_switch_ann(mac_ctx,
&bcn_2->ExtChanSwitchAnn, session);
*/
/*
* TODO: If in 11AC mode, wider bw channel switch
* announcement needs to be called
*/
/*
populate_dot11f_wider_bw_chan_switch_ann(mac_ctx,
&bcn_2->WiderBWChanSwitchAnn, session);
*/
/*
* Populate the Channel Switch Wrapper Element if
* SAP operates in 40/80 Mhz Channel Width.
*/
if (true == session->dfsIncludeChanWrapperIe) {
populate_dot11f_chan_switch_wrapper(mac_ctx,
&bcn_2->ChannelSwitchWrapper, session);
pe_debug("wrapper: width:%d f0:%d f1:%d",
bcn_2->ChannelSwitchWrapper.
WiderBWChanSwitchAnn.newChanWidth,
bcn_2->ChannelSwitchWrapper.
WiderBWChanSwitchAnn.newCenterChanFreq0,
bcn_2->ChannelSwitchWrapper.
WiderBWChanSwitchAnn.newCenterChanFreq1
);
}
if ((LIM_IS_AP_ROLE(session) ||
LIM_IS_P2P_DEVICE_GO(session)) &&
session->dfsIncludeChanSwIe && !is_6ghz_chsw) {
populate_channel_switch_ann(mac_ctx, bcn_2, session);
}
}
if (mac_ctx->rrm.rrmConfig.sap_rrm_enabled)

View file

@ -1,5 +1,6 @@
/*
* Copyright (c) 2012-2020 The Linux Foundation. All rights reserved.
* Copyright (c) 2023 Qualcomm Innovation Center, Inc. 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
@ -829,6 +830,51 @@ static void wlansap_update_vendor_acs_chan(struct mac_context *mac_ctx,
}
}
#ifdef WLAN_FEATURE_P2P_P2P_STA
/**
* sap_check_and_process_forcescc_for_other_go() - find if other p2p go is there
* and needs to be moved to current p2p go's channel.
*
* @cur_sap_ctx: current sap context
*
* Return: None
*/
static void
sap_check_and_process_forcescc_for_other_go(struct sap_context *cur_sap_ctx)
{
struct sap_context *sap_ctx;
struct mac_context *mac_ctx;
uint8_t i;
mac_ctx = sap_get_mac_context();
if (!mac_ctx) {
sap_err("Invalid MAC context");
return;
}
for (i = 0; i < SAP_MAX_NUM_SESSION; i++) {
sap_ctx = mac_ctx->sap.sapCtxList[i].sap_context;
if (sap_ctx &&
QDF_P2P_GO_MODE == mac_ctx->sap.sapCtxList[i].sapPersona &&
sap_ctx->is_forcescc_restart_required) {
sap_debug("sessionId %d chan_freq %d chan_width %d",
sap_ctx->sessionId, cur_sap_ctx->chan_freq,
cur_sap_ctx->ch_params.ch_width);
policy_mgr_process_forcescc_for_go(
mac_ctx->psoc, sap_ctx->sessionId,
cur_sap_ctx->chan_freq,
cur_sap_ctx->ch_params.ch_width);
sap_ctx->is_forcescc_restart_required = false;
break;
}
}
}
#else
static void
sap_check_and_process_forcescc_for_other_go(struct sap_context *cur_sap_ctx)
{}
#endif
QDF_STATUS wlansap_roam_callback(void *ctx,
struct csr_roam_info *csr_roam_info,
uint32_t roam_id,
@ -1157,10 +1203,25 @@ QDF_STATUS wlansap_roam_callback(void *ctx,
* disassoc event
* Fill in the event structure
*/
if (roam_status == eCSR_ROAM_SET_KEY_COMPLETE)
if (roam_status == eCSR_ROAM_SET_KEY_COMPLETE) {
sap_signal_hdd_event(sap_ctx, csr_roam_info,
eSAP_STA_SET_KEY_EVENT,
(void *) eSAP_STATUS_SUCCESS);
/*
* After set key if this is the first peer connecting to new GO
* then check for peer count (which is self peer + peer count)
* and take decision for GO+GO force SCC
*/
if (sap_ctx->vdev->vdev_mlme.vdev_opmode ==
QDF_P2P_GO_MODE &&
wlan_vdev_get_peer_count(sap_ctx->vdev) == 2 &&
policy_mgr_mode_specific_connection_count(
mac_ctx->psoc, PM_P2P_GO_MODE,
NULL) > 1)
sap_check_and_process_forcescc_for_other_go(
sap_ctx);
}
break;
case eCSR_ROAM_RESULT_MAX_ASSOC_EXCEEDED:
/* Fill in the event structure */

View file

@ -1,6 +1,6 @@
/*
* Copyright (c) 2012-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. 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
@ -784,6 +784,41 @@ static bool is_mcc_preferred(struct sap_context *sap_context,
return false;
}
#ifdef WLAN_FEATURE_P2P_P2P_STA
/**
* sap_set_forcescc_required - set force scc flag for provided p2p go vdev
*
* vdev_id - vdev_id for which flag needs to be set
*
* Return: None
*/
static void sap_set_forcescc_required(uint8_t vdev_id)
{
struct mac_context *mac_ctx;
struct sap_context *sap_ctx;
uint8_t i = 0;
mac_ctx = sap_get_mac_context();
if (!mac_ctx) {
sap_err("Invalid MAC context");
return;
}
for (i = 0; i < SAP_MAX_NUM_SESSION; i++) {
sap_ctx = mac_ctx->sap.sapCtxList[i].sap_context;
if (QDF_P2P_GO_MODE == mac_ctx->sap.sapCtxList[i].sapPersona &&
sap_ctx->sessionId == vdev_id) {
sap_debug("update forcescc restart for vdev %d",
vdev_id);
sap_ctx->is_forcescc_restart_required = true;
}
}
}
#else
static void sap_set_forcescc_required(uint8_t vdev_id)
{}
#endif
QDF_STATUS
sap_validate_chan(struct sap_context *sap_context,
bool pre_start_bss,
@ -799,6 +834,8 @@ sap_validate_chan(struct sap_context *sap_context,
uint32_t concurrent_state;
bool go_force_scc;
struct ch_params ch_params = {0};
bool is_go_scc_strict = false;
uint8_t first_p2p_go_vdev_id = WLAN_UMAC_VDEV_ID_MAX;
mac_handle = cds_get_context(QDF_MODULE_ID_SME);
mac_ctx = MAC_CONTEXT(mac_handle);
@ -812,10 +849,45 @@ sap_validate_chan(struct sap_context *sap_context,
sap_err("Invalid channel");
return QDF_STATUS_E_FAILURE;
}
go_force_scc = policy_mgr_go_scc_enforced(mac_ctx->psoc);
if (sap_context->vdev && !go_force_scc &&
(wlan_vdev_mlme_get_opmode(sap_context->vdev) == QDF_P2P_GO_MODE))
goto validation_done;
if (sap_context->vdev &&
sap_context->vdev->vdev_mlme.vdev_opmode == QDF_P2P_GO_MODE) {
/*
* check whether go_force_scc is enabled or not.
* If it not enabled then don't any force scc on existing and new
* p2p go vdevs.
* Otherwise, if it is enabled then check whether it's in strict
* mode or liberal mode.
* For strict mode, do force scc on newly p2p go to existing p2p
* go channel.
* For liberal mode, first form new p2p go on requested channel.
* Once set key is done, do force scc on existing p2p go to new
* p2p go channel.
*/
go_force_scc = policy_mgr_go_scc_enforced(mac_ctx->psoc);
sap_debug("go force scc value %d", go_force_scc);
if (go_force_scc) {
is_go_scc_strict =
policy_mgr_is_go_scc_strict(mac_ctx->psoc);
if (!is_go_scc_strict) {
sap_debug("liberal mode is enabled");
first_p2p_go_vdev_id =
policy_mgr_check_forcescc_for_other_go(
mac_ctx->psoc,
sap_context->sessionId,
sap_context->chan_freq);
if (first_p2p_go_vdev_id <
WLAN_UMAC_VDEV_ID_MAX) {
sap_set_forcescc_required(
first_p2p_go_vdev_id);
goto validation_done;
}
}
} else {
goto validation_done;
}
}
concurrent_state = policy_mgr_get_concurrency_mode(mac_ctx->psoc);
if (policy_mgr_concurrent_beaconing_sessions_running(mac_ctx->psoc) ||

View file

@ -1,5 +1,6 @@
/*
* Copyright (c) 2012-2020 The Linux Foundation. All rights reserved.
* Copyright (c) 2023 Qualcomm Innovation Center, Inc. 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
@ -230,6 +231,13 @@ struct sap_context {
bool is_chan_change_inprogress;
qdf_list_t owe_pending_assoc_ind_list;
uint32_t freq_before_ch_switch;
#ifdef WLAN_FEATURE_P2P_P2P_STA
/*
*This param is used for GO+GO force scc logic where after
*setkey first GO will move to latest GO's channel
*/
bool is_forcescc_restart_required;
#endif
};
/*----------------------------------------------------------------------------

View file

@ -1,6 +1,6 @@
/*
* Copyright (c) 2013-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. 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
@ -1924,6 +1924,7 @@ wma_create_sta_mode_bss_peer(tp_wma_handle wma,
if (!mac) {
wma_err("vdev%d: Mac context is null", vdev_id);
status = QDF_STATUS_E_RESOURCES;
return status;
}
@ -5339,6 +5340,7 @@ QDF_STATUS wma_add_bss_peer_sta(uint8_t vdev_id, uint8_t *bssid,
wma = cds_get_context(QDF_MODULE_ID_WMA);
if (!wma) {
wma_err("Invalid wma");
status = QDF_STATUS_E_RESOURCES;
goto err;
}