linux/drivers/net/phy
Vladimir Oltean bba238ed03 net: phy: continue searching for C45 MMDs even if first returned ffff:ffff
At the time of introduction, in commit bdeced75b1 ("net: dsa: felix:
Add PCS operations for PHYLINK"), support for the Lynx PCS inside Felix
was relying, for USXGMII support, on the fact that get_phy_device() is
able to parse the Lynx PCS "device-in-package" registers for this C45
MDIO device and identify it correctly.

However, this was actually working somewhat by mistake (in the sense
that, even though it was detected, it was detected for the wrong
reasons).

The get_phy_c45_ids() function works by iterating through all MMDs
starting from 1 (MDIO_MMD_PMAPMD) and stops at the first one which
returns a non-zero value in the "device-in-package" register pair,
proceeding to see what that non-zero value is.

For the Felix PCS, the first MMD (1, for the PMA/PMD) returns a non-zero
value of 0xffffffff in the "device-in-package" registers. There is a
code branch which is supposed to treat this case and flag it as wrong,
and normally, this would have caught my attention when adding initial
support for this PCS:

	if ((devs_in_pkg & 0x1fffffff) == 0x1fffffff) {
		/* If mostly Fs, there is no device there, then let's probe
		 * MMD 0, as some 10G PHYs have zero Devices In package,
		 * e.g. Cortina CS4315/CS4340 PHY.
		 */

However, this code never actually kicked in, it seems, because this
snippet from get_phy_c45_devs_in_pkg() was basically sabotaging itself,
by returning 0xfffffffe instead of 0xffffffff:

	/* Bit 0 doesn't represent a device, it indicates c22 regs presence */
	*devices_in_package &= ~BIT(0);

Then the rest of the code just carried on thinking "ok, MMD 1 (PMA/PMD)
says that there are 31 devices in that package, each having a device id
of ffff:ffff, that's perfectly fine, let's go ahead and probe this PHY
device".

But after cleanup commit 320ed3bf90 ("net: phy: split
devices_in_package"), this got "fixed", and now devs_in_pkg is no longer
0xfffffffe, but 0xffffffff. So now, get_phy_device is returning -ENODEV
for the Lynx PCS, because the semantics have remained mostly unchanged:
the loop stops at the first MMD that returns a non-zero value, and that
is MMD 1.

But the Lynx PCS is simply a clause 37 PCS which implements the required
MAC-side functionality for USXGMII (when operated in C45 mode, which is
where C45 devices-in-package detection is relevant to). Of course it
will fail the PMD/PMA test (MMD 1), since it is not a PHY. But it does
implement detection for MDIO_MMD_PCS (3):

- MDIO_DEVS1=0x008a, MDIO_DEVS2=0x0000,
- MDIO_DEVID1=0x0083, MDIO_DEVID2=0xe400

Let get_phy_c45_ids() continue searching for valid MMDs, and don't
assume that every phy_device has a PMA/PMD MMD implemented.

Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
2020-07-17 10:22:50 -07:00
..
mscc net: phy: mscc: fix ptr_ret.cocci warnings 2020-07-09 13:09:51 -07:00
adin.c net: phy: Fixup parameters in kerneldoc 2020-07-07 12:47:10 -07:00
amd.c
aquantia_hwmon.c
aquantia_main.c net: phy: aquantia: use phy_read_mmd_poll_timeout() to simplify the code 2020-03-23 22:00:02 -07:00
aquantia.h
at803x.c net: phy: at803x: Avoid comparison is always false warning 2020-07-07 12:47:10 -07:00
ax88796b.c
bcm7xxx.c net: phy: bcm7xx: add jumbo frame configuration to PHY 2020-03-27 16:07:24 -07:00
bcm63xx.c
bcm87xx.c net: mdiobus: add clause 45 mdiobus accessors 2020-05-26 15:31:45 -07:00
bcm54140.c net: phy: bcm54140: add cable diagnostics support 2020-05-13 12:52:39 -07:00
bcm84881.c net: phy: bcm84881: clear settings on link down 2020-04-23 15:55:35 -07:00
bcm-cygnus.c
bcm-phy-lib.c net: phy: broadcom: don't export RDB/legacy access methods 2020-06-01 12:02:57 -07:00
bcm-phy-lib.h net: phy: broadcom: add cable test support 2020-05-13 12:52:38 -07:00
broadcom.c net: phy: broadcom: fix checkpatch complains about tabs 2020-05-16 13:38:33 -07:00
cicada.c
cortina.c net: mdiobus: add clause 45 mdiobus accessors 2020-05-26 15:31:45 -07:00
davicom.c
dp83tc811.c net: phy: DP83TC811: Fix WoL in config init to be disabled 2020-05-01 15:23:44 -07:00
dp83640_reg.h
dp83640.c net: phy: dp83640: Fixup cast to restricted __be16 warning 2020-07-07 12:47:11 -07:00
dp83822.c net: phy: DP83822: Add setting the fixed internal delay 2020-06-25 16:05:21 -07:00
dp83848.c
dp83867.c net: dp83867: Fix OF_MDIO config check 2020-06-05 13:15:22 -07:00
dp83869.c net: dp83869: Add RGMII internal delay configuration 2020-06-25 16:05:21 -07:00
et1011c.c
fixed_phy.c net: phy: fixed_phy: Remove unused seqcount 2020-06-04 15:50:42 -07:00
icplus.c
intel-xway.c
Kconfig net: phy: fix mdio-mscc-miim build 2020-07-13 17:29:19 -07:00
linkmode.c
lxt.c
Makefile net: phy: add a Kconfig option for mdio_devres 2020-07-07 15:37:02 -07:00
marvell10g.c net: phy: marvell10g: support XFI rate matching mode 2020-06-29 17:24:31 -07:00
marvell.c net: phy: marvell: Add Marvell 88E1548P support 2020-06-22 16:28:34 -07:00
mdio_bus.c net: phy: don't abuse devres in devm_mdiobus_register() 2020-06-30 15:57:34 -07:00
mdio_device.c net: phy: Fixup parameters in kerneldoc 2020-07-07 12:47:10 -07:00
mdio_devres.c of: mdio: provide devm_of_mdiobus_register() 2020-06-30 15:57:34 -07:00
mdio-aspeed.c
mdio-bcm-iproc.c net: phy: Make iproc_mdio_resume static 2020-05-07 12:55:29 -07:00
mdio-bcm-unimac.c net: phy: mdio-bcm-unimac: Fix clock handling 2020-03-24 16:45:32 -07:00
mdio-bitbang.c
mdio-boardinfo.c net: phy: Fixup parameters in kerneldoc 2020-07-07 12:47:10 -07:00
mdio-boardinfo.h
mdio-cavium.c
mdio-cavium.h net: phy: cavium: Improve __iomem mess 2020-07-07 12:47:11 -07:00
mdio-gpio.c
mdio-hisi-femac.c
mdio-i2c.c
mdio-i2c.h
mdio-ipq4019.c net: phy: mdio: add IPQ4019 MDIO driver 2020-04-30 12:11:14 -07:00
mdio-ipq8064.c
mdio-moxart.c net: phy: mdio-moxart: remove unneeded include 2020-05-14 17:58:46 -07:00
mdio-mscc-miim.c net: phy: mscc-miim: read poll when high resolution timers are disabled 2020-05-26 15:33:56 -07:00
mdio-mux-bcm-iproc.c Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2020-03-25 18:58:11 -07:00
mdio-mux-gpio.c
mdio-mux-meson-g12a.c
mdio-mux-mmioreg.c
mdio-mux-multiplexer.c
mdio-mux.c
mdio-mvusb.c net: phy: add marvell usb to mdio controller 2020-03-26 19:49:34 -07:00
mdio-octeon.c net: phy: mdio-octeon: Cleanup module loading dependencies 2020-07-07 12:47:11 -07:00
mdio-sun4i.c
mdio-thunder.c net: phy: cavium: Improve __iomem mess 2020-07-07 12:47:11 -07:00
mdio-xgene.c
mdio-xgene.h
mdio-xpcs.c net: phy: xpcs: Restart AutoNeg if outcome was invalid 2020-03-23 21:01:58 -07:00
meson-gxl.c
micrel.c net: phy: micrel: add phy-mode support for the KSZ9031 PHY 2020-04-22 19:38:46 -07:00
microchip_t1.c net: phy: microchip_t1: add lan87xx_phy_init to initialize the lan87xx phy. 2020-04-22 11:38:58 -07:00
microchip.c
mii_timestamper.c
national.c
nxp-tja11xx.c net: ethtool: Add generic parts of cable test TDR 2020-05-26 23:21:48 -07:00
phy_device.c net: phy: continue searching for C45 MMDs even if first returned ffff:ffff 2020-07-17 10:22:50 -07:00
phy_led_triggers.c
phy-c45.c net: phy: split devices_in_package 2020-06-19 20:17:15 -07:00
phy-core.c ethtool: Add support for 100Gbps per lane link modes 2020-07-08 15:30:42 -07:00
phy.c net: phy: Uninline PHY ethtool statistics operations 2020-07-08 12:39:05 -07:00
phylink.c Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net 2020-06-25 19:29:51 -07:00
qsemi.c
realtek.c net: phy: realtek: add support for RTL8125B-internal PHY 2020-07-14 15:07:16 -07:00
rockchip.c
sfp-bus.c net: phy: sfp-bus.c: get rid of docs warnings 2020-03-17 23:39:29 -07:00
sfp.c net: sfp: add error checking with sfp_irq_name 2020-07-07 15:51:08 -07:00
sfp.h
smsc.c net: phy: smsc: fix printing too many logs 2020-06-22 16:08:48 -07:00
spi_ks8995.c
ste10Xp.c
swphy.c Update rmk's email address in various drivers 2020-04-21 17:50:09 +01:00
swphy.h
teranetics.c net: phy: remove genphy_no_soft_reset 2020-04-24 16:47:51 -07:00
uPD60620.c
vitesse.c
xilinx_gmii2rgmii.c