diff mbox series

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

Message ID 20240424182351.3936556-1-leitao@debian.org
State New
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>
Ping-Ke Shih April 25, 2024, 6:15 a.m. UTC | #2
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, 7:59 a.m. UTC | #3
Breno Leitao <leitao@debian.org> wrote:
> 
> On Thu, Apr 25, 2024 at 06:15:21AM +0000, Ping-Ke Shih wrote:
> > 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.
> 
> There is no hurry to get this patch merged.

I merged this patch today. 

> 
> Out of curiosity, why don't you rebase your tree to net-next/linux-next
> frequently?

My tree goes to wireless-next, so I think it should be always based on
wireless-next. Once wirelss-next rebase (ff-merge) net-next, my tree will
have them also.
Kalle Valo May 9, 2024, 9:48 a.m. UTC | #4
Ping-Ke Shih <pkshih@realtek.com> writes:

>> Out of curiosity, why don't you rebase your tree to net-next/linux-next
>> frequently?
>
> My tree goes to wireless-next, so I think it should be always based on
> wireless-next. Once wirelss-next rebase (ff-merge) net-next, my tree will
> have them also. 

The simple answer about updating to net-next frequently: it's
complicated :)

The long answer is that the guidance from Linus is to avoid making
unnecessary merges so we fast forward wireless-next only after it's
pulled to net-next. And we can't rebase wireless-next due to downstream
trees Ping's rtw tree, besides rebasing public git trees is evil anyway.
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) {