net: dsa: mxl-gsw1xx: validate chip ID
No check for actually present hardware is being performed in the probe function of the mxl-gsw1xx switch driver. So even if the switch isn't present at the configured MDIO bus address the driver wrongly tells the user that a "GSWIP version 0 mod 0" was found, outputting errors about PHY capabilities not matching. Read and validate the chip MANU_ID and PNUM_ID registers and output information while probing, but return an error and abort probing in case the hardware is not actually present. Signed-off-by: Daniel Golle <daniel@makrotopia.org> Link: https://patch.msgid.link/3194d3d3bb0b51f08755d392e1fdf7bb6dc49608.1769916962.git.daniel@makrotopia.org Reviewed-by: Vladimir Oltean <olteanv@gmail.com> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
parent
ffd034ac09
commit
a046d6fc54
|
|
@ -688,7 +688,9 @@ static int gsw1xx_probe(struct mdio_device *mdiodev)
|
|||
{
|
||||
struct device *dev = &mdiodev->dev;
|
||||
struct gsw1xx_priv *priv;
|
||||
u32 version;
|
||||
u32 version, val;
|
||||
u8 shellver;
|
||||
u16 pnum;
|
||||
int ret;
|
||||
|
||||
priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
|
||||
|
|
@ -736,6 +738,27 @@ static int gsw1xx_probe(struct mdio_device *mdiodev)
|
|||
if (IS_ERR(priv->shell))
|
||||
return PTR_ERR(priv->shell);
|
||||
|
||||
ret = regmap_read(priv->shell, GSW1XX_SHELL_MANU_ID, &val);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
/* validate chip ID */
|
||||
if (FIELD_GET(GSW1XX_SHELL_MANU_ID_FIX1, val) != 1)
|
||||
return -ENODEV;
|
||||
|
||||
if (FIELD_GET(GSW1XX_SHELL_MANU_ID_MANID, val) !=
|
||||
GSW1XX_SHELL_MANU_ID_MANID_VAL)
|
||||
return -ENODEV;
|
||||
|
||||
pnum = FIELD_GET(GSW1XX_SHELL_MANU_ID_PNUML, val);
|
||||
|
||||
ret = regmap_read(priv->shell, GSW1XX_SHELL_PNUM_ID, &val);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
pnum |= FIELD_GET(GSW1XX_SHELL_PNUM_ID_PNUMM, val) << 4;
|
||||
shellver = FIELD_GET(GSW1XX_SHELL_PNUM_ID_VER, val);
|
||||
|
||||
ret = gsw1xx_serdes_pcs_init(priv);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
|
@ -756,6 +779,8 @@ static int gsw1xx_probe(struct mdio_device *mdiodev)
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
dev_info(dev, "standalone switch part number 0x%x v1.%u\n", pnum, shellver);
|
||||
|
||||
dev_set_drvdata(dev, &priv->gswip);
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -110,6 +110,15 @@
|
|||
#define GSW1XX_SHELL_BASE 0xfa00
|
||||
#define GSW1XX_SHELL_RST_REQ 0x01
|
||||
#define GSW1XX_RST_REQ_SGMII_SHELL BIT(5)
|
||||
#define GSW1XX_SHELL_MANU_ID 0x10
|
||||
#define GSW1XX_SHELL_MANU_ID_PNUML GENMASK(15, 12)
|
||||
#define GSW1XX_SHELL_MANU_ID_MANID GENMASK(11, 1)
|
||||
#define GSW1XX_SHELL_MANU_ID_MANID_VAL 0x389
|
||||
#define GSW1XX_SHELL_MANU_ID_FIX1 BIT(0)
|
||||
#define GSW1XX_SHELL_PNUM_ID 0x11
|
||||
#define GSW1XX_SHELL_PNUM_ID_VER GENMASK(15, 12)
|
||||
#define GSW1XX_SHELL_PNUM_ID_PNUMM GENMASK(11, 0)
|
||||
|
||||
/* RGMII PAD Slew Control Register */
|
||||
#define GSW1XX_SHELL_RGMII_SLEW_CFG 0x78
|
||||
#define RGMII_SLEW_CFG_DRV_TXC BIT(2)
|
||||
|
|
|
|||
Loading…
Reference in New Issue