From: Oleksij Rempel <o.rempel@pengutronix.de>
To: Woojung Huh <woojung.huh@microchip.com>,
UNGLinuxDriver@microchip.com, Andrew Lunn <andrew@lunn.ch>,
Vivien Didelot <vivien.didelot@gmail.com>,
Florian Fainelli <f.fainelli@gmail.com>,
Vladimir Oltean <olteanv@gmail.com>,
"David S. Miller" <davem@davemloft.net>,
Eric Dumazet <edumazet@google.com>,
Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
Wei Fang <wei.fang@nxp.com>,
Heiner Kallweit <hkallweit1@gmail.com>
Cc: Oleksij Rempel <o.rempel@pengutronix.de>,
kernel@pengutronix.de, linux-kernel@vger.kernel.org,
netdev@vger.kernel.org, Arun.Ramadoss@microchip.com,
intel-wired-lan@lists.osuosl.org
Subject: [PATCH net-next v4 12/23] net: phy: at803x: ar8035: fix EEE support for half duplex links
Date: Wed, 1 Feb 2023 15:58:34 +0100 [thread overview]
Message-ID: <20230201145845.2312060-13-o.rempel@pengutronix.de> (raw)
In-Reply-To: <20230201145845.2312060-1-o.rempel@pengutronix.de>
If AR8035 is running with enabled EEE and LPI, it will not be able to
establish an 100BaseTX/Half or 1000BaseT/Half link. Similar issue we
will have with 100BaseTX/Full and LPI TX timer configured to less then
80msec.
To avoid this issue, we need to keep LPI disabled before link is
establish and enable it only we detected supported link configuration.
Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de>
---
drivers/net/phy/at803x.c | 41 +++++++++++++++++++++++++++++++++++-----
1 file changed, 36 insertions(+), 5 deletions(-)
diff --git a/drivers/net/phy/at803x.c b/drivers/net/phy/at803x.c
index 9eb4439b0afc..5ab43eb63581 100644
--- a/drivers/net/phy/at803x.c
+++ b/drivers/net/phy/at803x.c
@@ -313,6 +313,7 @@ struct at803x_priv {
u8 smarteee_lpi_tw_100m;
bool is_fiber;
bool is_1000basex;
+ bool tx_lpi_on;
struct regulator_dev *vddio_rdev;
struct regulator_dev *vddh_rdev;
struct regulator *vddio;
@@ -970,6 +971,8 @@ static int at803x_smarteee_config(struct phy_device *phydev, bool enable,
u16 mask = 0, val = 0;
int ret;
+ priv->tx_lpi_on = enable;
+
if (priv->flags & AT803X_DISABLE_SMARTEEE || !enable)
return phy_modify_mmd(phydev, MDIO_MMD_PCS,
AT803X_MMD3_SMARTEEE_CTL3,
@@ -1010,10 +1013,15 @@ static int at803x_smarteee_config(struct phy_device *phydev, bool enable,
if (ret)
return ret;
- val = AT803X_MMD3_SMARTEEE_CTL3_LPI_EN |
- FIELD_PREP(AT803X_MMD3_SMARTEEE_LPI_TIME_HIGH,
- FIELD_GET(AT803X_MMD3_SMARTEEE_LPI_TIME_23_16,
- tx_lpi_timer_raw));
+ val = FIELD_PREP(AT803X_MMD3_SMARTEEE_LPI_TIME_HIGH,
+ FIELD_GET(AT803X_MMD3_SMARTEEE_LPI_TIME_23_16,
+ tx_lpi_timer_raw));
+
+ if (phydev->state == PHY_RUNNING &&
+ phy_check_valid(phydev->speed, phydev->duplex,
+ phydev->supported_eee)) {
+ val |= AT803X_MMD3_SMARTEEE_CTL3_LPI_EN;
+ }
return phy_modify_mmd(phydev, MDIO_MMD_PCS, AT803X_MMD3_SMARTEEE_CTL3,
AT803X_MMD3_SMARTEEE_CTL3_LPI_EN |
@@ -1682,7 +1690,7 @@ static int at803x_get_eee(struct phy_device *phydev, struct ethtool_eee *data)
tx_timer_ns = tx_timer_raw * AT803X_MMD3_SMARTEEE_LPI_TIME_RESOL_NS;
data->tx_lpi_timer = DIV_ROUND_CLOSEST_ULL(tx_timer_ns, NSEC_PER_USEC);
- data->tx_lpi_enabled = !!(ret & AT803X_MMD3_SMARTEEE_CTL3_LPI_EN);
+ data->tx_lpi_enabled = priv->tx_lpi_on;
return genphy_c45_ethtool_get_eee(phydev, data);
}
@@ -1709,6 +1717,28 @@ static int at803x_set_eee(struct phy_device *phydev, struct ethtool_eee *data)
return genphy_c45_ethtool_set_eee(phydev, data);
}
+static void at8035_link_change_notify(struct phy_device *phydev)
+{
+ struct at803x_priv *priv = phydev->priv;
+
+ if (priv->flags & AT803X_DISABLE_SMARTEEE)
+ return;
+
+ if (phydev->state == PHY_RUNNING) {
+ if (priv->tx_lpi_on && phy_check_valid(phydev->speed,
+ phydev->duplex,
+ phydev->supported_eee))
+ phy_set_bits_mmd(phydev, MDIO_MMD_PCS,
+ AT803X_MMD3_SMARTEEE_CTL3,
+ AT803X_MMD3_SMARTEEE_CTL3_LPI_EN);
+ } else {
+ if (priv->tx_lpi_on)
+ phy_clear_bits_mmd(phydev, MDIO_MMD_PCS,
+ AT803X_MMD3_SMARTEEE_CTL3,
+ AT803X_MMD3_SMARTEEE_CTL3_LPI_EN);
+ }
+}
+
static int qca83xx_config_init(struct phy_device *phydev)
{
u8 switch_revision;
@@ -2137,6 +2167,7 @@ static struct phy_driver at803x_driver[] = {
.cable_test_get_status = at803x_cable_test_get_status,
.get_eee = at803x_get_eee,
.set_eee = at803x_set_eee,
+ .link_change_notify = at8035_link_change_notify,
}, {
/* Qualcomm Atheros AR8030 */
.phy_id = ATH8030_PHY_ID,
--
2.30.2
next prev parent reply other threads:[~2023-02-01 14:59 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-02-01 14:58 [PATCH net-next v4 00/23] net: add EEE support for KSZ9477 and AR8035 with i.MX6 Oleksij Rempel
2023-02-01 14:58 ` [PATCH net-next v4 01/23] net: dsa: microchip: enable EEE support Oleksij Rempel
2023-02-04 0:14 ` Vladimir Oltean
2023-02-01 14:58 ` [PATCH net-next v4 02/23] net: phy: add genphy_c45_read_eee_abilities() function Oleksij Rempel
2023-02-01 17:12 ` Andrew Lunn
2023-02-04 0:54 ` Vladimir Oltean
2023-02-06 10:49 ` Oleksij Rempel
2023-02-06 11:22 ` Vladimir Oltean
2023-02-06 15:42 ` Andrew Lunn
2023-02-01 14:58 ` [PATCH net-next v4 03/23] net: phy: micrel: add ksz9477_get_features() Oleksij Rempel
2023-02-01 14:58 ` [PATCH net-next v4 04/23] net: phy: export phy_check_valid() function Oleksij Rempel
2023-02-01 17:15 ` Andrew Lunn
2023-02-01 14:58 ` [PATCH net-next v4 05/23] net: phy: add genphy_c45_ethtool_get/set_eee() support Oleksij Rempel
2023-02-01 17:20 ` Andrew Lunn
2023-02-01 20:18 ` Jakub Kicinski
2023-02-04 1:11 ` Vladimir Oltean
2023-02-01 14:58 ` [PATCH net-next v4 06/23] net: phy: c22: migrate to genphy_c45_write_eee_adv() Oleksij Rempel
2023-02-01 17:28 ` Andrew Lunn
2023-02-01 14:58 ` [PATCH net-next v4 07/23] net: phy: c45: " Oleksij Rempel
2023-02-01 14:58 ` [PATCH net-next v4 08/23] net: phy: migrate phy_init_eee() to genphy_c45_eee_is_active() Oleksij Rempel
2023-02-01 16:41 ` Andrew Lunn
2023-02-01 14:58 ` [PATCH net-next v4 09/23] net: phy: start using genphy_c45_ethtool_get/set_eee() Oleksij Rempel
2023-02-01 14:58 ` [PATCH net-next v4 10/23] net: phy: add driver specific get/set_eee support Oleksij Rempel
2023-02-01 14:58 ` [PATCH net-next v4 11/23] net: phy: at803x: implement ethtool access to SmartEEE functionality Oleksij Rempel
2023-02-01 14:58 ` Oleksij Rempel [this message]
2023-02-01 14:58 ` [PATCH net-next v4 13/23] net: phy: add PHY specifica flag to signal SmartEEE support Oleksij Rempel
2023-02-01 14:58 ` [PATCH net-next v4 14/23] net: phy: at803x: add PHY_SMART_EEE flag to AR8035 Oleksij Rempel
2023-02-01 14:58 ` [PATCH net-next v4 15/23] net: phy: add phy_has_smarteee() helper Oleksij Rempel
2023-02-01 14:58 ` [PATCH net-next v4 16/23] net: fec: add support for PHYs with SmartEEE support Oleksij Rempel
2023-02-01 14:58 ` [PATCH net-next v4 17/23] e1000e: replace EEE ethtool helpers to linkmode variants Oleksij Rempel
2023-02-01 14:58 ` [PATCH net-next v4 18/23] igb: " Oleksij Rempel
2023-02-01 14:58 ` [PATCH net-next v4 19/23] igc: " Oleksij Rempel
2023-02-01 14:58 ` [PATCH net-next v4 20/23] tg3: " Oleksij Rempel
2023-02-01 14:58 ` [PATCH net-next v4 21/23] r8152: " Oleksij Rempel
2023-02-01 14:58 ` [PATCH net-next v4 22/23] net: usb: ax88179_178a: " Oleksij Rempel
2023-02-01 14:58 ` [PATCH net-next v4 23/23] net: mdio: drop EEE ethtool helpers in favor " Oleksij Rempel
2023-02-04 0:13 ` [PATCH net-next v4 00/23] net: add EEE support for KSZ9477 and AR8035 with i.MX6 Vladimir Oltean
2023-02-06 5:47 ` Oleksij Rempel
2023-02-06 14:10 ` Vladimir Oltean
2023-02-06 15:39 ` Andrew Lunn
2023-02-06 18:37 ` Oleksij Rempel
2023-02-06 20:21 ` Andrew Lunn
2023-02-06 18:25 ` Oleksij Rempel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230201145845.2312060-13-o.rempel@pengutronix.de \
--to=o.rempel@pengutronix.de \
--cc=Arun.Ramadoss@microchip.com \
--cc=UNGLinuxDriver@microchip.com \
--cc=andrew@lunn.ch \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=f.fainelli@gmail.com \
--cc=hkallweit1@gmail.com \
--cc=intel-wired-lan@lists.osuosl.org \
--cc=kernel@pengutronix.de \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=olteanv@gmail.com \
--cc=pabeni@redhat.com \
--cc=vivien.didelot@gmail.com \
--cc=wei.fang@nxp.com \
--cc=woojung.huh@microchip.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).