mt76: convert MT_TX_HW_QUEUE_EXT_PHY to MT_TX_HW_QUEUE_PHY
authorLorenzo Bianconi <lorenzo@kernel.org>
Mon, 4 Jul 2022 07:02:22 +0000 (09:02 +0200)
committerFelix Fietkau <nbd@nbd.name>
Mon, 11 Jul 2022 11:40:03 +0000 (13:40 +0200)
Report phy_indx in tx_info->hw_queue. This is a preliminary patch to add
newer chipset support

Co-developed-by: Bo Jiao <bo.jiao@mediatek.com>
Signed-off-by: Bo Jiao <bo.jiao@mediatek.com>
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt76.h
drivers/net/wireless/mediatek/mt76/mt7615/mac.c
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c
drivers/net/wireless/mediatek/mt76/mt7615/pci_mac.c
drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c
drivers/net/wireless/mediatek/mt76/mt7915/mac.c
drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
drivers/net/wireless/mediatek/mt76/testmode.c
drivers/net/wireless/mediatek/mt76/tx.c

index 21eec8c..91685ac 100644 (file)
@@ -262,7 +262,7 @@ enum mt76_wcid_flags {
 #define MT76_N_WCIDS 544
 
 /* stored in ieee80211_tx_info::hw_queue */
-#define MT_TX_HW_QUEUE_EXT_PHY         BIT(3)
+#define MT_TX_HW_QUEUE_PHY             GENMASK(3, 2)
 
 DECLARE_EWMA(signal, 10, 8);
 
@@ -1255,12 +1255,10 @@ static inline struct ieee80211_hw *
 mt76_tx_status_get_hw(struct mt76_dev *dev, struct sk_buff *skb)
 {
        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
-       struct ieee80211_hw *hw = dev->phy.hw;
+       u8 phy_idx = (info->hw_queue & MT_TX_HW_QUEUE_PHY) >> 2;
+       struct ieee80211_hw *hw = mt76_phy_hw(dev, phy_idx);
 
-       if ((info->hw_queue & MT_TX_HW_QUEUE_EXT_PHY) && dev->phys[MT_BAND1])
-               hw = dev->phys[MT_BAND1]->hw;
-
-       info->hw_queue &= ~MT_TX_HW_QUEUE_EXT_PHY;
+       info->hw_queue &= ~MT_TX_HW_QUEUE_PHY;
 
        return hw;
 }
index 36b42dc..ad6c7d6 100644 (file)
@@ -727,7 +727,7 @@ int mt7615_mac_write_txwi(struct mt7615_dev *dev, __le32 *txwi,
        u8 fc_type, fc_stype, p_fmt, q_idx, omac_idx = 0, wmm_idx = 0;
        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
        struct ieee80211_tx_rate *rate = &info->control.rates[0];
-       bool ext_phy = info->hw_queue & MT_TX_HW_QUEUE_EXT_PHY;
+       u8 phy_idx = (info->hw_queue & MT_TX_HW_QUEUE_PHY) >> 2;
        bool multicast = is_multicast_ether_addr(hdr->addr1);
        struct ieee80211_vif *vif = info->control.vif;
        bool is_mmio = mt76_is_mmio(&dev->mt76);
@@ -750,7 +750,7 @@ int mt7615_mac_write_txwi(struct mt7615_dev *dev, __le32 *txwi,
                tx_count = msta->rate_count;
        }
 
-       if (ext_phy && dev->mt76.phys[MT_BAND1])
+       if (phy_idx && dev->mt76.phys[MT_BAND1])
                mphy = dev->mt76.phys[MT_BAND1];
 
        fc_type = (le16_to_cpu(fc) & IEEE80211_FCTL_FTYPE) >> 2;
@@ -758,10 +758,10 @@ int mt7615_mac_write_txwi(struct mt7615_dev *dev, __le32 *txwi,
 
        if (beacon) {
                p_fmt = MT_TX_TYPE_FW;
-               q_idx = ext_phy ? MT_LMAC_BCN1 : MT_LMAC_BCN0;
+               q_idx = phy_idx ? MT_LMAC_BCN1 : MT_LMAC_BCN0;
        } else if (qid >= MT_TXQ_PSD) {
                p_fmt = is_mmio ? MT_TX_TYPE_CT : MT_TX_TYPE_SF;
-               q_idx = ext_phy ? MT_LMAC_ALTX1 : MT_LMAC_ALTX0;
+               q_idx = phy_idx ? MT_LMAC_ALTX1 : MT_LMAC_ALTX0;
        } else {
                p_fmt = is_mmio ? MT_TX_TYPE_CT : MT_TX_TYPE_SF;
                q_idx = wmm_idx * MT7615_MAX_WMM_SETS +
index 9a1696d..3dac76e 100644 (file)
@@ -708,10 +708,8 @@ mt7615_mcu_add_beacon_offload(struct mt7615_dev *dev,
                return -EINVAL;
        }
 
-       if (mvif->mt76.band_idx) {
-               info = IEEE80211_SKB_CB(skb);
-               info->hw_queue |= MT_TX_HW_QUEUE_EXT_PHY;
-       }
+       info = IEEE80211_SKB_CB(skb);
+       info->hw_queue |= FIELD_PREP(MT_TX_HW_QUEUE_PHY, mvif->mt76.band_idx);
 
        mt7615_mac_write_txwi(dev, (__le32 *)(req.pkt), skb, wcid, NULL,
                              0, NULL, 0, true);
index 2ec8f2b..0019890 100644 (file)
@@ -77,8 +77,9 @@ int mt7615_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
 
        if ((info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE) && msta) {
                struct mt7615_phy *phy = &dev->phy;
+               u8 phy_idx = (info->hw_queue & MT_TX_HW_QUEUE_PHY) >> 2;
 
-               if ((info->hw_queue & MT_TX_HW_QUEUE_EXT_PHY) && mdev->phys[MT_BAND1])
+               if (phy_idx && mdev->phys[MT_BAND1])
                        phy = mdev->phys[MT_BAND1]->priv;
 
                spin_lock_bh(&dev->mt76.lock);
index f1d51b5..18dea8e 100644 (file)
@@ -455,7 +455,7 @@ void mt76_connac2_mac_write_txwi(struct mt76_dev *dev, __le32 *txwi,
                                 enum mt76_txq_id qid, u32 changed)
 {
        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
-       bool ext_phy = info->hw_queue & MT_TX_HW_QUEUE_EXT_PHY;
+       u8 phy_idx = (info->hw_queue & MT_TX_HW_QUEUE_PHY) >> 2;
        struct ieee80211_vif *vif = info->control.vif;
        struct mt76_phy *mphy = &dev->phy;
        u8 p_fmt, q_idx, omac_idx = 0, wmm_idx = 0, band_idx = 0;
@@ -474,7 +474,7 @@ void mt76_connac2_mac_write_txwi(struct mt76_dev *dev, __le32 *txwi,
                band_idx = mvif->band_idx;
        }
 
-       if (ext_phy && dev->phys[MT_BAND1])
+       if (phy_idx && dev->phys[MT_BAND1])
                mphy = dev->phys[MT_BAND1];
 
        if (inband_disc) {
@@ -502,7 +502,7 @@ void mt76_connac2_mac_write_txwi(struct mt76_dev *dev, __le32 *txwi,
              FIELD_PREP(MT_TXD1_OWN_MAC, omac_idx);
        if (!is_mt7921(dev))
                val |= MT_TXD1_VTA;
-       if (ext_phy || band_idx)
+       if (phy_idx || band_idx)
                val |= MT_TXD1_TGID;
 
        txwi[1] = cpu_to_le32(val);
index a66236b..60ae834 100644 (file)
@@ -666,9 +666,10 @@ void mt7915_mac_write_txwi(struct mt76_dev *dev, __le32 *txwi,
                           enum mt76_txq_id qid, u32 changed)
 {
        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
+       u8 phy_idx = (info->hw_queue & MT_TX_HW_QUEUE_PHY) >> 2;
        struct mt76_phy *mphy = &dev->phy;
 
-       if ((info->hw_queue & MT_TX_HW_QUEUE_EXT_PHY) && dev->phys[MT_BAND1])
+       if (phy_idx && dev->phys[MT_BAND1])
                mphy = dev->phys[MT_BAND1];
 
        mt76_connac2_mac_write_txwi(dev, txwi, skb, wcid, key, pid, qid, changed);
index 601b1a3..f830679 100644 (file)
@@ -1932,8 +1932,7 @@ mt7915_mcu_beacon_inband_discov(struct mt7915_dev *dev, struct ieee80211_vif *vi
        info->control.vif = vif;
        info->band = band;
 
-       if (ext_phy)
-               info->hw_queue |= MT_TX_HW_QUEUE_EXT_PHY;
+       info->hw_queue |= FIELD_PREP(MT_TX_HW_QUEUE_PHY, ext_phy);
 
        len = sizeof(*discov) + MT_TXD_SIZE + skb->len;
        len = (len & 0x3) ? ((len | 0x3) + 1) : len;
@@ -2002,10 +2001,8 @@ int mt7915_mcu_add_beacon(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
                return -EINVAL;
        }
 
-       if (ext_phy) {
-               info = IEEE80211_SKB_CB(skb);
-               info->hw_queue |= MT_TX_HW_QUEUE_EXT_PHY;
-       }
+       info = IEEE80211_SKB_CB(skb);
+       info->hw_queue = FIELD_PREP(MT_TX_HW_QUEUE_PHY, ext_phy);
 
        mt7915_mcu_beacon_check_caps(phy, vif, skb);
 
index 47ac0ca..71fd3fb 100644 (file)
@@ -101,7 +101,6 @@ int mt76_testmode_alloc_skb(struct mt76_phy *phy, u32 len)
        u16 fc = IEEE80211_FTYPE_DATA | IEEE80211_STYPE_DATA |
                 IEEE80211_FCTL_FROMDS;
        struct mt76_testmode_data *td = &phy->test;
-       bool ext_phy = phy != &phy->dev->phy;
        struct sk_buff **frag_tail, *head;
        struct ieee80211_tx_info *info;
        struct ieee80211_hdr *hdr;
@@ -136,9 +135,7 @@ int mt76_testmode_alloc_skb(struct mt76_phy *phy, u32 len)
                      IEEE80211_TX_CTL_NO_ACK |
                      IEEE80211_TX_CTL_NO_PS_BUFFER;
 
-       if (ext_phy)
-               info->hw_queue |= MT_TX_HW_QUEUE_EXT_PHY;
-
+       info->hw_queue |= FIELD_PREP(MT_TX_HW_QUEUE_PHY, phy->band_idx);
        frag_tail = &skb_shinfo(head)->frag_list;
 
        for (i = 0; i < nfrags; i++) {
index 6d26e87..e67cc79 100644 (file)
@@ -310,7 +310,6 @@ mt76_tx(struct mt76_phy *phy, struct ieee80211_sta *sta,
        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
        struct mt76_queue *q;
        int qid = skb_get_queue_mapping(skb);
-       bool ext_phy = phy != &dev->phy;
 
        if (mt76_testmode_enabled(phy)) {
                ieee80211_free_txskb(phy->hw, skb);
@@ -333,9 +332,7 @@ mt76_tx(struct mt76_phy *phy, struct ieee80211_sta *sta,
                ieee80211_get_tx_rates(info->control.vif, sta, skb,
                                       info->control.rates, 1);
 
-       if (ext_phy)
-               info->hw_queue |= MT_TX_HW_QUEUE_EXT_PHY;
-
+       info->hw_queue |= FIELD_PREP(MT_TX_HW_QUEUE_PHY, phy->band_idx);
        q = phy->q_tx[qid];
 
        spin_lock_bh(&q->lock);
@@ -350,7 +347,6 @@ mt76_txq_dequeue(struct mt76_phy *phy, struct mt76_txq *mtxq)
 {
        struct ieee80211_txq *txq = mtxq_to_txq(mtxq);
        struct ieee80211_tx_info *info;
-       bool ext_phy = phy != &phy->dev->phy;
        struct sk_buff *skb;
 
        skb = ieee80211_tx_dequeue(phy->hw, txq);
@@ -358,8 +354,7 @@ mt76_txq_dequeue(struct mt76_phy *phy, struct mt76_txq *mtxq)
                return NULL;
 
        info = IEEE80211_SKB_CB(skb);
-       if (ext_phy)
-               info->hw_queue |= MT_TX_HW_QUEUE_EXT_PHY;
+       info->hw_queue |= FIELD_PREP(MT_TX_HW_QUEUE_PHY, phy->band_idx);
 
        return skb;
 }