unsigned long *qpl_id_map; /* bitmap of used qpl ids */
 };
 
+/* GVE_QUEUE_FORMAT_UNSPECIFIED must be zero since 0 is the default value
+ * when the entire configure_device_resources command is zeroed out and the
+ * queue_format is not specified.
+ */
+enum gve_queue_format {
+       GVE_QUEUE_FORMAT_UNSPECIFIED    = 0x0,
+       GVE_GQI_RDA_FORMAT              = 0x1,
+       GVE_GQI_QPL_FORMAT              = 0x2,
+       GVE_DQO_RDA_FORMAT              = 0x3,
+};
+
 struct gve_priv {
        struct net_device *dev;
        struct gve_tx_ring *tx; /* array of tx_cfg.num_queues */
        u64 num_registered_pages; /* num pages registered with NIC */
        u32 rx_copybreak; /* copy packets smaller than this */
        u16 default_num_queues; /* default num queues to set up */
-       u8 raw_addressing; /* 1 if this dev supports raw addressing, 0 otherwise */
 
        struct gve_queue_config tx_cfg;
        struct gve_queue_config rx_cfg;
 
        /* Gvnic device link speed from hypervisor. */
        u64 link_speed;
+
+       enum gve_queue_format queue_format;
 };
 
 enum gve_service_task_flags_bit {
  */
 static inline u32 gve_num_tx_qpls(struct gve_priv *priv)
 {
-       return priv->raw_addressing ? 0 : priv->tx_cfg.num_queues;
+       if (priv->queue_format != GVE_GQI_QPL_FORMAT)
+               return 0;
+
+       return priv->tx_cfg.num_queues;
 }
 
 /* Returns the number of rx queue page lists
  */
 static inline u32 gve_num_rx_qpls(struct gve_priv *priv)
 {
-       return priv->raw_addressing ? 0 : priv->rx_cfg.num_queues;
+       if (priv->queue_format != GVE_GQI_QPL_FORMAT)
+               return 0;
+
+       return priv->rx_cfg.num_queues;
 }
 
 /* Returns a pointer to the next available tx qpl in the list of qpls
 
 
                dev_info(&priv->pdev->dev,
                         "Gqi raw addressing device option enabled.\n");
-               priv->raw_addressing = 1;
+               priv->queue_format = GVE_GQI_RDA_FORMAT;
                break;
        case GVE_DEV_OPT_ID_GQI_RDA:
                if (option_length < sizeof(**dev_op_gqi_rda) ||
        u32 qpl_id;
        int err;
 
-       qpl_id = priv->raw_addressing ? GVE_RAW_ADDRESSING_QPL_ID : tx->tx_fifo.qpl->id;
+       qpl_id = priv->queue_format == GVE_GQI_RDA_FORMAT ?
+                GVE_RAW_ADDRESSING_QPL_ID : tx->tx_fifo.qpl->id;
        memset(&cmd, 0, sizeof(cmd));
        cmd.opcode = cpu_to_be32(GVE_ADMINQ_CREATE_TX_QUEUE);
        cmd.create_tx_queue = (struct gve_adminq_create_tx_queue) {
        u32 qpl_id;
        int err;
 
-       qpl_id = priv->raw_addressing ? GVE_RAW_ADDRESSING_QPL_ID : rx->data.qpl->id;
+       qpl_id = priv->queue_format == GVE_GQI_RDA_FORMAT ?
+                GVE_RAW_ADDRESSING_QPL_ID : rx->data.qpl->id;
        memset(&cmd, 0, sizeof(cmd));
        cmd.opcode = cpu_to_be32(GVE_ADMINQ_CREATE_RX_QUEUE);
        cmd.create_rx_queue = (struct gve_adminq_create_rx_queue) {
        if (err)
                goto free_device_descriptor;
 
-       priv->raw_addressing = 0;
        err = gve_process_device_options(priv, descriptor, &dev_op_gqi_rda,
                                         &dev_op_gqi_qpl, &dev_op_dqo_rda);
        if (err)
         * is not set to GqiRda, choose the queue format in a priority order:
         * DqoRda, GqiRda, GqiQpl. Use GqiQpl as default.
         */
-       if (priv->raw_addressing == 1) {
+       if (priv->queue_format == GVE_GQI_RDA_FORMAT) {
                dev_info(&priv->pdev->dev,
                         "Driver is running with GQI RDA queue format.\n");
        } else if (dev_op_dqo_rda) {
+               priv->queue_format = GVE_DQO_RDA_FORMAT;
                dev_info(&priv->pdev->dev,
                         "Driver is running with DQO RDA queue format.\n");
        } else if (dev_op_gqi_rda) {
+               priv->queue_format = GVE_GQI_RDA_FORMAT;
                dev_info(&priv->pdev->dev,
                         "Driver is running with GQI RDA queue format.\n");
-               priv->raw_addressing = 1;
        } else {
+               priv->queue_format = GVE_GQI_QPL_FORMAT;
                dev_info(&priv->pdev->dev,
                         "Driver is running with GQI QPL queue format.\n");
        }
 
 // SPDX-License-Identifier: (GPL-2.0 OR MIT)
 /* Google virtual Ethernet (gve) driver
  *
- * Copyright (C) 2015-2019 Google, Inc.
+ * Copyright (C) 2015-2021 Google, Inc.
  */
 
 #include <linux/cpumask.h>
        int err;
 
        /* Raw addressing means no QPLs */
-       if (priv->raw_addressing)
+       if (priv->queue_format == GVE_GQI_RDA_FORMAT)
                return 0;
 
        priv->qpls = kvzalloc(num_qpls * sizeof(*priv->qpls), GFP_KERNEL);
        int i;
 
        /* Raw addressing means no QPLs */
-       if (priv->raw_addressing)
+       if (priv->queue_format == GVE_GQI_RDA_FORMAT)
                return;
 
        kvfree(priv->qpl_cfg.qpl_id_map);
        if (skip_describe_device)
                goto setup_device;
 
-       priv->raw_addressing = false;
+       priv->queue_format = GVE_QUEUE_FORMAT_UNSPECIFIED;
        /* Get the initial information we need from the device */
        err = gve_adminq_describe_device(priv);
        if (err) {
                goto abort_with_wq;
 
        dev_info(&pdev->dev, "GVE version %s\n", gve_version_str);
+       dev_info(&pdev->dev, "GVE queue format %d\n", (int)priv->queue_format);
        gve_clear_probe_in_progress(priv);
        queue_work(priv->gve_wq, &priv->service_task);
        return 0;
 
 
        slots = priv->rx_data_slot_cnt;
        rx->mask = slots - 1;
-       rx->data.raw_addressing = priv->raw_addressing;
+       rx->data.raw_addressing = priv->queue_format == GVE_GQI_RDA_FORMAT;
 
        /* alloc rx data ring */
        bytes = sizeof(*rx->data.data_ring) * slots;
 
        if (!tx->desc)
                goto abort_with_info;
 
-       tx->raw_addressing = priv->raw_addressing;
+       tx->raw_addressing = priv->queue_format == GVE_GQI_RDA_FORMAT;
        tx->dev = &priv->pdev->dev;
        if (!tx->raw_addressing) {
                tx->tx_fifo.qpl = gve_assign_tx_qpl(priv);