net: ravb: Return cached statistics if the interface is down
authorClaudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
Wed, 14 Feb 2024 13:57:57 +0000 (15:57 +0200)
committerDavid S. Miller <davem@davemloft.net>
Fri, 16 Feb 2024 08:32:04 +0000 (08:32 +0000)
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>
drivers/net/ethernet/renesas/ravb_main.c

index b2699c76ed9f8ca13063532133dbfe6bd6488338..8c4e5b52fbb839d8761964745a5604a6727864bd 100644 (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);
 }