@@ -892,7 +892,7 @@ static void i40e_set_new_dynamic_itr(struct i40e_ring_container *rc)
892
892
* 20-1249MB/s bulk (8000 ints/s)
893
893
*/
894
894
bytes_per_int = rc -> total_bytes / rc -> itr ;
895
- switch (rc -> itr ) {
895
+ switch (new_latency_range ) {
896
896
case I40E_LOWEST_LATENCY :
897
897
if (bytes_per_int > 10 )
898
898
new_latency_range = I40E_LOW_LATENCY ;
@@ -905,9 +905,14 @@ static void i40e_set_new_dynamic_itr(struct i40e_ring_container *rc)
905
905
break ;
906
906
case I40E_BULK_LATENCY :
907
907
if (bytes_per_int <= 20 )
908
- rc -> latency_range = I40E_LOW_LATENCY ;
908
+ new_latency_range = I40E_LOW_LATENCY ;
909
+ break ;
910
+ default :
911
+ if (bytes_per_int <= 20 )
912
+ new_latency_range = I40E_LOW_LATENCY ;
909
913
break ;
910
914
}
915
+ rc -> latency_range = new_latency_range ;
911
916
912
917
switch (new_latency_range ) {
913
918
case I40E_LOWEST_LATENCY :
@@ -923,41 +928,13 @@ static void i40e_set_new_dynamic_itr(struct i40e_ring_container *rc)
923
928
break ;
924
929
}
925
930
926
- if (new_itr != rc -> itr ) {
927
- /* do an exponential smoothing */
928
- new_itr = (10 * new_itr * rc -> itr ) /
929
- ((9 * new_itr ) + rc -> itr );
930
- rc -> itr = new_itr & I40E_MAX_ITR ;
931
- }
931
+ if (new_itr != rc -> itr )
932
+ rc -> itr = new_itr ;
932
933
933
934
rc -> total_bytes = 0 ;
934
935
rc -> total_packets = 0 ;
935
936
}
936
937
937
- /**
938
- * i40e_update_dynamic_itr - Adjust ITR based on bytes per int
939
- * @q_vector: the vector to adjust
940
- **/
941
- static void i40e_update_dynamic_itr (struct i40e_q_vector * q_vector )
942
- {
943
- u16 vector = q_vector -> vsi -> base_vector + q_vector -> v_idx ;
944
- struct i40e_hw * hw = & q_vector -> vsi -> back -> hw ;
945
- u32 reg_addr ;
946
- u16 old_itr ;
947
-
948
- reg_addr = I40E_PFINT_ITRN (I40E_RX_ITR , vector - 1 );
949
- old_itr = q_vector -> rx .itr ;
950
- i40e_set_new_dynamic_itr (& q_vector -> rx );
951
- if (old_itr != q_vector -> rx .itr )
952
- wr32 (hw , reg_addr , q_vector -> rx .itr );
953
-
954
- reg_addr = I40E_PFINT_ITRN (I40E_TX_ITR , vector - 1 );
955
- old_itr = q_vector -> tx .itr ;
956
- i40e_set_new_dynamic_itr (& q_vector -> tx );
957
- if (old_itr != q_vector -> tx .itr )
958
- wr32 (hw , reg_addr , q_vector -> tx .itr );
959
- }
960
-
961
938
/**
962
939
* i40e_clean_programming_status - clean the programming status descriptor
963
940
* @rx_ring: the rx ring that has this descriptor
@@ -1826,6 +1803,68 @@ static int i40e_clean_rx_irq_1buf(struct i40e_ring *rx_ring, int budget)
1826
1803
return total_rx_packets ;
1827
1804
}
1828
1805
1806
+ /**
1807
+ * i40e_update_enable_itr - Update itr and re-enable MSIX interrupt
1808
+ * @vsi: the VSI we care about
1809
+ * @q_vector: q_vector for which itr is being updated and interrupt enabled
1810
+ *
1811
+ **/
1812
+ static inline void i40e_update_enable_itr (struct i40e_vsi * vsi ,
1813
+ struct i40e_q_vector * q_vector )
1814
+ {
1815
+ struct i40e_hw * hw = & vsi -> back -> hw ;
1816
+ u16 old_itr ;
1817
+ int vector ;
1818
+ u32 val ;
1819
+
1820
+ vector = (q_vector -> v_idx + vsi -> base_vector );
1821
+ if (ITR_IS_DYNAMIC (vsi -> rx_itr_setting )) {
1822
+ old_itr = q_vector -> rx .itr ;
1823
+ i40e_set_new_dynamic_itr (& q_vector -> rx );
1824
+ if (old_itr != q_vector -> rx .itr ) {
1825
+ val = I40E_PFINT_DYN_CTLN_INTENA_MASK |
1826
+ I40E_PFINT_DYN_CTLN_CLEARPBA_MASK |
1827
+ (I40E_RX_ITR <<
1828
+ I40E_PFINT_DYN_CTLN_ITR_INDX_SHIFT ) |
1829
+ (q_vector -> rx .itr <<
1830
+ I40E_PFINT_DYN_CTLN_INTERVAL_SHIFT );
1831
+ } else {
1832
+ val = I40E_PFINT_DYN_CTLN_INTENA_MASK |
1833
+ I40E_PFINT_DYN_CTLN_CLEARPBA_MASK |
1834
+ (I40E_ITR_NONE <<
1835
+ I40E_PFINT_DYN_CTLN_ITR_INDX_SHIFT );
1836
+ }
1837
+ if (!test_bit (__I40E_DOWN , & vsi -> state ))
1838
+ wr32 (hw , I40E_PFINT_DYN_CTLN (vector - 1 ), val );
1839
+ } else {
1840
+ i40e_irq_dynamic_enable (vsi ,
1841
+ q_vector -> v_idx + vsi -> base_vector );
1842
+ }
1843
+ if (ITR_IS_DYNAMIC (vsi -> tx_itr_setting )) {
1844
+ old_itr = q_vector -> tx .itr ;
1845
+ i40e_set_new_dynamic_itr (& q_vector -> tx );
1846
+ if (old_itr != q_vector -> tx .itr ) {
1847
+ val = I40E_PFINT_DYN_CTLN_INTENA_MASK |
1848
+ I40E_PFINT_DYN_CTLN_CLEARPBA_MASK |
1849
+ (I40E_TX_ITR <<
1850
+ I40E_PFINT_DYN_CTLN_ITR_INDX_SHIFT ) |
1851
+ (q_vector -> tx .itr <<
1852
+ I40E_PFINT_DYN_CTLN_INTERVAL_SHIFT );
1853
+ } else {
1854
+ val = I40E_PFINT_DYN_CTLN_INTENA_MASK |
1855
+ I40E_PFINT_DYN_CTLN_CLEARPBA_MASK |
1856
+ (I40E_ITR_NONE <<
1857
+ I40E_PFINT_DYN_CTLN_ITR_INDX_SHIFT );
1858
+ }
1859
+ if (!test_bit (__I40E_DOWN , & vsi -> state ))
1860
+ wr32 (hw , I40E_PFINT_DYN_CTLN (q_vector -> v_idx +
1861
+ vsi -> base_vector - 1 ), val );
1862
+ } else {
1863
+ i40e_irq_dynamic_enable (vsi ,
1864
+ q_vector -> v_idx + vsi -> base_vector );
1865
+ }
1866
+ }
1867
+
1829
1868
/**
1830
1869
* i40e_napi_poll - NAPI polling Rx/Tx cleanup routine
1831
1870
* @napi: napi struct with our devices info in it
@@ -1882,33 +1921,24 @@ int i40e_napi_poll(struct napi_struct *napi, int budget)
1882
1921
1883
1922
/* Work is done so exit the polling mode and re-enable the interrupt */
1884
1923
napi_complete (napi );
1885
- if (ITR_IS_DYNAMIC (vsi -> rx_itr_setting ) ||
1886
- ITR_IS_DYNAMIC (vsi -> tx_itr_setting ))
1887
- i40e_update_dynamic_itr (q_vector );
1888
-
1889
- if (!test_bit (__I40E_DOWN , & vsi -> state )) {
1890
- if (vsi -> back -> flags & I40E_FLAG_MSIX_ENABLED ) {
1891
- i40e_irq_dynamic_enable (vsi ,
1892
- q_vector -> v_idx + vsi -> base_vector );
1893
- } else {
1894
- struct i40e_hw * hw = & vsi -> back -> hw ;
1895
- /* We re-enable the queue 0 cause, but
1896
- * don't worry about dynamic_enable
1897
- * because we left it on for the other
1898
- * possible interrupts during napi
1899
- */
1900
- u32 qval = rd32 (hw , I40E_QINT_RQCTL (0 ));
1901
- qval |= I40E_QINT_RQCTL_CAUSE_ENA_MASK ;
1902
- wr32 (hw , I40E_QINT_RQCTL (0 ), qval );
1903
-
1904
- qval = rd32 (hw , I40E_QINT_TQCTL (0 ));
1905
- qval |= I40E_QINT_TQCTL_CAUSE_ENA_MASK ;
1906
- wr32 (hw , I40E_QINT_TQCTL (0 ), qval );
1907
-
1908
- i40e_irq_dynamic_enable_icr0 (vsi -> back );
1909
- }
1924
+ if (vsi -> back -> flags & I40E_FLAG_MSIX_ENABLED ) {
1925
+ i40e_update_enable_itr (vsi , q_vector );
1926
+ } else { /* Legacy mode */
1927
+ struct i40e_hw * hw = & vsi -> back -> hw ;
1928
+ /* We re-enable the queue 0 cause, but
1929
+ * don't worry about dynamic_enable
1930
+ * because we left it on for the other
1931
+ * possible interrupts during napi
1932
+ */
1933
+ u32 qval = rd32 (hw , I40E_QINT_RQCTL (0 )) |
1934
+ I40E_QINT_RQCTL_CAUSE_ENA_MASK ;
1935
+
1936
+ wr32 (hw , I40E_QINT_RQCTL (0 ), qval );
1937
+ qval = rd32 (hw , I40E_QINT_TQCTL (0 )) |
1938
+ I40E_QINT_TQCTL_CAUSE_ENA_MASK ;
1939
+ wr32 (hw , I40E_QINT_TQCTL (0 ), qval );
1940
+ i40e_irq_dynamic_enable_icr0 (vsi -> back );
1910
1941
}
1911
-
1912
1942
return 0 ;
1913
1943
}
1914
1944
0 commit comments