All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2] fix temperature compensation for mt76x0
@ 2018-10-10  9:14 Lorenzo Bianconi
  2018-10-10  9:14 ` [PATCH 1/2] mt76x0: eeprom: introduce mt76x0_tssi_enabled routine Lorenzo Bianconi
  2018-10-10  9:14 ` [PATCH 2/2] mt76x0: phy: fix mt76x0_temp_sensor routine Lorenzo Bianconi
  0 siblings, 2 replies; 5+ messages in thread
From: Lorenzo Bianconi @ 2018-10-10  9:14 UTC (permalink / raw)
  To: nbd; +Cc: sgruszka, linux-wireless

Fix register configuration during temperature measurements
for mt76x0 devices. Moreover do not run temperature compensation
if tssi is enabled

Lorenzo Bianconi (2):
  mt76x0: eeprom: introduce mt76x0_tssi_enabled routine
  mt76x0: phy: fix mt76x0_temp_sensor routine

 .../wireless/mediatek/mt76/mt76x0/eeprom.c    |  2 +-
 .../wireless/mediatek/mt76/mt76x0/eeprom.h    |  6 +++
 .../net/wireless/mediatek/mt76/mt76x0/phy.c   | 43 +++++++++----------
 .../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 +-
 8 files changed, 53 insertions(+), 50 deletions(-)

-- 
2.17.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 1/2] mt76x0: eeprom: introduce mt76x0_tssi_enabled routine
  2018-10-10  9:14 [PATCH 0/2] fix temperature compensation for mt76x0 Lorenzo Bianconi
@ 2018-10-10  9:14 ` Lorenzo Bianconi
  2018-10-10  9:14 ` [PATCH 2/2] mt76x0: phy: fix mt76x0_temp_sensor routine Lorenzo Bianconi
  1 sibling, 0 replies; 5+ messages in thread
From: Lorenzo Bianconi @ 2018-10-10  9:14 UTC (permalink / raw)
  To: nbd; +Cc: sgruszka, linux-wireless

Add 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

Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
---
 .../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(-)

diff --git a/drivers/net/wireless/mediatek/mt76/mt76x0/eeprom.c b/drivers/net/wireless/mediatek/mt76/mt76x0/eeprom.c
index 1defb072ccbf..ab4fd6e0f23a 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76x0/eeprom.c
+++ b/drivers/net/wireless/mediatek/mt76/mt76x0/eeprom.c
@@ -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) {
diff --git a/drivers/net/wireless/mediatek/mt76/mt76x0/eeprom.h b/drivers/net/wireless/mediatek/mt76/mt76x0/eeprom.h
index 40fd4e61769b..ee9ade9f3c8b 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76x0/eeprom.h
+++ b/drivers/net/wireless/mediatek/mt76/mt76x0/eeprom.h
@@ -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
diff --git a/drivers/net/wireless/mediatek/mt76/mt76x02_eeprom.h b/drivers/net/wireless/mediatek/mt76/mt76x02_eeprom.h
index 0fba43d569b5..b3ec74835d10 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76x02_eeprom.h
+++ b/drivers/net/wireless/mediatek/mt76/mt76x02_eeprom.h
@@ -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);
diff --git a/drivers/net/wireless/mediatek/mt76/mt76x2/eeprom.c b/drivers/net/wireless/mediatek/mt76/mt76x2/eeprom.c
index 5fb9532f3eed..f39b622d03f4 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76x2/eeprom.c
+++ b/drivers/net/wireless/mediatek/mt76/mt76x2/eeprom.c
@@ -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))
diff --git a/drivers/net/wireless/mediatek/mt76/mt76x2/eeprom.h b/drivers/net/wireless/mediatek/mt76/mt76x2/eeprom.h
index 13bceb6aa5e4..9e735524d367 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76x2/eeprom.h
+++ b/drivers/net/wireless/mediatek/mt76/mt76x2/eeprom.h
@@ -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
diff --git a/drivers/net/wireless/mediatek/mt76/mt76x2/pci_phy.c b/drivers/net/wireless/mediatek/mt76/mt76x2/pci_phy.c
index dbb63d4c3bad..bc8c7273ee84 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76x2/pci_phy.c
+++ b/drivers/net/wireless/mediatek/mt76/mt76x2/pci_phy.c
@@ -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,
diff --git a/drivers/net/wireless/mediatek/mt76/mt76x2/usb_phy.c b/drivers/net/wireless/mediatek/mt76/mt76x2/usb_phy.c
index 422114de695a..54156e860781 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76x2/usb_phy.c
+++ b/drivers/net/wireless/mediatek/mt76/mt76x2/usb_phy.c
@@ -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);
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH 2/2] mt76x0: phy: fix mt76x0_temp_sensor routine
  2018-10-10  9:14 [PATCH 0/2] fix temperature compensation for mt76x0 Lorenzo Bianconi
  2018-10-10  9:14 ` [PATCH 1/2] mt76x0: eeprom: introduce mt76x0_tssi_enabled routine Lorenzo Bianconi
@ 2018-10-10  9:14 ` Lorenzo Bianconi
  2018-10-10  9:56   ` Stanislaw Gruszka
  1 sibling, 1 reply; 5+ messages in thread
From: Lorenzo Bianconi @ 2018-10-10  9:14 UTC (permalink / raw)
  To: nbd; +Cc: sgruszka, linux-wireless

Fix configuration of register 67 on bank0 during temperature
reading and use mt76_poll utility routine to poll core34
register. Moreover temperature compensation need 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.

Fixes: 10de7a8b4ab9 ("mt76x0: phy files")
Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
---
 .../net/wireless/mediatek/mt76/mt76x0/phy.c   | 43 +++++++++----------
 1 file changed, 20 insertions(+), 23 deletions(-)

diff --git a/drivers/net/wireless/mediatek/mt76/mt76x0/phy.c b/drivers/net/wireless/mediatek/mt76/mt76x0/phy.c
index 29bc4e4623cd..e9254452c7f5 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76x0/phy.c
+++ b/drivers/net/wireless/mediatek/mt76/mt76x0/phy.c
@@ -763,48 +763,41 @@ 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)
+static int mt76x0_temp_sensor(struct mt76x02_dev *dev, int *temp)
 {
 	u8 rf_b7_73, rf_b0_66, rf_b0_67;
-	int cycle, temp;
-	u32 val;
-	s32 sval;
+	int val, err = 0;
 
 	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));
+		err = -ETIMEDOUT;
 		goto done;
 	}
 
-	sval = mt76_rr(dev, MT_BBP(CORE, 35)) & 0xff;
-	if (!(sval & 0x80))
-		sval &= 0x7f; /* Positive */
+	val = mt76_rr(dev, MT_BBP(CORE, 35)) & 0xff;
+	if (!(val & BIT(7)))
+		val &= 0x7f; /* Positive */
 	else
-		sval |= 0xffffff00; /* Negative */
+		val |= 0xffffff00; /* Negative */
 
-	temp = (35 * (sval - dev->cal.rx.temp_offset)) / 10 + 25;
+	*temp = (35 * (val - dev->cal.rx.temp_offset)) / 10 + 25;
 
 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);
+
+	return err;
 }
 
 static void mt76x0_dynamic_vga_tuning(struct mt76x02_dev *dev)
@@ -832,7 +825,11 @@ static void mt76x0_phy_calibrate(struct work_struct *work)
 					       cal_work.work);
 
 	mt76x0_dynamic_vga_tuning(dev);
-	mt76x0_temp_sensor(dev);
+	if (!mt76x0_tssi_enabled(dev)) {
+		int temp;
+
+		mt76x0_temp_sensor(dev, &temp);
+	}
 
 	ieee80211_queue_delayed_work(dev->mt76.hw, &dev->cal_work,
 				     MT_CALIBRATE_INTERVAL);
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH 2/2] mt76x0: phy: fix mt76x0_temp_sensor routine
  2018-10-10  9:14 ` [PATCH 2/2] mt76x0: phy: fix mt76x0_temp_sensor routine Lorenzo Bianconi
@ 2018-10-10  9:56   ` Stanislaw Gruszka
  2018-10-10 10:09     ` Lorenzo Bianconi
  0 siblings, 1 reply; 5+ messages in thread
From: Stanislaw Gruszka @ 2018-10-10  9:56 UTC (permalink / raw)
  To: Lorenzo Bianconi; +Cc: nbd, linux-wireless

On Wed, Oct 10, 2018 at 11:14:22AM +0200, Lorenzo Bianconi wrote:
> Fix configuration of register 67 on bank0 during temperature
> reading and use mt76_poll utility routine to poll core34
> register. Moreover temperature compensation need 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.
> 
> Fixes: 10de7a8b4ab9 ("mt76x0: phy files")
> Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
> ---
>  .../net/wireless/mediatek/mt76/mt76x0/phy.c   | 43 +++++++++----------
>  1 file changed, 20 insertions(+), 23 deletions(-)
> 
> diff --git a/drivers/net/wireless/mediatek/mt76/mt76x0/phy.c b/drivers/net/wireless/mediatek/mt76/mt76x0/phy.c
> index 29bc4e4623cd..e9254452c7f5 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt76x0/phy.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt76x0/phy.c
> @@ -763,48 +763,41 @@ 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)
> +static int mt76x0_temp_sensor(struct mt76x02_dev *dev, int *temp)
<snip>

>  static void mt76x0_dynamic_vga_tuning(struct mt76x02_dev *dev)
> @@ -832,7 +825,11 @@ static void mt76x0_phy_calibrate(struct work_struct *work)
>  					       cal_work.work);
>  
>  	mt76x0_dynamic_vga_tuning(dev);
> -	mt76x0_temp_sensor(dev);
> +	if (!mt76x0_tssi_enabled(dev)) {
> +		int temp;
> +
> +		mt76x0_temp_sensor(dev, &temp);

Why this &temp is needed ? Preasumble it will be used in the future,
but maybe you could at least add dev_dbg() to print it's value?

Thanks
Stanislaw

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH 2/2] mt76x0: phy: fix mt76x0_temp_sensor routine
  2018-10-10  9:56   ` Stanislaw Gruszka
@ 2018-10-10 10:09     ` Lorenzo Bianconi
  0 siblings, 0 replies; 5+ messages in thread
From: Lorenzo Bianconi @ 2018-10-10 10:09 UTC (permalink / raw)
  To: Stanislaw Gruszka; +Cc: nbd, linux-wireless

> >  static void mt76x0_dynamic_vga_tuning(struct mt76x02_dev *dev)
> > @@ -832,7 +825,11 @@ static void mt76x0_phy_calibrate(struct work_struct *work)
> >  					       cal_work.work);
> >  
> >  	mt76x0_dynamic_vga_tuning(dev);
> > -	mt76x0_temp_sensor(dev);
> > +	if (!mt76x0_tssi_enabled(dev)) {
> > +		int temp;
> > +
> > +		mt76x0_temp_sensor(dev, &temp);
> 
> Why this &temp is needed ? Preasumble it will be used in the future,
> but maybe you could at least add dev_dbg() to print it's value?

Correct. Sure I can add it in v2.
Regards,

Lorenzo

> 
> Thanks
> Stanislaw

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2018-10-10 10:09 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-10-10  9:14 [PATCH 0/2] fix temperature compensation for mt76x0 Lorenzo Bianconi
2018-10-10  9:14 ` [PATCH 1/2] mt76x0: eeprom: introduce mt76x0_tssi_enabled routine Lorenzo Bianconi
2018-10-10  9:14 ` [PATCH 2/2] mt76x0: phy: fix mt76x0_temp_sensor routine Lorenzo Bianconi
2018-10-10  9:56   ` Stanislaw Gruszka
2018-10-10 10:09     ` Lorenzo Bianconi

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.