From patchwork Mon Jan 20 10:49:36 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Emmanuel Grumbach X-Patchwork-Id: 3511501 Return-Path: X-Original-To: patchwork-linux-wireless@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 0CA3B9F2D6 for ; Mon, 20 Jan 2014 10:49:48 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id EE26C20160 for ; Mon, 20 Jan 2014 10:49:46 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id B68032015D for ; Mon, 20 Jan 2014 10:49:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752094AbaATKtn (ORCPT ); Mon, 20 Jan 2014 05:49:43 -0500 Received: from mail-wi0-f179.google.com ([209.85.212.179]:56169 "EHLO mail-wi0-f179.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751807AbaATKtn (ORCPT ); Mon, 20 Jan 2014 05:49:43 -0500 Received: by mail-wi0-f179.google.com with SMTP id hr1so2985252wib.12 for ; Mon, 20 Jan 2014 02:49:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=6TdkRIvPN6ccBYdp2G8HXZyLDCo63Fk1Ltc6UHm2UmM=; b=axIcH0S+iMC9GMssZnZf6M7zlo+N+cak68expGhpSMicn+8Ci0LB3CDMWrG2VacEUM XIn0LKK04KyW87eGTPF4fpM7mMlq4Jik2I9hVLWJm1jt7del5oBFDB4potGUSLxlD1OG w1KwXkJNGBg5hLtToNao0EZuGlykDwkMeVsrG8LFGLt8q0NgHHXONFiWm4/HMlsym9l3 W/hYK0a/+gUSjA5Rxk7V6AYxj5VO6UMR0dvJWg0Q9n+yxrD3EmMRBNIB/cZwuDAtj8eZ /ILRKdxmJO0xy+WDoGEAXRsYD9PwgemmnYE88EhO2cTE7s4k6JKZ1L+/efxyVqMu2u1/ KQJw== X-Received: by 10.180.37.162 with SMTP id z2mr9312578wij.51.1390214982283; Mon, 20 Jan 2014 02:49:42 -0800 (PST) Received: from localhost.localdomain (46-116-168-140.bb.netvision.net.il. [46.116.168.140]) by mx.google.com with ESMTPSA id po3sm831269wjc.3.2014.01.20.02.49.41 for (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 20 Jan 2014 02:49:41 -0800 (PST) From: Emmanuel Grumbach To: linux-wireless@vger.kernel.org Cc: Emmanuel Grumbach Subject: [PATCH] iwlwifi: pcie: don't panic on host commands in iwldvm Date: Mon, 20 Jan 2014 12:49:36 +0200 Message-Id: <1390214977-29202-1-git-send-email-egrumbach@gmail.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <52DCFE87.9080103@gmail.com> References: <52DCFE87.9080103@gmail.com> Sender: linux-wireless-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org X-Spam-Status: No, score=-7.3 required=5.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, T_DKIM_INVALID, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Emmanuel Grumbach None of the devices supported by iwldvm have support for shadow registers. This means that we wake the NIC when we increment the write pointer on Tx ring. This happened even before my bad commit mentionned below. Since my commit below, we wake up the NIC when we put a host command on the ring regardless of shadow register support. This means that in iwldvm (when the NIC doesn't support shadow register), we wake up the NIC twice: pcie_enqueue_hcmd: wake up the NIC iwl_pcie_txq_inc_wr_ptr: wake up the NIC - no shadow reg support Since waking up the NIC means that we need to acquire a spinlock, this obviously leads to a recursive spinlock and hence a freeze. Fixes: b9439491055a ("iwlwifi: pcie: keep the NIC awake when commands are in flight") Reported-by: Janusz Dziedzic Reviewed-by: Johannes Berg Signed-off-by: Emmanuel Grumbach Tested-by: Kalle Valo --- drivers/net/wireless/iwlwifi/pcie/tx.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/net/wireless/iwlwifi/pcie/tx.c b/drivers/net/wireless/iwlwifi/pcie/tx.c index 3b14fa8..3d54900 100644 --- a/drivers/net/wireless/iwlwifi/pcie/tx.c +++ b/drivers/net/wireless/iwlwifi/pcie/tx.c @@ -289,13 +289,15 @@ static void iwl_pcie_txq_inval_byte_cnt_tbl(struct iwl_trans *trans, */ void iwl_pcie_txq_inc_wr_ptr(struct iwl_trans *trans, struct iwl_txq *txq) { + struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); u32 reg = 0; int txq_id = txq->q.id; if (txq->need_update == 0) return; - if (trans->cfg->base_params->shadow_reg_enable) { + if (trans->cfg->base_params->shadow_reg_enable || + txq_id == trans_pcie->cmd_queue) { /* shadow register enabled */ iwl_write32(trans, HBUS_TARG_WRPTR, txq->q.write_ptr | (txq_id << 8));