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/ipa/gsi.c | 12 ++++++++----
 drivers/net/ipa/gsi.h |  2 +-
 2 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/drivers/net/ipa/gsi.c b/drivers/net/ipa/gsi.c
index 9a0b1fe4a93a..d70be15e95a6 100644
--- a/drivers/net/ipa/gsi.c
+++ b/drivers/net/ipa/gsi.c
@@ -1730,10 +1730,10 @@ static int gsi_channel_setup_one(struct gsi *gsi, u32 
channel_id)
        gsi_channel_program(channel, true);
 
        if (channel->toward_ipa)
-               netif_napi_add_tx(&gsi->dummy_dev, &channel->napi,
+               netif_napi_add_tx(gsi->dummy_dev, &channel->napi,
                                  gsi_channel_poll);
        else
-               netif_napi_add(&gsi->dummy_dev, &channel->napi,
+               netif_napi_add(gsi->dummy_dev, &channel->napi,
                               gsi_channel_poll);
 
        return 0;
@@ -2369,12 +2369,14 @@ int gsi_init(struct gsi *gsi, struct platform_device 
*pdev,
        /* GSI uses NAPI on all channels.  Create a dummy network device
         * for the channel NAPI contexts to be associated with.
         */
-       init_dummy_netdev(&gsi->dummy_dev);
+       gsi->dummy_dev = alloc_netdev_dummy(0);
+       if (!gsi->dummy_dev)
+               return -ENOMEM;
        init_completion(&gsi->completion);
 
        ret = gsi_reg_init(gsi, pdev);
        if (ret)
-               return ret;
+               goto err_reg_exit;
 
        ret = gsi_irq_init(gsi, pdev);  /* No matching exit required */
        if (ret)
@@ -2389,6 +2391,7 @@ int gsi_init(struct gsi *gsi, struct platform_device 
*pdev,
        return 0;
 
 err_reg_exit:
+       free_netdev(gsi->dummy_dev);
        gsi_reg_exit(gsi);
 
        return ret;
@@ -2399,6 +2402,7 @@ void gsi_exit(struct gsi *gsi)
 {
        mutex_destroy(&gsi->mutex);
        gsi_channel_exit(gsi);
+       free_netdev(gsi->dummy_dev);
        gsi_reg_exit(gsi);
 }
 
diff --git a/drivers/net/ipa/gsi.h b/drivers/net/ipa/gsi.h
index 42063b227c18..6b7ec2a39676 100644
--- a/drivers/net/ipa/gsi.h
+++ b/drivers/net/ipa/gsi.h
@@ -155,7 +155,7 @@ struct gsi {
        struct mutex mutex;             /* protects commands, programming */
        struct gsi_channel channel[GSI_CHANNEL_COUNT_MAX];
        struct gsi_evt_ring evt_ring[GSI_EVT_RING_COUNT_MAX];
-       struct net_device dummy_dev;    /* needed for NAPI */
+       struct net_device *dummy_dev;   /* needed for NAPI */
 };
 
 /**
-- 
2.43.0


Reply via email to