qcacmn: Add API to identify true 160 and restricted 80p80 support

In a future product, 160MHz mode of operation is acheived through
a single detector, unlike Hawkeye and its variants where 160MHz mode
is acheived using two 80MHz detectors.

Because of this change, the maximum segment ID is 0 in the new chipset,
whereas 1 in Hawkeye and its variants. Also the Agile detector ID
is 1 in the new chipset, 2 in Hawkeye and its variants.

In light of these changes, to identify the true 160MHz capability,
add a new API that checks the target type and returns true 160MHz
capability based on the target type. Also introduce a new dfs
variable that maintains the agile detector ID (based on the
true 160MHz capability).

In the future product, there is a support of restricted-80p80MHz
(a.k.a 165Mhz) where channels 132,136,140,144,149,153,157,161 are
available for operation as an 80p80Mhz channel.
Add a DFS API to check if this support is enabled.

CRs-Fixed: 2623964
Change-Id: If813e9d6fc649ce99c7780c04fbcb61acbd1af86
This commit is contained in:
Vignesh Mohan 2020-02-12 14:38:43 +05:30 • committed by nshrivas
commit 48c594436d
7 changed files with 118 additions and 18 deletions

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2017-2019 The Linux Foundation. All rights reserved.
* Copyright (c) 2017-2020 The Linux Foundation. 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
@ -502,6 +502,13 @@ bool target_is_tgt_type_qca9888(uint32_t target_type);
*/
bool target_is_tgt_type_adrastea(uint32_t target_type);
/**
* target_is_tgt_type_qcn9000() - Check if the target type is QCN9000 (pine)
* @target_type: target type to be checked.
*
* Return: true if the target_type is QCN9000, else false.
*/
bool target_is_tgt_type_qcn9000(uint32_t target_type);
/**
* target_psoc_set_wlan_init_status() - set info wlan_init_status

View file

@ -388,6 +388,9 @@ static void target_if_target_tx_ops_register(
target_tx_ops->tgt_is_tgt_type_adrastea =
target_is_tgt_type_adrastea;
target_tx_ops->tgt_is_tgt_type_qcn9000 =
target_is_tgt_type_qcn9000;
target_tx_ops->tgt_get_tgt_type =
lmac_get_tgt_type;
@ -650,3 +653,8 @@ bool target_is_tgt_type_adrastea(uint32_t target_type)
{
return target_type == TARGET_TYPE_ADRASTEA;
}
bool target_is_tgt_type_qcn9000(uint32_t target_type)
{
return target_type == TARGET_TYPE_QCN9000;
}

View file

@ -41,6 +41,7 @@
#include <wlan_objmgr_pdev_obj.h>
#include <osdep.h>
#include <wlan_cmn.h>
#include "target_type.h"
/* File Line and Submodule String */
#define FLSM(x, str) #str " : " FL(x)
@ -403,11 +404,24 @@
*/
#define USENOL_ENABLE_NOL_HOST_DISABLE_NOL_FW 2
/* Non Agile detector IDs */
#define DETECTOR_ID_0 0
#define DETECTOR_ID_1 1
/* Agile detector ID */
#define AGILE_DETECTOR_ID 2
/**
* enum detector_id - Detector ID values.
* @DETECTOR_ID_0: Detector ID 0 (Non Agile).
* @DETECTOR_ID_1: Detector ID 1 (Non Agile in 80p80MHz supported devices,
* Agile detector in true 160MHz supported devices).
* @DETECTOR_ID_2: Detector ID 2 (Agile detector in 80p80MHZ supported devices).
* @AGILE_DETECTOR_ID_TRUE_160MHZ: Agile detector ID in true 160MHz devices.
* @AGILE_DETECTOR_ID_80p80: Agile detector ID in 80p80MHz supported devices.
* @DETECTOR_ID_MAX: Maximum detector ID value.
*/
enum detector_id {
DETECTOR_ID_0,
DETECTOR_ID_1,
DETECTOR_ID_2,
AGILE_DETECTOR_ID_TRUE_160MHZ = DETECTOR_ID_1,
AGILE_DETECTOR_ID_80P80 = DETECTOR_ID_2,
DETECTOR_ID_MAX,
};
/**
* struct dfs_pulseparams - DFS pulse param structure.
@ -1084,6 +1098,7 @@ struct dfs_mode_switch_defer_params {
* defer timer running.
* @dfs_defer_params: DFS deferred event parameters (allocated
* only for the duration of defer alone).
* @dfs_agile_detector_id: Agile detector ID for the DFS object.
*/
struct wlan_dfs {
uint32_t dfs_debug_mask;
@ -1248,6 +1263,7 @@ struct wlan_dfs {
bool dfs_allow_hw_pulses;
#endif
struct dfs_mode_switch_defer_params dfs_defer_params;
uint8_t dfs_agile_detector_id;
};
#if defined(QCA_SUPPORT_AGILE_DFS) || defined(ATH_SUPPORT_ZERO_CAC_DFS)
@ -2828,4 +2844,41 @@ void dfs_complete_deferred_tasks(struct wlan_dfs *dfs);
* Return: void.
*/
void dfs_process_cac_completion(struct wlan_dfs *dfs);
#ifdef WLAN_DFS_TRUE_160MHZ_SUPPORT
/**
* dfs_is_true_160mhz_supported() - Find if true 160MHz is supported.
* @dfs: Pointer to wlan_dfs object.
*
* Return: True if true 160MHz is supported, else false.
*/
bool dfs_is_true_160mhz_supported(struct wlan_dfs *dfs);
/**
* dfs_is_restricted_80p80mhz_supported() - Find if restricted 80p80mhz is
* supported.
* @dfs: Pointer to wlan_dfs object.
*
* Return: True if restricted 160MHz is supported, else false.
*/
bool dfs_is_restricted_80p80mhz_supported(struct wlan_dfs *dfs);
#else
static inline bool dfs_is_true_160mhz_supported(struct wlan_dfs *dfs)
{
return false;
}
static inline bool dfs_is_restricted_80p80mhz_supported(struct wlan_dfs *dfs)
{
return false;
}
#endif /* WLAN_DFS_TRUE_160MHZ_SUPPORT */
/**
* dfs_get_agile_detector_id() - Find the Agile detector ID for given DFS.
* @dfs: Pointer to wlan_dfs object.
*
* Return: Agile detector value (uint8_t).
*/
uint8_t dfs_get_agile_detector_id(struct wlan_dfs *dfs);
#endif /* _DFS_H_ */

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2016-2018 The Linux Foundation. All rights reserved.
* Copyright (c) 2016-2018,2020 The Linux Foundation. All rights reserved.
* Copyright (c) 2008 Atheros Communications, Inc.
*
* Permission to use, copy, modify, and/or distribute this software for
@ -291,4 +291,8 @@
(WLAN_IS_CHAN_11AC_VHT80_80(_c) || \
WLAN_IS_CHAN_11AXA_HE80_80(_c))
#define WLAN_IS_CHAN_MODE_165(_dfs, _c) \
dfs_is_restricted_80p80mhz_supported(_dfs) && \
WLAN_IS_CHAN_MODE_80_80(_c)
#endif /* _DFS_CHANNEL_H_ */

View file

@ -941,3 +941,29 @@ void dfs_complete_deferred_tasks(struct wlan_dfs *dfs)
dfs->dfs_defer_params.is_cac_completed = false;
}
}
#ifdef WLAN_DFS_TRUE_160MHZ_SUPPORT
bool dfs_is_true_160mhz_supported(struct wlan_dfs *dfs)
{
struct wlan_objmgr_psoc *psoc = dfs->dfs_soc_obj->psoc;
struct wlan_lmac_if_target_tx_ops *tx_ops;
uint32_t target_type;
target_type = lmac_get_target_type(dfs->dfs_pdev_obj);
tx_ops = &psoc->soc_cb.tx_ops.target_tx_ops;
if (tx_ops->tgt_is_tgt_type_qcn9000)
return tx_ops->tgt_is_tgt_type_qcn9000(target_type);
return false;
}
bool dfs_is_restricted_80p80mhz_supported(struct wlan_dfs *dfs)
{
return wlan_psoc_nif_fw_ext_cap_get(dfs->dfs_soc_obj->psoc,
WLAN_SOC_RESTRICTED_80P80_SUPPORT);
}
#endif
uint8_t dfs_get_agile_detector_id(struct wlan_dfs *dfs)
{
return dfs->dfs_agile_detector_id;
}

View file

@ -337,7 +337,7 @@ dfs_compute_radar_found_cfreq(struct wlan_dfs *dfs,
* Applicable to chips that have a separate agile radar detector
* engine.
*/
if (radar_found->detector_id == AGILE_DETECTOR_ID) {
if (radar_found->detector_id == dfs_get_agile_detector_id(dfs)) {
*freq_center = dfs->dfs_agile_precac_freq_mhz;
} else if (!radar_found->segment_id) {
*freq_center = curchan->dfs_ch_mhz_freq_seg1;
@ -386,7 +386,7 @@ dfs_compute_radar_found_cfreq(struct wlan_dfs *dfs,
* Applicable to chips that have a separate agile radar detector
* engine.
*/
if (radar_found->detector_id == AGILE_DETECTOR_ID) {
if (radar_found->detector_id == dfs_get_agile_detector_id(dfs)) {
*freq_center = utils_dfs_chan_to_freq(
dfs->dfs_agile_precac_freq);
/* Radar found on primary segment by the HW. */
@ -647,7 +647,7 @@ uint8_t dfs_get_bonding_channels_for_freq(struct wlan_dfs *dfs,
uint16_t center_freq;
uint8_t nchannels = 0;
if (detector_id == AGILE_DETECTOR_ID)
if (detector_id == dfs_get_agile_detector_id(dfs))
center_freq = dfs->dfs_agile_precac_freq_mhz;
else if (!segment_id)
center_freq = curchan->dfs_ch_mhz_freq_seg1;
@ -671,7 +671,7 @@ uint8_t dfs_get_bonding_channels_for_freq(struct wlan_dfs *dfs,
freq_list[1] = center_freq + DFS_5GHZ_NEXT_CHAN_FREQ_OFFSET;
} else if (WLAN_IS_CHAN_MODE_80(curchan) ||
WLAN_IS_CHAN_MODE_80_80(curchan) ||
detector_id == AGILE_DETECTOR_ID) {
detector_id == dfs_get_agile_detector_id(dfs)) {
/* If the current channel's bandwidth is 80/80+80/160Mhz,
* the corresponding agile Detector's bandwidth will be 80Mhz.
* Therefore, if radar is found on the agile detector find
@ -709,7 +709,7 @@ uint8_t dfs_get_bonding_channels(struct wlan_dfs *dfs,
uint8_t center_chan;
uint8_t nchannels = 0;
if (detector_id == AGILE_DETECTOR_ID)
if (detector_id == dfs_get_agile_detector_id(dfs))
center_chan = dfs->dfs_agile_precac_freq;
else if (!segment_id)
center_chan = curchan->dfs_ch_vhtop_ch_freq_seg1;
@ -744,7 +744,7 @@ uint8_t dfs_get_bonding_channels(struct wlan_dfs *dfs,
channels[1] = center_chan + DFS_5GHZ_NEXT_CHAN_OFFSET;
} else if (WLAN_IS_CHAN_MODE_80(curchan) ||
WLAN_IS_CHAN_MODE_80_80(curchan) ||
detector_id == AGILE_DETECTOR_ID) {
detector_id == dfs_get_agile_detector_id(dfs)) {
/* If the current channel's bandwidth is 80/80+80/160Mhz,
* the corresponding agile Detector's bandwidth will be 80Mhz.
* Therefore, if radar is found on the agile detector find
@ -1005,14 +1005,14 @@ QDF_STATUS dfs_process_radar_ind(struct wlan_dfs *dfs,
* different channel.
*/
if (!dfs_radarevent_basic_sanity(dfs, dfs_curchan) &&
!(radar_found->detector_id == AGILE_DETECTOR_ID)) {
!(radar_found->detector_id == dfs_get_agile_detector_id(dfs))) {
dfs_err(dfs, WLAN_DEBUG_DFS,
"radar event on a non-DFS channel");
goto exit;
}
/* Sanity checks for radar on Agile detector */
if (radar_found->detector_id == AGILE_DETECTOR_ID &&
if (radar_found->detector_id == dfs_get_agile_detector_id(dfs) &&
(!dfs_is_agile_precac_enabled(dfs) || !dfs->dfs_agile_precac_freq_mhz))
{
dfs_err(dfs, WLAN_DEBUG_DFS,
@ -1034,7 +1034,7 @@ QDF_STATUS dfs_process_radar_ind(struct wlan_dfs *dfs,
dfs_compute_radar_found_cfreq(dfs, radar_found, &freq_center);
radarfound_freq = freq_center + radar_found->freq_offset;
if (radar_found->detector_id == AGILE_DETECTOR_ID)
if (radar_found->detector_id == dfs_get_agile_detector_id(dfs))
dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS,
"Radar found on Agile detector freq=%d radar freq=%d",
freq_center, radarfound_freq);
@ -1091,7 +1091,7 @@ QDF_STATUS dfs_process_radar_ind(struct wlan_dfs *dfs,
dfs->dfs_is_nol_ie_sent = false;
(dfs->is_radar_during_precac ||
radar_found->detector_id == AGILE_DETECTOR_ID) ?
radar_found->detector_id == dfs_get_agile_detector_id(dfs)) ?
(dfs->dfs_is_rcsa_ie_sent = false) :
(dfs->dfs_is_rcsa_ie_sent = true);
if (dfs->dfs_use_nol_subchannel_marking) {
@ -1141,7 +1141,7 @@ QDF_STATUS dfs_process_radar_ind(struct wlan_dfs *dfs,
/* If radar is found on preCAC or Agile CAC, return here since
* channel change is not required.
*/
if (radar_found->detector_id == AGILE_DETECTOR_ID)
if (radar_found->detector_id == dfs_get_agile_detector_id(dfs))
goto exit;
if (!dfs->dfs_is_offload_enabled &&
dfs->is_radar_found_on_secondary_seg) {

View file

@ -903,6 +903,7 @@ struct wlan_lmac_if_dfs_tx_ops {
* @tgt_is_tgt_type_qca9984: To check QCA9984 target type.
* @tgt_is_tgt_type_qca9888: To check QCA9888 target type.
* @tgt_is_tgt_type_adrastea: To check QCS40X target type.
* @tgt_is_tgt_type_qcn9000: To check QCN9000 (Pine) target type.
* @tgt_get_tgt_type: Get target type
* @tgt_get_tgt_version: Get target version
* @tgt_get_tgt_revision: Get target revision
@ -913,6 +914,7 @@ struct wlan_lmac_if_target_tx_ops {
bool (*tgt_is_tgt_type_qca9984)(uint32_t);
bool (*tgt_is_tgt_type_qca9888)(uint32_t);
bool (*tgt_is_tgt_type_adrastea)(uint32_t);
bool (*tgt_is_tgt_type_qcn9000)(uint32_t);
uint32_t (*tgt_get_tgt_type)(struct wlan_objmgr_psoc *psoc);
uint32_t (*tgt_get_tgt_version)(struct wlan_objmgr_psoc *psoc);
uint32_t (*tgt_get_tgt_revision)(struct wlan_objmgr_psoc *psoc);