mt76: fix tx status reporting for non-probing frames
authorFelix Fietkau <nbd@nbd.name>
Fri, 11 Jan 2019 12:37:43 +0000 (13:37 +0100)
committerFelix Fietkau <nbd@nbd.name>
Thu, 17 Jan 2019 13:44:57 +0000 (14:44 +0100)
On MT76x2, the hardware does not report tx status in the FIFO register,
if the packet id is 0.
Change the allocation of packet IDs to use 0 for no-ack packets, 1 for
non-probing packets and 2-255 for packets with tx status requested.
Fixes rate control issues

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

index 8ef430d..8d56ab9 100644 (file)
@@ -239,7 +239,9 @@ struct mt76_rx_tid {
 #define MT_TX_CB_TXS_FAILED            BIT(2)
 
 #define MT_PACKET_ID_MASK              GENMASK(7, 0)
-#define MT_PACKET_ID_NO_ACK            MT_PACKET_ID_MASK
+#define MT_PACKET_ID_NO_ACK            0
+#define MT_PACKET_ID_NO_SKB            1
+#define MT_PACKET_ID_FIRST             2
 
 #define MT_TX_STATUS_SKB_TIMEOUT       HZ
 
index 6adea02..38cd77d 100644 (file)
@@ -433,7 +433,7 @@ void mt76x02_send_tx_status(struct mt76x02_dev *dev,
        }
 
        if (wcid) {
-               if (stat->pktid)
+               if (stat->pktid >= MT_PACKET_ID_FIRST)
                        status.skb = mt76_tx_status_skb_get(mdev, wcid,
                                                            stat->pktid, &list);
                if (status.skb)
index 4598cb2..a5413a3 100644 (file)
@@ -177,7 +177,7 @@ int mt76x02_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
        if (ret < 0)
                return ret;
 
-       if (pid && pid != MT_PACKET_ID_NO_ACK)
+       if (pid >= MT_PACKET_ID_FIRST)
                qsel = MT_QSEL_MGMT;
 
        *tx_info = FIELD_PREP(MT_TXD_INFO_QSEL, qsel) |
index 81970cf..098d05e 100644 (file)
@@ -87,8 +87,7 @@ int mt76x02u_tx_prepare_skb(struct mt76_dev *mdev, void *data,
        pid = mt76_tx_status_skb_add(mdev, wcid, skb);
        txwi->pktid = pid;
 
-       if ((pid && pid != MT_PACKET_ID_NO_ACK) ||
-           q2ep(q->hw_idx) == MT_EP_OUT_HCCA)
+       if (pid >= MT_PACKET_ID_FIRST || q2ep(q->hw_idx) == MT_EP_OUT_HCCA)
                qsel = MT_QSEL_MGMT;
        else
                qsel = MT_QSEL_EDCA;
index f08509c..1ea08ce 100644 (file)
@@ -170,21 +170,22 @@ mt76_tx_status_skb_add(struct mt76_dev *dev, struct mt76_wcid *wcid,
        int pid;
 
        if (!wcid)
-               return 0;
+               return MT_PACKET_ID_NO_ACK;
 
        if (info->flags & IEEE80211_TX_CTL_NO_ACK)
                return MT_PACKET_ID_NO_ACK;
 
        if (!(info->flags & (IEEE80211_TX_CTL_REQ_TX_STATUS |
                             IEEE80211_TX_CTL_RATE_CTRL_PROBE)))
-               return 0;
+               return MT_PACKET_ID_NO_SKB;
 
        spin_lock_bh(&dev->status_list.lock);
 
        memset(cb, 0, sizeof(*cb));
        wcid->packet_id = (wcid->packet_id + 1) & MT_PACKET_ID_MASK;
-       if (!wcid->packet_id || wcid->packet_id == MT_PACKET_ID_NO_ACK)
-               wcid->packet_id = 1;
+       if (wcid->packet_id == MT_PACKET_ID_NO_ACK ||
+           wcid->packet_id == MT_PACKET_ID_NO_SKB)
+               wcid->packet_id = MT_PACKET_ID_FIRST;
 
        pid = wcid->packet_id;
        cb->wcid = wcid->idx;