cancel_delayed_work_sync(&dev->cal_work);
        cancel_delayed_work_sync(&dev->mac_work);
        mt76u_stop_stat_wk(&dev->mt76);
+       mt76x02u_exit_beacon_config(dev);
 
        if (test_bit(MT76_REMOVED, &dev->mt76.state))
                return;
 
-       mt76_clear(dev, MT_BEACON_TIME_CFG, MT_BEACON_TIME_CFG_TIMER_EN |
-                  MT_BEACON_TIME_CFG_SYNC_MODE | MT_BEACON_TIME_CFG_TBTT_EN |
-                  MT_BEACON_TIME_CFG_BEACON_TX);
-
        if (!mt76_poll(dev, MT_USB_DMA_CFG, MT_USB_DMA_CFG_TX_BUSY, 0, 1000))
                dev_warn(dev->mt76.dev, "TX DMA did not stop\n");
 
 
        hrtimer_start(&dev->pre_tbtt_timer, time, HRTIMER_MODE_REL);
 }
 
+static void mt76x02u_stop_pre_tbtt_timer(struct mt76x02_dev *dev)
+{
+       do {
+               hrtimer_cancel(&dev->pre_tbtt_timer);
+               cancel_work_sync(&dev->pre_tbtt_work);
+               /* Timer can be rearmed by work. */
+       } while (hrtimer_active(&dev->pre_tbtt_timer));
+}
+
 static void mt76x02u_pre_tbtt_work(struct work_struct *work)
 {
        struct mt76x02_dev *dev =
 
 static void mt76x02u_pre_tbtt_enable(struct mt76x02_dev *dev, bool en)
 {
+       if (en && dev->beacon_mask && !hrtimer_active(&dev->pre_tbtt_timer))
+               mt76x02u_start_pre_tbtt_timer(dev);
+       if (!en)
+               mt76x02u_stop_pre_tbtt_timer(dev);
 }
 
 static void mt76x02u_beacon_enable(struct mt76x02_dev *dev, bool en)
 {
+       if (WARN_ON_ONCE(!dev->beacon_int))
+               return;
+
+       if (en)
+               mt76x02u_start_pre_tbtt_timer(dev);
+
+       /* Nothing to do on disable as timer is already stopped */
 }
 
 void mt76x02u_init_beacon_config(struct mt76x02_dev *dev)
        mt76x02_init_beacon_config(dev);
 }
 EXPORT_SYMBOL_GPL(mt76x02u_init_beacon_config);
+
+void mt76x02u_exit_beacon_config(struct mt76x02_dev *dev)
+{
+       if (!test_bit(MT76_REMOVED, &dev->mt76.state))
+               mt76_clear(dev, MT_BEACON_TIME_CFG,
+                          MT_BEACON_TIME_CFG_TIMER_EN |
+                          MT_BEACON_TIME_CFG_SYNC_MODE |
+                          MT_BEACON_TIME_CFG_TBTT_EN |
+                          MT_BEACON_TIME_CFG_BEACON_TX);
+
+       mt76x02u_stop_pre_tbtt_timer(dev);
+}
+EXPORT_SYMBOL_GPL(mt76x02u_exit_beacon_config);