]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: ath12k: support MLO as well if single_chip_mlo_support flag is set
authorBaochen Qiang <quic_bqiang@quicinc.com>
Wed, 9 Apr 2025 02:26:36 +0000 (10:26 +0800)
committerJeff Johnson <jeff.johnson@oss.qualcomm.com>
Tue, 15 Apr 2025 14:35:51 +0000 (07:35 -0700)
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>
drivers/net/wireless/ath/ath12k/core.c
drivers/net/wireless/ath/ath12k/core.h
drivers/net/wireless/ath/ath12k/qmi.c

index ae125b57a571db162f359cb76340178059d3748b..b501d722df31a6ac7f5eac0eae192b6ff51b748d 100644 (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.
         *
index ad39537786c33342d4cd15a692e73826b8eed1ea..06dddf66a83b11ee1333c78eb2f77631412cb228 100644 (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 *));
 };
index c867130f1ddc87ba3ea65d03a6fe99a06c6fe2ab..99e1fb2910d06b2e140733355011725175b542b4 100644 (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);