All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] wlcore/wl12xx: Fix wl12xx get_mac error if device is in ELP
@ 2021-06-03  6:28 Tony Lindgren
  2021-06-14 15:47 ` Kalle Valo
  0 siblings, 1 reply; 2+ messages in thread
From: Tony Lindgren @ 2021-06-03  6:28 UTC (permalink / raw)
  To: Kalle Valo
  Cc: Eyal Reizer, Guy Mishol, Raz Bouganim, linux-wireless,
	linux-omap, Carl Philipp Klemm

At least on wl12xx, reading the MAC after boot can fail with a warning
at drivers/net/wireless/ti/wlcore/sdio.c:78 wl12xx_sdio_raw_read.
The failed call comes from wl12xx_get_mac() that wlcore_nvs_cb() calls
after request_firmware_work_func().

After the error, no wireless interface is created. Reloading the wl12xx
module makes the interface work.

Turns out the wlan controller can be in a low-power ELP state after the
boot from the bootloader or kexec, and needs to be woken up first.

Let's wake the hardware and add a sleep after that similar to
wl12xx_pre_boot() is already doing.

Note that a similar issue could exist for wl18xx, but I have not seen it
so far. And a search for wl18xx_get_mac and wl12xx_sdio_raw_read did not
produce similar errors.

Cc: Carl Philipp Klemm <philipp@uvos.xyz>
Signed-off-by: Tony Lindgren <tony@atomide.com>
---
 drivers/net/wireless/ti/wl12xx/main.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/drivers/net/wireless/ti/wl12xx/main.c b/drivers/net/wireless/ti/wl12xx/main.c
--- a/drivers/net/wireless/ti/wl12xx/main.c
+++ b/drivers/net/wireless/ti/wl12xx/main.c
@@ -1503,6 +1503,13 @@ static int wl12xx_get_fuse_mac(struct wl1271 *wl)
 	u32 mac1, mac2;
 	int ret;
 
+	/* Device may be in ELP from the bootloader or kexec */
+	ret = wlcore_write32(wl, WL12XX_WELP_ARM_COMMAND, WELP_ARM_COMMAND_VAL);
+	if (ret < 0)
+		goto out;
+
+	usleep_range(500000, 700000);
+
 	ret = wlcore_set_partition(wl, &wl->ptable[PART_DRPW]);
 	if (ret < 0)
 		goto out;
-- 
2.31.1

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

* Re: [PATCH] wlcore/wl12xx: Fix wl12xx get_mac error if device is in ELP
  2021-06-03  6:28 [PATCH] wlcore/wl12xx: Fix wl12xx get_mac error if device is in ELP Tony Lindgren
@ 2021-06-14 15:47 ` Kalle Valo
  0 siblings, 0 replies; 2+ messages in thread
From: Kalle Valo @ 2021-06-14 15:47 UTC (permalink / raw)
  To: Tony Lindgren
  Cc: Eyal Reizer, Guy Mishol, Raz Bouganim, linux-wireless,
	linux-omap, Carl Philipp Klemm

Tony Lindgren <tony@atomide.com> wrote:

> At least on wl12xx, reading the MAC after boot can fail with a warning
> at drivers/net/wireless/ti/wlcore/sdio.c:78 wl12xx_sdio_raw_read.
> The failed call comes from wl12xx_get_mac() that wlcore_nvs_cb() calls
> after request_firmware_work_func().
> 
> After the error, no wireless interface is created. Reloading the wl12xx
> module makes the interface work.
> 
> Turns out the wlan controller can be in a low-power ELP state after the
> boot from the bootloader or kexec, and needs to be woken up first.
> 
> Let's wake the hardware and add a sleep after that similar to
> wl12xx_pre_boot() is already doing.
> 
> Note that a similar issue could exist for wl18xx, but I have not seen it
> so far. And a search for wl18xx_get_mac and wl12xx_sdio_raw_read did not
> produce similar errors.
> 
> Cc: Carl Philipp Klemm <philipp@uvos.xyz>
> Signed-off-by: Tony Lindgren <tony@atomide.com>

Patch applied to wireless-drivers-next.git, thanks.

11ef6bc846dc wlcore/wl12xx: Fix wl12xx get_mac error if device is in ELP

-- 
https://patchwork.kernel.org/project/linux-wireless/patch/20210603062814.19464-1-tony@atomide.com/

https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches


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

end of thread, other threads:[~2021-06-14 15:48 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-06-03  6:28 [PATCH] wlcore/wl12xx: Fix wl12xx get_mac error if device is in ELP Tony Lindgren
2021-06-14 15:47 ` Kalle Valo

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.