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; |
