Skip to content

Commit 08f116c

Browse files
leitaokuba-moo
authored andcommitted
wifi: mt76: un-embedd netdev from mt76_dev
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/[email protected]/ [1] Reviewed-by: Simon Horman <[email protected]> Signed-off-by: Breno Leitao <[email protected]> Acked-by: Kalle Valo <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent d21a103 commit 08f116c

File tree

12 files changed

+49
-21
lines changed

12 files changed

+49
-21
lines changed

drivers/net/wireless/mediatek/mt76/debugfs.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ mt76_napi_threaded_set(void *data, u64 val)
3333
if (!mt76_is_mmio(dev))
3434
return -EOPNOTSUPP;
3535

36-
if (dev->napi_dev.threaded != val)
37-
return dev_set_threaded(&dev->napi_dev, val);
36+
if (dev->napi_dev->threaded != val)
37+
return dev_set_threaded(dev->napi_dev, val);
3838

3939
return 0;
4040
}
@@ -44,7 +44,7 @@ mt76_napi_threaded_get(void *data, u64 *val)
4444
{
4545
struct mt76_dev *dev = data;
4646

47-
*val = dev->napi_dev.threaded;
47+
*val = dev->napi_dev->threaded;
4848
return 0;
4949
}
5050

drivers/net/wireless/mediatek/mt76/dma.c

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -916,7 +916,7 @@ int mt76_dma_rx_poll(struct napi_struct *napi, int budget)
916916
struct mt76_dev *dev;
917917
int qid, done = 0, cur;
918918

919-
dev = container_of(napi->dev, struct mt76_dev, napi_dev);
919+
dev = mt76_priv(napi->dev);
920920
qid = napi - dev->napi;
921921

922922
rcu_read_lock();
@@ -940,18 +940,35 @@ static int
940940
mt76_dma_init(struct mt76_dev *dev,
941941
int (*poll)(struct napi_struct *napi, int budget))
942942
{
943+
struct mt76_dev **priv;
943944
int i;
944945

945-
init_dummy_netdev(&dev->napi_dev);
946-
init_dummy_netdev(&dev->tx_napi_dev);
947-
snprintf(dev->napi_dev.name, sizeof(dev->napi_dev.name), "%s",
946+
dev->napi_dev = alloc_netdev_dummy(sizeof(struct mt76_dev *));
947+
if (!dev->napi_dev)
948+
return -ENOMEM;
949+
950+
/* napi_dev private data points to mt76_dev parent, so, mt76_dev
951+
* can be retrieved given napi_dev
952+
*/
953+
priv = netdev_priv(dev->napi_dev);
954+
*priv = dev;
955+
956+
dev->tx_napi_dev = alloc_netdev_dummy(sizeof(struct mt76_dev *));
957+
if (!dev->tx_napi_dev) {
958+
free_netdev(dev->napi_dev);
959+
return -ENOMEM;
960+
}
961+
priv = netdev_priv(dev->tx_napi_dev);
962+
*priv = dev;
963+
964+
snprintf(dev->napi_dev->name, sizeof(dev->napi_dev->name), "%s",
948965
wiphy_name(dev->hw->wiphy));
949-
dev->napi_dev.threaded = 1;
966+
dev->napi_dev->threaded = 1;
950967
init_completion(&dev->mmio.wed_reset);
951968
init_completion(&dev->mmio.wed_reset_complete);
952969

953970
mt76_for_each_q_rx(dev, i) {
954-
netif_napi_add(&dev->napi_dev, &dev->napi[i], poll);
971+
netif_napi_add(dev->napi_dev, &dev->napi[i], poll);
955972
mt76_dma_rx_fill(dev, &dev->q_rx[i], false);
956973
napi_enable(&dev->napi[i]);
957974
}
@@ -1019,5 +1036,7 @@ void mt76_dma_cleanup(struct mt76_dev *dev)
10191036

10201037
mt76_free_pending_txwi(dev);
10211038
mt76_free_pending_rxwi(dev);
1039+
free_netdev(dev->napi_dev);
1040+
free_netdev(dev->tx_napi_dev);
10221041
}
10231042
EXPORT_SYMBOL_GPL(mt76_dma_cleanup);

drivers/net/wireless/mediatek/mt76/dma.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,4 +116,13 @@ mt76_dma_should_drop_buf(bool *drop, u32 ctrl, u32 buf1, u32 info)
116116
}
117117
}
118118

119+
static inline void *mt76_priv(struct net_device *dev)
120+
{
121+
struct mt76_dev **priv;
122+
123+
priv = netdev_priv(dev);
124+
125+
return *priv;
126+
}
127+
119128
#endif

drivers/net/wireless/mediatek/mt76/mt76.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -831,8 +831,8 @@ struct mt76_dev {
831831

832832
struct mt76_mcu mcu;
833833

834-
struct net_device napi_dev;
835-
struct net_device tx_napi_dev;
834+
struct net_device *napi_dev;
835+
struct net_device *tx_napi_dev;
836836
spinlock_t rx_lock;
837837
struct napi_struct napi[__MT_RXQ_MAX];
838838
struct sk_buff_head rx_skb[__MT_RXQ_MAX];

drivers/net/wireless/mediatek/mt76/mt7603/dma.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ int mt7603_dma_init(struct mt7603_dev *dev)
242242
if (ret)
243243
return ret;
244244

245-
netif_napi_add_tx(&dev->mt76.tx_napi_dev, &dev->mt76.tx_napi,
245+
netif_napi_add_tx(dev->mt76.tx_napi_dev, &dev->mt76.tx_napi,
246246
mt7603_poll_tx);
247247
napi_enable(&dev->mt76.tx_napi);
248248

drivers/net/wireless/mediatek/mt76/mt7615/dma.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ static int mt7615_poll_tx(struct napi_struct *napi, int budget)
6767
{
6868
struct mt7615_dev *dev;
6969

70-
dev = container_of(napi, struct mt7615_dev, mt76.tx_napi);
70+
dev = mt76_priv(napi->dev);
7171
if (!mt76_connac_pm_ref(&dev->mphy, &dev->pm)) {
7272
napi_complete(napi);
7373
queue_work(dev->mt76.wq, &dev->pm.wake_work);
@@ -89,7 +89,7 @@ static int mt7615_poll_rx(struct napi_struct *napi, int budget)
8989
struct mt7615_dev *dev;
9090
int done;
9191

92-
dev = container_of(napi->dev, struct mt7615_dev, mt76.napi_dev);
92+
dev = mt76_priv(napi->dev);
9393

9494
if (!mt76_connac_pm_ref(&dev->mphy, &dev->pm)) {
9595
napi_complete(napi);
@@ -282,7 +282,7 @@ int mt7615_dma_init(struct mt7615_dev *dev)
282282
if (ret < 0)
283283
return ret;
284284

285-
netif_napi_add_tx(&dev->mt76.tx_napi_dev, &dev->mt76.tx_napi,
285+
netif_napi_add_tx(dev->mt76.tx_napi_dev, &dev->mt76.tx_napi,
286286
mt7615_poll_tx);
287287
napi_enable(&dev->mt76.tx_napi);
288288

drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ int mt76x02_dma_init(struct mt76x02_dev *dev)
239239
if (ret)
240240
return ret;
241241

242-
netif_napi_add_tx(&dev->mt76.tx_napi_dev, &dev->mt76.tx_napi,
242+
netif_napi_add_tx(dev->mt76.tx_napi_dev, &dev->mt76.tx_napi,
243243
mt76x02_poll_tx);
244244
napi_enable(&dev->mt76.tx_napi);
245245

drivers/net/wireless/mediatek/mt76/mt7915/dma.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -578,7 +578,7 @@ int mt7915_dma_init(struct mt7915_dev *dev, struct mt7915_phy *phy2)
578578
if (ret < 0)
579579
return ret;
580580

581-
netif_napi_add_tx(&dev->mt76.tx_napi_dev, &dev->mt76.tx_napi,
581+
netif_napi_add_tx(dev->mt76.tx_napi_dev, &dev->mt76.tx_napi,
582582
mt7915_poll_tx);
583583
napi_enable(&dev->mt76.tx_napi);
584584

drivers/net/wireless/mediatek/mt76/mt7921/pci.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ static int mt7921_dma_init(struct mt792x_dev *dev)
219219
if (ret < 0)
220220
return ret;
221221

222-
netif_napi_add_tx(&dev->mt76.tx_napi_dev, &dev->mt76.tx_napi,
222+
netif_napi_add_tx(dev->mt76.tx_napi_dev, &dev->mt76.tx_napi,
223223
mt792x_poll_tx);
224224
napi_enable(&dev->mt76.tx_napi);
225225

drivers/net/wireless/mediatek/mt76/mt7925/pci.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ static int mt7925_dma_init(struct mt792x_dev *dev)
254254
if (ret < 0)
255255
return ret;
256256

257-
netif_napi_add_tx(&dev->mt76.tx_napi_dev, &dev->mt76.tx_napi,
257+
netif_napi_add_tx(dev->mt76.tx_napi_dev, &dev->mt76.tx_napi,
258258
mt792x_poll_tx);
259259
napi_enable(&dev->mt76.tx_napi);
260260

drivers/net/wireless/mediatek/mt76/mt792x_dma.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,7 @@ int mt792x_poll_rx(struct napi_struct *napi, int budget)
340340
struct mt792x_dev *dev;
341341
int done;
342342

343-
dev = container_of(napi->dev, struct mt792x_dev, mt76.napi_dev);
343+
dev = mt76_priv(napi->dev);
344344

345345
if (!mt76_connac_pm_ref(&dev->mphy, &dev->pm)) {
346346
napi_complete(napi);

drivers/net/wireless/mediatek/mt76/mt7996/dma.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -641,7 +641,7 @@ int mt7996_dma_init(struct mt7996_dev *dev)
641641
if (ret < 0)
642642
return ret;
643643

644-
netif_napi_add_tx(&dev->mt76.tx_napi_dev, &dev->mt76.tx_napi,
644+
netif_napi_add_tx(dev->mt76.tx_napi_dev, &dev->mt76.tx_napi,
645645
mt7996_poll_tx);
646646
napi_enable(&dev->mt76.tx_napi);
647647

0 commit comments

Comments
 (0)