mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH 0/5] wfx: add support for WoWLAN on Silabs WF200
@ 2025-02-28 17:14 Jérôme Pouiller
  2025-02-28 17:14 ` [PATCH 1/5] wifi: wfx: align declarations between bus_spi.c and bus_sdio.c Jérôme Pouiller
                   ` (4 more replies)
  0 siblings, 5 replies; 7+ messages in thread
From: Jérôme Pouiller @ 2025-02-28 17:14 UTC (permalink / raw)
  To: linux-wireless
  Cc: linux-kernel, Kalle Valo, linux-devel, Jérôme Pouiller

This is the initial support for Wake-on-WLAN of Silicon WF200 chipset. This
version focus on the power management control. For now, the filtering
capabilities of the chip are not exposed. So any multicast frame (= any ARP
request) will wake up the host.

I have this series of patches in my git tree for a while. I hesitated to
send it because the code is based on a proof of concept and I don't have
access to the hardware anymore.

Therefore, this feature is experimental. However, the only way to reach
this code is to run "iw phy phy0 wowlan enable" or explicitly enable it in
/sys. So, I believe it makes sense to merged it in the stable tree. Thus, I
hope some users will be able to report their success (or their failure).



Jérôme Pouiller (5):
  wifi: wfx: align declarations between bus_spi.c and bus_sdio.c
  wifi: wfx: declare support for WoWLAN
  wifi: wfx: allow SPI device to wake up the host
  wifi: wfx: allow SDIO device to wake up the host
  wifi: wfx: allow to enable WoWLAN using NL80211

 drivers/net/wireless/silabs/wfx/bus.h      |  1 +
 drivers/net/wireless/silabs/wfx/bus_sdio.c | 52 ++++++++++++++++++++++
 drivers/net/wireless/silabs/wfx/bus_spi.c  | 45 +++++++++++++++++--
 drivers/net/wireless/silabs/wfx/main.c     | 10 +++++
 drivers/net/wireless/silabs/wfx/sta.c      | 25 +++++++++++
 drivers/net/wireless/silabs/wfx/sta.h      |  3 ++
 6 files changed, 132 insertions(+), 4 deletions(-)

-- 
2.39.5


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH 1/5] wifi: wfx: align declarations between bus_spi.c and bus_sdio.c
  2025-02-28 17:14 [PATCH 0/5] wfx: add support for WoWLAN on Silabs WF200 Jérôme Pouiller
@ 2025-02-28 17:14 ` Jérôme Pouiller
  2025-02-28 17:14 ` [PATCH 2/5] wifi: wfx: declare support for WoWLAN Jérôme Pouiller
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 7+ messages in thread
From: Jérôme Pouiller @ 2025-02-28 17:14 UTC (permalink / raw)
  To: linux-wireless
  Cc: linux-kernel, Kalle Valo, linux-devel, Jérôme Pouiller

Just declare fields in the same order in bus_spi.c and bus_sdio.c

Signed-off-by: Jérôme Pouiller <jerome.pouiller@silabs.com>
---
 drivers/net/wireless/silabs/wfx/bus_spi.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/net/wireless/silabs/wfx/bus_spi.c b/drivers/net/wireless/silabs/wfx/bus_spi.c
index 160b90114aad..46278dce7ffc 100644
--- a/drivers/net/wireless/silabs/wfx/bus_spi.c
+++ b/drivers/net/wireless/silabs/wfx/bus_spi.c
@@ -274,11 +274,11 @@ MODULE_DEVICE_TABLE(of, wfx_spi_of_match);
 #endif
 
 struct spi_driver wfx_spi_driver = {
+	.id_table = wfx_spi_id,
+	.probe = wfx_spi_probe,
+	.remove = wfx_spi_remove,
 	.driver = {
 		.name = "wfx-spi",
 		.of_match_table = of_match_ptr(wfx_spi_of_match),
 	},
-	.id_table = wfx_spi_id,
-	.probe = wfx_spi_probe,
-	.remove = wfx_spi_remove,
 };
-- 
2.39.5


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH 2/5] wifi: wfx: declare support for WoWLAN
  2025-02-28 17:14 [PATCH 0/5] wfx: add support for WoWLAN on Silabs WF200 Jérôme Pouiller
  2025-02-28 17:14 ` [PATCH 1/5] wifi: wfx: align declarations between bus_spi.c and bus_sdio.c Jérôme Pouiller
@ 2025-02-28 17:14 ` Jérôme Pouiller
  2025-03-02  2:19   ` kernel test robot
  2025-02-28 17:14 ` [PATCH 3/5] wifi: wfx: allow SPI device to wake up the host Jérôme Pouiller
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 7+ messages in thread
From: Jérôme Pouiller @ 2025-02-28 17:14 UTC (permalink / raw)
  To: linux-wireless
  Cc: linux-kernel, Kalle Valo, linux-devel, Jérôme Pouiller

WF200 is able to keep the connection with the AP alive while the host is
asleep. So, let's expose this capability to the user.

For now, we don't provide any way to control the device filtering
features. The user has to allow wake-up on any received packets and on
disconnections.

Signed-off-by: Jérôme Pouiller <jerome.pouiller@silabs.com>
---
 drivers/net/wireless/silabs/wfx/main.c |  9 +++++++++
 drivers/net/wireless/silabs/wfx/sta.c  | 15 +++++++++++++++
 drivers/net/wireless/silabs/wfx/sta.h  |  2 ++
 3 files changed, 26 insertions(+)

diff --git a/drivers/net/wireless/silabs/wfx/main.c b/drivers/net/wireless/silabs/wfx/main.c
index 64441c8bc460..83fd278e615e 100644
--- a/drivers/net/wireless/silabs/wfx/main.c
+++ b/drivers/net/wireless/silabs/wfx/main.c
@@ -121,6 +121,10 @@ static const struct ieee80211_iface_combination wfx_iface_combinations[] = {
 	}
 };
 
+static const struct wiphy_wowlan_support wfx_wowlan_support = {
+	.flags = WIPHY_WOWLAN_ANY | WIPHY_WOWLAN_DISCONNECT,
+};
+
 static const struct ieee80211_ops wfx_ops = {
 	.start                   = wfx_start,
 	.stop                    = wfx_stop,
@@ -153,6 +157,10 @@ static const struct ieee80211_ops wfx_ops = {
 	.unassign_vif_chanctx    = wfx_unassign_vif_chanctx,
 	.remain_on_channel       = wfx_remain_on_channel,
 	.cancel_remain_on_channel = wfx_cancel_remain_on_channel,
+#ifdef CONFIG_PM
+	.suspend                 = wfx_suspend,
+	.resume                  = wfx_resume,
+#endif
 };
 
 bool wfx_api_older_than(struct wfx_dev *wdev, int major, int minor)
@@ -289,6 +297,7 @@ struct wfx_dev *wfx_init_common(struct device *dev, const struct wfx_platform_da
 					NL80211_PROBE_RESP_OFFLOAD_SUPPORT_P2P |
 					NL80211_PROBE_RESP_OFFLOAD_SUPPORT_80211U;
 	hw->wiphy->features |= NL80211_FEATURE_AP_SCAN;
+	hw->wiphy->wowlan = &wfx_wowlan_support;
 	hw->wiphy->flags |= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD;
 	hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
 	hw->wiphy->max_remain_on_channel_duration = 5000;
diff --git a/drivers/net/wireless/silabs/wfx/sta.c b/drivers/net/wireless/silabs/wfx/sta.c
index 7c04810dbf3d..9e06f8b8b90d 100644
--- a/drivers/net/wireless/silabs/wfx/sta.c
+++ b/drivers/net/wireless/silabs/wfx/sta.c
@@ -803,6 +803,21 @@ void wfx_remove_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
 	}
 }
 
+#ifdef CONFIG_PM
+int wfx_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan)
+{
+	/* FIXME: hardware also support WIPHY_WOWLAN_MAGIC_PKT and other filters */
+	if (!wowlan->any || !wowlan->disconnect)
+		return -EINVAL;
+	return 0;
+}
+
+int wfx_resume(struct ieee80211_hw *hw)
+{
+	return 0;
+}
+#endif
+
 int wfx_start(struct ieee80211_hw *hw)
 {
 	return 0;
diff --git a/drivers/net/wireless/silabs/wfx/sta.h b/drivers/net/wireless/silabs/wfx/sta.h
index 7817c7c6f3dd..70ccc8cb7ec7 100644
--- a/drivers/net/wireless/silabs/wfx/sta.h
+++ b/drivers/net/wireless/silabs/wfx/sta.h
@@ -56,6 +56,8 @@ int wfx_assign_vif_chanctx(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
 void wfx_unassign_vif_chanctx(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
 			      struct ieee80211_bss_conf *link_conf,
 			      struct ieee80211_chanctx_conf *conf);
+int wfx_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan);
+int wfx_resume(struct ieee80211_hw *hw);
 
 /* Hardware API Callbacks */
 void wfx_cooling_timeout_work(struct work_struct *work);
-- 
2.39.5


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH 3/5] wifi: wfx: allow SPI device to wake up the host
  2025-02-28 17:14 [PATCH 0/5] wfx: add support for WoWLAN on Silabs WF200 Jérôme Pouiller
  2025-02-28 17:14 ` [PATCH 1/5] wifi: wfx: align declarations between bus_spi.c and bus_sdio.c Jérôme Pouiller
  2025-02-28 17:14 ` [PATCH 2/5] wifi: wfx: declare support for WoWLAN Jérôme Pouiller
@ 2025-02-28 17:14 ` Jérôme Pouiller
  2025-02-28 17:14 ` [PATCH 4/5] wifi: wfx: allow SDIO " Jérôme Pouiller
  2025-02-28 17:14 ` [PATCH 5/5] wifi: wfx: allow to enable WoWLAN using NL80211 Jérôme Pouiller
  4 siblings, 0 replies; 7+ messages in thread
From: Jérôme Pouiller @ 2025-02-28 17:14 UTC (permalink / raw)
  To: linux-wireless
  Cc: linux-kernel, Kalle Valo, linux-devel, Jérôme Pouiller

When the host is asleep, the device has wake up the host using the
usual SPI IRQ.

Signed-off-by: Jérôme Pouiller <jerome.pouiller@silabs.com>
---
 drivers/net/wireless/silabs/wfx/bus_spi.c | 31 ++++++++++++++++++++++-
 1 file changed, 30 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/silabs/wfx/bus_spi.c b/drivers/net/wireless/silabs/wfx/bus_spi.c
index 46278dce7ffc..1d6bf3525f4e 100644
--- a/drivers/net/wireless/silabs/wfx/bus_spi.c
+++ b/drivers/net/wireless/silabs/wfx/bus_spi.c
@@ -13,6 +13,7 @@
 #include <linux/interrupt.h>
 #include <linux/irq.h>
 #include <linux/of.h>
+#include <linux/pm.h>
 
 #include "bus.h"
 #include "wfx.h"
@@ -189,6 +190,26 @@ static const struct wfx_hwbus_ops wfx_spi_hwbus_ops = {
 	.align_size      = wfx_spi_align_size,
 };
 
+static int wfx_spi_suspend(struct device *dev)
+{
+	struct spi_device *func = to_spi_device(dev);
+	struct wfx_spi_priv *bus = spi_get_drvdata(func);
+
+	if (!device_may_wakeup(dev))
+		return 0;
+	flush_work(&bus->core->hif.bh);
+	return enable_irq_wake(func->irq);
+}
+
+static int wfx_spi_resume(struct device *dev)
+{
+	struct spi_device *func = to_spi_device(dev);
+
+	if (!device_may_wakeup(dev))
+		return 0;
+	return disable_irq_wake(func->irq);
+}
+
 static int wfx_spi_probe(struct spi_device *func)
 {
 	struct wfx_platform_data *pdata;
@@ -239,7 +260,12 @@ static int wfx_spi_probe(struct spi_device *func)
 	if (!bus->core)
 		return -EIO;
 
-	return wfx_probe(bus->core);
+	ret = wfx_probe(bus->core);
+	if (ret)
+		return ret;
+
+	device_set_wakeup_capable(&func->dev, true);
+	return 0;
 }
 
 static void wfx_spi_remove(struct spi_device *func)
@@ -273,6 +299,8 @@ static const struct of_device_id wfx_spi_of_match[] = {
 MODULE_DEVICE_TABLE(of, wfx_spi_of_match);
 #endif
 
+DEFINE_SIMPLE_DEV_PM_OPS(wfx_spi_pm_ops, wfx_spi_suspend, wfx_spi_resume);
+
 struct spi_driver wfx_spi_driver = {
 	.id_table = wfx_spi_id,
 	.probe = wfx_spi_probe,
@@ -280,5 +308,6 @@ struct spi_driver wfx_spi_driver = {
 	.driver = {
 		.name = "wfx-spi",
 		.of_match_table = of_match_ptr(wfx_spi_of_match),
+		.pm = &wfx_spi_pm_ops,
 	},
 };
-- 
2.39.5


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH 4/5] wifi: wfx: allow SDIO device to wake up the host
  2025-02-28 17:14 [PATCH 0/5] wfx: add support for WoWLAN on Silabs WF200 Jérôme Pouiller
                   ` (2 preceding siblings ...)
  2025-02-28 17:14 ` [PATCH 3/5] wifi: wfx: allow SPI device to wake up the host Jérôme Pouiller
@ 2025-02-28 17:14 ` Jérôme Pouiller
  2025-02-28 17:14 ` [PATCH 5/5] wifi: wfx: allow to enable WoWLAN using NL80211 Jérôme Pouiller
  4 siblings, 0 replies; 7+ messages in thread
From: Jérôme Pouiller @ 2025-02-28 17:14 UTC (permalink / raw)
  To: linux-wireless
  Cc: linux-kernel, Kalle Valo, linux-devel, Jérôme Pouiller

If the device is connected with SDIO bus, it can wake up the host using
either the SDIO controller (that requires MMC_PM_WAKE_SDIO_IRQ
capability) or the out-of-bound IRQ. This patch allows both.

Obviously, the SDIO controller must be able to keep the SDIO device
powered on.

Signed-off-by: Jérôme Pouiller <jerome.pouiller@silabs.com>
---
 drivers/net/wireless/silabs/wfx/bus_sdio.c | 44 ++++++++++++++++++++++
 1 file changed, 44 insertions(+)

diff --git a/drivers/net/wireless/silabs/wfx/bus_sdio.c b/drivers/net/wireless/silabs/wfx/bus_sdio.c
index f290eecde773..bd8e1ffb61bb 100644
--- a/drivers/net/wireless/silabs/wfx/bus_sdio.c
+++ b/drivers/net/wireless/silabs/wfx/bus_sdio.c
@@ -14,6 +14,7 @@
 #include <linux/of_irq.h>
 #include <linux/irq.h>
 #include <linux/align.h>
+#include <linux/pm.h>
 
 #include "bus.h"
 #include "wfx.h"
@@ -191,9 +192,46 @@ static const struct of_device_id wfx_sdio_of_match[] = {
 };
 MODULE_DEVICE_TABLE(of, wfx_sdio_of_match);
 
+static int wfx_sdio_suspend(struct device *dev)
+{
+	struct sdio_func *func = dev_to_sdio_func(dev);
+	struct wfx_sdio_priv *bus = sdio_get_drvdata(func);
+	int ret;
+
+	if (!device_may_wakeup(dev))
+		return 0;
+
+	flush_work(&bus->core->hif.bh);
+	// Either "wakeup-source" attribute or out-of-band IRQ is required for WoWLAN
+	if (bus->of_irq) {
+		ret = enable_irq_wake(bus->of_irq);
+		if (ret)
+			return ret;
+	} else {
+		ret = sdio_set_host_pm_flags(func, MMC_PM_WAKE_SDIO_IRQ);
+		if (ret)
+			return ret;
+	}
+	return sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER);
+}
+
+static int wfx_sdio_resume(struct device *dev)
+{
+	struct sdio_func *func = dev_to_sdio_func(dev);
+	struct wfx_sdio_priv *bus = sdio_get_drvdata(func);
+
+	if (!device_may_wakeup(dev))
+		return 0;
+	if (bus->of_irq)
+		return disable_irq_wake(bus->of_irq);
+	else
+		return 0;
+}
+
 static int wfx_sdio_probe(struct sdio_func *func, const struct sdio_device_id *id)
 {
 	const struct wfx_platform_data *pdata = of_device_get_match_data(&func->dev);
+	mmc_pm_flag_t pm_flag = sdio_get_host_pm_caps(func);
 	struct device_node *np = func->dev.of_node;
 	struct wfx_sdio_priv *bus;
 	int ret;
@@ -235,6 +273,9 @@ static int wfx_sdio_probe(struct sdio_func *func, const struct sdio_device_id *i
 	if (ret)
 		goto sdio_release;
 
+	if (pm_flag & MMC_PM_KEEP_POWER)
+		device_set_wakeup_capable(&func->dev, true);
+
 	return 0;
 
 sdio_release:
@@ -261,6 +302,8 @@ static const struct sdio_device_id wfx_sdio_ids[] = {
 };
 MODULE_DEVICE_TABLE(sdio, wfx_sdio_ids);
 
+DEFINE_SIMPLE_DEV_PM_OPS(wfx_sdio_pm_ops, wfx_sdio_suspend, wfx_sdio_resume);
+
 struct sdio_driver wfx_sdio_driver = {
 	.name = "wfx-sdio",
 	.id_table = wfx_sdio_ids,
@@ -268,5 +311,6 @@ struct sdio_driver wfx_sdio_driver = {
 	.remove = wfx_sdio_remove,
 	.drv = {
 		.of_match_table = wfx_sdio_of_match,
+		.pm = &wfx_sdio_pm_ops,
 	}
 };
-- 
2.39.5


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH 5/5] wifi: wfx: allow to enable WoWLAN using NL80211
  2025-02-28 17:14 [PATCH 0/5] wfx: add support for WoWLAN on Silabs WF200 Jérôme Pouiller
                   ` (3 preceding siblings ...)
  2025-02-28 17:14 ` [PATCH 4/5] wifi: wfx: allow SDIO " Jérôme Pouiller
@ 2025-02-28 17:14 ` Jérôme Pouiller
  4 siblings, 0 replies; 7+ messages in thread
From: Jérôme Pouiller @ 2025-02-28 17:14 UTC (permalink / raw)
  To: linux-wireless
  Cc: linux-kernel, Kalle Valo, linux-devel, Jérôme Pouiller

It is possible to use nl80211 to request to the driver to do allow the
required bus configuration to wake-up the host.

This patch implements the required API for nl80211.

Signed-off-by: Jérôme Pouiller <jerome.pouiller@silabs.com>
---
 drivers/net/wireless/silabs/wfx/bus.h      |  1 +
 drivers/net/wireless/silabs/wfx/bus_sdio.c |  8 ++++++++
 drivers/net/wireless/silabs/wfx/bus_spi.c  |  8 ++++++++
 drivers/net/wireless/silabs/wfx/main.c     |  1 +
 drivers/net/wireless/silabs/wfx/sta.c      | 10 ++++++++++
 drivers/net/wireless/silabs/wfx/sta.h      |  1 +
 6 files changed, 29 insertions(+)

diff --git a/drivers/net/wireless/silabs/wfx/bus.h b/drivers/net/wireless/silabs/wfx/bus.h
index ccadfdd6873c..79edaef20881 100644
--- a/drivers/net/wireless/silabs/wfx/bus.h
+++ b/drivers/net/wireless/silabs/wfx/bus.h
@@ -28,6 +28,7 @@ struct wfx_hwbus_ops {
 	void (*lock)(void *bus_priv);
 	void (*unlock)(void *bus_priv);
 	size_t (*align_size)(void *bus_priv, size_t size);
+	void (*set_wakeup)(void *priv, bool enabled);
 };
 
 extern struct sdio_driver wfx_sdio_driver;
diff --git a/drivers/net/wireless/silabs/wfx/bus_sdio.c b/drivers/net/wireless/silabs/wfx/bus_sdio.c
index bd8e1ffb61bb..5540f2c66075 100644
--- a/drivers/net/wireless/silabs/wfx/bus_sdio.c
+++ b/drivers/net/wireless/silabs/wfx/bus_sdio.c
@@ -173,6 +173,13 @@ static size_t wfx_sdio_align_size(void *priv, size_t size)
 	return sdio_align_size(bus->func, size);
 }
 
+static void wfx_sdio_set_wakeup(void *priv, bool enabled)
+{
+	struct wfx_sdio_priv *bus = priv;
+
+	device_set_wakeup_enable(&bus->func->dev, enabled);
+}
+
 static const struct wfx_hwbus_ops wfx_sdio_hwbus_ops = {
 	.copy_from_io    = wfx_sdio_copy_from_io,
 	.copy_to_io      = wfx_sdio_copy_to_io,
@@ -181,6 +188,7 @@ static const struct wfx_hwbus_ops wfx_sdio_hwbus_ops = {
 	.lock            = wfx_sdio_lock,
 	.unlock          = wfx_sdio_unlock,
 	.align_size      = wfx_sdio_align_size,
+	.set_wakeup      = wfx_sdio_set_wakeup,
 };
 
 static const struct of_device_id wfx_sdio_of_match[] = {
diff --git a/drivers/net/wireless/silabs/wfx/bus_spi.c b/drivers/net/wireless/silabs/wfx/bus_spi.c
index 1d6bf3525f4e..257bc3cd1197 100644
--- a/drivers/net/wireless/silabs/wfx/bus_spi.c
+++ b/drivers/net/wireless/silabs/wfx/bus_spi.c
@@ -180,6 +180,13 @@ static size_t wfx_spi_align_size(void *priv, size_t size)
 	return ALIGN(size, 4);
 }
 
+static void wfx_spi_set_wakeup(void *priv, bool enabled)
+{
+	struct wfx_spi_priv *bus = priv;
+
+	device_set_wakeup_enable(&bus->func->dev, enabled);
+}
+
 static const struct wfx_hwbus_ops wfx_spi_hwbus_ops = {
 	.copy_from_io    = wfx_spi_copy_from_io,
 	.copy_to_io      = wfx_spi_copy_to_io,
@@ -188,6 +195,7 @@ static const struct wfx_hwbus_ops wfx_spi_hwbus_ops = {
 	.lock            = wfx_spi_lock,
 	.unlock          = wfx_spi_unlock,
 	.align_size      = wfx_spi_align_size,
+	.set_wakeup      = wfx_spi_set_wakeup,
 };
 
 static int wfx_spi_suspend(struct device *dev)
diff --git a/drivers/net/wireless/silabs/wfx/main.c b/drivers/net/wireless/silabs/wfx/main.c
index 83fd278e615e..17ba2c59e53d 100644
--- a/drivers/net/wireless/silabs/wfx/main.c
+++ b/drivers/net/wireless/silabs/wfx/main.c
@@ -160,6 +160,7 @@ static const struct ieee80211_ops wfx_ops = {
 #ifdef CONFIG_PM
 	.suspend                 = wfx_suspend,
 	.resume                  = wfx_resume,
+	.set_wakeup              = wfx_set_wakeup,
 #endif
 };
 
diff --git a/drivers/net/wireless/silabs/wfx/sta.c b/drivers/net/wireless/silabs/wfx/sta.c
index 9e06f8b8b90d..e95b9ded17d9 100644
--- a/drivers/net/wireless/silabs/wfx/sta.c
+++ b/drivers/net/wireless/silabs/wfx/sta.c
@@ -10,6 +10,7 @@
 
 #include "sta.h"
 #include "wfx.h"
+#include "bus.h"
 #include "fwio.h"
 #include "bh.h"
 #include "key.h"
@@ -816,6 +817,15 @@ int wfx_resume(struct ieee80211_hw *hw)
 {
 	return 0;
 }
+
+void wfx_set_wakeup(struct ieee80211_hw *hw, bool enabled)
+{
+	struct wfx_dev *wdev = hw->priv;
+
+	if (enabled)
+		dev_info(wdev->dev, "support for WoWLAN is experimental\n");
+	wdev->hwbus_ops->set_wakeup(wdev->hwbus_priv, enabled);
+}
 #endif
 
 int wfx_start(struct ieee80211_hw *hw)
diff --git a/drivers/net/wireless/silabs/wfx/sta.h b/drivers/net/wireless/silabs/wfx/sta.h
index 70ccc8cb7ec7..8702eed5267f 100644
--- a/drivers/net/wireless/silabs/wfx/sta.h
+++ b/drivers/net/wireless/silabs/wfx/sta.h
@@ -58,6 +58,7 @@ void wfx_unassign_vif_chanctx(struct ieee80211_hw *hw, struct ieee80211_vif *vif
 			      struct ieee80211_chanctx_conf *conf);
 int wfx_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan);
 int wfx_resume(struct ieee80211_hw *hw);
+void wfx_set_wakeup(struct ieee80211_hw *hw, bool enabled);
 
 /* Hardware API Callbacks */
 void wfx_cooling_timeout_work(struct work_struct *work);
-- 
2.39.5


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 2/5] wifi: wfx: declare support for WoWLAN
  2025-02-28 17:14 ` [PATCH 2/5] wifi: wfx: declare support for WoWLAN Jérôme Pouiller
@ 2025-03-02  2:19   ` kernel test robot
  0 siblings, 0 replies; 7+ messages in thread
From: kernel test robot @ 2025-03-02  2:19 UTC (permalink / raw)
  To: Jérôme Pouiller, linux-wireless
  Cc: oe-kbuild-all, linux-kernel, Kalle Valo, linux-devel,
	Jérôme Pouiller

Hi Jérôme,

kernel test robot noticed the following build errors:

[auto build test ERROR on wireless-next/main]
[also build test ERROR on wireless/main linus/master v6.14-rc4 next-20250228]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/J-r-me-Pouiller/wifi-wfx-align-declarations-between-bus_spi-c-and-bus_sdio-c/20250301-022722
base:   https://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless-next.git main
patch link:    https://lore.kernel.org/r/20250228171441.109321-3-jerome.pouiller%40silabs.com
patch subject: [PATCH 2/5] wifi: wfx: declare support for WoWLAN
config: alpha-allyesconfig (https://download.01.org/0day-ci/archive/20250302/202503021057.5qCOqraa-lkp@intel.com/config)
compiler: alpha-linux-gcc (GCC) 14.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250302/202503021057.5qCOqraa-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202503021057.5qCOqraa-lkp@intel.com/

All errors (new ones prefixed by >>):

   drivers/net/wireless/silabs/wfx/main.c: In function 'wfx_init_common':
>> drivers/net/wireless/silabs/wfx/main.c:300:18: error: 'struct wiphy' has no member named 'wowlan'
     300 |         hw->wiphy->wowlan = &wfx_wowlan_support;
         |                  ^~


vim +300 drivers/net/wireless/silabs/wfx/main.c

   263	
   264	struct wfx_dev *wfx_init_common(struct device *dev, const struct wfx_platform_data *pdata,
   265					const struct wfx_hwbus_ops *hwbus_ops, void *hwbus_priv)
   266	{
   267		struct ieee80211_hw *hw;
   268		struct wfx_dev *wdev;
   269	
   270		hw = ieee80211_alloc_hw(sizeof(struct wfx_dev), &wfx_ops);
   271		if (!hw)
   272			return NULL;
   273	
   274		SET_IEEE80211_DEV(hw, dev);
   275	
   276		ieee80211_hw_set(hw, TX_AMPDU_SETUP_IN_HW);
   277		ieee80211_hw_set(hw, AMPDU_AGGREGATION);
   278		ieee80211_hw_set(hw, CONNECTION_MONITOR);
   279		ieee80211_hw_set(hw, REPORTS_TX_ACK_STATUS);
   280		ieee80211_hw_set(hw, SUPPORTS_DYNAMIC_PS);
   281		ieee80211_hw_set(hw, SIGNAL_DBM);
   282		ieee80211_hw_set(hw, SUPPORTS_PS);
   283		ieee80211_hw_set(hw, MFP_CAPABLE);
   284	
   285		hw->vif_data_size = sizeof(struct wfx_vif);
   286		hw->sta_data_size = sizeof(struct wfx_sta_priv);
   287		hw->queues = 4;
   288		hw->max_rates = 8;
   289		hw->max_rate_tries = 8;
   290		hw->extra_tx_headroom = sizeof(struct wfx_hif_msg) + sizeof(struct wfx_hif_req_tx) +
   291					4 /* alignment */ + 8 /* TKIP IV */;
   292		hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
   293					     BIT(NL80211_IFTYPE_ADHOC) |
   294					     BIT(NL80211_IFTYPE_AP);
   295		hw->wiphy->probe_resp_offload = NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS |
   296						NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS2 |
   297						NL80211_PROBE_RESP_OFFLOAD_SUPPORT_P2P |
   298						NL80211_PROBE_RESP_OFFLOAD_SUPPORT_80211U;
   299		hw->wiphy->features |= NL80211_FEATURE_AP_SCAN;
 > 300		hw->wiphy->wowlan = &wfx_wowlan_support;
   301		hw->wiphy->flags |= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD;
   302		hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
   303		hw->wiphy->max_remain_on_channel_duration = 5000;
   304		hw->wiphy->max_ap_assoc_sta = HIF_LINK_ID_MAX;
   305		hw->wiphy->max_scan_ssids = 2;
   306		hw->wiphy->max_scan_ie_len = IEEE80211_MAX_DATA_LEN;
   307		hw->wiphy->n_iface_combinations = ARRAY_SIZE(wfx_iface_combinations);
   308		hw->wiphy->iface_combinations = wfx_iface_combinations;
   309		/* FIXME: also copy wfx_rates and wfx_2ghz_chantable */
   310		hw->wiphy->bands[NL80211_BAND_2GHZ] = devm_kmemdup(dev, &wfx_band_2ghz,
   311								   sizeof(wfx_band_2ghz), GFP_KERNEL);
   312		if (!hw->wiphy->bands[NL80211_BAND_2GHZ])
   313			goto err;
   314	
   315		wdev = hw->priv;
   316		wdev->hw = hw;
   317		wdev->dev = dev;
   318		wdev->hwbus_ops = hwbus_ops;
   319		wdev->hwbus_priv = hwbus_priv;
   320		memcpy(&wdev->pdata, pdata, sizeof(*pdata));
   321		of_property_read_string(dev->of_node, "silabs,antenna-config-file", &wdev->pdata.file_pds);
   322		wdev->pdata.gpio_wakeup = devm_gpiod_get_optional(dev, "wakeup", GPIOD_OUT_LOW);
   323		if (IS_ERR(wdev->pdata.gpio_wakeup))
   324			goto err;
   325	
   326		if (wdev->pdata.gpio_wakeup)
   327			gpiod_set_consumer_name(wdev->pdata.gpio_wakeup, "wfx wakeup");
   328	
   329		mutex_init(&wdev->conf_mutex);
   330		mutex_init(&wdev->scan_lock);
   331		mutex_init(&wdev->rx_stats_lock);
   332		mutex_init(&wdev->tx_power_loop_info_lock);
   333		init_completion(&wdev->firmware_ready);
   334		INIT_DELAYED_WORK(&wdev->cooling_timeout_work, wfx_cooling_timeout_work);
   335		skb_queue_head_init(&wdev->tx_pending);
   336		init_waitqueue_head(&wdev->tx_dequeue);
   337		wfx_init_hif_cmd(&wdev->hif_cmd);
   338	
   339		if (devm_add_action_or_reset(dev, wfx_free_common, wdev))
   340			return NULL;
   341	
   342		return wdev;
   343	
   344	err:
   345		ieee80211_free_hw(hw);
   346		return NULL;
   347	}
   348	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2025-03-02  2:20 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-02-28 17:14 [PATCH 0/5] wfx: add support for WoWLAN on Silabs WF200 Jérôme Pouiller
2025-02-28 17:14 ` [PATCH 1/5] wifi: wfx: align declarations between bus_spi.c and bus_sdio.c Jérôme Pouiller
2025-02-28 17:14 ` [PATCH 2/5] wifi: wfx: declare support for WoWLAN Jérôme Pouiller
2025-03-02  2:19   ` kernel test robot
2025-02-28 17:14 ` [PATCH 3/5] wifi: wfx: allow SPI device to wake up the host Jérôme Pouiller
2025-02-28 17:14 ` [PATCH 4/5] wifi: wfx: allow SDIO " Jérôme Pouiller
2025-02-28 17:14 ` [PATCH 5/5] wifi: wfx: allow to enable WoWLAN using NL80211 Jérôme Pouiller

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®