[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