net: phy: avoid matching all-ones clause 45 PHY IDs
authorRussell King <rmk+kernel@armlinux.org.uk>
Fri, 15 Nov 2019 20:08:37 +0000 (20:08 +0000)
committerDavid S. Miller <davem@davemloft.net>
Tue, 19 Nov 2019 00:58:13 +0000 (16:58 -0800)
commitb95e86d846b63b02ecdc94802ddbeaf9005fb6d9
tree37e46bd3f4696753da2954497cb02ea5302da22a
parente64dbb1ac078f04b21e980e0ea0e81eafba618e1
net: phy: avoid matching all-ones clause 45 PHY IDs

We currently match clause 45 PHYs using any ID read from a MMD marked
as present in the "Devices in package" registers 5 and 6.  However,
this is incorrect.  45.2 says:

  "The definition of the term package is vendor specific and could be
   a chip, module, or other similar entity."

so a package could be more or less than the whole PHY - a PHY could be
made up of several modules instantiated onto a single chip such as the
Marvell 88x3310, or some of the MMDs could be disabled according to
chip configuration, such as the Broadcom 84881.

In the case of Broadcom 84881, the "Devices in package" registers
contain 0xc000009b, meaning that there is a PHYXS present in the
package, but all registers in MMD 4 return 0xffff.  This leads to our
matching code incorrectly binding this PHY to one of our generic PHY
drivers.

This patch changes the way we determine whether to attempt to match a
MMD identifier, or use it to request a module - if the identifier is
all-ones, then we skip over it. When reading the identifiers, we
initialise phydev->c45_ids.device_ids to all-ones, only reading the
device ID if the "Devices in package" registers indicates we should.

This avoids the generic drivers incorrectly matching on a PHY ID of
0xffffffff.

Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/phy/phy_device.c