if (!qdma->q_rx[i].ndesc)
                        continue;
 
-               napi_disable(&qdma->q_rx[i].napi);
                netif_napi_del(&qdma->q_rx[i].napi);
                airoha_qdma_cleanup_rx_queue(&qdma->q_rx[i]);
                if (qdma->q_rx[i].page_pool)
                        page_pool_destroy(qdma->q_rx[i].page_pool);
        }
 
-       for (i = 0; i < ARRAY_SIZE(qdma->q_tx_irq); i++) {
-               napi_disable(&qdma->q_tx_irq[i].napi);
+       for (i = 0; i < ARRAY_SIZE(qdma->q_tx_irq); i++)
                netif_napi_del(&qdma->q_tx_irq[i].napi);
-       }
 
        for (i = 0; i < ARRAY_SIZE(qdma->q_tx); i++) {
                if (!qdma->q_tx[i].ndesc)
        }
 }
 
+static void airoha_qdma_stop_napi(struct airoha_qdma *qdma)
+{
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(qdma->q_tx_irq); i++)
+               napi_disable(&qdma->q_tx_irq[i].napi);
+
+       for (i = 0; i < ARRAY_SIZE(qdma->q_rx); i++) {
+               if (!qdma->q_rx[i].ndesc)
+                       continue;
+
+               napi_disable(&qdma->q_rx[i].napi);
+       }
+}
+
 static void airoha_update_hw_stats(struct airoha_gdm_port *port)
 {
        struct airoha_eth *eth = port->qdma->eth;
 
        err = airoha_hw_init(pdev, eth);
        if (err)
-               goto error;
+               goto error_hw_cleanup;
 
        for (i = 0; i < ARRAY_SIZE(eth->qdma); i++)
                airoha_qdma_start_napi(ð->qdma[i]);
                err = airoha_alloc_gdm_port(eth, np);
                if (err) {
                        of_node_put(np);
-                       goto error;
+                       goto error_napi_stop;
                }
        }
 
        return 0;
 
-error:
+error_napi_stop:
+       for (i = 0; i < ARRAY_SIZE(eth->qdma); i++)
+               airoha_qdma_stop_napi(ð->qdma[i]);
+error_hw_cleanup:
        for (i = 0; i < ARRAY_SIZE(eth->qdma); i++)
                airoha_hw_cleanup(ð->qdma[i]);
 
        struct airoha_eth *eth = platform_get_drvdata(pdev);
        int i;
 
-       for (i = 0; i < ARRAY_SIZE(eth->qdma); i++)
+       for (i = 0; i < ARRAY_SIZE(eth->qdma); i++) {
+               airoha_qdma_stop_napi(ð->qdma[i]);
                airoha_hw_cleanup(ð->qdma[i]);
+       }
 
        for (i = 0; i < ARRAY_SIZE(eth->ports); i++) {
                struct airoha_gdm_port *port = eth->ports[i];