@@ -702,13 +702,14 @@ static bool rswitch_rx(struct net_device *ndev, int *quota)
702
702
u16 pkt_len ;
703
703
u32 get_ts ;
704
704
705
+ if (* quota <= 0 )
706
+ return true;
707
+
705
708
boguscnt = min_t (int , gq -> ring_size , * quota );
706
709
limit = boguscnt ;
707
710
708
711
desc = & gq -> rx_ring [gq -> cur ];
709
712
while ((desc -> desc .die_dt & DT_MASK ) != DT_FEMPTY ) {
710
- if (-- boguscnt < 0 )
711
- break ;
712
713
dma_rmb ();
713
714
pkt_len = le16_to_cpu (desc -> desc .info_ds ) & RX_DS ;
714
715
skb = gq -> skbs [gq -> cur ];
@@ -734,6 +735,9 @@ static bool rswitch_rx(struct net_device *ndev, int *quota)
734
735
735
736
gq -> cur = rswitch_next_queue_index (gq , true, 1 );
736
737
desc = & gq -> rx_ring [gq -> cur ];
738
+
739
+ if (-- boguscnt <= 0 )
740
+ break ;
737
741
}
738
742
739
743
num = rswitch_get_num_cur_queues (gq );
@@ -745,7 +749,7 @@ static bool rswitch_rx(struct net_device *ndev, int *quota)
745
749
goto err ;
746
750
gq -> dirty = rswitch_next_queue_index (gq , false, num );
747
751
748
- * quota -= limit - ( ++ boguscnt ) ;
752
+ * quota -= limit - boguscnt ;
749
753
750
754
return boguscnt <= 0 ;
751
755
@@ -1437,7 +1441,10 @@ static int rswitch_open(struct net_device *ndev)
1437
1441
rswitch_enadis_data_irq (rdev -> priv , rdev -> tx_queue -> index , true);
1438
1442
rswitch_enadis_data_irq (rdev -> priv , rdev -> rx_queue -> index , true);
1439
1443
1440
- iowrite32 (GWCA_TS_IRQ_BIT , rdev -> priv -> addr + GWTSDIE );
1444
+ if (bitmap_empty (rdev -> priv -> opened_ports , RSWITCH_NUM_PORTS ))
1445
+ iowrite32 (GWCA_TS_IRQ_BIT , rdev -> priv -> addr + GWTSDIE );
1446
+
1447
+ bitmap_set (rdev -> priv -> opened_ports , rdev -> port , 1 );
1441
1448
1442
1449
return 0 ;
1443
1450
};
@@ -1448,8 +1455,10 @@ static int rswitch_stop(struct net_device *ndev)
1448
1455
struct rswitch_gwca_ts_info * ts_info , * ts_info2 ;
1449
1456
1450
1457
netif_tx_stop_all_queues (ndev );
1458
+ bitmap_clear (rdev -> priv -> opened_ports , rdev -> port , 1 );
1451
1459
1452
- iowrite32 (GWCA_TS_IRQ_BIT , rdev -> priv -> addr + GWTSDID );
1460
+ if (bitmap_empty (rdev -> priv -> opened_ports , RSWITCH_NUM_PORTS ))
1461
+ iowrite32 (GWCA_TS_IRQ_BIT , rdev -> priv -> addr + GWTSDID );
1453
1462
1454
1463
list_for_each_entry_safe (ts_info , ts_info2 , & rdev -> priv -> gwca .ts_info_list , list ) {
1455
1464
if (ts_info -> port != rdev -> port )
0 commit comments