On Mon, 12 Apr 2021 15:16:59 +0300 Ivan Bornyakov <i.bornya...@metrotek.ru> wrote:
> Some SFP modules uses RX_LOS for link indication. In such cases link > will be always up, even without cable connected. RX_LOS changes will > trigger link_up()/link_down() upstream operations. Thus, check that SFP > link is operational before actual read link status. > > Signed-off-by: Ivan Bornyakov <i.bornya...@metrotek.ru> > --- > drivers/net/phy/marvell-88x2222.c | 26 ++++++++++++++++++++++++++ > 1 file changed, 26 insertions(+) > > diff --git a/drivers/net/phy/marvell-88x2222.c > b/drivers/net/phy/marvell-88x2222.c > index eca8c2f20684..fb285ac741b2 100644 > --- a/drivers/net/phy/marvell-88x2222.c > +++ b/drivers/net/phy/marvell-88x2222.c > @@ -51,6 +51,7 @@ > struct mv2222_data { > phy_interface_t line_interface; > __ETHTOOL_DECLARE_LINK_MODE_MASK(supported); > + bool sfp_link; > }; > > /* SFI PMA transmit enable */ > @@ -148,6 +149,9 @@ static int mv2222_read_status(struct phy_device *phydev) > phydev->speed = SPEED_UNKNOWN; > phydev->duplex = DUPLEX_UNKNOWN; > > + if (!priv->sfp_link) > + return 0; > + So if SFP is not used at all, if this PHY is used in a different usecase, this function will always return 0? Is this correct? > if (priv->line_interface == PHY_INTERFACE_MODE_10GBASER) > link = mv2222_read_status_10g(phydev); > else > @@ -446,9 +450,31 @@ static void mv2222_sfp_remove(void *upstream) > linkmode_zero(priv->supported); > } > > +static void mv2222_sfp_link_up(void *upstream) > +{ > + struct phy_device *phydev = upstream; > + struct mv2222_data *priv; > + > + priv = (struct mv2222_data *)phydev->priv; > + > + priv->sfp_link = true; > +} > + > +static void mv2222_sfp_link_down(void *upstream) > +{ > + struct phy_device *phydev = upstream; > + struct mv2222_data *priv; > + > + priv = (struct mv2222_data *)phydev->priv; This cast is redundant since the phydev->priv is (void*). You can cast (void*) to (struct ... *). You can also just use struct mv2222_data *priv = phydev->priv; > + > + priv->sfp_link = false; > +} > + > static const struct sfp_upstream_ops sfp_phy_ops = { > .module_insert = mv2222_sfp_insert, > .module_remove = mv2222_sfp_remove, > + .link_up = mv2222_sfp_link_up, > + .link_down = mv2222_sfp_link_down, > .attach = phy_sfp_attach, > .detach = phy_sfp_detach, > };