Embedding net_device into structures prohibits the usage of flexible
arrays in the net_device structure. For more details, see the discussion
at [1].

Un-embed the net_device from the private struct by converting it
into a pointer. Then use the leverage the new alloc_netdev_dummy()
helper to allocate and initialize dummy devices.

[1] https://lore.kernel.org/all/20240229225910.79e22...@kernel.org/

Signed-off-by: Breno Leitao <lei...@debian.org>
---
 drivers/net/ethernet/mediatek/mtk_eth_soc.c | 17 +++++++++++++----
 drivers/net/ethernet/mediatek/mtk_eth_soc.h |  2 +-
 2 files changed, 14 insertions(+), 5 deletions(-)

diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c 
b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
index caa13b9cedff..d7a96dc11c07 100644
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -1710,7 +1710,7 @@ static struct page_pool *mtk_create_page_pool(struct 
mtk_eth *eth,
        if (IS_ERR(pp))
                return pp;
 
-       err = __xdp_rxq_info_reg(xdp_q, &eth->dummy_dev, id,
+       err = __xdp_rxq_info_reg(xdp_q, eth->dummy_dev, id,
                                 eth->rx_napi.napi_id, PAGE_SIZE);
        if (err < 0)
                goto err_free_pp;
@@ -4188,6 +4188,8 @@ static int mtk_free_dev(struct mtk_eth *eth)
                metadata_dst_free(eth->dsa_meta[i]);
        }
 
+       free_netdev(eth->dummy_dev);
+
        return 0;
 }
 
@@ -4983,9 +4985,14 @@ static int mtk_probe(struct platform_device *pdev)
        /* we run 2 devices on the same DMA ring so we need a dummy device
         * for NAPI to work
         */
-       init_dummy_netdev(&eth->dummy_dev);
-       netif_napi_add(&eth->dummy_dev, &eth->tx_napi, mtk_napi_tx);
-       netif_napi_add(&eth->dummy_dev, &eth->rx_napi, mtk_napi_rx);
+       eth->dummy_dev = alloc_netdev_dummy(0);
+       if (!eth->dummy_dev) {
+               err = -ENOMEM;
+               dev_err(eth->dev, "failed to allocated dummy device\n");
+               goto err_unreg_netdev;
+       }
+       netif_napi_add(eth->dummy_dev, &eth->tx_napi, mtk_napi_tx);
+       netif_napi_add(eth->dummy_dev, &eth->rx_napi, mtk_napi_rx);
 
        platform_set_drvdata(pdev, eth);
        schedule_delayed_work(&eth->reset.monitor_work,
@@ -4993,6 +5000,8 @@ static int mtk_probe(struct platform_device *pdev)
 
        return 0;
 
+err_unreg_netdev:
+       mtk_unreg_dev(eth);
 err_deinit_ppe:
        mtk_ppe_deinit(eth);
        mtk_mdio_cleanup(eth);
diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.h 
b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
index 9ae3b8a71d0e..723fc637027c 100644
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
@@ -1242,7 +1242,7 @@ struct mtk_eth {
        spinlock_t                      page_lock;
        spinlock_t                      tx_irq_lock;
        spinlock_t                      rx_irq_lock;
-       struct net_device               dummy_dev;
+       struct net_device               *dummy_dev;
        struct net_device               *netdev[MTK_MAX_DEVS];
        struct mtk_mac                  *mac[MTK_MAX_DEVS];
        int                             irq[3];
-- 
2.43.0


Reply via email to