[PATCH net v4 1/2] phy: mscc: Use PHY_ID_MATCH_MODEL for VSC8584, VSC8582, VSC8575, VSC856X

Horatiu Vultur posted 2 patches 3 months, 3 weeks ago
There is a newer version of this series
[PATCH net v4 1/2] phy: mscc: Use PHY_ID_MATCH_MODEL for VSC8584, VSC8582, VSC8575, VSC856X
Posted by Horatiu Vultur 3 months, 3 weeks ago
As the PHYs VSC8584, VSC8582, VSC8575 and VSC856X exists only as rev B,
we can use PHY_ID_MATCH_MODEL to match exactly on revision B of the PHY.
Because of this change then there is not need the check if it is a
different revision than rev B in the function vsc8584_probe() as we
already know that this will never happen.
These changes are a preparation for the next patch because in that patch
we will make the PHYs VSC8574 and VSC8572 to use vsc8584_probe() and
these PHYs have multiple revision.

Signed-off-by: Horatiu Vultur <horatiu.vultur@microchip.com>
---
 drivers/net/phy/mscc/mscc.h      |  8 ++++----
 drivers/net/phy/mscc/mscc_main.c | 23 ++++-------------------
 2 files changed, 8 insertions(+), 23 deletions(-)

diff --git a/drivers/net/phy/mscc/mscc.h b/drivers/net/phy/mscc/mscc.h
index 2d8eca54c40a2..2eef5956b9cc5 100644
--- a/drivers/net/phy/mscc/mscc.h
+++ b/drivers/net/phy/mscc/mscc.h
@@ -289,12 +289,12 @@ enum rgmii_clock_delay {
 #define PHY_ID_VSC8540			  0x00070760
 #define PHY_ID_VSC8541			  0x00070770
 #define PHY_ID_VSC8552			  0x000704e0
-#define PHY_ID_VSC856X			  0x000707e0
+#define PHY_ID_VSC856X			  0x000707e1
 #define PHY_ID_VSC8572			  0x000704d0
 #define PHY_ID_VSC8574			  0x000704a0
-#define PHY_ID_VSC8575			  0x000707d0
-#define PHY_ID_VSC8582			  0x000707b0
-#define PHY_ID_VSC8584			  0x000707c0
+#define PHY_ID_VSC8575			  0x000707d1
+#define PHY_ID_VSC8582			  0x000707b1
+#define PHY_ID_VSC8584			  0x000707c1
 #define PHY_VENDOR_MSCC			0x00070400
 
 #define MSCC_VDDMAC_1500		  1500
diff --git a/drivers/net/phy/mscc/mscc_main.c b/drivers/net/phy/mscc/mscc_main.c
index ef0ef1570d392..d05f6ed052ad0 100644
--- a/drivers/net/phy/mscc/mscc_main.c
+++ b/drivers/net/phy/mscc/mscc_main.c
@@ -1724,12 +1724,6 @@ static int vsc8584_config_init(struct phy_device *phydev)
 	 * in this pre-init function.
 	 */
 	if (phy_package_init_once(phydev)) {
-		/* The following switch statement assumes that the lowest
-		 * nibble of the phy_id_mask is always 0. This works because
-		 * the lowest nibble of the PHY_ID's below are also 0.
-		 */
-		WARN_ON(phydev->drv->phy_id_mask & 0xf);
-
 		switch (phydev->phy_id & phydev->drv->phy_id_mask) {
 		case PHY_ID_VSC8504:
 		case PHY_ID_VSC8552:
@@ -2290,11 +2284,6 @@ static int vsc8584_probe(struct phy_device *phydev)
 	   VSC8531_DUPLEX_COLLISION};
 	int ret;
 
-	if ((phydev->phy_id & MSCC_DEV_REV_MASK) != VSC8584_REVB) {
-		dev_err(&phydev->mdio.dev, "Only VSC8584 revB is supported.\n");
-		return -ENOTSUPP;
-	}
-
 	vsc8531 = devm_kzalloc(&phydev->mdio.dev, sizeof(*vsc8531), GFP_KERNEL);
 	if (!vsc8531)
 		return -ENOMEM;
@@ -2587,9 +2576,8 @@ static struct phy_driver vsc85xx_driver[] = {
 	.config_inband  = vsc85xx_config_inband,
 },
 {
-	.phy_id		= PHY_ID_VSC856X,
+	PHY_ID_MATCH_MODEL(PHY_ID_VSC856X),
 	.name		= "Microsemi GE VSC856X SyncE",
-	.phy_id_mask	= 0xfffffff0,
 	/* PHY_GBIT_FEATURES */
 	.soft_reset	= &genphy_soft_reset,
 	.config_init    = &vsc8584_config_init,
@@ -2667,9 +2655,8 @@ static struct phy_driver vsc85xx_driver[] = {
 	.config_inband  = vsc85xx_config_inband,
 },
 {
-	.phy_id		= PHY_ID_VSC8575,
+	PHY_ID_MATCH_MODEL(PHY_ID_VSC8575),
 	.name		= "Microsemi GE VSC8575 SyncE",
-	.phy_id_mask	= 0xfffffff0,
 	/* PHY_GBIT_FEATURES */
 	.soft_reset	= &genphy_soft_reset,
 	.config_init    = &vsc8584_config_init,
@@ -2693,9 +2680,8 @@ static struct phy_driver vsc85xx_driver[] = {
 	.config_inband  = vsc85xx_config_inband,
 },
 {
-	.phy_id		= PHY_ID_VSC8582,
+	PHY_ID_MATCH_MODEL(PHY_ID_VSC8582),
 	.name		= "Microsemi GE VSC8582 SyncE",
-	.phy_id_mask	= 0xfffffff0,
 	/* PHY_GBIT_FEATURES */
 	.soft_reset	= &genphy_soft_reset,
 	.config_init    = &vsc8584_config_init,
@@ -2719,9 +2705,8 @@ static struct phy_driver vsc85xx_driver[] = {
 	.config_inband  = vsc85xx_config_inband,
 },
 {
-	.phy_id		= PHY_ID_VSC8584,
+	PHY_ID_MATCH_MODEL(PHY_ID_VSC8584),
 	.name		= "Microsemi GE VSC8584 SyncE",
-	.phy_id_mask	= 0xfffffff0,
 	/* PHY_GBIT_FEATURES */
 	.soft_reset	= &genphy_soft_reset,
 	.config_init    = &vsc8584_config_init,
-- 
2.34.1
Re: [PATCH net v4 1/2] phy: mscc: Use PHY_ID_MATCH_MODEL for VSC8584, VSC8582, VSC8575, VSC856X
Posted by Jakub Kicinski 3 months, 2 weeks ago
On Fri, 17 Oct 2025 08:48:18 +0200 Horatiu Vultur wrote:
> -	if ((phydev->phy_id & MSCC_DEV_REV_MASK) != VSC8584_REVB) {

I think MSCC_DEV_REV_MASK is no longer used after this patch?
Re: [PATCH net v4 1/2] phy: mscc: Use PHY_ID_MATCH_MODEL for VSC8584, VSC8582, VSC8575, VSC856X
Posted by Russell King (Oracle) 3 months, 3 weeks ago
On Fri, Oct 17, 2025 at 08:48:18AM +0200, Horatiu Vultur wrote:
> As the PHYs VSC8584, VSC8582, VSC8575 and VSC856X exists only as rev B,
> we can use PHY_ID_MATCH_MODEL to match exactly on revision B of the PHY.

I don't follow this. PHY_ID_MATCH_MODEL() uses a mask of bits 31:4,
omitting the revision field. So that is equivalent to a .phy_id_mask
of 0xfffffff0, which is what the code already uses.

> Because of this change then there is not need the check if it is a
> different revision than rev B in the function vsc8584_probe() as we
> already know that this will never happen.

Since bits 3:0 are masked out, this statement seems to be false.

> @@ -2587,9 +2576,8 @@ static struct phy_driver vsc85xx_driver[] = {
>  	.config_inband  = vsc85xx_config_inband,
>  },
>  {
> -	.phy_id		= PHY_ID_VSC856X,
> +	PHY_ID_MATCH_MODEL(PHY_ID_VSC856X),
>  	.name		= "Microsemi GE VSC856X SyncE",
> -	.phy_id_mask	= 0xfffffff0,
>  	/* PHY_GBIT_FEATURES */
>  	.soft_reset	= &genphy_soft_reset,
>  	.config_init    = &vsc8584_config_init,
> @@ -2667,9 +2655,8 @@ static struct phy_driver vsc85xx_driver[] = {
>  	.config_inband  = vsc85xx_config_inband,
>  },
>  {
> -	.phy_id		= PHY_ID_VSC8575,
> +	PHY_ID_MATCH_MODEL(PHY_ID_VSC8575),
>  	.name		= "Microsemi GE VSC8575 SyncE",
> -	.phy_id_mask	= 0xfffffff0,
>  	/* PHY_GBIT_FEATURES */
>  	.soft_reset	= &genphy_soft_reset,
>  	.config_init    = &vsc8584_config_init,
> @@ -2693,9 +2680,8 @@ static struct phy_driver vsc85xx_driver[] = {
>  	.config_inband  = vsc85xx_config_inband,
>  },
>  {
> -	.phy_id		= PHY_ID_VSC8582,
> +	PHY_ID_MATCH_MODEL(PHY_ID_VSC8582),
>  	.name		= "Microsemi GE VSC8582 SyncE",
> -	.phy_id_mask	= 0xfffffff0,
>  	/* PHY_GBIT_FEATURES */
>  	.soft_reset	= &genphy_soft_reset,
>  	.config_init    = &vsc8584_config_init,
> @@ -2719,9 +2705,8 @@ static struct phy_driver vsc85xx_driver[] = {
>  	.config_inband  = vsc85xx_config_inband,
>  },
>  {
> -	.phy_id		= PHY_ID_VSC8584,
> +	PHY_ID_MATCH_MODEL(PHY_ID_VSC8584),
>  	.name		= "Microsemi GE VSC8584 SyncE",
> -	.phy_id_mask	= 0xfffffff0,
>  	/* PHY_GBIT_FEATURES */
>  	.soft_reset	= &genphy_soft_reset,
>  	.config_init    = &vsc8584_config_init,

Due to what I've said above, the above part of the patch is a cleanup,
and functionally is a no-op.

-- 
RMK's Patch system: https://www.armlinux.org.uk/developer/patches/
FTTP is here! 80Mbps down 10Mbps up. Decent connectivity at last!
Re: [PATCH net v4 1/2] phy: mscc: Use PHY_ID_MATCH_MODEL for VSC8584, VSC8582, VSC8575, VSC856X
Posted by Horatiu Vultur 3 months, 2 weeks ago
The 10/21/2025 10:09, Russell King (Oracle) wrote:

Hi,

> 
> On Fri, Oct 17, 2025 at 08:48:18AM +0200, Horatiu Vultur wrote:
> > As the PHYs VSC8584, VSC8582, VSC8575 and VSC856X exists only as rev B,
> > we can use PHY_ID_MATCH_MODEL to match exactly on revision B of the PHY.
> 
> I don't follow this. PHY_ID_MATCH_MODEL() uses a mask of bits 31:4,
> omitting the revision field. So that is equivalent to a .phy_id_mask
> of 0xfffffff0, which is what the code already uses.

I totally understand why you don't understand this as this is I made big
mistake!
I was supposed to use PHY_ID_MATCH_EXACT instead of PHY_ID_MATCH_MODEL.

> 
> > Because of this change then there is not need the check if it is a
> > different revision than rev B in the function vsc8584_probe() as we
> > already know that this will never happen.
> 
> Since bits 3:0 are masked out, this statement seems to be false.
> 
> > @@ -2587,9 +2576,8 @@ static struct phy_driver vsc85xx_driver[] = {
> >       .config_inband  = vsc85xx_config_inband,
> >  },
> >  {
> > -     .phy_id         = PHY_ID_VSC856X,
> > +     PHY_ID_MATCH_MODEL(PHY_ID_VSC856X),
> >       .name           = "Microsemi GE VSC856X SyncE",
> > -     .phy_id_mask    = 0xfffffff0,
> >       /* PHY_GBIT_FEATURES */
> >       .soft_reset     = &genphy_soft_reset,
> >       .config_init    = &vsc8584_config_init,
> > @@ -2667,9 +2655,8 @@ static struct phy_driver vsc85xx_driver[] = {
> >       .config_inband  = vsc85xx_config_inband,
> >  },
> >  {
> > -     .phy_id         = PHY_ID_VSC8575,
> > +     PHY_ID_MATCH_MODEL(PHY_ID_VSC8575),
> >       .name           = "Microsemi GE VSC8575 SyncE",
> > -     .phy_id_mask    = 0xfffffff0,
> >       /* PHY_GBIT_FEATURES */
> >       .soft_reset     = &genphy_soft_reset,
> >       .config_init    = &vsc8584_config_init,
> > @@ -2693,9 +2680,8 @@ static struct phy_driver vsc85xx_driver[] = {
> >       .config_inband  = vsc85xx_config_inband,
> >  },
> >  {
> > -     .phy_id         = PHY_ID_VSC8582,
> > +     PHY_ID_MATCH_MODEL(PHY_ID_VSC8582),
> >       .name           = "Microsemi GE VSC8582 SyncE",
> > -     .phy_id_mask    = 0xfffffff0,
> >       /* PHY_GBIT_FEATURES */
> >       .soft_reset     = &genphy_soft_reset,
> >       .config_init    = &vsc8584_config_init,
> > @@ -2719,9 +2705,8 @@ static struct phy_driver vsc85xx_driver[] = {
> >       .config_inband  = vsc85xx_config_inband,
> >  },
> >  {
> > -     .phy_id         = PHY_ID_VSC8584,
> > +     PHY_ID_MATCH_MODEL(PHY_ID_VSC8584),
> >       .name           = "Microsemi GE VSC8584 SyncE",
> > -     .phy_id_mask    = 0xfffffff0,
> >       /* PHY_GBIT_FEATURES */
> >       .soft_reset     = &genphy_soft_reset,
> >       .config_init    = &vsc8584_config_init,
> 
> Due to what I've said above, the above part of the patch is a cleanup,
> and functionally is a no-op.
> 
> --
> RMK's Patch system: https://www.armlinux.org.uk/developer/patches/
> FTTP is here! 80Mbps down 10Mbps up. Decent connectivity at last!

-- 
/Horatiu
Re: [PATCH net v4 1/2] phy: mscc: Use PHY_ID_MATCH_MODEL for VSC8584, VSC8582, VSC8575, VSC856X
Posted by Maxime Chevallier 3 months, 3 weeks ago
Hi Horatiu,

On 17/10/2025 08:48, Horatiu Vultur wrote:
> As the PHYs VSC8584, VSC8582, VSC8575 and VSC856X exists only as rev B,
> we can use PHY_ID_MATCH_MODEL to match exactly on revision B of the PHY.
> Because of this change then there is not need the check if it is a
> different revision than rev B in the function vsc8584_probe() as we
> already know that this will never happen.
> These changes are a preparation for the next patch because in that patch
> we will make the PHYs VSC8574 and VSC8572 to use vsc8584_probe() and
> these PHYs have multiple revision.
> 
> Signed-off-by: Horatiu Vultur <horatiu.vultur@microchip.com>

Reviewed-by: Maxime Chevallier <maxime.chevallier@bootlin.com>