}
 
        ring->dma = dma_alloc_coherent(eth->dma_dev,
-                                      rx_dma_size * sizeof(*ring->dma),
+                                      rx_dma_size * eth->soc->txrx.rxd_size,
                                       &ring->phys, GFP_KERNEL);
        if (!ring->dma)
                return -ENOMEM;
 
        if (ring->dma) {
                dma_free_coherent(eth->dma_dev,
-                                 ring->dma_size * sizeof(*ring->dma),
-                                 ring->dma,
-                                 ring->phys);
+                                 ring->dma_size * eth->soc->txrx.rxd_size,
+                                 ring->dma, ring->phys);
                ring->dma = NULL;
        }
 }
        .required_pctl = true,
        .txrx = {
                .txd_size = sizeof(struct mtk_tx_dma),
+               .rxd_size = sizeof(struct mtk_rx_dma),
        },
 };
 
        .offload_version = 2,
        .txrx = {
                .txd_size = sizeof(struct mtk_tx_dma),
+               .rxd_size = sizeof(struct mtk_rx_dma),
        },
 };
 
        .offload_version = 2,
        .txrx = {
                .txd_size = sizeof(struct mtk_tx_dma),
+               .rxd_size = sizeof(struct mtk_rx_dma),
        },
 };
 
        .offload_version = 2,
        .txrx = {
                .txd_size = sizeof(struct mtk_tx_dma),
+               .rxd_size = sizeof(struct mtk_rx_dma),
        },
 };
 
        .required_pctl = false,
        .txrx = {
                .txd_size = sizeof(struct mtk_tx_dma),
+               .rxd_size = sizeof(struct mtk_rx_dma),
        },
 };
 
        .required_pctl = false,
        .txrx = {
                .txd_size = sizeof(struct mtk_tx_dma),
+               .rxd_size = sizeof(struct mtk_rx_dma),
        },
 };