> 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

Reply via email to