Re: [RFC PATCH] net: phy/mdio: enable mmd indirect access through phy_mii_ioctl()

From: Grygorii Strashko
Date: Tue Nov 02 2021 - 18:22:45 EST




On 02/11/2021 23:46, Andrew Lunn wrote:
@@ -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