> fast check, would you be happy with this in fixed PHY: > --- a/drivers/net/phy/fixed_phy.c > +++ b/drivers/net/phy/fixed_phy.c > @@ -25,6 +25,7 @@ > #include <linux/gpio.h> > #include <linux/seqlock.h> > #include <linux/idr.h> > +#include <linux/netdevice.h> > > #include "swphy.h" > > @@ -38,6 +39,7 @@ struct fixed_phy { > struct phy_device *phydev; > seqcount_t seqcount; > struct fixed_phy_status status; > + bool no_carrier; > int (*link_update)(struct net_device *, struct fixed_phy_status *); > struct list_head node; > int link_gpio; > @@ -48,6 +50,24 @@ static struct fixed_mdio_bus platform_fmb = { > .phys = LIST_HEAD_INIT(platform_fmb.phys), > }; > > +int > +fixed_phy_change_carrier(struct net_device *dev, bool new_carrier) > +{ > + struct fixed_mdio_bus *fmb = &platform_fmb; > + struct phy_device *phydev = dev->phydev; > + struct fixed_phy *fp; > + > + if (!phydev || !phydev->mdio.bus) > + return -EINVAL; > + > + list_for_each_entry(fp, &fmb->phys, node) { > + if (fp->addr == phydev->mdio.addr) { > + fp->no_carrier = !new_carrier;
Why is no_carrier needed? You can directly change fp->status.link, so long as you take care of locking. > + return 0; > + } > + } > + return -EINVAL; > +} You need to export the function. Andrew