info->emac_init(ndev);
 }
 
-static void ravb_rcar_dmac_init(struct net_device *ndev)
+static int ravb_dmac_init_rcar(struct net_device *ndev)
 {
        struct ravb_private *priv = netdev_priv(ndev);
        const struct ravb_hw_info *info = priv->info;
+       int error;
+
+       error = ravb_ring_init(ndev, RAVB_BE);
+       if (error)
+               return error;
+       error = ravb_ring_init(ndev, RAVB_NC);
+       if (error) {
+               ravb_ring_free(ndev, RAVB_BE);
+               return error;
+       }
+
+       /* Descriptor format */
+       ravb_ring_format(ndev, RAVB_BE);
+       ravb_ring_format(ndev, RAVB_NC);
 
        /* Set AVB RX */
        ravb_write(ndev,
        ravb_write(ndev, RIC2_QFE0 | RIC2_QFE1 | RIC2_RFFE, RIC2);
        /* Frame transmitted, timestamp FIFO updated */
        ravb_write(ndev, TIC_FTE0 | TIC_FTE1 | TIC_TFUE, TIC);
+
+       return 0;
 }
 
 /* Device init function for Ethernet AVB */
        if (error)
                return error;
 
-       error = ravb_ring_init(ndev, RAVB_BE);
+       error = info->dmac_init(ndev);
        if (error)
                return error;
-       error = ravb_ring_init(ndev, RAVB_NC);
-       if (error) {
-               ravb_ring_free(ndev, RAVB_BE);
-               return error;
-       }
-
-       /* Descriptor format */
-       ravb_ring_format(ndev, RAVB_BE);
-       ravb_ring_format(ndev, RAVB_NC);
-
-       info->dmac_init(ndev);
 
        /* Setting the control will start the AVB-DMAC process. */
        ravb_modify(ndev, CCC, CCC_OPC, CCC_OPC_OPERATION);
 {
        struct net_device *ndev = dev_id;
        struct ravb_private *priv = netdev_priv(ndev);
+       const struct ravb_hw_info *info = priv->info;
        irqreturn_t result = IRQ_NONE;
        u32 iss;
 
                        result = IRQ_HANDLED;
 
                /* Network control and best effort queue RX/TX */
-               for (q = RAVB_NC; q >= RAVB_BE; q--) {
-                       if (ravb_queue_interrupt(ndev, q))
+               if (info->nc_queue) {
+                       for (q = RAVB_NC; q >= RAVB_BE; q--) {
+                               if (ravb_queue_interrupt(ndev, q))
+                                       result = IRQ_HANDLED;
+                       }
+               } else {
+                       if (ravb_queue_interrupt(ndev, RAVB_BE))
                                result = IRQ_HANDLED;
                }
        }
 
        /* Receive error message handling */
        priv->rx_over_errors =  priv->stats[RAVB_BE].rx_over_errors;
-       priv->rx_over_errors += priv->stats[RAVB_NC].rx_over_errors;
+       if (info->nc_queue)
+               priv->rx_over_errors += priv->stats[RAVB_NC].rx_over_errors;
        if (priv->rx_over_errors != ndev->stats.rx_over_errors)
                ndev->stats.rx_over_errors = priv->rx_over_errors;
        if (priv->rx_fifo_errors != ndev->stats.rx_fifo_errors)
                                   struct ethtool_stats *estats, u64 *data)
 {
        struct ravb_private *priv = netdev_priv(ndev);
+       const struct ravb_hw_info *info = priv->info;
+       int num_rx_q;
        int i = 0;
        int q;
 
+       num_rx_q = info->nc_queue ? NUM_RX_QUEUE : 1;
        /* Device-specific stats */
-       for (q = RAVB_BE; q < NUM_RX_QUEUE; q++) {
+       for (q = RAVB_BE; q < num_rx_q; q++) {
                struct net_device_stats *stats = &priv->stats[q];
 
                data[i++] = priv->cur_rx[q];
 
                /* Free all the skb's in the RX queue and the DMA buffers. */
                ravb_ring_free(ndev, RAVB_BE);
-               ravb_ring_free(ndev, RAVB_NC);
+               if (info->nc_queue)
+                       ravb_ring_free(ndev, RAVB_NC);
        }
 
        /* Set new parameters */
        int error;
 
        napi_enable(&priv->napi[RAVB_BE]);
-       napi_enable(&priv->napi[RAVB_NC]);
+       if (info->nc_queue)
+               napi_enable(&priv->napi[RAVB_NC]);
 
        if (!info->multi_irqs) {
                error = request_irq(ndev->irq, ravb_interrupt, IRQF_SHARED,
 out_free_irq:
        free_irq(ndev->irq, ndev);
 out_napi_off:
-       napi_disable(&priv->napi[RAVB_NC]);
+       if (info->nc_queue)
+               napi_disable(&priv->napi[RAVB_NC]);
        napi_disable(&priv->napi[RAVB_BE]);
        return error;
 }
        }
 
        ravb_ring_free(ndev, RAVB_BE);
-       ravb_ring_free(ndev, RAVB_NC);
+       if (info->nc_queue)
+               ravb_ring_free(ndev, RAVB_NC);
 
        /* Device init */
        error = ravb_dmac_init(ndev);
 
        nstats = &ndev->stats;
        stats0 = &priv->stats[RAVB_BE];
-       stats1 = &priv->stats[RAVB_NC];
 
        if (info->tx_counters) {
                nstats->tx_dropped += ravb_read(ndev, TROCR);
                ravb_write(ndev, 0, TROCR);     /* (write clear) */
        }
 
-       nstats->rx_packets = stats0->rx_packets + stats1->rx_packets;
-       nstats->tx_packets = stats0->tx_packets + stats1->tx_packets;
-       nstats->rx_bytes = stats0->rx_bytes + stats1->rx_bytes;
-       nstats->tx_bytes = stats0->tx_bytes + stats1->tx_bytes;
-       nstats->multicast = stats0->multicast + stats1->multicast;
-       nstats->rx_errors = stats0->rx_errors + stats1->rx_errors;
-       nstats->rx_crc_errors = stats0->rx_crc_errors + stats1->rx_crc_errors;
-       nstats->rx_frame_errors =
-               stats0->rx_frame_errors + stats1->rx_frame_errors;
-       nstats->rx_length_errors =
-               stats0->rx_length_errors + stats1->rx_length_errors;
-       nstats->rx_missed_errors =
-               stats0->rx_missed_errors + stats1->rx_missed_errors;
-       nstats->rx_over_errors =
-               stats0->rx_over_errors + stats1->rx_over_errors;
+       nstats->rx_packets = stats0->rx_packets;
+       nstats->tx_packets = stats0->tx_packets;
+       nstats->rx_bytes = stats0->rx_bytes;
+       nstats->tx_bytes = stats0->tx_bytes;
+       nstats->multicast = stats0->multicast;
+       nstats->rx_errors = stats0->rx_errors;
+       nstats->rx_crc_errors = stats0->rx_crc_errors;
+       nstats->rx_frame_errors = stats0->rx_frame_errors;
+       nstats->rx_length_errors = stats0->rx_length_errors;
+       nstats->rx_missed_errors = stats0->rx_missed_errors;
+       nstats->rx_over_errors = stats0->rx_over_errors;
+       if (info->nc_queue) {
+               stats1 = &priv->stats[RAVB_NC];
+
+               nstats->rx_packets += stats1->rx_packets;
+               nstats->tx_packets += stats1->tx_packets;
+               nstats->rx_bytes += stats1->rx_bytes;
+               nstats->tx_bytes += stats1->tx_bytes;
+               nstats->multicast += stats1->multicast;
+               nstats->rx_errors += stats1->rx_errors;
+               nstats->rx_crc_errors += stats1->rx_crc_errors;
+               nstats->rx_frame_errors += stats1->rx_frame_errors;
+               nstats->rx_length_errors += stats1->rx_length_errors;
+               nstats->rx_missed_errors += stats1->rx_missed_errors;
+               nstats->rx_over_errors += stats1->rx_over_errors;
+       }
 
        return nstats;
 }
        }
        free_irq(ndev->irq, ndev);
 
-       napi_disable(&priv->napi[RAVB_NC]);
+       if (info->nc_queue)
+               napi_disable(&priv->napi[RAVB_NC]);
        napi_disable(&priv->napi[RAVB_BE]);
 
        /* Free all the skb's in the RX queue and the DMA buffers. */
        ravb_ring_free(ndev, RAVB_BE);
-       ravb_ring_free(ndev, RAVB_NC);
+       if (info->nc_queue)
+               ravb_ring_free(ndev, RAVB_NC);
 
        return 0;
 }
        .receive = ravb_rcar_rx,
        .set_rate = ravb_set_rate,
        .set_feature = ravb_set_features_rcar,
-       .dmac_init = ravb_rcar_dmac_init,
+       .dmac_init = ravb_dmac_init_rcar,
        .emac_init = ravb_rcar_emac_init,
        .gstrings_stats = ravb_gstrings_stats,
        .gstrings_size = sizeof(ravb_gstrings_stats),
        .tx_counters = 1,
        .multi_irqs = 1,
        .ccc_gac = 1,
+       .nc_queue = 1,
 };
 
 static const struct ravb_hw_info ravb_gen2_hw_info = {
        .receive = ravb_rcar_rx,
        .set_rate = ravb_set_rate,
        .set_feature = ravb_set_features_rcar,
-       .dmac_init = ravb_rcar_dmac_init,
+       .dmac_init = ravb_dmac_init_rcar,
        .emac_init = ravb_rcar_emac_init,
        .gstrings_stats = ravb_gstrings_stats,
        .gstrings_size = sizeof(ravb_gstrings_stats),
        .max_rx_len = RX_BUF_SZ + RAVB_ALIGN - 1,
        .aligned_tx = 1,
        .gptp = 1,
+       .nc_queue = 1,
 };
 
 static const struct of_device_id ravb_match_table[] = {
        priv->pdev = pdev;
        priv->num_tx_ring[RAVB_BE] = BE_TX_RING_SIZE;
        priv->num_rx_ring[RAVB_BE] = BE_RX_RING_SIZE;
-       priv->num_tx_ring[RAVB_NC] = NC_TX_RING_SIZE;
-       priv->num_rx_ring[RAVB_NC] = NC_RX_RING_SIZE;
+       if (info->nc_queue) {
+               priv->num_tx_ring[RAVB_NC] = NC_TX_RING_SIZE;
+               priv->num_rx_ring[RAVB_NC] = NC_RX_RING_SIZE;
+       }
+
        priv->addr = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
        if (IS_ERR(priv->addr)) {
                error = PTR_ERR(priv->addr);
        }
 
        netif_napi_add(ndev, &priv->napi[RAVB_BE], ravb_poll, 64);
-       netif_napi_add(ndev, &priv->napi[RAVB_NC], ravb_poll, 64);
+       if (info->nc_queue)
+               netif_napi_add(ndev, &priv->napi[RAVB_NC], ravb_poll, 64);
 
        /* Network device register */
        error = register_netdev(ndev);
        return 0;
 
 out_napi_del:
-       netif_napi_del(&priv->napi[RAVB_NC]);
+       if (info->nc_queue)
+               netif_napi_del(&priv->napi[RAVB_NC]);
+
        netif_napi_del(&priv->napi[RAVB_BE]);
        ravb_mdio_release(priv);
 out_dma_free:
        ravb_write(ndev, CCC_OPC_RESET, CCC);
        pm_runtime_put_sync(&pdev->dev);
        unregister_netdev(ndev);
-       netif_napi_del(&priv->napi[RAVB_NC]);
+       if (info->nc_queue)
+               netif_napi_del(&priv->napi[RAVB_NC]);
        netif_napi_del(&priv->napi[RAVB_BE]);
        ravb_mdio_release(priv);
        pm_runtime_disable(&pdev->dev);
 static int ravb_wol_setup(struct net_device *ndev)
 {
        struct ravb_private *priv = netdev_priv(ndev);
+       const struct ravb_hw_info *info = priv->info;
 
        /* Disable interrupts by clearing the interrupt masks. */
        ravb_write(ndev, 0, RIC0);
 
        /* Only allow ECI interrupts */
        synchronize_irq(priv->emac_irq);
-       napi_disable(&priv->napi[RAVB_NC]);
+       if (info->nc_queue)
+               napi_disable(&priv->napi[RAVB_NC]);
        napi_disable(&priv->napi[RAVB_BE]);
        ravb_write(ndev, ECSIPR_MPDIP, ECSIPR);
 
 static int ravb_wol_restore(struct net_device *ndev)
 {
        struct ravb_private *priv = netdev_priv(ndev);
+       const struct ravb_hw_info *info = priv->info;
        int ret;
 
-       napi_enable(&priv->napi[RAVB_NC]);
+       if (info->nc_queue)
+               napi_enable(&priv->napi[RAVB_NC]);
        napi_enable(&priv->napi[RAVB_BE]);
 
        /* Disable MagicPacket */