From patchwork Wed Nov 28 14:39:57 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amit Pundir X-Patchwork-Id: 152292 Delivered-To: patch@linaro.org Received: by 2002:a2e:299d:0:0:0:0:0 with SMTP id p29-v6csp1170690ljp; Wed, 28 Nov 2018 06:40:17 -0800 (PST) X-Google-Smtp-Source: AFSGD/UmY6lTmRvPAp9Qdz8jC6dqniWc1dmO9L8ArHheobax1R0Y5HQI3Ddfv37snwvzgd/wlm5J X-Received: by 2002:a17:902:b7cc:: with SMTP id v12mr37429940plz.8.1543416017582; Wed, 28 Nov 2018 06:40:17 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1543416017; cv=none; d=google.com; s=arc-20160816; b=bv71Wzo1M6yAd/vbwXmdxQWA7woTDACW2XeQdnt666mM8RnNa9fLGv2RXLaJVnW4Nv ca3DSOn/YkC1ZwGhWiiviJs4z6gWg5zzBaO7YYYxw0rlaG2e8UQhtDpW8zdhBkFi2ilu aOKcztuUKX81IsX6A7vRAuBWgxjQrJOmluAcl6mNY/WsNLntzG7th0jjcnYo6+2wbPh4 Sl8x/MzDuIOpLfCwv4qOzTA9D1zEeQG9kvONjFEefp4CUBQpFafrpOfIib6FjTGV3Ufd c01/4x+BRXeUq0ZkmBo1orCGcvFwbg8In/squR5lKvxyNv9BtXlbHtWZT1iIinC42AW2 32wA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature; bh=qDTuvO/AYLBV0mjjzuvfwJbIhTDCFQL+TCgTy1oHo9E=; b=i8pJEMGDu7+isW5aHTvZGdUy3P9G1lLuaiVXST+Uwgm/1VmksdkFbPu090lfi+IUcA q7NJ6YV/GqX/yWgT7/ZoOlxmUOt6vpmIPgw4A6o+L5mvMbZdWPKn7fS/BObSOXAG4AfY 3BBudpOnzbhoBHnPDUHBLdsO79UbCL8FGPkThKfTadc6B+OuI01koeUz1x381X/FltWA oOBd3uedVOkXG3VVmzYaCPdd56EG8abwxSKOE3IemJcU/b5fXb5E5bbBPMi5C/FK3DjU f+HLfPzIydknrEK6FGYwjMibnhK4hHJhzec2s1BwCst7JAAaL1/VXwzjoYMy+zGHrBPf S1ug== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=PrHEQwJT; spf=pass (google.com: best guess record for domain of stable-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=stable-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id i67si5274274pfc.148.2018.11.28.06.40.17; Wed, 28 Nov 2018 06:40:17 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of stable-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=PrHEQwJT; spf=pass (google.com: best guess record for domain of stable-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=stable-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728342AbeK2BmJ (ORCPT + 15 others); Wed, 28 Nov 2018 20:42:09 -0500 Received: from mail-pl1-f193.google.com ([209.85.214.193]:34879 "EHLO mail-pl1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728223AbeK2BmJ (ORCPT ); Wed, 28 Nov 2018 20:42:09 -0500 Received: by mail-pl1-f193.google.com with SMTP id p8so7190616plo.2 for ; Wed, 28 Nov 2018 06:40:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=qDTuvO/AYLBV0mjjzuvfwJbIhTDCFQL+TCgTy1oHo9E=; b=PrHEQwJT6NuAVAgtZstFcLD69wT9GpiQy5kHGe5q+ZNwS6PUhvmLCP9N5YgL8Z+BbK zXG/p/xwONnB2dyfoxEADS/Q579Qnw0/5HoY94QOvjLIoVEBbTZPKtSKduwIIqpSaXtE AXv6+JyHUsou+DHCFNmUyuHppz3MzOv5a9jDg= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=qDTuvO/AYLBV0mjjzuvfwJbIhTDCFQL+TCgTy1oHo9E=; b=PQQC1I7J6lOggQsbLsFJNSADhVQyoivY3mOlXGDIdRzS1hbfhqWWQlAm5BNzuSIv2x AK0eaeaSOJHjEmrunv6b0jtcdr5c29avsG45CJvBthqC9YS9rmK+qACtMffGWPOQYfWv k/24XqMYkBzJIWYUJMIA7gIfW9NMSEG4HUzKHHAdcO6YGRG1gdqvE92sLKj941DcUIa4 Xur118eUUMtVlzJhd5eCe4GrBM+oRjfj5ThnKtqTJGdNXiGR1lvqpTVaGLEKghpGXeoO ruOjnAdrz8QbGkPq6/9cucn8kBSJwjEV18sUtdK/u61F+T7h1qVxspXG0TZjglcz/jra +/GA== X-Gm-Message-State: AA+aEWaoJnvwUOOtDGpnYCQuAklO8T/ho/0yJfbYqpv7Nx3HapDH672r rR6S8I6c65uOAtbkJVHk1TcJng== X-Received: by 2002:a17:902:b903:: with SMTP id bf3mr36486842plb.289.1543416016075; Wed, 28 Nov 2018 06:40:16 -0800 (PST) Received: from localhost.localdomain ([49.207.53.6]) by smtp.gmail.com with ESMTPSA id b26sm24227637pfe.91.2018.11.28.06.40.13 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 28 Nov 2018 06:40:15 -0800 (PST) From: Amit Pundir To: Greg KH Cc: Stable , Amitkumar Karwar , Kalle Valo Subject: [PATCH for-4.9.y 03/10] mwifiex: prevent register accesses after host is sleeping Date: Wed, 28 Nov 2018 20:09:57 +0530 Message-Id: <1543416004-1547-4-git-send-email-amit.pundir@linaro.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1543416004-1547-1-git-send-email-amit.pundir@linaro.org> References: <1543416004-1547-1-git-send-email-amit.pundir@linaro.org> Sender: stable-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: stable@vger.kernel.org From: Amitkumar Karwar commit ec815dd2a5f110f627d7955e0027a3a008f68166 upstream. Following is mwifiex driver-firmware host sleep handshake. It involves three threads. suspend handler, interrupt handler, interrupt processing in main work queue. 1) Enter suspend handler 2) Download HS_CFG command 3) Response from firmware for HS_CFG 4) Suspend thread waits until handshake completes(i.e hs_activate becomes true) 5) SLEEP from firmware 6) SLEEP confirm downloaded to firmware. 7) SLEEP confirm response from firmware 8) Driver processes SLEEP confirm response and set hs_activate to wake up suspend thread 9) Exit suspend handler 10) Read sleep cookie in loop and wait until it indicates firmware is sleep. 11) After processing SLEEP confirm response, we are at the end of interrupt processing routine. Recheck if there are interrupts received while we were processing them. During suspend-resume stress test, it's been observed that we may end up acessing PCIe hardware(in 10 and 11) when PCIe bus is closed which leads to a kernel crash. This patch solves the problem with below changes. a) action 10 above can be done before 8 b) Skip 11 if hs_activated is true. SLEEP confirm response is the last interrupt from firmware. No need to recheck for pending interrupts. c) Add flush_workqueue() in suspend handler. Signed-off-by: Amitkumar Karwar Reviewed-by: Brian Norris Tested-by: Brian Norris Signed-off-by: Kalle Valo Signed-off-by: Amit Pundir --- drivers/net/wireless/marvell/mwifiex/pcie.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) -- 2.7.4 diff --git a/drivers/net/wireless/marvell/mwifiex/pcie.c b/drivers/net/wireless/marvell/mwifiex/pcie.c index 1fdb86cd4734..8b70c909ecbb 100644 --- a/drivers/net/wireless/marvell/mwifiex/pcie.c +++ b/drivers/net/wireless/marvell/mwifiex/pcie.c @@ -118,6 +118,7 @@ static int mwifiex_pcie_suspend(struct device *dev) adapter = card->adapter; hs_actived = mwifiex_enable_hs(adapter); + flush_workqueue(adapter->workqueue); /* Indicate device suspended */ adapter->is_suspended = true; @@ -1676,9 +1677,6 @@ static int mwifiex_pcie_process_cmd_complete(struct mwifiex_adapter *adapter) if (!adapter->curr_cmd) { if (adapter->ps_state == PS_STATE_SLEEP_CFM) { - mwifiex_process_sleep_confirm_resp(adapter, skb->data, - skb->len); - mwifiex_pcie_enable_host_int(adapter); if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT, CPU_INTR_SLEEP_CFM_DONE)) { @@ -1691,6 +1689,9 @@ static int mwifiex_pcie_process_cmd_complete(struct mwifiex_adapter *adapter) while (reg->sleep_cookie && (count++ < 10) && mwifiex_pcie_ok_to_access_hw(adapter)) usleep_range(50, 60); + mwifiex_pcie_enable_host_int(adapter); + mwifiex_process_sleep_confirm_resp(adapter, skb->data, + skb->len); } else { mwifiex_dbg(adapter, ERROR, "There is no command but got cmdrsp\n"); @@ -2329,6 +2330,8 @@ static int mwifiex_process_pcie_int(struct mwifiex_adapter *adapter) ret = mwifiex_pcie_process_cmd_complete(adapter); if (ret) return ret; + if (adapter->hs_activated) + return ret; } if (card->msi_enable) {