> 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 <[email protected]>
> ---
> 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
>