Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp3489731imu; Sun, 11 Nov 2018 16:15:59 -0800 (PST) X-Google-Smtp-Source: AJdET5dh4lnRPZYEnFK7W4rSzzi7PoZrWr5KFAD3/0vBS+C8/38IbkE5AI8O5oPkFWL0K5ADXcpj X-Received: by 2002:a63:a16:: with SMTP id 22mr15607581pgk.318.1541981759288; Sun, 11 Nov 2018 16:15:59 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1541981759; cv=none; d=google.com; s=arc-20160816; b=wPyJsga9wQ/hOGiHJqGGdZ5CWW8hXSdb0fLnmFDc/mKuPBJrDAOgfFueCrvu7sKoFD 5+giNuyXKyuuXbQF6tjU7C3f6hZFOW7jqy+dRHF8CqC5syoheVgoResRycJLCQidOleV TEOYEQ6KUfC+H6X76ganuF3ExxqZ8HnIvRAHpvMZHYMw04jbSq48T3qYKF/BK/jT2KE9 D96S+H47qnY9f3lrj4l4kG/TlUJmoHebu0C4LOTaQbsYraOgRPoO+9+cF5gjjC79lky0 kn6wBBHXVAkAKpzISpX4zgHNttcfxmAxRPymEmPTTYASiYdfCXUAcksxlLnM2DI87l2m sQtg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=LGb1X5flkrWXQklw4gUmZi1xdkesCATi36MJWr7dcfA=; b=HeQYeZBYVofj9MGUQbva+kfRIsRw6KXgEgS8F7Kxag3WqdzpOSklB6gp0PwO9+PF+Z PxqDYjt9FlNFD/diyh8UoPESfIMjLU+qgmjr3VOAn90ClEbIYZ6WzfiRezQyCNQxUhXB +z6KgYasFSQJEcuSriVLFo8oGEQPk+RgDNZHUEUEdN9MHWzvwfPPOyE2jo2x2OPrh238 b16GnQKwutr+cTv0DbxRfkzrPudCTpnOAjZJhw+rtKxlzgMHVtEMoqe0eRt5tjgAoOlJ NMbiQ6L/R8AhNBrD5HwcLf8ICvi10h/yfexnnUnMtFsmuoAQncdVVUjeCiabhsT3hYqf ltHg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=ROmcAJut; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id h65-v6si17200031pfc.62.2018.11.11.16.15.44; Sun, 11 Nov 2018 16:15:59 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-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=@kernel.org header.s=default header.b=ROmcAJut; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731809AbeKLKEk (ORCPT + 99 others); Mon, 12 Nov 2018 05:04:40 -0500 Received: from mail.kernel.org ([198.145.29.99]:59904 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730389AbeKLIRN (ORCPT ); Mon, 12 Nov 2018 03:17:13 -0500 Received: from localhost (unknown [206.108.79.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 6973E223C6; Sun, 11 Nov 2018 22:27:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1541975237; bh=98CafglR/XzTGyJip2Bhq63DAgRzN6suN2XawGtJTWs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ROmcAJutyIgMyXaFsk1c6aMMHVL71ZyxJ1uUxJLB+aBDZdijPgy8J+k4a6CCa+Gbr SnlrqqXZZT1evGBQ6xh+jqm6ooH4QfOOkHNZifqM7OOiU8fY3ovM8Qt8dO9LijTXpG tHY5vpKsTlogVp6i5TAhKaSobUNOutiqmCqRvjI0= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Emmanuel Grumbach , Luca Coelho , Sasha Levin Subject: [PATCH 4.19 074/361] iwlwifi: mvm: clear HW_RESTART_REQUESTED when stopping the interface Date: Sun, 11 Nov 2018 14:17:01 -0800 Message-Id: <20181111221630.367464168@linuxfoundation.org> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20181111221619.915519183@linuxfoundation.org> References: <20181111221619.915519183@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.19-stable review patch. If anyone has any objections, please let me know. ------------------ From: Emmanuel Grumbach [ Upstream commit 155f7e0441cd121b1e673d465a35e99f4b9b2f0b ] Fix a bug that happens in the following scenario: 1) suspend without WoWLAN 2) mac80211 calls drv_stop because of the suspend 3) __iwl_mvm_mac_stop deallocates the aux station 4) during drv_stop the firmware crashes 5) iwlmvm: * sets IWL_MVM_STATUS_HW_RESTART_REQUESTED * asks mac80211 to kick the restart flow 6) mac80211 puts the restart worker into a freezable queue which means that the worker will not run for now since the workqueue is already frozen 7) ... 8) resume 9) mac80211 runs ieee80211_reconfig as part of the resume 10) mac80211 detects that a restart flow has been requested and that we are now resuming from suspend and cancels the restart worker 11) mac80211 calls drv_start() 12) __iwl_mvm_mac_start checks that IWL_MVM_STATUS_HW_RESTART_REQUESTED clears it, sets IWL_MVM_STATUS_IN_HW_RESTART and calls iwl_mvm_restart_cleanup() 13) iwl_fw_error_dump gets called and accesses the device to get debug data 14) iwl_mvm_up adds the aux station 15) iwl_mvm_add_aux_sta() allocates an internal station for the aux station 16) iwl_mvm_allocate_int_sta() tests IWL_MVM_STATUS_IN_HW_RESTART and doesn't really allocate a station ID for the aux station 17) a new queue is added for the aux station Note that steps from 5 to 9 aren't really part of the problem but were described for the sake of completeness. Once the iwl_mvm_mac_stop() is called, the device is not accessible, meaning that step 12) can't succeed and we'll see the following: drivers/net/wireless/intel/iwlwifi/pcie/trans.c:2122 iwl_trans_pcie_grab_nic_access+0xc0/0x1d6 [iwlwifi]() Timeout waiting for hardware access (CSR_GP_CNTRL 0x080403d8) Call Trace: [] iwl_trans_pcie_grab_nic_access+0xc0/0x1d6 [iwlwifi] [] iwl_trans_pcie_dump_regs+0x3fd/0x3fd [iwlwifi] [] iwl_fw_error_dump+0x4f5/0xe8b [iwlwifi] [] __iwl_mvm_mac_start+0x5a/0x21a [iwlmvm] [] iwl_mvm_mac_start+0xd4/0x103 [iwlmvm] [] drv_start+0xa1/0xc5 [iwl7000_mac80211] [] ieee80211_reconfig+0x145/0xf50 [mac80211] [] ieee80211_resume+0x62/0x66 [mac80211] [] wiphy_resume+0xa9/0xc6 [cfg80211] The station id of the aux station is set to 0xff in step 3 and because we don't really allocate a new station id for the auxliary station (as explained in 16), we end up sending a command to the firmware asking to connect the queue to station id 0xff. This makes the firmware crash with the following information: 0x00002093 | ADVANCED_SYSASSERT 0x000002F0 | trm_hw_status0 0x00000000 | trm_hw_status1 0x00000B38 | branchlink2 0x0001978C | interruptlink1 0x00000000 | interruptlink2 0xFF080501 | data1 0xDEADBEEF | data2 0xDEADBEEF | data3 Firmware error during reconfiguration - reprobe! FW error in SYNC CMD SCD_QUEUE_CFG Fix this by clearing IWL_MVM_STATUS_HW_RESTART_REQUESTED in iwl_mvm_mac_stop(). We won't be able to collect debug data anyway and when we will brought up again, we will have a clean state from the firmware perspective. Since we won't have IWL_MVM_STATUS_IN_HW_RESTART set in step 12) we won't get to the 2093 ASSERT either. Fixes: bf8b286f86fc ("iwlwifi: mvm: defer setting IWL_MVM_STATUS_IN_HW_RESTART") Signed-off-by: Emmanuel Grumbach Signed-off-by: Luca Coelho Signed-off-by: Sasha Levin Signed-off-by: Greg Kroah-Hartman --- drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) --- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c @@ -1233,12 +1233,15 @@ void __iwl_mvm_mac_stop(struct iwl_mvm * iwl_mvm_del_aux_sta(mvm); /* - * Clear IN_HW_RESTART flag when stopping the hw (as restart_complete() - * won't be called in this case). + * Clear IN_HW_RESTART and HW_RESTART_REQUESTED flag when stopping the + * hw (as restart_complete() won't be called in this case) and mac80211 + * won't execute the restart. * But make sure to cleanup interfaces that have gone down before/during * HW restart was requested. */ - if (test_and_clear_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status)) + if (test_and_clear_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status) || + test_and_clear_bit(IWL_MVM_STATUS_HW_RESTART_REQUESTED, + &mvm->status)) ieee80211_iterate_interfaces(mvm->hw, 0, iwl_mvm_cleanup_iterator, mvm);