Received: by 2002:a05:6a10:af89:0:0:0:0 with SMTP id iu9csp3978474pxb; Tue, 25 Jan 2022 00:30:26 -0800 (PST) X-Google-Smtp-Source: ABdhPJyK38Kq61x6M+bMUH9n19Hlc3hUZyZ3yLoXO5wF2ifoP/Kt+YdtfYME5TCkNrGkQSHwbk/T X-Received: by 2002:a17:906:dc8c:: with SMTP id cs12mr15256911ejc.442.1643099426663; Tue, 25 Jan 2022 00:30:26 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643099426; cv=none; d=google.com; s=arc-20160816; b=YyHyC8zzdGG5vADOFcTbbfhbzkVruMpMJLy/macmFOYx3xYHY6ipMSPlO3ecDPHmZ+ eqeJogSyDGhL0CSMebXdLSSbbBJRYvfXoHDATa2Pf9xc/Ecm0/J/lQ3Nz3rtj+rbimic 2QLwIKKQLNdDdmaRJHkTm3jK92LPg05ND0VwXm9XN6he5sfeP6eB25puxdRzqxuxqqKs h5pjoG6/xGOXOdKsvihh/KirOdfc2cYfvFx+Ux3eh2ixysfKw3MdBMj+++KPFXyvRlXz 75DtvyX9O9NNiaw5oj1PdT9Hz+EUHZBCJcqbAFzbqUzlRKru8rZcx1VfxY6QQmOruzRs lj9g== 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 :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=BLSdDeoWChhx6PFL3/dDmBZhiDt3kgY+gCanQTM7Rp0=; b=LkgjnbjGKL65tMqLEG887gH1kRMdeaZMVV7NPT2GX4ac8Nlyxo055vKfd0tYViafdM jrDGpD+5PP1zXJKT+ufw92er7zpOWrByMxW86teNPce452UUxBYOUmCd4QWP302dLP6t XtHL9gBUYBxQ4DrAbJ2l/F4FgRAuZo3zMOQgVQLEzk4vWyF6CK/3SEOrkzgtsec6d8Lh EBXNEFVwMuxJH630lR/+t5BJXUV1D3tAOfTgBHpBjQ+/UZiZekjOQFgAvIn3T1SmxPF8 CYVxczGFbY0dqYAIDOvd9pPVnGewoQBgbuPhQkmuvSiFzTeDwXZu65iJ6+ZcaGyly+o/ Qiew== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=ET1d2Wik; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id s3si9271718ejm.213.2022.01.25.00.30.02; Tue, 25 Jan 2022 00:30:26 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=ET1d2Wik; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S3423886AbiAYCiN (ORCPT + 99 others); Mon, 24 Jan 2022 21:38:13 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39390 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1356569AbiAXUcS (ORCPT ); Mon, 24 Jan 2022 15:32:18 -0500 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id BD64AC08B4ED; Mon, 24 Jan 2022 11:43:36 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 5DC15612E9; Mon, 24 Jan 2022 19:43:36 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3EBE0C340E5; Mon, 24 Jan 2022 19:43:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1643053415; bh=8r/XJeSI7KQi3vSVnflKjR5XFdHnpyEreex20ky/SVU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ET1d2WikVBi4mC6PsijcqG7runvNikjM10RQrc8v8nANon41KLu+20QSyadApyQyF A7eQQUcP+YWu2TwlH/Rqc3dfEP4DaVk16Jcwmcv82oXccrOxt8Eb2HzTZU0dtWjaBs wyrcGvaiyxGMG6jBwnuuaMQVVSdTZC+sIs5qK89o= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Bryan ODonoghue , Kalle Valo , Sasha Levin Subject: [PATCH 5.10 057/563] wcn36xx: Fix DMA channel enable/disable cycle Date: Mon, 24 Jan 2022 19:37:02 +0100 Message-Id: <20220124184026.379548584@linuxfoundation.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220124184024.407936072@linuxfoundation.org> References: <20220124184024.407936072@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Bryan O'Donoghue [ Upstream commit 89dcb1da611d9b3ff0728502d58372fdaae9ebff ] Right now we have a broken sequence where we enable DMA channel interrupts which can be left enabled and never disabled if we hit an error path. Worse still when we unload the driver, the DMA channel interrupt bits are left intact. About the only saving grace here is that we do remember to disable the wcnss interrupt when unload the driver. Fixes: 8e84c2582169 ("wcn36xx: mac80211 driver for Qualcomm WCN3660/WCN3680 hardware") Signed-off-by: Bryan O'Donoghue Signed-off-by: Kalle Valo Link: https://lore.kernel.org/r/20211105122152.1580542-2-bryan.odonoghue@linaro.org Signed-off-by: Sasha Levin --- drivers/net/wireless/ath/wcn36xx/dxe.c | 38 ++++++++++++++++++-------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/drivers/net/wireless/ath/wcn36xx/dxe.c b/drivers/net/wireless/ath/wcn36xx/dxe.c index cf4eb0fb28151..0909d0c423cbb 100644 --- a/drivers/net/wireless/ath/wcn36xx/dxe.c +++ b/drivers/net/wireless/ath/wcn36xx/dxe.c @@ -272,6 +272,21 @@ static int wcn36xx_dxe_enable_ch_int(struct wcn36xx *wcn, u16 wcn_ch) return 0; } +static void wcn36xx_dxe_disable_ch_int(struct wcn36xx *wcn, u16 wcn_ch) +{ + int reg_data = 0; + + wcn36xx_dxe_read_register(wcn, + WCN36XX_DXE_INT_MASK_REG, + ®_data); + + reg_data &= ~wcn_ch; + + wcn36xx_dxe_write_register(wcn, + WCN36XX_DXE_INT_MASK_REG, + (int)reg_data); +} + static int wcn36xx_dxe_fill_skb(struct device *dev, struct wcn36xx_dxe_ctl *ctl, gfp_t gfp) @@ -869,7 +884,6 @@ int wcn36xx_dxe_init(struct wcn36xx *wcn) WCN36XX_DXE_WQ_TX_L); wcn36xx_dxe_read_register(wcn, WCN36XX_DXE_REG_CH_EN, ®_data); - wcn36xx_dxe_enable_ch_int(wcn, WCN36XX_INT_MASK_CHAN_TX_L); /***************************************/ /* Init descriptors for TX HIGH channel */ @@ -893,9 +907,6 @@ int wcn36xx_dxe_init(struct wcn36xx *wcn) wcn36xx_dxe_read_register(wcn, WCN36XX_DXE_REG_CH_EN, ®_data); - /* Enable channel interrupts */ - wcn36xx_dxe_enable_ch_int(wcn, WCN36XX_INT_MASK_CHAN_TX_H); - /***************************************/ /* Init descriptors for RX LOW channel */ /***************************************/ @@ -905,7 +916,6 @@ int wcn36xx_dxe_init(struct wcn36xx *wcn) goto out_err_rxl_ch; } - /* For RX we need to preallocated buffers */ wcn36xx_dxe_ch_alloc_skb(wcn, &wcn->dxe_rx_l_ch); @@ -928,9 +938,6 @@ int wcn36xx_dxe_init(struct wcn36xx *wcn) WCN36XX_DXE_REG_CTL_RX_L, WCN36XX_DXE_CH_DEFAULT_CTL_RX_L); - /* Enable channel interrupts */ - wcn36xx_dxe_enable_ch_int(wcn, WCN36XX_INT_MASK_CHAN_RX_L); - /***************************************/ /* Init descriptors for RX HIGH channel */ /***************************************/ @@ -962,15 +969,18 @@ int wcn36xx_dxe_init(struct wcn36xx *wcn) WCN36XX_DXE_REG_CTL_RX_H, WCN36XX_DXE_CH_DEFAULT_CTL_RX_H); - /* Enable channel interrupts */ - wcn36xx_dxe_enable_ch_int(wcn, WCN36XX_INT_MASK_CHAN_RX_H); - ret = wcn36xx_dxe_request_irqs(wcn); if (ret < 0) goto out_err_irq; timer_setup(&wcn->tx_ack_timer, wcn36xx_dxe_tx_timer, 0); + /* Enable channel interrupts */ + wcn36xx_dxe_enable_ch_int(wcn, WCN36XX_INT_MASK_CHAN_TX_L); + wcn36xx_dxe_enable_ch_int(wcn, WCN36XX_INT_MASK_CHAN_TX_H); + wcn36xx_dxe_enable_ch_int(wcn, WCN36XX_INT_MASK_CHAN_RX_L); + wcn36xx_dxe_enable_ch_int(wcn, WCN36XX_INT_MASK_CHAN_RX_H); + return 0; out_err_irq: @@ -987,6 +997,12 @@ out_err_txh_ch: void wcn36xx_dxe_deinit(struct wcn36xx *wcn) { + /* Disable channel interrupts */ + wcn36xx_dxe_disable_ch_int(wcn, WCN36XX_INT_MASK_CHAN_RX_H); + wcn36xx_dxe_disable_ch_int(wcn, WCN36XX_INT_MASK_CHAN_RX_L); + wcn36xx_dxe_disable_ch_int(wcn, WCN36XX_INT_MASK_CHAN_TX_H); + wcn36xx_dxe_disable_ch_int(wcn, WCN36XX_INT_MASK_CHAN_TX_L); + free_irq(wcn->tx_irq, wcn); free_irq(wcn->rx_irq, wcn); del_timer(&wcn->tx_ack_timer); -- 2.34.1