diff mbox series

[v2,net-next,3/3] net: phy: aquantia: add support for aqr115c

Message ID 20240627113018.25083-4-brgl@bgdev.pl (mailing list archive)
State Superseded
Delegated to: Netdev Maintainers
Headers show
Series net: phy: aquantia: enable support for aqr115c | expand

Checks

Context Check Description
netdev/tree_selection success Clearly marked for net-next
netdev/apply fail Patch does not apply to net-next-1

Commit Message

Bartosz Golaszewski June 27, 2024, 11:30 a.m. UTC
From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>

Add support for a new model to the Aquantia driver. This PHY supports
Overlocked SGMII mode with 2.5G speeds.

Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
---
 drivers/net/phy/aquantia/aquantia_main.c | 39 +++++++++++++++++++++++-
 1 file changed, 38 insertions(+), 1 deletion(-)

Comments

Russell King (Oracle) June 27, 2024, 12:09 p.m. UTC | #1
On Thu, Jun 27, 2024 at 01:30:17PM +0200, Bartosz Golaszewski wrote:
> +static int aqr115c_config_init(struct phy_device *phydev)
> +{
> +	/* Check that the PHY interface type is compatible */
> +	if (phydev->interface != PHY_INTERFACE_MODE_SGMII &&
> +	    phydev->interface != PHY_INTERFACE_MODE_2500BASEX)
> +		return -ENODEV;
> +
> +	phy_set_max_speed(phydev, SPEED_2500);

Please can you explain why this is necessary? Does the PHY report that
it incorrectly supports faster speeds than 2500base-X ?

If phylib is incorrectly detecting the PHYs features, then this should
be corrected via the .get_features method, not in the .config_init
method.

(The same should be true of the other Aquantia PHYs.)

Note that phy_set_max_speed() is documented as:

 * The PHY might be more capable than the MAC. For example a Fast Ethernet
 * is connected to a 1G PHY. This function allows the MAC to indicate its
 * maximum speed, and so limit what the PHY will advertise.

Aquantia seems to be the only PHY driver that calls this function.

Thanks.
Bartosz Golaszewski June 27, 2024, 12:18 p.m. UTC | #2
On Thu, Jun 27, 2024 at 2:09 PM Russell King (Oracle)
<linux@armlinux.org.uk> wrote:
>
> On Thu, Jun 27, 2024 at 01:30:17PM +0200, Bartosz Golaszewski wrote:
> > +static int aqr115c_config_init(struct phy_device *phydev)
> > +{
> > +     /* Check that the PHY interface type is compatible */
> > +     if (phydev->interface != PHY_INTERFACE_MODE_SGMII &&
> > +         phydev->interface != PHY_INTERFACE_MODE_2500BASEX)
> > +             return -ENODEV;
> > +
> > +     phy_set_max_speed(phydev, SPEED_2500);
>
> Please can you explain why this is necessary? Does the PHY report that
> it incorrectly supports faster speeds than 2500base-X ?
>
> If phylib is incorrectly detecting the PHYs features, then this should
> be corrected via the .get_features method, not in the .config_init
> method.
>
> (The same should be true of the other Aquantia PHYs.)
>
> Note that phy_set_max_speed() is documented as:
>
>  * The PHY might be more capable than the MAC. For example a Fast Ethernet
>  * is connected to a 1G PHY. This function allows the MAC to indicate its
>  * maximum speed, and so limit what the PHY will advertise.
>

Well I should have RTFM. You're right, I'll drop it.

Bart

> Aquantia seems to be the only PHY driver that calls this function.
>
> Thanks.
>
> --
> RMK's Patch system: https://www.armlinux.org.uk/developer/patches/
> FTTP is here! 80Mbps down 10Mbps up. Decent connectivity at last!
Andrew Lunn June 27, 2024, 4:22 p.m. UTC | #3
On Thu, Jun 27, 2024 at 01:30:17PM +0200, Bartosz Golaszewski wrote:
> From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
> 
> Add support for a new model to the Aquantia driver. This PHY supports
> Overlocked SGMII mode with 2.5G speeds.
> 
> Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
> ---
>  drivers/net/phy/aquantia/aquantia_main.c | 39 +++++++++++++++++++++++-
>  1 file changed, 38 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/net/phy/aquantia/aquantia_main.c b/drivers/net/phy/aquantia/aquantia_main.c
> index 974795bd0860..98ccefd355d5 100644
> --- a/drivers/net/phy/aquantia/aquantia_main.c
> +++ b/drivers/net/phy/aquantia/aquantia_main.c
> @@ -29,6 +29,7 @@
>  #define PHY_ID_AQR113	0x31c31c40
>  #define PHY_ID_AQR113C	0x31c31c12
>  #define PHY_ID_AQR114C	0x31c31c22
> +#define PHY_ID_AQR115C	0x31c31c33
>  #define PHY_ID_AQR813	0x31c31cb2
>  
>  #define MDIO_PHYXS_VEND_IF_STATUS		0xe812
> @@ -111,7 +112,6 @@ static u64 aqr107_get_stat(struct phy_device *phydev, int index)
>  	int len_h = stat->size - len_l;
>  	u64 ret;
>  	int val;
> -
>  	val = phy_read_mmd(phydev, MDIO_MMD_C22EXT, stat->reg);
>  	if (val < 0)
>  		return U64_MAX;

White space change. And that blank line is actually wanted to separate
the variables from the code.

    Andrew

---
pw-bot: cr
Bartosz Golaszewski June 27, 2024, 4:48 p.m. UTC | #4
On Thu, Jun 27, 2024 at 6:22 PM Andrew Lunn <andrew@lunn.ch> wrote:
>
> On Thu, Jun 27, 2024 at 01:30:17PM +0200, Bartosz Golaszewski wrote:
> > From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
> >
> > Add support for a new model to the Aquantia driver. This PHY supports
> > Overlocked SGMII mode with 2.5G speeds.
> >
> > Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
> > ---
> >  drivers/net/phy/aquantia/aquantia_main.c | 39 +++++++++++++++++++++++-
> >  1 file changed, 38 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/net/phy/aquantia/aquantia_main.c b/drivers/net/phy/aquantia/aquantia_main.c
> > index 974795bd0860..98ccefd355d5 100644
> > --- a/drivers/net/phy/aquantia/aquantia_main.c
> > +++ b/drivers/net/phy/aquantia/aquantia_main.c
> > @@ -29,6 +29,7 @@
> >  #define PHY_ID_AQR113        0x31c31c40
> >  #define PHY_ID_AQR113C       0x31c31c12
> >  #define PHY_ID_AQR114C       0x31c31c22
> > +#define PHY_ID_AQR115C       0x31c31c33
> >  #define PHY_ID_AQR813        0x31c31cb2
> >
> >  #define MDIO_PHYXS_VEND_IF_STATUS            0xe812
> > @@ -111,7 +112,6 @@ static u64 aqr107_get_stat(struct phy_device *phydev, int index)
> >       int len_h = stat->size - len_l;
> >       u64 ret;
> >       int val;
> > -
> >       val = phy_read_mmd(phydev, MDIO_MMD_C22EXT, stat->reg);
> >       if (val < 0)
> >               return U64_MAX;
>
> White space change. And that blank line is actually wanted to separate
> the variables from the code.
>

Ah, this is accidental, thanks for catching it.

Bart

>     Andrew
>
> ---
> pw-bot: cr
Daniel Golle June 27, 2024, 10:42 p.m. UTC | #5
Hi Bartosz,

On Thu, Jun 27, 2024 at 01:30:17PM +0200, Bartosz Golaszewski wrote:
> From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
> 
> Add support for a new model to the Aquantia driver. This PHY supports
> Overlocked SGMII mode with 2.5G speeds.

I don't think that there is such a thing as "Overclocked SGMII mode with
2.5G speed".

Lets take a short look at Cisco SGMII, which is defined as a serialzed
version of the Gigabit Media-Independent Interface. As such, it supports
10M, 100M and 1000M speed. There is negotiation for speed, duplex,
flow-control and link status (up/down).

The data signals always operate at 1.25 Gbaud and the clocks operate at
625 MHz (a DDR interface), and there is a 10:8 FEC coding applied,
resulting in 1 Gbit/s usable bandwidth.

For lower speeds lower than 1 Gbit/s each symbol is repeated 10x for
100M and 100x for 10M.

Now, assuming SGMII running at 2.5x the clock speed of actual Cisco
SGMII would exist, how would that look like for lower speeds like 1000M,
100M or 10M? Obviously you cannot repeat a symbol 2.5 times, which would
make it impossible to support 1000M links with the same strategy used
for lower speeds in regular SGMII.

Hence I assume that what you meant to say here is that the PHY uses
2500Base-X as interface mode and performs rate-adaptation for speeds
less than 2500M (or half-duplex) using pause frames.

This is also what e.g. AQR112 is doing, which I would assume is fairly
similar to the newer AQR115.

> 
> Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
> ---
>  drivers/net/phy/aquantia/aquantia_main.c | 39 +++++++++++++++++++++++-
>  1 file changed, 38 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/net/phy/aquantia/aquantia_main.c b/drivers/net/phy/aquantia/aquantia_main.c
> index 974795bd0860..98ccefd355d5 100644
> --- a/drivers/net/phy/aquantia/aquantia_main.c
> +++ b/drivers/net/phy/aquantia/aquantia_main.c
> @@ -29,6 +29,7 @@
>  #define PHY_ID_AQR113	0x31c31c40
>  #define PHY_ID_AQR113C	0x31c31c12
>  #define PHY_ID_AQR114C	0x31c31c22
> +#define PHY_ID_AQR115C	0x31c31c33
>  #define PHY_ID_AQR813	0x31c31cb2
>  
>  #define MDIO_PHYXS_VEND_IF_STATUS		0xe812
> @@ -111,7 +112,6 @@ static u64 aqr107_get_stat(struct phy_device *phydev, int index)
>  	int len_h = stat->size - len_l;
>  	u64 ret;
>  	int val;
> -
>  	val = phy_read_mmd(phydev, MDIO_MMD_C22EXT, stat->reg);
>  	if (val < 0)
>  		return U64_MAX;
> @@ -721,6 +721,18 @@ static int aqr113c_config_init(struct phy_device *phydev)
>  	return aqr107_fill_interface_modes(phydev);
>  }
>  
> +static int aqr115c_config_init(struct phy_device *phydev)
> +{
> +	/* Check that the PHY interface type is compatible */
> +	if (phydev->interface != PHY_INTERFACE_MODE_SGMII &&
> +	    phydev->interface != PHY_INTERFACE_MODE_2500BASEX)
> +		return -ENODEV;
> +
> +	phy_set_max_speed(phydev, SPEED_2500);
> +
> +	return 0;
> +}
> +
>  static int aqr107_probe(struct phy_device *phydev)
>  {
>  	int ret;
> @@ -999,6 +1011,30 @@ static struct phy_driver aqr_driver[] = {
>  	.led_hw_control_get = aqr_phy_led_hw_control_get,
>  	.led_polarity_set = aqr_phy_led_polarity_set,
>  },
> +{
> +	PHY_ID_MATCH_MODEL(PHY_ID_AQR115C),
> +	.name           = "Aquantia AQR115C",
> +	.probe          = aqr107_probe,
> +	.get_rate_matching = aqr107_get_rate_matching,
> +	.config_init    = aqr115c_config_init,
> +	.config_aneg    = aqr_config_aneg,
> +	.config_intr    = aqr_config_intr,
> +	.handle_interrupt = aqr_handle_interrupt,
> +	.read_status    = aqr107_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,
> +	.led_brightness_set = aqr_phy_led_brightness_set,
> +	.led_hw_is_supported = aqr_phy_led_hw_is_supported,
> +	.led_hw_control_set = aqr_phy_led_hw_control_set,
> +	.led_hw_control_get = aqr_phy_led_hw_control_get,
> +	.led_polarity_set = aqr_phy_led_polarity_set,
> +},
>  {
>  	PHY_ID_MATCH_MODEL(PHY_ID_AQR813),
>  	.name		= "Aquantia AQR813",
> @@ -1042,6 +1078,7 @@ static struct mdio_device_id __maybe_unused aqr_tbl[] = {
>  	{ PHY_ID_MATCH_MODEL(PHY_ID_AQR113) },
>  	{ PHY_ID_MATCH_MODEL(PHY_ID_AQR113C) },
>  	{ PHY_ID_MATCH_MODEL(PHY_ID_AQR114C) },
> +	{ PHY_ID_MATCH_MODEL(PHY_ID_AQR115C) },
>  	{ PHY_ID_MATCH_MODEL(PHY_ID_AQR813) },
>  	{ }
>  };
> -- 
> 2.43.0
> 
>
Andrew Lunn June 28, 2024, 12:18 a.m. UTC | #6
On Thu, Jun 27, 2024 at 11:42:45PM +0100, Daniel Golle wrote:
> Hi Bartosz,
> 
> On Thu, Jun 27, 2024 at 01:30:17PM +0200, Bartosz Golaszewski wrote:
> > From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
> > 
> > Add support for a new model to the Aquantia driver. This PHY supports
> > Overlocked SGMII mode with 2.5G speeds.
> 
> I don't think that there is such a thing as "Overclocked SGMII mode with
> 2.5G speed".

Unfortunately, there is. A number of vendors say they do this, without
saying quite what they actually do.  As you point out, symbol
replication does not work, and in-band signalling also makes no
sense. So they throw all that away. Leaving just the higher clock
rate, single speed, and no in-band signalling.

In the end, that looks very similar to 2500BaseX with broken inband
signalling.

> Hence I assume that what you meant to say here is that the PHY uses
> 2500Base-X as interface mode and performs rate-adaptation for speeds
> less than 2500M (or half-duplex) using pause frames.

Not all systems assume rate adaptation. Some are known to use SGMII
for 10/100/1G with inband signalling, and then swap to 2500BaseX
without inband-signalling for 2.5G operation!

2.5G is a mess.

    Andrew
Daniel Golle June 28, 2024, 1:11 a.m. UTC | #7
On Fri, Jun 28, 2024 at 02:18:45AM +0200, Andrew Lunn wrote:
> On Thu, Jun 27, 2024 at 11:42:45PM +0100, Daniel Golle wrote:
> > Hi Bartosz,
> > 
> > On Thu, Jun 27, 2024 at 01:30:17PM +0200, Bartosz Golaszewski wrote:
> > > From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
> > > 
> > > Add support for a new model to the Aquantia driver. This PHY supports
> > > Overlocked SGMII mode with 2.5G speeds.
> > 
> > I don't think that there is such a thing as "Overclocked SGMII mode with
> > 2.5G speed".
> 
> Unfortunately, there is. A number of vendors say they do this, without
> saying quite what they actually do.  As you point out, symbol
> replication does not work, and in-band signalling also makes no
> sense. So they throw all that away. Leaving just the higher clock
> rate, single speed, and no in-band signalling.
> 
> In the end, that looks very similar to 2500BaseX with broken inband
> signalling.

Let's call it that then: "2500Base-X with broken in-band signalling".

MaxLinear describes that quite clearly in their (open!) datasheets[1],
and gives some insight into the (mis-)use of the term "SGMII" in the
industry as synonymous to just any type of serialized Ethernet MII:

"
3.4 SGMII Interface

The GPY211 implements a serial data interface, called SGMII or SerDes,
to connect to another chip implementing the MAC layer (MAC SoC).
"
(page 32)

Later on they mention that
"
3.4.7 Auto-negotiation Modes Supported by SGMII

Two modes are supported for the SGMII auto-negotiation protocol:
 * Cisco* Serial-GMII Specification 1.8 [4]
 * 1000BX IEEE 802.3 following IEEE Clause 37 [2]
"
(page 37)

Aquantia's datasheets are only available under NDA, so I cannot quote
them directly, but I can tell you that their definition of "SGMII" is
pretty similar to that of MaxLinear.

> 
> > Hence I assume that what you meant to say here is that the PHY uses
> > 2500Base-X as interface mode and performs rate-adaptation for speeds
> > less than 2500M (or half-duplex) using pause frames.
> 
> Not all systems assume rate adaptation. Some are known to use SGMII
> for 10/100/1G with inband signalling, and then swap to 2500BaseX
> without inband-signalling for 2.5G operation!

Yes, most 2.5G PHYs out there (MaxLinear, RealTek) actually support both,
with interface-mode switching being the better option compared to often
rather problematic rate-adaptation...

When it comes to Aquantia we are using 2500Base-X with rate adaptation
for the older 2.5G PHYs, so I assume the newer ones would not differ in
that regard. Or rather: If we were to introduce interface-mode-switching
also for the Aquantia 2.5G PHYs then we should try doing it for all of
them at least.

> 
> 2.5G is a mess.

+1

[1]: https://assets.maxlinear.com/web/documents/617810_gpy211b1vc_gpy211c0vc_ds_rev1.4.pdf
Bartosz Golaszewski June 28, 2024, 12:11 p.m. UTC | #8
On Fri, Jun 28, 2024 at 3:11 AM Daniel Golle <daniel@makrotopia.org> wrote:
>
> On Fri, Jun 28, 2024 at 02:18:45AM +0200, Andrew Lunn wrote:
> > On Thu, Jun 27, 2024 at 11:42:45PM +0100, Daniel Golle wrote:
> > > Hi Bartosz,
> > >
> > > On Thu, Jun 27, 2024 at 01:30:17PM +0200, Bartosz Golaszewski wrote:
> > > > From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
> > > >
> > > > Add support for a new model to the Aquantia driver. This PHY supports
> > > > Overlocked SGMII mode with 2.5G speeds.
> > >
> > > I don't think that there is such a thing as "Overclocked SGMII mode with
> > > 2.5G speed".
> >
> > Unfortunately, there is. A number of vendors say they do this, without
> > saying quite what they actually do.  As you point out, symbol
> > replication does not work, and in-band signalling also makes no
> > sense. So they throw all that away. Leaving just the higher clock
> > rate, single speed, and no in-band signalling.
> >
> > In the end, that looks very similar to 2500BaseX with broken inband
> > signalling.
>
> Let's call it that then: "2500Base-X with broken in-band signalling".
>
> MaxLinear describes that quite clearly in their (open!) datasheets[1],
> and gives some insight into the (mis-)use of the term "SGMII" in the
> industry as synonymous to just any type of serialized Ethernet MII:
>
> "
> 3.4 SGMII Interface
>
> The GPY211 implements a serial data interface, called SGMII or SerDes,
> to connect to another chip implementing the MAC layer (MAC SoC).
> "
> (page 32)
>
> Later on they mention that
> "
> 3.4.7 Auto-negotiation Modes Supported by SGMII
>
> Two modes are supported for the SGMII auto-negotiation protocol:
>  * Cisco* Serial-GMII Specification 1.8 [4]
>  * 1000BX IEEE 802.3 following IEEE Clause 37 [2]
> "
> (page 37)
>
> Aquantia's datasheets are only available under NDA, so I cannot quote
> them directly, but I can tell you that their definition of "SGMII" is
> pretty similar to that of MaxLinear.
>

Well, hopefully without breaching the NDA I can tell you that there's
no definition at all. At least not in the ~700 pages doc I have access
to anyway.

> >
> > > Hence I assume that what you meant to say here is that the PHY uses
> > > 2500Base-X as interface mode and performs rate-adaptation for speeds
> > > less than 2500M (or half-duplex) using pause frames.
> >
> > Not all systems assume rate adaptation. Some are known to use SGMII
> > for 10/100/1G with inband signalling, and then swap to 2500BaseX
> > without inband-signalling for 2.5G operation!
>
> Yes, most 2.5G PHYs out there (MaxLinear, RealTek) actually support both,
> with interface-mode switching being the better option compared to often
> rather problematic rate-adaptation...
>
> When it comes to Aquantia we are using 2500Base-X with rate adaptation
> for the older 2.5G PHYs, so I assume the newer ones would not differ in
> that regard. Or rather: If we were to introduce interface-mode-switching
> also for the Aquantia 2.5G PHYs then we should try doing it for all of
> them at least.
>
> >
> > 2.5G is a mess.
>
> +1
>

Not sure what to do, should I still be adding a new mode here or is it
fine to just explain in the commit message that this really is
"2500Base-X-sans-in-band-signalling" and keep the code as is? Or maybe
some quirk disallowing `managed = "in-band-status"`?

Bartosz
Andrew Lunn June 28, 2024, 2:09 p.m. UTC | #9
> Not sure what to do, should I still be adding a new mode here or is it
> fine to just explain in the commit message that this really is
> "2500Base-X-sans-in-band-signalling" and keep the code as is? Or maybe
> some quirk disallowing `managed = "in-band-status"`?

Yes, please do make it clear in the commit message. It is good to have
a full commit message explaining all the messy details to help the
next person who needs to modify this code, or has the same issue with
another vendor specific glue driver for stmmac, etc.

	Andrew
diff mbox series

Patch

diff --git a/drivers/net/phy/aquantia/aquantia_main.c b/drivers/net/phy/aquantia/aquantia_main.c
index 974795bd0860..98ccefd355d5 100644
--- a/drivers/net/phy/aquantia/aquantia_main.c
+++ b/drivers/net/phy/aquantia/aquantia_main.c
@@ -29,6 +29,7 @@ 
 #define PHY_ID_AQR113	0x31c31c40
 #define PHY_ID_AQR113C	0x31c31c12
 #define PHY_ID_AQR114C	0x31c31c22
+#define PHY_ID_AQR115C	0x31c31c33
 #define PHY_ID_AQR813	0x31c31cb2
 
 #define MDIO_PHYXS_VEND_IF_STATUS		0xe812
@@ -111,7 +112,6 @@  static u64 aqr107_get_stat(struct phy_device *phydev, int index)
 	int len_h = stat->size - len_l;
 	u64 ret;
 	int val;
-
 	val = phy_read_mmd(phydev, MDIO_MMD_C22EXT, stat->reg);
 	if (val < 0)
 		return U64_MAX;
@@ -721,6 +721,18 @@  static int aqr113c_config_init(struct phy_device *phydev)
 	return aqr107_fill_interface_modes(phydev);
 }
 
+static int aqr115c_config_init(struct phy_device *phydev)
+{
+	/* Check that the PHY interface type is compatible */
+	if (phydev->interface != PHY_INTERFACE_MODE_SGMII &&
+	    phydev->interface != PHY_INTERFACE_MODE_2500BASEX)
+		return -ENODEV;
+
+	phy_set_max_speed(phydev, SPEED_2500);
+
+	return 0;
+}
+
 static int aqr107_probe(struct phy_device *phydev)
 {
 	int ret;
@@ -999,6 +1011,30 @@  static struct phy_driver aqr_driver[] = {
 	.led_hw_control_get = aqr_phy_led_hw_control_get,
 	.led_polarity_set = aqr_phy_led_polarity_set,
 },
+{
+	PHY_ID_MATCH_MODEL(PHY_ID_AQR115C),
+	.name           = "Aquantia AQR115C",
+	.probe          = aqr107_probe,
+	.get_rate_matching = aqr107_get_rate_matching,
+	.config_init    = aqr115c_config_init,
+	.config_aneg    = aqr_config_aneg,
+	.config_intr    = aqr_config_intr,
+	.handle_interrupt = aqr_handle_interrupt,
+	.read_status    = aqr107_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,
+	.led_brightness_set = aqr_phy_led_brightness_set,
+	.led_hw_is_supported = aqr_phy_led_hw_is_supported,
+	.led_hw_control_set = aqr_phy_led_hw_control_set,
+	.led_hw_control_get = aqr_phy_led_hw_control_get,
+	.led_polarity_set = aqr_phy_led_polarity_set,
+},
 {
 	PHY_ID_MATCH_MODEL(PHY_ID_AQR813),
 	.name		= "Aquantia AQR813",
@@ -1042,6 +1078,7 @@  static struct mdio_device_id __maybe_unused aqr_tbl[] = {
 	{ PHY_ID_MATCH_MODEL(PHY_ID_AQR113) },
 	{ PHY_ID_MATCH_MODEL(PHY_ID_AQR113C) },
 	{ PHY_ID_MATCH_MODEL(PHY_ID_AQR114C) },
+	{ PHY_ID_MATCH_MODEL(PHY_ID_AQR115C) },
 	{ PHY_ID_MATCH_MODEL(PHY_ID_AQR813) },
 	{ }
 };