mt76: overwrite qid for non-bufferable mgmt frames
authorLorenzo Bianconi <lorenzo@kernel.org>
Mon, 1 Jun 2020 07:45:33 +0000 (09:45 +0200)
committerFelix Fietkau <nbd@nbd.name>
Sun, 7 Jun 2020 14:59:40 +0000 (16:59 +0200)
Overwrite hw queue id for non-bufferable management frames if the hw
support always txq (altxq) in order to be in sync with mac txwi code

Fixes: cdad4874057d ("mt76: mt7615: add dma and tx queue initialization for MT7622")
Fixes: f40ac0f3d3c0 ("mt76: mt7615: introduce mt7663e support")
Suggested-by: Felix Fietkau <nbd@nbd.name>
Tested-by: Sean Wang <sean.wang@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/dma.c
drivers/net/wireless/mediatek/mt76/mt7615/mac.c
drivers/net/wireless/mediatek/mt76/mt7615/mmio.c
drivers/net/wireless/mediatek/mt76/mt7615/usb.c
drivers/net/wireless/mediatek/mt76/tx.c

index dfe625a53c6319cf04b362baeaae88fcf792c335..3d7db6ffb599872231a458253b1654034fb22bf9 100644 (file)
@@ -301,6 +301,7 @@ struct mt76_hw_cap {
 #define MT_DRV_TX_ALIGNED4_SKBS                BIT(1)
 #define MT_DRV_SW_RX_AIRTIME           BIT(2)
 #define MT_DRV_RX_DMA_HDR              BIT(3)
+#define MT_DRV_HW_MGMT_TXQ             BIT(4)
 
 struct mt76_driver_ops {
        u32 drv_flags;
index 83fdcf5db3c7924de280f15fc300aacd7855a44c..e5a965df899a174d7219a49522996627102ee4f9 100644 (file)
@@ -100,6 +100,7 @@ mt7615_tx_cleanup(struct mt7615_dev *dev)
        int i;
 
        mt76_queue_tx_cleanup(dev, MT_TXQ_MCU, false);
+       mt76_queue_tx_cleanup(dev, MT_TXQ_PSD, false);
        if (is_mt7615(&dev->mt76)) {
                mt76_queue_tx_cleanup(dev, MT_TXQ_BE, false);
        } else {
index 5990355bc731e286fc0f17dd5063ae74f4f2d686..d97315ec72658ee3d74c2612bf38f5e8781aeba9 100644 (file)
@@ -526,22 +526,16 @@ int mt7615_mac_write_txwi(struct mt7615_dev *dev, __le32 *txwi,
        fc_type = (le16_to_cpu(fc) & IEEE80211_FCTL_FTYPE) >> 2;
        fc_stype = (le16_to_cpu(fc) & IEEE80211_FCTL_STYPE) >> 4;
 
-       if (ieee80211_is_data(fc) || ieee80211_is_bufferable_mmpdu(fc)) {
-               q_idx = wmm_idx * MT7615_MAX_WMM_SETS +
-                       mt7615_lmac_mapping(dev, skb_get_queue_mapping(skb));
-               p_fmt = is_usb ? MT_TX_TYPE_SF : MT_TX_TYPE_CT;
-       } else if (beacon) {
-               if (ext_phy)
-                       q_idx = MT_LMAC_BCN1;
-               else
-                       q_idx = MT_LMAC_BCN0;
+       if (beacon) {
                p_fmt = MT_TX_TYPE_FW;
+               q_idx = ext_phy ? MT_LMAC_BCN1 : MT_LMAC_BCN0;
+       } else if (skb_get_queue_mapping(skb) >= MT_TXQ_PSD) {
+               p_fmt = is_usb ? MT_TX_TYPE_SF : MT_TX_TYPE_CT;
+               q_idx = ext_phy ? MT_LMAC_ALTX1 : MT_LMAC_ALTX0;
        } else {
-               if (ext_phy)
-                       q_idx = MT_LMAC_ALTX1;
-               else
-                       q_idx = MT_LMAC_ALTX0;
                p_fmt = is_usb ? MT_TX_TYPE_SF : MT_TX_TYPE_CT;
+               q_idx = wmm_idx * MT7615_MAX_WMM_SETS +
+                       mt7615_lmac_mapping(dev, skb_get_queue_mapping(skb));
        }
 
        val = FIELD_PREP(MT_TXD0_TX_BYTES, skb->len + sz_txd) |
index e670393506f0b4dbe6a66646519e30f4db3e07b0..2e99845b9c96c67fe4110a14485f0aaa8e066cbc 100644 (file)
@@ -146,7 +146,7 @@ int mt7615_mmio_probe(struct device *pdev, void __iomem *mem_base,
        static const struct mt76_driver_ops drv_ops = {
                /* txwi_size = txd size + txp size */
                .txwi_size = MT_TXD_SIZE + sizeof(struct mt7615_txp_common),
-               .drv_flags = MT_DRV_TXWI_NO_FREE,
+               .drv_flags = MT_DRV_TXWI_NO_FREE | MT_DRV_HW_MGMT_TXQ,
                .survey_flags = SURVEY_INFO_TIME_TX |
                                SURVEY_INFO_TIME_RX |
                                SURVEY_INFO_TIME_BSS_RX,
index a50077eb24d75f2b10635fdc930c42bef970e2e1..f5dc1b8285186a7bf53a0906b8e39cabbdc452bd 100644 (file)
@@ -270,7 +270,7 @@ static int mt7663u_probe(struct usb_interface *usb_intf,
 {
        static const struct mt76_driver_ops drv_ops = {
                .txwi_size = MT_USB_TXD_SIZE,
-               .drv_flags = MT_DRV_RX_DMA_HDR,
+               .drv_flags = MT_DRV_RX_DMA_HDR | MT_DRV_HW_MGMT_TXQ,
                .tx_prepare_skb = mt7663u_tx_prepare_skb,
                .tx_complete_skb = mt7663u_tx_complete_skb,
                .tx_status_data = mt7663u_tx_status_data,
index fca38ea2441f79d86504e2e410e646c1148ece40..f10c98aa883c0ebdf92b7216bd22240f11eb5cea 100644 (file)
@@ -264,6 +264,13 @@ mt76_tx(struct mt76_phy *phy, struct ieee80211_sta *sta,
                skb_set_queue_mapping(skb, qid);
        }
 
+       if ((dev->drv->drv_flags & MT_DRV_HW_MGMT_TXQ) &&
+           !ieee80211_is_data(hdr->frame_control) &&
+           !ieee80211_is_bufferable_mmpdu(hdr->frame_control)) {
+               qid = MT_TXQ_PSD;
+               skb_set_queue_mapping(skb, qid);
+       }
+
        if (!(wcid->tx_info & MT_WCID_TX_INFO_SET))
                ieee80211_get_tx_rates(info->control.vif, sta, skb,
                                       info->control.rates, 1);