123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- From 5f62951fba63a9f9cfff564209426bdea5fcc371 Mon Sep 17 00:00:00 2001
- From: Alex Marginean <[email protected]>
- Date: Tue, 27 Aug 2019 15:16:56 +0300
- Subject: [PATCH] drivers: net: phy: aquantia: enable AQR112 and AQR412
- Adds support for AQR112 and AQR412 which is mostly based on existing code
- with the addition of code configuring the protocol on system side.
- This allows changing the system side protocol without having to deploy a
- different firmware on the PHY.
- Signed-off-by: Alex Marginean <[email protected]>
- ---
- drivers/net/phy/aquantia/aquantia_main.c | 88 +++++++++++++++++++++++++++++++++++++++++
- 1 file changed, 88 insertions(+)
- --- a/drivers/net/phy/aquantia/aquantia_main.c
- +++ b/drivers/net/phy/aquantia/aquantia_main.c
- @@ -101,6 +101,29 @@
- #define AQR107_OP_IN_PROG_SLEEP 1000
- #define AQR107_OP_IN_PROG_TIMEOUT 100000
-
- +/* registers in MDIO_MMD_VEND1 region */
- +#define AQUANTIA_VND1_GLOBAL_SC 0x000
- +#define AQUANTIA_VND1_GLOBAL_SC_LP BIT(0xb)
- +
- +/* global start rate, the protocol associated with this speed is used by default
- + * on SI.
- + */
- +#define AQUANTIA_VND1_GSTART_RATE 0x31a
- +#define AQUANTIA_VND1_GSTART_RATE_OFF 0
- +#define AQUANTIA_VND1_GSTART_RATE_100M 1
- +#define AQUANTIA_VND1_GSTART_RATE_1G 2
- +#define AQUANTIA_VND1_GSTART_RATE_10G 3
- +#define AQUANTIA_VND1_GSTART_RATE_2_5G 4
- +#define AQUANTIA_VND1_GSTART_RATE_5G 5
- +
- +/* SYSCFG registers for 100M, 1G, 2.5G, 5G, 10G */
- +#define AQUANTIA_VND1_GSYSCFG_BASE 0x31b
- +#define AQUANTIA_VND1_GSYSCFG_100M 0
- +#define AQUANTIA_VND1_GSYSCFG_1G 1
- +#define AQUANTIA_VND1_GSYSCFG_2_5G 2
- +#define AQUANTIA_VND1_GSYSCFG_5G 3
- +#define AQUANTIA_VND1_GSYSCFG_10G 4
- +
- struct aqr107_hw_stat {
- const char *name;
- int reg;
- @@ -232,6 +255,51 @@ static int aqr_config_aneg(struct phy_de
- return genphy_c45_check_and_restart_aneg(phydev, changed);
- }
-
- +static struct {
- + u16 syscfg;
- + int cnt;
- + u16 start_rate;
- +} aquantia_syscfg[PHY_INTERFACE_MODE_MAX] = {
- + [PHY_INTERFACE_MODE_SGMII] = {0x04b, AQUANTIA_VND1_GSYSCFG_1G,
- + AQUANTIA_VND1_GSTART_RATE_1G},
- + [PHY_INTERFACE_MODE_2500BASEX] = {0x144, AQUANTIA_VND1_GSYSCFG_2_5G,
- + AQUANTIA_VND1_GSTART_RATE_2_5G},
- + [PHY_INTERFACE_MODE_XGMII] = {0x100, AQUANTIA_VND1_GSYSCFG_10G,
- + AQUANTIA_VND1_GSTART_RATE_10G},
- + [PHY_INTERFACE_MODE_USXGMII] = {0x080, AQUANTIA_VND1_GSYSCFG_10G,
- + AQUANTIA_VND1_GSTART_RATE_10G},
- +};
- +
- +/* Sets up protocol on system side before calling aqr_config_aneg */
- +static int aqr_config_aneg_set_prot(struct phy_device *phydev)
- +{
- + int if_type = phydev->interface;
- + int i;
- +
- + if (!aquantia_syscfg[if_type].cnt)
- + return 0;
- +
- + /* set PHY in low power mode so we can configure protocols */
- + phy_write_mmd(phydev, MDIO_MMD_VEND1, AQUANTIA_VND1_GLOBAL_SC,
- + AQUANTIA_VND1_GLOBAL_SC_LP);
- + mdelay(10);
- +
- + /* set the default rate to enable the SI link */
- + phy_write_mmd(phydev, MDIO_MMD_VEND1, AQUANTIA_VND1_GSTART_RATE,
- + aquantia_syscfg[if_type].start_rate);
- +
- + for (i = 0; i <= aquantia_syscfg[if_type].cnt; i++)
- + phy_write_mmd(phydev, MDIO_MMD_VEND1,
- + AQUANTIA_VND1_GSYSCFG_BASE + i,
- + aquantia_syscfg[if_type].syscfg);
- +
- + /* wake PHY back up */
- + phy_write_mmd(phydev, MDIO_MMD_VEND1, AQUANTIA_VND1_GLOBAL_SC, 0);
- + mdelay(10);
- +
- + return aqr_config_aneg(phydev);
- +}
- +
- static int aqr_config_intr(struct phy_device *phydev)
- {
- bool en = phydev->interrupts == PHY_INTERRUPT_ENABLED;
- @@ -809,7 +877,7 @@ static struct phy_driver aqr_driver[] =
- PHY_ID_MATCH_MODEL(PHY_ID_AQR112),
- .name = "Aquantia AQR112",
- .probe = aqr107_probe,
- - .config_aneg = aqr_config_aneg,
- + .config_aneg = aqr_config_aneg_set_prot,
- .config_intr = aqr_config_intr,
- .handle_interrupt = aqr_handle_interrupt,
- .get_tunable = aqr107_get_tunable,
- @@ -827,7 +895,7 @@ static struct phy_driver aqr_driver[] =
- PHY_ID_MATCH_MODEL(PHY_ID_AQR412),
- .name = "Aquantia AQR412",
- .probe = aqr107_probe,
- - .config_aneg = aqr_config_aneg,
- + .config_aneg = aqr_config_aneg_set_prot,
- .config_intr = aqr_config_intr,
- .handle_interrupt = aqr_handle_interrupt,
- .get_tunable = aqr107_get_tunable,
|