@@ -1989,10 +1989,12 @@ static irqreturn_t macb_interrupt(int irq, void *dev_id)
19891989
19901990 if (status & MACB_BIT (ISR_ROVR )) {
19911991 /* We missed at least one packet */
1992+ spin_lock (& bp -> stats_lock );
19921993 if (macb_is_gem (bp ))
19931994 bp -> hw_stats .gem .rx_overruns ++ ;
19941995 else
19951996 bp -> hw_stats .macb .rx_overruns ++ ;
1997+ spin_unlock (& bp -> stats_lock );
19961998
19971999 if (bp -> caps & MACB_CAPS_ISR_CLEAR_ON_WRITE )
19982000 queue_writel (queue , ISR , MACB_BIT (ISR_ROVR ));
@@ -3112,6 +3114,7 @@ static void gem_get_stats(struct macb *bp, struct rtnl_link_stats64 *nstat)
31123114{
31133115 struct gem_stats * hwstat = & bp -> hw_stats .gem ;
31143116
3117+ spin_lock_irq (& bp -> stats_lock );
31153118 if (netif_running (bp -> dev ))
31163119 gem_update_stats (bp );
31173120
@@ -3142,17 +3145,19 @@ static void gem_get_stats(struct macb *bp, struct rtnl_link_stats64 *nstat)
31423145 nstat -> tx_aborted_errors = hwstat -> tx_excessive_collisions ;
31433146 nstat -> tx_carrier_errors = hwstat -> tx_carrier_sense_errors ;
31443147 nstat -> tx_fifo_errors = hwstat -> tx_underrun ;
3148+ spin_unlock_irq (& bp -> stats_lock );
31453149}
31463150
31473151static void gem_get_ethtool_stats (struct net_device * dev ,
31483152 struct ethtool_stats * stats , u64 * data )
31493153{
3150- struct macb * bp ;
3154+ struct macb * bp = netdev_priv ( dev ) ;
31513155
3152- bp = netdev_priv ( dev );
3156+ spin_lock_irq ( & bp -> stats_lock );
31533157 gem_update_stats (bp );
31543158 memcpy (data , & bp -> ethtool_stats , sizeof (u64 )
31553159 * (GEM_STATS_LEN + QUEUE_STATS_LEN * MACB_MAX_QUEUES ));
3160+ spin_unlock_irq (& bp -> stats_lock );
31563161}
31573162
31583163static int gem_get_sset_count (struct net_device * dev , int sset )
@@ -3205,6 +3210,7 @@ static void macb_get_stats(struct net_device *dev,
32053210 }
32063211
32073212 /* read stats from hardware */
3213+ spin_lock_irq (& bp -> stats_lock );
32083214 macb_update_stats (bp );
32093215
32103216 /* Convert HW stats into netdevice stats */
@@ -3238,6 +3244,7 @@ static void macb_get_stats(struct net_device *dev,
32383244 nstat -> tx_carrier_errors = hwstat -> tx_carrier_errors ;
32393245 nstat -> tx_fifo_errors = hwstat -> tx_underruns ;
32403246 /* Don't know about heartbeat or window errors... */
3247+ spin_unlock_irq (& bp -> stats_lock );
32413248}
32423249
32433250static void macb_get_pause_stats (struct net_device * dev ,
@@ -5263,6 +5270,7 @@ static int macb_probe(struct platform_device *pdev)
52635270 }
52645271 }
52655272 spin_lock_init (& bp -> lock );
5273+ spin_lock_init (& bp -> stats_lock );
52665274
52675275 /* setup capabilities */
52685276 macb_configure_caps (bp , macb_config );
0 commit comments