mt76: mt7915: add missing capabilities for DBDC
authorRyder Lee <ryder.lee@mediatek.com>
Fri, 26 Feb 2021 16:44:27 +0000 (00:44 +0800)
committerFelix Fietkau <nbd@nbd.name>
Sun, 11 Apr 2021 22:01:23 +0000 (00:01 +0200)
This improves dbdc performance.

Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7915/init.c

index c599b44a728cbaba93d222ab433f3eeed8d3fecf..165be6abcc967e9cca4a9e3e0b8dab184a44f846 100644 (file)
@@ -113,6 +113,24 @@ mt7915_init_wiphy(struct ieee80211_hw *hw)
        ieee80211_hw_set(hw, WANT_MONITOR_VIF);
 
        hw->max_tx_fragments = 4;
+
+       if (phy->mt76->cap.has_2ghz)
+               phy->mt76->sband_2g.sband.ht_cap.cap |=
+                       IEEE80211_HT_CAP_LDPC_CODING |
+                       IEEE80211_HT_CAP_MAX_AMSDU;
+
+       if (phy->mt76->cap.has_5ghz) {
+               phy->mt76->sband_5g.sband.ht_cap.cap |=
+                       IEEE80211_HT_CAP_LDPC_CODING |
+                       IEEE80211_HT_CAP_MAX_AMSDU;
+               phy->mt76->sband_5g.sband.vht_cap.cap |=
+                       IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_7991 |
+                       IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK;
+       }
+
+       mt76_set_stream_caps(phy->mt76, true);
+       mt7915_set_stream_vht_txbf_caps(phy);
+       mt7915_set_stream_he_caps(phy);
 }
 
 static void
@@ -240,22 +258,17 @@ static int mt7915_register_ext_phy(struct mt7915_dev *dev)
        phy->mt76 = mphy;
        mphy->chainmask = dev->chainmask & ~dev->mphy.chainmask;
        mphy->antenna_mask = BIT(hweight8(mphy->chainmask)) - 1;
-       mt7915_init_wiphy(mphy->hw);
 
        INIT_LIST_HEAD(&phy->stats_list);
        INIT_DELAYED_WORK(&mphy->mac_work, mt7915_mac_work);
 
        mt7915_eeprom_parse_band_config(phy);
-       mt7915_set_stream_vht_txbf_caps(phy);
-       mt7915_set_stream_he_caps(phy);
+       mt7915_init_wiphy(mphy->hw);
 
        memcpy(mphy->macaddr, dev->mt76.eeprom.data + MT_EE_MAC_ADDR2,
               ETH_ALEN);
        mt76_eeprom_override(mphy);
 
-       /* The second interface does not get any packets unless it has a vif */
-       ieee80211_hw_set(mphy->hw, WANT_MONITOR_VIF);
-
        ret = mt7915_init_tx_queues(phy, MT7915_TXQ_BAND1,
                                    MT7915_TX_RING_SIZE);
        if (ret)
@@ -332,8 +345,14 @@ static int mt7915_init_hardware(struct mt7915_dev *dev)
 
 void mt7915_set_stream_vht_txbf_caps(struct mt7915_phy *phy)
 {
-       int nss = hweight8(phy->mt76->chainmask);
-       u32 *cap = &phy->mt76->sband_5g.sband.vht_cap.cap;
+       int nss;
+       u32 *cap;
+
+       if (!phy->mt76->cap.has_5ghz)
+               return;
+
+       nss = hweight8(phy->mt76->chainmask);
+       cap = &phy->mt76->sband_5g.sband.vht_cap.cap;
 
        *cap |= IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
                IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE |
@@ -637,25 +656,14 @@ int mt7915_register_device(struct mt7915_dev *dev)
                return ret;
 
        mt7915_init_wiphy(hw);
-       dev->mphy.sband_2g.sband.ht_cap.cap |=
-                       IEEE80211_HT_CAP_LDPC_CODING |
-                       IEEE80211_HT_CAP_MAX_AMSDU;
-       dev->mphy.sband_5g.sband.ht_cap.cap |=
-                       IEEE80211_HT_CAP_LDPC_CODING |
-                       IEEE80211_HT_CAP_MAX_AMSDU;
-       dev->mphy.sband_5g.sband.vht_cap.cap |=
-                       IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_7991 |
-                       IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK;
+
        if (!dev->dbdc_support)
                dev->mphy.sband_5g.sband.vht_cap.cap |=
                        IEEE80211_VHT_CAP_SHORT_GI_160 |
                        IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ;
+
        dev->mphy.hw->wiphy->available_antennas_rx = dev->mphy.chainmask;
        dev->mphy.hw->wiphy->available_antennas_tx = dev->mphy.chainmask;
-
-       mt76_set_stream_caps(&dev->mphy, true);
-       mt7915_set_stream_vht_txbf_caps(&dev->phy);
-       mt7915_set_stream_he_caps(&dev->phy);
        dev->phy.dfs_state = -1;
 
 #ifdef CONFIG_NL80211_TESTMODE