Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp2729840pxj; Mon, 31 May 2021 09:16:28 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwebsbdV4gNJPxySG2imyJ3hUe52EHhtGX2lD7QMVxpxThCNJRWJd12COpPqudbPC9NuLQH X-Received: by 2002:aa7:cd83:: with SMTP id x3mr26060086edv.373.1622477787820; Mon, 31 May 2021 09:16:27 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1622477787; cv=none; d=google.com; s=arc-20160816; b=zeLMjeCpHJfQ6YO6i1QGAU7wg/5gR+Yy+Z/MuPOR/zxj+gWGpCGq4k5rLRa8wLQClb d3o0w5i2PP2yCMf2QksdRDC7JuFvk/JDaAcVBYVQyRJR9mw8vnabE6HSp1vJiy9fcGs/ 8gWJgZQ288fAZ1xY9t/OVEiawSvgqhDHdyMRTz1229r+PwEyFag/ZhOauC2rD6vp2iOd 6MPPSXiSO6C6D92SCPiQ0ZStwjIkwk50Z2ONx+U1xg0WMFvnWvEsUrAG9uwSj4luXkZv r6Hm5KXbSGlR+keitMEo/AJyAF7nfW1TaK+MA/f3QupLw44MLETRmCrlyPc4vuUVP30x jfsw== 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=OCmhTaPg7upRbDLeIH8pd8I3gBQAlcTxOtvWzzS3uwo=; b=tbt+TyA+UAJACE00xex5mUgVFomqDqwnKcv1FSAZUHhUxAJ527V1ETyU4WzpM7zGsK Gmm7NK1efzJ8FmEfriiII+2zsSQy5Dc2ALwnbGx0O5DKMOZQZAXjjz8qO8+FRXllH/27 6J+hj25vxF51sa3xGDPHyrt4hjuy5ffgpwK+MUXK2MAt7E0vnD07Knys+ItvBxkVxhKj sLsjRGuv5ICo3YoCfDsp+TLMUXaZv7jwgt/PvnDDbDTJgHUGrBSTK8Zad78mU6l+U1/D EGU7GBszLhvRxelIb1lxe/aG9A8Qsw9WrfHtazPOkdshm12ZVJ0zwAHAk8zQz8PjVvAD Etug== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=ckoxx8C+; 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 gl4si2236598ejb.133.2021.05.31.09.16.05; Mon, 31 May 2021 09:16:27 -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=@linuxfoundation.org header.s=korg header.b=ckoxx8C+; 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 S233393AbhEaQOB (ORCPT + 99 others); Mon, 31 May 2021 12:14:01 -0400 Received: from mail.kernel.org ([198.145.29.99]:37862 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234107AbhEaOjU (ORCPT ); Mon, 31 May 2021 10:39:20 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id DB36D6135D; Mon, 31 May 2021 13:52:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1622469142; bh=po92fyaU31d9OfaH20goi4hugIcHBnKfk/b12o0pnSQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ckoxx8C+w/6lLyD8MgWQc+tkcD9qSyik0l5iwc9LTrEJgmCypfStISXmyDOnV+D5F SzRVc1Q9Ng2ZsKEiBmVTBfeUfsKz5SGy0eLIO75lJJup58uQbntANpoC3htpbYiaoF 6G/B7nHLVWU8H/Kvgf0/Q1orG49o7zFpnLFRqc0E= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, ChiaWei Wang , Jiri Slaby , Andrew Jeffery Subject: [PATCH 5.12 085/296] serial: 8250: Add UART_BUG_TXRACE workaround for Aspeed VUART Date: Mon, 31 May 2021 15:12:20 +0200 Message-Id: <20210531130706.731805073@linuxfoundation.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210531130703.762129381@linuxfoundation.org> References: <20210531130703.762129381@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: Andrew Jeffery commit df8f2be2fd0b44b2cb6077068f52e05f0ac40897 upstream. Aspeed Virtual UARTs directly bridge e.g. the system console UART on the LPC bus to the UART interface on the BMC's internal APB. As such there's no RS-232 signalling involved - the UART interfaces on each bus are directly connected as the producers and consumers of the one set of FIFOs. The APB in the AST2600 generally runs at 100MHz while the LPC bus peaks at 33MHz. The difference in clock speeds exposes a race in the VUART design where a Tx data burst on the APB interface can result in a byte lost on the LPC interface. The symptom is LSR[DR] remains clear on the LPC interface despite data being present in its Rx FIFO, while LSR[THRE] remains clear on the APB interface as the host has not consumed the data the BMC has transmitted. In this state, the UART has stalled and no further data can be transmitted without manual intervention (e.g. resetting the FIFOs, resulting in loss of data). The recommended work-around is to insert a read cycle on the APB interface between writes to THR. Cc: ChiaWei Wang Tested-by: ChiaWei Wang Reviewed-by: Jiri Slaby Signed-off-by: Andrew Jeffery Cc: stable Link: https://lore.kernel.org/r/20210520021334.497341-2-andrew@aj.id.au Signed-off-by: Greg Kroah-Hartman --- drivers/tty/serial/8250/8250.h | 1 + drivers/tty/serial/8250/8250_aspeed_vuart.c | 1 + drivers/tty/serial/8250/8250_port.c | 12 ++++++++++++ 3 files changed, 14 insertions(+) --- a/drivers/tty/serial/8250/8250.h +++ b/drivers/tty/serial/8250/8250.h @@ -88,6 +88,7 @@ struct serial8250_config { #define UART_BUG_NOMSR (1 << 2) /* UART has buggy MSR status bits (Au1x00) */ #define UART_BUG_THRE (1 << 3) /* UART has buggy THRE reassertion */ #define UART_BUG_PARITY (1 << 4) /* UART mishandles parity if FIFO enabled */ +#define UART_BUG_TXRACE (1 << 5) /* UART Tx fails to set remote DR */ #ifdef CONFIG_SERIAL_8250_SHARE_IRQ --- a/drivers/tty/serial/8250/8250_aspeed_vuart.c +++ b/drivers/tty/serial/8250/8250_aspeed_vuart.c @@ -403,6 +403,7 @@ static int aspeed_vuart_probe(struct pla port.port.status = UPSTAT_SYNC_FIFO; port.port.dev = &pdev->dev; port.port.has_sysrq = IS_ENABLED(CONFIG_SERIAL_8250_CONSOLE); + port.bugs |= UART_BUG_TXRACE; rc = sysfs_create_group(&vuart->dev->kobj, &aspeed_vuart_attr_group); if (rc < 0) --- a/drivers/tty/serial/8250/8250_port.c +++ b/drivers/tty/serial/8250/8250_port.c @@ -1815,6 +1815,18 @@ void serial8250_tx_chars(struct uart_825 count = up->tx_loadsz; do { serial_out(up, UART_TX, xmit->buf[xmit->tail]); + if (up->bugs & UART_BUG_TXRACE) { + /* + * The Aspeed BMC virtual UARTs have a bug where data + * may get stuck in the BMC's Tx FIFO from bursts of + * writes on the APB interface. + * + * Delay back-to-back writes by a read cycle to avoid + * stalling the VUART. Read a register that won't have + * side-effects and discard the result. + */ + serial_in(up, UART_SCR); + } xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1); port->icount.tx++; if (uart_circ_empty(xmit))