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>
Acked-by: Elad Nachman <enach...@marvell.com>
---
 .../net/ethernet/marvell/prestera/prestera_rxtx.c | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/drivers/net/ethernet/marvell/prestera/prestera_rxtx.c 
b/drivers/net/ethernet/marvell/prestera/prestera_rxtx.c
index cc2a9ae794be..39d9bf82c115 100644
--- a/drivers/net/ethernet/marvell/prestera/prestera_rxtx.c
+++ b/drivers/net/ethernet/marvell/prestera/prestera_rxtx.c
@@ -96,7 +96,7 @@ struct prestera_sdma {
        struct dma_pool *desc_pool;
        struct work_struct tx_work;
        struct napi_struct rx_napi;
-       struct net_device napi_dev;
+       struct net_device *napi_dev;
        u32 map_addr;
        u64 dma_mask;
        /* protect SDMA with concurrent access from multiple CPUs */
@@ -654,13 +654,21 @@ static int prestera_sdma_switch_init(struct 
prestera_switch *sw)
        if (err)
                goto err_evt_register;
 
-       init_dummy_netdev(&sdma->napi_dev);
+       sdma->napi_dev = alloc_netdev_dummy(0);
+       if (!sdma->napi_dev) {
+               dev_err(dev, "not able to initialize dummy device\n");
+               err = -ENOMEM;
+               goto err_alloc_dummy;
+       }
 
-       netif_napi_add(&sdma->napi_dev, &sdma->rx_napi, prestera_sdma_rx_poll);
+       netif_napi_add(sdma->napi_dev, &sdma->rx_napi, prestera_sdma_rx_poll);
        napi_enable(&sdma->rx_napi);
 
        return 0;
 
+err_alloc_dummy:
+       prestera_hw_event_handler_unregister(sw, PRESTERA_EVENT_TYPE_RXTX,
+                                            prestera_rxtx_handle_event);
 err_evt_register:
 err_tx_init:
        prestera_sdma_tx_fini(sdma);
@@ -677,6 +685,7 @@ static void prestera_sdma_switch_fini(struct 
prestera_switch *sw)
 
        napi_disable(&sdma->rx_napi);
        netif_napi_del(&sdma->rx_napi);
+       free_netdev(sdma->napi_dev);
        prestera_hw_event_handler_unregister(sw, PRESTERA_EVENT_TYPE_RXTX,
                                             prestera_rxtx_handle_event);
        prestera_sdma_tx_fini(sdma);
-- 
2.43.0


Reply via email to