diff options
-rw-r--r-- | drivers/net/ethernet/mscc/ocelot.c | 22 |
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 | ||
962 | static void ocelot_check_stats(struct work_struct *work) | 962 | static 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 | |||
990 | static 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 | ||
996 | static void ocelot_get_ethtool_stats(struct net_device *dev, | 1002 | static 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; |