Re: [PATCH v4 net-next 3/8] net: phy: bcm84881: move the in-band capability check where it belongs
From: "Russell King (Oracle)" <linux@armlinux.org.uk>
Date: 2022-11-22 11:21:24
On Tue, Nov 22, 2022 at 09:38:43AM +0000, Russell King (Oracle) wrote:
Also, if we get the Marvell driver implementing validate_an_inband() then I believe we can get rid of other parts of this patch - 88E1111 is the commonly used accessible PHY on gigabit SFPs, as this PHY implements I2C access natively. As I mentioned, Marvell PHYs can be set to no inband, requiring inband, or inband with bypass mode enabled. So we need to decide how we deal with that - especially if we're going to be changing the mode from 1000base-X to SGMII (which we do on some SFP modules so they work at 10/100/1000.)
For the Marvell 88E1111:
- If switching into 1000base-X mode, then bypass mode is enabled by
m88e1111_config_init_1000basex(). However, if AN is disabled in the
fibre page BMCR (e.g. by firmware), then AN won't be used.
- If switching into SGMII mode, then bypass mode is left however it was
originally set by m88e1111_config_init_sgmii() - so it may be allowed
or it may be disallowed, which means it's whatever the hardware
defaulted to or firmware set it as.
For the 88e151x (x=0,2,8) it looks like bypass mode defaults to being
allowed on hardware reset, but firmware may change that.
I don't think we make much of an effort to configure other Marvell
PHYs, relying on their hardware reset defaults or firmware to set
them appropriately.
So, I think for 88e151x, we should implement something like:
int mode, bmcr, fscr2;
/* RGMII too? I believe RGMII can signal inband as well, so we
* may need to handle that as well.
*/
if (interface != PHY_INTERFACE_MODE_SGMII &&
interface != PHY_INTERFACE_MODE_1000BASE_X)
return PHY_AN_INBAND_UNKNOWN;
bmcr = phy_read_paged(phydev, MII_MARVELL_FIBER_PAGE, MII_BMCR);
if (bmcr < 0)
return SOME_ERROR?
mode = PHY_AN_INBAND_OFF;
if (bmcr & BMCR_ANENABLE) {
mode = PHY_AN_INBAND_ON;
fscr2 = phy_read_paged(phydev, MII_MARVELL_FIBER_PAGE,
0x1a);
if (fscr2 & BIT(6))
mode |= PHY_AN_INBAND_TIMEOUT;
}
return mode;
Obviously adding register definitions for BIT(6) and 01a.
For the 88E1111:
int mode, hwcfg;
/* If operating in 1000base-X mode, we always turn on inband
* and allow bypass.
*/
if (interface == PHY_INTERFACE_MODE_1000BASEX)
return PHY_AN_INBAND_ON | PHY_AN_INBAND_TIMEOUT;
if (interface == PHY_INTERFACE_MODE_SGMII) {
hwcfg = phy_read(phydev, MII_M1111_PHY_EXT_SR);
if (hwcfg < 0)
return SOME_ERROR?
mode = PHY_AN_INBAND_ON;
if (hwcfg & MII_M1111_HWCFG_SERIAL_AN_BYPASS)
mode |= PHY_AN_INBAND_TIMEOUT;
return mode;
}
return PHY_AN_INBAND_UNKNOWN;
Maybe?
--
RMK's Patch system: https://www.armlinux.org.uk/developer/patches/
FTTP is here! 40Mbps down 10Mbps up. Decent connectivity at last!