Received: by 2002:a25:d7c1:0:0:0:0:0 with SMTP id o184csp4423814ybg; Mon, 21 Oct 2019 08:48:02 -0700 (PDT) X-Google-Smtp-Source: APXvYqxldTkBRcvhEAERwIItM/VnBFnh8TPAcS9hg7UEJDFiRWQUqIRx1Fel/fKzoFHA8dmesYQ0 X-Received: by 2002:a05:6402:643:: with SMTP id u3mr8438304edx.60.1571672882082; Mon, 21 Oct 2019 08:48:02 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1571672882; cv=none; d=google.com; s=arc-20160816; b=b3buItZ/eZxpd7aeM1wB5fLXQzD13JPICdtlyVb1+ztjqzo0vA0QEF3bTR/yDoN5y3 XfVEB/ycODqQuz3vsX0thppFWd5nNujA7gnW2E72GW7ZtKQnOeHALgkiMut5mu9xbNuT 4eQinAc0B8UAXgEvt+zI3igzUiZ95WptnljwsCxO/+z2N1LoDRt2Q5PePsHvkRjp30U5 Kod+S1hrmZtt6IuRGNBBWKI+57VgNdyxx7t/RHqMz1W0x5fdXDi319VBKf+vrVkb9McU xSL9qV6kFPSUktVsmCnJ09EkzNaDkupI2Qs1bCgzl+4UdF0GHBwIXW9FlA1f2QojaBhF a+WQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :dkim-signature; bh=yQ6ni+bd9BJF4Cmm/B3j7HmHOq+jH+Kczpm1ljsEDGM=; b=yCzGXJczMk0yo2Z6KN2F8BIv7Ms4/EclUBK++EDvZ+10/zZSPDNXCauAyqsFQQiTNg pW4L0jQCx+aGtvfOt8iun21TyaU9uK0//oQ68rvPqZF7LBtLzFpaXyx+BaSSgd+/115o 6Da2DDvezScXHnTtFAeipHI/JqPyss8BUvc9nz387t9OuJx920m7uqLGPmXsUvVSUMJZ ZZ4fARSWYUxN5bnljti81N4yJaTOhCptrP0ItOybDc+Ps352eGjolOagTYvFghJe7b9j USAVdN1frz6tVGtKssbadFYDrUksj56CfpVr3X6uKva2vCr+pA5u6HcgqZR4VnK4vOsB FArg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=Ro06y3yv; 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; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id h48si10270607ede.31.2019.10.21.08.47.36; Mon, 21 Oct 2019 08:48:02 -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; dkim=pass header.i=@gmail.com header.s=20161025 header.b=Ro06y3yv; 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; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729785AbfJUPqc (ORCPT + 99 others); Mon, 21 Oct 2019 11:46:32 -0400 Received: from mail-pl1-f193.google.com ([209.85.214.193]:35071 "EHLO mail-pl1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727607AbfJUPqZ (ORCPT ); Mon, 21 Oct 2019 11:46:25 -0400 Received: by mail-pl1-f193.google.com with SMTP id c3so6822467plo.2; Mon, 21 Oct 2019 08:46:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=yQ6ni+bd9BJF4Cmm/B3j7HmHOq+jH+Kczpm1ljsEDGM=; b=Ro06y3yv0XUF9A0bdwjh7RIZRubL77EH3UtwhNvN3x7Qx4L4RBVBTFSHcVD5+CUgYS S5BSN7Cip2kcBsu6v41e+4Ef6coS68mMS2AKaJRNHx7ibijPmvLPpqHvb2r09Fm/Mrb7 TTBAi7PQHrV9IYaiq+Kgk1yS4eHhwUxKPsICxcqFv5VvP00/3Hz43aEViiAmPxJuHazZ 83xO5m32YgRXP2YLa8GX2P4Gri7XDWKgRDAVat2Z0KnR7iGcanBhEQsFvkZ1psXrKfGD 0YLyE1wU6IXvKkdoL+KUQqKgYvQgBlknyv2BFvuBeMToVGPYYakDtTPXYSHcmV1cMMc4 ogwA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=yQ6ni+bd9BJF4Cmm/B3j7HmHOq+jH+Kczpm1ljsEDGM=; b=K7yr3wVb51oKawGVLu5/qV42pE9oUZRd19vSbhwf4txG9df9Q/3zqXNZZ8xpgiv6Mm ggoKSPhc5fsq6vgqFA2REBgBgO4phs8aFRhSp/77DQqGXQZ12pjSwRWJssOjtggjMequ 7RdtXJgbpo1wVQ37Kagy8WpU0HVEcmVjvy6dlZhISLXO8znhpXTUgEvcf0jySshfyIZ6 N2VfwxI4aZZIEBx1HRMxwAI5RcL0V9cTmFB4CoB5WjRaN+ps7ekdioIBx14bkhiob9D6 sjil3n8OCbQWmIAs7zQia6EiKP1HQi+NOJm3c9X5P2l+9Ehz145bDThi99sX1z8gsvc9 cz9g== X-Gm-Message-State: APjAAAUlPfzZ5e0MJgbZ7jxLHnECeLJK0caHDZTxKv7HrKFkIlE61j2L 91CW2vIB2P+wDLOHG4Csv9U= X-Received: by 2002:a17:902:6b05:: with SMTP id o5mr25219969plk.33.1571672784211; Mon, 21 Oct 2019 08:46:24 -0700 (PDT) Received: from aw-bldr-10.qualcomm.com (i-global254.qualcomm.com. [199.106.103.254]) by smtp.gmail.com with ESMTPSA id n66sm22805977pfn.90.2019.10.21.08.46.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 21 Oct 2019 08:46:23 -0700 (PDT) From: Jeffrey Hugo To: agross@kernel.org, bjorn.andersson@linaro.org, gregkh@linuxfoundation.org, jslaby@suse.com Cc: linux-arm-msm@vger.kernel.org, linux-serial@vger.kernel.org, linux-kernel@vger.kernel.org, Jeffrey Hugo Subject: [PATCH v2] tty: serial: msm_serial: Fix flow control Date: Mon, 21 Oct 2019 08:46:16 -0700 Message-Id: <20191021154616.25457-1-jeffrey.l.hugo@gmail.com> X-Mailer: git-send-email 2.17.1 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org hci_qca interfaces to the wcn3990 via a uart_dm on the msm8998 mtp and Lenovo Miix 630 laptop. As part of initializing the wcn3990, hci_qca disables flow, configures the uart baudrate, and then reenables flow - at which point an event is expected to be received over the uart from the wcn3990. It is observed that this event comes after the baudrate change but before hci_qca re-enables flow. This is unexpected, and is a result of msm_reset() being broken. According to the uart_dm hardware documentation, it is recommended that automatic hardware flow control be enabled by setting RX_RDY_CTL. Auto hw flow control will manage RFR based on the configured watermark. When there is space to receive data, the hw will assert RFR. When the watermark is hit, the hw will de-assert RFR. The hardware documentation indicates that RFR can me manually managed via CR when RX_RDY_CTL is not set. SET_RFR asserts RFR, and RESET_RFR de-asserts RFR. msm_reset() is broken because after resetting the hardware, it unconditionally asserts RFR via SET_RFR. This enables flow regardless of the current configuration, and would undo a previous flow disable operation. It should instead de-assert RFR via RESET_RFR to block flow until the hardware is reconfigured. msm_serial should rely on the client to specify that flow should be enabled, either via mctrl() or the termios structure, and only assert RFR in response to those triggers. Fixes: 04896a77a97b ("msm_serial: serial driver for MSM7K onboard serial peripheral.") Signed-off-by: Jeffrey Hugo --- v2: -mask out RX_RDY_CTL in msm_reset() to close a small race window for RFR drivers/tty/serial/msm_serial.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/tty/serial/msm_serial.c b/drivers/tty/serial/msm_serial.c index 3657a24913fc..00964b6e4ac1 100644 --- a/drivers/tty/serial/msm_serial.c +++ b/drivers/tty/serial/msm_serial.c @@ -980,6 +980,7 @@ static unsigned int msm_get_mctrl(struct uart_port *port) static void msm_reset(struct uart_port *port) { struct msm_port *msm_port = UART_TO_MSM(port); + unsigned int mr; /* reset everything */ msm_write(port, UART_CR_CMD_RESET_RX, UART_CR); @@ -987,7 +988,10 @@ static void msm_reset(struct uart_port *port) msm_write(port, UART_CR_CMD_RESET_ERR, UART_CR); msm_write(port, UART_CR_CMD_RESET_BREAK_INT, UART_CR); msm_write(port, UART_CR_CMD_RESET_CTS, UART_CR); - msm_write(port, UART_CR_CMD_SET_RFR, UART_CR); + msm_write(port, UART_CR_CMD_RESET_RFR, UART_CR); + mr = msm_read(port, UART_MR1); + mr &= ~UART_MR1_RX_RDY_CTL; + msm_write(port, mr, UART_MR1); /* Disable DM modes */ if (msm_port->is_uartdm) -- 2.17.1