Re: [RFC PATCH] net: phy/mdio: enable mmd indirect access through phy_mii_ioctl()
From: Grygorii Strashko <grygorii.strashko@ti.com>
Date: 2021-11-02 22:22:45
Also in:
lkml
On 02/11/2021 23:46, Andrew Lunn wrote:
quoted
@@ -300,8 +301,18 @@ int phy_mii_ioctl(struct phy_device *phydev, struct ifreq *ifr, int cmd) prtad = mii_data->phy_id; devad = mii_data->reg_num; } - mii_data->val_out = mdiobus_read(phydev->mdio.bus, prtad, - devad); + + if (prtad != phydev->mdio.addr) + phydev_rq = mdiobus_get_phy(phydev->mdio.bus, prtad); + + if (!phydev_rq) { + mii_data->val_out = mdiobus_read(phydev->mdio.bus, prtad, devad); + } else if (mdio_phy_id_is_c45(mii_data->phy_id) && !phydev->is_c45) { + mii_data->val_out = phy_read_mmd(phydev_rq, mdio_phy_id_devad(mii_data->phy_id), mii_data->reg_num); + } else { + mii_data->val_out = phy_read(phydev_rq, mii_data->reg_num); + } +One thing i don't like about this is you have little idea what it has actually done. If you pass a C45 address, i expect a C45 access. If i pass a C22 i expect a C22 access.
I might be doing smth wrong and that's why it's RFC. I wanted to understand if i hook into the kernel side first correctly, so if above doesn't violate PHYs/mdiodev access any more there seems reason try to continue.
What i find interesting is that you and the other resent requester are using the same user space tool. If you implement C45 over C22 in that tool, you get your solution, and it will work for older kernels as well. Also, given the diverse implementations of this IOTCL, it probably works for more drivers than just those using phy_mii_ioctl().
Do you mean change uapi, like add mdio_phy_id_is_c45_over_c22() and flag #define MDIO_PHY_ID_C45_OVER_C22 0x4000? Thank you for your comments and patience. -- Best regards, grygorii