From patchwork Tue Dec 17 01:44:28 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Crosthwaite X-Patchwork-Id: 301967 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 2A9BE2C009D for ; Tue, 17 Dec 2013 12:45:40 +1100 (EST) Received: from localhost ([::1]:59255 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Vsjj7-00010T-98 for incoming@patchwork.ozlabs.org; Mon, 16 Dec 2013 20:45:37 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38404) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Vsjid-0000iM-MO for qemu-devel@nongnu.org; Mon, 16 Dec 2013 20:45:13 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VsjiX-0001G4-G1 for qemu-devel@nongnu.org; Mon, 16 Dec 2013 20:45:07 -0500 Received: from mail-pd0-f178.google.com ([209.85.192.178]:32784) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VsjiX-0001De-B9 for qemu-devel@nongnu.org; Mon, 16 Dec 2013 20:45:01 -0500 Received: by mail-pd0-f178.google.com with SMTP id y10so6148705pdj.9 for ; Mon, 16 Dec 2013 17:45:00 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=9D6li+uIoN+vLvr5aWy/jHxLongaDgjT9XB0SBXUn/I=; b=ghwHinolFfmYQbaU5azPlsHdIoGEfI5HdmDTdow/TqP4C9JmC+SSz7oMCWAWIX3iK+ 4o+JlBQ0m1YVcG+UFuuYZqGQsfHA+ASVEwwke1LfuuT7vjy1dbWf62xpDm092BttXNUA tpzTuaFoPse0tpZ9W+nhD5COPVZFFAa1POr9HB5T2eXQ4H7G+oN64VeUlqqsyLWQ/Qvs 6u9JRsChGCIXeA3msEY7rcPhA4R/KFde5GDfULoetDo8QzCFcUKXPcBBqmWrNUTyS73S e4lCh+0W8U2sJYEDK1wtBbzicWcjUht4anpavP3y2nCwt7uxNdkIduSEUCNFgKWUA2jB D0JA== X-Gm-Message-State: ALoCoQk4R6q3bEQK8aChvLWHy1tRvNUbPvLZ27qpm6Aa9igw/5SvnbpP9eHbuvQ7KptGexYVy8bj X-Received: by 10.66.162.136 with SMTP id ya8mr23590884pab.110.1387244700688; Mon, 16 Dec 2013 17:45:00 -0800 (PST) Received: from localhost ([149.199.62.254]) by mx.google.com with ESMTPSA id ha10sm29653398pbd.17.2013.12.16.17.44.59 for (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Mon, 16 Dec 2013 17:45:00 -0800 (PST) From: Peter Crosthwaite To: qemu-devel@nongnu.org Date: Mon, 16 Dec 2013 17:44:28 -0800 Message-Id: X-Mailer: git-send-email 1.8.5.1 In-Reply-To: References: X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.85.192.178 Cc: peter.maydell@linaro.org, antonynpavlov@gmail.com Subject: [Qemu-devel] [PATCH v1 08/11] char/cadence_uart: Fix can_receive logic X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org The can_receive logic was only taking into account the RxFIFO occupancy. RxFIFO population is only used for the echo and normal modes however. Improve the logic to correctly return the true number of receivable characters based on the current mode: Normal mode: RxFIFO vacancy. Remote loopback: TxFIFO vacancy. Echo mode: The min of the TxFIFO and RxFIFO vacancies. Local Loopback: Return non-zero (to implement droppage) Signed-off-by: Peter Crosthwaite --- hw/char/cadence_uart.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/hw/char/cadence_uart.c b/hw/char/cadence_uart.c index f28e503..85e9a00 100644 --- a/hw/char/cadence_uart.c +++ b/hw/char/cadence_uart.c @@ -233,8 +233,16 @@ static void uart_parameters_setup(UartState *s) static int uart_can_receive(void *opaque) { UartState *s = (UartState *)opaque; + int ret = MAX(RX_FIFO_SIZE, TX_FIFO_SIZE); + uint32_t ch_mode = s->r[R_MR] & UART_MR_CHMODE; - return RX_FIFO_SIZE - s->rx_count; + if (ch_mode == NORMAL_MODE || ch_mode == ECHO_MODE) { + ret = MIN(ret, RX_FIFO_SIZE - s->rx_count); + } + if (ch_mode == REMOTE_LOOPBACK || ch_mode == ECHO_MODE) { + ret = MIN(ret, TX_FIFO_SIZE - s->tx_count); + } + return ret; } static void uart_ctrl_update(UartState *s)