mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-05 19:31:57 -04:00
Merge tag 'LA.UM.9.14.1.r1-21100-QCM6490.QISI15.0' of https://git.codelinaro.org/clo/la/platform/vendor/qcom-opensource/wlan/qcacld-3.0 into android13-5.4-lahaina
LA.UM.9.14.1.r1-21100-QCM6490.QISI15.0 * tag 'LA.UM.9.14.1.r1-21100-QCM6490.QISI15.0' of https://git.codelinaro.org/clo/la/platform/vendor/qcom-opensource/wlan/qcacld-3.0: qcacld-3.0: Populate MBSSID cap in Ext CAP IE Release 2.0.8.35G qcacld-3.0: Fix underflow issue of beacon length Release 2.0.8.35F qcacld-3.0: don't overwrite psd_power flag if psd_set is true qcacld-3.0: Add TPE IE EIRP power support for 6 GHz band Release 2.0.8.35E qcacld-3.0: Validate bw in lim calculate tpc qcacld-3.0: Add Validation for WMA Handle and PSOC in Wake Event Release 2.0.8.35D qcacld-3.0: Add ini to apply RSSI delta for 6 GHz roam Release 2.0.8.35C qcacld-3.0: Update PMK from firmware for FT-SAE AKM also Release 2.0.8.35B qcacld-3.0: Rename variables name chan to chan_freq of wlan_hdd_mgmt_tx qcacld-3.0: Fix mgmt tx from supplicant failed on 6 GHz chan Release 2.0.8.35A qcacld-3.0: Fix potential OOB memory access Release 2.0.8.35 qcacld-3.0: Recalculate TX power post CSA qcacld-3.0: Correcting the TSInfo structure size according to the Spec qcacld-3.0: Fix the possible OOB write in country IE unpack qcacld-3.0: Enhance the RSNXE inter-op logic qcacld-3.0: Fix the AKM precedence order for RSN IE qcacld-3.0: Update connect request crypto parameters qcacld-3.0: Enable CFG80211_MULTI_AKM_CONNECT_SUPPORT from kernelv6.0 qcacld-3.0: Update wiphy max_num_akms_connect variable Change-Id: I87412b74b79c527b7c867dd61b062ad38da8aab3
This commit is contained in:
commit
18efc279f6
24 changed files with 356 additions and 150 deletions
|
|
@ -1,6 +1,7 @@
|
|||
/*
|
||||
* Copyright (c) 2018-2020 The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
* Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for
|
||||
* any purpose with or without fee is hereby granted, provided that the
|
||||
|
|
@ -1846,6 +1847,8 @@ static void mlme_init_lfr_cfg(struct wlan_objmgr_psoc *psoc,
|
|||
cfg_get(psoc, CFG_LFR3_ROAM_PREAUTH_RETRY_COUNT);
|
||||
lfr->roam_rssi_diff = cfg_get(psoc, CFG_LFR_ROAM_RSSI_DIFF);
|
||||
lfr->roam_rssi_diff_6ghz = cfg_get(psoc, CFG_LFR_ROAM_RSSI_DIFF_6GHZ);
|
||||
lfr->roam_rssi_delta_6ghz_to_non_6ghz =
|
||||
cfg_get(psoc, CFG_LFR_ROAM_RSSI_DELTA_6GHZ_TO_NON_6GHZ);
|
||||
lfr->bg_rssi_threshold = cfg_get(psoc, CFG_LFR_ROAM_BG_RSSI_TH);
|
||||
lfr->roam_scan_offload_enabled =
|
||||
cfg_get(psoc, CFG_LFR_ROAM_SCAN_OFFLOAD_ENABLED);
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
/*
|
||||
* Copyright (c) 2012-2020 The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
* Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for
|
||||
* any purpose with or without fee is hereby granted, provided that the
|
||||
|
|
@ -1280,6 +1281,38 @@
|
|||
CFG_VALUE_OR_DEFAULT, \
|
||||
"Enable 6 GHz roam based on rssi")
|
||||
|
||||
/*
|
||||
* <ini>
|
||||
* roam_rssi_delta_from_6ghz_to_non_6ghz - Enable roam to Non 6 GHz AP based
|
||||
* on rssi
|
||||
* @Min: 0
|
||||
* @Max: 100
|
||||
* @Default: 0
|
||||
*
|
||||
* This INI is used to decide whether to roam to Non 6 GHz AP or not based on
|
||||
* RSSI. AP1 is the currently associated AP(6 GHz) and AP2(2.4 GHz / 5 GHz) is
|
||||
* chosen for roaming. The Roaming will happen only if AP2 has better Signal
|
||||
* Quality and it has a RSSI better than AP1.
|
||||
* roam_rssi_delta_from_6ghz_to_non_6ghz is the number of dB units AP2 is
|
||||
* better than AP1.
|
||||
*
|
||||
*
|
||||
* Related: None
|
||||
*
|
||||
* Supported Feature: Roaming
|
||||
*
|
||||
* Usage: External
|
||||
*
|
||||
* </ini>
|
||||
*/
|
||||
#define CFG_LFR_ROAM_RSSI_DELTA_6GHZ_TO_NON_6GHZ CFG_INI_UINT( \
|
||||
"roam_rssi_delta_from_6ghz_to_non_6ghz", \
|
||||
0, \
|
||||
100, \
|
||||
0, \
|
||||
CFG_VALUE_OR_DEFAULT, \
|
||||
"Enable 6 GHz to non 6 GHz roam based on rssi")
|
||||
|
||||
/*
|
||||
* <ini>
|
||||
* bg_rssi_threshold - To set RSSI Threshold for BG scan roaming
|
||||
|
|
@ -2930,6 +2963,7 @@
|
|||
CFG(CFG_LFR_FAST_TRANSITION_ENABLED) \
|
||||
CFG(CFG_LFR_ROAM_RSSI_DIFF) \
|
||||
CFG(CFG_LFR_ROAM_RSSI_DIFF_6GHZ) \
|
||||
CFG(CFG_LFR_ROAM_RSSI_DELTA_6GHZ_TO_NON_6GHZ) \
|
||||
CFG(CFG_LFR_ROAM_BG_RSSI_TH) \
|
||||
CFG(CFG_LFR_ENABLE_WES_MODE) \
|
||||
CFG(CFG_LFR_ROAM_SCAN_OFFLOAD_ENABLED) \
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
/*
|
||||
* Copyright (c) 2018-2020 The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
* Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for
|
||||
* any purpose with or without fee is hereby granted, provided that the
|
||||
|
|
@ -1680,8 +1681,10 @@ struct fw_scan_channels {
|
|||
* @roam_preauth_no_ack_timeout: Configure the no ack timeout period
|
||||
* @roam_rssi_diff: Enable roam based on rssi
|
||||
* @roam_rssi_diff_6ghz: RSSI diff value to be used for roaming to 6 GHz AP.
|
||||
* @roam_scan_offload_enabled: Enable Roam Scan Offload
|
||||
* @neighbor_scan_timer_period: Neighbor scan timer period
|
||||
* @roam_rssi_delta_6ghz_to_non_6ghz: RSSI diff value to be used for
|
||||
* roaming from 6 GHz to Non 6GHz AP.
|
||||
* @roam_scan_offload_enabled: Enable Roam Scan Offload
|
||||
* @neighbor_scan_timer_period: Neighbor scan timer period
|
||||
* @neighbor_scan_min_timer_period: Min neighbor scan timer period
|
||||
* @neighbor_lookup_rssi_threshold: Neighbor lookup rssi threshold
|
||||
* @opportunistic_scan_threshold_diff: Set oppurtunistic threshold diff
|
||||
|
|
@ -1804,6 +1807,7 @@ struct wlan_mlme_lfr_cfg {
|
|||
uint32_t roam_preauth_no_ack_timeout;
|
||||
uint8_t roam_rssi_diff;
|
||||
uint8_t roam_rssi_diff_6ghz;
|
||||
uint8_t roam_rssi_delta_6ghz_to_non_6ghz;
|
||||
uint8_t bg_rssi_threshold;
|
||||
bool roam_scan_offload_enabled;
|
||||
uint32_t neighbor_scan_timer_period;
|
||||
|
|
|
|||
|
|
@ -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, 2025 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
|
||||
|
|
@ -211,7 +211,7 @@ static QDF_STATUS p2p_check_and_update_channel(struct tx_action_context *tx_ctx)
|
|||
struct p2p_soc_priv_obj *p2p_soc_obj;
|
||||
struct p2p_roc_context *curr_roc_ctx;
|
||||
|
||||
if (!tx_ctx || tx_ctx->chan) {
|
||||
if (!tx_ctx || tx_ctx->chan_freq) {
|
||||
p2p_err("NULL tx ctx or channel valid");
|
||||
return QDF_STATUS_E_INVAL;
|
||||
}
|
||||
|
|
@ -232,7 +232,7 @@ static QDF_STATUS p2p_check_and_update_channel(struct tx_action_context *tx_ctx)
|
|||
(mode == QDF_P2P_DEVICE_MODE ||
|
||||
mode == QDF_P2P_CLIENT_MODE ||
|
||||
mode == QDF_P2P_GO_MODE))
|
||||
tx_ctx->chan = curr_roc_ctx->chan;
|
||||
tx_ctx->chan_freq = curr_roc_ctx->chan_freq;
|
||||
|
||||
wlan_objmgr_vdev_release_ref(vdev, WLAN_P2P_ID);
|
||||
|
||||
|
|
@ -1068,16 +1068,13 @@ static QDF_STATUS p2p_mgmt_tx(struct tx_action_context *tx_ctx,
|
|||
void *mac_addr;
|
||||
uint8_t pdev_id;
|
||||
struct wlan_objmgr_vdev *vdev;
|
||||
uint16_t chanfreq = 0;
|
||||
|
||||
psoc = tx_ctx->p2p_soc_obj->soc;
|
||||
mgmt_param.tx_frame = packet;
|
||||
mgmt_param.frm_len = buf_len;
|
||||
mgmt_param.vdev_id = tx_ctx->vdev_id;
|
||||
mgmt_param.pdata = frame;
|
||||
if (tx_ctx->chan)
|
||||
chanfreq = (uint16_t)wlan_chan_to_freq(tx_ctx->chan);
|
||||
mgmt_param.chanfreq = chanfreq;
|
||||
mgmt_param.chanfreq = tx_ctx->chan_freq;
|
||||
|
||||
mgmt_param.qdf_ctx = wlan_psoc_get_qdf_dev(psoc);
|
||||
if (!(mgmt_param.qdf_ctx)) {
|
||||
|
|
@ -1161,7 +1158,7 @@ static QDF_STATUS p2p_roc_req_for_tx_action(
|
|||
p2p_soc_obj = tx_ctx->p2p_soc_obj;
|
||||
roc_ctx->p2p_soc_obj = p2p_soc_obj;
|
||||
roc_ctx->vdev_id = tx_ctx->vdev_id;
|
||||
roc_ctx->chan = tx_ctx->chan;
|
||||
roc_ctx->chan_freq = tx_ctx->chan_freq;
|
||||
roc_ctx->duration = tx_ctx->duration;
|
||||
roc_ctx->roc_state = ROC_STATE_IDLE;
|
||||
roc_ctx->roc_type = OFF_CHANNEL_TX;
|
||||
|
|
@ -1804,13 +1801,15 @@ void p2p_dump_tx_queue(struct p2p_soc_priv_obj *p2p_soc_obj)
|
|||
while (QDF_IS_STATUS_SUCCESS(status)) {
|
||||
tx_ctx = qdf_container_of(p_node,
|
||||
struct tx_action_context, node);
|
||||
p2p_debug("p2p soc object:%pK, tx ctx:%pK, vdev_id:%d, scan_id:%d, roc_cookie:%llx, chan:%d, buf:%pK, len:%d, off_chan:%d, cck:%d, ack:%d, duration:%d",
|
||||
p2p_soc_obj, tx_ctx,
|
||||
tx_ctx->vdev_id, tx_ctx->scan_id,
|
||||
tx_ctx->roc_cookie, tx_ctx->chan,
|
||||
tx_ctx->buf, tx_ctx->buf_len,
|
||||
tx_ctx->off_chan, tx_ctx->no_cck,
|
||||
tx_ctx->no_ack, tx_ctx->duration);
|
||||
p2p_debug("p2p soc object:%pK, tx ctx:%pK, vdev_id:%d, "
|
||||
"scan_id:%d, roc_cookie:%llx, freq:%d, buf:%pK, "
|
||||
"len:%d, off_chan:%d, cck:%d, ack:%d, duration:%d",
|
||||
p2p_soc_obj, tx_ctx,
|
||||
tx_ctx->vdev_id, tx_ctx->scan_id,
|
||||
tx_ctx->roc_cookie, tx_ctx->chan_freq,
|
||||
tx_ctx->buf, tx_ctx->buf_len,
|
||||
tx_ctx->off_chan, tx_ctx->no_cck,
|
||||
tx_ctx->no_ack, tx_ctx->duration);
|
||||
|
||||
status = qdf_list_peek_next(&p2p_soc_obj->tx_q_roc,
|
||||
p_node, &p_node);
|
||||
|
|
@ -1822,13 +1821,15 @@ void p2p_dump_tx_queue(struct p2p_soc_priv_obj *p2p_soc_obj)
|
|||
while (QDF_IS_STATUS_SUCCESS(status)) {
|
||||
tx_ctx = qdf_container_of(p_node,
|
||||
struct tx_action_context, node);
|
||||
p2p_debug("p2p soc object:%pK, tx_ctx:%pK, vdev_id:%d, scan_id:%d, roc_cookie:%llx, chan:%d, buf:%pK, len:%d, off_chan:%d, cck:%d, ack:%d, duration:%d",
|
||||
p2p_soc_obj, tx_ctx,
|
||||
tx_ctx->vdev_id, tx_ctx->scan_id,
|
||||
tx_ctx->roc_cookie, tx_ctx->chan,
|
||||
tx_ctx->buf, tx_ctx->buf_len,
|
||||
tx_ctx->off_chan, tx_ctx->no_cck,
|
||||
tx_ctx->no_ack, tx_ctx->duration);
|
||||
p2p_debug("p2p soc object:%pK, tx_ctx:%pK, vdev_id:%d, "
|
||||
"scan_id:%d, roc_cookie:%llx, freq:%d, buf:%pK, "
|
||||
"len:%d, off_chan:%d, cck:%d, ack:%d, duration:%d",
|
||||
p2p_soc_obj, tx_ctx,
|
||||
tx_ctx->vdev_id, tx_ctx->scan_id,
|
||||
tx_ctx->roc_cookie, tx_ctx->chan_freq,
|
||||
tx_ctx->buf, tx_ctx->buf_len,
|
||||
tx_ctx->off_chan, tx_ctx->no_cck,
|
||||
tx_ctx->no_ack, tx_ctx->duration);
|
||||
|
||||
status = qdf_list_peek_next(&p2p_soc_obj->tx_q_ack,
|
||||
p_node, &p_node);
|
||||
|
|
@ -2918,17 +2919,17 @@ void p2p_rand_mac_tx(struct tx_action_context *tx_action)
|
|||
return;
|
||||
soc = tx_action->p2p_soc_obj->soc;
|
||||
|
||||
if (!tx_action->no_ack && tx_action->chan &&
|
||||
if (!tx_action->no_ack && tx_action->chan_freq &&
|
||||
tx_action->buf_len > MIN_MAC_HEADER_LEN &&
|
||||
p2p_is_vdev_support_rand_mac_by_id(soc, tx_action->vdev_id) &&
|
||||
p2p_is_random_mac(soc, tx_action->vdev_id,
|
||||
&tx_action->buf[SRC_MAC_ADDR_OFFSET])) {
|
||||
status = p2p_request_random_mac(
|
||||
soc, tx_action->vdev_id,
|
||||
&tx_action->buf[SRC_MAC_ADDR_OFFSET],
|
||||
wlan_chan_to_freq(tx_action->chan),
|
||||
tx_action->id,
|
||||
tx_action->duration);
|
||||
soc, tx_action->vdev_id,
|
||||
&tx_action->buf[SRC_MAC_ADDR_OFFSET],
|
||||
tx_action->chan_freq,
|
||||
tx_action->id,
|
||||
tx_action->duration);
|
||||
if (status == QDF_STATUS_SUCCESS)
|
||||
tx_action->rand_mac_tx = true;
|
||||
else
|
||||
|
|
@ -2998,11 +2999,13 @@ QDF_STATUS p2p_process_mgmt_tx(struct tx_action_context *tx_ctx)
|
|||
|
||||
p2p_soc_obj = tx_ctx->p2p_soc_obj;
|
||||
|
||||
p2p_debug("soc:%pK, tx_ctx:%pK, vdev_id:%d, scan_id:%d, roc_cookie:%llx, chan:%d, buf:%pK, len:%d, off_chan:%d, cck:%d, ack:%d, duration:%d",
|
||||
p2p_soc_obj->soc, tx_ctx, tx_ctx->vdev_id,
|
||||
tx_ctx->scan_id, tx_ctx->roc_cookie, tx_ctx->chan,
|
||||
tx_ctx->buf, tx_ctx->buf_len, tx_ctx->off_chan,
|
||||
tx_ctx->no_cck, tx_ctx->no_ack, tx_ctx->duration);
|
||||
p2p_debug("soc:%pK, tx_ctx:%pK, vdev_id:%d, scan_id:%d, "
|
||||
"roc_cookie:%llx, freq:%d, buf:%pK, len:%d, "
|
||||
"off_chan:%d, cck:%d, ack:%d, duration:%d",
|
||||
p2p_soc_obj->soc, tx_ctx, tx_ctx->vdev_id,
|
||||
tx_ctx->scan_id, tx_ctx->roc_cookie, tx_ctx->chan_freq,
|
||||
tx_ctx->buf, tx_ctx->buf_len, tx_ctx->off_chan,
|
||||
tx_ctx->no_cck, tx_ctx->no_ack, tx_ctx->duration);
|
||||
|
||||
status = p2p_get_frame_info(tx_ctx->buf, tx_ctx->buf_len,
|
||||
&(tx_ctx->frame_info));
|
||||
|
|
@ -3031,8 +3034,8 @@ QDF_STATUS p2p_process_mgmt_tx(struct tx_action_context *tx_ctx)
|
|||
tx_ctx->no_ack = 1;
|
||||
}
|
||||
|
||||
if (!tx_ctx->off_chan || !tx_ctx->chan) {
|
||||
if (!tx_ctx->chan)
|
||||
if (!tx_ctx->off_chan || !tx_ctx->chan_freq) {
|
||||
if (!tx_ctx->chan_freq)
|
||||
p2p_check_and_update_channel(tx_ctx);
|
||||
status = p2p_execute_tx_action_frame(tx_ctx);
|
||||
if (status != QDF_STATUS_SUCCESS) {
|
||||
|
|
@ -3044,7 +3047,7 @@ QDF_STATUS p2p_process_mgmt_tx(struct tx_action_context *tx_ctx)
|
|||
|
||||
/* For off channel tx case */
|
||||
curr_roc_ctx = p2p_find_current_roc_ctx(p2p_soc_obj);
|
||||
if (curr_roc_ctx && (curr_roc_ctx->chan == tx_ctx->chan)) {
|
||||
if (curr_roc_ctx && (curr_roc_ctx->chan_freq == tx_ctx->chan_freq)) {
|
||||
if ((curr_roc_ctx->roc_state == ROC_STATE_REQUESTED) ||
|
||||
(curr_roc_ctx->roc_state == ROC_STATE_STARTED)) {
|
||||
tx_ctx->roc_cookie = (uintptr_t)curr_roc_ctx;
|
||||
|
|
@ -3075,7 +3078,8 @@ QDF_STATUS p2p_process_mgmt_tx(struct tx_action_context *tx_ctx)
|
|||
}
|
||||
}
|
||||
|
||||
curr_roc_ctx = p2p_find_roc_by_chan(p2p_soc_obj, tx_ctx->chan);
|
||||
curr_roc_ctx = p2p_find_roc_by_chan_freq(p2p_soc_obj,
|
||||
tx_ctx->chan_freq);
|
||||
if (curr_roc_ctx && (curr_roc_ctx->roc_state == ROC_STATE_IDLE)) {
|
||||
tx_ctx->roc_cookie = (uintptr_t)curr_roc_ctx;
|
||||
status = qdf_list_insert_back(
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* Copyright (c) 2017-2019 The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
* Copyright (c) 2022, 2025 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
|
||||
|
|
@ -157,7 +157,7 @@ struct p2p_frame_info {
|
|||
* @scan_id: Scan id given by scan component for this roc req
|
||||
* @roc_cookie: Cookie for remain on channel request
|
||||
* @id: Identifier of this tx context
|
||||
* @chan: Chan for which this tx has been requested
|
||||
* @chan_freq: Chan frequency for which this tx has been requested
|
||||
* @buf: tx buffer
|
||||
* @buf_len: Length of tx buffer
|
||||
* @off_chan: Is this off channel tx
|
||||
|
|
@ -174,7 +174,7 @@ struct tx_action_context {
|
|||
int scan_id;
|
||||
uint64_t roc_cookie;
|
||||
int32_t id;
|
||||
uint8_t chan;
|
||||
qdf_freq_t chan_freq;
|
||||
uint8_t *buf;
|
||||
int buf_len;
|
||||
bool off_chan;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* Copyright (c) 2017-2021 The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
* Copyright (c) 2023, 2025 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
|
||||
|
|
@ -114,7 +114,7 @@ static QDF_STATUS p2p_scan_start(struct p2p_roc_context *roc_ctx)
|
|||
req->scan_req.scan_type = SCAN_TYPE_P2P_LISTEN;
|
||||
req->scan_req.scan_req_id = p2p_soc_obj->scan_req_id;
|
||||
req->scan_req.chan_list.num_chan = 1;
|
||||
req->scan_req.chan_list.chan[0].freq = wlan_chan_to_freq(roc_ctx->chan);
|
||||
req->scan_req.chan_list.chan[0].freq = roc_ctx->chan_freq;
|
||||
req->scan_req.dwell_time_passive = roc_ctx->duration;
|
||||
req->scan_req.dwell_time_active = 0;
|
||||
req->scan_req.scan_priority = SCAN_PRIORITY_HIGH;
|
||||
|
|
@ -278,7 +278,7 @@ static QDF_STATUS p2p_send_roc_event(
|
|||
p2p_evt.vdev_id = roc_ctx->vdev_id;
|
||||
p2p_evt.roc_event = evt;
|
||||
p2p_evt.cookie = (uint64_t)roc_ctx->id;
|
||||
p2p_evt.chan = roc_ctx->chan;
|
||||
p2p_evt.chan_freq = roc_ctx->chan_freq;
|
||||
p2p_evt.duration = roc_ctx->duration;
|
||||
|
||||
p2p_debug("roc_event: %d, cookie:%llx", p2p_evt.roc_event,
|
||||
|
|
@ -305,9 +305,10 @@ static QDF_STATUS p2p_destroy_roc_ctx(struct p2p_roc_context *roc_ctx,
|
|||
QDF_STATUS status = QDF_STATUS_SUCCESS;
|
||||
struct p2p_soc_priv_obj *p2p_soc_obj = roc_ctx->p2p_soc_obj;
|
||||
|
||||
p2p_debug("p2p_soc_obj:%pK, roc_ctx:%pK, up_layer_event:%d, in_roc_queue:%d vdev_id:%d chan:%d duration:%d",
|
||||
p2p_soc_obj, roc_ctx, up_layer_event, in_roc_queue,
|
||||
roc_ctx->vdev_id, roc_ctx->chan, roc_ctx->duration);
|
||||
p2p_debug("p2p_soc_obj:%pK, roc_ctx:%pK, up_layer_event:%d,"
|
||||
" in_roc_queue:%d vdev_id:%d freq:%d duration:%d",
|
||||
p2p_soc_obj, roc_ctx, up_layer_event, in_roc_queue,
|
||||
roc_ctx->vdev_id, roc_ctx->chan_freq, roc_ctx->duration);
|
||||
|
||||
if (up_layer_event) {
|
||||
if (roc_ctx->roc_state < ROC_STATE_ON_CHAN)
|
||||
|
|
@ -391,11 +392,13 @@ static void p2p_roc_timeout(void *pdata)
|
|||
return;
|
||||
}
|
||||
|
||||
p2p_debug("p2p soc obj:%pK, roc ctx:%pK, vdev_id:%d, scan_id:%d, tx ctx:%pK, chan:%d, phy_mode:%d, duration:%d, roc_type:%d, roc_state:%d",
|
||||
roc_ctx->p2p_soc_obj, roc_ctx, roc_ctx->vdev_id,
|
||||
roc_ctx->scan_id, roc_ctx->tx_ctx, roc_ctx->chan,
|
||||
roc_ctx->phy_mode, roc_ctx->duration,
|
||||
roc_ctx->roc_type, roc_ctx->roc_state);
|
||||
p2p_debug("p2p soc obj:%pK, roc ctx:%pK, vdev_id:%d, scan_id:%d,"
|
||||
" tx ctx:%pK, freq:%d, phy_mode:%d, duration:%d,"
|
||||
" roc_type:%d, roc_state:%d",
|
||||
roc_ctx->p2p_soc_obj, roc_ctx, roc_ctx->vdev_id,
|
||||
roc_ctx->scan_id, roc_ctx->tx_ctx, roc_ctx->chan_freq,
|
||||
roc_ctx->phy_mode, roc_ctx->duration,
|
||||
roc_ctx->roc_type, roc_ctx->roc_state);
|
||||
|
||||
if (roc_ctx->roc_state == ROC_STATE_CANCEL_IN_PROG) {
|
||||
p2p_err("Cancellation already in progress");
|
||||
|
|
@ -418,11 +421,13 @@ static QDF_STATUS p2p_execute_roc_req(struct p2p_roc_context *roc_ctx)
|
|||
QDF_STATUS status;
|
||||
struct p2p_soc_priv_obj *p2p_soc_obj = roc_ctx->p2p_soc_obj;
|
||||
|
||||
p2p_debug("p2p soc obj:%pK, roc ctx:%pK, vdev_id:%d, scan_id:%d, tx ctx:%pK, chan:%d, phy_mode:%d, duration:%d, roc_type:%d, roc_state:%d",
|
||||
p2p_soc_obj, roc_ctx, roc_ctx->vdev_id,
|
||||
roc_ctx->scan_id, roc_ctx->tx_ctx, roc_ctx->chan,
|
||||
roc_ctx->phy_mode, roc_ctx->duration,
|
||||
roc_ctx->roc_type, roc_ctx->roc_state);
|
||||
p2p_debug("p2p soc obj:%pK, roc ctx:%pK, vdev_id:%d, scan_id:%d,"
|
||||
" tx ctx:%pK, freq:%d, phy_mode:%d, duration:%d,"
|
||||
" roc_type:%d, roc_state:%d",
|
||||
p2p_soc_obj, roc_ctx, roc_ctx->vdev_id,
|
||||
roc_ctx->scan_id, roc_ctx->tx_ctx, roc_ctx->chan_freq,
|
||||
roc_ctx->phy_mode, roc_ctx->duration,
|
||||
roc_ctx->roc_type, roc_ctx->roc_state);
|
||||
|
||||
/* prevent runtime suspend */
|
||||
qdf_runtime_pm_prevent_suspend(&p2p_soc_obj->roc_runtime_lock);
|
||||
|
|
@ -645,14 +650,14 @@ struct p2p_roc_context *p2p_find_current_roc_ctx(
|
|||
struct p2p_roc_context, node);
|
||||
if (roc_ctx->roc_state != ROC_STATE_IDLE) {
|
||||
p2p_debug("p2p soc obj:%pK, roc ctx:%pK, vdev_id"
|
||||
":%d, scan_id:%d, tx ctx:%pK, chan:"
|
||||
"%d, phy_mode:%d, duration:%d, "
|
||||
"roc_type:%d, roc_state:%d",
|
||||
roc_ctx->p2p_soc_obj, roc_ctx,
|
||||
roc_ctx->vdev_id, roc_ctx->scan_id,
|
||||
roc_ctx->tx_ctx, roc_ctx->chan,
|
||||
roc_ctx->phy_mode, roc_ctx->duration,
|
||||
roc_ctx->roc_type, roc_ctx->roc_state);
|
||||
":%d, scan_id:%d, tx ctx:%pK, freq:"
|
||||
"%d, phy_mode:%d, duration:%d, "
|
||||
"roc_type:%d, roc_state:%d",
|
||||
roc_ctx->p2p_soc_obj, roc_ctx,
|
||||
roc_ctx->vdev_id, roc_ctx->scan_id,
|
||||
roc_ctx->tx_ctx, roc_ctx->chan_freq,
|
||||
roc_ctx->phy_mode, roc_ctx->duration,
|
||||
roc_ctx->roc_type, roc_ctx->roc_state);
|
||||
|
||||
return roc_ctx;
|
||||
}
|
||||
|
|
@ -685,8 +690,8 @@ struct p2p_roc_context *p2p_find_roc_by_tx_ctx(
|
|||
return NULL;
|
||||
}
|
||||
|
||||
struct p2p_roc_context *p2p_find_roc_by_chan(
|
||||
struct p2p_soc_priv_obj *p2p_soc_obj, uint8_t chan)
|
||||
struct p2p_roc_context *p2p_find_roc_by_chan_freq(
|
||||
struct p2p_soc_priv_obj *p2p_soc_obj, qdf_freq_t chan_freq)
|
||||
{
|
||||
struct p2p_roc_context *roc_ctx;
|
||||
qdf_list_node_t *p_node;
|
||||
|
|
@ -697,11 +702,14 @@ struct p2p_roc_context *p2p_find_roc_by_chan(
|
|||
roc_ctx = qdf_container_of(p_node,
|
||||
struct p2p_roc_context,
|
||||
node);
|
||||
if (roc_ctx->chan == chan) {
|
||||
p2p_debug("p2p soc obj:%pK, roc ctx:%pK, vdev_id:%d, scan_id:%d, tx ctx:%pK, chan:%d, phy_mode:%d, duration:%d, roc_type:%d, roc_state:%d",
|
||||
if (roc_ctx->chan_freq == chan_freq) {
|
||||
p2p_debug("p2p soc obj:%pK, roc ctx:%pK, vdev_id:%d,"
|
||||
" scan_id:%d, tx ctx:%pK, freq:%d,"
|
||||
" phy_mode:%d, duration:%d,"
|
||||
" roc_type:%d, roc_state:%d",
|
||||
roc_ctx->p2p_soc_obj, roc_ctx,
|
||||
roc_ctx->vdev_id, roc_ctx->scan_id,
|
||||
roc_ctx->tx_ctx, roc_ctx->chan,
|
||||
roc_ctx->tx_ctx, roc_ctx->chan_freq,
|
||||
roc_ctx->phy_mode, roc_ctx->duration,
|
||||
roc_ctx->roc_type, roc_ctx->roc_state);
|
||||
|
||||
|
|
@ -808,10 +816,12 @@ QDF_STATUS p2p_process_cleanup_roc_queue(
|
|||
roc_ctx = qdf_container_of(p_node,
|
||||
struct p2p_roc_context, node);
|
||||
|
||||
p2p_debug("p2p soc obj:%pK, roc ctx:%pK, vdev_id:%d, scan_id:%d, tx ctx:%pK, chan:%d, phy_mode:%d, duration:%d, roc_type:%d, roc_state:%d",
|
||||
p2p_debug("p2p soc obj:%pK, roc ctx:%pK, vdev_id:%d, "
|
||||
"scan_id:%d, tx ctx:%pK, freq:%d, phy_mode:%d, "
|
||||
"duration:%d, roc_type:%d, roc_state:%d",
|
||||
roc_ctx->p2p_soc_obj, roc_ctx,
|
||||
roc_ctx->vdev_id, roc_ctx->scan_id,
|
||||
roc_ctx->tx_ctx, roc_ctx->chan,
|
||||
roc_ctx->tx_ctx, roc_ctx->chan_freq,
|
||||
roc_ctx->phy_mode, roc_ctx->duration,
|
||||
roc_ctx->roc_type, roc_ctx->roc_state);
|
||||
status = qdf_list_peek_next(&p2p_soc_obj->roc_q,
|
||||
|
|
@ -836,9 +846,11 @@ QDF_STATUS p2p_process_cleanup_roc_queue(
|
|||
roc_ctx = qdf_container_of(p_node,
|
||||
struct p2p_roc_context, node);
|
||||
|
||||
p2p_debug("p2p soc obj:%pK, roc ctx:%pK, vdev_id:%d, scan_id:%d, tx ctx:%pK, chan:%d, phy_mode:%d, duration:%d, roc_type:%d, roc_state:%d",
|
||||
p2p_debug("p2p soc obj:%pK, roc ctx:%pK, vdev_id:%d, "
|
||||
"scan_id:%d, tx ctx:%pK, freq:%d, phy_mode:%d, "
|
||||
"duration:%d, roc_type:%d, roc_state:%d",
|
||||
roc_ctx->p2p_soc_obj, roc_ctx, roc_ctx->vdev_id,
|
||||
roc_ctx->scan_id, roc_ctx->tx_ctx, roc_ctx->chan,
|
||||
roc_ctx->scan_id, roc_ctx->tx_ctx, roc_ctx->chan_freq,
|
||||
roc_ctx->phy_mode, roc_ctx->duration,
|
||||
roc_ctx->roc_type, roc_ctx->roc_state);
|
||||
|
||||
|
|
@ -871,11 +883,13 @@ QDF_STATUS p2p_process_roc_req(struct p2p_roc_context *roc_ctx)
|
|||
|
||||
p2p_soc_obj = roc_ctx->p2p_soc_obj;
|
||||
|
||||
p2p_debug("p2p soc obj:%pK, roc ctx:%pK, vdev_id:%d, scan_id:%d, tx_ctx:%pK, chan:%d, phy_mode:%d, duration:%d, roc_type:%d, roc_state:%d",
|
||||
p2p_soc_obj, roc_ctx, roc_ctx->vdev_id,
|
||||
roc_ctx->scan_id, roc_ctx->tx_ctx, roc_ctx->chan,
|
||||
roc_ctx->phy_mode, roc_ctx->duration,
|
||||
roc_ctx->roc_type, roc_ctx->roc_state);
|
||||
p2p_debug("p2p soc obj:%pK, roc ctx:%pK, vdev_id:%d, scan_id:%d, "
|
||||
"tx_ctx:%pK, freq:%d, phy_mode:%d, duration:%d, "
|
||||
"roc_type:%d, roc_state:%d",
|
||||
p2p_soc_obj, roc_ctx, roc_ctx->vdev_id,
|
||||
roc_ctx->scan_id, roc_ctx->tx_ctx, roc_ctx->chan_freq,
|
||||
roc_ctx->phy_mode, roc_ctx->duration,
|
||||
roc_ctx->roc_type, roc_ctx->roc_state);
|
||||
|
||||
status = qdf_list_insert_back(&p2p_soc_obj->roc_q,
|
||||
&roc_ctx->node);
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* Copyright (c) 2017-2019 The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
* Copyright (c) 2023, 2025 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
|
||||
|
|
@ -81,7 +81,7 @@ enum roc_state {
|
|||
* @vdev_id: Vdev id on which this request has come
|
||||
* @scan_id: Scan id given by scan component for this roc req
|
||||
* @tx_ctx: TX context if this ROC is for tx MGMT
|
||||
* @chan: Chan for which this RoC has been requested
|
||||
* @chan_freq: Chan frequency for which this RoC has been requested
|
||||
* @phy_mode: PHY mode
|
||||
* @duration: Duration for the RoC
|
||||
* @roc_type: RoC type User requested or internal
|
||||
|
|
@ -95,7 +95,7 @@ struct p2p_roc_context {
|
|||
uint32_t vdev_id;
|
||||
uint32_t scan_id;
|
||||
void *tx_ctx;
|
||||
uint8_t chan;
|
||||
qdf_freq_t chan_freq;
|
||||
uint8_t phy_mode;
|
||||
uint32_t duration;
|
||||
enum roc_type roc_type;
|
||||
|
|
@ -165,9 +165,9 @@ struct p2p_roc_context *p2p_find_roc_by_tx_ctx(
|
|||
struct p2p_soc_priv_obj *p2p_soc_obj, uint64_t cookie);
|
||||
|
||||
/**
|
||||
* p2p_find_roc_by_chan() - Find out roc context by channel
|
||||
* p2p_find_roc_by_chan_freq() - Find out roc context by channel
|
||||
* @p2p_soc_obj: p2p psoc private object
|
||||
* @chan: channel of the ROC
|
||||
* @chan_freq: channel frequency of the ROC
|
||||
*
|
||||
* This function finds out roc context by channel from p2p psoc
|
||||
* private object
|
||||
|
|
@ -175,8 +175,8 @@ struct p2p_roc_context *p2p_find_roc_by_tx_ctx(
|
|||
* Return: Pointer to roc context - success
|
||||
* NULL - failure
|
||||
*/
|
||||
struct p2p_roc_context *p2p_find_roc_by_chan(
|
||||
struct p2p_soc_priv_obj *p2p_soc_obj, uint8_t chan);
|
||||
struct p2p_roc_context *p2p_find_roc_by_chan_freq(
|
||||
struct p2p_soc_priv_obj *p2p_soc_obj, qdf_freq_t chan_freq);
|
||||
|
||||
/**
|
||||
* p2p_restart_roc_timer() - Restarts roc timer
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
/*
|
||||
* Copyright (c) 2017-2019 The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2025 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
|
||||
|
|
@ -61,13 +62,13 @@ struct p2p_ps_params {
|
|||
/**
|
||||
* struct p2p_roc_req - P2P roc request
|
||||
* @vdev_id: Vdev id on which this request has come
|
||||
* @chan: Chan for which this RoC has been requested
|
||||
* @chan_freq: Chan frequency for which this RoC has been requested
|
||||
* @phy_mode: PHY mode
|
||||
* @duration: Duration for the RoC
|
||||
*/
|
||||
struct p2p_roc_req {
|
||||
uint32_t vdev_id;
|
||||
uint32_t chan;
|
||||
qdf_freq_t chan_freq;
|
||||
uint32_t phy_mode;
|
||||
uint32_t duration;
|
||||
};
|
||||
|
|
@ -89,14 +90,14 @@ enum p2p_roc_event {
|
|||
* @vdev_id: Vdev id
|
||||
* @roc_event: RoC event
|
||||
* @cookie: Cookie which is given to supplicant for this roc req
|
||||
* @chan: Chan for which this RoC has been requested
|
||||
* @chan_freq: Chan frequency for which this RoC has been requested
|
||||
* @duration: Duration for the RoC
|
||||
*/
|
||||
struct p2p_event {
|
||||
uint32_t vdev_id;
|
||||
enum p2p_roc_event roc_event;
|
||||
uint64_t cookie;
|
||||
uint32_t chan;
|
||||
qdf_freq_t chan_freq;
|
||||
uint32_t duration;
|
||||
};
|
||||
|
||||
|
|
@ -137,7 +138,7 @@ struct p2p_tx_cnf {
|
|||
/**
|
||||
* struct p2p_mgmt_tx - p2p mgmt tx structure
|
||||
* @vdev_id: Vdev id
|
||||
* @chan: Chan for which this RoC has been requested
|
||||
* @chan_freq: Chan frequency for which this RoC has been requested
|
||||
* @wait: Duration for the RoC
|
||||
* @len: Length of tx buffer
|
||||
* @no_cck: Required cck or not
|
||||
|
|
@ -147,7 +148,7 @@ struct p2p_tx_cnf {
|
|||
*/
|
||||
struct p2p_mgmt_tx {
|
||||
uint32_t vdev_id;
|
||||
uint32_t chan;
|
||||
qdf_freq_t chan_freq;
|
||||
uint32_t wait;
|
||||
uint32_t len;
|
||||
uint32_t no_cck;
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
/*
|
||||
* Copyright (c) 2017-2020 The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2025 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
|
||||
|
|
@ -118,9 +119,9 @@ QDF_STATUS ucfg_p2p_roc_req(struct wlan_objmgr_psoc *soc,
|
|||
QDF_STATUS status;
|
||||
int32_t id;
|
||||
|
||||
p2p_debug("soc:%pK, vdev_id:%d, chan:%d, phy_mode:%d, duration:%d",
|
||||
soc, roc_req->vdev_id, roc_req->chan,
|
||||
roc_req->phy_mode, roc_req->duration);
|
||||
p2p_debug("soc:%pK, vdev_id:%d, chanfreq:%d, phy_mode:%d, duration:%d",
|
||||
soc, roc_req->vdev_id, roc_req->chan_freq,
|
||||
roc_req->phy_mode, roc_req->duration);
|
||||
|
||||
if (!soc) {
|
||||
p2p_err("psoc context passed is NULL");
|
||||
|
|
@ -148,7 +149,7 @@ QDF_STATUS ucfg_p2p_roc_req(struct wlan_objmgr_psoc *soc,
|
|||
*cookie = (uint64_t)id;
|
||||
roc_ctx->p2p_soc_obj = p2p_soc_obj;
|
||||
roc_ctx->vdev_id = roc_req->vdev_id;
|
||||
roc_ctx->chan = roc_req->chan;
|
||||
roc_ctx->chan_freq = roc_req->chan_freq;
|
||||
roc_ctx->phy_mode = roc_req->phy_mode;
|
||||
roc_ctx->duration = roc_req->duration;
|
||||
roc_ctx->roc_state = ROC_STATE_IDLE;
|
||||
|
|
@ -324,10 +325,11 @@ QDF_STATUS ucfg_p2p_mgmt_tx(struct wlan_objmgr_psoc *soc,
|
|||
QDF_STATUS status;
|
||||
int32_t id;
|
||||
|
||||
p2p_debug("soc:%pK, vdev_id:%d, chan:%d, wait:%d, buf_len:%d, cck:%d, no ack:%d, off chan:%d",
|
||||
soc, mgmt_frm->vdev_id, mgmt_frm->chan,
|
||||
mgmt_frm->wait, mgmt_frm->len, mgmt_frm->no_cck,
|
||||
mgmt_frm->dont_wait_for_ack, mgmt_frm->off_chan);
|
||||
p2p_debug("soc:%pK, vdev_id:%d, freq:%d, wait:%d, buf_len:%d,"
|
||||
" cck:%d, no ack:%d, off chan:%d",
|
||||
soc, mgmt_frm->vdev_id, mgmt_frm->chan_freq,
|
||||
mgmt_frm->wait, mgmt_frm->len, mgmt_frm->no_cck,
|
||||
mgmt_frm->dont_wait_for_ack, mgmt_frm->off_chan);
|
||||
|
||||
if (!soc) {
|
||||
p2p_err("psoc context passed is NULL");
|
||||
|
|
@ -361,7 +363,7 @@ QDF_STATUS ucfg_p2p_mgmt_tx(struct wlan_objmgr_psoc *soc,
|
|||
*cookie = (uint64_t)id;
|
||||
tx_action->p2p_soc_obj = p2p_soc_obj;
|
||||
tx_action->vdev_id = mgmt_frm->vdev_id;
|
||||
tx_action->chan = mgmt_frm->chan;
|
||||
tx_action->chan_freq = mgmt_frm->chan_freq;
|
||||
tx_action->duration = mgmt_frm->wait;
|
||||
tx_action->buf_len = mgmt_frm->len;
|
||||
tx_action->no_cck = mgmt_frm->no_cck;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
/*
|
||||
* Copyright (c) 2020, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
* Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
|
|
@ -264,6 +265,41 @@ target_if_cm_roam_rssi_diff_6ghz(struct wlan_objmgr_vdev *vdev,
|
|||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* target_if_cm_roam_rssi_delta_6ghz_to_non_6ghz() - Sends the roam RSSI
|
||||
* diff value to the FW. This value is used to determine how much better
|
||||
* the RSSI of the new/roamable non-6 GHz AP must be for roaming.
|
||||
*
|
||||
* @vdev: vdev object
|
||||
* @roam_rssi_delta_6ghz_to_non_6ghz: RSSI diff value to be used for roaming to
|
||||
* Non 6 GHz AP
|
||||
*
|
||||
* Return: QDF_STATUS
|
||||
*/
|
||||
static QDF_STATUS
|
||||
target_if_cm_roam_rssi_delta_6ghz_to_non_6ghz(struct wlan_objmgr_vdev *vdev,
|
||||
uint8_t roam_rssi_delta_6ghz_to_non_6ghz)
|
||||
{
|
||||
QDF_STATUS status = QDF_STATUS_E_FAILURE;
|
||||
uint8_t vdev_id;
|
||||
wmi_unified_t wmi_handle;
|
||||
|
||||
wmi_handle = target_if_cm_roam_get_wmi_handle_from_vdev(vdev);
|
||||
if (!wmi_handle)
|
||||
return status;
|
||||
|
||||
vdev_id = wlan_vdev_get_id(vdev);
|
||||
status = target_if_roam_set_param(
|
||||
wmi_handle, vdev_id,
|
||||
WMI_ROAM_PARAM_ROAM_RSSI_PENALTY_FOR_NON_6GHZ_CAND_AP,
|
||||
roam_rssi_delta_6ghz_to_non_6ghz);
|
||||
|
||||
if (QDF_IS_STATUS_ERROR(status))
|
||||
target_if_err("Failed to set WMI_ROAM_PARAM_ROAM_RSSI_PENALTY_FOR_NON_6GHZ_CAND_AP");
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
static QDF_STATUS
|
||||
target_if_cm_roam_scan_offload_rssi_thresh(
|
||||
wmi_unified_t wmi_handle,
|
||||
|
|
@ -367,6 +403,13 @@ target_if_cm_roam_rssi_diff_6ghz(struct wlan_objmgr_vdev *vdev,
|
|||
return QDF_STATUS_E_NOSUPPORT;
|
||||
}
|
||||
|
||||
static QDF_STATUS
|
||||
target_if_cm_roam_rssi_delta_6ghz_to_non_6ghz(struct wlan_objmgr_vdev *vdev,
|
||||
uint8_t roam_rssi_diff_6ghz)
|
||||
{
|
||||
return QDF_STATUS_E_NOSUPPORT;
|
||||
}
|
||||
|
||||
static inline void
|
||||
target_if_check_hi_rssi_5ghz_support(
|
||||
wmi_unified_t wmi_handle,
|
||||
|
|
@ -1276,6 +1319,9 @@ target_if_cm_roam_send_start(struct wlan_objmgr_vdev *vdev,
|
|||
if (req->wlan_roam_rssi_diff_6ghz)
|
||||
target_if_cm_roam_rssi_diff_6ghz(vdev,
|
||||
req->wlan_roam_rssi_diff_6ghz);
|
||||
if (req->wlan_roam_rssi_delta_6ghz_to_non_6ghz)
|
||||
target_if_cm_roam_rssi_delta_6ghz_to_non_6ghz(
|
||||
vdev, req->wlan_roam_rssi_delta_6ghz_to_non_6ghz);
|
||||
|
||||
/* add other wmi commands */
|
||||
end:
|
||||
|
|
@ -1516,6 +1562,10 @@ target_if_cm_roam_send_update_config(struct wlan_objmgr_vdev *vdev,
|
|||
if (req->wlan_roam_rssi_diff_6ghz)
|
||||
target_if_cm_roam_rssi_diff_6ghz(
|
||||
vdev, req->wlan_roam_rssi_diff_6ghz);
|
||||
|
||||
if (req->wlan_roam_rssi_delta_6ghz_to_non_6ghz)
|
||||
target_if_cm_roam_rssi_delta_6ghz_to_non_6ghz(
|
||||
vdev, req->wlan_roam_rssi_delta_6ghz_to_non_6ghz);
|
||||
}
|
||||
end:
|
||||
return status;
|
||||
|
|
|
|||
|
|
@ -629,6 +629,10 @@ cm_roam_start_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
|
|||
wlan_cm_roam_cfg_get_value(psoc, vdev_id, ROAM_RSSI_DIFF_6GHZ, &temp);
|
||||
start_req->wlan_roam_rssi_diff_6ghz = temp.uint_value;
|
||||
|
||||
wlan_cm_roam_cfg_get_value(psoc, vdev_id,
|
||||
ROAM_RSSI_DELTA_6GHZ_TO_NON_6GHZ, &temp);
|
||||
start_req->wlan_roam_rssi_delta_6ghz_to_non_6ghz = temp.uint_value;
|
||||
|
||||
status = wlan_cm_tgt_send_roam_start_req(psoc, vdev_id, start_req);
|
||||
if (QDF_IS_STATUS_ERROR(status))
|
||||
mlme_debug("fail to send roam start");
|
||||
|
|
@ -691,6 +695,10 @@ cm_roam_update_config_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
|
|||
wlan_cm_roam_cfg_get_value(psoc, vdev_id, ROAM_RSSI_DIFF_6GHZ, &temp);
|
||||
update_req->wlan_roam_rssi_diff_6ghz = temp.uint_value;
|
||||
|
||||
wlan_cm_roam_cfg_get_value(psoc, vdev_id,
|
||||
ROAM_RSSI_DELTA_6GHZ_TO_NON_6GHZ, &temp);
|
||||
update_req->wlan_roam_rssi_delta_6ghz_to_non_6ghz = temp.uint_value;
|
||||
|
||||
status = wlan_cm_tgt_send_roam_update_req(psoc, vdev_id, update_req);
|
||||
if (QDF_IS_STATUS_ERROR(status))
|
||||
mlme_debug("fail to send update config");
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
/*
|
||||
* Copyright (c) 2020-2021, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
* Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
|
|
@ -120,12 +121,14 @@
|
|||
* @BEACON_RSSI_WEIGHT: Beacon Rssi weight parameter
|
||||
* @HI_RSSI_DELAY_BTW_SCANS: High Rssi delay between scans
|
||||
* @ROAM_RSSI_DIFF_6GHZ: roam rssi diff for 6 GHz AP
|
||||
* @ROAM_RSSI_DELTA_6GHZ_TO_NON_6GHZ: roam rssi diff for Non 6 GHz AP
|
||||
*/
|
||||
enum roam_cfg_param {
|
||||
RSSI_CHANGE_THRESHOLD,
|
||||
BEACON_RSSI_WEIGHT,
|
||||
HI_RSSI_DELAY_BTW_SCANS,
|
||||
ROAM_RSSI_DIFF_6GHZ,
|
||||
ROAM_RSSI_DELTA_6GHZ_TO_NON_6GHZ,
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -1206,6 +1209,8 @@ enum roam_rt_stats_params {
|
|||
* scan only on prior discovery of any 6 GHz support in the environment.
|
||||
* @wlan_roam_rssi_diff_6ghz: This value is used as to how better the RSSI of
|
||||
* the new/roamable 6GHz AP should be for roaming.
|
||||
* @wlan_roam_rssi_delta_6ghz_to_non_6ghz: This value is used as to how better
|
||||
* the RSSI of the new/roamable non 6GHz AP should be for roaming.
|
||||
*/
|
||||
struct wlan_roam_start_config {
|
||||
struct wlan_roam_offload_scan_rssi_params rssi_params;
|
||||
|
|
@ -1229,6 +1234,7 @@ struct wlan_roam_start_config {
|
|||
uint8_t wlan_exclude_rm_partial_scan_freq;
|
||||
uint8_t wlan_roam_full_scan_6ghz_on_disc;
|
||||
uint8_t wlan_roam_rssi_diff_6ghz;
|
||||
uint8_t wlan_roam_rssi_delta_6ghz_to_non_6ghz;
|
||||
/* other wmi cmd structures */
|
||||
};
|
||||
|
||||
|
|
@ -1281,6 +1287,8 @@ struct wlan_roam_stop_config {
|
|||
* scan only on prior discovery of any 6 GHz support in the environment.
|
||||
* @wlan_roam_rssi_diff_6ghz: This value is used as to how better the RSSI of
|
||||
* the new/roamable 6GHz AP should be for roaming.
|
||||
* @wlan_roam_rssi_delta_6ghz_to_non_6ghz: This value is used as to how better
|
||||
* the RSSI of the new/roamable non 6GHz AP should be for roaming.
|
||||
*/
|
||||
struct wlan_roam_update_config {
|
||||
struct wlan_roam_beacon_miss_cnt beacon_miss_cnt;
|
||||
|
|
@ -1299,6 +1307,7 @@ struct wlan_roam_update_config {
|
|||
uint8_t wlan_exclude_rm_partial_scan_freq;
|
||||
uint8_t wlan_roam_full_scan_6ghz_on_disc;
|
||||
uint8_t wlan_roam_rssi_diff_6ghz;
|
||||
uint8_t wlan_roam_rssi_delta_6ghz_to_non_6ghz;
|
||||
};
|
||||
|
||||
#if defined(WLAN_FEATURE_HOST_ROAM) || defined(WLAN_FEATURE_ROAM_OFFLOAD)
|
||||
|
|
@ -1522,6 +1531,8 @@ enum roam_fail_params {
|
|||
* @roam_invoke_fail_reason: One of reason id from enum
|
||||
* wmi_roam_invoke_status_error in case of forced roam
|
||||
* @roam_rssi_diff_6ghz: roam rssi diff for 6 GHz AP
|
||||
* @roam_rssi_delta_6ghz_to_non_6ghz: RSSI Delta value to be used for roaming
|
||||
* from 6 GHz to Non 6GHz AP.
|
||||
*/
|
||||
struct wlan_cm_rso_configs {
|
||||
uint8_t rescan_rssi_delta;
|
||||
|
|
@ -1532,6 +1543,7 @@ struct wlan_cm_rso_configs {
|
|||
uint32_t roam_trigger_reason;
|
||||
uint32_t roam_invoke_fail_reason;
|
||||
uint8_t roam_rssi_diff_6ghz;
|
||||
uint8_t roam_rssi_delta_6ghz_to_non_6ghz;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
/*
|
||||
* Copyright (c) 2020, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
* Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
|
|
@ -519,6 +520,10 @@ QDF_STATUS wlan_cm_roam_cfg_get_value(struct wlan_objmgr_psoc *psoc,
|
|||
case ROAM_RSSI_DIFF_6GHZ:
|
||||
dst_config->uint_value = src_config->roam_rssi_diff_6ghz;
|
||||
break;
|
||||
case ROAM_RSSI_DELTA_6GHZ_TO_NON_6GHZ:
|
||||
dst_config->uint_value =
|
||||
src_config->roam_rssi_delta_6ghz_to_non_6ghz;
|
||||
break;
|
||||
default:
|
||||
mlme_err("Invalid roam config requested:%d", roam_cfg_type);
|
||||
status = QDF_STATUS_E_FAILURE;
|
||||
|
|
@ -568,6 +573,10 @@ wlan_cm_roam_cfg_set_value(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
|
|||
case ROAM_RSSI_DIFF_6GHZ:
|
||||
dst_config->roam_rssi_diff_6ghz = src_config->uint_value;
|
||||
break;
|
||||
case ROAM_RSSI_DELTA_6GHZ_TO_NON_6GHZ:
|
||||
dst_config->roam_rssi_delta_6ghz_to_non_6ghz =
|
||||
src_config->uint_value;
|
||||
break;
|
||||
default:
|
||||
mlme_err("Invalid roam config requested:%d", roam_cfg_type);
|
||||
status = QDF_STATUS_E_FAILURE;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* Copyright (c) 2012-2021 The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
* Copyright (c) 2022-2023, 2025 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
|
||||
|
|
@ -286,15 +286,16 @@ wlan_hdd_validate_and_override_offchan(struct hdd_adapter *adapter,
|
|||
struct ieee80211_channel *chan,
|
||||
bool *offchan)
|
||||
{
|
||||
uint8_t home_ch;
|
||||
qdf_freq_t home_ch_freq;
|
||||
|
||||
if (!offchan || !chan || !(*offchan))
|
||||
return;
|
||||
|
||||
home_ch = hdd_get_adapter_home_channel(adapter);
|
||||
home_ch_freq = hdd_get_adapter_home_channel(adapter);
|
||||
|
||||
if (ieee80211_frequency_to_channel(chan->center_freq) == home_ch) {
|
||||
hdd_debug("override offchan to 0 at home channel %d", home_ch);
|
||||
if (chan->center_freq == home_ch_freq) {
|
||||
hdd_debug("override offchan to 0 at home channel %d",
|
||||
home_ch_freq);
|
||||
*offchan = false;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -32,9 +32,9 @@
|
|||
#define QWLAN_VERSION_MAJOR 2
|
||||
#define QWLAN_VERSION_MINOR 0
|
||||
#define QWLAN_VERSION_PATCH 8
|
||||
#define QWLAN_VERSION_EXTRA "Z"
|
||||
#define QWLAN_VERSION_BUILD 34
|
||||
#define QWLAN_VERSION_EXTRA "G"
|
||||
#define QWLAN_VERSION_BUILD 35
|
||||
|
||||
#define QWLAN_VERSIONSTR "2.0.8.34Z"
|
||||
#define QWLAN_VERSIONSTR "2.0.8.35G"
|
||||
|
||||
#endif /* QWLAN_VERSION_H */
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* Copyright (c) 2012-2020 The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2024 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
* Copyright (c) 2024-2025 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
|
||||
|
|
@ -140,6 +140,7 @@ struct obss_detection_cfg {
|
|||
* @prev_auth_seq_num: Sequence number of previously received auth frame to
|
||||
* detect duplicate frames.
|
||||
* @prev_auth_mac_addr: mac_addr of the sta correspond to @prev_auth_seq_num
|
||||
* @cal_tpc_post_csa: Recalculate tx power power csa
|
||||
*/
|
||||
struct pe_session {
|
||||
/* To check session table is in use or free */
|
||||
|
|
@ -580,6 +581,7 @@ struct pe_session {
|
|||
uint32_t dfs_regdomain;
|
||||
uint8_t ap_defined_power_type_6g;
|
||||
uint8_t best_6g_power_type;
|
||||
bool cal_tpc_post_csa;
|
||||
};
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* Copyright (c) 2012-2020 The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
* Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for
|
||||
* any purpose with or without fee is hereby granted, provided that the
|
||||
|
|
@ -1903,6 +1903,8 @@ void lim_parse_tpe_ie(struct mac_context *mac, struct pe_session *session,
|
|||
uint16_t bw_val, ch_width;
|
||||
qdf_freq_t curr_op_freq, curr_freq;
|
||||
enum reg_6g_client_type client_mobility_type;
|
||||
enum reg_6g_ap_type ap_power_type_6g;
|
||||
uint16_t reg_max = 0, psd_power = 0;
|
||||
struct ch_params ch_params = {0};
|
||||
tDot11fIEtransmit_power_env single_tpe;
|
||||
/*
|
||||
|
|
@ -1979,6 +1981,25 @@ void lim_parse_tpe_ie(struct mac_context *mac, struct pe_session *session,
|
|||
curr_op_freq = session->curr_op_freq;
|
||||
bw_val = wlan_reg_get_bw_value(session->ch_width);
|
||||
|
||||
if (psd_set) {
|
||||
if (wlan_reg_is_6ghz_chan_freq(curr_op_freq)) {
|
||||
ap_power_type_6g = session->best_6g_power_type;
|
||||
|
||||
wlan_reg_get_client_power_for_connecting_ap(
|
||||
mac->pdev, ap_power_type_6g,
|
||||
curr_op_freq, true, ®_max, &psd_power);
|
||||
|
||||
/* If reg rules don't support psd power, ignore PSD
|
||||
* TPE IE
|
||||
*/
|
||||
if (!psd_power) {
|
||||
pe_debug_rl("reg rule doesn't support psd for %d ap type %d",
|
||||
curr_op_freq, ap_power_type_6g);
|
||||
psd_set = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (non_psd_set && !psd_set) {
|
||||
single_tpe = tpe_ies[non_psd_index];
|
||||
vdev_mlme->reg_tpc_obj.is_psd_power = false;
|
||||
|
|
@ -2059,6 +2080,9 @@ void lim_parse_tpe_ie(struct mac_context *mac, struct pe_session *session,
|
|||
single_tpe = tpe_ies[non_psd_index];
|
||||
vdev_mlme->reg_tpc_obj.eirp_power =
|
||||
single_tpe.tx_power[single_tpe.max_tx_pwr_count];
|
||||
pe_debug("eirp_power %d", vdev_mlme->reg_tpc_obj.eirp_power);
|
||||
if (!psd_set)
|
||||
vdev_mlme->reg_tpc_obj.is_psd_power = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -2202,7 +2226,6 @@ void lim_calculate_tpc(struct mac_context *mac,
|
|||
skip_tpe = wlan_mlme_skip_tpe(mac->psoc);
|
||||
} else {
|
||||
is_6ghz_freq = true;
|
||||
is_psd_power = wlan_reg_is_6g_psd_power(mac->pdev);
|
||||
if (LIM_IS_STA_ROLE(session))
|
||||
ap_power_type_6g = session->best_6g_power_type;
|
||||
}
|
||||
|
|
@ -2210,6 +2233,7 @@ void lim_calculate_tpc(struct mac_context *mac,
|
|||
if (mlme_obj->reg_tpc_obj.num_pwr_levels) {
|
||||
is_tpe_present = true;
|
||||
num_pwr_levels = mlme_obj->reg_tpc_obj.num_pwr_levels;
|
||||
is_psd_power = mlme_obj->reg_tpc_obj.is_psd_power;
|
||||
} else {
|
||||
num_pwr_levels = lim_get_num_pwr_levels(is_psd_power,
|
||||
session->ch_width);
|
||||
|
|
@ -2223,13 +2247,21 @@ void lim_calculate_tpc(struct mac_context *mac,
|
|||
|
||||
ch_params.ch_width = CH_WIDTH_20MHZ;
|
||||
|
||||
for (i = 0; i < num_pwr_levels; i++) {
|
||||
for (i = 0;
|
||||
i < num_pwr_levels && (ch_params.ch_width != CH_WIDTH_INVALID);
|
||||
i++) {
|
||||
if (is_tpe_present) {
|
||||
if (is_6ghz_freq) {
|
||||
wlan_reg_get_client_power_for_connecting_ap(
|
||||
mac->pdev, ap_power_type_6g,
|
||||
mlme_obj->reg_tpc_obj.frequency[i],
|
||||
&is_psd_power, ®_max, &psd_power);
|
||||
if (is_psd_power) {
|
||||
wlan_reg_get_client_power_for_connecting_ap(
|
||||
mac->pdev, ap_power_type_6g,
|
||||
mlme_obj->reg_tpc_obj.frequency[i],
|
||||
is_psd_power, ®_max, &psd_power);
|
||||
} else {
|
||||
wlan_reg_get_client_power_for_connecting_ap(
|
||||
mac->pdev, ap_power_type_6g, oper_freq,
|
||||
is_psd_power, ®_max, &psd_power);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
/* center frequency calculation */
|
||||
|
|
@ -2241,18 +2273,18 @@ void lim_calculate_tpc(struct mac_context *mac,
|
|||
mac->pdev, oper_freq, 0, &ch_params);
|
||||
mlme_obj->reg_tpc_obj.frequency[i] =
|
||||
ch_params.mhz_freq_seg0;
|
||||
ch_params.ch_width =
|
||||
get_next_higher_bw[ch_params.ch_width];
|
||||
if (ch_params.ch_width != CH_WIDTH_INVALID)
|
||||
ch_params.ch_width =
|
||||
get_next_higher_bw[ch_params.ch_width];
|
||||
}
|
||||
if (is_6ghz_freq) {
|
||||
if (LIM_IS_STA_ROLE(session)) {
|
||||
wlan_reg_get_client_power_for_connecting_ap
|
||||
(mac->pdev, ap_power_type_6g,
|
||||
mlme_obj->reg_tpc_obj.frequency[i],
|
||||
&is_psd_power, ®_max, &psd_power);
|
||||
is_psd_power, ®_max, &psd_power);
|
||||
} else {
|
||||
ap_power_type_6g =
|
||||
wlan_reg_get_cur_6g_ap_pwr_type(
|
||||
wlan_reg_get_cur_6g_ap_pwr_type(
|
||||
mac->pdev,
|
||||
&ap_power_type_6g);
|
||||
wlan_reg_get_6g_chan_ap_power(
|
||||
|
|
@ -2318,7 +2350,6 @@ void lim_calculate_tpc(struct mac_context *mac,
|
|||
}
|
||||
|
||||
mlme_obj->reg_tpc_obj.num_pwr_levels = num_pwr_levels;
|
||||
mlme_obj->reg_tpc_obj.is_psd_power = is_psd_power;
|
||||
mlme_obj->reg_tpc_obj.eirp_power = reg_max;
|
||||
mlme_obj->reg_tpc_obj.power_type_6g = ap_power_type_6g;
|
||||
|
||||
|
|
@ -6489,6 +6520,9 @@ static void lim_process_set_ie_req(struct mac_context *mac_ctx, uint32_t *msg_bu
|
|||
if (p_ext_cap->interworking_service)
|
||||
p_ext_cap->qos_map = 1;
|
||||
|
||||
if (wma_is_mbssid_enabled())
|
||||
p_ext_cap->multi_bssid = 1;
|
||||
|
||||
extra_ext_cap.num_bytes = lim_compute_ext_cap_ie_length(&extra_ext_cap);
|
||||
|
||||
send_ie:
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
/*
|
||||
* Copyright (c) 2012-2020 The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2025 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
|
||||
|
|
@ -1884,6 +1885,7 @@ void lim_handle_csa_offload_msg(struct mac_context *mac_ctx,
|
|||
|
||||
err:
|
||||
qdf_mem_free(csa_params);
|
||||
session_entry->cal_tpc_post_csa = true;
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* Copyright (c) 2012-2021 The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
* Copyright (c) 2021-2025 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
|
||||
|
|
@ -704,8 +704,9 @@ static void __sch_beacon_process_for_session(struct mac_context *mac_ctx,
|
|||
}
|
||||
|
||||
if ((ap_constraint_change && local_constraint) ||
|
||||
(tpe_change && !skip_tpe)) {
|
||||
(tpe_change && !skip_tpe) || session->cal_tpc_post_csa) {
|
||||
lim_calculate_tpc(mac_ctx, session);
|
||||
session->cal_tpc_post_csa = false;
|
||||
|
||||
if (tx_ops->set_tpc_power)
|
||||
tx_ops->set_tpc_power(mac_ctx->psoc,
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* Copyright (c) 2012-2020 The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
* Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for
|
||||
* any purpose with or without fee is hereby granted, provided that the
|
||||
|
|
@ -17422,6 +17422,8 @@ static void csr_cm_update_driver_assoc_ies(
|
|||
MIN_TX_PWR_CAP, MAX_TX_PWR_CAP};
|
||||
uint8_t max_tx_pwr_cap = 0;
|
||||
uint8_t supp_chan_ie[DOT11F_IE_SUPPCHANNELS_MAX_LEN], supp_chan_ie_len;
|
||||
struct s_ext_cap *extcap;
|
||||
uint8_t *ext_cap_ie;
|
||||
static const uint8_t qcn_ie[] = {0x8C, 0xFD, 0xF0, 0x1,
|
||||
QCN_IE_VERSION_SUBATTR_ID,
|
||||
QCN_IE_VERSION_SUBATTR_DATA_LEN,
|
||||
|
|
@ -17433,6 +17435,14 @@ static void csr_cm_update_driver_assoc_ies(
|
|||
qdf_mem_copy(rso_mode_cfg->assoc_ie, session->pAddIEAssoc,
|
||||
rso_mode_cfg->assoc_ie_length);
|
||||
|
||||
ext_cap_ie = (uint8_t *)wlan_get_ie_ptr_from_eid(WLAN_ELEMID_XCAPS,
|
||||
rso_mode_cfg->assoc_ie,
|
||||
rso_mode_cfg->assoc_ie_length);
|
||||
if (ext_cap_ie && wma_is_mbssid_enabled()) {
|
||||
extcap = (struct s_ext_cap *)&ext_cap_ie[2];
|
||||
extcap->multi_bssid = 1;
|
||||
}
|
||||
|
||||
if (session->pConnectBssDesc)
|
||||
max_tx_pwr_cap = csr_get_cfg_max_tx_power(
|
||||
mac_ctx,
|
||||
|
|
@ -21586,11 +21596,12 @@ csr_process_roam_sync_callback(struct mac_context *mac_ctx,
|
|||
* eapol. So the session->psk_pmk will be stale in PMKSA cached
|
||||
* SAE/OWE roaming case.
|
||||
*/
|
||||
akm_type = session->connectedProfile.AuthType;
|
||||
|
||||
if (roam_synch_data->authStatus == CSR_ROAM_AUTH_STATUS_AUTHENTICATED ||
|
||||
session->pCurRoamProfile->negotiatedAuthType ==
|
||||
eCSR_AUTH_TYPE_SAE ||
|
||||
session->pCurRoamProfile->negotiatedAuthType ==
|
||||
eCSR_AUTH_TYPE_OWE) {
|
||||
akm_type == eCSR_AUTH_TYPE_SAE ||
|
||||
akm_type == eCSR_AUTH_TYPE_FT_SAE ||
|
||||
akm_type == eCSR_AUTH_TYPE_OWE) {
|
||||
csr_roam_substate_change(mac_ctx,
|
||||
eCSR_ROAM_SUBSTATE_NONE, session_id);
|
||||
/*
|
||||
|
|
@ -21615,8 +21626,7 @@ csr_process_roam_sync_callback(struct mac_context *mac_ctx,
|
|||
&session->connectedProfile.bssid);
|
||||
sme_debug("Trying to find PMKID for " QDF_MAC_ADDR_FMT " AKM Type:%d",
|
||||
QDF_MAC_ADDR_REF(pmkid_cache->BSSID.bytes),
|
||||
session->pCurRoamProfile->negotiatedAuthType);
|
||||
akm_type = session->connectedProfile.AuthType;
|
||||
akm_type);
|
||||
mdie_present = session->connectedProfile.mdid.mdie_present;
|
||||
|
||||
if (csr_lookup_pmkid_using_bssid(mac_ctx, session,
|
||||
|
|
@ -21696,6 +21706,8 @@ csr_process_roam_sync_callback(struct mac_context *mac_ctx,
|
|||
qdf_mem_zero(pmksa, sizeof(*pmksa));
|
||||
qdf_mem_free(pmksa);
|
||||
}
|
||||
} else {
|
||||
sme_debug("PMK not received from fw");
|
||||
}
|
||||
sme_debug("pmkid found for " QDF_MAC_ADDR_FMT " len %d",
|
||||
QDF_MAC_ADDR_REF(pmkid_cache->BSSID.bytes),
|
||||
|
|
|
|||
|
|
@ -848,6 +848,9 @@ static void csr_neighbor_roam_info_ctx_init(struct mac_context *mac,
|
|||
wlan_cm_roam_cfg_set_value(mac->psoc, session_id,
|
||||
ROAM_RSSI_DIFF_6GHZ, &src_cfg);
|
||||
|
||||
src_cfg.uint_value = mac->mlme_cfg->lfr.roam_rssi_delta_6ghz_to_non_6ghz;
|
||||
wlan_cm_roam_cfg_set_value(mac->psoc, session_id,
|
||||
ROAM_RSSI_DELTA_6GHZ_TO_NON_6GHZ, &src_cfg);
|
||||
/*
|
||||
* Now we can clear the preauthDone that
|
||||
* was saved as we are connected afresh
|
||||
|
|
|
|||
|
|
@ -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) Qualcomm Technologies, Inc. and/or its subsidiaries.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for
|
||||
* any purpose with or without fee is hereby granted, provided that the
|
||||
|
|
@ -2813,6 +2813,9 @@ int wma_wow_wakeup_host_event(void *handle, uint8_t *event, uint32_t len)
|
|||
WMI_WOW_WAKEUP_HOST_EVENTID_param_tlvs *event_param;
|
||||
WOW_EVENT_INFO_fixed_param *wake_info;
|
||||
|
||||
if (!wma || !wma->psoc)
|
||||
return -EINVAL;
|
||||
|
||||
event_param = (WMI_WOW_WAKEUP_HOST_EVENTID_param_tlvs *)event;
|
||||
if (!event_param) {
|
||||
wma_err("Wake event data is null");
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* Copyright (c) 2013-2020 The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||
* Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for
|
||||
* any purpose with or without fee is hereby granted, provided that the
|
||||
|
|
@ -1171,20 +1171,28 @@ static void wma_update_beacon_noa_ie(struct beacon_info *bcn,
|
|||
/* TODO: Assuming p2p noa ie is last ie in the beacon */
|
||||
qdf_mem_zero(bcn->noa_ie, (bcn->noa_sub_ie_len +
|
||||
sizeof(struct p2p_ie)));
|
||||
bcn->len -= (bcn->noa_sub_ie_len +
|
||||
sizeof(struct p2p_ie));
|
||||
if (bcn->len < (bcn->noa_sub_ie_len +
|
||||
sizeof(struct p2p_ie)))
|
||||
bcn->len = 0;
|
||||
else
|
||||
bcn->len -= (bcn->noa_sub_ie_len +
|
||||
sizeof(struct p2p_ie));
|
||||
bcn->noa_ie = NULL;
|
||||
bcn->noa_sub_ie_len = 0;
|
||||
}
|
||||
wma_debug("No need to update NoA");
|
||||
return;
|
||||
}
|
||||
|
||||
if (bcn->noa_sub_ie_len && bcn->noa_ie) {
|
||||
if (bcn->len < (bcn->noa_sub_ie_len + sizeof(struct p2p_ie)))
|
||||
bcn->len = 0;
|
||||
else
|
||||
bcn->len -= (bcn->noa_sub_ie_len +
|
||||
sizeof(struct p2p_ie));
|
||||
|
||||
/* NoA present in previous beacon, update it */
|
||||
wma_debug("NoA present in previous beacon, update the NoA IE, bcn->len %u bcn->noa_sub_ie_len %u",
|
||||
bcn->len, bcn->noa_sub_ie_len);
|
||||
bcn->len -= (bcn->noa_sub_ie_len + sizeof(struct p2p_ie));
|
||||
bcn->len, bcn->noa_sub_ie_len);
|
||||
qdf_mem_zero(bcn->noa_ie,
|
||||
(bcn->noa_sub_ie_len + sizeof(struct p2p_ie)));
|
||||
} else { /* NoA is not present in previous beacon */
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
/*
|
||||
* Copyright (c) 2017-2020 The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2025 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
|
||||
|
|
@ -281,8 +282,7 @@ static void wlan_p2p_event_callback(void *user_data,
|
|||
goto fail;
|
||||
}
|
||||
|
||||
chan = ieee80211_get_channel(wdev->wiphy,
|
||||
wlan_chan_to_freq(p2p_event->chan));
|
||||
chan = ieee80211_get_channel(wdev->wiphy, p2p_event->chan_freq);
|
||||
if (!chan) {
|
||||
osif_err("channel conversion failed");
|
||||
goto fail;
|
||||
|
|
@ -360,7 +360,7 @@ int wlan_cfg80211_roc(struct wlan_objmgr_vdev *vdev,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
roc_req.chan = (uint32_t)wlan_freq_to_chan(chan->center_freq);
|
||||
roc_req.chan_freq = chan->center_freq;
|
||||
roc_req.duration = duration;
|
||||
roc_req.vdev_id = (uint32_t)vdev_id;
|
||||
|
||||
|
|
@ -372,7 +372,7 @@ int wlan_cfg80211_roc(struct wlan_objmgr_vdev *vdev,
|
|||
}
|
||||
|
||||
if (!ok) {
|
||||
osif_err("channel%d not OK for DNBS", roc_req.chan);
|
||||
osif_err("channel%d not OK for DNBS", roc_req.chan_freq);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
|
@ -409,7 +409,7 @@ int wlan_cfg80211_mgmt_tx(struct wlan_objmgr_vdev *vdev,
|
|||
struct p2p_mgmt_tx mgmt_tx = {0};
|
||||
struct wlan_objmgr_psoc *psoc;
|
||||
uint8_t vdev_id;
|
||||
uint32_t channel = 0;
|
||||
qdf_freq_t chan_freq = 0;
|
||||
|
||||
if (!vdev) {
|
||||
osif_err("invalid vdev object");
|
||||
|
|
@ -417,7 +417,7 @@ int wlan_cfg80211_mgmt_tx(struct wlan_objmgr_vdev *vdev,
|
|||
}
|
||||
|
||||
if (chan)
|
||||
channel = (uint32_t)wlan_freq_to_chan(chan->center_freq);
|
||||
chan_freq = chan->center_freq;
|
||||
else
|
||||
osif_debug("NULL chan, set channel to 0");
|
||||
|
||||
|
|
@ -436,8 +436,7 @@ int wlan_cfg80211_mgmt_tx(struct wlan_objmgr_vdev *vdev,
|
|||
int ret;
|
||||
bool ok;
|
||||
|
||||
ret = policy_mgr_is_chan_ok_for_dnbs(
|
||||
psoc, wlan_chan_to_freq(channel), &ok);
|
||||
ret = policy_mgr_is_chan_ok_for_dnbs(psoc, chan_freq, &ok);
|
||||
if (QDF_IS_STATUS_ERROR(ret)) {
|
||||
osif_err("policy_mgr_is_chan_ok_for_dnbs():ret:%d",
|
||||
ret);
|
||||
|
|
@ -445,13 +444,13 @@ int wlan_cfg80211_mgmt_tx(struct wlan_objmgr_vdev *vdev,
|
|||
}
|
||||
if (!ok) {
|
||||
osif_err("Rejecting mgmt_tx for channel:%d as DNSC is set",
|
||||
channel);
|
||||
chan_freq);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
mgmt_tx.vdev_id = (uint32_t)vdev_id;
|
||||
mgmt_tx.chan = channel;
|
||||
mgmt_tx.chan_freq = chan_freq;
|
||||
mgmt_tx.wait = wait;
|
||||
mgmt_tx.len = len;
|
||||
mgmt_tx.no_cck = (uint32_t)no_cck;
|
||||
|
|
|
|||
Loading…
Reference in a new issue