mt76x2: introduce mt76x2_mac_load_tx_status routine
authorLorenzo Bianconi <lorenzo.bianconi@redhat.com>
Tue, 31 Jul 2018 08:09:07 +0000 (10:09 +0200)
committerKalle Valo <kvalo@codeaurora.org>
Thu, 2 Aug 2018 18:47:56 +0000 (21:47 +0300)
Add mt76x2_mac_load_tx_status routine since tx stats register map is
shared between usb and pci based devices but usb devices do not have a
tx stat irq line as pcie ones and it is necessary to load tx statistics
using a workqueue

Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/mediatek/mt76/mt76x2_mac.c

index e5e92f79f28abfe0b9dd80c9c7ee4fc357fe810c..bff0b7268467a261f2d48347c8ab463fc852165a 100644 (file)
@@ -532,11 +532,37 @@ out:
        rcu_read_unlock();
 }
 
+static bool
+mt76x2_mac_load_tx_status(struct mt76x2_dev *dev,
+                         struct mt76x2_tx_status *stat)
+{
+       u32 stat1, stat2;
+
+       stat2 = mt76_rr(dev, MT_TX_STAT_FIFO_EXT);
+       stat1 = mt76_rr(dev, MT_TX_STAT_FIFO);
+
+       stat->valid = !!(stat1 & MT_TX_STAT_FIFO_VALID);
+       if (!stat->valid)
+               return false;
+
+       stat->success = !!(stat1 & MT_TX_STAT_FIFO_SUCCESS);
+       stat->aggr = !!(stat1 & MT_TX_STAT_FIFO_AGGR);
+       stat->ack_req = !!(stat1 & MT_TX_STAT_FIFO_ACKREQ);
+       stat->wcid = FIELD_GET(MT_TX_STAT_FIFO_WCID, stat1);
+       stat->rate = FIELD_GET(MT_TX_STAT_FIFO_RATE, stat1);
+
+       stat->retry = FIELD_GET(MT_TX_STAT_FIFO_EXT_RETRY, stat2);
+       stat->pktid = FIELD_GET(MT_TX_STAT_FIFO_EXT_PKTID, stat2);
+
+       return true;
+}
+
 void mt76x2_mac_poll_tx_status(struct mt76x2_dev *dev, bool irq)
 {
        struct mt76x2_tx_status stat = {};
        unsigned long flags;
        u8 update = 1;
+       bool ret;
 
        if (!test_bit(MT76_STATE_RUNNING, &dev->mt76.state))
                return;
@@ -544,26 +570,13 @@ void mt76x2_mac_poll_tx_status(struct mt76x2_dev *dev, bool irq)
        trace_mac_txstat_poll(dev);
 
        while (!irq || !kfifo_is_full(&dev->txstatus_fifo)) {
-               u32 stat1, stat2;
-
                spin_lock_irqsave(&dev->irq_lock, flags);
-               stat2 = mt76_rr(dev, MT_TX_STAT_FIFO_EXT);
-               stat1 = mt76_rr(dev, MT_TX_STAT_FIFO);
-               if (!(stat1 & MT_TX_STAT_FIFO_VALID)) {
-                       spin_unlock_irqrestore(&dev->irq_lock, flags);
-                       break;
-               }
-
+               ret = mt76x2_mac_load_tx_status(dev, &stat);
                spin_unlock_irqrestore(&dev->irq_lock, flags);
 
-               stat.valid = 1;
-               stat.success = !!(stat1 & MT_TX_STAT_FIFO_SUCCESS);
-               stat.aggr = !!(stat1 & MT_TX_STAT_FIFO_AGGR);
-               stat.ack_req = !!(stat1 & MT_TX_STAT_FIFO_ACKREQ);
-               stat.wcid = FIELD_GET(MT_TX_STAT_FIFO_WCID, stat1);
-               stat.rate = FIELD_GET(MT_TX_STAT_FIFO_RATE, stat1);
-               stat.retry = FIELD_GET(MT_TX_STAT_FIFO_EXT_RETRY, stat2);
-               stat.pktid = FIELD_GET(MT_TX_STAT_FIFO_EXT_PKTID, stat2);
+               if (!ret)
+                       break;
+
                trace_mac_txstat_fetch(dev, &stat);
 
                if (!irq) {