From 2a2ccfa44e56c45dfd1230f6efb3ec0a4a677f0a Mon Sep 17 00:00:00 2001
From: Alex Marginean <alexandru.marginean@nxp.com>
Date: Wed, 15 Jan 2020 15:49:11 +0200
Subject: [PATCH] drivers: net: dsa: felix: don't restart PCS SGMII AN if not
 needed

Some PHYs like VSC8234 don't like it when AN restarts on their system side
and they restart line side AN too, going into an endless link up/down loop.
Don't restart PCS AN if link is up already.

Suggested-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Signed-off-by: Alex Marginean <alexandru.marginean@nxp.com>
---
 drivers/net/dsa/ocelot/felix_vsc9959.c | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

--- a/drivers/net/dsa/ocelot/felix_vsc9959.c
+++ b/drivers/net/dsa/ocelot/felix_vsc9959.c
@@ -648,7 +648,22 @@ static void vsc9959_pcs_init_sgmii(struc
 				   unsigned int link_an_mode,
 				   const struct phylink_link_state *state)
 {
+	int bmsr, bmcr;
+
 	if (link_an_mode == MLO_AN_INBAND) {
+		/* Some PHYs like VSC8234 don't like it when AN restarts on
+		 * their system  side and they restart line side AN too, going
+		 * into an endless link up/down loop.  Don't restart PCS AN if
+		 * link is up already.
+		 * We do check that AN is enabled just in case this is the 1st
+		 * call, PCS detects a carrier but AN is disabled from power on
+		 * or by boot loader.
+		 */
+		bmcr = phy_read(pcs, MII_BMCR);
+		bmsr = phy_read(pcs, MII_BMSR);
+		if ((bmcr & BMCR_ANENABLE) && (bmsr & BMSR_LSTATUS))
+			return;
+
 		/* SGMII spec requires tx_config_Reg[15:0] to be exactly 0x4001
 		 * for the MAC PCS in order to acknowledge the AN.
 		 */
