[PATCH v3 2/4] net: mvneta: add SFP TX disable handling

Robert Marko robert.marko at sartura.hr
Thu Mar 24 11:59:21 CET 2022


On Thu, Mar 24, 2022 at 11:12 AM Marek Behún <marek.behun at nic.cz> wrote:
>
> On Thu, 24 Mar 2022 10:57:37 +0100
> Robert Marko <robert.marko at sartura.hr> wrote:
>
> > Add support for handling SFP TX disable for MVNETA in the same fashion as
> > to what MVPP2 is doing in order to enable using SFP-s.
> >
> > This allows using ethernet on SFP only boards.
> >
> > Signed-off-by: Robert Marko <robert.marko at sartura.hr>
> > ---
> > Changes in v3:
> > * Check whether the SFP node is enabled
> >
> > Changes in v2:
> > * Parse the standard SFP node for TX disable GPIO instead of using a
> > custom property
> >
> >  drivers/net/mvneta.c | 12 ++++++++++++
> >  1 file changed, 12 insertions(+)
> >
> > diff --git a/drivers/net/mvneta.c b/drivers/net/mvneta.c
> > index 4a4268c2b2..edd818338c 100644
> > --- a/drivers/net/mvneta.c
> > +++ b/drivers/net/mvneta.c
> > @@ -286,6 +286,7 @@ struct mvneta_port {
> >       struct phy_device *phydev;
> >  #if CONFIG_IS_ENABLED(DM_GPIO)
> >       struct gpio_desc phy_reset_gpio;
> > +     struct gpio_desc sfp_tx_disable_gpio;
> >  #endif
> >       struct mii_dev *bus;
> >  };
> > @@ -1693,6 +1694,9 @@ static int mvneta_probe(struct udevice *dev)
> >  {
> >       struct eth_pdata *pdata = dev_get_plat(dev);
> >       struct mvneta_port *pp = dev_get_priv(dev);
> > +#if CONFIG_IS_ENABLED(DM_GPIO)
> > +     struct ofnode_phandle_args sfp_args;
> > +#endif
> >       void *blob = (void *)gd->fdt_blob;
> >       int node = dev_of_offset(dev);
> >       struct mii_dev *bus;
> > @@ -1767,6 +1771,11 @@ static int mvneta_probe(struct udevice *dev)
> >               return ret;
> >
> >  #if CONFIG_IS_ENABLED(DM_GPIO)
> > +     ret = dev_read_phandle_with_args(dev, "sfp", NULL, 0, 0, &sfp_args);
> > +     if (!ret && ofnode_is_enabled(sfp_args.node))
> > +             gpio_request_by_name_nodev(sfp_args.node, "tx-disable-gpio", 0,
> > +                                        &pp->sfp_tx_disable_gpio, GPIOD_IS_OUT);
> > +
> >       gpio_request_by_name(dev, "phy-reset-gpios", 0,
> >                            &pp->phy_reset_gpio, GPIOD_IS_OUT);
> >
> > @@ -1775,6 +1784,9 @@ static int mvneta_probe(struct udevice *dev)
> >               mdelay(10);
> >               dm_gpio_set_value(&pp->phy_reset_gpio, 0);
> >       }
> > +
> > +     if (dm_gpio_is_valid(&pp->sfp_tx_disable_gpio))
> > +             dm_gpio_set_value(&pp->sfp_tx_disable_gpio, 0);
> >  #endif
> >
> >       return board_network_enable(bus);
>
> Reviewed-by: Marek Behún <marek.behun at nic.cz>
>
> Robert, I am wondering if it would make sense to add driver .remove()
> method (and flag DM_FLAG_OS_PREPARE so that the .remove() method is
> called before booting kernel), and disable TX again in this method...

Hi,
It could be added as a follow up improvement, however the kernels SFP driver
will disable the TX as soon as it probes anyway and wait until the interface its
attached to is up to enable it again.

Regards,
Robert
>
> Marek



-- 
Robert Marko
Staff Embedded Linux Engineer
Sartura Ltd.
Lendavska ulica 16a
10000 Zagreb, Croatia
Email: robert.marko at sartura.hr
Web: www.sartura.hr


More information about the U-Boot mailing list