@@ -799,6 +799,7 @@ static int rswitch_poll(struct napi_struct *napi, int budget)
799
799
struct net_device * ndev = napi -> dev ;
800
800
struct rswitch_private * priv ;
801
801
struct rswitch_device * rdev ;
802
+ unsigned long flags ;
802
803
int quota = budget ;
803
804
804
805
rdev = netdev_priv (ndev );
@@ -816,10 +817,12 @@ static int rswitch_poll(struct napi_struct *napi, int budget)
816
817
817
818
netif_wake_subqueue (ndev , 0 );
818
819
819
- napi_complete (napi );
820
-
821
- rswitch_enadis_data_irq (priv , rdev -> tx_queue -> index , true);
822
- rswitch_enadis_data_irq (priv , rdev -> rx_queue -> index , true);
820
+ if (napi_complete_done (napi , budget - quota )) {
821
+ spin_lock_irqsave (& priv -> lock , flags );
822
+ rswitch_enadis_data_irq (priv , rdev -> tx_queue -> index , true);
823
+ rswitch_enadis_data_irq (priv , rdev -> rx_queue -> index , true);
824
+ spin_unlock_irqrestore (& priv -> lock , flags );
825
+ }
823
826
824
827
out :
825
828
return budget - quota ;
@@ -835,8 +838,10 @@ static void rswitch_queue_interrupt(struct net_device *ndev)
835
838
struct rswitch_device * rdev = netdev_priv (ndev );
836
839
837
840
if (napi_schedule_prep (& rdev -> napi )) {
841
+ spin_lock (& rdev -> priv -> lock );
838
842
rswitch_enadis_data_irq (rdev -> priv , rdev -> tx_queue -> index , false);
839
843
rswitch_enadis_data_irq (rdev -> priv , rdev -> rx_queue -> index , false);
844
+ spin_unlock (& rdev -> priv -> lock );
840
845
__napi_schedule (& rdev -> napi );
841
846
}
842
847
}
@@ -1440,14 +1445,17 @@ static void rswitch_ether_port_deinit_all(struct rswitch_private *priv)
1440
1445
static int rswitch_open (struct net_device * ndev )
1441
1446
{
1442
1447
struct rswitch_device * rdev = netdev_priv (ndev );
1448
+ unsigned long flags ;
1443
1449
1444
1450
phy_start (ndev -> phydev );
1445
1451
1446
1452
napi_enable (& rdev -> napi );
1447
1453
netif_start_queue (ndev );
1448
1454
1455
+ spin_lock_irqsave (& rdev -> priv -> lock , flags );
1449
1456
rswitch_enadis_data_irq (rdev -> priv , rdev -> tx_queue -> index , true);
1450
1457
rswitch_enadis_data_irq (rdev -> priv , rdev -> rx_queue -> index , true);
1458
+ spin_unlock_irqrestore (& rdev -> priv -> lock , flags );
1451
1459
1452
1460
if (bitmap_empty (rdev -> priv -> opened_ports , RSWITCH_NUM_PORTS ))
1453
1461
iowrite32 (GWCA_TS_IRQ_BIT , rdev -> priv -> addr + GWTSDIE );
@@ -1461,6 +1469,7 @@ static int rswitch_stop(struct net_device *ndev)
1461
1469
{
1462
1470
struct rswitch_device * rdev = netdev_priv (ndev );
1463
1471
struct rswitch_gwca_ts_info * ts_info , * ts_info2 ;
1472
+ unsigned long flags ;
1464
1473
1465
1474
netif_tx_stop_all_queues (ndev );
1466
1475
bitmap_clear (rdev -> priv -> opened_ports , rdev -> port , 1 );
@@ -1476,8 +1485,10 @@ static int rswitch_stop(struct net_device *ndev)
1476
1485
kfree (ts_info );
1477
1486
}
1478
1487
1488
+ spin_lock_irqsave (& rdev -> priv -> lock , flags );
1479
1489
rswitch_enadis_data_irq (rdev -> priv , rdev -> tx_queue -> index , false);
1480
1490
rswitch_enadis_data_irq (rdev -> priv , rdev -> rx_queue -> index , false);
1491
+ spin_unlock_irqrestore (& rdev -> priv -> lock , flags );
1481
1492
1482
1493
phy_stop (ndev -> phydev );
1483
1494
napi_disable (& rdev -> napi );
@@ -1887,6 +1898,7 @@ static int renesas_eth_sw_probe(struct platform_device *pdev)
1887
1898
priv = devm_kzalloc (& pdev -> dev , sizeof (* priv ), GFP_KERNEL );
1888
1899
if (!priv )
1889
1900
return - ENOMEM ;
1901
+ spin_lock_init (& priv -> lock );
1890
1902
1891
1903
attr = soc_device_match (rswitch_soc_no_speed_change );
1892
1904
if (attr )
0 commit comments