forked from openwrt/openwrt
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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>
- Loading branch information
Showing
1 changed file
with
142 additions
and
0 deletions.
There are no files selected for viewing
142 changes: 142 additions & 0 deletions
142
target/linux/generic/hack-5.10/720-net-phy-add-aqr-phys.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,142 @@ | ||
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) | ||
@@ -330,6 +332,49 @@ | ||
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; | ||
@@ -460,7 +505,7 @@ | ||
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); | ||
} | ||
|
||
@@ -632,6 +677,24 @@ | ||
.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, | ||
+ .ack_interrupt = aqr_ack_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, | ||
+}, | ||
+{ | ||
PHY_ID_MATCH_MODEL(PHY_ID_AQCS109), | ||
.name = "Aquantia AQCS109", | ||
.probe = aqr107_probe, | ||
@@ -657,6 +720,24 @@ | ||
.ack_interrupt = aqr_ack_interrupt, | ||
.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, | ||
+ .ack_interrupt = aqr_ack_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); | ||
@@ -667,8 +748,10 @@ | ||
{ 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) }, | ||
{ } | ||
}; | ||
|