@@ -602,6 +602,40 @@ int gve_adminq_destroy_rx_queues(struct gve_priv *priv, u32 num_queues)
602
602
return gve_adminq_kick_and_wait (priv );
603
603
}
604
604
605
+ static int gve_set_desc_cnt (struct gve_priv * priv ,
606
+ struct gve_device_descriptor * descriptor )
607
+ {
608
+ priv -> tx_desc_cnt = be16_to_cpu (descriptor -> tx_queue_entries );
609
+ if (priv -> tx_desc_cnt * sizeof (priv -> tx -> desc [0 ]) < PAGE_SIZE ) {
610
+ dev_err (& priv -> pdev -> dev , "Tx desc count %d too low\n" ,
611
+ priv -> tx_desc_cnt );
612
+ return - EINVAL ;
613
+ }
614
+ priv -> rx_desc_cnt = be16_to_cpu (descriptor -> rx_queue_entries );
615
+ if (priv -> rx_desc_cnt * sizeof (priv -> rx -> desc .desc_ring [0 ])
616
+ < PAGE_SIZE ) {
617
+ dev_err (& priv -> pdev -> dev , "Rx desc count %d too low\n" ,
618
+ priv -> rx_desc_cnt );
619
+ return - EINVAL ;
620
+ }
621
+ return 0 ;
622
+ }
623
+
624
+ static int
625
+ gve_set_desc_cnt_dqo (struct gve_priv * priv ,
626
+ const struct gve_device_descriptor * descriptor ,
627
+ const struct gve_device_option_dqo_rda * dev_op_dqo_rda )
628
+ {
629
+ priv -> tx_desc_cnt = be16_to_cpu (descriptor -> tx_queue_entries );
630
+ priv -> options_dqo_rda .tx_comp_ring_entries =
631
+ be16_to_cpu (dev_op_dqo_rda -> tx_comp_ring_entries );
632
+ priv -> rx_desc_cnt = be16_to_cpu (descriptor -> rx_queue_entries );
633
+ priv -> options_dqo_rda .rx_buff_ring_entries =
634
+ be16_to_cpu (dev_op_dqo_rda -> rx_buff_ring_entries );
635
+
636
+ return 0 ;
637
+ }
638
+
605
639
int gve_adminq_describe_device (struct gve_priv * priv )
606
640
{
607
641
struct gve_device_option_gqi_rda * dev_op_gqi_rda = NULL ;
@@ -655,22 +689,14 @@ int gve_adminq_describe_device(struct gve_priv *priv)
655
689
dev_info (& priv -> pdev -> dev ,
656
690
"Driver is running with GQI QPL queue format.\n" );
657
691
}
658
-
659
- priv -> tx_desc_cnt = be16_to_cpu (descriptor -> tx_queue_entries );
660
- if (priv -> tx_desc_cnt * sizeof (priv -> tx -> desc [0 ]) < PAGE_SIZE ) {
661
- dev_err (& priv -> pdev -> dev , "Tx desc count %d too low\n" , priv -> tx_desc_cnt );
662
- err = - EINVAL ;
663
- goto free_device_descriptor ;
692
+ if (gve_is_gqi (priv )) {
693
+ err = gve_set_desc_cnt (priv , descriptor );
694
+ } else {
695
+ err = gve_set_desc_cnt_dqo (priv , descriptor , dev_op_dqo_rda );
664
696
}
665
- priv -> rx_desc_cnt = be16_to_cpu (descriptor -> rx_queue_entries );
666
- if (priv -> rx_desc_cnt * sizeof (priv -> rx -> desc .desc_ring [0 ])
667
- < PAGE_SIZE ||
668
- priv -> rx_desc_cnt * sizeof (priv -> rx -> data .data_ring [0 ])
669
- < PAGE_SIZE ) {
670
- dev_err (& priv -> pdev -> dev , "Rx desc count %d too low\n" , priv -> rx_desc_cnt );
671
- err = - EINVAL ;
697
+ if (err )
672
698
goto free_device_descriptor ;
673
- }
699
+
674
700
priv -> max_registered_pages =
675
701
be64_to_cpu (descriptor -> max_registered_pages );
676
702
mtu = be16_to_cpu (descriptor -> mtu );
@@ -686,7 +712,8 @@ int gve_adminq_describe_device(struct gve_priv *priv)
686
712
dev_info (& priv -> pdev -> dev , "MAC addr: %pM\n" , mac );
687
713
priv -> tx_pages_per_qpl = be16_to_cpu (descriptor -> tx_pages_per_qpl );
688
714
priv -> rx_data_slot_cnt = be16_to_cpu (descriptor -> rx_pages_per_qpl );
689
- if (priv -> rx_data_slot_cnt < priv -> rx_desc_cnt ) {
715
+
716
+ if (gve_is_gqi (priv ) && priv -> rx_data_slot_cnt < priv -> rx_desc_cnt ) {
690
717
dev_err (& priv -> pdev -> dev , "rx_data_slot_cnt cannot be smaller than rx_desc_cnt, setting rx_desc_cnt down to %d.\n" ,
691
718
priv -> rx_data_slot_cnt );
692
719
priv -> rx_desc_cnt = priv -> rx_data_slot_cnt ;
0 commit comments