]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
net: marvell: prestera: allocate dummy net_device dynamically
authorBreno Leitao <leitao@debian.org>
Mon, 22 Apr 2024 12:38:57 +0000 (05:38 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 24 Apr 2024 11:00:16 +0000 (12:00 +0100)
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.79e224cf@kernel.org/

Signed-off-by: Breno Leitao <leitao@debian.org>
Acked-by: Elad Nachman <enachman@marvell.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/marvell/prestera/prestera_rxtx.c

index cc2a9ae794bea4df97615a6640ba7fd07966ffdb..39d9bf82c115570b0d588f231a30f3ed6b76df8e 100644 (file)
@@ -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);