int mt7615_dfs_init_radar_detector(struct mt7615_phy *phy)
 {
-       struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
        struct mt7615_dev *dev = phy->dev;
        bool ext_phy = phy != &dev->phy;
+       enum mt76_dfs_state dfs_state, prev_state;
        int err;
 
        if (is_mt7663(&dev->mt76))
                return 0;
 
-       if (dev->mt76.region == NL80211_DFS_UNSET) {
-               phy->dfs_state = -1;
-               if (phy->rdd_state)
-                       goto stop;
+       prev_state = phy->mt76->dfs_state;
+       dfs_state = mt76_phy_dfs_state(phy->mt76);
 
+       if (prev_state == dfs_state)
                return 0;
-       }
 
-       if (test_bit(MT76_SCANNING, &phy->mt76->state))
-               return 0;
-
-       if (phy->dfs_state == chandef->chan->dfs_state)
-               return 0;
+       if (prev_state == MT_DFS_STATE_UNKNOWN)
+               mt7615_dfs_stop_radar_detector(phy);
 
-       err = mt7615_dfs_init_radar_specs(phy);
-       if (err < 0) {
-               phy->dfs_state = -1;
+       if (dfs_state == MT_DFS_STATE_DISABLED)
                goto stop;
-       }
 
-       phy->dfs_state = chandef->chan->dfs_state;
+       if (prev_state <= MT_DFS_STATE_DISABLED) {
+               err = mt7615_dfs_init_radar_specs(phy);
+               if (err < 0)
+                       return err;
+
+               err = mt7615_dfs_start_radar_detector(phy);
+               if (err < 0)
+                       return err;
 
-       if (chandef->chan->flags & IEEE80211_CHAN_RADAR) {
-               if (chandef->chan->dfs_state != NL80211_DFS_AVAILABLE)
-                       return mt7615_dfs_start_radar_detector(phy);
+               phy->mt76->dfs_state = MT_DFS_STATE_CAC;
+       }
+
+       if (dfs_state == MT_DFS_STATE_CAC)
+               return 0;
 
-               return mt76_connac_mcu_rdd_cmd(&dev->mt76, RDD_CAC_END, ext_phy,
-                                              MT_RX_SEL0, 0);
+       err = mt76_connac_mcu_rdd_cmd(&dev->mt76, RDD_CAC_END,
+                                     ext_phy, MT_RX_SEL0, 0);
+       if (err < 0) {
+               phy->mt76->dfs_state = MT_DFS_STATE_UNKNOWN;
+               return err;
        }
 
+       phy->mt76->dfs_state = MT_DFS_STATE_ACTIVE;
+       return 0;
+
 stop:
        err = mt76_connac_mcu_rdd_cmd(&dev->mt76, RDD_NORMAL_START, ext_phy,
                                      MT_RX_SEL0, 0);
                return err;
 
        mt7615_dfs_stop_radar_detector(phy);
+       phy->mt76->dfs_state = MT_DFS_STATE_DISABLED;
+
        return 0;
 }