e90447e0cbbad7e70604f0e05b9cb06a0c16d03a
[openwrt/staging/ldir.git] / target / linux / generic / hack-5.10 / 720-net-phy-add-aqr-phys.patch
1 From: Birger Koblitz <git@birger-koblitz.de>
2 Date: Sun, 5 Sep 2021 15:13:10 +0200
3 Subject: [PATCH] kernel: Add AQR113C and AQR813 support
4
5 This hack adds support for the Aquantia 4th generation, 10GBit
6 PHYs AQR113C and AQR813.
7
8 Signed-off-by: Birger Koblitz <git@birger-koblitz.de>
9
10 --- a/drivers/net/phy/aquantia_main.c
11 +++ b/drivers/net/phy/aquantia_main.c
12 @@ -20,8 +20,10 @@
13 #define PHY_ID_AQR105 0x03a1b4a2
14 #define PHY_ID_AQR106 0x03a1b4d0
15 #define PHY_ID_AQR107 0x03a1b4e0
16 +#define PHY_ID_AQR113C 0x31c31c12
17 #define PHY_ID_AQCS109 0x03a1b5c2
18 #define PHY_ID_AQR405 0x03a1b4b0
19 +#define PHY_ID_AQR813 0x31c31cb2
20
21 #define MDIO_PHYXS_VEND_IF_STATUS 0xe812
22 #define MDIO_PHYXS_VEND_IF_STATUS_TYPE_MASK GENMASK(7, 3)
23 @@ -352,6 +354,49 @@ static int aqr107_read_rate(struct phy_d
24 return 0;
25 }
26
27 +static int aqr113c_read_status(struct phy_device *phydev)
28 +{
29 + int val, ret;
30 +
31 + ret = aqr_read_status(phydev);
32 + if (ret)
33 + return ret;
34 +
35 + if (!phydev->link || phydev->autoneg == AUTONEG_DISABLE)
36 + return 0;
37 +
38 + // On AQR113C, the speed returned by aqr_read_status is wrong
39 + aqr107_read_rate(phydev);
40 +
41 + val = phy_read_mmd(phydev, MDIO_MMD_PHYXS, MDIO_PHYXS_VEND_IF_STATUS);
42 + if (val < 0)
43 + return val;
44 +
45 + switch (FIELD_GET(MDIO_PHYXS_VEND_IF_STATUS_TYPE_MASK, val)) {
46 + case MDIO_PHYXS_VEND_IF_STATUS_TYPE_KR:
47 + phydev->interface = PHY_INTERFACE_MODE_10GKR;
48 + break;
49 + case MDIO_PHYXS_VEND_IF_STATUS_TYPE_XFI:
50 + phydev->interface = PHY_INTERFACE_MODE_10GBASER;
51 + break;
52 + case MDIO_PHYXS_VEND_IF_STATUS_TYPE_USXGMII:
53 + phydev->interface = PHY_INTERFACE_MODE_USXGMII;
54 + break;
55 + case MDIO_PHYXS_VEND_IF_STATUS_TYPE_SGMII:
56 + phydev->interface = PHY_INTERFACE_MODE_SGMII;
57 + break;
58 + case MDIO_PHYXS_VEND_IF_STATUS_TYPE_OCSGMII:
59 + phydev->interface = PHY_INTERFACE_MODE_2500BASEX;
60 + break;
61 + default:
62 + phydev->interface = PHY_INTERFACE_MODE_NA;
63 + break;
64 + }
65 +
66 + /* Read downshifted rate from vendor register */
67 + return aqr107_read_rate(phydev);
68 +}
69 +
70 static int aqr107_read_status(struct phy_device *phydev)
71 {
72 int val, ret;
73 @@ -482,7 +527,7 @@ static void aqr107_chip_info(struct phy_
74 build_id = FIELD_GET(VEND1_GLOBAL_RSVD_STAT1_FW_BUILD_ID, val);
75 prov_id = FIELD_GET(VEND1_GLOBAL_RSVD_STAT1_PROV_ID, val);
76
77 - phydev_dbg(phydev, "FW %u.%u, Build %u, Provisioning %u\n",
78 + phydev_info(phydev, "FW %u.%u, Build %u, Provisioning %u\n",
79 fw_major, fw_minor, build_id, prov_id);
80 }
81
82 @@ -690,6 +735,24 @@ static struct phy_driver aqr_driver[] =
83 .link_change_notify = aqr107_link_change_notify,
84 },
85 {
86 + PHY_ID_MATCH_MODEL(PHY_ID_AQR113C),
87 + .name = "Aquantia AQR113C",
88 + .probe = aqr107_probe,
89 + .config_init = aqr107_config_init,
90 + .config_aneg = aqr_config_aneg,
91 + .config_intr = aqr_config_intr,
92 + .ack_interrupt = aqr_ack_interrupt,
93 + .read_status = aqr113c_read_status,
94 + .get_tunable = aqr107_get_tunable,
95 + .set_tunable = aqr107_set_tunable,
96 + .suspend = aqr107_suspend,
97 + .resume = aqr107_resume,
98 + .get_sset_count = aqr107_get_sset_count,
99 + .get_strings = aqr107_get_strings,
100 + .get_stats = aqr107_get_stats,
101 + .link_change_notify = aqr107_link_change_notify,
102 +},
103 +{
104 PHY_ID_MATCH_MODEL(PHY_ID_AQCS109),
105 .name = "Aquantia AQCS109",
106 .probe = aqr107_probe,
107 @@ -715,6 +778,24 @@ static struct phy_driver aqr_driver[] =
108 .ack_interrupt = aqr_ack_interrupt,
109 .read_status = aqr_read_status,
110 },
111 +{
112 + PHY_ID_MATCH_MODEL(PHY_ID_AQR813),
113 + .name = "Aquantia AQR813",
114 + .probe = aqr107_probe,
115 + .config_init = aqr107_config_init,
116 + .config_aneg = aqr_config_aneg,
117 + .config_intr = aqr_config_intr,
118 + .ack_interrupt = aqr_ack_interrupt,
119 + .read_status = aqr113c_read_status,
120 + .get_tunable = aqr107_get_tunable,
121 + .set_tunable = aqr107_set_tunable,
122 + .suspend = aqr107_suspend,
123 + .resume = aqr107_resume,
124 + .get_sset_count = aqr107_get_sset_count,
125 + .get_strings = aqr107_get_strings,
126 + .get_stats = aqr107_get_stats,
127 + .link_change_notify = aqr107_link_change_notify,
128 +},
129 };
130
131 module_phy_driver(aqr_driver);
132 @@ -725,8 +806,10 @@ static struct mdio_device_id __maybe_unu
133 { PHY_ID_MATCH_MODEL(PHY_ID_AQR105) },
134 { PHY_ID_MATCH_MODEL(PHY_ID_AQR106) },
135 { PHY_ID_MATCH_MODEL(PHY_ID_AQR107) },
136 + { PHY_ID_MATCH_MODEL(PHY_ID_AQR113C) },
137 { PHY_ID_MATCH_MODEL(PHY_ID_AQCS109) },
138 { PHY_ID_MATCH_MODEL(PHY_ID_AQR405) },
139 + { PHY_ID_MATCH_MODEL(PHY_ID_AQR813) },
140 { }
141 };
142