net: ravb: Return cached statistics if the interface is down

Return the cached statistics in case the interface is down. There should be
no drawback to this, as cached statistics are updated in ravb_close().

In order to avoid accessing the IP registers while the IP is runtime
suspended pm_runtime_active() check was introduced. The device runtime
PM usage counter has been incremented to avoid disabling the device clocks
while the check is in progress (if any).

The commit prepares the code for the addition of runtime PM support.

Suggested-by: Sergey Shtylyov <s.shtylyov@omp.ru>
Signed-off-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
Reviewed-by: Sergey Shtylyov <s.shtylyov@omp.ru>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Claudiu Beznea 2024-02-14 15:57:57 +02:00 committed by David S. Miller
parent a5f149a97d
commit bbf2345fa6

View file

@ -2244,8 +2244,15 @@ static struct net_device_stats *ravb_get_stats(struct net_device *ndev)
struct ravb_private *priv = netdev_priv(ndev);
const struct ravb_hw_info *info = priv->info;
struct net_device_stats *nstats, *stats0, *stats1;
struct device *dev = &priv->pdev->dev;
nstats = &ndev->stats;
pm_runtime_get_noresume(dev);
if (!pm_runtime_active(dev))
goto out_rpm_put;
stats0 = &priv->stats[RAVB_BE];
if (info->tx_counters) {
@ -2287,6 +2294,8 @@ static struct net_device_stats *ravb_get_stats(struct net_device *ndev)
nstats->rx_over_errors += stats1->rx_over_errors;
}
out_rpm_put:
pm_runtime_put_noidle(dev);
return nstats;
}
@ -2354,6 +2363,9 @@ static int ravb_close(struct net_device *ndev)
if (info->nc_queues)
ravb_ring_free(ndev, RAVB_NC);
/* Update statistics. */
ravb_get_stats(ndev);
/* Set reset mode. */
return ravb_set_opmode(ndev, CCC_OPC_RESET);
}