Message ID | E1ifpZs-0005kJ-Ll@rmk-PC.armlinux.org.uk |
---|---|
State | Accepted |
Delegated to: | David Miller |
Headers | show |
Series | improve clause 45 support in phylink | expand |
Hello Russell, On Fri, Dec 13, 2019 at 06:22:12PM +0000, Russell King wrote: > Fix up the mvpp2 validate implementation to adopt the same behaviour as > mvneta: > - only allow the link modes that the specified PHY interface mode > supports with the exception of 1000base-X and 2500base-X. > - use the basex helper to deal with SFP modules that can be switched > between 1000base-X vs 2500base-X. > > This gives consistent behaviour between mvneta and mvpp2. > > This commit depends on "net: phylink: extend clause 45 PHY validation > workaround" so is not marked for backporting to stable kernels. > > Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk> Acked-by: Antoine Tenart <antoine.tenart@bootlin.com> Thanks! Antoine > --- > .../net/ethernet/marvell/mvpp2/mvpp2_main.c | 22 +++++++++++++++---- > 1 file changed, 18 insertions(+), 4 deletions(-) > > diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c > index 111b3b8239e1..f09fcbe6ea88 100644 > --- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c > +++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c > @@ -4786,6 +4786,8 @@ static void mvpp2_phylink_validate(struct phylink_config *config, > phylink_set(mask, 10000baseER_Full); > phylink_set(mask, 10000baseKR_Full); > } > + if (state->interface != PHY_INTERFACE_MODE_NA) > + break; > /* Fall-through */ > case PHY_INTERFACE_MODE_RGMII: > case PHY_INTERFACE_MODE_RGMII_ID: > @@ -4796,13 +4798,23 @@ static void mvpp2_phylink_validate(struct phylink_config *config, > phylink_set(mask, 10baseT_Full); > phylink_set(mask, 100baseT_Half); > phylink_set(mask, 100baseT_Full); > + phylink_set(mask, 1000baseT_Full); > + phylink_set(mask, 1000baseX_Full); > + if (state->interface != PHY_INTERFACE_MODE_NA) > + break; > /* Fall-through */ > case PHY_INTERFACE_MODE_1000BASEX: > case PHY_INTERFACE_MODE_2500BASEX: > - phylink_set(mask, 1000baseT_Full); > - phylink_set(mask, 1000baseX_Full); > - phylink_set(mask, 2500baseT_Full); > - phylink_set(mask, 2500baseX_Full); > + if (port->comphy || > + state->interface != PHY_INTERFACE_MODE_2500BASEX) { > + phylink_set(mask, 1000baseT_Full); > + phylink_set(mask, 1000baseX_Full); > + } > + if (port->comphy || > + state->interface == PHY_INTERFACE_MODE_2500BASEX) { > + phylink_set(mask, 2500baseT_Full); > + phylink_set(mask, 2500baseX_Full); > + } > break; > default: > goto empty_set; > @@ -4811,6 +4823,8 @@ static void mvpp2_phylink_validate(struct phylink_config *config, > bitmap_and(supported, supported, mask, __ETHTOOL_LINK_MODE_MASK_NBITS); > bitmap_and(state->advertising, state->advertising, mask, > __ETHTOOL_LINK_MODE_MASK_NBITS); > + > + phylink_helper_basex_speed(state); > return; > > empty_set: > -- > 2.20.1 >
diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c index 111b3b8239e1..f09fcbe6ea88 100644 --- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c +++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c @@ -4786,6 +4786,8 @@ static void mvpp2_phylink_validate(struct phylink_config *config, phylink_set(mask, 10000baseER_Full); phylink_set(mask, 10000baseKR_Full); } + if (state->interface != PHY_INTERFACE_MODE_NA) + break; /* Fall-through */ case PHY_INTERFACE_MODE_RGMII: case PHY_INTERFACE_MODE_RGMII_ID: @@ -4796,13 +4798,23 @@ static void mvpp2_phylink_validate(struct phylink_config *config, phylink_set(mask, 10baseT_Full); phylink_set(mask, 100baseT_Half); phylink_set(mask, 100baseT_Full); + phylink_set(mask, 1000baseT_Full); + phylink_set(mask, 1000baseX_Full); + if (state->interface != PHY_INTERFACE_MODE_NA) + break; /* Fall-through */ case PHY_INTERFACE_MODE_1000BASEX: case PHY_INTERFACE_MODE_2500BASEX: - phylink_set(mask, 1000baseT_Full); - phylink_set(mask, 1000baseX_Full); - phylink_set(mask, 2500baseT_Full); - phylink_set(mask, 2500baseX_Full); + if (port->comphy || + state->interface != PHY_INTERFACE_MODE_2500BASEX) { + phylink_set(mask, 1000baseT_Full); + phylink_set(mask, 1000baseX_Full); + } + if (port->comphy || + state->interface == PHY_INTERFACE_MODE_2500BASEX) { + phylink_set(mask, 2500baseT_Full); + phylink_set(mask, 2500baseX_Full); + } break; default: goto empty_set; @@ -4811,6 +4823,8 @@ static void mvpp2_phylink_validate(struct phylink_config *config, bitmap_and(supported, supported, mask, __ETHTOOL_LINK_MODE_MASK_NBITS); bitmap_and(state->advertising, state->advertising, mask, __ETHTOOL_LINK_MODE_MASK_NBITS); + + phylink_helper_basex_speed(state); return; empty_set:
Fix up the mvpp2 validate implementation to adopt the same behaviour as mvneta: - only allow the link modes that the specified PHY interface mode supports with the exception of 1000base-X and 2500base-X. - use the basex helper to deal with SFP modules that can be switched between 1000base-X vs 2500base-X. This gives consistent behaviour between mvneta and mvpp2. This commit depends on "net: phylink: extend clause 45 PHY validation workaround" so is not marked for backporting to stable kernels. Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk> --- .../net/ethernet/marvell/mvpp2/mvpp2_main.c | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-)