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);
 
 
 struct mt76_channel_state {
        u64 cc_active;
        u64 cc_busy;
+       u64 cc_rx;
        u64 cc_bss_rx;
        u64 cc_tx;
 };
 
              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)
 
                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)
 {
        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)
 
        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);
 
                /* 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,
 
 #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