wifi: ath12k: support MLO as well if single_chip_mlo_support flag is set

Currently firmware MLO capability is validated via firmware IE, however
WCN7850 firmware does not support this method but instead advertises
MLO by single_chip_mlo_support bit in QMI phy capability message.

Change to consider single_chip_mlo_support bit as well for MLO capability
validation.

Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3
Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.1.c5-00284-QCAHMTSWPL_V1.0_V2.0_SILICONZ-1
Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.3.1-00209-QCAHKSWPL_SILICONZ-1

Signed-off-by: Baochen Qiang <quic_bqiang@quicinc.com>
Link: https://patch.msgid.link/20250409-ath12k-wcn7850-mlo-support-v2-3-3801132ca2c3@quicinc.com
Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
This commit is contained in:
Baochen Qiang 2025-04-09 10:26:36 +08:00 committed by Jeff Johnson
parent 6b85b83e46
commit 32f7b19668
3 changed files with 18 additions and 12 deletions

View File

@ -2053,20 +2053,18 @@ void ath12k_core_hw_group_set_mlo_capable(struct ath12k_hw_group *ag)
lockdep_assert_held(&ag->mutex);
/* If more than one devices are grouped, then inter MLO
* functionality can work still independent of whether internally
* each device supports single_chip_mlo or not.
* Only when there is one device, then disable for WCN chipsets
* till the required driver implementation is in place.
*/
if (ag->num_devices == 1) {
ab = ag->ab[0];
/* WCN chipsets does not advertise in firmware features
* hence skip checking
*/
if (ab->hw_params->def_num_link)
/* QCN9274 firmware uses firmware IE for MLO advertisement */
if (ab->fw.fw_features_valid) {
ag->mlo_capable =
ath12k_fw_feature_supported(ab, ATH12K_FW_FEATURE_MLO);
return;
}
/* while WCN7850 firmware uses QMI single_chip_mlo_support bit */
ag->mlo_capable = ab->single_chip_mlo_support;
return;
}
ag->mlo_capable = true;
@ -2186,6 +2184,7 @@ struct ath12k_base *ath12k_core_alloc(struct device *dev, size_t priv_size,
ab->dev = dev;
ab->hif.bus = bus;
ab->qmi.num_radios = U8_MAX;
ab->single_chip_mlo_support = false;
/* Device index used to identify the devices in a group.
*

View File

@ -1126,6 +1126,9 @@ struct ath12k_base {
struct ath12k_ftm_event_obj ftm_event_obj;
bool hw_group_ref;
/* Denote whether MLO is possible within the device */
bool single_chip_mlo_support;
/* must be last */
u8 drv_priv[] __aligned(sizeof(void *));
};

View File

@ -2268,6 +2268,9 @@ static void ath12k_qmi_phy_cap_send(struct ath12k_base *ab)
goto out;
}
if (resp.single_chip_mlo_support_valid && resp.single_chip_mlo_support)
ab->single_chip_mlo_support = true;
if (!resp.num_phy_valid) {
ret = -ENODATA;
goto out;
@ -2276,7 +2279,8 @@ static void ath12k_qmi_phy_cap_send(struct ath12k_base *ab)
ab->qmi.num_radios = resp.num_phy;
ath12k_dbg(ab, ATH12K_DBG_QMI,
"phy capability resp valid %d num_phy %d valid %d board_id %d\n",
"phy capability resp valid %d single_chip_mlo_support %d valid %d num_phy %d valid %d board_id %d\n",
resp.single_chip_mlo_support_valid, resp.single_chip_mlo_support,
resp.num_phy_valid, resp.num_phy,
resp.board_id_valid, resp.board_id);