Skip to content

Commit

Permalink
mt76: mt7615: fix/rewrite the dfs state handling logic
Browse files Browse the repository at this point in the history
Copy the updated logic from mt7915 to to fix issues in handling DFS radar
detector states

Signed-off-by: Felix Fietkau <nbd@nbd.name>
  • Loading branch information
Felix Fietkau committed Feb 3, 2022
1 parent 3f30644 commit 2c86f67
Showing 2 changed files with 30 additions and 22 deletions.
1 change: 0 additions & 1 deletion drivers/net/wireless/mediatek/mt76/mt7615/init.c
Original file line number Diff line number Diff line change
@@ -552,7 +552,6 @@ void mt7615_init_device(struct mt7615_dev *dev)
dev->pm.stats.last_wake_event = jiffies;
dev->pm.stats.last_doze_event = jiffies;
mt7615_cap_dbdc_disable(dev);
dev->phy.dfs_state = -1;

#ifdef CONFIG_NL80211_TESTMODE
dev->mt76.test_ops = &mt7615_testmode_ops;
51 changes: 30 additions & 21 deletions drivers/net/wireless/mediatek/mt76/mt7615/mac.c
Original file line number Diff line number Diff line change
@@ -2287,51 +2287,60 @@ mt7615_dfs_init_radar_specs(struct mt7615_phy *phy)

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);
if (err < 0)
return err;

mt7615_dfs_stop_radar_detector(phy);
phy->mt76->dfs_state = MT_DFS_STATE_DISABLED;

return 0;
}

0 comments on commit 2c86f67

Please sign in to comment.