]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: mt76: mt7925: enabling MLO when the firmware supports it
authorSean Wang <sean.wang@mediatek.com>
Sat, 6 Jul 2024 08:28:17 +0000 (01:28 -0700)
committerFelix Fietkau <nbd@nbd.name>
Tue, 9 Jul 2024 21:02:10 +0000 (23:02 +0200)
Register MLD capability for the firmware supporting MLO.

Co-developed-by: Ming Yen Hsieh <mingyen.hsieh@mediatek.com>
Signed-off-by: Ming Yen Hsieh <mingyen.hsieh@mediatek.com>
Co-developed-by: Deren Wu <deren.wu@mediatek.com>
Signed-off-by: Deren Wu <deren.wu@mediatek.com>
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
Link: https://patch.msgid.link/49c796b101e792c84bc2c0d74753022b75fd3355.1720248331.git.sean.wang@kernel.org
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
drivers/net/wireless/mediatek/mt76/mt7925/init.c
drivers/net/wireless/mediatek/mt76/mt7925/main.c
drivers/net/wireless/mediatek/mt76/mt7925/mcu.c
drivers/net/wireless/mediatek/mt76/mt7925/mt7925.h
drivers/net/wireless/mediatek/mt76/mt792x.h

index d6882c9fd6bc83954bcbc192e2d244b128f942d1..4242d436de26216439b5bb42771b1d62c80e4e83 100644 (file)
@@ -1402,6 +1402,7 @@ enum {
        MT_NIC_CAP_WFDMA_REALLOC,
        MT_NIC_CAP_6G,
        MT_NIC_CAP_CHIP_CAP = 0x20,
+       MT_NIC_CAP_EML_CAP = 0x22,
 };
 
 #define UNI_WOW_DETECT_TYPE_MAGIC              BIT(0)
index c4cbc8976046096dcc3b13fabc49ac89eb5013a7..039949b344b98142fab2f011e61cc172745738a4 100644 (file)
@@ -179,6 +179,12 @@ static void mt7925_init_work(struct work_struct *work)
        mt76_set_stream_caps(&dev->mphy, true);
        mt7925_set_stream_he_eht_caps(&dev->phy);
 
+       ret = mt7925_init_mlo_caps(&dev->phy);
+       if (ret) {
+               dev_err(dev->mt76.dev, "MLO init failed\n");
+               return;
+       }
+
        ret = mt76_register_device(&dev->mt76, true, mt76_rates,
                                   ARRAY_SIZE(mt76_rates));
        if (ret) {
index 1385ef1f1c79cead6b7778ba72b89d1baf48d8c8..8c0768bf9343b34230dba47b93253e69354dc486 100644 (file)
@@ -236,6 +236,35 @@ mt7925_init_eht_caps(struct mt792x_phy *phy, enum nl80211_band band,
        eht_nss->bw._160.rx_tx_mcs13_max_nss = val;
 }
 
+int mt7925_init_mlo_caps(struct mt792x_phy *phy)
+{
+       struct wiphy *wiphy = phy->mt76->hw->wiphy;
+       static const u8 ext_capa_sta[] = {
+               [7] = WLAN_EXT_CAPA8_OPMODE_NOTIF,
+       };
+       static struct wiphy_iftype_ext_capab ext_capab[] = {
+               {
+                       .iftype = NL80211_IFTYPE_STATION,
+                       .extended_capabilities = ext_capa_sta,
+                       .extended_capabilities_mask = ext_capa_sta,
+                       .extended_capabilities_len = sizeof(ext_capa_sta),
+               },
+       };
+
+       if (!(phy->chip_cap & MT792x_CHIP_CAP_MLO_EVT_EN))
+               return 0;
+
+       ext_capab[0].eml_capabilities = phy->eml_cap;
+       ext_capab[0].mld_capa_and_ops =
+               u16_encode_bits(1, IEEE80211_MLD_CAP_OP_MAX_SIMUL_LINKS);
+
+       wiphy->flags |= WIPHY_FLAG_SUPPORTS_MLO;
+       wiphy->iftype_ext_capab = ext_capab;
+       wiphy->num_iftype_ext_capab = ARRAY_SIZE(ext_capab);
+
+       return 0;
+}
+
 static void
 __mt7925_set_stream_he_eht_caps(struct mt792x_phy *phy,
                                struct ieee80211_supported_band *sband,
index 26f78c0a491e811476d0d806bec1e29ee364e7e9..9dc22fbe25d3350875874f55d9d8ee8b384a1789 100644 (file)
@@ -751,6 +751,20 @@ mt7925_mcu_parse_phy_cap(struct mt792x_dev *dev, char *data)
        dev->has_eht = cap->eht;
 }
 
+static void
+mt7925_mcu_parse_eml_cap(struct mt792x_dev *dev, char *data)
+{
+       struct mt7925_mcu_eml_cap {
+               u8 rsv[4];
+               __le16 eml_cap;
+               u8 rsv2[6];
+       } __packed * cap;
+
+       cap = (struct mt7925_mcu_eml_cap *)data;
+
+       dev->phy.eml_cap = le16_to_cpu(cap->eml_cap);
+}
+
 static int
 mt7925_mcu_get_nic_capability(struct mt792x_dev *dev)
 {
@@ -805,6 +819,12 @@ mt7925_mcu_get_nic_capability(struct mt792x_dev *dev)
                case MT_NIC_CAP_PHY:
                        mt7925_mcu_parse_phy_cap(dev, tlv->data);
                        break;
+               case MT_NIC_CAP_CHIP_CAP:
+                       memcpy(&dev->phy.chip_cap, (void *)skb->data, sizeof(u64));
+                       break;
+               case MT_NIC_CAP_EML_CAP:
+                       mt7925_mcu_parse_eml_cap(dev, tlv->data);
+                       break;
                default:
                        break;
                }
index 1ae66629e39fcb70473abc8d3556b09ceaf351a7..669f3a079d048556e7169d05dcf547858e7d7cf9 100644 (file)
@@ -235,6 +235,7 @@ void mt7925_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q,
                         struct sk_buff *skb, u32 *info);
 void mt7925_stats_work(struct work_struct *work);
 void mt7925_set_stream_he_eht_caps(struct mt792x_phy *phy);
+int mt7925_init_mlo_caps(struct mt792x_phy *phy);
 int mt7925_init_debugfs(struct mt792x_dev *dev);
 
 int mt7925_mcu_set_beacon_filter(struct mt792x_dev *dev,
index 5ede241167483679a1a79c3afc4aede1745c5cb9..30635aeba363a15e5c81d66e5c20d29cad071d72 100644 (file)
@@ -27,6 +27,7 @@
 
 #define MT792x_CHIP_CAP_CLC_EVT_EN BIT(0)
 #define MT792x_CHIP_CAP_RSSI_NOTIFY_EVT_EN BIT(1)
+#define MT792x_CHIP_CAP_MLO_EVT_EN BIT(2)
 
 /* NOTE: used to map mt76_rates. idx may change if firmware expands table */
 #define MT792x_BASIC_RATES_TBL 11
@@ -163,6 +164,7 @@ struct mt792x_phy {
 #endif
        void *clc[MT792x_CLC_MAX_NUM];
        u64 chip_cap;
+       u16 eml_cap;
 
        struct work_struct roc_work;
        struct timer_list roc_timer;