Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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/20240229225910.79e224cf@kernel.org/ [1]
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>

authored by

Breno Leitao and committed by
Jakub Kicinski
08f116c9 d21a103b

+49 -21
+3 -3
drivers/net/wireless/mediatek/mt76/debugfs.c
··· 33 33 if (!mt76_is_mmio(dev)) 34 34 return -EOPNOTSUPP; 35 35 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); 38 38 39 39 return 0; 40 40 } ··· 44 44 { 45 45 struct mt76_dev *dev = data; 46 46 47 - *val = dev->napi_dev.threaded; 47 + *val = dev->napi_dev->threaded; 48 48 return 0; 49 49 } 50 50
+25 -6
drivers/net/wireless/mediatek/mt76/dma.c
··· 916 916 struct mt76_dev *dev; 917 917 int qid, done = 0, cur; 918 918 919 - dev = container_of(napi->dev, struct mt76_dev, napi_dev); 919 + dev = mt76_priv(napi->dev); 920 920 qid = napi - dev->napi; 921 921 922 922 rcu_read_lock(); ··· 940 940 mt76_dma_init(struct mt76_dev *dev, 941 941 int (*poll)(struct napi_struct *napi, int budget)) 942 942 { 943 + struct mt76_dev **priv; 943 944 int i; 944 945 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", 948 965 wiphy_name(dev->hw->wiphy)); 949 - dev->napi_dev.threaded = 1; 966 + dev->napi_dev->threaded = 1; 950 967 init_completion(&dev->mmio.wed_reset); 951 968 init_completion(&dev->mmio.wed_reset_complete); 952 969 953 970 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); 955 972 mt76_dma_rx_fill(dev, &dev->q_rx[i], false); 956 973 napi_enable(&dev->napi[i]); 957 974 } ··· 1036 1019 1037 1020 mt76_free_pending_txwi(dev); 1038 1021 mt76_free_pending_rxwi(dev); 1022 + free_netdev(dev->napi_dev); 1023 + free_netdev(dev->tx_napi_dev); 1039 1024 } 1040 1025 EXPORT_SYMBOL_GPL(mt76_dma_cleanup);
+9
drivers/net/wireless/mediatek/mt76/dma.h
··· 116 116 } 117 117 } 118 118 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 + 119 128 #endif
+2 -2
drivers/net/wireless/mediatek/mt76/mt76.h
··· 831 831 832 832 struct mt76_mcu mcu; 833 833 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; 836 836 spinlock_t rx_lock; 837 837 struct napi_struct napi[__MT_RXQ_MAX]; 838 838 struct sk_buff_head rx_skb[__MT_RXQ_MAX];
+1 -1
drivers/net/wireless/mediatek/mt76/mt7603/dma.c
··· 242 242 if (ret) 243 243 return ret; 244 244 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, 246 246 mt7603_poll_tx); 247 247 napi_enable(&dev->mt76.tx_napi); 248 248
+3 -3
drivers/net/wireless/mediatek/mt76/mt7615/dma.c
··· 67 67 { 68 68 struct mt7615_dev *dev; 69 69 70 - dev = container_of(napi, struct mt7615_dev, mt76.tx_napi); 70 + dev = mt76_priv(napi->dev); 71 71 if (!mt76_connac_pm_ref(&dev->mphy, &dev->pm)) { 72 72 napi_complete(napi); 73 73 queue_work(dev->mt76.wq, &dev->pm.wake_work); ··· 89 89 struct mt7615_dev *dev; 90 90 int done; 91 91 92 - dev = container_of(napi->dev, struct mt7615_dev, mt76.napi_dev); 92 + dev = mt76_priv(napi->dev); 93 93 94 94 if (!mt76_connac_pm_ref(&dev->mphy, &dev->pm)) { 95 95 napi_complete(napi); ··· 282 282 if (ret < 0) 283 283 return ret; 284 284 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, 286 286 mt7615_poll_tx); 287 287 napi_enable(&dev->mt76.tx_napi); 288 288
+1 -1
drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c
··· 239 239 if (ret) 240 240 return ret; 241 241 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, 243 243 mt76x02_poll_tx); 244 244 napi_enable(&dev->mt76.tx_napi); 245 245
+1 -1
drivers/net/wireless/mediatek/mt76/mt7915/dma.c
··· 578 578 if (ret < 0) 579 579 return ret; 580 580 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, 582 582 mt7915_poll_tx); 583 583 napi_enable(&dev->mt76.tx_napi); 584 584
+1 -1
drivers/net/wireless/mediatek/mt76/mt7921/pci.c
··· 219 219 if (ret < 0) 220 220 return ret; 221 221 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, 223 223 mt792x_poll_tx); 224 224 napi_enable(&dev->mt76.tx_napi); 225 225
+1 -1
drivers/net/wireless/mediatek/mt76/mt7925/pci.c
··· 254 254 if (ret < 0) 255 255 return ret; 256 256 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, 258 258 mt792x_poll_tx); 259 259 napi_enable(&dev->mt76.tx_napi); 260 260
+1 -1
drivers/net/wireless/mediatek/mt76/mt792x_dma.c
··· 340 340 struct mt792x_dev *dev; 341 341 int done; 342 342 343 - dev = container_of(napi->dev, struct mt792x_dev, mt76.napi_dev); 343 + dev = mt76_priv(napi->dev); 344 344 345 345 if (!mt76_connac_pm_ref(&dev->mphy, &dev->pm)) { 346 346 napi_complete(napi);
+1 -1
drivers/net/wireless/mediatek/mt76/mt7996/dma.c
··· 641 641 if (ret < 0) 642 642 return ret; 643 643 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, 645 645 mt7996_poll_tx); 646 646 napi_enable(&dev->mt76.tx_napi); 647 647