|SUCCESS| [v1] net/axgbe: fix PHY auto-negotiation advertisement

dpdklab at iol.unh.edu dpdklab at iol.unh.edu
Wed Apr 1 02:27:12 CEST 2026


Test-Label: ai-code-review
Test-Status: SUCCESS
https://dpdk.org/patch/162793

_AI Code Review_

=== Patch Review: series.patch (via Claude) ===
Review date: 2026-04-01

Commit: 7ba7d89890ab ("net/axgbe: support Marvell M88E1512 PHY")
Author: Ashok Kumar Natarajan <ashokkumar.natarajan at amd.com>
Subject: net/axgbe: fix PHY auto-negotiation advertisement

This patch corrects the programming of PHY auto-negotiation advertisement
registers by configuring Clause 22 PHY registers according to IEEE 802.3.

> diff --git a/drivers/net/axgbe/axgbe_phy.h b/drivers/net/axgbe/axgbe_phy.h
> index e5568cce5f..12b1d47244 100644
> --- a/drivers/net/axgbe/axgbe_phy.h
> +++ b/drivers/net/axgbe/axgbe_phy.h
> @@ -156,6 +156,11 @@
>  #define AXGBE_M88E1512_MODE_RGMII_SGMII		4
>  #define AXGBE_M88E1512_MODE_SW_RESET		0x8000
>  
> +#define AXGBE_PHY_MII_CTRL1000_1000T_HALF   0x0100
> +#define AXGBE_PHY_MII_CTRL1000_1000T_FULL   0x0200
> +#define AXGBE_PHY_MII_CTRL1000_MS_VALUE     0x0800
> +#define AXGBE_PHY_MII_CTRL1000_MS_MANUAL    0x1000

Are these new macro definitions necessary for this fix?  Looking at the
code changes, only AXGBE_PHY_MII_CTRL1000_1000T_FULL is actually used in
axgbe_phy_config_advert().  The other three macros
(AXGBE_PHY_MII_CTRL1000_1000T_HALF, AXGBE_PHY_MII_CTRL1000_MS_VALUE,
AXGBE_PHY_MII_CTRL1000_MS_MANUAL) are defined but never referenced.

> diff --git a/drivers/net/axgbe/axgbe_phy_impl.c b/drivers/net/axgbe/axgbe_phy_impl.c
> index 369d766884..b340ce02dd 100644
> --- a/drivers/net/axgbe/axgbe_phy_impl.c
> +++ b/drivers/net/axgbe/axgbe_phy_impl.c
> @@ -303,21 +303,38 @@ static int axgbe_phy_write(struct axgbe_port *pdata, u16 reg, u16 value)
>  
>  static int axgbe_phy_config_advert(struct axgbe_port *pdata)
>  {
> +	u32 adv = pdata->phy.advertising;
>  	u16 advert;
> +	u16 ctrl1000;
>  	int ret;
>  
> -	ret = pdata->phy_if.phy_impl.read(pdata, MII_ADVERTISE, &advert);
> +	advert = ADVERTISE_CSMA;
> +
> +	if (adv & ADVERTISED_10baseT_Full)
> +		advert |= ADVERTISE_10FULL;
> +
> +	if (adv & ADVERTISED_100baseT_Full)
> +		advert |= ADVERTISE_100FULL;
> +
> +	if (adv & ADVERTISED_Pause)
> +		advert |= ADVERTISE_PAUSE_CAP;
> +
> +	if (adv & ADVERTISED_Asym_Pause)
> +		advert |= ADVERTISE_PAUSE_ASYM;
> +
> +	ret = pdata->phy_if.phy_impl.write(pdata, MII_ADVERTISE, advert);

Does this code fail to advertise 10BASE-T half-duplex and 100BASE-TX
half-duplex capabilities?  The logic only checks for ADVERTISED_10baseT_Full
and ADVERTISED_100baseT_Full, but does not check for the half-duplex
variants.  If pdata->phy.advertising contains ADVERTISED_10baseT_Half or
ADVERTISED_100baseT_Half, they would not be written to the ADVERTISE
register.

>  	if (ret) {
> -		PMD_DRV_LOG_LINE(ERR, "Failed to read ADVERTISE register");
> +		PMD_DRV_LOG_LINE(ERR, "Failed to write ADVERTISE register");
>  		return ret;
>  	}
>  
> -	advert |= ADVERTISE_FULL;
> -	advert |= ADVERTISE_PAUSE_CAP;
> +	ctrl1000 = 0;
> +	if (adv & ADVERTISED_1000baseT_Full)
> +		ctrl1000 |= AXGBE_PHY_MII_CTRL1000_1000T_FULL;
>  
> -	ret = pdata->phy_if.phy_impl.write(pdata, MII_ADVERTISE, advert);
> +	ret = pdata->phy_if.phy_impl.write(pdata, MII_CTRL1000, ctrl1000);

Similarly, does this code fail to advertise 1000BASE-T half-duplex
capability?  If pdata->phy.advertising contains ADVERTISED_1000baseT_Half,
it would not be written to MII_CTRL1000.

>  	if (ret) {
> -		PMD_DRV_LOG_LINE(ERR, "Failed to write ADVERTISE register");
> +		PMD_DRV_LOG_LINE(ERR, "Failed to write MII_CTRL1000 register");
>  		return ret;
>  	}
>  	return 0;


More information about the test-report mailing list