From 9b97e0f2a5564c3d62337bff0f41c50862ea850f Mon Sep 17 00:00:00 2001 From: Stanislaw Gruszka Date: Thu, 1 Nov 2018 16:35:01 +0100 Subject: [PATCH] mt76x02: run calibration after scanning If we are associated and scanning is performed, sw_scan_complete callback is done after we get back to operating channel, so we do not perform queue cal work. Fix this queue cal work from sw_scan_complete(). On mt76x0 we have to restore gain in MT_BBP(AGC, 8) register after scanning, as it was multiple times modified by channel switch code. So queue cal work without any delay to set AGC gain value. Similar like in mt76x2 init AGC gain only when set operating channel and just check before queuing cal work in sw_scan_complete() if initialization was already done. Fixes: bbd10586f0df ("mt76x0: phy: do not run calibration during channel switch") Signed-off-by: Stanislaw Gruszka --- mt76x0/phy.c | 2 +- mt76x02.h | 1 + mt76x02_phy.c | 1 + mt76x02_util.c | 3 +++ 4 files changed, 6 insertions(+), 1 deletion(-) diff --git a/mt76x0/phy.c b/mt76x0/phy.c index e9e6d33d..272a6888 100644 --- a/mt76x0/phy.c +++ b/mt76x0/phy.c @@ -1004,13 +1004,13 @@ int mt76x0_phy_set_channel(struct mt76x02_dev *dev, mt76x0_read_rx_gain(dev); mt76x0_phy_set_chan_bbp_params(dev, rf_bw_band); - mt76x02_init_agc_gain(dev); /* enable vco */ mt76x0_rf_set(dev, MT_RF(0, 4), BIT(7)); if (scan) return 0; + mt76x02_init_agc_gain(dev); mt76x0_phy_calibrate(dev, false); mt76x0_phy_set_txpower(dev); diff --git a/mt76x02.h b/mt76x02.h index b92293c4..a8c5fdd9 100644 --- a/mt76x02.h +++ b/mt76x02.h @@ -57,6 +57,7 @@ struct mt76x02_calibration { bool tssi_comp_pending; bool dpd_cal_done; bool channel_cal_done; + bool gain_init_done; int tssi_target; s8 tssi_dc; diff --git a/mt76x02_phy.c b/mt76x02_phy.c index 0f1d7b5c..977a8e7e 100644 --- a/mt76x02_phy.c +++ b/mt76x02_phy.c @@ -254,5 +254,6 @@ void mt76x02_init_agc_gain(struct mt76x02_dev *dev) memcpy(dev->cal.agc_gain_cur, dev->cal.agc_gain_init, sizeof(dev->cal.agc_gain_cur)); dev->cal.low_gain = -1; + dev->cal.gain_init_done = true; } EXPORT_SYMBOL_GPL(mt76x02_init_agc_gain); diff --git a/mt76x02_util.c b/mt76x02_util.c index 4c344d81..e70fd2f5 100644 --- a/mt76x02_util.c +++ b/mt76x02_util.c @@ -554,6 +554,9 @@ void mt76x02_sw_scan_complete(struct ieee80211_hw *hw, clear_bit(MT76_SCANNING, &dev->mt76.state); if (mt76_is_mmio(dev)) tasklet_enable(&dev->pre_tbtt_tasklet); + + if (dev->cal.gain_init_done) + ieee80211_queue_delayed_work(hw, &dev->cal_work, 0); } EXPORT_SYMBOL_GPL(mt76x02_sw_scan_complete);