On Tue, Apr 30, 2024 at 12:45:46AM +0100, Daniel Golle wrote: > The MDIO address of the MT7530 and MT7531 switch ICs can be configured > using bootstrap pins. However, there are only 4 possible options for the > switch itself: 7, 15, 23 and 31 (ie. only 3 and 4 can be configured, bit > 0~2 are always 111). Practically all boards known as of today use the > default setting which is to have the switch respond to address 31, while > the built-in switch PHYs respond to address 0~4 in this case. > > However, even in MediaTek's SDK the address of the switch is wrongly > stated in the device trees as 0 (while in reality it is 31), so warn the > user about such broken device tree and make a good guess what was > actually intended. > > This is imporant to not break compatibility with older Device Trees as > with commit 868ff5f4944a ("net: dsa: mt7530-mdio: read PHY address of > switch from device tree") the address in device tree will be taken into > account. Doing so instead of assuming the switch is always at > address 31 which was previously hard-coded will obviously break things > for many existing downstream device trees as they contain the wrong > address (0) which previously didn't matter. > > Fixes: b8f126a8d543 ("net-next: dsa: add dsa support for Mediatek MT7530 switch") > Signed-off-by: Daniel Golle <daniel@xxxxxxxxxxxxxx> > --- > drivers/net/dsa/mt7530-mdio.c | 13 +++++++++++++ > 1 file changed, 13 insertions(+) > > diff --git a/drivers/net/dsa/mt7530-mdio.c b/drivers/net/dsa/mt7530-mdio.c > index fa3ee85a99c1..119630fd9060 100644 > --- a/drivers/net/dsa/mt7530-mdio.c > +++ b/drivers/net/dsa/mt7530-mdio.c > @@ -193,6 +193,19 @@ mt7530_probe(struct mdio_device *mdiodev) > return PTR_ERR(priv->io_pwr); > } > > + /* Only MDIO bus address 7, 15, 23 and 31 are valid options */ > + if (~(priv->mdiodev->addr & 0x7) & 0x7) { > + /* If the address in DT must be wrong, make a good guess about > + * the most likely intention, and issue a warning. > + */ > + int correct_addr = ((((priv->mdiodev->addr - 7) & ~0x7) % 0x20) + 7) & 0x1f; > + > + dev_warn(&mdiodev->dev, > + "impossible switch MDIO address in device tree: %d, assuming %d\n", > + priv->mdiodev->addr, correct_addr); You could include FW_WARN in this, to indicate this is a firmware issue. It is not used too much with DT, since it was originally intended for ACPI issues, but a few ARM systems use it with DT. Andrew