Linux wireless drivers development
 help / color / mirror / Atom feed
From: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
To: Stanislaw Gruszka <sgruszka@redhat.com>
Cc: Felix Fietkau <nbd@nbd.name>, linux-wireless@vger.kernel.org
Subject: Re: [PATCH] mt76x0: antenna select corrections
Date: Thu, 18 Oct 2018 11:13:36 +0200	[thread overview]
Message-ID: <20181018091335.GB4938@localhost.localdomain> (raw)
In-Reply-To: <1539850059-11886-1-git-send-email-sgruszka@redhat.com>

> Update mt76x0_phy_ant_select() to conform vendor driver, most notably
> add dual antenna mode support, read configuration from EEPROM and
> move ant select out of channel config to init phase. Plus small MT7630E
> quirk for MT_CMB_CTRL register which vendor driver dedicated to this
> chip do.
> 
> This make MT7630E workable with mt76x0e driver and do not cause any
> problems on MT7610U for me.
> 
> Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
> ---
>  drivers/net/wireless/mediatek/mt76/mt76x0/phy.c    | 52 ++++++++++++++++------
>  .../net/wireless/mediatek/mt76/mt76x02_eeprom.h    | 10 ++---
>  2 files changed, 44 insertions(+), 18 deletions(-)
> 
> diff --git a/drivers/net/wireless/mediatek/mt76/mt76x0/phy.c b/drivers/net/wireless/mediatek/mt76/mt76x0/phy.c
> index 37e1ead1dc85..143cbe6d7899 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt76x0/phy.c
> +++ b/drivers/net/wireless/mediatek/mt76/mt76x0/phy.c
> @@ -431,21 +431,47 @@ int mt76x0_phy_wait_bbp_ready(struct mt76x02_dev *dev)
>  
>  static void mt76x0_phy_ant_select(struct mt76x02_dev *dev)
>  {
> -	struct ieee80211_channel *chan = dev->mt76.chandef.chan;
> -
> -	/* single antenna mode */
> -	if (chan->band == NL80211_BAND_2GHZ) {
> -		mt76_rmw(dev, MT_COEXCFG3,
> -			 BIT(5) | BIT(4) | BIT(3) | BIT(2), BIT(1));
> -		mt76_rmw(dev, MT_WLAN_FUN_CTRL, BIT(5), BIT(6));
> +	u16 ee_ant = mt76x02_eeprom_get(dev, MT_EE_ANTENNA);
> +	u16 nic_conf2 = mt76x02_eeprom_get(dev, MT_EE_NIC_CONF_2);
> +	u32 wlan, coex3, cmb;
> +	bool ant_div;
> +
> +	wlan = mt76_rr(dev, MT_WLAN_FUN_CTRL);
> +	cmb = mt76_rr(dev, MT_CMB_CTRL);
> +	coex3 = mt76_rr(dev, MT_COEXCFG3);
> +
> +	cmb   &= ~(BIT(15) | BIT(12));

I guess should be BIT(14) here (at least for single antenna mode)

> +	wlan  &= ~(BIT(6) | BIT(5));
> +	coex3 &= ~GENMASK(5, 1);

according to vendor sdk BIT(1) should not cleared if device supports 5GHz band
(signle antenna mode)

Regards,
Lorenzo

> +
> +	if (ee_ant & MT_EE_ANTENNA_DUAL) {
> +		/* dual antenna mode */
> +		ant_div = !(nic_conf2 & MT_EE_NIC_CONF_2_ANT_OPT) &&
> +			  (nic_conf2 & MT_EE_NIC_CONF_2_ANT_DIV);
> +		if (ant_div)
> +			cmb |= BIT(12);
> +		else
> +			coex3 |= BIT(4);
> +		coex3 |= BIT(3);
> +		if (dev->mt76.cap.has_2ghz)
> +			wlan |= BIT(6);
>  	} else {
> -		mt76_rmw(dev, MT_COEXCFG3, BIT(5) | BIT(2),
> -			 BIT(4) | BIT(3));
> -		mt76_clear(dev, MT_WLAN_FUN_CTRL,
> -			   BIT(6) | BIT(5));
> +		/* sigle antenna mode */
> +		if (dev->mt76.cap.has_5ghz) {
> +			coex3 |= BIT(3) | BIT(4);
> +		} else {
> +			wlan |= BIT(6);
> +			coex3 |= BIT(1);
> +		}
>  	}
> -	mt76_clear(dev, MT_CMB_CTRL, BIT(14) | BIT(12));
> +
> +	if (is_mt7630(dev))
> +		cmb |= BIT(14) | BIT(11);
> +
> +	mt76_wr(dev, MT_WLAN_FUN_CTRL, wlan);
> +	mt76_wr(dev, MT_CMB_CTRL, cmb);
>  	mt76_clear(dev, MT_COEXCFG0, BIT(2));
> +	mt76_wr(dev, MT_COEXCFG3, coex3);
>  }
>  
>  static void
> @@ -612,7 +638,6 @@ int mt76x0_phy_set_channel(struct mt76x02_dev *dev,
>  	mt76x02_phy_set_bw(dev, chandef->width, ch_group_index);
>  	mt76x02_phy_set_band(dev, chandef->chan->band,
>  			     ch_group_index & 1);
> -	mt76x0_phy_ant_select(dev);
>  
>  	mt76_rmw(dev, MT_EXT_CCA_CFG,
>  		 (MT_EXT_CCA_CFG_CCA0 |
> @@ -795,6 +820,7 @@ void mt76x0_phy_init(struct mt76x02_dev *dev)
>  {
>  	INIT_DELAYED_WORK(&dev->cal_work, mt76x0_phy_calibration_work);
>  
> +	mt76x0_phy_ant_select(dev);
>  	mt76x0_phy_rf_init(dev);
>  	mt76x02_phy_set_rxpath(dev);
>  	mt76x02_phy_set_txdac(dev);
> diff --git a/drivers/net/wireless/mediatek/mt76/mt76x02_eeprom.h b/drivers/net/wireless/mediatek/mt76/mt76x02_eeprom.h
> index b3ec74835d10..1de041590050 100644
> --- a/drivers/net/wireless/mediatek/mt76/mt76x02_eeprom.h
> +++ b/drivers/net/wireless/mediatek/mt76/mt76x02_eeprom.h
> @@ -25,6 +25,7 @@ enum mt76x02_eeprom_field {
>  	MT_EE_VERSION =				0x002,
>  	MT_EE_MAC_ADDR =			0x004,
>  	MT_EE_PCI_ID =				0x00A,
> +	MT_EE_ANTENNA =				0x022,
>  	MT_EE_NIC_CONF_0 =			0x034,
>  	MT_EE_NIC_CONF_1 =			0x036,
>  	MT_EE_COUNTRY_REGION_5GHZ =		0x038,
> @@ -104,6 +105,8 @@ enum mt76x02_eeprom_field {
>  	__MT_EE_MAX
>  };
>  
> +#define MT_EE_ANTENNA_DUAL			BIT(15)
> +
>  #define MT_EE_NIC_CONF_0_RX_PATH		GENMASK(3, 0)
>  #define MT_EE_NIC_CONF_0_TX_PATH		GENMASK(7, 4)
>  #define MT_EE_NIC_CONF_0_PA_TYPE		GENMASK(9, 8)
> @@ -118,12 +121,9 @@ enum mt76x02_eeprom_field {
>  #define MT_EE_NIC_CONF_1_LNA_EXT_5G		BIT(3)
>  #define MT_EE_NIC_CONF_1_TX_ALC_EN		BIT(13)
>  
> -#define MT_EE_NIC_CONF_2_RX_STREAM		GENMASK(3, 0)
> -#define MT_EE_NIC_CONF_2_TX_STREAM		GENMASK(7, 4)
> -#define MT_EE_NIC_CONF_2_HW_ANTDIV		BIT(8)
> +#define MT_EE_NIC_CONF_2_ANT_OPT		BIT(3)
> +#define MT_EE_NIC_CONF_2_ANT_DIV		BIT(4)
>  #define MT_EE_NIC_CONF_2_XTAL_OPTION		GENMASK(10, 9)
> -#define MT_EE_NIC_CONF_2_TEMP_DISABLE		BIT(11)
> -#define MT_EE_NIC_CONF_2_COEX_METHOD		GENMASK(15, 13)
>  
>  #define MT_EFUSE_USAGE_MAP_SIZE			(MT_EE_USAGE_MAP_END - \
>  						 MT_EE_USAGE_MAP_START + 1)
> -- 
> 1.9.3
> 

  reply	other threads:[~2018-10-18  9:13 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-10-18  8:07 [PATCH] mt76x0: antenna select corrections Stanislaw Gruszka
2018-10-18  9:13 ` Lorenzo Bianconi [this message]
2018-10-18  9:21   ` Stanislaw Gruszka
2018-10-18  9:28     ` Lorenzo Bianconi
2018-10-18  9:40       ` Stanislaw Gruszka
2018-10-18  9:45         ` Lorenzo Bianconi
2018-10-18  9:53         ` Stanislaw Gruszka
2018-10-18  9:54           ` Lorenzo Bianconi
2018-10-18 10:02           ` Lorenzo Bianconi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20181018091335.GB4938@localhost.localdomain \
    --to=lorenzo.bianconi@redhat.com \
    --cc=linux-wireless@vger.kernel.org \
    --cc=nbd@nbd.name \
    --cc=sgruszka@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox