struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
        struct mt7615_dev *dev = mt7615_hw_dev(hw);
        struct mt76_phy *mphy = hw->priv;
+       struct mt7615_phy *phy = mphy->priv;
        struct cfg80211_chan_def *chandef = &mphy->chandef;
 
        dev->mt76.region = request->dfs_region;
        if (!(chandef->chan->flags & IEEE80211_CHAN_RADAR))
                return;
 
-       mt7615_dfs_stop_radar_detector(dev);
-       if (request->dfs_region == NL80211_DFS_UNSET)
-               mt7615_mcu_rdd_cmd(dev, RDD_CAC_END, 0, MT_RX_SEL0, 0);
-       else
-               mt7615_dfs_start_radar_detector(dev);
+       mt7615_dfs_init_radar_detector(phy);
 }
 
 int mt7615_register_device(struct mt7615_dev *dev)
                        IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454 |
                        IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK |
                        IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ;
-       dev->dfs_state = -1;
+       dev->phy.dfs_state = -1;
 
        ret = mt76_register_device(&dev->mt76, true, mt7615_rates,
                                   ARRAY_SIZE(mt7615_rates));
 
                                     MT7615_WATCHDOG_TIME);
 }
 
-int mt7615_dfs_stop_radar_detector(struct mt7615_dev *dev)
+static void mt7615_dfs_stop_radar_detector(struct mt7615_phy *phy)
 {
-       struct cfg80211_chan_def *chandef = &dev->mphy.chandef;
-       int err;
-
-       err = mt7615_mcu_rdd_cmd(dev, RDD_STOP, 0, MT_RX_SEL0, 0);
-       if (err < 0)
-               return err;
+       struct mt7615_dev *dev = phy->dev;
 
-       if (chandef->width == NL80211_CHAN_WIDTH_160 ||
-           chandef->width == NL80211_CHAN_WIDTH_80P80)
-               err = mt7615_mcu_rdd_cmd(dev, RDD_STOP, 1, MT_RX_SEL0, 0);
-       return err;
+       if (phy->rdd_state & BIT(0))
+               mt7615_mcu_rdd_cmd(dev, RDD_STOP, 0, MT_RX_SEL0, 0);
+       if (phy->rdd_state & BIT(1))
+               mt7615_mcu_rdd_cmd(dev, RDD_STOP, 1, MT_RX_SEL0, 0);
 }
 
 static int mt7615_dfs_start_rdd(struct mt7615_dev *dev, int chain)
                                  MT_RX_SEL0, 1);
 }
 
-int mt7615_dfs_start_radar_detector(struct mt7615_dev *dev)
+static int mt7615_dfs_start_radar_detector(struct mt7615_phy *phy)
 {
-       struct cfg80211_chan_def *chandef = &dev->mphy.chandef;
+       struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
+       struct mt7615_dev *dev = phy->dev;
+       bool ext_phy = phy != &dev->phy;
        int err;
 
        /* start CAC */
-       err = mt7615_mcu_rdd_cmd(dev, RDD_CAC_START, 0, MT_RX_SEL0, 0);
+       err = mt7615_mcu_rdd_cmd(dev, RDD_CAC_START, ext_phy, MT_RX_SEL0, 0);
        if (err < 0)
                return err;
 
-       /* TODO: DBDC support */
-
-       err = mt7615_dfs_start_rdd(dev, 0);
+       err = mt7615_dfs_start_rdd(dev, ext_phy);
        if (err < 0)
                return err;
 
+       phy->rdd_state |= BIT(ext_phy);
+
        if (chandef->width == NL80211_CHAN_WIDTH_160 ||
            chandef->width == NL80211_CHAN_WIDTH_80P80) {
                err = mt7615_dfs_start_rdd(dev, 1);
                if (err < 0)
                        return err;
+
+               phy->rdd_state |= BIT(1);
        }
 
        return 0;
 }
 
-int mt7615_dfs_init_radar_detector(struct mt7615_dev *dev)
+int mt7615_dfs_init_radar_detector(struct mt7615_phy *phy)
 {
-       struct cfg80211_chan_def *chandef = &dev->mphy.chandef;
+       struct cfg80211_chan_def *chandef = &phy->mt76->chandef;
+       struct mt7615_dev *dev = phy->dev;
+       bool ext_phy = phy != &dev->phy;
        int err;
 
-       if (dev->mt76.region == NL80211_DFS_UNSET)
+       if (dev->mt76.region == NL80211_DFS_UNSET) {
+               phy->dfs_state = -1;
+               if (phy->rdd_state)
+                       goto stop;
+
                return 0;
+       }
 
-       if (test_bit(MT76_SCANNING, &dev->mphy.state))
+       if (test_bit(MT76_SCANNING, &phy->mt76->state))
                return 0;
 
-       if (dev->dfs_state == chandef->chan->dfs_state)
+       if (phy->dfs_state == chandef->chan->dfs_state)
                return 0;
 
-       dev->dfs_state = chandef->chan->dfs_state;
+       phy->dfs_state = chandef->chan->dfs_state;
 
        if (chandef->chan->flags & IEEE80211_CHAN_RADAR) {
                if (chandef->chan->dfs_state != NL80211_DFS_AVAILABLE)
-                       return mt7615_dfs_start_radar_detector(dev);
+                       return mt7615_dfs_start_radar_detector(phy);
 
-               return mt7615_mcu_rdd_cmd(dev, RDD_CAC_END, 0, MT_RX_SEL0, 0);
+               return mt7615_mcu_rdd_cmd(dev, RDD_CAC_END, ext_phy,
+                                         MT_RX_SEL0, 0);
        }
 
-       err = mt7615_mcu_rdd_cmd(dev, RDD_NORMAL_START, 0, MT_RX_SEL0, 0);
+stop:
+       err = mt7615_mcu_rdd_cmd(dev, RDD_NORMAL_START, ext_phy, MT_RX_SEL0, 0);
        if (err < 0)
                return err;
 
-       return mt7615_dfs_stop_radar_detector(dev);
+       mt7615_dfs_stop_radar_detector(phy);
+       return 0;
 }
 
                ieee80211_csa_finish(vif);
 }
 
+static void
+mt7615_mcu_rx_radar_detected(struct mt7615_dev *dev, struct sk_buff *skb)
+{
+       struct mt76_phy *mphy = &dev->mt76.phy;
+       struct mt7615_mcu_rdd_report *r;
+
+       r = (struct mt7615_mcu_rdd_report *)skb->data;
+
+       if (r->idx && dev->mt76.phy2)
+               mphy = dev->mt76.phy2;
+
+       ieee80211_radar_detected(mphy->hw);
+       dev->hw_pattern++;
+}
+
 static void
 mt7615_mcu_rx_ext_event(struct mt7615_dev *dev, struct sk_buff *skb)
 {
 
        switch (rxd->ext_eid) {
        case MCU_EXT_EVENT_RDD_REPORT:
-               ieee80211_radar_detected(dev->mt76.hw);
-               dev->hw_pattern++;
+               mt7615_mcu_rx_radar_detected(dev, skb);
                break;
        case MCU_EXT_EVENT_CSA_NOTIFY:
                ieee80211_iterate_active_interfaces_atomic(dev->mt76.hw,
 
        int false_cca_ofdm, false_cca_cck;
        s8 ofdm_sensitivity;
        s8 cck_sensitivity;
+
+       u8 rdd_state;
+       int dfs_state;
 };
 
 struct mt7615_dev {
                s16 power;
        } radar_pattern;
        u32 hw_pattern;
-       int dfs_state;
 
        u8 mac_work_count;
        bool scs_en;
 int mt7615_mcu_rdd_cmd(struct mt7615_dev *dev,
                       enum mt7615_rdd_cmd cmd, u8 index,
                       u8 rx_sel, u8 val);
-int mt7615_dfs_start_radar_detector(struct mt7615_dev *dev);
-int mt7615_dfs_stop_radar_detector(struct mt7615_dev *dev);
 int mt7615_mcu_rdd_send_pattern(struct mt7615_dev *dev);
 
 static inline bool is_mt7622(struct mt76_dev *dev)
        return mt76_chip(dev) == 0x7622;
 }
 
-static inline void mt7615_dfs_check_channel(struct mt7615_dev *dev)
-{
-       enum nl80211_chan_width width = dev->mphy.chandef.width;
-       u32 freq = dev->mphy.chandef.chan->center_freq;
-       struct ieee80211_hw *hw = mt76_hw(dev);
-
-       if (hw->conf.chandef.chan->center_freq != freq ||
-           hw->conf.chandef.width != width)
-               dev->dfs_state = -1;
-}
-
 static inline void mt7615_irq_enable(struct mt7615_dev *dev, u32 mask)
 {
        mt76_set_irq_mask(&dev->mt76, MT_INT_MASK_CSR, 0, mask);
 void mt7615_txp_skb_unmap(struct mt76_dev *dev,
                          struct mt76_txwi_cache *txwi);
 int mt76_dfs_start_rdd(struct mt7615_dev *dev, bool force);
-int mt7615_dfs_init_radar_detector(struct mt7615_dev *dev);
+int mt7615_dfs_init_radar_detector(struct mt7615_phy *phy);
 
 int mt7615_init_debugfs(struct mt7615_dev *dev);