mt76: mt7615: add queue entry in debugfs
authorLorenzo Bianconi <lorenzo@kernel.org>
Fri, 13 Sep 2019 07:05:51 +0000 (09:05 +0200)
committerFelix Fietkau <nbd@nbd.name>
Wed, 20 Nov 2019 12:23:48 +0000 (13:23 +0100)
Introduce mt7615_queues_read routine to dump hw queue related info.
Add hw ac queues statistics in mt7615 debugfs

Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7615/debugfs.c
drivers/net/wireless/mediatek/mt76/mt7615/regs.h

index 2428a4659a1c09dcea021cdbdfa42faaabcdd4d1..1dc68d4aee57fd9b36f767bcdba4f6c6626d8409 100644 (file)
@@ -61,6 +61,63 @@ static int mt7615_read_temperature(struct seq_file *s, void *data)
        return 0;
 }
 
+static int
+mt7615_queues_acq(struct seq_file *s, void *data)
+{
+       struct mt7615_dev *dev = dev_get_drvdata(s->private);
+       int i;
+
+       for (i = 0; i < 16; i++) {
+               int j, acs = i / 4, index = i % 4;
+               u32 ctrl, val, qlen = 0;
+
+               val = mt76_rr(dev, MT_PLE_AC_QEMPTY(acs, index));
+               ctrl = BIT(31) | BIT(15) | (acs << 8);
+
+               for (j = 0; j < 32; j++) {
+                       if (val & BIT(j))
+                               continue;
+
+                       mt76_wr(dev, MT_PLE_FL_Q0_CTRL,
+                               ctrl | (j + (index << 5)));
+                       qlen += mt76_get_field(dev, MT_PLE_FL_Q3_CTRL,
+                                              GENMASK(11, 0));
+               }
+               seq_printf(s, "AC%d%d: queued=%d\n", acs, index, qlen);
+       }
+
+       return 0;
+}
+
+static int
+mt7615_queues_read(struct seq_file *s, void *data)
+{
+       struct mt7615_dev *dev = dev_get_drvdata(s->private);
+       static const struct {
+               char *queue;
+               int id;
+       } queue_map[] = {
+               { "PDMA0", MT_TXQ_BE },
+               { "MCUQ", MT_TXQ_MCU },
+               { "MCUFWQ", MT_TXQ_FWDL },
+       };
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(queue_map); i++) {
+               struct mt76_sw_queue *q = &dev->mt76.q_tx[queue_map[i].id];
+
+               if (!q->q)
+                       continue;
+
+               seq_printf(s,
+                          "%s: queued=%d head=%d tail=%d\n",
+                          queue_map[i].queue, q->q->queued, q->q->head,
+                          q->q->tail);
+       }
+
+       return 0;
+}
+
 int mt7615_init_debugfs(struct mt7615_dev *dev)
 {
        struct dentry *dir;
@@ -69,6 +126,10 @@ int mt7615_init_debugfs(struct mt7615_dev *dev)
        if (!dir)
                return -ENOMEM;
 
+       debugfs_create_devm_seqfile(dev->mt76.dev, "queues", dir,
+                                   mt7615_queues_read);
+       debugfs_create_devm_seqfile(dev->mt76.dev, "acq", dir,
+                                   mt7615_queues_acq);
        debugfs_create_file("scs", 0600, dir, dev, &fops_scs);
        debugfs_create_devm_seqfile(dev->mt76.dev, "radio", dir,
                                    mt7615_radio_read);
index 8ecefcb19354fd0040fe5da5cecca14d3c4d01a9..43676736a807c7ac3cdc3b292fc97353db0902a7 100644 (file)
 #define MT_WPDMA_ABT_CFG               MT_HIF(0x530)
 #define MT_WPDMA_ABT_CFG1              MT_HIF(0x534)
 
+#define MT_PLE_BASE                    0x8000
+#define MT_PLE(ofs)                    (MT_PLE_BASE + (ofs))
+
+#define MT_PLE_FL_Q0_CTRL              MT_PLE(0x1b0)
+#define MT_PLE_FL_Q1_CTRL              MT_PLE(0x1b4)
+#define MT_PLE_FL_Q2_CTRL              MT_PLE(0x1b8)
+#define MT_PLE_FL_Q3_CTRL              MT_PLE(0x1bc)
+
+#define MT_PLE_AC_QEMPTY(ac, n)                MT_PLE(0x300 + 0x10 * (ac) + \
+                                              ((n) << 2))
+
 #define MT_WF_PHY_BASE                 0x10000
 #define MT_WF_PHY(ofs)                 (MT_WF_PHY_BASE + (ofs))