mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-20 22:23:27 +00:00
6f5c301eab
Backport merged upstream patch that adds support for firmware loader from NVMEM or attached filesystem for Aquantia PHYs. Refresh all kernel patches affected by this change. Also update the path for aquantia .ko that got moved to dedicated directory upstream. Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
121 lines
3.6 KiB
Diff
121 lines
3.6 KiB
Diff
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/aquantia_main.c
|
|
+++ b/drivers/net/phy/aquantia/aquantia_main.c
|
|
@@ -23,6 +23,7 @@
|
|
#define PHY_ID_AQCS109 0x03a1b5c2
|
|
#define PHY_ID_AQR405 0x03a1b4b0
|
|
#define PHY_ID_AQR113C 0x31c31c12
|
|
+#define PHY_ID_AQR813 0x31c31cb2
|
|
|
|
#define MDIO_PHYXS_VEND_IF_STATUS 0xe812
|
|
#define MDIO_PHYXS_VEND_IF_STATUS_TYPE_MASK GENMASK(7, 3)
|
|
@@ -360,6 +361,49 @@ static int aqr107_read_rate(struct phy_d
|
|
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;
|
|
@@ -499,7 +543,7 @@ static void aqr107_chip_info(struct phy_
|
|
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);
|
|
}
|
|
|
|
@@ -760,7 +804,7 @@ static struct phy_driver aqr_driver[] =
|
|
.config_aneg = aqr_config_aneg,
|
|
.config_intr = aqr_config_intr,
|
|
.handle_interrupt = aqr_handle_interrupt,
|
|
- .read_status = aqr107_read_status,
|
|
+ .read_status = aqr113c_read_status,
|
|
.get_tunable = aqr107_get_tunable,
|
|
.set_tunable = aqr107_set_tunable,
|
|
.suspend = aqr107_suspend,
|
|
@@ -770,6 +814,24 @@ static struct phy_driver aqr_driver[] =
|
|
.get_stats = aqr107_get_stats,
|
|
.link_change_notify = aqr107_link_change_notify,
|
|
},
|
|
+{
|
|
+ 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,
|
|
+ .handle_interrupt = aqr_handle_interrupt,
|
|
+ .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);
|
|
@@ -783,6 +845,7 @@ static struct mdio_device_id __maybe_unu
|
|
{ PHY_ID_MATCH_MODEL(PHY_ID_AQCS109) },
|
|
{ PHY_ID_MATCH_MODEL(PHY_ID_AQR405) },
|
|
{ PHY_ID_MATCH_MODEL(PHY_ID_AQR113C) },
|
|
+ { PHY_ID_MATCH_MODEL(PHY_ID_AQR813) },
|
|
{ }
|
|
};
|
|
|