Commit 9e70eb4a authored by MD Danish Anwar's avatar MD Danish Anwar Committed by Jakub Kicinski

net: ti: icssg-prueth: Make pa_stats optional

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: 550ee90a ("net: ti: icssg-prueth: Add support for PA Stats")
Signed-off-by: default avatarMD Danish Anwar <danishanwar@ti.com>
Reviewed-by: default avatarAndrew Lunn <andrew@lunn.ch>
Link: https://patch.msgid.link/20240906093649.870883-1-danishanwar@ti.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 5aa3b55b
......@@ -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,
......
......@@ -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) {
......
......@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment