Commit bbf2345f authored by Claudiu Beznea's avatar Claudiu Beznea Committed by David S. Miller

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: default avatarSergey Shtylyov <s.shtylyov@omp.ru>
Signed-off-by: default avatarClaudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
Reviewed-by: default avatarSergey Shtylyov <s.shtylyov@omp.ru>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a5f149a9
...@@ -2244,8 +2244,15 @@ static struct net_device_stats *ravb_get_stats(struct net_device *ndev) ...@@ -2244,8 +2244,15 @@ static struct net_device_stats *ravb_get_stats(struct net_device *ndev)
struct ravb_private *priv = netdev_priv(ndev); struct ravb_private *priv = netdev_priv(ndev);
const struct ravb_hw_info *info = priv->info; const struct ravb_hw_info *info = priv->info;
struct net_device_stats *nstats, *stats0, *stats1; struct net_device_stats *nstats, *stats0, *stats1;
struct device *dev = &priv->pdev->dev;
nstats = &ndev->stats; nstats = &ndev->stats;
pm_runtime_get_noresume(dev);
if (!pm_runtime_active(dev))
goto out_rpm_put;
stats0 = &priv->stats[RAVB_BE]; stats0 = &priv->stats[RAVB_BE];
if (info->tx_counters) { if (info->tx_counters) {
...@@ -2287,6 +2294,8 @@ static struct net_device_stats *ravb_get_stats(struct net_device *ndev) ...@@ -2287,6 +2294,8 @@ static struct net_device_stats *ravb_get_stats(struct net_device *ndev)
nstats->rx_over_errors += stats1->rx_over_errors; nstats->rx_over_errors += stats1->rx_over_errors;
} }
out_rpm_put:
pm_runtime_put_noidle(dev);
return nstats; return nstats;
} }
...@@ -2354,6 +2363,9 @@ static int ravb_close(struct net_device *ndev) ...@@ -2354,6 +2363,9 @@ static int ravb_close(struct net_device *ndev)
if (info->nc_queues) if (info->nc_queues)
ravb_ring_free(ndev, RAVB_NC); ravb_ring_free(ndev, RAVB_NC);
/* Update statistics. */
ravb_get_stats(ndev);
/* Set reset mode. */ /* Set reset mode. */
return ravb_set_opmode(ndev, CCC_OPC_RESET); return ravb_set_opmode(ndev, CCC_OPC_RESET);
} }
......
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