[U-Boot, v5, 1/1]net: phy: Add the Airoha EN8811H PHY driver

Marek Vasut marek.vasut at mailbox.org
Sun Nov 9 19:37:23 CET 2025


On 11/9/25 5:37 PM, Lucien.Jheng wrote:

[...]

> +#define AIR_EXT_PAGE_ACCESS		0x1f
> +#define AIR_PHY_PAGE_STANDARD		0x0000
> +#define AIR_PHY_PAGE_EXTENDED_4		0x0004
> +
> +/* MII Registers Page 4*/

4[SPACE]*/ ... missing space before *

> +#define AIR_BPBUS_MODE			0x10
> +#define AIR_BPBUS_MODE_ADDR_FIXED	0x0000
> +#define AIR_BPBUS_MODE_ADDR_INCR	BIT(15)
> +#define AIR_BPBUS_WR_ADDR_HIGH		0x11
> +#define AIR_BPBUS_WR_ADDR_LOW		0x12
> +#define AIR_BPBUS_WR_DATA_HIGH		0x13
> +#define AIR_BPBUS_WR_DATA_LOW		0x14
> +#define AIR_BPBUS_RD_ADDR_HIGH		0x15
> +#define AIR_BPBUS_RD_ADDR_LOW		0x16
> +#define AIR_BPBUS_RD_DATA_HIGH		0x17
> +#define AIR_BPBUS_RD_DATA_LOW		0x18

[...]

> +static int air_buckpbus_reg_write(struct phy_device *phydev,
> +				  u32 pbus_address, u32 pbus_data)
> +{
> +	int ret, saved_page;
> +
> +	saved_page = phy_select_page(phydev, AIR_PHY_PAGE_EXTENDED_4);
> +	if (saved_page < 0)
> +		return saved_page;
> +
> +	ret = phy_write(phydev, MDIO_DEVAD_NONE, AIR_BPBUS_MODE,
> +			AIR_BPBUS_MODE_ADDR_FIXED);
> +	if (ret < 0)
> +		goto restore_page;
> +
> +	ret = phy_write(phydev, MDIO_DEVAD_NONE, AIR_BPBUS_WR_ADDR_HIGH,
> +			upper_16_bits(pbus_address));
> +	if (ret < 0)
> +		goto restore_page;
> +
> +	ret = phy_write(phydev, MDIO_DEVAD_NONE, AIR_BPBUS_WR_ADDR_LOW,
> +			lower_16_bits(pbus_address));
> +	if (ret < 0)
> +		goto restore_page;
> +
> +	ret = phy_write(phydev, MDIO_DEVAD_NONE, AIR_BPBUS_WR_DATA_HIGH,
> +			upper_16_bits(pbus_data));
> +	if (ret < 0)
> +		goto restore_page;
> +
> +	ret = phy_write(phydev, MDIO_DEVAD_NONE, AIR_BPBUS_WR_DATA_LOW,
> +			lower_16_bits(pbus_data));
> +	if (ret < 0)
> +		goto restore_page;
> +
> +restore_page:
> +	if (ret < 0)
> +		printf("%s 0x%08x failed: %d\n", __func__,
> +		       pbus_address, ret);

Can you use dev_err(phydev->dev, "%s..... here ? The struct phy_device 
has access to udevice and with dev_err(), you will get automatic device 
instance identifier in the print (useful if you have multiple PHYs).

> +	return phy_restore_page(phydev, saved_page, ret);
> +}

[...]

> +static int en8811h_wait_mcu_ready(struct phy_device *phydev)
> +{
> +	int ret, reg_value;
> +
> +	/* Because of mdio-lock, may have to wait for multiple loads */
> +	ret = phy_read_mmd_poll_timeout(phydev, MDIO_MMD_VEND1,
> +					EN8811H_PHY_FW_STATUS, reg_value,
> +					reg_value == EN8811H_PHY_READY,
> +					20000, 7500000, true);
> +	if (ret) {
> +		printf("MCU not ready: 0x%x\n", reg_value);
> +		return -ENODEV;

return ret; should be fine here ?

> +	}
> +
> +	return 0;
> +}
With those fixed:

Reviewed-by: Marek Vasut <marek.vasut at mailbox.org>

Thank you for your hard work !


More information about the U-Boot mailing list