mt76: mt7615: report tx_time, bss_rx and busy time to mac80211
authorLorenzo Bianconi <lorenzo@kernel.org>
Wed, 18 Sep 2019 10:58:02 +0000 (12:58 +0200)
committerFelix Fietkau <nbd@nbd.name>
Wed, 20 Nov 2019 12:23:49 +0000 (13:23 +0100)
Report tx time/rx time and obss time from hw mib counters to fill survey
info requested by mac80211

Co-developed-by: Felix Fietkau <nbd@nbd.name>
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mac80211.c
drivers/net/wireless/mediatek/mt76/mt76.h
drivers/net/wireless/mediatek/mt76/mt7615/init.c
drivers/net/wireless/mediatek/mt76/mt7615/mac.c
drivers/net/wireless/mediatek/mt76/mt7615/main.c
drivers/net/wireless/mediatek/mt76/mt7615/pci.c
drivers/net/wireless/mediatek/mt76/mt7615/regs.h

index 10d7369..24b507f 100644 (file)
@@ -505,6 +505,7 @@ int mt76_get_survey(struct ieee80211_hw *hw, int idx,
        survey->time = div_u64(state->cc_active, 1000);
        survey->time_busy = div_u64(state->cc_busy, 1000);
        survey->time_bss_rx = div_u64(state->cc_bss_rx, 1000);
+       survey->time_rx = div_u64(state->cc_rx, 1000);
        survey->time_tx = div_u64(state->cc_tx, 1000);
        spin_unlock_bh(&dev->cc_lock);
 
index 8876231..f50a122 100644 (file)
@@ -322,6 +322,7 @@ struct mt76_driver_ops {
 struct mt76_channel_state {
        u64 cc_active;
        u64 cc_busy;
+       u64 cc_rx;
        u64 cc_bss_rx;
        u64 cc_tx;
 };
index ad94a7c..05a9e11 100644 (file)
@@ -96,6 +96,8 @@ static void mt7615_mac_init(struct mt7615_dev *dev)
              FIELD_PREP(MT_DMA_RCFR0_RX_DROPPED_MCAST, 2);
        mt76_rmw(dev, MT_DMA_BN0RCFR0, mask, set);
        mt76_rmw(dev, MT_DMA_BN1RCFR0, mask, set);
+
+       mt76_set(dev, MT_WF_RMAC_MIB_TIME0, MT_WF_RMAC_MIB_RXTIME_EN);
 }
 
 static int mt7615_init_hardware(struct mt7615_dev *dev)
index 271f36f..9b11303 100644 (file)
@@ -49,6 +49,14 @@ void mt7615_mac_reset_counters(struct mt7615_dev *dev)
                mt76_rr(dev, MT_TX_AGG_CNT(i));
 
        memset(dev->mt76.aggr_stats, 0, sizeof(dev->mt76.aggr_stats));
+
+       /* TODO: add DBDC support */
+
+       /* reset airtime counters */
+       mt76_rr(dev, MT_MIB_SDR16(0));
+       mt76_rr(dev, MT_MIB_SDR36(0));
+       mt76_rr(dev, MT_MIB_SDR37(0));
+       mt76_set(dev, MT_WF_RMAC_MIB_TIME0, MT_WF_RMAC_MIB_RXTIME_CLR);
 }
 
 int mt7615_mac_fill_rx(struct mt7615_dev *dev, struct sk_buff *skb)
@@ -1263,11 +1271,25 @@ void mt7615_update_channel(struct mt76_dev *mdev)
 {
        struct mt7615_dev *dev = container_of(mdev, struct mt7615_dev, mt76);
        struct mt76_channel_state *state;
+       u64 busy_time, tx_time, rx_time, obss_time;
 
        /* TODO: add DBDC support */
+       busy_time = mt76_get_field(dev, MT_MIB_SDR16(0), MT_MIB_BUSY_MASK);
+       tx_time = mt76_get_field(dev, MT_MIB_SDR36(0),
+                                MT_MIB_SDR36_TXTIME_MASK);
+       rx_time = mt76_get_field(dev, MT_MIB_SDR37(0),
+                                MT_MIB_SDR37_RXTIME_MASK);
+       obss_time = mt76_get_field(dev, MT_WF_RMAC_MIB_TIME5,
+                                  MT_MIB_OBSSTIME_MASK);
+
        state = mdev->chan_state;
-       state->cc_busy += mt76_get_field(dev, MT_MIB_SDR16(0),
-                                        MT_MIB_BUSY_MASK);
+       state->cc_busy += busy_time;
+       state->cc_tx += tx_time;
+       state->cc_rx += rx_time + obss_time;
+       state->cc_bss_rx += rx_time;
+
+       /* reset obss airtime */
+       mt76_set(dev, MT_WF_RMAC_MIB_TIME0, MT_WF_RMAC_MIB_RXTIME_CLR);
 }
 
 void mt7615_mac_work(struct work_struct *work)
index 6949cda..a4fc58f 100644 (file)
@@ -153,8 +153,8 @@ static int mt7615_set_channel(struct mt7615_dev *dev)
        ret = mt7615_dfs_init_radar_detector(dev);
        mt7615_mac_cca_stats_reset(dev);
        dev->mt76.survey_time = ktime_get_boottime();
-       /* TODO: add DBDC support */
-       mt76_rr(dev, MT_MIB_SDR16(0));
+
+       mt7615_mac_reset_counters(dev);
 
 out:
        clear_bit(MT76_RESET, &dev->mt76.state);
index 7374456..1eb1eb6 100644 (file)
@@ -73,6 +73,9 @@ static int mt7615_pci_probe(struct pci_dev *pdev,
                /* txwi_size = txd size + txp size */
                .txwi_size = MT_TXD_SIZE + sizeof(struct mt7615_txp),
                .drv_flags = MT_DRV_TXWI_NO_FREE,
+               .survey_flags = SURVEY_INFO_TIME_TX |
+                               SURVEY_INFO_TIME_RX |
+                               SURVEY_INFO_TIME_BSS_RX,
                .tx_prepare_skb = mt7615_tx_prepare_skb,
                .tx_complete_skb = mt7615_tx_complete_skb,
                .rx_skb = mt7615_queue_rx_skb,
index 643b8bd..9a2ff1f 100644 (file)
 #define MT_WF_RFCR1_DROP_CFEND         BIT(7)
 #define MT_WF_RFCR1_DROP_CFACK         BIT(8)
 
+#define MT_WF_RMAC_MIB_TIME0           MT_WF_RMAC(0x03c4)
+#define MT_WF_RMAC_MIB_RXTIME_CLR      BIT(31)
+#define MT_WF_RMAC_MIB_RXTIME_EN       BIT(30)
+
+#define MT_WF_RMAC_MIB_TIME5           MT_WF_RMAC(0x03d8)
+#define MT_MIB_OBSSTIME_MASK           GENMASK(23, 0)
+
 #define MT_WF_DMA_BASE                 0x21800
 #define MT_WF_DMA(ofs)                 (MT_WF_DMA_BASE + (ofs))
 
 #define MT_MIB_SDR16(n)                        MT_WF_MIB(0x48 + ((n) << 9))
 #define MT_MIB_BUSY_MASK               GENMASK(23, 0)
 
+#define MT_MIB_SDR36(n)                        MT_WF_MIB(0x098 + ((n) << 9))
+#define MT_MIB_SDR36_TXTIME_MASK       GENMASK(23, 0)
+#define MT_MIB_SDR37(n)                        MT_WF_MIB(0x09c + ((n) << 9))
+#define MT_MIB_SDR37_RXTIME_MASK       GENMASK(23, 0)
+
 #define MT_TX_AGG_CNT(n)               MT_WF_MIB(0xa8 + ((n) << 2))
 
 #define MT_EFUSE_BASE                  0x81070000