add calibration logics for mt76x0e driver
Subsystems (2)
cover add calibration logics for mt76x0e driver
Introduce vga, temperature and phy calibration routines for mt76x0e driver. Move phy shared code in mt76x02-lib module. Moreover do not run calibration during channel switch
Lorenzo Bianconi (12):
mt76: move mt76x02_phy_set_bw in mt76x02-lib module
mt76: move mt76x02_phy_set_band in mt76x02-lib module
mt76x0: pci: rename mt76x0_phy_calibrate
mt76x0: pci: introduce mt76x0_phy_calirate routine
mt76x0: phy: update set_channel for mt76x0e devices
mt76x0: eeprom: introduce mt76x0_tssi_enabled routine
mt76x0: phy: add phy/vco temperature compensation
mt76: move rssi_gain_thresh routines in mt76x02-lib module
mt76: move mt76x02_phy_adjust_vga_gain in mt76/mt76x02_phy.c
mt76: introduce mt76x02_init_agc_gain routine
mt76x0: phy: align channel gain logic to mt76x2 one
mt76x0: phy: do not run calibration during channel switch
.../wireless/mediatek/mt76/mt76x0/eeprom.c | 2 +- .../wireless/mediatek/mt76/mt76x0/eeprom.h | 6 + .../net/wireless/mediatek/mt76/mt76x0/main.c | 22 +- .../net/wireless/mediatek/mt76/mt76x0/mcu.h | 3 + .../wireless/mediatek/mt76/mt76x0/mt76x0.h | 3 +- .../net/wireless/mediatek/mt76/mt76x0/pci.c | 1 + .../net/wireless/mediatek/mt76/mt76x0/phy.c | 238 ++++++++++-------- drivers/net/wireless/mediatek/mt76/mt76x02.h | 5 +- .../wireless/mediatek/mt76/mt76x02_eeprom.h | 21 -- .../net/wireless/mediatek/mt76/mt76x02_phy.c | 78 ++++++ .../net/wireless/mediatek/mt76/mt76x02_phy.h | 31 +++ .../wireless/mediatek/mt76/mt76x2/eeprom.c | 4 +- .../wireless/mediatek/mt76/mt76x2/eeprom.h | 21 ++ .../wireless/mediatek/mt76/mt76x2/mt76x2.h | 2 - .../wireless/mediatek/mt76/mt76x2/pci_phy.c | 72 +----- .../net/wireless/mediatek/mt76/mt76x2/phy.c | 44 ---- .../wireless/mediatek/mt76/mt76x2/usb_phy.c | 6 +- 17 files changed, 306 insertions(+), 253 deletions(-)
Signature · 1 line
2.17.2
RFC 1/12 mt76: move mt76x02_phy_set_bw in mt76x02-lib module
Move mt76x02_phy_set_bw routine in mt76x02_phy.c since it is shared between mt76x0 and mt76x2 drivers and remove duplicated code
--- .../net/wireless/mediatek/mt76/mt76x0/phy.c | 29 +------------------ .../net/wireless/mediatek/mt76/mt76x02_phy.c | 26 +++++++++++++++++ .../net/wireless/mediatek/mt76/mt76x02_phy.h | 1 + .../wireless/mediatek/mt76/mt76x2/mt76x2.h | 1 - .../wireless/mediatek/mt76/mt76x2/pci_phy.c | 2 +- .../net/wireless/mediatek/mt76/mt76x2/phy.c | 26 ----------------- .../wireless/mediatek/mt76/mt76x2/usb_phy.c | 2 +- 7 files changed, 30 insertions(+), 57 deletions(-)
drivers/net/wireless/mediatek/mt76/mt76x0/phy.c +1 -28
@@ -214,33 +214,6 @@ int mt76x0_wait_bbp_ready(struct mt76x02_dev *dev)return 0 ; } -static void -mt76x0_bbp_set_ctrlch (struct mt76x02_dev *dev,enum nl80211_chan_width width, -u8 ctrl) -{ -int core_val, agc_val; - -switch (width) { -case NL80211_CHAN_WIDTH_80 : - core_val =3 ; - agc_val =7 ; -break ; -case NL80211_CHAN_WIDTH_40 : - core_val =2 ; - agc_val =3 ; -break ; -default : - core_val =0 ; - agc_val =1 ; -break ; - } - -mt76_rmw_field (dev,MT_BBP (CORE ,1 ),MT_BBP_CORE_R1_BW , core_val); -mt76_rmw_field (dev,MT_BBP (AGC ,0 ),MT_BBP_AGC_R0_BW , agc_val); -mt76_rmw_field (dev,MT_BBP (AGC ,0 ),MT_BBP_AGC_R0_CTRL_CHAN , ctrl); -mt76_rmw_field (dev,MT_BBP (TXBE ,0 ),MT_BBP_TXBE_R0_CTRL_CHAN , ctrl); -} -static void mt76x0_vco_cal (struct mt76x02_dev *dev,u8 channel) {u8 val;
@@ -681,7 +654,7 @@ int mt76x0_phy_set_channel(struct mt76x02_dev *dev, }mt76x0_bbp_set_bw (dev, chandef->width); -mt76x0_bbp_set_ctrlch (dev, chandef->width, ch_group_index); +mt76x02_phy_set_bw (dev, chandef->width, ch_group_index);mt76x0_mac_set_ctrlch (dev, ch_group_index &1 );mt76x0_ant_select (dev);
drivers/net/wireless/mediatek/mt76/mt76x02_phy.c +26 -0
@@ -178,3 +178,29 @@ int mt76x02_phy_get_min_avg_rssi(struct mt76x02_dev *dev)return min_rssi; }EXPORT_SYMBOL_GPL (mt76x02_phy_get_min_avg_rssi); + +void mt76x02_phy_set_bw (struct mt76x02_dev *dev,int width,u8 ctrl) +{ +int core_val, agc_val; + +switch (width) { +case NL80211_CHAN_WIDTH_80 : + core_val =3 ; + agc_val =7 ; +break ; +case NL80211_CHAN_WIDTH_40 : + core_val =2 ; + agc_val =3 ; +break ; +default : + core_val =0 ; + agc_val =1 ; +break ; + } + +mt76_rmw_field (dev,MT_BBP (CORE ,1 ),MT_BBP_CORE_R1_BW , core_val); +mt76_rmw_field (dev,MT_BBP (AGC ,0 ),MT_BBP_AGC_R0_BW , agc_val); +mt76_rmw_field (dev,MT_BBP (AGC ,0 ),MT_BBP_AGC_R0_CTRL_CHAN , ctrl); +mt76_rmw_field (dev,MT_BBP (TXBE ,0 ),MT_BBP_TXBE_R0_CTRL_CHAN , ctrl); +} +EXPORT_SYMBOL_GPL (mt76x02_phy_set_bw);
drivers/net/wireless/mediatek/mt76/mt76x02_phy.h +1 -0
@@ -26,5 +26,6 @@ int mt76x02_get_max_rate_power(struct mt76_rate_power *r);void mt76x02_phy_set_rxpath (struct mt76x02_dev *dev);void mt76x02_phy_set_txdac (struct mt76x02_dev *dev);int mt76x02_phy_get_min_avg_rssi (struct mt76x02_dev *dev); +void mt76x02_phy_set_bw (struct mt76x02_dev *dev,int width,u8 ctrl);#endif /* __MT76x02_PHY_H */
drivers/net/wireless/mediatek/mt76/mt76x2/mt76x2.h +0 -1
@@ -100,7 +100,6 @@ void mt76x2_phy_set_txpower_regs(struct mt76x02_dev *dev, enum nl80211_band band);void mt76x2_configure_tx_delay (struct mt76x02_dev *dev,enum nl80211_band band,u8 bw); -void mt76x2_phy_set_bw (struct mt76x02_dev *dev,int width,u8 ctrl);void mt76x2_phy_set_band (struct mt76x02_dev *dev,int band,bool primary_upper);void mt76x2_apply_gain_adj (struct mt76x02_dev *dev);
drivers/net/wireless/mediatek/mt76/mt76x2/pci_phy.c +1 -1
@@ -338,7 +338,7 @@ int mt76x2_phy_set_channel(struct mt76x02_dev *dev,mt76x2_phy_set_txpower (dev);mt76x2_phy_set_band (dev, chan->band, ch_group_index &1 ); -mt76x2_phy_set_bw (dev, chandef->width, ch_group_index); +mt76x02_phy_set_bw (dev, chandef->width, ch_group_index); mt76_rmw(dev, MT_EXT_CCA_CFG, (MT_EXT_CCA_CFG_CCA0 |
drivers/net/wireless/mediatek/mt76/mt76x2/phy.c +0 -26
@@ -210,32 +210,6 @@ void mt76x2_configure_tx_delay(struct mt76x02_dev *dev, }EXPORT_SYMBOL_GPL (mt76x2_configure_tx_delay); -void mt76x2_phy_set_bw (struct mt76x02_dev *dev,int width,u8 ctrl) -{ -int core_val, agc_val; - -switch (width) { -case NL80211_CHAN_WIDTH_80 : - core_val =3 ; - agc_val =7 ; -break ; -case NL80211_CHAN_WIDTH_40 : - core_val =2 ; - agc_val =3 ; -break ; -default : - core_val =0 ; - agc_val =1 ; -break ; - } - -mt76_rmw_field (dev,MT_BBP (CORE ,1 ),MT_BBP_CORE_R1_BW , core_val); -mt76_rmw_field (dev,MT_BBP (AGC ,0 ),MT_BBP_AGC_R0_BW , agc_val); -mt76_rmw_field (dev,MT_BBP (AGC ,0 ),MT_BBP_AGC_R0_CTRL_CHAN , ctrl); -mt76_rmw_field (dev,MT_BBP (TXBE ,0 ),MT_BBP_TXBE_R0_CTRL_CHAN , ctrl); -} -EXPORT_SYMBOL_GPL (mt76x2_phy_set_bw); -void mt76x2_phy_set_band (struct mt76x02_dev *dev,int band,bool primary_upper) {switch (band) {
drivers/net/wireless/mediatek/mt76/mt76x2/usb_phy.c +1 -1
@@ -156,7 +156,7 @@ int mt76x2u_phy_set_channel(struct mt76x02_dev *dev,mt76x2_phy_set_txpower (dev);mt76x2_phy_set_band (dev, chan->band, ch_group_index &1 ); -mt76x2_phy_set_bw (dev, chandef->width, ch_group_index); +mt76x02_phy_set_bw (dev, chandef->width, ch_group_index); mt76_rmw(dev, MT_EXT_CCA_CFG, (MT_EXT_CCA_CFG_CCA0 |
Signature · 1 line
2.17.2
RFC 2/12 mt76: move mt76x02_phy_set_band in mt76x02-lib module
In reply to Lorenzo BianconiMove mt76x02_phy_set_band routine in mt76x02_phy.c since it is shared between mt76x0 and mt76x2 drivers and remove duplicated code
--- .../net/wireless/mediatek/mt76/mt76x0/phy.c | 16 ++-------------- .../net/wireless/mediatek/mt76/mt76x02_phy.c | 19 +++++++++++++++++++ .../net/wireless/mediatek/mt76/mt76x02_phy.h | 2 ++ .../wireless/mediatek/mt76/mt76x2/mt76x2.h | 1 - .../wireless/mediatek/mt76/mt76x2/pci_phy.c | 2 +- .../net/wireless/mediatek/mt76/mt76x2/phy.c | 18 ------------------ .../wireless/mediatek/mt76/mt76x2/usb_phy.c | 2 +- 7 files changed, 25 insertions(+), 35 deletions(-)
drivers/net/wireless/mediatek/mt76/mt76x0/phy.c +2 -14
@@ -270,13 +270,6 @@ static void mt76x0_vco_cal(struct mt76x02_dev *dev, u8 channel)msleep (2 ); } -static void -mt76x0_mac_set_ctrlch (struct mt76x02_dev *dev,bool primary_upper) -{ -mt76_rmw_field (dev,MT_TX_BAND_CFG ,MT_TX_BAND_CFG_UPPER_40M , - primary_upper); -} -static void mt76x0_phy_set_band (struct mt76x02_dev *dev,enum nl80211_band band) {
@@ -287,9 +280,6 @@ mt76x0_phy_set_band(struct mt76x02_dev *dev, enum nl80211_band band)rf_wr (dev,MT_RF (5 ,0 ),0x45 );rf_wr (dev,MT_RF (6 ,0 ),0x44 ); -mt76_set (dev,MT_TX_BAND_CFG ,MT_TX_BAND_CFG_2G ); -mt76_clear (dev,MT_TX_BAND_CFG ,MT_TX_BAND_CFG_5G ); -mt76_wr (dev,MT_TX_ALC_VGA3 ,0x00050007 );mt76_wr (dev,MT_TX0_RF_GAIN_CORR ,0x003E0002 );break ;
@@ -299,9 +289,6 @@ mt76x0_phy_set_band(struct mt76x02_dev *dev, enum nl80211_band band)rf_wr (dev,MT_RF (5 ,0 ),0x44 );rf_wr (dev,MT_RF (6 ,0 ),0x45 ); -mt76_clear (dev,MT_TX_BAND_CFG ,MT_TX_BAND_CFG_2G ); -mt76_set (dev,MT_TX_BAND_CFG ,MT_TX_BAND_CFG_5G ); -mt76_wr (dev,MT_TX_ALC_VGA3 ,0x00000005 );mt76_wr (dev,MT_TX0_RF_GAIN_CORR ,0x01010102 );break ;
@@ -655,7 +642,8 @@ int mt76x0_phy_set_channel(struct mt76x02_dev *dev,mt76x0_bbp_set_bw (dev, chandef->width);mt76x02_phy_set_bw (dev, chandef->width, ch_group_index); -mt76x0_mac_set_ctrlch (dev, ch_group_index &1 ); +mt76x02_phy_set_band (dev, chandef->chan->band, + ch_group_index &1 );mt76x0_ant_select (dev); mt76_rmw(dev, MT_EXT_CCA_CFG,
drivers/net/wireless/mediatek/mt76/mt76x02_phy.c +19 -0
@@ -204,3 +204,22 @@ void mt76x02_phy_set_bw(struct mt76x02_dev *dev, int width, u8 ctrl)mt76_rmw_field (dev,MT_BBP (TXBE ,0 ),MT_BBP_TXBE_R0_CTRL_CHAN , ctrl); }EXPORT_SYMBOL_GPL (mt76x02_phy_set_bw); + +void mt76x02_phy_set_band (struct mt76x02_dev *dev,int band, +bool primary_upper) +{ +switch (band) { +case NL80211_BAND_2GHZ : +mt76_set (dev,MT_TX_BAND_CFG ,MT_TX_BAND_CFG_2G ); +mt76_clear (dev,MT_TX_BAND_CFG ,MT_TX_BAND_CFG_5G ); +break ; +case NL80211_BAND_5GHZ : +mt76_clear (dev,MT_TX_BAND_CFG ,MT_TX_BAND_CFG_2G ); +mt76_set (dev,MT_TX_BAND_CFG ,MT_TX_BAND_CFG_5G ); +break ; + } + +mt76_rmw_field (dev,MT_TX_BAND_CFG ,MT_TX_BAND_CFG_UPPER_40M , + primary_upper); +} +EXPORT_SYMBOL_GPL (mt76x02_phy_set_band);
drivers/net/wireless/mediatek/mt76/mt76x02_phy.h +2 -0
@@ -27,5 +27,7 @@ void mt76x02_phy_set_rxpath(struct mt76x02_dev *dev);void mt76x02_phy_set_txdac (struct mt76x02_dev *dev);int mt76x02_phy_get_min_avg_rssi (struct mt76x02_dev *dev);void mt76x02_phy_set_bw (struct mt76x02_dev *dev,int width,u8 ctrl); +void mt76x02_phy_set_band (struct mt76x02_dev *dev,int band, +bool primary_upper);#endif /* __MT76x02_PHY_H */
drivers/net/wireless/mediatek/mt76/mt76x2/mt76x2.h +0 -1
@@ -100,7 +100,6 @@ void mt76x2_phy_set_txpower_regs(struct mt76x02_dev *dev, enum nl80211_band band);void mt76x2_configure_tx_delay (struct mt76x02_dev *dev,enum nl80211_band band,u8 bw); -void mt76x2_phy_set_band (struct mt76x02_dev *dev,int band,bool primary_upper);void mt76x2_apply_gain_adj (struct mt76x02_dev *dev);#endif
drivers/net/wireless/mediatek/mt76/mt76x2/pci_phy.c +1 -1
@@ -337,7 +337,7 @@ int mt76x2_phy_set_channel(struct mt76x02_dev *dev,mt76x2_configure_tx_delay (dev, band, bw);mt76x2_phy_set_txpower (dev); -mt76x2_phy_set_band (dev, chan->band, ch_group_index &1 ); +mt76x02_phy_set_band (dev, chan->band, ch_group_index &1 );mt76x02_phy_set_bw (dev, chandef->width, ch_group_index); mt76_rmw(dev, MT_EXT_CCA_CFG,
drivers/net/wireless/mediatek/mt76/mt76x2/phy.c +0 -18
@@ -210,24 +210,6 @@ void mt76x2_configure_tx_delay(struct mt76x02_dev *dev, }EXPORT_SYMBOL_GPL (mt76x2_configure_tx_delay); -void mt76x2_phy_set_band (struct mt76x02_dev *dev,int band,bool primary_upper) -{ -switch (band) { -case NL80211_BAND_2GHZ : -mt76_set (dev,MT_TX_BAND_CFG ,MT_TX_BAND_CFG_2G ); -mt76_clear (dev,MT_TX_BAND_CFG ,MT_TX_BAND_CFG_5G ); -break ; -case NL80211_BAND_5GHZ : -mt76_clear (dev,MT_TX_BAND_CFG ,MT_TX_BAND_CFG_2G ); -mt76_set (dev,MT_TX_BAND_CFG ,MT_TX_BAND_CFG_5G ); -break ; - } - -mt76_rmw_field (dev,MT_TX_BAND_CFG ,MT_TX_BAND_CFG_UPPER_40M , - primary_upper); -} -EXPORT_SYMBOL_GPL (mt76x2_phy_set_band); -void mt76x2_phy_tssi_compensate (struct mt76x02_dev *dev,bool wait) {struct ieee80211_channel *chan = dev->mt76.chandef.chan;
drivers/net/wireless/mediatek/mt76/mt76x2/usb_phy.c +1 -1
@@ -155,7 +155,7 @@ int mt76x2u_phy_set_channel(struct mt76x02_dev *dev,mt76x2_configure_tx_delay (dev, chan->band, bw);mt76x2_phy_set_txpower (dev); -mt76x2_phy_set_band (dev, chan->band, ch_group_index &1 ); +mt76x02_phy_set_band (dev, chan->band, ch_group_index &1 );mt76x02_phy_set_bw (dev, chandef->width, ch_group_index); mt76_rmw(dev, MT_EXT_CCA_CFG,
Signature · 1 line
2.17.2
RFC 3/12 mt76x0: pci: rename mt76x0_phy_calibrate
In reply to Lorenzo BianconiRename mt76x0_phy_calibrate routine in mt76x0_phy_calibration_work in order to not collide with calibration routine for mt76x0e
--- drivers/net/wireless/mediatek/mt76/mt76x0/phy.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/wireless/mediatek/mt76/mt76x0/phy.c +2 -2
@@ -787,7 +787,7 @@ static void mt76x0_dynamic_vga_tuning(struct mt76x02_dev *dev)mt76_wr (dev,MT_BBP (AGC ,8 ), val); } -static void mt76x0_phy_calibrate (struct work_struct *work) +static void mt76x0_phy_calibration_work (struct work_struct *work) { struct mt76x02_dev *dev = container_of(work, struct mt76x02_dev, cal_work.work);
@@ -854,7 +854,7 @@ static void mt76x0_rf_init(struct mt76x02_dev *dev)void mt76x0_phy_init (struct mt76x02_dev *dev) { -INIT_DELAYED_WORK (&dev->cal_work, mt76x0_phy_calibrate); +INIT_DELAYED_WORK (&dev->cal_work, mt76x0_phy_calibration_work);mt76x0_rf_init (dev);mt76x02_phy_set_rxpath (dev);
Signature · 1 line
2.17.2
RFC 4/12 mt76x0: pci: introduce mt76x0_phy_calirate routine
In reply to Lorenzo BianconiAdd mt76x0_phy_calirate routine in order to perform phy calibration for mt76x0e devices.
--- .../net/wireless/mediatek/mt76/mt76x0/mcu.h | 3 ++ .../wireless/mediatek/mt76/mt76x0/mt76x0.h | 1 + .../net/wireless/mediatek/mt76/mt76x0/pci.c | 1 + .../net/wireless/mediatek/mt76/mt76x0/phy.c | 53 +++++++++++++++++-- 4 files changed, 55 insertions(+), 3 deletions(-)
drivers/net/wireless/mediatek/mt76/mt76x0/mcu.h +3 -0
@@ -39,6 +39,9 @@ enum mcu_calibrate {MCU_CAL_TXDCOC ,MCU_CAL_RX_GROUP_DELAY ,MCU_CAL_TX_GROUP_DELAY , +MCU_CAL_VCO , +MCU_CAL_NO_SIGNAL =0xfe , + MCU_CAL_FULL = 0xff, };int mt76x0e_mcu_init (struct mt76x02_dev *dev);
drivers/net/wireless/mediatek/mt76/mt76x0/mt76x0.h +1 -0
@@ -72,6 +72,7 @@ int mt76x0_phy_set_channel(struct mt76x02_dev *dev, struct cfg80211_chan_def *chandef);void mt76x0_phy_recalibrate_after_assoc (struct mt76x02_dev *dev);void mt76x0_phy_set_txpower (struct mt76x02_dev *dev); +void mt76x0_phy_calibrate (struct mt76x02_dev *dev,bool power_on);/* MAC */ void mt76x0_mac_work (struct work_struct *work);
drivers/net/wireless/mediatek/mt76/mt76x0/pci.c +1 -0
@@ -28,6 +28,7 @@ static int mt76x0e_start(struct ieee80211_hw *hw)mutex_lock (&dev->mt76.mutex);mt76x02_mac_start (dev); +mt76x0_phy_calibrate (dev, true);ieee80211_queue_delayed_work (dev->mt76.hw, &dev->mac_work,MT_CALIBRATE_INTERVAL ); ieee80211_queue_delayed_work(dev->mt76.hw, &dev->cal_work,
drivers/net/wireless/mediatek/mt76/mt76x0/phy.c +50 -3
65 lines not on this page · raw message
Signature · 1 line
2.17.2
RFC 5/12 mt76x0: phy: update set_channel for mt76x0e devices
In reply to Lorenzo BianconiDo not run mt76x0_vco_cal and mt76x0_bbp_set_bw routines and configure MT_TX_SW_CFG0 register for pcie devices in mt76x0_phy_set_channel function.
--- .../net/wireless/mediatek/mt76/mt76x0/phy.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-)
drivers/net/wireless/mediatek/mt76/mt76x0/phy.c +13 -5
@@ -682,7 +682,16 @@ int mt76x0_phy_set_channel(struct mt76x02_dev *dev,break ; } -mt76x0_bbp_set_bw (dev, chandef->width); +if (mt76_is_usb (dev)) { +mt76x0_bbp_set_bw (dev, chandef->width); + }else { +if (chandef->width ==NL80211_CHAN_WIDTH_80 || + chandef->width ==NL80211_CHAN_WIDTH_40 ) + val =0x201 ; +else + val =0x601 ; +mt76_wr (dev,MT_TX_SW_CFG0 , val); + }mt76x02_phy_set_bw (dev, chandef->width, ch_group_index);mt76x02_phy_set_band (dev, chandef->chan->band, ch_group_index &1 );
@@ -698,7 +707,6 @@ int mt76x0_phy_set_channel(struct mt76x02_dev *dev,mt76x0_phy_set_band (dev, chandef->chan->band);mt76x0_phy_set_chan_rf_params (dev, channel, rf_bw_band); -mt76x0_read_rx_gain (dev);/* set Japan Tx filter at channel 14 */ val =mt76_rr (dev,MT_BBP (CORE ,1 ));
@@ -708,17 +716,17 @@ int mt76x0_phy_set_channel(struct mt76x02_dev *dev, val &= ~0x20 ;mt76_wr (dev,MT_BBP (CORE ,1 ), val); +mt76x0_read_rx_gain (dev);mt76x0_phy_set_chan_bbp_params (dev, rf_bw_band); -/* Vendor driver don't do it */ -/* mt76x0_phy_set_tx_power(dev, channel, rf_bw_band); */ -if (mt76_is_usb (dev)) {mt76x0_vco_cal (dev, channel);if (scan)mt76x02_mcu_calibrate (dev,MCU_CAL_RXDCOC ,1 , false); }else { +/* enable vco */ +rf_set (dev,MT_RF (0 ,4 ),BIT (7 ));mt76x0_phy_calibrate (dev, false); }
Signature · 1 line
2.17.2
RFC 6/12 mt76x0: eeprom: introduce mt76x0_tssi_enabled routine
In reply to Lorenzo BianconiAdd mt76x0_tssi_enabled in order to check if tssi compensation is enabled since mt76x0 condition differs from mt76x2 one. Moreover move back mt76x02_temp_tx_alc_enabled and mt76x02_tssi_enabled routines in mt76x2/eeprom.h since they are mt76x2 specific
--- .../wireless/mediatek/mt76/mt76x0/eeprom.c | 2 +- .../wireless/mediatek/mt76/mt76x0/eeprom.h | 6 ++++++ .../wireless/mediatek/mt76/mt76x02_eeprom.h | 21 ------------------- .../wireless/mediatek/mt76/mt76x2/eeprom.c | 4 ++-- .../wireless/mediatek/mt76/mt76x2/eeprom.h | 21 +++++++++++++++++++ .../wireless/mediatek/mt76/mt76x2/pci_phy.c | 4 ++-- .../wireless/mediatek/mt76/mt76x2/usb_phy.c | 2 +- 7 files changed, 33 insertions(+), 27 deletions(-)
drivers/net/wireless/mediatek/mt76/mt76x0/eeprom.c +1 -1
@@ -135,7 +135,7 @@ static s8 mt76x0_get_delta(struct mt76x02_dev *dev)struct cfg80211_chan_def *chandef = &dev->mt76.chandef;u8 val; -if (mt76x02_tssi_enabled (dev)) +if (mt76x0_tssi_enabled (dev))return 0 ;if (chandef->width ==NL80211_CHAN_WIDTH_80 ) {
drivers/net/wireless/mediatek/mt76/mt76x0/eeprom.h +6 -0
@@ -37,4 +37,10 @@ static inline s8 s6_to_s8(u32 val) return ret; } +static inline bool mt76x0_tssi_enabled (struct mt76x02_dev *dev) +{ +return (mt76x02_eeprom_get (dev,MT_EE_NIC_CONF_1 ) & +MT_EE_NIC_CONF_1_TX_ALC_EN ); +} +#endif
drivers/net/wireless/mediatek/mt76/mt76x02_eeprom.h +0 -21
@@ -179,27 +179,6 @@ mt76x02_eeprom_get(struct mt76x02_dev *dev,return get_unaligned_le16 (dev->mt76.eeprom.data + field); } -static inline bool -mt76x02_temp_tx_alc_enabled (struct mt76x02_dev *dev) -{ -u16 val; - - val =mt76x02_eeprom_get (dev,MT_EE_TX_POWER_EXT_PA_5G ); -if (!(val &BIT (15 ))) -return false; - -return mt76x02_eeprom_get (dev,MT_EE_NIC_CONF_1 ) & -MT_EE_NIC_CONF_1_TEMP_TX_ALC ; -} - -static inline bool -mt76x02_tssi_enabled (struct mt76x02_dev *dev) -{ -return !mt76x02_temp_tx_alc_enabled (dev) && - (mt76x02_eeprom_get (dev,MT_EE_NIC_CONF_1 ) & -MT_EE_NIC_CONF_1_TX_ALC_EN ); -} -bool mt76x02_ext_pa_enabled (struct mt76x02_dev *dev,enum nl80211_band band);int mt76x02_get_efuse_data (struct mt76x02_dev *dev,u16 base,void *buf,int len,enum mt76x02_eeprom_modes mode);
drivers/net/wireless/mediatek/mt76/mt76x2/eeprom.c +2 -2
@@ -464,7 +464,7 @@ void mt76x2_get_power_info(struct mt76x02_dev *dev, MT_EE_TX_POWER_1_START_2G); } -if (mt76x02_tssi_enabled (dev) || +if (mt76x2_tssi_enabled (dev) || !mt76x02_field_valid (t->target_power)) t->target_power = t->chain[0 ].target_power;
@@ -481,7 +481,7 @@ int mt76x2_get_temp_comp(struct mt76x02_dev *dev, struct mt76x2_temp_comp *t)memset (t,0 ,sizeof (*t)); -if (!mt76x02_temp_tx_alc_enabled (dev)) +if (!mt76x2_temp_tx_alc_enabled (dev))return -EINVAL ;if (!mt76x02_ext_pa_enabled (dev, band))
drivers/net/wireless/mediatek/mt76/mt76x2/eeprom.h +21 -0
@@ -70,4 +70,25 @@ mt76x2_has_ext_lna(struct mt76x02_dev *dev) return val & MT_EE_NIC_CONF_1_LNA_EXT_5G; } +static inline bool +mt76x2_temp_tx_alc_enabled (struct mt76x02_dev *dev) +{ +u16 val; + + val =mt76x02_eeprom_get (dev,MT_EE_TX_POWER_EXT_PA_5G ); +if (!(val &BIT (15 ))) +return false; + +return mt76x02_eeprom_get (dev,MT_EE_NIC_CONF_1 ) & +MT_EE_NIC_CONF_1_TEMP_TX_ALC ; +} + +static inline bool +mt76x2_tssi_enabled (struct mt76x02_dev *dev) +{ +return !mt76x2_temp_tx_alc_enabled (dev) && + (mt76x02_eeprom_get (dev,MT_EE_NIC_CONF_1 ) & +MT_EE_NIC_CONF_1_TX_ALC_EN ); +} +#endif
drivers/net/wireless/mediatek/mt76/mt76x2/pci_phy.c +2 -2
@@ -26,7 +26,7 @@ mt76x2_phy_tssi_init_cal(struct mt76x02_dev *dev)struct ieee80211_channel *chan = dev->mt76.chandef.chan;u32 flag =0 ; -if (!mt76x02_tssi_enabled (dev)) +if (!mt76x2_tssi_enabled (dev))return false;if (mt76x2_channel_silent (dev))
@@ -391,7 +391,7 @@ int mt76x2_phy_set_channel(struct mt76x02_dev *dev, sizeof(dev->cal.agc_gain_cur));/* init default values for temp compensation */ -if (mt76x02_tssi_enabled (dev)) { +if (mt76x2_tssi_enabled (dev)) {mt76_rmw_field (dev,MT_TX_ALC_CFG_1 ,MT_TX_ALC_CFG_1_TEMP_COMP ,0x38 ); mt76_rmw_field(dev, MT_TX_ALC_CFG_2, MT_TX_ALC_CFG_2_TEMP_COMP,
drivers/net/wireless/mediatek/mt76/mt76x2/usb_phy.c +1 -1
@@ -202,7 +202,7 @@ int mt76x2u_phy_set_channel(struct mt76x02_dev *dev,if (scan)return 0 ; -if (mt76x02_tssi_enabled (dev)) { +if (mt76x2_tssi_enabled (dev)) {/* init default values for temp compensation */ mt76_rmw_field (dev,MT_TX_ALC_CFG_1 ,MT_TX_ALC_CFG_1_TEMP_COMP ,0x38 );
Signature · 1 line
2.17.2
RFC 7/12 mt76x0: phy: add phy/vco temperature compensation
In reply to Lorenzo BianconiIntroduce phy/vco temperature calibration.
Moreover fix configuration of register 67 on bank0 during temperature reading and use mt76_poll utility routine to poll core34 register.
Furthermore temperature compensation needs to be disabled if the device supports tssi compensation.
This issue has never been hit since temperature reading is not actually used by usb code.
--- .../net/wireless/mediatek/mt76/mt76x0/phy.c | 50 +++++++++---------- drivers/net/wireless/mediatek/mt76/mt76x02.h | 3 +- 2 files changed, 26 insertions(+), 27 deletions(-)
drivers/net/wireless/mediatek/mt76/mt76x0/phy.c +24 -26
@@ -14,6 +14,9 @@* GNU General Public License for more details. */ +#include <linux/kernel.h> +#include <linux/etherdevice.h> +#include "mt76x0.h" #include "mcu.h" #include "eeprom.h"
@@ -23,8 +26,6 @@#include "initvals_phy.h" #include "../mt76x02_phy.h" -#include <linux/etherdevice.h> -static int mt76x0_rf_csr_wr (struct mt76x02_dev *dev,u32 offset,u8 value) {
@@ -781,46 +782,42 @@ void mt76x0_agc_restore(struct mt76x02_dev *dev)static void mt76x0_temp_sensor (struct mt76x02_dev *dev) { -u8 rf_b7_73, rf_b0_66, rf_b0_67; -int cycle, temp; -u32 val; -s32 sval; +u32 rf_b7_73, rf_b0_66, rf_b0_67; +s8 val; rf_b7_73 =rf_rr (dev,MT_RF (7 ,73 )); rf_b0_66 =rf_rr (dev,MT_RF (0 ,66 )); - rf_b0_67 =rf_rr (dev,MT_RF (0 ,73 )); + rf_b0_67 =rf_rr (dev,MT_RF (0 ,67 ));rf_wr (dev,MT_RF (7 ,73 ),0x02 );rf_wr (dev,MT_RF (0 ,66 ),0x23 ); -rf_wr (dev,MT_RF (0 ,73 ),0x01 ); +rf_wr (dev,MT_RF (0 ,67 ),0x01 );mt76_wr (dev,MT_BBP (CORE ,34 ),0x00080055 ); -for (cycle =0 ; cycle <2000 ; cycle++) { - val =mt76_rr (dev,MT_BBP (CORE ,34 )); -if (!(val &0x10 )) -break ; -udelay (3 ); - } - -if (cycle >=2000 ) { - val &=0x10 ; -mt76_wr (dev,MT_BBP (CORE ,34 ), val); +if (!mt76_poll (dev,MT_BBP (CORE ,34 ),BIT (4 ),0 ,2000 )) { +mt76_clear (dev,MT_BBP (CORE ,34 ),BIT (4 )); goto done; } - sval =mt76_rr (dev,MT_BBP (CORE ,35 )) &0xff ; -if (!(sval &0x80 )) - sval &=0x7f ;/* Positive */ -else - sval |=0xffffff00 ;/* Negative */ + val =mt76_rr (dev,MT_BBP (CORE ,35 )); + val = (35 * (val - dev->cal.rx.temp_offset)) /10 +25 ; - temp = (35 * (sval - dev->cal.rx.temp_offset)) /10 +25 ; +if (abs (val - dev->cal.temp_vco) >20 ) { +mt76x02_mcu_calibrate (dev,MCU_CAL_VCO , + dev->mt76.chandef.chan->hw_value, + false); + dev->cal.temp_vco = val; + } +if (abs (val - dev->cal.temp) >30 ) { +mt76x0_phy_calibrate (dev, false); + dev->cal.temp = val; + } done:rf_wr (dev,MT_RF (7 ,73 ), rf_b7_73);rf_wr (dev,MT_RF (0 ,66 ), rf_b0_66); -rf_wr (dev,MT_RF (0 ,73 ), rf_b0_67); +rf_wr (dev,MT_RF (0 ,67 ), rf_b0_67); }static void mt76x0_dynamic_vga_tuning (struct mt76x02_dev *dev)
@@ -848,7 +845,8 @@ static void mt76x0_phy_calibration_work(struct work_struct *work) cal_work.work);mt76x0_dynamic_vga_tuning (dev); -mt76x0_temp_sensor (dev); +if (!mt76x0_tssi_enabled (dev)) +mt76x0_temp_sensor (dev);ieee80211_queue_delayed_work (dev->mt76.hw, &dev->cal_work,MT_CALIBRATE_INTERVAL );
drivers/net/wireless/mediatek/mt76/mt76x02.h +2 -1
@@ -55,7 +55,8 @@ struct mt76x02_calibration {s8 agc_gain_adjust;s8 low_gain; -u8 temp; +s8 temp_vco; +s8 temp;bool init_cal_done;bool tssi_cal_done;
Signature · 1 line
2.17.2
RFC 8/12 mt76: move rssi_gain_thresh routines in mt76x02-lib module
In reply to Lorenzo BianconiMove mt76x2_get_rssi_gain_thresh and mt76x2_get_low_rssi_gain_thresh routines in mt76x02-lib module in order to be reused by mt76x0 driver for dynamic vga calibration
--- .../net/wireless/mediatek/mt76/mt76x02_phy.h | 26 ++++++++++++++++ .../wireless/mediatek/mt76/mt76x2/pci_phy.c | 30 ++----------------- 2 files changed, 28 insertions(+), 28 deletions(-)
drivers/net/wireless/mediatek/mt76/mt76x02_phy.h +26 -0
@@ -19,6 +19,32 @@#include "mt76x02_regs.h" +static inline int +mt76x02_get_rssi_gain_thresh (struct mt76x02_dev *dev) +{ +switch (dev->mt76.chandef.width) { +case NL80211_CHAN_WIDTH_80 : +return -62 ; +case NL80211_CHAN_WIDTH_40 : +return -65 ; +default : +return -68 ; + } +} + +static inline int +mt76x02_get_low_rssi_gain_thresh (struct mt76x02_dev *dev) +{ +switch (dev->mt76.chandef.width) { +case NL80211_CHAN_WIDTH_80 : +return -76 ; +case NL80211_CHAN_WIDTH_40 : +return -79 ; +default : +return -82 ; + } +} +void mt76x02_add_rate_power_offset (struct mt76_rate_power *r,int offset);void mt76x02_phy_set_txpower (struct mt76x02_dev *dev,int txp_0,int txp_2);void mt76x02_limit_rate_power (struct mt76_rate_power *r,int limit);
drivers/net/wireless/mediatek/mt76/mt76x2/pci_phy.c +2 -28
@@ -131,32 +131,6 @@ mt76x2_get_agc_gain(struct mt76x02_dev *dev, u8 *dest) dest[1 ] =mt76_get_field (dev,MT_BBP (AGC ,9 ),MT_BBP_AGC_GAIN ); } -static int -mt76x2_get_rssi_gain_thresh (struct mt76x02_dev *dev) -{ -switch (dev->mt76.chandef.width) { -case NL80211_CHAN_WIDTH_80 : -return -62 ; -case NL80211_CHAN_WIDTH_40 : -return -65 ; -default : -return -68 ; - } -} - -static int -mt76x2_get_low_rssi_gain_thresh (struct mt76x02_dev *dev) -{ -switch (dev->mt76.chandef.width) { -case NL80211_CHAN_WIDTH_80 : -return -76 ; -case NL80211_CHAN_WIDTH_40 : -return -79 ; -default : -return -82 ; - } -} -static void mt76x2_phy_set_gain_val (struct mt76x02_dev *dev) {
@@ -212,8 +186,8 @@ mt76x2_phy_update_channel_gain(struct mt76x02_dev *dev) dev->cal.avg_rssi_all =mt76x02_phy_get_min_avg_rssi (dev); - low_gain = (dev->cal.avg_rssi_all >mt76x2_get_rssi_gain_thresh (dev)) + - (dev->cal.avg_rssi_all >mt76x2_get_low_rssi_gain_thresh (dev)); + low_gain = (dev->cal.avg_rssi_all >mt76x02_get_rssi_gain_thresh (dev)) + + (dev->cal.avg_rssi_all >mt76x02_get_low_rssi_gain_thresh (dev)); gain_change = (dev->cal.low_gain &2 ) ^ (low_gain &2 ); dev->cal.low_gain = low_gain;
Signature · 1 line
2.17.2
RFC 9/12 mt76: move mt76x02_phy_adjust_vga_gain in mt76/mt76x02_phy.c
In reply to Lorenzo BianconiMove mt76x02_phy_adjust_vga_gain routine in mt76x02-lib module in order to be reused by mt76x0 driver for vga calibration
--- .../net/wireless/mediatek/mt76/mt76x02_phy.c | 21 ++++++++++++++++++ .../net/wireless/mediatek/mt76/mt76x02_phy.h | 1 + .../wireless/mediatek/mt76/mt76x2/pci_phy.c | 22 ++----------------- 3 files changed, 24 insertions(+), 20 deletions(-)
drivers/net/wireless/mediatek/mt76/mt76x02_phy.c +21 -0
@@ -223,3 +223,24 @@ void mt76x02_phy_set_band(struct mt76x02_dev *dev, int band, primary_upper); }EXPORT_SYMBOL_GPL (mt76x02_phy_set_band); + +bool mt76x02_phy_adjust_vga_gain (struct mt76x02_dev *dev) +{ +u8 limit = dev->cal.low_gain >0 ?16 :4 ; +bool ret = false; +u32 false_cca; + + false_cca =FIELD_GET (MT_RX_STAT_1_CCA_ERRORS ,mt76_rr (dev,MT_RX_STAT_1 )); + dev->cal.false_cca = false_cca; +if (false_cca >800 && dev->cal.agc_gain_adjust < limit) { + dev->cal.agc_gain_adjust +=2 ; + ret = true; + }else if ((false_cca <10 && dev->cal.agc_gain_adjust >0 ) || + (dev->cal.agc_gain_adjust >= limit && false_cca <500 )) { + dev->cal.agc_gain_adjust -=2 ; + ret = true; + } + +return ret; +} +EXPORT_SYMBOL_GPL (mt76x02_phy_adjust_vga_gain);
drivers/net/wireless/mediatek/mt76/mt76x02_phy.h +1 -0
@@ -55,5 +55,6 @@ int mt76x02_phy_get_min_avg_rssi(struct mt76x02_dev *dev);void mt76x02_phy_set_bw (struct mt76x02_dev *dev,int width,u8 ctrl);void mt76x02_phy_set_band (struct mt76x02_dev *dev,int band,bool primary_upper); +bool mt76x02_phy_adjust_vga_gain (struct mt76x02_dev *dev);#endif /* __MT76x02_PHY_H */
drivers/net/wireless/mediatek/mt76/mt76x2/pci_phy.c +2 -20
@@ -156,25 +156,6 @@ mt76x2_phy_set_gain_val(struct mt76x02_dev *dev)mt76x2_dfs_adjust_agc (dev); } -static void -mt76x2_phy_adjust_vga_gain (struct mt76x02_dev *dev) -{ -u32 false_cca; -u8 limit = dev->cal.low_gain >0 ?16 :4 ; - - false_cca =FIELD_GET (MT_RX_STAT_1_CCA_ERRORS ,mt76_rr (dev,MT_RX_STAT_1 )); - dev->cal.false_cca = false_cca; -if (false_cca >800 && dev->cal.agc_gain_adjust < limit) - dev->cal.agc_gain_adjust +=2 ; -else if ((false_cca <10 && dev->cal.agc_gain_adjust >0 ) || - (dev->cal.agc_gain_adjust >= limit && false_cca <500 )) - dev->cal.agc_gain_adjust -=2 ; -else -return ; - -mt76x2_phy_set_gain_val (dev); -} -static void mt76x2_phy_update_channel_gain (struct mt76x02_dev *dev) {
@@ -193,7 +174,8 @@ mt76x2_phy_update_channel_gain(struct mt76x02_dev *dev) dev->cal.low_gain = low_gain;if (!gain_change) { -mt76x2_phy_adjust_vga_gain (dev); +if (mt76x02_phy_adjust_vga_gain (dev)) +mt76x2_phy_set_gain_val (dev);return ; }
Signature · 1 line
2.17.2
RFC 10/12 mt76: introduce mt76x02_init_agc_gain routine
In reply to Lorenzo BianconiAdd mt76x02_init_agc_gain routine in mt76x02-lib moudule in order to be reused by mt76x0 for vga initalization
--- drivers/net/wireless/mediatek/mt76/mt76x02_phy.c | 12 ++++++++++++ drivers/net/wireless/mediatek/mt76/mt76x02_phy.h | 1 + drivers/net/wireless/mediatek/mt76/mt76x2/pci_phy.c | 12 +----------- 3 files changed, 14 insertions(+), 11 deletions(-)
drivers/net/wireless/mediatek/mt76/mt76x02_phy.c +12 -0
@@ -244,3 +244,15 @@ bool mt76x02_phy_adjust_vga_gain(struct mt76x02_dev *dev)return ret; }EXPORT_SYMBOL_GPL (mt76x02_phy_adjust_vga_gain); + +void mt76x02_init_agc_gain (struct mt76x02_dev *dev) +{ + dev->cal.agc_gain_init[0 ] =mt76_get_field (dev,MT_BBP (AGC ,8 ), +MT_BBP_AGC_GAIN ); + dev->cal.agc_gain_init[1 ] =mt76_get_field (dev,MT_BBP (AGC ,9 ), +MT_BBP_AGC_GAIN ); +memcpy (dev->cal.agc_gain_cur, dev->cal.agc_gain_init, +sizeof (dev->cal.agc_gain_cur)); + dev->cal.low_gain =-1 ; +} +EXPORT_SYMBOL_GPL (mt76x02_init_agc_gain);
drivers/net/wireless/mediatek/mt76/mt76x02_phy.h +1 -0
@@ -56,5 +56,6 @@ void mt76x02_phy_set_bw(struct mt76x02_dev *dev, int width, u8 ctrl);void mt76x02_phy_set_band (struct mt76x02_dev *dev,int band,bool primary_upper);bool mt76x02_phy_adjust_vga_gain (struct mt76x02_dev *dev); +void mt76x02_init_agc_gain (struct mt76x02_dev *dev);#endif /* __MT76x02_PHY_H */
drivers/net/wireless/mediatek/mt76/mt76x2/pci_phy.c +1 -11
@@ -124,13 +124,6 @@ void mt76x2_phy_set_antenna(struct mt76x02_dev *dev)mt76_wr (dev,MT_BBP (AGC ,0 ), val); } -static void -mt76x2_get_agc_gain (struct mt76x02_dev *dev,u8 *dest) -{ - dest[0 ] =mt76_get_field (dev,MT_BBP (AGC ,8 ),MT_BBP_AGC_GAIN ); - dest[1 ] =mt76_get_field (dev,MT_BBP (AGC ,9 ),MT_BBP_AGC_GAIN ); -} -static void mt76x2_phy_set_gain_val (struct mt76x02_dev *dev) {
@@ -340,11 +333,8 @@ int mt76x2_phy_set_channel(struct mt76x02_dev *dev,if (scan)return 0 ; - dev->cal.low_gain =-1 ;mt76x2_phy_channel_calibrate (dev, true); -mt76x2_get_agc_gain (dev, dev->cal.agc_gain_init); -memcpy (dev->cal.agc_gain_cur, dev->cal.agc_gain_init, -sizeof (dev->cal.agc_gain_cur)); +mt76x02_init_agc_gain (dev);/* init default values for temp compensation */ if (mt76x2_tssi_enabled (dev)) {
Signature · 1 line
2.17.2
RFC 11/12 mt76x0: phy: align channel gain logic to mt76x2 one
In reply to Lorenzo BianconiUpdate vga tuning algorithm to the one used in mt76x2 driver
--- .../net/wireless/mediatek/mt76/mt76x0/phy.c | 56 +++++++++++++------ 1 file changed, 39 insertions(+), 17 deletions(-)
drivers/net/wireless/mediatek/mt76/mt76x0/phy.c +39 -17
@@ -719,6 +719,7 @@ 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);if (mt76_is_usb (dev)) {mt76x0_vco_cal (dev, channel);
@@ -820,23 +821,44 @@ static void mt76x0_temp_sensor(struct mt76x02_dev *dev)rf_wr (dev,MT_RF (0 ,67 ), rf_b0_67); } -static void mt76x0_dynamic_vga_tuning (struct mt76x02_dev *dev) +static void mt76x0_phy_set_gain_val (struct mt76x02_dev *dev) { -struct cfg80211_chan_def *chandef = &dev->mt76.chandef; -u32 val, init_vga; -int avg_rssi; - - init_vga = chandef->chan->band ==NL80211_BAND_5GHZ ?0x54 :0x4E ; - avg_rssi =mt76x02_phy_get_min_avg_rssi (dev); -if (avg_rssi >-60 ) - init_vga -=0x20 ; -else if (avg_rssi >-70 ) - init_vga -=0x10 ; - - val =mt76_rr (dev,MT_BBP (AGC ,8 )); - val &=0xFFFF80FF ; - val |= init_vga <<8 ; -mt76_wr (dev,MT_BBP (AGC ,8 ), val); +u8 gain = dev->cal.agc_gain_cur[0 ] - dev->cal.agc_gain_adjust; +u32 val =0x122c <<16 |0xf2 ; + +mt76_wr (dev,MT_BBP (AGC ,8 ), + val |FIELD_PREP (MT_BBP_AGC_GAIN , gain)); +} + +static void +mt76x0_phy_update_channel_gain (struct mt76x02_dev *dev) +{ +bool gain_change; +u8 gain_delta; +int low_gain; + + dev->cal.avg_rssi_all =mt76x02_phy_get_min_avg_rssi (dev); + + low_gain = (dev->cal.avg_rssi_all >mt76x02_get_rssi_gain_thresh (dev)) + + (dev->cal.avg_rssi_all >mt76x02_get_low_rssi_gain_thresh (dev)); + + gain_change = (dev->cal.low_gain &2 ) ^ (low_gain &2 ); + dev->cal.low_gain = low_gain; + +if (!gain_change) { +if (mt76x02_phy_adjust_vga_gain (dev)) +mt76x0_phy_set_gain_val (dev); +return ; + } + + dev->cal.agc_gain_adjust = (low_gain ==2 ) ?0 :10 ; + gain_delta = (low_gain ==2 ) ?10 :0 ; + + dev->cal.agc_gain_cur[0 ] = dev->cal.agc_gain_init[0 ] - gain_delta; +mt76x0_phy_set_gain_val (dev); + +/* clear false CCA counters */ +mt76_rr (dev,MT_RX_STAT_1 ); }static void mt76x0_phy_calibration_work (struct work_struct *work)
@@ -844,7 +866,7 @@ static void mt76x0_phy_calibration_work(struct work_struct *work) struct mt76x02_dev *dev = container_of(work, struct mt76x02_dev, cal_work.work); -mt76x0_dynamic_vga_tuning (dev); +mt76x0_phy_update_channel_gain (dev);if (!mt76x0_tssi_enabled (dev))mt76x0_temp_sensor (dev);
Signature · 1 line
2.17.2
RFC 12/12 mt76x0: phy: do not run calibration during channel switch
In reply to Lorenzo BianconiDo not perform phy/vga calibration during channel switch. Moreover remove mt76x0_agc_save and mt76x0_agc_restore routines since they are no longer necessary. Furthermore run mt76_set_channel in order to check if there are pending frame during channel switch
--- .../net/wireless/mediatek/mt76/mt76x0/main.c | 22 +++++++++++++------ .../wireless/mediatek/mt76/mt76x0/mt76x0.h | 2 -- .../net/wireless/mediatek/mt76/mt76x0/phy.c | 20 +++++------------ drivers/net/wireless/mediatek/mt76/mt76x02.h | 2 -- 4 files changed, 21 insertions(+), 25 deletions(-)
drivers/net/wireless/mediatek/mt76/mt76x0/main.c +15 -7
@@ -16,6 +16,20 @@#include <linux/etherdevice.h> #include "mt76x0.h" +static int +mt76x0_set_channel (struct mt76x02_dev *dev,struct cfg80211_chan_def *chandef) +{ +int ret; + +cancel_delayed_work_sync (&dev->cal_work); + +mt76_set_channel (&dev->mt76); + ret =mt76x0_phy_set_channel (dev, chandef); +mt76_txq_schedule_all (&dev->mt76); + +return ret; +} +int mt76x0_config (struct ieee80211_hw *hw,u32 changed) {struct mt76x02_dev *dev = hw->priv;
@@ -25,7 +39,7 @@ int mt76x0_config(struct ieee80211_hw *hw, u32 changed)if (changed &IEEE80211_CONF_CHANGE_CHANNEL ) {ieee80211_stop_queues (hw); - ret =mt76x0_phy_set_channel (dev, &hw->conf.chandef); + ret =mt76x0_set_channel (dev, &hw->conf.chandef);ieee80211_wake_queues (hw); }
@@ -114,8 +128,6 @@ void mt76x0_sw_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif, {struct mt76x02_dev *dev = hw->priv; -cancel_delayed_work_sync (&dev->cal_work); -mt76x0_agc_save (dev);set_bit (MT76_SCANNING , &dev->mt76.state); }EXPORT_SYMBOL_GPL (mt76x0_sw_scan);
@@ -125,11 +137,7 @@ void mt76x0_sw_scan_complete(struct ieee80211_hw *hw, {struct mt76x02_dev *dev = hw->priv; -mt76x0_agc_restore (dev);clear_bit (MT76_SCANNING , &dev->mt76.state); - -ieee80211_queue_delayed_work (dev->mt76.hw, &dev->cal_work, -MT_CALIBRATE_INTERVAL ); }EXPORT_SYMBOL_GPL (mt76x0_sw_scan_complete);
drivers/net/wireless/mediatek/mt76/mt76x0/mt76x0.h +0 -2
@@ -66,8 +66,6 @@ int mt76x0_set_rts_threshold(struct ieee80211_hw *hw, u32 value);/* PHY */ void mt76x0_phy_init (struct mt76x02_dev *dev);int mt76x0_wait_bbp_ready (struct mt76x02_dev *dev); -void mt76x0_agc_save (struct mt76x02_dev *dev); -void mt76x0_agc_restore (struct mt76x02_dev *dev);int mt76x0_phy_set_channel (struct mt76x02_dev *dev,struct cfg80211_chan_def *chandef);void mt76x0_phy_recalibrate_after_assoc (struct mt76x02_dev *dev);
drivers/net/wireless/mediatek/mt76/mt76x0/phy.c +6 -14
@@ -721,11 +721,11 @@ int mt76x0_phy_set_channel(struct mt76x02_dev *dev,mt76x0_phy_set_chan_bbp_params (dev, rf_bw_band);mt76x02_init_agc_gain (dev); +if (scan) +return 0 ; +if (mt76_is_usb (dev)) {mt76x0_vco_cal (dev, channel); -if (scan) -mt76x02_mcu_calibrate (dev,MCU_CAL_RXDCOC ,1 , - false); }else {/* enable vco */ rf_set (dev,MT_RF (0 ,4 ),BIT (7 ));
@@ -734,6 +734,9 @@ int mt76x0_phy_set_channel(struct mt76x02_dev *dev,mt76x0_phy_set_txpower (dev); +ieee80211_queue_delayed_work (dev->mt76.hw, &dev->cal_work, +MT_CALIBRATE_INTERVAL ); +return 0 ; }
@@ -770,17 +773,6 @@ void mt76x0_phy_recalibrate_after_assoc(struct mt76x02_dev *dev)mt76x02_mcu_calibrate (dev,MCU_CAL_RXDCOC ,1 , false); } -void mt76x0_agc_save (struct mt76x02_dev *dev) -{ -/* Only one RX path */ - dev->agc_save =FIELD_GET (MT_BBP_AGC_GAIN ,mt76_rr (dev,MT_BBP (AGC ,8 ))); -} - -void mt76x0_agc_restore (struct mt76x02_dev *dev) -{ -mt76_rmw_field (dev,MT_BBP (AGC ,8 ),MT_BBP_AGC_GAIN , dev->agc_save); -} -static void mt76x0_temp_sensor (struct mt76x02_dev *dev) {u32 rf_b7_73, rf_b0_66, rf_b0_67;
drivers/net/wireless/mediatek/mt76/mt76x02.h +0 -2
@@ -102,8 +102,6 @@ struct mt76x02_dev {bool no_2ghz; -u8 agc_save; -u8 coverage_class;u8 slottime;
Signature · 1 line
2.17.2