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/
Tested with RTL8852BE, RTL8852C and RTL8922AE.
Signed-off-by: Breno Leitao <leitao@debian.org>
Acked-by: Ping-Ke Shih <pkshih@realtek.com>
Tested-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://msgid.link/20240424182351.3936556-1-leitao@debian.org
 }
 EXPORT_SYMBOL(rtw89_core_napi_stop);
 
-void rtw89_core_napi_init(struct rtw89_dev *rtwdev)
+int rtw89_core_napi_init(struct rtw89_dev *rtwdev)
 {
-       init_dummy_netdev(&rtwdev->netdev);
-       netif_napi_add(&rtwdev->netdev, &rtwdev->napi,
+       rtwdev->netdev = alloc_netdev_dummy(0);
+       if (!rtwdev->netdev)
+               return -ENOMEM;
+
+       netif_napi_add(rtwdev->netdev, &rtwdev->napi,
                       rtwdev->hci.ops->napi_poll);
+       return 0;
 }
 EXPORT_SYMBOL(rtw89_core_napi_init);
 
 {
        rtw89_core_napi_stop(rtwdev);
        netif_napi_del(&rtwdev->napi);
+       free_netdev(rtwdev->netdev);
 }
 EXPORT_SYMBOL(rtw89_core_napi_deinit);
 
 
        struct rtw89_wow_param wow;
 
        /* napi structure */
-       struct net_device netdev;
+       struct net_device *netdev;
        struct napi_struct napi;
        int napi_budget_countdown;
 
                                u8 *data, u32 data_offset);
 void rtw89_core_napi_start(struct rtw89_dev *rtwdev);
 void rtw89_core_napi_stop(struct rtw89_dev *rtwdev);
-void rtw89_core_napi_init(struct rtw89_dev *rtwdev);
+int rtw89_core_napi_init(struct rtw89_dev *rtwdev);
 void rtw89_core_napi_deinit(struct rtw89_dev *rtwdev);
 int rtw89_core_sta_add(struct rtw89_dev *rtwdev,
                       struct ieee80211_vif *vif,
 
        rtw89_pci_link_cfg(rtwdev);
        rtw89_pci_l1ss_cfg(rtwdev);
 
-       rtw89_core_napi_init(rtwdev);
+       ret = rtw89_core_napi_init(rtwdev);
+       if (ret) {
+               rtw89_err(rtwdev, "failed to init napi\n");
+               goto err_clear_resource;
+       }
 
        ret = rtw89_pci_request_irq(rtwdev, pdev);
        if (ret) {