Skip to content

Commit

Permalink
net: marvell: prestera: allocate dummy net_device dynamically
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Breno Leitao authored and David S. Miller committed Apr 24, 2024
1 parent c661050 commit ec24c06
Showing 1 changed file with 12 additions and 3 deletions.
15 changes: 12 additions & 3 deletions drivers/net/ethernet/marvell/prestera/prestera_rxtx.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down Expand Up @@ -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);
Expand All @@ -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);
Expand Down

0 comments on commit ec24c06

Please sign in to comment.