mt76: mt76x02: fix tx reordering on rate control probing without a-mpdu
authorFelix Fietkau <nbd@nbd.name>
Thu, 6 Jun 2019 07:22:15 +0000 (09:22 +0200)
committerFelix Fietkau <nbd@nbd.name>
Thu, 27 Jun 2019 10:58:13 +0000 (12:58 +0200)
To avoid aggregating rate control probing packets with other traffic, and to
ensure that the probing rate gets used, probing packets get assigned a different
internal queueing priority.
This causes packets to be transmitted in a different order, which is compensated
by the receiver side reordering.
However, if A-MPDU is disabled, this reordering can become visible to upper
layers on the receiver side. Disable the priority change if A-MPDU is disabled.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt76x02_txrx.c
drivers/net/wireless/mediatek/mt76/mt76x02_usb_core.c

index 7a1164a07ee75c8dd14970d4a57df2afbbbbbe47..04118f08debcb3692c321cad7dc98567159d575a 100644 (file)
@@ -154,6 +154,7 @@ int mt76x02_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
        struct mt76x02_dev *dev = container_of(mdev, struct mt76x02_dev, mt76);
        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx_info->skb->data;
        struct mt76x02_txwi *txwi = txwi_ptr;
+       bool ampdu = IEEE80211_SKB_CB(tx_info->skb)->flags & IEEE80211_TX_CTL_AMPDU;
        int hdrlen, len, pid, qsel = MT_QSEL_EDCA;
 
        if (qid == MT_TXQ_PSD && wcid && wcid->idx < 128)
@@ -172,7 +173,7 @@ int mt76x02_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
 
        txwi->pktid = pid;
 
-       if (mt76_is_skb_pktid(pid))
+       if (mt76_is_skb_pktid(pid) && ampdu)
                qsel = MT_QSEL_MGMT;
 
        tx_info->info = FIELD_PREP(MT_TXD_INFO_QSEL, qsel) |
index 47386ca713cc9c75a6cbb141e4d2a9f56175fe2a..42ec02b6cdd6cc9b8bc3c28926c9def386f60cb3 100644 (file)
@@ -79,6 +79,7 @@ int mt76x02u_tx_prepare_skb(struct mt76_dev *mdev, void *data,
        struct mt76x02_dev *dev = container_of(mdev, struct mt76x02_dev, mt76);
        int pid, len = tx_info->skb->len, ep = q2ep(mdev->q_tx[qid].q->hw_idx);
        struct mt76x02_txwi *txwi;
+       bool ampdu = IEEE80211_SKB_CB(tx_info->skb)->flags & IEEE80211_TX_CTL_AMPDU;
        enum mt76_qsel qsel;
        u32 flags;
 
@@ -97,7 +98,7 @@ int mt76x02u_tx_prepare_skb(struct mt76_dev *mdev, void *data,
 
        txwi->pktid = pid;
 
-       if (mt76_is_skb_pktid(pid) || ep == MT_EP_OUT_HCCA)
+       if ((mt76_is_skb_pktid(pid) && ampdu) || ep == MT_EP_OUT_HCCA)
                qsel = MT_QSEL_MGMT;
        else
                qsel = MT_QSEL_EDCA;