if (err)
                return err;
 
-       /* If XDP prog is not installed, return */
-       if (!priv->xdp_prog)
+       /* If XDP prog is not installed or interface is down, return. */
+       if (!priv->xdp_prog || !netif_running(dev))
                return 0;
 
        rx = &priv->rx[qid];
        if (qid >= priv->rx_cfg.num_queues)
                return -EINVAL;
 
-       /* If XDP prog is not installed, unmap DMA and return */
-       if (!priv->xdp_prog)
+       /* If XDP prog is not installed or interface is down, unmap DMA and
+        * return.
+        */
+       if (!priv->xdp_prog || !netif_running(dev))
                goto done;
 
-       tx_qid = gve_xdp_tx_queue_id(priv, qid);
-       if (!netif_running(dev)) {
-               priv->rx[qid].xsk_pool = NULL;
-               xdp_rxq_info_unreg(&priv->rx[qid].xsk_rxq);
-               priv->tx[tx_qid].xsk_pool = NULL;
-               goto done;
-       }
-
        napi_rx = &priv->ntfy_blocks[priv->rx[qid].ntfy_id].napi;
        napi_disable(napi_rx); /* make sure current rx poll is done */
 
+       tx_qid = gve_xdp_tx_queue_id(priv, qid);
        napi_tx = &priv->ntfy_blocks[priv->tx[tx_qid].ntfy_id].napi;
        napi_disable(napi_tx); /* make sure current tx poll is done */
 
        struct gve_priv *priv = netdev_priv(dev);
        int tx_queue_id = gve_xdp_tx_queue_id(priv, queue_id);
 
+       if (!gve_get_napi_enabled(priv))
+               return -ENETDOWN;
+
        if (queue_id >= priv->rx_cfg.num_queues || !priv->xdp_prog)
                return -EINVAL;