Skip to content

Commit 801ccc8

Browse files
LorenzoBianconinbd168
authored andcommitted
mt76x0: pci: add DFS support
Introduce dfs support in mt76x0e driver and unlock radar channels Signed-off-by: Lorenzo Bianconi <[email protected]> Signed-off-by: Felix Fietkau <[email protected]>
1 parent e6cb329 commit 801ccc8

File tree

7 files changed

+49
-33
lines changed

7 files changed

+49
-33
lines changed

drivers/net/wireless/mediatek/mt76/mt76x0/main.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,10 @@ mt76x0_set_channel(struct mt76x02_dev *dev, struct cfg80211_chan_def *chandef)
2222
int ret;
2323

2424
cancel_delayed_work_sync(&dev->cal_work);
25-
tasklet_disable(&dev->pre_tbtt_tasklet);
25+
if (mt76_is_mmio(dev)) {
26+
tasklet_disable(&dev->pre_tbtt_tasklet);
27+
tasklet_disable(&dev->dfs_pd.dfs_tasklet);
28+
}
2629

2730
mt76_set_channel(&dev->mt76);
2831
ret = mt76x0_phy_set_channel(dev, chandef);
@@ -31,7 +34,11 @@ mt76x0_set_channel(struct mt76x02_dev *dev, struct cfg80211_chan_def *chandef)
3134
mt76_rr(dev, MT_CH_IDLE);
3235
mt76_rr(dev, MT_CH_BUSY);
3336

34-
tasklet_enable(&dev->pre_tbtt_tasklet);
37+
if (mt76_is_mmio(dev)) {
38+
mt76x02_dfs_init_params(dev);
39+
tasklet_enable(&dev->pre_tbtt_tasklet);
40+
tasklet_enable(&dev->dfs_pd.dfs_tasklet);
41+
}
3542
mt76_txq_schedule_all(&dev->mt76);
3643

3744
return ret;

drivers/net/wireless/mediatek/mt76/mt76x0/phy.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -719,6 +719,10 @@ static void mt76x0_phy_set_gain_val(struct mt76x02_dev *dev)
719719

720720
mt76_wr(dev, MT_BBP(AGC, 8),
721721
val | FIELD_PREP(MT_BBP_AGC_GAIN, gain));
722+
723+
if ((dev->mt76.chandef.chan->flags & IEEE80211_CHAN_RADAR) &&
724+
!is_mt7630(dev))
725+
mt76x02_phy_dfs_adjust_agc(dev);
722726
}
723727

724728
static void

drivers/net/wireless/mediatek/mt76/mt76x02_dfs.c

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -802,6 +802,35 @@ static void mt76x02_dfs_set_bbp_params(struct mt76x02_dev *dev)
802802
mt76_wr(dev, 0x212c, 0x0c350001);
803803
}
804804

805+
void mt76x02_phy_dfs_adjust_agc(struct mt76x02_dev *dev)
806+
{
807+
u32 agc_r8, agc_r4, val_r8, val_r4, dfs_r31;
808+
809+
agc_r8 = mt76_rr(dev, MT_BBP(AGC, 8));
810+
agc_r4 = mt76_rr(dev, MT_BBP(AGC, 4));
811+
812+
val_r8 = (agc_r8 & 0x00007e00) >> 9;
813+
val_r4 = agc_r4 & ~0x1f000000;
814+
val_r4 += (((val_r8 + 1) >> 1) << 24);
815+
mt76_wr(dev, MT_BBP(AGC, 4), val_r4);
816+
817+
dfs_r31 = FIELD_GET(MT_BBP_AGC_LNA_HIGH_GAIN, val_r4);
818+
dfs_r31 += val_r8;
819+
dfs_r31 -= (agc_r8 & 0x00000038) >> 3;
820+
dfs_r31 = (dfs_r31 << 16) | 0x00000307;
821+
mt76_wr(dev, MT_BBP(DFS, 31), dfs_r31);
822+
823+
if (is_mt76x2(dev)) {
824+
mt76_wr(dev, MT_BBP(DFS, 32), 0x00040071);
825+
} else {
826+
/* disable hw detector */
827+
mt76_wr(dev, MT_BBP(DFS, 0), 0);
828+
/* enable hw detector */
829+
mt76_wr(dev, MT_BBP(DFS, 0), MT_DFS_CH_EN << 16);
830+
}
831+
}
832+
EXPORT_SYMBOL_GPL(mt76x02_phy_dfs_adjust_agc);
833+
805834
void mt76x02_dfs_init_params(struct mt76x02_dev *dev)
806835
{
807836
struct cfg80211_chan_def *chandef = &dev->mt76.chandef;
@@ -841,7 +870,6 @@ void mt76x02_dfs_init_detector(struct mt76x02_dev *dev)
841870
tasklet_init(&dfs_pd->dfs_tasklet, mt76x02_dfs_tasklet,
842871
(unsigned long)dev);
843872
}
844-
EXPORT_SYMBOL_GPL(mt76x02_dfs_init_detector);
845873

846874
static void
847875
mt76x02_dfs_set_domain(struct mt76x02_dev *dev,
@@ -865,4 +893,3 @@ void mt76x02_regd_notifier(struct wiphy *wiphy,
865893

866894
mt76x02_dfs_set_domain(dev, request->dfs_region);
867895
}
868-
EXPORT_SYMBOL_GPL(mt76x02_regd_notifier);

drivers/net/wireless/mediatek/mt76/mt76x02_dfs.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,4 +141,5 @@ void mt76x02_dfs_init_params(struct mt76x02_dev *dev);
141141
void mt76x02_dfs_init_detector(struct mt76x02_dev *dev);
142142
void mt76x02_regd_notifier(struct wiphy *wiphy,
143143
struct regulatory_request *request);
144+
void mt76x02_phy_dfs_adjust_agc(struct mt76x02_dev *dev);
144145
#endif /* __MT76x02_DFS_H */

drivers/net/wireless/mediatek/mt76/mt76x02_util.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,9 @@ void mt76x02_init_device(struct mt76x02_dev *dev)
9393
MT_DMA_HDR_LEN;
9494
wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION);
9595
} else {
96+
mt76x02_dfs_init_detector(dev);
97+
98+
wiphy->reg_notifier = mt76x02_regd_notifier;
9699
wiphy->iface_combinations = mt76x02_if_comb;
97100
wiphy->n_iface_combinations = ARRAY_SIZE(mt76x02_if_comb);
98101
wiphy->interface_modes =
@@ -635,6 +638,8 @@ void mt76x02_init_beacon_config(struct mt76x02_dev *dev)
635638
/* Fire a pre-TBTT interrupt 8 ms before TBTT */
636639
mt76_rmw_field(dev, MT_INT_TIMER_CFG, MT_INT_TIMER_CFG_PRE_TBTT,
637640
8 << 4);
641+
mt76_rmw_field(dev, MT_INT_TIMER_CFG, MT_INT_TIMER_CFG_GP_TIMER,
642+
MT_DFS_GP_INTERVAL);
638643
mt76_wr(dev, MT_INT_TIMER_EN, 0);
639644

640645
mt76_wr(dev, MT_BCN_BYPASS_MASK, 0xffff);

drivers/net/wireless/mediatek/mt76/mt76x2/pci_init.c

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -122,9 +122,6 @@ static int mt76x2_mac_reset(struct mt76x02_dev *dev, bool hard)
122122
mt76_wr(dev, MT_MAC_ADDR_DW0, get_unaligned_le32(macaddr));
123123
mt76_wr(dev, MT_MAC_ADDR_DW1, get_unaligned_le16(macaddr + 4));
124124

125-
mt76_rmw_field(dev, MT_INT_TIMER_CFG, MT_INT_TIMER_CFG_GP_TIMER,
126-
MT_DFS_GP_INTERVAL);
127-
128125
mt76x02_init_beacon_config(dev);
129126
if (!hard)
130127
return 0;
@@ -414,12 +411,8 @@ int mt76x2_register_device(struct mt76x02_dev *dev)
414411
wiphy->addresses = dev->macaddr_list;
415412
wiphy->n_addresses = ARRAY_SIZE(dev->macaddr_list);
416413

417-
wiphy->reg_notifier = mt76x02_regd_notifier;
418-
419414
wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_VHT_IBSS);
420415

421-
mt76x02_dfs_init_detector(dev);
422-
423416
/* init led callbacks */
424417
dev->mt76.led_cdev.brightness_set = mt76x2_led_set_brightness;
425418
dev->mt76.led_cdev.blink_set = mt76x2_led_set_blink;

drivers/net/wireless/mediatek/mt76/mt76x2/phy.c

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -251,27 +251,6 @@ void mt76x2_phy_tssi_compensate(struct mt76x02_dev *dev, bool wait)
251251
}
252252
EXPORT_SYMBOL_GPL(mt76x2_phy_tssi_compensate);
253253

254-
static void mt76x2_phy_dfs_adjust_agc(struct mt76x02_dev *dev)
255-
{
256-
u32 agc_r8, agc_r4, val_r8, val_r4, dfs_r31;
257-
258-
agc_r8 = mt76_rr(dev, MT_BBP(AGC, 8));
259-
agc_r4 = mt76_rr(dev, MT_BBP(AGC, 4));
260-
261-
val_r8 = (agc_r8 & 0x00007e00) >> 9;
262-
val_r4 = agc_r4 & ~0x1f000000;
263-
val_r4 += (((val_r8 + 1) >> 1) << 24);
264-
mt76_wr(dev, MT_BBP(AGC, 4), val_r4);
265-
266-
dfs_r31 = FIELD_GET(MT_BBP_AGC_LNA_HIGH_GAIN, val_r4);
267-
dfs_r31 += val_r8;
268-
dfs_r31 -= (agc_r8 & 0x00000038) >> 3;
269-
dfs_r31 = (dfs_r31 << 16) | 0x00000307;
270-
mt76_wr(dev, MT_BBP(DFS, 31), dfs_r31);
271-
272-
mt76_wr(dev, MT_BBP(DFS, 32), 0x00040071);
273-
}
274-
275254
static void
276255
mt76x2_phy_set_gain_val(struct mt76x02_dev *dev)
277256
{
@@ -294,7 +273,7 @@ mt76x2_phy_set_gain_val(struct mt76x02_dev *dev)
294273
val | FIELD_PREP(MT_BBP_AGC_GAIN, gain_val[1]));
295274

296275
if (dev->mt76.chandef.chan->flags & IEEE80211_CHAN_RADAR)
297-
mt76x2_phy_dfs_adjust_agc(dev);
276+
mt76x02_phy_dfs_adjust_agc(dev);
298277
}
299278

300279
void mt76x2_phy_update_channel_gain(struct mt76x02_dev *dev)

0 commit comments

Comments
 (0)