]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: rtw88: Un-embed dummy device
authorBreno Leitao <leitao@debian.org>
Thu, 25 Apr 2024 08:29:09 +0000 (01:29 -0700)
committerPing-Ke Shih <pkshih@realtek.com>
Thu, 9 May 2024 06:16:39 +0000 (14:16 +0800)
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 RTL8723DE and RTL8822CE.

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/20240425082910.2824393-1-leitao@debian.org
drivers/net/wireless/realtek/rtw88/pci.c
drivers/net/wireless/realtek/rtw88/pci.h

index 7a093f3d5f7422c7ce6532bec7fe085e3e57f37b..095dcbadbeda864acdec0ae161b4efa8d639f7a9 100644 (file)
@@ -1682,12 +1682,16 @@ static int rtw_pci_napi_poll(struct napi_struct *napi, int budget)
        return work_done;
 }
 
-static void rtw_pci_napi_init(struct rtw_dev *rtwdev)
+static int rtw_pci_napi_init(struct rtw_dev *rtwdev)
 {
        struct rtw_pci *rtwpci = (struct rtw_pci *)rtwdev->priv;
 
-       init_dummy_netdev(&rtwpci->netdev);
-       netif_napi_add(&rtwpci->netdev, &rtwpci->napi, rtw_pci_napi_poll);
+       rtwpci->netdev = alloc_netdev_dummy(0);
+       if (!rtwpci->netdev)
+               return -ENOMEM;
+
+       netif_napi_add(rtwpci->netdev, &rtwpci->napi, rtw_pci_napi_poll);
+       return 0;
 }
 
 static void rtw_pci_napi_deinit(struct rtw_dev *rtwdev)
@@ -1696,6 +1700,7 @@ static void rtw_pci_napi_deinit(struct rtw_dev *rtwdev)
 
        rtw_pci_napi_stop(rtwdev);
        netif_napi_del(&rtwpci->napi);
+       free_netdev(rtwpci->netdev);
 }
 
 int rtw_pci_probe(struct pci_dev *pdev,
@@ -1745,7 +1750,11 @@ int rtw_pci_probe(struct pci_dev *pdev,
                goto err_pci_declaim;
        }
 
-       rtw_pci_napi_init(rtwdev);
+       ret = rtw_pci_napi_init(rtwdev);
+       if (ret) {
+               rtw_err(rtwdev, "failed to setup NAPI\n");
+               goto err_pci_declaim;
+       }
 
        ret = rtw_chip_info_setup(rtwdev);
        if (ret) {
index 0c37efd8c66fa776be6362250a28ec154f19de58..13988db1cb4c4e3a3d9080223c3fd286312cae3c 100644 (file)
@@ -215,7 +215,7 @@ struct rtw_pci {
        bool running;
 
        /* napi structure */
-       struct net_device netdev;
+       struct net_device *netdev;
        struct napi_struct napi;
 
        u16 rx_tag;