net: ti: icssg-prueth: Make pa_stats optional
authorMD Danish Anwar <danishanwar@ti.com>
Fri, 6 Sep 2024 09:36:49 +0000 (15:06 +0530)
committerJakub Kicinski <kuba@kernel.org>
Tue, 10 Sep 2024 00:43:06 +0000 (17:43 -0700)
pa_stats is optional in dt bindings, make it optional in driver as well.
Currently if pa_stats syscon regmap is not found driver returns -ENODEV.
Fix this by not returning an error in case pa_stats is not found and
continue generating ethtool stats without pa_stats.

Fixes: 550ee90ac61c ("net: ti: icssg-prueth: Add support for PA Stats")
Signed-off-by: MD Danish Anwar <danishanwar@ti.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Link: https://patch.msgid.link/20240906093649.870883-1-danishanwar@ti.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/ti/icssg/icssg_ethtool.c
drivers/net/ethernet/ti/icssg/icssg_prueth.c
drivers/net/ethernet/ti/icssg/icssg_stats.c

index 73b6cef..b715af2 100644 (file)
@@ -68,9 +68,13 @@ static int emac_nway_reset(struct net_device *ndev)
 
 static int emac_get_sset_count(struct net_device *ndev, int stringset)
 {
+       struct prueth_emac *emac = netdev_priv(ndev);
        switch (stringset) {
        case ETH_SS_STATS:
-               return ICSSG_NUM_ETHTOOL_STATS;
+               if (emac->prueth->pa_stats)
+                       return ICSSG_NUM_ETHTOOL_STATS;
+               else
+                       return ICSSG_NUM_ETHTOOL_STATS - ICSSG_NUM_PA_STATS;
        default:
                return -EOPNOTSUPP;
        }
@@ -78,6 +82,7 @@ static int emac_get_sset_count(struct net_device *ndev, int stringset)
 
 static void emac_get_strings(struct net_device *ndev, u32 stringset, u8 *data)
 {
+       struct prueth_emac *emac = netdev_priv(ndev);
        u8 *p = data;
        int i;
 
@@ -86,8 +91,9 @@ static void emac_get_strings(struct net_device *ndev, u32 stringset, u8 *data)
                for (i = 0; i < ARRAY_SIZE(icssg_all_miig_stats); i++)
                        if (!icssg_all_miig_stats[i].standard_stats)
                                ethtool_puts(&p, icssg_all_miig_stats[i].name);
-               for (i = 0; i < ARRAY_SIZE(icssg_all_pa_stats); i++)
-                       ethtool_puts(&p, icssg_all_pa_stats[i].name);
+               if (emac->prueth->pa_stats)
+                       for (i = 0; i < ARRAY_SIZE(icssg_all_pa_stats); i++)
+                               ethtool_puts(&p, icssg_all_pa_stats[i].name);
                break;
        default:
                break;
@@ -106,8 +112,9 @@ static void emac_get_ethtool_stats(struct net_device *ndev,
                if (!icssg_all_miig_stats[i].standard_stats)
                        *(data++) = emac->stats[i];
 
-       for (i = 0; i < ARRAY_SIZE(icssg_all_pa_stats); i++)
-               *(data++) = emac->pa_stats[i];
+       if (emac->prueth->pa_stats)
+               for (i = 0; i < ARRAY_SIZE(icssg_all_pa_stats); i++)
+                       *(data++) = emac->pa_stats[i];
 }
 
 static int emac_get_ts_info(struct net_device *ndev,
index becdda1..6644203 100644 (file)
@@ -1185,7 +1185,7 @@ static int prueth_probe(struct platform_device *pdev)
        prueth->pa_stats = syscon_regmap_lookup_by_phandle(np, "ti,pa-stats");
        if (IS_ERR(prueth->pa_stats)) {
                dev_err(dev, "couldn't get ti,pa-stats syscon regmap\n");
-               return -ENODEV;
+               prueth->pa_stats = NULL;
        }
 
        if (eth0_node) {
index 06a15c0..8800bd3 100644 (file)
@@ -42,11 +42,14 @@ void emac_update_hardware_stats(struct prueth_emac *emac)
                        emac->stats[i] -= tx_pkt_cnt * 8;
        }
 
-       for (i = 0; i < ARRAY_SIZE(icssg_all_pa_stats); i++) {
-               reg = ICSSG_FW_STATS_BASE + icssg_all_pa_stats[i].offset *
-                     PRUETH_NUM_MACS + slice * sizeof(u32);
-               regmap_read(prueth->pa_stats, reg, &val);
-               emac->pa_stats[i] += val;
+       if (prueth->pa_stats) {
+               for (i = 0; i < ARRAY_SIZE(icssg_all_pa_stats); i++) {
+                       reg = ICSSG_FW_STATS_BASE +
+                             icssg_all_pa_stats[i].offset *
+                             PRUETH_NUM_MACS + slice * sizeof(u32);
+                       regmap_read(prueth->pa_stats, reg, &val);
+                       emac->pa_stats[i] += val;
+               }
        }
 }
 
@@ -70,9 +73,11 @@ int emac_get_stat_by_name(struct prueth_emac *emac, char *stat_name)
                        return emac->stats[icssg_all_miig_stats[i].offset / sizeof(u32)];
        }
 
-       for (i = 0; i < ARRAY_SIZE(icssg_all_pa_stats); i++) {
-               if (!strcmp(icssg_all_pa_stats[i].name, stat_name))
-                       return emac->pa_stats[icssg_all_pa_stats[i].offset / sizeof(u32)];
+       if (emac->prueth->pa_stats) {
+               for (i = 0; i < ARRAY_SIZE(icssg_all_pa_stats); i++) {
+                       if (!strcmp(icssg_all_pa_stats[i].name, stat_name))
+                               return emac->pa_stats[icssg_all_pa_stats[i].offset / sizeof(u32)];
+               }
        }
 
        netdev_err(emac->ndev, "Invalid stats %s\n", stat_name);