@@ -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 (IS_ERR(emac->prueth->pa_stats))
+ return ICSSG_NUM_ETHTOOL_STATS - ICSSG_NUM_PA_STATS;
+ else
+ return ICSSG_NUM_ETHTOOL_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 (!IS_ERR(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 (!IS_ERR(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,
@@ -1183,10 +1183,8 @@ 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)) {
+ if (IS_ERR(prueth->pa_stats))
dev_err(dev, "couldn't get ti,pa-stats syscon regmap\n");
- return -ENODEV;
- }
if (eth0_node) {
ret = prueth_get_cores(prueth, ICSS_SLICE0, false);
@@ -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 (!IS_ERR(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 (!IS_ERR(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);
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> --- Cc: Jan Kiszka <jan.kiszka@siemens.com> NOTE: This fix is targetted to net-next because the concerned commit is not yet synced to net. So the issue isn't present in net. drivers/net/ethernet/ti/icssg/icssg_ethtool.c | 17 ++++++++++----- drivers/net/ethernet/ti/icssg/icssg_prueth.c | 4 +--- drivers/net/ethernet/ti/icssg/icssg_stats.c | 21 ++++++++++++------- 3 files changed, 26 insertions(+), 16 deletions(-) base-commit: 43b7724487109368363bb5cda034b3f600278d14