Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp3761131pxk; Tue, 29 Sep 2020 05:45:25 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyqGVB4E+b7Y8WK9D8Z3+jGwprJ2UuILUzPcqzPW8NXC8wkLK9bLJ0wdq2yBYl3+hUP4pPG X-Received: by 2002:aa7:c885:: with SMTP id p5mr2984612eds.127.1601383525100; Tue, 29 Sep 2020 05:45:25 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1601383525; cv=none; d=google.com; s=arc-20160816; b=yAVZlYpU/Hhr5HTPxrEm0nEURmHIkRoLiTFrmFDOSEWwDO0Su8Y/tyERWrZ7GozjgU /QT3NhmLgY6F1TKAfiAJs30qYR1Qd2Oy5CCNL+eOOKGY7X6E7zi9NlS2vF7XuPQDRLMR PLLACidjsM6dlQdgbT4g4TFIeTyzBqoMASbwP3ZFlgLWC2PdPZSBzCXtj/uKID0E0UCB ySJCoKh8GPAse90eFIWXWehtp/AbszsNwV03+6rFjrl+iYzGW6YMrjGYPwELsTTQeph+ TarJArMfCnp5xDhc+fF5I0LOJqXLZ2YnLEItBrzkYnitHW0zeO5yT3W/Lbz00yWkF3OJ m/Sw== 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=LBK1rr/y3PyH1T5EYr05UhXdVhtDIb/EfMxLiv38gHg=; b=TxnRbsiXjzeeibUk2YI3+rPZeFzv/hTCtR5Pbyfn5uHpfD/ZzXZWcAW1lKvetztc0f cuC0PyX8STeazB5scnT/5xWWi23P1gCzlFS6MjRJbmrHRaSNTgLrmFTT4dbu3/0T9yg+ uUoSRO5oNxqFWXDyvCFXGBGXmRNCLxDwvlSNptwutEMlVm1n0ThPMhF8ZXHABELBb6Ez WjFLlmSZXa5K7vWEe6TzNX6YMggACFWyTJeFVL/l6RMrWLac5g2xi1UQGm9jX/GSfPQN xfrmcNWRrIENMdFEaSl/fYuIe0CM0/N6zN7bWmvw97V0KMXj2Z9k4zvmY1PIpTQg3k5g 3Dwg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=PIku1a6t; 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=fail (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 a1si2664681edy.292.2020.09.29.05.45.01; Tue, 29 Sep 2020 05:45:25 -0700 (PDT) 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=@kernel.org header.s=default header.b=PIku1a6t; 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=fail (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387486AbgI2MoB (ORCPT + 99 others); Tue, 29 Sep 2020 08:44:01 -0400 Received: from mail.kernel.org ([198.145.29.99]:49710 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729077AbgI2LJZ (ORCPT ); Tue, 29 Sep 2020 07:09:25 -0400 Received: from localhost (83-86-74-64.cable.dynamic.v4.ziggo.nl [83.86.74.64]) (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 D263521D46; Tue, 29 Sep 2020 11:09:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1601377764; bh=FvoK/XHYIkx7IHIbNpADDdi/rjGeGDRz2RbObrT221Q=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=PIku1a6tYj/AnXqfKjxEzlDmHotZzuVkJ0wiTQvVoiXCDz0pyUNtMfseMUJ4f7nY1 RbnW1waipJv3IkuJmmDZNx7++iijYTuDJTmgtTyHrP6Nfw8K5BuNOyd10CInKOI4Im JhdLIa1TcEB8Z1QlrNqptXaOqUyV6WOOdxdJuHoc= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Vignesh Raghavendra , Sasha Levin Subject: [PATCH 4.9 064/121] serial: 8250_port: Dont service RX FIFO if throttled Date: Tue, 29 Sep 2020 13:00:08 +0200 Message-Id: <20200929105933.342092058@linuxfoundation.org> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20200929105930.172747117@linuxfoundation.org> References: <20200929105930.172747117@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: Vignesh Raghavendra [ Upstream commit f19c3f6c8109b8bab000afd35580929958e087a9 ] When port's throttle callback is called, it should stop pushing any more data into TTY buffer to avoid buffer overflow. This means driver has to stop HW from receiving more data and assert the HW flow control. For UARTs with auto HW flow control (such as 8250_omap) manual assertion of flow control line is not possible and only way is to allow RX FIFO to fill up, thus trigger auto HW flow control logic. Therefore make sure that 8250 generic IRQ handler does not drain data when port is stopped (i.e UART_LSR_DR is unset in read_status_mask). Not servicing, RX FIFO would trigger auto HW flow control when FIFO occupancy reaches preset threshold, thus halting RX. Since, error conditions in UART_LSR register are cleared just by reading the register, data has to be drained in case there are FIFO errors, else error information will lost. Signed-off-by: Vignesh Raghavendra Link: https://lore.kernel.org/r/20200319103230.16867-2-vigneshr@ti.com Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- drivers/tty/serial/8250/8250_port.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c index 5641b877dca53..827a641ac336e 100644 --- a/drivers/tty/serial/8250/8250_port.c +++ b/drivers/tty/serial/8250/8250_port.c @@ -1806,6 +1806,7 @@ int serial8250_handle_irq(struct uart_port *port, unsigned int iir) unsigned char status; unsigned long flags; struct uart_8250_port *up = up_to_u8250p(port); + bool skip_rx = false; if (iir & UART_IIR_NO_INT) return 0; @@ -1814,7 +1815,20 @@ int serial8250_handle_irq(struct uart_port *port, unsigned int iir) status = serial_port_in(port, UART_LSR); - if (status & (UART_LSR_DR | UART_LSR_BI)) { + /* + * If port is stopped and there are no error conditions in the + * FIFO, then don't drain the FIFO, as this may lead to TTY buffer + * overflow. Not servicing, RX FIFO would trigger auto HW flow + * control when FIFO occupancy reaches preset threshold, thus + * halting RX. This only works when auto HW flow control is + * available. + */ + if (!(status & (UART_LSR_FIFOE | UART_LSR_BRK_ERROR_BITS)) && + (port->status & (UPSTAT_AUTOCTS | UPSTAT_AUTORTS)) && + !(port->read_status_mask & UART_LSR_DR)) + skip_rx = true; + + if (status & (UART_LSR_DR | UART_LSR_BI) && !skip_rx) { if (!up->dma || handle_rx_dma(up, iir)) status = serial8250_rx_chars(up, status); } -- 2.25.1