Received: by 2002:ac0:a874:0:0:0:0:0 with SMTP id c49csp269980ima; Fri, 15 Mar 2019 02:25:53 -0700 (PDT) X-Google-Smtp-Source: APXvYqyhp+LfthsftoblMQAuZbR21cp34i0RhAzNU0eMwsmWWB5FUlCcZMffNhjOzMvW7sCfE8Us X-Received: by 2002:a17:902:9884:: with SMTP id s4mr3172379plp.110.1552641953048; Fri, 15 Mar 2019 02:25:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1552641953; cv=none; d=google.com; s=arc-20160816; b=Ke1OMfWsS8Ttn4A3GIJs4iYb6SkeeUstfEozovLMfAXI/IA4lqAIrl0orfPQ9UG3Zh eT0pVuDVn3wyg/8DXA8lAAMSuJP3Rth4+vztEgNNb070n2IYXNeN75/3yj2Cd/UJr8B8 6HccMEf5lHTLldAfVPLN5I83bVNnvtlk4b1BQmu6Ea8LYhZKHBntJnbEn2c0WB8NiiEm Z74n5OhUnxanG7lF9QcFbAjSZlIIp0eHrO8b0ciFl0l4nXg+5rT5Q0ZvwRJVm0xnTx0F idUmaVSAyA76gp/Kg5WFFnCyhFhyvdm2Kl3AndpAVITJXCmpiiDBYSuiqgtgh5rin93M N5Hw== 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 :references:in-reply-to:message-id:date:subject:cc:to:from; bh=xKAS7CbbdcQcCKghaxtXtou/93awyKzpc20DAeHSDVY=; b=XDdrWfovA2wtWNNgKBda7Ado4oTD785YBKRyRqmDWyQFWtLkblroip/8iNNdC+nqbs tvTO/b9fxv3MpVM30Xx3+jGeXTb24c3mpAPHYCTVpVcMsMnnIXWSLSnv3sH4ekr0WhX3 +j+hPxdB+qnambUhRFUNHFrfsMZv0IE66bAn4QfAHMnCT/eV4fW40fntdrguiewNlR5A uLqU2VdvJ7zzdVkKnBRveJeEXHR2cHVyFjVXRbPkmySPXQp1hHETzhElXtBFV34Nuzer oWrjlEuI6ItUEiZnhdy2yJiwgwKh7Pvti34768wUpRaglNO3WgKiWnusl8O2zwd9fn/P 3dYg== ARC-Authentication-Results: i=1; mx.google.com; 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 l5si1398155pgq.79.2019.03.15.02.25.38; Fri, 15 Mar 2019 02:25:53 -0700 (PDT) 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; 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 S1728699AbfCOJXq (ORCPT + 99 others); Fri, 15 Mar 2019 05:23:46 -0400 Received: from esa3.microchip.iphmx.com ([68.232.153.233]:11402 "EHLO esa3.microchip.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726886AbfCOJXo (ORCPT ); Fri, 15 Mar 2019 05:23:44 -0400 X-IronPort-AV: E=Sophos;i="5.58,481,1544511600"; d="scan'208";a="28264332" Received: from smtpout.microchip.com (HELO email.microchip.com) ([198.175.253.82]) by esa3.microchip.iphmx.com with ESMTP/TLS/DHE-RSA-AES256-SHA; 15 Mar 2019 02:23:43 -0700 Received: from rob-ult-m50855.microchip.com (10.10.76.4) by chn-sv-exch07.mchp-main.com (10.10.76.108) with Microsoft SMTP Server id 14.3.352.0; Fri, 15 Mar 2019 02:23:43 -0700 From: Razvan Stefanescu To: Richard Genoud , Greg Kroah-Hartman , Jiri Slaby CC: Nicolas Ferre , Alexandre Belloni , Ludovic Desroches , , , Subject: [PATCH 2/2] tty/serial: atmel: RS485 HD w/DMA: enable RX after TX is stopped Date: Fri, 15 Mar 2019 11:23:34 +0200 Message-ID: <20190315092334.13246-3-razvan.stefanescu@microchip.com> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20190315092334.13246-1-razvan.stefanescu@microchip.com> References: <20190315092334.13246-1-razvan.stefanescu@microchip.com> MIME-Version: 1.0 Content-Transfer-Encoding: 7BIT Content-Type: text/plain; charset=US-ASCII Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In half-duplex operation, RX should be started after TX completes. If DMA is used, there is a case when the DMA transfer completes but the TX FIFO is not emptied, so the RX cannot be restarted just yet. Use a boolean variable to store this state and rearm TX interrupt mask to be signaled again that the transfer finished. In interrupt transmit handler this variable is used to start RX. Signed-off-by: Razvan Stefanescu --- drivers/tty/serial/atmel_serial.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c index a6577b1c4461..b0141dcbbb61 100644 --- a/drivers/tty/serial/atmel_serial.c +++ b/drivers/tty/serial/atmel_serial.c @@ -166,6 +166,8 @@ struct atmel_uart_port { unsigned int pending_status; spinlock_t lock_suspended; + bool hd_start_rx; /* can start RX during half-duplex operation */ + /* ISO7816 */ unsigned int fidi_min; unsigned int fidi_max; @@ -934,8 +936,13 @@ static void atmel_complete_tx_dma(void *arg) if (!uart_circ_empty(xmit)) atmel_tasklet_schedule(atmel_port, &atmel_port->tasklet_tx); else if (atmel_uart_is_half_duplex(port)) { - /* DMA done, stop TX, start RX for RS485 */ - atmel_start_rx(port); + /* + * DMA done, re-enable TXEMPTY and signal that we can stop + * TX and start RX for RS485 + */ + atmel_port->hd_start_rx = true; + atmel_uart_writel(port, ATMEL_US_IER, + atmel_port->tx_done_mask); } spin_unlock_irqrestore(&port->lock, flags); @@ -1379,9 +1386,21 @@ atmel_handle_transmit(struct uart_port *port, unsigned int pending) struct atmel_uart_port *atmel_port = to_atmel_uart_port(port); if (pending & atmel_port->tx_done_mask) { - /* Either PDC or interrupt transmission */ atmel_uart_writel(port, ATMEL_US_IDR, atmel_port->tx_done_mask); + + /* Start RX if flag was set and FIFO is empty */ + if (atmel_port->hd_start_rx) { + if (atmel_uart_readl(port, ATMEL_US_CSR) + & ATMEL_US_TXEMPTY) { + atmel_port->hd_start_rx = false; + atmel_start_rx(port); + } else { + dev_warn(port->dev, "Should start RX, but TX fifo is not empty\n"); + } + return; + } + atmel_tasklet_schedule(atmel_port, &atmel_port->tasklet_tx); } } -- 2.19.1