2023-05-11 12:19:17

by Harini Katakam

[permalink] [raw]
Subject: [PATCH net-next v3 0/3] Add support for VSC8531_02 PHY and DT RGMII tuning

Add support for VSC8531_02 PHY ID.
Also provide an option to change RGMII delay value via devicetree.

v3 changes:
- Remove patch 2/3 from v2 as custom mscc properties dont need to be
defined. rx-internal-delay-ps and tx-internal-delay-ps can be used.
- Change RGMII delay precedence as advised by Vladimir:
phy-mode rgmii rgmii-rxid/rgmii-id
--------------------------------------------------------------------------------------------
rx-internal-delay-ps absent 0.2 ns 2 ns
rx-internal-delay-ps present follow rx-internal-delay-ps follow rx-internal-delay-ps
- Split VSC8531-02 and RGMII delay config into separate patches.
- Correct vendor ID
- Update commit description and subject everywhere to say RGMII delays
instead of RGMII tuning.

v2 changes:
- Added patch to use a common vendor phy id match
- Removed dt include header patch because delays should be specied in
ps, not register values
- Updated DT binding description and commit for optional delay tuning to
be clearer on the precedence
- Updated dt property name to include vendor instead of phy device name
- Switch both VSC8531 and VSC8531-02 to use exact phy id match as they
share the same model number
- Ensure RCT
- Improve optional property read


Harini Katakam (3):
phy: mscc: Use PHY_ID_MATCH_VENDOR to minimize PHY ID table
phy: mscc: Add support for RGMII delay configuration
phy: mscc: Add support for VSC8531_02

drivers/net/phy/mscc/mscc.h | 4 ++
drivers/net/phy/mscc/mscc_main.c | 75 ++++++++++++++++++++++----------
2 files changed, 57 insertions(+), 22 deletions(-)

--
2.17.1



2023-05-11 12:21:24

by Harini Katakam

[permalink] [raw]
Subject: [PATCH net-next v3 2/3] phy: mscc: Add support for RGMII delay configuration

Add support for optional rx/tx-internal-delay-ps from devicetree.
- When rx/tx-internal-delay-ps is/are specified, these take priority
- When either is absent,
1) use 2ns for respective settings if rgmii-id/rxid/txid is/are present
2) use 0.2ns for respective settings if mode is rgmii

Signed-off-by: Harini Katakam <[email protected]>
---
v3 - Patch split:
- Use rx/tx-internal-delay-ps with phy_get_internal_delay
- Change RGMII delay selection precedence
- Update commit description and subject everywhere to say RGMII delays
instead of RGMII tuning.

drivers/net/phy/mscc/mscc.h | 2 ++
drivers/net/phy/mscc/mscc_main.c | 35 +++++++++++++++++++++++++-------
2 files changed, 30 insertions(+), 7 deletions(-)

diff --git a/drivers/net/phy/mscc/mscc.h b/drivers/net/phy/mscc/mscc.h
index 9acee8759105..ab6c0b7c2136 100644
--- a/drivers/net/phy/mscc/mscc.h
+++ b/drivers/net/phy/mscc/mscc.h
@@ -374,6 +374,8 @@ struct vsc8531_private {
* package.
*/
unsigned int base_addr;
+ u32 rx_delay;
+ u32 tx_delay;

#if IS_ENABLED(CONFIG_MACSEC)
/* MACsec fields:
diff --git a/drivers/net/phy/mscc/mscc_main.c b/drivers/net/phy/mscc/mscc_main.c
index 91010524e03d..9e856231e464 100644
--- a/drivers/net/phy/mscc/mscc_main.c
+++ b/drivers/net/phy/mscc/mscc_main.c
@@ -525,17 +525,14 @@ static int vsc85xx_rgmii_set_skews(struct phy_device *phydev, u32 rgmii_cntl,
{
u16 rgmii_rx_delay_pos = ffs(rgmii_rx_delay_mask) - 1;
u16 rgmii_tx_delay_pos = ffs(rgmii_tx_delay_mask) - 1;
+ struct vsc8531_private *vsc8531 = phydev->priv;
u16 reg_val = 0;
int rc;

mutex_lock(&phydev->lock);

- if (phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID ||
- phydev->interface == PHY_INTERFACE_MODE_RGMII_ID)
- reg_val |= RGMII_CLK_DELAY_2_0_NS << rgmii_rx_delay_pos;
- if (phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID ||
- phydev->interface == PHY_INTERFACE_MODE_RGMII_ID)
- reg_val |= RGMII_CLK_DELAY_2_0_NS << rgmii_tx_delay_pos;
+ reg_val |= vsc8531->rx_delay << rgmii_rx_delay_pos;
+ reg_val |= vsc8531->tx_delay << rgmii_tx_delay_pos;

rc = phy_modify_paged(phydev, MSCC_PHY_PAGE_EXTENDED_2,
rgmii_cntl,
@@ -1808,10 +1805,34 @@ static irqreturn_t vsc8584_handle_interrupt(struct phy_device *phydev)
return IRQ_HANDLED;
}

+static const int vsc8531_internal_delay[] = {200, 800, 1100, 1700, 2000, 2300,
+ 2600, 3400};
static int vsc85xx_config_init(struct phy_device *phydev)
{
- int rc, i, phy_id;
+ int delay_size = ARRAY_SIZE(vsc8531_internal_delay);
struct vsc8531_private *vsc8531 = phydev->priv;
+ struct device *dev = &phydev->mdio.dev;
+ int rc, i, phy_id;
+
+ vsc8531->rx_delay = phy_get_internal_delay(phydev, dev, &vsc8531_internal_delay[0],
+ delay_size, true);
+ if (vsc8531->rx_delay < 0) {
+ if (phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID ||
+ phydev->interface == PHY_INTERFACE_MODE_RGMII_ID)
+ vsc8531->rx_delay = RGMII_CLK_DELAY_2_0_NS;
+ else
+ vsc8531->rx_delay = RGMII_CLK_DELAY_0_2_NS;
+ }
+
+ vsc8531->tx_delay = phy_get_internal_delay(phydev, dev, &vsc8531_internal_delay[0],
+ delay_size, false);
+ if (vsc8531->tx_delay < 0) {
+ if (phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID ||
+ phydev->interface == PHY_INTERFACE_MODE_RGMII_ID)
+ vsc8531->rx_delay = RGMII_CLK_DELAY_2_0_NS;
+ else
+ vsc8531->rx_delay = RGMII_CLK_DELAY_0_2_NS;
+ }

rc = vsc85xx_default_config(phydev);
if (rc)
--
2.17.1


2023-05-11 12:33:09

by Harini Katakam

[permalink] [raw]
Subject: [PATCH net-next v3 3/3] phy: mscc: Add support for VSC8531_02

Add support for VSC8531_02 (Rev 2) device. Use exact PHY ID match.

Signed-off-by: Harini Katakam <[email protected]>
---
v3 - Patch split

drivers/net/phy/mscc/mscc.h | 1 +
drivers/net/phy/mscc/mscc_main.c | 26 ++++++++++++++++++++++++--
2 files changed, 25 insertions(+), 2 deletions(-)

diff --git a/drivers/net/phy/mscc/mscc.h b/drivers/net/phy/mscc/mscc.h
index ab6c0b7c2136..6a0521ff61d2 100644
--- a/drivers/net/phy/mscc/mscc.h
+++ b/drivers/net/phy/mscc/mscc.h
@@ -281,6 +281,7 @@ enum rgmii_clock_delay {
#define PHY_ID_VSC8514 0x00070670
#define PHY_ID_VSC8530 0x00070560
#define PHY_ID_VSC8531 0x00070570
+#define PHY_ID_VSC8531_02 0x00070572
#define PHY_ID_VSC8540 0x00070760
#define PHY_ID_VSC8541 0x00070770
#define PHY_ID_VSC8552 0x000704e0
diff --git a/drivers/net/phy/mscc/mscc_main.c b/drivers/net/phy/mscc/mscc_main.c
index 9e856231e464..aa1df69043e5 100644
--- a/drivers/net/phy/mscc/mscc_main.c
+++ b/drivers/net/phy/mscc/mscc_main.c
@@ -2434,9 +2434,8 @@ static struct phy_driver vsc85xx_driver[] = {
.get_stats = &vsc85xx_get_stats,
},
{
- .phy_id = PHY_ID_VSC8531,
+ PHY_ID_MATCH_EXACT(PHY_ID_VSC8531),
.name = "Microsemi VSC8531",
- .phy_id_mask = 0xfffffff0,
/* PHY_GBIT_FEATURES */
.soft_reset = &genphy_soft_reset,
.config_init = &vsc85xx_config_init,
@@ -2457,6 +2456,29 @@ static struct phy_driver vsc85xx_driver[] = {
.get_strings = &vsc85xx_get_strings,
.get_stats = &vsc85xx_get_stats,
},
+{
+ PHY_ID_MATCH_EXACT(PHY_ID_VSC8531_02),
+ .name = "Microsemi VSC8531-02",
+ /* PHY_GBIT_FEATURES */
+ .soft_reset = &genphy_soft_reset,
+ .config_init = &vsc85xx_config_init,
+ .config_aneg = &vsc85xx_config_aneg,
+ .read_status = &vsc85xx_read_status,
+ .handle_interrupt = vsc85xx_handle_interrupt,
+ .config_intr = &vsc85xx_config_intr,
+ .suspend = &genphy_suspend,
+ .resume = &genphy_resume,
+ .probe = &vsc85xx_probe,
+ .set_wol = &vsc85xx_wol_set,
+ .get_wol = &vsc85xx_wol_get,
+ .get_tunable = &vsc85xx_get_tunable,
+ .set_tunable = &vsc85xx_set_tunable,
+ .read_page = &vsc85xx_phy_read_page,
+ .write_page = &vsc85xx_phy_write_page,
+ .get_sset_count = &vsc85xx_get_sset_count,
+ .get_strings = &vsc85xx_get_strings,
+ .get_stats = &vsc85xx_get_stats,
+},
{
.phy_id = PHY_ID_VSC8540,
.name = "Microsemi FE VSC8540 SyncE",
--
2.17.1


2023-05-11 12:34:37

by Harini Katakam

[permalink] [raw]
Subject: [PATCH net-next v3 1/3] phy: mscc: Use PHY_ID_MATCH_VENDOR to minimize PHY ID table

All the PHY devices variants specified have the same mask and
hence can be simplified to one vendor look up for 0x00070400.
Any individual config can be identified by PHY_ID_MATCH_EXACT
in the respective structure.

Signed-off-by: Harini Katakam <[email protected]>
---
v3:
Correct vendor ID
v2:
New patch
drivers/net/phy/mscc/mscc.h | 1 +
drivers/net/phy/mscc/mscc_main.c | 14 +-------------
2 files changed, 2 insertions(+), 13 deletions(-)

diff --git a/drivers/net/phy/mscc/mscc.h b/drivers/net/phy/mscc/mscc.h
index a50235fdf7d9..9acee8759105 100644
--- a/drivers/net/phy/mscc/mscc.h
+++ b/drivers/net/phy/mscc/mscc.h
@@ -290,6 +290,7 @@ enum rgmii_clock_delay {
#define PHY_ID_VSC8575 0x000707d0
#define PHY_ID_VSC8582 0x000707b0
#define PHY_ID_VSC8584 0x000707c0
+#define PHY_VENDOR_MSCC 0x00070400

#define MSCC_VDDMAC_1500 1500
#define MSCC_VDDMAC_1800 1800
diff --git a/drivers/net/phy/mscc/mscc_main.c b/drivers/net/phy/mscc/mscc_main.c
index 62bf99e45af1..91010524e03d 100644
--- a/drivers/net/phy/mscc/mscc_main.c
+++ b/drivers/net/phy/mscc/mscc_main.c
@@ -2656,19 +2656,7 @@ static struct phy_driver vsc85xx_driver[] = {
module_phy_driver(vsc85xx_driver);

static struct mdio_device_id __maybe_unused vsc85xx_tbl[] = {
- { PHY_ID_VSC8504, 0xfffffff0, },
- { PHY_ID_VSC8514, 0xfffffff0, },
- { PHY_ID_VSC8530, 0xfffffff0, },
- { PHY_ID_VSC8531, 0xfffffff0, },
- { PHY_ID_VSC8540, 0xfffffff0, },
- { PHY_ID_VSC8541, 0xfffffff0, },
- { PHY_ID_VSC8552, 0xfffffff0, },
- { PHY_ID_VSC856X, 0xfffffff0, },
- { PHY_ID_VSC8572, 0xfffffff0, },
- { PHY_ID_VSC8574, 0xfffffff0, },
- { PHY_ID_VSC8575, 0xfffffff0, },
- { PHY_ID_VSC8582, 0xfffffff0, },
- { PHY_ID_VSC8584, 0xfffffff0, },
+ { PHY_ID_MATCH_VENDOR(PHY_VENDOR_MSCC) },
{ }
};

--
2.17.1


2023-05-11 14:15:42

by Simon Horman

[permalink] [raw]
Subject: Re: [PATCH net-next v3 2/3] phy: mscc: Add support for RGMII delay configuration

On Thu, May 11, 2023 at 05:38:07PM +0530, Harini Katakam wrote:
> Add support for optional rx/tx-internal-delay-ps from devicetree.
> - When rx/tx-internal-delay-ps is/are specified, these take priority
> - When either is absent,
> 1) use 2ns for respective settings if rgmii-id/rxid/txid is/are present
> 2) use 0.2ns for respective settings if mode is rgmii
>
> Signed-off-by: Harini Katakam <[email protected]>
> ---
> v3 - Patch split:
> - Use rx/tx-internal-delay-ps with phy_get_internal_delay
> - Change RGMII delay selection precedence
> - Update commit description and subject everywhere to say RGMII delays
> instead of RGMII tuning.
>
> drivers/net/phy/mscc/mscc.h | 2 ++
> drivers/net/phy/mscc/mscc_main.c | 35 +++++++++++++++++++++++++-------
> 2 files changed, 30 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/net/phy/mscc/mscc.h b/drivers/net/phy/mscc/mscc.h
> index 9acee8759105..ab6c0b7c2136 100644
> --- a/drivers/net/phy/mscc/mscc.h
> +++ b/drivers/net/phy/mscc/mscc.h
> @@ -374,6 +374,8 @@ struct vsc8531_private {
> * package.
> */
> unsigned int base_addr;
> + u32 rx_delay;
> + u32 tx_delay;

rx_delay and tx_delay are unsigned...

>
> #if IS_ENABLED(CONFIG_MACSEC)
> /* MACsec fields:
> diff --git a/drivers/net/phy/mscc/mscc_main.c b/drivers/net/phy/mscc/mscc_main.c
> index 91010524e03d..9e856231e464 100644
> --- a/drivers/net/phy/mscc/mscc_main.c
> +++ b/drivers/net/phy/mscc/mscc_main.c
> @@ -525,17 +525,14 @@ static int vsc85xx_rgmii_set_skews(struct phy_device *phydev, u32 rgmii_cntl,
> {
> u16 rgmii_rx_delay_pos = ffs(rgmii_rx_delay_mask) - 1;
> u16 rgmii_tx_delay_pos = ffs(rgmii_tx_delay_mask) - 1;
> + struct vsc8531_private *vsc8531 = phydev->priv;
> u16 reg_val = 0;
> int rc;
>
> mutex_lock(&phydev->lock);
>
> - if (phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID ||
> - phydev->interface == PHY_INTERFACE_MODE_RGMII_ID)
> - reg_val |= RGMII_CLK_DELAY_2_0_NS << rgmii_rx_delay_pos;
> - if (phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID ||
> - phydev->interface == PHY_INTERFACE_MODE_RGMII_ID)
> - reg_val |= RGMII_CLK_DELAY_2_0_NS << rgmii_tx_delay_pos;
> + reg_val |= vsc8531->rx_delay << rgmii_rx_delay_pos;
> + reg_val |= vsc8531->tx_delay << rgmii_tx_delay_pos;
>
> rc = phy_modify_paged(phydev, MSCC_PHY_PAGE_EXTENDED_2,
> rgmii_cntl,
> @@ -1808,10 +1805,34 @@ static irqreturn_t vsc8584_handle_interrupt(struct phy_device *phydev)
> return IRQ_HANDLED;
> }
>
> +static const int vsc8531_internal_delay[] = {200, 800, 1100, 1700, 2000, 2300,
> + 2600, 3400};
> static int vsc85xx_config_init(struct phy_device *phydev)
> {
> - int rc, i, phy_id;
> + int delay_size = ARRAY_SIZE(vsc8531_internal_delay);
> struct vsc8531_private *vsc8531 = phydev->priv;
> + struct device *dev = &phydev->mdio.dev;
> + int rc, i, phy_id;
> +
> + vsc8531->rx_delay = phy_get_internal_delay(phydev, dev, &vsc8531_internal_delay[0],
> + delay_size, true);

But phy_get_internal_delay a signed value.

> + if (vsc8531->rx_delay < 0) {

This comparison can never be true due to the unsigned type of rx_delay.

> + if (phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID ||
> + phydev->interface == PHY_INTERFACE_MODE_RGMII_ID)
> + vsc8531->rx_delay = RGMII_CLK_DELAY_2_0_NS;
> + else
> + vsc8531->rx_delay = RGMII_CLK_DELAY_0_2_NS;
> + }
> +
> + vsc8531->tx_delay = phy_get_internal_delay(phydev, dev, &vsc8531_internal_delay[0],
> + delay_size, false);
> + if (vsc8531->tx_delay < 0) {

Here too.

> + if (phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID ||
> + phydev->interface == PHY_INTERFACE_MODE_RGMII_ID)
> + vsc8531->rx_delay = RGMII_CLK_DELAY_2_0_NS;
> + else
> + vsc8531->rx_delay = RGMII_CLK_DELAY_0_2_NS;
> + }
>
> rc = vsc85xx_default_config(phydev);
> if (rc)

---
pw-bot: cr

2023-05-11 14:15:42

by Andrew Lunn

[permalink] [raw]
Subject: Re: [PATCH net-next v3 1/3] phy: mscc: Use PHY_ID_MATCH_VENDOR to minimize PHY ID table

On Thu, May 11, 2023 at 05:38:06PM +0530, Harini Katakam wrote:
> All the PHY devices variants specified have the same mask and
> hence can be simplified to one vendor look up for 0x00070400.
> Any individual config can be identified by PHY_ID_MATCH_EXACT
> in the respective structure.
>
> Signed-off-by: Harini Katakam <[email protected]>

Reviewed-by: Andrew Lunn <[email protected]>

Andrew

2023-05-11 14:17:09

by Andrew Lunn

[permalink] [raw]
Subject: Re: [PATCH net-next v3 3/3] phy: mscc: Add support for VSC8531_02

On Thu, May 11, 2023 at 05:38:08PM +0530, Harini Katakam wrote:
> Add support for VSC8531_02 (Rev 2) device. Use exact PHY ID match.
>
> Signed-off-by: Harini Katakam <[email protected]>
> ---
> v3 - Patch split
>
> drivers/net/phy/mscc/mscc.h | 1 +
> drivers/net/phy/mscc/mscc_main.c | 26 ++++++++++++++++++++++++--
> 2 files changed, 25 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/net/phy/mscc/mscc.h b/drivers/net/phy/mscc/mscc.h
> index ab6c0b7c2136..6a0521ff61d2 100644
> --- a/drivers/net/phy/mscc/mscc.h
> +++ b/drivers/net/phy/mscc/mscc.h
> @@ -281,6 +281,7 @@ enum rgmii_clock_delay {
> #define PHY_ID_VSC8514 0x00070670
> #define PHY_ID_VSC8530 0x00070560
> #define PHY_ID_VSC8531 0x00070570
> +#define PHY_ID_VSC8531_02 0x00070572

Does PHY_ID_VSC8531_01 exist? The current code would support that,
where as now i don't think any entry will match.

Andrew

2023-05-11 14:24:41

by Andrew Lunn

[permalink] [raw]
Subject: Re: [PATCH net-next v3 3/3] phy: mscc: Add support for VSC8531_02

On Thu, May 11, 2023 at 05:38:08PM +0530, Harini Katakam wrote:
> Add support for VSC8531_02 (Rev 2) device. Use exact PHY ID match.

Please add a comment:

Rev 2 requires its own entry so that...

Just to make it clear why the existing PHY_ID_VSC853/0xfffffff0 is not
sufficient.

Andrew


2023-05-11 16:30:57

by Harini Katakam

[permalink] [raw]
Subject: RE: [PATCH net-next v3 3/3] phy: mscc: Add support for VSC8531_02

Hi Andrew,

> -----Original Message-----
> From: Andrew Lunn <[email protected]>
> Sent: Thursday, May 11, 2023 7:42 PM
> To: Katakam, Harini <[email protected]>
> Cc: [email protected]; [email protected]; [email protected];
> [email protected]; [email protected]; [email protected];
> [email protected]; [email protected];
> [email protected]; [email protected];
> [email protected]; [email protected];
> [email protected]; Simek, Michal <[email protected]>;
> Pandey, Radhey Shyam <[email protected]>
> Subject: Re: [PATCH net-next v3 3/3] phy: mscc: Add support for VSC8531_02
>
> On Thu, May 11, 2023 at 05:38:08PM +0530, Harini Katakam wrote:
> > Add support for VSC8531_02 (Rev 2) device. Use exact PHY ID match.
> >
> > Signed-off-by: Harini Katakam <[email protected]>
> > ---
> > v3 - Patch split
> >
> > drivers/net/phy/mscc/mscc.h | 1 +
> > drivers/net/phy/mscc/mscc_main.c | 26 ++++++++++++++++++++++++--
> > 2 files changed, 25 insertions(+), 2 deletions(-)
> >
> > diff --git a/drivers/net/phy/mscc/mscc.h b/drivers/net/phy/mscc/mscc.h
> > index ab6c0b7c2136..6a0521ff61d2 100644
> > --- a/drivers/net/phy/mscc/mscc.h
> > +++ b/drivers/net/phy/mscc/mscc.h
> > @@ -281,6 +281,7 @@ enum rgmii_clock_delay {
> > #define PHY_ID_VSC8514 0x00070670
> > #define PHY_ID_VSC8530 0x00070560
> > #define PHY_ID_VSC8531 0x00070570
> > +#define PHY_ID_VSC8531_02 0x00070572
>
> Does PHY_ID_VSC8531_01 exist? The current code would support that,
> where as now i don't think any entry will match.

Yes, PHY_ID_VSC8531_01 exists:
https://ww1.microchip.com/downloads/en/DeviceDoc/VMDS-10494.pdf
And I'm sorry I realize now that this patch breaks that version.

Also considering your RC on the other thread,
" Just to make it clear why the existing PHY_ID_VSC853/0xfffffff0 is not sufficient."
Currently there is no difference in the phy driver structure between
VSC8531 and VSC8531_02. Let me double check the identification on
my board and skip this patch if possible. The RGMII delay support in
2/3 is generic anyway.

Regards,
Harini


2023-05-13 19:17:35

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH net-next v3 2/3] phy: mscc: Add support for RGMII delay configuration

Hi Harini,

kernel test robot noticed the following build warnings:

[auto build test WARNING on net-next/main]

url: https://github.com/intel-lab-lkp/linux/commits/Harini-Katakam/phy-mscc-Use-PHY_ID_MATCH_VENDOR-to-minimize-PHY-ID-table/20230511-200935
base: net-next/main
patch link: https://lore.kernel.org/r/20230511120808.28646-3-harini.katakam%40amd.com
patch subject: [PATCH net-next v3 2/3] phy: mscc: Add support for RGMII delay configuration
config: openrisc-randconfig-m041-20230509 (https://download.01.org/0day-ci/archive/20230514/[email protected]/config)
compiler: or1k-linux-gcc (GCC) 12.1.0

If you fix the issue, kindly add following tag where applicable
| Reported-by: kernel test robot <[email protected]>
| Link: https://lore.kernel.org/oe-kbuild-all/[email protected]/

smatch warnings:
drivers/net/phy/mscc/mscc_main.c:1819 vsc85xx_config_init() warn: unsigned 'vsc8531->rx_delay' is never less than zero.
drivers/net/phy/mscc/mscc_main.c:1829 vsc85xx_config_init() warn: unsigned 'vsc8531->tx_delay' is never less than zero.

vim +1819 drivers/net/phy/mscc/mscc_main.c

1807
1808 static const int vsc8531_internal_delay[] = {200, 800, 1100, 1700, 2000, 2300,
1809 2600, 3400};
1810 static int vsc85xx_config_init(struct phy_device *phydev)
1811 {
1812 int delay_size = ARRAY_SIZE(vsc8531_internal_delay);
1813 struct vsc8531_private *vsc8531 = phydev->priv;
1814 struct device *dev = &phydev->mdio.dev;
1815 int rc, i, phy_id;
1816
1817 vsc8531->rx_delay = phy_get_internal_delay(phydev, dev, &vsc8531_internal_delay[0],
1818 delay_size, true);
> 1819 if (vsc8531->rx_delay < 0) {
1820 if (phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID ||
1821 phydev->interface == PHY_INTERFACE_MODE_RGMII_ID)
1822 vsc8531->rx_delay = RGMII_CLK_DELAY_2_0_NS;
1823 else
1824 vsc8531->rx_delay = RGMII_CLK_DELAY_0_2_NS;
1825 }
1826
1827 vsc8531->tx_delay = phy_get_internal_delay(phydev, dev, &vsc8531_internal_delay[0],
1828 delay_size, false);
> 1829 if (vsc8531->tx_delay < 0) {
1830 if (phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID ||
1831 phydev->interface == PHY_INTERFACE_MODE_RGMII_ID)
1832 vsc8531->rx_delay = RGMII_CLK_DELAY_2_0_NS;
1833 else
1834 vsc8531->rx_delay = RGMII_CLK_DELAY_0_2_NS;
1835 }
1836
1837 rc = vsc85xx_default_config(phydev);
1838 if (rc)
1839 return rc;
1840
1841 rc = vsc85xx_mac_if_set(phydev, phydev->interface);
1842 if (rc)
1843 return rc;
1844
1845 rc = vsc85xx_edge_rate_cntl_set(phydev, vsc8531->rate_magic);
1846 if (rc)
1847 return rc;
1848
1849 phy_id = phydev->drv->phy_id & phydev->drv->phy_id_mask;
1850 if (PHY_ID_VSC8531 == phy_id || PHY_ID_VSC8541 == phy_id ||
1851 PHY_ID_VSC8530 == phy_id || PHY_ID_VSC8540 == phy_id) {
1852 rc = vsc8531_pre_init_seq_set(phydev);
1853 if (rc)
1854 return rc;
1855 }
1856
1857 rc = vsc85xx_eee_init_seq_set(phydev);
1858 if (rc)
1859 return rc;
1860
1861 for (i = 0; i < vsc8531->nleds; i++) {
1862 rc = vsc85xx_led_cntl_set(phydev, i, vsc8531->leds_mode[i]);
1863 if (rc)
1864 return rc;
1865 }
1866
1867 return 0;
1868 }
1869

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests