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
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?
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!
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
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>
© 2016 - 2026 Red Hat, Inc.