@@ -2606,6 +2606,7 @@ static int hclge_rss_init_hw(struct hclge_dev *hdev)
2606
2606
u16 tc_valid [HCLGE_MAX_TC_NUM ];
2607
2607
u16 tc_size [HCLGE_MAX_TC_NUM ];
2608
2608
u32 * rss_indir = NULL ;
2609
+ u16 rss_size = 0 , roundup_size ;
2609
2610
const u8 * key ;
2610
2611
int i , ret , j ;
2611
2612
@@ -2620,7 +2621,13 @@ static int hclge_rss_init_hw(struct hclge_dev *hdev)
2620
2621
for (j = 0 ; j < hdev -> num_vmdq_vport + 1 ; j ++ ) {
2621
2622
for (i = 0 ; i < HCLGE_RSS_IND_TBL_SIZE ; i ++ ) {
2622
2623
vport [j ].rss_indirection_tbl [i ] =
2623
- i % hdev -> rss_size_max ;
2624
+ i % vport [j ].alloc_rss_size ;
2625
+
2626
+ /* vport 0 is for PF */
2627
+ if (j != 0 )
2628
+ continue ;
2629
+
2630
+ rss_size = vport [j ].alloc_rss_size ;
2624
2631
rss_indir [i ] = vport [j ].rss_indirection_tbl [i ];
2625
2632
}
2626
2633
}
@@ -2637,42 +2644,31 @@ static int hclge_rss_init_hw(struct hclge_dev *hdev)
2637
2644
if (ret )
2638
2645
goto err ;
2639
2646
2647
+ /* Each TC have the same queue size, and tc_size set to hardware is
2648
+ * the log2 of roundup power of two of rss_size, the acutal queue
2649
+ * size is limited by indirection table.
2650
+ */
2651
+ if (rss_size > HCLGE_RSS_TC_SIZE_7 || rss_size == 0 ) {
2652
+ dev_err (& hdev -> pdev -> dev ,
2653
+ "Configure rss tc size failed, invalid TC_SIZE = %d\n" ,
2654
+ rss_size );
2655
+ return - EINVAL ;
2656
+ }
2657
+
2658
+ roundup_size = roundup_pow_of_two (rss_size );
2659
+ roundup_size = ilog2 (roundup_size );
2660
+
2640
2661
for (i = 0 ; i < HCLGE_MAX_TC_NUM ; i ++ ) {
2641
- if (hdev -> hw_tc_map & BIT (i ))
2642
- tc_valid [i ] = 1 ;
2643
- else
2644
- tc_valid [i ] = 0 ;
2662
+ tc_valid [i ] = 0 ;
2645
2663
2646
- switch (hdev -> rss_size_max ) {
2647
- case HCLGE_RSS_TC_SIZE_0 :
2648
- tc_size [i ] = 0 ;
2649
- break ;
2650
- case HCLGE_RSS_TC_SIZE_1 :
2651
- tc_size [i ] = 1 ;
2652
- break ;
2653
- case HCLGE_RSS_TC_SIZE_2 :
2654
- tc_size [i ] = 2 ;
2655
- break ;
2656
- case HCLGE_RSS_TC_SIZE_3 :
2657
- tc_size [i ] = 3 ;
2658
- break ;
2659
- case HCLGE_RSS_TC_SIZE_4 :
2660
- tc_size [i ] = 4 ;
2661
- break ;
2662
- case HCLGE_RSS_TC_SIZE_5 :
2663
- tc_size [i ] = 5 ;
2664
- break ;
2665
- case HCLGE_RSS_TC_SIZE_6 :
2666
- tc_size [i ] = 6 ;
2667
- break ;
2668
- case HCLGE_RSS_TC_SIZE_7 :
2669
- tc_size [i ] = 7 ;
2670
- break ;
2671
- default :
2672
- break ;
2673
- }
2674
- tc_offset [i ] = hdev -> rss_size_max * i ;
2664
+ if (!(hdev -> hw_tc_map & BIT (i )))
2665
+ continue ;
2666
+
2667
+ tc_valid [i ] = 1 ;
2668
+ tc_size [i ] = roundup_size ;
2669
+ tc_offset [i ] = rss_size * i ;
2675
2670
}
2671
+
2676
2672
ret = hclge_set_rss_tc_mode (hdev , tc_valid , tc_size , tc_offset );
2677
2673
2678
2674
err :
@@ -4167,12 +4163,6 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
4167
4163
return ret ;
4168
4164
}
4169
4165
4170
- ret = hclge_rss_init_hw (hdev );
4171
- if (ret ) {
4172
- dev_err (& pdev -> dev , "Rss init fail, ret =%d\n" , ret );
4173
- return ret ;
4174
- }
4175
-
4176
4166
ret = hclge_init_vlan_config (hdev );
4177
4167
if (ret ) {
4178
4168
dev_err (& pdev -> dev , "VLAN init fail, ret =%d\n" , ret );
@@ -4185,6 +4175,12 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
4185
4175
return ret ;
4186
4176
}
4187
4177
4178
+ ret = hclge_rss_init_hw (hdev );
4179
+ if (ret ) {
4180
+ dev_err (& pdev -> dev , "Rss init fail, ret =%d\n" , ret );
4181
+ return ret ;
4182
+ }
4183
+
4188
4184
setup_timer (& hdev -> service_timer , hclge_service_timer ,
4189
4185
(unsigned long )hdev );
4190
4186
INIT_WORK (& hdev -> service_task , hclge_service_task );
0 commit comments