diff --git a/src/drivers/net/gve.c b/src/drivers/net/gve.c index 8759d71a9..11ef35351 100644 --- a/src/drivers/net/gve.c +++ b/src/drivers/net/gve.c @@ -559,7 +559,22 @@ static int gve_describe ( struct gve_nic *gve ) { DBGC ( gve, "GVE %p supports options %#08x\n", gve, gve->options ); /* Select preferred operating mode */ - gve->mode = GVE_MODE_QPL; + if ( gve->options & ( 1 << GVE_OPT_GQI_QPL ) ) { + /* GQI-QPL: in-order queues, queue page list addressing */ + gve->mode = GVE_MODE_QPL; + } else if ( gve->options & ( 1 << GVE_OPT_GQI_RDA ) ) { + /* GQI-RDA: in-order queues, raw DMA addressing */ + gve->mode = 0; + } else if ( gve->options & ( 1 << GVE_OPT_DQO_QPL ) ) { + /* DQO-QPL: out-of-order queues, queue page list addressing */ + gve->mode = ( GVE_MODE_DQO | GVE_MODE_QPL ); + } else if ( gve->options & ( 1 << GVE_OPT_DQO_RDA ) ) { + /* DQO-RDA: out-of-order queues, raw DMA addressing */ + gve->mode = GVE_MODE_DQO; + } else { + /* No options matched: assume the original GQI-QPL mode */ + gve->mode = GVE_MODE_QPL; + } DBGC ( gve, "GVE %p using %s mode\n", gve, gve_mode_name ( gve->mode ) );