mt76x02: run calibration after scanning
authorStanislaw Gruszka <sgruszka@redhat.com>
Thu, 1 Nov 2018 15:35:01 +0000 (16:35 +0100)
committerFelix Fietkau <nbd@nbd.name>
Fri, 30 Nov 2018 11:21:43 +0000 (12:21 +0100)
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 <sgruszka@redhat.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt76x0/phy.c
drivers/net/wireless/mediatek/mt76/mt76x02.h
drivers/net/wireless/mediatek/mt76/mt76x02_phy.c
drivers/net/wireless/mediatek/mt76/mt76x02_util.c

index e9e6d33d3463bd228dd68343dc1b5d628eaad6b1..272a68884269ebbba30f9f365c0a8ef198e4a7ed 100644 (file)
@@ -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);
 
index b92293c4c322d7cf1c9dd929f092832931192cb9..a8c5fdd903b95b0649ecda01e45b80d344adfd71 100644 (file)
@@ -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;
index 0f1d7b5c9f68e31f456d497e820003621d4a72c5..977a8e7e26dfd86523f95f8515178785493927e7 100644 (file)
@@ -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);
index adfc46419b6be95076ced04b585c3661d76270a1..8a250224fcd7b514dbb142cd42b0eb8db7e3c65f 100644 (file)
@@ -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);