Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp28617pxj; Wed, 2 Jun 2021 23:29:33 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzg+SzORO56WFfUG8omo2d/o1YPsG+Yk4gaGjBo1Rf3DE2BI+4N4t1yseXrZRB2VFs7ZUPz X-Received: by 2002:a17:906:34c9:: with SMTP id h9mr25087635ejb.246.1622701772683; Wed, 02 Jun 2021 23:29:32 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1622701772; cv=none; d=google.com; s=arc-20160816; b=S3JPcYwN151+0lrEZCDnxetGh1ed1slz2JXLUgPb0CAFbEY8j3MQezTg01c5zkYN/p 0L41dOwwUKAm+O5MWlo+jaiHpwbT7vRAZ7vdeLMPYwvDUQTsWa+W9XYqdmMxGfwyquZF UiJAuah6btyIIpYeiENfH00j+U7EMJkgLQWmlMACRpt5lD9XbhJlAZiTqjZ1qpBG/xg1 qIN4qaLEW7Xwd2NxBGj//JusO31VXVhIF5QY8T1tlTk9D7mPBE0+YTAKrhXO+pMK/Jia nkbZLqttWTarubndqsqhDNNSByK/4fgNEirhMzodYwTmqIQWmgK4M+yNkbGHutepvkh/ +LSg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from; bh=AY7w3RrgU7OAawKHQGVRI0qLLh95zH9uS90MOXpMnhA=; b=quA9KKHdAC3Oy/VOpbd0vt0SjHN4cLc4S9NB4eKqfxpwxMse8L9vk/rea8g7tNcmII q2uOPpVmA2rVMtmrdc0EaJND2JFXyit1dt4nX7q/CuYNe1A9UHG7AMICmbdPOOJNmvAj mxgdfHpchv1414KKPpTM+k/mxRcxb8F87LzbvKMX5MIWGu4S39zHQGGai7xMQrGlwu9R P37kkRR6RUmuFskYI9cmN8C82vY5n2xtr95Gpr9yRYE/GBY0PbrP9Eq3yAuVw5moe8Ag 31FwhCAhBUQp3V1exLtcOXi1sdJZEtWOD1XR3HPqrLSQ8kMFqCjmoI4alPE2GsRjHDar dAmQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-wireless-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id bh4si1912216ejb.680.2021.06.02.23.29.04; Wed, 02 Jun 2021 23:29:32 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-wireless-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-wireless-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229734AbhFCGaD (ORCPT + 99 others); Thu, 3 Jun 2021 02:30:03 -0400 Received: from muru.com ([72.249.23.125]:35742 "EHLO muru.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229702AbhFCGaD (ORCPT ); Thu, 3 Jun 2021 02:30:03 -0400 Received: from hillo.muru.com (localhost [127.0.0.1]) by muru.com (Postfix) with ESMTP id 3473B8027; Thu, 3 Jun 2021 06:28:25 +0000 (UTC) From: Tony Lindgren To: Kalle Valo Cc: Eyal Reizer , Guy Mishol , Raz Bouganim , linux-wireless@vger.kernel.org, linux-omap@vger.kernel.org, Carl Philipp Klemm Subject: [PATCH] wlcore/wl12xx: Fix wl12xx get_mac error if device is in ELP Date: Thu, 3 Jun 2021 09:28:14 +0300 Message-Id: <20210603062814.19464-1-tony@atomide.com> X-Mailer: git-send-email 2.31.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org 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 Signed-off-by: Tony Lindgren --- 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