From nobody Thu Apr 9 07:16:56 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 10E03379997 for ; Tue, 10 Mar 2026 10:48:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773139693; cv=none; b=DIQnu3WKG8iiXk373xG6SMzLOsb141Ny+En8V/kYgsWel8vnKNCjjRVmCud+xJbiPYWDYU6kSaGKMai9Dw1K77DGdNWvyi28tdO6lqduYn1KPLF+o7iXKxhRpV7wUcT73rCe13O+1wowz+rDt4kjxwdUqIuPPUoK+iMdaiWVmB8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773139693; c=relaxed/simple; bh=bVtnesSZgi5d15TH39dhPg834YO0cJlEpOGHYWaCwkc=; h=From:To:Cc:Subject:Date:Message-Id:MIME-Version; b=EF8fhiLiS0C0G35D9DseO6Veyv+IJ1VG8gKRatE72yHqWVYfgS5tU+FdZk5O1Ui/W32MZ4GNI3WGhExG9YbYGwIlvZnF3/yaoi3+qmMdQjHpn/XyrsImMWBnmCRsExdcowtLE26nCe430N/JLd74PlirSvs0JWfWyWLQl2lF65g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=jJPkrguX; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=IKmwxyOD; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="jJPkrguX"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="IKmwxyOD" Received: from pps.filterd (m0279865.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 62AARGP34188869 for ; Tue, 10 Mar 2026 10:48:11 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:message-id:mime-version :subject:to; s=qcppdkim1; bh=/2NolHMEAcoJKvp6qHfCPngf0pFz/e/JPbP GZ6RuwII=; b=jJPkrguXdBrngS9UNoqqlbVasJOeq2s3oqkcSaAGzVLk5jVjuxg hjbSY9nz5zuqlwa+qv4th4LrwvxYE8WGuzbejx5cNrhjlqAKuRnJR0ik0/zJ0T5b LI2n0/qU+BwHTI0UTHDhUXoyBYojfSrJSNyVp0h58BAnjA4hmFpP8r3JH3ZmXRoe kXCaWx0nvoGmdbnHKKqYUJDJRdJ5tXMzkBPBJbWF8oLnTB2KDpJ8el+7q+dD2uG2 LmS8ZIjfIPrWX8s14VFUCJcQ//9BBVpCCgR2vbEc3IyYVFpGhLcfQ7xnmtqQcJPD PePHqT9iAHfYnOt3BNjnNm9LjlT+is665gw== Received: from mail-oi1-f198.google.com (mail-oi1-f198.google.com [209.85.167.198]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4cthjf04f3-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 10 Mar 2026 10:48:11 +0000 (GMT) Received: by mail-oi1-f198.google.com with SMTP id 5614622812f47-462a9191720so108938025b6e.0 for ; Tue, 10 Mar 2026 03:48:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1773139690; x=1773744490; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=/2NolHMEAcoJKvp6qHfCPngf0pFz/e/JPbPGZ6RuwII=; b=IKmwxyOD1oigHapT/VSRnbhfWaeIhhg4xr22rs+qW4CNcu2LY+n6S4i8Z+DHAFBRIT sp2yubTYwp6GmEVN4z59Hq3LLnCSA+ZN0ksU2u2iifb3loj+aJqPryrMxbgypC91eNA+ eAmoC4A8s8cnaiHSRdU32nrIW7HXCkIFhjr/Rm6hsygMOOUFanQLBtCZUZvDgoFFG0wj HTekBGLZF0wLrfQya7AfwmispL5lr2xgkIlaOy4IWWz841IKQ150h4wuwyCDctdYYQ8o j9Pf2vDZEGPzU8709ATlx4XnZGu2aTtuTad+lKltISaMsGqMnDBurExzxwvbQ0uzizbg gkqg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1773139690; x=1773744490; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=/2NolHMEAcoJKvp6qHfCPngf0pFz/e/JPbPGZ6RuwII=; b=rY6Ql9caHRt2Dp6+EJnlwZcZiHsDsXmoUqNfjN7kAdoPMMCaxkTZYPnhL7ToTtFPyZ +Ulue6G4gAIQAMphM0dkpIJfxHHQjmWK2MyLsSrfDFe/vBAGjInpeq9xQ6uhEs1PtEDS EiR1jidmi8PZiNY4mJ270UGScTLOsO1HV+CUkUU47T3yRRSKjYXJ0ISUN8U7xAY8h6UX h9Xh8KYPsNLmg3p8Gwv24EQxyoQCjv0kS3UAkAU8eK7xPvwlrS0IkzYfvFLI+3ehAGrF U8AnNQjwXLl3TZb8Zjlqz9joABdvGGkl3SAO0sm5BB5IdKwCpZu0c/+s1oiFUSDVnuue vrxQ== X-Forwarded-Encrypted: i=1; AJvYcCU13YA++YN2IRkDi1tsG5iftLe0sY4z/oalE27dWxSPe1fMl35GmXkD83xaeRbEIaqr06oUex9rwQP7i4k=@vger.kernel.org X-Gm-Message-State: AOJu0YzkmLyuzmcW5hj0h1V4nN8r/9TvK3M8LQOpB7d2uH+HoH+odvwr mOt7iDhQ2Ojow9jIFEqy477JJ0hF1F8ImxHG+2Em1mJJim1HkstM13E/KwOXhMSOBJeHVUqzU+5 O+/aMcPPumQmLRyrraUh8wBRXeJxKuNyLFrhlrymyYpqxoQFAzlcozgG3PfhVH2WJcFw= X-Gm-Gg: ATEYQzywrNZWP9vlvMoYK1WBTRk6TIv253L4CAHnUxeRCbUi4lvQqGgMA0mqeTFr5cf piEH3v+kOU5v0lpmb0mnaSwCwrZbtxq4rLIIdsxhA9zA6Z/auj9xXrbStktK7KPK8EZS2PHB7nH Nq9vo07ffVT258VfnFgcblFc2rS1MUg7hN6nzAzttQqhInF/omIIGOZrLQEsi1nL9pF0IaFLYt6 MOe1d2WWXk8f420k5uXEueK8mWrnLTO5Hz3Hhz/Sno8WbiIKCrLYty6vXiP3nwQEtBWAO+KOZTf 7y/PNul9rFydY7DrvSzc5G+AIOpg1BiJ94ro7J7tEfdHsnkMojtGBcAcmo4XBviFZnyxerxWETq 8e3pNmnS6ODK6YswDmJsmkqMhLhbfFBusUQrZyHMokdAogAw1c+RzIZg= X-Received: by 2002:a17:90b:1850:b0:359:f9fa:147 with SMTP id 98e67ed59e1d1-359f9fa0257mr460439a91.3.1773139324278; Tue, 10 Mar 2026 03:42:04 -0700 (PDT) X-Received: by 2002:a17:90b:1850:b0:359:f9fa:147 with SMTP id 98e67ed59e1d1-359f9fa0257mr460431a91.3.1773139323834; Tue, 10 Mar 2026 03:42:03 -0700 (PDT) Received: from hu-anupkulk-hyd.qualcomm.com ([202.46.22.19]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-c739e0c9666sm11110278a12.14.2026.03.10.03.41.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 10 Mar 2026 03:42:03 -0700 (PDT) From: Anup Kulkarni To: kernel@oss.qualcomm.com, gregkh@linuxfoundation.org, jirislaby@kernel.org, praveen.talari@oss.qualcomm.com, bryan.odonoghue@linaro.org, viken.dadhaniya@oss.qualcomm.com, quic_zongjian@quicinc.com, quic_jseerapu@quicinc.com, krzk@kernel.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org Cc: Anup Kulkarni Subject: [PATCH v1] serial: qcom-geni: Fix RTS behavior with flow control Date: Tue, 10 Mar 2026 16:11:55 +0530 Message-Id: <20260310104155.339010-1-anup.kulkarni@oss.qualcomm.com> X-Mailer: git-send-email 2.34.1 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-GUID: Ue6vg2dS-599mWhCQC7ko22Oy-AqySre X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMzEwMDA5MyBTYWx0ZWRfX5v7BdFw8xyCG bYjmG/Lt/PKyqnTwo2AFl62evleWY+3UDXIcOnOp2LqBv8c6oU2M7Z3dsawKVduCEb9J8cd/usa e9P7jCctz0/k8nz9ikhTWAOtYNdelvRCdNa8hopO10PuFV38rljLoZC8MqBnyI5mwk/pYq4f0RI LjFwyksTmw3lfS2xsZN2UUHsUuT85QdE40IQKkwHIu7F1aOjTsHan0QlglX5xPBI2SLmgkbNZk5 Ij7Mun3lVJfn4HsHfWPiwqFTTP4w+oLvaJ4brKpWv0GiTHDr8C4eanhBppAh7FdB7RvwZIaN4+S LycTyvAoLdKRDW1v74zfX1yHwWtgBREqBEXFdjycjgz5mP4ske9AMbbRgVOaJ8DU7jC/LzhZT8F I0UFJ1fpvQcQptINMh5QHh10UHowNUtsT0n8GLX5tWeucG6RWvl7Uw4Eom/FSRBHdVgSLJPAu4s 4GUdhAay9DyB8nIjm9A== X-Authority-Analysis: v=2.4 cv=A71h/qWG c=1 sm=1 tr=0 ts=69aff6eb cx=c_pps a=4ztaESFFfuz8Af0l9swBwA==:117 a=fChuTYTh2wq5r3m49p7fHw==:17 a=Yq5XynenixoA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=Um2Pa8k9VHT-vaBCBUpS:22 a=EUspDBNiAAAA:8 a=0mDEy32cLckCWZYzXtIA:9 a=TPnrazJqx2CeVZ-ItzZ-:22 X-Proofpoint-ORIG-GUID: Ue6vg2dS-599mWhCQC7ko22Oy-AqySre X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-03-10_02,2026-03-09_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 phishscore=0 clxscore=1011 suspectscore=0 bulkscore=0 adultscore=0 spamscore=0 lowpriorityscore=0 priorityscore=1501 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2602130000 definitions=main-2603100093 Content-Type: text/plain; charset="utf-8" When userspace enables flow control (CRTSCTS), the driver deasserts RTS even when the receive buffer has space. This prevents the peer device from transmitting, causing communication to stall. The root cause is that the driver unconditionally uses manual RTS control regardless of flow control mode. When CRTSCTS is set, the hardware should automatically manage RTS based on buffer status, but the driver overrides this by setting manual control. Fix this by introducing port->manual_flow flag. In set_termios(), disable manual flow when CRTSCTS is set. In set_mctrl(), only assert SE_UART_MANUAL_RFR when manual_flow is active. Verified by enabling and disabling hardware flow control with stty. Signed-off-by: Anup Kulkarni --- drivers/tty/serial/qcom_geni_serial.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/drivers/tty/serial/qcom_geni_serial.c b/drivers/tty/serial/qco= m_geni_serial.c index e6b0a55f0cfb..9854bb2406e3 100644 --- a/drivers/tty/serial/qcom_geni_serial.c +++ b/drivers/tty/serial/qcom_geni_serial.c @@ -146,6 +146,7 @@ struct qcom_geni_serial_port { int wakeup_irq; bool rx_tx_swap; bool cts_rts_swap; + bool manual_flow; =20 struct qcom_geni_private_data private_data; const struct qcom_geni_device_data *dev_data; @@ -250,7 +251,7 @@ static void qcom_geni_serial_set_mctrl(struct uart_port= *uport, if (mctrl & TIOCM_LOOP) port->loopback =3D RX_TX_CTS_RTS_SORTED; =20 - if (!(mctrl & TIOCM_RTS) && !uport->suspended) + if (port->manual_flow && !(mctrl & TIOCM_RTS) && !uport->suspended) uart_manual_rfr =3D UART_MANUAL_RFR_EN | UART_RFR_NOT_READY; writel(uart_manual_rfr, uport->membase + SE_UART_MANUAL_RFR); } @@ -1401,11 +1402,21 @@ static void qcom_geni_serial_set_termios(struct uar= t_port *uport, else stop_bit_len =3D TX_STOP_BIT_LEN_1; =20 - /* flow control, clear the CTS_MASK bit if using flow control. */ - if (termios->c_cflag & CRTSCTS) + /* Configure flow control based on CRTSCTS flag. + * When CRTSCTS is set, use HW/auto flow control mode, where HW + * controls the RTS/CTS pin based FIFO state. + * When CRTSCTS is clear, the CTS pin value is ignored for TX + * path and RTS pin can be set/cleared using registers, for RX + * path. + */ + + if (termios->c_cflag & CRTSCTS) { tx_trans_cfg &=3D ~UART_CTS_MASK; - else + port->manual_flow =3D false; + } else { tx_trans_cfg |=3D UART_CTS_MASK; + port->manual_flow =3D true; + } =20 if (baud) { uart_update_timeout(uport, termios->c_cflag, baud); --=20 2.34.1