|
@@ -7730,10 +7730,13 @@ rtl8169_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats)
|
|
|
{
|
|
|
struct rtl8169_private *tp = netdev_priv(dev);
|
|
|
void __iomem *ioaddr = tp->mmio_addr;
|
|
|
+ struct pci_dev *pdev = tp->pci_dev;
|
|
|
struct rtl8169_counters *counters = tp->counters;
|
|
|
unsigned int start;
|
|
|
|
|
|
- if (netif_running(dev))
|
|
|
+ pm_runtime_get_noresume(&pdev->dev);
|
|
|
+
|
|
|
+ if (netif_running(dev) && pm_runtime_active(&pdev->dev))
|
|
|
rtl8169_rx_missed(dev, ioaddr);
|
|
|
|
|
|
do {
|
|
@@ -7761,7 +7764,8 @@ rtl8169_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats)
|
|
|
* Fetch additonal counter values missing in stats collected by driver
|
|
|
* from tally counters.
|
|
|
*/
|
|
|
- rtl8169_update_counters(dev);
|
|
|
+ if (pm_runtime_active(&pdev->dev))
|
|
|
+ rtl8169_update_counters(dev);
|
|
|
|
|
|
/*
|
|
|
* Subtract values fetched during initalization.
|
|
@@ -7774,6 +7778,8 @@ rtl8169_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats)
|
|
|
stats->tx_aborted_errors = le16_to_cpu(counters->tx_aborted) -
|
|
|
le16_to_cpu(tp->tc_offset.tx_aborted);
|
|
|
|
|
|
+ pm_runtime_put_noidle(&pdev->dev);
|
|
|
+
|
|
|
return stats;
|
|
|
}
|
|
|
|
|
@@ -7853,6 +7859,10 @@ static int rtl8169_runtime_suspend(struct device *device)
|
|
|
|
|
|
rtl8169_net_suspend(dev);
|
|
|
|
|
|
+ /* Update counters before going runtime suspend */
|
|
|
+ rtl8169_rx_missed(dev, tp->mmio_addr);
|
|
|
+ rtl8169_update_counters(dev);
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|