]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
net: phy: qcom: qca807x: Support PHY counter
authorLuo Jie <quic_luoj@quicinc.com>
Tue, 15 Jul 2025 11:02:28 +0000 (19:02 +0800)
committerJakub Kicinski <kuba@kernel.org>
Fri, 18 Jul 2025 01:35:50 +0000 (18:35 -0700)
Within the QCA807X PHY operation's config_init() function, enable CRC
checking for received and transmitted frames and configure counter to
clear after being read to support counter recording. Additionally, add
support for PHY counter operations.

Signed-off-by: Luo Jie <quic_luoj@quicinc.com>
Link: https://patch.msgid.link/20250715-qcom_phy_counter-v3-3-8b0e460a527b@quicinc.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/phy/qcom/qca807x.c

index 6d10ef7e9a8a4d906ea3a7e0d73087e8907be9c4..291f052ea53c47be04d8d9d803a5c704b4bdc4ef 100644 (file)
@@ -124,6 +124,7 @@ struct qca807x_priv {
        bool dac_full_amplitude;
        bool dac_full_bias_current;
        bool dac_disable_bias_current_tweak;
+       struct qcom_phy_hw_stats hw_stats;
 };
 
 static int qca807x_cable_test_start(struct phy_device *phydev)
@@ -768,6 +769,10 @@ static int qca807x_config_init(struct phy_device *phydev)
                        return ret;
        }
 
+       ret = qcom_phy_counter_config(phydev);
+       if (ret)
+               return ret;
+
        control_dac = phy_read_mmd(phydev, MDIO_MMD_AN,
                                   QCA807X_MMD7_1000BASE_T_POWER_SAVE_PER_CABLE_LENGTH);
        control_dac &= ~QCA807X_CONTROL_DAC_MASK;
@@ -782,6 +787,22 @@ static int qca807x_config_init(struct phy_device *phydev)
                             control_dac);
 }
 
+static int qca807x_update_stats(struct phy_device *phydev)
+{
+       struct qca807x_priv *priv = phydev->priv;
+
+       return qcom_phy_update_stats(phydev, &priv->hw_stats);
+}
+
+static void qca807x_get_phy_stats(struct phy_device *phydev,
+                                 struct ethtool_eth_phy_stats *eth_stats,
+                                 struct ethtool_phy_stats *stats)
+{
+       struct qca807x_priv *priv = phydev->priv;
+
+       qcom_phy_get_stats(stats, priv->hw_stats);
+}
+
 static struct phy_driver qca807x_drivers[] = {
        {
                PHY_ID_MATCH_EXACT(PHY_ID_QCA8072),
@@ -800,6 +821,8 @@ static struct phy_driver qca807x_drivers[] = {
                .suspend        = genphy_suspend,
                .cable_test_start       = qca807x_cable_test_start,
                .cable_test_get_status  = qca808x_cable_test_get_status,
+               .update_stats           = qca807x_update_stats,
+               .get_phy_stats          = qca807x_get_phy_stats,
        },
        {
                PHY_ID_MATCH_EXACT(PHY_ID_QCA8075),
@@ -823,6 +846,8 @@ static struct phy_driver qca807x_drivers[] = {
                .led_hw_is_supported = qca807x_led_hw_is_supported,
                .led_hw_control_set = qca807x_led_hw_control_set,
                .led_hw_control_get = qca807x_led_hw_control_get,
+               .update_stats           = qca807x_update_stats,
+               .get_phy_stats          = qca807x_get_phy_stats,
        },
 };
 module_phy_driver(qca807x_drivers);