qcacmn: Allow only 80P80 supported frequencies for 130 opclass

Pine and Spruce supports 80P80 mode of operation in 5 GHz band
and hence opclass 130 is sent to the user application in
MESH_MAP_OPCLASS_FOR_CUR_HWMODE NL80211 command.
However, these chips support 80P80 mode of operation
only on CFI 138 and 155, but to the application all the 80 MHz
channels in the 5 GHz band are advertised as supported.
This causes the application's channel selection algorithm to fail.
The existing API reg_is_chan_supported() can determine if the input
frequency is 80P80 capable only if cfreq2 of the 80P80 channel is
provided and in reg_get_cfis_from_opclassmap_for_non6g() API, it is not
possible to determine all combinations of cfreq2 for the given primary
frequency. Hence, a call to is_freq_80p80_supported() is made to
determine if any 80P80 combination is possible for the given input
frequency.
Also, 6 GHz channels do not support 80P80 mode of operation.
reg_is_cfi_supported() does a lot of computation to find out that
80P80 is not supported. Hence, if the opclass entry
is 6 GHz 80P80, set 80p80_supported as false.

Hence, send only the supported 80P80 CFIs in the
supported channel list array in MESH_MAP_OPCLASS_FOR_CUR_HWMODE command.

CRs-Fixed: 3627501
Change-Id: Ib5d3e872b34b8df81b8466e877b10f2fd4e68e40
This commit is contained in:
Priyadarshnee Srinivasan
2023-10-30 21:25:41 +05:30
committed by Ravindra Konda
parent f3cd9c9839
commit 10e648c51e
3 changed files with 66 additions and 10 deletions

View File

@@ -1456,5 +1456,7 @@ QDF_STATUS target_if_register_regulatory_tx_ops(
reg_ops->is_80p80_supported = NULL; reg_ops->is_80p80_supported = NULL;
reg_ops->is_freq_80p80_supported = NULL;
return QDF_STATUS_SUCCESS; return QDF_STATUS_SUCCESS;
} }

View File

@@ -1135,6 +1135,8 @@ struct wlan_lmac_if_ftm_rx_ops {
* response from fw. * response from fw.
* @is_80p80_supported: Callback function to check if the device supports a * @is_80p80_supported: Callback function to check if the device supports a
* 6GHz 80p80 channel. * 6GHz 80p80 channel.
* @is_freq_80p80_supported: Callback function to check if the given primary
* frequency supports 80P80 mode of operation.
*/ */
struct wlan_lmac_if_reg_tx_ops { struct wlan_lmac_if_reg_tx_ops {
QDF_STATUS (*register_master_handler)(struct wlan_objmgr_psoc *psoc, QDF_STATUS (*register_master_handler)(struct wlan_objmgr_psoc *psoc,
@@ -1207,6 +1209,8 @@ struct wlan_lmac_if_reg_tx_ops {
struct wlan_objmgr_psoc *psoc, struct wlan_objmgr_psoc *psoc,
uint32_t pdev_id); uint32_t pdev_id);
bool (*is_80p80_supported)(struct wlan_objmgr_pdev *pdev); bool (*is_80p80_supported)(struct wlan_objmgr_pdev *pdev);
bool (*is_freq_80p80_supported)(struct wlan_objmgr_pdev *pdev,
qdf_freq_t freq);
}; };
/** /**

View File

@@ -1772,6 +1772,18 @@ static bool reg_is_cfi_supported(struct wlan_objmgr_pdev *pdev,
return is_cfi_supported; return is_cfi_supported;
} }
/**
* reg_is_opclass_entry_80p80() - Return true if the opclass entry is
* 80P80 false otherwise.
* @op_class_tbl: Pointer to struct reg_dmn_op_class_map_t
*/
static bool
reg_is_opclass_entry_80p80(const struct reg_dmn_op_class_map_t *op_class_tbl)
{
return (op_class_tbl->chan_spacing == BW_80_MHZ &&
op_class_tbl->behav_limit == BIT(BEHAV_BW80_PLUS));
}
/** /**
* reg_get_cfis_from_opclassmap_for_6g()- Get channels from the opclass map * reg_get_cfis_from_opclassmap_for_6g()- Get channels from the opclass map
* for 6GHz * for 6GHz
@@ -1805,11 +1817,15 @@ static void reg_get_cfis_from_opclassmap_for_6g(
bool is_cfi_supported; bool is_cfi_supported;
cfi_freq = start_freq + FREQ_TO_CHAN_SCALE * cfi; cfi_freq = start_freq + FREQ_TO_CHAN_SCALE * cfi;
is_cfi_supported = reg_is_cfi_supported(pdev, /* 6 Ghz band does not support 80P80 mode of operation.*/
cfi_freq, if (reg_is_opclass_entry_80p80(op_class_tbl))
bw, is_cfi_supported = false;
op_class_tbl->op_class, else
in_6g_pwr_mode); is_cfi_supported = reg_is_cfi_supported(pdev,
cfi_freq,
bw,
op_class_tbl->op_class,
in_6g_pwr_mode);
if (is_cfi_supported && if (is_cfi_supported &&
(in_opclass_conf == OPCLASSES_SUPPORTED_BY_CUR_HWMODE || (in_opclass_conf == OPCLASSES_SUPPORTED_BY_CUR_HWMODE ||
in_opclass_conf == OPCLASSES_SUPPORTED_BY_DOMAIN)) { in_opclass_conf == OPCLASSES_SUPPORTED_BY_DOMAIN)) {
@@ -1828,6 +1844,37 @@ static uint16_t reg_find_nearest_ieee_bw(uint16_t spacing)
return (spacing / SMALLEST_BW) * SMALLEST_BW; return (spacing / SMALLEST_BW) * SMALLEST_BW;
} }
/**
* reg_is_freq_80p80_supported() - Return true if the given input frequency
* supports 80P80, false otherwise.
* @pdev: Pointer to struct wlan_objmgr_pdev
* @primary_freq: Primary frequency in MHz
*
* Return: True if the frequency supports 80P80 mode of operation, false
* otherwise.
*/
static bool
reg_is_freq_80p80_supported(struct wlan_objmgr_pdev *pdev,
qdf_freq_t primary_freq)
{
struct wlan_lmac_if_reg_tx_ops *reg_tx_ops;
struct wlan_objmgr_psoc *psoc;
psoc = wlan_pdev_get_psoc(pdev);
if (!psoc)
return false;
reg_tx_ops = reg_get_psoc_tx_ops(psoc);
if (!reg_tx_ops)
return false;
if (reg_tx_ops->is_freq_80p80_supported &&
reg_tx_ops->is_freq_80p80_supported(pdev, primary_freq))
return true;
return false;
}
/** /**
* reg_get_cfis_from_opclassmap_for_non6g()- Get channels from the opclass map * reg_get_cfis_from_opclassmap_for_non6g()- Get channels from the opclass map
* for non-6GHz * for non-6GHz
@@ -1868,12 +1915,15 @@ static void reg_get_cfis_from_opclassmap_for_non6g(
pri_freq = reg_get_nearest_primary_freq(opcls_bw, pri_freq = reg_get_nearest_primary_freq(opcls_bw,
pri_freq, pri_freq,
op_class_tbl->op_class); op_class_tbl->op_class);
is_supported = reg_is_chan_supported(pdev,
pri_freq,
0,
ch_width,
in_6g_pwr_mode);
if (reg_is_opclass_entry_80p80(op_class_tbl))
is_supported = reg_is_freq_80p80_supported(pdev, pri_freq);
else
is_supported = reg_is_chan_supported(pdev,
pri_freq,
0,
ch_width,
in_6g_pwr_mode);
if (is_supported && if (is_supported &&
(in_opclass_conf == OPCLASSES_SUPPORTED_BY_CUR_HWMODE || (in_opclass_conf == OPCLASSES_SUPPORTED_BY_CUR_HWMODE ||
in_opclass_conf == OPCLASSES_SUPPORTED_BY_DOMAIN)) { in_opclass_conf == OPCLASSES_SUPPORTED_BY_DOMAIN)) {