OSDN Git Service

mt76: mt7603: use napi polling for tx cleanup
authorLorenzo Bianconi <lorenzo@kernel.org>
Wed, 1 May 2019 14:06:21 +0000 (16:06 +0200)
committerFelix Fietkau <nbd@nbd.name>
Tue, 25 Jun 2019 10:55:25 +0000 (12:55 +0200)
This allows tx scheduling and tx cleanup to run concurrently

Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7603/core.c
drivers/net/wireless/mediatek/mt76/mt7603/dma.c
drivers/net/wireless/mediatek/mt76/mt7603/mac.c

index 37e5644..e7ee58e 100644 (file)
@@ -35,7 +35,7 @@ irqreturn_t mt7603_irq_handler(int irq, void *dev_instance)
 
        if (intr & MT_INT_TX_DONE_ALL) {
                mt7603_irq_disable(dev, MT_INT_TX_DONE_ALL);
-               tasklet_schedule(&dev->mt76.tx_tasklet);
+               napi_schedule(&dev->mt76.tx_napi);
        }
 
        if (intr & MT_INT_RX_DONE(0)) {
index 27e2d9f..54314f6 100644 (file)
@@ -139,15 +139,30 @@ static void
 mt7603_tx_tasklet(unsigned long data)
 {
        struct mt7603_dev *dev = (struct mt7603_dev *)data;
+
+       mt76_txq_schedule_all(&dev->mt76);
+}
+
+static int mt7603_poll_tx(struct napi_struct *napi, int budget)
+{
+       struct mt7603_dev *dev;
        int i;
 
+       dev = container_of(napi, struct mt7603_dev, mt76.tx_napi);
        dev->tx_dma_check = 0;
+
        for (i = MT_TXQ_MCU; i >= 0; i--)
                mt76_queue_tx_cleanup(dev, i, false);
 
-       mt76_txq_schedule_all(&dev->mt76);
+       if (napi_complete_done(napi, 0))
+               mt7603_irq_enable(dev, MT_INT_TX_DONE_ALL);
 
-       mt7603_irq_enable(dev, MT_INT_TX_DONE_ALL);
+       for (i = MT_TXQ_MCU; i >= 0; i--)
+               mt76_queue_tx_cleanup(dev, i, false);
+
+       tasklet_schedule(&dev->mt76.tx_tasklet);
+
+       return 0;
 }
 
 int mt7603_dma_init(struct mt7603_dev *dev)
@@ -216,7 +231,15 @@ int mt7603_dma_init(struct mt7603_dev *dev)
                return ret;
 
        mt76_wr(dev, MT_DELAY_INT_CFG, 0);
-       return mt76_init_queues(dev);
+       ret = mt76_init_queues(dev);
+       if (ret)
+               return ret;
+
+       netif_tx_napi_add(&dev->mt76.napi_dev, &dev->mt76.tx_napi,
+                         mt7603_poll_tx, NAPI_POLL_WEIGHT);
+       napi_enable(&dev->mt76.tx_napi);
+
+       return 0;
 }
 
 void mt7603_dma_cleanup(struct mt7603_dev *dev)
@@ -227,5 +250,6 @@ void mt7603_dma_cleanup(struct mt7603_dev *dev)
                   MT_WPDMA_GLO_CFG_TX_WRITEBACK_DONE);
 
        tasklet_kill(&dev->mt76.tx_tasklet);
+       netif_napi_del(&dev->mt76.tx_napi);
        mt76_dma_cleanup(&dev->mt76);
 }
index 6d506e3..0ccba59 100644 (file)
@@ -1282,6 +1282,7 @@ static void mt7603_mac_watchdog_reset(struct mt7603_dev *dev)
        tasklet_disable(&dev->mt76.pre_tbtt_tasklet);
        napi_disable(&dev->mt76.napi[0]);
        napi_disable(&dev->mt76.napi[1]);
+       napi_disable(&dev->mt76.tx_napi);
 
        mutex_lock(&dev->mt76.mutex);
 
@@ -1326,7 +1327,8 @@ skip_dma_reset:
        mutex_unlock(&dev->mt76.mutex);
 
        tasklet_enable(&dev->mt76.tx_tasklet);
-       tasklet_schedule(&dev->mt76.tx_tasklet);
+       napi_enable(&dev->mt76.tx_napi);
+       napi_schedule(&dev->mt76.tx_napi);
 
        tasklet_enable(&dev->mt76.pre_tbtt_tasklet);
        mt7603_beacon_set_timer(dev, -1, beacon_int);