2021-11-04 20:52:43 +00:00
|
|
|
From: Birger Koblitz <git@birger-koblitz.de>
|
|
|
|
Date: Sun, 5 Sep 2021 15:13:10 +0200
|
|
|
|
Subject: [PATCH] kernel: Add AQR113C and AQR813 support
|
|
|
|
|
|
|
|
This hack adds support for the Aquantia 4th generation, 10GBit
|
|
|
|
PHYs AQR113C and AQR813.
|
|
|
|
|
|
|
|
Signed-off-by: Birger Koblitz <git@birger-koblitz.de>
|
|
|
|
|
|
|
|
--- a/drivers/net/phy/aquantia_main.c
|
|
|
|
+++ b/drivers/net/phy/aquantia_main.c
|
|
|
|
@@ -20,8 +20,10 @@
|
|
|
|
#define PHY_ID_AQR105 0x03a1b4a2
|
|
|
|
#define PHY_ID_AQR106 0x03a1b4d0
|
|
|
|
#define PHY_ID_AQR107 0x03a1b4e0
|
|
|
|
+#define PHY_ID_AQR113C 0x31c31c12
|
|
|
|
#define PHY_ID_AQCS109 0x03a1b5c2
|
|
|
|
#define PHY_ID_AQR405 0x03a1b4b0
|
|
|
|
+#define PHY_ID_AQR813 0x31c31cb2
|
|
|
|
|
|
|
|
#define MDIO_PHYXS_VEND_IF_STATUS 0xe812
|
|
|
|
#define MDIO_PHYXS_VEND_IF_STATUS_TYPE_MASK GENMASK(7, 3)
|
2022-07-04 11:41:15 +00:00
|
|
|
@@ -372,6 +374,49 @@ static int aqr107_read_rate(struct phy_d
|
2021-11-04 20:52:43 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
+static int aqr113c_read_status(struct phy_device *phydev)
|
|
|
|
+{
|
|
|
|
+ int val, ret;
|
|
|
|
+
|
|
|
|
+ ret = aqr_read_status(phydev);
|
|
|
|
+ if (ret)
|
|
|
|
+ return ret;
|
|
|
|
+
|
|
|
|
+ if (!phydev->link || phydev->autoneg == AUTONEG_DISABLE)
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
|
|
+ // On AQR113C, the speed returned by aqr_read_status is wrong
|
|
|
|
+ aqr107_read_rate(phydev);
|
|
|
|
+
|
|
|
|
+ val = phy_read_mmd(phydev, MDIO_MMD_PHYXS, MDIO_PHYXS_VEND_IF_STATUS);
|
|
|
|
+ if (val < 0)
|
|
|
|
+ return val;
|
|
|
|
+
|
|
|
|
+ switch (FIELD_GET(MDIO_PHYXS_VEND_IF_STATUS_TYPE_MASK, val)) {
|
|
|
|
+ case MDIO_PHYXS_VEND_IF_STATUS_TYPE_KR:
|
|
|
|
+ phydev->interface = PHY_INTERFACE_MODE_10GKR;
|
|
|
|
+ break;
|
|
|
|
+ case MDIO_PHYXS_VEND_IF_STATUS_TYPE_XFI:
|
|
|
|
+ phydev->interface = PHY_INTERFACE_MODE_10GBASER;
|
|
|
|
+ break;
|
|
|
|
+ case MDIO_PHYXS_VEND_IF_STATUS_TYPE_USXGMII:
|
|
|
|
+ phydev->interface = PHY_INTERFACE_MODE_USXGMII;
|
|
|
|
+ break;
|
|
|
|
+ case MDIO_PHYXS_VEND_IF_STATUS_TYPE_SGMII:
|
|
|
|
+ phydev->interface = PHY_INTERFACE_MODE_SGMII;
|
|
|
|
+ break;
|
|
|
|
+ case MDIO_PHYXS_VEND_IF_STATUS_TYPE_OCSGMII:
|
|
|
|
+ phydev->interface = PHY_INTERFACE_MODE_2500BASEX;
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ phydev->interface = PHY_INTERFACE_MODE_NA;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* Read downshifted rate from vendor register */
|
|
|
|
+ return aqr107_read_rate(phydev);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
static int aqr107_read_status(struct phy_device *phydev)
|
|
|
|
{
|
|
|
|
int val, ret;
|
2022-07-04 11:41:15 +00:00
|
|
|
@@ -502,7 +547,7 @@ static void aqr107_chip_info(struct phy_
|
2021-11-04 20:52:43 +00:00
|
|
|
build_id = FIELD_GET(VEND1_GLOBAL_RSVD_STAT1_FW_BUILD_ID, val);
|
|
|
|
prov_id = FIELD_GET(VEND1_GLOBAL_RSVD_STAT1_PROV_ID, val);
|
|
|
|
|
|
|
|
- phydev_dbg(phydev, "FW %u.%u, Build %u, Provisioning %u\n",
|
|
|
|
+ phydev_info(phydev, "FW %u.%u, Build %u, Provisioning %u\n",
|
|
|
|
fw_major, fw_minor, build_id, prov_id);
|
|
|
|
}
|
|
|
|
|
2022-07-04 11:41:15 +00:00
|
|
|
@@ -674,6 +719,24 @@ static struct phy_driver aqr_driver[] =
|
2021-11-04 20:52:43 +00:00
|
|
|
.link_change_notify = aqr107_link_change_notify,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
+ PHY_ID_MATCH_MODEL(PHY_ID_AQR113C),
|
|
|
|
+ .name = "Aquantia AQR113C",
|
|
|
|
+ .probe = aqr107_probe,
|
|
|
|
+ .config_init = aqr107_config_init,
|
|
|
|
+ .config_aneg = aqr_config_aneg,
|
|
|
|
+ .config_intr = aqr_config_intr,
|
2022-03-06 11:33:35 +00:00
|
|
|
+ .handle_interrupt = aqr_handle_interrupt,
|
2021-11-04 20:52:43 +00:00
|
|
|
+ .read_status = aqr113c_read_status,
|
|
|
|
+ .get_tunable = aqr107_get_tunable,
|
|
|
|
+ .set_tunable = aqr107_set_tunable,
|
|
|
|
+ .suspend = aqr107_suspend,
|
|
|
|
+ .resume = aqr107_resume,
|
|
|
|
+ .get_sset_count = aqr107_get_sset_count,
|
|
|
|
+ .get_strings = aqr107_get_strings,
|
|
|
|
+ .get_stats = aqr107_get_stats,
|
|
|
|
+ .link_change_notify = aqr107_link_change_notify,
|
|
|
|
+},
|
|
|
|
+{
|
|
|
|
PHY_ID_MATCH_MODEL(PHY_ID_AQCS109),
|
|
|
|
.name = "Aquantia AQCS109",
|
|
|
|
.probe = aqr107_probe,
|
2022-07-04 11:41:15 +00:00
|
|
|
@@ -699,6 +762,24 @@ static struct phy_driver aqr_driver[] =
|
2022-03-21 14:21:45 +00:00
|
|
|
.handle_interrupt = aqr_handle_interrupt,
|
2021-11-04 20:52:43 +00:00
|
|
|
.read_status = aqr_read_status,
|
|
|
|
},
|
|
|
|
+{
|
|
|
|
+ PHY_ID_MATCH_MODEL(PHY_ID_AQR813),
|
|
|
|
+ .name = "Aquantia AQR813",
|
|
|
|
+ .probe = aqr107_probe,
|
|
|
|
+ .config_init = aqr107_config_init,
|
|
|
|
+ .config_aneg = aqr_config_aneg,
|
|
|
|
+ .config_intr = aqr_config_intr,
|
2022-03-06 11:33:35 +00:00
|
|
|
+ .handle_interrupt = aqr_handle_interrupt,
|
2021-11-04 20:52:43 +00:00
|
|
|
+ .read_status = aqr113c_read_status,
|
|
|
|
+ .get_tunable = aqr107_get_tunable,
|
|
|
|
+ .set_tunable = aqr107_set_tunable,
|
|
|
|
+ .suspend = aqr107_suspend,
|
|
|
|
+ .resume = aqr107_resume,
|
|
|
|
+ .get_sset_count = aqr107_get_sset_count,
|
|
|
|
+ .get_strings = aqr107_get_strings,
|
|
|
|
+ .get_stats = aqr107_get_stats,
|
|
|
|
+ .link_change_notify = aqr107_link_change_notify,
|
|
|
|
+},
|
|
|
|
};
|
|
|
|
|
|
|
|
module_phy_driver(aqr_driver);
|
2022-07-04 11:41:15 +00:00
|
|
|
@@ -709,8 +790,10 @@ static struct mdio_device_id __maybe_unu
|
2021-11-04 20:52:43 +00:00
|
|
|
{ PHY_ID_MATCH_MODEL(PHY_ID_AQR105) },
|
|
|
|
{ PHY_ID_MATCH_MODEL(PHY_ID_AQR106) },
|
|
|
|
{ PHY_ID_MATCH_MODEL(PHY_ID_AQR107) },
|
|
|
|
+ { PHY_ID_MATCH_MODEL(PHY_ID_AQR113C) },
|
|
|
|
{ PHY_ID_MATCH_MODEL(PHY_ID_AQCS109) },
|
|
|
|
{ PHY_ID_MATCH_MODEL(PHY_ID_AQR405) },
|
|
|
|
+ { PHY_ID_MATCH_MODEL(PHY_ID_AQR813) },
|
|
|
|
{ }
|
|
|
|
};
|
|
|
|
|