kernel: 5.15: update Aquantia PHY driver to v6.1 code
[openwrt/staging/dangole.git] / target / linux / generic / hack-5.15 / 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 @@ -23,6 +23,7 @@
13 #define PHY_ID_AQCS109 0x03a1b5c2
14 #define PHY_ID_AQR405 0x03a1b4b0
15 #define PHY_ID_AQR113C 0x31c31c12
16 +#define PHY_ID_AQR813 0x31c31cb2
17
18 #define MDIO_PHYXS_VEND_IF_STATUS 0xe812
19 #define MDIO_PHYXS_VEND_IF_STATUS_TYPE_MASK GENMASK(7, 3)
20 @@ -415,6 +416,49 @@ static int aqr107_read_rate(struct phy_d
21 return 0;
22 }
23
24 +static int aqr113c_read_status(struct phy_device *phydev)
25 +{
26 + int val, ret;
27 +
28 + ret = aqr_read_status(phydev);
29 + if (ret)
30 + return ret;
31 +
32 + if (!phydev->link || phydev->autoneg == AUTONEG_DISABLE)
33 + return 0;
34 +
35 + // On AQR113C, the speed returned by aqr_read_status is wrong
36 + aqr107_read_rate(phydev);
37 +
38 + val = phy_read_mmd(phydev, MDIO_MMD_PHYXS, MDIO_PHYXS_VEND_IF_STATUS);
39 + if (val < 0)
40 + return val;
41 +
42 + switch (FIELD_GET(MDIO_PHYXS_VEND_IF_STATUS_TYPE_MASK, val)) {
43 + case MDIO_PHYXS_VEND_IF_STATUS_TYPE_KR:
44 + phydev->interface = PHY_INTERFACE_MODE_10GKR;
45 + break;
46 + case MDIO_PHYXS_VEND_IF_STATUS_TYPE_XFI:
47 + phydev->interface = PHY_INTERFACE_MODE_10GBASER;
48 + break;
49 + case MDIO_PHYXS_VEND_IF_STATUS_TYPE_USXGMII:
50 + phydev->interface = PHY_INTERFACE_MODE_USXGMII;
51 + break;
52 + case MDIO_PHYXS_VEND_IF_STATUS_TYPE_SGMII:
53 + phydev->interface = PHY_INTERFACE_MODE_SGMII;
54 + break;
55 + case MDIO_PHYXS_VEND_IF_STATUS_TYPE_OCSGMII:
56 + phydev->interface = PHY_INTERFACE_MODE_2500BASEX;
57 + break;
58 + default:
59 + phydev->interface = PHY_INTERFACE_MODE_NA;
60 + break;
61 + }
62 +
63 + /* Read downshifted rate from vendor register */
64 + return aqr107_read_rate(phydev);
65 +}
66 +
67 static int aqr107_read_status(struct phy_device *phydev)
68 {
69 int val, ret;
70 @@ -554,7 +598,7 @@ static void aqr107_chip_info(struct phy_
71 build_id = FIELD_GET(VEND1_GLOBAL_RSVD_STAT1_FW_BUILD_ID, val);
72 prov_id = FIELD_GET(VEND1_GLOBAL_RSVD_STAT1_PROV_ID, val);
73
74 - phydev_dbg(phydev, "FW %u.%u, Build %u, Provisioning %u\n",
75 + phydev_info(phydev, "FW %u.%u, Build %u, Provisioning %u\n",
76 fw_major, fw_minor, build_id, prov_id);
77 }
78
79 @@ -811,7 +855,7 @@ static struct phy_driver aqr_driver[] =
80 .config_aneg = aqr_config_aneg,
81 .config_intr = aqr_config_intr,
82 .handle_interrupt = aqr_handle_interrupt,
83 - .read_status = aqr107_read_status,
84 + .read_status = aqr113c_read_status,
85 .get_tunable = aqr107_get_tunable,
86 .set_tunable = aqr107_set_tunable,
87 .suspend = aqr107_suspend,
88 @@ -821,6 +865,24 @@ static struct phy_driver aqr_driver[] =
89 .get_stats = aqr107_get_stats,
90 .link_change_notify = aqr107_link_change_notify,
91 },
92 +{
93 + PHY_ID_MATCH_MODEL(PHY_ID_AQR813),
94 + .name = "Aquantia AQR813",
95 + .probe = aqr107_probe,
96 + .config_init = aqr107_config_init,
97 + .config_aneg = aqr_config_aneg,
98 + .config_intr = aqr_config_intr,
99 + .handle_interrupt = aqr_handle_interrupt,
100 + .read_status = aqr113c_read_status,
101 + .get_tunable = aqr107_get_tunable,
102 + .set_tunable = aqr107_set_tunable,
103 + .suspend = aqr107_suspend,
104 + .resume = aqr107_resume,
105 + .get_sset_count = aqr107_get_sset_count,
106 + .get_strings = aqr107_get_strings,
107 + .get_stats = aqr107_get_stats,
108 + .link_change_notify = aqr107_link_change_notify,
109 +},
110 };
111
112 module_phy_driver(aqr_driver);
113 @@ -834,6 +896,7 @@ static struct mdio_device_id __maybe_unu
114 { PHY_ID_MATCH_MODEL(PHY_ID_AQCS109) },
115 { PHY_ID_MATCH_MODEL(PHY_ID_AQR405) },
116 { PHY_ID_MATCH_MODEL(PHY_ID_AQR113C) },
117 + { PHY_ID_MATCH_MODEL(PHY_ID_AQR813) },
118 { }
119 };
120