diff mbox series

[wireless] wifi: rtw89: Un-embed dummy device

Message ID 20240424182351.3936556-1-leitao@debian.org (mailing list archive)
State Accepted
Delegated to: Ping-Ke Shih
Headers show
Series [wireless] wifi: rtw89: Un-embed dummy device | expand

Commit Message

Breno Leitao April 24, 2024, 6:23 p.m. UTC
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/

Signed-off-by: Breno Leitao <leitao@debian.org>
---
 drivers/net/wireless/realtek/rtw89/core.c | 11 ++++++++---
 drivers/net/wireless/realtek/rtw89/core.h |  4 ++--
 drivers/net/wireless/realtek/rtw89/pci.c  |  6 +++++-
 3 files changed, 15 insertions(+), 6 deletions(-)

PS: This is compile-tested only due to lack of hardware.

Comments

Ping-Ke Shih April 25, 2024, 5:52 a.m. UTC | #1
Breno Leitao <leitao@debian.org> wrote:
> 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/
> 
> Signed-off-by: Breno Leitao <leitao@debian.org>

I think this patch should go via net-next tree, because wireless-next tree
doesn't have patch of dummy devices yet.

Acked-by: Ping-Ke Shih <pkshih@realtek.com>

> ---
>  drivers/net/wireless/realtek/rtw89/core.c | 11 ++++++++---
>  drivers/net/wireless/realtek/rtw89/core.h |  4 ++--
>  drivers/net/wireless/realtek/rtw89/pci.c  |  6 +++++-
>  3 files changed, 15 insertions(+), 6 deletions(-)
> 
> PS: This is compile-tested only due to lack of hardware.

I picked this patch to local net-next tree, and tested on RTL8852BE, RTL8852C
and RTL8922AE.

Tested-by: Ping-Ke Shih <pkshih@realtek.com>
Kalle Valo April 25, 2024, 5:57 a.m. UTC | #2
Ping-Ke Shih <pkshih@realtek.com> writes:

> Breno Leitao <leitao@debian.org> wrote:
>> 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/
>> 
>> Signed-off-by: Breno Leitao <leitao@debian.org>
>
> I think this patch should go via net-next tree, because wireless-next tree
> doesn't have patch of dummy devices yet.
>
> Acked-by: Ping-Ke Shih <pkshih@realtek.com>

FWIW I sent the wireless-next pull request yesterday and once it pulled
we will fast forward wireless-next to latest net-next.
Kalle Valo April 25, 2024, 6 a.m. UTC | #3
Kalle Valo <kvalo@kernel.org> writes:

> Ping-Ke Shih <pkshih@realtek.com> writes:
>
>> Breno Leitao <leitao@debian.org> wrote:
>>> 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/
>>> 
>>> Signed-off-by: Breno Leitao <leitao@debian.org>
>>
>> I think this patch should go via net-next tree, because wireless-next tree
>> doesn't have patch of dummy devices yet.
>>
>> Acked-by: Ping-Ke Shih <pkshih@realtek.com>
>
> FWIW I sent the wireless-next pull request yesterday and once it pulled
> we will fast forward wireless-next to latest net-next.

Oh, I just realised that this is not CCed to netdev so their patchwork
won't even see the patch. Ping, I recommend that you wait for the
dependency commits to trickle down to your tree and then apply the
patch. That's the simplest approach and no need to resend anything.
Ping-Ke Shih April 25, 2024, 6:15 a.m. UTC | #4
Kalle Valo <kvalo@kernel.org> wrote:
> Kalle Valo <kvalo@kernel.org> writes:
> 
> > Ping-Ke Shih <pkshih@realtek.com> writes:
> >
> >> Breno Leitao <leitao@debian.org> wrote:
> >>> 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/
> >>>
> >>> Signed-off-by: Breno Leitao <leitao@debian.org>
> >>
> >> I think this patch should go via net-next tree, because wireless-next tree
> >> doesn't have patch of dummy devices yet.
> >>
> >> Acked-by: Ping-Ke Shih <pkshih@realtek.com>
> >
> > FWIW I sent the wireless-next pull request yesterday and once it pulled
> > we will fast forward wireless-next to latest net-next.
> 
> Oh, I just realised that this is not CCed to netdev so their patchwork
> won't even see the patch. Ping, I recommend that you wait for the
> dependency commits to trickle down to your tree and then apply the
> patch. That's the simplest approach and no need to resend anything.

Okay. If we don't hurry to get this patch merged, I will apply this patch
to my tree.
Ping-Ke Shih May 9, 2024, 6:14 a.m. UTC | #5
Breno Leitao <leitao@debian.org> wrote:

> 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/
> 
> Signed-off-by: Breno Leitao <leitao@debian.org>
> Acked-by: Ping-Ke Shih <pkshih@realtek.com>
> Tested-by: Ping-Ke Shih <pkshih@realtek.com>

1 patch(es) applied to rtw-next branch of rtw.git, thanks.

4c9aa94a39e6 wifi: rtw89: Un-embed dummy device

---
https://github.com/pkshih/rtw.git
diff mbox series

Patch

diff --git a/drivers/net/wireless/realtek/rtw89/core.c b/drivers/net/wireless/realtek/rtw89/core.c
index d474b8d5df3d..ade3e2a953a1 100644
--- a/drivers/net/wireless/realtek/rtw89/core.c
+++ b/drivers/net/wireless/realtek/rtw89/core.c
@@ -2485,11 +2485,15 @@  void rtw89_core_napi_stop(struct rtw89_dev *rtwdev)
 }
 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);
 
@@ -2497,6 +2501,7 @@  void rtw89_core_napi_deinit(struct rtw89_dev *rtwdev)
 {
 	rtw89_core_napi_stop(rtwdev);
 	netif_napi_del(&rtwdev->napi);
+	free_netdev(rtwdev->netdev);
 }
 EXPORT_SYMBOL(rtw89_core_napi_deinit);
 
diff --git a/drivers/net/wireless/realtek/rtw89/core.h b/drivers/net/wireless/realtek/rtw89/core.h
index fc1ed8612cf1..e206a2186747 100644
--- a/drivers/net/wireless/realtek/rtw89/core.h
+++ b/drivers/net/wireless/realtek/rtw89/core.h
@@ -5239,7 +5239,7 @@  struct rtw89_dev {
 	struct rtw89_wow_param wow;
 
 	/* napi structure */
-	struct net_device netdev;
+	struct net_device *netdev;
 	struct napi_struct napi;
 	int napi_budget_countdown;
 
@@ -6211,7 +6211,7 @@  void rtw89_core_query_rxdesc_v2(struct rtw89_dev *rtwdev,
 				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,
diff --git a/drivers/net/wireless/realtek/rtw89/pci.c b/drivers/net/wireless/realtek/rtw89/pci.c
index 19001130ad94..ef41c3a83b4a 100644
--- a/drivers/net/wireless/realtek/rtw89/pci.c
+++ b/drivers/net/wireless/realtek/rtw89/pci.c
@@ -4201,7 +4201,11 @@  int rtw89_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 	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) {