Received: by 2002:a25:c205:0:0:0:0:0 with SMTP id s5csp1186731ybf; Thu, 27 Feb 2020 06:30:55 -0800 (PST) X-Google-Smtp-Source: APXvYqxO28cOQVRqHLsESW4DI3zi93Sxpnx8GmITgLzV/Ah25HPf6fjQW1gR1lZYewFp/+Bzg3i2 X-Received: by 2002:aca:33d5:: with SMTP id z204mr3350685oiz.120.1582813855674; Thu, 27 Feb 2020 06:30:55 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1582813855; cv=none; d=google.com; s=arc-20160816; b=kXOspr7lQ9LogVL4uqW6qqL08jUK35liEwqaJsgvjTrIegARVC95XaQbD2Fsn9WT9b W7EdtueS/LLtjezLipMCbAEdybv/Exr8qCwph15MkYd85HUPoF8slSVFIgSbqvDMG0N4 HBQY3qFqjaUWT0ssahJqiCb0o5bQt7kGq/d3nqfpDiPfCCHmzEAw77OkAQRF74/tu2kJ I8SOw2yrKt46R0tHt5UIY454ZjIV4kfM4QgxUvaWWqKPmK4f0exutNnkTjomAaomsNe4 hDsGvqPQYakAwadEx8OSJGW/57kgTmI/xUvUU5w1KfTPCkjE2ZuC1gFhX1iBYCOPoF+5 0ecQ== 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=v96kFozMqNFpqUxGI0htAYfHLSwSGVrFHDb3ECccSzA=; b=V60Pss8QFnrx6WTeI2CqpLK21uy7EA/+Pm+pksKpLZff6EK555EE6dvV7TAJSyo6IO mTWJp6UJunUqaqBntIWWSv3s71AnHfWI80c/5YoeFmC3HUHNQtF+QjYJr9MSxNb7N6nc zbdnz56Fyn7MC3eJUVvtE7we/H1UTTYXNUXdnUNkOIi2cAGU7V7vqRcTc3n4Z+GbvcJc 2ZFW1xgFeKO7pctjAp8y/OEaA7WM5U98dZ9lKtFv22q/5D7M3fzHon37FjX5iL5prdeu atGr9sW3x3KwEc8PFYct9lktX9EQRNxdGP6iXmiFL44CsIrBBe+IzdISqHHKrXgV8C9a /uCw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=0huLFyY3; 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 d3si1300000oia.236.2020.02.27.06.30.43; Thu, 27 Feb 2020 06:30:55 -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=0huLFyY3; 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 S1730572AbgB0OFA (ORCPT + 99 others); Thu, 27 Feb 2020 09:05:00 -0500 Received: from mail.kernel.org ([198.145.29.99]:41220 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1733179AbgB0OEq (ORCPT ); Thu, 27 Feb 2020 09:04:46 -0500 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (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 ABAAE20578; Thu, 27 Feb 2020 14:04:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1582812286; bh=WeAnVRuT+eJ3/I9Ri+fo4SZBU5CHsbAcXpVA/xFFqgI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=0huLFyY3fyGwoKjOF4N5yGUpKVp1FfCTQczdWoUiJZl5O9j++fn4uC450A54wurEE UbbHho6RcZAsmP3negYi5wb6A1MYNDoIlpZeqI3IP7cYc58Z0BXlukLUwLnoknvFyq FOw6VzUkhXXuRz2inNH68DqxKVYZA9cBTovYK4+Q= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Ryan Case , Douglas Anderson , Sasha Levin Subject: [PATCH 4.19 55/97] tty: serial: qcom_geni_serial: Remove interrupt storm Date: Thu, 27 Feb 2020 14:37:03 +0100 Message-Id: <20200227132223.560905310@linuxfoundation.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200227132214.553656188@linuxfoundation.org> References: <20200227132214.553656188@linuxfoundation.org> User-Agent: quilt/0.66 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 From: Ryan Case [ Upstream commit 64a428077758383518c258641e81d57fcd454792 ] Disable M_TX_FIFO_WATERMARK_EN after we've sent all data for a given transaction so we don't continue to receive a flurry of free space interrupts while waiting for the M_CMD_DONE notification. Re-enable the watermark when establishing the next transaction. Also clear the watermark interrupt after filling the FIFO so we do not receive notification again prior to actually having free space. Signed-off-by: Ryan Case Reviewed-by: Douglas Anderson Tested-by: Douglas Anderson Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- drivers/tty/serial/qcom_geni_serial.c | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/drivers/tty/serial/qcom_geni_serial.c b/drivers/tty/serial/qcom_geni_serial.c index 2003dfcace5d8..743d877e7ff94 100644 --- a/drivers/tty/serial/qcom_geni_serial.c +++ b/drivers/tty/serial/qcom_geni_serial.c @@ -727,6 +727,7 @@ static void qcom_geni_serial_handle_tx(struct uart_port *uport, bool done, size_t pending; int i; u32 status; + u32 irq_en; unsigned int chunk; int tail; @@ -755,6 +756,11 @@ static void qcom_geni_serial_handle_tx(struct uart_port *uport, bool done, if (!port->tx_remaining) { qcom_geni_serial_setup_tx(uport, pending); port->tx_remaining = pending; + + irq_en = readl_relaxed(uport->membase + SE_GENI_M_IRQ_EN); + if (!(irq_en & M_TX_FIFO_WATERMARK_EN)) + writel_relaxed(irq_en | M_TX_FIFO_WATERMARK_EN, + uport->membase + SE_GENI_M_IRQ_EN); } remaining = chunk; @@ -778,7 +784,23 @@ static void qcom_geni_serial_handle_tx(struct uart_port *uport, bool done, } xmit->tail = tail & (UART_XMIT_SIZE - 1); + + /* + * The tx fifo watermark is level triggered and latched. Though we had + * cleared it in qcom_geni_serial_isr it will have already reasserted + * so we must clear it again here after our writes. + */ + writel_relaxed(M_TX_FIFO_WATERMARK_EN, + uport->membase + SE_GENI_M_IRQ_CLEAR); + out_write_wakeup: + if (!port->tx_remaining) { + irq_en = readl_relaxed(uport->membase + SE_GENI_M_IRQ_EN); + if (irq_en & M_TX_FIFO_WATERMARK_EN) + writel_relaxed(irq_en & ~M_TX_FIFO_WATERMARK_EN, + uport->membase + SE_GENI_M_IRQ_EN); + } + if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) uart_write_wakeup(uport); } @@ -814,8 +836,7 @@ static irqreturn_t qcom_geni_serial_isr(int isr, void *dev) tty_insert_flip_char(tport, 0, TTY_OVERRUN); } - if (m_irq_status & (M_TX_FIFO_WATERMARK_EN | M_CMD_DONE_EN) && - m_irq_en & (M_TX_FIFO_WATERMARK_EN | M_CMD_DONE_EN)) + if (m_irq_status & m_irq_en & (M_TX_FIFO_WATERMARK_EN | M_CMD_DONE_EN)) qcom_geni_serial_handle_tx(uport, m_irq_status & M_CMD_DONE_EN, geni_status & M_GENI_CMD_ACTIVE); -- 2.20.1