[PATCH v3] net: xgmac: Augment mdio read/write with cl-45 format support

Chee, Tien Fong tienfong.chee at altera.com
Mon Nov 17 09:47:02 CET 2025


Hi,

On 29/8/2025 12:12 pm, Nikunj Kela wrote:
> Currently, clause-22 format is supported. This change adds
> support for clause-45 format.
>
> Signed-off-by: Nikunj Kela<nikunj.kela at sima.ai>
> Reviewed-by: Boon Khai Ng<boon.khai.ng at altera.com>
> Tested-by: Boon Khai Ng<boon.khai.ng at altera.com>
> ---
> Changes in v3:
> 	- replaced tab with space
>
> Changes in v2:
> 	- Created separate function for configuring clause format
>
> [2]:https://patchwork.ozlabs.org/project/uboot/patch/20250828225532.1147284-1-nikunj.kela@sima.ai/
> [1]:https://patchwork.ozlabs.org/project/uboot/patch/20250510041200.2552981-1-nikunj.kela@sima.ai/
> ---
>   drivers/net/dwc_eth_xgmac.c | 60 ++++++++++++++++++++++++-------------
>   drivers/net/dwc_eth_xgmac.h |  1 +
>   2 files changed, 41 insertions(+), 20 deletions(-)
>
> diff --git a/drivers/net/dwc_eth_xgmac.c b/drivers/net/dwc_eth_xgmac.c
> index d29d871ea8c..458b87af7a2 100644
> --- a/drivers/net/dwc_eth_xgmac.c
> +++ b/drivers/net/dwc_eth_xgmac.c
> @@ -140,9 +140,34 @@ static int xgmac_mdio_wait_idle(struct xgmac_priv *xgmac)
>   				 XGMAC_TIMEOUT_100MS, true);
>   }
>   
> +static u32 xgmac_set_clause(struct xgmac_priv *xgmac, int mdio_addr, int mdio_devad,
> +			    int mdio_reg, bool is_c45)
> +{
> +	u32 hw_addr;
> +	u32 val;
> +
> +	if (is_c45) {
> +		val = readl(&xgmac->mac_regs->mdio_clause_22_port);
> +		val &= ~BIT(mdio_addr);
> +		writel(val, &xgmac->mac_regs->mdio_clause_22_port);
> +		hw_addr = (mdio_addr << XGMAC_MAC_MDIO_ADDRESS_PA_SHIFT) |
> +			   (mdio_reg & XGMAC_MAC_MDIO_REG_ADDR_C45P_MASK);
> +		hw_addr |= mdio_devad << XGMAC_MAC_MDIO_ADDRESS_DA_SHIFT;
> +	} else {
> +		/* Set clause 22 format */
> +		val = BIT(mdio_addr);
> +		writel(val, &xgmac->mac_regs->mdio_clause_22_port);
> +		hw_addr = (mdio_addr << XGMAC_MAC_MDIO_ADDRESS_PA_SHIFT) |
> +			   (mdio_reg & XGMAC_MAC_MDIO_REG_ADDR_C22P_MASK);
> +	}
> +
> +	return hw_addr;
> +}
> +
>   static int xgmac_mdio_read(struct mii_dev *bus, int mdio_addr, int mdio_devad,
>   			   int mdio_reg)
>   {
> +	bool is_c45 = (mdio_devad != MDIO_DEVAD_NONE);
>   	struct xgmac_priv *xgmac = bus->priv;
>   	u32 val;
>   	u32 hw_addr;
> @@ -159,19 +184,16 @@ static int xgmac_mdio_read(struct mii_dev *bus, int mdio_addr, int mdio_devad,
>   		return ret;
>   	}
>   
> -	/* Set clause 22 format */
> -	val = BIT(mdio_addr);
> -	writel(val, &xgmac->mac_regs->mdio_clause_22_port);
> -
> -	hw_addr = (mdio_addr << XGMAC_MAC_MDIO_ADDRESS_PA_SHIFT) |
> -		   (mdio_reg & XGMAC_MAC_MDIO_REG_ADDR_C22P_MASK);
> +	hw_addr = xgmac_set_clause(xgmac, mdio_addr, mdio_devad, mdio_reg, is_c45);
>   
>   	val = xgmac->config->config_mac_mdio <<
>   	      XGMAC_MAC_MDIO_ADDRESS_CR_SHIFT;
>   
> -	val |= XGMAC_MAC_MDIO_ADDRESS_SADDR |
> -	       XGMAC_MDIO_SINGLE_CMD_ADDR_CMD_READ |
> -	       XGMAC_MAC_MDIO_ADDRESS_SBUSY;
> +	if (!is_c45)
> +		val |= XGMAC_MAC_MDIO_ADDRESS_SADDR;
> +
> +	val |= XGMAC_MDIO_SINGLE_CMD_ADDR_CMD_READ |
> +		XGMAC_MAC_MDIO_ADDRESS_SBUSY;
>   
>   	ret = xgmac_mdio_wait_idle(xgmac);
>   	if (ret) {
> @@ -203,6 +225,7 @@ static int xgmac_mdio_read(struct mii_dev *bus, int mdio_addr, int mdio_devad,
>   static int xgmac_mdio_write(struct mii_dev *bus, int mdio_addr, int mdio_devad,
>   			    int mdio_reg, u16 mdio_val)
>   {
> +	bool is_c45 = (mdio_devad != MDIO_DEVAD_NONE);
>   	struct xgmac_priv *xgmac = bus->priv;
>   	u32 val;
>   	u32 hw_addr;
> @@ -219,21 +242,18 @@ static int xgmac_mdio_write(struct mii_dev *bus, int mdio_addr, int mdio_devad,
>   		return ret;
>   	}
>   
> -	/* Set clause 22 format */
> -	val = BIT(mdio_addr);
> -	writel(val, &xgmac->mac_regs->mdio_clause_22_port);
> -
> -	hw_addr = (mdio_addr << XGMAC_MAC_MDIO_ADDRESS_PA_SHIFT) |
> -		   (mdio_reg & XGMAC_MAC_MDIO_REG_ADDR_C22P_MASK);
> -
> -	hw_addr |= (mdio_reg >> XGMAC_MAC_MDIO_ADDRESS_PA_SHIFT) <<
> -		    XGMAC_MAC_MDIO_ADDRESS_DA_SHIFT;
> +	hw_addr = xgmac_set_clause(xgmac, mdio_addr, mdio_devad, mdio_reg, is_c45);
>   
>   	val = (xgmac->config->config_mac_mdio <<
>   	       XGMAC_MAC_MDIO_ADDRESS_CR_SHIFT);
>   
> -	val |= XGMAC_MAC_MDIO_ADDRESS_SADDR |
> -		mdio_val | XGMAC_MDIO_SINGLE_CMD_ADDR_CMD_WRITE |
> +	if (!is_c45) {
> +		hw_addr |= (mdio_reg >> XGMAC_MAC_MDIO_ADDRESS_PA_SHIFT) <<
> +			    XGMAC_MAC_MDIO_ADDRESS_DA_SHIFT;
> +		val |= XGMAC_MAC_MDIO_ADDRESS_SADDR;
> +	}
> +
> +	val |= mdio_val | XGMAC_MDIO_SINGLE_CMD_ADDR_CMD_WRITE |
>   		XGMAC_MAC_MDIO_ADDRESS_SBUSY;
>   
>   	ret = xgmac_mdio_wait_idle(xgmac);
> diff --git a/drivers/net/dwc_eth_xgmac.h b/drivers/net/dwc_eth_xgmac.h
> index 259f815f3f2..90c2e22997c 100644
> --- a/drivers/net/dwc_eth_xgmac.h
> +++ b/drivers/net/dwc_eth_xgmac.h
> @@ -109,6 +109,7 @@ struct xgmac_mac_regs {
>   #define XGMAC_MAC_MDIO_ADDRESS_SBUSY		BIT(22)
>   #define XGMAC_MAC_MDIO_REG_ADDR_C22P_MASK	GENMASK(4, 0)
>   #define XGMAC_MAC_MDIO_DATA_GD_MASK		GENMASK(15, 0)
> +#define XGMAC_MAC_MDIO_REG_ADDR_C45P_MASK	GENMASK(15, 0)
>   
>   /* MTL Registers */


Reviewed-by: Tien Fong Chee <tien.fong.chee at altera.com>

Best regards,
Tien Fong


>   


More information about the U-Boot mailing list