Received: by 2002:a05:6a10:5bc5:0:0:0:0 with SMTP id os5csp839970pxb; Wed, 3 Nov 2021 13:18:50 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxVmD9WrjksfTE/aXzeJEa0TiVnf4ZrtpUhaZ0X9RNLiKvWPdxWL9xCjWrs8K1RNZa0YQUJ X-Received: by 2002:a17:907:9711:: with SMTP id jg17mr34310882ejc.242.1635970729984; Wed, 03 Nov 2021 13:18:49 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1635970729; cv=none; d=google.com; s=arc-20160816; b=W7TZAUugpdKLPRgRDaPnXJDSZndPduzh++GctKfzH5ZevSVwnB8M2Sma1dGlrWAaH6 6FidOhZhtpITJ5+nIu6xBUQ1k6BWiFTwnR3isBA4yy3eyohj+G2eXNxog+eKs47eln7T VnB4dYxe0CpEGNbjsXyoOUtDPx6R0fnAcWyaWtQznLI1lxZDjkUdE2LOiY3aVEFIKgKO HfzCI3dDqwDwPjLrbiIS1YYs5QF7+OF5B73tb7IETBmOpgau5OTmHsjrWhNvjreulczy RZy2OdYdnAoDTs4lKG7HwguRsiKA4JthyRMweZ7rA7ydijCqYZL+JNkYxRHpSAYpY+Jx xjUQ== 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 :references:in-reply-to:message-id:date:subject:cc:to:from; bh=EztNbzTMzHhEB7Z57qPipjtox/FBDqVg8rwePRjqDss=; b=TrnlX66PQpQgOM3UPepI0xcNJL+C1uB5NPLKC6SV1TYou/AjLkvNM+YQqY0naeLK4o ynCVaKau4eaGfBmlSPR500Wg9Rg9+mhUgNNuLGro3yHiCNgkXRRNV9TVZOfzhvhOjWU8 fHqWTalozmGtpi5nJ8mIrc124xL/lz1pux7jM6y3uU5HtDL7VzJgNwFNwBr04yk8P1H4 4Punv/T7bOZKm2UtXzjuPe4zP2XQbFHDqfq3c4DeV+BToTK9dHrTAqbZFbuymyTHBU4n +yiewoJ2Qu8tYNoC40H9dDKhcgzRSrdcinAPWXglBPlKis0Zzszu3A6t3su+ZY9LBezW Elcw== 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 l7si6314250edk.367.2021.11.03.13.18.34; Wed, 03 Nov 2021 13:18:49 -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 S231502AbhKCUUz (ORCPT + 66 others); Wed, 3 Nov 2021 16:20:55 -0400 Received: from mout-p-102.mailbox.org ([80.241.56.152]:36540 "EHLO mout-p-102.mailbox.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231359AbhKCUUx (ORCPT ); Wed, 3 Nov 2021 16:20:53 -0400 Received: from smtp102.mailbox.org (smtp102.mailbox.org [80.241.60.233]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-384) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mout-p-102.mailbox.org (Postfix) with ESMTPS id 4Hkykt3x3RzQk3X; Wed, 3 Nov 2021 21:18:14 +0100 (CET) X-Virus-Scanned: amavisd-new at heinlein-support.de From: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= To: Amitkumar Karwar , Ganapathi Bhat , Xinming Hu , Kalle Valo , "David S. Miller" , Jakub Kicinski Cc: =?UTF-8?q?Jonas=20Dre=C3=9Fler?= , Tsuchiya Yuto , linux-wireless@vger.kernel.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Maximilian Luz , Andy Shevchenko , Bjorn Helgaas , =?UTF-8?q?Pali=20Roh=C3=A1r?= Subject: [PATCH v4 2/3] mwifiex: Add quirk to disable deep sleep with certain hardware revision Date: Wed, 3 Nov 2021 21:17:59 +0100 Message-Id: <20211103201800.13531-3-verdre@v0yd.nl> In-Reply-To: <20211103201800.13531-1-verdre@v0yd.nl> References: <20211103201800.13531-1-verdre@v0yd.nl> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Rspamd-Queue-Id: AF8F0C0A Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org The 88W8897 PCIe+USB card in the hardware revision 20 apparently has a hardware issue where the card wakes up from deep sleep randomly and very often, somewhat depending on the card activity, maybe the hardware has a floating wakeup pin or something. This was found by comparing two MS Surface Book 2 devices, where one devices wifi card experienced spurious wakeups, while the other one didn't. Those continuous wakeups prevent the card from entering host sleep when the computer suspends. And because the host won't answer to events from the card anymore while it's suspended, the firmwares internal power saving state machine seems to get confused and the card can't sleep anymore at all after that. Since we can't work around that hardware bug in the firmware, let's get the hardware revision string from the firmware and match it with known bad revisions. Then disable auto deep sleep for those revisions, which makes sure we no longer get those spurious wakeups. Signed-off-by: Jonas Dreßler --- drivers/net/wireless/marvell/mwifiex/main.c | 18 +++++++++++++++++ drivers/net/wireless/marvell/mwifiex/main.h | 1 + .../wireless/marvell/mwifiex/sta_cmdresp.c | 20 +++++++++++++++++++ 3 files changed, 39 insertions(+) diff --git a/drivers/net/wireless/marvell/mwifiex/main.c b/drivers/net/wireless/marvell/mwifiex/main.c index 19b996c6a260..ace7371c4773 100644 --- a/drivers/net/wireless/marvell/mwifiex/main.c +++ b/drivers/net/wireless/marvell/mwifiex/main.c @@ -226,6 +226,23 @@ static int mwifiex_process_rx(struct mwifiex_adapter *adapter) return 0; } +static void maybe_quirk_fw_disable_ds(struct mwifiex_adapter *adapter) +{ + struct mwifiex_private *priv = mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_STA); + struct mwifiex_ver_ext ver_ext; + + if (test_and_set_bit(MWIFIEX_IS_REQUESTING_FW_VEREXT, &adapter->work_flags)) + return; + + memset(&ver_ext, 0, sizeof(ver_ext)); + ver_ext.version_str_sel = 1; + if (mwifiex_send_cmd(priv, HostCmd_CMD_VERSION_EXT, + HostCmd_ACT_GEN_GET, 0, &ver_ext, false)) { + mwifiex_dbg(priv->adapter, MSG, + "Checking hardware revision failed.\n"); + } +} + /* * The main process. * @@ -356,6 +373,7 @@ int mwifiex_main_process(struct mwifiex_adapter *adapter) if (adapter->hw_status == MWIFIEX_HW_STATUS_INIT_DONE) { adapter->hw_status = MWIFIEX_HW_STATUS_READY; mwifiex_init_fw_complete(adapter); + maybe_quirk_fw_disable_ds(adapter); } } diff --git a/drivers/net/wireless/marvell/mwifiex/main.h b/drivers/net/wireless/marvell/mwifiex/main.h index 65609ea2327e..eabd0e0a9f56 100644 --- a/drivers/net/wireless/marvell/mwifiex/main.h +++ b/drivers/net/wireless/marvell/mwifiex/main.h @@ -524,6 +524,7 @@ enum mwifiex_adapter_work_flags { MWIFIEX_IS_SUSPENDED, MWIFIEX_IS_HS_CONFIGURED, MWIFIEX_IS_HS_ENABLING, + MWIFIEX_IS_REQUESTING_FW_VEREXT, }; struct mwifiex_band_config { diff --git a/drivers/net/wireless/marvell/mwifiex/sta_cmdresp.c b/drivers/net/wireless/marvell/mwifiex/sta_cmdresp.c index 20b69a37f9e1..6c7b0b9bc4e9 100644 --- a/drivers/net/wireless/marvell/mwifiex/sta_cmdresp.c +++ b/drivers/net/wireless/marvell/mwifiex/sta_cmdresp.c @@ -708,6 +708,26 @@ static int mwifiex_ret_ver_ext(struct mwifiex_private *priv, { struct host_cmd_ds_version_ext *ver_ext = &resp->params.verext; + if (test_and_clear_bit(MWIFIEX_IS_REQUESTING_FW_VEREXT, &priv->adapter->work_flags)) { + if (strncmp(ver_ext->version_str, "ChipRev:20, BB:9b(10.00), RF:40(21)", + MWIFIEX_VERSION_STR_LENGTH) == 0) { + struct mwifiex_ds_auto_ds auto_ds = { + .auto_ds = DEEP_SLEEP_OFF, + }; + + mwifiex_dbg(priv->adapter, MSG, + "Bad HW revision detected, disabling deep sleep\n"); + + if (mwifiex_send_cmd(priv, HostCmd_CMD_802_11_PS_MODE_ENH, + DIS_AUTO_PS, BITMAP_AUTO_DS, &auto_ds, false)) { + mwifiex_dbg(priv->adapter, MSG, + "Disabling deep sleep failed.\n"); + } + } + + return 0; + } + if (version_ext) { version_ext->version_str_sel = ver_ext->version_str_sel; memcpy(version_ext->version_str, ver_ext->version_str, -- 2.33.1