Merge dc29e1d7f3 on remote branch

Change-Id: Ife9a81ff625602b5eb70bd855e0808ebe6637c17
This commit is contained in:
Linux Build Service Account 2024-09-11 06:14:39 -07:00
commit 3c72258e79
15 changed files with 3343 additions and 150 deletions

View File

@ -31,6 +31,81 @@ defined(WLAN_PKT_CAPTURE_RX_2_0)
#include <hal_generic_api.h>
#include <hal_api_mon.h>
#define HAL_RX_PPDU_START_PHY_PPDU_ID_OFFSET 0x00000000
#define HAL_RX_PPDU_START_PHY_PPDU_ID_LSB 0
#define HAL_RX_PPDU_START_PHY_PPDU_ID_MSB 15
#define HAL_RX_PPDU_START_PHY_PPDU_ID_MASK 0x0000ffff
#define HAL_RX_PPDU_START_SW_PHY_META_DATA_OFFSET 0x00000004
#define HAL_RX_PPDU_START_SW_PHY_META_DATA_LSB 0
#define HAL_RX_PPDU_START_SW_PHY_META_DATA_MSB 31
#define HAL_RX_PPDU_START_SW_PHY_META_DATA_MASK 0xffffffff
#define HAL_RX_PPDU_START_PPDU_START_TIMESTAMP_31_0_OFFSET 0x00000008
#define HAL_RX_PPDU_START_PPDU_START_TIMESTAMP_31_0_LSB 0
#define HAL_RX_PPDU_START_PPDU_START_TIMESTAMP_31_0_MSB 31
#define HAL_RX_PPDU_START_PPDU_START_TIMESTAMP_31_0_MASK 0xffffffff
#define HAL_RXPCU_PPDU_END_INFO_WB_TIMESTAMP_LOWER_32_OFFSET 0x00000000
#define HAL_RXPCU_PPDU_END_INFO_WB_TIMESTAMP_LOWER_32_LSB 0
#define HAL_RXPCU_PPDU_END_INFO_WB_TIMESTAMP_LOWER_32_MSB 31
#define HAL_RXPCU_PPDU_END_INFO_WB_TIMESTAMP_LOWER_32_MASK 0xffffffff
#define HAL_RXPCU_PPDU_END_INFO_WB_TIMESTAMP_UPPER_32_OFFSET 0x00000004
#define HAL_RXPCU_PPDU_END_INFO_WB_TIMESTAMP_UPPER_32_LSB 0
#define HAL_RXPCU_PPDU_END_INFO_WB_TIMESTAMP_UPPER_32_MSB 31
#define HAL_RXPCU_PPDU_END_INFO_WB_TIMESTAMP_UPPER_32_MASK 0xffffffff
#define HAL_RXPCU_PPDU_END_INFO_RX_ANTENNA_OFFSET 0x00000008
#define HAL_RXPCU_PPDU_END_INFO_RX_ANTENNA_LSB 0
#define HAL_RXPCU_PPDU_END_INFO_RX_ANTENNA_MSB 23
#define HAL_RXPCU_PPDU_END_INFO_RX_ANTENNA_MASK 0x00ffffff
#define HAL_RX_PPDU_END_USER_STATS_EXT_FCS_OK_BITMAP_95_64_OFFSET 0x00000004
#define HAL_RX_PPDU_END_USER_STATS_EXT_FCS_OK_BITMAP_95_64_LSB 0
#define HAL_RX_PPDU_END_USER_STATS_EXT_FCS_OK_BITMAP_95_64_MSB 31
#define HAL_RX_PPDU_END_USER_STATS_EXT_FCS_OK_BITMAP_95_64_MASK 0xffffffff
#define HAL_RX_PPDU_END_USER_STATS_EXT_FCS_OK_BITMAP_127_96_OFFSET 0x00000008
#define HAL_RX_PPDU_END_USER_STATS_EXT_FCS_OK_BITMAP_127_96_LSB 0
#define HAL_RX_PPDU_END_USER_STATS_EXT_FCS_OK_BITMAP_127_96_MSB 31
#define HAL_RX_PPDU_END_USER_STATS_EXT_FCS_OK_BITMAP_127_96_MASK 0xffffffff
#define HAL_RX_PPDU_END_USER_STATS_EXT_FCS_OK_BITMAP_159_128_OFFSET 0x0000000c
#define HAL_RX_PPDU_END_USER_STATS_EXT_FCS_OK_BITMAP_159_128_LSB 0
#define HAL_RX_PPDU_END_USER_STATS_EXT_FCS_OK_BITMAP_159_128_MSB 31
#define HAL_RX_PPDU_END_USER_STATS_EXT_FCS_OK_BITMAP_159_128_MASK 0xffffffff
#define HAL_RX_PPDU_END_USER_STATS_EXT_FCS_OK_BITMAP_191_160_OFFSET 0x00000010
#define HAL_RX_PPDU_END_USER_STATS_EXT_FCS_OK_BITMAP_191_160_LSB 0
#define HAL_RX_PPDU_END_USER_STATS_EXT_FCS_OK_BITMAP_191_160_MSB 31
#define HAL_RX_PPDU_END_USER_STATS_EXT_FCS_OK_BITMAP_191_160_MASK 0xffffffff
#define HAL_RX_PPDU_END_USER_STATS_EXT_FCS_OK_BITMAP_223_192_OFFSET 0x00000014
#define HAL_RX_PPDU_END_USER_STATS_EXT_FCS_OK_BITMAP_223_192_LSB 0
#define HAL_RX_PPDU_END_USER_STATS_EXT_FCS_OK_BITMAP_223_192_MSB 31
#define HAL_RX_PPDU_END_USER_STATS_EXT_FCS_OK_BITMAP_223_192_MASK 0xffffffff
#define HAL_RX_PPDU_END_USER_STATS_EXT_FCS_OK_BITMAP_255_224_OFFSET 0x00000018
#define HAL_RX_PPDU_END_USER_STATS_EXT_FCS_OK_BITMAP_255_224_LSB 0
#define HAL_RX_PPDU_END_USER_STATS_EXT_FCS_OK_BITMAP_255_224_MSB 31
#define HAL_RX_PPDU_END_USER_STATS_EXT_FCS_OK_BITMAP_255_224_MASK 0xffffffff
#define HAL_RXPCU_PPDU_END_INFO_RX_PPDU_DURATION_OFFSET 0x00000024
#define HAL_RXPCU_PPDU_END_INFO_RX_PPDU_DURATION_LSB 0
#define HAL_RXPCU_PPDU_END_INFO_RX_PPDU_DURATION_MSB 23
#define HAL_RXPCU_PPDU_END_INFO_RX_PPDU_DURATION_MASK 0x00ffffff
#define HAL_PHYRX_RSSI_LEGACY_RECEPTION_TYPE_OFFSET 0x00000000
#define HAL_PHYRX_RSSI_LEGACY_RECEPTION_TYPE_LSB 0
#define HAL_PHYRX_RSSI_LEGACY_RECEPTION_TYPE_MSB 3
#define HAL_PHYRX_RSSI_LEGACY_RECEPTION_TYPE_MASK 0x0000000f
#define HAL_RX_MPDU_END_FCS_ERR_OFFSET 0x00000004
#define HAL_RX_MPDU_END_FCS_ERR_LSB 19
#define HAL_RX_MPDU_END_FCS_ERR_MSB 19
#define HAL_RX_MPDU_END_FCS_ERR_MASK 0x00080000
#if defined(WLAN_PKT_CAPTURE_TX_2_0) || \
defined(WLAN_PKT_CAPTURE_RX_2_0) || \
defined(QCA_SINGLE_WIFI_3_0)
@ -78,11 +153,11 @@ defined(QCA_SINGLE_WIFI_3_0)
#endif
#define UNIFIED_RXPCU_PPDU_END_INFO_8_RX_PPDU_DURATION_OFFSET \
RXPCU_PPDU_END_INFO_RX_PPDU_DURATION_OFFSET
HAL_RXPCU_PPDU_END_INFO_RX_PPDU_DURATION_OFFSET
#define UNIFIED_RXPCU_PPDU_END_INFO_8_RX_PPDU_DURATION_MASK \
RXPCU_PPDU_END_INFO_RX_PPDU_DURATION_MASK
HAL_RXPCU_PPDU_END_INFO_RX_PPDU_DURATION_MASK
#define UNIFIED_RXPCU_PPDU_END_INFO_8_RX_PPDU_DURATION_LSB \
RXPCU_PPDU_END_INFO_RX_PPDU_DURATION_LSB
HAL_RXPCU_PPDU_END_INFO_RX_PPDU_DURATION_LSB
#define UNIFIED_PHYRX_HT_SIG_0_HT_SIG_INFO_PHYRX_HT_SIG_INFO_DETAILS_OFFSET \
PHYRX_HT_SIG_PHYRX_HT_SIG_INFO_DETAILS_MCS_OFFSET
#define UNIFIED_PHYRX_L_SIG_B_0_L_SIG_B_INFO_PHYRX_L_SIG_B_INFO_DETAILS_OFFSET \
@ -2657,21 +2732,21 @@ hal_rx_status_get_tlv_info_generic_be(void *rx_tlv_hdr, void *ppduinfo,
case WIFIRX_PPDU_START_E:
{
if (qdf_unlikely(ppdu_info->com_info.last_ppdu_id ==
HAL_RX_GET_64(rx_tlv, RX_PPDU_START, PHY_PPDU_ID)))
HAL_RX_GET(rx_tlv, HAL_RX_PPDU_START, PHY_PPDU_ID)))
hal_err("Matching ppdu_id(%u) detected",
ppdu_info->com_info.last_ppdu_id);
ppdu_info->com_info.last_ppdu_id =
ppdu_info->com_info.ppdu_id =
HAL_RX_GET_64(rx_tlv, RX_PPDU_START,
PHY_PPDU_ID);
HAL_RX_GET(rx_tlv, HAL_RX_PPDU_START,
PHY_PPDU_ID);
/* channel number is set in PHY meta data */
ppdu_info->rx_status.chan_num =
(HAL_RX_GET_64(rx_tlv, RX_PPDU_START,
(HAL_RX_GET(rx_tlv, HAL_RX_PPDU_START,
SW_PHY_META_DATA) & 0x0000FFFF);
ppdu_info->rx_status.chan_freq =
(HAL_RX_GET_64(rx_tlv, RX_PPDU_START,
(HAL_RX_GET(rx_tlv, HAL_RX_PPDU_START,
SW_PHY_META_DATA) & 0xFFFF0000) >> 16;
if (ppdu_info->rx_status.chan_num &&
ppdu_info->rx_status.chan_freq) {
@ -2682,8 +2757,8 @@ hal_rx_status_get_tlv_info_generic_be(void *rx_tlv_hdr, void *ppduinfo,
}
ppdu_info->com_info.ppdu_timestamp =
HAL_RX_GET_64(rx_tlv, RX_PPDU_START,
PPDU_START_TIMESTAMP_31_0);
HAL_RX_GET(rx_tlv, HAL_RX_PPDU_START,
PPDU_START_TIMESTAMP_31_0);
ppdu_info->rx_status.ppdu_timestamp =
ppdu_info->com_info.ppdu_timestamp;
ppdu_info->rx_state = HAL_RX_MON_PPDU_START;
@ -2706,16 +2781,16 @@ hal_rx_status_get_tlv_info_generic_be(void *rx_tlv_hdr, void *ppduinfo,
case WIFIRXPCU_PPDU_END_INFO_E:
ppdu_info->rx_status.rx_antenna =
HAL_RX_GET_64(rx_tlv, RXPCU_PPDU_END_INFO, RX_ANTENNA);
HAL_RX_GET(rx_tlv, HAL_RXPCU_PPDU_END_INFO, RX_ANTENNA);
ppdu_info->rx_status.tsft =
HAL_RX_GET_64(rx_tlv, RXPCU_PPDU_END_INFO,
WB_TIMESTAMP_UPPER_32);
HAL_RX_GET(rx_tlv, HAL_RXPCU_PPDU_END_INFO,
WB_TIMESTAMP_UPPER_32);
ppdu_info->rx_status.tsft = (ppdu_info->rx_status.tsft << 32) |
HAL_RX_GET_64(rx_tlv, RXPCU_PPDU_END_INFO,
WB_TIMESTAMP_LOWER_32);
HAL_RX_GET(rx_tlv, HAL_RXPCU_PPDU_END_INFO,
WB_TIMESTAMP_LOWER_32);
ppdu_info->rx_status.duration =
HAL_RX_GET_64(rx_tlv, UNIFIED_RXPCU_PPDU_END_INFO_8,
RX_PPDU_DURATION);
HAL_RX_GET(rx_tlv, UNIFIED_RXPCU_PPDU_END_INFO_8,
RX_PPDU_DURATION);
hal_rx_get_bb_info(hal_soc_hdl, rx_tlv, ppdu_info);
break;
@ -2829,28 +2904,28 @@ hal_rx_status_get_tlv_info_generic_be(void *rx_tlv_hdr, void *ppduinfo,
case WIFIRX_PPDU_END_USER_STATS_EXT_E:
ppdu_info->com_info.mpdu_fcs_ok_bitmap[2] =
HAL_RX_GET_64(rx_tlv, RX_PPDU_END_USER_STATS_EXT,
FCS_OK_BITMAP_95_64);
HAL_RX_GET(rx_tlv, HAL_RX_PPDU_END_USER_STATS_EXT,
FCS_OK_BITMAP_95_64);
ppdu_info->com_info.mpdu_fcs_ok_bitmap[3] =
HAL_RX_GET_64(rx_tlv, RX_PPDU_END_USER_STATS_EXT,
FCS_OK_BITMAP_127_96);
HAL_RX_GET(rx_tlv, HAL_RX_PPDU_END_USER_STATS_EXT,
FCS_OK_BITMAP_127_96);
ppdu_info->com_info.mpdu_fcs_ok_bitmap[4] =
HAL_RX_GET_64(rx_tlv, RX_PPDU_END_USER_STATS_EXT,
FCS_OK_BITMAP_159_128);
HAL_RX_GET(rx_tlv, HAL_RX_PPDU_END_USER_STATS_EXT,
FCS_OK_BITMAP_159_128);
ppdu_info->com_info.mpdu_fcs_ok_bitmap[5] =
HAL_RX_GET_64(rx_tlv, RX_PPDU_END_USER_STATS_EXT,
FCS_OK_BITMAP_191_160);
HAL_RX_GET(rx_tlv, HAL_RX_PPDU_END_USER_STATS_EXT,
FCS_OK_BITMAP_191_160);
ppdu_info->com_info.mpdu_fcs_ok_bitmap[6] =
HAL_RX_GET_64(rx_tlv, RX_PPDU_END_USER_STATS_EXT,
FCS_OK_BITMAP_223_192);
HAL_RX_GET(rx_tlv, HAL_RX_PPDU_END_USER_STATS_EXT,
FCS_OK_BITMAP_223_192);
ppdu_info->com_info.mpdu_fcs_ok_bitmap[7] =
HAL_RX_GET_64(rx_tlv, RX_PPDU_END_USER_STATS_EXT,
FCS_OK_BITMAP_255_224);
HAL_RX_GET(rx_tlv, HAL_RX_PPDU_END_USER_STATS_EXT,
FCS_OK_BITMAP_255_224);
break;
case WIFIRX_PPDU_END_STATUS_DONE_E:
@ -3544,9 +3619,8 @@ hal_rx_status_get_tlv_info_generic_be(void *rx_tlv_hdr, void *ppduinfo,
ppdu_info->rx_status.bw = hal->ops->hal_rx_get_tlv(rx_tlv);
ppdu_info->rx_status.he_re = 0;
reception_type = HAL_RX_GET_64(rx_tlv,
PHYRX_RSSI_LEGACY,
RECEPTION_TYPE);
reception_type = HAL_RX_GET(rx_tlv, HAL_PHYRX_RSSI_LEGACY,
RECEPTION_TYPE);
switch (reception_type) {
case QDF_RECEPTION_TYPE_ULOFMDA:
ppdu_info->rx_status.ulofdma_flag = 1;
@ -3564,46 +3638,38 @@ hal_rx_status_get_tlv_info_generic_be(void *rx_tlv_hdr, void *ppduinfo,
ppdu_info->rx_status.ul_mu_type = reception_type;
hal_rx_update_rssi_chain(ppdu_info, rssi_info_tlv);
rssi_value = HAL_RX_GET_64(rssi_info_tlv,
RECEIVE_RSSI_INFO,
RSSI_PRI20_CHAIN0);
rssi_value = HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO,
RSSI_PRI20_CHAIN0);
ppdu_info->rx_status.rssi[0] = rssi_value;
rssi_value = HAL_RX_GET_64(rssi_info_tlv,
RECEIVE_RSSI_INFO,
RSSI_PRI20_CHAIN1);
rssi_value = HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO,
RSSI_PRI20_CHAIN1);
ppdu_info->rx_status.rssi[1] = rssi_value;
rssi_value = HAL_RX_GET_64(rssi_info_tlv,
RECEIVE_RSSI_INFO,
RSSI_PRI20_CHAIN2);
rssi_value = HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO,
RSSI_PRI20_CHAIN2);
ppdu_info->rx_status.rssi[2] = rssi_value;
rssi_value = HAL_RX_GET_64(rssi_info_tlv,
RECEIVE_RSSI_INFO,
RSSI_PRI20_CHAIN3);
rssi_value = HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO,
RSSI_PRI20_CHAIN3);
ppdu_info->rx_status.rssi[3] = rssi_value;
#ifdef DP_BE_NOTYET_WAR
// TODO - this is not preset for kiwi
rssi_value = HAL_RX_GET_64(rssi_info_tlv,
RECEIVE_RSSI_INFO,
RSSI_PRI20_CHAIN4);
rssi_value = HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO,
RSSI_PRI20_CHAIN4);
ppdu_info->rx_status.rssi[4] = rssi_value;
rssi_value = HAL_RX_GET_64(rssi_info_tlv,
RECEIVE_RSSI_INFO,
RSSI_PRI20_CHAIN5);
rssi_value = HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO,
RSSI_PRI20_CHAIN5);
ppdu_info->rx_status.rssi[5] = rssi_value;
rssi_value = HAL_RX_GET_64(rssi_info_tlv,
RECEIVE_RSSI_INFO,
RSSI_PRI20_CHAIN6);
rssi_value = HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO,
RSSI_PRI20_CHAIN6);
ppdu_info->rx_status.rssi[6] = rssi_value;
rssi_value = HAL_RX_GET_64(rssi_info_tlv,
RECEIVE_RSSI_INFO,
RSSI_PRI20_CHAIN7);
rssi_value = HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO,
RSSI_PRI20_CHAIN7);
ppdu_info->rx_status.rssi[7] = rssi_value;
#endif
break;
@ -3720,8 +3786,7 @@ hal_rx_status_get_tlv_info_generic_be(void *rx_tlv_hdr, void *ppduinfo,
case WIFIRX_MPDU_END_E:
ppdu_info->user_id = user_id;
ppdu_info->fcs_err =
HAL_RX_GET_64(rx_tlv, RX_MPDU_END,
FCS_ERR);
HAL_RX_GET(rx_tlv, HAL_RX_MPDU_END, FCS_ERR);
ppdu_info->mpdu_info[user_id].fcs_err = ppdu_info->fcs_err;
hal_rx_record_tlv_info(ppdu_info, tlv_tag);

View File

@ -1687,6 +1687,7 @@ void hal_qca8074_attach(struct hal_soc *hal_soc);
* @hal_soc: HAL soc
*/
void hal_kiwi_attach(struct hal_soc *hal_soc);
void hal_peach_attach(struct hal_soc *hal_soc);
void hal_qcn9224v2_attach(struct hal_soc *hal_soc);
void hal_wcn6450_attach(struct hal_soc *hal_soc);

View File

@ -65,9 +65,12 @@ void hal_qca5018_attach(struct hal_soc *hal);
#ifdef QCA_WIFI_QCA5332
void hal_qca5332_attach(struct hal_soc *hal);
#endif
#ifdef QCA_WIFI_KIWI
#ifdef INCLUDE_HAL_KIWI
void hal_kiwi_attach(struct hal_soc *hal);
#endif
#ifdef INCLUDE_HAL_PEACH
void hal_peach_attach(struct hal_soc *hal);
#endif
#ifdef ENABLE_VERBOSE_DEBUG
bool is_hal_verbose_debug_enabled;
@ -443,14 +446,19 @@ static void hal_target_based_configure(struct hal_soc *hal)
hal_qca6750_attach(hal);
break;
#endif
#ifdef QCA_WIFI_KIWI
#ifdef INCLUDE_HAL_KIWI
case TARGET_TYPE_KIWI:
case TARGET_TYPE_MANGO:
case TARGET_TYPE_PEACH:
hal->use_register_windowing = true;
hal_kiwi_attach(hal);
break;
#endif
#ifdef INCLUDE_HAL_PEACH
case TARGET_TYPE_PEACH:
hal->use_register_windowing = true;
hal_peach_attach(hal);
break;
#endif
#if defined(QCA_WIFI_QCA8074) && defined(WIFI_TARGET_TYPE_3_0)
case TARGET_TYPE_QCA8074:
hal_qca8074_attach(hal);

View File

@ -1,6 +1,6 @@
/*
* Copyright (c) 2019-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2021-2024 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,12 +38,6 @@
#include <hal_be_rx.h>
#define UNIFIED_RXPCU_PPDU_END_INFO_8_RX_PPDU_DURATION_OFFSET \
RXPCU_PPDU_END_INFO_RX_PPDU_DURATION_OFFSET
#define UNIFIED_RXPCU_PPDU_END_INFO_8_RX_PPDU_DURATION_MASK \
RXPCU_PPDU_END_INFO_RX_PPDU_DURATION_MASK
#define UNIFIED_RXPCU_PPDU_END_INFO_8_RX_PPDU_DURATION_LSB \
RXPCU_PPDU_END_INFO_RX_PPDU_DURATION_LSB
#define UNIFIED_PHYRX_HT_SIG_0_HT_SIG_INFO_PHYRX_HT_SIG_INFO_DETAILS_OFFSET \
PHYRX_HT_SIG_PHYRX_HT_SIG_INFO_DETAILS_MCS_OFFSET
#define UNIFIED_PHYRX_L_SIG_B_0_L_SIG_B_INFO_PHYRX_L_SIG_B_INFO_DETAILS_OFFSET \

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,207 @@
/*
* Copyright (c) 2023-2024 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
* above copyright notice and this permission notice appear in all
* copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
* AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
#ifndef _HAL_PEACH_RX_H_
#define _HAL_PEACH_RX_H_
#include "qdf_util.h"
#include "qdf_types.h"
#include "qdf_lock.h"
#include "qdf_mem.h"
#include "qdf_nbuf.h"
#include "tcl_data_cmd.h"
//#include "mac_tcl_reg_seq_hwioreg.h"
#include "phyrx_rssi_legacy.h"
#include "rx_msdu_start.h"
#include "tlv_tag_def.h"
#include "hal_hw_headers.h"
#include "hal_internal.h"
#include "cdp_txrx_mon_struct.h"
#include "qdf_trace.h"
#include "hal_rx.h"
#include "hal_tx.h"
#include "dp_types.h"
#include "hal_api_mon.h"
#include "phyrx_other_receive_info_ru_details.h"
#define HAL_RX_MSDU0_BUFFER_ADDR_LSB(link_desc_va) \
(uint8_t *)(link_desc_va) + \
RX_MSDU_LINK_MSDU_0_BUFFER_ADDR_INFO_DETAILS_BUFFER_ADDR_31_0_OFFSET
#define HAL_RX_MSDU_DESC_INFO_PTR_GET(msdu0) \
(uint8_t *)(msdu0) + \
RX_MSDU_DETAILS_RX_MSDU_DESC_INFO_DETAILS_FIRST_MSDU_IN_MPDU_FLAG_OFFSET
#define HAL_ENT_MPDU_DESC_INFO(ent_ring_desc) \
(uint8_t *)(ent_ring_desc) + \
RX_MPDU_DETAILS_RX_MPDU_DESC_INFO_DETAILS_MSDU_COUNT_OFFSET
#define HAL_DST_MPDU_DESC_INFO(dst_ring_desc) \
(uint8_t *)(dst_ring_desc) + \
REO_DESTINATION_RING_RX_MPDU_DESC_INFO_DETAILS_MSDU_COUNT_OFFSET
#define HAL_RX_GET_MAC_ADDR1_VALID(rx_mpdu_start) \
HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO, MAC_ADDR_AD1_VALID)
#define HAL_RX_GET_SW_FRAME_GROUP_ID(rx_mpdu_start) \
HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO, SW_FRAME_GROUP_ID)
#define HAL_RX_GET_SW_PEER_ID(rx_mpdu_start) \
HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO, SW_PEER_ID)
#define HAL_REO_R0_CONFIG(soc, reg_val, reo_params) \
do { \
reg_val &= \
~(HWIO_REO_R0_GENERAL_ENABLE_AGING_LIST_ENABLE_BMSK |\
HWIO_REO_R0_GENERAL_ENABLE_AGING_FLUSH_ENABLE_BMSK); \
reg_val |= \
HAL_SM(HWIO_REO_R0_GENERAL_ENABLE, \
AGING_LIST_ENABLE, 1) |\
HAL_SM(HWIO_REO_R0_GENERAL_ENABLE, \
AGING_FLUSH_ENABLE, 1);\
HAL_REG_WRITE((soc), \
HWIO_REO_R0_GENERAL_ENABLE_ADDR( \
REO_REG_REG_BASE), \
(reg_val)); \
reg_val = \
HAL_REG_READ((soc), \
HWIO_REO_R0_MISC_CTL_ADDR( \
REO_REG_REG_BASE)); \
reg_val &= \
~(HWIO_REO_R0_MISC_CTL_FRAGMENT_DEST_RING_BMSK); \
reg_val |= \
HAL_SM(HWIO_REO_R0_MISC_CTL, \
FRAGMENT_DEST_RING, \
(reo_params)->frag_dst_ring); \
reg_val &= \
(~HWIO_REO_R0_MISC_CTL_BAR_DEST_RING_BMSK |\
(REO_REMAP_TCL << HWIO_REO_R0_MISC_CTL_BAR_DEST_RING_SHFT)); \
HAL_REG_WRITE((soc), \
HWIO_REO_R0_MISC_CTL_ADDR( \
REO_REG_REG_BASE), \
(reg_val)); \
} while (0)
#define HAL_RX_MSDU_DESC_INFO_GET(msdu_details_ptr) \
((struct rx_msdu_desc_info *) \
_OFFSET_TO_BYTE_PTR(msdu_details_ptr, \
RX_MSDU_DETAILS_RX_MSDU_DESC_INFO_DETAILS_RESERVED_0A_OFFSET))
#define HAL_RX_LINK_DESC_MSDU0_PTR(link_desc) \
((struct rx_msdu_details *) \
_OFFSET_TO_BYTE_PTR((link_desc),\
RX_MSDU_LINK_MSDU_0_BUFFER_ADDR_INFO_DETAILS_BUFFER_ADDR_31_0_OFFSET))
#if defined(QCA_WIFI_PEACH) && defined(WLAN_CFR_ENABLE) && \
defined(WLAN_ENH_CFR_ENABLE)
#define PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS_CHAN_CAPTURE_STATUS_BMASK 0x00000006
#define PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS_CHAN_CAPTURE_STATUS_LSB 1
#define PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS_CHAN_CAPTURE_STATUS_MSB 2
#define HAL_GET_RX_LOCATION_INFO_CHAN_CAPTURE_STATUS(rx_tlv) \
((HAL_RX_GET_64((rx_tlv), \
PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS, \
RTT_CFR_STATUS) & \
PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS_CHAN_CAPTURE_STATUS_BMASK) >> \
PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS_CHAN_CAPTURE_STATUS_LSB)
static inline
void hal_rx_get_bb_info_peach(void *rx_tlv,
void *ppdu_info_hdl)
{
struct hal_rx_ppdu_info *ppdu_info = ppdu_info_hdl;
ppdu_info->cfr_info.bb_captured_channel =
HAL_RX_GET_64(rx_tlv, RXPCU_PPDU_END_INFO, BB_CAPTURED_CHANNEL);
ppdu_info->cfr_info.bb_captured_timeout =
HAL_RX_GET_64(rx_tlv, RXPCU_PPDU_END_INFO, BB_CAPTURED_TIMEOUT);
ppdu_info->cfr_info.bb_captured_reason =
HAL_RX_GET_64(rx_tlv, RXPCU_PPDU_END_INFO, BB_CAPTURED_REASON);
}
static inline
void hal_rx_get_rtt_info_peach(void *rx_tlv,
void *ppdu_info_hdl)
{
struct hal_rx_ppdu_info *ppdu_info = ppdu_info_hdl;
ppdu_info->cfr_info.rx_location_info_valid =
HAL_RX_GET_64(rx_tlv, PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS,
RX_LOCATION_INFO_VALID);
ppdu_info->cfr_info.rtt_che_buffer_pointer_low32 =
HAL_RX_GET_64(rx_tlv,
PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS,
RTT_CHE_BUFFER_POINTER_LOW32);
ppdu_info->cfr_info.rtt_che_buffer_pointer_high8 =
HAL_RX_GET_64(rx_tlv,
PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS,
RTT_CHE_BUFFER_POINTER_HIGH8);
ppdu_info->cfr_info.chan_capture_status =
HAL_GET_RX_LOCATION_INFO_CHAN_CAPTURE_STATUS(rx_tlv);
ppdu_info->cfr_info.rx_start_ts =
HAL_RX_GET_64(rx_tlv,
PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS,
RX_START_TS);
ppdu_info->cfr_info.rtt_cfo_measurement = (int16_t)
HAL_RX_GET_64(rx_tlv,
PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS,
RTT_CFO_MEASUREMENT);
ppdu_info->cfr_info.agc_gain_info0 =
HAL_RX_GET_64(rx_tlv,
PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS,
GAIN_CHAIN0);
ppdu_info->cfr_info.agc_gain_info0 |=
(((uint32_t)HAL_RX_GET_64(rx_tlv,
PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS,
GAIN_CHAIN1)) << 16);
ppdu_info->cfr_info.agc_gain_info1 =
HAL_RX_GET_64(rx_tlv,
PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS,
GAIN_CHAIN2);
ppdu_info->cfr_info.agc_gain_info1 |=
(((uint32_t)HAL_RX_GET_64(rx_tlv,
PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS,
GAIN_CHAIN3)) << 16);
ppdu_info->cfr_info.agc_gain_info2 = 0;
ppdu_info->cfr_info.agc_gain_info3 = 0;
ppdu_info->cfr_info.mcs_rate =
HAL_RX_GET_64(rx_tlv,
PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS,
RTT_MCS_RATE);
ppdu_info->cfr_info.gi_type =
HAL_RX_GET_64(rx_tlv,
PHYRX_LOCATION_RX_LOCATION_INFO_DETAILS,
RTT_GI_TYPE);
}
#endif
#endif

View File

@ -0,0 +1,209 @@
/*
* Copyright (c) 2023-2024 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
* above copyright notice and this permission notice appear in all
* copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
* AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
#include "tcl_data_cmd.h"
//#include "mac_tcl_reg_seq_hwioreg.h"
#include "phyrx_rssi_legacy.h"
#include "hal_be_hw_headers.h"
#include "hal_internal.h"
#include "cdp_txrx_mon_struct.h"
#include "qdf_trace.h"
#include "hal_rx.h"
#include "hal_tx.h"
#include "dp_types.h"
#include "hal_api_mon.h"
#define DSCP_TID_TABLE_SIZE 24
#define NUM_WORDS_PER_DSCP_TID_TABLE (DSCP_TID_TABLE_SIZE / 4)
/**
* hal_tx_set_dscp_tid_map_peach() - Configure default DSCP to TID map table
* @hal_soc: HAL SoC context
* @map: DSCP-TID mapping table
* @id: mapping table ID - 0-31
*
* DSCP are mapped to 8 TID values using TID values programmed
* in any of the 32 DSCP_TID_MAPS (id = 0-31).
*
* Return: none
*/
static void hal_tx_set_dscp_tid_map_peach(struct hal_soc *hal_soc, uint8_t *map,
uint8_t id)
{
int i;
uint32_t addr, cmn_reg_addr;
uint32_t value = 0, regval;
uint8_t val[DSCP_TID_TABLE_SIZE], cnt = 0;
struct hal_soc *soc = (struct hal_soc *)hal_soc;
if (id >= HAL_MAX_HW_DSCP_TID_MAPS_11AX)
return;
cmn_reg_addr = HWIO_TCL_R0_CONS_RING_CMN_CTRL_REG_ADDR(
MAC_TCL_REG_REG_BASE);
addr = HWIO_TCL_R0_DSCP_TID_MAP_n_ADDR(
MAC_TCL_REG_REG_BASE,
id * NUM_WORDS_PER_DSCP_TID_TABLE);
/* Enable read/write access */
regval = HAL_REG_READ(soc, cmn_reg_addr);
regval |=
(1 <<
HWIO_TCL_R0_CONS_RING_CMN_CTRL_REG_DSCP_TID_MAP_PROGRAM_EN_SHFT);
HAL_REG_WRITE(soc, cmn_reg_addr, regval);
/* Write 8 (24 bits) DSCP-TID mappings in each iteration */
for (i = 0; i < 64; i += 8) {
value = (map[i] |
(map[i + 1] << 0x3) |
(map[i + 2] << 0x6) |
(map[i + 3] << 0x9) |
(map[i + 4] << 0xc) |
(map[i + 5] << 0xf) |
(map[i + 6] << 0x12) |
(map[i + 7] << 0x15));
qdf_mem_copy(&val[cnt], (void *)&value, 3);
cnt += 3;
}
for (i = 0; i < DSCP_TID_TABLE_SIZE; i += 4) {
regval = *(uint32_t *)(val + i);
HAL_REG_WRITE(soc, addr,
(regval & HWIO_TCL_R0_DSCP_TID_MAP_n_RMSK));
addr += 4;
}
/* Disable read/write access */
regval = HAL_REG_READ(soc, cmn_reg_addr);
regval &=
~(HWIO_TCL_R0_CONS_RING_CMN_CTRL_REG_DSCP_TID_MAP_PROGRAM_EN_BMSK);
HAL_REG_WRITE(soc, cmn_reg_addr, regval);
}
/**
* hal_tx_update_dscp_tid_peach() - Update the dscp tid map table as updated
* by the user
* @hal_soc: HAL SoC context
* @tid: TID
* @id : MAP ID
* @dscp: DSCP_TID map index
*
* Return: void
*/
static void hal_tx_update_dscp_tid_peach(struct hal_soc *hal_soc, uint8_t tid,
uint8_t id, uint8_t dscp)
{
int index;
uint32_t addr;
uint32_t value;
uint32_t regval;
struct hal_soc *soc = (struct hal_soc *)hal_soc;
addr = HWIO_TCL_R0_DSCP_TID_MAP_n_ADDR(
MAC_TCL_REG_REG_BASE, id);
index = dscp % HAL_TX_NUM_DSCP_PER_REGISTER;
addr += 4 * (dscp / HAL_TX_NUM_DSCP_PER_REGISTER);
value = tid << (HAL_TX_BITS_PER_TID * index);
regval = HAL_REG_READ(soc, addr);
regval &= ~(HAL_TX_TID_BITS_MASK << (HAL_TX_BITS_PER_TID * index));
regval |= value;
HAL_REG_WRITE(soc, addr, (regval & HWIO_TCL_R0_DSCP_TID_MAP_n_RMSK));
}
/**
* hal_tx_init_cmd_credit_ring_peach() - Initialize command/credit SRNG
* @hal_soc_hdl: Handle to HAL SoC structure
* @hal_ring_hdl: Handle to HAL SRNG structure
*
* Return: none
*/
static inline void
hal_tx_init_cmd_credit_ring_peach(hal_soc_handle_t hal_soc_hdl,
hal_ring_handle_t hal_ring_hdl)
{
}
#ifdef DP_TX_IMPLICIT_RBM_MAPPING
#define RBM_MAPPING_BMSK HWIO_TCL_R0_RBM_MAPPING0_SW2TCL1_RING_BMSK
#define RBM_MAPPING_SHFT HWIO_TCL_R0_RBM_MAPPING0_SW2TCL2_RING_SHFT
#define RBM_PPE2TCL_OFFSET \
(HWIO_TCL_R0_RBM_MAPPING0_PPE2TCL1_RING_SHFT >> 2)
#define RBM_TCL_CMD_CREDIT_OFFSET \
(HWIO_TCL_R0_RBM_MAPPING0_SW2TCL_CREDIT_RING_SHFT >> 2)
/**
* hal_tx_config_rbm_mapping_be_peach() - Update return buffer manager ring id
* @hal_soc_hdl: HAL SoC context
* @hal_ring_hdl: Source ring pointer
* @rbm_id: return buffer manager ring id
*
* Return: void
*/
static inline void
hal_tx_config_rbm_mapping_be_peach(hal_soc_handle_t hal_soc_hdl,
hal_ring_handle_t hal_ring_hdl,
uint8_t rbm_id)
{
struct hal_srng *srng = (struct hal_srng *)hal_ring_hdl;
struct hal_soc *hal_soc = (struct hal_soc *)hal_soc_hdl;
uint32_t reg_addr = 0;
uint32_t reg_val = 0;
uint32_t val = 0;
uint8_t ring_num;
enum hal_ring_type ring_type;
ring_type = srng->ring_type;
ring_num = hal_soc->hw_srng_table[ring_type].start_ring_id;
ring_num = srng->ring_id - ring_num;
reg_addr = HWIO_TCL_R0_RBM_MAPPING0_ADDR(MAC_TCL_REG_REG_BASE);
if (ring_type == PPE2TCL)
ring_num = ring_num + RBM_PPE2TCL_OFFSET;
else if (ring_type == TCL_CMD_CREDIT)
ring_num = ring_num + RBM_TCL_CMD_CREDIT_OFFSET;
/* get current value stored in register address */
val = HAL_REG_READ(hal_soc, reg_addr);
/* mask out other stored value */
val &= (~(RBM_MAPPING_BMSK << (RBM_MAPPING_SHFT * ring_num)));
reg_val = val | ((RBM_MAPPING_BMSK & rbm_id) <<
(RBM_MAPPING_SHFT * ring_num));
/* write rbm mapped value to register address */
HAL_REG_WRITE(hal_soc, reg_addr, reg_val);
}
#else
static inline void
hal_tx_config_rbm_mapping_be_peach(hal_soc_handle_t hal_soc_hdl,
hal_ring_handle_t hal_ring_hdl,
uint8_t rbm_id)
{
}
#endif

View File

@ -2540,8 +2540,9 @@ bool __qdf_nbuf_data_is_ipv4_mcast_pkt(uint8_t *data)
* Check first word of the IPV4 address and if it is
* equal to 0xE then it represents multicast IP.
*/
if ((*dst_addr & QDF_NBUF_TRAC_IPV4_ADDR_BCAST_MASK) ==
QDF_NBUF_TRAC_IPV4_ADDR_MCAST_MASK)
if ((*dst_addr &
QDF_SWAP_U32(QDF_NBUF_TRAC_IPV4_ADDR_BCAST_MASK)) ==
QDF_SWAP_U32(QDF_NBUF_TRAC_IPV4_ADDR_MCAST_MASK))
return true;
else
return false;
@ -2559,10 +2560,10 @@ bool __qdf_nbuf_data_is_ipv6_mcast_pkt(uint8_t *data)
/*
* Check first byte of the IP address and if it
* 0xFF00 then it is a IPV6 mcast packet.
* 0xFF then it is a IPV6 mcast packet.
*/
if (*dst_addr ==
QDF_SWAP_U16(QDF_NBUF_TRAC_IPV6_DEST_ADDR))
if ((*dst_addr & QDF_SWAP_U16(QDF_NBUF_TRAC_IPV6_DEST_ADDR)) ==
QDF_SWAP_U16(QDF_NBUF_TRAC_IPV6_DEST_ADDR))
return true;
else
return false;

View File

@ -32,14 +32,18 @@
#ifdef CONN_MGR_ADV_FEATURE
#include "wlan_mlme_api.h"
#include "wlan_wfa_tgt_if_tx_api.h"
#include "wlan_action_oui_main.h"
#endif
#include "wlan_cm_main_api.h"
#include "wlan_cm_public_struct.h"
#define CM_PCL_RSSI_THRESHOLD -75
#define TWO_LINK_BOOST 20
#define ONE_LINK_MLMR_BOOST 10
/* To differentiate between SLO and 11AX candidate */
#define SLO_BOOST 5
#define ONE_LINK_MLMR_BOOST 5
#define LINK_BOOST 10
#define CANDIDATE_DUMP_MAX_LEN 255
#define LINK_SCORE BIT(0)
@ -144,14 +148,35 @@ SNR_DB_TO_BIT_PER_TONE_LUT[DB_NUM] = {0, 171, 212, 262, 323, 396, 484,
586, 706, 844, 1000, 1176, 1370, 1583, 1812, 2058, 2317, 2588, 2870, 3161};
#endif
#ifdef WLAN_FEATURE_11BE_MLO
static bool
cm_is_mlo_entry(struct scan_cache_entry *bss1, struct scan_cache_entry *bss2)
{
if (bss1->ie_list.multi_link_bv &&
!bss2->ie_list.multi_link_bv)
return true;
else
return false;
}
#else
static inline bool
cm_is_mlo_entry(struct scan_cache_entry *bss1, struct scan_cache_entry *bss2)
{
return false;
}
#endif
static bool cm_is_better_bss(struct scan_cache_entry *bss1,
struct scan_cache_entry *bss2)
{
if (bss1->bss_score > bss2->bss_score)
return true;
else if (bss1->bss_score == bss2->bss_score)
else if (bss1->bss_score == bss2->bss_score) {
if (bss1->rssi_raw > bss2->rssi_raw)
return true;
if (qdf_is_macaddr_equal(&bss1->bssid, &bss2->bssid))
return cm_is_mlo_entry(bss1, bss2);
}
return false;
}
@ -1764,53 +1789,24 @@ static uint16_t cm_get_ch_width(struct scan_cache_entry *entry,
static uint8_t mlo_boost_pct[MLO_TYPE_MAX] = {0, 10, CM_MAX_PCT_SCORE};
/**
* struct mlo_rssi_pct: MLO AP rssi joint factor and score percent
* @joint_factor: rssi joint factor (0 - 100)
* @rssi_pcnt: Rssi score percent (0 - 100)
* @prorate_pcnt: RSSI prorated percent
*/
struct mlo_rssi_pct {
uint16_t joint_factor;
uint16_t rssi_pcnt;
uint16_t prorate_pcnt;
};
#define CM_RSSI_BUCKET_NUM 7
static struct mlo_rssi_pct mlo_rssi_pcnt[CM_RSSI_BUCKET_NUM] = {
{80, 100, 100}, {60, 87, 100}, {44, 74, 100}, {30, 61, 100}, {20, 48, 54},
{10, 35, 28}, {0, 22, 1} };
/**
* cm_get_mlo_rssi_score() - Calculate joint rssi score for MLO AP
* @rssi_weightage: rssi weightage
* cm_get_mlo_rssi() - Calculate joint rssi for MLO AP
*
* @link1_rssi: link1 rssi
* @link2_rssi: link2 rssi
* @prorate_pcnt: pointer to store RSSI prorated percent
* @cw_link1: channel width of link 1
* @cw_link2: channel width of link 2
*
* Return: MLO AP joint rssi score
*/
static uint32_t cm_get_mlo_rssi_score(uint8_t rssi_weightage, int8_t link1_rssi,
int8_t link2_rssi, uint16_t *prorate_pcnt)
static uint32_t cm_get_mlo_rssi(int8_t link1_rssi, int8_t link2_rssi,
uint16_t cw_link1, uint16_t cw_link2)
{
int8_t link1_factor = 0, link2_factor = 0;
int32_t joint_factor = 0;
int16_t rssi_pcnt = 0;
int8_t i;
uint32_t rssi_mlo;
/* Calculate RSSI score -- using joint rssi, but limit to 2 links */
link1_factor = QDF_MAX(QDF_MIN(link1_rssi, -50), -95) + 95;
link2_factor = QDF_MAX(QDF_MIN(link2_rssi, -50), -95) + 95;
joint_factor = QDF_MIN((link1_factor * link1_factor +
link2_factor * link2_factor) * 100 / (2 * 45 * 45),
100);
for (i = 0; i < CM_RSSI_BUCKET_NUM; i++)
if (joint_factor > mlo_rssi_pcnt[i].joint_factor) {
rssi_pcnt = mlo_rssi_pcnt[i].rssi_pcnt;
*prorate_pcnt = mlo_rssi_pcnt[i].prorate_pcnt;
break;
}
rssi_mlo = (cw_link1 * link1_rssi + cw_link2 * link2_rssi) /
(cw_link1 + cw_link2);
return (rssi_weightage * rssi_pcnt);
return rssi_mlo;
}
static inline int cm_calculate_emlsr_score(struct weight_cfg *weight_config)
@ -2033,6 +2029,7 @@ static int cm_calculate_mlo_bss_score(struct wlan_objmgr_psoc *psoc,
{
struct scan_cache_entry *entry_partner[MLD_MAX_LINKS - 1];
int32_t rssi[MLD_MAX_LINKS - 1];
uint32_t rssi_mlo[MLD_MAX_LINKS - 1] = {};
uint32_t rssi_score[MLD_MAX_LINKS - 1] = {};
uint16_t prorated_pct[MLD_MAX_LINKS - 1] = {};
uint32_t freq[MLD_MAX_LINKS - 1];
@ -2118,10 +2115,18 @@ static int cm_calculate_mlo_bss_score(struct wlan_objmgr_psoc *psoc,
true);
mlme_nofl_debug("No entry for partner, estimate with rnr");
}
rssi_mlo[i] =
cm_get_mlo_rssi(entry->rssi_raw, rssi[i],
chan_width, ch_width[i]);
rssi_score[i] =
cm_get_mlo_rssi_score(weight_config->rssi_weightage,
entry->rssi_raw, rssi[i],
&prorated_pct[i]);
cm_calculate_rssi_score(&score_params->rssi_score,
rssi_mlo[i],
weight_config->rssi_weightage);
prorated_pct[i] =
cm_get_rssi_prorate_pct(&score_params->rssi_score,
rssi_mlo[i],
weight_config->rssi_weightage);
bandwidth_score[i] =
cm_get_bw_score(weight_config->chan_width_weightage,
@ -2431,25 +2436,32 @@ static void cm_vendor_specific_boost(struct wlan_objmgr_psoc *psoc,
uint32_t freq = 0;
uint32_t freq_entry = 0;
/* Add boost of 20% for 2 link candidate */
if (entry->ml_info.num_links == TWO_LINK)
score = score + (score * TWO_LINK_BOOST) / 100;
if (entry->ie_list.multi_link_bv) {
if (entry->ml_info.num_links == ONE_LINK) {
freq_entry = entry->channel.chan_freq;
link = &entry->ml_info.link_info[0];
if (entry->ml_info.num_links == ONE_LINK) {
freq_entry = entry->channel.chan_freq;
link = &entry->ml_info.link_info[0];
if (!link[0].is_valid_link)
return;
if (!link[0].is_valid_link)
return;
freq = link[0].freq;
freq = link[0].freq;
/* Add boost of 10% for one link MLMR candidate */
if (!policy_mgr_are_2_freq_on_same_mac(psoc,
freq,
freq_entry))
score = score + (score * ONE_LINK_MLMR_BOOST) / 100;
/* Add boost of 15% for one link MLMR candidate */
if (!policy_mgr_are_2_freq_on_same_mac(psoc, freq,
freq_entry))
score = score + (score *
(LINK_BOOST +
ONE_LINK_MLMR_BOOST)) / 100;
else
score = score + (score * (LINK_BOOST)) / 100;
} else if (entry->ml_info.num_links > ONE_LINK) {
/* Add boost of 5%/per link for MLO candidate */
score = score + (score * (entry->ml_info.num_links * LINK_BOOST)) / 100;
} else {
/* Add boost of 5% for SLO candidate */
score = score + (score * (SLO_BOOST)) / 100;
}
}
entry->bss_score = score;
}
@ -2686,8 +2698,13 @@ static int cm_calculate_bss_score(struct wlan_objmgr_psoc *psoc,
prorated_pcnt);
score += eht_score;
if (!(IS_LINK_SCORE(ml_flag)))
if (!(IS_LINK_SCORE(ml_flag))) {
/* Add boost of 10% for one partner link MLMR candidate */
if (bss_mlo_type == MLMR)
score = score + (score * ONE_LINK_MLMR_BOOST) / 100;
entry->bss_score = score;
}
if (bss_mlo_type == SLO || IS_LINK_SCORE(ml_flag))
mlme_nofl_debug("%s("QDF_MAC_ADDR_FMT" freq %d): rssi %d HT %d VHT %d HE %d EHT %d su_bfer %d phy %d atf %d qbss %d cong_pct %d NSS %d ap_tx_pwr %d oce_subnet %d sae_pk_cap %d prorated_pcnt %d keymgmt 0x%x mlo type %d",
@ -2847,7 +2864,6 @@ void cm_print_candidate_list(qdf_list_t *candidate_list)
mlme_err("failed to get front of candidate_list");
return;
}
while (cur_node) {
qdf_list_peek_next(candidate_list, cur_node, &next_node);
@ -2864,8 +2880,10 @@ void cm_print_candidate_list(qdf_list_t *candidate_list)
QDF_MAC_ADDR_REF(link[i].link_addr.bytes),
link[i].freq, link[i].link_id,
link[i].is_valid_link);
mlme_debug("Candidate(" QDF_MAC_ADDR_FMT " freq %d self_link_id %d): %s bss_score %d ",
mlme_nofl_debug("Candidate(" QDF_MAC_ADDR_FMT " %s freq %d self_link_id %d): %s bss_score %d ",
QDF_MAC_ADDR_REF(scan_entry->entry->bssid.bytes),
scan_entry->entry->ie_list.multi_link_bv ? "MLO" :
"NON MLO",
scan_entry->entry->channel.chan_freq,
scan_entry->entry->ml_info.self_link_id,
log_str,
@ -2944,10 +2962,12 @@ static void cm_find_and_remove_dup_candidate(struct scan_cache_node *bss_entry,
match = 0;
for (i = 0; i < bss_num_link; i++)
if (qdf_is_macaddr_equal(&bss_entry->entry->bssid,
if ((bss_entry->entry->ie_list.multi_link_bv &&
scan_node->entry->ie_list.multi_link_bv) &&
(qdf_is_macaddr_equal(&bss_entry->entry->bssid,
&scan_node->entry->bssid) ||
qdf_is_macaddr_equal(&bss_entry->entry->bssid,
&cur_can[i].link_addr))
&cur_can[i].link_addr)))
match++;
for (i = 0; i < bss_num_link; i++) {
for (j = 0; j < curr_num_link; j++) {
@ -2981,8 +3001,85 @@ next:
}
}
#if defined(FEATURE_DENYLIST_MGR) && defined(WLAN_FEATURE_11BE_MLO)
/**
* cm_add_11_ax_candidate() - update candidate list with 11AX candidate
* @pdev: pdev object
* @candidate_list: candidate list
* @scan_entry: scan entry node
*
* This API update candidate list with new 11AX candidate.
*
*Return: NA
*/
static void
cm_add_11_ax_candidate(struct wlan_objmgr_pdev *pdev,
qdf_list_t *candidate_list,
struct scan_cache_node *scan_entry)
{
struct scan_cache_node *scan_node = NULL;
struct scan_cache_entry *tmp_scan_entry = NULL;
tmp_scan_entry = util_scan_copy_cache_entry(scan_entry->entry);
if (!tmp_scan_entry) {
mlme_err("Copy cache entry failed");
return;
}
/* Add 11AX entry for MLO Candidate */
if (!tmp_scan_entry->ie_list.multi_link_bv) {
util_scan_free_cache_entry(tmp_scan_entry);
return;
}
scan_node = qdf_mem_malloc_atomic(sizeof(*scan_node));
if (!scan_node) {
util_scan_free_cache_entry(tmp_scan_entry);
return;
}
tmp_scan_entry->ml_info.num_links = 0;
tmp_scan_entry->mlo_max_recom_simult_links = 0;
tmp_scan_entry->ie_list.multi_link_bv = NULL;
tmp_scan_entry->ie_list.ehtcap = NULL;
tmp_scan_entry->ie_list.ehtop = NULL;
qdf_mem_zero(&tmp_scan_entry->ml_info, sizeof(struct ml_info));
tmp_scan_entry->phy_mode =
util_scan_get_phymode(pdev, tmp_scan_entry);
scan_node->entry = tmp_scan_entry;
qdf_list_insert_after(candidate_list, &scan_node->node,
&scan_entry->node);
}
#else
static inline void
cm_add_11_ax_candidate(struct wlan_objmgr_pdev *pdev,
qdf_list_t *candidate_list,
struct scan_cache_node *scan_entry)
{};
#endif
static bool cm_is_slo_candidate_allowed(struct wlan_objmgr_psoc *psoc,
struct scan_cache_entry *scan_entry)
{
struct action_oui_search_attr attr = {0};
attr.ie_data = util_scan_entry_ie_data(scan_entry);
attr.ie_length = util_scan_entry_ie_len(scan_entry);
if (wlan_action_oui_search(psoc, &attr,
ACTION_OUI_RESTRICT_MAX_MLO_LINKS)) {
mlme_debug("IoT AP " QDF_MAC_ADDR_FMT
" slo candidate not allowed",
QDF_MAC_ADDR_REF(scan_entry->bssid.bytes));
return false;
}
return true;
}
/**
* cm_mlo_generate_candidate_list() - generate candidate list
* @pdev: pdev object
* @candidate_list: candidate list
*
* For any candidate list this api generates all possible unique
@ -3008,7 +3105,8 @@ next:
*
* Return none
*/
static void cm_mlo_generate_candidate_list(qdf_list_t *candidate_list)
static void cm_mlo_generate_candidate_list(struct wlan_objmgr_pdev *pdev,
qdf_list_t *candidate_list)
{
struct scan_cache_entry *tmp_scan_entry = NULL;
struct scan_cache_node *scan_entry = NULL, *scan_node = NULL;
@ -3018,12 +3116,21 @@ static void cm_mlo_generate_candidate_list(qdf_list_t *candidate_list)
uint32_t num_link = 0;
uint32_t i = 0;
uint32_t j = 0;
struct wlan_objmgr_psoc *psoc;
bool is_slo_candidate_allowed = true;
psoc = wlan_pdev_get_psoc(pdev);
if (!psoc) {
mlme_err("psoc NULL");
return;
}
if (qdf_list_peek_front(candidate_list, &cur_node) !=
QDF_STATUS_SUCCESS) {
mlme_err("failed to get front of candidate_list");
return;
}
while (cur_node) {
qdf_list_peek_next(candidate_list, cur_node, &next_node);
@ -3031,6 +3138,11 @@ static void cm_mlo_generate_candidate_list(qdf_list_t *candidate_list)
node);
num_link = scan_entry->entry->ml_info.num_links;
is_slo_candidate_allowed =
cm_is_slo_candidate_allowed(psoc, scan_entry->entry);
if (!is_slo_candidate_allowed)
goto next;
for (i = 0; i < num_link; i++) {
tmp_scan_entry = util_scan_copy_cache_entry(
scan_entry->entry);
@ -3073,6 +3185,8 @@ static void cm_mlo_generate_candidate_list(qdf_list_t *candidate_list)
&scan_entry->node);
}
}
cm_add_11_ax_candidate(pdev, candidate_list, scan_entry);
next:
cur_node = next_node;
next_node = NULL;
@ -3189,8 +3303,9 @@ static void cm_validate_partner_links(struct wlan_objmgr_psoc *psoc,
}
}
#else
static void cm_mlo_generate_candidate_list(qdf_list_t *candidate_list)
static inline void
cm_mlo_generate_candidate_list(struct wlan_objmgr_pdev *pdev,
qdf_list_t *candidate_list)
{
}
@ -3250,7 +3365,7 @@ void wlan_cm_calculate_bss_score(struct wlan_objmgr_pdev *pdev,
config->bw_above_20_5ghz, config->vdev_nss_24g,
config->vdev_nss_5g);
cm_mlo_generate_candidate_list(scan_list);
cm_mlo_generate_candidate_list(pdev, scan_list);
/* calculate score for each AP */
if (qdf_list_peek_front(scan_list, &cur_node) != QDF_STATUS_SUCCESS) {

View File

@ -1458,7 +1458,7 @@ QDF_STATUS util_validate_reportingsta_ie(const uint8_t *reportingsta_ie,
if ((reportingsta_ie[ID_POS] == WLAN_ELEMID_VENDOR) &&
(reportingsta_ie_size < (PAYLOAD_START_POS + OUI_LEN))) {
mlo_err_rl("Total length %zu of element for reporting STA is smaller than minimum required to access vendor EID %u",
mlo_err_rl("Total length %zu of element for reporting STA is smaller than minimum required of %u to access vendor EID",
reportingsta_ie_size, PAYLOAD_START_POS + OUI_LEN);
return QDF_STATUS_E_PROTO;
}

View File

@ -3885,6 +3885,10 @@ reg_skip_invalid_chan_freq(struct wlan_objmgr_pdev *pdev,
bool include_indoor_channel, dfs_master_capable;
uint8_t enable_srd_chan, srd_mask = 0;
struct wlan_objmgr_psoc *psoc;
enum reg_6g_ap_type ap_pwr_type;
enum supported_6g_pwr_types ap_pwr_mode;
enum channel_state chan_state;
psoc = wlan_pdev_get_psoc(pdev);
if (!psoc) {
reg_err("invalid psoc");
@ -3911,6 +3915,17 @@ reg_skip_invalid_chan_freq(struct wlan_objmgr_pdev *pdev,
return status;
}
wlan_reg_get_cur_6g_ap_pwr_type(pdev, &ap_pwr_type);
if (ap_pwr_type == REG_INDOOR_AP)
ap_pwr_mode = REG_AP_LPI;
else if (ap_pwr_type == REG_STANDARD_POWER_AP)
ap_pwr_mode = REG_AP_SP;
else if (ap_pwr_type == REG_VERY_LOW_POWER_AP)
ap_pwr_mode = REG_AP_VLP;
else
ap_pwr_mode = REG_INVALID_PWR_MODE;
while (iface_mode_mask) {
if (iface_mode_mask & (1 << IFTYPE_AP)) {
srd_mask = 1;
@ -3923,6 +3938,7 @@ reg_skip_invalid_chan_freq(struct wlan_objmgr_pdev *pdev,
} else {
break;
}
for (chan_enum = 0; chan_enum < *no_usable_channels;
chan_enum++) {
if (iface_mode_mask & (1 << IFTYPE_NAN)) {
@ -3933,9 +3949,13 @@ reg_skip_invalid_chan_freq(struct wlan_objmgr_pdev *pdev,
if (!res_msg[chan_enum].iface_mode_mask)
reg_remove_freq(res_msg, chan_enum);
} else {
if (wlan_reg_is_freq_indoor(
chan_state = reg_get_channel_state_for_pwrmode(
pdev, res_msg[chan_enum].freq,
ap_pwr_mode);
if (!reg_is_state_allowed(chan_state) ||
(wlan_reg_is_freq_indoor(
pdev, res_msg[chan_enum].freq) &&
!include_indoor_channel) {
!include_indoor_channel)) {
res_msg[chan_enum].iface_mode_mask &=
~(iface_mode);
if (!res_msg[chan_enum].iface_mode_mask)

View File

@ -96,7 +96,7 @@ typedef uint32_t wlan_scan_id;
* length + atleast 1 byte of datai
* @BSS_INDEX_POS: Position of BSSID index field in Multiple BSSID index tag
* @MIN_VENDOR_TAG_LEN: Minimum length of a vendor specific tag
* @OUI_LEN: OUI + OUI Type + Min DATA
* @OUI_LEN: OUI + OUI Type
* @ELEM_ID_EXTN_POS: Position of element ID extension in an extension element
* @ELEM_ID_LIST_LEN_POS: Position of length field in list of element IDs
* @ELEM_ID_LIST_POS: Position to the start of element ID list
@ -118,7 +118,7 @@ typedef uint32_t wlan_scan_id;
#define SPLIT_PROF_DATA_LEAST_LEN 3
#define BSS_INDEX_POS 2
#define MIN_VENDOR_TAG_LEN 7
#define OUI_LEN 5
#define OUI_LEN 4
#define ELEM_ID_EXTN_POS 2
#define ELEM_ID_LIST_LEN_POS 3
#define ELEM_ID_LIST_POS 4

View File

@ -1662,6 +1662,12 @@ util_scan_entry_bw_ind(struct scan_cache_entry *scan_entry)
#endif
#ifdef WLAN_FEATURE_11BE_MLO
static inline uint8_t*
util_scan_entry_bv_ml_ie(struct scan_cache_entry *scan_entry)
{
return scan_entry->ie_list.multi_link_bv;
}
static inline uint8_t*
util_scan_entry_t2lm(struct scan_cache_entry *scan_entry)
{
@ -1676,6 +1682,12 @@ util_scan_entry_t2lm(struct scan_cache_entry *scan_entry)
*/
uint32_t util_scan_entry_t2lm_len(struct scan_cache_entry *scan_entry);
#else
static inline uint8_t*
util_scan_entry_bv_ml_ie(struct scan_cache_entry *scan_entry)
{
return NULL;
}
static inline uint8_t*
util_scan_entry_t2lm(struct scan_cache_entry *scan_entry)
{
@ -1959,6 +1971,7 @@ util_scan_get_6g_oper_channel(uint8_t *he_op_ie)
return 0;
}
#endif
/*
* util_is_bssid_non_tx() - Is the given BSSID a non-tx neighbor
* entry in the RNR db
@ -1970,4 +1983,15 @@ util_scan_get_6g_oper_channel(uint8_t *he_op_ie)
*/
bool util_is_bssid_non_tx(struct wlan_objmgr_psoc *psoc,
struct qdf_mac_addr *bssid, qdf_freq_t freq);
/**
* util_scan_get_phymode() - function to get phy mode
* @pdev : pdev object
* @scan_params: scan entry
*
* Return: phy mode.
*/
enum wlan_phymode
util_scan_get_phymode(struct wlan_objmgr_pdev *pdev,
struct scan_cache_entry *scan_params);
#endif

View File

@ -962,7 +962,7 @@ util_scan_get_phymode_2g(struct scan_cache_entry *scan_params)
return phymode;
}
static enum wlan_phymode
enum wlan_phymode
util_scan_get_phymode(struct wlan_objmgr_pdev *pdev,
struct scan_cache_entry *scan_params)
{
@ -3073,7 +3073,7 @@ static uint32_t util_gen_new_ie(struct wlan_objmgr_pdev *pdev,
if (extn_elem && extn_elem[TAG_LEN_POS] >= VALID_ELEM_LEAST_LEN) {
if (((extn_elem + extn_elem[1] + MIN_IE_LEN) - sub_copy)
< subie_len)
<= subie_len)
util_parse_noninheritance_list(extn_elem, &elem_list,
&extn_elem_list, &ninh);
}

View File

@ -1183,6 +1183,7 @@ static QDF_STATUS send_vdev_stop_cmd_tlv(wmi_unified_t wmi,
wmi_buf_t buf;
int32_t len = sizeof(*cmd);
uint8_t *buf_ptr;
uint32_t vdev_id = params->vdev_id;
len += vdev_stop_mlo_params_size(params);
@ -1205,7 +1206,7 @@ static QDF_STATUS send_vdev_stop_cmd_tlv(wmi_unified_t wmi,
wmi_buf_free(buf);
return QDF_STATUS_E_FAILURE;
}
wmi_debug("vdev id = %d", cmd->vdev_id);
wmi_debug("vdev id = %d", vdev_id);
return 0;
}