Search Linux Wireless

Re: [PATCH] mt76x0: antenna select corrections

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> 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@xxxxxxxxxx>
> ---
>  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
> 



[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Wireless Regulations]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux