@@ -859,7 +859,7 @@ static int hns_nic_rx_poll_one(struct hns_nic_ring_data *ring_data,
859
859
return recv_pkts ;
860
860
}
861
861
862
- static void hns_nic_rx_fini_pro (struct hns_nic_ring_data * ring_data )
862
+ static bool hns_nic_rx_fini_pro (struct hns_nic_ring_data * ring_data )
863
863
{
864
864
struct hnae_ring * ring = ring_data -> ring ;
865
865
int num = 0 ;
@@ -873,22 +873,23 @@ static void hns_nic_rx_fini_pro(struct hns_nic_ring_data *ring_data)
873
873
ring_data -> ring -> q -> handle -> dev -> ops -> toggle_ring_irq (
874
874
ring_data -> ring , 1 );
875
875
876
- napi_schedule (& ring_data -> napi );
876
+ return false;
877
+ } else {
878
+ return true;
877
879
}
878
880
}
879
881
880
- static void hns_nic_rx_fini_pro_v2 (struct hns_nic_ring_data * ring_data )
882
+ static bool hns_nic_rx_fini_pro_v2 (struct hns_nic_ring_data * ring_data )
881
883
{
882
884
struct hnae_ring * ring = ring_data -> ring ;
883
- int num = 0 ;
885
+ int num ;
884
886
885
887
num = readl_relaxed (ring -> io_base + RCB_REG_FBDNUM );
886
888
887
- if (num == 0 )
888
- ring_data -> ring -> q -> handle -> dev -> ops -> toggle_ring_irq (
889
- ring , 0 );
889
+ if (!num )
890
+ return true;
890
891
else
891
- napi_schedule ( & ring_data -> napi ) ;
892
+ return false ;
892
893
}
893
894
894
895
static inline void hns_nic_reclaim_one_desc (struct hnae_ring * ring ,
@@ -989,7 +990,7 @@ static int hns_nic_tx_poll_one(struct hns_nic_ring_data *ring_data,
989
990
return 0 ;
990
991
}
991
992
992
- static void hns_nic_tx_fini_pro (struct hns_nic_ring_data * ring_data )
993
+ static bool hns_nic_tx_fini_pro (struct hns_nic_ring_data * ring_data )
993
994
{
994
995
struct hnae_ring * ring = ring_data -> ring ;
995
996
int head ;
@@ -1002,20 +1003,21 @@ static void hns_nic_tx_fini_pro(struct hns_nic_ring_data *ring_data)
1002
1003
ring_data -> ring -> q -> handle -> dev -> ops -> toggle_ring_irq (
1003
1004
ring_data -> ring , 1 );
1004
1005
1005
- napi_schedule (& ring_data -> napi );
1006
+ return false;
1007
+ } else {
1008
+ return true;
1006
1009
}
1007
1010
}
1008
1011
1009
- static void hns_nic_tx_fini_pro_v2 (struct hns_nic_ring_data * ring_data )
1012
+ static bool hns_nic_tx_fini_pro_v2 (struct hns_nic_ring_data * ring_data )
1010
1013
{
1011
1014
struct hnae_ring * ring = ring_data -> ring ;
1012
1015
int head = readl_relaxed (ring -> io_base + RCB_REG_HEAD );
1013
1016
1014
1017
if (head == ring -> next_to_clean )
1015
- ring_data -> ring -> q -> handle -> dev -> ops -> toggle_ring_irq (
1016
- ring , 0 );
1018
+ return true;
1017
1019
else
1018
- napi_schedule ( & ring_data -> napi ) ;
1020
+ return false ;
1019
1021
}
1020
1022
1021
1023
static void hns_nic_tx_clr_all_bufs (struct hns_nic_ring_data * ring_data )
@@ -1042,15 +1044,23 @@ static void hns_nic_tx_clr_all_bufs(struct hns_nic_ring_data *ring_data)
1042
1044
1043
1045
static int hns_nic_common_poll (struct napi_struct * napi , int budget )
1044
1046
{
1047
+ int clean_complete = 0 ;
1045
1048
struct hns_nic_ring_data * ring_data =
1046
1049
container_of (napi , struct hns_nic_ring_data , napi );
1047
- int clean_complete = ring_data -> poll_one (
1048
- ring_data , budget , ring_data -> ex_process );
1050
+ struct hnae_ring * ring = ring_data -> ring ;
1049
1051
1050
- if (clean_complete >= 0 && clean_complete < budget ) {
1051
- napi_complete (napi );
1052
- ring_data -> fini_process (ring_data );
1053
- return 0 ;
1052
+ try_again :
1053
+ clean_complete += ring_data -> poll_one (
1054
+ ring_data , budget - clean_complete ,
1055
+ ring_data -> ex_process );
1056
+
1057
+ if (clean_complete < budget ) {
1058
+ if (ring_data -> fini_process (ring_data )) {
1059
+ napi_complete (napi );
1060
+ ring -> q -> handle -> dev -> ops -> toggle_ring_irq (ring , 0 );
1061
+ } else {
1062
+ goto try_again ;
1063
+ }
1054
1064
}
1055
1065
1056
1066
return clean_complete ;
0 commit comments