Re: [PATCH v2] net: phy: air_en8811h: add AN8811HB MCU assert/deassert support

From: Lucien.Jheng

Date: Sun Mar 29 2026 - 01:06:08 EST



Eric Woudstra 於 2026/3/28 下午 06:21 寫道:

On 3/27/26 5:41 AM, Eric Woudstra wrote:
static int __air_pbus_reg_write(struct mdio_device *mdio, u32 pbus_address,
u32 pbus_data)
{
int ret;

ret = __mdiobus_write(mdio->bus, mdio->addr, AIR_EXT_PAGE_ACCESS,
(u16)(pbus_address >> 6));
if (ret < 0)
return ret;

ret = __mdiobus_write(mdio->bus, mdio->addr, (pbus_address >> 2) & 0xf,
(u16)pbus_data);
if (ret < 0)
return ret;

ret = __mdiobus_write(mdio->bus, mdio->addr, AIR_PBUS_DATA_HIGH,
(u16)(pbus_data >> 16));
if (ret < 0)
return ret;

return 0;
}

static int air_pbus_reg_write(struct mdio_device *mdio, u32 pbus_address,
u32 pbus_data)
{
int ret;

mutex_lock(&mdio->bus->mdio_lock);

ret = __air_pbus_reg_write(mdio, pbus_address, pbus_data);
if (ret < 0)
dev_err(&mdio->dev, "%s 0x%08x failed: %d\n", __func__,
pbus_address, ret);

mutex_unlock(&mdio->bus->mdio_lock);

return ret;
}

static int __air_pbus_reg_read(struct mdio_device *mdio, u32 pbus_address,
u32 *pbus_data)
{
int ret, pbus_data_low;

ret = __mdiobus_write(mdio->bus, mdio->addr, AIR_EXT_PAGE_ACCESS,
(u16)(pbus_address >> 6));
if (ret < 0)
return ret;

ret = __mdiobus_read(mdio->bus, mdio->addr, (pbus_address >> 2) & 0xf);
if (ret < 0)
return ret;
pbus_data_low = ret;

ret = __mdiobus_read(mdio->bus, mdio->addr, AIR_PBUS_DATA_HIGH);
if (ret < 0)
return ret;

*pbus_data = (ret << 16) + pbus_data_low;

return 0;
}

static int air_pbus_reg_read(struct mdio_device *mdio, u32 pbus_address,
u32 *pbus_data)
{
int ret;

mutex_lock(&mdio->bus->mdio_lock);

ret = __air_pbus_reg_read(mdio, pbus_address, pbus_data);
if (ret < 0)
dev_err(&mdio->dev, "%s 0x%08x failed: %d\n", __func__,
pbus_address, ret);

mutex_unlock(&mdio->bus->mdio_lock);

return ret;
}

With:

#define AIR_PBUS_DATA_HIGH 0x10
Small correction using upper_16_bits() and lower_16_bits():

static int __air_pbus_reg_write(struct mdio_device *mdio, u32 pbus_address,
u32 pbus_data)
{
int ret;

ret = __mdiobus_write(mdio->bus, mdio->addr, AIR_EXT_PAGE_ACCESS,
(u16)(pbus_address >> 6));
if (ret < 0)
return ret;

ret = __mdiobus_write(mdio->bus, mdio->addr, (pbus_address >> 2) & 0xf,
lower_16_bits(pbus_data));
if (ret < 0)
return ret;

ret = __mdiobus_write(mdio->bus, mdio->addr, AIR_PBUS_DATA_HIGH,
upper_16_bits(pbus_data));
if (ret < 0)
return ret;

return 0;
}

static int air_pbus_reg_write(struct mdio_device *mdio, u32 pbus_address,
u32 pbus_data)
{
int ret;

mutex_lock(&mdio->bus->mdio_lock);

ret = __air_pbus_reg_write(mdio, pbus_address, pbus_data);
if (ret < 0)
dev_err(&mdio->dev, "%s 0x%08x failed: %d\n", __func__,
pbus_address, ret);

mutex_unlock(&mdio->bus->mdio_lock);

return ret;
}

Thank you for your feedback.

I will include this in the next version.