Merge b84e72e50a on remote branch

Change-Id: I395b1d05b6dd9fd1df4bf8eca5e0e9f488c8d916
This commit is contained in:
Linux Build Service Account 2023-06-07 21:52:16 -07:00
commit 84facadeef
30 changed files with 448 additions and 125 deletions

View file

@ -1,6 +1,6 @@
/*
* Copyright (c) 2018-2020 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
@ -382,6 +382,28 @@ mlme_init_lpass_support_cfg(struct wlan_objmgr_psoc *psoc,
}
#endif
#ifdef CONFIG_BAND_6GHZ
/**
* mlme_init_standard_6ghz_conn_policy() - initialize standard 6GHz
* policy connection flag
* @psoc: Pointer to PSOC
* @gen: pointer to generic CFG items
*
* Return: None
*/
static void mlme_init_standard_6ghz_conn_policy(struct wlan_objmgr_psoc *psoc,
struct wlan_mlme_generic *gen)
{
gen->std_6ghz_conn_policy =
cfg_get(psoc, CFG_6GHZ_STANDARD_CONNECTION_POLICY);
}
#else
static void mlme_init_standard_6ghz_conn_policy(struct wlan_objmgr_psoc *psoc,
struct wlan_mlme_generic *gen)
{
}
#endif
/**
* mlme_init_mgmt_hw_tx_retry_count_cfg() - initialize mgmt hw tx retry count
* @psoc: Pointer to PSOC
@ -490,6 +512,7 @@ static void mlme_init_generic_cfg(struct wlan_objmgr_psoc *psoc,
cfg_get(psoc, CFG_MONITOR_MODE_CONCURRENCY);
gen->tx_retry_multiplier = cfg_get(psoc, CFG_TX_RETRY_MULTIPLIER);
mlme_init_mgmt_hw_tx_retry_count_cfg(psoc, gen);
mlme_init_standard_6ghz_conn_policy(psoc, gen);
}
static void mlme_init_edca_ani_cfg(struct wlan_objmgr_psoc *psoc,

View file

@ -1,6 +1,6 @@
/*
* Copyright (c) 2012-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2021 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
@ -167,6 +167,29 @@ enum monitor_mode_concurrency {
1, \
"rf test mode Enable Flag")
#ifdef CONFIG_BAND_6GHZ
/*
* standard_6ghz_connection_policy - Enable 6 GHz standard connection policy
* @Min: 0
* @Max: 1
* @Default: 1
*
* This ini is used to set standard 6 GHz policies where STA will be
* allowed to scan and connect to any 6 GHz AP.
*
* Related: None
*
* Supported Feature: STA
*/
#define CFG_6GHZ_STANDARD_CONNECTION_POLICY CFG_INI_BOOL( \
"standard_6ghz_connection_policy", \
1, \
"6ghz standard 6 GHZ connection policy")
#define CFG_6GHZ_STD_CONN_POLICY CFG(CFG_6GHZ_STANDARD_CONNECTION_POLICY)
#else
#define CFG_6GHZ_STD_CONN_POLICY
#endif
/*
* <ini>
* BandCapability - Preferred band (0: 2.4G, 5G, and 6G,
@ -949,5 +972,6 @@ enum monitor_mode_concurrency {
CFG(CFG_WLS_6GHZ_CAPABLE) \
CFG(CFG_MONITOR_MODE_CONCURRENCY)\
CFG(CFG_TX_RETRY_MULTIPLIER) \
CFG(CFG_MGMT_FRAME_HW_TX_RETRY_COUNT)
CFG(CFG_MGMT_FRAME_HW_TX_RETRY_COUNT) \
CFG_6GHZ_STD_CONN_POLICY
#endif /* __CFG_MLME_GENERIC_H */

View file

@ -2194,6 +2194,29 @@ wlan_mlme_get_sta_miracast_mcc_rest_time(struct wlan_objmgr_psoc *psoc,
QDF_STATUS
wlan_mlme_get_sap_mcc_chnl_avoid(struct wlan_objmgr_psoc *psoc,
uint8_t *value);
#ifdef CONFIG_BAND_6GHZ
/**
* wlan_mlme_is_standard_6ghz_conn_policy_enabled() - Get the 6 GHz standard
* connection policy flag
* @psoc: psoc context
* @value: Enable/Disable value ptr.
*
* Return: QDF_STATUS
*/
QDF_STATUS
wlan_mlme_is_standard_6ghz_conn_policy_enabled(struct wlan_objmgr_psoc *psoc,
bool *value);
#else
static inline QDF_STATUS
wlan_mlme_is_standard_6ghz_conn_policy_enabled(struct wlan_objmgr_psoc *psoc,
bool *value)
{
*value = false;
return QDF_STATUS_SUCCESS;
}
#endif
/**
* wlan_mlme_get_mcc_bcast_prob_resp() - Get broadcast probe rsp in MCC
*

View file

@ -1,6 +1,6 @@
/*
* Copyright (c) 2018-2020 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
@ -1252,6 +1252,7 @@ enum mlme_cfg_frame_type {
* @ocv_support: FW supports OCV or not
* @tx_retry_multiplier: TX xretry extension parameter
* @mgmt_hw_tx_retry_count: MGMT HW tx retry count for frames
* @std_6ghz_conn_policy: 6GHz standard connection policy
*/
struct wlan_mlme_generic {
uint32_t band_capability;
@ -1298,6 +1299,9 @@ struct wlan_mlme_generic {
bool ocv_support;
uint32_t tx_retry_multiplier;
uint8_t mgmt_hw_tx_retry_count[CFG_FRAME_TYPE_MAX];
#ifdef CONFIG_BAND_6GHZ
bool std_6ghz_conn_policy;
#endif
};
/*

View file

@ -1,6 +1,6 @@
/*
* Copyright (c) 2018-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
@ -2694,6 +2694,23 @@ ucfg_mlme_set_rf_test_mode_enabled(struct wlan_objmgr_psoc *psoc, bool value)
return wlan_mlme_set_rf_test_mode_enabled(psoc, value);
}
/**
* ucfg_mlme_is_standard_6ghz_conn_policy_enabled() - Get 6ghz standard
* connection policy flag
* @psoc: pointer to psoc object
* @value: pointer to hold the value of flag
*
* Inline UCFG API to be used by HDD/OSIF callers
*
* Return: QDF Status
*/
static inline QDF_STATUS
ucfg_mlme_is_standard_6ghz_conn_policy_enabled(struct wlan_objmgr_psoc *psoc,
bool *value)
{
return wlan_mlme_is_standard_6ghz_conn_policy_enabled(psoc, value);
}
/**
* ucfg_mlme_get_opr_rate() - Get operational rate set
* @psoc: pointer to vdev object

View file

@ -2775,6 +2775,23 @@ wlan_mlme_set_rf_test_mode_enabled(struct wlan_objmgr_psoc *psoc, bool value)
return QDF_STATUS_SUCCESS;
}
#ifdef CONFIG_BAND_6GHZ
QDF_STATUS
wlan_mlme_is_standard_6ghz_conn_policy_enabled(struct wlan_objmgr_psoc *psoc,
bool *value)
{
struct wlan_mlme_psoc_ext_obj *mlme_obj;
mlme_obj = mlme_get_psoc_ext_obj(psoc);
if (!mlme_obj)
return QDF_STATUS_E_FAILURE;
*value = mlme_obj->cfg.gen.std_6ghz_conn_policy;
return QDF_STATUS_SUCCESS;
}
#endif
QDF_STATUS
wlan_mlme_cfg_set_vht_chan_width(struct wlan_objmgr_psoc *psoc, uint8_t value)
{

View file

@ -1,5 +1,6 @@
/*
* Copyright (c) 2017-2018, 2020-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
@ -290,10 +291,12 @@ int pmo_core_psoc_clear_target_wake_up(struct wlan_objmgr_psoc *psoc);
* pmo_core_psoc_target_suspend_acknowledge() - update target susspend status
* @context: HTC_INIT_INFO->context
* @wow_nack: true when wow is rejected
* @reason_code : WoW status reason code
*
* Return: none
*/
void pmo_core_psoc_target_suspend_acknowledge(void *context, bool wow_nack);
void pmo_core_psoc_target_suspend_acknowledge(void *context, bool wow_nack,
uint16_t reason_code);
/**
* pmo_core_psoc_wakeup_host_event_received() - received host wake up event

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
@ -421,14 +422,17 @@ bool pmo_core_is_wow_enabled(struct pmo_psoc_priv_obj *psoc_ctx)
* pmo_core_set_wow_nack() - Set wow nack flag
* @psoc_ctx: Pointer to objmgr psoc handle
* @value: true if received wow nack from else false
* @reason_code: WoW status reason code
*
* Return: None
*/
static inline
void pmo_core_set_wow_nack(struct pmo_psoc_priv_obj *psoc_ctx, bool value)
void pmo_core_set_wow_nack(struct pmo_psoc_priv_obj *psoc_ctx, bool value,
uint16_t reason_code)
{
qdf_spin_lock_bh(&psoc_ctx->lock);
psoc_ctx->wow.wow_nack = value;
psoc_ctx->wow.reason_code = reason_code;
qdf_spin_unlock_bh(&psoc_ctx->lock);
}
@ -449,6 +453,25 @@ bool pmo_core_get_wow_nack(struct pmo_psoc_priv_obj *psoc_ctx)
return value;
}
/**
* pmo_core_get_wow_reason_code() - Get wow status reason code
* @psoc_ctx: Pointer to objmgr psoc handle
*
* Return: wow status reason code
*/
static inline
uint16_t pmo_core_get_wow_reason_code(struct pmo_psoc_priv_obj *psoc_ctx)
{
uint16_t value;
qdf_spin_lock_bh(&psoc_ctx->lock);
value = psoc_ctx->wow.reason_code;
qdf_spin_unlock_bh(&psoc_ctx->lock);
return value;
}
/**
* pmo_core_update_wow_enable_cmd_sent() - update wow enable cmd sent flag
* @psoc_ctx: Pointer to objmgr psoc handle

View file

@ -1,6 +1,6 @@
/*
* Copyright (c) 2017-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
@ -735,12 +735,13 @@ pmo_core_enable_wow_in_fw(struct wlan_objmgr_psoc *psoc,
struct pmo_psoc_cfg *psoc_cfg = &psoc_ctx->psoc_cfg;
QDF_STATUS status;
void *hif_ctx;
uint16_t reason_code;
pmo_enter();
hif_ctx = pmo_core_psoc_get_hif_handle(psoc);
qdf_event_reset(&psoc_ctx->wow.target_suspend);
pmo_core_set_wow_nack(psoc_ctx, false);
pmo_core_set_wow_nack(psoc_ctx, false, 0);
host_credits = pmo_tgt_psoc_get_host_credits(psoc);
wmi_pending_cmds = pmo_tgt_psoc_get_pending_cmnds(psoc);
pmo_debug("Credits:%d; Pending_Cmds: %d",
@ -847,7 +848,8 @@ pmo_core_enable_wow_in_fw(struct wlan_objmgr_psoc *psoc,
}
if (pmo_core_get_wow_nack(psoc_ctx)) {
pmo_err("FW not ready to WOW");
reason_code = pmo_core_get_wow_reason_code(psoc_ctx);
pmo_err("FW not ready to WOW reason code: %d", reason_code);
pmo_tgt_update_target_suspend_flag(psoc, false);
status = QDF_STATUS_E_AGAIN;
goto out;
@ -1514,7 +1516,8 @@ out:
return status;
}
void pmo_core_psoc_target_suspend_acknowledge(void *context, bool wow_nack)
void pmo_core_psoc_target_suspend_acknowledge(void *context, bool wow_nack,
uint16_t reason_code)
{
struct pmo_psoc_priv_obj *psoc_ctx;
struct wlan_objmgr_psoc *psoc = (struct wlan_objmgr_psoc *)context;
@ -1535,7 +1538,7 @@ void pmo_core_psoc_target_suspend_acknowledge(void *context, bool wow_nack)
psoc_ctx = pmo_psoc_get_priv(psoc);
pmo_core_set_wow_nack(psoc_ctx, wow_nack);
pmo_core_set_wow_nack(psoc_ctx, wow_nack, reason_code);
qdf_event_set(&psoc_ctx->wow.target_suspend);
if (!pmo_tgt_psoc_get_runtime_pm_in_progress(psoc)) {
if (wow_nack)

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
@ -993,11 +994,14 @@ int ucfg_pmo_psoc_clear_target_wake_up(struct wlan_objmgr_psoc *psoc);
/**
* ucfg_pmo_psoc_target_suspend_acknowledge() - Clear initial wake up status
* @psoc: objmgr psoc handle
* @context: caller-provided context
* @wow_nack: Was WoW NACK'ed
* @reason_code: WoW status reason code
*
* Return: None
*/
void ucfg_pmo_psoc_target_suspend_acknowledge(void *context, bool wow_nack);
void ucfg_pmo_psoc_target_suspend_acknowledge(void *context, bool wow_nack,
uint16_t reason_code);
/**
* ucfg_pmo_psoc_wakeup_host_event_received() - got host wake up evennt from fwr
@ -1665,7 +1669,8 @@ ucfg_pmo_psoc_clear_target_wake_up(struct wlan_objmgr_psoc *psoc)
}
static inline void
ucfg_pmo_psoc_target_suspend_acknowledge(void *context, bool wow_nack)
ucfg_pmo_psoc_target_suspend_acknowledge(void *context, bool wow_nack,
uint16_t reason_code)
{
}

View file

@ -1,6 +1,6 @@
/*
* Copyright (c) 2017-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
@ -224,6 +224,7 @@ enum pmo_wow_state {
* @target_suspend: target suspend event
* @target_resume: target resume event
* @wow_nack: wow negative ack flag
* @reason_code : wow status reason code
* @wow_initial_wake_up: target initial wake up is received
* @wow_wake_lock: wow wake lock
* @lphb_cache: lphb cache
@ -245,7 +246,8 @@ struct pmo_wow {
enum pmo_wow_state wow_state;
qdf_event_t target_suspend;
qdf_event_t target_resume;
int wow_nack;
bool wow_nack;
uint16_t reason_code;
atomic_t wow_initial_wake_up;
qdf_wake_lock_t wow_wake_lock;
/*

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
@ -486,9 +487,11 @@ int ucfg_pmo_psoc_clear_target_wake_up(struct wlan_objmgr_psoc *psoc)
return pmo_core_psoc_clear_target_wake_up(psoc);
}
void ucfg_pmo_psoc_target_suspend_acknowledge(void *context, bool wow_nack)
void ucfg_pmo_psoc_target_suspend_acknowledge(void *context, bool wow_nack,
uint16_t reason_code)
{
pmo_core_psoc_target_suspend_acknowledge(context, wow_nack);
pmo_core_psoc_target_suspend_acknowledge(context, wow_nack,
reason_code);
}
void ucfg_pmo_psoc_wakeup_host_event_received(struct wlan_objmgr_psoc *psoc)

View file

@ -169,7 +169,8 @@
#define g_mode_rates_size (12)
#define a_mode_rates_size (8)
#define DRIVER_DISCONNECT_REASON_INDEX \
QCA_NL80211_VENDOR_SUBCMD_DRIVER_DISCONNECT_REASON_INDEX
/**
* rtt_is_initiator - Macro to check if the bitmap has any RTT roles set
* @bitmap: The bitmap to be checked
@ -1700,6 +1701,10 @@ static const struct nl80211_vendor_cmd_info wlan_hdd_cfg80211_vendor_events[] =
.vendor_id = QCA_NL80211_VENDOR_ID,
.subcmd = QCA_NL80211_VENDOR_SUBCMD_UPDATE_STA_INFO,
},
[QCA_NL80211_VENDOR_SUBCMD_DRIVER_DISCONNECT_REASON_INDEX] = {
.vendor_id = QCA_NL80211_VENDOR_ID,
.subcmd = QCA_NL80211_VENDOR_SUBCMD_DRIVER_DISCONNECT_REASON,
},
#ifdef WLAN_SUPPORT_TWT
FEATURE_TWT_VENDOR_EVENTS
#endif
@ -22146,6 +22151,9 @@ wlan_hdd_cfg80211_indicate_disconnect(struct hdd_adapter *adapter,
uint16_t disconnect_ies_len)
{
enum ieee80211_reasoncode ieee80211_reason;
struct sk_buff *vendor_event;
int flags;
struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
ieee80211_reason = wlan_hdd_get_cfg80211_disconnect_reason(adapter,
reason);
@ -22155,6 +22163,26 @@ wlan_hdd_cfg80211_indicate_disconnect(struct hdd_adapter *adapter,
adapter->last_disconnect_reason,
hdd_qca_reason_to_str(adapter->last_disconnect_reason),
locally_generated);
flags = cds_get_gfp_flags();
vendor_event =
cfg80211_vendor_event_alloc(
hdd_ctx->wiphy, &(adapter->wdev), NLMSG_HDRLEN +
sizeof(adapter->last_disconnect_reason) +
NLMSG_HDRLEN, DRIVER_DISCONNECT_REASON_INDEX, flags);
if (!vendor_event) {
hdd_err("cfg80211_vendor_event_alloc failed");
return;
}
if (nla_put_u32(vendor_event, DISCONNECT_REASON,
adapter->last_disconnect_reason)) {
hdd_err("DISCONNECT_REASON put fail");
kfree_skb(vendor_event);
goto send_disconnect;
}
cfg80211_vendor_event(vendor_event, flags);
send_disconnect:
cfg80211_disconnected(adapter->dev, ieee80211_reason, disconnect_ies,
disconnect_ies_len, locally_generated,
GFP_KERNEL);

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) {
@ -14303,6 +14304,7 @@ static int hdd_features_init(struct hdd_context *hdd_ctx)
mac_handle_t mac_handle;
bool b_cts2self, is_imps_enabled;
bool rf_test_mode;
bool std_6ghz_conn_policy;
hdd_enter();
@ -14401,6 +14403,17 @@ static int hdd_features_init(struct hdd_context *hdd_ctx)
wlan_cm_set_6ghz_key_mgmt_mask(hdd_ctx->psoc,
ALLOWED_KEYMGMT_6G_MASK);
}
status = ucfg_mlme_is_standard_6ghz_conn_policy_enabled(hdd_ctx->psoc,
&std_6ghz_conn_policy);
if (!QDF_IS_STATUS_SUCCESS(status)) {
hdd_err("Get 6ghz standard connection policy failed");
return QDF_STATUS_E_FAILURE;
}
if (std_6ghz_conn_policy)
wlan_cm_set_standard_6ghz_conn_policy(hdd_ctx->psoc, true);
hdd_thermal_stats_cmd_init(hdd_ctx);
sme_set_cal_failure_event_cb(hdd_ctx->mac_handle,
hdd_cal_fail_send_event);
@ -18156,6 +18169,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 +18183,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

@ -960,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

@ -1,5 +1,6 @@
/*
* Copyright (c) 2019-2020 The Linux Foundation. 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
@ -38,6 +39,9 @@
/* Opaque handle for abstraction */
#define hdd_sta_info_entry qdf_list_node_t
#define DISCONNECT_REASON \
QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_DRIVER_DISCONNECT_REASON
/**
* struct dhcp_phase - Per Peer DHCP Phases
* @DHCP_PHASE_ACK: upon receiving DHCP_ACK/NAK message in REQUEST phase or

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
@ -135,8 +135,6 @@
QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_RX_RETRY_COUNT
#define REMOTE_RX_BC_MC_COUNT \
QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_REMOTE_RX_BC_MC_COUNT
#define DISCONNECT_REASON \
QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_DRIVER_DISCONNECT_REASON
#define BEACON_IES \
QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_BEACON_IES
#define ASSOC_REQ_IES \
@ -365,6 +363,9 @@ static int hdd_convert_dot11mode(uint32_t dot11mode)
case eCSR_CFG_DOT11_MODE_11AC:
ret_val = QCA_WLAN_802_11_MODE_11AC;
break;
case eCSR_CFG_DOT11_MODE_11AX:
ret_val = QCA_WLAN_802_11_MODE_11AX;
break;
case eCSR_CFG_DOT11_MODE_AUTO:
case eCSR_CFG_DOT11_MODE_ABG:
default:

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 "R"
#define QWLAN_VERSION_BUILD 32
#define QWLAN_VERSION_EXTRA "B"
#define QWLAN_VERSION_BUILD 33
#define QWLAN_VERSIONSTR "2.0.8.32R"
#define QWLAN_VERSIONSTR "2.0.8.33B"
#endif /* QWLAN_VERSION_H */

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
@ -2298,14 +2298,20 @@ void lim_process_assoc_req_frame(struct mac_context *mac_ctx, uint8_t *rx_pkt_in
*/
sta_ds = dph_lookup_hash_entry(mac_ctx, hdr->sa, &assoc_id,
&session->dph.dphHashTable);
if (sta_ds) {
if (sta_ds && !sta_ds->rmfEnabled) {
/**
* Drop only retries for non-PMF assoc requests.
* For PMF case:
* a) Before key installation - Drop assoc request
* b) After key installation - Send SA query
*/
if (hdr->fc.retry > 0) {
pe_err("STA is initiating Assoc Req after ACK lost. Do not process sessionid: %d sys sub_type=%d for role=%d from: "
QDF_MAC_ADDR_FMT, session->peSessionId,
sub_type, GET_LIM_SYSTEM_ROLE(session),
QDF_MAC_ADDR_REF(hdr->sa));
return;
} else if (!sta_ds->rmfEnabled && (sub_type == LIM_REASSOC)) {
} else if (sub_type == LIM_REASSOC) {
/*
* SAP should send reassoc response with reject code
* to avoid IOT issues. as per the specification SAP
@ -2319,7 +2325,7 @@ void lim_process_assoc_req_frame(struct mac_context *mac_ctx, uint8_t *rx_pkt_in
sub_type, sta_ds, session, false);
pe_err("Rejecting reassoc req from STA");
return;
} else if (!sta_ds->rmfEnabled) {
} else {
/*
* Do this only for non PMF case.
* STA might have missed the assoc response, so it is
@ -2336,16 +2342,16 @@ void lim_process_assoc_req_frame(struct mac_context *mac_ctx, uint8_t *rx_pkt_in
session->limSystemRole,
QDF_MAC_ADDR_REF(hdr->sa));
return;
} else if (sta_ds->rmfEnabled && !sta_ds->is_key_installed) {
/* When PMF enabled, SA Query will be triggered
* unexpectly if duplicated assoc_req received -
* 1) after pre_auth node deleted and
* 2) before key installed.
* Here drop such duplicated assoc_req frame.
*/
pe_err("Drop duplicate assoc_req before 4-way HS");
return;
}
} else if (sta_ds && sta_ds->rmfEnabled && !sta_ds->is_key_installed) {
/* When PMF enabled, SA Query will be triggered
* unexpectly if duplicated assoc_req received -
* 1) after pre_auth node deleted and
* 2) before key installed.
* Here drop such duplicated assoc_req frame.
*/
pe_err("Drop duplicate assoc_req before 4-way HS");
return;
}
status = lim_check_sta_in_pe_entries(mac_ctx, hdr, session->peSessionId,

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) 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
@ -2646,7 +2646,7 @@ lim_send_assoc_req_mgmt_frame(struct mac_context *mac_ctx,
QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_DEBUG,
frame, (uint16_t)(sizeof(tSirMacMgmtHdr) + payload));
min_rid = lim_get_min_session_txrate(pe_session);
min_rid = lim_get_min_session_txrate(pe_session, NULL);
lim_diag_event_report(mac_ctx, WLAN_PE_DIAG_ASSOC_START_EVENT,
pe_session, QDF_STATUS_SUCCESS, QDF_STATUS_SUCCESS);
lim_diag_mgmt_tx_event_report(mac_ctx, mac_hdr,
@ -3133,7 +3133,7 @@ alloc_packet:
session->peSessionId, mac_hdr->fc.subType));
mac_ctx->auth_ack_status = LIM_ACK_NOT_RCD;
min_rid = lim_get_min_session_txrate(session);
min_rid = lim_get_min_session_txrate(session, NULL);
peer_rssi = mac_ctx->lim.bss_rssi;
lim_diag_mgmt_tx_event_report(mac_ctx, mac_hdr,
session, QDF_STATUS_SUCCESS, QDF_STATUS_SUCCESS);
@ -5700,6 +5700,9 @@ static void lim_tx_mgmt_frame(struct mac_context *mac_ctx, uint8_t vdev_id,
struct pe_session *session;
uint16_t auth_ack_status;
enum rateid min_rid = RATEID_DEFAULT;
qdf_freq_t *pre_auth_freq = NULL;
qdf_freq_t channel_freq = 0;
enum QDF_OPMODE opmode;
session = pe_find_session_by_vdev_id(mac_ctx, vdev_id);
if (!session) {
@ -5712,7 +5715,24 @@ static void lim_tx_mgmt_frame(struct mac_context *mac_ctx, uint8_t vdev_id,
qdf_mtrace(QDF_MODULE_ID_PE, QDF_MODULE_ID_WMA, TRACE_CODE_TX_MGMT,
session->peSessionId, 0);
min_rid = lim_get_min_session_txrate(session);
opmode = wlan_get_opmode_from_vdev_id(mac_ctx->pdev, vdev_id);
if (opmode != QDF_NAN_DISC_MODE && fc->subType == SIR_MAC_MGMT_AUTH) {
tpSirFTPreAuthReq pre_auth_req;
uint16_t auth_algo = *(uint16_t *)(frame +
sizeof(tSirMacMgmtHdr));
if (auth_algo == eSIR_AUTH_TYPE_SAE) {
if (session->ftPEContext.pFTPreAuthReq) {
pre_auth_req =
session->ftPEContext.pFTPreAuthReq;
channel_freq =
pre_auth_req->pre_auth_channel_freq;
}
pre_auth_freq = &channel_freq;
}
pe_debug("TX SAE pre-auth frame on freq %d", channel_freq);
}
min_rid = lim_get_min_session_txrate(session, pre_auth_freq);
qdf_status = wma_tx_frameWithTxComplete(mac_ctx, packet,
(uint16_t)msg_len,

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
@ -8248,15 +8248,27 @@ QDF_STATUS lim_util_get_type_subtype(void *pkt, uint8_t *type,
return QDF_STATUS_SUCCESS;
}
enum rateid lim_get_min_session_txrate(struct pe_session *session)
enum rateid lim_get_min_session_txrate(struct pe_session *session,
qdf_freq_t *pre_auth_freq)
{
enum rateid rid = RATEID_DEFAULT;
uint8_t min_rate = SIR_MAC_RATE_54, curr_rate, i;
tSirMacRateSet *rateset = &session->rateSet;
tSirMacRateSet *rateset;
if (!session)
return rid;
rateset = &session->rateSet;
if (pre_auth_freq) {
pe_debug("updated rateset to pre auth freq %d",
*pre_auth_freq);
if ((*pre_auth_freq))
csr_get_basic_rates(rateset, *pre_auth_freq);
else
return rid;
}
for (i = 0; i < rateset->numRates; i++) {
/* Ignore MSB - set to indicate basic rate */
curr_rate = rateset->rate[i] & 0x7F;

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
@ -1687,13 +1687,15 @@ QDF_STATUS lim_util_get_type_subtype(void *pkt, uint8_t *type,
/**
* lim_get_min_session_txrate() - Get the minimum rate supported in the session
* @session: Pointer to PE session
* @pre_auth_freq: Pointer to pre_auth_freq
*
* This API will find the minimum rate supported by the given PE session and
* return the enum rateid corresponding to the rate.
*
* Return: enum rateid
*/
enum rateid lim_get_min_session_txrate(struct pe_session *session);
enum rateid lim_get_min_session_txrate(struct pe_session *session,
qdf_freq_t *pre_auth_freq);
/**
* lim_send_dfs_chan_sw_ie_update() - updates the channel switch IE in beacon

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

@ -1485,6 +1485,15 @@ QDF_STATUS csr_mlme_vdev_disconnect_all_p2p_client_event(uint8_t vdev_id);
*/
QDF_STATUS csr_mlme_vdev_stop_bss(uint8_t vdev_id);
/*
* csr_get_basic_rates() - Get basic rate for a band
* @b_rates: Basic rate
* @chan_freq: frequency for which basic rate is required
*
* Return: void
*/
void csr_get_basic_rates(tSirMacRateSet *b_rates, uint32_t chan_freq);
/*
* csr_mlme_get_concurrent_operation_freq() - Callback for MLME module to
* get the concurrent operation frequency

View file

@ -1839,6 +1839,13 @@ csr_check_band_freq_match(enum band_info band, uint32_t freq)
if (band == BAND_5G && WLAN_REG_IS_5GHZ_CH_FREQ(freq))
return true;
/*
* Not adding the band check for now as band_info will be soon
* replaced with reg_wifi_band enum
*/
if (WLAN_REG_IS_6GHZ_CHAN_FREQ(freq))
return true;
return false;
}
@ -14951,7 +14958,7 @@ csr_update_sae_single_pmk_ap_cap(struct mac_context *mac,
}
#endif
static void csr_get_basic_rates(tSirMacRateSet *b_rates, uint32_t chan_freq)
void csr_get_basic_rates(tSirMacRateSet *b_rates, uint32_t chan_freq)
{
/*
* Some IOT APs don't send supported rates in

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;
}

View file

@ -1,6 +1,6 @@
/*
* Copyright (c) 2013-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
@ -9323,27 +9323,97 @@ QDF_STATUS wma_send_set_pcl_cmd(tp_wma_handle wma_handle,
}
msg->chan_weights.saved_num_chan = wma_handle->saved_chan.num_channels;
status = policy_mgr_get_valid_chan_weights(wma_handle->psoc,
(struct policy_mgr_pcl_chan_weights *)&msg->chan_weights,
PM_STA_MODE);
if (QDF_IS_STATUS_ERROR(status)) {
wma_err("Error in creating weighed pcl");
return status;
}
for (i = 0; i < msg->chan_weights.saved_num_chan; i++) {
msg->chan_weights.weighed_valid_list[i] =
wma_map_pcl_weights(
msg->chan_weights.weighed_valid_list[i]);
/* Dont allow roaming on 2G when 5G_ONLY configured */
if (msg->band_mask ==
(BIT(REG_BAND_2G) | BIT(REG_BAND_5G) | BIT(REG_BAND_6G)))
continue;
/*
* Dont allow roaming on 5G/6G band if only 2G band configured
* as supported roam band mask
*/
if (((wma_handle->bandcapability == BAND_2G) ||
(msg->band_mask == BIT(REG_BAND_2G))) &&
!WLAN_REG_IS_24GHZ_CH_FREQ(
msg->chan_weights.saved_chan_list[i])) {
msg->chan_weights.weighed_valid_list[i] =
WEIGHT_OF_DISALLOWED_CHANNELS;
continue;
}
/*
* Dont allow roaming on 2G/6G band if only 5G band configured
* as supported roam band mask
*/
if (((wma_handle->bandcapability == BAND_5G) ||
(msg->band_mask == BIT(REG_BAND_5G))) &&
!WLAN_REG_IS_5GHZ_CH_FREQ(
msg->chan_weights.saved_chan_list[i])) {
msg->chan_weights.weighed_valid_list[i] =
WEIGHT_OF_DISALLOWED_CHANNELS;
continue;
}
/*
* Dont allow roaming on 2G/5G band if only 6G band configured
* as supported roam band mask
*/
if (msg->band_mask == BIT(REG_BAND_6G) &&
!WLAN_REG_IS_6GHZ_CHAN_FREQ(
msg->chan_weights.saved_chan_list[i])) {
msg->chan_weights.weighed_valid_list[i] =
WEIGHT_OF_DISALLOWED_CHANNELS;
continue;
}
/*
* Dont allow roaming on 6G band if only 2G + 5G band configured
* as supported roam band mask.
*/
if (msg->band_mask == (BIT(REG_BAND_2G) | BIT(REG_BAND_5G)) &&
(WLAN_REG_IS_6GHZ_CHAN_FREQ(
msg->chan_weights.saved_chan_list[i]))) {
msg->chan_weights.weighed_valid_list[i] =
WEIGHT_OF_DISALLOWED_CHANNELS;
continue;
}
/*
* Dont allow roaming on 2G band if only 5G + 6G band configured
* as supported roam band mask.
*/
if (msg->band_mask == (BIT(REG_BAND_5G) | BIT(REG_BAND_6G)) &&
(WLAN_REG_IS_24GHZ_CH_FREQ(
msg->chan_weights.saved_chan_list[i]))) {
msg->chan_weights.weighed_valid_list[i] =
WEIGHT_OF_DISALLOWED_CHANNELS;
continue;
}
if (msg->band_mask == BIT(REG_BAND_2G) &&
!WLAN_REG_IS_24GHZ_CH_FREQ(
msg->chan_weights.saved_chan_list[i]))
/*
* Dont allow roaming on 5G band if only 2G + 6G band configured
* as supported roam band mask.
*/
if (msg->band_mask == (BIT(REG_BAND_2G) | BIT(REG_BAND_6G)) &&
(WLAN_REG_IS_5GHZ_CH_FREQ(
msg->chan_weights.saved_chan_list[i]))) {
msg->chan_weights.weighed_valid_list[i] =
WEIGHT_OF_DISALLOWED_CHANNELS;
continue;
}
is_channel_allowed =
policy_mgr_is_sta_chan_valid_for_connect_and_roam(
@ -9354,10 +9424,6 @@ QDF_STATUS wma_send_set_pcl_cmd(tp_wma_handle wma_handle,
WEIGHT_OF_DISALLOWED_CHANNELS;
}
if (!QDF_IS_STATUS_SUCCESS(status)) {
wma_err("Error in creating weighed pcl");
return status;
}
wma_debug("Dump channel list send to wmi");
policy_mgr_dump_channel_list(msg->chan_weights.saved_num_chan,
msg->chan_weights.saved_chan_list,

View file

@ -1,5 +1,6 @@
/*
* Copyright (c) 2018-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
@ -255,6 +256,9 @@ int __osif_vdev_sync_trans_start(struct net_device *net_dev,
dsc_vdev_trans_start);
osif_vdev_sync_unlock();
if (!errno)
osif_vdev_sync_wait_for_ops(*out_vdev_sync);
return errno;
}
@ -269,6 +273,9 @@ int __osif_vdev_sync_trans_start_wait(struct net_device *net_dev,
out_vdev_sync, desc,
dsc_vdev_trans_start_wait);
if (!errno)
osif_vdev_sync_wait_for_ops(*out_vdev_sync);
return errno;
}