Commit 32f7b196 authored by Baochen Qiang's avatar Baochen Qiang Committed by Jeff Johnson
Browse files

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: default avatarBaochen Qiang <quic_bqiang@quicinc.com>
Link: https://patch.msgid.link/20250409-ath12k-wcn7850-mlo-support-v2-3-3801132ca2c3@quicinc.com


Signed-off-by: default avatarJeff Johnson <jeff.johnson@oss.qualcomm.com>
parent 6b85b83e
Loading
Loading
Loading
Loading
+10 −11
Original line number Diff line number Diff line
@@ -2053,19 +2053,17 @@ 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];
		/* 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;
		}

		/* WCN chipsets does not advertise in firmware features
		 * hence skip checking
		 */
		if (ab->hw_params->def_num_link)
		/* while WCN7850 firmware uses QMI single_chip_mlo_support bit */
		ag->mlo_capable = ab->single_chip_mlo_support;
		return;
	}

@@ -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.
	 *
+3 −0
Original line number Diff line number Diff line
@@ -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 *));
};
+5 −1
Original line number Diff line number Diff line
@@ -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);