wifi: mt76: un-embedd netdev from mt76_dev
authorBreno Leitao <leitao@debian.org>
Wed, 19 Jun 2024 10:52:36 +0000 (03:52 -0700)
committerJakub Kicinski <kuba@kernel.org>
Fri, 21 Jun 2024 02:30:00 +0000 (19:30 -0700)
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_devices from struct mt76_dev by converting them
into pointers, and allocating them dynamically. Use the leverage
alloc_netdev_dummy() to allocate the net_device object at
mt76_dma_init().

The free of the device occurs at mt76_dma_cleanup().

Link: https://lore.kernel.org/all/20240229225910.79e224cf@kernel.org/
Reviewed-by: Simon Horman <horms@kernel.org>
Signed-off-by: Breno Leitao <leitao@debian.org>
Acked-by: Kalle Valo <kvalo@kernel.org>
Link: https://patch.msgid.link/20240619105311.3144908-1-leitao@debian.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
12 files changed:
drivers/net/wireless/mediatek/mt76/debugfs.c
drivers/net/wireless/mediatek/mt76/dma.c
drivers/net/wireless/mediatek/mt76/dma.h
drivers/net/wireless/mediatek/mt76/mt76.h
drivers/net/wireless/mediatek/mt76/mt7603/dma.c
drivers/net/wireless/mediatek/mt76/mt7615/dma.c
drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c
drivers/net/wireless/mediatek/mt76/mt7915/dma.c
drivers/net/wireless/mediatek/mt76/mt7921/pci.c
drivers/net/wireless/mediatek/mt76/mt7925/pci.c
drivers/net/wireless/mediatek/mt76/mt792x_dma.c
drivers/net/wireless/mediatek/mt76/mt7996/dma.c

index ae83be572b9442dd6054f84db0a2b486d08d96c1..b6a2746c187d0272d7e97f7647e8bd0f2ff5db30 100644 (file)
@@ -33,8 +33,8 @@ mt76_napi_threaded_set(void *data, u64 val)
        if (!mt76_is_mmio(dev))
                return -EOPNOTSUPP;
 
-       if (dev->napi_dev.threaded != val)
-               return dev_set_threaded(&dev->napi_dev, val);
+       if (dev->napi_dev->threaded != val)
+               return dev_set_threaded(dev->napi_dev, val);
 
        return 0;
 }
@@ -44,7 +44,7 @@ mt76_napi_threaded_get(void *data, u64 *val)
 {
        struct mt76_dev *dev = data;
 
-       *val = dev->napi_dev.threaded;
+       *val = dev->napi_dev->threaded;
        return 0;
 }
 
index f4f88c444e2153a13fa088f601317a6bcc276598..5f46d6daeaa7c531bf3952813c8f887ce013c649 100644 (file)
@@ -916,7 +916,7 @@ int mt76_dma_rx_poll(struct napi_struct *napi, int budget)
        struct mt76_dev *dev;
        int qid, done = 0, cur;
 
-       dev = container_of(napi->dev, struct mt76_dev, napi_dev);
+       dev = mt76_priv(napi->dev);
        qid = napi - dev->napi;
 
        rcu_read_lock();
@@ -940,18 +940,35 @@ static int
 mt76_dma_init(struct mt76_dev *dev,
              int (*poll)(struct napi_struct *napi, int budget))
 {
+       struct mt76_dev **priv;
        int i;
 
-       init_dummy_netdev(&dev->napi_dev);
-       init_dummy_netdev(&dev->tx_napi_dev);
-       snprintf(dev->napi_dev.name, sizeof(dev->napi_dev.name), "%s",
+       dev->napi_dev = alloc_netdev_dummy(sizeof(struct mt76_dev *));
+       if (!dev->napi_dev)
+               return -ENOMEM;
+
+       /* napi_dev private data points to mt76_dev parent, so, mt76_dev
+        * can be retrieved given napi_dev
+        */
+       priv = netdev_priv(dev->napi_dev);
+       *priv = dev;
+
+       dev->tx_napi_dev = alloc_netdev_dummy(sizeof(struct mt76_dev *));
+       if (!dev->tx_napi_dev) {
+               free_netdev(dev->napi_dev);
+               return -ENOMEM;
+       }
+       priv = netdev_priv(dev->tx_napi_dev);
+       *priv = dev;
+
+       snprintf(dev->napi_dev->name, sizeof(dev->napi_dev->name), "%s",
                 wiphy_name(dev->hw->wiphy));
-       dev->napi_dev.threaded = 1;
+       dev->napi_dev->threaded = 1;
        init_completion(&dev->mmio.wed_reset);
        init_completion(&dev->mmio.wed_reset_complete);
 
        mt76_for_each_q_rx(dev, i) {
-               netif_napi_add(&dev->napi_dev, &dev->napi[i], poll);
+               netif_napi_add(dev->napi_dev, &dev->napi[i], poll);
                mt76_dma_rx_fill(dev, &dev->q_rx[i], false);
                napi_enable(&dev->napi[i]);
        }
@@ -1019,5 +1036,7 @@ void mt76_dma_cleanup(struct mt76_dev *dev)
 
        mt76_free_pending_txwi(dev);
        mt76_free_pending_rxwi(dev);
+       free_netdev(dev->napi_dev);
+       free_netdev(dev->tx_napi_dev);
 }
 EXPORT_SYMBOL_GPL(mt76_dma_cleanup);
index 1de5a2b20f747838884f61a454f25bdecb1c1d41..e3ddc7a837579c0835a704ab8944099d276c6222 100644 (file)
@@ -116,4 +116,13 @@ mt76_dma_should_drop_buf(bool *drop, u32 ctrl, u32 buf1, u32 info)
        }
 }
 
+static inline void *mt76_priv(struct net_device *dev)
+{
+       struct mt76_dev **priv;
+
+       priv = netdev_priv(dev);
+
+       return *priv;
+}
+
 #endif
index 11b9f22ca7f31f6970fb1954558c5136dc1f1476..15f83b5adac7007ec8a3b3d65ddf0cbf0a1ba368 100644 (file)
@@ -831,8 +831,8 @@ struct mt76_dev {
 
        struct mt76_mcu mcu;
 
-       struct net_device napi_dev;
-       struct net_device tx_napi_dev;
+       struct net_device *napi_dev;
+       struct net_device *tx_napi_dev;
        spinlock_t rx_lock;
        struct napi_struct napi[__MT_RXQ_MAX];
        struct sk_buff_head rx_skb[__MT_RXQ_MAX];
index 14304b0637158898e42fba8ab85ee27733dfcf85..ea017f22fff22cfd60d006355248ffc6a0aedfcd 100644 (file)
@@ -242,7 +242,7 @@ int mt7603_dma_init(struct mt7603_dev *dev)
        if (ret)
                return ret;
 
-       netif_napi_add_tx(&dev->mt76.tx_napi_dev, &dev->mt76.tx_napi,
+       netif_napi_add_tx(dev->mt76.tx_napi_dev, &dev->mt76.tx_napi,
                          mt7603_poll_tx);
        napi_enable(&dev->mt76.tx_napi);
 
index e7135b2f17428645e5ab3064841097dc376141f3..bcf7864312d722bc9f02b2ca70df0d3e28b2930e 100644 (file)
@@ -67,7 +67,7 @@ static int mt7615_poll_tx(struct napi_struct *napi, int budget)
 {
        struct mt7615_dev *dev;
 
-       dev = container_of(napi, struct mt7615_dev, mt76.tx_napi);
+       dev = mt76_priv(napi->dev);
        if (!mt76_connac_pm_ref(&dev->mphy, &dev->pm)) {
                napi_complete(napi);
                queue_work(dev->mt76.wq, &dev->pm.wake_work);
@@ -89,7 +89,7 @@ static int mt7615_poll_rx(struct napi_struct *napi, int budget)
        struct mt7615_dev *dev;
        int done;
 
-       dev = container_of(napi->dev, struct mt7615_dev, mt76.napi_dev);
+       dev = mt76_priv(napi->dev);
 
        if (!mt76_connac_pm_ref(&dev->mphy, &dev->pm)) {
                napi_complete(napi);
@@ -282,7 +282,7 @@ int mt7615_dma_init(struct mt7615_dev *dev)
        if (ret < 0)
                return ret;
 
-       netif_napi_add_tx(&dev->mt76.tx_napi_dev, &dev->mt76.tx_napi,
+       netif_napi_add_tx(dev->mt76.tx_napi_dev, &dev->mt76.tx_napi,
                          mt7615_poll_tx);
        napi_enable(&dev->mt76.tx_napi);
 
index e5ad635d3c5657d5a9448974459da267cefd1b4f..35b7ebc2c9c625e6d7ce329a4597ad91d6506401 100644 (file)
@@ -239,7 +239,7 @@ int mt76x02_dma_init(struct mt76x02_dev *dev)
        if (ret)
                return ret;
 
-       netif_napi_add_tx(&dev->mt76.tx_napi_dev, &dev->mt76.tx_napi,
+       netif_napi_add_tx(dev->mt76.tx_napi_dev, &dev->mt76.tx_napi,
                          mt76x02_poll_tx);
        napi_enable(&dev->mt76.tx_napi);
 
index 0baa82c8df5ac0576b9378f5be544e50ebc7db7b..0c62272fe7d03552c8c260b3971a62fb143895c1 100644 (file)
@@ -578,7 +578,7 @@ int mt7915_dma_init(struct mt7915_dev *dev, struct mt7915_phy *phy2)
        if (ret < 0)
                return ret;
 
-       netif_napi_add_tx(&dev->mt76.tx_napi_dev, &dev->mt76.tx_napi,
+       netif_napi_add_tx(dev->mt76.tx_napi_dev, &dev->mt76.tx_napi,
                          mt7915_poll_tx);
        napi_enable(&dev->mt76.tx_napi);
 
index f768e9389ac6c947c9de00b97e99ddf3bcf5ea3b..e75e7b6d3aaf5e8b2449274129cb1407f1efff8a 100644 (file)
@@ -219,7 +219,7 @@ static int mt7921_dma_init(struct mt792x_dev *dev)
        if (ret < 0)
                return ret;
 
-       netif_napi_add_tx(&dev->mt76.tx_napi_dev, &dev->mt76.tx_napi,
+       netif_napi_add_tx(dev->mt76.tx_napi_dev, &dev->mt76.tx_napi,
                          mt792x_poll_tx);
        napi_enable(&dev->mt76.tx_napi);
 
index 07b74d492ce15c7ab6538f3a63d8d4913acb1a34..577574fb7a1ee84d35fe451bf7764da153119bb3 100644 (file)
@@ -254,7 +254,7 @@ static int mt7925_dma_init(struct mt792x_dev *dev)
        if (ret < 0)
                return ret;
 
-       netif_napi_add_tx(&dev->mt76.tx_napi_dev, &dev->mt76.tx_napi,
+       netif_napi_add_tx(dev->mt76.tx_napi_dev, &dev->mt76.tx_napi,
                          mt792x_poll_tx);
        napi_enable(&dev->mt76.tx_napi);
 
index 5cc2d59b774af9fa3739f25056cc57391195fd3b..6f9db782338e6e405de49dd07fefae1a1de09f93 100644 (file)
@@ -340,7 +340,7 @@ int mt792x_poll_rx(struct napi_struct *napi, int budget)
        struct mt792x_dev *dev;
        int done;
 
-       dev = container_of(napi->dev, struct mt792x_dev, mt76.napi_dev);
+       dev = mt76_priv(napi->dev);
 
        if (!mt76_connac_pm_ref(&dev->mphy, &dev->pm)) {
                napi_complete(napi);
index 73e633d0d7004c2217c7ebcab9eaa62b48b383a6..69a7d9b2e38bd78f4ca0dc5bea199fb4875043ee 100644 (file)
@@ -641,7 +641,7 @@ int mt7996_dma_init(struct mt7996_dev *dev)
        if (ret < 0)
                return ret;
 
-       netif_napi_add_tx(&dev->mt76.tx_napi_dev, &dev->mt76.tx_napi,
+       netif_napi_add_tx(dev->mt76.tx_napi_dev, &dev->mt76.tx_napi,
                          mt7996_poll_tx);
        napi_enable(&dev->mt76.tx_napi);