Received: by 2002:a05:6a10:af89:0:0:0:0 with SMTP id iu9csp3644715pxb; Mon, 24 Jan 2022 14:16:58 -0800 (PST) X-Google-Smtp-Source: ABdhPJzY1qqPCLhphQC4wQwuT1JgpMctAz5/+tssouVbZ7Y2X38NZK2zZ2MTLnTLtka9YkGBqflw X-Received: by 2002:a63:541a:: with SMTP id i26mr3602266pgb.322.1643062617826; Mon, 24 Jan 2022 14:16:57 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643062617; cv=none; d=google.com; s=arc-20160816; b=czue7c9atYVzEzTFaVjmXq6IVUnyOBHB1Et1Hlib7cUBJg2MXhkngfQZc88moFNslO ZfvwPwt4AFerVr2twUyGB020zkbAxz7hByPBIN8Y2kA5cKrSZwWn/dO55JH5PJBwlg8j 360y0xRPhzHbZ7vw/sLt6cF9+DdL3zJn703Obr2FnXeHW/b+8ZixsQQ6fLyx+CUV1oxd T5oMNGvZGW6/waPnbmXsajkGXAl5+AUGNlJTHJ7Tb0ZtqSo2kSgPUon9H8uI8I7l5sRd FWwyfl71fchokyfGwK5D/8Yy653s9ebOd5LCAO9PGONZ006XBNb6wsZtDCB0FRtXvSzZ +a7A== 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=U1uYVG6PNfP8Enl4gJKGD3+kuYkD/fQqY0CtMv+AbD8=; b=ll96hmKvPLacXp5nrYltb4FPIXVDqUcB+Vb7LqC8LoTmOw5Ff9PKMPb+cF0hzfNeW5 7MGeF9sDMojf9i+PVwpi+n7OyK+G/lNZR7Sc8MoyHBFEbHJPlOgEtQ2S7Vk8Y3pse72d KzY6yaE6TZjouT1peCJfijmhzm/LHhy++YtUmWi2rtEYt8UDEeZW01Ifum3aB64a0aPj KEyVScOeHZhr/eFx4Vfpsvko0SGVETyatVF/nc86/QLPBosdZnyB/J2Ys/7/HPSFzxJa b0Tn26P8PAX+mIaqlvoHRMP04FOrhK4O9rTcFv9EmP77N9cXVwf05nFJ+3XoFjeBnApN K5iw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=pnCDK0m1; 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 lp16si541431pjb.181.2022.01.24.14.16.46; Mon, 24 Jan 2022 14:16:57 -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=pnCDK0m1; 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 S1348744AbiAXWId (ORCPT + 99 others); Mon, 24 Jan 2022 17:08:33 -0500 Received: from dfw.source.kernel.org ([139.178.84.217]:45706 "EHLO dfw.source.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1452206AbiAXVYR (ORCPT ); Mon, 24 Jan 2022 16:24:17 -0500 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 D16D6614CB; Mon, 24 Jan 2022 21:24:16 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id B4DC8C340E4; Mon, 24 Jan 2022 21:24:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1643059456; bh=3kPQFQXrFwsqTMtVM9ew+ZI2qMLU4r4nNQNU7LoZqa0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=pnCDK0m1xmVUdGxArAjBoIOM+r0ggwcZZQQT1NwzHH/p4ryshzsu/K94aUhPeZiw1 kVp5FtBMymFvcQPzNqbc5re5acb+GQBhDiQsKfRQPpuzEm8Z605f6IbbHnVBPqMpuf wofZLctTVLk5xJelg7o+wv3Ss8hIDayiJc/JVL1I= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Jiri Slaby , Sasha Levin Subject: [PATCH 5.16 0589/1039] mxser: dont throttle manually Date: Mon, 24 Jan 2022 19:39:38 +0100 Message-Id: <20220124184145.134971912@linuxfoundation.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220124184125.121143506@linuxfoundation.org> References: <20220124184125.121143506@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: Jiri Slaby [ Upstream commit c6693e6e07805f1b7822b13a5b482bf2b6a1f312 ] First, checking tty->receive_room to signalize whether there is enough space in the tty buffers does not make much sense. Provided the tty buffers are in tty_port and those are not checked at all. Second, if the rx path is throttled, with CRTSCTS, RTS is deasserted, but is never asserted again. This leads to port "lockup", not accepting any more input. So: 1) stty -F /dev/ttyMI0 crtscts # the mxser port 2) stty -F /dev/ttyS6 crtscts # the connected port 3) cat /dev/ttyMI0 4) "write in a loop" to /dev/ttyS6 5) cat from 3) produces the bytes from 4) 6) killall -STOP cat (the 3)'s one) 7) wait for RTS to drop on /dev/ttyMI0 8) killall -CONT cat (again the 3)'s one) cat erroneously produces no more output now (i.e. no data sent from ttyS6 to ttyMI can be seen). Note that the step 7) is performed twice: once from n_tty by tty_throttle_safe(), once by mxser_stoprx() from the receive path. Then after step 7), n_tty correctly unthrottles the input, but mxser calls mxser_stoprx() again as there is still only a little space in n_tty buffers (tty->receive_room mentioned at the beginning), but the device's FIFO is/can be already filled. After this patch, the output is correctly resumed, i.e. n_tty both throttles and unthrottles without interfering with mxser's attempts. This allows us to get rid of the non-standard ldisc_stop_rx flag from struct mxser_port. Signed-off-by: Jiri Slaby Link: https://lore.kernel.org/r/20211118073125.12283-15-jslaby@suse.cz Signed-off-by: Greg Kroah-Hartman Signed-off-by: Sasha Levin --- drivers/tty/mxser.c | 36 ++++++------------------------------ 1 file changed, 6 insertions(+), 30 deletions(-) diff --git a/drivers/tty/mxser.c b/drivers/tty/mxser.c index 27caa2f9ba79b..3b5d193b7f245 100644 --- a/drivers/tty/mxser.c +++ b/drivers/tty/mxser.c @@ -251,8 +251,6 @@ struct mxser_port { u8 MCR; /* Modem control register */ u8 FCR; /* FIFO control register */ - bool ldisc_stop_rx; - struct async_icount icount; /* kernel counters for 4 input interrupts */ unsigned int timeout; @@ -1323,11 +1321,14 @@ static int mxser_get_icount(struct tty_struct *tty, return 0; } -static void mxser_stoprx(struct tty_struct *tty) +/* + * This routine is called by the upper-layer tty layer to signal that + * incoming characters should be throttled. + */ +static void mxser_throttle(struct tty_struct *tty) { struct mxser_port *info = tty->driver_data; - info->ldisc_stop_rx = true; if (I_IXOFF(tty)) { if (info->board->must_hwid) { info->IER &= ~MOXA_MUST_RECV_ISR; @@ -1346,21 +1347,11 @@ static void mxser_stoprx(struct tty_struct *tty) } } -/* - * This routine is called by the upper-layer tty layer to signal that - * incoming characters should be throttled. - */ -static void mxser_throttle(struct tty_struct *tty) -{ - mxser_stoprx(tty); -} - static void mxser_unthrottle(struct tty_struct *tty) { struct mxser_port *info = tty->driver_data; /* startrx */ - info->ldisc_stop_rx = false; if (I_IXOFF(tty)) { if (info->x_char) info->x_char = 0; @@ -1543,9 +1534,6 @@ static bool mxser_receive_chars_new(struct tty_struct *tty, if (hwid == MOXA_MUST_MU150_HWID) gdl &= MOXA_MUST_GDL_MASK; - if (gdl >= tty->receive_room && !port->ldisc_stop_rx) - mxser_stoprx(tty); - while (gdl--) { u8 ch = inb(port->ioaddr + UART_RX); tty_insert_flip_char(&port->port, ch, 0); @@ -1558,10 +1546,8 @@ static u8 mxser_receive_chars_old(struct tty_struct *tty, struct mxser_port *port, u8 status) { enum mxser_must_hwid hwid = port->board->must_hwid; - int recv_room = tty->receive_room; int ignored = 0; int max = 256; - int cnt = 0; u8 ch; do { @@ -1596,14 +1582,8 @@ static u8 mxser_receive_chars_old(struct tty_struct *tty, port->icount.overrun++; } } - tty_insert_flip_char(&port->port, ch, flag); - cnt++; - if (cnt >= recv_room) { - if (!port->ldisc_stop_rx) - mxser_stoprx(tty); + if (!tty_insert_flip_char(&port->port, ch, flag)) break; - } - } if (hwid) @@ -1618,9 +1598,6 @@ static u8 mxser_receive_chars_old(struct tty_struct *tty, static u8 mxser_receive_chars(struct tty_struct *tty, struct mxser_port *port, u8 status) { - if (tty->receive_room == 0 && !port->ldisc_stop_rx) - mxser_stoprx(tty); - if (!mxser_receive_chars_new(tty, port, status)) status = mxser_receive_chars_old(tty, port, status); @@ -1833,7 +1810,6 @@ static void mxser_initbrd(struct mxser_board *brd, bool high_baud) tty_port_init(&info->port); info->port.ops = &mxser_port_ops; info->board = brd; - info->ldisc_stop_rx = false; /* Enhance mode enabled here */ if (brd->must_hwid != MOXA_OTHER_UART) -- 2.34.1