aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/ethernet/mscc/ocelot.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/drivers/net/ethernet/mscc/ocelot.c b/drivers/net/ethernet/mscc/ocelot.c
index 6cb2f03b67e6..d715ef4fc92f 100644
--- a/drivers/net/ethernet/mscc/ocelot.c
+++ b/drivers/net/ethernet/mscc/ocelot.c
@@ -959,10 +959,8 @@ static void ocelot_get_strings(struct net_device *netdev, u32 sset, u8 *data)
959 ETH_GSTRING_LEN); 959 ETH_GSTRING_LEN);
960} 960}
961 961
962static void ocelot_check_stats(struct work_struct *work) 962static void ocelot_update_stats(struct ocelot *ocelot)
963{ 963{
964 struct delayed_work *del_work = to_delayed_work(work);
965 struct ocelot *ocelot = container_of(del_work, struct ocelot, stats_work);
966 int i, j; 964 int i, j;
967 965
968 mutex_lock(&ocelot->stats_lock); 966 mutex_lock(&ocelot->stats_lock);
@@ -986,11 +984,19 @@ static void ocelot_check_stats(struct work_struct *work)
986 } 984 }
987 } 985 }
988 986
989 cancel_delayed_work(&ocelot->stats_work); 987 mutex_unlock(&ocelot->stats_lock);
988}
989
990static void ocelot_check_stats_work(struct work_struct *work)
991{
992 struct delayed_work *del_work = to_delayed_work(work);
993 struct ocelot *ocelot = container_of(del_work, struct ocelot,
994 stats_work);
995
996 ocelot_update_stats(ocelot);
997
990 queue_delayed_work(ocelot->stats_queue, &ocelot->stats_work, 998 queue_delayed_work(ocelot->stats_queue, &ocelot->stats_work,
991 OCELOT_STATS_CHECK_DELAY); 999 OCELOT_STATS_CHECK_DELAY);
992
993 mutex_unlock(&ocelot->stats_lock);
994} 1000}
995 1001
996static void ocelot_get_ethtool_stats(struct net_device *dev, 1002static void ocelot_get_ethtool_stats(struct net_device *dev,
@@ -1001,7 +1007,7 @@ static void ocelot_get_ethtool_stats(struct net_device *dev,
1001 int i; 1007 int i;
1002 1008
1003 /* check and update now */ 1009 /* check and update now */
1004 ocelot_check_stats(&ocelot->stats_work.work); 1010 ocelot_update_stats(ocelot);
1005 1011
1006 /* Copy all counters */ 1012 /* Copy all counters */
1007 for (i = 0; i < ocelot->num_stats; i++) 1013 for (i = 0; i < ocelot->num_stats; i++)
@@ -1809,7 +1815,7 @@ int ocelot_init(struct ocelot *ocelot)
1809 ANA_CPUQ_8021_CFG_CPUQ_BPDU_VAL(6), 1815 ANA_CPUQ_8021_CFG_CPUQ_BPDU_VAL(6),
1810 ANA_CPUQ_8021_CFG, i); 1816 ANA_CPUQ_8021_CFG, i);
1811 1817
1812 INIT_DELAYED_WORK(&ocelot->stats_work, ocelot_check_stats); 1818 INIT_DELAYED_WORK(&ocelot->stats_work, ocelot_check_stats_work);
1813 queue_delayed_work(ocelot->stats_queue, &ocelot->stats_work, 1819 queue_delayed_work(ocelot->stats_queue, &ocelot->stats_work,
1814 OCELOT_STATS_CHECK_DELAY); 1820 OCELOT_STATS_CHECK_DELAY);
1815 return 0; 1821 return 0;